mirror of
https://gitee.com/spark-store-project/spark-store
synced 2026-09-20 21:50:11 +08:00
fix: 标签优先显示策略 auto 模式按服务端优先级配置展示
- auto 模式用合并应用自身(含 sparkApp/apmApp)匹配 priority-config.json, 不再仅取单一子版,避免漏匹配。 - openDetail 区分「已安装页显式来源强制」与「其他页面按策略」; 非强制分支清除 forceViewingOrigin 粘性标志,避免跨入口状态泄漏。 - AppDetailModal 按 TagPriorityStrategy 响应式重算默认来源; 手动切标签仅本次会话预览,不持久。 - storeConfig.loadPriorityConfig 改用 axios(与渲染进程一致), 修复 Electron 下全局 fetch 失败导致配置为空、auto 全部回退 APM 的问题。 - 首页推荐列表 parseAppList 从 jsonUrl 提取分类,避免 category 误为 unknown。
This commit is contained in:
@@ -578,7 +578,8 @@ import {
|
||||
getHybridDefaultOrigin,
|
||||
} from "../global/storeConfig";
|
||||
import {
|
||||
getTagPriorityStrategy,
|
||||
tagPriorityStrategyRef,
|
||||
initTagPriorityStrategy,
|
||||
type TagPriorityStrategy,
|
||||
} from "../global/tagPriority";
|
||||
// 评论功能暂时关闭
|
||||
@@ -641,8 +642,9 @@ const computeDefaultViewingOrigin = (
|
||||
app: App,
|
||||
strategy: TagPriorityStrategy,
|
||||
): "spark" | "apm" => {
|
||||
// 父组件已显式指定展示来源(如从已安装应用页按特定来源打开),优先级最高
|
||||
if (app.viewingOrigin) return app.viewingOrigin;
|
||||
// 父组件显式指定展示来源(如从已安装应用页按特定来源打开)时优先级最高,
|
||||
// 此时强制覆盖用户标签策略;否则交由下方策略逻辑决定。
|
||||
if (app.forceViewingOrigin && app.viewingOrigin) return app.viewingOrigin;
|
||||
|
||||
// 非合并应用只有一个来源标签,直接展示该标签
|
||||
if (!app.isMerged) return app.origin;
|
||||
@@ -661,19 +663,49 @@ const computeDefaultViewingOrigin = (
|
||||
return preferred;
|
||||
}
|
||||
|
||||
// 回退到应用配置的优先级策略(getHybridDefaultOrigin),并约束在可用标签范围内
|
||||
const auto = getHybridDefaultOrigin(app.sparkApp ?? app.apmApp ?? app);
|
||||
// 回退到应用配置的优先级策略(getHybridDefaultOrigin),使用合并应用自身的
|
||||
// 规范标识(pkgname/category/tags)匹配服务器 priority-config.json,并约束在可用标签范围内
|
||||
const auto = getHybridDefaultOrigin(app);
|
||||
console.log(
|
||||
`[PriorityConfig] auto 决策 pkgname=${app.pkgname} category=${app.category} sparkTags=${app.sparkApp?.tags ?? ""} apmTags=${app.apmApp?.tags ?? ""} -> ${auto}`,
|
||||
);
|
||||
return available.includes(auto) ? auto : available[0];
|
||||
};
|
||||
|
||||
// 进入详情页时按「标签优先显示策略」计算默认来源标签。
|
||||
// 同时监听 props.app 与共享策略 ref:
|
||||
// - props.app 变化(重开/切换应用)→ 始终按当前策略重算(手动切标签仅本次会话预览,不持久)
|
||||
// - 策略变化(在设置页实时切换)→ 已打开且未手动切标签的详情页立即更新默认标签
|
||||
// 手动点标签页(selectOrigin)只是临时预览:置 manualOverride 标记,本次会话内保持,
|
||||
// 既不被策略变化强行拉回,也不跨重开持久(重开后会按设置重算)。
|
||||
initTagPriorityStrategy();
|
||||
const manualOverride = ref(false); // 用户是否手动切换过标签(本次会话)
|
||||
let lastPkgname: string | null = null; // 上一次计算对应的应用 pkgname,用于识别"新打开/重开"
|
||||
watch(
|
||||
() => props.app,
|
||||
(newApp: App | null) => {
|
||||
[() => props.app, tagPriorityStrategyRef],
|
||||
([newApp]: [App | null, TagPriorityStrategy]) => {
|
||||
isIconLoaded.value = false;
|
||||
if (newApp) {
|
||||
if (!newApp) {
|
||||
// 详情页关闭:清空会话状态,确保下次打开按最新策略重算
|
||||
lastPkgname = null;
|
||||
manualOverride.value = false;
|
||||
return;
|
||||
}
|
||||
if (newApp.pkgname !== lastPkgname) {
|
||||
// 新应用(含重开后再次打开同一应用):重置手动标记,按当前策略计算
|
||||
lastPkgname = newApp.pkgname;
|
||||
manualOverride.value = false;
|
||||
viewingOrigin.value = computeDefaultViewingOrigin(
|
||||
newApp,
|
||||
getTagPriorityStrategy(),
|
||||
tagPriorityStrategyRef.value,
|
||||
);
|
||||
} else if (manualOverride.value || newApp.forceViewingOrigin) {
|
||||
// 同一应用且用户正在手动预览 / 父组件强制来源:保留当前标签,不重算
|
||||
} else {
|
||||
// 同一应用、无手动预览、策略变化 → 实时按新策略更新默认标签
|
||||
viewingOrigin.value = computeDefaultViewingOrigin(
|
||||
newApp,
|
||||
tagPriorityStrategyRef.value,
|
||||
);
|
||||
}
|
||||
},
|
||||
@@ -845,6 +877,8 @@ const confirmOpen = (origin: "spark" | "apm") => {
|
||||
// };
|
||||
|
||||
const selectOrigin = (origin: "spark" | "apm") => {
|
||||
// 手动切换标签:仅本次会话预览,不写回策略、不跨重开持久
|
||||
manualOverride.value = true;
|
||||
viewingOrigin.value = origin;
|
||||
emit("select-origin", origin);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user