新增用户
- 获取参数
err := c.Bind(&r)
if err!=nil{
handler.SendResponse(c,errno.ErrBind,nil)
return
}
u:=model.UserModel{Username: r.Username,Password: r.Password,}
复制代码
- 校验参数
// Validate the data.
if err := u.Validate(); err != nil {
handler.SendResponse(c, errno.ErrValidation, nil)
return
}
复制代码
- 加密密码
// Encrypt the user password.
if err := u.Encrypt(); err != nil {
handler.SendResponse(c, errno.ErrEncrypt, nil)
return
}
复制代码
- 插入数据
// Insert the user to the database.
if err := u.Create(); err != nil {
handler.SendResponse(c, errno.ErrDatabase, nil)
return
}
复制代码
- 返回响应
rsp := CreateResponse{
Username: r.Username,
}
handler.SendResponse(c,nil,rsp)
复制代码
查询用户
- 获取参数,查询数据库
usename := c.Param("username")
user, err := model.GetUser(usename)
复制代码
- 返回响应
if err!=nil{
handler.SendResponse(c,errno.ErrUserNotFound,nil)
return
}
handler.SendResponse(c,nil,user)
复制代码
更新用户
逻辑与新增用户基本一致,不同点在于:除了接收用户信息的结构体外,还要接收用户的ID,将这些组合起来再进行查询
删除用户
- 读取参数
useId, _ := strconv.Atoi(c.Param("id"))
复制代码
- 删除数据库中的记录,并返回删除结果
if err := model.Delete(uint64(useId));err != nil {
handler.SendResponse(c,errno.ErrDatabase,nil)
return
}
handler.SendResponse(c,nil,nil)
复制代码
查询用户列表
查询一个 REST 资源列表,通常需要做分页,如果不做分页返回的列表过多,会导致 API 响应很慢,前端体验也不好。因此对于查询函数做了分页,收到的请求中传入的 offset 和 limit 参数,分别对应于 MySQL 的 offset 和 limit
- 在 ListUser() 函数中用了 sync 包来做并行查询
- 使用 IdMap 是因为查询的列表通常需要按时间顺序进行排序,一般数据库查询后的列表已经排过序了,但是为了减少延时,程序中用了并发,这时候会打乱排序,所以通过 IdMap 来记录并发处理前的顺序,处理后再重新复位。
for _, userModel := range user {
waitGroup.Add(1)
go func(userModel *model.UserModel) {
defer waitGroup.Done()
id, err2 := util.GenShortId()
if err2!=nil{
errors<-err2
return
}
list.Lock.Lock()
defer list.Lock.Unlock()
list.IdMap[userModel.Id] = &model.UserInfo{
Id: userModel.Id,
Username: userModel.Username,
SayHello: fmt.Sprintf("Hello %s", id),
Password: userModel.Password,
CreatedAt:userModel.CreatedAt.Format("2006-01-02 15:04:05"),
UpdatedAt: userModel.UpdatedAt.Format("2006-01-02 15:04:05"),
}
}(userModel)
}
复制代码
- 用户列表结构体
list := model.UserList{Lock: new(sync.Mutex),
IdMap: make(map[uint64]*model.UserInfo, len(user))}
复制代码
- 错误信息通道以及完成信息通道
errors:= make(chan error, 1)
finish := make(chan bool, 1)
复制代码
测试
- 添加用户
- 结果
- 查询用户
- 修改用户
- 查看用户列表
- 删除用户
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END