Files
fquiz/memory/2026-06-20.md
T
2026-06-20 08:17:14 +08:00

20 KiB
Raw Blame History

Work Log - 菜单管理页面一致性优化(FL-151)

  • 背景:

    • 菜单管理页需要继续对齐用户管理页的消息反馈、筛选表单、空态与表格滚动配置规范。
  • 本次处理:

    • 移除菜单管理页对 App.useApp() 的依赖,创建、编辑、删除结果统一走 error / success state + useToastFeedback
    • 桌面筛选表单项由 Tailwind min-w-* 改为与用户管理页一致的 style={{ width: ... }}
    • 表格空态 Empty 属性顺序调整为 image 在前、description 在后。
    • 移除菜单表格 scroll.x,仅保留纵向滚动配置,与用户管理页保持一致。
  • 验证:

    • 基线:npm --workspace web exec eslint src/app/admin/menus/page.tsx 通过。
    • 基线:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/menus/page.tsx 通过。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
  • 风险与关注点:

    • 改动仅影响菜单管理页前端展示与提示机制,不改变菜单接口、字段结构或权限语义。

Follow-up - 菜单管理页 React Query 架构对齐(FL-151

  • 背景:

    • 评审继续指出菜单管理页仍使用手动 useState + loadMenus 数据管理,与用户管理页 React Query 架构不一致。
  • 本次处理:

    • 菜单列表查询改为 useQuery,由 menusQuery 承接 loading、error、数据与 total。
    • 创建、编辑、删除、启用/禁用改为 useMutation,并通过 queryClient.refetchQueries 刷新菜单数据。
    • activeKeyword 统一命名为 searchKeyword,移除手动 loading / saving / menus / menuTotal state。
    • 实时订阅改为 queryClient.invalidateQueries({ queryKey: ["admin.menus"] })
    • 错误反馈改为组合本地错误与 menusQuery.error 后交给 useToastFeedback
  • 验证:

    • 基线:npm --workspace web exec eslint src/app/admin/menus/page.tsx 通过。
    • 基线:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/menus/page.tsx 通过。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
  • 风险与关注点:

    • 改动仅迁移菜单管理页前端数据管理架构,不改变 /api/v1/admin/menus* 接口路径、请求字段或权限语义。

Work Log - 角色管理页对齐用户管理页规范(FL-152)

  • 背景:

    • 角色管理页需对齐用户管理页的后台列表页布局、移动卡片、操作区换行和反馈规范。
  • 本次处理:

    • 角色表格操作区改为与用户管理页一致的 Space wrap,避免小屏或窄列下按钮挤压。
    • 角色移动卡片标题改为名称 + 编码横向信息结构,并补齐“角色编码 / 角色名称 / 菜单”字段网格,视觉和信息密度对齐用户移动卡片。
    • 角色菜单多选保留现有接口与字段结构,不改动后端 RBAC 合约。
  • 验证:

    • 基线:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/roles/page.tsx 通过,仅用户页存在 1 条既有 unused eslint-disable warning。
    • 修改后:npm --workspace web exec eslint src/app/admin/roles/page.tsx --max-warnings=0 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/roles/page.tsx 通过,仍仅用户页 1 条既有 warning。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
  • 风险与关注点:

    • 改动仅影响角色管理页前端展示与交互排布,不改变接口路径、请求/响应字段、权限判断或角色 CRUD 语义。

Follow-up - 角色管理页细节一致性补齐(FL-152)

  • 背景:

    • 评审继续指出角色管理页在搜索文案、角色编码校验、移动端操作丰富度等方面仍与用户管理页存在细节差异。
  • 本次处理:

    • 搜索占位文案统一为“按角色编码/名称/菜单搜索”,对齐用户管理页“按...搜索”的表达方式。
    • 新建角色表单新增角色编码格式校验、500ms 防抖重复检查和提交前重复检查,复用现有 /api/v1/admin/roles 列表接口做精确 code 命中判断。
    • 角色移动卡片更多菜单补齐“编辑”和“查看菜单”,删除仍使用 Modal.confirm,保持与用户卡片的操作入口组织方式一致。
    • 确认角色 schema 仅包含 code/name/permission_codes/menu_ids,无 status 字段,因此未新增状态筛选器,避免引入未支持的数据模型语义。
  • 验证:

    • 基线:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/roles/page.tsx 通过,仅用户页存在 1 条既有 unused eslint-disable warning。
    • 修改后:npm --workspace web exec eslint src/app/admin/roles/page.tsx --max-warnings=0 通过。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/roles/page.tsx 通过,仍仅用户页 1 条既有 warning。
  • 风险与关注点:

    • 角色编码重复检查依赖现有角色列表 keyword 查询做前端预检查;服务端创建接口和数据库唯一约束仍是最终一致性保护。
    • 改动仅影响角色管理页前端,不改变后端接口、schema 或权限语义。

Work Log - 系统参数管理页一致性优化(FL-153)

  • 背景:

    • 系统参数管理页需要对齐用户管理页的列表布局、权限呈现、移动卡片、反馈校验与分页交互规范。
  • 本次处理:

    • 系统参数页新建入口改为仅 system_param.manage 权限可见,保持只读权限下的页面呈现与实际操作权限一致。
    • 表格配置对齐用户管理页:tableLayout="fixed"、仅纵向滚动、空态属性顺序、加载态和分页最小 total 处理保持一致。
    • 移动卡片状态 Tag 文案与颜色对齐用户管理页,并补齐 card view 数据累积的 requestAnimationFrame 时序处理。
    • 新建/编辑弹窗补齐 autoComplete="off"、字段长度规则、参数键防抖重复检查和提交前重复检查。
    • 后端系统参数列表接口补齐 limit/offset 查询参数并在 service 层实际分页,修复前端分页参数此前未生效的问题。
    • 新增 api/tests/test_system_param_service.py 覆盖系统参数列表分页与筛选后分页行为。
  • 验证:

    • 基线:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/system-params/page.tsx 通过,仅用户页存在 1 条既有 unused eslint-disable warning。
    • 基线:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/system-params/page.tsx --max-warnings=0 通过。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:python3 -m py_compile api/app/api/v1/system_params.py api/app/services/system_param_service.py api/tests/test_system_param_service.py 通过。
    • 修改后:UV_PYTHON_INSTALL_DIR=/tmp/fquiz-uv-python uv run --cache-dir /tmp/fquiz-uv-cache --python 3.11 --with fastapi --with pydantic-settings --with sqlalchemy --with PyJWT --with argon2-cffi --with email-validator --with bcrypt -m unittest api.tests.test_system_param_service 通过。
  • 风险与关注点:

    • 改动涉及系统参数列表接口分页契约,但不改变请求/响应字段结构、权限码或 CRUD 语义。
    • 当前本机 python3 为 3.7.9,不满足 api/pyproject.tomlrequires-python >=3.10;后端单测使用 uv 管理的 Python 3.11 环境验证。

Work Log - 系统消息页面一致性优化(FL-154)

  • 背景:

    • 系统消息页面需对齐用户管理页的后台列表页布局、动态表格高度、移动卡片视图和无限滚动交互。
  • 本次处理:

    • 系统消息页补齐表格 body 最小高度 CSS 钩子,动态 scroll.y 对应的 CSS 变量现已生效。
    • 移动端卡片视图改为与用户管理页一致的容器、空态、卡片视觉和字段网格样式,移除卡片字段内散落的内联间距。
    • 移动卡片累积列表改为 requestAnimationFrame 内更新,避免 React hooks lint 的同步 effect 更新错误;筛选切换直接重置卡片分页和累积数据。
    • 系统消息列表 API 增加可选 message_type 查询参数,服务端按类型/未读状态返回匹配 itemstotal,保证移动端无限滚动的 total 与当前筛选一致;unread_count 仍保持用户全局未读数。
    • 补充系统消息服务层测试覆盖类型筛选后的 total 行为。
  • 验证:

    • 基线:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/system-messages/page.tsx 失败,系统消息页存在 2 个 react-hooks/set-state-in-effect 既有错误;用户页存在 1 条既有 unused eslint-disable warning。
    • 基线:npm --workspace web exec tsc --noEmit 通过。
    • 基线:python -m pytest api/tests/test_system_message_service.py api/tests/test_system_message_schema.py 因系统 python 缺少 pytest 无法执行。
    • 修改后:npm --workspace web exec eslint src/app/admin/system-messages/page.tsx --max-warnings=0 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/system-messages/page.tsx 通过,仍仅用户页 1 条既有 warning。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:UV_CACHE_DIR=/tmp/fquiz-uv-cache UV_PYTHON_INSTALL_DIR=/tmp/fquiz-uv-python /home/jenkins/.local/bin/uv run --python 3.11 --with pytest --with fastapi --with pydantic-settings --with sqlalchemy --with PyJWT --with argon2-cffi --with email-validator --with python-multipart --with psycopg[binary] pytest api/tests/test_system_message_service.py api/tests/test_system_message_schema.py 通过,4 passed,存在 1 条既有 SQLAlchemy relationship warning。
  • 风险与关注点:

    • /api/v1/system-messages/me 新增可选 message_type 参数,未传参时保持原列表语义;前端不再做本地类型过滤,分页 total 与服务端过滤结果一致。
    • 改动影响系统消息列表展示与筛选,不改变创建、删除、标记已读接口字段。

Work Log - 菜单管理页面最终细节对齐(FL-155)

  • 背景:

    • 菜单管理页需要补齐启用/禁用 mutation 组织、移动卡片字段列宽和加载完成提示条件三处细节,与用户管理页保持一致。
  • 本次处理:

    • 菜单启用/禁用移除独立 updateMenuStatusMutation,改为复用 updateMenuMutation 通过 PATCH /api/v1/admin/menus/{menuId} 提交 { status }
    • .admin-menus-menu-card-field 标签列宽从 72px 调整为 64px
    • 移动卡片“已加载全部”提示条件简化为 allLoadedMenus.length >= menuTotal && allLoadedMenus.length > 0
  • 验证:

    • 基线:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/menus/page.tsx --max-warnings=0 通过。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
  • 风险与关注点:

    • 改动仅影响菜单管理页前端数据 mutation 组织和移动端展示条件,不改变接口路径、请求/响应字段或权限语义。

Work Log - Worker监控页面一致性优化(FL-157)

  • 背景:

    • Worker监控页需对齐用户管理页的后台列表页外层卡片、筛选表单、表格空态、移动端卡片和反馈规范。
  • 本次处理:

    • Worker监控页外层容器改为与用户管理页一致的 page-card flex 布局,筛选项改为固定宽度表单项,自动刷新与刷新操作收口到标题右侧。
    • 桌面表格对齐用户页:启用 tableLayout="fixed"、统一 loading / pagination / Empty 写法,仅保留纵向动态滚动。
    • 新增移动端卡片视图,按用户页卡片规范展示执行节点、状态、队列、并发/预取、任务统计、累计处理、注册任务和最近心跳。
    • 错误反馈改为 useToastFeedback,并复用任务监控展示工具统一任务状态、来源、队列名、运行时长和 Flower 错误文案。
    • Worker 任务明细抽屉保留原有分组和数据来源,仅统一表头文案、任务标签和空态。
  • 验证:

    • 基线:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/workers/page.tsx 通过,仅用户页存在 1 条既有 unused eslint-disable warning。
    • 基线:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/workers/page.tsx --max-warnings=0 通过。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
  • 风险与关注点:

    • 改动仅影响 /admin/workers 前端展示与交互排布,不改变 Flower 代理接口路径、请求/响应字段或 celery.read/celery.manage 权限语义。

Work Log - 任务监控页面一致性优化(FL-156)

  • 背景:

    • 任务监控页需要按用户管理页的后台列表页规范补齐布局、筛选、反馈、空态、表格和移动端呈现一致性。
  • 本次处理:

    • 任务监控页接入 useMobileDetection,桌面保留表格视图,移动端切换为与用户管理页一致的卡片视图和字段网格。
    • 错误提示由页面内 Alert 改为 useToastFeedback,对齐用户管理页的消息反馈方式。
    • 桌面筛选表单项由 Tailwind min-w-* 改为固定 style={{ width: ... }},并保持移动端纵向筛选。
    • 表格配置补齐 tableLayout="fixed"、loading、统一空态属性顺序,并移除强制横向滚动,继续使用动态纵向滚动高度。
    • 全局样式补齐任务监控页面卡片、移动卡片、暗色主题和字段列宽规范,与用户管理页保持一致。
    • 补齐 web workspace 的 Linux arm64 Tailwind/lightningcss 原生可选依赖锁定,并同步 web/package-lock.json,修复当前 arm64 环境下 npm run build:web 缺少 lightningcss.linux-arm64-gnu.node 的构建问题。
  • 验证:

    • 基线:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/task-monitor/page.tsx 通过,仅用户页存在 1 条既有 unused eslint-disable warning。
    • 基线:npm --workspace web exec tsc --noEmit 通过。
    • 基线:node --experimental-strip-types web/src/lib/task-monitor-display.test.js 通过,4 passed,存在既有 MODULE_TYPELESS_PACKAGE_JSON warning。
    • 修改后:npm --workspace web exec eslint src/app/admin/task-monitor/page.tsx --max-warnings=0 通过。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:node --experimental-strip-types web/src/lib/task-monitor-display.test.js 通过,4 passed,仍存在既有 MODULE_TYPELESS_PACKAGE_JSON warning。
    • 修改后:npm run build:web 通过;过程中仍有既有 Next workspace root / middleware deprecation warning。
  • 风险与关注点:

    • 改动仅影响任务监控页前端展示、筛选布局、错误反馈和移动端呈现,不改变 /api/v1/admin/flower/* 接口路径、请求/响应字段或权限语义。
    • web/package-lock.json 此次同步了 web/package.json 已有依赖条目,变动较大但不改变业务代码。

Work Log - ATP 模型管理页面一致性优化(FL-158)

  • 背景:

    • ATP 模型管理页需要对齐用户管理页的反馈机制、表格分页、移动卡片和操作入口规范。
  • 本次处理:

    • ATP 模型页移除 App.useApp() 与页面内 Alert,统一改为 error/success state + useToastFeedback
    • ATP 资产列表接口补齐 limit/offset 查询参数,服务层在筛选后分页并保持 total 为当前筛选总数。
    • ATP 资产服务补齐 arrester_config 的创建、更新与序列化,保证页面必填字段能被持久化和回显。
    • 表格对齐用户管理页:tableLayout="fixed"、仅纵向滚动、服务端分页、空态文案、状态 Tag 展示和操作列宽度。
    • 移动端卡片对齐用户管理页:搜索表单布局、卡片标题状态、右上角编辑/更多菜单、字段网格、累积加载与已加载全部提示。
    • 新增 test_list_assets_paginates_after_filtering 覆盖 ATP 资产列表筛选后分页行为。
  • 验证:

    • 基线:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/atp-models/page.tsx 通过,仅存在用户页 1 条既有 unused eslint-disable warningATP 页有 6 条既有 warning。
    • 基线:npm --workspace web exec tsc --noEmit 通过。
    • 基线:python3 -m py_compile api/app/api/v1/atp_assets.py api/app/services/atp_asset_service.py api/tests/test_atp_asset_service.py 通过。
    • 基线:python3 -m pytest api/tests/test_atp_asset_service.py 因系统 Python 缺少 fastapi 无法收集测试。
    • 修改后:npm --workspace web exec eslint src/app/admin/atp-models/page.tsx --max-warnings=0 通过。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:python3 -m py_compile api/app/api/v1/atp_assets.py api/app/services/atp_asset_service.py api/tests/test_atp_asset_service.py 通过。
    • 修改后:UV_CACHE_DIR=/tmp/fquiz-uv-cache UV_PYTHON_INSTALL_DIR=/tmp/fquiz-uv-python /home/jenkins/.local/bin/uv run --python 3.11 --with pytest --with fastapi --with pydantic-settings --with sqlalchemy --with PyJWT --with argon2-cffi --with email-validator --with python-multipart --with psycopg[binary] pytest api/tests/test_atp_asset_service.py 通过,5 passed,存在 1 条既有 SQLAlchemy relationship warning。
    • 修改后:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/atp-models/page.tsx 通过,仍仅用户页 1 条既有 warning。
  • 风险与关注点:

    • /api/v1/atp/assets 新增可选 limit/offset 参数;未传参默认返回前 50 条,响应字段不变。
    • ATP 资产创建/更新现在会按既有 schema 持久化 arrester_config,修复此前前端提交但服务层丢弃该字段的问题。
    • 改动不改变 ATP 模型删除、版本、运行接口字段或权限语义。

Follow-up - 角色管理页弹窗与分页细节对齐(FL-152)

  • 背景:

    • 评审继续指出角色管理页 Modal 宽度、分页 total 处理方式仍与用户管理页存在可消除的实现差异。
  • 本次处理:

    • 移除角色管理页 Modal 的 width={760},恢复 AntD 默认宽度,与用户管理页弹窗保持一致。
    • 角色表格分页 total 改为 Math.max(rolesQuery.data?.roles_total ?? 0, 1)showTotal 改为读取查询 total,与用户管理页现有实现一致。
    • 复核角色卡片下拉菜单顺序,当前为“查看菜单 → 删除”,删除已在最后,无需额外调整。
  • 验证:

    • 修改后:npm --workspace web exec eslint src/app/admin/roles/page.tsx --max-warnings=0 通过。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/roles/page.tsx 通过,仍仅用户页 1 条既有 unused eslint-disable warning。
  • 风险与关注点:

    • 改动仅影响角色管理页前端弹窗尺寸和分页展示逻辑,不改变接口、schema、权限或 CRUD 语义。

Work Log - 系统日志页面一致性优化(FL-160)

  • 背景:

    • 系统日志页面需要严格对齐用户管理页的页面外层卡片、筛选表单、表格滚动和移动端卡片规范。
  • 本次处理:

    • 系统日志页外层容器改为与用户管理页一致的 min-h-0 flex-1 页面结构,并补齐 .admin-syslog-page-card flex 布局样式。
    • 桌面筛选表单项由 Tailwind min-w-* 改为固定 style={{ width: 260 }},与用户管理页筛选布局口径一致。
    • 表格配置补齐 tableLayout="fixed"、分页最小 total 处理,并移除横向滚动,仅保留动态纵向滚动。
    • 移动端日志卡片补齐与用户卡片一致的卡片头、标题信息、字段网格、详情省略提示和卡片头部主题样式。
  • 验证:

    • 基线:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/syslog/page.tsx 通过,仅用户页存在 1 条既有 unused eslint-disable warning。
    • 基线:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/syslog/page.tsx --max-warnings=0 通过。
    • 修改后:npm --workspace web exec tsc --noEmit 通过。
    • 修改后:npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/syslog/page.tsx 通过,仍仅用户页 1 条既有 warning。
  • 风险与关注点:

    • 改动仅影响 /admin/syslog 前端展示、筛选排布、表格滚动和移动卡片视觉,不改变 /api/v1/admin/audit-logs 接口路径、请求/响应字段或权限语义。