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
31 KiB
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),判断步骤(如"审核通过?")使用菱形(CSSrotate(45deg)实现,内部图标反向旋转)。 - 当前节点:
ring-4 ring-primary/30 bg-primary text-white,带脉冲动画(animate-pulse或自定义 CSS keyframesscale 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 状态变化:
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 扩展,折叠指示器使用 • 或自定义图标(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"。 - 新建标签:右侧
+按钮,点击后创建空查询标签。 - 标签状态存储在
zustandstore 中,切换标签时通过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),上传后显示预览和"删除"按钮。
以上优化方案覆盖了审批变更、查询数据、系统设置三大核心模块的全部关键页面。每个方案均提供了具体的组件选型、布局参数、交互细节和视觉规范,可直接转化为前端开发任务。建议按照"查询数据(高频使用)→ 审批变更(核心流程)→ 系统设置(低频但影响全局)"的优先级顺序逐步实施。