/* @Time : 2020/6/28 21:40 @Author : xuyiqing @File : users.py */ package controllers import ( "fmt" "go_blog/models" "go_blog/pkg/jwt" "go_blog/pkg/util" "go_blog/serializers" "github.com/gin-gonic/gin" ) // 登录 func UsersLoginHandler(ctx *gin.Context) { response := Response{Ctx: ctx} var loginUser serializers.Login if err := ctx.ShouldBind(&loginUser); err != nil { response.BadRequest("请求参数错误: " + err.Error()) return } // 修正:通过数据库查询获取用户记录(原逻辑直接使用 loginUser.GetUser() 未查询数据库) user := &models.Account{Username: loginUser.Username} if err := models.DB.Where("username = ?", user.Username).First(user).Error; err != nil { response.BadRequest("用户不存在") return } // 修正:使用 IsPasswordEqual 验证密码 if !user.IsPasswordEqual(loginUser.Password) { response.BadRequest("密码错误") return } token, err := jwt.GenerateToken(user) if err != nil { response.ServerError("生成令牌失败: " + err.Error()) return } data, _ := util.PrecisionLost(user) data["token"] = token response.Response(data, nil) } // 注册 func UsersRegisterHandler(ctx *gin.Context) { response := Response{Ctx: ctx} var registerUser serializers.Login if err := ctx.ShouldBind(®isterUser); err != nil { response.BadRequest("请求参数错误: " + err.Error()) // 替换 panic 为错误响应 return } user := registerUser.GetUser() status := user.CheckDuplicateUsername() if status == false { response.BadRequest("用户名已存在") return } if err := user.SetPassword(user.Password); err != nil { panic(err) } user.IsActive = true models.DB.Create(&user) response.Response(nil, nil) } // 修改用户信息 func UsersSetInfoHandler(ctx *gin.Context) { response := Response{Ctx: ctx} jsonData, err := util.GetBodyData(ctx) if err != nil { response.BadRequest("参数解析失败") return } fmt.Println(jsonData) if jsonData == nil { response.BadRequest("获取不到参数") return } // 从上下文中获取用户(假设 JWT 中间件已将用户存入 "user" 键) user, exists := ctx.Get("user") if !exists { response.Unauthenticated("未登录") return } currentUser, ok := user.(*models.Account) // 明确类型为 models.Account if !ok { response.ServerError("用户类型错误") return } models.DB.Model(currentUser).Updates(jsonData) response.Response(currentUser, nil) } // 修改密码 func UsersSetPwdHandler(ctx *gin.Context) { response := Response{Ctx: ctx} // 从上下文中获取用户(替换原 jwt.AssertUser 调用) user, exists := ctx.Get("user") if !exists { response.Unauthenticated("未验证登录") return } currentUser, ok := user.(*models.Account) if !ok { response.ServerError("用户类型错误") return } if currentUser == nil { response.Unauthenticated("未验证登录") return } var user serializers.Account if err := ctx.ShouldBindJSON(&user); err != nil { response.BadRequest(err.Error()) return } if user.Username != currentUser.Username { response.BadRequest("当前登录用户用户名与输入用户名不符") return } if user.OldPwd == user.NewPwd { response.BadRequest("两次输入的密码相同") return } if isPwd := currentUser.IsPasswordEqual(user.OldPwd); !isPwd { response.BadRequest("原密码错误") return } if err := currentUser.SetPassword(user.NewPwd); err != nil { response.BadRequest(err.Error()) return } models.DB.Save(¤tUser) response.Response(nil, nil) } func UsersListHandler(ctx *gin.Context) { response := Response{Ctx: ctx} var pager serializers.Pager pager.InitPager(ctx) var users []models.Account // 先查询总记录数 var totalCount int64 models.DB.Model(&models.Account{}).Count(&totalCount) pager.Total = int(totalCount) // 正确设置总数 // 分页查询 models.DB.Offset(pager.OffSet()).Limit(pager.PageSize).Find(&users) pager.GetPager() response.Response(users, pager) }