小小千想和您聊一聊

当前位置: 首页> 技术分享> 食品功能模块业务开发

食品功能模块业务开发

@author:Davie版权所有:北京千锋互联科技有限公司

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

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

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

创建食品功能模块
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)) //控制器

上一篇:HTML5工具初识之网页编辑器

下一篇:云计算自动化运维从入门到精通系列-部署centos

QQ技术交流群

千锋go语言官方①群
816085262

加入群聊