Files
fquiz/memory/2026-04-18.md
T

371 lines
30 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.
## Work Log - 需求开发(ID: 304415118593097982,系统参数菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593097982`(OPEN,MEDIUM),并遵循本次任务要求:跳过构建门禁(`--skip-build-gate`),不做编译/构建与额外回归测试。
- 需求要点:将 quiz 的 `systemparam` 菜单能力迁移到 fquiz,覆盖“功能/交互/权限/状态”完整链路。
- 本次实现(最小闭环,前后端联动):
- 后端新增系统参数领域能力:
- 新增模型:`api/app/models/system_param.py``system_params` 表,含 `param_key/name/value/description/status` 与创建/更新人、时间戳)。
- 新增 Schema`api/app/schemas/system_param.py`(列表/详情/创建/更新)。
- 新增服务:`api/app/services/system_param_service.py`(列表筛选、创建、编辑、删除,含 `admin.system-params` 主题推送)。
- 新增路由:`api/app/api/v1/system_params.py`
- `GET /api/v1/admin/system-params`
- `POST /api/v1/admin/system-params`
- `GET /api/v1/admin/system-params/{param_id}`
- `PATCH /api/v1/admin/system-params/{param_id}`
- `DELETE /api/v1/admin/system-params/{param_id}`
- 路由挂载:`api/app/api/router.py`
- 模型加载:`api/app/core/database.py``api/app/models/__init__.py` 引入 `system_param`
- 权限与菜单迁移:
- `api/app/services/seed_service.py` 新增权限:`system_param.read``system_param.manage`
- 新增默认菜单:`admin.system_params`(标题“系统参数”,路径 `/admin/system-params`,权限 `system_param.read`)。
- `admin` 角色默认菜单绑定加入 `admin.system_params`
- `api/app/services/admin_service.py` 保护菜单集合加入 `admin.system_params`,防止被误删。
- `api/app/services/topic_registry.py` 新增 Topic 权限规则:`admin.system-params`
- 前端页面迁移:
- 新增页面:`web/src/app/admin/system-params/page.tsx`
- 列表:关键词筛选、状态筛选(全部/已启用/已禁用)、表格展示。
- 管理:新建/编辑/删除系统参数。
- 空态、加载态、错误提示、成功提示完整。
- 实时刷新:订阅 `admin.system-params` 主题后自动刷新。
- 后台首页入口:`web/src/app/admin/page.tsx` 新增“系统参数”卡片。
- 菜单管理保护名单:`web/src/app/admin/menus/page.tsx` 加入 `admin.system_params`
- 类型补充:`web/src/types/auth.ts` 新增系统参数类型定义。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593097982 --action full --skip-build-gate`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593097982` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED`
## Work Log - 需求开发(ID: 304415118593097985,系统日志菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593097985`(OPEN,MEDIUM),并遵循本次任务要求:跳过构建门禁(`--skip-build-gate`),不做编译/构建与额外回归测试。
- 需求要点:将 quiz 的 `syslog` 菜单能力迁移到 fquiz,覆盖“功能/交互/权限/状态”完整链路。
- 本次实现(前后端闭环):
- 后端系统日志查询接口:
- `api/app/schemas/admin.py` 新增 `AuditLogPublic``AuditLogListResponse`
- `api/app/services/admin_service.py` 新增 `list_audit_logs`(支持 `action``user_id` 过滤,按时间倒序分页)。
- `api/app/api/v1/admin.py` 新增 `GET /api/v1/admin/audit-logs`,权限要求 `menu.read | menu.manage`
- 权限与主题:
- `api/app/services/topic_registry.py` 新增 `admin.audit_logs` 主题权限规则(`menu.read/menu.manage`)。
- 菜单迁移与种子:
- `api/app/services/seed_service.py` 新增默认菜单 `admin.syslog`(标题“系统日志”,路径 `/admin/syslog`,权限 `menu.read`),并加入 admin 角色默认菜单绑定。
- `api/app/services/admin_service.py` 受保护菜单集合加入 `admin.syslog`(防误删)。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.syslog`
- 前端页面迁移:
- 新增 `web/src/app/admin/syslog/page.tsx`
- 列表分页(`limit/offset`)。
- 过滤(`action``user_id`)。
- 权限拦截、空态/加载态、错误提示。
- `web/src/types/auth.ts` 新增系统日志响应类型 `AuditLogItem``AuditLogListResponse`
- `web/src/app/admin/page.tsx` 新增“系统日志”后台入口卡片。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593097985 --action full --skip-build-gate`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593097985` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:列表查询、动作/用户筛选、分页切换、权限拦截、空态提示。
- 边界场景:无日志、筛选无结果、未授权访问、非法分页参数(由后端 Query 约束)。
- 回归点:后台菜单显示与跳转、受保护菜单不可删除、管理员角色默认可见系统日志菜单。
## Work Log - 需求开发(ID: 304415118593097973,生命倒计时菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593097973`(OPEN,MEDIUM),并遵循本次任务要求:跳过构建门禁(`--skip-build-gate`),不做编译/构建与额外回归测试。
- 需求要点:将 quiz 的 `life-countdown` 菜单能力迁移到 fquiz,覆盖“功能/交互/权限/状态”链路。
- 本次实现(前后端闭环):
- 后端领域模型与接口:
- 新增模型:`api/app/models/life_countdown.py``life_countdown_profiles`,按 `user_id` 唯一存档,包含 `death_date``today_warning_*` 缓存字段)。
- 新增 Schema`api/app/schemas/life_countdown.py``LifeCountdownProfileDto``LifeCountdownSaveDto``LifeCountdownGenerateWarningDto``LifeCountdownWarningDto`)。
- 新增服务:`api/app/services/life_countdown_service.py`
- `get_current_profile`:读取当前用户档案;
- `save_profile`:保存死亡日期(空值/早于今天拦截);
- `generate_today_warning`:按天缓存今日警示语,支持 `forceRefresh`,无可用模型时回退默认文案;
- 模型路由优先 `CAPABILITY: life-countdown.warning`,再 fallback 到 `GLOBAL: __global__`
- 新增路由:`api/app/api/v1/life_countdown.py`
- `GET /api/v1/admin/life-countdown/current`
- `POST /api/v1/admin/life-countdown/save`
- `POST /api/v1/admin/life-countdown/generate-warning`
- 权限:读取 `life_countdown.read|manage`,写入与生成 `life_countdown.manage`
- 路由挂载:`api/app/api/router.py` 挂载 `life_countdown_router`
- 模型加载:`api/app/models/__init__.py``api/app/core/database.py` 引入 `life_countdown`,确保建表时元数据可见。
- 权限与菜单接入:
- `api/app/services/seed_service.py` 新增权限:`life_countdown.read``life_countdown.manage`
- 新增默认菜单:`admin.life_countdown`(标题“生命倒计时”,路径 `/admin/life-countdown`,权限 `life_countdown.read`)。
- admin 角色默认权限/菜单绑定加入生命倒计时。
- `api/app/services/admin_service.py` 受保护菜单集合加入 `admin.life_countdown`(防误删)。
- `web/src/app/admin/menus/page.tsx` 前端菜单管理保护名单同步加入 `admin.life_countdown`
- 前端页面迁移:
- 新增页面:`web/src/app/admin/life-countdown/page.tsx`
- 死亡日期保存(date input + 保存按钮);
- 实时倒计时(年/天/时/分/秒);
- 今日警示语生成与强制刷新(缓存命中提示);
- 权限拦截、加载态、空态、错误/成功反馈。
- `web/src/app/admin/page.tsx` 新增“生命倒计时”入口卡片。
- `web/src/types/auth.ts` 新增 `LifeCountdownProfile``LifeCountdownWarning` 类型定义。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593097973 --action full --skip-build-gate`
- 轨迹:`OPEN -> IN_PROGRESS -> 30 -> 60 -> 90 -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593097973` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:死亡日期保存、倒计时实时计算、警示语生成/重刷、当日缓存复用、菜单展示与权限控制。
- 边界场景:未设置死亡日期、死亡日期早于今天、死亡日期已过、无模型路由/无有效 key 回退默认文案。
- 回归点:后台首页卡片跳转、侧栏菜单显示、菜单管理受保护不可删。
- 风险与说明:
- 本次按任务要求未执行编译/构建与额外回归测试。
- 当前仓库存在本需求外历史改动,脚本 `changedFiles` 会包含非本需求文件;本需求交付聚焦生命倒计时链路。
## Work Log - 需求开发(ID: 304415118593097988,用户管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593097988`(OPEN,MEDIUM),并遵循本次任务要求:跳过构建门禁(`--skip-build-gate`),不做编译/构建与额外回归测试。
- 需求要点:将 quiz 的 `user_mgr` 菜单能力迁移到 fquiz,覆盖“功能/交互/权限/状态”完整链路。
- 本次实现(最小增量,前后端联动):
- 前端用户管理页补齐“状态管理”操作(`web/src/app/admin/users/page.tsx`):
- 新增“启用/禁用”按钮,按当前状态自动切换;
- 调用既有后端接口 `PATCH /api/v1/users/{user_id}`,提交 `{ status: "active" | "disabled" }`
- 操作进行中显示“更新中...”,成功后提示“用户已启用/用户已禁用”,并刷新用户列表;
- 增加保护:禁止修改当前登录账号状态,避免误禁用自己导致会话中断;
- 状态列展示中文化(`active -> 启用``disabled -> 禁用`)。
- 维持并复用既有能力:
- 用户创建(含前端重复校验 + 后端唯一约束);
- 角色分配(`POST /api/v1/users/{user_id}/roles`);
- 密码重置(`POST /api/v1/users/{user_id}/password`);
- 用户删除(`DELETE /api/v1/users/{user_id}`);
- 菜单/权限链路沿用现有 `admin.users` + `user.manage`(种子与菜单映射已存在)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593097988 --action full --skip-build-gate`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593097988` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:新增用户、分配角色、重置密码、删除用户、启用/禁用用户、状态文案展示。
- 边界场景:重复 user_id/email/username 拦截、角色为空或非法拒绝、当前登录账号禁止自我禁用、未授权访问拒绝(`user.manage`)。
- 回归点:后台首页入口与侧栏菜单可达、用户状态切换后会话与鉴权行为符合预期(被禁用用户被拒绝访问)。
- 风险与说明:
- 本次按任务要求未执行编译/构建与额外回归测试。
- 仓库当前存在其他需求的未提交改动,脚本 `changedFiles` 为工作区整体视图,不仅限本需求文件。
## Work Log - Docker 构建排障(api 基础镜像拉取 EOF)
- 触发问题:
- `docker compose build` 阶段,`api` 在拉取 `docker.m.daocloud.io/library/python:3.11-slim` metadata 时失败:
- `failed to do request: Head .../manifests/3.11-slim: EOF`
- 排查与验证:
- 手动拉取基础镜像:`docker pull docker.m.daocloud.io/library/python:3.11-slim`,结果成功(镜像可达,判定为镜像站瞬时网络抖动)。
- 端到端复验:`docker compose build api`,结果成功(`fquiz-api Built`)。
- 结论:
- 本次为外部镜像源瞬时异常,不涉及仓库代码缺陷;重试即可恢复。
- 保留口径:
- 若同类错误持续出现,优先重试构建;仍失败时在 `.env` 覆盖 `PYTHON_BASE_IMAGE=python:3.11-slim` 作为兜底。
## Work Log - 需求开发(ID: 304415118593098000,代码评审菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098000`(标题:`[fquiz迁移] 代码评审 菜单功能迁移`),并遵循本次任务要求:跳过构建门禁(`--skip-build-gate`),不做编译/构建与额外回归测试。
- 需求要点:将 quiz 的 `code-review` 菜单能力迁移到 fquiz,覆盖菜单可见、路由可达、权限链路与菜单保护。
- 本次实现(最小增量,复用既有需求管理能力):
- 后端菜单种子与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.code_review`(标题“代码评审”,路径 `/admin/code-review`,权限 `requirement.read`,排序 49)。
- `admin` 角色默认菜单绑定加入 `admin.code_review`
- 菜单删除保护:
- `api/app/services/admin_service.py`
- 受保护菜单集合加入 `admin.code_review`,防止在菜单管理页被误删。
- `web/src/app/admin/menus/page.tsx`
- 前端受保护菜单集合同步加入 `admin.code_review`
- 前端入口与路由迁移:
- `web/src/app/admin/page.tsx`
- 新增“代码评审”后台入口卡片(权限:`requirement.read`)。
- 新增 `web/src/app/admin/code-review/page.tsx`
- 采用复用方式导出 `requirements` 页面:`export { default } from "@/app/admin/requirements/page";`,保证 `/admin/code-review` 可直接承接现有“需求流转+评审协作”能力。
- 技能脚本执行与状态处理:
- 执行命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098000 --action full --skip-build-gate --force-complete-if-already-completed`
- 说明:该需求在执行时远端已是 `COMPLETED`,脚本走 `forced-complete-already-completed` 模式,执行一次 `COMPLETED(100)` 写回。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098000` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED``updateDate=2026-04-18T12:46:22.187463`)。
- 验收清单(交付建议):
- 功能点:后台首页可见“代码评审”入口;侧栏菜单可显示并可跳转 `/admin/code-review`;进入后可复用现有需求处理能力。
- 边界场景:无 `requirement.read` 权限账号不可见/不可访问;菜单管理页无法删除受保护菜单 `admin.code_review`
- 回归点:`admin` 角色默认菜单包含 `admin.code_review`;与 `admin.requirements` 并存时均可正常访问。
- 风险与说明:
- 本次按任务要求未执行编译/构建与额外回归测试。
- 当前仓库存在多需求并行改动,工作区为脏状态;本次交付聚焦 `code-review` 菜单迁移相关改动。
## Work Log - 需求开发(ID: 304415118593097994,系统消息菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593097994`(标题:`[fquiz迁移] 系统消息 菜单功能迁移`),并遵循本次任务要求:跳过构建门禁(`--skip-build-gate`),不做编译/构建与额外回归测试。
- 需求要点:将 quiz 的 `systemmessage` 菜单能力迁移到 fquiz,覆盖“功能/交互/权限/状态”链路。
- 本次实现(前后端闭环):
- 后端领域能力:
- 新增模型:`api/app/models/system_message.py``system_messages` 表,含 `title/content/level/status/start_at/end_at` 与创建/更新人、时间戳)。
- 新增 Schema`api/app/schemas/system_message.py`(列表、创建、更新 DTO`start_at <= end_at` 校验)。
- 新增服务:`api/app/services/system_message_service.py`
- 列表筛选(关键词、状态、等级);
- 创建/编辑/删除;
- 详情读取与用户信息序列化;
- 发布实时主题 `admin.system-messages`(创建/更新/删除)。
- 新增路由:`api/app/api/v1/system_messages.py`
- `GET /api/v1/admin/system-messages`
- `POST /api/v1/admin/system-messages`
- `GET /api/v1/admin/system-messages/{message_id}`
- `PATCH /api/v1/admin/system-messages/{message_id}`
- `DELETE /api/v1/admin/system-messages/{message_id}`
- 权限:读取 `system_message.read|system_message.manage`;写入 `system_message.manage`
- 路由挂载与模型注册:
- `api/app/api/router.py` 挂载 `system_messages_router`
- `api/app/core/database.py``api/app/models/__init__.py` 引入 `system_message`
- 权限、菜单与主题:
- `api/app/services/seed_service.py` 新增权限:`system_message.read``system_message.manage`
- 新增默认菜单:`admin.system_message`(标题“系统消息”,路径 `/admin/system-message`,权限 `system_message.read`)。
- admin 角色默认菜单绑定加入 `admin.system_message`
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.system_message`
- `api/app/services/topic_registry.py` 新增主题权限规则:`admin.system-messages`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.system_message`
- 前端页面迁移:
- 新增 `web/src/app/admin/system-message/page.tsx`
- 列表查询(关键词、状态、等级);
- 新建/编辑/删除系统消息;
- 生效/失效时间编辑;
- 权限拦截、空态/加载态、错误/成功提示;
- 订阅 `admin.system-messages` 主题后自动刷新。
- `web/src/app/admin/page.tsx` 新增“系统消息”入口卡片。
- `web/src/types/auth.ts` 新增系统消息类型:`SystemMessageSummary``SystemMessageListResponse` 等。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593097994 --action full --skip-build-gate`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593097994` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED``updateDate=2026-04-18T13:07:37.957567`)。
- 风险与说明:
- 本次按任务要求未执行编译/构建与额外回归测试。
- 仓库当前为脏工作区,脚本 `changedFiles` 会包含本需求外文件;本次交付聚焦系统消息链路相关改动。
## Work Log - 需求开发(ID: 304415118593098165,数据源管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能处理 1 条 `OPEN` 需求,遵循本次任务约束:仅处理 1 条、跳过构建门禁(`--skip-build-gate`)、不做额外回归测试。
- 执行命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --auto-query --action full --status OPEN --project-name fquiz --max-items 1 --skip-build-gate --checkpoint-file skills/fquiz-requirement-develop/runtime/subagent-open-1.ckpt.json --reset-checkpoint`
- 处理结果:
- 命中需求:`304415118593098165``[fquiz迁移] 数据源管理 菜单功能迁移`),初始状态 `OPEN`
- 状态轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`,各阶段 HTTP 状态均为 `200`
- 说明:
- 当前仓库工作区为脏状态,脚本 `changedFiles` 为全局视图,包含本需求外文件;本次仅按技能脚本完成需求状态闭环。
## Work Log - 前端全量 Radix 化(弃用语义样式 + 替换原生组件)
- 背景:根据用户要求,前端页面“完全弃用自定义语义样式”,并将页面中原生组件统一替换为 `@radix-ui/themes` 组件。
- 本次改造(`web`):
- 样式层:
- 清理 `web/src/app/globals.css` 中旧语义类定义(`surface-card` / `btn-*` / `control` / `table-*` / `notice*` / `text-muted` 等)。
- 页面改为直接使用 Radix 组件 + token 类(`var(--gray-*)` / `var(--accent-*)`)。
- 组件层:
- 原生组件全量替换为 Radix Themes 组件:
- `button` -> `Button`
- `table/thead/tbody/tr/th/td` -> `Table.Root/Header/Body/Row/ColumnHeaderCell/Cell`
- `input` -> `TextField.Root`
- `textarea` -> `TextArea`
- `select` -> `Select.Root/Trigger/Content/Item`
- `checkbox` -> `Checkbox`
- 覆盖首页与后台主要页面:`/``/admin/layout``/admin/{users,roles,menus,models,requirements,todos,chat,syslog,files,password,system-message,system-params,token-usage,life-countdown}`
- 类型与构建修复:
-`onChange/onValueChange/onCheckedChange` 补全显式类型,消除 `noImplicitAny` 报错。
- 修复自动替换阶段造成的 `import type` 语句结构问题(`password/files` 页面)。
- 验证:
- 语义类清理检查:`rg -n "surface-card|btn-primary|control|table-modern|text-muted" web/src -S`(无命中)
- 原生标签检查:`rg --case-sensitive -n "<button\b|<input\b|<select\b|<textarea\b|<table\b|<thead\b|<tbody\b|<tr\b|<th\b|<td\b" web/src`(无命中)
- 构建:`npm run build:web` 通过。
- 风险与说明:
- 本次为大范围 UI 层替换,业务逻辑未扩改;但页面视觉细节(按钮密度、表格间距、控件外观)与旧版存在差异,建议后续做一轮人工体验回归。
## Work Log - Web 构建失败修复(admin/files 上传控件类型错误)
- 触发问题:`next build` 在 TypeScript 阶段失败,报错位于 `web/src/app/admin/files/page.tsx``TextField.Root``type` 不接受 `"file"`
- 根因:`@radix-ui/themes` 当前 `TextField.Root``type` 类型联合不包含 `file`,将其当作文件上传控件会触发编译期类型错误。
- 修复动作(最小改动):
- 文件:`web/src/app/admin/files/page.tsx`
- 将上传控件从 `TextField.Root type=\"file\"` 替换为原生 `<input type=\"file\">`,保留原有 `onChange`、禁用态与上传逻辑不变。
- 验证结果:
- 命令:`cd web && npm run build`
- 结果:构建成功,TypeScript 检查通过,`/admin/files` 页面参与静态页生成无报错。
- 风险与影响:
- 影响面仅前端上传输入控件渲染层;API 调用、上传 mutation、鉴权与文件管理其他行为不受影响。
## Work Log - 前端主题改造(纯 Radix 风格)
- 背景:用户反馈“当前主题仍像自定义样式”,要求改为纯 Radix 风格。
- 本次改造(`web/src/app/**`):
- 主题入口纯化:
- `web/src/app/layout.tsx` 去除 `app-theme-root` 包裹样式类,仅保留 `Theme` Provider。
- `web/src/app/globals.css` 删除字体栈覆盖、`.radix-themes` token 二次映射、全局渐变背景,仅保留 `@import "tailwindcss"``body` 基础高度。
- 后台壳层纯化:
- `web/src/app/admin/layout.tsx` 去除背景光斑/渐变与硬编码色值,导航与头部改为 `Card/Flex/Text/Heading/Button/Callout` 组合。
- `web/src/app/admin/page.tsx` 首页卡片改为 `Card + Text` 的 Radix 语义结构。
- 交互控件统一:
- 批量将 `Button` 的长 Tailwind 颜色类替换为 Radix 属性(`variant/color/size`)。
- 典型页面已落地:`requirements``chat``files``menus``models``roles``users``todos``system-message``system-params``password``mindmap`
- 验证:
- `npm run lint:web`:仍存在仓库既有问题(`admin/life-countdown``react-hooks/set-state-in-effect` error`admin/password` 1 条 hooks warning),与本次主题改造无直接关联。
- 目标文件校验:`cd web && npx eslint src/app/layout.tsx src/app/admin/layout.tsx src/app/admin/page.tsx src/app/admin/chat/page.tsx src/app/admin/files/page.tsx src/app/admin/menus/page.tsx src/app/admin/models/page.tsx src/app/admin/requirements/[id]/page.tsx src/app/admin/requirements/new/page.tsx src/app/admin/requirements/page.tsx src/app/admin/roles/page.tsx src/app/admin/todos/page.tsx src/app/admin/users/page.tsx src/app/admin/password/page.tsx src/app/admin/mindmap/page.tsx` 通过(0 error)。
- 风险与说明:
- 本次涉及前端样式层批量替换,业务逻辑未改;局部页面的视觉密度(按钮大小/间距)可能与旧版不同,建议按关键管理页面做一轮人工浏览验收。
## Work Log - 需求开发(ID: 304415118593098012,日程管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098012`(标题:`[fquiz迁移] 日程管理 菜单功能迁移`),并遵循本次任务要求:不做编译/构建检查与额外回归测试。
- 需求要点:将 quiz 来源菜单 `schedule`(标题“日程管理”)迁移到 fquiz,并覆盖菜单可见性、权限链路、路由可达与菜单保护。
- 本次实现(最小改动,复用既有待办能力):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.schedule`(标题“日程管理”,路径 `/admin/schedule`,图标 `CalendarDays`,排序 `51`,权限 `todo.read`)。
- `admin` 角色默认菜单绑定加入 `admin.schedule`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.schedule`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.schedule`
- 前端入口与路由迁移:
- `web/src/app/admin/page.tsx` 新增“日程管理”卡片入口(权限 `todo.read`)。
- 新增 `web/src/app/admin/schedule/page.tsx`,复用 `todos` 页面:`export { default } from "@/app/admin/todos/page";`,保证 `/admin/schedule` 直接承接现有“待办/日程管理”完整交互能力(筛选、流转、创建、删除、权限拦截)。
- 需求状态流转(脚本):
- 首次执行(OPEN 闭环):
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098012 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)`HTTP 200)。
- 断点重启回写(已 COMPLETED 重派发):
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098012 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection --force-complete-if-already-completed`
- 轨迹:`COMPLETED(100)` 强制回写(HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098012` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED`
- 风险与说明:
- 本次按任务要求未执行编译/构建与额外回归测试。
- 当前仓库为多需求并行脏工作区,技能脚本的 `changedFiles` 为工作区整体视图;本次交付聚焦 `日程管理` 菜单迁移相关改动。
## Work Log - 需求开发(ID: 304415118593098006,标签管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098006`(标题:`[fquiz迁移] 标签管理 菜单功能迁移`),遵循本次规则:默认不做构建/编译检查与额外回归测试。
- 关键现状:远端该需求在执行时已是 `COMPLETED`;按“断点重启”口径执行强制完成写回,确保流程闭环留痕。
- 本次实现(最小闭环,前后端联动):
- 后端标签管理能力补齐(复用题库域):
- `api/app/services/question_bank_service.py`:新增标签聚合查询、标签重命名、标签删除(批量解除关联)服务逻辑;并在题库变更时统一推送 `admin.question_bank` 主题事件。
- `api/app/api/v1/question_bank.py`:新增标签接口:
- `GET /api/v1/admin/question-bank/tags`
- `PATCH /api/v1/admin/question-bank/tags/rename`
- `DELETE /api/v1/admin/question-bank/tags`
- `api/app/schemas/question_bank.py`:补齐 `QuestionTag*` 请求/响应模型。
- 菜单迁移与权限链路:
- `api/app/services/seed_service.py`:新增默认菜单 `admin.tag``/admin/tag`,标题“标签管理”,权限 `question_bank.read`),并加入 admin 角色默认菜单绑定。
- `api/app/services/admin_service.py`:受保护菜单集合加入 `admin.tag`(防止菜单管理误删)。
- `web/src/app/admin/menus/page.tsx`:前端受保护菜单集合同步加入 `admin.tag`
- 前端页面与入口:
- 新增 `web/src/app/admin/tag/page.tsx`:实现标签列表、关键词筛选、重命名弹窗、删除确认、成功/失败反馈、空态/加载态;并订阅 `admin.question_bank` 主题自动刷新。
- `web/src/app/admin/page.tsx`:新增“标签管理”入口卡片。
- `web/src/types/auth.ts`:补齐 `QuestionTagSummary` / `QuestionTagListResponse` / `QuestionTagMutationResponse` 类型,并修复 `QuestionBankListResponse` 缺失。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098006 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection --force-complete-if-already-completed`
- 结果:`COMPLETED(100)` 写回成功(HTTP 200)。
- 风险与说明:
- 当前仓库为多需求并行脏工作区,脚本 `workspaceChanges` 为全局视图;本次交付聚焦“标签管理菜单迁移”相关改动。
- 本次按任务要求未执行构建与额外回归测试。