Files
goalfylearning-admin/internal/api/routes/routes.go

371 lines
19 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}