角色权限矩阵: - 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
220 lines
9.1 KiB
Go
220 lines
9.1 KiB
Go
package router
|
|
|
|
import (
|
|
"sql-platform/internal/handler"
|
|
"sql-platform/internal/middleware"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func Setup(r *gin.Engine) {
|
|
api := r.Group("/api/v1")
|
|
|
|
// Public routes
|
|
api.POST("/auth/login", handler.Login)
|
|
api.GET("/public/login-style", handler.GetPublicLoginStyle)
|
|
|
|
// Authenticated routes
|
|
auth := api.Group("")
|
|
auth.Use(middleware.AuthMiddleware())
|
|
{
|
|
// Auth
|
|
auth.GET("/auth/me", handler.GetMe)
|
|
|
|
// Dashboard
|
|
auth.GET("/dashboard/stats", handler.DashboardStats)
|
|
auth.GET("/dashboard/my-tickets", handler.MyTickets)
|
|
|
|
// Tickets
|
|
auth.GET("/tickets/statistics", handler.TicketStatistics)
|
|
auth.GET("/tickets", handler.ListTickets)
|
|
auth.GET("/tickets/scheduled/list", handler.ListScheduledTasks)
|
|
auth.GET("/tickets/:id", handler.GetTicket)
|
|
auth.POST("/tickets", handler.CreateTicket)
|
|
auth.POST("/tickets/:id/approve", handler.ApproveTicket)
|
|
auth.POST("/tickets/:id/review", handler.ApproveTicket)
|
|
auth.POST("/tickets/:id/execute", handler.ExecuteTicket)
|
|
auth.POST("/tickets/:id/cancel-schedule", handler.CancelScheduledTask)
|
|
auth.POST("/tickets/:id/cancel", handler.CancelTicket)
|
|
auth.GET("/tickets/:id/timeline", handler.GetTicketTimeline)
|
|
auth.GET("/tickets/:id/approvals", handler.GetTicketApprovals)
|
|
auth.POST("/tickets/:id/rollback", handler.RollbackTicket)
|
|
|
|
// Instances
|
|
auth.GET("/instances", handler.ListInstances)
|
|
auth.GET("/instances/accessible", handler.AccessibleInstances)
|
|
auth.GET("/instances/stats", handler.InstanceStats)
|
|
auth.GET("/instances/:id", handler.GetInstance)
|
|
auth.GET("/instances/:id/databases", handler.ListDatabases)
|
|
auth.GET("/instances/:id/databases/:db/tables", handler.ListTables)
|
|
auth.POST("/instances/:id/test-connection", handler.TestConnection)
|
|
auth.POST("/instances/test-connection", handler.TestNewConnection)
|
|
auth.GET("/instances/:id/metrics", handler.InstanceMetrics)
|
|
|
|
// Instance Detail (databases/tables/schema/processlist/status/users)
|
|
auth.GET("/instances/:id/detail/databases", handler.DetailListDatabases)
|
|
auth.GET("/instances/:id/detail/tables", handler.DetailListTables)
|
|
auth.GET("/instances/:id/detail/db-schema", handler.DetailDbSchema)
|
|
auth.GET("/instances/:id/detail/table-detail", handler.DetailTableDetail)
|
|
auth.GET("/instances/:id/detail/processlist", handler.DetailProcesslist)
|
|
auth.GET("/instances/:id/detail/status", handler.DetailStatus)
|
|
auth.POST("/instances/:id/detail/processlist/:pid/kill", handler.DetailKillProcess)
|
|
auth.GET("/instances/:id/detail/users", handler.DetailListUsers)
|
|
|
|
// Instance management (admin/dba only)
|
|
admin := auth.Group("")
|
|
admin.Use(middleware.RequireRole("admin", "dba"))
|
|
{
|
|
admin.POST("/instances", handler.CreateInstance)
|
|
admin.PUT("/instances/:id", handler.UpdateInstance)
|
|
admin.DELETE("/instances/:id", handler.DeleteInstance)
|
|
}
|
|
|
|
// Instance Groups
|
|
auth.GET("/instance-groups", handler.ListInstanceGroups)
|
|
auth.GET("/instance-groups/:id", handler.GetInstanceGroup)
|
|
auth.GET("/instance-groups/:id/users", handler.ListGroupUsers)
|
|
auth.POST("/instance-groups/:id/instances", handler.AssignGroupInstances)
|
|
auth.DELETE("/instance-groups/:id/instances/:instanceId", handler.RemoveGroupInstance)
|
|
auth.POST("/instance-groups/:id/users", handler.AssignGroupUsers)
|
|
auth.PUT("/instance-groups/users/:userId/groups", handler.UpdateUserGroups)
|
|
|
|
// Instance Group management (admin/dba only)
|
|
igAdmin := auth.Group("")
|
|
igAdmin.Use(middleware.RequireRole("admin", "dba"))
|
|
{
|
|
igAdmin.POST("/instance-groups", handler.CreateInstanceGroup)
|
|
igAdmin.PUT("/instance-groups/:id", handler.UpdateInstanceGroup)
|
|
igAdmin.DELETE("/instance-groups/:id", handler.DeleteInstanceGroup)
|
|
}
|
|
|
|
// Redis
|
|
auth.GET("/redis/:id/info", handler.RedisInfo)
|
|
auth.GET("/redis/:id/dbsize", handler.RedisDbsize)
|
|
auth.GET("/redis/:id/keys", handler.RedisScanKeys)
|
|
auth.GET("/redis/:id/keys/:key", handler.RedisGetKeyDetail)
|
|
auth.GET("/redis/:id/slowlog", handler.RedisSlowlog)
|
|
auth.GET("/redis/:id/clients", handler.RedisClients)
|
|
auth.POST("/redis/:id/command", handler.RedisExecuteCommand)
|
|
auth.POST("/redis/:id/keys", handler.RedisCreateKey)
|
|
auth.DELETE("/redis/:id/keys/:key", handler.RedisDeleteKey)
|
|
|
|
// Users (admin only)
|
|
userAdmin := auth.Group("")
|
|
userAdmin.Use(middleware.RequireRole("admin"))
|
|
{
|
|
userAdmin.GET("/users", handler.ListUsers)
|
|
userAdmin.POST("/users", handler.CreateUser)
|
|
userAdmin.PUT("/users/:id", handler.UpdateUser)
|
|
userAdmin.DELETE("/users/:id", handler.DeleteUser)
|
|
userAdmin.POST("/users/:id/reset-password", handler.ResetUserPassword)
|
|
userAdmin.POST("/users/batch-import", handler.BatchImportUsers)
|
|
userAdmin.POST("/users/batch-import-ldap", handler.BatchImportLdapUsers)
|
|
userAdmin.GET("/users/import-template", handler.ImportTemplate)
|
|
}
|
|
|
|
// LDAP config (admin only)
|
|
ldapAdmin := auth.Group("")
|
|
ldapAdmin.Use(middleware.RequireRole("admin"))
|
|
{
|
|
ldapAdmin.GET("/ldap-config", handler.GetLDAPConfig)
|
|
ldapAdmin.PUT("/ldap-config", handler.UpdateLDAPConfig)
|
|
ldapAdmin.POST("/ldap-config/test", handler.TestLDAPConnection)
|
|
ldapAdmin.POST("/ldap-config/ou-list", handler.ListLDAPOUs)
|
|
ldapAdmin.POST("/ldap-config/user-list", handler.ListLDAPUsers)
|
|
ldapAdmin.POST("/ldap-config/create-ou", handler.CreateLDAPOU)
|
|
ldapAdmin.POST("/ldap-config/create-user", handler.CreateLDAPUser)
|
|
ldapAdmin.POST("/ldap-config/batch-import-ldap", handler.BatchImportLDAP)
|
|
ldapAdmin.POST("/ldap-config/delete-user", handler.DeleteLDAPUser)
|
|
}
|
|
|
|
// User Preferences (per-user, auth required)
|
|
auth.GET("/user/preferences", handler.GetUserPreferences)
|
|
auth.PUT("/user/preferences", handler.UpdateUserPreferences)
|
|
|
|
// Settings
|
|
auth.GET("/settings", handler.ListSettings)
|
|
auth.PUT("/settings", handler.UpdateSettings)
|
|
auth.GET("/settings/cleanup/preview", handler.SettingsCleanupPreview)
|
|
auth.POST("/settings/cleanup/run", handler.SettingsCleanupRun)
|
|
|
|
// gh-ost (admin/dba only)
|
|
ghostGroup := auth.Group("")
|
|
ghostGroup.Use(middleware.RequireRole("admin", "dba"))
|
|
{
|
|
ghostGroup.GET("/ghost/config", handler.GhOstGetConfig)
|
|
ghostGroup.POST("/ghost/analyze", handler.GhOstAnalyzeDDL)
|
|
ghostGroup.POST("/ghost/dry-run", handler.GhOstDryRun)
|
|
ghostGroup.POST("/ghost/execute", handler.GhOstExecute)
|
|
ghostGroup.GET("/ghost/status/:taskId", handler.GhOstStatus)
|
|
ghostGroup.GET("/ghost/tasks", handler.GhOstListTasks)
|
|
}
|
|
|
|
// Audit Logs
|
|
auth.GET("/audit-logs", handler.ListAuditLogs)
|
|
|
|
// Query execution (auditor excluded)
|
|
queryGroup := auth.Group("")
|
|
queryGroup.Use(middleware.RequireRole("admin", "dba", "developer"))
|
|
{
|
|
queryGroup.POST("/query/execute", handler.ExecuteQuery)
|
|
queryGroup.POST("/query", handler.ExecuteQuery)
|
|
queryGroup.POST("/query/export", handler.ExportQueryCSV)
|
|
}
|
|
|
|
|
|
// SQL Assistant
|
|
auth.POST("/sql-assistant/format", handler.SQLFormat)
|
|
auth.POST("/sql-assistant/analyze", handler.SQLAnalyze)
|
|
|
|
// Ticket Audit
|
|
auth.POST("/tickets/audit", handler.AuditTicketSQL)
|
|
|
|
// Dictionary (stub)
|
|
auth.GET("/dictionary/instances/:instanceId/databases", handler.DictionaryDatabases)
|
|
auth.GET("/dictionary/instances/:instanceId/tables", handler.DictionaryTables)
|
|
auth.GET("/dictionary/instances/:instanceId/tables/:tableName", handler.DictionaryTableDetail)
|
|
auth.GET("/dictionary/instances/:instanceId/export", handler.DictionaryExport)
|
|
|
|
// MongoDB (stub)
|
|
auth.GET("/mongo/:id/databases", handler.MongoDatabases)
|
|
auth.GET("/mongo/:id/databases/:database/collections", handler.MongoCollections)
|
|
auth.GET("/mongo/:id/collections/:collection/stats", handler.MongoCollectionStats)
|
|
auth.POST("/mongo/:id/query", handler.MongoQuery)
|
|
auth.POST("/mongo/:id/execute", handler.MongoExecute)
|
|
auth.POST("/mongo/:id/test-connection", handler.MongoTestConnection)
|
|
|
|
// Audit rules — read for all, write for admin/dba
|
|
auth.GET("/audit-rules", handler.ListAuditRules)
|
|
ruleAdmin := auth.Group("")
|
|
ruleAdmin.Use(middleware.RequireRole("admin", "dba"))
|
|
{
|
|
ruleAdmin.POST("/audit-rules/seed/:dbType", handler.SeedAuditRules)
|
|
ruleAdmin.POST("/audit-rules/:id/toggle", handler.ToggleAuditRule)
|
|
ruleAdmin.PUT("/audit-rules/:id", handler.UpdateAuditRule)
|
|
}
|
|
auth.GET("/announcements", handler.ListAnnouncements)
|
|
auth.GET("/query-histories", handler.ListQueryHistories)
|
|
// Notifications CRUD (replaces old channels/templates endpoints)
|
|
auth.GET("/notifications", handler.ListNotifications)
|
|
auth.POST("/notifications", handler.CreateNotification)
|
|
auth.PUT("/notifications/:id", handler.UpdateNotification)
|
|
auth.DELETE("/notifications/:id", handler.DeleteNotification)
|
|
auth.POST("/notifications/:id/test", handler.TestNotificationSend)
|
|
auth.GET("/workflows", handler.ListWorkflows)
|
|
auth.GET("/workflows/:id", handler.GetWorkflow)
|
|
auth.POST("/workflows/:id/clone", handler.CloneWorkflow)
|
|
|
|
// Workflow management (admin/dba only)
|
|
wfAdmin := auth.Group("")
|
|
wfAdmin.Use(middleware.RequireRole("admin", "dba"))
|
|
{
|
|
wfAdmin.POST("/workflows", handler.CreateWorkflow)
|
|
wfAdmin.PUT("/workflows/:id", handler.UpdateWorkflow)
|
|
wfAdmin.DELETE("/workflows/:id", handler.DeleteWorkflow)
|
|
wfAdmin.POST("/workflows/:id/set-default", handler.SetDefaultWorkflow)
|
|
}
|
|
|
|
}
|
|
}
|