- 新增 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 计划
367 lines
19 KiB
Markdown
367 lines
19 KiB
Markdown
# SQL-Platform 系统架构文档
|
|
|
|
> 更新时间: 2026-05-26 | 版本: v0.3.1 | 后端: Go/Gin | Commit: f2e93a0
|
|
|
|
## 1. 系统定位
|
|
|
|
**自助查询 + 数据变更审批流** 平台(对标 Yearning / Archery),支持 MySQL / PostgreSQL / Redis / MongoDB 四种数据库类型。
|
|
|
|
## 2. 技术栈
|
|
|
|
| 层级 | 技术 | 版本 |
|
|
|------|------|------|
|
|
| 后端语言 | Go | 1.26 |
|
|
| 后端框架 | Gin | v1.10.1 |
|
|
| ORM | GORM | v1.26.0 |
|
|
| 元数据库 | SQLite (GORM AutoMigrate) | gorm.io/driver/sqlite |
|
|
| 前端框架 | React 19 + TypeScript | Vite 7 |
|
|
| UI 组件 | shadcn/ui + Tailwind CSS 4 | Radix UI |
|
|
| 代码编辑器 | CodeMirror 6 | @codemirror/lang-sql |
|
|
| 图表 | Recharts | — |
|
|
| 认证 | JWT (HS256) + bcrypt (golang.org/x/crypto) | 默认 24h 过期 |
|
|
| DB 驱动 | go-sql-driver/mysql / jackc/pgx/v5 / go-redis/v9 / go-mongo-driver/v2 | — |
|
|
| LDAP | go-ldap/ldap/v3 | v3.4.13 |
|
|
| 部署 | run.sh PID 管理 | Go :9000, Frontend :5173 |
|
|
|
|
## 3. 系统架构图
|
|
|
|
```
|
|
┌──────────────────────────────────────────────────────────────────┐
|
|
│ 前端 (React 19 + Vite 7) │
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
│ │ Dashboard │ │ Queries │ │ Tickets │ │ Instances│ │
|
|
│ └─────┬────┘ └─────┬────┘ └─────┬────┘ └─────┬────┘ │
|
|
│ ┌──────┴──────┐ ┌────┴─────┐ ┌───┴──────┐ ┌──┴───────┐ │
|
|
│ │ Appearance │ │ SqlEditor│ │ Workflow │ │Settings │ │
|
|
│ │ Settings │ │ (CM6) │ │ Page │ │Page │ │
|
|
│ └─────────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
|
│ ┌──────────────────────────────────────────────────────┐ │
|
|
│ │ Login (5 themes: SplitView/CenteredCard/SidePanel/ │ │
|
|
│ │ FullImage/MinimalDark) useLogin hook │ │
|
|
│ └──────────────────────────────────────────────────────┘ │
|
|
│ ↕ axios /api/v1 │
|
|
├──────────────────────────────────────────────────────────────────┤
|
|
│ 后端 (Go 1.26 + Gin) │
|
|
│ ┌────────────────────────────────────────────────────┐ │
|
|
│ │ Router (router/router.go) │ │
|
|
│ │ 120+ routes: auth/ticket/instance/redis/workflow │ │
|
|
│ └──────────────────────┬─────────────────────────────┘ │
|
|
│ ┌──────────────────────┴─────────────────────────────┐ │
|
|
│ │ Middleware Stack │ │
|
|
│ │ CORS → Auth JWT (HS256) → RequireRole (RBAC) │ │
|
|
│ └──────────────────────┬─────────────────────────────┘ │
|
|
│ ┌──────────────────────┴─────────────────────────────┐ │
|
|
│ │ Handler Layer (internal/handler/) │ │
|
|
│ │ auth | user | instance | instance_detail | redis │ │
|
|
│ │ ticket | workflow | audit_log | notification │ │
|
|
│ │ dashboard | ghost | ldap | scheduled_task | stubs │ │
|
|
│ └──────────────────────┬─────────────────────────────┘ │
|
|
│ ┌──────────────────────┴─────────────────────────────┐ │
|
|
│ │ Service Layer (internal/service/) │ │
|
|
│ │ auth_service | ticket_service | instance_service │ │
|
|
│ └──────────────────────┬─────────────────────────────┘ │
|
|
│ ┌──────────────────────┴─────────────────────────────┐ │
|
|
│ │ GORM Model Layer (internal/model/model.go) │ │
|
|
│ │ 25+ models · AutoMigrate · SQLite metadata │ │
|
|
│ └──────────────────────┬─────────────────────────────┘ │
|
|
│ ┌──────────────────────┴─────────────────────────────┐ │
|
|
│ │ Database Drivers (5 types) │ │
|
|
│ │ go-sql-driver/mysql | jackc/pgx/v5 │ │
|
|
│ │ go-redis/v9 | go-mongo-driver/v2 | gorm/sqlite │ │
|
|
│ └────────────────────────────────────────────────────┘ │
|
|
└──────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## 4. Go 后端项目结构
|
|
|
|
```
|
|
backend/
|
|
├── cmd/
|
|
│ └── server/
|
|
│ └── main.go # 入口: Gin 初始化、GORM 连接、AutoMigrate、路由注册
|
|
├── config/
|
|
│ └── config.go # 配置管理 (PORT/DB_PATH/JWT_SECRET/GH_OST_PATH)
|
|
├── internal/
|
|
│ ├── handler/ # API 处理器 (17 个文件)
|
|
│ │ ├── auth.go # 登录、获取当前用户
|
|
│ │ ├── user.go # (stub_handlers) 用户 CRUD、批量导入
|
|
│ │ ├── instance.go # 实例 CRUD、连接测试
|
|
│ │ ├── instance_detail.go # MySQL 详情: databases/tables/schema/processlist/status/users
|
|
│ │ ├── instance_extra.go # 可访问实例、实例统计
|
|
│ │ ├── instance_group.go # 权限组 CRUD、成员管理
|
|
│ │ ├── redis.go # Redis: info/dbsize/keys/slowlog/clients/command
|
|
│ │ ├── ticket.go # 工单: 创建/审批/执行/取消/回滚/时间线
|
|
│ │ ├── workflow.go # 审批流: CRUD/克隆/设置默认
|
|
│ │ ├── audit_log.go # 审计日志查询
|
|
│ │ ├── notification.go # 通知渠道 CRUD + 测试发送
|
|
│ │ ├── dashboard.go # 仪表盘统计
|
|
│ │ ├── ldap.go # LDAP 配置/测试/导入/用户管理
|
|
│ │ ├── ghost.go # gh-ost DDL 变更
|
|
│ │ ├── scheduled_task.go # 定时任务管理
|
|
│ │ ├── crypto.go # AES-256-GCM 加解密
|
|
│ │ ├── connection_tester.go # 数据库连接测试
|
|
│ │ └── stub_handlers.go # SQL格式化/分析、数据字典、MongoDB 桩、审核规则、查询执行等
|
|
│ ├── model/
|
|
│ │ └── model.go # GORM 模型定义 (25+ 模型)
|
|
│ ├── middleware/
|
|
│ │ ├── auth.go # JWT 认证中间件 + RequireRole RBAC
|
|
│ │ └── cors.go # CORS 跨域中间件
|
|
│ ├── service/
|
|
│ │ ├── auth_service.go # 认证逻辑 (bcrypt 密码验证、种子用户)
|
|
│ │ ├── ticket_service.go # 工单业务逻辑
|
|
│ │ └── instance_service.go # 实例连接管理
|
|
│ └── ghost/
|
|
│ └── ghost.go # gh-ost 集成逻辑
|
|
├── router/
|
|
│ └── router.go # Gin 路由注册 (120+ 路由)
|
|
└── go.mod # 依赖管理 (module: sql-platform)
|
|
```
|
|
|
|
### 4.1 启动流程
|
|
|
|
```go
|
|
// cmd/server/main.go
|
|
config.Init() // 加载 .env 配置
|
|
db = gorm.Open(sqlite.Open(...)) // 连接 SQLite 元数据库
|
|
db.AutoMigrate(&model.User{}, …) // 自动迁移 25+ 模型
|
|
r = gin.Default() // 创建 Gin 引擎
|
|
r.Use(CORSMiddleware()) // 全局 CORS
|
|
router.Setup(r) // 注册 120+ API 路由
|
|
r.Run(":9000") // 启动 HTTP 服务
|
|
```
|
|
|
|
### 4.2 编译与运行
|
|
|
|
```bash
|
|
cd backend && go build -o sql-platform ./cmd/server/ # 编译
|
|
bash run.sh restart # Go :9000 + Frontend :5173
|
|
```
|
|
|
|
## 5. GORM 数据模型 (25+)
|
|
|
|
| 模型 | 表名 | 说明 |
|
|
|------|------|------|
|
|
| User | users | 用户 (admin/dba/developer/auditor/guest) |
|
|
| Instance | instances | 数据源实例 (mysql/postgresql/redis/mongodb) |
|
|
| InstanceGroup | instance_groups | 权限组 |
|
|
| InstanceGroupMember | instance_group_members | 权限组-实例关联 |
|
|
| UserGroup | user_groups | 用户-权限组关联 |
|
|
| Ticket | tickets | 工单 (10 种状态) |
|
|
| TicketApproval | ticket_approvals | 审批记录 (含转审/超时) |
|
|
| TicketSQLItem | ticket_sql_items | 工单 SQL 明细 |
|
|
| AuditRule | audit_rules | 审核规则 (127 条/6 组) |
|
|
| AuditLog | audit_logs | 审计日志 |
|
|
| QueryHistory | query_histories | 查询历史 (500/用户上限) |
|
|
| WorkflowDefinition | workflow_definitions | 审批流定义 |
|
|
| WorkflowStep | workflow_steps | 审批流步骤 |
|
|
| WorkflowVersion | workflow_versions | 审批流版本 |
|
|
| WorkflowExecutionLog | workflow_execution_logs | 审批流执行日志 |
|
|
| NotificationChannel | notification_channels | 通知渠道 (feishu/dingtalk/wechat/email) |
|
|
| NotificationTemplate | notification_templates | 通知模板 |
|
|
| Announcement | announcements | 系统公告 |
|
|
| SystemSetting | system_settings | 系统配置 |
|
|
| OperationLog | operation_logs | 操作日志 |
|
|
| LDAPConfig | ldap_config | LDAP 配置 |
|
|
| MaskingRule | masking_rules | 数据脱敏规则 |
|
|
| Backup | backups | 数据库备份记录 |
|
|
| SchemaRevision | schema_revisions | Schema 版本记录 |
|
|
| SlowLog | slow_logs | 慢查询日志 |
|
|
| ScheduledTask | scheduled_tasks | 定时任务 |
|
|
| ScheduledTaskLog | scheduled_task_logs | 定时任务日志 |
|
|
|
|
## 6. 中间件栈
|
|
|
|
### 6.1 CORS 中间件 (`middleware/cors.go`)
|
|
- 基于 `github.com/gin-contrib/cors`
|
|
- 开发环境允许所有来源
|
|
|
|
### 6.2 JWT 认证中间件 (`middleware/auth.go`)
|
|
- 从 `Authorization: Bearer <token>` 提取 JWT
|
|
- HS256 签名,密钥从配置加载
|
|
- 解析 Claims (user_id, username, role) 注入 Gin Context
|
|
|
|
### 6.3 RBAC 中间件 (`middleware/auth.go` — RequireRole)
|
|
- 按角色限制路由访问
|
|
- 实例管理: `RequireRole("admin", "dba")`
|
|
- 用户管理: `RequireRole("admin")`
|
|
- LDAP 管理: `RequireRole("admin")`
|
|
- gh-ost 操作: `RequireRole("admin", "dba")`
|
|
|
|
## 7. 认证流程
|
|
|
|
```
|
|
客户端 → POST /api/v1/auth/login {username, password}
|
|
├─ auth.go → auth_service.go
|
|
│ ├─ GORM 查询 User by username
|
|
│ ├─ bcrypt.CompareHashAndPassword 验证密码
|
|
│ └─ GenerateToken(user) → JWT (HS256, 24h)
|
|
├─ 返回 {access_token, token_type, user}
|
|
└─ 后续请求: Authorization: Bearer <token>
|
|
└─ AuthMiddleware 解析 Claims → 注入 Context (user_id, username, role)
|
|
```
|
|
|
|
## 8. LDAP 集成
|
|
|
|
```
|
|
LDAP 服务器: 8.217.205.92:389
|
|
Base DN: dc=opsx,dc=vip
|
|
驱动: github.com/go-ldap/ldap/v3
|
|
|
|
API 端点:
|
|
GET /ldap-config — 获取 LDAP 配置
|
|
PUT /ldap-config — 更新 LDAP 配置
|
|
POST /ldap-config/test — 测试 LDAP 连接
|
|
POST /ldap-config/ou-list — 列出 OU
|
|
POST /ldap-config/user-list — 列出 LDAP 用户
|
|
POST /ldap-config/create-ou — 创建 OU
|
|
POST /ldap-config/create-user — 创建 LDAP 用户
|
|
POST /ldap-config/batch-import-ldap — 批量导入
|
|
POST /ldap-config/delete-user — 删除 LDAP 用户
|
|
```
|
|
|
|
## 9. 数据库驱动支持矩阵
|
|
|
|
| 数据库 | Go 驱动 | 查询 | 执行 | 审核 | 详情浏览 |
|
|
|--------|---------|------|------|------|----------|
|
|
| MySQL | go-sql-driver/mysql v1.10.0 | ✅ | ✅ | ✅ (67规则) | ✅ (7 endpoints) |
|
|
| PostgreSQL | jackc/pgx/v5 v5.9.2 | ✅ | ✅ | ✅ (31规则) | ✅ |
|
|
| Redis | go-redis/v9 v9.19.0 | ✅ | ✅ | ✅ (25规则) | ✅ (9 handlers) |
|
|
| MongoDB | go-mongo-driver/v2 | ✅ (stub) | ✅ (stub) | ✅ (31规则) | ✅ (stub) |
|
|
| SQLite | gorm.io/driver/sqlite | ✅ (元数据) | — | — | — |
|
|
|
|
## 10. MySQL Instance Detail — 7 个端点
|
|
|
|
| 端点 | 路由 | 说明 |
|
|
|------|------|------|
|
|
| databases | GET /instances/:id/detail/databases | 数据库列表 |
|
|
| tables | GET /instances/:id/detail/tables | 表列表 |
|
|
| db-schema | GET /instances/:id/detail/db-schema | 库 Schema |
|
|
| table-detail | GET /instances/:id/detail/table-detail | 表详情 (列/索引) |
|
|
| processlist | GET /instances/:id/detail/processlist | 进程列表 (含 Kill) |
|
|
| status | GET /instances/:id/detail/status | 服务器状态 |
|
|
| users | GET /instances/:id/detail/users | 用户列表 |
|
|
|
|
## 11. Redis — 9 个 Handler
|
|
|
|
| Handler | 路由 | 说明 |
|
|
|---------|------|------|
|
|
| RedisInfo | GET /redis/:id/info | 服务器信息 |
|
|
| RedisDbsize | GET /redis/:id/dbsize | 数据库大小 |
|
|
| RedisScanKeys | GET /redis/:id/keys | Key 扫描 |
|
|
| RedisGetKeyDetail | GET /redis/:id/keys/:key | Key 详情 (type/TTL/value) |
|
|
| RedisSlowlog | GET /redis/:id/slowlog | 慢查询日志 |
|
|
| RedisClients | GET /redis/:id/clients | 客户端列表 |
|
|
| RedisExecuteCommand | POST /redis/:id/command | 执行命令 |
|
|
| RedisCreateKey | POST /redis/:id/keys | 创建 Key |
|
|
| RedisDeleteKey | DELETE /redis/:id/keys/:key | 删除 Key |
|
|
|
|
## 12. 前端架构
|
|
|
|
### 12.1 前端页面 (18+)
|
|
|
|
| 页面 | 路由 | 说明 |
|
|
|------|------|------|
|
|
| LoginPage | /login | 5 种主题: SplitView/CenteredCard/SidePanel/FullImage/MinimalDark |
|
|
| Dashboard | / | 首页仪表盘 |
|
|
| QueriesPage | /queries | 自助查询 (CodeMirror 6) |
|
|
| TicketsPage | /tickets | 工单列表 |
|
|
| TicketCreatePage | /tickets/create | 新建工单 |
|
|
| TicketDetailPage | /tickets/:id | 工单详情 |
|
|
| InstancePage | /instances | 数据源管理 |
|
|
| InstanceDetailPage | /instances/:id | MySQL 实例详情 |
|
|
| RedisDetailPage | /redis/:id | Redis 详情 |
|
|
| MongoDBDetailPage | /mongodb/:id | MongoDB 详情 |
|
|
| UsersPage | /users | 用户管理 |
|
|
| AuditLogsPage | /audit-logs | 审计日志 |
|
|
| AuditRulesPage | /audit-rules | 审核规则 (6 组) |
|
|
| WorkflowPage | /workflows | 审批流管理 |
|
|
| SettingsPage | /settings | 系统设置 (多 tab) |
|
|
| AppearanceSettings | /settings/appearance | 外观设置 (主题 + 登录页风格) |
|
|
| PlatformConfigPage | /settings/platform | 平台配置 |
|
|
| NotificationPage | /settings/notifications | 通知渠道管理 |
|
|
| AnnouncementPage | /settings/announcements | 公告管理 |
|
|
| LdapConfigPage | /settings/ldap | LDAP 配置 |
|
|
| InstanceGroupPage | /permissions | 权限管理 |
|
|
| AutoTaskPage | /auto-tasks | 定时任务管理 |
|
|
| DataDictionaryPage | /dictionary | 数据字典 |
|
|
| RolesPage | /roles | 角色管理 |
|
|
|
|
### 12.2 登录页主题系统 (v0.3.1 新增)
|
|
|
|
```
|
|
components/login/
|
|
├── SplitView.tsx # 经典分屏 — 左侧特性展示 + 右侧表单
|
|
├── CenteredCard.tsx # 居中卡片 — 渐变背景 + 居中表单
|
|
├── SidePanel.tsx # 侧边面板 — 左侧品牌 + 右侧表单
|
|
├── FullImage.tsx # 全屏背景 — 科技背景 + 毛玻璃卡片
|
|
└── MinimalDark.tsx # 极简暗色 — 纯暗色极简风格
|
|
|
|
hooks/
|
|
└── useLogin.tsx # 共享登录逻辑 (username/password/loading/error)
|
|
|
|
pages/
|
|
├── LoginPage.tsx # 主题路由器 — 读取 localStorage 'login-style'
|
|
└── AppearanceSettings.tsx # Settings → Appearance tab
|
|
# 主题切换 (dark/light)
|
|
# 登录页风格切换 (5 种预览 + 选择)
|
|
# localStorage key: 'login-style'
|
|
```
|
|
|
|
### 12.3 共享组件
|
|
|
|
| 组件 | 说明 |
|
|
|------|------|
|
|
| Layout | 侧边栏 + Header 布局 |
|
|
| SqlEditor | CodeMirror 6 编辑器 (SQL/Redis/Mongo 语法) |
|
|
| SchemaSidebar | 数据库导航树 (MySQL三级/Redis目录树/MongoDB集合) |
|
|
| EditInstanceDialog | 实例编辑弹框 (复用) |
|
|
| ConfirmDialog | 确认弹框 (useConfirm hook) |
|
|
| FormDialog | 表单弹框壳 |
|
|
| ToastContainer | 右下角通知 (3秒消失) |
|
|
| ui/* | shadcn/ui 基础组件 |
|
|
|
|
## 13. 权限体系(四角色模型)
|
|
|
|
| 角色 | 权限范围 |
|
|
|------|----------|
|
|
| admin (超级管理员) | 全部功能 + 用户管理 + 系统设置 + LDAP 管理 |
|
|
| dba (DBA管理员) | 全部库访问 + 审批/拒绝/执行工单 + 实例管理 + gh-ost |
|
|
| auditor (审计员) | 全部只读 + 审计日志查看 + 审批/拒绝工单 |
|
|
| developer (开发者) | 按权限组访问 + 创建/撤销自己的工单 |
|
|
|
|
**默认种子用户** (auth_service.go 自动创建):
|
|
- admin/admin123 → 超级管理员
|
|
- zhangsan/admin123 → 张三 (dba)
|
|
- laoliu/admin123 → 老六 (auditor)
|
|
- lurenjia/admin123 → 路人甲 (developer)
|
|
|
|
## 14. 运维部署
|
|
|
|
```bash
|
|
# 开发环境
|
|
bash run.sh start # 启动 Go 后端 (:9000) + 前端 (:5173)
|
|
bash run.sh restart # 重启
|
|
bash run.sh stop # 停止
|
|
bash run.sh status # 状态检查
|
|
|
|
# 后端编译
|
|
cd backend && go build -o sql-platform ./cmd/server/
|
|
|
|
# 健康检查
|
|
curl http://localhost:9000/health
|
|
# → {"status":"ok","version":"0.3.1","backend":"go"}
|
|
```
|
|
|
|
## 15. 关键设计决策
|
|
|
|
| 决策 | 原因 |
|
|
|------|------|
|
|
| Go + Gin 替代 Python/FastAPI | 编译为单二进制,无运行时依赖,性能优异 |
|
|
| GORM AutoMigrate | 零配置 schema 管理,启动时自动同步 |
|
|
| SQLite 元数据库 | 零配置,单文件,便于开发部署 |
|
|
| JWT HS256 (24h) | 安全与便利平衡,配置可调 |
|
|
| 中间件分层 (Auth → RequireRole) | 细粒度 RBAC,路由级权限控制 |
|
|
| 5 种登录页主题 | 用户体验个性化,localStorage 持久化 |
|
|
| React.lazy 代码分割 | 首屏加载优化 |
|
|
| go-ldap/ldap/v3 | 原生 Go LDAP 客户端,企业域集成 |
|