101 lines
3.2 KiB
Go
101 lines
3.2 KiB
Go
|
|
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})
|
|||
|
|
}
|