商城 / 软件库等模块扩展
以已落地的「商城一体化」与「软件库付费下载」为例,讲解如何扩展交易类模块。
1. 软件库付费下载(参考实现)
数据载体:typecho_soft 新增 saleStatus(0免费/1付费) + price(站内资产售价)。
接口三件套:
| 接口 | 职责 |
|---|---|
/soft/list、/soft/info |
返回 price/isPaid(登录);非管理员隐藏 downloadUrl |
/soft/download |
免费直下;付费已购直下;未购返回 needBuy 标识 |
/soft/buy |
幂等购买:查 userlog(type=softBuy) → 扣 assets → 写 paylog(负金额,paytype=softBuy) → 写 userlog → 清缓存 |
前端三态按钮(pages/soft/info.vue):
downloadBtnText() {
if (soft.saleStatus == 1 && soft.price > 0 && soft.isPaid != 1) {
return currencyName + formatPrice(soft.price) + " 购买并下载";
}
return "立即下载";
}
要点:
- 已购判断只依赖
userlog记录,与当前价格无关(改价不影响老用户)。 - 购买必须事务(扣费+双写不可拆)。
- 详情缓存按
uid隔离(_soft_info_{id}_{uid}),否则付费状态串用户。
付费下载流程图:
2. 将同样的模式复制到其他"资产交易"
任何"消耗站内资产"的功能(解锁内容、付费圈子、AI 会话、小游戏扣费)都可复用同一骨架:
查已购(userlog type=Xxx) → 校验资产 → 扣 assets → 写 paylog(-price) → 写 userlog → 清缓存
参考:ForumController.sectionPaid(付费圈子)、GptController(AI 扣费)、MinigameController(游戏消耗)。
3. 商城模块扩展(商品类型/支付方式)
- 商品类型:
typecho_shop的type字段区分实体/源码/软件/付费阅读;不同 type 在结算页走不同分支。 - 支付方式:
PayController支持支付宝/微信/卡密/易支付/PayPal;新增通道 = 加支付方法 +paylog.paytype+ 回调处理。 - 卖单闭环:
merchantEditOrder(发货/退款)、setArrived(确认送达)、rate(评价)。 - 扩展建议:不要改坏既有
buy/buyCart流程,新类型用独立 method 或type分支。
4. 扩展时的工程规范
- 表字段改动 → 同步实体 + Mapper XML + 建表/迁移。
- 加接口 → 保持返回规范 + 更新文档站。
- 前端 → 公共 CSS、主题变量、三端条件编译。
- 双端同步 → RuleAppRro → RuleAppX、RuleApiPro → RuleApiX。
- 金额一律 BigDecimal;幂等与防刷不能省。