feat: 支持会员卡合同在线签署

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
richarjiang
2026-10-28 12:24:22 +08:00
parent c04a9db627
commit ecea65f596
46 changed files with 4313 additions and 232 deletions

View File

@@ -127,3 +127,9 @@ pnpm deploy:server # 部署后端到生产环境
- 案例支持 1–9 组双图对比或已合成单图,课时为正整数(节);标题、化名、练习背景和变化说明不作疗效承诺。授权记录只对管理员可见,发布需确认学员已单独同意公开宣传。
- 保存采用版本校验;撤回授权自动下架。游客首页优先展示最多 3 个案例,更多通过分页浏览;登录用户预约入口优先。无已发布案例时隐藏模块,故障不阻断首页。
- 迁移目录仅放 migration.sql;发布、回退、图片清理和真机验收约定放 docs/teaching-cases.md。未引用资产保留供重试,清理前核对引用且不得删除有效案例图片。
### 会员卡合同签署
- 独立 `contract` 模块(服务端 `src/contract`),共享契约在 `shared/src/types/contract.ts`,判定函数 `requiresMembershipContract` 在 `shared/src/contract.ts`;学员页面在 `pages/contract` 分包,馆主页面为 `pages/admin/contracts.vue`、`contract-settings.vue`。规格与发布说明在 `docs/membership-contract.md`。
- 只有月卡和多次卡签署,每笔支付订单一份合同,在支付回调发卡事务内签发;存量卡按未覆盖订单自动补签,无订单的由馆主填写金额发起。
- 合同正文只在服务端 `contract-template.ts` 生成;签署时比对内容 SHA-256 后冻结正文、双方签名和签署凭证,签署后不可修改。改条款须升级 `CONTRACT_TEMPLATE_VERSION`。
- 新购合同未签署不能自助预约(`requireBeforeBooking`),存量补签只提醒;乙方为个体工商户,显示「经营者」而非法定代表人。不得加入「最终解释权」、到期不退、转卡收费等格式条款。