mirror of
https://github.com/qingchencloud/clawpanel.git
synced 2026-05-31 05:10:14 +08:00
feat: 全新 Logo 设计 + 扩展工具一键安装功能
Logo 设计: - 现代化爪印图标,紫蓝渐变配色 - 生成全套尺寸 PNG (16-1024px) + @2x 版本 - macOS icns + Windows ico + SVG 源文件 - 系统托盘和应用图标全面更新 扩展工具增强: - cftunnel 支持一键安装(自动下载安装脚本) - 实时显示安装进度和日志输出 - 安装完成后自动刷新状态 - 优化未安装状态的 UI 提示
This commit is contained in:
@@ -194,3 +194,77 @@ pub fn get_clawapp_status() -> Result<Value, String> {
|
||||
result.insert("url".into(), Value::String("http://localhost:3210".into()));
|
||||
Ok(Value::Object(result))
|
||||
}
|
||||
|
||||
/// 一键安装 cftunnel
|
||||
#[tauri::command]
|
||||
pub async fn install_cftunnel(app: tauri::AppHandle) -> Result<String, String> {
|
||||
use std::process::Stdio;
|
||||
use std::io::{BufRead, BufReader};
|
||||
use tauri::Emitter;
|
||||
|
||||
let _ = app.emit("install-log", "开始安装 cftunnel...");
|
||||
let _ = app.emit("install-progress", 10);
|
||||
|
||||
// 下载并安装脚本
|
||||
let install_script = r#"
|
||||
#!/bin/bash
|
||||
set -e
|
||||
cd /tmp
|
||||
echo "下载 cftunnel..."
|
||||
curl -fsSL https://raw.githubusercontent.com/qingchencloud/cftunnel/main/install.sh -o cftunnel-install.sh
|
||||
chmod +x cftunnel-install.sh
|
||||
echo "执行安装..."
|
||||
./cftunnel-install.sh
|
||||
echo "安装完成"
|
||||
"#;
|
||||
|
||||
let _ = app.emit("install-log", "下载安装脚本...");
|
||||
let _ = app.emit("install-progress", 30);
|
||||
|
||||
let mut child = Command::new("bash")
|
||||
.arg("-c")
|
||||
.arg(install_script)
|
||||
.stdout(Stdio::piped())
|
||||
.stderr(Stdio::piped())
|
||||
.spawn()
|
||||
.map_err(|e| format!("启动安装进程失败: {e}"))?;
|
||||
|
||||
let stderr = child.stderr.take();
|
||||
let stdout = child.stdout.take();
|
||||
|
||||
// 读取 stderr
|
||||
let app2 = app.clone();
|
||||
let handle = std::thread::spawn(move || {
|
||||
if let Some(pipe) = stderr {
|
||||
for line in BufReader::new(pipe).lines().map_while(Result::ok) {
|
||||
let _ = app2.emit("install-log", &line);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 读取 stdout
|
||||
let mut progress = 40;
|
||||
if let Some(pipe) = stdout {
|
||||
for line in BufReader::new(pipe).lines().map_while(Result::ok) {
|
||||
let _ = app.emit("install-log", &line);
|
||||
if progress < 90 {
|
||||
progress += 5;
|
||||
let _ = app.emit("install-progress", progress);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let _ = handle.join();
|
||||
let _ = app.emit("install-progress", 95);
|
||||
|
||||
let status = child.wait().map_err(|e| format!("等待安装进程失败: {e}"))?;
|
||||
let _ = app.emit("install-progress", 100);
|
||||
|
||||
if !status.success() {
|
||||
let _ = app.emit("install-log", "❌ 安装失败");
|
||||
return Err("安装失败,请查看日志".into());
|
||||
}
|
||||
|
||||
let _ = app.emit("install-log", "✅ cftunnel 安装成功");
|
||||
Ok("安装成功".into())
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ pub fn run() {
|
||||
extensions::cftunnel_action,
|
||||
extensions::get_cftunnel_logs,
|
||||
extensions::get_clawapp_status,
|
||||
extensions::install_cftunnel,
|
||||
])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("启动 ClawPanel 失败");
|
||||
|
||||
Reference in New Issue
Block a user