# 乐活公益·暖心服务平台 —— 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. 代码仓库建议结构 ```text 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 第一目标:让真实服务闭环跑通。 主链路: ```text 服务对象/代申请人提交需求 → 工作人员受理 → 需求评估 → 建立/关联服务对象档案 → 创建服务工单 → 分配工作人员/志愿者 → 执行服务 → 留痕 → 服务对象确认/反馈 → 回访 → 必要时继续跟进 ``` 任何新功能都必须回答:“是否增强这条主链路?” --- ## 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. 服务申请状态机 ```text 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 模块建议 ```text 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. 分层规则 ```text 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` 响应: ```json { "success": true, "data": {}, "requestId": "..." } ``` 错误: ```json { "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. 服务申请提交事务 伪代码: ```text 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 返回: ```json { "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。 根命令: ```bash 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` 只能放占位符。 示例: ```env 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 第一次执行时填写。 --- ## 最近完成记录 格式: ```text 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 若有会改变已批准架构的建议,只能写在这里,不得直接实施: ```text [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. 推荐生产拓扑(初期) ```text 微信小程序 │ 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.