# 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