diff --git a/.cursor/agent/产品经理/evolution/2026-03-10.md b/.cursor/agent/产品经理/evolution/2026-03-10.md new file mode 100644 index 00000000..e5f77d22 --- /dev/null +++ b/.cursor/agent/产品经理/evolution/2026-03-10.md @@ -0,0 +1,13 @@ +# 产品经理 经验记录 - 2026-03-10 + +## 管理端迁移 Mycontent-temp:信息架构与验收口径 + +- **主导航收敛**:侧栏只保留运营主链路 5 项(概览/内容/用户/找伙伴/推广),系统设置固定在底部;其余能力不删除但不占主导航入口。 +- **入口承载策略**:非主菜单页面(订单/提现/推广设置/VIP角色/导师等)通过“概览卡片/页面内按钮/系统设置 Tab”进入,确保可达且路径更短。 +- **验收标准**: + - 菜单与布局一致(新规范) + - 隐藏页面路由仍可访问(功能不丢) + - author/admin 设置统一在 `/settings?tab=...` 承载,旧路径可兼容跳转 + +> 详见会议纪要:`.cursor/meeting/2026-03-10_管理端迁移Mycontent-temp菜单布局讨论.md` + diff --git a/.cursor/agent/产品经理/evolution/索引.md b/.cursor/agent/产品经理/evolution/索引.md index fbdc760a..5e876b42 100644 --- a/.cursor/agent/产品经理/evolution/索引.md +++ b/.cursor/agent/产品经理/evolution/索引.md @@ -4,3 +4,4 @@ |------|------|------| | 2026-03-05 | 分支冲突后需求文档与实现一致性核对 | [2026-03-05.md](./2026-03-05.md) | | 2026-03-05 | 文章详情@某人高亮与一键加好友验收标准与待确认 | [2026-03-05.md](./2026-03-05.md) | +| 2026-03-10 | 管理端迁移 Mycontent-temp:主导航收敛与隐藏页面入口承载策略 | [2026-03-10.md](./2026-03-10.md) | diff --git a/.cursor/agent/后端工程师/evolution/2026-03-10.md b/.cursor/agent/后端工程师/evolution/2026-03-10.md new file mode 100644 index 00000000..3e1bff57 --- /dev/null +++ b/.cursor/agent/后端工程师/evolution/2026-03-10.md @@ -0,0 +1,36 @@ +# 后端工程师 经验记录 - 2026-03-10 + +## 管理端迁移 Mycontent-temp:后端视角注意点 + +- **接口边界不变**:管理端迁移/重构只允许调用 `/api/admin/*`、`/api/db/*`、`/api/orders`,严禁引入 `/api/miniprogram/*`。 +- **概览聚合接口可选**:`/api/admin/dashboard/overview` 可作为“优化项”提供更轻量的统计聚合,但必须保留**降级策略**(用 `/api/db/users` + `/api/orders` 拼)以免阻塞前端迁移与部署节奏。 +- **鉴权一致性**:页面入口/菜单变化不影响鉴权口径,仍以 `GET /api/admin` 作为 session/token 校验;401 统一跳登录并清 token。 + +> 详见会议纪要:`.cursor/meeting/2026-03-10_管理端迁移Mycontent-temp菜单布局讨论.md` + +--- + +## 新增聚合接口 UserDashboardStats + +**场景**:小程序「我的」页需要一个聚合接口返回阅读统计,避免多次请求。 + +**接口**:`GET /api/miniprogram/user/dashboard-stats?userId=xxx` + +**数据来源**: +- `readSectionIds` / `readCount` → `reading_progress` WHERE `user_id = userId` +- `totalReadMinutes` → `SUM(duration) / 60`(秒转分,最小值 1 分钟) +- `recentChapters` → `reading_progress` ORDER BY `last_open_at DESC` JOIN `chapters`(最近 5 条**去重**) +- `matchHistory` → `match_records` COUNT WHERE `user_id = userId` + +**三处 bug 修复点**(对比 Mycontent-temp 参考版发现): + +| Bug | 错误做法 | 正确做法 | +|-----|---------|---------| +| 最近阅读重复 | 直接取前 5 条(同章节可重复) | `seenRecent` map 去重,保证 5 条不重复 | +| 阅读时长最小值 | 不足 60 秒返回 0 | `if totalReadSeconds > 0 && totalReadMinutes == 0 { totalReadMinutes = 1 }` | +| DB 错误状态码 | 返回 200 + `success:false` | 返回 HTTP 500 `InternalServerError` | + +**规则沉淀**:新增聚合接口时,先参考已有版本实现,对比 diff 后修复潜在 bug,再提交。 + +> 详见会议纪要:`.cursor/meeting/2026-03-10_小程序新旧版对比与dashboard接口新增.md` + diff --git a/.cursor/agent/后端工程师/evolution/索引.md b/.cursor/agent/后端工程师/evolution/索引.md index a3f19dbe..4d319129 100644 --- a/.cursor/agent/后端工程师/evolution/索引.md +++ b/.cursor/agent/后端工程师/evolution/索引.md @@ -4,3 +4,4 @@ |------|------|------| | 2026-03-05 | soul-api 合并状态确认;orders、distribution 接口核对 | [2026-03-05.md](./2026-03-05.md) | | 2026-03-05 | 文章详情@某人:content 内嵌 @ 标记、miniprogram 添加好友接口 | [2026-03-05.md](./2026-03-05.md) | +| 2026-03-10 | 管理端迁移 Mycontent-temp:接口边界不变;overview 聚合接口可选但需降级 | [2026-03-10.md](./2026-03-10.md) | diff --git a/.cursor/agent/团队/evolution/2026-03-10.md b/.cursor/agent/团队/evolution/2026-03-10.md index 37e82f27..d8f773c2 100644 --- a/.cursor/agent/团队/evolution/2026-03-10.md +++ b/.cursor/agent/团队/evolution/2026-03-10.md @@ -75,3 +75,44 @@ - 后端 / 运维:需要在本地或服务器上快速拉起 macOS VM 做兼容性验证或演示。 - 团队:对外说明 **“我们不支持 Docker macOS,统一用龙虾方案”**。 +--- + +## 管理端迁移 Mycontent-temp:菜单/布局新规范基线 + +### 决议(团队共享) + +- **目标态基线**:以 `Mycontent-temp/soul-admin` 的 `AdminLayout` + `SettingsPage` 作为“新规范基线”,后续管理端所有菜单/布局调整按该基线执行,避免两套后台并行发散。 +- **主导航收敛**:侧栏只保留 5 个主入口(概览/内容/用户/找伙伴/推广),系统设置固定底部,取消“更多”折叠入口。 +- **功能不丢但入口收敛**:订单/提现/推广设置/VIP角色/导师等页面保留路由可达,入口通过概览卡片或页面内跳转承载;作者/管理员设置并入 `/settings?tab=author|admin`。 + +### 实施建议 + +- 迁移时优先保证:**鉴权一致(GET /api/admin)**、**路由可达性**、**菜单一致性**,再逐步优化概览聚合接口与快捷入口。 + +--- + +## 新旧版代码对比方法论(Mycontent-temp vs miniprogram) + +### 场景 + +存在两个并行代码库(主线 + 预览版),需要判断哪个版本更可靠,以及如何安全地吸收另一版的优点。 + +### 最佳实践 + +1. **批量 diff 优先于逐文件比较**:用 PowerShell 批量对比 WXSS/JS/WXML 文件,精确列出「相同/有差异」的文件清单,再聚焦差异文件逐一分析。 +2. **以功能完整性为基准**:不以「新/旧」日期判断优劣,而以**功能是否完整**为主要依据;本次判断旧版(miniprogram)才是功能更完整的版本。 +3. **差异归类**: + - **旧版有、新版没有** → 旧版是主线,保留旧版 + - **新版有、旧版没有** → 评估是否需要移植(如 dashboard-stats 调用) + - **样式差异** → 对比具体行数,判断是改进还是遗漏 +4. **接口对比时对照新版参考修复 bug**:新版的接口实现即使存在,也可能有遗漏;参考后自行修复(去重、最小值、错误码等)再提交。 + +### 适用场景 + +- 分支合并前的功能完整性分析 +- 迁移预览版到主线时的取舍决策 +- 跨版本 bug 溯源 + +> 同时影响:小程序开发工程师、后端工程师 +> 详见会议纪要:`.cursor/meeting/2026-03-10_小程序新旧版对比与dashboard接口新增.md` + diff --git a/.cursor/agent/团队/evolution/索引.md b/.cursor/agent/团队/evolution/索引.md index 72a8adf9..47f4dc7a 100644 --- a/.cursor/agent/团队/evolution/索引.md +++ b/.cursor/agent/团队/evolution/索引.md @@ -5,3 +5,4 @@ | 日期 | 摘要 | 文件 | |------|------|------| | 2026-03-05 | 分支冲突后各端完整性自查流程 | [2026-03-05.md](./2026-03-05.md) | +| 2026-03-10 | 管理端迁移 Mycontent-temp:菜单/布局新规范基线与入口收敛规则 | [2026-03-10.md](./2026-03-10.md) | diff --git a/.cursor/agent/小程序开发工程师/evolution/2026-03-10.md b/.cursor/agent/小程序开发工程师/evolution/2026-03-10.md new file mode 100644 index 00000000..10066f86 --- /dev/null +++ b/.cursor/agent/小程序开发工程师/evolution/2026-03-10.md @@ -0,0 +1,46 @@ +# 小程序开发工程师 经验记录 - 2026-03-10 + +## 管理端迁移 Mycontent-temp:小程序侧关注点 + +- **菜单/布局迁移不应影响小程序接口**:管理端仅重排入口与页面承载,禁止因此改动小程序端接口路径或混用 `/api/miniprogram/*`。 +- **内容编辑产物稳定性**:如果管理端迁移导致内容从 Markdown → HTML(TipTap)或 mention/tag 的序列化结构变化,小程序阅读页解析必须同步升级并回归兼容。 +- **验收建议**:迁移期间抽样验证“新编辑器保存的内容”在小程序阅读页可正常渲染与交互(@ 点击加好友、# 标签等)。 + +> 详见会议纪要:`.cursor/meeting/2026-03-10_管理端迁移Mycontent-temp菜单布局讨论.md` + +--- + +## my.js 阅读统计改为后端接口(loadDashboardStats 移植) + +**场景**:旧版 `my.js` 的 `initUserStatus()` 用本地缓存随机数时间(`Math.floor(Math.random() * 200) + 50`)和标题占位(`章节 ${id}`)展示统计,不准确且不一致。 + +**解决方案**: +1. 移植 Mycontent-temp 中的 `loadDashboardStats()` 方法 +2. 调用 `/api/miniprogram/user/dashboard-stats?userId=xxx` +3. 同步 `readSectionIds` 到 `app.globalData` 和 Storage +4. 返回真实 `recentChapters`(含标题/mid)、`readCount`、`totalReadMinutes`、`matchHistory` + +**initUserStatus 改造要点**: +- `readCount` 初始化为 `0`(不再读本地缓存) +- `recentChapters` 初始化为 `[]` +- `totalReadTime` 初始化为 `0`(不再用随机数) +- 新增 `matchHistory: 0` 字段 +- 登录状态下额外调用 `this.loadDashboardStats()` + +**规则沉淀**:`my.js` 阅读统计必须走后端接口,禁止用本地缓存 + 随机数占位展示统计数据。 + +--- + +## 富文本渲染现状(技术债,待实施) + +**现状**:`contentParser.js` 将 TipTap HTML 剥成纯文本,``/`

`/`