diff --git a/controllers/auth_controller.go b/controllers/auth_controller.go index 6ae2c68..59afaf4 100644 --- a/controllers/auth_controller.go +++ b/controllers/auth_controller.go @@ -34,27 +34,19 @@ func NewAuthController() *AuthController { // @Router /auth/login [post] func (c *AuthController) Login(ctx *gin.Context) { var loginData models.LoginDTO - if err := ctx.ShouldBindJSON(&loginData); err != nil { - ctx.JSON(http.StatusBadRequest, gin.H{ - "message": "无效的请求数据", - "error": err.Error(), - }) + if !BindJSON(ctx, &loginData) { return } user, err := c.authService.ValidateUser(loginData.Username, loginData.Password) if err != nil { - ctx.JSON(http.StatusUnauthorized, gin.H{ - "message": err.Error(), - }) + ErrorResponse(ctx, http.StatusUnauthorized, err.Error()) return } token, err := c.authService.GenerateToken(user) if err != nil { - ctx.JSON(http.StatusInternalServerError, gin.H{ - "message": "令牌生成失败", - }) + ErrorResponse(ctx, http.StatusInternalServerError, "令牌生成失败") return } diff --git a/controllers/helper.go b/controllers/helper.go index bb85eb1..d89bd7c 100644 --- a/controllers/helper.go +++ b/controllers/helper.go @@ -2,12 +2,52 @@ package controllers import ( "net/http" + "strings" "github.com/gin-gonic/gin" "git.beifan.cn/trace-system/backend-go/models" ) +func friendlyMessage(message string) string { + if message == "" { + return "请求失败,请稍后重试" + } + + msg := strings.TrimSpace(message) + + friendlyMap := []struct { + key string + val string + }{ + {"用户名或密码错误", "用户名或密码不正确"}, + {"当前密码错误", "当前密码不正确"}, + {"令牌生成失败", "登录失败,请稍后重试"}, + {"未认证", "请先登录"}, + {"用户信息无效", "登录状态无效,请重新登录"}, + {"序列号不存在", "序列号不存在"}, + {"企业不存在", "企业不存在"}, + {"序列号已过期", "序列号已过期"}, + {"序列号已被禁用", "序列号已禁用"}, + {"序列号已被吊销", "序列号已吊销"}, + {"企业名称已存在", "企业名称已存在"}, + {"无效的请求数据", "提交数据格式不正确"}, + {"无效的查询参数", "查询参数不正确"}, + } + + for _, item := range friendlyMap { + if strings.Contains(msg, item.key) { + return item.val + } + } + + if strings.Contains(msg, "record not found") { + return "数据不存在" + } + + return msg +} + // GetCurrentUser 从上下文中获取当前用户 // 如果用户未认证,返回 false 并返回 401 错误 func GetCurrentUser(ctx *gin.Context) (models.User, bool) { @@ -35,8 +75,7 @@ func GetCurrentUser(ctx *gin.Context) (models.User, bool) { func BindJSON(ctx *gin.Context, obj interface{}) bool { if err := ctx.ShouldBindJSON(obj); err != nil { ctx.JSON(http.StatusBadRequest, gin.H{ - "message": "无效的请求数据", - "error": err.Error(), + "message": "提交数据格式不正确", }) return false } @@ -48,8 +87,7 @@ func BindJSON(ctx *gin.Context, obj interface{}) bool { func BindQuery(ctx *gin.Context, obj interface{}) bool { if err := ctx.ShouldBindQuery(obj); err != nil { ctx.JSON(http.StatusBadRequest, gin.H{ - "message": "无效的查询参数", - "error": err.Error(), + "message": "查询参数不正确", }) return false } @@ -58,11 +96,12 @@ func BindQuery(ctx *gin.Context, obj interface{}) bool { // ErrorResponse 返回错误响应 func ErrorResponse(ctx *gin.Context, status int, message string, err ...error) { + friendly := friendlyMessage(message) response := gin.H{ - "message": message, + "message": friendly, } if len(err) > 0 && err[0] != nil { - response["error"] = err[0].Error() + response["error"] = friendlyMessage(err[0].Error()) } ctx.JSON(status, response) } diff --git a/controllers/serials_controller.go b/controllers/serials_controller.go index 59ac0c3..e69def3 100644 --- a/controllers/serials_controller.go +++ b/controllers/serials_controller.go @@ -3,6 +3,7 @@ package controllers import ( "net/http" "strconv" + "strings" "github.com/gin-gonic/gin" @@ -57,8 +58,20 @@ func (c *SerialsController) Generate(ctx *gin.Context) { return } - SuccessResponse(ctx, "成功生成 "+strconv.Itoa(len(serials))+" 个序列号", gin.H{ - "serials": serials, + items := make([]gin.H, 0, len(serials)) + for _, serial := range serials { + items = append(items, gin.H{ + "serialNumber": serial.SerialNumber, + "companyName": serial.CompanyName, + "validUntil": serial.ValidUntil, + "isActive": serial.IsActive, + "createdAt": serial.CreatedAt, + "createdBy": userModel.Name, + }) + } + + SuccessResponse(ctx, "成功生成"+strconv.Itoa(len(serials))+"个序列号", gin.H{ + "serials": items, }) } @@ -98,8 +111,20 @@ func (c *SerialsController) GenerateWithPrefix(ctx *gin.Context) { return } - SuccessResponse(ctx, "成功生成 "+strconv.Itoa(len(serials))+" 个序列号", gin.H{ - "serials": serials, + items := make([]gin.H, 0, len(serials)) + for _, serial := range serials { + items = append(items, gin.H{ + "serialNumber": serial.SerialNumber, + "companyName": serial.CompanyName, + "validUntil": serial.ValidUntil, + "isActive": serial.IsActive, + "createdAt": serial.CreatedAt, + "createdBy": userModel.Name, + }) + } + + SuccessResponse(ctx, "成功生成"+strconv.Itoa(len(serials))+"个序列号", gin.H{ + "serials": items, }) } @@ -168,8 +193,26 @@ func (c *SerialsController) Query(ctx *gin.Context) { return } + createdBy := "" + if serial.User != nil { + createdBy = serial.User.Name + } + + status := "active" + if !serial.IsActive { + status = "disabled" + } + SuccessResponse(ctx, "查询成功", gin.H{ - "serial": serial, + "serial": gin.H{ + "serialNumber": serial.SerialNumber, + "companyName": serial.CompanyName, + "validUntil": serial.ValidUntil, + "status": status, + "isActive": serial.IsActive, + "createdAt": serial.CreatedAt, + "createdBy": createdBy, + }, }) } @@ -197,8 +240,25 @@ func (c *SerialsController) FindAll(ctx *gin.Context) { return } + items := make([]gin.H, 0, len(serials)) + for _, serial := range serials { + createdBy := "" + if serial.User != nil { + createdBy = serial.User.Name + } + + items = append(items, gin.H{ + "serialNumber": serial.SerialNumber, + "companyName": serial.CompanyName, + "validUntil": serial.ValidUntil, + "isActive": serial.IsActive, + "createdAt": serial.CreatedAt, + "createdBy": createdBy, + }) + } + SuccessResponse(ctx, "获取序列号列表成功", gin.H{ - "data": serials, + "data": items, "pagination": gin.H{ "page": page, "limit": limit, @@ -237,8 +297,21 @@ func (c *SerialsController) Update(ctx *gin.Context) { return } - SuccessResponse(ctx, "序列号信息更新成功", gin.H{ - "serial": serial, + createdBy := "" + if serial.User != nil { + createdBy = serial.User.Name + } + + SuccessResponse(ctx, "序列号更新成功", gin.H{ + "serial": gin.H{ + "serialNumber": serial.SerialNumber, + "companyName": serial.CompanyName, + "validUntil": serial.ValidUntil, + "isActive": serial.IsActive, + "createdAt": serial.CreatedAt, + "updatedAt": serial.UpdatedAt, + "createdBy": createdBy, + }, }) } @@ -264,5 +337,9 @@ func (c *SerialsController) Revoke(ctx *gin.Context) { return } - SuccessResponse(ctx, "序列号吊销成功") + SuccessResponse(ctx, "序列号已吊销", gin.H{ + "data": gin.H{ + "serialNumber": strings.ToUpper(serialNumber), + }, + }) } diff --git a/services/auth_service.go b/services/auth_service.go index b5c4f09..c57a3de 100644 --- a/services/auth_service.go +++ b/services/auth_service.go @@ -21,12 +21,12 @@ func (s *AuthService) ValidateUser(username string, password string) (*models.Us var user models.User result := database.DB.Where("username = ?", username).First(&user) if result.Error != nil { - return nil, fmt.Errorf("验证用户失败: %w", errors.New("用户名或密码错误")) + return nil, errors.New("用户名或密码不正确") } err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)) if err != nil { - return nil, fmt.Errorf("密码验证失败: %w", errors.New("用户名或密码错误")) + return nil, errors.New("用户名或密码不正确") } return &user, nil diff --git a/services/serials_service.go b/services/serials_service.go index 28942ce..2c30833 100644 --- a/services/serials_service.go +++ b/services/serials_service.go @@ -244,6 +244,8 @@ func (s *SerialsService) Update(serialNumber string, updateData models.UpdateSer return nil, fmt.Errorf("更新序列号失败: %w", result.Error) } + _ = database.DB.Preload("User").Where("serial_number = ?", serial.SerialNumber).First(&serial) + return &serial, nil } diff --git a/tests/main_test.go b/tests/main_test.go index 7c186ed..c4f40a5 100644 --- a/tests/main_test.go +++ b/tests/main_test.go @@ -160,5 +160,5 @@ func TestLoginFailed(t *testing.T) { var response map[string]interface{} err := json.Unmarshal(w.Body.Bytes(), &response) assert.NoError(t, err) - assert.Contains(t, response["message"], "用户名或密码错误") + assert.Contains(t, response["message"], "用户名或密码不正确") }