项目文件夹

0

场馆约课与身心放松小程序 · 文档仓库

微信小程序「场馆约课与身心放松」的设计文档。线下身心疗愈场馆(瑜伽、颂钵、普拉提、冥想类)的课程预约系统。

代码仓库:basevec/fangsuo_mp

目录约定

本仓库同时作为代码仓 AI Native Dev 流程的知识库AI_NATIVE_KNOWLEDGE_REPO),因此目录结构遵循其约定:

目录 内容 谁写
prd/ 产品需求文档与设计稿 人工维护;Docs 阶段 Agent 可能修改
tech/ 技术方案 人工维护;Docs 阶段 Agent 可能修改
issues/{org}/{repo}/{id}/ 每个 Issue 的 objective.md / plan.md / tech-review.md Agent 自动写入,不要手改

⚠️ 不要在根目录直接放文档。 Docs 阶段的 Agent 只认 prd/tech/,放在根目录会导致同一份文档出现两个位置。

代码仓里的 backend/docs/ 是另一回事,那里放 seed.sqlerrcode.mdapi-contract.mdfield-contract.md 这类需要跟代码同步演进的工程物料——尤其 seed.sql 是要被执行的,必须和 migrations/ 同仓库,否则版本会对不上。本仓库只放设计文档。


当前有效文档

文档 版本 内容 维护人
prd/产品设计-V1.0.md V1.0 产品需求原件:页面逻辑、状态定义、预约支付链路、41 张设计稿。两份技术方案的需求依据 产品
tech/技术方案-小程序后端-V1.3.md V1.3 后端完整技术方案:数据模型、状态机、并发方案、接口契约、定时任务 赵雅涛
tech/技术方案-运营后台-V1.3.md V1.3 /api/admin/* 模块与运营后台前端:架构与部署、业务规则、接口设计、前端方案、开发排期 李绍焕
tech/数据库表结构说明.md V1.3 现网 11 张表的 DDL 摘录,叠上 001005建表以代码仓 backend/migrations/ 为准 李绍焕

产品文档记录的是设计思路与阶段性讨论,不是实现规格。 其中部分内容仍是初版、部分明确不做(候补、系列筛选、老师线上申请、兴趣内容播放器、首页)、部分状态定义在技术评审中被重新拆解过。凡与技术方案冲突,一律以技术方案为准,具体清单见该文档开头的「阅读须知」。

文字准确性方面以飞书原件为准:本仓库的是导出转换版,正文未改动,只整理了格式(图片重命名、补 alt、修正标题层级)。产品更新后需重新导出。三个空章节(后端配置、数据埋点、测试流程)在原文里就是空的,已在文中标注,不是转换丢失。

⚠️ 本仓库中的技术方案以 V1.3 为准。 若在飞书或其他渠道看到 V1.1,其第 5 章 DDL 已作废(按两层模型 + venues/rooms 表编写),不要参考。V1.2 与 V1.3 数据模型完全兼容,V1.3 仅为增量修订,变更内容见第 16 章变更记录。

两份方案的边界:数据模型、状态机、并发方案以《小程序后端》为准,运营后台方案与其对齐、不重复定义;运营后台方案只负责 /api/admin/* 的接口实现、后台前端、以及运营侧的业务规则(编辑限制、上下架校验、退款操作)。现网表结构以 backend/migrations/ 与《数据库表结构说明》为准——两份技术方案里的 DDL 摘录若与迁移不一致,以迁移为准并回来改文档。


项目范围

内容
本期做 约课全链路:浏览 / 报名 / 支付 / 取消退款 / 商家课程管理 / 老师主页
本期不做 绿洲(发现页音视频内容)、首页、数据埋点、候补、用户线上申请成为老师
技术栈 Go 1.22 + Gin + PostgreSQL 16
服务形态 单体服务,小程序端与商家后台共用一个后端、一个数据库
数据模型 一层模型courses 直接承载时间与库存,无课程模板/场次分层)

分工

模块 负责人 路由前缀 职责
小程序端 赵雅涛 /api/mp/* 小程序接口、支付回调、全部定时任务、小程序前端
商家后台 李绍焕 /api/admin/* 后台接口、后台 HTML 页面、建表迁移脚本

建表迁移由李绍焕统一维护migrations/ 目录),赵雅涛需要改表结构时提 PR。


技术方案章节导航

共 16 章 + 2 附录,4700+ 行。按需要看,不必通读:

想了解 看哪章
项目背景、上线前置依赖(备案 / 支付资质) 1
系统架构、表归属、跨模块写入约定 2
为什么是一层模型(含被推翻的理由复核) 3.1
角色与权限 4
全部建表 DDL10 张共用表见第 5 章;ops_audit_logs 见运营后台 / 表结构说明;调度锁不建) 5 + 《数据库表结构说明》
五个状态机 6
并发正确性方案(防超卖、时段冲突、幂等) 7
小程序端专项(字段契约、配置下发、按钮状态) 8
七条核心业务流程 9
6 个定时任务 10
接口契约 11
技术选型、Go 工程约定 12
日志 / 监控 / 安全 / 性能 13
开发排期 14
两人协作约定 15
已确认决策 + 待确认问题 + 变更记录 16

新接手建议阅读顺序:3.1(理解模型) → 5(表结构) → 7(难点方案) → 15(协作边界)。


运营后台方案章节导航

共 12 章,1900+ 行。与《小程序后端》对齐,不重复定义数据模型与状态机。

想了解 看哪章
本期做什么 / 不做什么、外部依赖 1
为什么前端是独立部署服务(不含在单体里) 2.2
请求链路、Next 同源代理、构建期固化的坑 3
表清单与归属、ops_audit_logs 审计表 4
发布态与展示态的三维度拆分 5.1
并发正确性:为什么必须有 enrolled_count 5.5
老师时段冲突与 23P01 的三条触发路径 5.6
前后端分离后业务规则如何只保留一份actions 出参) 5.7
取消本场的二次确认设计 5.8
老师管理、单笔退款(含 releaseSeat 5.9 / 5.10
富文本的存储与后端 HTML 清洗 5.11
复制课程(一层模型的体验补偿) 5.12
/api/admin/* 接口清单、响应结构、错误码 6
JWT、token_version 撤销、双轨凭证 7
后台前端设计(页面、表单、上传、编辑器) 8
internal/admin 分包与前端目录结构 9
K8s 部署、种子数据 10
开发排期(后端 14 人日 + 前端约 15 人日) 11
已确认决策、与 V1.3 的 3 处待拍板出入、已知风险 12

建议先看:第 12 节三项(role / 登录标识 / 审计表)已拍板并落地002/003),本节保留历史。现网 DDL 看《数据库表结构说明》。


四个关键设计点

看方案时容易忽略但很重要的:

enrolled_count 不是可选优化 既防报名超卖,也是「已有人报名的课不允许下架」这个校验的正确性前提。不加这个字段,下架校验用 NOT EXISTS 子查询存在竞态(子查询锁 courses 行,并发 INSERT 在 course_enrollments 上,两者不冲突)。见 7.2.5。

② 抢库存 SQL 的两个条件缺一不可 WHERE id = $1 AND publish_state = 'published' AND enrolled_count < capacity。少了状态判断,用户能报上一门已下架的课。见 7.2.2。

③ 业务规则不得硬编码在前端 小程序改前端要重新提审(1~3 个工作日)。所有规则(日历天数、支付倒计时、免费取消时限)由后端下发,按钮状态也收敛到后端返回的 actionType。见 8.4、8.3.2。

④ 软删除的索引配套 唯一索引与排他约束必须带 AND deleted_at IS NULL,否则删掉的课仍占用老师时段。见 5.2.5。


待确认问题

第 16 章列了尚未拍板的问题。这些不要自行决定,需要找对应的人确认。