feat(mcp): P0 只读 MCP tool runtime + opsxdb-mcp stdio

- aitools 共用 runtime:list/describe/schema/query/redis(纯只读,无写确认)
- 白名单 ~/.opsxdb/mcp.json;审计 mcp-audit.jsonl;复用 danger.go
- 桌面 connections 双写 ~/.opsxdb/connections.json(ox1. 解码)
- Cursor 配置示例与任务书验收勾选更新;写操作与 Agent UI 留 P1
This commit is contained in:
logan committed 2026-10-15 11:14:08 +08:00
1 parent 5c17d32647
commit 0b68c8344d
19 files changed
+1989 -79

No files matched your search

+164 -28
View File
@@ -1,6 +1,6 @@
# OpsxDB 待开发 / 待验证清单
> 维护:项目经理 / 全栈 / 测试补记 · 更新:2026-09-21
> 维护:项目经理 / 全栈 / 测试补记 · 更新:2026-10-14
> 已完成能力见各迭代验收;本文只列**未做完 / 待真实例 / P1 后置**,方便排人。
## 使用说明
@@ -8,7 +8,7 @@
- **P0**:影响主路径或已承诺,优先排
- **P1**:增强体验,可后置
- **环境缺口**:代码/表单已有,缺真实例才能验;有环境再测
- 改代码后:`./run.sh restart`(改 `apps/server` 必须重编)
- 改代码后:`./run.sh restart`(改 `server` 必须重编)
@@ -20,7 +20,7 @@
|----|------|------|
| `./run.sh web` 只起 Gin 官网/docs | **已做** | 浏览器不当客户端 |
| `:5174` 不作产品入口 | **已做** | 仅桌面 Vite 源;`web-only` 弃用提示 |
| `apps/web` / `packages/ui` | **保留** | Tauri `devUrl`/`frontendDist` |
| `src` / `src-tauri` | **保留** | Tauri `devUrl`/`frontendDist` |
| README 写清形态 | **已做** | 浏览器=站;操作=桌面 |
| 验收 | 待测 | `gui` 可用;浏览器无工作台主路径;`:8788` 官网/docs 通 |
@@ -50,7 +50,8 @@
| 键详情(TTL / 重命名 / Hash 增删改 / JSON) | 已交 2026-09-20 | 对标 ARDM + opsxsql |
| CLI 与 SQL 共用编辑器(Redis 按行、命令补全、通用 Do) | 已交 2026-09-20 | 不另开 CLI 页;独立 REPL 列为后置 |
| Sentinel / Cluster **表单 + 后端** | 已交 | — |
| Cluster 真实例测连 + 键浏览 | **本地 3 主拓扑已实测**(2026-09-21:表单建 Cluster 连接、跨分片扫键 19/19 全量、键值/行操作回归) | Sentinel 仍缺真实例 |
| Cluster 真实例测连 + 键浏览 | **本地 3 主拓扑已实测**(2026-09-21:表单建 Cluster 连接、跨分片扫键 19/19 全量、键值/行操作回归);2026-10-15 复验修复后 SET/GET/DEL 跨槽正常(见文末补记) | — |
| Sentinel 真实例 | **已实测**(2026-10-15:docker 起最小拓扑 master+sentinel,FailoverClient 经 sentinel 解析 master,SET/GET/SCAN 键列表/多 DB 0-15 全通;测后容器已清理) | 多 sentinel/主从切换 failover 场景未测 |
| Sentinel / Cluster 文档 | 已交 2026-09-20 | `08-redis.md` / `04-connect.md` |
| 独立 Redis CLI Tab / 监控 / 慢日志 | 后置 | 对标 ARDM CliTab、opsxsql 监控页;非主路径 |
@@ -58,15 +59,52 @@
## 3. 右键菜单
| 项 | 状态 | 待办 |
|----|------|------|
| 编辑器自绘(执行选中/当前语句、剪贴板、拦系统菜单) | 已收 | 回归防回退 |
| 对象树:库 / 表 / Redis 键 P0 | 已收 | — |
| 结果表自绘菜单 | 未做(仅吞系统菜单) | P1:复制单元格/行、导出入口等 |
| 美化 SQL / 含引号复制 / 创建片段 / AI 自动填充 | P1 | 编辑器右键增强 |
| 表:设计结构 / 重命名 / 生成 SQL(CREATE·INSERT)/ 导出 | P1 | — |
| 库:执行 SQL 文件 / 导出转储 / 新建表 | P1 | — |
| Navicat 级:同步、比较、权限、BI、逆向… | 后置 | 明确不做除非立项 |
**2026-10-14 对比优化后状态:主路径已补齐一轮,尚未全部验收。** 设计评分与详细不足见 [GUI 对比报告](GUI-COMPARISON.md)。下表覆盖历史补记中相关「已做」口径;已有工具栏功能不等于已接入右键。标记「已接入」表示代码已落地,仍需在桌面 Tauri 中逐项验收,源码与单测不替代实机及方言验证。
| 编号 | 优先级 / 区域 | 功能 | 当前状态 | 待开发 / 验收要求 |
|------|---------------|------|----------|-------------------|
| 1 | P0 编辑器 | 格式化 / 美化 SQL | 已接入右键,与工具栏复用 | 有选区仅格式化选区,无选区格式化全文;待桌面回归撤销与各方言 |
| 2 | P0 编辑器 | 执行选中 / 当前语句 | 右键已有,共用执行逻辑 | 回归选区、空白处、语句边界,与工具栏行为一致 |
| 3 | P0 编辑器 | 注释 / 取消注释 | 已接入 CodeMirror 注释命令 | 覆盖选区与当前行;非 SQL 驱动禁用;待桌面方言回归 |
| 4 | P0 编辑器 | 复制为纯文本 / 带连接信息 | 已接入,两种复制方式 | 无选区复制全文;连接摘要仅白名单字段,不含用户、密码、SSH 密钥;剪贴板失败不删除选区 |
| 5 | P0 编辑器 | 查找替换 / 跳转到定义 | 搜索替换已接入;明确表名可跳 DDL | 仅解析已加载元数据中的明确标识符,跳过字符串/注释;别名、CTE、未加载对象和复杂解析仍后置 |
| 6 | P0–P1 库 / Schema | 新建查询(带当前库) | 已绑定所点库并持久化 | 普通新查询继承连接默认库;旧标签库不随默认库改变,已有单测;PG Schema 独立上下文见第 10 项 |
| 7 | P0–P1 库 / Schema | 刷新对象 | 已实现 | 回归刷新范围、加载态与失败提示 |
| 8 | P0–P1 库 / Schema | 复制连接串 / 主机端口 | 连接/库菜单已增加无凭据地址与主机端口 | IPv6 已覆盖;完整 JDBC、Oracle SID、Redis Sentinel/Cluster 多节点 DSN 仍需按驱动完善,当前地址不宣称可直接导入全部客户端 |
| 9 | P0–P1 库 / Schema | 断开 / 重连 | 部分:连接节点已有,库节点没有 | 补齐库节点入口或明确归属连接入口;验证状态同步与失败反馈 |
| 10 | P0–P1 库 / Schema | 设为默认库 | 部分:修改保存的连接配置 | 补齐会话语义:MySQL 默认库切换、PG Schema 的 `SET search_path`;验证后续查询与重连,不只显示成功提示 |
| 11 | P1 表 / 视图 | 打开表数据 / 前 N 行 | 已接入前 N 行输入(1–10000) | 通过请求分页传递行数,不向预览 SQL 固化 LIMIT;已加载结果每批显示 500 行,可继续展开;待真库分页与大结果验证 |
| 12 | P1 表 / 视图 | 查看表结构 / DDL | 已有,DDL 按驱动能力控制 | 回归表与视图、目标对象及不支持引擎的禁用状态 |
| 13 | P1 表 / 视图 | 生成 SELECT / INSERT 模板 | 已接入并新开带库查询,避免覆盖草稿 | 视图不提供 INSERT;引用列名与限定名;INSERT 为待填值模板,待真库方言回归 |
| 14 | P1 表 / 视图 | 导出表 CSV / JSON(可后置) | 部分:表右键已接「转储 SQL 文件」三态(2026-10-14,见文末补记);CSV/JSON 整表右键直达仍缺 | 复用导出能力,明确整表与当前结果范围,验证格式与失败提示 |
| 15 | P1 表 / 视图 | 清空表 / 删除表 | 已实现,按能力裁剪并危险确认 | 回归取消不执行、确认后执行及刷新;视图不显示清空表 |
| 16 | P1 表 / 视图 | 复制表名(带库前缀) | 已增加限定名复制 | MySQL 使用库前缀,PG/MSSQL 使用 Schema;标识符转义已有单测,异常元数据命名仍需真库回归 |
| 17 | P1 结果集 | 复制单元格 / 行 / 列(TSV) | 已接入单元格、行号、列头和空白菜单 | 基于实际右键目标与当前排序;TSV 不含表头,保留 NULL/JSON 并引用制表符/换行;待桌面剪贴板验收 |
| 18 | P1 结果集 | 复制为 INSERT / JSON | 已接入当前行 INSERT/JSON 与当前结果 JSON | INSERT 使用结果自身记录的表来源;任意 SQL 无可靠来源则禁用;不猜测全局表名 |
| 19 | P1 结果集 | 导出当前结果 | 右键已接入 CSV / JSON | 复用当前结果导出;只导出当前已加载结果,不冒充整表;待桌面保存文件验证 |
### 第二轮:数据展示、上下文操作、视觉细节
产品原则:借鉴 DBFlux 的布局与上下文层级,借鉴 DBX 的实用功能和回归;保持操作简单,不堆功能。以下为代码已落地、待桌面视觉/交互验收项目。
| 方向 | 已落实 | 验收重点 / 剩余限制 |
|---|---|---|
| 数据展示 | 本地跨列筛选、匹配数、对象路径/列数/耗时;首批 500 行,可继续显示全部已加载行 | 明确本地筛选不查库;已移除固定 2000 行不可继续查看的限制;分批展示不等于虚拟滚动 |
| 值可读性 | NULL、空字符串、空白文本和布尔值区别展示;数值右对齐;长 JSON/文本详情可复制 | 详情只读;大整数文本排序已有精度回归,数据库原始值不改动 |
| 右键实用性 | 单元格:详情/复制;列头:列名/复制列/排序/适应列宽;空白:结果复制/导出 | 按目标隐藏无关操作,不堆一屏禁用按钮;Ctrl/Cmd+C、Shift+F10 和方向键待桌面回归 |
| 视觉层级 | 修复粘性表头被相对定位覆盖;轻量结果工具条、分批加载提示、双击列边界适应内容 | 浅深主题、窄窗、长列名、滚动和数字对齐待实机验收 |
| 连接右键 | 复用统一菜单:连接/断开、重连、编辑、复制、危险操作分组 | 视口约束、Esc、方向键、外点焦点保持;对象树旧菜单仍需后续统一 |
| 状态与正确性 | 列宽/排序按结果集保存,切换时阻止旧状态串写;写回/回滚只更新原结果集;来源不明确禁用 INSERT/写回 | 已新增跨结果更新回归;真实数据库失败与切换时序仍待验证 |
下一轮:完成桌面右键任务验收、PG Schema 默认路径与连接池隔离;之后完善整表导出、驱动专属连接串和真正虚拟滚动。断开/重连归属连接节点,第 9 项的库节点入口暂不重复添加。
本轮验证:前端构建与类型检查通过,54 项测试通过,Go 编译通过;覆盖复制/标识符/库上下文、跨结果集更新、筛选、数值排序与长值展示。新增菜单支持上下方向键、Home/End、Enter、Esc、视口约束与焦点归还。桌面操作工具未获准访问 OpsxDB,视觉、剪贴板与真库验收仍待完成;不据此将评分自动上调。
统一验收:选区与空白右键、菜单视口边界、Esc / 外点关闭、禁用项说明、操作后焦点恢复;涉及执行的操作复用现有危险确认与错误反馈。仅在桌面验收,不把 `:5174` 作为浏览器产品入口。
核查入口:`src/Workspace.tsx` / `src/SqlEditor.tsx`(编辑器)、`src/ObjectTree.tsx` / `src/ConnectionSidebar.tsx`(树与连接)、`src/ResultPane.tsx`(结果集)。
其他后置项:创建片段、AI 自动填充、表重命名、UPDATE/DELETE 模板开放、执行 SQL 文件、索引/外键编辑(设计表 v1 与转储/新建表已于 2026-10-14 落地,见文末补记)。同步、比较、权限、BI、逆向等不在本轮范围,需另行立项。
---
@@ -85,20 +123,25 @@
| 项 | 状态 | 待办 |
|----|------|------|
| 多结果集 / 执行计划 / 书签 / 查询历史 | 已收 | — |
| 多结果集 / 书签 / 查询历史 | 已收 | 执行计划按钮及结果页签按用户要求移除;不再列入近期开发 |
| 查询取消 | 已收 | — |
| 内联编辑 / 多格粘贴 / 行删 / 撤销本格 | 已收 | — |
| 虚拟滚动大数据集 | 部分(限显截断) | P1:真虚拟滚动 |
| 深色/浅色主题切换 | **已做**(2026-09-21 核正:顶栏按钮 + 偏好持久化已有) | — |
| 深色/浅色/随系统主题 | **已做**(2026-10-14 补「随系统」:设置三段选择 + `prefers-color-scheme` 监听,系统切换即时生效,编辑器高亮跟随生效主题) | 桌面切换系统外观实测 |
---
## 6. AI
## 6. AI / MCP / Agent
> 任务书:[15-AI-MCP-Agent.md](15-AI-MCP-Agent.md)(2026-10-15:**MCP-first**,内部会话共用工具层)
| 项 | 状态 | 待办 |
|----|------|------|
| 右侧 AI 面板可开关 | 已收 | — |
| 真模型接入(生成/解释/优化) | stub | 接配置与流式输出 |
| 真模型接入(生成/解释/优化) | **已接**(2026-10-14:Provider 预设 + 三协议,见 §23 补记) | 桌面接真实云端 key 验收;流式输出后置 |
| MCP 最小工具集 + 安全策略(**P0 纯只读**) | **本轮落地** | `aitools` + `opsxdb-mcp` stdio;白名单/审计/connections.json 双写;写+确认=P1;验收盯 MySQL/PG/Redis |
| 内部 Agent 会话(共用 tool runtime) | 未做(P1) | Ask \| Agent UI(设计阶段 2 先只记文档);多轮 + 步骤展示 |
| GUI 联动(插入编辑器 / 结果网格) | 未做(P1) | 设置页 MCP 配置片段 |
---
@@ -166,8 +209,8 @@
| B 层协议冒烟 | 已做;**不摘标** | 真 TiDB/Polar/OB/Gauss/Kingbase/TDSQL 实例到位再验 → 再谈 `verified` |
| Oracle / 达梦 | 环境限 / 未接入 | 2026-09-20 Oracle 容器起了但 ORA-00442;达梦未接入 |
| Redis Sentinel·Cluster 真拓扑 | 表单+字段校验已绿 | 有拓扑:测连 + 键浏览(扫/看/删) |
| 结果表自绘菜单 / 右键 P1 | 未开 | 全栈落地后按产品清单验 |
| 改 `apps/server` 后 | 约定 | 验收前确认 `./run.sh restart`,避免旧二进制误判 |
| 结果表自绘菜单 / 右键 P1 | 代码已接入,待桌面验收 | 按 §3 核对右键目标、排序后复制、NULL/换行、多结果切换与文件保存 |
| 改 `server` 后 | 约定 | 验收前确认 `./run.sh restart`,避免旧二进制误判 |
验收时勿并开多个 `dbctl` 库;结论回写本文件或群对齐即可。
@@ -177,12 +220,12 @@
| 项 | 状态 | 说明 |
|----|------|------|
| SQL 编辑器右键 P0 结构 | 已钉 | 执行选中/当前语句 · 查看数据/DDL · 剪切复制粘贴全选;禁系统菜单 |
| SQL 编辑器右键 P0 结构 | 2026-10-14 已扩充 | 格式化、注释、搜索替换、定义跳转与连接摘要复制;实际边界见 §3 |
| 对象树三套 P0 线框 | 已钉 | 库 / 表 / Redis 键;P1 虚线项见群线框与 §3 |
| Redis Sentinel·Cluster 表单字段 | 已钉 | 同页切部署模式;节点列表 · masterName · 双密码;Cluster 无 DB 索引 |
| 引擎缺图 fallback | 待验 | 灰底首字母,禁用蓝 `?`;未就绪灰 / 未验收橙+悬停 |
| 对象树右键 P1 视觉 | 未开 | 生成 SQL ▸ · 导出 ▸ · 设计表 · 新建表 等,全栈开做时补密度 |
| 结果表自绘菜单 | 未开 | 与全栈 P1 对齐出结构 |
| 结果表自绘菜单 | 已接入,待视觉验收 | 标题标明列目标、操作分组、方向键导航、视口约束与焦点恢复 |
| 顶栏文案 | 已收 | 连接 · 新建连接 · 新建查询 · 查询历史 · 快捷键 |
线框产物(本机):`~/devops/opsxdb/.ui-review/ctx-menus/`。新增设计待办只改本文件。
@@ -202,7 +245,8 @@
| zset Score 毫秒/秒时间戳 → 可读时间副显(`tsLabel`,误判有单测) | 已做 |
| 表格分批渲染:首屏 100 行 + 「加载更多(已显示 X / 共 Y)」 | 已做 |
| 集群跨分片 SCAN(`scanAll` ForEachMaster,本地 3 主 19/19 键实测;编辑器 SCAN 同步修) | 已做 |
| SCAN 游标分页(HSCAN/ZSCAN cursor,>500 大键真翻页) | **未做**(P1) |
| Key 树 SCAN 续扫(单机/Cluster 按主节点保存游标,逐页合并去重) | 已做;真大键空间/集群拓扑变化待桌面复验 |
| Hash/Set/ZSet 值分页(HSCAN/ZSCAN cursor,>500 大键真翻页) | 已有续载实现;真实大键待复验 |
| 批量操作(多选删/按 pattern 批删/导出导入)、监控 INFO/慢日志、更多 viewer(hex/msgpack) | 后置 |
| Sentinel 真拓扑联调 | 环境缺口 |
@@ -213,11 +257,12 @@
| 查询历史:去重置顶、一键重跑 ▶、过滤框、耗时/行数/失败红标(上限 200) | 已做 |
| 点表名打开前 100 行(单击延迟/双击立即,脏 Tab 确认) | 已做 |
| Tab 标题表名化(打开表的新 Tab 显示表名而非「查询 N」) | 已做 |
| 表右键:生成 SELECT/INSERT/UPDATE/DELETE(列感知+方言引号+主键 WHERE)+ 截断/删除表(危险确认) | 已做 |
| 库右键:新建查询 | 已做 |
| 表右键:生成 SELECT/INSERT/UPDATE/DELETE(列感知+方言引号+主键 WHERE)+ 截断/删除表(危险确认) | 历史交付记录;2026-10-14 已补 SELECT/INSERT 菜单,UPDATE/DELETE 模板未开放;截断/删除已接入,当前状态见 §3 |
| 库右键:新建查询 | 2026-10-14 已补所点库上下文与持久化回归,见 §3 |
| 结构页:索引/外键/触发器区块(MySQL 族 information_schema,前端直连) | 已做 |
| 表设计器 / 表重命名 / CREATE TABLE 生成 / 数据导出(CSV/转储) | **未做**(P1) |
| 结果表自绘右键 | **未做**(P1,仍仅吞系统菜单) |
| 表设计器 / 表重命名 / CREATE TABLE 生成 | **未做**(P1);右侧结构查看已有字段及部分引擎的索引/外键/触发器,不等于修改能力 |
| 数据导出(CSV/JSON/INSERT/整表/完整查询) | **已有部分入口**;表右键、流式大表验收、文件与失败处理仍待完善,详见专项盘点 |
| 结果表自绘右键 | 2026-10-14 已补复制与导出,桌面验收待办见 §3 |
### 去 Web 客户端收尾(在 §「去 Web 客户端」基础上)
| 项 | 状态 |
@@ -227,7 +272,7 @@
| CORS 收紧:仅留 5174(桌面 devUrl)与 tauri:// 两个来源 | 已做 |
| 文档/官网口径统一:删「Web 自托管」形态卡与双形态表述;FAQ 明确「浏览器不能操作」 | 已做 |
> 验收口径:以上「已做」项均经 桌面 App 实测(本地 MySQL/Redis 单机 + 3 主 Cluster)或单测覆盖(38 例全绿);测试侧复跑按 §11 流程。
> 历史验收口径:当时「已做」项经桌面 App 实测(本地 MySQL/Redis 单机 + 3 主 Cluster)或单测覆盖(38 例全绿);不代表迁移后的当前状态,右键菜单以 §3 的 2026-10-14 核查及后续桌面复验为准。测试侧复跑按 §11 流程。
## 23. 三项目状态收敛 + opsxdb 设置重构与 DataGrip 高亮(2026-10-14)
@@ -238,4 +283,95 @@
| 「连接已断开」横幅移除 | 已做:整条顶部红色横幅删除(状态行已有提示,顶部横幅不友好);重连能力保留 |
| SQL 高亮 DataGrip 风 | 已做:关键字亮蓝加粗 / 字符串红 / 数字浅绿 / 注释灰斜体 / 标识符浅灰白;light 同构对齐 IntelliJ |
| opsxapi 迁移 | 回滚到可用基线 6452026(apps 布局保留)——用户确认只做 opsxdb;迁移半成品已弃 |
| 修复:GUI 样式全丢(白底裸控件) | 已修:根级迁移漏了 tailwind.config.ts / postcss.config.js(content 路径已改 ./src + ./packages/ui)与 index.html/public 资源;CSS 产物 12KB→32KB(Tailwind 全量恢复)。教训:单包迁移 checklist 应含样式链 |
| 修复:GUI 样式全丢(白底裸控件) | 已修:根级迁移漏了 tailwind.config.ts / postcss.config.js(content 路径已改 ./src)与 index.html/public 资源;CSS 产物 12KB→32KB(Tailwind 全量恢复)。教训:单包迁移 checklist 应含样式链 |
- 2026-10-14:完成根级 Tauri 2 目录整理,移除 apps/packages 重复副本,修复启动、打包、sidecar 路径及图标引用;homepage 未改动。
### 对象树与 dbx 表操作补充(2026-10-14)
- 库下保留表、视图、存储过程、函数四类分组,按驱动能力裁剪;视图现在可展开字段。
- 表下增加索引、外键、触发器分组,展开时才查询;支持独立刷新、复制名称和定义/详情,失败提示重试,未适配引擎明确提示。MySQL 系列、PG 系列、SQLite 已实现目录查询,真实引擎兼容性待验收。元数据最多取 1000 项并提示截断。
- 表右键补齐「查看结构」及「复制建表 / 视图 SQL」,与已有查看数据、前 N 行、DDL、复制名称、SELECT/INSERT 模板、刷新、危险确认操作组成常用菜单。
- 当时对 dbx 截图的后续清单:重命名、表级导入、克隆表;UPDATE/DELETE 模板及表级 CSV/JSON 导出已在后续落地。关系图、数据比较后置;检查约束尚未接入。
- 验证:新增目录查询边界测试;桌面展开/收起、主题、右键定位及真实数据库权限、目录兼容性仍需验收。
### AI 与 Redis 易用性(2026-10-14)
- AI 数据库上下文优先跟随 SQL 标签的当前库;输入区展示连接/库。精简顶部重复选择器和快捷按钮为底部操作选择、多行输入、简短空态。响应仅写入原标签且不覆盖等待期间修改的 SQL。
- Redis Key 搜索框支持回车/搜索按钮;单机各 DB 节点和 Cluster 顶部有独立搜索。输入阶段不请求服务端;无通配符时自动按 `*关键词*` 扫描,完整同名 Key 单独置顶;每批最多 20 次 SCAN(COUNT 200 为提示而非硬限制)、通常返回约 500 项。后续已加入「加载更多」游标续扫;有限扫描无命中不代表 Key 不存在。Cluster 只显示 Key 树,隐藏 DB0 层。
- SQL 工具条可切 Redis 单机 DB0–DB15;切换连接时选择该连接的查询标签,或新建一个标签,AI 库上下文只读取当前连接对应的标签。新建/重选旧标签及命令执行统一校正 Redis 库号,Cluster 固定 DB0 并拒绝 SELECT 切到非零库。AI 操作改为可见选项,删除“方言”。Key 树仅标有效期,不重复标“永久”;键详情可修改 TTL 并保存,0 秒禁止误删。
- 集群拒绝连接增加可操作诊断;本机未发现 7001 监听。需确认用户的种子地址与节点公布地址,不能宣称连接故障已修复。
- 前端构建及 81 项测试通过,Go 编译及 2 项无网络扫描预算回归通过;需监听端口的 Redis 集成测试受沙箱限制,真实集群和桌面视觉仍待验收。
### 工作台标签整理(2026-10-15)
- 启动时无内容的「查询 1」只作为内部编辑器占位,有实际标签时自动移除;表预览命名为「表名@库名」,旧表标签按当前库显示同样格式。标签只显示驱动图标、名称和未保存标记,连接名移至悬停提示;选中态和关闭按钮统一整理。相同表的当前预览可重复刷新,不再生成同名标签;已有 SQL/草稿不会被表预览覆盖。
- 验证:82 项前端测试、前端构建通过;真实桌面窄窗口和多标签滚动仍待视觉验收。
### 表设计器对比与增强(2026-10-15)
- 对照 dbx 结构编辑器和 Navicat 截图:此前弹窗只有字段单页与列级 DDL,宽度不足,缺少普通索引与表注释编辑。借鉴分区标签、紧凑网格、固定预览层级;DBFlux 的代码重点在 Schema 树与浏览,当前未直接复制第三方实现。
- 设计器改为大工作区与字段/索引/外键/触发器/SQL 预览分区。MySQL 系列可编辑普通 BTREE、唯一/复合索引与表注释;特殊索引只读,PG/SQLite 索引及外键/触发器只读。字段排序仅新建表有效。元数据读取失败、存在不支持的变更时禁用应用;实际应用前展示 DDL 确认。
- 修复 MySQL 列 `Extra` 未传递造成自增属性在字段修改时可能丢失的问题。索引 DDL 与转义有单测,真实桌面交互、MySQL/MariaDB 兼容性以及结构漂移校验仍待验收。
### 查询标签的 USE 切库(2026-10-15)
- 普通 SQL 通过当前标签的库发给本机会话,后端按库打开连接池。原先 MySQL/SQL Server 的 `USE` 只修改池中的单条物理连接,标签与下一条语句可能仍指向旧库;现改为验证目标库并更新发起执行的标签,脚本中后续语句读取新库。无效语法或目标库不可用不改变标签,并停止该批次后续语句以免在旧库误执行。PG 改用工具条切库;Redis 单机 `SELECT n`、集群 DB0。
### 库、表、表设计与数据迁移专项盘点
详见 [DATABASE-OPERATIONS-AUDIT.md](DATABASE-OPERATIONS-AUDIT.md)。右侧结构页已复用对象树的 MySQL/PG/SQLite 元数据查询,查询失败单组提示并可重试;AI 晚到 SQL 的原标签/未保存状态和切库保护已有回归。下一步真库核对与树节点定位 → 字段/索引设计及 DDL 预览 → CSV 导入 → 表级导出完善 → 逻辑备份与恢复。规划项未标为已完成。
### 主题随系统 + AI 真模型接入(2026-10-14 · 参考 opsxshell)
| 项 | 状态 |
|----|------|
| 设置→常规主题三段:深色 / 浅色 / 随系统(`prefers-color-scheme` 监听,系统切换即时生效;编辑器高亮跟随生效主题而非原始偏好) | 已做,桌面切换系统外观待实测 |
| AI Provider 预设(DeepSeek / OpenAI / Qwen / Kimi / GLM / MiniMax / Anthropic / Gemini / Ollama / 自定义,选预设自动填 Base URL、协议、默认模型;`src/aiPresets.ts`) | 已做 |
| AI 三协议:openai-chat / openai-responses / anthropic(`x-api-key` + `anthropic-version`),Go 端 `server/internal/ai/remote.go` 按协议分派,旧配置按 provider 推断协议 | 已做 |
| 安全:Base URL 默认仅放行 HTTPS;本地/内网 HTTP 需在设置中显式开启(Ollama 预设默认开启且免鉴权 `authStyle=none`) | 已做 |
| 修复:保存 AI 配置时 key 留空不再静默清空已存 key(服务端合并旧值);LoadConfig 补读 protocol/authStyle/allowInsecureHttp | 已修 |
| 验证:Go ai 包单测(endpoint 校验/三协议解析/协议推断)、前端 aiPresets 测试、64 项前端测试;后端重启后端到端(anthropic 配置回读、HTTP 拦截文案、本机 Ollama 实连返回 404 model not found 证明链路通) | 已过;真实云端 key 桌面验收待做,流式输出后置 |
### 表设计器 v1 + 转储 SQL + ⌘/ 注释(2026-10-14 · 参考 dbx/rustgrid)
| 项 | 状态 |
|----|------|
| 表右键「设计表…」/ 库右键「新建表…」→ 设计器 v1(`src/TableDesigner.tsx`):字段网格(名/类型/长度/NULL/自增/主键/默认/注释)+ 实时 DDL 预览 + 应用 | 已做,真库验收待做 |
| 设计器 DDL 生成(`src/tableDdl.ts`):新建 = 方言化 CREATE(MySQL 族 ENGINE/CHARSET、PG 族双引号);编辑 = 列级 diff ALTER(MySQL ADD/DROP/MODIFY/CHANGE,PG TYPE/NOT NULL/DEFAULT/RENAME,主键组变更 ADD/DROP PRIMARY KEY);SQLite 仅建表+ADD COLUMN,其余注释说明不静默生成 | 已做,11 项单测覆盖 |
| 应用走 execSql,ALTER/CREATE 命中服务端危险词表自然进入二段确认;应用后自动刷新对象树 | 已做 |
| 表右键「转储 SQL 文件 ▸」三态(仅结构 / 仅数据 / 结构和数据),服务端 `POST /api/db/dump` 流式输出 .sql(结构=SHOW CREATE TABLE/拼装 DDL + 注释头;数据=复用 insert 编码;不带 DROP TABLE) | 已做 |
| 快捷键修正:`⌘/`(Mod-/)= 注释/取消注释(CodeMirror toggleComment,对齐 dbx/dbflux/navicat 惯例);帮助面板改 `⌘⇧/`(⌘?);设置与帮助浮层文案同步 | 已做 |
| 验证:前端 75 项测试全绿、tsc 通过、Go build/vet 通过;MySQL 3306 真库端到端(建库建表插数据 → 三种转储模式输出正确、文件名头正确、`库.表` 参数归一) | 已过 |
| 桌面验收清单:设计器新建表→改字段→改主键全流程、转储大表流式与取消、⌘/ 在选中/单行/Redis 命令模式行为 | 待做 |
设计器 v1 后续:普通 MySQL 索引已可编辑,特殊索引和 PG/SQLite 索引仍只读;外键/触发器编辑、引擎/字符集选项、重命名表、克隆表、结构漂移重校验仍待做,详见审计文档。
### 表右键与 Redis 键视图细节(2026-10-15)
| 项 | 状态 |
|----|------|
| 表右键按「生成 SQL / 导出数据 / 转储 SQL」折叠,SQL 提供 SELECT、INSERT、UPDATE、DELETE、DDL 五项;CSV/JSON 可输入最多 500000 行上限,默认 100000;达到上限可能不完整,不能代替备份 | 已做;复合主键和大表导出回归待做 |
| Redis Cluster 在隐藏 DB0 层的键树顶部提供搜索;单机与集群统一「加载更多」;String 默认 Raw、切 JSON 格式化高亮并可编辑、复制值;集群连接地址显示配置的种子节点(例如 127.0.0.1:7101) | 已做;真实多主大键空间及视觉验收待做 |
| CSV 导入向导(预览/列映射/错误行)、结构只读比较、数据比较、导出 XLSX、整库备份/恢复 | 未做;按 `docs/DATABASE-OPERATIONS-AUDIT.md` 的依赖与优先级实施,不加无效按钮 |
### Redis 集群连接失败定位与修复 + 标签确认精简(2026-10-15)
| 项 | 状态 |
|----|------|
| 集群诊断结论:`opsxdb-redis-cluster3`(7101-7103,3 主 16384 槽)健康、宿主机可直连;`opsx-redis-cluster`(:7000)是 `cluster_state:fail` 的孤儿容器(0 槽、无 meet);旧地址 7001-7003 已无监听 | 已定位,**集群无需重启**;建议删除 7000 坏容器避免误连 |
| 修复:`redisMode` 未显式选择但填了多个节点时自动按 Cluster 处理(Sentinel 需显式选+masterName 不受影响);单机客户端收到 MOVED/ASK 时错误文案附「切换部署模式为 Cluster」指引 | 已修,`redis_mode_test.go` 补推断与提示单测 |
| 端到端(127.0.0.1:8790 临时实例):显式 cluster 与省略 mode 两种方式 SET/GET/DEL 跨槽键全部正常(此前同键 MOVED 直抛);单机 6379 PING 回归正常 | 已过 |
| 移除「当前查询未保存…新开标签写入 SELECT?」确认:新开标签不覆盖任何内容,确认无意义;改为 dirty 时直接新开。关闭标签的未保存确认保留(会丢内容) | 已改,前端 75 项测试回归全绿 |
| ⚠ 环境冲突待用户处理:`:8788` 被同族 `opsxapi` 的 `opsxdbapi-server` 占用(2026-10-15 00:06 启动,两项目默认同端口);`./run.sh gui` 探测 health 命中后误以为 opsxdb 后端已运行。需停掉 opsxapi 或为其改端口 | 待用户决策 |
### Redis 键浏览与编辑安全(2026-10-15 · 对照 ARDM / DBFlux / dbx)
| 项 | 状态 |
|----|------|
| 参照 ARDM 的暂停/继续 SCAN、DBFlux 的 Cluster 主节点独立游标:左侧单机各 DB 与 Cluster 键树提供「继续查找 Key」;每页最多 20 次 SCAN、通常约 500 项,跨分片续扫,同名 Key 合并,输入新搜索词重新从头查 | 已实现;SCAN 非快照,扫描期间增删 Key 仍可能重现或遗漏;真实多主集群大键空间待复验 |
| String 详情保存改为 `SET … KEEPTTL`,避免编辑清除原 TTL;Redis 6.0 前遇到不支持该参数时用原子脚本读取 PTTL/写回;并发时旧键消失会报错提示刷新 | 已修,真实 Redis TTL 往返待复验 |
| List 单行删除由 `LREM 1 value` 改为校验索引/原值的原子脚本,避免重复值误删前面一行;按排序/过滤后的真实索引编辑 | 已修;大列表脚本耗时及多人并发需真库复验 |
| 值详情已有 hash/list/set/zset 分页、过滤排序、行编辑及 TTL 设置;当前过滤仅作用于已加载行(不宣称全键搜索) | 已有;真大集合翻页待复验 |
| 借鉴 DBFlux 的可见键数量/内存大小、服务端 `SCAN TYPE` 和 stream 值管理,dbx 的搜索历史/视图状态与分组设置 | P1:先做服务器端类型筛选与大键提示,再评估 stream 编辑;搜索历史和自动滚动按实际使用反馈取舍 |
| CSV/JSON 键级导入导出、批量 UNLINK、离线 RDB 分析、监控/慢日志 | 后置:先验证单键安全与续扫,批量删除不能把 SCAN 结果当作完整集合 |