更新:2026-09-05 16:11

商城 / 软件库等模块扩展

以已落地的「商城一体化」与「软件库付费下载」为例,讲解如何扩展交易类模块。

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_shoptype 字段区分实体/源码/软件/付费阅读;不同 type 在结算页走不同分支。
  • 支付方式:PayController 支持支付宝/微信/卡密/易支付/PayPal;新增通道 = 加支付方法 + paylog.paytype + 回调处理。
  • 卖单闭环:merchantEditOrder(发货/退款)、setArrived(确认送达)、rate(评价)。
  • 扩展建议:不要改坏既有 buy/buyCart 流程,新类型用独立 method 或 type 分支。

4. 扩展时的工程规范

  1. 表字段改动 → 同步实体 + Mapper XML + 建表/迁移。
  2. 加接口 → 保持返回规范 + 更新文档站。
  3. 前端 → 公共 CSS、主题变量、三端条件编译。
  4. 双端同步 → RuleAppRro → RuleAppX、RuleApiPro → RuleApiX。
  5. 金额一律 BigDecimal;幂等与防刷不能省。