Files
soul-yongping/.cursor/agent/后端工程师/evolution/2026-03-12.md
2026-03-14 14:37:17 +08:00

62 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 后端工程师 经验记录 - 2026-03-12
## 1. persons 表 token 字段与 DB 迁移
### 问题
新增 @ 人物时报错:`Unknown column 'token' in 'field list'`。GORM model 已加 `Token` 字段,但数据库未执行迁移。
### 解决方案
- **迁移脚本**`soul-api/scripts/add-persons-token.sql`
- **执行**`node .cursor/scripts/db-exec/run.js -f soul-api/scripts/add-persons-token.sql`
- **内容**`ALTER TABLE persons ADD COLUMN token VARCHAR(36) NOT NULL DEFAULT '' AFTER person_id` + 唯一索引
### 规则
- **Model 新增字段后**:需编写并执行 ALTER 脚本GORM AutoMigrate 不一定自动生效(取决于启动时机与连接)
- **迁移脚本位置**`soul-api/scripts/`,命名 `add-xxx.sql`
- **执行方式**db-exec 脚本读取 soul-api/.env 的 DB_DSN
---
## 2. CKBLead 用 token 兑换真实密钥
- `targetUserId` 现为 persons.token非 person_id
- 查询:`db.Where("token = ?", body.TargetUserID).First(&p)`
-`p.CkbApiKey` 调用存客宝
---
## 3. 9.9 买断与后端开关hasFullBook
### 场景
- 小程序已通过 `hasFullBook` 标识「买断全书」,权限判断和文案都依赖该字段(由 `/api/miniprogram/user/purchase-status``/api/miniprogram/user/check-purchased` 返回)。
- 现在需要在用户资料里增加一个布尔开关:运维/客服手动打开后,相当于该用户已经买过 9.9,全书可看,后续不再需要支付。
### 设计要点
- **统一事实来源**9.9 买断是否生效完全由后端计算,前端只认:
- `purchase-status` 返回的 `hasFullBook = true`
-`check-purchased` 返回 `isPurchased = true``reason = "has_full_book"`
- **用户资料开关**
-`users` 表或 user profile 中新增布尔字段(例如 `manual_fullbook`,具体命名按现有规范调整)。
- 仅管理端/运维修改该字段,小程序不直接写入。
- **接口契约调整**
- `/api/miniprogram/user/purchase-status`
- 计算 `hasFullBook` 时,将订单表中的全书订单结果与 `manual_fullbook`**OR**,只要任一为真就返回 `hasFullBook = true`
- `/api/miniprogram/user/check-purchased`
- 对章节做权限判断时,如果由 `manual_fullbook` 推导出可看,应返回:
- `isPurchased = true`
- `reason = "has_full_book"`
- 前端的 `chapterAccessManager.syncLocalCache` 会据此把 `app.globalData.hasFullBook = true` 并同步到 `userInfo.hasFullBook`
- **与 VIP 的边界**
- `hasFullBook`9.9 买断)与 `isVip`(会员)继续解耦:手动开 fullbook 开关不会自动授予 VIP。
- VIP 相关逻辑只看 `isVip` / `vipExpireDate`,不受 `manual_fullbook` 影响。
### 规则
- 不在前端增加「跳过支付」开关,所有免 9.9 行为都通过后端折叠到 `hasFullBook/has_full_book` 暴露给小程序。
- 满足以上约定后,小程序现有代码无需修改即可支持「后台手动赠送 9.9 买断」。