status: apply created: 2026-07-04 complexity: 🟡中等
现有后台表格横向滚动依赖底部滚动条,数据较少或表格未占满可视高度时仍需移动到表格底部才能左右查看列;纵向滚动时表头会离开可视区域,查看多列多行数据时字段含义容易混淆。
目标是在不逐页改造业务表格的前提下,为 Forge 管理端 Naive UI 表格提供通用体验增强:
AiCrudPage / AiTable,并兼容直接使用 n-data-table 的页面。forge-admin-ui/src/components/ai-form/AiCrudPage.vue 使用 AiTable 渲染低代码和通用 CRUD 列表,向下传递 max-height 与 scroll-x。forge-admin-ui/src/components/ai-form/AiTable.vue 是 n-data-table 的主要封装点,负责工具栏、列配置、分页和表格/卡片模式切换。forge-admin-ui/src/directives/index.js 已经统一注册 copy/loading/preview/watermark 等全局指令,可接入表格增强指令。forge-admin-ui/src/styles/theme.css 和 forge-admin-ui/src/styles/global.css 已有全局表格视觉样式,可补充粘性表头和拖拽状态样式。AiTable.vue 的 n-data-table 当前没有横向拖拽逻辑,只依赖浏览器/Naive UI 默认滚动条。AiCrudPage.vue 仅在局部样式中让 .n-data-table-wrapper overflow: auto,没有表头粘性策略。n-data-table,仅改 AiTable 不能覆盖全部场景。scrollLeft,不需要操作底部滚动条。sticky top: 0,始终停留在当前表格顶部。AiTable 显式绑定增强指令;直接使用 n-data-table 的页面通过全局注册后的指令可复用。| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 无 | 无 | 无 | 纯前端交互优化 |
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 无 | 无 | 无 | 纯前端交互优化 |
forge-admin-ui/src/components/ai-form/AiTable.vueforge-admin-ui/src/directives/index.jsforge-admin-ui/src/directives/modules/tableScrollEnhance.jsforge-admin-ui/src/styles/theme.cssAiCrudPage 列表页和一个直接 n-data-table 页面。AiTable 默认启用该指令,保持主链路自动受益。.n-data-table 内,减少逐组件配置。| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Task 0 | completed | spec.md, tasks.md, test-spec.md, execution-log.md |
建立变更记录 |
| Task 1 | completed | tableScrollEnhance.js, directives/index.js |
新增横向拖拽滚动指令,并全局自动增强直接使用的 n-data-table |
| Task 2 | completed | AiTable.vue |
AiTable 默认启用拖拽滚动,保留 dragScroll 关闭入口 |
| Task 3 | completed | theme.css |
补充表头 sticky、固定列表头层级和拖拽光标样式 |
| Task 4 | completed | test-spec.md, execution-log.md |
已完成构建、指令烟测和 diff 空白检查 |
| 回归修复 | completed | AiCrudPage.vue, AiTable.vue, tableScrollEnhance.js, theme.css |
少量数据不启用默认内部纵向滚动;挂载/更新后刷新固定列状态;无纵向溢出时隐藏竖向 scrollbar rail;操作列默认右固定 |
已完成实现与回归修复验证。pnpm --dir forge-admin-ui build 成功;jsdom 指令烟测验证横向拖拽会同步 body/header,按钮区域不会触发拖拽;回归烟测验证无纵向溢出时隐藏竖向滚动 rail、纵向溢出时恢复;git diff --check 通过。构建中存在既有动态导入、CSS 注释和 chunk size 类 warning,未阻断本次变更。