# 「叶雷讲数学」小程序 重构开发文档 | 项 | 内容 | |---|---| | 版本 | v1.0 | | 日期 | 2026-09-29 | | 状态 | 设计定稿,待开发 | | 范围 | 小程序端 / 服务端 / 管理后台 / 数据端 | --- ## 1. 项目概述 ### 1.1 背景 现有系统为「微信小程序 + 原生 PHP + MySQL 5.7 + 静态文件站点」的实现,可正常运行,但存在结构性问题:无鉴权体系、SQL 全字符串拼接、数据库无主键与约束、无正式管理后台、无支付能力、存在大量死代码与废弃表、服务端无版本控制。 本次重构的目标是:**在保持小程序用户侧外观与使用体验不变的前提下,把技术实现整体替换为规范化工程,并补齐支付与管理后台能力。** ### 1.2 目标 1. 用户侧无感升级:页面表现一致、已有数据零丢失、已购课程权限延续。 2. 技术实现规范化:分层、类型安全、边界校验、迁移管理、统一契约。 3. 补齐支付能力,使课程销售可自助完成。 4. 补齐管理后台,使运营脱离手写 SQL。 ### 1.3 明确不做 - 不做微服务、K8s、服务网格。 - 不上 Redis / 消息队列(发货用「数据库状态机 + 定时查单」足够)。 - 不上 GraphQL。 - 不引入 Turborepo / Nx。 - 不重写小程序为 Taro / uni-app。 - 不补短信能力(触达改用微信订阅消息)。 - 不做 DDD 分层、CQRS、事件溯源。 --- ## 2. 决策记录(ADR) | 编号 | 决策 | 理由 | 影响 | |---|---|---|---| | ADR-001 | 放弃口令码,权益由订单驱动 | 支付上线后口令码仅剩线下分发用途,维护成本高于价值 | 删除 `课程口令码`、`课程口令码读取信息`;老用户走 legacy 权益迁移 | | ADR-002 | 数据端保留 MySQL 5.7,不升级 | 用户明确要求 | Prisma `provider = mysql`;见 4.1 约束清单 | | ADR-003 | 服务端与管理后台使用独立域名 | 用户要求 | Nginx 分站点;后端仍为同一 Node 进程 | | ADR-004 | 小程序前端不重写,只重写 JS 层 | 保证「外观不变」 | 复用全部 `.wxml` / `.wxss` / `static/` | | ADR-005 | `VideoDetailsPage` 保持现有实现逻辑不变 | 该页为对外宣传页 | 内容继续硬编码在前端,不迁入数据库 | | ADR-006 | AppID 沿用 `wx3fbaf897825bf04f` | 换 AppID 等于重发小程序,用户与虚拟支付配置全部丢失 | 数据迁移无需做 openid 映射 | | ADR-007 | 技术栈换为 Node + NestJS + Prisma | 用户选定 Node;管理后台与 API 可共享类型与校验 | 需自行维护 Node 进程守护与部署 | --- ## 3. 总体架构 ### 3.1 架构图 ```text 微信小程序 | https api.yeomai.site/v1/* | Authorization: Bearer v +----------------------------------------------------+ | NestJS 单进程 :3000 | | + /v1/* 小程序端接口 | | + /admin/v1/* 管理后台接口(独立 JWT) | | + /pay/notify 虚拟支付发货推送(XML 应答) | | + @nestjs/schedule 每 5 分钟兜底查单 | +----------------------------------------------------+ | | | v v v MySQL 5.7 对象存储 / CDN 微信虚拟支付 (宝塔) static.yeomai.site 下单 / 推送 / 查单 管理后台(Next.js :3001) admin.yeomai.site -> 后台前端 admin-api.yeomai.site -> 反代到同一 Node 进程 /admin/v1/* ``` ### 3.2 域名规划 | 域名 | Nginx 指向 | 用途 | |---|---|---| | `api.yeomai.site` | `127.0.0.1:3000`(`/v1/*`) | 小程序接口 | | `admin-api.yeomai.site` | `127.0.0.1:3000`(`/admin/v1/*`) | 管理后台接口 | | `admin.yeomai.site` | `127.0.0.1:3001` | 管理后台前端 | | `static.yeomai.site` | 对象存储 / CDN | 图片与 HLS 视频 | > `api.yeomai.site` 沿用现有域名,小程序「request 合法域名」白名单无需改动。 ### 3.3 小程序侧 MP 配置变更清单 | 项 | 是否需要改 | 说明 | |---|---|---| | `request` 合法域名 | 沿用则不用改 | 仅 `wx.request` / `uploadFile` / `downloadFile` / `connectSocket` 受白名单约束 | | `` / `