refactor(已安装应用): 合并 APM/Spark 分页为列表标签并新增统计

- 移除 APM/Spark 分页切换器,改为在应用项标题旁标记来源标签
  (APM=琥珀色, Spark=天蓝色), 同时保留依赖项标记
- 修复已安装应用为空回归: list-installed 收到空 pkgnameList 时直接
  返回空列表, 避免退化为全量扫描整个系统后全部被跳过; 渲染端
  refreshInstalledApps 仅当商店目录存在 spark 列表时才查询 spark;
  目录加载完成后 watch 自动重查
- 头部新增 APM/Spark/总数 三段式统计徽章 (渐变图标 + 大数字)
- 更新 InstalledAppsModal 单测以兼容页头与列表同名标签
This commit is contained in:
xiyidaiwa
2026-07-28 19:14:21 +08:00
parent c1b89cab1a
commit 1e60a4c2cb
4 changed files with 275 additions and 283 deletions
+11 -3
View File
@@ -997,8 +997,16 @@ ipcMain.handle(
}> = [];
if (origin === "spark") {
// 如果提供了包名列表只检查这些包的安装状态(优化版)
if (pkgnameList && pkgnameList.length > 0) {
// 显式传入了包名列表(可能是空数组):只检查这些包的安装状态(优化版)
if (Array.isArray(pkgnameList)) {
if (pkgnameList.length === 0) {
// 商店目录尚未加载或该来源没有任何可枚举的包时,
// 直接返回空列表,避免退化为“全量扫描整个系统”后再被渲染端全部跳过,
// 否则会误报“已安装应用为空”。
logger.info("Spark 包名列表为空,跳过已安装检查");
return { success: true, apps: [] };
}
logger.info(
`使用优化模式检查 ${pkgnameList.length} 个 Spark 包的安装状态`,
);
@@ -1040,7 +1048,7 @@ ipcMain.handle(
return { success: true, apps: installedApps };
}
// 回退到全量扫描模式(未提供包名列表时
// 回退到全量扫描模式(仅当调用方未传入 pkgnameList 时,例如旧版直接调用
logger.info("使用全量扫描模式获取所有 Spark 已安装包");
const { code, stdout } = await runCommandCapture("dpkg-query", [
"-W",