Commit Graph
97 Commits
Author SHA1 Message Date
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
logan 2957075345 fix: 修复3个前端报错 — 实例分组编辑500/定时任务404/工作流null
1. instance_group.go: UpdateInstanceGroup 改用结构体输入,过滤系统字段,防止GORM更新主键导致500
2. scheduled_task.go: 新增 ListScheduledTasks + CancelScheduledTask handler
3. router.go: 注册 /tickets/scheduled/list 和 /tickets/:id/cancel-schedule 路由
4. WorkflowPage.tsx: 4处 wf.steps 添加 || [] 空值保护
2026-05-25 23:39:16 +08:00
logan 88e5f4e7ee feat: Go后端LDAP真实对接 — AES-256-GCM密码加解密 + 登录LDAP fallback
- 新增 crypto.go: AES-256-GCM 加解密,与 Python backend 兼容
- auth.go: Login 添加 LDAP fallback(本地优先→LDAP绑定→自动创建本地用户)
- ldap.go: 实现真实 LDAP 连接/用户搜索/密码验证/OU列表/用户列表
- 所有 LDAP 操作解密 admin_password 后使用
- 新增/更新密码存储时加密
- router.go: 补充 delete-user 路由
- 添加 go-ldap/v3 依赖
2026-05-25 23:32:15 +08:00
logan 622923821b feat: Go后端补全所有缺失API接口,消除前端404报错
新增接口:
- GET /instances/accessible — 查询页实例列表(按access_type筛选)
- GET /instances/:id/databases — 数据库列表(placeholder)
- GET /instances/:id/databases/:db/tables — 表列表(placeholder)
- POST /instances/test-connection — 新实例连接测试
- CRUD /instance-groups — 完整实例组管理(创建/更新/删除/查询单个)
- /instance-groups/:id/instances — 实例分配/移除
- /instance-groups/:id/users — 用户分配
- PUT /instance-groups/users/:userId/groups — 用户组更新
- GET/PUT /ldap-config — LDAP配置读写
- POST /ldap-config/test — LDAP连接测试(placeholder)
- POST /ldap-config/ou-list — OU列表(placeholder)
- POST /ldap-config/user-list — 用户列表(placeholder)
- PUT /settings — 批量更新设置
- GET /settings/cleanup/preview — 清理预览
- POST /settings/cleanup/run — 执行清理

修复:
- ListSettings 返回按group分组的dict(前端期望格式)
- ListInstanceGroups 返回enriched数据(含实例/用户计数)
- 前端所有页面0个404错误,查询页实例下拉框正常显示
2026-05-25 22:14:01 +08:00
logan 26148d0ca7 fix: run.sh 改为启动 Go 后端 + dashboard stats 格式对齐前端
- run.sh start_backend 改为编译+运行 Go 二进制
- DashboardStats handler 返回前端期望的字段格式
- build/test 命令适配 Go 工具链
- 前端验证: 登录/仪表盘/工单列表/查询页面正常
2026-05-25 21:59:56 +08:00
logan ca308e277d feat: v0.3.1 — Go/Gin 后端重写 + gh-ost 集成
架构变更:
- Python/FastAPI → Go/Gin 重写(Python 后端保留在 backend-python/)
- GORM + SQLite(兼容现有数据库表结构)
- JWT 认证 + RBAC 权限中间件

Go 后端结构:
- cmd/server/main.go — 入口,端口 9000
- config/config.go — 环境变量配置
- internal/model/ — GORM 模型(30张表,完全兼容 SQLite)
- internal/handler/ — auth/instance/ticket/dashboard/ghost handler
- internal/middleware/ — JWT 认证 + CORS
- internal/ghost/ — gh-ost 集成模块(同步/异步执行,任务管理)
- router/router.go — API 路由注册(/api/v1/...)

gh-ost 集成:
- RunGhOst() 同步执行
- RunGhOstAsync() 异步执行 + 进度追踪
- TaskManager 管理多个并发任务
- API: POST /ghost/dry-run, /ghost/execute, GET /ghost/status/:taskId

核心 API 已对齐:
- POST /auth/login (JWT)
- GET /dashboard/stats, /dashboard/my-tickets
- GET /tickets/statistics, CRUD + approve/execute
- GET/POST/PUT/DELETE /instances
- GET /users, /audit-rules, /announcements, /settings

已验证:
- 登录 admin/admin123 ✅
- Dashboard 99工单/110查询/4实例 ✅
- 工单统计按角色过滤 ✅
2026-05-25 21:40:54 +08:00
logan 43d1f3a234 feat: 工单权限过滤+仪表盘优化+LDAP登录+审批流程+待处理工单
后端:
- ticket_statistics/list_tickets 按用户身份过滤(admin全部, dba/auditor审批相关, developer自己的)
- 新增 /dashboard/my-tickets 接口(按角色返回待处理工单)
- auth.py 本地优先+LDAP fallback 登录认证
- ldap_config.py LDAPS 证书验证修复
- instance_detail.py developer/auditor 权限修复

前端:
- Dashboard 仪表盘: 3核心大数字指标+公告+我的待处理工单
- 删除 ECharts 趋势图(无真实数据)
- TicketDetailPage 审批流程时间线展示
- TicketsPage 工单统计按用户过滤+关联列(我提交的/待我审批)
- types 新增 TicketApproval 等类型定义
2026-05-25 20:47:15 +08:00
logan be2d6f3894 feat: LDAP 账号管理 — OU管理/添加用户/删除用户/批量导入
后端新增 4 个 LDAP 管理端点:
- POST /ldap-config/create-ou: 创建组织单元
- POST /ldap-config/create-user: 创建单个用户 (SSHA加密)
- POST /ldap-config/delete-user: 删除用户
- POST /ldap-config/batch-import-ldap: 批量导入用户
- POST /ldap-config/user-list: 查询用户列表(恢复)

前端 LdapConfigPage 增强:
- LDAP 账号管理折叠区(配置存在即显示)
- OU 下拉选择 + 根节点选项 + 数量统计
- 用户列表表格(全选/单选/DN显示)
- 新建 OU 弹框(名称+父级DN+描述)
- 添加用户弹框(用户名+密码+显示名+邮箱+目标OU)
- 删除选中用户按钮(确认后批量删除)

前端 UsersPage BatchImportModal 三 Tab:
- 本地导入 / 导入到 LDAP / 从 LDAP 导入

测试修复:
- test_user_endpoint.py: 分页格式兼容
- test_users.py: 分页格式兼容
- test_system_settings.py: 精简后配置项匹配
2026-05-25 17:34:53 +08:00
logan 344c519209 feat: P0生产加固 — 认证安全+操作审计+错误提示
P0-1 认证安全:
- JWT secret 改为环境变量配置, 未设置则随机生成(重启失效)
- 新增 LoginRateLimitMiddleware: 5次/分钟登录频率限制(滑动窗口)
- 429 响应 + 前端 toast 提示

P0-2 操作审计日志:
- 新增 OperationLog 模型 (user/username/action/resource/detail/ip)
- 新增 AuditLogMiddleware 自动记录 POST/PUT/DELETE/PATCH 操作
- 新增 GET /audit-logs API (分页/过滤/统计)
- 前端 AuditLogsPage 对接真实 API (字段/路径修正)

P0-3 实例密码加密:
- 已确认 crypto.py AES-256-GCM 加密存储, 无需修改

P1 前端错误提示:
- 新增 useToast hook + ToastContainer 组件
- request.ts 拦截器: 4xx/5xx 错误 toast 显示后端 detail 信息
- 422 验证错误提取第一条 msg
- 网络失败显示通用提示

1182 tests passed
2026-05-25 12:57:59 +08:00
logan 0576b253e4 fix: 审批流修复 + 通知KeyError修复
审批流修复:
- 提交阶段(step_type=submit)自动approved,不再创建pending记录
- 审批权限添加auditor角色(require_role admin/dba/auditor)
- 审批完成判断排除execute步骤(step_type!=execute才计入has_next)
- review_ticket中加载workflow_steps用于step_type判断
- Ticket字段名修正: creator_id -> applicant_id

通知修复:
- send()中自动补充sql_preview字段(sql_content前100字符)
- 飞书/钉钉模板format改为format_map+安全fallback(缺失字段不报KeyError)
- DB中auditor用户role从developer修正为auditor

测试: 1182 passed, 0 failed
审批流全链路验证通过: 提交->DBA审核->审计员审核->admin执行->success
2026-05-25 11:41:03 +08:00
logan da3ed85295 test: 审批流全面场景测试 — MySQL/Redis/MongoDB 41个用例覆盖 (1182测试)
测试分类:
- TestMySQLBasic(5): 简单查询/INSERT/批量/UPDATE无WHERE/DELETE无WHERE
- TestMySQLDDL(7): DROP TABLE/TRUNCATE/ALTER大表/ALTER小表/MODIFY/CREATE INDEX
- TestMySQLPerfSecurity(3): SELECT*/多表JOIN/敏感字段
- TestRedisBasic(6): GET/SET/KEYS/FLUSHALL/FLUSHDB+审核拦截
- TestRedisDangerous(5): DEL/RENAME/CONFIG SET/EVAL脚本/BGSAVE
- TestRiskLevelBoundary(10): 临界值/GRANT/CREATE/阈值精确测试
- TestMongoDBRisk(5): dropDatabase/drop/insert/find/deleteMany
2026-05-25 11:14:34 +08:00
logan f6f9142ce8 feat: Phase2影响分析 — EXPLAIN预检+大表检测(简化版)+执行策略+风险评估table_sizes支持 (1141测试)
新增:
- explain_preview.py: EXPLAIN预检服务(MySQL/PG), 影响行数预估, 全表扫描检测
- ticket.executor: 三种执行策略(stop_on_error/continue/transaction)
- risk_evaluator: table_sizes参数, 大表ALTER/UPDATE/DELETE自动升级high
- test_phase2_features.py: 22个测试(EXPLAIN+执行策略+大表检测)

简化:
- 砍掉CTX-001上下文感知规则(复杂二次扫描), 合并大表检测到risk_evaluator
- 审核引擎保持纯静态分析, 不再导入_RULE_REGISTRY做二次扫描

模型:
- Ticket加exec_strategy字段
- TicketSqlItem模型
- schema加sql_type/exec_strategy/risk_level/workflow_id
2026-05-25 11:02:51 +08:00
logan 7be0bf1a7c feat: Phase1安全基线 — 风险等级+审核超时+执行进度+通知脱敏+高危确认+维护窗口 (1119测试)
新增功能:
- ticket_sql_items模型: 逐条SQL执行记录(状态/耗时/影响行数)
- risk_evaluator.py: 4级风险评估(low/medium/high/critical), 支持MySQL/PG/Redis/Mongo
- Ticket模型: 新增risk_level + workflow_id字段
- 审核引擎签名改造: audit(sql, db_type, instance_id=None) 支持EXPLAIN预检
- 审核超时保护: 10s超时跳过审核, 防止工单创建阻塞
- 工单创建自动风险计算 + 审批流匹配(instance.workflow_id优先)
- SQL items查询API: GET /{ticket_id}/sql-items 含进度统计
- 执行器集成: 执行完成后自动更新SQL items逐条状态
- 通知脱敏: password/secret/token自动掩码, SQL预览截断100字符
- 高危操作强制二次确认: high/critical级别需confirmed=true
- 维护窗口控制: system_settings配置执行时间窗口(支持跨午夜)
- 45个新测试: 风险评估24+通知脱敏5+维护窗口2+SQL分类11+配置2
2026-05-25 10:25:42 +08:00
logan 030f3f2339 docs: 优化清单可行性评估 — 30项砍到18项,35人天 2026-05-25 10:03:41 +08:00
logan 204dbbc66d docs: 新增优化清单 OPTIMIZATION_PLAN.md — 6大方向30+优化项 2026-05-25 09:59:33 +08:00
logan 39ffc14d88 fix: 修复15个历史遗留测试失败 (0 failed, 1074 passed)
- test_system_settings: 简化登录方式,直接使用 admin_token fixture + auth_header
- test_ticket_executor: DDL操作不再被语法验证拒绝(产品需求),_rejected改为_pass
- test_workflow: 修复update endpoint字段名匹配问题
2026-05-25 09:10:21 +08:00
logan a9e214ef1a feat: 审核规则持久化到DB + 全面配置去硬编码化
- AuditRule模型: 新增code/config_json字段,支持规则编码和阈值参数持久化
- audit_engine_v2: _load_rules从DB读config_json覆盖默认config
- audit_rule_sync: 启动时自动从_RULE_REGISTRY同步规则到DB(239条)
- settings API: update后刷新query_service配置缓存
- query_service: MAX_ROWS/QUERY_TIMEOUT/MAX_QUERY_LENGTH/MAX_RESULT_MEMORY改为动态读取system_settings
- ticket_executor: SQL_TIMEOUT/REDIS_TIMEOUT/MONGO_TIMEOUT改为动态获取
- settings_seeds: 新增executor分组(sql/redis/mongo超时) + query_result_max_memory_mb
- audit_rule endpoint: 移除无效的AuditEngine缓存清理(每次audit是新实例)
- 测试: 1057 passed(修复所有新引入失败,17个历史遗留)
2026-05-25 02:29:52 +08:00
logan ddf4856a85 feat: 升级FLOAT/DOUBLE审核规则为ERROR级别-覆盖CREATE+ALTER-MODIFY-CHANGE-防止生产精度丢失 2026-05-25 01:56:26 +08:00
logan 8f962a988f fix: Redis target_database隔离修复 - _parse_redis_commands使用ticket.target_database作为默认db编号,修复简单文本格式写死db=0的bug,确保工单提交到db1时数据正确写入db1 2026-05-25 01:45:37 +08:00
logan b92c3399e1 fix: 审批拒绝不发通知,仅保留创建/审批通过/执行结果三个通知点 2026-05-25 01:30:04 +08:00
logan 880dbfefa4 feat: Dashboard数据关联修复 + 通知模板优化 + 工单创建页布局
1. Dashboard: stats新增queryStats查询统计, trend API真实工单趋势数据
2. Layout铃铛: 显示真实待审批工单数量
3. 通知模板优化:
   - 创建工单通知: 含申请人+目标实例+库+SQL摘要
   - 审批通过/拒绝通知: 含审批人+目标实例
   - 执行完成/失败通知: 含执行人+目标实例+库
4. 飞书卡片颜色: 创建=turquoise, 审批=blue, 成功=green, 失败=red
5. 钉钉消息: 添加状态emoji标签(🆕✅❌⚠️)
6. TicketCreatePage: 底部操作栏(SQL检测+提交审批)
7. ticket_executor: 移除aiomysql不支持的read_timeout/write_timeout

Tests: 1057 passed, 17 pre-existing failures (notification 35/35 passed)
2026-05-25 01:29:24 +08:00
logan 7109031f71 refactor: 新建工单页面全高布局优化 — 参考查询页面风格
- 全高布局 h-[calc(100vh-3rem)],去掉 max-w-6xl 限制
- 顶栏紧凑排列: 返回+标题+实例+数据库+定时+浏览+格式化+操作按钮
- 左侧 Schema 浏览面板(280px 可折叠)
- SQL 编辑器占满剩余空间
- 底部: 审核结果+变更原因(单行 input 替代 textarea)
- 按钮精简: 'SQL 检测' + '提交审批',去掉冗长提示文案
2026-05-25 00:45:53 +08:00
logan 0995abce08 feat: 查询页面重构 — 去掉新建查询按钮, 默认直接显示编辑器 + 右侧历史抽屉
1. QueriesPage 重构:
   - 去掉两段式切换(历史列表→新建查询面板)
   - 默认直接显示 SQL 编辑器,无需点'新建查询'
   - 实例+数据库选择器紧凑排列在顶栏
   - 执行按钮移到顶栏右侧,操作更便捷
   - 查询历史改为右侧可折叠抽屉(点击'历史'按钮展开)
   - 全高布局 h-[calc(100vh-3rem)],编辑区和结果区更宽敞
   - Schema 导航侧边栏、快捷模板、CSV导出等保留

2. 文档更新:
   - FEATURES.md: 补充定时执行、SQL检测、日志清理、系统设置种子机制
   - ARCHITECTURE.md: 补充 APScheduler+SQLite 持久化调度、日志清理服务、Settings Seeds
   - ROADMAP.md: 标记已完成功能,更新P1-P3进度
   - AUDIT_REPORT.md: 更新服务/文件/测试数量统计
2026-05-25 00:35:57 +08:00
logan 00db0e5bca feat: 日志自动清理 — 系统设置+定时任务+手动操作
1. 系统设置新增 cleanup 分组(6项配置):
   - 启用自动清理(开关)
   - 清理执行时间(默认凌晨3点)
   - 工单保留天数(默认90天)
   - 审计日志保留天数(默认180天)
   - 查询历史保留天数(默认30天)
   - 定时任务日志保留天数(默认30天)

2. log_cleanup.py: 自动清理服务
   - 只清理已完成/已拒绝的工单
   - 按保留天数过滤
   - 0天=不清理

3. APScheduler cron job: 每天03:00自动清理

4. API endpoints:
   - POST /settings/cleanup/run — 手动触发清理
   - GET /settings/cleanup/preview — 预览待清理数量

5. 前端 PlatformConfigPage:
   - GROUP_META 新增 cleanup 分组
   - CleanupActions 子组件: 预览+手动清理按钮

6. 清空所有历史工单数据(tickets/ticket_approvals/audit_logs/query_histories)
2026-05-25 00:19:38 +08:00
logan a8c92fe7ae feat: APScheduler持久化定时任务 + SQL检测按钮 + 定时时间醒目红色
1. ticket_scheduler.py: 纯asyncio→APScheduler+SQLite持久化
   - 服务重启后定时任务不丢失
   - 启动时自动恢复scheduled状态工单
   - shutdown时优雅关闭scheduler

2. TicketCreatePage.tsx:
   - 提交按钮旁新增SQL检测按钮(Shield图标)
   - 验证通过前提交按钮置灰+提示'请先通过SQL检测'
   - SQL内容变化自动重置验证状态
   - 定时时间改为醒目红色字体(text-red-500 font-semibold)

3. main.py: lifespan中启动APScheduler+恢复定时工单
2026-05-25 00:08:48 +08:00
logan ffb3d24e2a feat: 定时执行工单 — 新建工单+自动任务管理全面重构
后端:
- Ticket 模型新增 scheduled_at 字段 (DateTime, nullable)
- TicketStatus 新增 SCHEDULED 状态
- 状态转换图: approved→scheduled, scheduled→executing/approved
- execute_ticket: scheduled_at 在未来时进入 scheduled 状态
- ticket_scheduler.py: asyncio 后台定时执行器
- GET /tickets/scheduled/list: 列出定时执行中工单
- POST /tickets/{id}/cancel-schedule: 取消定时执行

前端:
- TicketCreatePage: 新增定时执行 checkbox + datetime-local picker (秒级精度)
- AutoTaskPage: 全面重写为真实定时任务管理页
  - 实时倒计时显示 (Xh Xm 后执行)
  - DB 类型图标 (MySQL/PG/Redis/MongoDB)
  - SQL 预览 + 取消定时执行
  - 每 30 秒自动刷新
2026-05-25 00:02:21 +08:00
logan 478e663313 refactor: TicketCreatePage 三步合并为单页面
- 去掉 STEPS/step 状态机、renderStepIndicator、renderStep2、renderStep3
- 表单布局:标题+实例+数据库一行三列,SQL编辑器+浏览面板左右分栏
- 点击「提交工单」按钮自动执行:表单校验 → SQL审核 → error级阻止/warn级放行 → 创建工单
- 审核结果内联展示在表单下方(错误/警告/提示统计 + 违规详情)
- 保留所有原有功能:多DB类型浏览、Redis目录树、MongoDB集合、库表浏览辅助
- 从 1193 行精简到 ~560 行
2026-05-24 23:48:32 +08:00
logan 198cf7baf7 docs: 全面项目架构和功能文档 — docs/ 目录
新增 5 个文档:
- ARCHITECTURE.md (308行) — 系统架构图 + 核心模块 + 数据模型 + 关键决策
- AUDIT_REPORT.md (432行) — 完整审计报告 (规模/依赖/测试/数据库)
- FEATURES.md (194行) — 功能清单 (已完成/开发中/待实现)
- PROJECT_EVALUATION.md (63行) — 项目评估 (4.2/5.0 评分 + 竞品对比)
- ROADMAP.md (52行) — 开发路线图 (13个里程碑 + 4个Sprint计划)
2026-05-24 23:42:45 +08:00
logan 9813741838 feat: SchemaSidebar 加宽 + Redis key 点击插入查询命令到编辑器
- QueriesPage grid 从 1:3 改为 2:3,sidebar 更宽
- RedisTree 新增 onInsert prop,点击叶子节点自动插入对应命令
- redisCommand(): string→GET, hash→HGETALL, list→LRANGE, set→SMEMBERS, zset→ZRANGE
2026-05-24 23:34:27 +08:00
logan 2f76482eac refactor: Redis 树取长补短 — 单列内嵌详情 + 类型颜色图标 + 左竖线层级
取 SchemaSidebar (查询页) 之长:
- 选中 key 内嵌展开详情(type/TTL/value),取代双列布局
- border-l 左竖线做层级指示,视觉更清晰
- 文件夹图标改为 text-amber-400/70 半透明琥珀色
- 搜索栏融入顶部 border-b 工具栏

保留变更页独有优势:
- 点击叶子自动插入类型对应命令(GET/HGETALL/LRANGE/SMEMBERS/ZRANGE)
- hover 显示插入提示

新增改进:
- Key 图标按类型着色:string=绿 hash=蓝 list=紫 set=橙 zset=红
- 展开子级外包裹 border-l 容器,层级更直观
- 修复 renderRedisTreeNode 依赖列表(加 loadingRedisDetail/redisKeyDetail)
2026-05-24 23:25:48 +08:00
logan 327ab33361 feat: Redis Keys 目录树结构浏览 — 按 : 分隔符构建层级树
- buildRedisTree: 将扁平 key 列表按 ':' 分隔构建为树结构
- 文件夹节点可展开/折叠,显示子节点数量
- 叶子节点显示 key type 标签(string/hash/list/set/zset)
- 点击叶子节点自动插入对应查询命令:
  - string → GET key
  - hash → HGETALL key
  - list → LRANGE key 0 -1
  - set → SMEMBERS key
  - zset → ZRANGE key 0 -1 WITHSCORES
- 右侧保留 Key 详情面板(类型/TTL/值预览)
- DB 下拉改为从后端 databases 数据生成
- 树按文件夹优先+字母排序
2026-05-24 23:16:22 +08:00
logan ed13243bb0 feat: 多数据库类型支持 — Redis/MongoDB/PostgreSQL 数据库+表浏览
后端:
- InstanceService.list_databases: Redis 通过 CONFIG GET databases 返回 db0-db15
- InstanceService.list_databases: MongoDB 通过 pymongo list_database_names 返回库列表
- InstanceService.list_tables: MongoDB 通过 list_collection_names 返回集合列表
- PostgreSQL 数据库/表列表已有支持

前端:
- TicketCreatePage: 所有数据库类型统一走后端 listDatabases API
- Redis 数据库改为下拉选择(db0-db15),替代手动输入
- 浏览面板: MySQL/PG 显示表结构+索引, MongoDB 显示集合, Redis 显示 Keys
- 新增 renderCollectionsTab 用于 MongoDB 集合浏览
- isMySQL 重命名为 isSQL, 新增 isMongo 类型判断
2026-05-24 23:11:44 +08:00
logan fb167233bc fix: TicketCreatePage 去掉优先级选择器+修复Redis实例切换后database残留触发MySQL tables请求 2026-05-24 23:01:39 +08:00
logan 08f0f88cf1 feat: 工单列表重设计+权限组实例过滤+通知修复
后端:
- Ticket model 新增 ticket_no 字段(格式: YYYYMMDDHHmmss+ms+seq, 如20260522160543841)
- create_ticket 自动生成工单编号(flush后生成)
- _enrich_ticket 新增 instance_name, current_approver_name 字段
- current_approver: 从 ticket_approvals 查询第一个 pending 状态的审批步骤获取审核人
- TicketResponse schema 新增 ticket_no, instance_name, current_approver_name
- 新增 /instances/accessible endpoint(按用户权限组过滤实例, 无admin bypass)
- instance_group response_model 改为 InstanceGroupDetailResponse(含readonly/write实例)
- instance_group_members 脏数据清理, 重建 group_id=2 正确数据
- notification 模板修复: \n→\n 换行, 钉钉 \n→\n\n 双换行
- test_notification endpoint 改为真正调用 NotificationSender.send()
- auditor 角色添加到 audit_rule/ticket 只读端点
- seed_data() 创建4个默认用户(admin/zhangsan/laoliu/lurenjia)
- SQLite ALTER TABLE 添加 ticket_no 列, 迁移现有6条工单数据

前端:
- TicketsPage 完全重设计: 工单编号/实例名称/提交人/当前审核人/状态/操作
- 状态映射简化: pending/reviewing/approved→审核中, success→完成, failed→失败
- 执行详情弹框: 解析 execute_result JSON 展示状态/影响行数/耗时/验证/原始输出/错误信息
- 状态流程可视化(提交→审批→通过→执行→完成)
- 快速筛选: 全部/待审批/执行中/完成/失败 (合并 pending+reviewing+approved 统计)
- TicketCreatePage: 去掉数据库类型选择器, 用 accessible(write) 过滤变更实例
- QueriesPage: 用 accessible(readonly) 过滤查询实例
- instance.ts 新增 accessible 方法
- 分页优化: 动态计算页码范围(总页>5时中间滚动)
2026-05-24 22:55:51 +08:00
logan 88d064ea95 feat: 权限组重构为一组双Transfer(只读+写入) + 用户管理加权限组关联
后端:
- 新增 instance_group_members 中间表 (group_id + instance_id + access_type)
- 一个权限组同时包含 readonly 和 write 两类实例
- API create/update 支持 readonly_instance_ids + write_instance_ids
- Schema Response 返回 readonly_instances + write_instances 分类型列表
- 20 个测试全部通过

前端:
- InstanceGroupPage: 创建/编辑都是上下两个 Transfer 同时配置只读和写入
- 列表卡片显示 [N只读 · M写入] 标签
- 详情页分只读实例和写入实例两块展示
- UsersPage 编辑用户弹框加权限组多选
- instanceGroup.ts API 适配新接口
2026-05-24 20:08:31 +08:00
logan 39d9600e82 refactor: 权限组从一组一类型改为一组同时包含readonly+write实例
- 新增 instance_group_members 中间表关联权限组和实例
- InstanceGroup 模型移除旧的 instances relationship,改为通过中间表查询
- Instance 模型保留 group_id FK(兼容)但移除 group relationship
- Schema 新增 readonly_instance_ids / write_instance_ids 字段
- InstanceGroupResponse 改为 readonly_instance_count + write_instance_count
- InstanceGroupDetailResponse 返回 readonly_instances + write_instances
- InstanceAssignRequest 新增 access_type 参数
- API create/update 支持同步写入 instance_group_members
- role_permissions 服务更新为使用中间表查询
- 新增迁移 SQL 并应用到 sqlite3.db
- 测试全部通过 (20/20)
2026-05-24 20:03:55 +08:00
logan 40868c61bf feat: 权限组创建改为双Transfer同时配置只读+写入
- 新建时不再二选一,上下两列Transfer同时配置查询权限和写入权限
- 自动生成「名称-只读」「名称-写入」两个权限组
- 编辑模式保持单组编辑不变
- 按钮显示将创建几个权限组
2026-05-24 19:43:53 +08:00
logan 128de64592 feat: 数据源编辑加排除数据库+脱敏字段+审批流关联; 权限组Transfer改为选择实例
- EditInstanceDialog: 新增排除数据库(逗号分隔)、脱敏字段(动态表单+表/字段/规则)、审批流程关联
- Instance: workflow JSON字段改为workflow_id FK关联workflow_definitions表
- InstanceGroupPage: Transfer穿梭框从选数据库改为选实例(数据源)
- 后端instance API返回workflow_name, _get_workflow_names批量查询
- DB迁移: instances表添加workflow_id列
- 37个测试全部通过
2026-05-24 19:36:39 +08:00
logan 4111e1eee8 refactor: 权限组简化为2组(readonly/write) + Transfer穿梭框选择数据库
- access_type 从3值(readonly/datachange/ddl)简化为2值(readonly/write)
- readonly=只读查看(关联只读/从库用于查询) write=写入变更(关联主库用于工单)
- 前端InstanceGroupPage重写: 2权限类型卡片+自定义Transfer穿梭框组件
- Transfer组件: 左侧可选数据库→右侧已授权数据库, 搜索/勾选/箭头移动
- role_permissions.py更新: 2值权限映射, get_accessible_instances按access_type过滤
- 后端schema/模型校验更新为readonly|write正则
- 15个测试全部通过
2026-05-24 19:27:04 +08:00
logan 8161bcf5b5 feat: 权限组简化 + 工单撤销按钮
后端:
- InstanceGroup 新增 access_type (readonly/datachange/ddl) 和 allowed_databases 字段
- 创建 role_permissions.py 角色权限服务 (admin/dba/auditor/developer)
- SQLite ALTER TABLE 迁移脚本

前端:
- InstanceGroupPage 全面重写: 3种权限类型卡片(只读/数据变更/DDL)替代20+开关
- 新增/编辑弹窗: 权限类型选择 + 限定数据库输入
- 左侧列表显示权限类型标签
- 菜单标签: '权限管理' → '权限组'
- 工单列表 + 工单详情: 新增撤销按钮 (pending/reviewing 状态可撤销)
- API 类型定义: 新增 access_type/allowed_databases
2026-05-24 19:02:39 +08:00
logan b80d383b28 refactor: 重构权限组系统 — 新增 access_type/allowed_databases 字段 + 角色权限服务
重构 InstanceGroup 权限组系统,从细粒度 20+ 权限开关简化为 3 种类型模式。

改动:
- InstanceGroup 模型新增 access_type (readonly/datachange/ddl) 和 allowed_databases 字段
- 保留旧 permissions 字段以兼容已有数据
- Schema 新增 access_type 和 allowed_databases 字段
- API endpoint 更新 create/update 处理逻辑
- 新增 role_permissions.py 服务,提供角色权限查询

Refactor InstanceGroup permission system from 20+ fine-grained permission
switches to a simplified 3-type access model (readonly/datachange/ddl).

Changes:
- Add access_type and allowed_databases columns to InstanceGroup model
- Keep legacy permissions field for backward compatibility
- Update schemas with new fields
- Update API endpoint create/update logic
- Add role_permissions.py service with role-based permission queries
2026-05-24 18:54:36 +08:00
logan 35a014e571 feat: 查询页增强 + 权限体系优化
- Redis DB0~DB15 下拉选择,默认DB0
- 查询历史粘贴按钮(一键填入SQL编辑器)
- 去掉导出历史按钮
- SchemaSidebar 按目标数据库筛选
- SQL自动补全 schema 双层注册(db→tables, table→columns)
- 后端 db-schema 接口(INFORMATION_SCHEMA.COLUMNS 一次加载)
- autocompletion 扩展激活
- Redis key 树形结构(冒号分隔层级)
- Redis 查询模板 GET/HGETALL/HGET
- guest 角色彻底移除,改为 auditor
- 登录页优化:去掉演示账号、placeholder 中文提示
2026-05-24 18:50:08 +08:00
logan aa2e26c827 feat: 查询页目标数据库改为下拉选择
- 选实例后自动加载该实例的数据库列表 (SHOW DATABASES)
- 手动输入框改为 select 下拉,选库更方便
- Redis/MongoDB 实例不显示数据库下拉
2026-05-24 15:54:33 +08:00
logan e6ab5bf496 feat: SchemaSidebar 三级树结构 — 库→表→字段 (类似 Navicat)
- MySQL: 先加载数据库列表,点击库展开表,点击表展开字段
- 当前选中的 database 自动展开并标记「当前」
- 搜索框支持搜库名和表名,跨库搜索
- 每个库的表列表独立缓存,切换库不重复请求
- Tab 名改为「库表」更直观
- Redis 部分保持不变
2026-05-24 15:52:08 +08:00
logan 6a8c4d95d5 feat: Redis/MySQL 加载骨架屏 loading 效果
- SchemaSidebar: MySQL 表列表加载改为 6 行骨架屏 animate-pulse
- SchemaSidebar: Redis key 列表加载改为 6 行骨架屏 animate-pulse
- RedisDetailPage: key 表格加载时显示 5 行骨架屏 + 加载中提示
- 替换原来的纯文字/spinner,视觉上更流畅
2026-05-24 15:46:58 +08:00
logan ca99f0ea7f fix: 工单提交422错误处理 + SQL模板占位符校验
- TicketCreatePage: Pydantic 422 detail 是对象数组,前端错误处理改为检测数组并拼接 msg
- QueriesPage: 执行前检查 SQL 中未替换的 {table}/{db}/{collection} 占位符,阻止执行
- QueriesPage: 同步修复 422 detail 数组的错误处理
2026-05-24 15:37:08 +08:00
logan 0aa4595c90 fix: 查询模板占位符替换 + _auto_add_limit 跳过非SELECT语句 + 默认用户密码修正
修复:
- getTemplateSQL() 支持 {table}/{db}/{collection} 占位符自动替换
- _auto_add_limit() 仅对 SELECT 语句添加 LIMIT, SHOW/DESC/EXPLAIN 跳过
- seed_data 默认用户密码从 '***' 改为 'admin123'
- DB 中已有用户密码已重置为 admin123

测试: 75 passed (新增2个 SHOW/DESC LIMIT 测试)
2026-05-24 15:32:51 +08:00
logan 0fb947dcb5 feat: TicketCreatePage tab化 + SchemaSidebar + Redis快速搜索 + Dashboard导航修复
TicketCreatePage 重构:
- SQL编辑器右侧新增数据库浏览器面板(tab化)
- 表结构Tab: 表列表→字段展开(PK/索引标记)→点击插入SQL
- 索引Tab: 选中表的索引详情(索引名/类型/字段/基数)
- Redis Keys Tab: DB选择器+Key模式搜索+Key列表+类型/TTL/值查看

SchemaSidebar 新组件(365行):
- MySQL/PostgreSQL: 左侧数据库表树→字段→点击插入SQL
- Redis: Key树(DB选择→模式搜索→Key值查看, 类似Another Redis Desktop Manager)
- 用于 QueriesPage 查询页面

Dashboard:
- 快捷按钮改用 useNavigate + onClick 替代 <a href>

API增强:
- redis.ts: 新增 getKeys/createKey/deleteKey 方法
- instanceDetail.ts: 导出 TableMeta/TableDetail/ColumnInfo/IndexInfo 类型接口
2026-05-24 15:10:31 +08:00
logan 8471f368eb init 2026-05-24 14:08:45 +08:00
logan c7fccf99c7 feat: 三大核心功能完成 — query_history持久化 + EXPLAIN真实解析 + Dashboard修复
P1 查询历史持久化 (47 tests):
- QueryHistory/QuickQuery SQLAlchemy model 建表
- query_history_service 从内存迁移到 SQLite async
- 每用户500条上限自动清理
- 7个API endpoint全部对接持久化
- 10个预置快捷查询模板

P2 EXPLAIN真实解析 (40 tests):
- MySQL EXPLAIN FORMAT=JSON 执行+解析
- PostgreSQL EXPLAIN (FORMAT JSON) 执行+解析
- SQLite EXPLAIN QUERY PLAN 解析
- 统一树结构输出 + 优化警告
- POST /api/v1/sql-assistant/explain endpoint

Dashboard修复:
- 修复重复export default导致页面崩溃
- 对接/instances /tickets /dashboard/stats真实API
- 替换硬编码统计数字为API驱动
- 修复calcHealthScore安全访问

AuditLogsPage:
- 修复Fragment key warning

1081 tests passed (10 system_settings failures are pre-existing)
2026-05-24 12:29:21 +08:00
logan 1fcb984aee fix: Dashboard 页面崩溃修复 + 真实 API 数据对接
- 修复重复 export default 导致页面无法加载
- 添加 dbInstances/tickets/queryStats state 定义
- 对接 /instances /tickets /dashboard/stats 真实 API
- 替换硬编码查询统计数字为 API 驱动
- 修复 calcHealthScore 对缺失字段的安全访问
- 新增 QueryHistory/QuickQuery SQLAlchemy model (建表准备)
- 1040 测试通过
2026-05-24 12:05:26 +08:00
logan 8b921c6c83 refactor: mock清理+安全配置+通用组件+菜单优化
P0安全: SECRET_KEY/ADMIN_PASSWORD/CORS环境变量化, seed仅admin

P1Mock: mock.ts 301->88行, 删8数据mock+5generateMock, net-1300行

P2组件: useToast/useFetchList+ConfirmDialog/FormDialog

P3菜单: menuSections/menuItems->constants/menu.ts

P4API: NotificationsPage/WorkflowPage重写+RolesPage演示

测试: 1050passed, tsc clean
2026-05-24 02:42:29 +08:00
logan ec3a03cf38 docs: 添加 v0.1.0 Release Notes 2026-05-24 01:51:28 +08:00
logan 4ac2528f8e fix: 审核引擎优化 + 执行结果结构化展示
后端审核规则修复:
- Redis SEC-001: SET/DEL等常规命令不再误报AUTH要求,改为仅对管理级命令WARNING
- Redis SEC-003: 降级为INFO,排除已由CMD-001拦截的FLUSHDB/FLUSHALL
- Redis key提取: 排除CONFIG/ACL等管理命令,不再把子命令参数误认为key名
- MySQL SEC-006: 新增GRANT ALL/REVOKE ALL全局权限拦截
- MySQL SEC-007: 新增LOAD DATA/LOAD XML拦截
- MySQL SEC-008: 新增SLEEP()/BENCHMARK()时间盲注拦截
- MySQL SEC-009: 新增INTO OUTFILE/DUMPFILE文件写入拦截

前端执行结果结构化:
- TicketDetailPage执行结果从原始JSON改为结构化展示
- 解析JSON展示: 状态徽章+影响行数+耗时+验证状态
- Errors/Warnings逐条渲染: 红色错误框+黄色警告框+具体消息
- 删除废弃的executeStats/renderExecuteStats

其他: 审核规则6分组/慢查询移除/查询数据重命名/AuditLogs修复
测试: 1040 passed, TSC零错误
2026-05-24 01:31:33 +08:00
logan 9f56e866f2 fix: 移除所有弹框遮罩层点击关闭 — 防止输入时误触关闭
涉及文件 (12处):
- InstancePage.tsx: 添加数据源弹框
- UsersPage.tsx: 新建/编辑/重置密码/详情弹框 (4处)
- RolesPage.tsx: 克隆角色弹框
- InstanceGroupPage.tsx: 新建/编辑/关联实例/关联用户弹框 (4处)
- SlowQueryPage.tsx: 查询对比弹框
- RedisDetailPage.tsx: 键详情/新增键弹框 (2处)

改动: 遮罩层div移除onClick,只能通过X按钮或取消按钮关闭
2026-05-23 23:38:58 +08:00
logan 47f077c97f test: instance端点扩展测试 (8→17) + 数据库列补齐修复
测试扩展 (test_instances.py):
- list_instances: 新增过滤(db_type/env)、权限(non_admin)、未认证场景
- update_instance: 新增404、developer禁止、dba允许
- delete_instance: 新增404、developer禁止

数据库修复:
- audit_rules表补齐value列
- audit_logs表补齐11列(username/db_type/database_name等)
- instances表补齐5列(access_mode/workflow/excluded_databases等)

依赖修复: bcrypt 4.0.1 兼容 passlib 1.7.4
2026-05-23 23:10:19 +08:00
logan 305bbb153c test: P2测试覆盖 — user/pool/schema_drift端点 43个新测试 (895→1017全通过)
新增测试文件:
- test_user_endpoint.py (18 tests): 用户CRUD/列表过滤/权限控制/自删保护
- test_pool_endpoint.py (12 tests): 连接池状态/重置/概览/mock外部依赖
- test_schema_drift_endpoint.py (13 tests): Schema快照捕获/漂移检测/历史查询

覆盖率提升:
- user端点: 0→18 tests (CRUD+权限+重复用户名+自删保护)
- pool端点: 0→12 tests (stats/reset/overview+角色访问控制)
- schema_drift端点: 0→13 tests (capture/check/history+dict序列化兼容)

修复: run.sh启动脚本同步
2026-05-23 23:05:03 +08:00
logan b39c426317 fix: merge后14个测试修复+前端TS编译修复 - 895/895通过+前端零错误 2026-05-23 17:50:13 +08:00
logan 58eb78c987 merge: SQL平台代码v1 优化包合并 — 193条审核规则 + 16页面UI优化
后端新增 (Step 1):
- mysql_audit_rules.py: 63条 MySQL审核规则 (DDL 36 + DML 9 + 命名 5 + 性能 5 + 安全 5)
- redis_audit_rules.py: 43条 Redis审核规则 (KEY管理 10 + 命令安全 12 + 数据结构 8 + 性能 8 + 安全 5)
- mongodb_audit_rules.py: 42条 MongoDB审核规则 (集合管理 + 查询安全 + 聚合管道 + 写入安全 + 性能)
- postgres_audit_rules.py: 45条 PostgreSQL审核规则 (DDL 18 + DML 8 + DQL 6 + 安全 6 + 性能 7)

后端合并 (Step 2):
- audit_engine_v2.py: 新增4个DB规则模块import (100+→200+规则)
- audit_rule_seeds.py: 新增30条MongoDB种子规则 + 别名映射
- audit_rule.py: 新增数据库类型别名 (postgresql→postgres, pg→postgres, mongo→mongodb)

前端优化 (Step 4) — 16页面全覆盖:
- InstancePage, WorkflowPage, TicketsPage, TicketCreatePage, TicketDetailPage
- UsersPage, SlowQueryPage, DataDictionaryPage, Dashboard
- InstanceGroupPage, AuditLogsPage, QueriesPage, AuditRulesPage, RolesPage
- useAuth.tsx, SqlEditor.tsx

后端测试 895/895 通过, 前端 tsc --noEmit 通过
2026-05-23 16:46:13 +08:00
logan e1ba8b3327 test: query端点测试覆盖扩展 (4→22) — mock + 权限场景
TestExecuteQuery (16 tests):
- 快乐路径: SELECT成功, mask=false, save_history=false
- 安全: DDL/DML拒绝(400), guest(403), 无认证(401)
- 权限: 公共实例developer可查, 受限组403, 组成员+query:select→200, 无权限→403
- 错误: 无效instance(404), 缺参数(422), 空SQL(422), 服务异常(500)

TestSupportedTypes (6 tests):
- 4种DB类型返回, 结构字段验证
- Redis readonly_commands, MongoDB readonly_operations
- developer可访问, 无认证401

后端测试 843→895 (+52)
2026-05-23 15:29:07 +08:00
logan e591eb4583 test: announcement+dashboard测试覆盖 — 36新测试 (843→877)
test_announcement.py (24 tests):
- CRUD: 创建(空标题/过长/缺字段), 列表(空/排序/认证), 更新(标题/内容/发布/取消), 删除(404)
- 权限: dba/developer/guest各角色操作限制 (403), 未认证(401)
- 边界: 完整生命周期, 重复发布幂等

test_dashboard.py (12 new, total 14):
- 空数据库零计数, 返回8字段验证
- 创建工单/实例/用户后计数验证
- inactive用户不计入, AuditLog仅计QUERY
- developer/guest访问, 未认证401
2026-05-23 15:23:13 +08:00
logan dba161265c fix: AuditLogsPage暗色主题适配(20处) + 权限项前后端对齐(18→9项)
AuditLogsPage 暗色主题 P0 修复:
- ACTION_COLORS: bg-blue-100→bg-blue-500/15, text-blue-800→text-blue-400 等 8 项
- 表格容器: bg-white→dg-card, bg-gray-50→bg-[var(--dg-bg-tertiary)]
- 所有 text-gray-* → --dg-text-* 变量
- 所有 bg-gray-* → --dg-bg-* 变量
- 分隔线: divide-gray-100→divide-[var(--dg-border)]
- 分页按钮: 全部改用 dg 变量
- grep 验证: 零残留硬编码亮色

InstanceGroupPage 权限项对齐:
- 前端权限项从 18 个精简到 9 个,与后端 PERMISSION_ACTIONS 一致
- 查询: query:select, query:write
- 工单: ticket:create, ticket:approve, ticket:execute
- DDL: ddl:execute
- 运维: slowlog:view, backup:manage, instance:detail
2026-05-23 15:13:22 +08:00
logan 583e891619 fix: CodeMirror多实例冲突 — 移除@codemirror/rectangular-selection@0.19.x和codemirror元包
根因: @codemirror/rectangular-selection@0.19.2 引入 @codemirror/state@0.19.9 (旧版)
与主依赖 @codemirror/state@6.6.0 冲突,导致 instanceof 检查失败

修复:
- npm uninstall @codemirror/rectangular-selection (已合并到 @codemirror/view)
- npm uninstall codemirror (元包,无代码引用)
- SqlEditor.tsx 移除 rectangularSelection import 和调用
- 后端测试 843/843 通过
2026-05-23 15:07:51 +08:00
logan 4c9427e546 sync: 同步 sql-platform-pro 最新代码 — 权限体系安全修复 v0.8.1
- P0: 实例访问控制全线接入权限组 (829测试)
- P1: permissions字段激活 + 操作级权限检查 (843测试)
- 前端: 删除数据权限页面, 权限组合并为唯一入口
- 新增: CodeMirror编辑器 + 查询模板 + 慢查询分析
- 新增: MongoDB管理页面 + Dashboard增强
- 修复: Pydantic V2迁移 + 前端TS错误修复
2026-05-23 14:41:06 +08:00
logan 6fcd9465cf chore: 完善 .gitignore — 排除 sqlite3/Thumbs.db/大文件文档 2026-05-23 00:10:32 +08:00
logan 765d27f1e3 feat: 实例权限组系统 — 完整CRUD + 实例/用户关联 + 前端管理页面
后端:
- InstanceGroup 模型 (name/db_type/permissions JSON/is_active)
- user_groups 关联表 (用户-权限组 M2M + 权限覆盖)
- Instance 模型增加 group_id FK
- User 模型增加 groups 关系
- API: CRUD + 实例关联 + 用户分配 + 权限组过滤
- 15 个新测试 (CRUD/关联/权限检查/参数校验) — 217/217 passing

前端:
- InstanceGroupPage: 左右布局(列表+详情)
- 权限配置: 5类17项权限勾选 (查询/DDL/工单/数据操作/管理)
- 实例关联/用户关联弹框
- 侧边栏增加权限组菜单 (数据源分组下)
- 路由 + 权限注册
2026-05-23 00:09:34 +08:00
logan 836ea97ee5 style: 数据源类型使用品牌SVG图标 + 按钮去装饰
- MySQL: 官方海豚蓝色SVG
- PostgreSQL: 官方大象蓝色轮廓SVG
- Redis: 官方红色菱形堆叠SVG
- MongoDB: 官方绿色叶子SVG
- 底部按钮去掉闪电图标,纯文字简洁风格
- 前端构建零错误, 后端202测试通过
2026-05-22 23:35:55 +08:00
logan e0cb505d43 refactor: 数据源弹框交互重构 + test-connection API
1. 类型选择前置: 4个数据源类型卡片(MySQL/PG/Redis/Mongo)放最前面
2. 根据类型动态渲染: Redis隐藏用户名/数据库, 显示数据库编号
3. 环境支持自定义输入: 预设开发/预发/生产/测试/UAT + 自定义...
4. 去掉流程配置: 不再需要配置审批流程
5. 测试连接优先: 底部左侧「测试连接」按钮, 连接成功后才能「添加数据源」
6. 后端新增 POST /test-connection: 不保存实例直接测试连接参数
7. 类型切换自动填充默认端口: mysql:3306, pg:5432, redis:6379, mongo:27017
8. 连接测试结果展示: 成功(绿色+版本号) / 失败(红色+错误信息)
9. 修改连接参数时自动清除测试结果, 需重新测试

前端构建零错误, 后端202测试通过
2026-05-22 23:32:56 +08:00
logan f8ae3b92e5 feat: 脱敏字段一键填入 + 实例密码已脱敏
- 脱敏字段支持标签化选择: 16个预设字段标签点击即添加
- 一键填入: 将全部预设字段填入 textarea
- 复制全部: 复制预设字段列表到剪贴板
- 预设字段: mobile, concat_mobile, email_alias, email, password,
  ga_key, private_key, secret, secret_key, key_snow,
  telephone, username, real_name, token, two_factor_secret, content
- 后端 InstanceResponse 不含 password 字段 (已脱敏)
- 前端构建零错误, 后端202测试通过
2026-05-22 23:21:41 +08:00
logan 87d2af5e48 fix: 脱敏处理 — 移除公司域名和内部实例名
- placeholder: pro-cex-rds → prod-mysql, pro-rds-ro.51aipay.com → mysql.example.com
- test fixtures 同步替换
- 修复 PageHeader 权限检查: 同时检查 routePermissionMap 和 actionPermissionMap
- 前端构建零错误, 后端202测试通过
2026-05-22 23:17:43 +08:00
logan dfdac3ad37 feat: P0前端页面完善 — InstanceDetail/RedisDetail/TicketCreate/TicketDetail
- InstanceDetailPage: 概览/表管理/SQL查询/用户权限/慢查询/进程列表 6个Tab
- RedisDetailPage: 键管理/监控信息/命令行/性能分析 4个Tab + 新增键弹框
- TicketCreatePage: 工单创建向导(选择实例/填写SQL/审核规则检查)
- TicketDetailPage: 工单详情+审批/拒绝/执行/回滚操作
- App.tsx 路由注册: instances/:id, redis/:id, tickets/create, tickets/:id
- API方法名对齐: listDatabases/listTables/listUsers
- 前端构建零错误, 后端202测试通过
2026-05-22 23:10:14 +08:00
logan 5cbd0e3441 refactor: 数据源菜单合一+布局优化
- 4个数据源菜单(MySQL/PG/Redis/Mongo)合并为1个「数据源」
- InstancePage 改为统一入口,顶部Tab切换类型过滤
- 添加数据源改为弹框Modal(默认MySQL)
- 去掉左下角用户区,退出登录移到右上角header
- 侧边栏收窄220px,整体布局更紧凑
- 后端202 tests passing
- 前端构建零错误
2026-05-22 22:53:48 +08:00
logan bab55d3927 feat: 审核规则模版+设置页面整合+去掉角色切换demo
后端:
- AuditRule 新增 value 字段, rule_type 扩展 DDL/DML
- MySQL/PG/Redis 预设规则种子接口 POST /audit-rules/seed/{db_type}
- 公告管理 CRUD (announcements)
- 消息推送 CRUD+测试 (notifications: 钉钉/飞书/邮件)
- LDAP 配置 CRUD+测试连接 (ldap-config)
- 164 tests passing (+31 新增)

前端:
- AuditRulesPage 重写: DB类型Tab+DDL/DML分组+参数编辑
- SettingsPage: 系统设置主页(审核规则/公告/推送/LDAP)
- NotificationPage: 钉钉/飞书/SMTP配置
- LdapConfigPage: LDAP设置+测试连接
- AnnouncementPage: 公告Markdown编辑
- 去掉左下角角色切换demo
- 侧边栏合并为: 系统设置(含审核规则+公告+推送+LDAP)
2026-05-22 22:26:10 +08:00
logan d5d19d6be4 feat: 项目重命名 SQL-Platform + 数据源表单重写(连接模式/流程/排除DB/脱敏)
- 项目名称 Web-Lite Pro → SQL-Platform 全局替换(13处)
- Instance 模型新增: access_mode, workflow, excluded_databases, mask_fields
- 创建数据源表单: 分区卡片(数据源信息/连接模式/流程/高级配置)
- 后端 JSON 字段序列化/反序列化
- 新增 5 个 Instance 字段测试 (133 total)
2026-05-22 22:08:05 +08:00
logan 1877522239 fix: AuditRulesPage白屏修复 + 数据源权限/状态对齐
- AuditRulesPage: rules/stats 空值防御, catch 时设置空数组/null
- instance.add 权限: admin → admin+dba (与后端一致)
- 状态映射: 后端 connected/disconnected/error → 前端在线/离线/异常
- InstancePage 所有状态引用统一使用 getStatusInfo()
2026-05-22 21:58:37 +08:00
logan f20cd30138 docs: update evaluation to v0.5.0 (score 8.3, production-ready) 2026-05-22 15:18:30 +08:00
logan 2cfd45c9d1 feat: run.sh restart/stop/status + real DB connector + GitLab CI
1. run.sh: start/stop/restart/status/logs/build/test
   - PID file management in .pids/
   - Colored output, health check wait, log files
   - Auto alembic migrate on start

2. DB Connector (replaces mock aiomysql):
   - MySQL: aiomysql (connect/query/dml/test)
   - PostgreSQL: asyncpg (connect/query/dml/test)
   - SQLite: sqlite3 via executor (connect/query/dml/test)
   - Unified interface: DBConnector.test_connection/execute_query/execute_dml
   - Connection test returns version + latency

3. GitLab CI/CD pipeline:
   - test: backend pytest + frontend build
   - build: Docker images (manual trigger)
   - deploy: SSH deploy (manual trigger)
   - Cache: pip + node_modules

Tests: 128 passing, frontend build: OK
2026-05-22 15:16:59 +08:00
logan 64e0c37972 docs: update PROJECT_EVALUATION/TDD_PLAN/ROADMAP for Phase 4 (score 8.1, 128 tests) 2026-05-22 13:36:43 +08:00
logan ff0a330e8a feat: Phase 4 - SQL AST analyzer, audit rules CRUD, Alembic, Docker (128 tests) 2026-05-22 13:35:35 +08:00
logan e45fbf3586 docs: update PROJECT_EVALUATION/TDD_PLAN/ROADMAP for Phase 3
- Score: 6.2 -> 7.6 (+1.4)
- Security: 5 -> 8 (+3.0, biggest jump)
- Tests: 44 -> 85 (41 new)
- Next: Phase 4 (SQL AST, rule CRUD, Alembic)
2026-05-22 13:11:12 +08:00
logan 66b09e4d85 feat: Phase 3 - AES encryption, SQL audit engine, audit logs (85 tests)
Phase 3.1: Instance password AES-256-GCM encryption
Phase 3.2: SQL audit rule engine (10 rules)
Phase 3.3: Auto-audit on ticket creation
Phase 3.4: Operation audit logs + GET /audit/logs
Tests: 44 -> 85 (41 new), Frontend: AuditLogsPage
2026-05-22 13:08:55 +08:00
logan 27989274f5 feat: Phase 2 — frontend-backend integration complete
- All 5 core pages now use real API instead of mock data
  - Dashboard: /api/v1/dashboard/stats
  - Tickets: list/create/detail/approve/execute/statistics
  - Users: list/create/toggle-active/delete
  - Instances: list/create/test-connection/delete
  - Queries: execute with result display + sensitive field masking
- Updated DashboardStats type to match backend schema
- Fixed InstancePage to work with InstanceResponse (no qps/cpu/metrics yet)
- Added create forms for Tickets, Users, Instances
- Added connection test in InstanceDetail
- Updated TDD_PLAN.md: Phase 1 ✅ (44 tests), Phase 2 ✅
- Updated ROADMAP.md: v0.2.0 ✅
- Updated PROJECT_EVALUATION.md: score 5.7 → 6.2
- Frontend build passes with zero TS errors
- 44 backend tests still passing
2026-05-22 12:39:48 +08:00
loganandClaude Opus 4.7 c0c731acfc feat: TDD Phase 1 — 44 backend API tests passing
Test infrastructure:
- conftest.py with SQLite in-memory DB, isolated per-test cleanup
- pytest.ini with asyncio auto mode
- Fixtures: admin/dba/developer/guest/disabled users, tokens, test instance

Test coverage (44 tests):
- test_auth: login/logout/me/token expiry (8 tests)
- test_users: CRUD + role permissions (8 tests)
- test_instances: CRUD + connection test mock (8 tests)
- test_tickets: CRUD + review/execute workflow + pagination (11 tests)
- test_query: select/drop/delete rejection + guest deny (4 tests)
- test_dashboard: stats + auth check (2 tests)

Backend fix:
- query endpoint now catches ValueError from QueryService → 400 instead of 500

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 11:34:47 +08:00
loganandClaude Opus 4.7 439155c92e Initial commit: SQL audit platform v0.1.0
FastAPI backend with auth, user, instance, ticket, query, dashboard APIs.
React + TypeScript frontend with mock data UI (10 pages).
SQLite + async SQLAlchemy, JWT auth, role-based access control.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 11:11:57 +08:00