feat: 全面UI优化 — 5套主题系统 + 设计体系 + 菜单重组 + 页面优化

1. 主题系统扩展 (5套主题)
   - ocean-deep(深海蓝) / light-professional(明亮白) / midnight-purple(午夜紫)
   - pine-green(松林绿) / orange-vitality(活力橙)
   - useTheme hook 重写支持5主题 + 向后兼容
   - AppearanceSettings 5主题预览卡片

2. 设计体系 (index.css)
   - 按钮系统: dg-btn-primary/secondary/ghost/danger + 尺寸变体
   - 徽章系统: dg-badge-* (8色)
   - 卡片/表格: dg-card-section, dg-table-row, dg-table-header
   - 状态点: dg-status-dot-* (4色)
   - 动效关键帧: slideInLeft, scaleIn

3. 菜单重组 (menu.ts)
   - 5分组: 概览/数据源/工单/权限/系统
   - 6个图标更新: Code2/FileEdit/ShieldCheck/FolderLock/ScrollText/Timer
   - 新增 permission 权限码字段

4. Layout 侧边栏增强
   - 左侧渐变指示条 + 发光效果
   - hover 微动画 + 图标变色
   - 面包屑导航头部
   - 主题切换循环5主题

5. 核心页面优化
   - TicketsPage: 设计系统类 + 颜色对齐
   - QueriesPage: 去Card依赖 + dg-table/dg-btn统一
   - Breadcrumb组件 + useBreadcrumb hook
This commit is contained in:
logan committed 2026-05-27 01:59:08 +08:00
1 parent 4e2df4d3d7
commit 746a000e8a
25 files changed
+7718 -178

No files matched your search

@@ -0,0 +1,533 @@
## 5. 核心功能页面优化方案
本章针对 SQL-Platform 三个核心功能模块——审批变更(工单系统)、查询数据、系统设置——进行逐页拆解分析,提出可落地的 UI/UX 优化方案。每个方案均包含具体的组件选型、布局参数、交互细节与视觉规范,确保开发团队能够直接转化为实现任务。
---
### 5.1 审批变更工单系统优化
审批变更是平台的核心业务流,涉及工单列表、工单创建、工单详情三个主要页面。当前实现存在布局松散、信息层级不清、操作流程割裂等问题。以下按页面逐一给出优化方案。
#### 5.1.1 工单列表页优化
**组件选型与布局重构**
将原生 `<table>` 全面替换为 `@tanstack/react-table` + `shadcn/ui DataTable` 组合。DataTable 内置列排序、列过滤、行选择、分页等能力,可显著减少 742 行中的手写逻辑。表格容器采用 `rounded-xl border border-border/60 bg-card` 样式,阴影参数为 `shadow-sm`。
**状态卡片升级**
原状态卡片(全部/待审批/执行中/完成/失败)改为 Stats Cards。每张卡片包含:状态图标(`Lucide`)、工单数量(`text-2xl font-bold`)、环比趋势箭头(绿色上升/红色下降)、环比百分比(`text-xs text-muted-foreground`)。卡片使用 `cn()` 动态绑定激活状态的边框色——激活时边框为 `ring-2 ring-primary/40 border-primary`,未激活为 `border-transparent hover:border-border/80`。卡片网格采用 `grid grid-cols-5 gap-4`,在 < 1024px 下退化为 `grid-cols-3` + `grid-cols-2`。
**高级筛选栏**
在状态卡片下方新增折叠式筛选栏,包含以下控件:
| 筛选项 | 组件 | 说明 |
|---------|------|------|
| 实例 | `Select`(多选) | 从实例列表异步加载 |
| 数据库类型 | `Select`(多选) | MySQL/PostgreSQL/MongoDB 等 |
| 提交人 | `Input` + `Avatar` | 支持用户名/邮箱搜索 |
| 时间范围 | `DateRangePicker` | shadcn/ui 官方组件 |
| 优先级 | `ToggleGroup` | 高/中/低三态切换 |
筛选栏默认折叠,点击"高级筛选"按钮展开,展开高度动画 `duration-300 ease-in-out`。所有筛选条件通过 URL query params 同步,支持刷新后状态保持。
**表格交互增强**
- **优先级标识**:每行左侧增加 4px 宽色条,高=`bg-red-500`、中=`bg-amber-500`、低=`bg-slate-400`,使用绝对定位贴左边框。
- **行 Hover 效果**:`hover:bg-muted/60`,同时左侧出现 `border-l-2 border-primary` 指示条,过渡 `transition-colors duration-150`。
- **操作列优化**:将分散的查看/通过/拒绝/执行/撤销按钮收缩为图标按钮组(`Eye`, `CheckCircle`, `XCircle`, `Play`, `RotateCcw`)。当操作超过 3 个时,溢出部分收入 `DropdownMenu`。按钮使用 `variant="ghost" size="icon"`。
- **批量操作**:顶部新增批量操作栏,选中行后出现(`AnimatePresence` 滑入),包含"批量审批"、"批量拒绝"、"导出选中"三个主操作,危险操作使用 `variant="destructive"`。
- **列自定义**:列头右键菜单支持"隐藏此列"、"重置列宽",列宽拖拽使用 `react-resizable` 实现,拖拽手柄 4px 宽,hover 时显示 `bg-primary/30`。
**搜索与分页**
搜索框使用 `Input` + `Search` 图标,支持 `Cmd+K` 快捷键聚焦。分页组件采用 `shadcn/ui Pagination`,页码按钮尺寸 `h-9 w-9`,当前页 `bg-primary text-primary-foreground`。每页条数可选 10/25/50/100。
---
#### 5.1.2 工单创建页优化
**布局重构:左右分栏**
将当前 1192 行的单栏布局改为左右分栏:左侧编辑器区占 `w-3/5`(60%),右侧辅助信息面板占 `w-2/5`(40%),中间分隔线 `border-r border-border/60`。两栏均独立滚动,避免编辑器滚动时右侧信息丢失。分栏在 < 1280px 下退化为上下堆叠布局。
**步骤指示器(Step Indicator)**
在分栏顶部增加横向步骤条,共三步:
```
① 填写信息 ──→ ② SQL 审核 ──→ ③ 提交审批
```
步骤条使用 `shadcn/ui` 风格的自定义组件。已完成步骤圆圈 `bg-primary text-primary-foreground`,当前步骤 `bg-primary ring-4 ring-primary/20`,未到达步骤 `bg-muted text-muted-foreground`。连线使用 `h-0.5 w-16`,已完成段 `bg-primary`,未完成段 `bg-border`。步骤切换允许回退(已填写内容保留),但前进需通过当前步骤的验证(如 SQL 审核必须通过才能到第三步)。
**左侧编辑器区**
- **顶部工具栏**:实例选择 + 数据库选择使用 `Popover` + `Command` 组合(支持搜索筛选),定时执行使用 `Switch` + `DateTimePicker`,格式化按钮(`AlignLeft` 图标)使用 `variant="outline" size="sm"`。工具栏使用 `flex items-center gap-3 p-3 border-b border-border/60 bg-muted/30`。
- **SQL 编辑器**:保留 CodeMirror 6,新增配置:行号显示(`lineNumbers()`)、迷你地图(`@codemirror/view showMinimap` 或自定义 SVG 缩略图)、当前行高亮(`highlightActiveLineGutter()`)。编辑器高度 `h-[480px]`,边框 `border-0`(融入容器)。
- **SQL 模板快捷插入**:编辑器左下角增加"模板"按钮,点击弹出 `Popover`,内含分类模板列表(DDL/DML/查询),点击后 `editor.dispatch()` 插入模板 SQL。
**右侧辅助面板**
- **审核结果卡片**:使用三个独立卡片分别展示 Error(`bg-red-50 border-red-200`)、Warning(`bg-amber-50 border-amber-200`)、Info(`bg-blue-50 border-blue-200`)。每张卡片包含:数量 badge(`rounded-full px-2 py-0.5 text-xs font-medium`)、发现项列表(每项包含行号、规则名、描述)、展开/折叠按钮。Error 卡片默认展开,其他折叠。
- **变更原因输入**:将 `<textarea>` 替换为轻量级 Markdown 编辑器(`react-simplemde-editor` 或自定义实现),支持粗体、斜体、代码块、列表快捷按钮。高度 `min-h-[120px]`,占位符文本"请描述本次变更的业务原因和影响范围..."
- **工单预览**:在提交按钮左侧增加"预览"按钮,点击弹出 `Dialog`(宽 `max-w-3xl`),展示完整工单信息的只读视图,包括 SQL 摘要、变更原因、元数据。
- **自动保存草稿**:每 30 秒将表单状态序列化到 `localStorage`,键名为 `ticket_draft_${userId}`。页面加载时检测草稿,若有则提示"检测到未提交的草稿,是否恢复?"(`Toast` + 操作按钮)。提交成功后清除草稿。
---
#### 5.1.3 工单详情页优化
**头部 Hero Section**
将原头部改为 Hero Section 风格:
- 背景:`bg-gradient-to-r from-primary/5 via-primary/3 to-transparent`,底部边框 `border-b border-border/60`。
- 标题:`text-3xl font-bold tracking-tight`,状态 badge 紧跟标题右侧,badge 尺寸加大(`text-sm px-3 py-1`)。
- 元信息行:`flex gap-6 text-sm text-muted-foreground`,包含提交人(Avatar + 用户名)、提交时间(`Calendar` 图标)、实例名(`Database` 图标)、数据库(`Table` 图标)。
- 操作按钮组:头部右侧放置主操作按钮,审批通过用 `variant="default"`(`CheckCircle` 图标),拒绝用 `variant="destructive"`(`XCircle` 图标),执行用 `variant="outline"`(`Play` 图标)。操作按钮根据当前状态条件渲染(如已完成的工单不显示"通过"按钮)。
**审批流程 Timeline**
将原圆形+连线流程改为横向 Timeline:
```
[创建]──→[待审批]──→[已通过]──→[执行中]──→[已完成]
张三 李四 王五 系统 系统
10:23 14:05 16:30 16:31 16:33
```
- 节点形状:操作步骤使用圆形(`w-10 h-10 rounded-full`),判断步骤(如"审核通过?")使用菱形(CSS `rotate(45deg)` 实现,内部图标反向旋转)。
- 当前节点:`ring-4 ring-primary/30 bg-primary text-white`,带脉冲动画(`animate-pulse` 或自定义 CSS keyframes `scale 1→1.05→1`)。
- 已完成连线:`h-0.5 bg-primary`。
- 未完成连线:`h-0.5 bg-border border-dashed`。
- 鼠标悬停节点时,弹出 `Tooltip` 显示步骤详情(操作人、时间、备注)。
**内容区域**
- **SQL 内容区**:只读编辑器上方增加工具栏,包含"复制"(`Copy` 图标,点击后图标变为 `Check` 持续 2 秒)、"下载 SQL"(`Download` 图标)、"全屏查看"(`Maximize` 图标)。
- **执行结果 Dashboard**:将原本平铺的执行结果改为 Dashboard 风格,使用 `grid grid-cols-4 gap-4` 布局:
- 执行状态:大图标 + 状态文字,成功 `text-green-600`、失败 `text-red-600`。
- 影响行数:`text-3xl font-bold` + "行" 单位。
- 执行耗时:`text-3xl font-bold` + "秒" 单位。
- 警告数:如有则显示 badge,无则显示 "-" 并置灰。
- **回滚 SQL**:使用 `Accordion` 包裹,默认折叠,类型为 `type="single" collapsible`。展开后显示只读编辑器 + 复制按钮。
- **审批意见输入**:在审批流程下方新增意见输入区,使用 `Textarea` + 提交按钮。支持 `@` 提及功能(输入 `@` 后弹出用户列表 `Popover`,使用 `Command` 组件筛选)。已提交的审批意见以评论卡片形式展示,包含 Avatar、用户名、时间、意见内容。
- **关联工单 Carousel**:将关联工单列表改为横向滚动卡片组,每张卡片显示工单标题、状态 badge、最后更新时间。使用 `scroll-snap-type: x mandatory` 实现平滑滚动,左右箭头按钮控制滚动。
- **操作日志时间轴**:左侧竖线 `w-px bg-border absolute left-4 top-0 bottom-0`,每个日志节点包含:圆点(操作类型颜色编码)、时间(`text-xs text-muted-foreground`)、操作描述、操作人 Avatar。
---
#### 5.1.4 审批流程可视化优化
**流程图实现方案**
推荐采用自定义 SVG 方案(相比 Mermaid.js 更轻量、更易定制样式)。流程图容器使用 `aspect-[16/9] max-h-[360px]`,SVG 内部使用 `<defs>` 定义箭头标记和渐变色。
**节点设计**
| 节点类型 | 形状 | 尺寸 | 颜色 |
|---------|------|------|------|
| 开始/结束 | 圆角矩形(rx=20) | 100×48px | `fill: hsl(var(--primary))` |
| 操作步骤 | 圆角矩形(rx=8) | 140×56px | `fill: hsl(var(--card)), stroke: hsl(var(--border))` |
| 判断节点 | 菱形(polygon) | 112×80px | `fill: hsl(var(--amber-50)), stroke: hsl(var(--amber-400))` |
| 当前步骤 | 任意形状 + 脉冲 | 基础尺寸 | `ring` + `animate-pulse` |
节点文本居中显示,使用 `text-sm font-medium fill-foreground`。当前步骤节点的边框使用 `stroke: hsl(var(--primary))`,线宽 `stroke-width: 2.5`,并附加 SVG `<animate>` 脉冲效果(`opacity 0.6→1→0.6`,周期 2s)。
**连线设计**
- 正常路径:`stroke: hsl(var(--primary))`,`stroke-width: 2`,带箭头标记。
- 回退路径(如"拒绝"分支):`stroke: hsl(var(--destructive))`,`stroke-width: 2`,`stroke-dasharray: 6 3`,箭头标记颜色同步。
- 条件分支标签:连线中点放置文本标签,如"通过"/"拒绝",使用 `text-xs fill-muted-foreground`,背景白色矩形 `fill: hsl(var(--background))` 防止线穿过文字。
- 鼠标悬停连线时,线宽动画增至 `stroke-width: 3`,同时显示 `Tooltip` 说明该路径的触发条件。
**交互增强**
- 点击任意节点,右侧(或下方)弹出详情面板,显示该步骤的完整信息(操作人、操作时间、耗时、备注、相关规则)。
- 流程图支持缩放(鼠标滚轮,范围 0.5x-2x)和平移(拖拽),使用 `transform` 属性实现。
- 提供"重置视图"按钮,点击后平滑动画回归初始缩放和位置。
- 当前正在进行的步骤,节点右上角显示旋转的 `Loader2` 图标(`animate-spin`)。
---
### 5.2 查询数据页面优化
查询数据页面(QueriesPage.tsx,896 行)是开发人员最高频使用的功能模块。当前页面在编辑器体验、结果展示、导航效率方面均有较大提升空间。
#### 5.2.1 SQL 编辑器优化
**主题同步**
CodeMirror 6 编辑器主题通过 `Compartment` 动态切换,监听 `theme` 状态变化:
```typescript
const themeCompartment = new Compartment();
// 深色主题使用 oneDark,浅色使用 lightTheme
const themeExtension = theme === 'dark' ? oneDark : lightTheme;
view.dispatch({ effects: themeCompartment.reconfigure(themeExtension) });
```
编辑器背景色使用 `bg-card`,确保与页面主题无缝融合。光标颜色使用 `caret-color: hsl(var(--primary))`。
**全屏编辑模式**
监听 `F11` 按键(`preventDefault` 阻止浏览器默认全屏),触发自定义全屏:编辑器容器使用 `fixed inset-0 z-50 bg-background` 定位,动画 `animate-in zoom-in-95 duration-200`。全屏模式下隐藏侧边栏,工具栏收缩为单行。退出方式:再次按 `F11` 或点击右上角 `Minimize` 图标按钮。使用 `useHotkeys` hook 管理快捷键。
**代码折叠**
启用 CodeMirror 6 内置的 `@codemirror/language foldGutter` 扩展,折叠指示器使用 `&bull;` 或自定义图标(`ChevronDown`/`ChevronRight`)。折叠区域背景色使用 `bg-muted/30` 以视觉区分。
**多标签页支持**
在编辑器顶部增加标签页栏,高度 `h-10`,样式类似 VS Code:
- 活动标签:`bg-card border-t-2 border-primary text-foreground`。
- 非活动标签:`bg-muted/50 border-t-2 border-transparent text-muted-foreground hover:bg-muted`。
- 标签内容:查询前 20 个字符 + 未保存指示点(`bg-primary rounded-full w-2 h-2`)。
- 关闭按钮:标签 hover 时显示 `X` 图标,`size="sm" variant="ghost"`。
- 新建标签:右侧 `+` 按钮,点击后创建空查询标签。
- 标签状态存储在 `zustand` store 中,切换标签时通过 `editor.dispatch` 替换文档内容。
**查询参数化**
支持 `:paramName` 语法,编辑器通过自定义 `MatchDecorator` 高亮参数(`background: hsl(var(--primary)/0.15), border-radius: 3px`)。编辑器下方增加参数输入区:自动解析 SQL 中的参数,为每个参数生成 `Input` 字段(标签 = 参数名,占位符 = 数据类型推断)。参数值随查询一起提交到后端。
---
#### 5.2.2 结果展示优化
**DataTable 替换**
将原生结果表格替换为 `shadcn/ui DataTable`(`@tanstack/react-table`)。关键配置:
- `enableColumnResizing: true`:列宽可拖拽调整,拖拽手柄在列头右侧边缘,hover 时显示 `w-1 h-full bg-primary/30`。
- `enableSorting: true`:点击列头排序,排序状态循环:无 → 升序 → 降序 → 无。排序图标使用 `ArrowUpDown`,激活时根据方向切换为 `ArrowUp` 或 `ArrowDown`。
- `enableRowSelection: true`:支持行选择,批量导出。
**列头固定(Sticky Header)**
结果表格容器设置 `max-h-[480px] overflow-auto`,表头使用 `sticky top-0 z-10 bg-card border-b` 固定,确保纵向滚动时列头始终可见。
**大数据量虚拟滚动**
当结果行数超过 1000 行时,启用 `@tanstack/react-virtual` 虚拟滚动。虚拟滚动配置:
- `estimateSize: () => 40`:每行预估高度 40px。
- `overscan: 10`:上下各预渲染 10 行。
- 行元素使用绝对定位 `position: absolute; top: 0; transform: translateY(${virtualRow.start}px)`。
**单元格内容预览**
- 文本/数字列:超出列宽时显示 `truncate`,hover 时弹出 `Popover` 展示完整内容,Popover 最大宽度 `max-w-sm`,支持文本选择。
- JSON 列:使用 `lucide-react` 的 `Braces` 图标标识,内容折叠显示 `{...}` 或 `[...]`(包含元素个数 badge)。点击展开后使用 `react-json-view` 或自定义树形组件格式化展示,支持层级折叠。
- NULL 值:特殊样式 `text-muted-foreground italic` 显示 "NULL"。
**结果导出**
工具栏增加导出 `DropdownMenu`,包含:
| 格式 | 说明 |
|------|------|
| CSV | 逗号分隔,包含 BOM 解决中文乱码 |
| JSON | 对象数组格式,字段名作为 key |
| Excel | 通过 `xlsx` 库生成 `.xlsx` 文件 |
导出范围支持:当前页 / 全部结果 / 选中行。大数据量导出(>10,000 行)时显示进度条 `Dialog`。
**结果图表视图**
在结果表格上方增加视图切换 `ToggleGroup`:`Table` / `BarChart` / `LineChart`。
- 柱状图:使用 `recharts` 的 `<BarChart>`,选择两列(X 轴 + Y 轴)后渲染。X 轴标签旋转 45° 防止重叠。
- 折线图:使用 `<LineChart>`,适合时间序列数据。支持多系列(选择多个数值列)。
- 图表容器高度 `h-[360px]`,空状态显示 `BarChart3` 图标 + "请选择数据列生成图表" 提示。
- 图表配置面板:X 轴选择、Y 轴选择(可多选)、图表标题输入。
---
#### 5.2.3 侧边栏导航优化
**Schema 树搜索过滤**
Schema 侧边栏顶部增加搜索输入框(`Input size="sm"` + `Search` 图标),实时过滤数据库/表/字段名。过滤逻辑:
- 匹配数据库名:展示该数据库下所有表。
- 匹配表名:展示该表及其所在数据库(其他数据库折叠)。
- 匹配字段名:展示该字段及其所属表和数据库。
使用 `fuse.js` 实现模糊搜索,配置 `threshold: 0.3, keys: ['name']`。
**表节点增强**
每个表节点左侧显示 `Table2` 图标(`w-4 h-4 text-muted-foreground`),右侧显示行数 badge(`rounded-full bg-muted px-1.5 py-0 text-[10px] text-muted-foreground`)。行数从 `INFORMATION_SCHEMA` 或后端缓存获取,显示 "~" 前缀表示近似值。
**收藏表功能**
表节点 hover 时显示星标按钮(`Star` 图标,`size="sm" variant="ghost"`),点击切换收藏状态。已收藏的表显示实心 `Star` 图标(`fill: hsl(var(--amber-400))`)。收藏表固定在侧边栏顶部"收藏"分组下,分组标题使用 `text-xs font-semibold text-muted-foreground uppercase tracking-wider`。
**最近访问表**
在"收藏"分组下方增加"最近访问"分组,最多展示 10 个最近点击过的表,按访问时间倒序。每个表项显示访问时间相对文本(`2分钟前`)。使用 `lru-cache` 或简单的 `Map` 实现客户端缓存,持久化到 `localStorage`。
**拖拽插入 SQL**
实现从 Schema 树拖拽表名/字段名到编辑器:
- 拖拽开始:设置 `dataTransfer.setData('text/plain', tableName)`,拖拽图像为半透明标签显示表名。
- 拖拽经过编辑器:显示插入位置指示线。
- 拖拽释放:根据拖拽对象类型插入不同内容:
- 表名:插入 `` `tableName` ``
- 字段名:插入 `` `tableName`.`columnName` ``
- 数据库名:插入 `` `databaseName` ``
使用 CodeMirror 6 的 `dropCursor` 扩展显示插入位置。
---
#### 5.2.4 历史记录优化
**分类标签页**
将历史记录抽屉中的列表改为 `shadcn/ui Tabs` 分类:
- 全部(`History` 图标):所有查询记录。
- 成功(`CheckCircle` 图标,绿色):执行成功的查询。
- 失败(`XCircle` 图标,红色):执行失败的查询。
- 收藏(`Star` 图标,琥珀色):用户收藏的查询。
每个标签显示记录数量 badge。标签切换使用 `AnimatePresence` 实现内容淡入淡出。
**记录项增强**
每条历史记录显示:
- 左侧:状态圆点(成功 `bg-green-500`、失败 `bg-red-500`),直径 8px。
- 标题行:查询前 40 个字符 + 执行时间 badge(`rounded-md bg-muted px-1.5 py-0.5 text-xs`,如 "23ms"、"1.2s")。
- 展开/折叠:点击记录行展开 SQL 预览(`ChevronDown` / `ChevronRight` 图标指示),展开的 SQL 使用只读 CodeMirror 实例(高度 `max-h-[120px]`)或 `<pre>` 标签 + 语法高亮。
- 操作按钮组(hover 显示):"运行"(`Play` 图标,将 SQL 插入编辑器并执行)、"插入"(`CornerDownLeft` 图标,仅插入编辑器)、"收藏"(`Star` 图标)、"删除"(`Trash2` 图标,`variant="ghost"` 且 hover 变红)。
**一键对比功能**
在历史记录操作菜单中增加"对比"选项。选择两条记录后,弹出对比 `Dialog`(宽 `max-w-5xl`),使用左右分栏展示两条 SQL 的差异。差异高亮使用 `diff-match-patch` 库或自定义实现:
- 相同行:正常显示。
- 删除行:背景 `bg-red-50`,左侧红色竖线标记。
- 新增行:背景 `bg-green-50`,左侧绿色竖线标记。
- 修改行:字符级差异高亮,删除字符 `bg-red-200 line-through`,新增字符 `bg-green-200`。
**文件夹/标签组织**
允许用户创建自定义文件夹("日常巡检"、"业务报表"等)来组织历史查询。文件夹使用侧边栏树形结构展示,支持:
- 新建文件夹:输入名称,使用 `Dialog` + `Input`。
- 拖拽排序:文件夹和历史记录均支持拖拽重新排序。
- 颜色标签:每个文件夹可选颜色标签(8 种预设色),用于快速视觉识别。
- 搜索:文件夹和历史记录支持全文搜索(SQL 内容 + 备注)。
---
### 5.3 系统设置页面优化
当前设置页面(SettingsPage.tsx 仅 56 行)结构过于简单,PlatformConfigPage.tsx 和 AppearanceSettings.tsx 也存在分类不清晰、交互不一致的问题。
#### 5.3.1 设置分类重组
**新分类结构**
将原有分类重新组织为 7 个一级分类,每个分类分配独立路由(`/settings/:category`):
| 分类 | 路由 | 包含内容 | 图标 |
|------|------|----------|------|
| 外观设置 | `/settings/appearance` | 主题/语言/密度/字体/圆角/自定义CSS | `Palette` |
| 安全设置 | `/settings/security` | 密码策略/登录限制/2FA/IP白名单 | `Shield` |
| 通知设置 | `/settings/notifications` | 渠道配置/模板管理/订阅规则 | `Bell` |
| 执行设置 | `/settings/execution` | 超时/LIMIT/并发/执行器配置 | `PlayCircle` |
| 审计设置 | `/settings/audit` | 保留策略/敏感词/审计级别 | `ClipboardList` |
| 集成设置 | `/settings/integrations` | LDAP/Webhook/API密钥 | `Plug` |
| 高级设置 | `/settings/advanced` | 清理/备份/日志/导入导出 | `Cog` |
**导航布局**
设置页面采用左右布局:左侧导航栏宽 `w-64`(固定),右侧内容区 `flex-1`。左侧导航使用 `shadcn/ui` 的 `ScrollArea` 包裹,每个导航项包含图标(`w-4 h-4`)+ 分类名 + 设置项数量 badge(如"12 项")。当前激活项使用 `bg-primary/10 text-primary border-r-2 border-primary`。
导航栏底部放置"危险区域"入口(`AlertTriangle` 图标,红色文字),包含恢复默认设置、清除所有数据等操作。
---
#### 5.3.2 表单交互优化
**统一表单架构**
所有设置表单统一使用 `shadcn/ui Form` + `react-hook-form` + `zod` 验证。每个设置项包裹在卡片组件中:
```
┌─────────────────────────────────────┐
│ 设置项标题 │ ← text-base font-medium
│ 设置项描述,说明此配置的作用和影响范围 │ ← text-sm text-muted-foreground
│ │
│ [输入控件] [重置] │ ← 控件右对齐,重置按钮变灰
└─────────────────────────────────────┘
```
卡片样式:`rounded-xl border border-border/60 bg-card p-5 shadow-sm`,hover 时 `shadow-md transition-shadow duration-200`。卡片间距 `space-y-4`。
**设置项搜索**
页面顶部增加全局搜索栏(`Input` + `Search` 图标 + `Command+K` 快捷键),支持跨分类搜索设置项。搜索范围包括:设置项标题、描述、关键词标签。搜索结果按分类分组展示,点击后滚动定位到对应设置项并高亮(`bg-primary/10` 闪烁 2 秒后消退)。使用 `fuse.js` 实现,`threshold: 0.25`。
**变更指示与保存**
- 变更指示:每个设置卡片在值发生变化时,底部显示 "已修改" 文字(`text-xs text-amber-600`)+ "撤销" 链接,同时卡片顶部边框变为 `border-t-2 border-amber-400`。
- 保存策略:每个分类页右下角固定悬浮保存栏(`sticky bottom-6`),包含"保存更改"(`variant="default"`)和"重置"(`variant="outline"`)按钮。保存栏使用 `bg-card border shadow-lg rounded-xl px-6 py-3`。
- 自动保存:可选开启,每 5 秒自动保存已变更的设置(防抖处理)。
- 保存成功:顶部显示 `Toast`("设置已保存",`CheckCircle` 图标),保存按钮短暂变为成功状态(文字 "已保存" + `Check` 图标,2 秒后恢复)。
**变更历史**
在设置页面右上角增加"变更历史"按钮(`History` 图标),点击后弹出 `Sheet`(右侧滑出,宽 `w-[480px]`)。历史记录展示最近 50 条设置变更,每条包含:
- 时间(相对格式,如"3 分钟前")
- 分类名
- 设置项标题
- 旧值 → 新值(差异高亮)
- 操作人 Avatar + 用户名
历史记录数据由后端提供,前端使用 `useSWR` 轮询获取(间隔 30 秒)。
**危险设置二次确认**
对于高风险设置项(如"允许删除生产环境数据"、"关闭审计日志"),使用以下交互设计:
- 卡片边框:`border-red-200`。
- 卡片顶部:`bg-red-50 px-5 py-2 -mx-5 -mt-5 mb-3 rounded-t-xl border-b border-red-100`,内含 `AlertTriangle` 图标 + "危险设置" 警告文字。
- 开关/输入控件旁增加确认 `Dialog`,用户点击变更时弹出,要求输入操作密码或二次确认文字(如"请输入 DELETE 确认")。
**设置导入/导出**
在高级设置分类中增加导入/导出功能:
- 导出:将所有设置序列化为 JSON 文件下载,包含元数据(导出时间、版本、操作人)。
- 导入:拖拽或选择 JSON 文件,预览变更内容(使用 diff 视图展示与当前设置的差异),确认后应用。导入前自动创建备份点。
---
#### 5.3.3 安全设置增强
**密码策略配置**
新增密码策略卡片,包含以下设置项:
| 设置项 | 控件 | 默认值 | 验证规则 |
|--------|------|--------|----------|
| 最小密码长度 | `Slider` (6-32) + `Input` | 8 | zod `min(6).max(32)` |
| 必须包含大写字母 | `Switch` | true | — |
| 必须包含小写字母 | `Switch` | true | — |
| 必须包含数字 | `Switch` | true | — |
| 必须包含特殊字符 | `Switch` | false | — |
| 密码过期时间(天) | `Input` (数字) | 90 | `min(1).max(365)` |
| 历史密码禁止 reuse 次数 | `Slider` (0-10) | 3 | `min(0).max(10)` |
密码强度实时预览:下方显示密码示例框,输入测试密码后动态显示强度条(红/黄/绿三段)和文字评价("弱"/"中"/"强")。
**登录失败锁定策略**
- 启用开关:`Switch`,默认开启。
- 最大尝试次数:`Slider` (3-10),默认 5 次。
- 锁定时间:`Select`(5分钟/15分钟/30分钟/1小时/手动解锁),默认 15 分钟。
- 通知管理员:`Switch`,锁定事件发生时通知管理员。
**IP 白名单配置**
使用 `Textarea` 输入,每行一个 IP 或 CIDR 段(如 `192.168.1.0/24`)。实时验证输入格式,非法格式行显示红色下划线 + `Tooltip` 说明错误原因。支持从文件导入(`.txt` 或 `.csv` 格式)。
白名单列表以标签云形式展示,每个 IP 标签可单独删除(`X` 图标)。空状态时显示 `Globe` 图标 + "未配置 IP 白名单,允许所有 IP 访问" 提示。
**Session 超时设置**
- 超时时间:`Select`(15分钟/30分钟/1小时/2小时/4小时/8小时/永不),默认 30 分钟。
- 超时前警告:`Switch`,在超时前 2 分钟弹出警告 `Dialog`,提供"保持登录"按钮。
- 多设备登录限制:`Select`(不限制/1台/2台/3台),默认不限制。
**操作审计级别配置**
使用 `RadioGroup` 三选一:
- 基础:仅记录登录/登出和审批操作。
- 标准(默认):额外记录查询执行和设置变更。
- 完整:记录所有操作包括 Schema 浏览和导出行为。
每个级别旁显示预估日志存储量(基于当前使用量计算)。
---
#### 5.3.4 外观设置增强
**主题实时预览**
主题模式切换(深色/浅色/跟随系统)改为实时预览:用户点击选项后立即应用主题(`document.documentElement.classList`),但此时不保存到后端。页面显示"主题已临时切换,保存以永久生效"的提示条(`bg-primary/10 border border-primary/20 rounded-lg px-4 py-2 mb-4`),包含"保存"和"恢复"按钮。用户刷新页面后未保存的主题恢复为已保存值。
**界面密度选择**
新增三档密度选择,使用 `ToggleGroup` 展示:
| 密度 | 效果 | 适用场景 |
|------|------|----------|
| 紧凑 (`compact`) | 表格行高 32px,卡片内边距 16px,字体 13px | 数据密集型用户 |
| 默认 (`default`) | 表格行高 40px,卡片内边距 20px,字体 14px | 平衡 |
| 舒适 (`comfortable`) | 表格行高 48px,卡片内边距 24px,字体 14px | 触控设备或视力辅助 |
选择后立即生效,通过 CSS 变量控制:`--density-factor: 0.8 | 1.0 | 1.2`,各组件使用 `calc()` 基于该变量计算尺寸。
**侧边栏宽度可调**
在"布局"子分类中增加侧边栏宽度设置:
- 控件:`Slider` (200px-400px),默认 280px。
- 实时预览:拖动滑块时侧边栏宽度实时变化。
- 重置按钮:点击恢复默认 280px。
**字体大小设置**
- 基础字体大小:`Select`(12px/13px/14px/15px/16px),默认 14px。
- 代码字体大小:`Select`(12px/13px/14px/15px/16px),默认 14px。
- 代码字体族:`Select`('JetBrains Mono', 'Fira Code', 'Source Code Pro', 'monospace'),默认 'JetBrains Mono'。
字体族选择时,预览文字实时展示该字体的渲染效果。
**圆角风格设置**
使用三个可视化选项卡片:
| 风格 | CSS 变量 | 视觉描述 |
|------|----------|----------|
| 锐利 (`sharp`) | `--radius: 0px` | 直角,无圆角 |
| 默认 (`default`) | `--radius: 0.5rem` | 中等圆角,卡片 8px |
| 圆润 (`rounded`) | `--radius: 0.75rem` | 大圆角,卡片 12px |
每个选项卡片展示缩略图:一个矩形 + 一个按钮 + 一个 badge,使用对应圆角值渲染。选中状态 `ring-2 ring-primary`。
**自定义 CSS(高级用户)**
在"高级"子分类中增加自定义 CSS 输入区:
- 使用 CodeMirror 6 编辑器(只开启基础高亮,无语法检查),高度 `min-h-[200px]`。
- 占位符:"/* 在此输入自定义 CSS,将覆盖默认样式 */\n\n.custom-sidebar {\n /* your styles */\n}"。
- 实时预览开关:`Switch`,开启时 CSS 立即应用到页面。
- 安全提示:输入区上方显示 `Info` 图标 + "自定义 CSS 仅影响当前用户,错误样式可能导致页面显示异常" 警告。
- CSS 作用域:通过 Shadow DOM 或 `style` 标签 + 特定 class 前缀隔离,避免影响全局样式。
**登录页风格选择**
将原有的 5 个缩略图卡片优化为:
- 卡片尺寸:`aspect-[16/10] rounded-lg overflow-hidden border-2`。
- 选中状态:`border-primary ring-2 ring-primary/20`。
- 缩略图内容:使用实际登录页的静态截图或实时 iframe 预览。
- 卡片底部:风格名称 + 简短描述。
- 新增"上传自定义背景"按钮:支持上传图片(JPG/PNG,最大 5MB),上传后显示预览和"删除"按钮。
---
以上优化方案覆盖了审批变更、查询数据、系统设置三大核心模块的全部关键页面。每个方案均提供了具体的组件选型、布局参数、交互细节和视觉规范,可直接转化为前端开发任务。建议按照"查询数据(高频使用)→ 审批变更(核心流程)→ 系统设置(低频但影响全局)"的优先级顺序逐步实施。