Files
fquiz/memory/2026-04-19.md
T
2026-04-23 09:41:54 +08:00

1360 lines
93 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: 304415118593098036,诗词本菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098036`(标题:`[fquiz迁移] 诗词本 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁(按回退重派语义采用断点重启执行口径)。
- 本次实现(最小改动,复用现有词条能力承接“诗词本”):
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 保持菜单编码 `admin.vocabulary` 与权限 `vocabulary.read` 不变,避免扩大权限与接口变更范围。
- 菜单文案改为 `诗词本`,路由改为 `/admin/poetry`
- 前端入口迁移:
- `web/src/app/admin/page.tsx`
- 后台首页卡片由“生字本(/admin/vocabulary)”迁移为“诗词本(/admin/poetry)”。
- 前端页面文案同步:
- `web/src/app/admin/vocabulary/page.tsx`
- 页面加载态、未登录提示、模块标题与说明文案从“生字本”同步为“诗词本”。
- `web/src/app/admin/poetry/page.tsx`
- 继续复用词条页面:`export { default } from "../vocabulary/page";`,确保 `/admin/poetry` 可直接承接完整交互能力(列表检索、新增编辑删除、权限拦截、加载态/空态)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098036 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098036` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台首页可见“诗词本”入口并可跳转 `/admin/poetry`
- 诗词本页面支持词条列表检索、新增/编辑/删除与状态切换;
- 权限码 `vocabulary.read / vocabulary.manage` 控制读写行为。
- 边界场景:
- 未登录访问提示与返回首页链路正常;
- 无权限账号访问显示权限提示;
- 空列表展示空态文案。
- 回归点:
- 菜单管理页仍保护 `admin.vocabulary` 菜单编码,避免误删;
- 既有 `vocabulary` 后端接口与推送主题 `admin.vocabulary` 行为不受影响。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限诗词本模块。
## Work Log - 需求开发(ID: 304415118593098018Jwt生成器菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098018`(标题:`[fquiz迁移] Jwt生成器 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁(按回退重派语义断点重启执行)。
- 本次实现(最小改动,完成 Jwt 生成器迁移落点):
- 后端接口与鉴权:
- 新增 `api/app/api/v1/jwt_generator.py`
- `GET /api/v1/admin/jwt-generator/users`:按关键词/状态分页查询用户(权限:`jwt_generator.read | jwt_generator.manage`)。
- `POST /api/v1/admin/jwt-generator/generate`:为指定用户生成 token(权限:`jwt_generator.manage`)。
- `api/app/api/router.py` 注册 `jwt_generator_router`
- 新增 `api/app/services/jwt_generator_service.py`
- 复用现有 `create_access_token`,写入 `sub/roles/permissions/exp` 声明。
- 生成前校验用户存在且 `status=active`
- 支持 `expires_minutes` 可选覆盖。
- 新增 `api/app/schemas/jwt_generator.py`
- 用户列表 DTO、生成请求 DTO(含参数校验)、生成响应 DTO(包含 `expires_at/role_codes/permission_codes`)。
- 权限点与菜单迁移:
- `api/app/services/seed_service.py`
- 新增权限 `jwt_generator.read``jwt_generator.manage` 并加入 `admin` 默认权限。
- 新增菜单 `admin.jwt_generator`(标题 `Jwt生成器`,路径 `/admin/jwt-generator`,权限 `jwt_generator.read`)。
- `admin` 角色默认菜单绑定加入 `admin.jwt_generator`
- `api/app/services/admin_service.py`
- 受保护菜单白名单加入 `admin.jwt_generator`,避免被误删。
- `web/src/app/admin/menus/page.tsx`
- 前端菜单管理页受保护菜单集合加入 `admin.jwt_generator`
- 前端页面与入口:
- 新增 `web/src/app/admin/jwt-generator/page.tsx`
- 输入 `user_id` 并调用后端生成 token。
- 覆盖加载态、无权限态、错误态、结果展示(`token_type/expires_in/access_token`)与复制操作。
- `web/src/app/admin/page.tsx` 新增“Jwt生成器”入口卡片(权限:`jwt_generator.read | jwt_generator.manage`)。
- 需求状态流转(脚本)
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --action full --requirement-id 304415118593098018 --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库为多需求并行改动,技能脚本 `changedFiles` 统计为工作区整体,不仅限 Jwt 生成器模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098024`(标题:`[fquiz迁移] AI聊天 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次执行命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098024 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection --force-complete-if-already-completed`
- 状态流转结果(HTTP 均 200):
- `OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`
- 需求对应能力落点(当前工作区可见):
- 后端权限与菜单:`api/app/services/seed_service.py``chat.use``admin.chat` 菜单 `/admin/chat`、admin 默认菜单绑定)
- 菜单保护:`api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx`(受保护菜单含 `admin.chat`
- 聊天接口:`api/app/api/v1/chat.py`(会话列表/创建、消息列表/发送)
- 前端页面与入口:`web/src/app/admin/chat/page.tsx``web/src/app/admin/page.tsx`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限 AI 聊天模块。
## Work Log - 需求开发(ID: 304415118593098042,家庭作业菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098042`(标题:`[fquiz迁移] 家庭作业 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次实现(最小改动,复用题库能力承载家庭作业):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.homework`(标题“家庭作业”,路径 `/admin/homework`,图标 `NotebookPen`,排序 `57`,权限 `question_bank.read`)。
- `admin` 角色默认菜单绑定加入 `admin.homework`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.homework`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.homework`
- 前端入口与路由迁移:
- `web/src/app/admin/page.tsx` 新增“家庭作业”后台入口卡片(权限:`question_bank.read | question_bank.manage`)。
- 新增 `web/src/app/admin/homework/page.tsx`,复用 `question-bank` 页面能力:`export { default } from "../question-bank/page";`,使 `/admin/homework` 可直接承接题目新增、筛选、状态流转与标签管理能力。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098042 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098042` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限家庭作业模块。
## Work Log - 需求开发(ID: 304415118593098051,编排管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098051`(标题:`[fquiz迁移] 编排管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次实现(最小改动,复用现有智能体管理页面承载“编排管理”)
- 后端菜单种子:
- `api/app/services/seed_service.py`
- `admin.agent` 菜单文案与路由迁移为:
- `name`: `编排管理`
- `path`: `/admin/orchestration`
- 保持 `code=admin.agent``permission_code=model.read` 不变,避免扩大权限与接口变更范围。
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合新增 `admin.orchestration`(兼容路径迁移后的保护口径)。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合新增 `admin.orchestration`
- 前端入口与路由迁移:
- `web/src/app/admin/page.tsx`
- 将入口卡片从“智能体管理(/admin/agent)”迁移为“编排管理(/admin/orchestration)”。
- 文案同步调整为“维护编排路由(AGENT)规则…”。
- 新增 `web/src/app/admin/orchestration/page.tsx`
- `export { default } from "@/app/admin/models/page";`
- 复用既有模型/路由规则页面能力,承接编排管理能力,确保最小改动闭环。
- 需求状态流转(脚本)
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098051 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098051` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限编排管理模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098030`(标题:`[fquiz迁移] 需求管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次执行命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098030 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 状态流转结果(HTTP 均 200):
- `OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`
- 远端状态确认:
- `/api/project/requirement/get/304415118593098030` 返回 `status=COMPLETED``progressPercent=100``resultMsg=开发完成:状态置为 COMPLETED``updateDate=2026-04-19T01:34:35.470386`)。
- 需求对应能力落点(当前工作区可见):
- 后端需求接口与状态流转:`api/app/api/v1/requirements.py``api/app/services/requirement_service.py`
- 后端菜单与权限:`api/app/services/seed_service.py``admin.requirements`,路径 `/admin/requirements`,权限 `requirement.read`admin 默认菜单绑定)
- 菜单保护:`api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx`(受保护菜单含 `admin.requirements`
- 前端页面:`web/src/app/admin/requirements/page.tsx``web/src/app/admin/requirements/new/page.tsx``web/src/app/admin/requirements/[id]/page.tsx`
- 后台入口:`web/src/app/admin/page.tsx`(“需求管理”卡片)
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限需求管理模块。
## Work Log - 需求开发(ID: 304415118593098048,题库统计菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098048`(标题:`[fquiz迁移] 题库统计 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次实现(最小改动,完成题库统计菜单迁移落点):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.mindmap`(标题“题库统计”,路径 `/admin/mindmap`,图标 `ChartBar`,排序 `51`,权限 `question_bank.read`)。
- `admin` 角色默认菜单绑定顺序中补齐 `admin.mindmap`(位于 `admin.requirements``admin.schedule` 之间)。
- 前端后台入口:
- `web/src/app/admin/page.tsx`
- 新增“题库统计”入口卡片,路径 `/admin/mindmap`,权限可见性:`question_bank.read | question_bank.manage`
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098048 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限题库统计模块。
## Work Log - 需求开发(ID: 304415118593098039Git管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098039`(标题:`[fquiz迁移] Git管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 本次实现(最小改动,复用既有需求能力承载 Git 管理):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.git_desktop`(标题“Git管理”,路径 `/admin/git-desktop`,图标 `GitBranch`,排序 `50`,权限 `requirement.read`)。
- `admin` 角色默认菜单绑定加入 `admin.git_desktop`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.git_desktop`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.git_desktop`
- 前端入口与路由迁移:
- `web/src/app/admin/page.tsx` 新增“Git管理”后台入口卡片(权限:`requirement.read`)。
- 新增 `web/src/app/admin/git-desktop/page.tsx`,复用 `requirements` 页面能力:`export { default } from "@/app/admin/requirements/page";`,使 `/admin/git-desktop` 可直接承接需求列表、状态流转、评论协作能力。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --action full --requirement-id 304415118593098039 --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限 Git 管理模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098045`(标题:`[fquiz迁移] 生字本 菜单功能迁移`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此使用 `--skip-build-gate`。当前仓库为脏工作区,且需求描述未包含反引号路径线索,执行时显式启用 `--allow-dirty-worktree --allow-broad-change-detection` 通过技能前置门禁。
- 能力落点确认(仓库内已具备):
- 后端菜单与权限:`api/app/services/seed_service.py`
- 菜单 `admin.vocabulary`(标题“生字本”,路径 `/admin/vocabulary`,权限 `vocabulary.read`)已存在,并已加入 admin 默认菜单绑定。
- 权限 `vocabulary.read` / `vocabulary.manage` 已存在。
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合包含 `admin.vocabulary`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合包含 `admin.vocabulary`
- 前后端页面与接口:
- 前端页面 `web/src/app/admin/vocabulary/page.tsx` 已实现列表检索、新增、编辑、删除。
- 后端接口 `api/app/api/v1/vocabulary.py` 已提供 CRUD 与权限校验。
- 后台入口 `web/src/app/admin/page.tsx` 已有“生字本”卡片(`/admin/vocabulary`)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098045 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`COMPLETED -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 本次处理语义:按“断点重启”回写开发轨迹并闭环完成。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限生字本模块。
## Work Log - 需求开发(ID: 304415118593098063,价格监控菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098063`(标题:`[fquiz迁移] 价格监控 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `price-monitor`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`
- 本次实现(最小改动,复用既有 Token 统计能力承接“价格监控”):
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 保留菜单编码 `admin.token_usage` 与权限 `model.read` 不变,避免扩大权限与接口改动范围。
- 菜单文案由“Token统计”改为“价格监控”,菜单路由由 `/admin/token-usage` 改为 `/admin/price-monitor`
- 前端后台入口:
- `web/src/app/admin/page.tsx`
- 后台首页卡片由“Token统计(/admin/token-usage)”迁移为“价格监控(/admin/price-monitor)”。
- 前端页面路由承接:
- 新增 `web/src/app/admin/price-monitor/page.tsx`
- 通过 `export { default } from "../token-usage/page";` 复用现有 Token 统计页面,实现 `/admin/price-monitor` 与原统计能力一致(查询、模型筛选、趋势与费用展示、加载/空态/错误态)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098063 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098063` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“价格监控”,可跳转 `/admin/price-monitor`
- 页面可按时间范围、模型编码筛选并展示请求量、成功率、Token 与费用汇总/趋势。
- 边界场景:
- 未登录访问提示正常;无权限(缺少 `model.read/model.manage`)提示正常。
- 无数据时展示空态,不报错。
- 回归点:
- 原接口 `/api/v1/admin/token-usage/overview` 保持不变;
- 原页面 `/admin/token-usage` 仍可访问(兼容),新菜单路由默认指向 `/admin/price-monitor`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限价格监控模块。
## Work Log - 需求开发(ID: 304415118593098057API测试菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098057`(标题:`[fquiz迁移] API测试 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此脚本执行使用 `--skip-build-gate`;当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`
- 本次实现(最小改动,复用模型测试能力承接 API 测试):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.api_tester`(标题“API测试”,路径 `/admin/api-tester`,图标 `TestTube2`,排序 `63`,权限 `model.read`)。
- `admin` 角色默认菜单绑定加入 `admin.api_tester`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.api_tester`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.api_tester`
- 前端入口与路由迁移:
- 新增 `web/src/app/admin/api-tester/page.tsx`
- `export { default } from "@/app/admin/models/page";`
- 直接复用模型管理页中已存在的“冒烟测试 / 对话测试 / 测试记录”能力,承接 API 测试菜单功能。
- `web/src/app/admin/page.tsx` 新增“API测试”后台入口卡片,路由 `/admin/api-tester`,权限可见性 `model.read | model.manage`
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098057 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098057` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限 API 测试模块。
## Work Log - 需求开发(ID: 304415118593098060,上帝视角菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098060`(标题:`[fquiz迁移] 上帝视角 菜单功能迁移`,来源菜单名称/路由:`diary`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`
- 本次实现(最小改动,复用现有系统日志能力承接“上帝视角”):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.diary`(标题“上帝视角”,路径 `/admin/diary`,图标 `Eye`,排序 `57`,权限 `menu.read`)。
- `admin` 角色默认菜单绑定加入 `admin.diary`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.diary`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.diary`
- 前端入口与路由承接:
- 新增 `web/src/app/admin/diary/page.tsx`
- `export { default } from "@/app/admin/syslog/page";`
- 复用系统日志页面能力,承接“上帝视角”菜单(动作筛选、用户筛选、分页、加载/空态/错误态)。
- `web/src/app/admin/page.tsx` 新增“上帝视角”后台入口卡片,路由 `/admin/diary`,权限可见性 `menu.read | menu.manage`
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098060 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098060` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“上帝视角”,可跳转 `/admin/diary`
- 页面支持按动作(`action`)与用户(`user_id`)筛选审计日志,并支持分页浏览。
- 边界场景:
- 未登录访问时有登录提示。
- 无权限访问(缺少 `menu.read/menu.manage`)时有权限提示。
- 无数据时展示空态“暂无日志数据”。
- 回归点:
-`/admin/syslog` 页面与 `/api/v1/admin/audit-logs` 接口保持兼容;`/admin/diary` 为新增入口复用,不引入额外接口变更。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限上帝视角模块。
## Work Log - 需求开发(ID: 304415118593098066,分组管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098066`(标题:`[fquiz迁移] 分组管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `group`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`。本次按“断点重启”语义执行完整状态轨迹回写。
- 本次实现(最小改动,复用既有标签能力承接“分组管理”):
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 保留菜单编码 `admin.tag` 与权限 `question_bank.read` 不变,避免扩大权限与接口改动范围。
- 菜单文案由“标签管理”调整为“分组管理”。
- 菜单路由由 `/admin/tag` 迁移为 `/admin/group`
- 前端后台入口:
- `web/src/app/admin/page.tsx`
- 后台首页卡片由“标签管理(/admin/tag)”迁移为“分组管理(/admin/group)”。
- 文案同步为“维护题库分组:检索、重命名、批量解除绑定”。
- 前端页面路由承接:
- 新增 `web/src/app/admin/group/page.tsx`
- `export { default } from "../tag/page";`,复用既有标签管理页面能力承接 `/admin/group`
- `web/src/app/admin/tag/page.tsx`
- 页面文案按迁移语义统一为“分组管理”(标题、提示、按钮反馈、对话框文案、空态文案)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098066 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098066` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台首页可见“分组管理”入口并可跳转 `/admin/group`
- 页面支持分组检索、重命名、删除(解除关联);
- 权限码 `question_bank.read / question_bank.manage` 控制读写行为。
- 边界场景:
- 未登录访问时提示登录;
- 无权限账号访问显示权限提示;
- 无数据时展示“暂无分组数据”。
- 回归点:
- 既有题库标签接口 `/api/v1/admin/question-bank/tags*` 保持不变;
-`/admin/tag` 页面仍可访问(兼容),新菜单路由默认指向 `/admin/group`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限分组管理模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098072`(标题:`[fquiz迁移] 待办管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试,因此脚本执行使用 `--skip-build-gate`;当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`
- 能力落点确认(当前工作区已具备,最小改动口径闭环):
- 后端菜单与权限:`api/app/services/seed_service.py`
- 菜单 `admin.todos`(标题“待办管理”,路径 `/admin/todos`,权限 `todo.read`)已存在。
- `admin` 默认菜单绑定已包含 `admin.todos`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合包含 `admin.todos`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合包含 `admin.todos`
- 前端入口与页面:
- `web/src/app/admin/page.tsx` 已有“待办管理”卡片入口(`/admin/todos`)。
- `web/src/app/admin/todos/page.tsx` 已承载待办完整交互能力(筛选、创建、状态流转、删除与权限拦截)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098072 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限待办管理模块。
## Work Log - 需求开发(ID: 304415118593098069,角色管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098069`(标题:`[fquiz迁移] 角色管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `role`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 能力落点确认(当前仓库已具备,满足最小改动复用策略):
- 后端接口与权限:
- `api/app/api/v1/admin.py`
- `GET /api/v1/admin/roles``role.read | role.manage`
- `POST /api/v1/admin/roles``role.manage`
- `PATCH /api/v1/admin/roles/{role_id}``role.manage`
- `DELETE /api/v1/admin/roles/{role_id}``role.manage`
- `GET /api/v1/admin/permissions``role.read | role.manage`
- `GET/PUT /api/v1/admin/roles/{role_id}/menus`(读写分权)
- `api/app/services/seed_service.py`
- 角色权限点已存在:`role.read``role.manage`
- 菜单 `admin.roles` 已存在:标题“角色管理”,路径 `/admin/roles`,权限 `role.read`
- 前端页面与交互:
- `web/src/app/admin/roles/page.tsx`
- 角色列表、创建、编辑、删除、角色-菜单绑定。
- 权限拦截、登录态校验、加载态/错误态/成功提示。
- 订阅 `admin.roles/admin.menus` 主题实现数据刷新。
- `web/src/app/admin/page.tsx`
- 后台首页“角色管理”入口卡片,路由 `/admin/roles`,权限可见性 `role.read | role.manage`
- 菜单保护:
- `api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx` 已将 `admin.roles` 纳入受保护菜单,避免误删。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098069 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098069` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台可访问“角色管理”菜单并进入 `/admin/roles`
- 支持角色列表查询、创建、编辑、删除。
- 支持权限点绑定与菜单绑定,变更后列表可见。
- 边界场景:
- 未登录访问时提示登录。
-`role.read` 权限时提示无权限。
- 删除受保护角色(如 admin)时后端拒绝并返回错误信息。
- 回归点:
- 用户管理页角色下拉(依赖 `/api/v1/admin/roles`)可继续读取角色列表。
- 菜单管理中 `admin.roles` 仍受保护,不可误删。
## Work Log - 需求开发(ID: 304415118593098081,流程图菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098081`(标题:`[fquiz迁移] 流程图 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `mermaid-mgr`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用 MD 解析能力承接“流程图”)
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.mermaid_mgr`(标题“流程图”,路径 `/admin/mermaid-mgr`,图标 `Workflow`,排序 `54`,权限 `question_bank.read`)。
- `admin` 角色默认菜单绑定加入 `admin.mermaid_mgr`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.mermaid_mgr`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.mermaid_mgr`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“流程图”后台入口卡片(权限:`question_bank.read | question_bank.manage`)。
- 新增 `web/src/app/admin/mermaid-mgr/page.tsx`
- `export { default } from "../mdresolve/page";`
- 复用现有 MD 解析页面能力,承接流程图菜单迁移最小闭环。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098081 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098081` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“流程图”,可跳转 `/admin/mermaid-mgr`
- 页面支持 Markdown 输入、解析预览、批量导入题库;
- 读写权限按 `question_bank.read / question_bank.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示无权限;
- 解析无结果或导入失败时展示错误/警告信息。
- 回归点:
-`MD解析` 路由 `/admin/mdresolve` 与接口 `/api/v1/admin/mdresolve/*` 保持可用;
- 菜单管理中 `admin.mermaid_mgr` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限流程图模块。
## Work Log - 需求开发(ID: 304415118593098078,试题管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098078`(标题:`[fquiz迁移] 试题管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `exam_mgr` / 路由 `exam`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,统一“题库管理”文案为“试题管理”,保持既有能力与路由不变):
- 后端菜单种子:
- `api/app/services/seed_service.py`
- 菜单 `admin.question_bank` 名称由“题库管理”更新为“试题管理”。
- 保持菜单编码 `admin.question_bank`、路径 `/admin/question-bank`、权限 `question_bank.read` 不变。
- 前端后台首页入口:
- `web/src/app/admin/page.tsx`
- 卡片标题由“题库管理”更新为“试题管理”。
- 卡片描述同步改为“维护试题:题目新增、筛选、状态流转与标签管理。”。
- 前端页面文案:
- `web/src/app/admin/mindmap/page.tsx``/admin/question-bank` 复用页)
- 未登录提示由“题库管理页面”更新为“试题管理页面”。
- 页面标题由“题库管理”更新为“试题管理”。
- 迁移说明由 `question_mgr` 更新为 `exam_mgr`,与来源菜单一致。
- 能力落点确认(当前仓库):
- `web/src/app/admin/question-bank/page.tsx` 仍复用 `../mindmap/page`,试题列表/筛选/编辑/状态/标签能力保持不变。
- 菜单保护未变:`api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx` 均包含 `admin.question_bank`
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098078 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限试题管理模块。
## Work Log - 需求开发(ID: 304415118593098087MCP管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098087`(标题:`[fquiz迁移] MCP管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `mcp_server` / 路由 `mcp-server`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用模型管理能力承接 MCP 管理):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.mcp_server`(标题“MCP管理”,路径 `/admin/mcp-server`,图标 `Server`,排序 `63`,权限 `model.read`)。
- `admin` 角色默认菜单绑定加入 `admin.mcp_server`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.mcp_server`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.mcp_server`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“MCP管理”后台入口卡片(权限:`model.read | model.manage`)。
- 新增 `web/src/app/admin/mcp-server/page.tsx`
- `export { default } from "@/app/admin/models/page";`
- 复用现有模型管理页面能力,承接 MCP 管理菜单迁移最小闭环。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098087 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098087` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“MCP管理”,可跳转 `/admin/mcp-server`
- 页面可执行模型列表、路由规则与密钥管理等既有操作(复用 `models` 页面);
- 权限按 `model.read / model.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示无权限;
- 模型/路由为空时页面保持空态可读。
- 回归点:
- 原“编排管理(/admin/orchestration)”与“模型管理(/admin/models)”入口仍可用;
- 菜单管理中 `admin.mcp_server` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限 MCP 管理模块。
## Work Log - 需求开发(ID: 304415118593098090,菜单管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098090`(标题:`[fquiz迁移] 菜单管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `menu`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,确认并固化菜单管理迁移落点):
- 能力与菜单落点确认(代码已具备):
- `api/app/services/seed_service.py`
- 菜单 `admin.menus`(标题“菜单管理”,路径 `/admin/menus`,权限 `menu.read`)已在默认菜单与 admin 默认绑定中。
- `web/src/app/admin/page.tsx`
- 后台首页已有“菜单管理”入口卡片,路由 `/admin/menus`
- `api/app/api/v1/admin.py`
- 菜单管理接口完整:`GET/POST /menus``PATCH/DELETE /menus/{id}``GET /menus/tree``GET /me/menus`
- `api/app/services/admin_service.py` + `web/src/app/admin/menus/page.tsx`
- 菜单保护包含 `admin.menus`,可阻止受保护菜单误删。
- `web/src/app/admin/menus/page.tsx`
- 页面能力完整:关键词/状态/排序筛选、统计卡片、新建/编辑 Dialog、删除确认、权限与空态处理。
- 记忆口径补充:
- `MEMORY.md` 的“菜单迁移口径(2026-04-18)”新增“菜单管理”条目,明确沿用 `admin.menus``/api/v1/admin/menus*` 既有能力,不做额外扩改。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098090 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098090` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台首页可见“菜单管理”并可跳转 `/admin/menus`
- 页面支持菜单列表筛选、创建、编辑、删除与层级父菜单选择;
- 角色菜单树可通过 `/api/v1/admin/menus/tree``/api/v1/admin/me/menus` 正常拉取。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示需 `menu.read/menu.manage`
- 删除受保护菜单(如 `admin.menus`)被拦截并返回错误。
- 回归点:
- 角色菜单绑定接口 `/api/v1/admin/roles/{id}/menus` 可继续与菜单管理页联动;
- `admin.menus` 在前后端受保护名单中持续生效。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限菜单管理模块。
## Work Log - 需求开发(ID: 304415118593098084,知识统计菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098084`(标题:`[fquiz迁移] 知识统计 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `knowledge-mastery`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用题库统计能力承接“知识统计”):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.knowledge_mastery`(标题“知识统计”,路径 `/admin/knowledge-mastery`,图标 `BrainCircuit`,排序 `51`,权限 `question_bank.read`)。
- `admin` 角色默认菜单绑定加入 `admin.knowledge_mastery`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.knowledge_mastery`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.knowledge_mastery`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“知识统计”后台入口卡片,路由 `/admin/knowledge-mastery`,权限可见性 `question_bank.read | question_bank.manage`
- 新增 `web/src/app/admin/knowledge-mastery/page.tsx`
- `export { default } from "../mindmap/page";`
- 复用现有题库统计页面能力,承接知识统计菜单迁移最小闭环。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098084 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098084` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“知识统计”,可跳转 `/admin/knowledge-mastery`
- 页面支持按题目状态、难度、题型与标签维度进行统计检索与列表展示;
- 读写权限按 `question_bank.read / question_bank.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示无权限;
- 无数据时展示空态,不报错。
- 回归点:
-`题库统计` 路由 `/admin/mindmap` 与题库接口 `/api/v1/admin/question-bank*` 保持可用;
- 菜单管理中 `admin.knowledge_mastery` 受保护,不可误删。
## Work Log - 需求开发(ID: 304415118593098075,单词统计菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098075`(标题:`[fquiz迁移] 单词统计 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源路由 `vocabulary-proficiency`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 能力落点核验(仓库内已具备):
- 后端菜单与权限:`api/app/services/seed_service.py`
- 菜单 `admin.knowledge_mastery` 已配置为“单词统计”,路由 `/admin/vocabulary-proficiency`,权限 `vocabulary.read`
- `admin` 角色默认菜单绑定包含 `admin.knowledge_mastery`
- 菜单保护:
- `api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx` 的受保护菜单集合均包含 `admin.knowledge_mastery`,可防误删。
- 前端页面与入口:
- `web/src/app/admin/vocabulary-proficiency/page.tsx` 提供词条总量、启用占比、缺失音标/例句、状态分布、首字母 Top12、最近更新列表。
- `web/src/app/admin/page.tsx` 提供“单词统计”入口卡片(`/admin/vocabulary-proficiency`)。
- 路由兼容:
- `web/src/app/admin/knowledge-mastery/page.tsx` 作为兼容导出,转发至 `vocabulary-proficiency` 页面。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098075 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098075` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 记忆口径修正:
- `MEMORY.md` 的“菜单迁移口径”已修正该条为“单词统计”,并与当前代码事实保持一致(`admin.knowledge_mastery -> /admin/vocabulary-proficiency -> vocabulary.read`)。
## Work Log - 需求开发(ID: 304415118593098093,作业监控菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098093`(标题:`[fquiz迁移] 作业监控 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单名 `job_mgr`,来源路由 `job`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;因此脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用题库能力承接“作业监控”):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.job_mgr`(标题“作业监控”,路径 `/admin/job`,图标 `MonitorCog`,排序 `58`,权限 `question_bank.read`)。
- `admin` 角色默认菜单绑定加入 `admin.job_mgr`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.job_mgr`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.job_mgr`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“作业监控”后台入口卡片,路由 `/admin/job`,权限可见性 `question_bank.read | question_bank.manage`
- 新增 `web/src/app/admin/job/page.tsx`
- `export { default } from "../question-bank/page";`
- 复用既有题库页面能力承接作业监控(列表筛选、状态流转、标签维度查看)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098093 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098093` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“作业监控”,可跳转 `/admin/job`
- 页面可复用题库能力完成作业项筛选、状态流转与标签维度查看;
- 权限按 `question_bank.read / question_bank.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示无权限;
- 无数据时展示空态,不报错。
- 回归点:
-`试题管理``/admin/question-bank`)与 `家庭作业``/admin/homework`)入口保持可用;
- 菜单管理中 `admin.job_mgr` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,脚本 `changedFiles` 为工作区整体视图,不仅限作业监控模块。
## Work Log - 需求开发(ID: 304415118593098099,微信小程序菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098099`(标题:`[fquiz迁移] 微信小程序 菜单功能迁移`,状态由回退后的 `OPEN` 重启,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且描述未含反引号路径线索,门禁放宽参数使用 `--allow-dirty-worktree --allow-broad-change-detection`
- 本次实现(最小改动,复用系统参数能力承载微信小程序配置):
- 后端菜单种子与默认绑定:
- `api/app/services/seed_service.py`
- 新增菜单 `admin.wxapp`(标题“微信小程序”,路径 `/admin/wxapp`,图标 `Smartphone`,权限 `system_param.read`,排序 `47`)。
- `admin` 角色默认菜单绑定加入 `admin.wxapp`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.wxapp`,避免误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合加入 `admin.wxapp`
- 前端入口与路由:
- `web/src/app/admin/page.tsx` 新增“微信小程序”入口卡片(权限:`system_param.read | system_param.manage`)。
- 新增 `web/src/app/admin/wxapp/page.tsx``export { default } from "../system-params/page";`,复用系统参数页面能力承接配置维护。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098099 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098099` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限微信小程序模块。
## Work Log - 需求开发(ID: 304415118593098102,知识点管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098102`(标题:`[fquiz迁移] 知识点管理 菜单功能迁移`,状态为回退后的 `OPEN`,优先级 `MEDIUM`,来源菜单 `knowledge_point_mgr` / 路由 `knowledge`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用分组管理能力承接“知识点管理”)
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增菜单 `admin.knowledge_point_mgr`(标题“知识点管理”,路径 `/admin/knowledge`,图标 `Network`,权限 `question_bank.read`,排序 `55`)。
- `admin` 角色默认菜单绑定加入 `admin.knowledge_point_mgr`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.knowledge_point_mgr`,避免菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合加入 `admin.knowledge_point_mgr`
- 前端入口与路由:
- `web/src/app/admin/page.tsx` 新增“知识点管理”入口卡片(权限:`question_bank.read | question_bank.manage`)。
- 新增 `web/src/app/admin/knowledge/page.tsx``export { default } from "../tag/page";`,复用分组管理页面能力承接知识点检索、重命名与解除关联。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098102 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098102` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“知识点管理”,可跳转 `/admin/knowledge`
- 页面支持知识点(标签)检索、重命名、解除关联(复用分组管理能力);
- 权限按 `question_bank.read / question_bank.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限访问提示无权限;
- 无数据时展示空态,不报错。
- 回归点:
- 原“分组管理”入口 `/admin/group` 保持可用;
- 菜单管理中 `admin.knowledge_point_mgr` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限知识点管理模块。
## Work Log - 需求开发(ID: 304415118593098108,定时任务菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098108`(标题:`[fquiz迁移] 定时任务 菜单功能迁移`,优先级 `MEDIUM`,来源菜单 `cron_task_mgr` / 路由 `cron`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 能力落点确认(仓库内已具备):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py` 已存在菜单 `admin.cron_task_mgr`(标题“定时任务”,路径 `/admin/cron`,权限 `todo.read`),并已加入 `admin` 默认菜单绑定。
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合包含 `admin.cron_task_mgr`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合包含 `admin.cron_task_mgr`
- 前端入口与页面承接:
- `web/src/app/admin/page.tsx` 已存在“定时任务”入口卡片(`/admin/cron`)。
- `web/src/app/admin/cron/page.tsx` 已通过 `export { default } from "@/app/admin/todos/page";` 复用待办管理能力承接定时任务菜单。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098108 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`COMPLETED -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 本次处理语义:按“断点重启”口径回写开发轨迹并闭环完成。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限定时任务模块。
## Work Log - 需求开发(ID: 304415118593098111,知识集管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098111`(标题:`[fquiz迁移] 知识集管理 菜单功能迁移`,状态为回退后的 `OPEN`,优先级 `MEDIUM`,来源菜单 `knowledge-set` / 路由 `knowledge-set`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用文件管理能力承接“知识集管理”)
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 复用菜单编码 `admin.files` 与权限 `file.read`(保留原有 `file.manage` 写权限链路),菜单文案改为“知识集管理”,路径改为 `/admin/knowledge-set`,图标调整为 `FolderTree`
- 该菜单已在 `admin` 默认菜单绑定中,保持 `admin.files` 绑定不变。
- 前端入口迁移:
- `web/src/app/admin/page.tsx`
- 后台首页新增“知识集管理”入口卡片,路由 `/admin/knowledge-set`,权限可见性 `file.read | file.manage`
- 前端页面承接:
- 新增 `web/src/app/admin/knowledge-set/page.tsx`
- `export { default } from "../files/page";`
- 直接复用现有文件管理页面能力(挂载点切换、目录浏览、创建目录、上传、重命名、移动、删除、下载、加载态/错误态/空态)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098111 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098111` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台首页可见“知识集管理”并可跳转 `/admin/knowledge-set`
- 页面具备目录浏览、目录创建、上传、重命名、移动、删除、下载能力;
- 权限按 `file.read / file.manage` 分级生效(只读与可管理)。
- 边界场景:
- 未登录访问提示登录;
- 无权限账号访问提示权限不足;
- 无可用挂载点时返回对应错误提示。
- 回归点:
- 既有文件管理后端接口 `/api/v1/admin/files*` 与挂载点索引能力保持不变;
- 菜单管理中 `admin.files` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限知识集管理模块。
## Work Log - 需求开发(ID: 304415118593098114,提示词管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098114`(标题:`[fquiz迁移] 提示词管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `prompts` / 路由 `prompt`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用系统消息能力承接“提示词管理”)
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 保持菜单编码 `admin.system_message` 与权限 `system_message.read` 不变,避免扩大权限与接口改动范围。
- 菜单文案从“系统消息”迁移为“提示词管理”,路由从 `/admin/system-message` 迁移为 `/admin/prompt`
- 前端入口迁移:
- `web/src/app/admin/page.tsx`
- 后台首页卡片由“系统消息(/admin/system-message)”迁移为“提示词管理(/admin/prompt)”。
- 卡片说明文案同步为“复用系统消息能力维护提示词内容、等级、有效期与发布状态”。
- 前端页面承接:
- 新增 `web/src/app/admin/prompt/page.tsx`
- `export { default } from "../system-message/page";`
- 复用既有系统消息管理页面,直接承接提示词管理列表检索、新增编辑删除、状态流转与有效期维护能力。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098114 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098114` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台首页可见“提示词管理”入口并可跳转 `/admin/prompt`
- 提示词管理页面支持列表检索、新增/编辑/删除、等级与状态切换、有效期维护;
- 权限 `system_message.read / system_message.manage` 正常控制读写。
- 边界场景:
- 未登录访问提示登录;
- 无权限账号访问提示权限不足;
- 空列表展示空态文案。
- 回归点:
- 既有接口 `/api/v1/admin/system-messages*` 与数据模型 `system_messages` 不变;
- 菜单管理中 `admin.system_message` 继续受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限提示词管理模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098105`(标题:`[fquiz迁移] 队列管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `queue_mgr` / 路由 `jobqueue`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用待办能力承接“队列管理”)
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增菜单 `admin.queue_mgr`(标题“队列管理”,路径 `/admin/jobqueue`,图标 `ListTodo`,权限 `todo.read`,排序 `53`)。
- `admin` 角色默认菜单绑定加入 `admin.queue_mgr`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.queue_mgr`,避免菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合加入 `admin.queue_mgr`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“队列管理”入口卡片,路由 `/admin/jobqueue`,权限可见性 `todo.read`
- 新增 `web/src/app/admin/jobqueue/page.tsx`
- `export { default } from "@/app/admin/todos/page";`
- 复用现有待办管理页面能力承接队列任务清单。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098105 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098105` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限队列管理模块。
## Work Log - 需求开发(ID: 304415118593098123,脚本管理菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098123`(标题:`[fquiz迁移] 脚本管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `script_mgr` / 路由 `script`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用待办能力承接“脚本管理”):
- 后端菜单迁移:
- `api/app/services/seed_service.py`
- 保留菜单编码 `admin.cron_task_mgr`、路由 `/admin/cron` 与权限 `todo.read` 不变;菜单文案由“定时任务”统一为“脚本管理”。
- 前端后台入口迁移:
- `web/src/app/admin/page.tsx`
- 后台首页卡片由“定时任务(/admin/cron)”迁移为“脚本管理(/admin/cron)`,说明文案同步改为脚本任务清单语义。
- 页面能力承接(已有能力沿用):
- `web/src/app/admin/cron/page.tsx` 继续 `export { default } from "@/app/admin/todos/page";`,复用待办管理能力承接脚本任务列表、筛选、状态流转与负责人协作。
- 菜单保护(已有能力沿用):
- `api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx``admin.cron_task_mgr` 受保护配置保持不变,避免被菜单管理误删。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098123 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- 脚本返回 `finalStatusPlanned=COMPLETED``trajectory` 各阶段写回 `httpStatus=200`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限脚本管理模块。
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098117`(标题:`[fquiz迁移] 模型管理 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `llmmodel` / 路由 `llmmodel`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 能力落点确认(仓库内已具备):
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 菜单 `admin.models` 已配置为“模型管理”,路径 `/admin/models`,权限 `model.read`,并已加入 `admin` 默认菜单绑定。
- 菜单保护:
- `api/app/services/admin_service.py``web/src/app/admin/menus/page.tsx` 的受保护菜单集合均包含 `admin.models`,可防误删。
- 前端入口与页面:
- `web/src/app/admin/page.tsx` 已存在“模型管理”入口卡片,路由 `/admin/models`
- `web/src/app/admin/models/page.tsx` 已承载模型管理完整能力:模型列表/检索、创建编辑、状态流转、路由规则、密钥轮换、健康检查、冒烟测试与对话测试。
- 记忆口径补充:
- `MEMORY.md` 的“菜单迁移口径(2026-04-18)”新增“模型管理”条目,明确沿用 `admin.models``models` 页面既有能力,不做额外扩改。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098117 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098117` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限模型管理模块。
## Work Log - 需求开发(ID: 304415118593098096,历史答卷菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098096`(标题:`[fquiz迁移] 历史答卷 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `history` / 路由 `history`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用题库能力承接“历史答卷”)
- 后端菜单能力(已存在,沿用):
- `api/app/services/seed_service.py`
- 菜单 `admin.history` 已配置为“历史答卷”,路径 `/admin/history`,权限 `question_bank.read`,并已加入 `admin` 角色默认菜单绑定。
- 菜单保护补齐:
- `api/app/services/admin_service.py` 后端受保护菜单集合加入 `admin.history`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合同步加入 `admin.history`
- 前端入口与路由承接:
- `web/src/app/admin/page.tsx` 新增“历史答卷”后台入口卡片,路由 `/admin/history`,权限可见性 `question_bank.read | question_bank.manage`
- 新增 `web/src/app/admin/history/page.tsx`
- `export { default } from "../question-bank/page";`
- 复用既有题库页面能力承接历史答卷列表查询/筛选与状态管理。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098096 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098096` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“历史答卷”,可跳转 `/admin/history`
- 页面复用题库管理能力完成列表查询、筛选与状态管理;
- 权限按 `question_bank.read / question_bank.manage` 生效。
- 边界场景:
- 未登录访问提示登录;
- 无权限账号访问提示权限不足;
- 无数据时展示空态,不报错。
- 回归点:
-`试题管理` 路由 `/admin/question-bank` 与相关接口能力保持可用;
- 菜单管理中 `admin.history` 受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限历史答卷模块。
## Work Log - 需求开发(ID: 304415118593098138,百度网盘菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098138`(标题:`[fquiz迁移] 百度网盘 菜单功能迁移`,状态为回退后的 `OPEN`,优先级 `MEDIUM`,来源菜单 `baidu_pan` / 路由 `baidu-pan`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用文件管理能力承接“百度网盘”)
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.baidu_pan`
- `name`: `百度网盘`
- `path`: `/admin/baidu-pan`
- `icon`: `Cloud`
- `permission_code`: `file.read`
- `admin` 角色默认菜单绑定加入 `admin.baidu_pan`,保持管理员可见。
- 菜单保护补齐:
- `api/app/services/admin_service.py`
- 后端受保护菜单集合加入 `admin.baidu_pan`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx`
- 前端受保护菜单集合加入 `admin.baidu_pan`
- 前端入口与页面承接:
- `web/src/app/admin/page.tsx`
- 新增后台首页卡片“百度网盘”,路由 `/admin/baidu-pan`,可见性 `file.read | file.manage`
- 新增 `web/src/app/admin/baidu-pan/page.tsx`
- `export { default } from "../files/page";`
- 复用现有文件管理页面能力承载百度网盘功能(挂载切换、目录浏览、创建目录、上传、重命名、移动、删除、下载、加载态/错误态/空态)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098138 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- 脚本返回:`finalStatusPlanned=COMPLETED`,且 `trajectory` 各阶段写回 `httpStatus=200`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“百度网盘”,可跳转 `/admin/baidu-pan`
- 页面可执行目录浏览、创建目录、上传、重命名、移动、删除与下载;
- 权限按 `file.read / file.manage` 生效,topic `admin.files` 刷新链路保持可用。
- 边界场景:
- 未登录访问提示登录;
- 无权限账号访问提示需 `file.read`
- 目录为空时展示空态,不报错。
- 回归点:
- 既有“知识集管理(/admin/knowledge-set)”能力保持可用;
- 菜单管理中 `admin.baidu_pan``admin.files` 均受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限百度网盘模块。
## Work Log - 需求开发(ID: 304415118593098126,文件识别菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098126`(标题:`[fquiz迁移] 文件识别 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`,来源菜单 `filedetector` / 路由 `filedetector`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;执行脚本使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 本次实现(最小改动,复用文件管理能力承接“文件识别”)
- 后端菜单与角色绑定:
- `api/app/services/seed_service.py`
- 新增默认菜单 `admin.filedetector`
- `name`: `文件识别`
- `path`: `/admin/filedetector`
- `icon`: `FileSearch2`
- `permission_code`: `file.read`
- `admin` 角色默认菜单绑定加入 `admin.filedetector`,保持管理员可见。
- 菜单保护补齐:
- `api/app/services/admin_service.py`
- 后端受保护菜单集合加入 `admin.filedetector`,防止菜单管理误删。
- `web/src/app/admin/menus/page.tsx`
- 前端受保护菜单集合加入 `admin.filedetector`
- 前端入口与页面承接:
- `web/src/app/admin/page.tsx`
- 新增后台首页卡片“文件识别”,路由 `/admin/filedetector`,可见性 `file.read | file.manage`
- 新增 `web/src/app/admin/filedetector/page.tsx`
- `export { default } from "../files/page";`
- 复用现有文件管理页面能力承载文件识别菜单交互(挂载切换、目录浏览、创建目录、上传、重命名、移动、删除、下载、加载态/错误态/空态)。
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098126 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`HTTP 200)。
- 远端状态确认:
- `/api/project/requirement/get/304415118593098126` 返回:
- `status=COMPLETED`
- `progressPercent=100`
- `resultMsg=开发完成:状态置为 COMPLETED`
- 验收清单(交付建议):
- 功能点:
- 后台菜单与首页可见“文件识别”,可跳转 `/admin/filedetector`
- 页面可执行目录浏览、创建目录、上传、重命名、移动、删除与下载;
- 权限按 `file.read / file.manage` 生效,topic `admin.files` 刷新链路保持可用。
- 边界场景:
- 未登录访问提示登录;
- 无权限账号访问提示需 `file.read`
- 目录为空时展示空态,不报错。
- 回归点:
- 既有“知识集管理(/admin/knowledge-set)”与“百度网盘(/admin/baidu-pan)”能力保持可用;
- 菜单管理中 `admin.filedetector``admin.baidu_pan``admin.files` 均受保护,不可误删。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动,技能脚本 `changedFiles` 为工作区整体视图,不仅限文件识别模块。
## Work Log - 需求开发(ID: 304415118593098126,文件识别菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098126`(标题:`[fquiz迁移] 文件识别 菜单功能迁移`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`
- 能力落点确认(仓库内已具备,最小改动策略,无新增代码改动):
- 后端菜单种子:`api/app/services/seed_service.py`
- 菜单 `admin.filedetector` 已存在(标题“文件识别”,路径 `/admin/filedetector`,权限 `file.read`)。
- 已加入 `admin` 默认菜单绑定。
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合包含 `admin.filedetector`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合包含 `admin.filedetector`
- 前端页面与入口:
- `web/src/app/admin/filedetector/page.tsx` 已通过 `export { default } from "../files/page";` 复用文件管理能力。
- `web/src/app/admin/page.tsx` 已存在“文件识别”入口卡片并指向 `/admin/filedetector`
- 需求状态流转(脚本):
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098126 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`COMPLETED -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 本需求功能在本仓库已完成迁移,本次为按技能流程断点重启/闭环回写状态,未新增业务代码变更。
## Work Log - 需求开发(ID: 304415118593098129,热搜菜单功能迁移)
- 背景:按 `fquiz-requirement-develop` 技能推进需求 `304415118593098129`(标题:`[fquiz迁移] 热搜 菜单功能迁移`,状态 `OPEN`,优先级 `MEDIUM`)。
- 执行约束:遵循任务要求,不做编译/构建检查与额外回归测试;脚本执行使用 `--skip-build-gate`。当前仓库为脏工作区且需求描述未提供反引号路径线索,按技能门禁显式启用 `--allow-dirty-worktree --allow-broad-change-detection`(按“断点重启”语义推进)。
- 能力落点确认(仓库内已具备,最小改动策略)
- 后端菜单与默认绑定:
- `api/app/services/seed_service.py`
- 菜单 `admin.hot_search` 已存在(标题“热搜”,路径 `/admin/hot-search`,权限 `menu.read`)。
- `admin` 角色默认菜单绑定已包含 `admin.hot_search`
- 菜单保护:
- `api/app/services/admin_service.py` 后端受保护菜单集合包含 `admin.hot_search`
- `web/src/app/admin/menus/page.tsx` 前端受保护菜单集合包含 `admin.hot_search`
- 前端入口与页面:
- `web/src/app/admin/page.tsx` 已存在“热搜”后台入口卡片(`/admin/hot-search`)。
- `web/src/app/admin/hot-search/page.tsx` 已通过 `export { default } from "../data-query/page";` 复用数据查询入口能力。
- `web/src/app/admin/data-query/page.tsx` 已复用系统日志页(`syslog`)承接检索交互。
- 后端热搜能力底座:
- 路由:`api/app/api/v1/hot_search.py``/api/v1/admin/hot-search`)。
- 服务:`api/app/services/hot_search_service.py`(热搜记录检索、关注主题增删改查与默认样例数据)。
- 模型/Schema`api/app/models/hot_search.py``api/app/schemas/hot_search.py`
- 需求状态流转(脚本)
- 命令:
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 304415118593098129 --action full --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
- 轨迹:`OPEN -> IN_PROGRESS(0) -> IN_PROGRESS(30) -> IN_PROGRESS(60) -> IN_PROGRESS(90) -> COMPLETED(100)`HTTP 200)。
- 说明:
- 本次按任务约束未执行构建/编译与额外回归测试。
- 当前仓库存在多需求并行改动;技能脚本 `changedFiles` 为工作区整体视图,不仅限热搜模块。
- 已同步更新长期记忆 `MEMORY.md`:补充 `热搜` 菜单迁移口径(入口复用 + 后端能力底座)。
## Work Log - Radix 菜单改造(Phase A + Phase B
- 背景:
- 按需求“先落地 Phase A + Phase B”推进后台菜单交互改造,目标是在不改接口契约的前提下统一菜单交互形态。
- 执行策略:最小改动,仅替换前端交互承载组件,不调整既有业务逻辑与权限判断。
- 本次改动:
- Phase A(后台壳层菜单)
- `web/src/app/admin/layout.tsx`
- 引入 `DropdownMenu`
- 左侧菜单改为 `md` 及以上显示;移动端新增“菜单”下拉入口,基于 `menuTree` 扁平化列表展示可访问菜单项。
- 顶部账号区将“返回首页/退出登录”按钮收口为“账号”下拉菜单。
- Phase B(操作列统一)
- 新增 `web/src/components/row-action-menu.tsx`
- 封装基于 `@radix-ui/themes` 的通用行操作下拉组件 `RowActionMenu`
- `web/src/app/admin/users/page.tsx`
- 将“启用/禁用、改密码、删除”并排按钮改为 `RowActionMenu`
- `web/src/app/admin/requirements/page.tsx`
- 将“领取、开始处理/标记完成、删除”操作改为 `RowActionMenu`,保留原状态流转与删除确认逻辑。
- `web/src/app/admin/menus/page.tsx`
- 将“编辑/删除”操作改为 `RowActionMenu`,保留受保护菜单删除拦截逻辑。
- 验证:
- `npm run build:web`:通过(Next.js 16TypeScript 阶段通过,页面静态生成完成)。
- `npm run lint:web`:失败,存在仓库既有问题(非本次改动引入):
- `web/src/app/admin/hot-search/page.tsx``react-hooks/set-state-in-effect``react-hooks/exhaustive-deps`
- `web/src/app/admin/jwt-generator/page.tsx``react-hooks/preserve-manual-memoization`
- `web/src/app/admin/life-countdown/page.tsx``react-hooks/set-state-in-effect`
- `web/src/app/admin/password/page.tsx``react-hooks/exhaustive-deps`
- 风险与影响:
- 行操作从直出按钮改为二次点击菜单,短期用户习惯需要适配。
- 移动端后台导航改为下拉入口后,首屏更紧凑;但需要依赖菜单数据加载成功才可展开跳转项。