mirror of
https://gitee.com/spark-store-project/spark-store
synced 2026-06-22 06:03:49 +08:00
feat: 添加APM安装确认弹窗并重构APM检查流程
1. 新增全局状态控制APM安装弹窗显示 2. 新建ApmInstallConfirmModal弹窗组件 3. 将主进程的APM安装弹窗逻辑迁移到前端Vue组件 4. 更新package.json版本到5.1.0 5. 简化安装和升级流程中的APM检查逻辑
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { BrowserWindow, dialog, ipcMain, WebContents } from "electron";
|
||||
import { ipcMain, WebContents } from "electron";
|
||||
import { spawn, ChildProcess, exec } from "node:child_process";
|
||||
import { promisify } from "node:util";
|
||||
import fs from "node:fs";
|
||||
@@ -114,25 +114,6 @@ const checkSparkAvailable = async (): Promise<boolean> => {
|
||||
return found;
|
||||
};
|
||||
|
||||
/** 提权执行 shell-caller aptss install apm 安装 APM,安装后需用户重启电脑 */
|
||||
const runInstallApm = async (superUserCmd: string): Promise<boolean> => {
|
||||
const execCommand = superUserCmd || SHELL_CALLER_PATH;
|
||||
const execParams = superUserCmd
|
||||
? [SHELL_CALLER_PATH, "aptss", "install", "apm"]
|
||||
: [SHELL_CALLER_PATH, "aptss", "install", "apm"];
|
||||
logger.info(`执行安装 APM: ${execCommand} ${execParams.join(" ")}`);
|
||||
const { code, stdout, stderr } = await runCommandCapture(
|
||||
execCommand,
|
||||
execParams,
|
||||
);
|
||||
if (code !== 0) {
|
||||
logger.error({ code, stdout, stderr }, "安装 APM 失败");
|
||||
return false;
|
||||
}
|
||||
logger.info("安装 APM 完成");
|
||||
return true;
|
||||
};
|
||||
|
||||
const parseUpgradableList = (output: string) => {
|
||||
const apps: Array<{
|
||||
pkgname: string;
|
||||
@@ -215,61 +196,23 @@ ipcMain.on("queue-install", async (event, download_json) => {
|
||||
const execParams = [];
|
||||
const downloadDir = `/tmp/spark-store/download/${pkgname}`;
|
||||
|
||||
// APM 应用:若本机没有 apm 命令,弹窗提示并可选提权安装 APM(安装后需重启电脑)
|
||||
// APM 应用:若本机没有 apm 命令,通知前端弹窗引导安装 APM
|
||||
if (origin === "apm") {
|
||||
const hasApm = await checkApmAvailable();
|
||||
if (!hasApm) {
|
||||
const win = BrowserWindow.fromWebContents(webContents);
|
||||
const { response } = await dialog.showMessageBox(win ?? undefined, {
|
||||
type: "question",
|
||||
title: "需要安装 APM",
|
||||
message: "此应用需要使用 APM 安装。",
|
||||
detail:
|
||||
"APM是星火应用商店的容器包管理器,安装APM后方可安装此应用,是否确认安装?",
|
||||
buttons: ["确认", "取消"],
|
||||
defaultId: 0,
|
||||
cancelId: 1,
|
||||
webContents.send("trigger-apm-install-dialog");
|
||||
webContents.send("install-complete", {
|
||||
id,
|
||||
success: false,
|
||||
time: Date.now(),
|
||||
exitCode: -1,
|
||||
message: JSON.stringify({
|
||||
message: "未安装 APM,无法继续安装此应用",
|
||||
stdout: "",
|
||||
stderr: "",
|
||||
}),
|
||||
});
|
||||
if (response !== 0) {
|
||||
webContents.send("install-complete", {
|
||||
id,
|
||||
success: false,
|
||||
time: Date.now(),
|
||||
exitCode: -1,
|
||||
message: JSON.stringify({
|
||||
message: "用户取消安装 APM,无法继续安装此应用",
|
||||
stdout: "",
|
||||
stderr: "",
|
||||
}),
|
||||
});
|
||||
return;
|
||||
}
|
||||
const installApmOk = await runInstallApm(superUserCmd);
|
||||
if (!installApmOk) {
|
||||
webContents.send("install-complete", {
|
||||
id,
|
||||
success: false,
|
||||
time: Date.now(),
|
||||
exitCode: -1,
|
||||
message: JSON.stringify({
|
||||
message: "安装 APM 失败,请检查网络或权限后重试",
|
||||
stdout: "",
|
||||
stderr: "",
|
||||
}),
|
||||
});
|
||||
return;
|
||||
} else {
|
||||
// 安装APM成功,提示用户已安装成功,需要重启后方可展示应用
|
||||
await dialog.showMessageBox(win ?? undefined, {
|
||||
type: "info",
|
||||
title: "APM 安装成功",
|
||||
message: "恭喜您,APM 已成功安装",
|
||||
detail:
|
||||
"恭喜您,APM 已成功安装!您的应用已在安装中~\n首次安装APM后,需要重启电脑后方可在启动器展示应用。您可在应用安装完毕后择机重启电脑\n若您需要立即使用应用,可在应用安装后先在应用商店中打开您的应用。",
|
||||
buttons: ["确定"],
|
||||
defaultId: 0,
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1089,51 +1032,11 @@ ipcMain.handle("check-spark-available", async () => {
|
||||
});
|
||||
|
||||
// 显示 APM 安装对话框(在点击安装按钮时提前检查)
|
||||
// 前端已改为 Vue 弹窗,此后端处理仅作为兜底
|
||||
ipcMain.handle("show-apm-install-dialog", async (event) => {
|
||||
const webContents = event.sender;
|
||||
const win = BrowserWindow.fromWebContents(webContents);
|
||||
const superUserCmd = await checkSuperUserCommand();
|
||||
|
||||
const { response } = await dialog.showMessageBox(win ?? undefined, {
|
||||
type: "question",
|
||||
title: "需要安装 APM",
|
||||
message: "此应用需要使用 APM 安装。",
|
||||
detail:
|
||||
"APM 是星火应用商店的软件包兼容工具,此应用使用星火 APM 提供支持,安装APM后方可安装此应用,是否确认安装?",
|
||||
buttons: ["确认", "取消"],
|
||||
defaultId: 0,
|
||||
cancelId: 1,
|
||||
});
|
||||
|
||||
if (response !== 0) {
|
||||
return { success: false, cancelled: true };
|
||||
}
|
||||
|
||||
const installApmOk = await runInstallApm(superUserCmd);
|
||||
if (!installApmOk) {
|
||||
await dialog.showMessageBox(win ?? undefined, {
|
||||
type: "error",
|
||||
title: "安装失败",
|
||||
message: "安装 APM 失败",
|
||||
detail: "请检查网络或权限后重试",
|
||||
buttons: ["确定"],
|
||||
defaultId: 0,
|
||||
});
|
||||
return { success: false, cancelled: false };
|
||||
}
|
||||
|
||||
// 安装APM成功,提示用户已安装成功,需要重启后方可展示应用
|
||||
await dialog.showMessageBox(win ?? undefined, {
|
||||
type: "info",
|
||||
title: "APM 安装成功",
|
||||
message: "恭喜您,APM 已成功安装",
|
||||
detail:
|
||||
"恭喜您,APM 已成功安装!\n首次安装APM后,需要重启电脑后方可使用全部功能。您可在应用安装完毕后择机重启电脑。",
|
||||
buttons: ["确定"],
|
||||
defaultId: 0,
|
||||
});
|
||||
|
||||
return { success: true, cancelled: false };
|
||||
webContents.send("trigger-apm-install-dialog");
|
||||
return { success: false, cancelled: true };
|
||||
});
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
|
||||
Reference in New Issue
Block a user