上节内容我们学习了添加食品种类,食品种类在操作中属于食品记录下的一个子属性。因此,这节内容我们来学习如何进行添加食品记录。
根据之前我们的学习内容和文档说明,我们把相对独立的功能模块进行单独的定义和实现。在本实战项目中,到目前为止,我们还没有定义和创建食品功能模块的业务逻辑处理器和功能实现结构体。
因此,首先我们创建并定义食品结构体如下所示:
创建食品功能模块
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)) //控制器