Update evolution indices and enhance user experience in mini program
- Added new entries for content ranking algorithm adjustments and cross-platform reuse in the evolution indices for backend, team, and mini program development. - Improved user interface elements in the mini program, including the addition of a hidden settings entry and refined guidance for profile modifications. - Enhanced reading statistics display with formatted numbers for better clarity and user engagement. - Updated reading tracker logic to prevent duplicate duration accumulation and ensure accurate reporting of reading progress.
This commit is contained in:
33
.cursor/agent/后端工程师/evolution/2026-03-14.md
Normal file
33
.cursor/agent/后端工程师/evolution/2026-03-14.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# 2026-03-14 - 内容排名算法修正(排名分公式)
|
||||
|
||||
## 问题 / 场景
|
||||
|
||||
- 管理端「内容排行」与小程序「精选推荐」共用 `computeArticleRankingSections`,原算法错误:
|
||||
- 使用「原始数值 × 权重」:`hot = readCnt×readWeight + payCnt×payWeight + recencyScore×recencyWeight`
|
||||
- `recencyScore` 为 0–1 的天数衰减,非排名分
|
||||
- 管理端修改权重后,列表不刷新(只调了 loadList,未调 loadRanking)。
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 算法修正(db_book.go computeSectionsWithHotScore)
|
||||
|
||||
- **公式**:热度积分 = 阅读权重×阅读排名分 + 新度权重×新度排名分 + 付款权重×付款排名分(三权重之和须为 1)
|
||||
- **排名分规则**:
|
||||
- 阅读量前 20 名:第 1 名=20 分 … 第 20 名=1 分,其余 0 分
|
||||
- 最近更新前 30 篇:第 1 名=30 分 … 第 30 名=1 分,其余 0 分
|
||||
- 付款数前 20 名:第 1 名=20 分 … 第 20 名=1 分,其余 0 分
|
||||
- **权重配置**:从 `system_config.article_ranking_weights` 读取 readWeight、recencyWeight、payWeight
|
||||
- **手动覆盖**:若 `chapters.hot_score > 0`,则优先使用该值
|
||||
|
||||
### 与前端约定
|
||||
|
||||
- 管理端保存权重后需同时调用 `loadList()` 和 `loadRanking()`,并关闭弹窗,列表才能立即刷新。
|
||||
|
||||
## 代码位置
|
||||
|
||||
- `soul-api/internal/handler/db_book.go`:`computeSectionsWithHotScore`、`computeArticleRankingSections`
|
||||
- 管理端 `ContentPage.tsx`:`handleSaveRankingWeights` 中 loadRanking + setShowRankingAlgorithmModal(false)
|
||||
|
||||
## 影响
|
||||
|
||||
- 管理端内容排行榜、小程序精选推荐(`/api/miniprogram/book/recommended`)均复用该算法,修正后两端同步生效。
|
||||
@@ -6,3 +6,4 @@
|
||||
| 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) |
|
||||
| 2026-03-12 | persons token 字段与 DB 迁移;CKBLead 用 token 兑换 ckb_api_key | [2026-03-12.md](./2026-03-12.md) |
|
||||
| 2026-03-14 | 内容排名算法修正:排名分公式(阅读/新度/付款前 N 名),支持 hot_score 手动覆盖 | [2026-03-14.md](./2026-03-14.md) |
|
||||
|
||||
17
.cursor/agent/团队/evolution/2026-03-14.md
Normal file
17
.cursor/agent/团队/evolution/2026-03-14.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# 2026-03-14 - 内容排名算法跨端复用约定
|
||||
|
||||
## 业务规则
|
||||
|
||||
- **热度积分公式**:阅读权重×阅读排名分 + 新度权重×新度排名分 + 付款权重×付款排名分(三权重之和须为 1)
|
||||
- **排名分规则**:阅读量前 20 名(20~1 分)、最近更新前 30 篇(30~1 分)、付款数前 20 名(20~1 分)
|
||||
|
||||
## 跨端复用
|
||||
|
||||
- **管理端**:`/api/db/book?action=ranking` → `computeArticleRankingSections`
|
||||
- **小程序**:`/api/miniprogram/book/recommended` → `computeArticleRankingSections`(取前 3 条)
|
||||
- 两者共用同一套算法、权重配置(`article_ranking_weights`)、置顶配置(`pinned_section_ids`)
|
||||
|
||||
## 约定
|
||||
|
||||
- 排名算法修改只需改 soul-api 一处,管理端与小程序自动同步。
|
||||
- 管理端保存权重后必须调用 `loadRanking()` 刷新列表,否则用户看不到变化。
|
||||
@@ -7,3 +7,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) |
|
||||
| 2026-03-12 | 密钥/token 设计:关联小程序 key、@ 人物 token,不暴露真实密钥、服务端兑换 | [2026-03-12.md](./2026-03-12.md) |
|
||||
| 2026-03-14 | 内容排名算法跨端复用:管理端内容排行与小程序精选推荐共用 computeArticleRankingSections | [2026-03-14.md](./2026-03-14.md) |
|
||||
|
||||
40
.cursor/agent/小程序开发工程师/evolution/2025-03-14-文本长按复制.md
Normal file
40
.cursor/agent/小程序开发工程师/evolution/2025-03-14-文本长按复制.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# 阅读页文本长按选中复制
|
||||
|
||||
> 问题→解决闭环,已升级 miniprogram-dev SKILL
|
||||
|
||||
---
|
||||
|
||||
## 问题
|
||||
|
||||
小程序阅读页正文长按时无法选中、复制文本。
|
||||
|
||||
---
|
||||
|
||||
## 解决方案
|
||||
|
||||
使用 `text` 组件的 **`user-select`** 属性(基础库 2.12.1+,官方推荐;`selectable` 已废弃):
|
||||
|
||||
```html
|
||||
<text user-select>{{seg.text}}</text>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 实施范围(read.wxml)
|
||||
|
||||
- 章节标题:`<text class="chapter-title" user-select>`
|
||||
- 正文片段:text / mention / linkTag 均加 `user-select`
|
||||
- 预览段落:`<text user-select>{{item}}</text>`(原为 view 内直接 `{{item}}`,需用 text 包裹)
|
||||
|
||||
---
|
||||
|
||||
## 备选方案
|
||||
|
||||
- **selectable**:已废弃但多数环境仍可用,若 `user-select` 导致布局异常(inline-block 换行)可回退
|
||||
- **wx.setClipboardData + bindlongpress**:iOS 原生选中失效时,可做长按整段复制兜底
|
||||
|
||||
---
|
||||
|
||||
## Skill 升级
|
||||
|
||||
已写入 miniprogram-dev SKILL §10 文本可选与复制。
|
||||
18
.cursor/agent/小程序开发工程师/evolution/2026-03-14.md
Normal file
18
.cursor/agent/小程序开发工程师/evolution/2026-03-14.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# 2026-03-14 - 我的页设置隐藏与资料引导场景梳理
|
||||
|
||||
## 1. 设置入口隐藏
|
||||
|
||||
- **需求**:我的页「设置」菜单项隐藏
|
||||
- **实现**:`my.wxml` 中设置菜单项加 `wx:if="{{false}}"`
|
||||
- **说明**:设置页仍存在,用户可通过推广页「去设置」等入口进入(如绑定微信号用于提现)
|
||||
|
||||
## 2. 资料修改引导场景(何时引导用户修改资料)
|
||||
|
||||
| 场景 | 位置 | 触发条件 | 行为 |
|
||||
|------|------|----------|------|
|
||||
| 登录后 | app.js `_ensureProfileCompletedAfterLogin` | 昵称空/默认/头像空 | Toast「请先完善头像和昵称」→ 跳转 profile-edit |
|
||||
| 阅读页 @某人 | read.js `_doMentionAddFriend` | 已登录但无手机/微信号 | 弹窗「完善资料」→ 确认跳转 profile-edit |
|
||||
| 找伙伴页 | match.js `ensureContactInfo` | 已登录但无手机/微信号 | 页面内弹窗填写联系方式(不跳转) |
|
||||
| 首页链接卡若 | index.js | 无手机/微信号 | 弹窗输入手机号(不跳转 profile-edit) |
|
||||
|
||||
- **判断依据**:`_isProfileIncomplete(user)` 检查 nickname、avatar;手机/微信号需单独拉 `user/profile` 接口判断。
|
||||
@@ -3,9 +3,11 @@
|
||||
| 日期 | 摘要 | 文件 |
|
||||
|------|------|------|
|
||||
| 2025-03-14 | 联网吸收:基础库 3.14、Skyline、隐私按需授权、新 API | [2025-03-14-联网吸收小程序最新开发规则与API.md](./2025-03-14-联网吸收小程序最新开发规则与API.md) |
|
||||
| 2025-03-14 | 阅读页文本长按选中复制:text 组件 user-select | [2025-03-14-文本长按复制.md](./2025-03-14-文本长按复制.md) |
|
||||
| 2026-02-28 | input 边距口诀、match 资源对接弹窗修正 | [2026-02-28.md](./2026-02-28.md) |
|
||||
| 2026-03-03 | 我的页面卡片区边距优化,16rpx 推荐值 | [2026-03-03.md](./2026-03-03.md) |
|
||||
| 2026-03-05 | 分支合并后核心流程自测;app.json 拆行;orders 接口确认 | [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) |
|
||||
| 2026-03-12 | 链接标签 mpKey、@ 人物 token 兑换:contentParser、onLinkTagTap、onMentionTap | [2026-03-12.md](./2026-03-12.md) |
|
||||
| 2026-03-14 | 我的页设置入口隐藏;资料修改引导场景梳理(登录后、@某人、找伙伴、链接卡若) | [2026-03-14.md](./2026-03-14.md) |
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
|
||||
| 2026-03-12 | 后端、团队 | 业务规则 | api-dev SKILL、team three-tier-arch | 9.9 买断统一由后端折叠为 hasFullBook/has_full_book,小程序和管理端只认该信号;可通过用户资料开关 OR 订单实现赠送全书 |
|
||||
| 2026-03-13 | 小程序、后端、团队 | 业务规则 | api-dev SKILL、miniprogram-dev SKILL、three-tier-arch SKILL | 文章详情预览统一由后端按 50% 截取,小程序按 accessState 使用预览/全文,外层 content 与 data.content 始终一致以避免泄露全文 |
|
||||
| 2025-03-14 | 小程序 | 最佳实践 | miniprogram-dev SKILL §10 | 阅读页文本长按选中复制:text 组件 user-select(selectable 已废弃),正文/标题/预览均加 user-select |
|
||||
| 2026-03-14 | 后端、管理端、小程序、团队 | 业务规则/bug 修复 | - | 内容排名算法修正(排名分公式);保存权重后 loadRanking 刷新;我的页设置隐藏;资料引导场景梳理 |
|
||||
|
||||
---
|
||||
|
||||
@@ -50,4 +52,4 @@
|
||||
|
||||
---
|
||||
|
||||
**最后更新**:2026-03-13(文章预览规则统一、小程序与后端对齐)
|
||||
**最后更新**:2026-03-14(排名算法修正、设置隐藏、资料引导梳理)
|
||||
|
||||
@@ -27,9 +27,10 @@ soul-api(Go + Gin + GORM + MySQL)提供三组路由:`/api/miniprogram/*`
|
||||
| 2026-03-12 | persons 表新增 token 字段(add-persons-token.sql);CKBLead 用 token 兑换 ckb_api_key | 已完成 |
|
||||
| 2026-03-12 | 9.9 买断后端开关方案:users 增手动 fullbook 开关,purchase-status/check-purchased 折叠为统一 hasFullBook/has_full_book,小程序免改即支持赠送全书 | 已完成 |
|
||||
| 2026-03-13 | 文章详情预览统一与安全:previewContent 改为截取正文前 50%,findChapterAndRespond 保证外层 content 与 data.content 一致,未授权只返回预览 | 已完成 |
|
||||
| 2026-03-14 | 内容排名算法修正:computeSectionsWithHotScore 改为排名分公式(阅读/新度/付款前 N 名得分),支持手动 hot_score 覆盖 | 已完成 |
|
||||
|
||||
> **格式说明**:每次开发后在此追加一行,日期格式 YYYY-MM-DD,状态用:已完成 / 进行中 / 待续 / 搁置
|
||||
|
||||
---
|
||||
|
||||
**最后更新**:2026-03-13
|
||||
**最后更新**:2026-03-14
|
||||
|
||||
@@ -24,9 +24,10 @@ Soul 创业派对全项目架构与约定:路由隔离(miniprogram/admin/db
|
||||
| 2026-03-12 | 密钥/token 设计:关联小程序 key、@ 人物 token;不暴露真实密钥、服务端兑换 | 已完成 |
|
||||
| 2026-03-12 | 9.9 买断团队约定:后端统一输出 hasFullBook/has_full_book,小程序和管理端只认该信号;支持通过用户资料开关 OR 订单赠送全书且不影响 VIP 逻辑 | 已完成 |
|
||||
| 2026-03-13 | 文章详情预览规则统一:预览长度由后端统一按 50% 计算,小程序按 accessState 切换预览/全文,接口约定 content 与 data.content 始终一致 | 已完成 |
|
||||
| 2026-03-14 | 内容排名算法跨端复用:管理端内容排行与小程序精选推荐共用 computeArticleRankingSections,排名分公式、权重配置统一 | 已完成 |
|
||||
|
||||
> **格式说明**:每次架构级讨论后在此追加一行,日期格式 YYYY-MM-DD
|
||||
|
||||
---
|
||||
|
||||
**最后更新**:2026-03-13
|
||||
**最后更新**:2026-03-14
|
||||
|
||||
@@ -29,9 +29,11 @@
|
||||
| 2026-03-11 | 以界面定需求:小程序界面清单纳入《以界面定需求》;展示以用户资料为准,与现有实现一致 | 已完成 |
|
||||
| 2026-03-12 | 链接标签 mpKey 兑换 appId;@ 人物 token 兑换 ckb_api_key;contentParser、onLinkTagTap、onMentionTap | 已完成 |
|
||||
| 2026-03-13 | 阅读页文章预览与付费解锁对齐:预览长度改由后端统一计算,前端按 accessState 显示预览/全文,避免 data.content 泄露全文 | 已完成 |
|
||||
| 2025-03-14 | 阅读页文本长按选中复制:text 组件 user-select,已升级 SKILL §10 | 已完成 |
|
||||
| 2026-03-14 | 我的页设置入口隐藏(wx:if);资料修改引导场景梳理(登录后、@某人、找伙伴、链接卡若) | 已完成 |
|
||||
|
||||
> **格式说明**:每次开发后在此追加一行,日期格式 YYYY-MM-DD,状态用:已完成 / 进行中 / 待续 / 搁置
|
||||
|
||||
---
|
||||
|
||||
**最后更新**:2026-03-13
|
||||
**最后更新**:2026-03-14
|
||||
|
||||
@@ -24,9 +24,10 @@
|
||||
| 2026-03-10 | Toast 通知系统落地:创建 utils/toast.ts(纯原生),全系统 18 文件约 90 处 alert 全部替换为 toast.success/error/info | 已完成 |
|
||||
| 2026-03-11 | 以界面定需求:管理端界面清单纳入《以界面定需求》,作为验收基准 | 已完成 |
|
||||
| 2026-03-12 | ContentPage TypeScript 严格类型修复;关联小程序 key、@ 人物 token 设计(链接标签存 key、PersonItem.id=token) | 已完成 |
|
||||
| 2026-03-14 | 排名算法权重保存后刷新:handleSaveRankingWeights 成功后 loadRanking + 关闭弹窗,列表立即更新 | 已完成 |
|
||||
|
||||
> **格式说明**:每次开发后在此追加一行,日期格式 YYYY-MM-DD,状态用:已完成 / 进行中 / 待续 / 搁置
|
||||
|
||||
---
|
||||
|
||||
**最后更新**:2026-03-12
|
||||
**最后更新**:2026-03-14
|
||||
|
||||
17
.cursor/agent/管理端开发工程师/evolution/2026-03-14.md
Normal file
17
.cursor/agent/管理端开发工程师/evolution/2026-03-14.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# 2026-03-14 - 内容排行权重保存后刷新
|
||||
|
||||
## 问题 / 场景
|
||||
|
||||
- 管理端「排名算法」弹窗修改权重并保存后,内容排行榜列表和排序不更新。
|
||||
- 原因:`handleSaveRankingWeights` 成功时只调用了 `loadList()`(章节树),未调用 `loadRanking()`(内容排行榜)。
|
||||
|
||||
## 解决方案
|
||||
|
||||
- 保存成功后:
|
||||
1. `setShowRankingAlgorithmModal(false)` 关闭弹窗
|
||||
2. `loadList()` 刷新章节树(含 hotScore)
|
||||
3. `loadRanking()` 刷新内容排行榜
|
||||
|
||||
## 代码位置
|
||||
|
||||
- `soul-admin/src/pages/content/ContentPage.tsx`:`handleSaveRankingWeights`
|
||||
@@ -3,6 +3,7 @@
|
||||
| 日期 | 摘要 | 文件 |
|
||||
|------|------|------|
|
||||
| 2026-03-12 | ContentPage TypeScript 严格类型修复;关联小程序 key、@ 人物 token 设计 | [2026-03-12.md](./2026-03-12.md) |
|
||||
| 2026-03-14 | 排名算法权重保存后 loadRanking 刷新、关闭弹窗 | [2026-03-14.md](./2026-03-14.md) |
|
||||
| 2026-03-05 | 分支合并后全功能自测,404/异常接口记录 | [2026-03-05.md](./2026-03-05.md) |
|
||||
| 2026-03-05 | 文章详情@某人:编辑页插入 @用户、保存约定 content 格式 | [2026-03-05.md](./2026-03-05.md) |
|
||||
| 2026-03-10 | 管理端迁移 Mycontent-temp 菜单/布局:主导航收敛、Settings Tab 承载 author/admin | [2026-03-10.md](./2026-03-10.md) |
|
||||
|
||||
@@ -84,7 +84,15 @@ description: Soul 创业派对小程序开发规范。在 miniprogram/ 下编辑
|
||||
|
||||
---
|
||||
|
||||
## 9. 何时使用本 Skill
|
||||
## 9. 文本可选与复制(阅读类内容)
|
||||
|
||||
- **长按选中复制**:需支持长按选中的文本用 `<text user-select>...</text>`(基础库 2.12.1+,`selectable` 已废弃)。
|
||||
- **适用**:章节标题、正文段落、@ 提及、# 链接标签、预览内容等。
|
||||
- **注意**:`user-select` 会使 text 显示为 inline-block,若布局异常可回退 `selectable`;iOS 原生选中失效时可用 `bindlongpress` + `wx.setClipboardData` 做整段复制兜底。
|
||||
|
||||
---
|
||||
|
||||
## 10. 何时使用本 Skill
|
||||
|
||||
- 在 **miniprogram/** 下新增或修改页面、组件、utils 时。
|
||||
- 在小程序内新增或修改任何网络请求路径时(必须保持 `/api/miniprogram/...`)。
|
||||
@@ -92,5 +100,6 @@ description: Soul 创业派对小程序开发规范。在 miniprogram/ 下编辑
|
||||
- 做登录、手机号、推荐码等涉及用户信息的授权时(遵循 §8 隐私按需授权)。
|
||||
- 做表单、input/textarea 样式时(遵循 §6,用 view 包裹,padding 写在 view 上)。
|
||||
- 做个人中心、设置页布局时(遵循 §7,卡片区边距 16rpx)。
|
||||
- 做阅读、文章等需长按复制的文本时(遵循 §9,text 加 user-select)。
|
||||
|
||||
遵循本 Skill 可保证小程序只与 soul-api 的 miniprogram 路由组对接,避免与管理端或 next-project 接口混用。
|
||||
|
||||
Reference in New Issue
Block a user