第026节:食品功能模块业务开发

                           

上节内容我们学习了添加食品种类,食品种类在操作中属于食品记录下的一个子属性。因此,这节内容我们来学习如何进行添加食品记录。

根据之前我们的学习内容和文档说明,我们把相对独立的功能模块进行单独的定义和实现。在本实战项目中,到目前为止,我们还没有定义和创建食品功能模块的业务逻辑处理器和功能实现结构体。

因此,首先我们创建并定义食品结构体如下所示:

创建食品功能模块

type Food struct {
    Id          int           json:"item_id"     //食品id
    Name        string        json:"name"        //食品名称
    Description string        json:"description" //食品描述
    Rating      int           json:"rating"      //食品评分
    MonthSales  int           json:"month_sales" //月销量
    ImagePath   string        json:"image_path"  //食品图片地址
    Activity    string        json:"activity"    //食品活动
    Attributes  string        json:"attributes"  //食品特点
    Specs       string        json:"specs"       //食品规格
    CategoryId  int64         xorm:"index"       //食品种类ID
    Category    *FoodCategory xorm:"-"           //食品种类
    Restaurant  *Shop         xorm:"-"           //食品店铺信息
    DelFlag     int           json:"del_flag"    //是否已经被删除 0表示未删除 1表示1被删除
}

如上的结构体定义即是Food结构体的定义,对应的会在mysql数据库中生成food表格。

创建完成Food结构体以后,接下来创建处理请求的FoodController

FoodController定义及处理请求

  • FoodController定义如下

    type FoodController struct {
       Ctx iris.Context
       Service service.FoodService
    }
  • 获取食品记录总数

    • url:foods/count?restaurant_id=undefined
    • 请求类型:get
    • 请求说明:获取所有的食品记录总数
      该请求详细情况如上所列,因此我们应该在Controller中定义GetCount方法,具体方法定义及实现如下:
    func (fc *FoodController) GetCount() mvc.Result {
    
    result, err := fc.Service.GetFoodCount()
    if err != nil {
        return mvc.Response{
            Object: map[string]interface{}{
                "status": utils.RESPMSG_FAIL,
                "count":  0,
            },
        }
    }
    //查询成功
    return mvc.Response{
        Object: map[string]interface{}{
            "status": utils.RESPMSG_OK,
            "count":  result,
        },
    }
    }
    • FoodService的GetCount功能实现
      在controller中的GetCount方法中,调用了FoodService的方法来实现数据库查询并返回,FoodService中GetCount方法的定义和实现如下所示:
    func (fs *foodService) GetFoodCount() (int64, error) {
    count, err := fs.Engine.Count(new(model.Food))
    return count, err
    }
  • 获取食品列表

    • url:/shopping/v2/foods/
    • 请求类型:get
    • 请求说明:获取食品列表
      在controller中定义Get方法,该方法用于实现获取食品列表,FoodController中Get方法定义如下:
    func (fc *FoodController) Get() mvc.Result {
    offset, err := strconv.Atoi(fc.Ctx.Params().Get("offset"))
    limit, err := strconv.Atoi(fc.Ctx.Params().Get("limit"))
    if err != nil {
        offset = 0
        limit = 20
    }
    list, err := fc.Service.GetFoodList(offset, limit)
    if err != nil {
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_FOODLIST,
                "message": utils.Recode2Text(utils.RESPMSG_ERROR_FOODLIST),
            },
        }
    }
    //成功
    return mvc.Response{
        Object: &list,
    }
    }
    • FoodService的GetFoodList功能实现
      在controller中的Get方法中,调用了FoodService的方法来实现数据库查询并返回,FoodService中GetFoodList方法的定义和实现如下所示:
    func (fs *foodService) GetFoodList(offset, limit int) ([]model.Food, error) {
    foodList := make([]model.Food, 0)
    err := fs.Engine.Where(" del_flag  = 0 ").Limit(limit, offset).Find(&foodList)
    return foodList, err
    }
  • 添加食品记录

    • url:/shopping/v2/foods/
    • 请求类型:get
    • 请求说明:获取食品列表
      在controller中定义Get方法,该方法用于实现获取食品列表。在添加食品列表功能时,因为是和FoodCategory一起操作,因此我们把添加食品记录定义在CategoryController中进行实现,CategoryController中Get方法定义如下:
    func (cc *CategoryController) PostaAddfood() mvc.Result {
    
    var foodEntity AddFoodEntity
    err := cc.Ctx.ReadJSON(&foodEntity)
    if err != nil {
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_FOODADD,
                "message": utils.Recode2Text(utils.RESPMSG_ERROR_FOODADD),
            },
        }
    }
    
    var food model.Food
    food.Name = foodEntity.Name
    food.Description = foodEntity.Description
    food.ImagePath = foodEntity.ImagePath
    food.Activity = foodEntity.Activity
    food.CategoryId = int64(foodEntity.CategoryId)
    //food.Restaurant = foodEntity.RestaurantId
    food.DelFlag = 0
    food.Rating = 0 //初始评分为零
    
    isSuccess := cc.Service.SaveFood(food)
    if !isSuccess {
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  utils.RECODE_FAIL,
                "type":    utils.RESPMSG_ERROR_FOODADD,
                "message": utils.Recode2Text(utils.RESPMSG_ERROR_FOODADD),
            },
        }
    }
    
    return mvc.Response{
        Object: map[string]interface{}{
            "status":  utils.RECODE_OK,
            "success": utils.Recode2Text(utils.RESPMSG_SUCCESS_FOODADD),
        },
    }
    }
    • CategoryService的SaveFood功能实现
      在controller中的Get方法中,调用了CategoryService的方法来实现数据库查询并返回,CategoryService中SaveFood方法的定义和实现如下所示:
    func (cs *categoryService) SaveFood(food model.Food) bool {
    _, err := cs.Engine.Insert(&food)
    return err == nil
    }

Controller绑定

当我们所有的工作都做完以后,我们使用app进行食品模块的路由组解析和FoodController控制器的绑定。代码如下所示:

foodService := service.NewFoodService(engine)
foodMvc := mvc.New(app.Party("/shopping/v2/foods/"))
foodMvc.Register(
        foodService,
    )
foodMvc.Handle(new(controller.FoodController)) //控制器

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

发表评论

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

联系我们

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

QR code