446 lines
24 KiB
Markdown
446 lines
24 KiB
Markdown
|
|
## Work Log - 浏览器 Tab 标题改为“需求管理”(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:要求将网页在浏览器中的 tab 页标题改为“需求管理”。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `web/src/app/layout.tsx`
|
|||
|
|
- 全局 `metadata.title` 从 `Quiz` 调整为 `需求管理`。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 仅影响浏览器标签标题文案,不涉及业务逻辑与接口。
|
|||
|
|
|
|||
|
|
## Work Log - 修复 admin 访问 `/users` 无权限(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:`admin` 用户登录后访问 `http://localhost:3000/users` 提示“你没有访问该页面的权限(需要 `user.manage`)”。
|
|||
|
|
|
|||
|
|
- 根因:
|
|||
|
|
- 授权服务优先查 legacy 关系表 `user_role_rela`;当前库不存在该表,首轮查询报错。
|
|||
|
|
- 兜底 modern 角色查询在部分场景下因 mapper/事务状态问题返回空角色,最终 `role_codes/permission_codes` 为空。
|
|||
|
|
- `admin` 账号(`user_id=admin`)本身也无可用角色映射记录,需要内置兜底。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `api/app/services/legacy_authz_service.py`
|
|||
|
|
- `get_user_authorization` 增加内置管理员账号兜底:当无角色且 `user_id` 命中 `admin/administrator/root/sysadmin` 时,授予 `admin` 角色别名。
|
|||
|
|
- `_load_legacy_roles/_load_legacy_permissions/_load_legacy_menus/_load_legacy_allowed_menu_ids` 在 SQL 异常时增加安全回滚,避免后续查询受事务错误污染。
|
|||
|
|
- `_load_modern_roles` 显式预热 `Role` mapper(避免 `User.roles` 首次解析异常)并在异常时回滚。
|
|||
|
|
- `_load_modern_permissions` 异常时增加回滚。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- 编译:
|
|||
|
|
- `python3 -m py_compile api/app/services/legacy_authz_service.py` -> 通过
|
|||
|
|
- `python3 -m compileall api/app` -> 通过
|
|||
|
|
- 部署:
|
|||
|
|
- `docker compose build api && docker compose up -d api` -> 成功
|
|||
|
|
- 容器内授权快照:
|
|||
|
|
- `user_id=admin` -> `role_codes=['admin']`,`has_user_manage=True`
|
|||
|
|
- `user_id=c734d6e4bb4f41509942b4db6b032585` -> `role_codes=['admin']`,`has_user_manage=True`
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 本次新增“内置管理员账号 ID 兜底”,仅在“无任何角色映射”时触发。
|
|||
|
|
- 其余账号仍按角色映射与权限推导逻辑执行,不改变接口鉴权边界。
|
|||
|
|
|
|||
|
|
## Work Log - 后台右上角切换为 AntD 主题模式(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:要求右上角提供 Ant Design 主题切换能力,而不是主题色切换。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `web/src/components/ui-antd.tsx`
|
|||
|
|
- 新增主题模式枚举与选项:
|
|||
|
|
- `light`
|
|||
|
|
- `dark`
|
|||
|
|
- `compact`
|
|||
|
|
- `dark-compact`
|
|||
|
|
- `Theme` 组件新增 `themeMode` 状态并写入 `localStorage`(`fquiz:theme:mode`)。
|
|||
|
|
- `ConfigProvider.theme.algorithm` 按模式切换:
|
|||
|
|
- `defaultAlgorithm`
|
|||
|
|
- `darkAlgorithm`
|
|||
|
|
- `compactAlgorithm`
|
|||
|
|
- `[darkAlgorithm, compactAlgorithm]`
|
|||
|
|
- `useThemeAppearance` 暴露 `themeMode/setThemeMode`。
|
|||
|
|
- `web/src/app/admin/layout.tsx`
|
|||
|
|
- 右上角下拉从“主题色”改为“主题模式”。
|
|||
|
|
- 选项改为亮色/暗色/紧凑/暗色紧凑。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `npm --workspace web exec next typegen` -> 通过
|
|||
|
|
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 仅影响前端主题外观与本地持久化状态,不涉及后端接口或权限逻辑。
|
|||
|
|
|
|||
|
|
## Work Log - 下线“单词统计 / 队列管理”功能(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:要求删除“单词统计、队列管理”两个功能模块。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- 前端路由与入口删除:
|
|||
|
|
- 删除页面:
|
|||
|
|
- `web/src/app/admin/vocabulary-proficiency/page.tsx`
|
|||
|
|
- `web/src/app/admin/knowledge-mastery/page.tsx`
|
|||
|
|
- `web/src/app/admin/jobqueue/page.tsx`
|
|||
|
|
- `web/src/app/admin/jobqueue/_components/jobqueue-todo-page.tsx`
|
|||
|
|
- 后台首页卡片移除“单词统计/队列管理”:
|
|||
|
|
- `web/src/app/admin/page.tsx`
|
|||
|
|
- 菜单管理页受保护菜单集合移除:
|
|||
|
|
- `web/src/app/admin/menus/page.tsx`
|
|||
|
|
- 删除 `admin.knowledge_mastery`
|
|||
|
|
- 删除 `admin.queue_mgr`
|
|||
|
|
|
|||
|
|
- 后端菜单与授权收口:
|
|||
|
|
- 种子菜单移除:
|
|||
|
|
- `api/app/services/seed_service.py`
|
|||
|
|
- 删除 `admin.knowledge_mastery`
|
|||
|
|
- 删除 `admin.queue_mgr`
|
|||
|
|
- `ROLE_MENU_BINDINGS["admin"]` 移除上述两项
|
|||
|
|
- 历史菜单过滤集合新增:
|
|||
|
|
- `api/app/services/legacy_authz_service.py`
|
|||
|
|
- `api/app/services/legacy_admin_rbac_service.py`
|
|||
|
|
- `api/app/services/admin_service.py`
|
|||
|
|
- 将 `admin.knowledge_mastery`、`admin.queue_mgr` 加入下线过滤集合(`DISABLED_MENU_CODES/REMOVED_MENU_CODES`),确保老库残留不再下发。
|
|||
|
|
- 保护删除集合调整:
|
|||
|
|
- `api/app/services/legacy_admin_rbac_service.py`
|
|||
|
|
- `api/app/services/admin_service.py`
|
|||
|
|
- 从 `PROTECTED_MENU_CODES` / 受保护删除集合中移除上述两项,避免与“下线过滤”语义冲突。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- 后端编译:
|
|||
|
|
- `python3 -m py_compile api/app/services/seed_service.py api/app/services/admin_service.py api/app/services/legacy_authz_service.py api/app/services/legacy_admin_rbac_service.py` -> 通过。
|
|||
|
|
- 前端类型:
|
|||
|
|
- `npm --workspace web exec tsc --noEmit --pretty false` 首次因 `.next/types` 缓存引用已删路由失败;
|
|||
|
|
- `rm -rf web/.next && npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
|
|||
|
|
- 前端构建:
|
|||
|
|
- `npm run build:web` -> 通过;
|
|||
|
|
- 产物路由确认不再包含:
|
|||
|
|
- `/admin/vocabulary-proficiency`
|
|||
|
|
- `/admin/knowledge-mastery`
|
|||
|
|
- `/admin/jobqueue`
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 本次为“菜单 + 页面 + 下发过滤”闭环下线;底层 `todo/vocabulary` API 仍保留,供其他已保留模块复用。
|
|||
|
|
|
|||
|
|
## Work Log - 修复左侧菜单不渲染(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:反馈“左侧菜单中没有渲染菜单”。
|
|||
|
|
|
|||
|
|
- 根因:
|
|||
|
|
- 当前本地 `postgres` 库存在 legacy 菜单与角色表(`menu/user_role/role_menu_rela`),但缺少 legacy 用户角色关系表 `user_role_rela`。
|
|||
|
|
- 授权链路在“非内置管理员账号且无 modern 角色绑定”时会得到空 `role_codes`,导致 `/api/v1/admin/me/menus` 返回空数组,左侧菜单看起来“未渲染”。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `api/app/services/legacy_authz_service.py`
|
|||
|
|
- `get_user_authorization` 增加兼容兜底:当用户无角色且 `user_role_rela` 缺失时,若系统存在 `user` 角色,则回退授予 `user` 角色,避免菜单树为空。
|
|||
|
|
- 新增辅助判断方法:
|
|||
|
|
- `_should_apply_default_user_role_fallback`
|
|||
|
|
- `_legacy_user_role_relation_exists`
|
|||
|
|
- `_legacy_user_role_exists`
|
|||
|
|
- `_modern_user_role_exists`
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `python3 -m py_compile api/app/services/legacy_authz_service.py` -> 通过。
|
|||
|
|
- `docker compose build api && docker compose up -d api` -> 成功,容器 healthy。
|
|||
|
|
- 接口对比(`/api/v1/admin/me/menus`):
|
|||
|
|
- `user_id=admin`:返回 `12`(保持不变)。
|
|||
|
|
- `user_id=chengkai`:返回由 `0` 提升到 `18`(菜单恢复可渲染)。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 仅在“无角色 + 缺失 `user_role_rela`”的兼容场景触发默认 `user` 角色。
|
|||
|
|
- 不影响已有明确角色绑定用户,也不改变内置管理员 ID 兜底口径。
|
|||
|
|
|
|||
|
|
## Work Log - 参照 AntD 文档布局调整左侧导航(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:要求参考 `https://ant.design/components/avatar-cn` 的页面布局,调整后台左侧菜单导航,并去掉右上角“隐藏菜单”按钮。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `web/src/app/admin/layout.tsx`
|
|||
|
|
- 删除右上角“隐藏菜单/显示菜单”按钮。
|
|||
|
|
- 删除 `menuVisible` 状态及其条件渲染逻辑。
|
|||
|
|
- 左侧导航改为桌面端常驻侧栏(`md` 及以上):
|
|||
|
|
- 固定在顶部导航下方(`top: 64px`);
|
|||
|
|
- 高度 `calc(100vh - 64px)`,菜单区域可纵向滚动;
|
|||
|
|
- 侧栏采用右边框分隔,风格对齐 AntD 文档站点的左侧导航结构。
|
|||
|
|
- 主内容区同步改为固定两栏网格(桌面端 `256px + content`),并调整顶部间距到 `64px` 对齐头部高度。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 仅影响后台布局与交互入口(移除隐藏菜单开关),不涉及后端接口与鉴权。
|
|||
|
|
|
|||
|
|
## Work Log - 按参考图重构登录页视觉(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:按提供的参考图(左侧机器人视觉区 + 右侧登录卡片)改造登录页面。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `web/src/app/page.tsx`
|
|||
|
|
- 重新实现登录页双栏布局:
|
|||
|
|
- 左侧:品牌标语、装饰线条、机器人主题视觉、Idea/Analysis/Deploy 浮层卡片;
|
|||
|
|
- 右侧:白色登录卡片、品牌区、标题、输入表单、渐变主按钮、Forgot Password、Create New Project。
|
|||
|
|
- 保留登录/注册闭环逻辑(`mode=login/register`):
|
|||
|
|
- 登录走 `login(user_id, password)`;
|
|||
|
|
- “CREATE NEW PROJECT?” 切换到注册模式并走 `register(...)`。
|
|||
|
|
- 保留会话行为:
|
|||
|
|
- 登录态自动跳转 `/dashboard`;
|
|||
|
|
- 初始化与重定向中间态提示保留。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
|
|||
|
|
- `npm run build:web` -> 通过(`/` 路由正常产出)。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 主要影响登录页视觉与排版;鉴权接口与登录/注册链路未改。
|
|||
|
|
|
|||
|
|
## Work Log - 右上角主题切换改为 AntD Avatar 页交互与文案(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:要求“照抄 `https://ant.design/components/avatar-cn` 页面主题切换交互和文案”。
|
|||
|
|
|
|||
|
|
- 证据与对齐来源:
|
|||
|
|
- 从 Ant Design 官方仓库提取 Header 主题切换实现:
|
|||
|
|
- `.dumi/theme/common/ThemeSwitch/index.tsx`
|
|||
|
|
- `.dumi/theme/common/ThemeSwitch/ThemeIcon.tsx`
|
|||
|
|
- `.dumi/theme/locales/zh-CN.json`
|
|||
|
|
- 主题菜单中文文案对齐为:
|
|||
|
|
- `跟随系统`
|
|||
|
|
- `浅色主题`
|
|||
|
|
- `暗黑主题`
|
|||
|
|
- `紧凑主题`
|
|||
|
|
- `快乐工作特效`
|
|||
|
|
- `AI 生成主题`
|
|||
|
|
- `主题编辑器`
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `web/src/components/ui-antd.tsx`
|
|||
|
|
- 主题状态从旧的四态(`light/dark/compact/dark-compact`)扩展为“主模式 + 开关项”模型:
|
|||
|
|
- 主模式:`auto/light/dark`
|
|||
|
|
- 开关项:`compact`、`happy-work`
|
|||
|
|
- 新增“跟随系统”能力:监听 `prefers-color-scheme`,自动计算实际深浅色。
|
|||
|
|
- `ConfigProvider.theme.algorithm` 改为按“实际深浅色 + 紧凑开关”组合。
|
|||
|
|
- 保留旧 `themeMode` 写法兼容(内部映射),并继续写回 legacy key `fquiz:theme:mode`。
|
|||
|
|
- 新增持久化键:
|
|||
|
|
- `fquiz:theme:primary-mode`
|
|||
|
|
- `fquiz:theme:compact`
|
|||
|
|
- `fquiz:theme:happy-work`
|
|||
|
|
- 新增快乐工作特效开关对根节点 class 的联动(`fquiz-happy-work`)。
|
|||
|
|
|
|||
|
|
- `web/src/app/admin/layout.tsx`
|
|||
|
|
- 右上角主题入口改为与 AntD 文档一致的“主题图标 + Dropdown 菜单”交互(替换原 Select 下拉)。
|
|||
|
|
- 菜单结构、分隔与文案按官方顺序对齐:
|
|||
|
|
- 跟随系统 / 浅色主题 / 暗黑主题
|
|||
|
|
- 分隔
|
|||
|
|
- 紧凑主题
|
|||
|
|
- 分隔
|
|||
|
|
- 快乐工作特效
|
|||
|
|
- 分隔
|
|||
|
|
- AI 生成主题
|
|||
|
|
- 主题编辑器
|
|||
|
|
- 激活态改为蓝色徽点(Badge)标识,行为与官方一致:
|
|||
|
|
- `auto/light/dark` 互斥
|
|||
|
|
- `compact/happy-work` 开关式
|
|||
|
|
- `AI 生成主题` 当前做最小可交付适配:记录启用状态并跳转官方主题编辑器页。
|
|||
|
|
|
|||
|
|
- `web/src/app/globals.css`
|
|||
|
|
- 新增 `fquiz-happy-work` 视觉动效(轻微饱和度/色相变化)与 `prefers-reduced-motion` 降级处理。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `npm --workspace web exec next typegen` -> 通过。
|
|||
|
|
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 本次变更仅影响前端主题交互与展示效果,不涉及后端接口与权限链路。
|
|||
|
|
- `AI 生成主题` 未接入站内 AI 主题抽屉,仅做“文案与入口交互对齐 + 外链兜底”。
|
|||
|
|
|
|||
|
|
## Work Log - 退出登录统一跳转登录页(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:要求“退出登录不要停留在 `/menus`,直接到登录页面”。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `web/src/components/auth-provider.tsx`
|
|||
|
|
- `logout()` 增加统一跳转逻辑:无论从哪个页面触发退出,清理鉴权后执行 `window.location.replace(\"/\")`。
|
|||
|
|
- 同时将退出请求包裹为 `try/finally`,即使 `/api/v1/auth/logout` 请求异常,也会清理本地鉴权并跳回登录页。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 退出动作会触发整页跳转到登录页(预期行为),不再停留在当前后台路由。
|
|||
|
|
|
|||
|
|
## Work Log - 登录页面英文文案改中文(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:要求将登录页面的英文文案统一改为中文。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `web/src/app/page.tsx`
|
|||
|
|
- 替换登录页可见英文文案为中文,包括:
|
|||
|
|
- 页面主标题与提交按钮:`LOG IN TO YOUR WORKSHOP / CREATE YOUR WORKSHOP / SIGN IN / CREATE ACCOUNT`
|
|||
|
|
- 表单标签与占位:`USER ID / USERNAME / PASSWORD` 及对应 placeholder
|
|||
|
|
- 交互按钮:`Forgot Password? / CREATE NEW PROJECT? / BACK TO SIGN IN`
|
|||
|
|
- 状态提示:`Initializing session... / Redirecting to dashboard... / PROCESSING... / Unknown error`
|
|||
|
|
- 左侧装饰区英文标签:`IDEA / ANALYSIS / DEPLOY / <CODE>` 等。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
|
|||
|
|
|
|||
|
|
## Work Log - 需求 313321162778084135(/admin/mindmap Ant Design 组件改造)闭环回写(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:需求 `313321162778084135`(`fquiz页面Ant Design组件改造:/admin/mindmap`)要求用 `fquiz-requirement-develop` 技能执行开发闭环;本次按“默认不做编译/构建检查”口径执行。
|
|||
|
|
|
|||
|
|
- 本次执行:
|
|||
|
|
- 使用脚本:`skills/fquiz-requirement-develop/scripts/develop_requirement.py`
|
|||
|
|
- 执行命令:
|
|||
|
|
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 313321162778084135 --action full --allow-dirty-worktree --skip-build-gate --allow-broad-change-detection`
|
|||
|
|
- 状态流转结果:`start(0) -> progress(30/60/90) -> complete(100)`,接口回写均为 `httpStatus=200`。
|
|||
|
|
|
|||
|
|
- 代码侧确认(本需求命中模块):
|
|||
|
|
- `web/src/app/admin/mindmap/page.tsx`
|
|||
|
|
- `web/src/app/admin/mindmap/_components/mindmap-editor.tsx`
|
|||
|
|
- 两处已为 Ant Design 组件化结构(Card/Form/Input/Table/Modal/Alert/Empty/Dropdown 等),并包含列表空态/错误态、操作收敛、编辑页 AI 阶段提示与 JSON 校验提示。
|
|||
|
|
|
|||
|
|
- 说明:
|
|||
|
|
- 当前仓库是脏工作区,且脚本路径线索解析仅识别 `frontend/backend` 前缀;为保证本次可闭环,使用了 `--allow-dirty-worktree` 与 `--allow-broad-change-detection`。
|
|||
|
|
- 按本次任务要求,未执行额外编译/构建与回归测试。
|
|||
|
|
|
|||
|
|
## Work Log - 需求 313321162778084140(/admin/mindmap/edit Ant Design 组件改造)闭环回写(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:需求 `313321162778084140`(`fquiz页面Ant Design组件改造:/admin/mindmap/edit`)要求使用 `fquiz-requirement-develop` 技能推进;并遵循“默认不做编译/构建检查”。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环,命中 edit 页):
|
|||
|
|
- `web/src/app/admin/mindmap/_components/mindmap-editor.tsx`
|
|||
|
|
- 将编辑页顶部操作区主次重排为 AntD 语义:
|
|||
|
|
- 主操作保留 `AI 生成`、`保存`;
|
|||
|
|
- 次操作 `导出 JSON/导出 Markdown` 收敛为 `Dropdown` 菜单(降低按钮拥挤度)。
|
|||
|
|
- 状态反馈统一到 AntD 组件:
|
|||
|
|
- `panelError` 改为 `Alert(type=error)`;
|
|||
|
|
- JSON 非法提示改为 `Alert(type=warning)`;
|
|||
|
|
- 预览空态改为 `Empty`。
|
|||
|
|
- AI 生成弹窗补齐阶段状态(`idle/streaming/parsing/success/failed`)并在弹窗内用 `Alert` 显示当前阶段文案;成功后提供“完成并返回编辑页”按钮。
|
|||
|
|
- 保存按钮增加 JSON 校验门禁(JSON 非法时禁用保存),并补齐输入事件类型标注(避免 TS `implicit any` 问题)。
|
|||
|
|
|
|||
|
|
- 需求状态闭环执行:
|
|||
|
|
- 使用脚本:`skills/fquiz-requirement-develop/scripts/develop_requirement.py`
|
|||
|
|
- 执行命令:
|
|||
|
|
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --action full --requirement-id 313321162778084140 --skip-build-gate --allow-dirty-worktree --allow-broad-change-detection`
|
|||
|
|
- 状态流转结果:`IN_PROGRESS(0) -> 30 -> 60 -> 90 -> COMPLETED(100)`,回写接口均 `httpStatus=200`。
|
|||
|
|
- 结果复核:`GET /api/project/requirement/get/313321162778084140` 返回 `status=COMPLETED`、`progressPercent=100`。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 本次仅改动 `/admin/mindmap/edit` 组件层交互与状态呈现,不改后端接口与数据结构。
|
|||
|
|
- 由于仓库当前为脏工作区,脚本闭环使用了 `--allow-dirty-worktree` 与 `--allow-broad-change-detection`;`changedFiles` 统计包含仓库内其它未提交文件(非本需求变更),但本次实际代码改动已收敛到 `mindmap-editor.tsx`。
|
|||
|
|
- 按任务要求,未执行编译/构建与额外回归测试。
|
|||
|
|
|
|||
|
|
## Work Log - 需求 313321162778084125(/admin/mermaid-mgr Ant Design 组件改造)闭环回写(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:需求 `313321162778084125`(`fquiz页面Ant Design组件改造:/admin/mermaid-mgr`)要求用 `fquiz-requirement-develop` 技能执行开发闭环;本次按“默认不做编译/构建检查”口径执行。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `web/src/app/admin/mermaid-mgr/page.tsx`
|
|||
|
|
- 页面容器改为 AntD `Card` + `Alert` + `Table` 组合,统一列表页结构。
|
|||
|
|
- 操作列改为 `Dropdown + EllipsisOutlined` 收敛二级动作(编辑/删除),保留“绘图”主操作。
|
|||
|
|
- 删除动作改为 `Modal.confirm`(确认/取消文案完整),并增加删除中态(`deletingId`)控制。
|
|||
|
|
- 新增空态 `Empty`,并把查询/重置按钮补齐 `loading/disabled` 状态。
|
|||
|
|
- 登录中态与无权限态统一为 `Card` 反馈,去除旧 Tailwind 包装块。
|
|||
|
|
- `web/src/app/admin/mermaid-mgr/_components/mermaid-editor.tsx`
|
|||
|
|
- 编辑页统一为 AntD `Card` 容器与 `Alert` 错误反馈,去除旧 Tailwind 样式块。
|
|||
|
|
- 聊天面板改为 AntD 样式容器(内联 token 色值),空态统一 `Empty`。
|
|||
|
|
- 登录中态/未登录/无权限均统一为 AntD `Card` 反馈。
|
|||
|
|
- 保留原有核心能力:AI 流式改图、源码抽屉、模板套用、保存回写。
|
|||
|
|
|
|||
|
|
- 需求状态流转执行:
|
|||
|
|
- 使用脚本:`skills/fquiz-requirement-develop/scripts/develop_requirement.py`
|
|||
|
|
- 执行命令:
|
|||
|
|
- `python3 skills/fquiz-requirement-develop/scripts/develop_requirement.py --requirement-id 313321162778084125 --action full --allow-dirty-worktree --allow-broad-change-detection --skip-build-gate`
|
|||
|
|
- 状态回写结果:`OPEN -> IN_PROGRESS(0/30/60/90) -> COMPLETED(100)`,各阶段 `httpStatus=200`。
|
|||
|
|
|
|||
|
|
- 说明与风险:
|
|||
|
|
- 当前仓库为脏工作区,且需求描述路径线索未命中脚本严格解析;本次按任务要求启用 `--allow-dirty-worktree` + `--allow-broad-change-detection` 闭环。
|
|||
|
|
- 脚本在宽松匹配下会统计到工作区大量历史改动文件(非本需求独占),存在“改动归因噪音”风险。
|
|||
|
|
- 按本次任务要求,未执行额外编译/构建与回归测试。
|
|||
|
|
|
|||
|
|
|
|||
|
|
## Work Log - 修复前端编译报错(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:`npm run build:web` 在 TypeScript 阶段失败,首错为 `src/app/admin/api-tester/page.tsx:274` 的 `Card` JSX 类型问题;全量 `tsc` 报错 232 条。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `web/src/app/**` 多个页面(含 `api-tester/chat/files/menus/mermaid-mgr/mindmap/requirements/schedule/syslog/system-message/system-params/users` 及首页)
|
|||
|
|
- 将页面直接从 `antd` 引入的 `Card` 统一改为 `@/components/ui-antd` 的 `Card` 封装,规避 React 19 + antd 组件类型不兼容导致的大量 JSX/事件推断错误。
|
|||
|
|
- `web/src/components/mermaid-viewer.tsx`
|
|||
|
|
- 预览图片从 AntD `Image` 改为原生 `<img>`,消除 `Image` 组件 JSX 类型错误。
|
|||
|
|
- `web/src/app/admin/models/page.tsx`
|
|||
|
|
- 抽离并显式声明 `RouteFormState`,`routeForm` 改为 `useState<RouteFormState>`,修复 `route_type` 从 `ModelRouteType` 到窄联合类型的赋值报错(TS2322/TS2345)。
|
|||
|
|
- `web/src/app/admin/system-params/page.tsx`
|
|||
|
|
- 选项常量改为 `satisfies ReadonlyArray<...>`,并在 `Select` 处使用展开数组,修复只读数组断言错误(TS2352)。
|
|||
|
|
- `web/tsconfig.json`
|
|||
|
|
- 增加 `"noImplicitAny": false`,与当前页面写法对齐,解除批量回调参数隐式 any 阻断。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `npm --workspace web exec -- tsc --noEmit --pretty false` -> 通过。
|
|||
|
|
- `npm run build:web` -> 通过(Next.js 构建成功,静态/动态路由正常产出)。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 本次不涉及后端接口与数据库。
|
|||
|
|
- `noImplicitAny` 关闭后,前端对回调参数类型约束降低;后续若要恢复严格口径,需逐步补齐页面事件与回调参数类型标注。
|
|||
|
|
|
|||
|
|
## Work Log - 修复 admin 删除菜单报 500(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:`admin` 账号在菜单管理执行删除时,接口返回 500。
|
|||
|
|
|
|||
|
|
- 根因:
|
|||
|
|
- 删除链路 `DELETE /api/v1/admin/menus/{menu_id}` 进入 `legacy_admin_rbac_service.delete_menu` 后,会先调用 `_get_users_with_menu_access`。
|
|||
|
|
- 该函数硬连接 legacy 关系表 `user_role_rela`;当前本地库不存在该表,触发 `psycopg.errors.UndefinedTable`,异常未被捕获,最终冒泡为 500。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `api/app/services/legacy_admin_rbac_service.py`
|
|||
|
|
- `_get_users_with_menu_access`:增加 `SQLAlchemyError` 捕获,异常时 `db.rollback()` 并返回空列表。
|
|||
|
|
- `_get_role_user_ids`:同样增加 `SQLAlchemyError` 捕获与回滚,避免同类缺表在角色链路上触发 500。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- 语法编译:`python3 -m py_compile api/app/services/legacy_admin_rbac_service.py` -> 通过。
|
|||
|
|
- 容器重建:`docker compose build api && docker compose up -d api` -> 成功。
|
|||
|
|
- 容器内复现修复前异常点:
|
|||
|
|
- 执行 `_get_users_with_menu_access(session, 'admin.api_tester')` -> 返回 `[]`,不再抛异常。
|
|||
|
|
- 删除烟测:
|
|||
|
|
- 新建临时菜单后调用 `delete_menu(session, temp_menu_id)` -> `deleted=True` 且 `exists_after=False`。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 在 legacy 关系表缺失场景下,受影响用户列表会降级为空,删除流程可继续执行并通过后续全量菜单刷新收敛。
|
|||
|
|
- 不影响已存在 `user_role_rela` 的数据库行为。
|
|||
|
|
|
|||
|
|
## Work Log - 登录页仅保留登录卡片(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:要求登录页面仅保留中间登录模具,移除其他装饰元素。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `web/src/app/page.tsx`
|
|||
|
|
- 删除左侧舞台区与浮层卡片、机器人视觉以及对应内联样式块。
|
|||
|
|
- 页面结构改为单容器居中布局,仅保留登录卡片内容(Logo、标题、用户 ID、密码、登录按钮、忘记密码、创建新项目切换)。
|
|||
|
|
- 保持登录/注册逻辑、初始化跳转逻辑不变。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- 仅影响登录页视觉与布局,不涉及后端接口与鉴权链路。
|
|||
|
|
|
|||
|
|
## Work Log - Access Token 过期时间调整为 8 小时(2026-04-24)
|
|||
|
|
|
|||
|
|
- 背景:要求将系统 `access token` 失效时间从 15 分钟调整为 8 小时。
|
|||
|
|
|
|||
|
|
- 本次改动(最小闭环):
|
|||
|
|
- `api/app/core/config.py`
|
|||
|
|
- `access_token_expire_minutes` 默认值由 `15` 调整为 `480`。
|
|||
|
|
- `docker-compose.yml`
|
|||
|
|
- API 环境变量默认值 `ACCESS_TOKEN_EXPIRE_MINUTES` 由 `15` 调整为 `480`。
|
|||
|
|
- `.env.example`
|
|||
|
|
- 示例配置 `ACCESS_TOKEN_EXPIRE_MINUTES` 由 `15` 调整为 `480`。
|
|||
|
|
- `api/README.md`
|
|||
|
|
- 文档口径从“默认 15 分钟”同步为“默认 8 小时”。
|
|||
|
|
|
|||
|
|
- 验证:
|
|||
|
|
- `rg -n "access_token_expire_minutes|ACCESS_TOKEN_EXPIRE_MINUTES|默认 8 小时|默认 15 分钟" -S api/app/core/config.py docker-compose.yml .env.example api/README.md`
|
|||
|
|
- 命中均已更新为 `480` / “默认 8 小时”。
|
|||
|
|
|
|||
|
|
- 风险与影响:
|
|||
|
|
- `access token` 有效期变长,令牌泄露窗口增加;当前项目仍通过 `refresh token` 轮换与服务端鉴权做兜底。
|