Files
go_blog/controllers/users.go
2025-05-27 19:24:07 +08:00

162 lines
3.9 KiB
Go

/*
@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(&registerUser); 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(&currentUser)
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)
}