第022节:用户列表、订单列表功能开发

上节内容我们在统计功能中引入了Redis缓存功能。Redis可以帮助我们实现将数据存储在在内存中,提高请求处理能力。本节内容,我们继续学习开发用户列表功能和订单列表功能。

用户列表功能开发

在小幺鸡文档中,我们可以查询得到用户列表接口的相关信息。

  • 用户列表接口:/v1/users/list

  • 携带参数:

    • offset:偏移量
    • limit:每次请求的记录条数
  • 请求示例:/v1/users/list?offset=0&limit=20

  • 路由注册
    在main.go文件中,使用app.Party("/v1/users")进行路由组解析。请求末级的url为list。请求类型为GET。因此,在UserController中定义func GetList(),用以来进行请求解析。路由组解析如下:

    userService := service.NewUserService(engine)
    user := mvc.New(app.Party("/v1/users"))
    user.Register(
        userService,
        sessManager.Start,
    )
    user.Handle(new(controller.UserController))
  • Get请求方法定义

    func (uc *UserController) GetList() mvc.Result {
    
    offsetStr := uc.Ctx.FormValue("offset")
    limitStr := uc.Ctx.FormValue("limit")
    var offset int
    var limit int
    
    //判断offset和limit两个变量任意一个都不能为""
    if offsetStr == "" || limitStr == "" {
    
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_USERLIST,
                "message": utils.Recode2Text(utils.RESPMSG_ERROR_USERLIST),
            },
        }
    }
    
    offset, err := strconv.Atoi(offsetStr)
    limit, err = strconv.Atoi(limitStr)
    if err != nil {
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_USERLIST,
                "message": utils.Recode2Text(utils.RESPMSG_ERROR_USERLIST),
            },
        }
    }
    
    //做页数的限制检查
    if offset <= 0 {
        offset = 0
    }
    
    //做最大的限制
    if limit > MaxLimit {
        limit = MaxLimit
    }
    
    userList := uc.UserService.GetUserList(offset, limit)
    
    if len(userList) == 0 {
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_USERLIST,
                "message": utils.Recode2Text(utils.RESPMSG_ERROR_USERLIST),
            },
        }
    }
    
    //将查询到的用户数据进行转换成前端需要的内容
    var respList []interface{}
    for _, user := range userList {
        respList = append(respList, user.UserToRespDesc())
    }
    
    //返回用户列表
    return mvc.Response{
        Object: &respList,
    }
    }
  • 获取请求参数

    offsetStr := uc.Ctx.FormValue("offset")
    limitStr := uc.Ctx.FormValue("limit")
  • 服务功能实现UserService
    与UserController配合实现的是UserService,来实现需要的功能数据查询与操作。在UserService中定义GetUserList方法来获取用户列表,实现功能如下:

    func (uc *userService) GetUserList(offset, limit int) []*model.User {
    
    var userList []*model.User
    
    err := uc.Engine.Where("del_flag = ?", 0).Limit(limit, offset).Find(&userList)
    if err != nil {
        iris.New().Logger().Error(err.Error())
        panic(err.Error())
        return nil
    }
    return userList
    }
  • User用户实体转换为Json格式
    获取到User用户后,可以通过工具方法将用户User实体结构体转换为Json格式,定义实现转换格式的功能方法UserToRespDesc。该方法实现如下:

    func (user *User) UserToRespDesc() interface{} {
    respInfo := map[string]interface{}{
        "id":           user.Id,
        "user_id":      user.Id,
        "username":     user.UserName,
        "city":         user.CityName,
        "registe_time": utils.FormatDatetime(user.RegisterTime),
        "mobile":       user.Mobile,
        "is_active":    user.IsActive,
        "balance":      user.Balance,
        "avatar":       user.Avatar,
    }
    return respInfo
    }
  • 用户列表效果
    用户列表效果

订单列表功能开发

我们可以在小幺鸡文档:http://www.xiaoyaoji.cn/doc/yw9VTiEtz 查看到获取订单列表接口,我们根据接口信息开发用户订单列表功能。

  • 用户列表接口: /bos/orders

  • 请求类型:GET

  • 携带参数:

    • offset:偏移量
    • limit:每次请求的记录条数
  • 请求示例:/bos/orders?offset=0&limit=20

  • 路由注册:
    在main.go文件中,使用app.Party("/bos/orders/")路由组对用户订单进行路由解析。请求末级的url为/,请求类型为GET。我们在OrderController中定义func Get(),用来进行解析请求。路由组解析设置如下:

    orderService := service.NewOrderService(engine)
    order := mvc.New(app.Party("/bos/orders/"))
    order.Register(
    orderService,
    sessManager.Start,
    )
    order.Handle(new(controller.OrderController))//控制器
  • Get解析方法定义

    func (orderController *OrderController) Get() mvc.Result {
    
    iris.New().Logger().Info(" 查询订单列表 ")
    
    offsetStr := orderController.Ctx.FormValue("offset")
    limitStr := orderController.Ctx.FormValue("limit")
    var offset int
    var limit int
    
    //判断offset和limit两个变量任意一个都不能为""
    if offsetStr == "" || limitStr == "" {
    
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_ORDERLIST,
                "message": utils.Recode2Text(utils.RESPMSG_ERROR_ORDERLIST),
            },
        }
    }
    
    offset, err := strconv.Atoi(offsetStr)
    limit, err = strconv.Atoi(limitStr)
    if err != nil {
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_ORDERLIST,
                "message": utils.Recode2Text(utils.RESPMSG_ERROR_ORDERLIST),
            },
        }
    }
    
    //做页数的限制检查
    if offset <= 0 {
        offset = 0
    }
    
    //做最大的限制
    if limit > MaxLimit {
        limit = MaxLimit
    }
    
    orderList := orderController.Service.GetOrderList(offset, limit)
    
    if len(orderList) == 0 {
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_ORDERLIST,
                "message": utils.Recode2Text(utils.RESPMSG_ERROR_ORDERLIST),
            },
        }
    }
    
    //将查询到的用户数据进行转换成前端需要的内容
    var respList []interface{}
    for _, order := range orderList {
        respList = append(respList, order.UserOrder2Resp())
    }
    
    //返回用户列表
    return mvc.Response{
        Object: &respList,
    }
    }
  • 获取请求参数

    offsetStr := orderController.Ctx.FormValue("offset")
    limitStr := orderController.Ctx.FormValue("limit")
  • OrderService实现查询订单列表功能
    同UserService的实现一样,我们通过OrderService来定义GetOrderList方法实现对用户订单列表的查询,GetOrderList方法实现如下:

    func (orderService *orderService) GetOrderList(offset, limit int) []*model.UserOrder {
    
    var orderList []*model.UserOrder
    
    err := orderService.Engine.Where(" del_flag = 0 ").Limit(limit, offset).Find(&orderList)
    if err != nil {
        iris.New().Logger().Error(err.Error())
        panic(err.Error())
        return nil
    }
    return orderList
    }
  • 请求数据Json格式化
    获取到OrderService提供的*[]model.UserOrder数据以后,使用工具方法将UserOrder**对象转换为前端可接收的Jsoon格式,转换方法如下:

    func (this *UserOrder) UserOrder2Resp() interface{} {
    respDesc := map[string]interface{}{
        "id":                   this.Id,
        "total_amount":         this.SumMoney,
        "user_id":              this.User.UserName,          //用户名
        "status":               this.OrderStatus.StatusDesc, //订单状态
        "restaurant_id":        this.Shop.Id,                //商铺id
        "restaurant_image_url": this.Shop.ImagePath,         //商铺图片
        "restaurant_name":      this.Shop.Name,              //商铺名称
        "formatted_created_at": this.Time,
        "status_code":          0,
        "address_id":           this.Address.Id, //订单地址id
    }
    
    statusDesc := map[string]interface{}{
        "color":     "f60",
        "sub_title": "15分钟内支付",
        "title":     this.OrderStatus.StatusDesc,
    }
    
    respDesc["status_bar"] = statusDesc
    return respDesc
    }

原创文章,Golang中国出品,文章对应源码下载:https://www.qfgolang.com/?page_id=1973

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

学习交流群:点击这里给我发消息

QR code