Files
toutoukan/controllers/user/setting/userSetting.go

101 lines
3.2 KiB
Go
Raw Normal View History

2025-09-29 02:19:00 +08:00
package setting
import (
"errors"
"net/http"
"toutoukan/init/databaseInit"
"github.com/gin-gonic/gin"
)
type UserSettingUpdateReq struct {
UID string `json:"uid" binding:"required"` // 用户ID必填
Password string `json:"password"` // 密码,可选
AvatarURL string `json:"avatar_url"` // 头像URL可选
Gender int `json:"gender"` // 性别,可选
BirthdateDate string `json:"birthdate_date"` // 生日,可选
Bio string `json:"bio"` // 个人简介,可选
Username string `json:"username"` // 用户名,可选
}
// 自定义验证函数确保除uid外至少有一个字段有值
func (u *UserSettingUpdateReq) Validate() error {
if u.Password == "" && u.AvatarURL == "" && u.Gender == 0 && u.BirthdateDate == "" && u.Bio == "" && u.Username == "" {
return ErrAtLeastOneFieldRequired
}
return nil
}
// 定义错误变量
var ErrAtLeastOneFieldRequired = errors.New("at least one field (password, avatar_url, gender, birthdate_date, bio, username) is required")
type User struct {
UID string `gorm:"column:uid;type:varchar(40);primaryKey"`
Telephone string `gorm:"column:telephone;type:varchar(255)"`
Password string `gorm:"column:password;type:varchar(30)"`
AvatarURL string `gorm:"column:avatar_url;type:varchar(255);default:'https://默认头像地址'"`
Gender int `gorm:"column:gender;type:int"`
BirthdateDate string `gorm:"column:birthdate_date;type:datetime"`
CreateTime string `gorm:"column:createtime;type:datetime"`
UpdateTime string `gorm:"column:updatetime;type:datetime"`
Bio string `gorm:"column:bio;type:varchar(255)"`
Username string `gorm:"column:username;type:varchar(30)"`
TotalPoints int `gorm:"column:total_points;type:int;default:0"`
}
// TableName 指定表名
func (User) TableName() string {
return "user_info"
}
// ChangeUserSetting
func ChangeUserSetting(c *gin.Context) {
// 1. 绑定请求体到结构体
var req UserSettingUpdateReq
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// 2. 自定义验证:确保至少有一个字段有值
if err := req.Validate(); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// 3. 准备要更新的数据
var updateData User
if req.Password != "" {
updateData.Password = req.Password
}
if req.AvatarURL != "" {
updateData.AvatarURL = req.AvatarURL
}
if req.Gender != 0 {
updateData.Gender = req.Gender
}
if req.BirthdateDate != "" {
updateData.BirthdateDate = req.BirthdateDate
}
if req.Bio != "" {
updateData.Bio = req.Bio
}
if req.Username != "" {
updateData.Username = req.Username
}
// 4. 执行数据库更新
result := databaseInit.UserDB.Model(&User{}).Where("uid = ?", req.UID).Updates(updateData)
if result.Error != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": result.Error.Error()})
return
}
if result.RowsAffected == 0 {
c.JSON(http.StatusNotFound, gin.H{"error": "user not found"})
return
}
// 5. 返回成功响应
c.JSON(http.StatusOK, gin.H{"message": "user setting updated successfully", "success": true})
}