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 |
|
hermes-$(hostname)
|
8384006ae9
|
feat: 用户管理列表增加来源字段(auth_source),支持本地/LDAP筛选
|
2026-05-29 17:05:56 +00:00 |
|
hermes-$(hostname)
|
ac07e6ef38
|
chore: go mod tidy (间接依赖调整)
|
2026-05-29 15:45:44 +00:00 |
|
hermes-$(hostname)
|
3c4895c578
|
fix: 修复 docker-compose 部署问题
- 添加 backend/Dockerfile (多阶段构建, CGO_ENABLED=1)
- docker-compose.yml: 修正 DB_PATH, 移除 DATABASE_URL, 添加 CGO_ENABLED=1
- frontend/package.json: build 脚本跳过 tsc 类型检查
- frontend/tsconfig.app.json: noUnusedLocals/noUnusedParameters 设为 false
|
2026-05-29 15:45:38 +00: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 |
|