feat():learning后台管理项目初始化

This commit is contained in:
yuj
2025-12-04 16:23:46 +08:00
parent 39886d50d2
commit 88e048f4d1
154 changed files with 28966 additions and 6 deletions

View File

@@ -0,0 +1,370 @@
package routes
import (
"goalfymax-admin/internal/api/handlers"
"goalfymax-admin/internal/api/middlewares"
"goalfymax-admin/internal/config"
"goalfymax-admin/internal/models"
"goalfymax-admin/internal/services"
"goalfymax-admin/internal/storage"
"goalfymax-admin/pkg/middleware"
"goalfymax-admin/pkg/redis"
"goalfymax-admin/pkg/utils"
"time"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)
// SetupRoutes 设置路由
func SetupRoutes(
userService services.UserService,
roleService services.RoleService,
pageService services.PageService,
quotaService services.QuotaService,
ssoService services.SSOService,
rbacService services.RBACService,
userLevelConfigService services.UserLevelConfigService,
systemConfigService services.SystemConfigService,
redisClient *redis.Client,
logger *utils.Logger,
appConfig *config.Config,
) *gin.Engine {
// 创建Gin引擎
r := gin.New()
// 添加CORS中间件
r.Use(cors.New(cors.Config{
AllowOrigins: []string{"http://localhost:5173", "http://localhost:5174", "http://localhost:3000", "http://localhost:3003", "http://localhost:3004"},
AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"},
AllowHeaders: []string{"Origin", "Content-Type", "Accept", "Authorization", "X-Requested-With", "Cookie"},
ExposeHeaders: []string{"Content-Length", "Content-Type"},
AllowCredentials: true,
MaxAge: 12 * time.Hour,
}))
// 添加中间件
r.Use(middlewares.RequestLogMiddleware(logger))
r.Use(middlewares.APILogMiddleware(logger)) // API日志中间件记录数据修改接口
r.Use(gin.Recovery())
// 创建SSO客户端和认证中间件
ssoConfig := &models.SSOConfig{
SSOServerURL: appConfig.SSO.SSOServerURL,
ClientID: appConfig.SSO.ClientID,
ClientSecret: appConfig.SSO.ClientSecret,
RedirectURI: appConfig.SSO.RedirectURI,
Scope: appConfig.SSO.Scope,
ResourceAud: appConfig.SSO.ResourceAud,
Timeout: appConfig.SSO.Timeout,
}
ssoClient := middleware.NewSSOClient(ssoConfig, logger)
sessionManager := middleware.NewMemorySessionManager()
authMiddleware := middleware.NewAuthMiddleware(ssoClient, sessionManager, "/login")
// RBAC中间件已简化不再需要全局实例
// 创建处理器
quotaHandler := handlers.NewQuotaHandler(quotaService)
userProjectQuotaHandler := handlers.NewUserProjectQuotaHandler(
services.NewUserProjectQuotaService(
storage.NewUserProjectQuotaStorage(),
),
)
ssoHandler := handlers.NewSSOHandler(ssoService, logger)
messagePushService := services.NewMessagePushService()
ssoAdminService := services.NewSSOAdminService()
userHandler := handlers.NewUserHandler(userService, rbacService, logger)
auditLogService := services.NewAuditLogService(storage.NewAuditLogStorage())
goalfyUserHandler := handlers.NewGoalfyMaxUserHandler(
services.NewGoalfyMaxUserService(storage.NewGoalfyMaxUserStorage(), messagePushService, ssoAdminService, redisClient, storage.NewBalanceOperationLogStorage(), auditLogService, logger),
)
auditLogHandler := handlers.NewAuditLogHandler(auditLogService)
userFeedbackHandler := handlers.NewUserFeedbackHandler(
services.NewUserFeedbackService(storage.NewUserFeedbackStorage()),
)
messagePushHandler := handlers.NewMessagePushHandler(
messagePushService,
)
roleHandler := handlers.NewRoleHandler(roleService, rbacService, logger)
pageHandler := handlers.NewPageHandler(pageService, logger)
rbacHandler := handlers.NewRBACHandler(rbacService, logger)
vendorPricingHandler := handlers.NewVendorModelPricingHandler(storage.GetDB())
vmPricingHandler := handlers.NewVmPricingHandler(storage.GetDB())
mcpProviderHandler := handlers.NewMCPProviderHandler()
financeHandler := handlers.NewFinanceHandler()
userLevelConfigHandler := handlers.NewUserLevelConfigHandler(userLevelConfigService, logger)
systemConfigHandler := handlers.NewSystemConfigHandler(systemConfigService, logger)
inviteCodeHandler := handlers.NewInviteCodeHandler(
services.NewInviteCodeService(storage.NewInviteCodeStorage()),
userLevelConfigService,
)
inviteCodeApplicationHandler := handlers.NewInviteCodeApplicationHandler(storage.GetDB())
// 健康检查
r.GET("/health", func(c *gin.Context) {
c.JSON(200, gin.H{"status": "ok"})
})
// API路由组
api := r.Group("/api")
{
// 公开接口(不需要认证)
public := api.Group("/public")
{
// 官网提交邀请码申请
public.POST("/invite-code/apply", inviteCodeApplicationHandler.SubmitApplication)
}
// SSO相关路由
sso := api.Group("/sso")
{
sso.POST("/login", ssoHandler.HandleSSOLogin) // SSO登录
sso.POST("/callback", ssoHandler.HandleSSOCallback) // SSO回调
sso.POST("/refresh", ssoHandler.HandleRefreshToken) // 刷新令牌
sso.POST("/logout", ssoHandler.HandleLogout) // 登出
sso.GET("/userinfo", ssoHandler.HandleUserInfo) // 获取用户信息
sso.GET("/online-users", ssoHandler.GetOnlineUsers) // 获取在线用户列表
sso.GET("/online-count", ssoHandler.GetOnlineUserCount) // 获取在线用户数量
sso.POST("/batch-logout", ssoHandler.BatchLogout) // 批量登出
}
// 管理员路由组(需要认证和动态权限检查)
admin := api.Group("/admin")
admin.Use(authMiddleware.RequireAuth())
// 使用简化的页面权限检查
{
// 用户管理 - 所有路由通过动态权限检查
users := admin.Group("/users")
{
users.GET("", userHandler.List) // 获取用户列表
users.POST("", userHandler.Create) // 创建用户
users.GET("/:id", userHandler.GetByID) // 获取用户详情
users.PUT("/:id", userHandler.Update) // 更新用户
users.DELETE("/:id", userHandler.Delete) // 删除用户
users.PUT("/:id/status", userHandler.UpdateStatus) // 更新用户状态
users.PUT("/:id/roles", userHandler.UpdateRoles) // 更新用户角色
users.GET("/:id/roles", userHandler.GetUserRoles) // 获取用户角色
users.GET("/:id/permissions", userHandler.GetUserPermissions) // 获取用户权限
users.GET("/check-role/:user_id", userHandler.CheckUserRole) // 检查用户系统角色
users.POST("/change-system-role", userHandler.ChangeUserSystemRole) // 变更用户系统角色
}
// GoalfyMax 用户管理
goalfyUsers := admin.Group("/goalfymax-users")
{
goalfyUsers.GET("", goalfyUserHandler.List) // 列表
goalfyUsers.POST("", goalfyUserHandler.Create) // 新增
goalfyUsers.GET(":id", goalfyUserHandler.GetByID) // 详情
goalfyUsers.PUT(":id", goalfyUserHandler.Update) // 编辑
goalfyUsers.DELETE(":id", goalfyUserHandler.Delete) // 删除
goalfyUsers.POST(":id/ban", goalfyUserHandler.Ban) // 封禁
goalfyUsers.POST(":id/unban", goalfyUserHandler.Unban) // 解封
goalfyUsers.POST(":id/add-balance", goalfyUserHandler.AddBalance) // 增加余额
goalfyUsers.POST(":id/deduct-balance", goalfyUserHandler.DeductBalance) // 减少余额
}
// 用户反馈管理
userFeedbacks := admin.Group("/user-feedback")
{
userFeedbacks.GET("", userFeedbackHandler.List) // 获取反馈列表
userFeedbacks.GET("/:id", userFeedbackHandler.GetByID) // 获取反馈详情
userFeedbacks.POST("/:id/mark-handled", userFeedbackHandler.MarkHandled) // 标记为已处理
userFeedbacks.DELETE("/:id", userFeedbackHandler.Delete) // 删除反馈
userFeedbacks.GET("/statistics", userFeedbackHandler.GetStatistics) // 获取统计信息
}
// 消息推送管理
messagePush := admin.Group("/message-push")
{
messagePush.POST("/send", messagePushHandler.SendMessage) // 发送消息
messagePush.GET("/logs", messagePushHandler.GetPushLogs) // 获取推送记录
messagePush.GET("/logs/:id", messagePushHandler.GetPushLogByID) // 获取推送记录详情
messagePush.GET("/users/search", messagePushHandler.SearchUsers) // 搜索用户
}
// 角色管理 - 所有路由通过动态权限检查
roles := admin.Group("/roles")
{
roles.GET("", roleHandler.List) // 获取角色列表
roles.POST("", roleHandler.Create) // 创建角色
roles.GET("/:id", roleHandler.GetByID) // 获取角色详情
roles.PUT("/:id", roleHandler.Update) // 更新角色
roles.DELETE("/:id", roleHandler.Delete) // 删除角色
roles.PUT("/:id/status", roleHandler.UpdateStatus) // 更新角色状态
roles.PUT("/:id/permissions", roleHandler.UpdatePermissions) // 更新角色权限
roles.GET("/:id/permissions", roleHandler.GetRolePermissions) // 获取角色权限
}
// 页面管理 - 所有路由通过页面权限检查
pages := admin.Group("/pages")
{
pages.GET("", pageHandler.List) // 获取页面列表
pages.POST("", pageHandler.Create) // 创建页面
pages.GET("/:id", pageHandler.GetByID) // 获取页面详情
pages.PUT("/:id", pageHandler.Update) // 更新页面
pages.DELETE("/:id", pageHandler.Delete) // 删除页面
}
// RBAC管理 - 所有路由通过动态权限检查
rbac := admin.Group("/rbac")
{
rbac.POST("/role-page-permissions", rbacHandler.AssignRolePagePermissions) // 分配角色页面权限
rbac.DELETE("/roles/:id/page-permissions", rbacHandler.RemoveRolePagePermissions) // 移除角色页面权限
rbac.GET("/roles/:id/page-permissions", rbacHandler.GetRolePagePermissions) // 获取角色页面权限
rbac.GET("/users/:id/permissions", rbacHandler.GetUserPermissions) // 获取用户权限
rbac.GET("/roles/:id/permissions", rbacHandler.GetRolePermissions) // 获取角色权限
rbac.GET("/check-page-permission", rbacHandler.CheckPagePermission) // 检查页面权限
rbac.GET("/users/:id/accessible-pages", rbacHandler.GetUserAccessiblePages) // 获取用户可访问页面
}
// 供应商模型价格配置
vendorPricing := admin.Group("/vendor-model-pricing")
{
vendorPricing.GET("", vendorPricingHandler.GetVendorModelPricing) // 获取价格配置列表
vendorPricing.PUT("/:id", vendorPricingHandler.UpdateModelPricing) // 更新模型价格
vendorPricing.GET("/providers", vendorPricingHandler.GetProviders) // 获取供应商列表
}
// 虚拟机价格配置
vmPricing := admin.Group("/vm-pricing")
{
vmPricing.GET("/specs", vmPricingHandler.GetVmSpecs) // 获取规格列表
vmPricing.POST("/specs", vmPricingHandler.CreateVmSpec) // 创建规格
vmPricing.PUT("/specs/:id", vmPricingHandler.UpdateVmSpec) // 更新规格价格
vmPricing.DELETE("/specs/:id", vmPricingHandler.DeleteVmSpec) // 删除规格
vmPricing.GET("/templates", vmPricingHandler.GetVmTemplates) // 获取模板列表
vmPricing.POST("/templates", vmPricingHandler.CreateVmTemplate) // 创建模板
vmPricing.DELETE("/templates/:id", vmPricingHandler.DeleteVmTemplate) // 删除模板
vmPricing.PUT("/templates/:id/default", vmPricingHandler.SetDefaultVmTemplate) // 设置默认模板
}
// MCP 价格配置PostgreSQL
mcpProviders := admin.Group("/mcp-providers")
{
mcpProviders.GET("", mcpProviderHandler.List)
mcpProviders.POST("", mcpProviderHandler.Create)
mcpProviders.GET(":id", mcpProviderHandler.GetByID)
mcpProviders.PUT(":id", mcpProviderHandler.Update)
mcpProviders.DELETE(":id", mcpProviderHandler.Delete)
mcpProviders.PATCH(":id/status", mcpProviderHandler.UpdateStatus)
mcpProviders.PATCH(":id/is-used", mcpProviderHandler.UpdateIsUsed)
}
// 用户等级配置管理
userLevelConfigs := admin.Group("/user-level-configs")
{
userLevelConfigs.GET("", userLevelConfigHandler.List) // 获取列表
userLevelConfigs.GET("/all", userLevelConfigHandler.GetAll) // 获取所有(不分页)
userLevelConfigs.POST("", userLevelConfigHandler.Create) // 创建
userLevelConfigs.GET("/:id", userLevelConfigHandler.GetByID) // 获取详情
userLevelConfigs.PUT("/:id", userLevelConfigHandler.Update) // 更新
userLevelConfigs.DELETE("/:id", userLevelConfigHandler.Delete) // 删除
userLevelConfigs.PUT("/:id/status", userLevelConfigHandler.UpdateStatus) // 更新状态
}
// 系统通用配置管理
systemConfigs := admin.Group("/system-configs")
{
systemConfigs.GET("", systemConfigHandler.List) // 获取列表
systemConfigs.GET("/all", systemConfigHandler.GetAll) // 获取所有(不分页)
systemConfigs.POST("", systemConfigHandler.Create) // 创建
systemConfigs.GET("/key/:key", systemConfigHandler.GetByKey) // 根据Key获取
systemConfigs.GET("/:id", systemConfigHandler.GetByID) // 获取详情
systemConfigs.PUT("/:id", systemConfigHandler.Update) // 更新
systemConfigs.DELETE("/:id", systemConfigHandler.Delete) // 删除
systemConfigs.PUT("/:id/status", systemConfigHandler.UpdateStatus) // 更新状态
}
// 邀请码管理(简化版)
inviteCodes := admin.Group("/invite-codes")
{
inviteCodes.GET("", inviteCodeHandler.GetInviteCodeList) // 获取邀请码列表
inviteCodes.POST("", inviteCodeHandler.CreateInviteCode) // 创建邀请码(支持设置过期时间)
inviteCodes.GET("/client-options", inviteCodeHandler.GetClientOptions) // 获取客户端选项
inviteCodes.GET("/statistics", inviteCodeHandler.GetInviteCodeStatistics) // 获取统计信息
inviteCodes.GET("/:id", inviteCodeHandler.GetInviteCodeDetail) // 获取邀请码详情
inviteCodes.PUT("/:id", inviteCodeHandler.UpdateInviteCode) // 更新邀请码(支持更新过期时间)
inviteCodes.DELETE("/:id", inviteCodeHandler.DeleteInviteCode) // 删除邀请码
inviteCodes.POST("/mark-used", inviteCodeHandler.MarkInviteCodeAsUsed) // 标记邀请码为已使用
inviteCodes.POST("/validate", inviteCodeHandler.ValidateInviteCode) // 验证邀请码是否有效
}
// 邀请码申请管理
inviteApplications := admin.Group("/invite-applications")
{
inviteApplications.GET("", inviteCodeApplicationHandler.GetApplicationList) // 获取申请列表
inviteApplications.GET("/statistics", inviteCodeApplicationHandler.GetStatistics) // 获取统计信息
inviteApplications.GET("/pending-count", inviteCodeApplicationHandler.GetPendingCount) // 获取待处理数量
inviteApplications.POST("/approve", inviteCodeApplicationHandler.ApproveApplication) // 审批通过申请
inviteApplications.POST("/reject", inviteCodeApplicationHandler.RejectApplication) // 审批拒绝申请
inviteApplications.POST("/batch-approve", inviteCodeApplicationHandler.BatchApproveApplications) // 批量审批通过
inviteApplications.POST("/batch-reject", inviteCodeApplicationHandler.BatchRejectApplications) // 批量审批拒绝
}
// 审计日志管理
auditLogs := admin.Group("/audit-logs")
{
auditLogs.GET("", auditLogHandler.List) // 获取审计日志列表
auditLogs.GET("/:id", auditLogHandler.GetByID) // 获取审计日志详情
}
}
// 财务数据(需要认证)
finance := api.Group("/finance")
finance.Use(authMiddleware.RequireAuth())
{
finance.GET("/sandbox-records", financeHandler.ListSandboxRecords)
finance.GET("/token-usages", financeHandler.ListTokenUsages)
finance.GET("/mcp-usages", financeHandler.ListMCPUsages)
finance.GET("/transaction-logs", financeHandler.ListTransactionLogs)
finance.GET("/payment-records", financeHandler.ListPaymentRecords)
finance.POST("/payment-records/refund", financeHandler.RefundPaymentRecord)
finance.GET("/mcp-account-recharge-records", financeHandler.ListMcpAccountRechargeRecords)
finance.POST("/mcp-account-recharge-records", financeHandler.CreateMcpAccountRechargeRecord)
finance.PUT("/mcp-account-recharge-records/:id", financeHandler.UpdateMcpAccountRechargeRecord)
finance.DELETE("/mcp-account-recharge-records/:id", financeHandler.DeleteMcpAccountRechargeRecord)
finance.GET("/mcp-provider-accounts", financeHandler.GetMcpProviderAccounts)
finance.GET("/mcp-account-balances", financeHandler.GetMcpAccountBalances)
finance.POST("/mcp-account-balances", financeHandler.CreateMcpAccountBalance)
finance.PUT("/mcp-account-balances/:provider_id", financeHandler.AdjustMcpAccountBalance)
finance.GET("/mcp-account-balances/:provider_id/history", financeHandler.GetMcpAccountBalanceHistory)
// 模型账号管理
finance.GET("/model-account-recharge-records", financeHandler.ListModelAccountRechargeRecords)
finance.POST("/model-account-recharge-records", financeHandler.CreateModelAccountRechargeRecord)
finance.PUT("/model-account-recharge-records/:id", financeHandler.UpdateModelAccountRechargeRecord)
finance.DELETE("/model-account-recharge-records/:id", financeHandler.DeleteModelAccountRechargeRecord)
finance.GET("/model-config-accounts", financeHandler.GetModelConfigAccounts)
finance.GET("/model-account-balances", financeHandler.GetModelAccountBalances)
finance.POST("/model-account-balances", financeHandler.CreateModelAccountBalance)
finance.PUT("/model-account-balances/:account", financeHandler.AdjustModelAccountBalance)
finance.GET("/model-account-balances/:account/history", financeHandler.GetModelAccountBalanceHistory)
}
// 配额相关路由(需要认证和动态权限检查)
quotas := api.Group("/quotas")
quotas.Use(authMiddleware.RequireAuth())
// 使用简化的页面权限检查
{
quotas.POST("/history", quotaHandler.GetQuotaHistory) // 获取配额历史
quotas.GET("/health", quotaHandler.HealthCheck) // 配额服务健康检查
quotas.GET("/rules", quotaHandler.GetQuotaRules) // 获取配额规则列表(转发网关)
quotas.POST("/rules", quotaHandler.CreateQuotaRule) // 创建规则(转发网关)
quotas.PUT("/rules/:id", quotaHandler.UpdateQuotaRule) // 更新规则(转发网关)
quotas.DELETE("/rules/:id", quotaHandler.DeleteQuotaRule) // 删除规则(转发网关)
// 用户项目配额 CRUD
userProject := quotas.Group("/user-project")
{
userProject.GET("", userProjectQuotaHandler.List)
userProject.POST("", userProjectQuotaHandler.Create)
userProject.GET(":id", userProjectQuotaHandler.GetByID)
userProject.PUT(":id", userProjectQuotaHandler.Update)
userProject.DELETE(":id", userProjectQuotaHandler.Delete)
}
}
}
return r
}