Files
lehuo/乐活公益小程序_Codex开发总文档_V1.0.md
T
2026-08-12 14:35:12 +08:00

53 KiB
Raw Permalink Blame History

乐活公益·暖心服务平台 —— Codex 开发文档包

版本:V1.0
文档用途:作为 Codex / AI 编程智能体的长期开发上下文、项目规则和验收依据。
最高原则:任何代码实现不得偏离本目录文档。发生冲突时,按本文档规定的优先级处理。


1. 项目一句话定义

“乐活公益·暖心服务平台”不是公益宣传页,而是一套以微信小程序为公众入口、Web 管理后台为工作人员入口、以“需求申请 → 受理评估 → 建档 → 派单 → 服务 → 反馈 → 回访 → 持续关爱”为核心闭环的公益服务数字化平台。

主要服务领域:

  1. 关爱老年人、为老服务;
  2. 困境妇女慈善帮扶;
  3. 困境儿童关爱与帮扶;
  4. 残疾人爱心救助与帮扶;
  5. 其他困难群体服务;
  6. 志愿者组织、公益活动、公益资源和社会参与。

2. Codex 每次开始工作前必须执行

按顺序阅读:

  1. 00_README_FIRST.md
  2. 01_PROJECT_CONSTITUTION.md
  3. 02_PRODUCT_PRD_V1.md
  4. 03_ARCHITECTURE.md
  5. 04_DATA_MODEL.md
  6. 05_API_AND_WORKFLOW.md
  7. 06_SECURITY_PRIVACY.md
  8. 07_UI_UX.md
  9. 08_ENGINEERING_RULES.md
  10. 09_TEST_ACCEPTANCE.md
  11. 10_TASK_STATE.md
  12. 11_DECISIONS.md

如果只是小范围修复,也至少必须阅读:

  • 01_PROJECT_CONSTITUTION.md
  • 10_TASK_STATE.md
  • 与修改模块相关的文档
  • 11_DECISIONS.md

不得仅根据聊天中最近一句话修改项目。


3. 开发结束后必须回写

每完成一个任务,必须:

  1. 更新 10_TASK_STATE.md;
  2. 若产生架构/技术/业务决策,更新 11_DECISIONS.md;
  3. 若接口变化,更新 API 文档;
  4. 若表结构变化,更新数据模型与 migration;
  5. 增加或更新自动化测试;
  6. 执行 lint、typecheck、unit test、integration test、build;
  7. 输出本次变更摘要、影响范围、风险、回滚方式。

禁止“只改代码、不改文档”。


4. 冲突处理优先级

从高到低:

  1. 数据安全、隐私、法律合规;
  2. 01_PROJECT_CONSTITUTION.md 中的硬约束;
  3. 已确认的产品业务规则;
  4. 数据一致性和可审计性;
  5. API 契约;
  6. UI/UX 规范;
  7. 工程偏好;
  8. Codex 自己认为“更先进”的方案。

如果 Codex 认为有更好的方案,但会改变既有边界,必须记录到 11_DECISIONS.md 的“待确认建议”,不能擅自实施。


5. 代码仓库建议结构

lehuo-public-service/
├─ apps/
│  ├─ miniprogram/       # 微信小程序
│  ├─ admin-web/         # Web 管理后台
│  └─ api/               # 后端 API
├─ packages/
│  ├─ contracts/         # DTO / enum / schema / API 契约
│  ├─ shared/            # 无业务副作用的共享代码
│  ├─ eslint-config/
│  └─ tsconfig/
├─ infra/
│  ├─ docker/
│  ├─ nginx/
│  ├─ scripts/
│  └─ backup/
├─ docs/
│  ├─ 本文档包
│  └─ diagrams/
├─ migrations/
├─ .env.example
├─ pnpm-workspace.yaml
├─ package.json
├─ AGENTS.md
└─ README.md

6. AGENTS.md 必须包含

仓库根目录 AGENTS.md 应复制以下核心规则:

  • 先读 docs/00_README_FIRST.md 与 docs/01_PROJECT_CONSTITUTION.md。
  • 不擅自改变产品定位、技术栈、数据库类型、认证方式。
  • 不删除既有功能来“简化实现”。
  • 不通过 mock 假装功能完成。
  • 不将敏感信息写入日志。
  • 每个业务状态变化必须可审计。
  • 所有表结构变化必须 migration。
  • 所有 API 变更必须同步 contracts。
  • 完成任务必须更新 docs/10_TASK_STATE.md。
  • 任何架构决策必须更新 docs/11_DECISIONS.md。
  • 不因“AI认为更合理”而推翻已经批准的业务规则。

01 项目开发宪法(不可随意修改)

1. 产品定位硬约束

本项目必须始终是:

公益服务数字化平台,而不是宣传网站、商城、社交平台或复杂互联网平台。

V1.0 第一目标:让真实服务闭环跑通。

主链路:

服务对象/代申请人提交需求
→ 工作人员受理
→ 需求评估
→ 建立/关联服务对象档案
→ 创建服务工单
→ 分配工作人员/志愿者
→ 执行服务
→ 留痕
→ 服务对象确认/反馈
→ 回访
→ 必要时继续跟进

任何新功能都必须回答:“是否增强这条主链路?”


2. 用户体验硬约束

  1. 小程序优先服务普通群众、老人和低数字技能用户。
  2. 主要操作不得依赖复杂手势。
  3. 核心按钮大、清楚、可理解。
  4. 服务申请尽量在 3~4 个步骤内完成。
  5. 表单遵循“少填、可选、可拍、可说、可代办”。
  6. 不在前端暴露技术术语、内部状态码。
  7. 不为了视觉炫技牺牲加载速度和可理解性。
  8. 所有失败状态必须给普通人能看懂的说明与下一步动作。
  9. 适老化不是“放大字体”这么简单,必须包含点击区域、对比度、信息密度、步骤数量、错误恢复能力。
  10. 功能完成度优先于动画和装饰。

3. 技术硬约束

  1. 国内网络环境可稳定开发、构建、部署和访问。
  2. 微信小程序作为公众端。
  3. Web 管理后台作为机构工作人员端。
  4. 后端采用模块化单体优先,V1.0 禁止为了“先进”拆微服务。
  5. MySQL 为核心关系数据库。
  6. Redis 只用于缓存、限流、短期状态等可恢复数据,不作为业务事实唯一存储。
  7. 文件不保存到应用容器本地磁盘;生产环境使用对象存储。
  8. 必须 Docker 化。
  9. 环境分 dev / test / staging / prod。
  10. 配置必须环境变量化,禁止把密钥提交 Git。
  11. 所有数据库修改必须 migration。
  12. 生产部署必须有备份、恢复、日志、监控和健康检查。
  13. 对外部供应商能力必须封装 Adapter,不让业务层直接绑定云厂商 SDK。
  14. V1.0 不引入 Kubernetes。
  15. V1.0 不引入复杂事件总线,必要异步任务先使用可靠 Job/Queue 模式。

4. 安全硬约束

平台会处理老人、困境妇女、儿童、残疾人、困难家庭等敏感服务信息。

必须做到:

  • 默认最小权限;
  • 后台 RBAC;
  • 资源级权限校验;
  • 敏感字段脱敏;
  • 操作审计;
  • 不允许越权查询;
  • 不允许通过 ID 枚举他人服务记录;
  • 数据导出必须受控;
  • 文件下载必须鉴权;
  • 上传文件做类型、大小、扩展名、MIME 校验;
  • Token、手机号、身份证件、地址、儿童信息不得写入普通日志;
  • 删除业务数据优先软删除/归档,禁止随意物理删除;
  • 关键状态变更保留历史;
  • 不满 14 周岁相关信息按监护人授权与更严格权限原则处理;
  • 不把真实生产数据复制到开发环境;
  • 测试数据必须脱敏或生成。

5. 可靠性硬约束

  1. 所有写请求应支持幂等或防重复提交。
  2. 重要状态迁移必须使用数据库事务。
  3. 不允许“接口成功但数据库只写了一半”。
  4. 异步任务失败必须可重试、可查询。
  5. 外部服务失败不能拖垮主业务。
  6. 外部短信、订阅消息、对象存储失败应有降级和补偿。
  7. 服务工单状态必须经过状态机校验,不能任意改字符串。
  8. 每个关键实体保留 created_at / updated_at / created_by / updated_by。
  9. 每个关键业务操作有 audit log。
  10. 任何“已完成”都必须有可验证结果,不能只靠前端显示。

6. 易维护硬约束

  • 避免自研基础组件;
  • 避免魔法数字;
  • 枚举集中管理;
  • DTO 与数据库 Entity 分离;
  • Controller 不写复杂业务;
  • Service 不直接散落第三方 SDK;
  • Repository 层负责数据访问;
  • 公共错误码统一;
  • 日志统一;
  • 配置集中;
  • 每个模块有 README 或模块说明;
  • 复杂逻辑写测试;
  • 删除代码前检查是否有业务依赖;
  • 依赖升级必须经过测试,不追新版本。

7. V1.0 禁止范围

除非后续明确批准,V1.0 禁止:

  • 在线公开募捐核心交易系统;
  • 复杂社交/朋友圈;
  • 即时 IM 聊天系统自研;
  • AI 自动作出救助资格决定;
  • 人脸识别;
  • 未经必要性论证收集身份证完整信息;
  • 微服务/K8s;
  • 大数据平台;
  • 区块链;
  • 自研工作流引擎;
  • 复杂积分商城;
  • 过度游戏化;
  • 对外开放 API 平台;
  • 多租户 SaaS 架构。

8. AI 功能原则

AI 是效率工具,不是 V1.0 主角。

后续 AI 必须:

  • 默认建议、不自动做高风险决定;
  • AI 结果明确标记;
  • 工作人员确认后才写入正式业务记录;
  • 不把敏感数据发送到未经批准的外部模型;
  • 能关闭;
  • 业务流程不依赖 AI 才能运行。

02 V1.0 产品需求文档(PRD)

1. V1.0 目标

交付可真实投入公益服务的第一版:

  • 群众能找到服务、提交申请、看进度、给反馈;
  • 家属/社区/志愿者能代申请;
  • 工作人员能受理、建档、派单、留痕、回访;
  • 志愿者能注册、报名活动;
  • 管理员能管理项目、内容、人员、权限和统计。

2. 用户角色

2.1 PUBLIC

普通公众。浏览公益项目、活动、组织介绍、参与入口。

2.2 APPLICANT

申请人。可以是服务对象本人,也可以是代申请人。

2.3 BENEFICIARY

服务对象。老人、困境妇女、困境儿童、残疾人及其他困难群体。

2.4 VOLUNTEER

志愿者。

2.5 STAFF

公益工作人员。

2.6 PROJECT_MANAGER

公益项目负责人。

2.7 ADMIN

系统管理员。

2.8 SUPER_ADMIN

仅限极少数技术/管理人员,用于系统级配置,日常不使用。


3. 小程序信息架构

底部 Tab 建议:

  1. 首页
  2. 服务
  3. 公益
  4. 我的

首页

  • Logo/品牌语
  • 我需要帮助
  • 帮他人申请
  • 为老服务
  • 妇女帮扶
  • 儿童关爱
  • 残疾人帮扶
  • 最新公益项目
  • 最新活动
  • 我要做公益

服务

  • 服务分类
  • 服务申请
  • 我的申请
  • 服务进度
  • 我的反馈
  • 联系乐活

公益

  • 公益项目
  • 公益动态
  • 公益活动
  • 志愿者招募
  • 企业/资源合作
  • 乐活公益介绍

我的

根据身份动态显示:

  • 微信登录/绑定手机号
  • 我的资料
  • 我的服务申请
  • 我的活动
  • 志愿者资料
  • 我的志愿服务
  • 消息
  • 隐私设置
  • 联系客服

4. 服务申请

4.1 申请类型

  • OLD_AGE:老年关爱/为老服务
  • WOMEN:困境妇女
  • CHILD:困境儿童
  • DISABILITY:残疾人帮扶
  • LIFE_DIFFICULTY:生活困难
  • OTHER:其他

4.2 申请身份

  • SELF:本人申请
  • FAMILY:家属代申请
  • COMMUNITY:社区/机构代申请
  • VOLUNTEER:志愿者代申请
  • OTHER:其他

4.3 最小字段

  • 服务类别
  • 申请人与服务对象关系
  • 服务对象姓名或称呼
  • 联系方式
  • 所在区域(不默认要求精确门牌)
  • 需求描述
  • 隐私授权确认

4.4 可选字段

  • 图片/附件
  • 期望联系时间
  • 是否行动不便
  • 是否需要上门
  • 紧急程度(用户只能表达,最终等级由工作人员评估)
  • 语音描述(二期可增强)

4.5 提交

提交后:

  • 生成不可预测的业务编号;
  • 显示“已收到”;
  • 明确说明后续由工作人员联系;
  • 不承诺超出机构能力的即时救援;
  • 若用户选择明显紧急风险,应提示联系 110/120 等适当公共紧急服务,但具体文案由运营审核。

5. 服务申请状态机

SUBMITTED
  ↓
PENDING_CONTACT
  ↓
ASSESSING
  ├─→ REJECTED/OUT_OF_SCOPE
  ├─→ REFERRED
  ↓
ACCEPTED
  ↓
SERVICE_PLANNED
  ↓
IN_SERVICE
  ↓
SERVICE_COMPLETED
  ↓
FOLLOW_UP_PENDING
  ↓
CLOSED

可增加:

  • CANCELLED
  • SUSPENDED

规则:

  • 状态变化必须记录历史;
  • 不可跳过关键节点,除管理员执行带原因的纠正操作;
  • 关闭后再次产生需求,应创建新申请/跟进记录,而不是覆盖旧记录。

6. 服务对象档案

每个 Beneficiary 一人一档。

核心字段:

  • 基础身份
  • 联系信息
  • 联系人/监护人
  • 所属服务类别
  • 地址分级信息
  • 风险/关爱标签
  • 备注
  • 是否重点关爱
  • 档案状态

严禁把所有信息塞入一个 JSON 字段。

儿童、残疾、健康、家庭困难等敏感字段应按实际必要性分表/分域并控制权限。


7. 工单

服务申请被接受后创建 Service Case / Work Order。

字段:

  • 工单编号
  • beneficiary_id
  • application_id
  • project_id(可空)
  • 服务类别
  • 负责人
  • 计划日期
  • 服务地点
  • 服务说明
  • 当前状态
  • 优先级
  • 完成时间
  • 结果摘要
  • 后续计划

工单可关联多个执行人/志愿者,但只有一个责任负责人。


8. 服务记录

一次工单可有多次服务记录。

记录:

  • 服务时间
  • 服务类型
  • 服务人员
  • 服务内容
  • 服务结果
  • 图片附件
  • 服务对象确认情况
  • 后续建议
  • 创建人

服务记录创建后若修改,必须保留修订痕迹或审计日志。


9. 回访

回访任务来源:

  • 服务完成自动创建;
  • 重点关爱对象周期任务;
  • 工作人员手工创建。

回访结果:

  • SATISFIED
  • GENERALLY_SATISFIED
  • UNSATISFIED
  • NEED_MORE_HELP
  • UNREACHABLE
  • OTHER

若 NEED_MORE_HELP:

  • 必须支持一键创建后续申请/工单;
  • 不能只保存文字然后无人处理。

10. 志愿者

注册字段遵循最小必要:

  • 姓名
  • 手机
  • 所在区域
  • 可服务时间
  • 技能标签
  • 感兴趣领域
  • 紧急联系人(仅确有管理需要时)
  • 志愿者状态

状态:

  • APPLIED
  • APPROVED
  • REJECTED
  • SUSPENDED
  • INACTIVE

志愿者默认不能查看完整服务对象档案。


11. 公益活动

活动:

  • 标题
  • 封面
  • 项目
  • 时间
  • 地点
  • 招募人数
  • 报名截止时间
  • 说明
  • 状态

状态:

  • DRAFT
  • PUBLISHED
  • REGISTRATION_CLOSED
  • IN_PROGRESS
  • COMPLETED
  • CANCELLED

报名:

  • 用户
  • 志愿者身份
  • 报名时间
  • 审核状态
  • 签到状态
  • 服务时长

12. 公益项目

项目用于:

  • 展示;
  • 归集服务工单;
  • 统计服务成果;
  • 后续政府购买服务项目管理。

V1 字段:

  • 项目名称
  • 项目类别
  • 简介
  • 详细介绍
  • 封面
  • 项目周期
  • 状态
  • 是否公开
  • 负责人
  • 目标人数(可空)
  • 排序

13. 内容管理

内容类型:

  • 机构介绍
  • 公益动态
  • 服务故事
  • 通知公告
  • 常见问题

内容必须支持草稿和发布,不允许编辑即立即对外。

涉及服务对象故事:

  • 必须有内容审核流程;
  • 展示前脱敏;
  • 未授权不得公开身份性信息。

14. 消息通知

V1:

  • 站内消息
  • 微信订阅消息(按微信平台能力和用户授权使用)

事件:

  • 申请提交
  • 申请状态变化
  • 服务安排
  • 服务完成
  • 待评价/回访
  • 活动报名结果

通知失败不能回滚主交易。


15. Web 后台

一级菜单:

  • 工作台
  • 服务申请
  • 服务工单
  • 服务对象
  • 回访管理
  • 公益项目
  • 公益活动
  • 志愿者
  • 内容管理
  • 数据统计
  • 用户与权限
  • 系统设置
  • 审计日志(高权限)

工作台至少展示:

  • 新申请
  • 待联系
  • 评估中
  • 服务中
  • 待回访
  • 今日服务
  • 超期任务
  • 重点关爱提醒

16. 数据统计 V1

统计以真实业务数据计算:

  • 申请数
  • 受理数
  • 完成服务数
  • 服务人次
  • 去重服务对象数
  • 各服务类别数量
  • 志愿者数量
  • 活动数量
  • 志愿服务时长

不得用手工填写数字覆盖真实统计结果。

03 技术架构

1. 总体选择

优先采用“TypeScript 全栈 + 模块化单体 + MySQL + Redis + 对象存储 + Docker”。

推荐:

微信小程序

  • 微信小程序原生框架
  • TypeScript
  • TDesign Miniprogram(优先复用成熟组件)
  • 自建 API Client
  • 不使用重量级跨端框架作为 V1 默认方案

管理后台

  • Vue 3
  • TypeScript
  • Vite
  • Pinia
  • Vue Router
  • TDesign Vue Next 或成熟国内 UI 组件库
  • ECharts(仅统计图表需要时)

API

  • Node.js LTS
  • NestJS
  • TypeScript
  • REST API
  • Prisma 或 TypeORM 二选一;建议 Prisma,但一旦项目启动后不得混用
  • OpenAPI/Swagger
  • Zod/class-validator 统一选一种 DTO 校验体系,NestJS 默认可使用 class-validator

数据

  • MySQL 8.x
  • Redis 7.x
  • 对象存储:腾讯云 COS 为生产默认实现
  • 本地开发:MinIO 兼容 S3 API

部署

  • Docker
  • Docker Compose
  • Nginx
  • 腾讯云 CVM / 轻量云服务器可作为早期部署载体
  • 数据库生产优先托管 MySQL;预算有限时也可独立数据库容器,但必须有可靠备份
  • HTTPS
  • 国内域名和备案按实际上线要求办理

2. 为什么不做微服务

当前机构规模和 V1 业务复杂度不需要微服务。

模块化单体优点:

  • 部署简单;
  • 成本低;
  • 调试简单;
  • 事务一致性容易保证;
  • Codex 更容易保持全局一致;
  • 后续真有规模需求时可按模块拆分。

模块边界仍必须清晰。


3. API 模块建议

auth
users
profiles
beneficiaries
service-applications
service-cases
service-records
follow-ups
projects
activities
volunteers
content
files
notifications
statistics
audit
permissions
system

每模块:

  • controller
  • service
  • repository
  • dto
  • entities/model
  • policy/permission
  • tests

4. 分层规则

Controller
  ↓
Application Service
  ↓
Domain Rules / Policy
  ↓
Repository / Adapter
  ↓
Database / External Service

禁止:

  • Controller 直接访问 ORM;
  • 页面直接写 SQL;
  • 业务层直接调用 COS/微信 SDK;
  • 前端自己判断权限代替后端校验。

5. 外部 Adapter

必须封装:

  • WeChatAuthAdapter
  • WeChatSubscribeMessageAdapter
  • ObjectStorageAdapter
  • SmsAdapter(若以后使用)
  • AIAdapter(二期)
  • GeocodingAdapter(二期)

这样可更换供应商。


6. API 规范

统一前缀:

/api/v1

响应:

{
  "success": true,
  "data": {},
  "requestId": "..."
}

错误:

{
  "success": false,
  "error": {
    "code": "APPLICATION_NOT_FOUND",
    "message": "未找到该服务申请"
  },
  "requestId": "..."
}

HTTP 状态码必须正确使用,不得永远 200。


7. 认证

小程序端

  • wx.login 获取 code;
  • 后端换取微信身份;
  • 服务端创建自己的 session/token;
  • token 轮换/过期;
  • 手机号绑定按微信开放能力和实际授权流程实现;
  • openid/unionid 绝不作为前端授权依据。

后台

推荐:

  • 用户名/手机号 + 强密码;
  • 生产可增加 MFA;
  • HttpOnly Secure Cookie 优先;
  • 管理后台不把长期 Token 放 localStorage。

8. 权限

RBAC + 资源级 Policy。

示例:

  • STAFF 可以看自己负责的工单;
  • PROJECT_MANAGER 可以看自己项目范围;
  • ADMIN 可跨项目;
  • VOLUNTEER 只能查看分配给自己的最小必要任务信息;
  • 普通小程序用户只能查看自己提交或合法关联的申请。

9. 状态机

服务申请、工单、活动、志愿者审批必须采用明确状态机。

所有 transition:

  • 验证当前状态;
  • 验证目标状态;
  • 验证权限;
  • 事务写入;
  • 写 history;
  • 写 audit;
  • 事务提交后再触发通知。

10. 幂等

以下必须防重复:

  • 服务申请提交
  • 活动报名
  • 状态变更
  • 服务记录提交
  • 回访提交
  • 文件关联
  • 微信回调(若未来有)

方案:

  • clientRequestId / idempotencyKey
  • 数据库唯一索引
  • 事务
  • 必要时 Redis 短锁

11. 可观测性

必须:

  • requestId
  • structured logging
  • error tracking
  • health endpoint
  • readiness/liveness
  • 慢接口日志
  • 数据库慢查询
  • 关键任务状态

日志中禁止敏感数据。


12. 备份

至少:

  • MySQL 每日自动备份;
  • 保留 7/30 天策略可配置;
  • 对象存储版本/生命周期按预算配置;
  • 每季度至少做一次恢复演练;
  • 恢复步骤写入 infra/backup/README.md。

备份成功≠可恢复,必须验证恢复。

04 数据模型

1. 通用字段规范

核心表统一包含:

  • id: bigint/uuid(二选一后固定;建议 bigint 内部主键 + public_id 随机ID)
  • public_id: varchar,外部暴露,禁止连续可枚举
  • created_at
  • updated_at
  • created_by(后台业务表适用)
  • updated_by
  • deleted_at(需要软删除的表)

时间统一数据库 UTC 存储,展示按 Asia/Shanghai。


2. 核心实体

users

微信/后台统一用户主体,避免重复身份系统。

  • id
  • public_id
  • status
  • user_type
  • mobile(加密/脱敏策略)
  • nickname
  • avatar_url
  • last_login_at

wechat_identities

  • user_id
  • openid
  • unionid nullable
  • appid
  • created_at 唯一索引 (appid, openid)。

staff_profiles

  • user_id
  • employee_no nullable
  • display_name
  • department
  • status

roles / permissions / user_roles / role_permissions

标准 RBAC。


3. beneficiary_profiles

服务对象档案:

  • id
  • public_id
  • display_name
  • gender nullable
  • birth_year nullable
  • mobile nullable
  • region_code
  • address_detail_encrypted nullable
  • primary_category
  • key_care_flag
  • status
  • notes_encrypted nullable
  • created_by
  • timestamps

不要默认收集完整身份证。


4. beneficiary_contacts

  • beneficiary_id
  • name
  • relation
  • mobile
  • is_guardian
  • is_emergency_contact
  • consent_record_id nullable

5. beneficiary_tags / tags

标签:

  • 独居
  • 高龄
  • 行动不便
  • 定期探访
  • 困境儿童 等。

标签只能帮助服务,不应成为歧视性画像。


6. service_applications

  • id
  • public_id
  • application_no
  • applicant_user_id nullable
  • beneficiary_id nullable
  • apply_mode
  • service_category
  • description
  • region_code
  • contact_name
  • contact_mobile
  • preferred_contact_time nullable
  • urgency_self_report nullable
  • evaluated_priority nullable
  • status
  • assigned_staff_id nullable
  • source
  • submitted_at
  • accepted_at nullable
  • closed_at nullable
  • rejection_reason nullable
  • referral_note nullable
  • timestamps

索引:

  • application_no unique
  • status
  • assigned_staff_id + status
  • created_at
  • service_category + created_at

7. service_application_status_history

  • application_id
  • from_status
  • to_status
  • operator_user_id
  • reason
  • created_at

不可更新,只追加。


8. service_cases

  • id
  • public_id
  • case_no
  • application_id
  • beneficiary_id
  • project_id nullable
  • owner_staff_id
  • category
  • priority
  • status
  • planned_start_at nullable
  • planned_end_at nullable
  • service_location_encrypted nullable
  • summary
  • result_summary nullable
  • follow_up_plan nullable
  • completed_at nullable
  • timestamps

9. case_assignees

支持多人协作:

  • case_id
  • user_id
  • assignee_type STAFF/VOLUNTEER
  • role
  • assigned_at
  • removed_at nullable

10. service_records

  • id
  • public_id
  • case_id
  • beneficiary_id
  • service_start_at
  • service_end_at nullable
  • service_type
  • content
  • result
  • follow_up_suggestion nullable
  • beneficiary_confirm_status nullable
  • created_by
  • timestamps

11. follow_up_tasks

  • id
  • public_id
  • beneficiary_id
  • case_id nullable
  • owner_staff_id
  • due_at
  • follow_up_type
  • status
  • result_code nullable
  • result_note nullable
  • completed_at nullable
  • source
  • timestamps

索引:

  • owner_staff_id + status + due_at
  • beneficiary_id + due_at

12. volunteers / volunteer_skills

volunteers:

  • user_id
  • real_name
  • mobile
  • region_code
  • availability_note
  • status
  • approved_by nullable
  • approved_at nullable

skills:

  • volunteer_id
  • skill_code

13. projects

  • id
  • public_id
  • name
  • category
  • summary
  • content
  • cover_file_id
  • manager_user_id
  • start_date
  • end_date
  • target_people nullable
  • status
  • is_public
  • sort_order
  • timestamps

14. activities

  • id
  • public_id
  • project_id nullable
  • title
  • summary
  • content
  • cover_file_id
  • start_at
  • end_at
  • registration_deadline
  • location_text
  • capacity nullable
  • status
  • published_at nullable
  • timestamps

15. activity_registrations

  • activity_id
  • user_id
  • status
  • registered_at
  • checked_in_at nullable
  • service_minutes nullable

唯一 (activity_id,user_id) 防重复报名。


16. content_posts

  • id
  • public_id
  • type
  • title
  • summary
  • content
  • cover_file_id nullable
  • status DRAFT/REVIEW/PUBLISHED/ARCHIVED
  • author_user_id
  • reviewer_user_id nullable
  • published_at nullable
  • timestamps

17. files

只保存元数据:

  • id
  • public_id
  • storage_provider
  • bucket
  • object_key
  • original_filename
  • mime_type
  • size
  • sha256
  • business_type
  • uploader_user_id
  • status
  • created_at

前端不得直接拼接永久公网 URL。


18. consents

  • id
  • public_id
  • user_id nullable
  • beneficiary_id nullable
  • consent_type
  • version
  • granted_by
  • granted_at
  • revoked_at nullable
  • evidence_json(仅保存必要证明)
  • ip_hash nullable
  • created_at

19. audit_logs

只追加:

  • id
  • request_id
  • actor_user_id
  • actor_role
  • action
  • resource_type
  • resource_public_id
  • result
  • metadata_json(不得含敏感明文)
  • ip_hash
  • user_agent_summary
  • created_at

20. notifications / notification_deliveries

通知实体与发送记录分开,支持重试和追踪。


21. 数据库规则

  1. 必须使用 FK 或由 ORM/服务保证等价完整性;禁止无约束“凭感觉关联”。
  2. 唯一业务编号必须 unique。
  3. 常查字段建组合索引。
  4. 禁止对大文本字段滥建索引。
  5. 金额如未来出现用 decimal,禁止 float。
  6. 所有枚举在 contracts 中有单一事实来源。
  7. migration 不允许 destructive change 直接上线。
  8. 删除列采用“停用 → 迁移 → 验证 → 后续版本删除”。

05 API 与业务流程规范

1. API 命名

REST 为主。

示例:

  • POST /api/v1/auth/wechat/login
  • GET /api/v1/me
  • POST /api/v1/service-applications
  • GET /api/v1/service-applications/:publicId
  • POST /api/v1/admin/service-applications/:publicId/transition
  • POST /api/v1/admin/service-cases
  • POST /api/v1/admin/service-cases/:publicId/records
  • POST /api/v1/admin/follow-ups/:publicId/complete

不使用:

  • /getAllXXX
  • /doSomething2
  • /updateStatusDirectly

2. 服务申请提交事务

伪代码:

validate input
check idempotency key
resolve applicant user
create or leave beneficiary unlinked
create service_application
create initial status history
create audit log
commit
enqueue notification
return public_id + application_no

禁止在事务中等待第三方消息服务。


3. 受理

工作人员:

  1. 打开申请;
  2. 权限检查;
  3. 联系服务对象;
  4. 评估;
  5. 可关联已有档案或建立档案;
  6. ACCEPTED;
  7. 创建 service_case;
  8. 指定负责人;
  9. 创建后续任务;
  10. 通知用户。

“关联已有档案”必须防止同名误合并,至少依据手机号+人工确认等多个条件。


4. 服务执行

  • 工单 SERVICE_PLANNED → IN_SERVICE
  • 新增 service_record
  • 上传附件
  • 可多次服务
  • 完成时填写 result_summary
  • IN_SERVICE → SERVICE_COMPLETED
  • 自动生成 follow_up_task

5. 回访

完成回访时:

  • 写结果;
  • 标记任务完成;
  • 如果需要继续帮助,创建 linked application/case;
  • 记录来源关系;
  • 写 audit。

6. 文件上传

推荐流程:

  1. 客户端申请上传凭证;
  2. 后端检查业务权限和文件约束;
  3. 生成短期上传签名或后端代理上传;
  4. 上传完成后回调/确认;
  5. 后端校验 object metadata;
  6. files 表记录;
  7. 业务表关联 file_id。

安全约束:

  • 文件大小限制;
  • MIME 白名单;
  • 扩展名白名单;
  • object key 随机;
  • 禁止使用原始文件名作路径;
  • 图片需要时进行安全转码;
  • 下载使用短时签名 URL;
  • 私有 Bucket 默认。

7. 分页

统一 cursor 或 page/pageSize。V1 可使用:

  • page >= 1
  • pageSize 默认 20,最大 100

返回:

{
  "items": [],
  "page": 1,
  "pageSize": 20,
  "total": 120
}

8. 搜索

后台允许按:

  • 业务编号
  • 姓名/称呼
  • 脱敏手机号后四位(视实现)
  • 服务类别
  • 状态
  • 时间
  • 项目
  • 负责人

敏感全文搜索能力应谨慎开放。


9. 导出

任何导出:

  • 必须权限校验;
  • 记录审计;
  • 限制数据范围;
  • 大数据量异步生成;
  • 文件有过期时间;
  • 默认脱敏;
  • 导出儿童等敏感信息需要更高权限。

10. 错误码

至少:

  • AUTH_REQUIRED
  • FORBIDDEN
  • RESOURCE_NOT_FOUND
  • VALIDATION_ERROR
  • DUPLICATE_REQUEST
  • INVALID_STATE_TRANSITION
  • APPLICATION_NOT_FOUND
  • CASE_NOT_FOUND
  • VOLUNTEER_NOT_APPROVED
  • ACTIVITY_FULL
  • REGISTRATION_CLOSED
  • FILE_TYPE_NOT_ALLOWED
  • FILE_TOO_LARGE
  • RATE_LIMITED
  • INTERNAL_ERROR

用户端错误文案必须友好,日志保留 requestId 便于排障。

06 安全、隐私与合规基线

本文是工程基线,不替代正式法律意见。上线前应由运营主体根据实际收集信息、服务范围和微信平台规则完成隐私政策、用户协议和必要合规审核。

1. 数据分类

L1 公开

公益项目公开介绍、公开活动、组织联系方式。

L2 内部

普通内部运营信息、非敏感统计。

L3 敏感业务

服务申请详情、家庭困难、住址、联系方式、服务记录。

L4 高敏感

儿童个人信息、监护信息、健康/残疾相关详细信息、证件、特殊风险记录。

默认 L3/L4 不得公开。


2. 最小收集

每个字段进入系统前必须回答:

  • 为什么需要?
  • 不收集是否仍能提供服务?
  • 保存多久?
  • 谁能看?
  • 是否可脱敏?
  • 是否真的需要精确地址/证件?

没有明确目的不得新增收集项。


3. 未成年人

不满 14 周岁相关个人信息必须采用更严格保护:

  • 明确监护人角色;
  • 记录同意;
  • 限制访问人员;
  • 默认不公开案例身份;
  • 不允许志愿者看到与任务无关的信息;
  • 定期审计访问;
  • 允许合法更正、删除/撤回等请求按规则处理。

4. 加密

传输:

  • 全站 HTTPS/TLS。

存储:

  • 云盘/数据库基础加密按环境开启;
  • 极敏感字段应用层加密;
  • 密钥不与数据库同库;
  • 密钥通过云 KMS/Secret Manager 或安全环境变量管理。

密码:

  • Argon2id 或 bcrypt 强哈希;
  • 禁止 MD5/SHA1 直接存密码。

5. 手机号和地址

显示:

  • 普通列表默认脱敏,例如 138****1234;
  • 详细查看必须权限。

查询:

  • 如需精确匹配可存 HMAC/hash 辅助索引;
  • 明文/密文设计需避免为搜索而降低保护。

6. 日志

禁止记录:

  • 身份证完整号码
  • 完整手机号
  • openid
  • access token
  • session token
  • 详细住址
  • 儿童档案内容
  • 服务描述全文
  • 上传文件原文

允许:

  • public_id
  • requestId
  • action code
  • status
  • 耗时
  • 脱敏 actor 信息

7. OWASP 基线

必须防:

  • SQL injection
  • XSS
  • CSRF(后台 Cookie 认证时)
  • SSRF
  • IDOR/BOLA
  • path traversal
  • unrestricted upload
  • mass assignment
  • brute force
  • credential stuffing
  • rate abuse
  • insecure direct object reference

每个资源 API 后端都做授权,不相信前端按钮是否隐藏。


8. 限流

按场景设置:

  • 登录
  • 验证码
  • 服务申请
  • 文件上传
  • 搜索
  • 导出
  • 微信登录 exchange

不能只按 IP,必要时组合 user/device/IP。


9. 审计事件

至少审计:

  • 登录成功/失败
  • 角色权限修改
  • 查看高敏感档案
  • 新增/修改服务对象
  • 服务申请状态变化
  • 工单分配
  • 服务记录修改
  • 导出
  • 删除/归档
  • 隐私同意变化
  • 系统配置变化

10. 数据保留

不要永久保留所有数据。

必须由运营方定义:

  • 服务档案保存期限;
  • 未成年人数据期限;
  • 日志期限;
  • 导出文件期限;
  • 已取消授权后的处理;
  • 项目验收要求。

程序上把保留策略做成可配置任务,而不是散落代码。


11. 权限矩阵核心原则

Volunteer

只能:

  • 看自己被分配任务;
  • 看完成服务所需的最小信息;
  • 提交服务记录; 不能:
  • 搜索全体服务对象;
  • 导出名单;
  • 看完整历史档案。

Staff

按负责范围访问。

Project Manager

按项目访问。

Admin

跨项目业务管理,但高敏感导出仍可要求额外权限。

Super Admin

系统维护,不等于默认业务数据无限查看;高敏感读取同样审计。


12. 安全发布门禁

上线前必须:

  • npm/pnpm dependency audit
  • secret scan
  • SAST 基础扫描
  • API 权限测试
  • 越权测试
  • 文件上传测试
  • SQL 注入/XSS 测试
  • 弱密码/暴力登录测试
  • 备份恢复测试
  • staging 冒烟测试

发现 Critical/High 安全问题不得上线。

07 UI/UX 与适老化规范

1. 视觉原则

关键词:

  • 温暖
  • 可信
  • 简洁
  • 清楚
  • 不商业化
  • 不花哨

不得做:

  • 密集 Banner
  • 过多卡片
  • 首页十几个同级入口
  • 小字号说明堆叠
  • 复杂渐变和强动画
  • 倒计时/诱导点击式设计

2. 小程序首页优先级

P0:

  1. 我需要帮助
  2. 帮他人申请

P1:3. 四大服务类别 4. 我的服务进度

P2:5. 公益项目 6. 公益活动 7. 我要做公益

宣传内容不能挤压服务入口。


3. 适老规范

建议基线:

  • 正文字号尽量 >= 16px 等效视觉;
  • 主要按钮文字 >= 17px 等效视觉;
  • 主要点击区域高度约 48px 以上;
  • 按钮间距足够;
  • 一屏只做一个主要决定;
  • 错误提示紧贴字段;
  • 表单支持保存草稿(较长时);
  • 不用颜色作为唯一状态表达;
  • 图标同时配文字;
  • 返回动作清晰;
  • 网络失败可重试;
  • 提交后明确“已成功”。

具体像素可在设计系统中统一,不以本建议替代微信设备适配。


4. 表单原则

一页最多 5~7 个核心输入。 复杂申请拆步骤:

  1. 需要什么帮助
  2. 帮谁申请
  3. 联系方式与地区
  4. 需求描述
  5. 确认提交

可选信息放“补充信息”。


5. 文案

使用:

  • “我需要帮助”
  • “帮家人申请”
  • “工作人员正在联系您”
  • “还需要继续帮助”
  • “重新提交”

避免:

  • “创建工单”
  • “状态流转”
  • “Beneficiary”
  • “Record Not Found”
  • “非法参数”

6. 空状态

例如没有服务申请: “您还没有提交过服务申请。如果您或家人需要帮助,可以从这里开始。”

提供明确按钮。


7. 错误恢复

提交失败不能清空已填表单。 上传失败允许单文件重试。 网络失败保持本地草稿。 重复点击提交不应生成多个申请。


8. 管理后台

后台目标:让工作人员每天打开工作台就知道做什么。

表格:

  • 默认显示业务必要列;
  • 手机、地址默认脱敏;
  • 常用筛选固定;
  • 详情采用清晰分区;
  • 状态颜色+文字;
  • 危险操作二次确认并说明影响。

禁止为了“企业感”做过密 Dashboard。


9. 无障碍

  • 合理对比度;
  • 图片提供语义说明(可用场景);
  • 表单 label 明确;
  • 键盘操作兼容后台;
  • focus 可见;
  • 不用仅 hover 才出现核心操作。

08 工程开发规则

1. Monorepo

推荐 pnpm workspace。

根命令:

pnpm install
pnpm lint
pnpm typecheck
pnpm test
pnpm build

必须保证 CI 与本地命令一致。


2. 包管理

  • 锁定 package manager 版本;
  • 提交 lockfile;
  • 不混 npm/yarn/pnpm;
  • 国内开发可配置可靠 npm 镜像,但源码不得依赖私有个人镜像;
  • CI 应支持官方源回退。

3. TypeScript

  • strict: true
  • 禁止大面积 any
  • 禁止 @ts-ignore 掩盖错误;特殊情况写原因
  • API contracts 明确类型
  • 日期统一 ISO 8601

4. Git

分支:

  • main
  • develop(可选)
  • feature/*
  • fix/*
  • chore/*

Commit 建议 Conventional Commits。

每个 PR:

  • 变更摘要
  • 测试结果
  • 截图(UI)
  • migration 说明
  • 风险
  • 回滚方案

5. 环境变量

.env.example 只能放占位符。

示例:

APP_ENV=development
DATABASE_URL=
REDIS_URL=
WECHAT_APP_ID=
WECHAT_APP_SECRET=
COS_BUCKET=
COS_REGION=
COS_SECRET_ID=
COS_SECRET_KEY=
SESSION_SECRET=
FIELD_ENCRYPTION_KEY=

真实密钥不得入 Git。


6. 数据库 Migration

规则:

  • 每次 schema 修改一份 migration;
  • migration 可审查;
  • 生产不允许 ORM 自动 synchronize=true;
  • 大表变更考虑锁;
  • destructive migration 分阶段。

7. 代码质量

函数:

  • 单一职责;
  • 复杂度高就拆;
  • 业务规则命名表达含义;
  • 不写 1000 行 service;
  • 不复制粘贴权限逻辑。

必须有:

  • lint
  • format
  • typecheck
  • unit test
  • integration test

8. 错误处理

后端:

  • 业务错误使用统一 Domain/Application Error;
  • 未预期错误不把 stack 返回用户;
  • requestId 贯穿。

前端:

  • 业务错误直接友好提示;
  • 网络错误可重试;
  • 401 统一重新登录;
  • 403 明确无权限;
  • 5xx 提供 requestId。

9. 第三方依赖

新增依赖前:

  1. 是否真有必要?
  2. 是否长期维护?
  3. License 是否可用?
  4. 是否显著增大 bundle?
  5. 是否国内网络可获取?
  6. 能否用现有依赖实现?

避免“为了 10 行代码引入一个包”。


10. Codex 禁止行为

  • 不读文档直接重构;
  • 看到旧代码就全量重写;
  • 为通过测试删除测试;
  • 用 mock 替代真实功能后宣称完成;
  • 注释掉权限;
  • 关闭类型检查;
  • catch {} 吞错误;
  • 生产环境 hardcode;
  • 把敏感值写 fixtures;
  • 删除 migration 历史;
  • 改 API 不更新前端和 contracts;
  • 自己决定产品删减。

11. Definition of Done

一个任务只有同时满足以下条件才算完成:

  • 功能实现;
  • 正常路径测试;
  • 异常路径测试;
  • 权限测试;
  • 数据 migration 完成;
  • 文档更新;
  • lint 通过;
  • typecheck 通过;
  • test 通过;
  • build 通过;
  • 无新 High/Critical 漏洞;
  • 10_TASK_STATE.md 已回写。

09 测试与验收

1. 测试金字塔

Unit

业务规则、状态机、权限策略、计算。

Integration

API + DB,重点测试事务、唯一约束、权限和状态流转。

E2E

关键业务闭环。


2. P0 E2E 场景

E2E-001 本人申请

用户登录 → 选择老年服务 → 填写需求 → 提交 → 获得编号 → 我的申请可见。

E2E-002 防重复

用户连续点击提交两次 → 只能产生一个业务申请。

E2E-003 代申请

家属为老人申请 → 正确保存申请人与服务对象关系。

E2E-004 工作人员受理

工作人员登录 → 查看待处理 → 联系/评估 → 建档 → 受理 → 创建工单。

E2E-005 服务执行

负责人 → 开始服务 → 添加两条服务记录 → 完成 → 自动生成回访任务。

E2E-006 回访继续帮扶

回访选择“需要继续帮助” → 生成关联后续任务/申请,原历史不丢失。

E2E-007 越权

志愿者 A 访问志愿者 B 的工单 → 403。

E2E-008 用户越权

用户 A 猜测用户 B 的 public_id → 404/403,不泄露存在性。

E2E-009 活动报名

报名 → 重复报名被唯一约束阻止 → 人数达到上限后不可继续报名。

E2E-010 文件

允许图片上传;exe/php/html 等危险类型拒绝;超限拒绝;私有文件无授权无法下载。


3. 安全验收

必须测试:

  • IDOR
  • broken access control
  • mass assignment
  • SQLi
  • stored/reflected XSS
  • CSRF(后台)
  • upload bypass
  • rate limit
  • brute force
  • token expiry
  • session fixation
  • sensitive log leakage

4. 可靠性验收

模拟:

  • Redis 不可用;
  • COS 暂时失败;
  • 微信消息发送失败;
  • 数据库瞬时错误;
  • 客户端重复请求;
  • 网络超时。

要求:

  • 主业务不产生半状态;
  • 可重试;
  • 失败可追踪;
  • UI 不假成功。

5. 性能目标(V1 建议基线)

不是大型互联网项目,不盲目追极限。

建议:

  • 常规 API P95 < 500ms(不含第三方和大文件)
  • 后台列表首屏合理数据量 < 2s
  • 小程序首页优先内容快速可见
  • 100 并发常规请求下无明显错误率上升
  • 数据库常用列表避免 N+1

具体目标可根据云资源实测调整。


6. UAT 验收人员

至少模拟:

  • 65+ 老年服务对象
  • 家属代申请
  • 普通工作人员
  • 项目负责人
  • 志愿者
  • 管理员

UAT 不只让开发人员自测。


7. V1 上线门槛

必须全部满足:

  • P0 E2E 全通过;
  • 无 Critical/High 已知安全漏洞;
  • 备份成功;
  • 恢复演练通过;
  • staging 走完整闭环;
  • 隐私政策/授权页面就绪;
  • 微信小程序审核所需材料就绪;
  • 监控和告警正常;
  • 可回滚上一版本。

10 任务状态(Codex 每次必须维护)

这是项目“长记忆”的核心文件之一。禁止删除历史,仅更新状态并添加记录。

当前阶段

PHASE_0 - 仓库初始化与技术基线

当前版本目标

V1.0 MVP:跑通公益服务主闭环


阶段任务

Phase 0:工程初始化

  • 建立 monorepo
  • 建立 miniprogram
  • 建立 admin-web
  • 建立 api
  • 建立 shared contracts
  • Docker Compose 本地环境
  • MySQL / Redis / MinIO
  • ESLint / Prettier / TSConfig
  • CI
  • health check
  • 环境变量模板
  • AGENTS.md

Phase 1:认证与权限

  • 微信登录
  • 后台登录
  • user
  • RBAC
  • resource policy
  • audit baseline

Phase 2:服务申请

  • 服务分类
  • 本人申请
  • 代申请
  • 我的申请
  • 状态历史
  • 防重复提交
  • 后台申请列表/详情

Phase 3:服务对象与工单

  • beneficiary 档案
  • 联系人/监护人
  • 标签
  • 工单
  • 分配工作人员
  • 志愿者协作
  • 服务记录
  • 附件

Phase 4:回访闭环

  • 回访任务
  • 自动创建
  • 完成回访
  • 继续帮扶
  • 工作台待办

Phase 5:公益项目/活动/志愿者

  • 项目 CRUD/发布
  • 活动
  • 活动报名
  • 志愿者申请/审核
  • 服务时长

Phase 6:内容与通知

  • 公益动态
  • 机构介绍
  • 内容审核状态
  • 站内消息
  • 微信订阅通知 Adapter

Phase 7:统计、安全与上线

  • 基础统计
  • 导出
  • 权限扫描
  • 安全测试
  • 备份恢复
  • staging
  • UAT
  • production deployment

当前正在处理

暂无。Codex 第一次执行时填写。


最近完成记录

格式:

YYYY-MM-DD
任务:
完成:
测试:
涉及 migration:
文档变化:
遗留问题:

已知问题

首次开发为空。任何未解决问题必须写这里,禁止只留在聊天上下文。


下一步

从 Phase 0 依次执行。禁止跳到 AI、地图、复杂报表等后续功能。

11 架构与产品决策日志(ADR 简化版)

Codex 不得删除已批准决策。新决策追加。

D-001 产品架构

状态:ACCEPTED

决定: V1 使用“微信小程序 + Web 管理后台 + 单体 API + MySQL + Redis + 对象存储”。

原因: 低复杂度、易部署、易维护、适合当前组织规模。


D-002 后端架构

状态:ACCEPTED

决定: 模块化单体,不采用微服务。

触发重新评估条件:

  • 单体部署已形成明确性能瓶颈;
  • 团队规模显著扩大;
  • 某模块有独立扩容/安全隔离的客观需求。

D-003 主技术语言

状态:ACCEPTED

决定: 优先 TypeScript 全栈。

原因: 前后端共享类型、Codex 开发一致性高、维护人员切换成本较低。


D-004 数据库

状态:ACCEPTED

决定: MySQL 作为业务事实数据库。 Redis 不保存不可恢复的唯一业务事实。


D-005 文件

状态:ACCEPTED

决定: 生产文件进入私有对象存储,通过授权临时访问;不持久化在应用容器本地盘。


D-006 V1 范围

状态:ACCEPTED

决定: V1 首先实现服务闭环、志愿者、项目活动、内容和基础统计,不做复杂 AI、地图、公开募捐、自研 IM。


D-007 隐私

状态:ACCEPTED

决定: 个人敏感信息采取最小收集、最小权限、默认脱敏、操作审计;儿童相关信息更严格。


D-008 UI

状态:ACCEPTED

决定: 优先普通群众与适老使用,不追求炫技。


待确认建议

Codex 若有会改变已批准架构的建议,只能写在这里,不得直接实施:

[PENDING]
日期:
建议:
原因:
收益:
风险:
迁移成本:
需要用户确认:

12 可直接交给 Codex 的总指令

你现在是“乐活公益·暖心服务平台”的主开发工程师、架构维护者和测试负责人。

你的目标不是一次生成大量代码,而是在整个项目周期中持续、准确、可验证地完成系统。

一、第一原则

在写任何代码之前,必须完整阅读 docs/ 中的项目文档,特别是:

  • 00_README_FIRST.md
  • 01_PROJECT_CONSTITUTION.md
  • 10_TASK_STATE.md
  • 11_DECISIONS.md

项目文档是当前事实来源。聊天上下文只能补充,不能覆盖已批准规则,除非用户明确要求修改。

二、记忆协议

每次任务开始:

  1. 读取项目开发宪法;
  2. 读取当前任务状态;
  3. 读取决策日志;
  4. 检查 Git diff;
  5. 确定任务属于哪个 Phase;
  6. 输出本次实现范围,不扩大范围。

每次任务结束:

  1. 运行 lint;
  2. 运行 typecheck;
  3. 运行 unit tests;
  4. 运行 integration tests;
  5. 运行 build;
  6. 需要时运行 E2E;
  7. 更新 10_TASK_STATE.md;
  8. 更新 11_DECISIONS.md(如有);
  9. 更新 API/DB 文档;
  10. 汇报“完成内容 / 未完成内容 / 测试结果 / 风险 / 下一步”。

如果上下文不足: 优先从仓库文档和代码中恢复,而不是凭空假设。

三、禁止行为

你绝对不能:

  • 擅自改产品方向;
  • 删除业务需求来降低开发难度;
  • 重写整个项目只因为你更喜欢另一套技术;
  • 擅自换数据库;
  • 擅自改认证方案;
  • 跳过权限;
  • 跳过 migration;
  • 跳过测试;
  • 用 mock 冒充生产功能;
  • 写死生产密钥;
  • 把敏感信息写日志;
  • 把所有业务逻辑堆在 Controller;
  • 让前端权限判断代替后端鉴权;
  • 使用连续 ID 作为面向用户的资源标识;
  • 对服务对象数据做无授权公开;
  • 开发未批准的 AI 自动决策能力。

四、编码优先级

顺序永远是:

  1. 正确性
  2. 安全
  3. 数据一致性
  4. 用户可理解
  5. 可维护
  6. 可测试
  7. 性能
  8. 开发速度
  9. 技术“先进程度”

五、实现策略

不要一次开发所有功能。

严格按 10_TASK_STATE.md Phase 执行。

一个 Phase 的 P0 测试不通过,不进入下一个 Phase。

六、发生冲突时

如果新需求与项目宪法冲突:

  • 不静默修改;
  • 说明冲突点;
  • 在 11_DECISIONS.md 建 PENDING 项;
  • 等用户明确批准后再改变。

如果是不会改变边界的小实现细节,可自行采用最简单可靠方案,并记录重要决定。

七、安全要求

本项目处理弱势群体和未成年人相关信息。

任何时候都按:

  • 最小收集
  • 最小权限
  • 默认脱敏
  • 完整审计
  • 私有文件
  • 后端鉴权
  • 不信任客户端
  • 不信任用户输入
  • 不信任第三方回调
  • 不信任 AI 输出

执行。

八、完成标准

“页面能打开”不是完成。 “接口返回 200”不是完成。 “我写了代码但没运行测试”不是完成。

完成必须符合 08_ENGINEERING_RULES.md 的 Definition of Done 和 09_TEST_ACCEPTANCE.md。

九、第一次任务

请从 Phase 0 开始:

  1. 初始化 monorepo;
  2. 创建 apps/miniprogram;
  3. 创建 apps/admin-web;
  4. 创建 apps/api;
  5. 创建 packages/contracts;
  6. 建立本地 Docker Compose:MySQL、Redis、MinIO;
  7. 建立统一 lint/typecheck/test/build;
  8. 创建 /health;
  9. 创建 .env.example;
  10. 创建根目录 AGENTS.md;
  11. 创建 CI;
  12. 运行全部命令并修复问题;
  13. 更新 docs/10_TASK_STATE.md;
  14. 不开发业务功能,等待 Phase 1。

完成后只汇报:

  • 新增/修改文件
  • 本地启动方式
  • 测试命令和结果
  • 已知问题
  • 下一步 Phase 1 计划

不要自行开始 Phase 1。

13 国内环境部署与运维

1. 目标

  • 中国大陆访问稳定;
  • 微信小程序合法域名可配置;
  • TLS;
  • 低维护成本;
  • 可迁移;
  • 可备份;
  • 可回滚。

2. 推荐生产拓扑(初期)

微信小程序
   │ HTTPS
   ▼
Nginx / API Domain
   │
   ▼
NestJS API (Docker)
   ├── MySQL
   ├── Redis
   └── Tencent COS

管理后台
   │ HTTPS
   └────────► Nginx / API

管理后台静态资源可由 Nginx 或对象存储/CDN 托管。


3. 云厂商

优先腾讯云并非代码强绑定要求,而是微信生态和国内运维便利性考虑。

代码必须通过 Adapter 保持:

  • COS 可替换 S3 兼容存储;
  • Redis 可替换其他标准 Redis;
  • MySQL 可迁移标准 MySQL;
  • Nginx/Docker 不绑定专有 PaaS。

4. 国内依赖获取

开发机可根据实际环境配置:

  • npm 国内镜像;
  • Docker 镜像加速;
  • 操作系统软件源镜像。

但:

  • lockfile 必须提交;
  • CI 至少验证标准 registry 可构建;
  • 不依赖个人私服;
  • 不在代码写死镜像地址。

5. 环境

dev

开发者本机 Docker Compose。

test

CI 自动化测试。

staging

与生产拓扑尽量一致,使用测试小程序/测试账号。

prod

真实用户。

严禁 dev 直连 prod 数据库。


6. 发布

建议:

  1. CI build;
  2. 生成 immutable image tag;
  3. staging deploy;
  4. migration precheck;
  5. smoke test;
  6. production backup;
  7. production deploy;
  8. health check;
  9. E2E smoke;
  10. 观察;
  11. 出现严重问题回滚应用版本。

数据库 migration 必须设计可前后兼容,避免应用回滚后数据库不兼容。


7. 监控

至少:

  • API availability
  • 5xx rate
  • P95 latency
  • CPU/memory
  • disk
  • MySQL connection
  • Redis connectivity
  • job failures
  • backup failures

告警进入实际有人查看的渠道。


8. 容灾

初期无需昂贵双活,但必须:

  • 自动数据库备份;
  • 异地/云端备份;
  • IaC/部署脚本;
  • Docker 镜像可重建;
  • 文档化恢复;
  • 定期演练。

9. 微信小程序上线准备

实际申请和上线阶段需要根据微信公众平台最新规则核对:

  • 小程序主体
  • 服务类目
  • 隐私保护指引
  • 用户信息/手机号等接口使用说明
  • request/download/upload 合法域名
  • HTTPS 证书
  • 备案/域名要求
  • 订阅消息模板
  • 审核材料

微信平台规则可能变化,因此上线前必须重新查官方文档,不得只依赖本文件。

14 发布检查清单

代码

  • main branch clean
  • lockfile committed
  • lint pass
  • typecheck pass
  • unit pass
  • integration pass
  • E2E P0 pass
  • build pass

数据库

  • migration reviewed
  • backup done
  • rollback compatibility checked
  • indexes reviewed

安全

  • secrets scan
  • dependency scan
  • auth test
  • IDOR test
  • export permission test
  • file upload test
  • logs checked for PII

隐私

  • privacy policy version correct
  • consent flow correct
  • children/guardian flow checked
  • sensitive list fields masked
  • retention configuration checked

微信

  • legal domains
  • HTTPS
  • privacy declarations
  • API permissions
  • subscribe message handling
  • real device test

运维

  • health
  • monitor
  • alert
  • backup
  • restore procedure
  • rollback image available

UAT

  • 本人申请
  • 代申请
  • 受理
  • 建档
  • 派单
  • 服务
  • 回访
  • 继续帮扶
  • 志愿者
  • 活动报名

AGENTS.md

Before coding, read:

  1. docs/00_README_FIRST.md
  2. docs/01_PROJECT_CONSTITUTION.md
  3. docs/10_TASK_STATE.md
  4. docs/11_DECISIONS.md
  5. task-related docs

Rules:

  • Do not change approved product scope or architecture without explicit approval.
  • Do not bypass authorization, migrations, tests, or audit requirements.
  • Do not log sensitive beneficiary data.
  • Do not expose sequential internal IDs.
  • Update docs/10_TASK_STATE.md after every task.
  • Update docs/11_DECISIONS.md for architecture/product decisions.
  • Run lint, typecheck, tests and build before marking work complete.