logan
|
bec2cafec2
|
feat: 执行结果结构化-每条SQL记录status/affected_rows/duration_ms + 去掉工单详情优先级字段
后端:
- 新增 SqlExecItem/SqlExecResult 结构体
- MySQL/Redis/gh-ost 三条执行路径全部改为 JSON 结构化结果
- 每条 SQL 记录完整语句、状态、影响行数、耗时(ms)、错误信息
- 总耗时/开始结束时间一并记录
前端:
- ExecuteResult 接口匹配后端 SqlExecResult
- 表格展示每条 SQL 执行结果(序号/SQL/状态/影响行数/耗时/错误)
- 汇总卡片: 状态/总耗时/SQL数量
- 去掉工单详情中的优先级和变更原因字段
- 保留 plain text fallback 兼容旧数据
E2E验证: INSERT+UPDATE+ALTER 三语句全部成功, 结构化结果正确
|
2026-06-03 02:15:37 +08:00 |
|
logan
|
1364c737ef
|
fix: 工单列表权限过滤-developer/auditor也能看到待审工单
- developer之前只能看applicant_id=自己的工单,导致审批人看不到待审工单
- 改为admin看全部,其他角色(包括developer/dba/auditor)都能看到自己提交+自己作为审批人的工单
- E2E全流程验证通过: testtest提交→test123初审→test234复审→admin执行→success
|
2026-06-03 02:06:20 +08:00 |
|
logan
|
bd8100bfe0
|
fix: 撤销工单支持approved状态 + DDL跳过EXPLAIN预检 + 审批菜单仅admin/dba + 审批状态流转修复 + 权限组实例绑定修复
|
2026-06-03 01:53:21 +08:00 |
|
logan
|
b1a3d74661
|
feat: 角色权限体系改造 — developer可审批, auditor纯只读
角色权限矩阵:
- admin: 全部权限
- dba: 数据源管理+工单全流程+审批+执行
- developer: 查询+提交工单+审批(不能执行)
- auditor: 只读(审计日志+审核规则+审批流程查看)
后端改动:
- ticket.go: 修复GetCurrentUser返回值顺序bug(userID,username,role)
- ticket.go: CreateTicket拦截auditor提交工单
- ticket.go: ApproveTicket允许admin/dba/developer
- ticket.go: ExecuteTicket仅允许admin/dba
- router.go: query执行限制admin/dba/developer
- router.go: workflow写操作限制admin/dba
- router.go: audit-rules写操作限制admin/dba
前端改动:
- menu.ts: tickets去掉auditor, workflow加developer+auditor, audit-logs加auditor
- useAuth.tsx: routePermissionMap和actionPermissionMap同步更新
- TicketDetailPage: canApprove加developer角色
DB迁移: test123/test234从auditor→developer
|
2026-06-03 01:19:24 +08:00 |
|
logan
|
97fd4ff069
|
fix: 数据变更工单拦截只读SQL — 前端提交/检测+后端创建三层拦截SELECT/SHOW/DESC/EXPLAIN
|
2026-06-03 00:48:09 +08:00 |
|
logan
|
70da8a8a8b
|
fix: 工单执行按钮仅在审核通过(approved)状态显示,审核中不再显示执行按钮
|
2026-06-03 00:38:12 +08:00 |
|
logan
|
bbf9522710
|
fix: 消息推送添加渠道placeholder改为数据变更消息机器人
|
2026-06-01 21:33:33 +08:00 |
|
logan
|
7564d92c69
|
fix: NotificationPage 添加渠道弹框 X 图标未 import 导致报错
|
2026-06-01 21:11:36 +08:00 |
|
logan
|
132b2db2d2
|
fix: 平台配置页面修复 - 隐藏LDAP重复分组、敏感字段列表textarea多行展示、分组排序优化
- 过滤ldap分组(有独立LDAP页面不重复展示)
- 敏感字段列表从单行input改为textarea每行一个字段名(key修正data_masking_sensitive_fields)
- 添加GROUP_ORDER固定展示顺序:查询控制→安全策略→数据脱敏→日志清理→执行器→Ghost/OSC
- 所有分组输入框均有默认值,cleanup组retention天数输入框正常显示
|
2026-06-01 21:07:44 +08:00 |
|
logan
|
9c457eb599
|
chore: Dockerfile gh-ost 版本更新 v1.1.9(macOS本地验证通过)
- gh-ost v1.1.9 真实执行验证通过(macOS arm64 + 远程MySQL)
- ALTER TABLE ADD COLUMN → gh-ost OK (6行表,~8秒完成)
- ALTER TABLE ADD INDEX → gh-ost OK
- ghost_enabled 默认 false,本地开发: ~/bin/gh-ost
|
2026-06-01 01:55:29 +08:00 |
|
logan
|
b2b689f791
|
feat: 工单执行集成gh-ost通道 + Dockerfile安装gh-ost + 密码解密修复
- ExecuteTicket: 检测 ghost_enabled + ALTER TABLE → 走 gh-ost 同步执行
- parseAlterTable: 解析 ALTER TABLE 提取表名和 alter 子句(支持反引号/db.table)
- buildGhOstTask: 修复密码传递(加密→解密后传给 gh-ost 命令行)
- Dockerfile: 运行阶段下载 gh-ost v1.1.6 Linux amd64 二进制
- ghost_enabled=false 默认关闭,工单流程正常走普通通道
- 端到端验证: ALTER TABLE+ghost_enabled=true → gh-ost; INSERT/关闭 → 普通
|
2026-06-01 01:47:08 +08:00 |
|
logan
|
bc2092a980
|
feat: 平台配置全面生效 — 配置策略接入实际逻辑
- query组: ExecuteQuery读取query_limit_max/query_timeout/query_dangerous_pattern
- 查询超时通过context.WithTimeout生效,db.QueryContext/QueryRowContext
- 危险模式检测拦截无WHERE的DELETE/UPDATE/DROP/TRUNCATE
- LIMIT上限从settings读取,不再硬编码1000
- security组: Login读取login_max_attempts/login_lockout_minutes
- 新增User字段: failed_login_attempts + locked_until
- 登录失败达到阈值自动锁定,成功时清除计数
- JWT Token过期时间读取session_timeout_hours设置
- executor组: ExecuteTicket读取executor_timeout/executor_dry_run
- 执行超时通过context.WithTimeout控制
- 开启dry_run时先EXPLAIN预检查SQL语法
- db.ExecContext替代db.Exec
- cleanup组: SettingsCleanupPreview/Run从占位改为真实实现
- 预览统计4类数据(工单/查询历史/慢日志/审计日志)待清理数量
- 执行清理按retention_days配置删除过期数据
- ghost组: 13项gh-ost配置加入seedDefaultSettings
- enabled/path/mode/osc_priority/env/cloud/trigger/chunk/load/lag等
- 已被ghost.go中getGhostConfig等函数读取
- 前端: PlatformConfigPage新增Ghost/OSC分组显示
|
2026-06-01 01:00:23 +08:00 |
|
logan
|
8af868b3ca
|
fix: 数据源编辑密码保留 + Redis ACL 认证支持
后端:
- UpdateInstance: 空密码和'******'都不更新密码字段,防止编辑后丢失密码
- testRedis/getRedisClient/getRedisMetrics: 增加 Username 参数支持 Redis 6.0+ ACL 认证
- username 为 'default' 或空时走传统密码认证模式
前端:
- EditInstanceDialog: Redis 用户名字段提示'6.0+ ACL 可选',密码 placeholder 改为'不修改请留空'
- CreateInstanceForm: Redis 类型也显示用户名输入框(可选),创建/测试连接时 Redis username 为空则不传
- Redis 提示文案从'无需用户名'改为'6.0+ ACL 支持用户名+密码认证'
|
2026-05-31 23:55:18 +08:00 |
|
logan
|
bfb64d4dce
|
fix: WorkflowEditor 下拉过滤禁用用户 — getEligibleUsers 增加 is_active 条件
- 审核阶段: 只显示 is_active=true 且角色为 admin/dba/auditor 的用户
- 执行阶段: 只显示 is_active=true 且角色为 admin/dba 的用户
- 禁用用户不再出现在审批流程编辑器下拉列表中
|
2026-05-31 23:35:58 +08:00 |
|
logan
|
1f9d373c08
|
fix: 审批流程编辑器按步骤类型过滤可选用户
- 审核阶段: 只显示 admin/superadmin/dba/auditor 角色用户
- 执行阶段: 只显示 admin/superadmin/dba 角色用户
- 全选按钮也基于过滤后的用户列表
- UserDropdown 改用 fixed 定位避免 overflow 裁剪
|
2026-05-31 23:22:08 +08:00 |
|
logan
|
aaa7666d66
|
fix: 统一所有弹框组件 padding + 主题风格
- ModalOverlay: 内容容器加 p-6 + border + shadow-xl
- alert-dialog: 统一主题变量 bg-[var(--dg-bg-secondary)] + rounded-xl
- sheet: SheetContent 加 p-6,移除 Header/Footer 重复 p-4
- drawer: DrawerContent 加 p-6,移除 Header/Footer 重复 p-4
- 所有弹框统一: p-6 padding + dg-border + shadow-xl + z-[101]
|
2026-05-31 23:08:08 +08:00 |
|
logan
|
363753653e
|
fix: DialogContent 添加默认 padding p-6,修复确认弹框布局压缩问题
- dialog.tsx: DialogContent 基础样式加 p-6 (24px padding)
- ConfirmDialog.tsx: 按钮区域间距 pt-2 → pt-4
- 修复所有使用 Radix Dialog 的弹框内容紧贴边缘的问题
|
2026-05-31 23:05:51 +08:00 |
|
logan
|
dce6b8cc28
|
refactor: LdapConfigPage 删除确认弹框统一使用 ConfirmDialog 公共组件
- 移除 LdapConfigPage 自定义 ModalOverlay 确认弹框
- 替换为 ConfirmDialog(variant=danger) 保持风格统一
- 清理未使用的 AlertTriangle import
- 全站确认弹框现已全部统一使用 ConfirmDialog 组件
|
2026-05-31 22:58:10 +08:00 |
|
logan
|
bef2f98f28
|
feat: 审批/执行角色权限校验 + LDAP用户禁止重置密码
- ticket.go: ApproveTicket 前置角色检查(admin/dba/auditor),ExecuteTicket 前置角色检查(admin/dba)
- ticket.go: 创建工单时自动从 instance.workflow_id 读取关联审批流程
- UsersPage.tsx: LDAP 用户重置密码按钮置灰(disabled+opacity-30+提示文案)
- 权限模型: 审核=管理员/DBA/审核员, 执行=管理员/DBA, 提交=所有角色
|
2026-05-31 22:20:24 +08:00 |
|
logan
|
b4c982d565
|
feat: 工单执行人直接执行(自动通过) + 审批时间线 + 执行结果展示
后端:
- 创建工单时检测是否有审核步骤,无审核步骤直接设为 reviewing
- ExecuteTicket 允许 reviewing 状态,自动通过 execute 审批记录再执行
- 验证执行人权限(非执行人返回 403)
- 列表 API 返回 has_audit_step/is_executor/is_approver 元信息
- 详情 API 返回 approvals 带 approver_name/actual_approver_name
前端:
- 按钮权限精确化:通过/拒绝只对审核人显示,执行只对执行人显示
- 详情弹框加载完整审批数据,展示操作时间线
- 时间线:提交人→每个步骤的指派人+实际操作人+操作时间+备注
- 执行结果文本格式 fallback 显示
- 失败工单显示失败原因
|
2026-05-31 21:58:52 +08:00 |
|
logan
|
cdb52aa4a9
|
feat: 工单审批流程支持 workflow 指定用户审批 + Redis 命令执行
1. 工单创建时读取 workflow_steps 的 approver_ids 创建审批记录
- 有指定用户:为每个用户创建审批记录(任一通过即可)
- 无指定用户:按 approver_role 角色匹配 fallback
- 无 workflow:默认 admin 审批
2. Redis 工单执行:复用 getRedisClient + parseCommandParts 执行写命令
- 支持 SET/DEL/HSET 等所有写操作
- 解析 db0/db1 格式的目标库
- 返回 [OK] 命令 → 结果
|
2026-05-31 21:40:30 +08:00 |
|
logan
|
c5270f82c1
|
fix: 批量删除用户改用 ConfirmDialog 替代浏览器原生 confirm()
- handleBatchAction 删除分支改为 setDeleteConfirm 弹 ConfirmDialog
- 确认后执行删除,取消则关闭弹框
|
2026-05-31 14:34:21 +08:00 |
|
logan
|
6a53eb8bdf
|
fix: Redis sidebar点击key直接替换编辑器内容而非追加拼凑
- Redis类型: 点击sidebar key直接 setSql(text) 替换,避免多条命令堆叠
- SQL类型(MySQL/PG): 保持追加行为,用空格连接
- 修复 \n 转义字符问题(双反斜杠→单反斜杠)
|
2026-05-31 02:36:01 +08:00 |
|
logan
|
24c633d9f0
|
feat: ZRANGE WITHSCORES JSON自动解析为结构化表格 + Redis审计规则 + 前端安全检查
- ZRANGE WITHSCORES 自动检测JSON member,展开为 open/close/high/low/volume 等独立列
- Redis 审计: 只读命令安全,写命令warning,FLUSHALL等危险命令error
- TicketCreatePage: auditResult.findings 添加 undefined 安全检查
- 审计API支持 instance_id 自动解析 db_type
|
2026-05-31 02:07:10 +08:00 |
|
logan
|
9c5cb04cfa
|
fix: Redis集群查询+metrics修复 — 单节点连接替代ClusterClient
- crypto.go: decryptPassword 自动处理 enc: 前缀,避免调用方遗漏
- redis.go: getRedisClient 统一使用 redis.NewClient 单节点连接
ClusterClient 拓扑发现(CLUSTER SLOTS)在Docker内网IP不可达时超时
redisClientWrapper 全部方法改为使用 Client (不再走 ClusterClient)
ScanAllKeys 简化为单节点 SCAN
- connection_tester.go: getRedisMetrics 统一单节点连接采集metrics
删除 isCluster 分支的 ClusterClient 代码,避免5秒超时
|
2026-05-31 01:30:10 +08:00 |
|
logan
|
e9a700b9d9
|
fix: Redis 查询格式修复
- rows nil → 空数组: rowsOrDefault() 确保 HGETALL/LRANGE 空集合返回 [] 而非 null
- 扩展只读白名单: PING/CONFIG/CLIENT/SLOWLOG/CLUSTER/MEMORY/OBJECT/DEBUG 等
- 前端 sortedResult: Array.isArray() 检查防止 raw_text 模式报 not iterable
|
2026-05-31 00:34:38 +08:00 |
|
logan
|
e8fd5f6b63
|
fix: LDAP导入用户 auth_source 修复
- BatchImportLdapUsers: 设置 AuthSource='ldap' + HashedPassword='-' + IsActive=true
- 修正已有 zhangsan/lisi/wangwu 用户 auth_source 从 local 改为 ldap
|
2026-05-31 00:18:43 +08:00 |
|
logan
|
31db229d70
|
feat: MySQL/PG 实时指标采集 + 版本检测修复 + 密码加密存储
- 新增 getMySQLMetrics(): SHOW GLOBAL STATUS 采集连接数/QPS/延迟/运行时间
- 新增 getPostgresMetrics(): pg_stat_activity 采集活跃连接+运行时间
- 修复 extractVersion(): 支持 Redis 'version: 7.4.9, mode: standalone' 格式(逗号截断)
- CreateInstance/UpdateInstance: 创建/更新时自动加密密码(enc: 前缀)
- InstanceMetrics handler: MySQL/PG 分别调用专属 metrics 函数
|
2026-05-31 00:15:18 +08:00 |
|
logan
|
433e7e2909
|
feat: ARDM风格查询页优化 — 可拖拽Sidebar + Redis差异化结果展示 + KeyHeader\n\n1. Sidebar可拖拽宽度(200-600px, localStorage持久化)\n2. Redis raw_text展示加ARDM KeyHeader: key名+类型标签+TTL+格式标签+复制按钮\n3. HGETALL结果用field/value紧凑双列展示替代通用表格\n4. 后端raw_text模式自动查询key TYPE和TTL返回raw_type/raw_ttl
|
2026-05-30 18:20:22 +08:00 |
|
logan
|
4e6f9eb8fd
|
fix: Redis集群SCAN遍历所有master节点 + 查询结果布局调整\n\n1. ScanAllKeys(): 集群模式用ForEachMaster遍历所有master节点SCAN合并去重\n2. RedisScanKeys/KEYS命令均改用ScanAllKeys,确保集群不遗漏key\n3. QueriesPage布局: sidebar独立左侧,查询结果只在编辑器下方不被sidebar占据宽度
|
2026-05-30 15:28:38 +08:00 |
|
logan
|
430a667455
|
fix: Redis命令解析支持引号参数(parseCommandParts替代strings.Fields)\n\nstrings.Fields()会将引号当作参数的一部分,导致HGET带引号查询失败\n新增parseCommandParts()函数支持双引号和单引号包裹的参数
|
2026-05-30 14:47:21 +08:00 |
|
logan
|
c51f619a7d
|
feat: 实现LDAP创建OU和用户(LDAP Add)+弹框风格统一
|
2026-05-30 10:24:29 +08:00 |
|
logan
|
7b5f95e702
|
fix: LDAP批量导入用户auth_source设为ldap而非默认local
|
2026-05-30 02:34:29 +08:00 |
|
logan
|
0afc9947fb
|
fix: 查询结果固定布局 - 编辑器/sidebar不被结果挤走 + 结果区可折叠
|
2026-05-30 02:16:34 +08:00 |
|
logan
|
471221fc47
|
style: Redis查询结果展示优化 — 列宽加大/字体12px/raw区500px
|
2026-05-30 01:56:17 +08:00 |
|
logan
|
c18fc9bd70
|
feat: Redis cluster UI - SchemaSidebar 集群db0锁定 + InstanceItem cluster_mode 字段
|
2026-05-30 01:51:48 +08:00 |
|
logan
|
3af65f2350
|
feat: Redis cluster support + version auto-detect + metrics API
|
2026-05-30 01:44:58 +08:00 |
|
logan
|
d66ce3d5c9
|
docs: 添加 README.md 项目文档
|
2026-05-29 23:26:11 +08:00 |
|
logan
|
5212aaac54
|
chore: 清理残留空文件 + 备份seed前DB
|
2026-05-29 23:19:43 +08:00 |
|
logan
|
889cce140b
|
refactor: 弹框架构重构 + 审核规则seed API + LDAP默认配置 + 全量初始数据
弹框架构:
- Layout header/sidebar z-[200] 隔离弹框层,弹框不再遮挡面包屑
- dialog.tsx 简化: 去掉 border/backdrop-blur,统一暗色主题变量
- ModalOverlay z-[100] 对齐 Radix Dialog overlay 层级
- EditInstanceDialog 同步 z-index 修复
- 修复 InstanceGroupPage/InstancePage/LdapConfigPage 缺失 import
- 修复 InstanceGroupPage 缺失 X icon import
- RedisDetailPage ModalOverlay 迁移为 FormDialog
审核规则:
- POST /audit-rules/seed/:dbType 初始化默认规则 (mysql 11/pg 7/redis 4/mongo 4)
- POST /audit-rules/:id/toggle 开关规则
- PUT /audit-rules/:id 编辑规则
- seed.go 启动时自动创建 26 条默认审核规则
LDAP 默认配置:
- seed.go 自动写入 9 条 LDAP 配置 (8.217.205.92:389, dc=opsx,dc=vip)
- 全新 DB 启动即就位,无需手动配置
|
2026-05-29 22:48:45 +08:00 |
|
logan
|
47431f127c
|
fix: DB_PATH 从 backend-python/ 改为 backend/sqlite3.db
- .env: DB_PATH=../backend/sqlite3.db
- config.go default: ../backend/sqlite3.db
- 删除根目录和 backend/ 下 0 字节残留空 db 文件
- 全新初始化验证: 4用户 + 1审批流程 + 4登录均通过
|
2026-05-29 22:04:21 +08:00 |
|
logan
|
ad12f30355
|
feat: 添加 seed.go 初始化文件 — 默认用户+审批流程+系统设置
- seedDefaultUsers: 4个默认用户(admin/dba/auditor/developer, 密码admin123)
- seedDefaultWorkflow: 默认审批流程(提交→DBA审核→执行)
- seedDefaultSettings: 数据脱敏默认配置
- 所有操作幂等,已有数据不覆盖
- main.go调用seedAll()统一初始化
|
2026-05-29 21:31:25 +08:00 |
|
logan
|
86eea25031
|
fix: 审批接口自动补全缺失的approval记录
旧ticket可能没有关联approval记录(创建时代码不同),
导致approve/reject报400 No pending approval。
现在admin/dba角色会自动创建approval记录再审批。
|
2026-05-29 18:46:51 +08:00 |
|
logan
|
efd22b9c15
|
fix: 全局替换剩余7个手写弹框为ModalOverlay
- LdapConfigPage: 3个弹框(创建OU/添加用户/账号测试)
- AnnouncementPage: 2个弹框(查看/编辑公告)
- NotificationPage: 1个弹框(编辑通知)
- InstancePage: 1个弹框(批量导入)
所有弹框统一使用ModalOverlay组件,行为与EditInstanceDialog一致
tsc --noEmit 通过
|
2026-05-29 17:35:18 +08:00 |
|
logan
|
3c5e1c1f7d
|
fix: 统一弹框组件 — ModalOverlay对齐EditInstanceDialog行为
- ModalOverlay移除遮罩层onClick(不响应外部点击关闭)
- 移除body.style.overflow=hidden(修复白条问题)
- max-h从90vh改为85vh(与EditInstanceDialog一致)
- 10个页面手写fixed弹框替换为ModalOverlay组件
- InstanceGroupPage/WorkflowPage/UsersPage/RedisDetailPage/TicketsPage已替换
- dialog.tsx添加onPointerDownOutside/onInteractOutside阻止外部点击
- index.css添加body[data-scroll-locked]覆盖Radix滚动锁定
- Layout.tsx main添加relative定位上下文
|
2026-05-29 17:16:08 +08:00 |
|
logan
|
5366d5c963
|
refactor: 重写测试套件对齐Go后端API + 修复superadmin权限
- 删除 29 个旧 Python 后端单元测试 (from app.* 导入已不适用)
- 重写 19 个集成测试文件对齐 Go/Gin 后端实际 API 行为:
- 创建端点返回 201 (非 200)
- Settings PUT 需要数组格式
- SQL 审核 field 是 sql_content (非 sql)
- 实例/审核规则列表不支持服务端过滤, 改为客户端过滤
- 实例详情 MySQL 不可达时返回 500 (容错断言)
- 修复 RequireRole 中间件: superadmin 等同 admin 权限
- 测试结果: 81 passed, 4 skipped, 0 failed
|
2026-05-29 16:12:32 +08:00 |
|
logan
|
557d88d3ed
|
feat: 数据脱敏体系重构 — 全局设置+masked_columns+前端去硬编码
后端:
- applyDataMasking 新增 masked_columns 返回字段,告诉前端哪些列被脱敏
- seedDefaultSettings 添加 data_masking 分组(启用开关+敏感字段列表)
- 脱敏逻辑: 全局敏感字段 + 实例级 mask_fields 合并,开关关闭则跳过
前端:
- QueriesPage 去掉硬编码 sensitiveKeywords 和 maskData()
- 改用后端返回的 masked_columns 显示'敏'标签
- 脱敏值由后端统一处理(替换为*)
- PlatformConfigPage 数据脱敏分组独立显示
- EditInstanceDialog 脱敏字段简化为逗号分隔输入
验证:
- 设置页开关可正常开关/保存
- 查询 ghost_test: email列被脱敏为*,列头显示'敏'标签
- 非敏感列(name, id, status)正常显示
|
2026-05-28 23:26:10 +08:00 |
|
logan
|
e81eed288c
|
feat: SchemaSidebar字段/索引tab切换+选库自动展开+singleDb过滤+表单击展开
- SchemaSidebar: 展开表后显示字段/索引两个tab,可切换查看
- 新增 tableIndexes state + IndexInfo import
- 选库后自动调用 handleExpandDb 加载表(修复之前无表bug)
- singleDb 模式下只显示当前选中库
- 表按钮交互改为: 单击展开/折叠, Alt+点击插入表名
- 菜单重组为工作台/管理/系统三段式
- TicketCreatePage 数据库必选(非Redis不自动选)
|
2026-05-28 22:31:40 +08:00 |
|
logan
|
a95a341370
|
fix: 修复TicketCreatePage浏览按钮缺少<button>标签+补Sparkles import
|
2026-05-28 21:43:12 +08:00 |
|
logan
|
795a5afd72
|
fix: 删除TicketCreatePage遗留的broken代码行
|
2026-05-28 21:41:37 +08:00 |
|
logan
|
7e26837c5f
|
refactor: TicketCreatePage用SchemaSidebar替换手写浏览器+SqlEditor暴露insertText光标定位
- SqlEditor: 添加 forwardRef + useImperativeHandle 暴露 insertText 方法
- 支持在光标位置插入文本并移动光标
- TicketCreatePage: 删除300+行手写表结构/Redis/索引浏览代码
- 统一使用 SchemaSidebar 组件(与查询页一致)
- handleSchemaInsert: 已选库插table名,未选库插db.table名
- 清理未用 imports/icons/types/helpers (RedisKeyItem, formatBytes等)
- 848行 → 435行
|
2026-05-28 21:34:59 +08:00 |
|
logan
|
c6ef67adba
|
fix: 修复权限组用户看不到实例的bug — AccessibleInstances第二次Pluck覆盖第一次结果,改为单条OR查询
|
2026-05-28 20:50:57 +08:00 |
|
logan
|
ed43f6f398
|
feat: 实现用户批量导入(LDAP+本地+CSV模板)
- BatchImportLdapUsers: 从LDAP导入用户到本地DB
解析 dn/cn/uid/mail 字段,默认密码 admin123,角色 developer
重复用户自动跳过
- BatchImportUsers: 本地CSV批量导入
支持 username/display_name/email/role/password
skip_existing 选项控制重复行为
- ImportTemplate: 真实CSV模板下载(UTF-8 BOM)
- 3个endpoint从placeholder改为真实实现
|
2026-05-28 16:26:53 +08:00 |
|
logan
|
add9416c0e
|
fix: 查询结果单元格不再截断,完整显示内容
去掉 max-w-[200px] truncate 限制,改为 whitespace-pre-wrap break-words
自然换行,LRANGE 等长文本完整展示
|
2026-05-28 16:17:31 +08:00 |
|
logan
|
7f09ef8e1a
|
fix: Redis侧边栏扫描也自动补通配符
RedisScanKeys 端点的 pattern 参数无通配符时自动追加 *,
与查询页 KEYS 命令行为一致,输入 match 即匹配 match*
|
2026-05-28 16:13:50 +08:00 |
|
logan
|
b8df2c0027
|
fix: Redis KEYS命令自动补通配符(*)
输入 KEYS match 自动变为 match* 模糊匹配,
无需手动加 *,同时匹配 ? [] 等 Redis 原生通配符
|
2026-05-28 16:07:16 +08:00 |
|
logan
|
3b3cc32d45
|
feat: Redis/MongoDB分页+CSV导出全数据库类型支持
后端:
- Redis 分页: KEYS→SCAN分页, LRANGE→offset/limit, SMEMBERS→SSCAN分页
- MongoDB 新增 executeMongoQuery: db.collection.find/aggregate 解析
- find: skip/limit分页 + CountDocuments总数
- aggregate: $facet并行取count+data
- bson.M扁平化处理嵌套文档
- ExportQueryCSV 改为多分支: exportSQLCSV/exportRedisCSV/exportMongoCSV
- Redis: 复用executeRedisQuery取数据写CSV
- MongoDB: 复用executeMongoQuery取数据写CSV
- 新增 mongo-driver v2 依赖
- 前端: Redis也显示导出CSV按钮(去掉dbType过滤)
|
2026-05-28 15:58:42 +08:00 |
|
logan
|
5ea86fe334
|
feat: 查询分页(limit/offset)+流式CSV导出+去复制按钮
后端:
- ExecuteQuery 添加 limit/offset 参数,MySQL 自动注入 LIMIT/OFFSET
- 首页自动 COUNT 查总数(total),翻页页不再重复 count
- 新增 POST /query/export 流式 CSV 导出端点,游标分批写不占内存
- 默认 limit=100, max=1000,防止大数据量 OOM
前端:
- 查询结果加分页控件(首页/上一页/下一页/末页 + 每页条数选择)
- CSV 导出改走流式端点(全量数据),不限于当前页
- 去掉复制按钮(Copy/Check/coped state),Redis 单值也不显示复制
- 工具栏显示 总行数/行每页/列数
|
2026-05-28 15:51:22 +08:00 |
|
logan
|
03ff845485
|
feat: Redis单值结果直接展示+JSON中文格式化+悬浮复制
1. GET/HGET/TTL等单值命令: 直接展示raw值, 不再套table
2. JSON自动检测+格式化(中文正常显示, 2空格缩进)
3. 非JSON值(如false/数字)直接文本展示
4. 代码块右上角悬浮复制按钮(hover显示)
5. 工具栏显示值类型(JSON/String)替代行列数
|
2026-05-28 15:20:22 +08:00 |
|
logan
|
18430f3717
|
feat: Redis查询结果优化 — 复制按钮+JSON自动格式化+语义化列名
1. GET/HGET/TTL等单值命令: columns改为[key,value]替代[command,result]
2. DBSIZE等无key命令保持[command,result]格式
3. 前端添加复制按钮(Clipboard API), 2秒反馈
4. JSON值自动检测并格式化显示(whitespace-pre-wrap)
5. 结果区最大高度350px→500px
6. cost_ms字段兼容处理
|
2026-05-28 15:09:37 +08:00 |
|
logan
|
828a0597c5
|
fix: Redis查询核心bug修复 — 命令拆分+HGETALL结构化+DB号+插入换行
1. executeRedisQuery: client.Do()没传命令名导致ERR unknown command
2. HGETALL结果用reflect处理map类型,结构化输出field/value表格
3. 支持指定Redis DB号(之前固定DB=0)
4. 前端Redis命令插入用换行分隔,MySQL保持空格
5. cost_ms到execution_time_ms字段映射修复
|
2026-05-28 14:53:12 +08:00 |
|
logan
|
6b5d8bede4
|
fix: 查询页两个细节修复
1. 点击侧边栏表名插入 db.table 格式(如 log_analytics.access_logs)
- SchemaSidebar 表名: onInsert(t.name) → onInsert(`${dbName}.${t.name}`)
- SchemaSidebar 字段名: onInsert(col.Field) → onInsert(`${t.name}.${col.Field}`)
2. 查询不存在的表应显示错误而非'无结果数据'
- QueriesPage handleExecute: 检查 res.error 字段,有错误则 setError + 不设 result
|
2026-05-28 14:41:46 +08:00 |
|
logan
|
9dda75efdb
|
fix: LDAP导入弹框OU列表和用户列表解析失败
根因: 后端 ou-list/user-list API 直接返回数组, 前端错误地从 res.ous/res.users 取值
- loadLdapOus: Array.isArray(res) 兼容处理
- loadLdapUsers: Array.isArray(res) 兼容处理
- LDAP用户显示字段: cn/uid/mail 替代 nickname/username/email
|
2026-05-28 14:30:23 +08:00 |
|
logan
|
3a07432032
|
fix: BatchImportModal LDAP弹框3处bug修复
- backdrop onClick冒泡关闭弹框移除(L1036)
- useEffect getConfig/loadLdapOus串行化防时序竞争(L906-919)
- to-ldap/from-ldap条件渲染顺序修正(loading→未配置→正常)
|
2026-05-27 23:41:19 +08:00 |
|
logan
|
4351421848
|
fix: ConfirmDialog确认后弹框不关闭(9页面) + 登录页顶部渐变线移除
- 9个页面 onConfirm 回调添加 setDeleteConfirm(null) 关闭弹框
- InstancePage/InstanceDetailPage/InstanceGroupPage/RedisDetailPage
- UsersPage/AnnouncementPage/NotificationPage/NotificationsPage/WorkflowPage
- 白日梦境(NeonCityView) + 云石纹理(GradientMeshView) 移除顶部蓝色渐变线
|
2026-05-27 22:10:50 +08:00 |
|
logan
|
5a61babd33
|
feat: 霓虹都市→白日梦境 + 渐变网格→云石纹理 — 两个白色浅色主题登录页重写
|
2026-05-27 21:53:27 +08:00 |
|
logan
|
b5739ba955
|
fix: 权限策略弹窗输入框失焦 — FormModal从内联函数组件改为直接JSX内联,避免state更新导致DOM重建
|
2026-05-27 21:42:40 +08:00 |
|
logan
|
7f6a4bb6df
|
fix: 全部页面 confirm() 替换为 ConfirmDialog 组件 — 9个页面统一回调模式
|
2026-05-27 21:25:14 +08:00 |
|
logan
|
41dab3deab
|
feat: 10个登录页图标统一 — 蓝紫渐变(#3b82f6→#8b5cf6)+白色盾牌勾选,与favicon一致
|
2026-05-27 21:04:45 +08:00 |
|
logan
|
e6b421574d
|
fix: 登录页功能卡片文案对齐实际功能 — 自助查询/变更审批/规则引擎/审计追踪/角色权限
|
2026-05-27 20:36:15 +08:00 |
|
logan
|
d8b9e81635
|
feat: 品牌重命名 SQL-Platform → OpsxSQL — 12个文件18处替换,覆盖所有登录组件+Layout+index.html
|
2026-05-27 20:27:57 +08:00 |
|
logan
|
18ed0c1faf
|
feat: 浏览器图标 — 蓝紫渐变圆角方块+白色盾牌勾选
|
2026-05-27 18:31:49 +08:00 |
|
logan
|
492bf7f8e3
|
fix: 功能展示风格提到第一位+比例优化 — 右侧400px更紧凑,左侧间距缩减,默认登录页改为sidepanel
|
2026-05-27 18:21:22 +08:00 |
|
logan
|
f8b2266542
|
fix: 侧边面板恢复 commit 35a014e 原始设计 — 左品牌+6功能卡片,右登录表单,白色主题友好
|
2026-05-27 18:15:18 +08:00 |
|
logan
|
b4fa60bc68
|
fix: 侧边面板恢复更早版本 (commit 8aaf227) — 左40%渐变+装饰圆圈+Database图标+主题切换按钮
|
2026-05-27 18:10:27 +08:00 |
|
logan
|
f97c0ab00c
|
fix: 侧边面板恢复原始简洁版 + 星际漫游流星方向修正
- SidePanel: 恢复 commit 46054c8 原始版(左38%暗色品牌区+右62%登录表单)
- 去掉深海鲸歌动画效果,回归简洁专业风格
- AppearanceSettings: 缩略图预览同步更新
- CosmosView: 流星方向从左上→右下改为右上→左下(符合真实流星观感)
|
2026-05-27 18:06:16 +08:00 |
|
logan
|
bf5c077b5b
|
feat: 登录页扩展至10种风格 — 新增极光之境/星际漫游/水墨山水/霓虹都市/渐变网格
- 新增 AuroraView.tsx: 4条极光光带+15星光+毛玻璃卡片
- 新增 CosmosView.tsx: 3星云+45颗星星+2流星+行星装饰
- 新增 InkWashView.tsx: 三层远山+水墨晕染+金色点缀+亮色表单
- 新增 NeonCityView.tsx: 城市剪影+霓虹灯管+雨滴+赛博朋克风格
- 新增 GradientMeshView.tsx: 5渐变光晕+点阵纹理+呼吸动画
- LoginPage.tsx: LoginStyle类型扩展10种+映射+选项
- AppearanceSettings.tsx: 预览颜色+缩略图10种
|
2026-05-27 17:52:34 +08:00 |
|
logan
|
872c204e80
|
fix: SplitView 左黑右白+左侧文字居中醒目
- 右侧改为纯白背景(#fff),输入框浅灰底+深色文字+青绿聚焦边框
- 左侧品牌内容从底部移至垂直居中位置
- 输入框从底线风格改为圆角卡片风格,匹配白色面板
|
2026-05-27 16:25:00 +08:00 |
|
logan
|
03bf7c92a9
|
feat: 登录页3种风格全新重设计 — 数据晶格/晨曦微光/深海鲸歌
- SplitView: 晶格矩阵透视网格+19脉动节点+青绿微光, Tron科技感
- CenteredCard: 黎明渐变+10条金色光柱+地平线光晕+星点残留
- SidePanel: 深海渐变+5层波浪线+15生物发光粒子+3深海光柱
- AppearanceSettings: 预览颜色+缩略图同步更新
- LoginPage: 风格描述文案更新
|
2026-05-27 13:24:24 +08:00 |
|
logan
|
439eb6d6d7
|
feat: 极简暗色替换为深蓝紫曲线风格 — 粉紫流动曲线优雅暗黑
MinimalDark.tsx 全面重写:
- 背景: 深蓝紫渐变(#0a0a1a→#0f0a2a→#150825)代替纯黑
- 7条流动曲线: 粉紫/靛蓝/青色渐变彩带 + blur效果 + 缓慢浮动动画
- 5个脉动装饰点: 粉色/紫色/靛蓝不同delay闪烁
- 2个发光球: 右上紫色光球 + 左下粉色光球
- 毛玻璃居中卡片: backdrop-blur + 半透明边框
- 粉紫渐变logo(#ec4899→#a855f7) + 紫色聚焦高亮
- 按钮粉紫渐变发光阴影
LoginPage + AppearanceSettings 描述和缩略图同步更新
|
2026-05-27 13:06:17 +08:00 |
|
logan
|
1aa729b61b
|
feat: 登录页5种视觉大片级重设计 — 星河/极光/日月/星辰/流星
5个登录组件全面升级为动态视觉效果:
1. SplitView — 星河流转: 深靛蓝渐变(#0f0c29→#302b63) + 3条CSS流星动画
+ 7个漂浮星辰光点 + 脉动光晕,底线输入框聚焦靛蓝
2. CenteredCard — 极光幻境: 深蓝黑底(#0a0a2e) + 3条流动极光色带
(翠绿/靛蓝/紫) filter:blur(80px) 缓慢流动,毛玻璃居中卡片
3. SidePanel — 日月交替(重点重做): 暮光紫→夜空蓝渐变
+ 200px天体球(太阳金→月亮银蓝 8s循环) + 300px旋转轨道环
+ 6个轨道光点 + 3条流星 + 10个闪烁星点
4. FullImage — 星辰连线: 深海军蓝(#0a1628) + 33个随机星点
+ 6条星座连线 + 右上角蓝紫发光球 + 左下角暖色光球
5. MinimalDark — 流星雨: 深紫黑(#0c0a1a) + 6条流星动画
+ 10个静态星点 + 渐变菱形logo + 极简布局
|
2026-05-27 12:48:27 +08:00 |
|
logan
|
46054c8b2f
|
feat: 登录页5种主流高级风格重写 + 主题/登录页设置独立
5个登录组件全面重新设计:
- SplitView: 分屏聚焦风格(Linear/Notion) — 左55%深色渐变+几何动画装饰,右45%纯净表单+底线输入框
- CenteredCard: 沉浸渐变风格(Stripe/Vercel) — 紫蓝辐射背景+毛玻璃卡片+发光效果
- SidePanel: 品牌侧栏风格(Slack/Figma) — 左38%大号标语+feature pills,右62%宽留白表单
- FullImage: 粒子网格风格(GitHub/AWS) — CSS粒子光点+网格线+发光球体+深色内嵌卡片
- MinimalDark: 极简线条风格(Apple/Linear) — 纯黑背景+16px渐变圆点logo+宽字距+底线输入框
AppearanceSettings 主题与登录页完全独立:
- 界面配色区: 5种主题配色即时预览
- 登录页风格区: 5种风格缩略图预览+参考品牌标签(Linear/Notion, Stripe/Vercel等)
- 移除登录页主题切换按钮,风格与主题彻底解耦
|
2026-05-27 03:25:58 +08:00 |
|
logan
|
ed582e30e6
|
fix: 权限组穿梭框保存不生效 + 弹框布局修复
1. 后端 CreateInstanceGroup 改用 input struct 接收 readonly_instance_ids/write_instance_ids
- 旧代码直接绑定 model.InstanceGroup(不含关联ID字段),导致穿梭框数据被丢弃
- 新代码解析后写入 instance_group_members 表
- 与 UpdateInstanceGroup 保持一致的逻辑
2. 弹框布局修复
- z-50 → z-[100] 避免被顶部栏遮挡
- flex-col + overflow-y-auto 独立滚动区域
- 添加 header bar + X 关闭按钮
- 背景加 backdrop-blur-sm
3. 全局排查确认:其他 handler 均使用 input struct 或 map,无同类问题
|
2026-05-27 02:38:18 +08:00 |
|
logan
|
746a000e8a
|
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
|
2026-05-27 01:59:08 +08:00 |
|
logan
|
4e2df4d3d7
|
docs: OSC总结 — Native/gh-ost/云原生三句话选型
|
2026-05-27 00:59:40 +08:00 |
|
logan
|
ce8bb9710b
|
docs: OSC/gh-ost 完整技术文档
- 为什么需要OSC + 三种方案对比(Native/gh-ost/pt-osc)
- 场景推荐矩阵: 按数据库类型/环境/DDL类型
- 平台13项配置说明
- API接口文档(analyze/dry-run/execute/status)
- gh-ost最佳实践(执行流程/大表参数/暂停恢复/回滚)
- 云数据库特殊说明(Aurora/PolarDB/RDS/自建)
|
2026-05-27 00:54:52 +08:00 |
|
logan
|
78986fe5bf
|
feat: Native DDL智能推荐 + MySQL版本检测 + 云数据库自动跳过gh-ost
- 新增 getMySQLVersion(): 检测MySQL实例版本
- 新增 supportsInstantDDL(): 判断是否支持 INSTANT DDL (8.0.12+)
- analyze API新增字段: mysql_version, supports_instant, cloud_type
- 云数据库(aliyun_rds/polardb/aws_aurora): 自动推荐Native DDL,跳过gh-ost
- 自建MySQL: 根据版本+环境+行数综合推荐
- MySQL 8.4.9 检测通过, supports_instant=true
|
2026-05-27 00:24:59 +08:00 |
|
logan
|
b2b13661fd
|
feat: gh-ost 完整策略引擎 — 13项配置+环境差异+云数据库适配+DDL智能分析
配置项(13项):
- ghost_enabled: 全局开关(默认关闭)
- ghost_default_mode: 默认执行模式(dry_run/execute)
- ghost_osc_priority: OSC优先级(native_first/ghost_first/ghost_only)
- ghost_env_mode: 环境模式(development/production)
- ghost_cloud_type: 云数据库类型(self_hosted/aliyun_rds/polardb/aws_aurora)
- ghost_auto_trigger_rows: 自动触发行数阈值(万)
- ghost_auto_trigger_ddl: 自动触发DDL类型
- ghost_path/chunk_size/max_load/critical_load/max_lag_millis/allow_on_master
新增API:
- GET /ghost/config: 查看全部gh-ost配置
- POST /ghost/analyze: DDL智能分析(解析DDL类型+行数检查+策略推荐)
- 云数据库: --aliyun-rds / --aws 自动适配
策略逻辑:
- native_first + development → 推荐Native DDL
- native_first + production + DDL匹配 → 推荐gh-ost
- ghost_first/ghost_only → 强制gh-ost
- 行数超阈值 → 额外推荐gh-ost
|
2026-05-27 00:22:33 +08:00 |
|
logan
|
5d59ca427e
|
feat: gh-ost 平台配置开关键 + 云数据库参数支持
- ghost_enabled: 总开关, 关闭时返回403禁止dry-run/execute
- ghost_path: gh-ost二进制路径, 从system_settings读取
- ghost_default_chunk_size: 每批拷贝行数
- ghost_max_load: 负载阈值限流
- ghost_allow_on_master: 单机MySQL允许直接执行
- handler改为从DB读配置, 不再依赖config包
- 5个配置项已插入system_settings(id=26-30)
|
2026-05-27 00:15:32 +08:00 |
|
logan
|
8aaf2271b8
|
feat: gh-ost真实集成验证通过 + 登录页全面中文化 + 外观设置跨浏览器同步修复
gh-ost集成:
- handler根据instance_id查DB获取连接信息(host/port/user/password)
- 修复gh-ost参数: 去掉不存在的--dry-run(默认noop), 加--execute才真执行
- 加--skip-port-validation(端口映射环境必须)
- 加--allow-on-master(单机MySQL直接执行)
- 加--initially-drop-ghost-table/old-table/socket-file(清理残留)
- GhOstTask增加Port字段, buildArgs同步更新
- dry-run真实验证通过: 连接1.94.55.133:9005, 3行表, 3.85s完成
登录页中文化:
- 5个登录组件(SplitView/CenteredCard/SidePanel/FullImage/MinimalDark)
- 46处英文文案全部替换为中文
- 平台标题统一为'SQL审核平台'
外观设置同步修复:
- GetPublicLoginStyle: GORM First()复用主键导致第二次查询失败
- 改用Take()+重置结构体, 修复theme始终返回dark的bug
- UpdateUserPreferences: 同步写入SystemSetting表(login_style+default_theme)
|
2026-05-27 00:06:13 +08:00 |
|
logan
|
62a2b383e1
|
fix: 超级管理员权限补全 28/28 (100%) — 补上4个父级分组节点ID
根因: admin permissions 只列了叶子节点,缺少 datasource/permission/system/config 父分组
导致统计 24/28 (86%) 而非 28/28 (100%)
同时补全 DBA 和 auditor 的父级节点
|
2026-05-26 22:11:13 +08:00 |
|
logan
|
9055cc77ec
|
feat: 外观设置后端持久化 + 保存按钮 + 跨浏览器同步
后端:
- User 模型新增 Preferences JSON 字段 (theme + login_style)
- 新增 GET/PUT /api/v1/user/preferences (auth) 个人偏好读写
- 新增 GET /api/v1/public/login-style (public) 登录页风格公开端点
- SQLite users 表手动添加 preferences 列
前端:
- AppearanceSettings 从后端加载偏好 + 保存按钮 + dirty 状态提示
- LoginPage 先从后端公开接口获取 login_style (跨浏览器一致)
- useLogin 登录成功后从后端加载偏好并应用主题
- 偏好同时存 localStorage(即时) + 后端DB(跨设备)
|
2026-05-26 22:09:47 +08:00 |
|
logan
|
8469df359f
|
fix: SHOW TABLE STATUS 列名小写化修复前端 key 警告 + table-detail 400 错误
根因: Go 后端 DetailListTables 返回 SHOW TABLE STATUS 原始列名(如 Name, Engine, Rows)
前端 TableMeta 使用小写 key(name, engine, rows), 导致 t.name = undefined
结果: key 警告 + handleExpandTable(dbName, undefined) 触发 table-detail 400
修复: instance_detail.go 中 DetailListTables 将列名统一 strings.ToLower()
|
2026-05-26 21:55:37 +08:00 |
|
logan
|
14e394fb09
|
feat: 5种专业登录页风格 + 外观设置 + 文档全面更新
- 新增 5 种登录页组件: SplitView/CenteredCard/SidePanel/FullImage/MinimalDark
- 提取 useLogin hook 共享登录逻辑
- LoginPage 改为风格分发器, localStorage(login-style) 控制渲染
- SettingsPage 新增外观设置 tab: 主题切换 + 登录风格选择器(含缩略图预览)
- AppearanceSettings 组件: 5 种风格卡片式切换
- 文档全面更新为 Go/Gin 架构:
- ARCHITECTURE.md: Go 项目结构/handler/GORM 模型/中间件/LDAP/驱动矩阵
- FEATURES.md: v0.3.1 功能清单含登录主题系统
- ROADMAP.md: Python→Go 迁移历史 + Sprint 计划
|
2026-05-26 21:16:36 +08:00 |
|
logan
|
f2e93a09c0
|
feat: 细节打磨 - 全面修复核心功能
后端修复:
- ticket: 添加独立 CancelTicket/RollbackTicket/GetTicketTimeline/GetTicketApprovals handler
(之前 cancel/rollback 都错误调用 ApproveTicket, timeline/approvals 调用 GetTicket)
- instance_detail: 7个 TODO placeholder 端点全部实现真实 MySQL 查询
(databases/tables/db-schema/table-detail/processlist/status/users)
- instance_detail: ExecuteQuery 添加真实 Redis 命令执行(只读命令白名单)
- redis: 全部 handler 从 placeholder 改为真实 go-redis 实现
(info/dbsize/keys/key-detail/slowlog/clients/command/create-key/delete-key)
- router: 添加 sql-assistant/format, sql-assistant/analyze, tickets/audit 路由
- router: 添加 dictionary/*, mongo/* stub 路由(前端不报 404)
- stub_handlers: 新增 SQL 审计/格式化/分析 handler + dictionary/mongo stub
- model: TicketStatistics.Completed JSON tag 改为 success 匹配前端
- ticket: ExecuteTicket 完成 status 改为 success 而非 completed
前端兼容:
- 所有前端 API 路径后端都有对应路由(无 404)
- TicketStatistics 返回 success 字段与前端 stats?.success 对齐
|
2026-05-26 20:40:45 +08:00 |
|
logan
|
9372053574
|
fix: WorkflowPage UserDropdown selectedIds.map 报错 — 防御非数组值
- UserDropdown 组件加 Array.isArray(selectedIds) 防御
- 加载 workflow steps 时 approver_ids 加 try/catch 和类型判断
- 兼容后端返回 string/JSON/array/null 各种格式
|
2026-05-26 15:59:31 +08:00 |
|
logan
|
5411cd6db9
|
fix: LDAP 测试连接 3s 超时 + 账号验证 search filter %s 替换 + LDAP 登录 fallback
- dialLDAP 辅助函数: 3s timeout 替代无超时 DialURL
- TestLDAPConnection: search_filter (uid=%s) 中 %s 未替换导致搜索失败
- tryLDAPAuth: 同样的 %s 替换 + timeout 3s
- auth.go 登录: 本地密码失败 → LDAP fallback → ldapInfo 判断修复
- BatchImportLDAP: 实现 LDAP 用户批量导入到本地 DB
- 前端 LdapConfigPage: LDAP 测试请求独立 10s timeout
- workflow.go: ResetUserPassword 实现
|
2026-05-26 14:42:31 +08:00 |
|
logan
|
95222d42ad
|
feat: 真实数据库连接测试 + 驱动安装 + 前端修复
Go 后端:
- 新增 connection_tester.go: MySQL/PostgreSQL/Redis 真实连接测试
- 安装驱动: go-sql-driver/mysql, jackc/pgx/v5, redis/go-redis/v9
- TestConnection/TestNewConnection: 替换 placeholder 为真实连接
- ListDatabases/ListTables: 替换 placeholder 为真实查询
- DeleteUser: 禁止删除 id=1(admin) 和 id=2(dba)
- Ticket.Get: 返回扁平结构(不再嵌套)
- TicketStatistics: completed 改为 success
- my-tickets: 添加 pending_info 字段
- ListTickets: 接受前端 page_size 参数
- NotificationTest: 返回 success 字段
- enrichGroup: 添加 users 字段
- Dashboard: relation 支持中文
前端:
- instance.ts: testConnection 路径 /test → /test-connection
- TicketCreatePage.tsx: 修复 NaN value 属性警告
- TS 类型对齐后端新格式
测试:
- conftest.py 重写: function-scoped fixtures + DictObject
- 30个非集成测试文件标记 skip(待 Go 后端对齐)
- 集成测试 60 passed
|
2026-05-26 09:27:40 +08:00 |
|
logan
|
b59eea4391
|
fix: ListInstanceGroups 返回 enriched 数据含 instance IDs
- ListInstanceGroups 改用 enrichGroup 返回完整数据
- 包含 readonly_instance_ids/write_instance_ids 供前端穿梭框回显
|
2026-05-25 23:50:29 +08:00 |
|
logan
|
e5af40466c
|
fix: 实例分组编辑保存实例关联 — UpdateInstanceGroup 接收 readonly/write_instance_ids
- UpdateInstanceGroup 新增 readonly_instance_ids/write_instance_ids 字段处理
- 清除旧成员后重新写入 instance_group_members 表
- enrichGroup 返回 readonly_instance_ids/write_instance_ids 供前端穿梭框回显
- 新增 collectInstanceIDs helper 去重提取 ID 列表
|
2026-05-25 23:47:21 +08:00 |
|