Go语言实战 : API服务器 (7) 数据库的CRUD

新增用户

  1. 获取参数
	err := c.Bind(&r)
	if err!=nil{
		handler.SendResponse(c,errno.ErrBind,nil)
		return
	}
        u:=model.UserModel{Username: r.Username,Password: r.Password,}
复制代码
  1. 校验参数
	// Validate the data.
	if err := u.Validate(); err != nil {
		handler.SendResponse(c, errno.ErrValidation, nil)
		return
	}
复制代码
  1. 加密密码
	// Encrypt the user password.
	if err := u.Encrypt(); err != nil {
		handler.SendResponse(c, errno.ErrEncrypt, nil)
		return
	}
复制代码
  1. 插入数据
	// Insert the user to the database.
	if err := u.Create(); err != nil {
		handler.SendResponse(c, errno.ErrDatabase, nil)
		return
	}

复制代码
  1. 返回响应
		rsp := CreateResponse{
		Username: r.Username,
	}

	handler.SendResponse(c,nil,rsp)
复制代码

查询用户

  1. 获取参数,查询数据库
	usename := c.Param("username")
	user, err := model.GetUser(usename)
复制代码
  1. 返回响应
	if err!=nil{
		handler.SendResponse(c,errno.ErrUserNotFound,nil)
		return
	}
	handler.SendResponse(c,nil,user)
复制代码

更新用户

逻辑与新增用户基本一致,不同点在于:除了接收用户信息的结构体外,还要接收用户的ID,将这些组合起来再进行查询

删除用户

  1. 读取参数
useId, _ := strconv.Atoi(c.Param("id"))

复制代码
  1. 删除数据库中的记录,并返回删除结果
	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)
	}
复制代码
  1. 用户列表结构体
	list := model.UserList{Lock: new(sync.Mutex),
		IdMap: make(map[uint64]*model.UserInfo, len(user))}
复制代码
  1. 错误信息通道以及完成信息通道
	errors:= make(chan error, 1)
	finish := make(chan bool, 1)
复制代码

测试

  • 添加用户

image.png

  • 结果

image.png

  • 查询用户

image.png

  • 修改用户

image.png

  • 查看用户列表

image.png

  • 删除用户

image.png

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享