更新用户 原创
1、新增数据 Update 方法
在 models/user.go 中增加下面方法:
go
// Update 更新数据
func (u *User) Update(db *gorm.DB, values interface{}) error {
// 如果用户存在并未被删除,则更新
if err := db.Model(u).Where("id = ? AND is_del = ?", u.ID, 0).First(&User{}).Updates(values).Error; err != nil {
return err
}
return nil
}
2、增加 dao 方法
go
// UserUpdate 更新用户
func (d *Dao) UserUpdate(id uint32, name, password string) error {
nowTime := uint32(time.Now().Unix())
user := models.User{
Base: &models.Base{
ID: id,
},
}
values := map[string]interface{}{
"username": name,
"password": password,
"modified_at": nowTime,
}
return user.Update(d.engine, values)
}
3、增加 services 方法
go
// UserUpdate 更新用户
func (s *Services) UserUpdate(param *requests.UserUpdateRequest) error {
return s.dao.UserUpdate(param.ID, param.Username, param.Password)
}
这里需要创建requests.UserUpdateRequest
的结构体。
在 requests 包中创建user.go
,写入以下内容:
go
type UserUpdateRequest struct {
ID uint32 `json:"id" form:"id" valid:"id"`
Username string `json:"username" form:"username" valid:"username"`
Password string `json:"password" form:"password" valid:"password"`
}
func ValidUserUpdateRequest(data interface{}, ctx *gin.Context) map[string][]string {
rules := govalidator.MapData{
"username": []string{"required", "not_exists:user,username"},
"password": []string{"required", "min:6"},
"id": []string{"required"},
}
messages := govalidator.MapData{
"username": []string{
"required: 用户名为必填字段,字段为 username",
},
"password": []string{
"required: 密码为必填字段,字段为 password",
"min:密码长度需大于 6",
},
"id": []string{
"required: 用户ID是必填项, 字段为 id",
},
}
// 校验入参
errs := app.ValidateOptions(data, rules, messages)
return errs
}
4、增加 controllers 方法
在 controllers/api/v1/user.go 中新增删除用户方法,如下:
go
// @Summary 更新用户
// @Description 更新用户
// @Tags 用户管理
// @Produce json
// @Param body body requests.UserUpdateRequest true "body"
// @Success 200 {object} string "成功"
// @Failure 400 {object} errorcode.Error "请求错误"
// @Failure 500 {object} errorcode.Error "内部错误"
// @Router /api/v1/user/update [post]
func (u *UserController) Update(ctx *gin.Context) {
param := requests.UserUpdateRequest{}
response := app.NewResponse(ctx)
if ok := app.Validate(ctx, ¶m, requests.ValidUserUpdateRequest); !ok {
return
}
svc := services.New(ctx)
if err := svc.UserUpdate(¶m); err != nil {
global.Log.Error("更新用户失败", zap.String("error", err.Error()))
response.ToErrorResponse(errorcode.ErrorUserUpdateFail)
return
}
response.ToResponse(gin.H{
"msg": "更新用户成功",
})
}
增加路由
在 routers 包中增加删除用户路由,如下:
go
package routers
import (
"github.com/gin-gonic/gin"
v1 "github.com/joker-bai/hawkeye/internal/app/controllers/api/v1"
)
type UserRouter struct{}
func (u *UserRouter) Inject(r *gin.RouterGroup) {
uc := new(v1.UserController)
r.POST("/user/create", uc.Create)
r.POST("/user/delete", uc.Delete)
r.POST("/user/update", uc.Update)
}
测试
启动服务,使用 apifox 进行测试。
发送请求,更新用户成功。
数据库里记录信息。
更新之前:
更新之后:
生成接口文档并增加代码版本
go
$ swag.exe init
$ git add .
$ git commit -m "新增用户更新模块"