From 120233cf56672ffe467be919b0852a230c0d1fc5 Mon Sep 17 00:00:00 2001 From: shenmo Date: Thu, 16 Apr 2026 00:35:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(settings):=20=E6=B7=BB=E5=8A=A0=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E8=AE=BE=E7=BD=AE=E6=A8=A1=E6=80=81=E6=A1=86=E5=8F=8A?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现安装设置功能,包括更新检测通知和自动创建桌面启动器的开关配置 重构原有的安装设置逻辑,使用模态框替代直接调用脚本 新增 IPC 接口用于获取和保存设置配置 --- electron/main/index.ts | 90 ++++++++++++- src/App.vue | 19 +-- src/components/SettingsModal.vue | 220 +++++++++++++++++++++++++++++++ 3 files changed, 315 insertions(+), 14 deletions(-) create mode 100644 src/components/SettingsModal.vue diff --git a/electron/main/index.ts b/electron/main/index.ts index c52c712e..4eac1d20 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -214,21 +214,101 @@ ipcMain.on("set-theme-source", (event, theme: "system" | "light" | "dark") => { nativeTheme.themeSource = theme; }); -// 启动安装设置脚本(可能需要提升权限) -ipcMain.handle("open-install-settings", async () => { +// 配置文件路径 +const SPARK_CONFIG_DIR = path.join( + os.homedir(), + ".config/spark-union/spark-store", +); +const UPDATE_CHECK_CONFIG = "ssshell-config-do-not-show-upgrade-notify"; +const CREATE_DESKTOP_CONFIG = "ssshell-config-do-not-create-desktop"; + +// 获取安装设置 +ipcMain.handle("get-install-settings", async () => { + try { + const result: Record = {}; + + // 检查更新检测配置 + result[UPDATE_CHECK_CONFIG] = fs.existsSync( + path.join(SPARK_CONFIG_DIR, UPDATE_CHECK_CONFIG), + ); + + // 检查自动创建桌面启动器配置 + result[CREATE_DESKTOP_CONFIG] = fs.existsSync( + path.join(SPARK_CONFIG_DIR, CREATE_DESKTOP_CONFIG), + ); + + return { success: true, data: result }; + } catch (err) { + logger.error({ err }, "Failed to get install settings"); + return { success: false, message: (err as Error)?.message || String(err) }; + } +}); + +// 设置安装设置 +ipcMain.handle( + "set-install-settings", + async ( + _event, + settings: { + [UPDATE_CHECK_CONFIG]?: boolean; + [CREATE_DESKTOP_CONFIG]?: boolean; + }, + ) => { + try { + // 确保配置目录存在 + if (!fs.existsSync(SPARK_CONFIG_DIR)) { + fs.mkdirSync(SPARK_CONFIG_DIR, { recursive: true }); + } + + // 更新检测配置 + const updateCheckPath = path.join(SPARK_CONFIG_DIR, UPDATE_CHECK_CONFIG); + if (settings[UPDATE_CHECK_CONFIG]) { + fs.writeFileSync(updateCheckPath, ""); + } else { + if (fs.existsSync(updateCheckPath)) { + fs.unlinkSync(updateCheckPath); + } + } + + // 自动创建桌面启动器配置 + const createDesktopPath = path.join( + SPARK_CONFIG_DIR, + CREATE_DESKTOP_CONFIG, + ); + if (settings[CREATE_DESKTOP_CONFIG]) { + fs.writeFileSync(createDesktopPath, ""); + } else { + if (fs.existsSync(createDesktopPath)) { + fs.unlinkSync(createDesktopPath); + } + } + + return { success: true }; + } catch (err) { + logger.error({ err }, "Failed to set install settings"); + return { + success: false, + message: (err as Error)?.message || String(err), + }; + } + }, +); + +// 检查更新 +ipcMain.handle("check-for-updates", async () => { try { const { spawn } = await import("node:child_process"); const scriptPath = - "/opt/durapps/spark-store/bin/update-upgrade/ss-update-controler.sh"; + "/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh"; const child = spawn("systemd-run", ["--user", scriptPath], { detached: true, stdio: "ignore", }); child.unref(); - logger.info(`Launched ${scriptPath}`); + logger.info(`Launched update check script: ${scriptPath}`); return { success: true }; } catch (err) { - logger.error({ err }, "Failed to launch install settings script"); + logger.error({ err }, "Failed to launch update check script"); return { success: false, message: (err as Error)?.message || String(err) }; } }); diff --git a/src/App.vue b/src/App.vue index b15f4806..fa9dacd3 100644 --- a/src/App.vue +++ b/src/App.vue @@ -151,6 +151,8 @@ /> + + @@ -170,6 +172,7 @@ import InstalledAppsModal from "./components/InstalledAppsModal.vue"; import UpdateCenterModal from "./components/UpdateCenterModal.vue"; import UninstallConfirmModal from "./components/UninstallConfirmModal.vue"; import AboutModal from "./components/AboutModal.vue"; +import SettingsModal from "./components/SettingsModal.vue"; import { APM_STORE_BASE_URL, currentApp, @@ -260,6 +263,7 @@ const updateCenterStore = createUpdateCenterStore(); const showUninstallModal = ref(false); const uninstallTargetApp: Ref = ref(null); const showAboutModal = ref(false); +const showSettingsModal = ref(false); const apmAvailable = ref(false); /** 启动参数 --no-apm => 仅 Spark;--no-spark => 仅 APM;由主进程 IPC 提供 */ @@ -747,15 +751,8 @@ const handleUpdate = async () => { await openUpdateModal(); }; -const handleOpenInstallSettings = async () => { - try { - const result = await window.ipcRenderer.invoke("open-install-settings"); - if (!result || !result.success) { - logger.warn(`启动安装设置失败: ${result?.message || "未知错误"}`); - } - } catch (error) { - logger.error(`调用安装设置时出错: ${error}`); - } +const handleOpenInstallSettings = () => { + showSettingsModal.value = true; }; const handleList = () => { @@ -937,6 +934,10 @@ const closeAboutModal = () => { showAboutModal.value = false; }; +const closeSettingsModal = () => { + showSettingsModal.value = false; +}; + // TODO: 目前 APM 商店不能暂停下载 const pauseDownload = (id: DownloadItem) => { const download = downloads.value.find((d) => d.id === id.id); diff --git a/src/components/SettingsModal.vue b/src/components/SettingsModal.vue new file mode 100644 index 00000000..ddb5f80b --- /dev/null +++ b/src/components/SettingsModal.vue @@ -0,0 +1,220 @@ + + +