Files
filestoragesystem/go/internal/router/router.go
T
2026-08-23 00:48:10 +08:00

156 lines
6.2 KiB
Go

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
}