// Package api 定义API路由 package api import ( "seeyon-filesystem/config" "seeyon-filesystem/controller" "seeyon-filesystem/middleware" "github.com/gin-gonic/gin" ) // SetupRouter 初始化并配置所有路由 func SetupRouter() *gin.Engine { cfg := config.AppConfig r := gin.Default() // 全局中间件 r.Use(middleware.CORS()) r.Use(middleware.UTF8ContentType()) r.Use(middleware.TrafficMonitor()) // 流量监控 r.Use(middleware.IPBlacklistMiddleware()) // IP黑名单 r.Use(middleware.OperationLogger()) // 操作日志 // 静态文件服务(本地存储的文件) r.Static("/storage", cfg.Storage.LocalBasePath) // 健康检查 r.GET("/health", func(c *gin.Context) { c.JSON(200, gin.H{"status": "ok"}) }) // 初始化控制器 authCtrl := controller.NewAuthController() fileCtrl := controller.NewFileController() accessCtrl := controller.NewFileAccessController() folderCtrl := controller.NewFolderController() shareCtrl := controller.NewShareController() ssoCtrl := controller.NewSSOController() permCtrl := controller.NewPermissionController() logCtrl := controller.NewLogController() backupCtrl := controller.NewBackupController() adminCtrl := controller.NewAdminController() storageCtrl := controller.NewStorageController() assignCtrl := controller.NewStorageAssignController() chunkCtrl := controller.NewChunkUploadController() monitorCtrl := controller.NewMonitorController() openCtrl := controller.NewOpenAPIController() openFileCtrl := controller.NewOpenAPIFileController() // API路由组 api := r.Group("/api") { // ============ 认证 (无需登录) ============ auth := api.Group("/auth") { auth.POST("/login", authCtrl.Login) auth.POST("/app-login", authCtrl.AppLogin) auth.POST("/register", authCtrl.Register) } // ============ SSO (无需登录) ============ sso := api.Group("/sso") { sso.GET("/providers", ssoCtrl.GetProviders) // 获取SSO提供商列表 sso.GET("/auth/url", ssoCtrl.GetAuthURL) // 获取授权跳转URL sso.GET("/callback", ssoCtrl.Callback) // SSO回调(GET, 重定向) sso.POST("/callback", ssoCtrl.CallbackJSON) } // ============ 开放API (无需登录, OA调用) ============ openapi := api.Group("/openapi") { openapi.POST("/token/validate", openCtrl.ValidateToken) openapi.POST("/token/generate", openCtrl.GenerateTestToken) // 文件操作API (需要JWT认证) openapi.Use(middleware.JWTAuth(cfg.JWT.Secret)) { // 分页查询文件夹内容 openapi.GET("/files", openFileCtrl.ListByFolder) // 按名称搜索 openapi.GET("/files/search", openFileCtrl.SearchTree) // 下载/预览 openapi.GET("/files/:id/download", openFileCtrl.Download) openapi.GET("/files/:id/preview", openFileCtrl.Preview) // 分片上传 openapi.POST("/files/upload/init", openFileCtrl.ChunkUploadInit) openapi.PUT("/files/upload/chunk/:uploadId/:index", openFileCtrl.ChunkUpload) openapi.POST("/files/upload/merge/:uploadId", openFileCtrl.ChunkMerge) openapi.GET("/files/upload/progress/:uploadId", openFileCtrl.ChunkProgress) } } // ============ 需要登录的路由 ============ protected := api.Group("") protected.Use(middleware.JWTAuth(cfg.JWT.Secret)) { // 用户信息 protected.GET("/auth/profile", authCtrl.GetProfile) protected.GET("/auth/permissions", permCtrl.GetUserPermissions) protected.PUT("/auth/password", authCtrl.ChangePassword) protected.GET("/user/storage-info", assignCtrl.GetMyStorageInfo) // 文件管理 file := protected.Group("/file") { file.POST("/upload", middleware.RequirePermission("file:upload"), fileCtrl.Upload) // 分片上传 file.POST("/upload/init", middleware.RequirePermission("file:upload"), chunkCtrl.Init) file.PUT("/upload/chunk/:uploadId/:index", middleware.RequirePermission("file:upload"), chunkCtrl.UploadChunk) file.POST("/upload/chunk/:uploadId/:index/confirm", middleware.RequirePermission("file:upload"), chunkCtrl.ConfirmChunk) file.POST("/upload/merge/:uploadId", middleware.RequirePermission("file:upload"), chunkCtrl.Merge) file.GET("/upload/progress/:uploadId", chunkCtrl.Progress) file.DELETE("/upload/:uploadId", chunkCtrl.Cancel) file.GET("/info", fileCtrl.GetByKey) // 根据fileKey查询 file.GET("/search", fileCtrl.Search) file.GET("/trash", fileCtrl.ListTrashed) file.GET("/:id", fileCtrl.GetByID) file.GET("/:id/download", fileCtrl.Download) // 直接下载文件流 file.GET("/:id/download-url", fileCtrl.GetDownloadURL) // 获取下载链接 file.GET("/:id/preview", fileCtrl.Preview) // 预览文件流 file.GET("/:id/preview-url", fileCtrl.GetPreviewURL) // 获取预览链接 file.GET("/:id/access", accessCtrl.Access) // 统一访问(自动选择模式) file.GET("/:id/access-url", accessCtrl.GetAccessURL) // 获取访问URL file.PUT("/:id/rename", middleware.RequirePermission("file:update"), fileCtrl.Rename) file.POST("/:id/move", middleware.RequirePermission("file:update"), fileCtrl.Move) file.DELETE("/:id", middleware.RequirePermission("file:delete"), fileCtrl.SoftDelete) file.POST("/:id/restore", fileCtrl.Restore) file.DELETE("/:id/permanent", middleware.RequirePermission("file:delete"), fileCtrl.HardDelete) // 文件权限管理 file.GET("/:id/grant", fileCtrl.ListPermissions) file.POST("/:id/grant", middleware.RequirePermission("file:grant"), fileCtrl.GrantPermission) file.DELETE("/:id/grant/:permId", middleware.RequirePermission("file:grant"), fileCtrl.RevokePermission) } // 文件夹管理 folder := protected.Group("/folder") { folder.POST("", middleware.RequirePermission("file:create"), folderCtrl.Create) folder.GET("/by-bizid/:bizid", folderCtrl.GetByBizID) folder.GET("/:id/children", folderCtrl.ListChildren) folder.GET("/root", func(c *gin.Context) { c.Params = append(c.Params, gin.Param{Key: "id", Value: "root"}) folderCtrl.ListChildren(c) }) folder.PUT("/:id/rename", middleware.RequirePermission("file:update"), folderCtrl.Rename) folder.DELETE("/:id", middleware.RequirePermission("file:delete"), folderCtrl.Delete) } // 分享管理 share := protected.Group("/share") { share.POST("", middleware.RequirePermission("share:create"), shareCtrl.Create) share.GET("", shareCtrl.ListMyShares) share.DELETE("/:id", shareCtrl.Cancel) } } // ============ 管理员接口 ============ admin := api.Group("/admin") admin.Use(middleware.JWTAuth(cfg.JWT.Secret)) admin.Use(middleware.AdminAuth()) { // 角色管理 admin.GET("/roles", permCtrl.ListRoles) admin.POST("/roles", permCtrl.CreateRole) admin.PUT("/roles/:id", permCtrl.UpdateRole) admin.DELETE("/roles/:id", permCtrl.DeleteRole) admin.PUT("/roles/:id/permissions", permCtrl.SetRolePermissions) // 权限管理 admin.GET("/permissions", permCtrl.ListPermissions) admin.POST("/permissions", permCtrl.CreatePermission) admin.DELETE("/permissions/:id", permCtrl.DeletePermission) // 用户管理 admin.GET("/users", adminCtrl.ListUsers) admin.POST("/users", adminCtrl.CreateUser) admin.PUT("/users/:id", adminCtrl.UpdateUser) admin.DELETE("/users/:id", adminCtrl.DeleteUser) admin.PUT("/users/:id/password", adminCtrl.ResetPassword) admin.PUT("/users/:id/roles", permCtrl.SetUserRoles) // 存储策略管理 admin.GET("/storage-policies", adminCtrl.ListStoragePolicies) admin.POST("/storage-policies", adminCtrl.CreateStoragePolicy) admin.PUT("/storage-policies/:id", adminCtrl.UpdateStoragePolicy) admin.DELETE("/storage-policies/:id", adminCtrl.DeleteStoragePolicy) admin.POST("/storage-policies/:id/test", adminCtrl.TestStoragePolicy) // 测试已保存策略 admin.POST("/storage-policies/test", adminCtrl.TestNewStoragePolicy) // 测试新配置 // 组织架构管理 admin.GET("/departments", adminCtrl.ListDepartments) admin.POST("/departments", adminCtrl.CreateDepartment) admin.PUT("/departments/:id", adminCtrl.UpdateDepartment) admin.DELETE("/departments/:id", adminCtrl.DeleteDepartment) // SSO提供商管理 admin.GET("/sso/providers", ssoCtrl.AdminListProviders) admin.GET("/sso/providers/:id", ssoCtrl.AdminGetProvider) admin.POST("/sso/providers", ssoCtrl.AdminCreateProvider) admin.PUT("/sso/providers/:id", ssoCtrl.AdminUpdateProvider) admin.PUT("/sso/providers/:id/toggle", ssoCtrl.AdminToggleProvider) admin.DELETE("/sso/providers/:id", ssoCtrl.AdminDeleteProvider) // CDN/存储设置 admin.GET("/settings/cdn", storageCtrl.GetCDNConfig) admin.PUT("/settings/cdn", storageCtrl.UpdateCDNConfig) // 存储策略分配 admin.GET("/storage-assignments", assignCtrl.ListAssignments) admin.POST("/storage-assignments/default", assignCtrl.SetDefault) admin.POST("/storage-assignments/user", assignCtrl.AssignToUser) admin.POST("/storage-assignments/role", assignCtrl.AssignToRole) admin.PUT("/storage-assignments/:id", assignCtrl.UpdateAssignment) admin.DELETE("/storage-assignments/:id", assignCtrl.DeleteAssignment) // 流量监控 admin.GET("/monitor/traffic", monitorCtrl.GetTrafficStats) admin.GET("/monitor/requests", monitorCtrl.GetRecentRequests) admin.GET("/monitor/storage", monitorCtrl.GetStorageStats) admin.GET("/monitor/logs", monitorCtrl.GetSystemLogs) // IP黑名单 admin.GET("/blacklist", monitorCtrl.GetBlacklist) admin.PUT("/blacklist", monitorCtrl.SetBlacklist) admin.POST("/blacklist", monitorCtrl.AddBlockedIP) admin.DELETE("/blacklist/:ip", monitorCtrl.RemoveBlockedIP) // 开放平台应用管理 admin.GET("/apps", openCtrl.ListApps) admin.POST("/apps", openCtrl.CreateApp) admin.DELETE("/apps/:id", openCtrl.DeleteApp) admin.PUT("/apps/:id/toggle", openCtrl.ToggleApp) admin.PUT("/apps/:id/users", openCtrl.BindUsers) admin.DELETE("/apps/:id/users/:userId", openCtrl.UnbindUser) // 操作日志 admin.GET("/logs", logCtrl.List) admin.GET("/logs/stats", logCtrl.Stats) admin.POST("/logs/clean", logCtrl.Clean) // 备份管理 admin.GET("/backup/policies", backupCtrl.ListPolicies) admin.POST("/backup/policies", backupCtrl.CreatePolicy) admin.DELETE("/backup/policies/:id", backupCtrl.DeletePolicy) admin.PUT("/backup/policies/:id/toggle", backupCtrl.TogglePolicy) admin.POST("/backup/execute/:id", backupCtrl.ExecuteBackup) admin.GET("/backup/logs", backupCtrl.ListLogs) admin.GET("/backup/backups", backupCtrl.ListBackups) admin.POST("/backup/restore/:logId", backupCtrl.Restore) } // ============ 分享公开访问 (无需登录) ============ s := api.Group("/s") { s.GET("/:code", shareCtrl.GetShareInfo) s.POST("/:code/verify", shareCtrl.VerifySharePassword) s.GET("/:code/preview", shareCtrl.PreviewShareFile) s.GET("/:code/download", shareCtrl.DownloadShareFile) s.GET("/:code/access", accessCtrl.AccessByShare) } } return r }