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