2979 lines
53 KiB
Markdown
2979 lines
53 KiB
Markdown
<!-- FILE: 00_README_FIRST.md -->
|
||||
|
|
|
|||
|
|
# 乐活公益·暖心服务平台 —— 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认为更合理”而推翻已经批准的业务规则。
|
|||
|
|
|
|||
|
|
<!-- FILE: 01_PROJECT_CONSTITUTION.md -->
|
|||
|
|
|
|||
|
|
# 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 才能运行。
|
|||
|
|
|
|||
|
|
<!-- FILE: 02_PRODUCT_PRD_V1.md -->
|
|||
|
|
|
|||
|
|
# 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
|
|||
|
|
|
|||
|
|
统计以真实业务数据计算:
|
|||
|
|
|
|||
|
|
- 申请数
|
|||
|
|
- 受理数
|
|||
|
|
- 完成服务数
|
|||
|
|
- 服务人次
|
|||
|
|
- 去重服务对象数
|
|||
|
|
- 各服务类别数量
|
|||
|
|
- 志愿者数量
|
|||
|
|
- 活动数量
|
|||
|
|
- 志愿服务时长
|
|||
|
|
|
|||
|
|
不得用手工填写数字覆盖真实统计结果。
|
|||
|
|
|
|||
|
|
<!-- FILE: 03_ARCHITECTURE.md -->
|
|||
|
|
|
|||
|
|
# 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`。
|
|||
|
|
|
|||
|
|
备份成功≠可恢复,必须验证恢复。
|
|||
|
|
|
|||
|
|
<!-- FILE: 04_DATA_MODEL.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. 删除列采用“停用 → 迁移 → 验证 → 后续版本删除”。
|
|||
|
|
|
|||
|
|
<!-- FILE: 05_API_AND_WORKFLOW.md -->
|
|||
|
|
|
|||
|
|
# 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 便于排障。
|
|||
|
|
|
|||
|
|
<!-- FILE: 06_SECURITY_PRIVACY.md -->
|
|||
|
|
|
|||
|
|
# 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 安全问题不得上线。
|
|||
|
|
|
|||
|
|
<!-- FILE: 07_UI_UX.md -->
|
|||
|
|
|
|||
|
|
# 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 才出现核心操作。
|
|||
|
|
|
|||
|
|
<!-- FILE: 08_ENGINEERING_RULES.md -->
|
|||
|
|
|
|||
|
|
# 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` 已回写。
|
|||
|
|
|
|||
|
|
<!-- FILE: 09_TEST_ACCEPTANCE.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 走完整闭环;
|
|||
|
|
- 隐私政策/授权页面就绪;
|
|||
|
|
- 微信小程序审核所需材料就绪;
|
|||
|
|
- 监控和告警正常;
|
|||
|
|
- 可回滚上一版本。
|
|||
|
|
|
|||
|
|
<!-- FILE: 10_TASK_STATE.md -->
|
|||
|
|
|
|||
|
|
# 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、地图、复杂报表等后续功能。
|
|||
|
|
|
|||
|
|
<!-- FILE: 11_DECISIONS.md -->
|
|||
|
|
|
|||
|
|
# 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]
|
|||
|
|
日期:
|
|||
|
|
建议:
|
|||
|
|
原因:
|
|||
|
|
收益:
|
|||
|
|
风险:
|
|||
|
|
迁移成本:
|
|||
|
|
需要用户确认:
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
<!-- FILE: 12_CODEX_MASTER_PROMPT.md -->
|
|||
|
|
|
|||
|
|
# 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。
|
|||
|
|
|
|||
|
|
<!-- FILE: 13_DEPLOYMENT_CHINA.md -->
|
|||
|
|
|
|||
|
|
# 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 证书
|
|||
|
|
- 备案/域名要求
|
|||
|
|
- 订阅消息模板
|
|||
|
|
- 审核材料
|
|||
|
|
|
|||
|
|
微信平台规则可能变化,因此上线前必须重新查官方文档,不得只依赖本文件。
|
|||
|
|
|
|||
|
|
<!-- FILE: 14_RELEASE_CHECKLIST.md -->
|
|||
|
|
|
|||
|
|
# 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
|
|||
|
|
|
|||
|
|
- [ ] 本人申请
|
|||
|
|
- [ ] 代申请
|
|||
|
|
- [ ] 受理
|
|||
|
|
- [ ] 建档
|
|||
|
|
- [ ] 派单
|
|||
|
|
- [ ] 服务
|
|||
|
|
- [ ] 回访
|
|||
|
|
- [ ] 继续帮扶
|
|||
|
|
- [ ] 志愿者
|
|||
|
|
- [ ] 活动报名
|
|||
|
|
|
|||
|
|
<!-- FILE: AGENTS_TEMPLATE.md -->
|
|||
|
|
|
|||
|
|
# 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.
|