package router import ( "os" "github.com/gin-gonic/gin" "gorm.io/gorm" "filestoragesystem/internal/config" "filestoragesystem/internal/controller" "filestoragesystem/internal/middleware" "filestoragesystem/internal/repository" "filestoragesystem/internal/service" ) // New 创建gin引擎并注册全部路由 func New(cfg *config.Config, db *gorm.DB, svc *service.Services) *gin.Engine { gin.SetMode(cfg.Server.Mode) r := gin.New() r.Use(gin.Recovery()) r.Use(middleware.RequestID()) r.Use(middleware.CORS()) r.Use(middleware.Logger()) // 健康检查 r.GET("/health", func(c *gin.Context) { c.JSON(200, gin.H{"status": "ok"}) }) // 托管前端静态资源(前端为hash路由,全部路径回退到index.html) dist := "../backend/dist" if _, err := os.Stat(dist); err == nil { r.Static("/assets", dist+"/assets") r.StaticFile("/favicon.svg", dist+"/favicon.svg") r.NoRoute(func(c *gin.Context) { c.File(dist + "/index.html") }) } api := r.Group("/api/v1") // 公开接口 api.GET("/status", controller.NewAdminController(controller.NewBase(svc)).SiteStatus) authCtl := controller.NewAuthController(controller.NewBase(svc)) api.POST("/auth/register", authCtl.Register) api.POST("/auth/login", authCtl.Login) fileCtl := controller.NewFileController(controller.NewBase(svc)) api.GET("/files/temp/:token", fileCtl.TempAccess) // 临时链接公开访问 // 认证接口 authed := api.Group("") authed.Use(middleware.Auth(svc.Auth)) authed.Use(middleware.RateLimit(&repository.SettingRepo{DB: db})) authed.Use(middleware.SiteStatus(svc.Admin)) // API密钥管理 authed.POST("/auth/apikeys", authCtl.CreateAPIKey) authed.GET("/auth/apikeys", authCtl.ListAPIKeys) authed.DELETE("/auth/apikeys/:id", authCtl.DeleteAPIKey) // 个人资料 userCtl := controller.NewUserController(controller.NewBase(svc)) authed.GET("/user/profile", userCtl.GetProfile) authed.PUT("/user/profile", userCtl.UpdateProfile) authed.PUT("/user/password", userCtl.ChangePassword) // 项目管理 projectCtl := controller.NewProjectController(controller.NewBase(svc)) authed.POST("/projects", projectCtl.Create) authed.GET("/projects", projectCtl.List) authed.GET("/projects/:id", projectCtl.Get) authed.PUT("/projects/:id", projectCtl.Update) authed.DELETE("/projects/:id", projectCtl.Delete) // 文件操作 authed.POST("/files/upload", fileCtl.Upload) authed.GET("/files", fileCtl.List) authed.GET("/files/:id", fileCtl.GetInfo) authed.GET("/files/:id/download", fileCtl.Download) authed.DELETE("/files/:id", fileCtl.Delete) authed.POST("/files/:id/restore", fileCtl.Restore) authed.POST("/files/:id/temp-link", fileCtl.CreateTempLink) // 统计 statsCtl := controller.NewStatsController(controller.NewBase(svc)) authed.GET("/stats/user", statsCtl.UserStats) authed.GET("/stats/project/:id", statsCtl.ProjectStats) authed.GET("/stats/traffic", statsCtl.TrafficStats) // Webhook管理 webhookCtl := controller.NewWebhookController(controller.NewBase(svc)) authed.POST("/webhooks", webhookCtl.Create) authed.GET("/webhooks", webhookCtl.List) authed.PUT("/webhooks/:id", webhookCtl.Update) authed.DELETE("/webhooks/:id", webhookCtl.Delete) // 管理后台 adminCtl := controller.NewAdminController(controller.NewBase(svc)) roleCtl := controller.NewRoleController(controller.NewBase(svc)) admin := authed.Group("/admin") // 用户管理(需要对应权限) users := admin.Group("/users") { users.GET("", middleware.RequirePermission("user:list"), adminCtl.ListUsers) users.GET("/:id", middleware.RequirePermission("user:detail"), adminCtl.GetUser) users.POST("", middleware.RequirePermission("user:create"), adminCtl.CreateUser) users.PUT("/:id", middleware.RequirePermission("user:edit"), adminCtl.UpdateUser) users.DELETE("/:id", middleware.RequirePermission("user:delete"), adminCtl.DeleteUser) users.PUT("/:id/status", middleware.RequirePermission("user:disable"), adminCtl.SetUserStatus) users.PUT("/:id/role", middleware.RequirePermission("user:assign_role"), adminCtl.AssignRole) users.POST("/:id/reset-password", middleware.RequirePermission("user:reset_password"), adminCtl.ResetPassword) } // 角色权限管理(超级管理员) roles := admin.Group("/roles") { roles.GET("", middleware.RequirePermission("user:assign_role"), roleCtl.ListRoles) roles.GET("/:id", middleware.RequirePermission("user:assign_role"), roleCtl.GetRole) roles.POST("", middleware.RequirePermission("user:assign_role"), roleCtl.CreateRole) roles.PUT("/:id", middleware.RequirePermission("user:assign_role"), roleCtl.UpdateRole) roles.DELETE("/:id", middleware.RequirePermission("user:assign_role"), roleCtl.DeleteRole) roles.PUT("/:id/permissions", middleware.RequirePermission("user:assign_role"), roleCtl.SetPermissions) } admin.GET("/permissions", middleware.RequirePermission("user:assign_role"), roleCtl.ListPermissions) // 系统设置 settings := admin.Group("/settings") { settings.GET("", middleware.RequirePermission("system:settings:view"), adminCtl.GetSettings) settings.PUT("", middleware.RequirePermission("system:settings:edit"), adminCtl.UpdateSettings) settings.GET("/:group", middleware.RequirePermission("system:settings:view"), adminCtl.GetSettingsByGroup) settings.PUT("/:group", middleware.RequirePermission("system:settings:edit"), adminCtl.UpdateSettingsByGroup) } // 日志管理 logs := admin.Group("/logs") { logs.GET("/operation", middleware.RequirePermission("system:logs:operation"), adminCtl.ListOperationLogs) logs.GET("/operation/:id", middleware.RequirePermission("system:logs:operation"), adminCtl.GetOperationLog) logs.GET("/system", middleware.RequirePermission("system:logs:system"), adminCtl.ListSystemLogs) logs.GET("/system/:id", middleware.RequirePermission("system:logs:system"), adminCtl.GetSystemLog) logs.DELETE("/cleanup", middleware.RequirePermission("system:logs:cleanup"), adminCtl.CleanupLogs) } // 数据备份 admin.POST("/backup", middleware.RequirePermission("system:settings:edit"), adminCtl.Backup) admin.GET("/backups", middleware.RequirePermission("system:settings:view"), adminCtl.ListBackups) admin.GET("/backups/download", middleware.RequirePermission("system:settings:view"), adminCtl.DownloadBackup) return r }