fix: 全面修复项目问题

后端修复:
- 验证码存储与校验机制
- 订单创建事务+库存扣减
- GetStats字段名错误
- VerifyEmail改为POST
- 供应商更新字段白名单
- 文件删除安全检查
- 抽奖安全随机数
- 用户管理CRUD
- 订单取消/确认收货
- 工单回复
- Toggle返回新数据
- 移除死代码

前端修复:
- 404兜底路由
- 401软跳转
- API层统一
- 面包屑补充banners
- 国际化完善
- 购物车并行删除
- 退出清理购物车
- 供应商Dashboard数据
- 工单详情页
- 订单取消/确认收货
This commit is contained in:
2026-05-06 09:16:34 +08:00
parent 739481b59f
commit 3a898e8aa0
52 changed files with 2807 additions and 920 deletions
+19 -8
View File
@@ -5,8 +5,6 @@ import (
"sale/internal/api/handlers"
"sale/internal/api/middlewares"
"sale/internal/models"
"sale/internal/utils"
"github.com/gin-gonic/gin"
)
@@ -26,6 +24,7 @@ func SetupRoutes(r *gin.Engine) {
inventoryHandler := handlers.NewInventoryHandler()
articleHandler := handlers.NewArticleHandler()
uploadHandler := handlers.NewUploadHandler()
bannerHandler := handlers.NewBannerHandler()
r.Use(middlewares.CORSMiddleware())
@@ -40,7 +39,7 @@ func SetupRoutes(r *gin.Engine) {
auth.POST("/login", authHandler.Login)
auth.POST("/forgot-password", authHandler.ForgotPassword)
auth.POST("/reset-password", authHandler.ResetPassword)
auth.GET("/verify-email", authHandler.VerifyEmail)
auth.POST("/verify-email", authHandler.VerifyEmail)
}
articles := api.Group("/articles")
@@ -51,6 +50,8 @@ func SetupRoutes(r *gin.Engine) {
articles.POST("/crawl-ribenyan", articleHandler.CrawlRibenyan)
}
api.GET("/banners", bannerHandler.List)
api.GET("/categories", categoryHandler.List)
api.GET("/brands", brandHandler.List)
api.GET("/products", productHandler.List)
@@ -97,6 +98,8 @@ func SetupRoutes(r *gin.Engine) {
orders.GET("/:id", orderHandler.GetByID)
orders.POST("", orderHandler.Create)
orders.POST("/:id/refund", orderHandler.Refund)
orders.PUT("/:id/cancel", orderHandler.CancelOrder)
orders.PUT("/:id/confirm-receipt", orderHandler.ConfirmReceipt)
}
lotteries := authed.Group("/lotteries")
@@ -109,6 +112,7 @@ func SetupRoutes(r *gin.Engine) {
tickets.GET("", ticketHandler.List)
tickets.POST("", ticketHandler.Create)
tickets.GET("/:id", ticketHandler.GetByID)
tickets.POST("/:id/reply", ticketHandler.Reply)
}
supplier := authed.Group("/supplier")
@@ -126,11 +130,9 @@ func SetupRoutes(r *gin.Engine) {
admin.Use(middlewares.RoleMiddleware("admin"))
{
admin.GET("/stats", systemHandler.GetStats)
admin.GET("/users", func(c *gin.Context) {
var users []models.User
utils.DB.Select("id, username, email, role, purchase_credits, is_active, created_at").Find(&users)
c.JSON(200, gin.H{"data": users})
})
admin.GET("/users", authHandler.AdminGetUsers)
admin.PUT("/users/:id", authHandler.AdminUpdateUser)
admin.DELETE("/users/:id", authHandler.AdminDeleteUser)
adminCategories := admin.Group("/categories")
{
@@ -203,6 +205,15 @@ func SetupRoutes(r *gin.Engine) {
adminArticles.DELETE("/:id", articleHandler.Delete)
adminArticles.PUT("/:id/pin", articleHandler.TogglePin)
}
adminBanners := admin.Group("/banners")
{
adminBanners.GET("", bannerHandler.AdminList)
adminBanners.POST("", bannerHandler.Create)
adminBanners.PUT("/:id", bannerHandler.Update)
adminBanners.DELETE("/:id", bannerHandler.Delete)
adminBanners.PUT("/:id/toggle", bannerHandler.ToggleActive)
}
}
}
}