mirror of
https://gitee.com/spark-store-project/spark-store
synced 2026-09-20 21:50:11 +08:00
feat: 新增「标签优先显示策略」设置(自动选择/Spark优先/APM优先,默认自动选择)
需求:在应用设置中新增标签优先显示策略配置,进入应用详情页时按所选策略决定
默认展示的来源(Spark/APM)标签;选中的标签即为安装时对应的来源。
实现:
- 新增 src/global/tagPriority.ts:策略('auto'|'spark'|'apm')共享模块,localStorage 持久化,
通过共享 ref 在设置页与详情页间同步(纯前端显示偏好,不触及后端安装脚本)。
- SettingsModal.vue:在「安装设置」中新增三选项分段控件(默认选中「自动选择」),
打开时加载、变更时即时保存。
- AppDetailModal.vue:新增 computeDefaultViewingOrigin,按策略计算默认 viewingOrigin:
自动选择→getHybridDefaultOrigin(应用配置优先级);Spark/APM 优先→优先选中对应标签,
若应用无该来源标签则回退优先级策略;仅有一个来源标签时默认展示该标签;
父组件显式指定的 viewingOrigin 仍具最高优先级。
vue-tsc --noEmit 通过。
This commit is contained in:
@@ -577,6 +577,10 @@ import {
|
||||
APM_STORE_BASE_URL,
|
||||
getHybridDefaultOrigin,
|
||||
} from "../global/storeConfig";
|
||||
import {
|
||||
getTagPriorityStrategy,
|
||||
type TagPriorityStrategy,
|
||||
} from "../global/tagPriority";
|
||||
// 评论功能暂时关闭
|
||||
// import { buildReviewAppKey, buildReviewTags } from "../modules/appIdentity";
|
||||
import type { App, AppReview, ReviewTags } from "../global/typedefinition";
|
||||
@@ -632,25 +636,45 @@ const openWebsite = (url: string) => {
|
||||
}
|
||||
};
|
||||
|
||||
// 根据「标签优先显示策略」与应用的可用来源标签,计算默认展示的来源
|
||||
const computeDefaultViewingOrigin = (
|
||||
app: App,
|
||||
strategy: TagPriorityStrategy,
|
||||
): "spark" | "apm" => {
|
||||
// 父组件已显式指定展示来源(如从已安装应用页按特定来源打开),优先级最高
|
||||
if (app.viewingOrigin) return app.viewingOrigin;
|
||||
|
||||
// 非合并应用只有一个来源标签,直接展示该标签
|
||||
if (!app.isMerged) return app.origin;
|
||||
|
||||
// 合并应用:available 为实际存在的来源标签
|
||||
const available: Array<"spark" | "apm"> = [];
|
||||
if (app.sparkApp) available.push("spark");
|
||||
if (app.apmApp) available.push("apm");
|
||||
if (available.length === 0) return app.origin; // 兜底
|
||||
if (available.length === 1) return available[0]; // 仅有一个标签时默认展示该标签
|
||||
|
||||
// 按策略优先选择对应标签
|
||||
const preferred: "spark" | "apm" | null =
|
||||
strategy === "spark" ? "spark" : strategy === "apm" ? "apm" : null;
|
||||
if (preferred && available.includes(preferred)) {
|
||||
return preferred;
|
||||
}
|
||||
|
||||
// 回退到应用配置的优先级策略(getHybridDefaultOrigin),并约束在可用标签范围内
|
||||
const auto = getHybridDefaultOrigin(app.sparkApp ?? app.apmApp ?? app);
|
||||
return available.includes(auto) ? auto : available[0];
|
||||
};
|
||||
|
||||
watch(
|
||||
() => props.app,
|
||||
(newApp: App | null) => {
|
||||
isIconLoaded.value = false;
|
||||
if (newApp) {
|
||||
if (newApp.isMerged) {
|
||||
// 若父组件已根据安装状态设置了优先展示的版本,则使用
|
||||
// 否则根据优先级配置决定默认来源
|
||||
if (newApp.viewingOrigin) {
|
||||
viewingOrigin.value = newApp.viewingOrigin;
|
||||
} else if (newApp.sparkApp) {
|
||||
// 使用优先级配置决定默认来源
|
||||
viewingOrigin.value = getHybridDefaultOrigin(newApp.sparkApp);
|
||||
} else {
|
||||
viewingOrigin.value = "apm";
|
||||
}
|
||||
} else {
|
||||
viewingOrigin.value = newApp.origin;
|
||||
}
|
||||
viewingOrigin.value = computeDefaultViewingOrigin(
|
||||
newApp,
|
||||
getTagPriorityStrategy(),
|
||||
);
|
||||
}
|
||||
},
|
||||
{ immediate: true },
|
||||
|
||||
Reference in New Issue
Block a user