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

371 lines
30 KiB
Markdown
Raw Normal View History

## 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` 为全局视图;本次交付聚焦“标签管理菜单迁移”相关改动。
- 本次按任务要求未执行构建与额外回归测试。