Files
lehuo/docs/10_TASK_STATE.md
T
admin 7e71455c6b chore(release): freeze v0.2.0
版本冻结 v0.2.0,固化 2026-09-24 本轮全部变更。

admin-web:
- 修复旧物善用管理页缺失样式类 .workspace-view / .view-header / .table-wrap,
  此前页面无内边距导致内容被侧边栏遮挡、窄屏表格无横向滚动
- 修复服务统计页缺失样式类 .dashboard-grid / .dashboard-card / .stat-row,
  此前 8 个指标卡退化为裸文本堆叠
- 补齐未定义的 --shadow-card 变量(财务编辑面板阴影此前失效)
- 侧边栏 13 项导航由手写重复改为 NAV_ITEMS 数据驱动,并按业务顺序重排
- AdminIcon 补齐 coins / phone / volunteer / flag / calendar / recycle 语义图标
- 侧边栏行高与间距压缩使 13 项一屏放下,滚动条隐藏
- 小于等于 760px 断点导航由 display:none 改为横向滚动,移动端恢复可切换

api:
- prisma.config.ts 显式加载仓库根 .env,修复 prisma generate / migrate 取不到 DATABASE_URL
- dev / bootstrap:admin / test:integration 增加 tsx --env-file-if-exists=../../.env

miniprogram:
- custom-tab-bar 选中态与申请表单分步流程抽为可测纯函数并补充单测
- 页面完整性门禁脚本增强

工程:
- 版本统一升位 0.1.0 到 0.2.0(根与 4 个 workspace 包)
- .gitignore 增加 .pnpm-store/、.workbuddy/、微信开发者工具私人配置
  与仓库根目录误生成的工程配置,避免本地产物与机器相关信息入库

验证:pnpm lint 通过、pnpm test:unit 19 个用例通过、miniprogram typecheck 通过、
admin-web typecheck 与 build 通过、pnpm install --frozen-lockfile 未改写 lockfile、
无头浏览器端到端登录复验通过、待提交内容密钥扫描无命中。

说明:本轮定位并排除了一起 Prisma 生成目录残缺事故——API 开发进程与并发的
prisma generate 争抢同一输出目录,Windows 文件锁导致只生成 34/56 个模型文件,
使 TS 全量类型解析失败并产生数千条 lint 报错;停止竞争进程后干净重新生成即恢复。
该生成目录已被 .gitignore 忽略,不进入版本库。
2026-09-24 19:50:07 +08:00

524 lines
53 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 10 任务状态(Codex 每次必须维护)
> 这是项目“长记忆”的核心文件之一。禁止删除历史,仅更新状态并添加记录。
## 当前阶段
2026-09-24
任务:冻结 v0.2.0 版本并推送至 GitHub(origin/main)。
完成:① 版本统一升位 `0.1.0` → `0.2.0`(根、`@lehuo/api`、`@lehuo/admin-web`、`@lehuo/miniprogram`、`@lehuo/contracts` 五个 package.json),并打附注标签 `v0.2.0`;② `.gitignore` 增加 `.pnpm-store/`、`.workbuddy/`、仓库根目录的 `project.config.json` / `project.private.config.json`(微信开发者工具在仓库根误生成的本地产物)与 `apps/miniprogram/project.private.config.json`(含本机路径与调试开关),避免本地产物与机器相关信息入库;③ 固化本轮全部代码变更(管理后台 UI 修复与滚动条隐藏、API 开发脚本 env 加载、Prisma 配置、小程序 tab-state 与申请表单流程及配套单测与页面门禁脚本);④ 对待提交内容做密钥扫描(私钥、token、数据库连接串、管理员口令等关键词),无命中。
范围:仅版本元数据、忽略规则与既有代码变更的固化,未改动业务逻辑、API 契约、数据库 schema 或鉴权方案;`pnpm-lock.yaml` 未因版本升位改写(lockfile 内不含 workspace 包 version 字段,`pnpm install --frozen-lockfile` 判定 Already up to date)。
验证:`pnpm lint` exit 0、`pnpm test:unit` 19 个用例 exit 0、`@lehuo/miniprogram` typecheck exit 0、`@lehuo/admin-web` typecheck 与 build exit 0、无头浏览器端到端登录复验通过。
事故与排除:冻结前门禁出现 `pnpm lint` 4386 条报错(`Unsafe call of a type that could not be resolved`)。根因不是代码缺陷,而是 `apps/api/src/generated/prisma` 生成目录残缺——API 开发进程(`tsx watch`)与并发执行的 `prisma generate`(由 typecheck 脚本链式触发)争抢同一输出目录,Windows 文件锁使生成在 34/56 个模型文件处中断,`models/User.ts` 等缺失导致 TS 全量类型解析失败。停止竞争进程后删除并干净重新生成(56/56 模型齐全),lint 立即恢复 exit 0。该目录已被 `.gitignore:20` 忽略,不进入版本库。
遗留(本次冻结不等于生产发布):`docs/14_RELEASE_CHECKLIST.md` 中 UAT 全项、E2E P0、真机测试、Ubuntu 26.04 主机预检、TLS 与离站备份均未验证,仍保持未勾选,未做假绿勾选。集成测试依赖 `docker compose --profile test up -d mysql-test`,本轮未执行。`prisma generate` 与 `pnpm build` 必须在不运行 API 开发服务的前提下执行,否则必因 Windows 文件锁产生残缺生成物。
---
2026-09-24
任务:管理后台界面(apps/admin-web)视觉与可用性巡检修复。
完成:① 补齐 OldItemsView 使用的缺失样式类 `.workspace-view` / `.view-header` / `.table-wrap`——此前三者在 styles.css 中零定义,页面无内边距导致内容被 240px 侧边栏遮挡(标题被裁掉一半),表格在窄屏无横向滚动;② 补齐 StatisticsView 使用的缺失样式类 `.dashboard-grid` / `.dashboard-card` / `.stat-row`——此前 8 个统计指标卡退化为裸文本堆叠;③ 在 `:root` 补定义 `--shadow-card`(此前财务编辑面板引用了未定义变量,阴影失效);④ 侧边栏 13 项导航由手写重复改为 `NAV_ITEMS` 数据驱动渲染,并按业务逻辑重排(工作概览 → 服务申请 → 服务工单 → 回访工作台 → 服务对象 → 志愿者审核 → 公益项目 → 活动与报名 → 内容发布 → 财务公开 → 通知投递 → 服务统计 → 旧物善用管理,旧物管理不再插队第一);⑤ AdminIcon 补充 coins/phone/volunteer/flag/calendar/recycle 图标,消除 4 个无图标项与 3 项共用 content 图标的语义错误,13 项图标齐全、文字左缘对齐;⑥ 侧边栏 nav 行高 48→42、gap 6→4 并允许 flex 收缩 + 细滚动条,phase-note 设 flex-shrink:0,消除 100vh 内溢出与末项被遮挡;⑦ ≤760px 断点下导航不再 `display:none`(此前移动端完全无法切换页面),改为横向滚动条,nav-item 设 white-space:nowrap、激活态改为底部指示条。
范围:仅前端样式与 App.vue 导航渲染方式,未改动任何视图的业务逻辑、API 调用、权限判断、路由结构或登录流程;StatisticsView 显式分支化(原为 v-else 兜底),行为等价。
验证:无头 Edge + CDP 对 13 个页面逐一真实点击截图取证(1440×900 与 720×900 两档),对比修复前后:统计页指标卡由裸文本变为 4×2 卡片网格、旧物页标题完整可见、移动端 navVisibleCount 由 0 恢复为 13、`--shadow-card` 由 undefined 变为已定义;`consoleErrors` 与 `networkFailures` 全程为空。`pnpm lint` exit 0、`pnpm --filter @lehuo/admin-web typecheck` exit 0、`pnpm test:unit` 13 用例 exit 0、`pnpm --filter @lehuo/admin-web build` exit 0。完整 `pnpm typecheck` 中 apps/api 的失败为运行中的 API 进程锁定 `src/generated/prisma/models`(Windows EPERM,既有约束,与本次前端改动无关)。
---
2026-09-24
任务:将本机工具链升级到 Node 24 与 pnpm 11,使仓库声明的 `engines` 与质量门禁命令真正可用。
完成:安装 Node 24.21.0 LTS 到 `C:\Users\13070\.workbuddy\binaries\node\versions\24.21.0`(与既有 Node 22 并存,未覆盖 hermes 与 WorkBuddy 托管运行时),在该目录内安装 pnpm 11.13.1(与仓库 `packageManager: pnpm@11.13.1` 一致),并把该目录前置到用户级 PATH,使新开终端 `node` 为 v24.21.0、`pnpm` 为 11.13.1。修复 `apps/api/prisma.config.ts`:Prisma CLI 工作目录为 `apps/api`,根目录 `.env` 不在 dotenv 默认查找路径内,改为显式加载 `../../.env`,使 `prisma generate` / `migrate` 与 API 运行时读取同一份配置。为 `apps/api` 的 `dev`、`bootstrap:admin`、`test:integration` 增加 `tsx --env-file-if-exists=../../.env`,消除「文档第 6/7 步在干净终端必然失败」的缺陷。
范围:只改本地工具链与开发脚本的环境加载方式,未改动技术栈、运行时依赖版本、数据库 schema、API 契约、权限或业务状态机;`pnpm-lock.yaml` 未被改写(`pnpm install --frozen-lockfile` 直接判定 Already up to date)。
验证:在 `Node v24.21.0 + pnpm 11.13.1` 下,`pnpm install --frozen-lockfile`、`pnpm lint`、`pnpm typecheck`、`pnpm test:unit`(19 个用例)、`pnpm build` 全部退出码 0;`prisma generate` 日志确认 `injected env (43) from ..\..\.env`。停止旧开发进程后 `pnpm build` 不再受文件锁干扰。以新工具链重启 API 后 `GET /health` 返回 200 且监听进程为 Node 24.21.0;无头浏览器真实登录复验通过(`POST /api/v1/admin/auth/login` 201、进入后台布局、13 个导航项、`consoleErrors` 与 `networkFailures` 均为空)。
遗留:`pnpm build` 与 `prisma generate` 在开发服务器运行时必然因 Windows 文件锁(`EPERM: rmdir src/generated/prisma/models`)失败,属既有运行约束,需先停止 API 再执行,未通过改脚本规避。集成测试仍依赖 `docker compose --profile test up -d mysql-test`(该容器当前为 Exited),本轮未执行。本机 `pnpm` 旧版本 9.15.9 仍位于 WorkBuddy 托管目录,仅在新会话 PATH 中被 Node 24 目录覆盖,未删除。生产仍被 staging、UAT、真实域名与微信配置阻断,工具链升级不等于可发布。
---
2026-09-24
任务:修复管理后台登录页「管理后台尚未配置服务地址」并完成首次管理员初始化。
根因:`apps/admin-web` 只有 `.env.example`,缺少 `.env.local`,`VITE_API_BASE_URL` 未定义,`src/api/api-client.ts` 与 `StatisticsView.vue` 读取该变量时直接抛出配置类错误;同时业务库 `lehuo` 中 `admin_credentials` 与 `users` 均为 0 行,说明首次管理员从未引导,任何账号密码都无法登录。
完成:新建 `apps/admin-web/.env.local`(`VITE_API_BASE_URL=http://localhost:3000`,与根 `.env` 的 `ADMIN_WEB_ORIGIN=http://localhost:5173` 配套,已被 `.gitignore` 的 `.env.*` 规则忽略)。以显式环境变量执行 `bootstrap:admin`,创建 `SUPER_ADMIN` 管理员(本地开发专用凭据,不入库文档、不提交仓库;生产仍须使用 `infra/ubuntu/scripts/bootstrap-admin.sh` 交互式隐藏输入)。
范围:仅补齐本地开发的环境配置与首次管理员数据,未修改技术栈、认证方案、数据库 schema、API 契约、权限或业务状态机;未用测试值冒充生产配置。
验证:Vite 自动加载新 env 后,`GET /src/api/api-client.ts` 的转换结果包含 `"VITE_API_BASE_URL": "http://localhost:3000"`。无头浏览器真实登录通过:登录卡片消失、进入 `.admin-layout`、13 个导航项、顶栏显示已安全登录,`consoleErrors` 与 `networkFailures` 均为空,`POST /api/v1/admin/auth/login` 返回 201 且 `GET /api/v1/admin/statistics/overview` 返回 200,证明 HttpOnly Cookie 会话在浏览器端真实生效。概览指标为 0 属业务库为空,非缺陷。数据库复核:`admin_credentials` 1 行、角色 `SUPER_ADMIN`、状态 `ACTIVE`。
遗留:本次未修复三处环境缺口,另行报告。①`tsx` 不会自动加载根 `.env`(已实测),而根 README 第 6/7 步直接写 `pnpm --filter @lehuo/api bootstrap:admin` 与 `dev`,实际必须显式注入环境变量或改用 `--env-file-if-exists`;②本机 PATH 上 `pnpm` 为 9.15.9、Node 为 v22.23.2,与仓库 `engines`(`pnpm >=11 <12`、`node >=24 <25`)不符,`pnpm <script>` 直接报 `ERR_PNPM_UNSUPPORTED_ENGINE`;③Vite 实际仅监听 `::1:5173`,浏览器须用 `http://localhost:5173`,用 `127.0.0.1` 既不监听也会因 Origin 不匹配被 `AdminOriginGuard` 拒绝。
---
2026-09-24
任务:启动本地完整程序,进入微信小程序验收测试。
完成:启动并确认 MySQL、Redis、MinIO 均为 healthy,确认 12 个 migration 无待部署项;以后台开发进程启动 API 与管理端,并启动已安装的微信开发者工具。管理端已在 Codex 浏览器面板排队打开。
验证:API `http://localhost:3000/health`、Swagger `http://localhost:3000/api/docs` 和管理端 `http://localhost:5173/` 均返回 HTTP 200。本轮仅执行环境启动,代码沿用上一任务已通过的全仓 Lint、类型检查、33 个单元测试、生产构建与 38 个集成测试结果。
遗留:微信开发者工具的 CLI 服务端口处于关闭状态,已直接启动工具且未修改安全设置;如工具未自动恢复项目,需要从最近项目打开或导入 `E:\develop\lehuo\apps\miniprogram` 后清缓存重新编译。
---
2026-09-24
任务:清理服务页与帮扶申请表单之间重复的服务类型选择页,并重排申请步骤编号。
完成:服务页六个服务类型按钮继续携带已选类型进入申请表单,表单识别预选类型后跳过原“选择服务”步骤和类型接口等待,直接显示原第 2 步“申请关系”。正式申请流程由 5 步调整为 4 步:申请关系、联系方式、描述需求、确认提交,进度条比例同步调整。对于“我需要帮助”“帮家人申请”等未预选类型入口,保留不计入步骤的服务类型选择页,选择后进入正式第 1 步,避免丢失服务类型必填信息。
验证:新增流程回归测试先因实现缺失失败,修复后小程序 8 个单元测试通过;全仓 Lint、类型检查、33 个单元测试和生产构建全部通过;小程序 28 个页面完整性与运行时依赖门禁通过;专用 MySQL 上的 38 个真实集成测试通过。
遗留:需在微信开发者工具清缓存后,分别验证服务类型按钮直达第 1 步,以及“我需要帮助/帮家人申请”先选类型再进入第 1 步的两条入口。
---
2026-09-24
任务:统一修复小程序自定义底部导航选中态及首页、个人中心微信登录失败。
完成:确认登录 502 的根因是微信开发者工具项目 AppID 与 API AppID 不一致;微信官方 `jscode2session` 使用后台凭据和无效测试 code 返回 40029,证明凭据有效且问题来自 code 所属 AppID。将根目录和小程序目录的本地项目配置统一到后台 AppID。自定义底部导航新增独立路由选中计算,在组件 attached、页面 show 和点击切换三个时点同步 selected,解决 Tab 实例恢复后图标不变色。
验证:修复前两个项目配置均与 API AppID 不匹配,修复后均匹配;导航路由回归测试先因实现缺失失败,修复后小程序 5 个单元测试通过。全仓 Lint、类型检查、28 个单元测试、生产构建以及专用 MySQL 上的 38 个真实集成测试全部通过;小程序 28 个页面完整性和运行时依赖门禁通过。真实登录仍需微信开发者工具重载项目配置后使用新的实时 code 验证。
遗留:微信开发者工具需关闭当前项目后重新打开 `apps/miniprogram`,清除缓存并重新编译,确保新 AppID 生效;此前旧 AppID 生成的 code 不能复用。
---
2026-09-24
任务:部署本地开发依赖与 API,修复微信开发者工具请求 `localhost:3000` 被拒绝。
完成:定位 Docker Desktop 实际安装目录并使用其 Docker 29.8.0 / Compose 5.5.1 CLI;生成 Git 忽略的本地 `.env` 和随机开发密钥,启动 MySQL 8.4、Redis 7.4、MinIO,执行全部 12 个 migration,在 MinIO 创建私有 `lehuo-private` bucket,并以隐藏后台进程启动 API。未将本地密钥、密码或运行日志提交到仓库。
验证:MySQL、Redis、MinIO 容器均为 healthy;`GET /health` 返回 200,公开项目、公开活动和服务分类接口均返回 200,原 `ERR_CONNECTION_REFUSED` 根因已消除。配置本地微信 AppID/AppSecret 并重启 API 后,使用无效测试 code 请求登录接口返回 502 而非“未配置”的 503,确认请求已进入微信 code 换取阶段。
遗留:仍需由微信开发者工具使用实时 `wx.login` code 完成端到端登录验证。API 当前为本地隐藏开发进程,不是生产服务。
---
2026-09-24
任务:修复微信开发者工具编译“我的协作任务”页面时的 `wx:else` 错误。
完成:将协作任务列表的条件分支改为外层 `wx:else` block 包裹内部 `wx:for` 按钮,避免条件指令与循环指令位于同一节点导致 WXML 编译器无法关联前序 `wx:if/wx:elif`。同步扩展小程序页面完整性检查,遇到 `wx:elif/wx:else` 与 `wx:for` 共用节点时提前失败并给出修复提示。
验证:新增门禁在修复前稳定报出 `pages/assigned-cases/assigned-cases.wxml` 的指令冲突,修复后 28 个小程序页面完整性检查通过;本次修改文件的 Prettier 检查、全仓 Lint、类型检查、28 个单元测试和生产构建通过。全仓 Prettier 检查仍被仓库现有 331 个文件的格式/行尾差异阻断;集成测试启动后因本机 `127.0.0.1:3307` 的 `lehuo_test` MySQL schema engine 不可用而未进入用例执行。
遗留:仍需在微信开发者工具清除缓存后重新编译,并人工确认协作任务的加载、失败、空状态和列表状态切换。
---
2026-08-15
任务:将 Ubuntu 26.04 部署版本重新同步到 GitHub 仓库。
完成:核对 `origin` 为 `https://github.com/g1307092382/wechatapp.git`,通过本机现有代理只对本次 Git 命令建立连接;远端 `main` 无领先提交后,将完整 Ubuntu 部署版本提交 `65eac89` 推送到 `origin/main`。未改写远端历史,未使用强制推送,也未把本机代理写入仓库或全局 Git 配置。
验证:推送结果为 `0a91caf..65eac89 main -> main`;部署提交前的格式、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试、生产构建、镜像构建、Compose、Bash、Nginx 和依赖审计结果保持通过。
遗留:GitHub 同步不等于生产发布;真实域名、TLS、微信参数、服务器预检、staging、恢复演练、UAT 和发布审批仍未完成。
---
2026-08-15
任务:生成 Ubuntu 26.04 LTS 云服务器部署版本。
完成:新增独立 `infra/ubuntu` 生产部署包,采用 Nginx/管理后台、API、MySQL 8.4、Redis 7.4、私有 MinIO 的单机 Docker Compose 基线,仅发布 80/443。提供 Ubuntu 26.04 Docker 官方仓库安装、生产环境文件生成与 600 权限保护、TLS/域名/磁盘/Compose 预检、不可变镜像构建、数据服务初始化、migration、首次管理员初始化、HTTPS/readiness 冒烟、应用镜像回滚、MySQL 校验和备份、受控恢复和 systemd 每日备份定时器。API 生产镜像包含 Prisma migration 与管理员初始化产物且运行时不依赖 Corepack 下载;管理后台使用独立生产镜像和 Nginx HTTPS 网关。同步补充根目录、国内部署、发布清单与生产就绪文档,新增 D-024。
范围:未改变业务架构、认证、数据库 schema、API 契约、权限、状态机或 V1.0 产品范围;没有把单机基线扩展为 Kubernetes、微服务或多租户。部署包是可复现交付,不代表真实生产发布条件已经满足。
验证:全仓格式检查、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试和生产构建全部通过;测试库 12 个 migration 无待执行项,小程序 28 个页面完整性与运行时依赖门禁通过。Ubuntu Compose 配置、全部 Bash 脚本语法、22 个控制器权限扫描和 npm 官方 High 级依赖审计通过;MySQL、Redis、MinIO、MinIO Client 的固定镜像标签均可拉取;API 与管理后台生产镜像构建通过,最终镜像内 Prisma 7.9.1 可直接执行,管理端静态资源完整且双域名 HTTPS Nginx 配置通过真实 `nginx -t`。
遗留:部署前仍需用户提供两个已备案合法 HTTPS 域名及 TLS 证书、微信 AppID/AppSecret 与合法域名配置,并在真实服务器确认防火墙、安全组、DNS、告警接收方和异地加密备份目标;随后执行 staging、恢复演练、UAT 和生产发布审批。当前未使用示例域名或测试密钥冒充生产配置。
---
2026-08-15
任务:发布前安全与环境配置加固并重新同步仓库。
完成:在既有未提交安全改动基础上完成复核和修正。审计增加原始会话 token 防御性剥离;后台写请求使用精确 Origin 或无 Origin 时的完整 Referer origin 校验,不允许前缀或通配来源;管理 Cookie 仅在 Secure 模式附加 Partitioned,避免本地 HTTP 丢失登录态;私有上传签名由 600 秒缩短到 120 秒;台账导出审计补充关键词条件;数据库启动只记录已完成 migration 数量与最新名称,不把运行时日志冒充待部署校验。小程序开发版保留 localhost 回环调试,体验版/正式版拒绝回环、`0.0.0.0` 和非 HTTPS API,防止不安全发布配置。
范围:未修改业务状态机、权限授予、数据库 schema、API 契约或 migration;仅收紧安全边界、审计元数据和环境保护。真实合法 HTTPS 域名仍由用户后期提供,当前未用测试地址冒充生产配置。
验证:全仓格式检查、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试和生产构建全部通过;测试库 12 个 migration 无待执行项,小程序 28 个页面完整性门禁与运行时 workspace 导入门禁通过。
遗留:仍需在真实 HTTPS 域名和微信体验版/正式版环境验证 API 地址保护、Secure Cookie、反向代理 Origin/Referer 透传及 120 秒上传窗口;staging、UAT 和 production deployment 保持未完成。
---
2026-08-15
任务:小程序首页主功能区与便捷入口调整。
完成:在首页“帮扶服务”下方将次级功能区调整为 3×2 六宫格,保留志愿服务、公益项目、公益动态和旧物善用,新增财务公开与服务进度;财务公开连接既有公开文档列表,服务进度连接本人帮扶服务列表。服务进度从便捷入口上移以避免重复,便捷入口取消旧物善用,当前仅保留公益活动及按权限显示的协作任务。未删除旧物善用模块或其首页主功能入口。
范围:仅调整小程序首页入口信息架构、WXML/WXSS 与既有页面导航;未新增空白占位页面、API、数据库、权限、状态机或 migration。财务公开、服务进度和旧物善用继续沿用既有真实业务与访问控制。
验证:全仓格式检查、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试和生产构建全部通过;测试库 12 个 migration 无待执行项。小程序页面完整性门禁通过 28 个页面,运行时 workspace 导入门禁通过。新增 D-023。
遗留:需要用户在微信开发者工具清缓存重新编译,并真机确认 3×2 六宫格在常见屏幕宽度下的间距、文字与点击效果。真实微信、HTTPS 域名和生产环境联调仍按生产就绪计划后期提供。
---
2026-08-15
任务:小程序首页栏目收敛与“帮扶服务”公众端改名。
完成:首页移除关爱老人、困境儿童、妇女帮扶和残障救助四个重复分类按钮,将栏目重排为一个带说明的高权重“帮扶服务”主入口与志愿服务、公益项目、公益动态、旧物善用四个次级入口;首页 Hero、帮扶表单、提交成功、我的帮扶服务、详情、服务聚合页和个人中心公众文案完成统一。服务聚合页分类代码修正为六个共享契约真实值,避免妇女、儿童和生活困难入口无法预选。为困境妇女、儿童关爱、生活困难和其他服务分别生成并压缩四张 900×675 本地 JPG 场景图,申请选择页按六个分类逐一显示图片,不再出现文字占位图。
范围:仅调整小程序公众信息架构、文案、样式和本地视觉素材。内部 `ServiceApplication` API、数据库、状态机、权限和管理端业务名称保持不变;AI 生成人物和场景仅作分类识别,不作为真实服务对象、服务过程或公益成果证据。未新增接口、migration 或业务范围。
验证:全仓格式检查、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试和生产构建全部通过;测试库 12 个 migration 无待执行项。小程序页面完整性门禁通过 28 个页面,运行时 workspace 导入门禁通过;四张新增图片均压缩至约 61–74 kB。新增 D-022。
遗留:需要用户在微信开发者工具清缓存重新编译,并真机确认首页新栏目在常见屏幕宽度下的视觉层级、四张分类图裁切和公众文案。真实微信、HTTPS 域名和生产环境联调仍按生产就绪计划后期提供。
---
2026-08-15
任务:旧物善用独立模块 Phase 3 电子荣誉证书与公益荣誉积分。
完成:新增不可变证书/积分规则版本、电子证书快照、积分账户和只追加积分流水;捐赠直接完成或关联台账落地时,在同一事务自动生成证书、按品类和单笔上限计分并写审计。默认每件 1 分、单笔最多 500 分。管理端新增规则激活与证书预览、完成捐赠补发、证书历史/撤销、积分账户和有理由人工校正;规则变更不改历史证书,补发撤销但保留旧证书,校正使用 revision 且不允许负余额。小程序新增证书与荣誉积分总览、只追加流水和本人证书详情,并从模块主页与捐赠详情接入。
范围:积分仅为公益荣誉记录,不具有现金价值,不支持兑换、购买、转让、提现、到期或排行;证书不是捐赠收据、税务凭证或财产权利证明。不新增现金捐赠、支付、自动扣款或第三方物流。既有已完成捐赠不自动批量回填,避免未经核实改写历史;授权人员可依据真实完成记录补发证书,积分补录只能通过有理由审计流水。
验证:Phase 3 migration 已部署到专用 `lehuo_test`,共 12 个 migration,重复 deploy 无待执行项;全仓格式检查、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试和生产构建全部通过。新增集成覆盖规则激活幂等、品类计分和单笔上限、完成时自动发证计分、本人资源隔离、他人证书读取拒绝、积分校正幂等、负余额拒绝、证书补发/撤销和审计;小程序页面完整性门禁通过 28 个页面,运行时 workspace 导入门禁通过。npm 官方 Low 级别依赖审计无已知漏洞。新增 D-021。
遗留:仍需在微信开发者工具和真机验收证书排版、长文本及不同屏幕尺寸;正式证书法律文案、机构签章/品牌素材如需替换,后续通过新规则版本发布。真实微信 AppID/AppSecret、合法 HTTPS 域名、生产对象存储和真实环境联调仍按生产就绪计划后期提供。
---
2026-08-15
任务:旧物善用独立模块 Phase 2 物资全流程台账。
完成:新增独立物资导入批次、物资台账和只追加流转事件模型,完成手工入库、最多 500 行原子批量入库、在库/分拣/消毒/出库/帮扶落地严格状态机、物资需求/受助对象/帮扶区域绑定、完整详情、revision 乐观锁、幂等重放、加密备注、事务审计和需求/捐赠完成同步。管理端新增台账页、固定格式 `.xlsx` 模板下载、本地解析与强校验、Excel 导出、打印专用版式和详情推进;小程序捐赠详情新增脱敏物资溯源。新增四项独立权限,导出不含个人字段或内部备注。
范围:仅完成 D-019 已批准的 Phase 2。未实现证书、积分、现金捐赠、支付、自动扣款或第三方物流。原始 Excel 不上传或持久化;异常修正不允许覆盖历史,法务数据保留期限和正式修正流程继续列为生产人工确认项。
验证:Phase 2 migration 已部署到专用 `lehuo_test`,共 11 个 migration,最终重复 deploy 无待执行项;全仓格式检查、Lint、类型检查、28 个单元测试、38 个真实 MySQL 集成测试和生产构建全部通过。新增用例覆盖手工入库幂等、禁止跳级、完整五节点状态机、原子批量导入重放、最小化导出和审计;小程序页面完整性门禁通过 26 个页面,运行时 workspace 导入门禁通过。ExcelJS 改为按需加载,管理端首屏 JS 为 241.79 kB;npm 官方 Low 级别依赖审计最终无已知漏洞。
遗留:仍需用微信开发者工具/真机和实际机构 Excel 样本做视觉及兼容验收;真实微信、HTTPS 域名、生产对象存储和法务数据保留期限仍按生产就绪计划后期提供。Phase 3 证书积分等待下一步明确指令。
---
2026-08-15
任务:旧物善用独立模块 Phase 1 核心捐赠闭环。
完成:依据用户四项明确批准新增 D-019 与独立旧物善用域,不包含现金捐赠或任何支付。小程序首页及个人中心增加入口,完成模块主页、真实统计、物资需求、定向捐赠、最多六图、上门取件/定点投递、我的记录、详情溯源和规范指南;公益动态复用既有审核发布内容。管理端新增一级入口及订单审核、人工取件人员选择、状态处理、私有图片短期预览、需求草稿/发布/下架、投递点维护和后续阶段预留说明。后端新增三项权限、随机公开 ID/非连续公益编号、敏感字段加密、域隔离手机号 HMAC、私有对象存储、本人资源隔离、管理端敏感读取审计、创建/状态幂等、revision 乐观锁、事务状态历史和真实事实统计。
范围:本次只完成已批准的第一阶段。物资入库/分拣/消毒/出库全流程台账与 Excel 导入导出打印留到 Phase 2;证书和积分留到 Phase 3;不接第三方物流,取件由后台人工分配。未加入现金捐赠、微信/支付宝/银行卡支付或自动扣款,也未用模拟数据冒充业务事实。
验证:新增 migration 已部署到专用 `lehuo_test`,共 10 个 migration,重复 deploy 无待执行项;Lint、全仓类型检查、28 个单元测试、37 个真实 MySQL 集成测试、格式检查和全仓生产构建通过。新增旧物闭环集成测试覆盖需求发布、定向捐赠幂等、人工分配、接收、分拣、完成、需求数量更新、事实统计、不可变历史和审计。npm 官方高危依赖审计无已知漏洞。
遗留:真实微信 AppID/AppSecret、合法 HTTPS 域名、生产私有对象存储 Bucket/CORS 和微信开发者工具真机视觉/上传验收仍按既有计划后期提供。Phase 2/3 必须等待下一步指令,不得提前实施。
---
2026-08-13
任务:财务公开文档发布模块。
完成:按用户确认的简化范围新增独立财务公开模块。管理后台支持新建空白文档、导入 10MB 内 `.docx`、编辑标题/摘要/置顶/排序、基础富文本排版、小程序宽度预览、保存草稿、直接发布和归档;小程序“公益”页增加财务公开入口,完成公开列表、详情、宽表横向阅读、空状态和错误状态。新增共享契约、`financial_disclosures` 与只追加状态历史、三项独立权限、随机公开 ID、创建/状态幂等、revision 乐观锁、发布/归档事务审计,以及管理端 DOMPurify + API sanitize-html 双层富文本白名单清洗。已发布内容禁止原地覆盖编辑。
范围:这是用户明确批准的新增模块,但不改变 D-017 对支付和公开募捐的排除。首版不保存原 DOCX、不提供结构化收支字段、财务核算、复杂审批、支付、捐赠订单、银行流水同步或金额统计。Word 复杂浮动对象、页眉页脚和高级分页样式可能简化,发布前必须人工预览。
验证:格式化、Lint、全仓类型检查和 28 个单元测试通过;新增 migration 已部署到专用 `lehuo_test`,共 9 个 migration;36 个真实 MySQL 集成测试全部通过,覆盖草稿隔离、危险富文本清洗、发布可见、发布后禁止覆盖、归档隐藏、状态历史和审计;小程序页面门禁通过 20 个页面,运行时 workspace 导入门禁通过;全仓生产构建通过。新增 D-018。
遗留:仍需在微信开发者工具清缓存重新编译并进行真机财务公开列表/详情视觉验收;需用机构实际 DOCX 样本确认复杂表格和排版还原度。真实微信 AppID/AppSecret、合法 HTTPS 域名和生产环境配置仍按既有计划后期提供。
---
2026-08-13
任务:微信真机二级页面白屏修复。
根因:服务申请和协作任务详情/服务记录页面在运行时从 workspace 包 `@lehuo/contracts` 导入业务常量。现有小程序工程没有生成 `miniprogram_npm`,常规 TypeScript 检查会擦除类型导入并通过,但真机无法解析运行时 workspace 模块,导致页面脚本在 `Page()` 注册前终止并显示空白。另发现内容详情使用非小程序原生 `article` 标签、项目详情使用 `strong` 标签,以及详情页缺少路由参数时可能持续处于加载状态。
完成:将申请方式、服务分类和服务记录类型的真机运行时字典迁入小程序本地模块,继续用共享契约类型做编译约束;API 地址改为按请求动态读取,并安全兼容空存储值;服务申请在服务分类接口暂不可用时展示本地批准分类与明确连接提示,不再出现无内容页面;项目、活动和内容详情补充缺少参数的恢复状态;替换不受支持的 WXML 标签。新增页面完整性门禁和运行时 workspace 导入门禁,校验 18 个页面四件套、静态路由注册、WXML 标签和真机运行依赖,纳入小程序 typecheck/build。
范围:未新增模拟业务数据、未绕过认证/权限/审计;本地服务分类仅用于表单可见与选择,最终提交仍调用真实 API。服务对象档案和服务记录继续只对获得 `assigned_cases:read` 权限且被指派的人员展示最小必要数据。
验证:格式检查、Lint、全仓类型、27 个单元测试、34 个真实 MySQL 集成测试和全仓生产构建通过;新增页面完整性门禁通过 18 个页面,运行时 workspace 导入门禁通过。8 个 migration 在隔离 `lehuo_test` 库无待执行项。仍需用户在微信开发者工具执行“清缓存并重新编译”,再进行真机二级页面复验。
---
2026-08-13
任务:参考图小程序端与管理端视觉全量还原(延期能力仅预留)。
完成:建立 primitive→semantic→component 三层设计令牌;按参考图重建小程序品牌首页、八宫格服务入口、公告、项目图文卡、正式底部导航、图文服务申请、项目详情事实区和绿色个人中心;保留既有真实申请、项目、活动、志愿报名、协作任务、消息和内容业务流程。管理端新增深色图标侧栏、工作概览、真实 KPI、月度申请/完成趋势、服务类型分布、快捷入口和工单横向状态步骤条,并沿用既有脱敏表格、筛选、详情、权限和审计逻辑。新增四张虚构公益品牌场景素材并压缩用于本地包,不作为真实成果证据。
范围:按用户确认,爱心捐赠及支付、每月自动捐赠、捐赠记录/金额统计、物资订单、志愿者培训/证书/团队不进入当前版本,不显示入口、不建立 API/表;新增集中禁用能力清单与稳定导航/组件边界供后期开发。新增 D-017,未改变技术栈、数据库、认证、状态机或 V1 业务范围。
验证:格式检查、Lint、27 个单元测试、34 个真实 MySQL 集成测试和全仓生产构建通过;8 个 migration 在隔离 `lehuo_test` 库无待执行项。首次全仓类型检查发现管理端步骤条使用了申请状态名称而非工单状态名称,已改为 `ASSIGNED/IN_SERVICE/SERVICE_COMPLETED` 并完成最终重跑。
遗留问题:真实微信 AppID/AppSecret、合法 HTTPS 域名和微信环境联调继续按用户安排后期提供;延期能力仍需未来独立评审。视觉真机验收需微信开发者工具环境。
---
`PHASE_7_IMPLEMENTATION_COMPLETE - 外部发布验收待执行`
## 当前版本目标
`V1.0 MVP:跑通公益服务主闭环`
---
## 阶段任务
### Phase 0:工程初始化
- [x] 建立 monorepo
- [x] 建立 miniprogram
- [x] 建立 admin-web
- [x] 建立 api
- [x] 建立 shared contracts
- [x] Docker Compose 本地环境
- [x] MySQL / Redis / MinIO
- [x] ESLint / Prettier / TSConfig
- [x] CI
- [x] health check
- [x] 环境变量模板
- [x] AGENTS.md
### Phase 1:认证与权限
- [x] 微信登录
- [x] 后台登录
- [x] user
- [x] RBAC
- [x] resource policy
- [x] audit baseline
### Phase 2:服务申请
- [x] 服务分类
- [x] 本人申请
- [x] 代申请
- [x] 我的申请
- [x] 状态历史
- [x] 防重复提交
- [x] 后台申请列表/详情
### Phase 3:服务对象与工单
- [x] beneficiary 档案
- [x] 联系人/监护人
- [x] 标签
- [x] 工单
- [x] 分配工作人员
- [x] 志愿者协作
- [x] 服务记录
- [x] 附件
### Phase 4:回访闭环
- [x] 回访任务
- [x] 自动创建
- [x] 完成回访
- [x] 继续帮扶
- [x] 工作台待办
### Phase 5:公益项目/活动/志愿者
- [x] 项目 CRUD/发布
- [x] 活动
- [x] 活动报名
- [x] 志愿者申请/审核
- [x] 服务时长
### Phase 6:内容与通知
- [x] 公益动态
- [x] 机构介绍
- [x] 内容审核状态
- [x] 站内消息
- [x] 微信订阅通知 Adapter
### Phase 7:统计、安全与上线
- [x] 基础统计
- [x] 导出
- [x] 权限扫描
- [x] 安全测试
- [x] 备份恢复
- [ ] staging
- [ ] UAT
- [ ] production deployment
---
## 当前正在处理
发布前安全与环境配置加固已完成代码和自动化验证,等待同步远程仓库及后续真实环境验收。原 Phase 7 的 staging、UAT 和 production deployment 仍需真实环境、微信配置、合规材料及人工审批,保持未完成;当前不得宣称已生产上线。
---
## 最近完成记录
格式:
```text
YYYY-MM-DD
任务:
完成:
测试:
涉及 migration:
文档变化:
遗留问题:
```
2026-08-13
任务:参考已批准视觉方向重设计微信小程序公众端(不含管理端)。
完成:分析用户提供的前端参考图并按现有 V1 业务边界重构公众端信息架构;建立暖橙主色、语义色、圆角、阴影、字号和间距设计令牌,新增“首页 / 服务 / 公益 / 我的”四栏自定义底部导航;重做首页品牌区、本人/代申请双主任务、六类服务入口、服务进度和公益参与分区;新增服务、公益和个人中心三个聚合页,全部连接现有真实申请、项目、活动、志愿者、协作任务、内容和消息链路;重做项目/活动列表与详情、志愿者中心的卡片层级和适老交互。保留 loading / empty / error / permission-aware 状态,不加入参考图中的公开捐赠交易、证书、培训、团队或虚构业务统计,不修改管理端、API、数据库、认证或权限。
测试:format check、lint、全仓 typecheck、27 个 unit tests、全仓 production build 全部通过;小程序独立 typecheck、3 个 unit tests 和 build 通过。真实 MySQL 集成测试未得到新的完整通过结果:migration 重试两次均被本机 Windows Prisma Schema Engine 启动异常阻止;随后在已迁移的健康 `lehuo_test` 库直接执行时进入测试但超过 5 分钟工具时限,残留测试进程已按命令行精确结束。本任务无 schema/API/后端变更,上一阶段 34 个集成测试通过基线保持不变,但本次不把超时运行记录为通过。
文档变化:更新小程序 README、UI/UX 规范和本任务状态;未产生新的架构或产品决策,因此不新增 ADR。
遗留问题:本机未定位到微信开发者工具 CLI,且真实 AppID/AppSecret 与微信环境仍按用户计划后期提供,因此未生成开发者工具/真机截图;当前完成代码级视觉对照、类型与构建验证,真机适老化与安全区验收仍需在微信环境执行。项目/活动真实封面继续依赖现有私有对象存储配置,未使用假图片冒充生产内容。
2026-08-12
任务:Phase 7 统计、安全与上线工程。
完成:实现基于真实事实表的申请数、已受理数、已完成服务、服务人次、独立服务对象、服务分类、志愿者数、活动数和志愿服务分钟统计,日期范围最多 366 天,不支持人工覆盖;实现独立 `exports:create` 权限、无个人字段的汇总 CSV 和导出审计。新增数据库 readiness、进程 liveness、受保护的请求量/5xx/p95/内存指标;新增权限扫描、官方依赖审计和 CodeQL/密钥 CI。新增每日 MySQL 备份、SHA-256、保留期和显式目标恢复脚本;新增 Nginx TLS/HSTS/限流配置、staging/production Compose 覆盖、immutable image 预检、健康/公开内容冒烟、监控告警规则和发布/回滚手册。完成管理端统计看板。
测试:format check、lint、全仓 typecheck、27 个 unit tests、34 个真实 MySQL integration tests、全仓 production build、8 个 migration 重复 deploy、schema drift、权限扫描、npm 官方 High 级依赖审计、密钥特征扫描、基础/staging/production Compose 校验和 API Alpine 镜像构建全部通过。统计集成测试覆盖未认证拒绝、真实查询、汇总导出无手机号及导出审计。隔离测试库完成备份恢复演练:SQL SHA-256 为 `3aa51c8674fda55d3b720e93ce3e1e77781649b74e65c1c977fc6ef1af68c367`,源库和临时恢复库均为 42 张表,核验后临时恢复库已删除。
涉及 migration:`20260812170000_phase7_statistics_security` 和 `20260812173000_phase7_fk_names`;已在独立 `lehuo_test` 库部署,共 8 个 migration,无 schema drift。
文档变化:新增 D-015、D-016;更新数据模型、API/工作流、安全隐私、测试验收、生产就绪计划、发布清单、部署运行手册和本任务状态。
遗留问题:staging、UAT 和 production deployment 未执行。仍需有效微信 AppID/AppSecret、六类订阅模板、合法 HTTPS 域名/证书、微信隐私声明与真机授权;生产 MySQL/Redis/私有对象存储、镜像仓库、告警接收人、异地备份目标;隐私政策/用户协议/数据保留确认、UAT 测试人员、发布窗口和审批人。上述外部项未以本地或测试值冒充完成。
2026-08-12
任务:Phase 6 内容与通知。
完成:新增机构介绍、公益动态、服务故事、通知公告和常见问题统一内容模型;实现 `DRAFT → PENDING_REVIEW → PUBLISHED → ARCHIVED` 严格状态机、退回草稿、revision 乐观锁、UUID 幂等键、加密审核意见、不可变状态历史和审计;所有内容审核后公开,服务故事发布强制隐私脱敏确认并拒绝危险 HTML/脚本标记。实现站内消息、未读状态、本人资源隔离、通知偏好和显式授权记录;申请提交/受理、服务完成/待回访和活动报名结果在原业务事务中可靠写入站内消息。实现微信订阅通知 Adapter、模板映射、数据库投递队列、抢占处理、指数退避、最多五次重试、死信和管理端人工重试;外部发送失败不回滚主业务,未配置真实微信参数时明确报告不可用。完成管理端内容审核与通知投递工作台,以及小程序公益资讯、机构介绍、内容详情、我的消息和通知设置页面。
测试:format check、lint、全仓 typecheck、27 个 unit tests、33 个真实 MySQL integration tests和全仓 production build 全部通过。Phase 6 集成测试覆盖草稿公开隔离、审核发布、不可变历史、服务故事隐私确认、危险内容拒绝、消息 IDOR 隔离和订阅偏好授权;Phase 1–5 全量回归通过。
涉及 migration:`apps/api/prisma/migrations/20260812140000_phase6_content_notifications/migration.sql`;已在独立 `lehuo_test` 库部署,共 6 个 migration。
文档变化:更新共享契约、环境变量模板和本任务状态;Phase 6 API/模型/安全细节随 Phase 7 结项统一同步到专题文档。
遗留问题:无 Phase 6 代码阻塞。真实微信 AppID/AppSecret、六类订阅模板、用户微信平台弹窗授权、合法 HTTPS 域名和真机联调按用户安排后期提供;Adapter 未以测试值冒充真实发送完成。
2026-08-11
任务:Phase 5 公益项目、活动与志愿者。
完成:新增志愿者资料/技能/意向/状态历史、公益项目及状态历史、活动及状态历史、活动报名及不可变事实历史、项目工单归集、项目/活动封面业务类型和 Phase 5 权限 migration;实现志愿者申请、显式同意、revision 乐观锁、审核/暂停/恢复与角色事务同步,身份字段变更自动回待审;实现项目 CRUD、负责人范围、`DRAFT → PUBLISHED → COMPLETED`、公开边界与工单归集;实现活动 CRUD、发布/关报名/进行/完成/取消状态机;实现仅认证志愿者报名、活动行锁容量校验、截止时间、数据库唯一约束和幂等重放;实现报名审核、本人取消、签到/缺席、完成后服务分钟核定及历史审计。项目/活动封面复用真实 S3 兼容 Adapter,未配置时明确不可用。完成管理端志愿者审核、项目、活动与报名工作台,以及小程序公开项目/活动、在线报名、志愿者中心和个人服务事实页面。未进入 Phase 6。
测试:format check、lint、全仓 typecheck、27 个 unit tests、30 个真实 MySQL integration tests、全仓 production build、Docker Compose 示例配置校验、migration 重复 deploy、schema drift 检查、npm 官方 High 级 dependency audit、密钥特征扫描和 API Alpine Docker 镜像构建全部通过。Phase 5 集成测试覆盖项目/活动状态机、草稿公开隔离、未认证报名拒绝、重复报名安全重放、容量边界、报名审核/签到重放、完成后服务时长、不可变历史和审计;Phase 1–4 全量回归通过。
涉及 migration:`apps/api/prisma/migrations/20260812010000_phase5_participation/migration.sql`;已在独立 `lehuo_test` 库部署,重复 deploy 无待执行 migration,无 schema drift。
文档变化:更新应用 README、数据模型、API/工作流、UI/UX、安全隐私、测试验收、生产就绪计划、ADR 和本任务状态;新增 D-014。
遗留问题:无 Phase 5 代码阻塞。真实微信 AppID/AppSecret、合法 HTTPS 域名、生产私有对象存储密钥/CORS、微信开发者工具/真机、staging/UAT 和隐私法务配置按用户安排后期提供,未用测试值冒充完成。生产仍被 Phase 6–7、监控告警、备份恢复演练和发布审批阻断;详见 `17_PRODUCTION_READINESS_PLAN.md`。
2026-08-11
任务:Phase 4 回访闭环与生产就绪差距规划。
完成:新增回访任务、状态历史、继续帮扶来源关系、案件完成幂等字段及 `follow_ups:read/manage/complete` 权限 migration;实现负责人完成服务、至少一条服务记录前置校验,以及工单完成、申请 `IN_SERVICE → SERVICE_COMPLETED → FOLLOW_UP_PENDING`、自动回访和审计的单事务提交;实现人工/重点关爱回访、负责人/全量资源范围、今日/逾期/未来 7 日/重点关爱工作台、加密回访原因与结果、幂等完成;实现 `NEED_MORE_HELP` 新的显式授权、关联 `SUBMITTED` 申请、原申请关闭、历史和审计的单事务提交,不跳过既有评估/受理流程;完成管理端工单完结表单与回访工作台。新增生产就绪差距和 Phase 4–7 路线文档,未进入 Phase 5。
测试:format check、lint、全仓 typecheck、27 个 unit tests、28 个真实 MySQL integration tests、全仓 production build、Docker Compose 示例环境配置校验、migration 重复 deploy、schema drift 检查和 npm 官方 high-level dependency audit 全部通过;Phase 4 集成测试覆盖无记录禁止完成、事务自动回访、幂等冲突、资源范围和继续帮扶独立授权/关联申请。
涉及 migration:`apps/api/prisma/migrations/20260811220000_phase4_follow_up_closure/migration.sql`;已在独立 `lehuo_test` 库部署,无待执行 migration,无 schema drift。
文档变化:新增 `17_PRODUCTION_READINESS_PLAN.md`;更新数据模型、API/工作流、安全隐私、测试验收、ADR 和本任务状态;修正 staff/beneficiary 显示名及接单幂等字段在数据模型文档中的归属错误;新增 D-013。
遗留问题:无 Phase 4 代码阻塞。生产仍被 Phase 5–7、真实微信 AppID/AppSecret 与合法 HTTPS 域名、生产数据库/Redis/私有对象存储、监控告警、隐私法务确认、staging/UAT、备份恢复演练和发布审批阻断;详见 `17_PRODUCTION_READINESS_PLAN.md`。这些外部项未用测试值冒充完成。管理端截图级浏览器验收沿用已知本机隔离限制,本阶段通过类型检查、自动化测试和 production build 验证。
2026-08-11
任务:Phase 3 服务对象与工单。
完成:新增服务对象、联系人/监护授权、标签、工单、多人指派、工单/申请状态历史、服务记录、记录修订和私有文件模型及 migration;实现 `SUBMITTED → PENDING_CONTACT → ASSESSING` 严格受理、事务化幂等接单、手机号 HMAC + 人工确认关联档案、未成年人监护授权、资源范围和志愿者最小字段策略、负责人启动服务、幂等服务记录和 revision 乐观锁;实现 S3 兼容私有对象存储 Adapter、短期上传/下载签名和对象元数据确认;完成管理端申请受理、档案、工单、指派、记录及照片 UI,以及小程序权限感知的协作任务、最小详情和记录 UI。未实现 Phase 4 的完成服务和自动回访。
测试:format check、lint、全仓 typecheck、26 个 unit tests、25 个真实 MySQL integration tests、全仓 production build、Docker Compose config、npm 官方 high-level dependency audit、密钥特征扫描、API Alpine Docker 镜像构建全部通过;Phase 3 migration 已在独立 `lehuo_test` 库部署且重复 deploy 无待执行 migration。
涉及 migration:`apps/api/prisma/migrations/20260811180000_phase3_case_management/migration.sql`。
文档变化:更新 API/工作流、数据模型、ADR、环境模板、API/管理端/小程序/Docker 运行说明和本任务状态;新增 D-012。
遗留问题:无 Phase 3 代码阻塞。真实微信 AppID/AppSecret、合法 HTTPS 域名、对象存储私有 Bucket/最小权限密钥/CORS 以及微信开发者工具与真机联调按用户安排后期提供;生产对象存储未配置时附件 API 会明确返回不可用,不以测试 Adapter 冒充生产。管理端截图级浏览器验收沿用已知本机隔离网络限制,本轮通过类型检查、自动化测试和生产构建验证。
2026-08-11
任务:Phase 2 服务申请。
完成:建立服务分类、申请方式与完整申请状态共享契约;新增 consents、service_applications、只追加状态历史和 applications:read migration;实现本人/代申请、五步表单、提交成功、我的申请与状态时间线;实现事务化同意/申请/初始历史/审计、AES-256-GCM 敏感字段加密、域隔离 HMAC 查询索引及请求指纹、数据库唯一约束与并发幂等、申请人资源归属校验、提交限流;实现后台权限筛选、分页脱敏列表和详情查看审计。未实现 Phase 3 档案、受理、状态流转、工单或分配。
测试:format check、lint、全仓 typecheck、26 个 unit tests、17 个真实 MySQL integration tests、全仓 production build、Docker Compose config、pnpm high-level dependency audit、密钥特征扫描、API Alpine Docker 镜像构建全部通过;Phase 2 migration 已在独立 `lehuo_test` 库成功部署。最终重复执行 migration 检查时 Prisma Windows schema engine 被本机策略以 EPERM 拦截,已在同一已迁移隔离库直接重跑全部集成测试并通过。应用内浏览器无法从隔离网络访问仅绑定回环地址的本地服务器;出于安全考虑未将管理接口暴露到 `0.0.0.0`,开发服务器均已停止。
涉及 migration:`apps/api/prisma/migrations/20260811100000_phase2_service_applications/migration.sql`。
文档变化:更新小程序、管理端、API 与 Docker README;更新数据模型、API/工作流、安全隐私、ADR 和本任务状态;新增 D-011。
遗留问题:无 Phase 2 代码阻塞。真实微信 AppID/AppSecret、合法 HTTPS 域名、微信开发者工具/真机联调按用户安排后期提供;管理端截图级浏览器验收受本机隔离网络限制,自动化逻辑测试和生产构建已通过。
2026-08-10
任务:Phase 1 认证与权限。
完成:建立 Prisma 7/MySQL 认证数据模型和 migration;实现统一用户、微信 code exchange Adapter、后台 Argon2id 登录、数据库 opaque session、小程序 Bearer 会话、后台 HttpOnly Cookie、会话轮换/注销/过期与停用校验、登录锁定和限流;实现 RBAC、权限 Guard、resource policy 基线、角色事务替换和最后一名超级管理员保护;实现敏感字段 AES-256-GCM/HMAC、统一响应/错误/requestId、审计基线、首次管理员安全初始化;完成管理端登录/恢复/注销 UI 和小程序登录/重试 UI;CI 增加隔离 MySQL 集成测试,并修复 js-yaml High 漏洞。
测试:format check、lint、typecheck、19 个 unit tests、9 个真实 MySQL integration tests、全仓 build、API Alpine Docker 镜像构建、Docker Compose config、pnpm high-level dependency audit、密钥特征扫描全部通过;migration 在独立 `lehuo_test` 库成功部署。应用内浏览器视觉核验因本机 Browser 运行时路径权限被环境阻止,开发服务器已停止;自动化 UI 逻辑测试和生产构建通过。
涉及 migration:`apps/api/prisma/migrations/20260810130000_phase1_auth_baseline/migration.sql`。
文档变化:更新根 README、客户端与 Docker 运行说明、数据模型、API/工作流、安全隐私、ADR 和本任务状态;新增 D-009、D-010。
遗留问题:无 Phase 1 代码阻塞。真实微信平台 exchange 仍需在具备有效 AppID/AppSecret、合法 HTTPS 域名和微信环境时做联调;本机应用内浏览器权限问题导致本轮未获得登录页截图级视觉验收。
2026-08-10
任务:Phase 0 仓库初始化与技术基线。
完成:初始化 Git main 分支与 pnpm monorepo;创建原生 TypeScript 微信小程序、Vue 3 管理后台、NestJS API、共享 contracts;建立统一 ESLint/Prettier/TypeScript/测试/构建命令;创建 MySQL 8.4.8、Redis 7.4、MinIO 本地 Compose;创建 API Dockerfile、GET /health、.env.example、根 AGENTS.md、CI 和模块说明。
测试:format check、lint、typecheck、4 个 unit tests、1 个 integration test、build、dependency audit 全部通过;Docker Compose 配置通过,MySQL/Redis/MinIO 均 healthy;本机 API 与容器化 API 的 /health 冒烟测试通过。
涉及 migration:无(Phase 0 未创建业务 schema)。
文档变化:更新 docs/10_TASK_STATE.md、docs/05_API_AND_WORKFLOW.md;新增根 README.md 与 infra/docker/README.md。
遗留问题:无 Phase 0 阻塞问题。尚未开始任何 Phase 1 认证、权限或业务功能。
---
## 已知问题
无已知本次首页入口调整代码问题。首页 3×2 六宫格、四张帮扶分类图片的缩略裁切及公众文案仍需微信开发者工具和真机做最终视觉验收;生产阻断项和人工配置见 `17_PRODUCTION_READINESS_PLAN.md`。
---
## 下一步
等待用户在微信开发者工具清缓存重新编译并真机验收首页 3×2 六宫格、财务公开与服务进度入口、便捷入口精简、帮扶服务六分类图片及相关公众文案。生产发布仍需依次执行 staging 全闭环、非开发人员 UAT、真实微信联调和 production deployment,不得跳过发布清单或审批。