部分重构
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
"ops/api/v1"
|
||||
"ops/routers"
|
||||
)
|
||||
|
||||
// RegisterAllRoutes 注册所有路由,包括兼容性路由
|
||||
func RegisterAllRoutes(r *gin.Engine) {
|
||||
// API v1路由(RESTful风格)
|
||||
apiV1 := r.Group("/api/v1")
|
||||
v1.RegisterRoutes(apiV1)
|
||||
|
||||
// 兼容性API路由(保持原有路径结构)
|
||||
api := r.Group("/api")
|
||||
registerCompatibilityRoutes(api)
|
||||
|
||||
// 根路径
|
||||
r.GET("/", func(c *gin.Context) {
|
||||
c.Redirect(http.StatusFound, "/index.html")
|
||||
})
|
||||
}
|
||||
|
||||
// registerCompatibilityRoutes 注册兼容性路由
|
||||
func registerCompatibilityRoutes(api *gin.RouterGroup) {
|
||||
// 健康检查
|
||||
api.GET("/health", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"code": "0",
|
||||
"message": "API is healthy",
|
||||
"data": nil,
|
||||
})
|
||||
})
|
||||
|
||||
// 测试端点
|
||||
api.GET("/test", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"code": "0",
|
||||
"message": "API test successful",
|
||||
"data": nil,
|
||||
})
|
||||
})
|
||||
|
||||
api.POST("/test", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"code": "0",
|
||||
"message": "API test successful (POST)",
|
||||
"data": nil,
|
||||
})
|
||||
})
|
||||
|
||||
// 注册原有路由模块
|
||||
api.Static("/static", "./dist")
|
||||
routers.ApiStatic(api.Group("/static"))
|
||||
routers.ApiUser(api.Group("/users"))
|
||||
routers.ApiFiles(api.Group("/files"))
|
||||
routers.ApiPurchase(api.Group("/purchase"))
|
||||
|
||||
// 根API路径
|
||||
api.GET("/", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"code": "0",
|
||||
"message": "OPS API",
|
||||
"data": gin.H{
|
||||
"version": "1.0",
|
||||
"routes": []string{
|
||||
"/api/users/*",
|
||||
"/api/files/*",
|
||||
"/api/purchase/*",
|
||||
"/api/v1/* (RESTful API)",
|
||||
},
|
||||
},
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// CreateRouter 创建完整路由引擎
|
||||
func CreateRouter() *gin.Engine {
|
||||
r := gin.New()
|
||||
|
||||
// 设置信任代理
|
||||
r.SetTrustedProxies([]string{"127.0.0.1"})
|
||||
|
||||
// 注册所有路由
|
||||
RegisterAllRoutes(r)
|
||||
|
||||
// 最后注册404处理
|
||||
r.NoRoute(func(c *gin.Context) {
|
||||
// 如果是API请求,返回JSON 404
|
||||
path := c.Request.URL.Path
|
||||
if strings.HasPrefix(path, "/api") {
|
||||
c.JSON(404, gin.H{
|
||||
"code": "404",
|
||||
"message": "API endpoint not found",
|
||||
"data": nil,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 否则尝试提供静态文件
|
||||
fs := http.FileServer(http.Dir("./dist"))
|
||||
fs.ServeHTTP(c.Writer, c.Request)
|
||||
})
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
package v1
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"ops/internal/database"
|
||||
"ops/internal/handler"
|
||||
"ops/internal/middleware"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var (
|
||||
db *gorm.DB
|
||||
authHandler *handler.AuthHandler
|
||||
fileHandler *handler.FileHandler
|
||||
purchaseHandler *handler.PurchaseHandler
|
||||
)
|
||||
|
||||
func init() {
|
||||
db = database.GetDB()
|
||||
authHandler = handler.NewAuthHandler(db)
|
||||
fileHandler = handler.NewFileHandler(db)
|
||||
purchaseHandler = handler.NewPurchaseHandler(db)
|
||||
}
|
||||
|
||||
// RegisterRoutes 注册所有v1版本的API路由
|
||||
func RegisterRoutes(r *gin.RouterGroup) {
|
||||
// API根路径测试
|
||||
r.GET("/", func(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"code": "0",
|
||||
"message": "OPS API v1",
|
||||
"data": nil,
|
||||
})
|
||||
})
|
||||
|
||||
// 静态文件路由 - 保持兼容性
|
||||
r.StaticFS("/static", http.Dir("./dist"))
|
||||
|
||||
// 兼容旧版文件路由(保持前端兼容性)
|
||||
r.GET("/files/:mode/:hash", func(c *gin.Context) {
|
||||
mode := c.Param("mode")
|
||||
|
||||
if mode == "get" || mode == "download" {
|
||||
download := (mode == "download")
|
||||
// 直接调用handler的GetFile/DownloadFile方法
|
||||
if download {
|
||||
fileHandler.DownloadFile(c)
|
||||
} else {
|
||||
fileHandler.GetFile(c)
|
||||
}
|
||||
} else {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"code": "-2",
|
||||
"message": "无效的文件模式",
|
||||
"data": nil,
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// 用户认证相关路由
|
||||
userGroup := r.Group("/users")
|
||||
{
|
||||
// 用户认证
|
||||
userGroup.POST("/login", authHandler.UserLogin)
|
||||
userGroup.POST("/register", authHandler.UserRegister)
|
||||
userGroup.POST("/forgot-password", authHandler.UserForgotPassword)
|
||||
userGroup.POST("/reset-password", authHandler.UserResetPassword)
|
||||
|
||||
// 用户信息 - 需要认证
|
||||
userGroup.PUT("/profile", middleware.AuthToken(), authHandler.UserUpdateProfile)
|
||||
userGroup.GET("/profile", middleware.AuthToken(), authHandler.UserProfile)
|
||||
userGroup.POST("/logout", middleware.AuthToken(), authHandler.UserLogout)
|
||||
|
||||
// 用户管理(管理员) - TODO: 实现管理员功能
|
||||
userGroup.GET("/list", middleware.AuthToken(), adminMiddleware(), getUserList)
|
||||
userGroup.POST("/create", middleware.AuthToken(), adminMiddleware(), createUser)
|
||||
userGroup.PUT("/:id", middleware.AuthToken(), adminMiddleware(), updateUser)
|
||||
userGroup.DELETE("/:id", middleware.AuthToken(), adminMiddleware(), deleteUser)
|
||||
}
|
||||
|
||||
// 文件上传管理 - v1 API
|
||||
fileGroup := r.Group("/files")
|
||||
{
|
||||
// 上传文件
|
||||
fileGroup.POST("/upload", middleware.AuthToken(), fileHandler.UploadFile)
|
||||
|
||||
// 文件列表管理
|
||||
fileGroup.GET("/list", middleware.AuthToken(), fileHandler.GetFileList)
|
||||
fileGroup.GET("/:id", middleware.AuthToken(), fileHandler.GetFileByID)
|
||||
fileGroup.DELETE("/:id", middleware.AuthToken(), fileHandler.DeleteFile)
|
||||
|
||||
// 文件访问
|
||||
fileGroup.GET("/download/:hash", fileHandler.DownloadFile)
|
||||
fileGroup.GET("/get/:hash", fileHandler.GetFile)
|
||||
}
|
||||
|
||||
// 采购订单管理
|
||||
purchaseGroup := r.Group("/purchase")
|
||||
{
|
||||
// 保持与前端兼容的POST路由(原始API使用POST)
|
||||
purchaseGroup.POST("/getorders", middleware.AuthToken(), purchaseHandler.GetOrders)
|
||||
purchaseGroup.POST("/addorder", middleware.AuthToken(), purchaseHandler.CreateOrder)
|
||||
|
||||
// RESTful风格的新API
|
||||
purchaseGroup.GET("/orders", middleware.AuthToken(), purchaseHandler.GetOrders)
|
||||
purchaseGroup.POST("/orders", middleware.AuthToken(), purchaseHandler.CreateOrder)
|
||||
purchaseGroup.GET("/orders/:id", middleware.AuthToken(), purchaseHandler.GetOrderDetails)
|
||||
|
||||
// TODO: 实现更新、删除和其他功能
|
||||
purchaseGroup.PUT("/orders/:id", middleware.AuthToken(), purchaseUpdateOrder)
|
||||
purchaseGroup.DELETE("/orders/:id", middleware.AuthToken(), purchaseDeleteOrder)
|
||||
purchaseGroup.POST("/orders/:id/costs", middleware.AuthToken(), purchaseAddCost)
|
||||
purchaseGroup.PUT("/orders/:id/costs/:costId", middleware.AuthToken(), purchaseUpdateCost)
|
||||
purchaseGroup.DELETE("/orders/:id/costs/:costId", middleware.AuthToken(), purchaseDeleteCost)
|
||||
}
|
||||
|
||||
// 系统管理(管理员)
|
||||
systemGroup := r.Group("/system")
|
||||
{
|
||||
systemGroup.GET("/status", systemStatus)
|
||||
systemGroup.GET("/config", middleware.AuthToken(), adminMiddleware(), systemGetConfig)
|
||||
systemGroup.PUT("/config", middleware.AuthToken(), adminMiddleware(), systemUpdateConfig)
|
||||
}
|
||||
}
|
||||
|
||||
// 管理员中间件占位函数
|
||||
func adminMiddleware() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
// TODO: 实现管理员权限检查
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
|
||||
// 占位函数 - 将在后续步骤中实现
|
||||
func getUserList(c *gin.Context) {}
|
||||
func createUser(c *gin.Context) {}
|
||||
func updateUser(c *gin.Context) {}
|
||||
func deleteUser(c *gin.Context) {}
|
||||
func purchaseUpdateOrder(c *gin.Context) {}
|
||||
func purchaseDeleteOrder(c *gin.Context) {}
|
||||
func purchaseAddCost(c *gin.Context) {}
|
||||
func purchaseUpdateCost(c *gin.Context) {}
|
||||
func purchaseDeleteCost(c *gin.Context) {}
|
||||
func systemStatus(c *gin.Context) {}
|
||||
func systemGetConfig(c *gin.Context) {}
|
||||
func systemUpdateConfig(c *gin.Context) {}
|
||||
Reference in New Issue
Block a user