refactor: 基于 upstream/Erotica 重新整合本地功能(来源选择/合并详情/计数/窗口/首页)

将本地在 upstream !408(已安装应用合并+统计)之上的后续改动重新整合到最新 upstream/Erotica:
- 已安装应用:卸载/打开按 APM/Spark 来源选择;计数总数=APM+Spark 包数(双来源计为独立包)
- 查看详情:已安装页复用所有应用页合并详情视图(单来源优先已装类型,双来源自动模式)
- 窗口:恢复阈值改为 1600x900,过大回退默认尺寸并居中,不自动最大化
- 首页推荐:致谢卡片移至其他内容下方,加大标题/卡片/致谢间距
- 隐藏排行榜/荣耀榜侧栏入口(代码保留,v-if=false)
- 新增 scripts/test-build.sh 测试打包脚本(版本末段+1 加 -test)并更新 AGENTS.md

冲突文件(index.ts/App.vue/InstalledAppsModal.vue)均取本地完整实现(为上游版本的超集)。
This commit is contained in:
xiyidaiwa
2026-08-03 11:06:28 +08:00
parent 77b4244f1d
commit b89c001401
25 changed files with 1750 additions and 299 deletions
+162
View File
@@ -0,0 +1,162 @@
# 排行榜与星火荣耀榜 · 项目规划文档
> 状态:**草图设计已确认,待实现**
> 分支:`Erotica`
> 日期:2026-07-30
> 关联预览原型:`ranking-preview.html`(仓库根目录,仅用于设计预览,不入库)
---
## 1. 项目背景与目标
在「已安装应用」模块重构(来源标签化、统计徽章、搜索、来源筛选、APM 置顶)完成后,本次规划聚焦于**首页与发现页的内容重组**:
- 将原本散落在「首页推荐」中的**下载排行**独立为「排行榜」一级页面,并补充**应用更新排行**;
- 新增**「星火荣耀榜」**页面,表彰应用贡献者与近期更新贡献者;
- 精简「首页推荐」页:移除精选板块(区域2)与下载排行(区域3),仅保留精选链接(区域1),并在区域1 顶部加入致谢说明。
**预期成果**:形成「首页推荐(轻量入口)— 排行榜(下载/更新)— 荣耀榜(贡献者荣誉)」三层递进的发现体系,强化社区贡献者认同感。
---
## 2. 数据可行性核查(代码已确认)
| 字段 | 来源 | 结论 |
|------|------|------|
| `app.downloadCount` | 现有 `apmRanking` / `sparkRanking``App.vue` 11641250,异步逐应用拉 `download-times.txt`) | ✅ 直接复用,无需新增请求 |
| `app.update` | `App.vue:886``appJson.Update` 映射,格式 `"2026-01-26 17:34:15"`,同格式可直接 `localeCompare` 倒序 | ✅ 列表已含,可直接排序 |
| `app.contributor` | `App.vue:884``appJson.Contributor` 映射 | ✅ 列表已含,无需详情请求 |
> 结论:**荣耀榜/更新榜所需字段均已在列表加载阶段填充**,聚合逻辑可基于已加载的 `apps` 实时计算,不引入额外网络请求。
---
## 3. 任务总览(优先级 + 阶段)
| 任务ID | 名称 | 类型 | 优先级 | 阶段 | 关联模块 |
|--------|------|------|--------|------|----------|
| F1 | 排行榜页(RankingView | 新功能 | P0 | 待实现 | App.vue, AppSidebar, HomeView(移除区域3) |
| F1.1 | 应用下载排行(Spark/APM 双榜) | 新功能 | P0 | 待实现 | 复用 apmRanking/sparkRanking |
| F1.2 | 应用更新排行(Spark/APM 双榜) | 新功能 | P0 | 待实现 | appsupdate 字段) |
| F2 | 星火荣耀榜页(HonorView | 新功能 | P0 | 待实现 | App.vue, AppSidebar |
| F2.1 | 贡献荣耀榜(按来源聚合 contributor | 新功能 | P0 | 待实现 | appscontributor 字段) |
| F2.2 | 更新荣耀榜(最近更新应用 contributor 聚合) | 新功能 | P0 | 待实现 | appsupdate+contributor |
| F2.3 | 致谢说明卡片 | 新功能 | P1 | 待实现 | HonorView / HomeView 复用 |
| F3 | 侧边栏导航入口 | 新功能 | P0 | 待实现 | AppSidebar.vue, App.vue |
| M1 | 首页推荐页改造(去区域2/3,区域1加致谢) | 修改现有 | P0 | 待实现 | HomeView.vue |
| M2 | App.vue 视图路由与数据编排 | 修改现有 | P0 | 待实现 | App.vue |
| M3 | 榜单聚合工具函数 | 重构/提取 | P1 | 待优化 | 新增 util 或 App.vue 内 computed |
| O1 | 边加载边更新体验优化 | 优化 | P2 | 待优化 | HonorViewcomputed + watch |
| O2 | 榜单条数/来源可配置 | 优化 | P2 | 待优化 | RankingView/HonorView props |
| O3 | 空状态与加载失败兜底 | 优化 | P1 | 待优化 | RankingView/HonorView |
| R1 | 类型安全与 lint 修复 | 修复 | P1 | 待修复 | 全部新增组件 |
| R2 | 与现有列表加载/更新逻辑的一致性校验 | 修复 | P1 | 待修复 | App.vue, install-manager |
---
## 4. 详细任务分解
### 4.1 新功能模块
#### F1 · 排行榜页(RankingView.vue
**F1.1 应用下载排行**
- **改动描述**:新增 `RankingView` 组件,区块一展示「应用下载排行」,内部按来源分为 Spark 下载榜 / APM 下载榜两栏,各取下载量前 10 名。复用现有 `apmRanking` / `sparkRanking` 数据(由 `App.vue` 传入),列表项沿用 `AppCard``compact` 样式,并在左侧加排名序号(前 3 名用金/银/铜配色)。
- **预期目标**:与现有首页下载排行视觉一致,且独立成页后信息更聚焦。
- **关联模块**`App.vue`(传入 `apmRanking`/`sparkRanking`)、`AppCard.vue``AppSidebar.vue`(入口)。
- **备注**:当前首页区域3 的展示可直接迁移,避免重复实现。
**F1.2 应用更新排行**
- **改动描述**:区块二展示「应用更新排行」,按来源分为 Spark 更新榜 / APM 更新榜两栏,各取 `app.update` 倒序前 10 名;列表项复用 `AppCard` compact 样式,副信息显示版本与更新时间(替换下载量徽章)。
- **预期目标**:让用户快速了解近期活跃更新的应用。
- **关联模块**`App.vue``apps` 全量数据)、`AppCard.vue`
- **备注**:排序用 `update.localeCompare` 倒序(格式统一可行)。
#### F2 · 星火荣耀榜页(HonorView.vue
**F2.1 贡献荣耀榜**
- **改动描述**:区块一展示「贡献荣耀榜」,按来源分为 Spark / APM 两栏,各取 `app.contributor` 出现次数前 10 名(聚合基于已加载 `apps`,实时计算)。列表项显示排名、贡献者名(去除 `<email>` 后缀)、上榜应用数徽章。
- **预期目标**:表彰对星火生态贡献最多的开发者/维护者。
- **关联模块**`App.vue``apps`)、`HonorView.vue`
**F2.2 更新荣耀榜**
- **改动描述**:区块二展示「更新荣耀榜」,按来源分为 Spark / APM 两栏;取最近更新(按 `update` 倒序)的前 30 个应用,聚合其 `contributor` 出现次数,取前 10 名展示。
- **预期目标**:突出近期持续维护应用的贡献者。
- **关联模块**`App.vue``apps`)、`HonorView.vue`
- **备注**:与 F1.2 同源(最近更新应用列表),可共享计算。
**F2.3 致谢说明卡片**
- **改动描述**:在荣耀榜页顶部加入美化后的致谢卡片(渐变琥珀背景 + 图标 + 文案「致每一位星火贡献者…🎉」);同一卡片样式也用于首页推荐区域1(见 M1)。
- **预期目标**:强化社区归属感,视觉与整体风格统一。
- **关联模块**`HonorView.vue``HomeView.vue`(复用同一段模板/组件)。
#### F3 · 侧边栏导航入口
- **改动描述**:在 `AppSidebar.vue` 新增「排行榜」「荣耀榜」两个一级入口,点击分别 `selectTab('ranking')` / `selectTab('honor')`,激活态沿用 `.sidebar-tab-active` 样式。
- **预期目标**:用户可从侧边栏直达新页面。
- **关联模块**`AppSidebar.vue``App.vue``activeTab` 状态)。
### 4.2 需要修改的现有模块
#### M1 · 首页推荐页改造(HomeView.vue
- **改动描述**:移除模板中的**区域2·精选板块**(`recommendSections` 应用列表区块)与**区域3·下载排行**(`apmRanking`/`sparkRanking` 区块)及其对应 props`recommendSections``apmRanking``sparkRanking``rankingLoading`);在区域1(精选链接 `homelinks` 网格)顶部插入致谢说明卡片(F2.3 同款)。
- **预期目标**:首页回归轻量入口定位,下载排行/精选板块职责移交排行榜页与「全部应用」。
- **关联模块**`HomeView.vue``App.vue`(停止向 HomeView 传 ranking/recommend 数据,或保留 recommend 供「全部应用」使用——需确认 recommendSections 是否仍被其他入口复用)。
- **备注**:⚠️ 需确认 `recommendSections` 是否仅首页使用;若「全部应用」等也依赖,则不能简单删除数据加载。
#### M2 · App.vue 视图路由与数据编排
- **改动描述**:主内容区新增 `v-else-if="activeTab === 'ranking'"``<RankingView>``v-else-if="activeTab === 'honor'"``<HonorView>`;将现有 `apmRanking`/`sparkRanking` 改传 `RankingView`;荣耀榜所需的全量 `apps``computed` 形式实时传入 `HonorView`(支撑"边加载边更新")。
- **预期目标**:打通新页面路由与数据流。
- **关联模块**`App.vue``RankingView.vue``HonorView.vue`
#### M3 · 榜单聚合工具函数(待优化阶段)
- **改动描述**:将"按来源取 Top N""聚合 contributor 次数"等逻辑提取为独立 `util` 函数(如 `src/modules/ranking.ts`),供 RankingView/HonorView 复用,避免组件中重复实现。
- **预期目标**:提升可维护性、便于单元测试。
- **关联模块**:新增 `src/modules/ranking.ts`
---
## 5. 阶段划分与执行顺序
### 阶段一 · 待实现(P0,核心交付)
1. **M2** App.vue 路由骨架 + **F3** 侧边栏入口(打通页面切换)
2. **F1** RankingViewF1.1 下载榜 → F1.2 更新榜)
3. **F2** HonorViewF2.1 贡献榜 → F2.2 更新榜 → F2.3 致谢)
4. **M1** HomeView 首页改造(去区域2/3 + 区域1 致谢)
### 阶段二 · 待优化(P1–P2,体验打磨)
- **O3** 空状态/加载失败兜底(榜单为空、apps 未加载时友好提示)
- **M3 / O2** 聚合工具提取、榜单条数可配置(当前固定 10)
- **O1** 边加载边更新:用 `computed` + `watch(apps)` 实时刷新,进入荣耀榜即开始聚合,无需手动定时器
### 阶段三 · 待修复(P1,质量保障)
- **R1** 全部新增组件通过 `vue-tsc` 类型检查与 ESLint(严格模式,禁用 `any`
- **R2** 校验与现有列表加载(`loadCategories`/`refreshInstalledApps`)、更新逻辑的一致性,避免重复遍历导致的性能问题(全量 `apps` 聚合建议在 `computed` 中记忆化)
---
## 6. 风险与待确认项
1. **推荐数据归属**`recommendSections` 是否仅首页使用?若「全部应用」等入口复用,M1 删除区域2 时需保留数据加载逻辑,仅移除模板渲染。
2. **荣耀榜数据范围**:确认基于"已加载 `apps`"即可满足需求(用户已确认"只基于已加载应用"),无需分页/全量后端接口。
3. **榜单条数**:当前统一为 10 条(用户确认),后续是否需要在 UI 上可切换(O2)。
4. **贡献者字段格式**`contributor` 形如 `name<email>`,聚合与展示时需统一去除 `<...>` 取显示名;多个贡献者是否以 `;` 分隔需抽样确认。
5. **storeFilter 影响**:下载榜已按 Spark/APM 分榜;更新榜/荣耀榜按来源分布已实现。若 `storeFilter==='spark'` 仅显示 Spark 榜,需在主内容区做来源过滤。
---
## 7. 验收标准
- [ ] 侧边栏出现「排行榜」「荣耀榜」入口,点击正确切换页面
- [ ] 排行榜页:下载榜(Spark/APM)与更新榜(Spark/APM)各显示 Top 10,视觉与现有 AppCard 一致
- [ ] 荣耀榜页:贡献荣耀榜、更新荣耀榜各按来源 Top 10,且随 `apps` 加载实时更新;顶部致谢卡片正确显示
- [ ] 首页推荐:仅保留区域1(精选链接)+ 致谢卡片,区域2/3 已移除
- [ ] 全部新增/修改通过 `npm run lint``vue-tsc` 类型检查
- [ ] 打包(`dpkg-buildpackage`)成功,功能在 GUI 环境自测通过
---
*本文档基于 `ranking-preview.html` 设计原型与代码核查结论编写,作为后续开发与迭代的执行依据。*