Files
gongxue-base/README.md
2026-06-29 05:05:42 +08:00

197 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# tiku-supabase
这是题库项目从 PocketBase/SQLite 重构到 Supabase/PostgreSQL 的新后端仓库。
当前仓库重点承载“商用 SaaS 版本”的新架构代码,包括多租户数据库、业务 API、PocketBase 数据导入器、本地验证脚本和重构进度文档。旧 PocketBase/React 项目仍保留在原工作区作为功能参照和迁移来源,但这个 Git 仓库不打算作为旧项目全量镜像。
## 当前状态
更新时间2026-06-29
目前已经完成并在本地验证通过的内容:
- Supabase/PostgreSQL 多租户数据库 schema、RLS、索引、触发器。
- `apps/api` 独立业务 API后续供 H5、Taro 小程序、管理后台统一调用;已支持 Supabase Auth JWT 和迁移期 `tk_` session 双入口。
- 租户后台能力:品牌、域名、公开设置、支付账户、登录配置、私密密钥掩码、活动内容、考试日期、题目反馈处理、激活码、优惠券、成员权限、自定义角色模板、班级/教师/学生范围权限、学生批量导入、批量分班、学生备注、跟进任务、审计日志。
- 租户内容能力:可配置题库入口、任意深度分类树、考试意向标记、题目集合、顺序/随机/全真模拟蓝图、题目录入/更新、视频绑定、分数线、单词、知识手册、资料资源台账、题目/单词/知识手册 JSON 批量导入。
- 学生端能力:题库入口、分类树、题目集合、顺序/随机/模考 session 组卷快照、答题、错题本、收藏夹、背单词进度、个人中心、考试倒计时、签到积分、题目反馈、排行榜、分数线、题目视频、订单详情/状态轮询、优惠券领取/抵扣、权益、激活码预检查/兑换、资料下载。
- 平台后台能力租户管理、SaaS 套餐、订阅、账单、服务费收款、用量记录。
- 销售/代理/CRM 增长链路:邀请码、扫码/分享事件、首绑客资保护、销售统计、团队关系、CRM 配置和队列。
- `apps/worker` 后台任务进程CRM webhook 队列消费、generic/钉钉/飞书/企微机器人发送、签名、失败重试和日志。
- 销售/代理分佣结算基础闭环:租户默认比例、成员比例、激活码批次比例、订单/激活码归因、结算单生成、审核、线下打款状态和权限隔离。
- 订单售后基础闭环:退款请求、审核、处理状态流、退款金额累计、部分/全额退款订单状态、全额退款权益撤销、退款事件和审计日志。
- PocketBase schema/数据导入器雏形和导入后校验脚本。
- 本地 Supabase reset、烟测 seed、API 集成测试、完整重构检查命令。
还没有达到生产交付的部分:
- Supabase Auth/JWT、租户角色模板、班级/教师/学生范围权限已可联调;生产前还要做真实云端 Auth/JWKS 回归和 RLS 深测。
- 阿里云/腾讯云短信、微信小程序登录、微信支付、支付宝主链路和微信/支付宝发起退款已完成本地适配微信网页登录、QQ 登录、手机号换绑、退款通知/查询确认、对账、支付补偿和真实生产账号联调还没接完。
- OSS/COS/Supabase Storage 上传下载签名 provider 已接入上传后校验、PDF 预览、防盗链和视频水印还没完成。
- Excel/CSV 导入、分数线/视频批量导入和异步 worker 还没完成。
- 分佣真实打款、结算导出、发票/凭证、CRM 轮询/定向分配、富卡片模板、失败告警和销售转化看板还没完成。
- Taro 跨端前端还没开始 scaffold。
- 根目录已清理为新 Supabase SaaS monorepo 编排层;旧 PocketBase/React 项目和旧构建产物仅保留在 `参考/` 目录作为迁移参考,不进入 Git 提交。
更完整的进度看这些文档:
- `docs/refactor/implementation-status.md`
- `docs/refactor/backend-progress.md`
- `docs/refactor/backend-handoff-roadmap.md`
- `docs/refactor/ai-development-guardrails.md`
- `docs/refactor/content-import-contract.md`
- `docs/refactor/object-storage.md`
- `docs/refactor/project-structure.md`
- `docs/refactor/frontend-handoff-index.md`
- `docs/refactor/backend-capability-status.md`
- `docs/refactor/legacy-feature-gap-matrix.md`
- `docs/refactor/supabase-frontend-access-strategy.md`
- `docs/refactor/taro-frontend-integration.md`
- `docs/refactor/multitenant-auth-security-contract.md`
- `docs/refactor/next-development-todo.md`
- `docs/refactor/blueprint-coverage.md`
- `docs/refactor/api-structure.md`
## 目录结构
```text
apps/api/ Node.js 业务 API
apps/worker/ 后台异步任务CRM webhook、后续支付补偿/导入复检等
packages/config/ 共享配置
packages/db/ PostgreSQL 连接池和查询封装
packages/domain/ 领域常量和共享类型
supabase/migrations/ 数据库迁移schema、RLS、索引、触发器
supabase/seed.sql 最小租户 seed
scripts/import-pocketbase/ PocketBase schema/数据导入器和校验器
scripts/smoke-seed.js 本地集成测试 seed 数据
scripts/api-integration-test.js
docs/refactor/ 重构架构、进度、治理文档
docker-compose.api.yml API 容器化运行配置
```
旧项目参考文件在本机 `F:\project\参考\旧题库项目`,旧前端构建产物在 `F:\project\参考\旧构建产物`。这两个目录都只用于对照和迁移,不作为当前新项目源码。
## 本地开发
前置要求:
- Node.js 20+
- Docker Desktop
- Supabase CLI
启动本地 Supabase 和 API
```bash
npm install
npm run supabase:start
npm run supabase:reset
npm run db:smoke-seed
npm run dev:api
```
单次运行 CRM worker
```bash
npm --workspace @tiku-saas/worker run crm:once
```
默认本地数据库:
```text
postgresql://postgres:postgres@127.0.0.1:54322/postgres
```
默认 API 地址:
```text
http://127.0.0.1:8787
```
## 验证命令
完整后端重构检查:
```bash
npm run check:refactor
```
这个命令会依次执行:
- API TypeScript 检查
- PocketBase importer TypeScript 检查
- PocketBase 导入后校验
- 本地 smoke seed
- API 构建
- 本地 API 集成测试
常用单项命令:
```bash
npm run check:api
npm run check:worker
npm run check:importer
npm run pb:import:validate
npm run test:api
npm run test:worker:crm
```
## API 模块
当前 API 目录:
```text
apps/api/src/features/
auth/ 短信登录、迁移期 session、OAuth 占位
catalog/ 学生端目录、内容入口、分类树、题目集合、资料、商城只读接口
commerce/ 订单、支付确认、激活码、优惠券、权益
health/ 健康检查
learning/ 练习 session 组卷、答题、错题、收藏、学习进度、排行榜
platform-admin/ 平台方租户、SaaS 套餐、订阅、账单、用量
profile/ 学生个人中心
referral/ 销售/代理客资追踪、CRM 队列
referral/commission.ts
分佣设置、汇总、来源明细、结算单、审核/打款状态
scoreline/ 分数线
tenant/ 租户解析
tenant-admin/ 租户后台配置、成员权限、班级学生、活动和审计
tenant-content/ 租户内容导航、题库维护、资源管理、批量导入
video/ 题目视频讲解
```
API 身份上下文:
- 推荐:`Authorization: Bearer <supabase_access_token>`,可配合 `x-tenant-id` 提供当前租户上下文。
- 本地/迁移期:`Authorization: Bearer <tk_session>`
- 兼容旧测试:`x-user-id``x-platform-admin-key` 仅允许在 `ALLOW_LEGACY_AUTH_HEADERS=true``ALLOW_PLATFORM_ADMIN_KEY=true` 的非生产环境使用。
生产环境必须设置 `ALLOW_LEGACY_AUTH_HEADERS=false``ALLOW_PLATFORM_ADMIN_KEY=false`,前端不能再传 `x-user-id` 代表当前用户。
## 重要安全约定
- 租户公开配置不能存放密钥。
- 商户密钥、短信密钥、OAuth app secret 等必须进入 `app_private.tenant_secrets`,或后续生产 KMS/Vault。
- 资料、PDF、视频等资源必须先进入 `content_assets` 台账,再由 API 校验权限并下发签名 URL。
- 题库入口和分类使用 `content_entries/content_nodes`;题目列表和练习规则使用 `question_collections/practice_blueprints`,前端不要再把旧树字段当成唯一业务结构。
- 批量导入必须先写 `content_import_jobs/items/issues`,保留原始 payload、规范化 payload、逐行问题和审计记录。题目、单词、知识手册导入已走这套后台校验管线前端只做预检查和预览展示。
- 支付 webhook 必须先设计幂等键和验签流程,再进入生产使用。
## 最近一次验证
最近本地验证命令:
```text
npm run check:refactor
```
结果:通过。
## 下一步建议
优先继续补:
1. 真实云端 Auth/JWKS 回归、RLS 深测和生产环境配置验收。
2. Taro 前端 scaffold让 H5 和小程序共用同一套 API。
3. 对象存储上传后校验、PDF 预览、防盗链和视频水印。
4. Excel/CSV 以及分数线、视频批量导入;把现有 JSON 导入升级为可排队异步执行。
5. 微信网页/QQ 登录、退款通知/查询确认、支付对账、支付补偿、公共题库版本同步 worker、积分活动深化以及排行榜防刷/预聚合。