算了,后端我自己写吧

This commit is contained in:
2026-04-01 12:09:02 +08:00
parent 4138340f53
commit 1a0a01a56d
69 changed files with 1949 additions and 102 deletions
+112
View File
@@ -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
}
+120
View File
@@ -0,0 +1,120 @@
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"))
// 用户认证相关路由
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
// 注意:具体路由必须放在通配路由之前
r.POST("/files/upload", middleware.AuthToken(), fileHandler.UploadFile)
r.GET("/files/list", middleware.AuthToken(), fileHandler.GetFileList)
r.GET("/files/:id", middleware.AuthToken(), fileHandler.GetFileByID)
r.DELETE("/files/:id", middleware.AuthToken(), fileHandler.DeleteFile)
r.GET("/files/download/:hash", fileHandler.DownloadFile)
r.GET("/files/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) {}