package main import ( "log" "net/http" "os" "strings" "github.com/gin-gonic/gin" "github.com/niangaodev/art-code/config" "github.com/niangaodev/art-code/handlers" "github.com/niangaodev/art-code/middleware" ) func main() { // 初始化数据库连接 config.InitDB() defer config.CloseDB() // 创建Gin引擎 router := gin.Default() // 配置CORS router.Use(func(c *gin.Context) { // 获取允许的域名,优先从环境变量获取,否则使用默认值 allowedOrigins := os.Getenv("ALLOWED_ORIGINS") if allowedOrigins == "" { allowedOrigins = "http://localhost:5173,http://localhost:3000" // 开发环境默认值 } // 检查请求来源是否在允许列表中 requestOrigin := c.Request.Header.Get("Origin") if requestOrigin != "" { // 简单的CORS origin检查 for _, origin := range strings.Split(allowedOrigins, ",") { if strings.TrimSpace(origin) == requestOrigin { c.Writer.Header().Set("Access-Control-Allow-Origin", requestOrigin) break } } } c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") c.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization") c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") if c.Request.Method == "OPTIONS" { c.AbortWithStatus(http.StatusNoContent) return } c.Next() }) // API路由组 api := router.Group("/api") { // 作品路由 api.GET("/works", handlers.GetWorks) api.GET("/works/:id", handlers.GetWork) // 博客路由 api.GET("/posts", handlers.GetPosts) api.GET("/posts/:id", handlers.GetPost) // 代码片段路由 api.GET("/snippets", handlers.GetSnippets) api.GET("/snippets/:id", handlers.GetSnippet) // 标签路由 api.GET("/tags", handlers.GetTags) api.GET("/tags/:id", handlers.GetTag) api.GET("/tags/:id/posts", handlers.GetPostsByTagID) // 代码执行路由 api.POST("/run", handlers.RunCode) } // 管理员API路由组 admin := router.Group("/api/admin") { // 登录路由(不需要认证) admin.POST("/login", handlers.AdminLogin) // 需要认证的路由 authAdmin := admin.Group("/") authAdmin.Use(middleware.AuthMiddleware(), middleware.OperationLogMiddleware()) { // 用户管理 authAdmin.GET("/users", middleware.PermissionMiddleware("users", "read"), handlers.AdminGetUsers) authAdmin.GET("/users/:id", middleware.PermissionMiddleware("users", "read"), handlers.AdminGetUser) authAdmin.POST("/users", middleware.PermissionMiddleware("users", "create"), handlers.AdminCreateUser) authAdmin.PUT("/users/:id", middleware.PermissionMiddleware("users", "update"), handlers.AdminUpdateUser) authAdmin.DELETE("/users/:id", middleware.PermissionMiddleware("users", "delete"), handlers.AdminDeleteUser) // 角色管理 authAdmin.GET("/roles", middleware.PermissionMiddleware("roles", "read"), handlers.AdminGetRoles) authAdmin.POST("/roles", middleware.PermissionMiddleware("roles", "create"), handlers.AdminCreateRole) authAdmin.PUT("/roles/:id", middleware.PermissionMiddleware("roles", "update"), handlers.AdminUpdateRole) authAdmin.DELETE("/roles/:id", middleware.PermissionMiddleware("roles", "delete"), handlers.AdminDeleteRole) // 权限管理 authAdmin.GET("/permissions", middleware.PermissionMiddleware("roles", "read"), handlers.AdminGetPermissions) authAdmin.PUT("/roles/:id/permissions", middleware.PermissionMiddleware("roles", "update"), handlers.AdminUpdateRolePermissions) // 作品管理 authAdmin.GET("/works", middleware.PermissionMiddleware("works", "read"), handlers.AdminGetWorks) authAdmin.POST("/works", middleware.PermissionMiddleware("works", "create"), handlers.AdminCreateWork) authAdmin.PUT("/works/:id", middleware.PermissionMiddleware("works", "update"), handlers.AdminUpdateWork) authAdmin.DELETE("/works/:id", middleware.PermissionMiddleware("works", "delete"), handlers.AdminDeleteWork) // 代码片段管理 authAdmin.GET("/snippets", middleware.PermissionMiddleware("snippets", "read"), handlers.AdminGetSnippets) authAdmin.POST("/snippets", middleware.PermissionMiddleware("snippets", "create"), handlers.AdminCreateSnippet) authAdmin.PUT("/snippets/:id", middleware.PermissionMiddleware("snippets", "update"), handlers.AdminUpdateSnippet) authAdmin.DELETE("/snippets/:id", middleware.PermissionMiddleware("snippets", "delete"), handlers.AdminDeleteSnippet) // 系统配置管理 authAdmin.GET("/settings", middleware.PermissionMiddleware("settings", "read"), handlers.AdminGetSettings) authAdmin.POST("/settings", middleware.PermissionMiddleware("settings", "create"), handlers.AdminCreateSetting) authAdmin.PUT("/settings", middleware.PermissionMiddleware("settings", "update"), handlers.AdminUpdateSetting) authAdmin.DELETE("/settings/:key", middleware.PermissionMiddleware("settings", "delete"), handlers.AdminDeleteSetting) // 文章管理 authAdmin.GET("/posts", middleware.PermissionMiddleware("posts", "read"), handlers.AdminGetPosts) authAdmin.POST("/posts", middleware.PermissionMiddleware("posts", "create"), handlers.AdminCreatePost) authAdmin.PUT("/posts/:id", middleware.PermissionMiddleware("posts", "update"), handlers.AdminUpdatePost) authAdmin.DELETE("/posts/:id", middleware.PermissionMiddleware("posts", "delete"), handlers.AdminDeletePost) // 文章历史记录 authAdmin.GET("/posts/:id/history", middleware.PermissionMiddleware("posts", "read"), handlers.AdminGetPostHistory) authAdmin.GET("/posts/:id/history/:version", middleware.PermissionMiddleware("posts", "read"), handlers.AdminGetPostHistoryByVersion) // 操作日志管理 authAdmin.GET("/operation-logs", middleware.PermissionMiddleware("operation_logs", "read"), handlers.AdminGetOperationLogs) // 仪表盘数据 authAdmin.GET("/dashboard/stats", middleware.PermissionMiddleware("dashboard", "read"), handlers.AdminGetDashboardStats) authAdmin.GET("/dashboard/activities", middleware.PermissionMiddleware("dashboard", "read"), handlers.AdminGetRecentActivities) // 标签管理 authAdmin.GET("/tags", middleware.PermissionMiddleware("tags", "read"), handlers.AdminGetTags) authAdmin.POST("/tags", middleware.PermissionMiddleware("tags", "create"), handlers.AdminCreateTag) authAdmin.PUT("/tags/:id", middleware.PermissionMiddleware("tags", "update"), handlers.AdminUpdateTag) authAdmin.DELETE("/tags/:id", middleware.PermissionMiddleware("tags", "delete"), handlers.AdminDeleteTag) } } // 启动服务器 log.Println("Server running on http://localhost:8081") if err := router.Run(":8081"); err != nil { log.Fatalf("Failed to start server: %v", err) } }