Skip to content
本页目录

七、后台管理端【菜品管理】接口

菜品管理: 菜品单位, 菜品信息, 菜品类目

7.1 创建菜品管理表

各表名: dishes_unit 菜品单位 dishes_category 菜品类目 dishes_data 菜品信息

菜品单位

  • 表名: dishes_unit

  • 表字段:

    字段名字段类型备注
    idint菜品单位id 主键 自增
    labelvarchar单位名
    valuevarchar单位值
    uidvarchar商家ID

菜品类目

  • 表名: dishes_category

  • 表字段:

    字段名字段类型备注
    idint菜品类目id 主键 自增
    labelvarchar类目名
    valuevarchar类目值
    uidvarchar商家ID
    rankint排序值

菜品信息

  • 表名: dishes_data

  • 表字段:

    字段名字段类型备注
    idint菜品信息id 主键 自增
    cidint菜品类目ID
    categoryvarchar菜品类目名
    imagevarchar菜品图片
    namevarchar菜品名
    monthlysaleint月销量
    unitpricefloat菜品单价
    unitvarchar菜品单位
    timevarchar上架时间
    onsaletinyint菜品状态 0下架 1上架 默认为1
    uidvarchart商家ID
    rankint排序值

7.2 菜品单位接口

核心API: 添加菜品单位 获取菜品单位

添加菜品单位

  • 请求地址: /dish/unit
  • 请求方法:POST
  • 请求参数: label: 单位名 , value: 单位值
  • 逻辑: 1. 不能添加重复单位 2. 校验不能为空
ts
// * 添加菜品单位
router.post('/unit', ParamsValidator(dishesUnitRule) ,async (ctx) => {
  // 根据当前登录 用户ID拉取用户信息
  const { uid } = ctx.state.user
  const { label, value } = ctx.request.body
  const db = flq.from('dishes_unit')
  try {
    // 查询数据库是否已存在该类目
    const unitInfo = await db.where({ label, uid }).first()
    if (unitInfo) return ctx.fail('该单位已存在', 202)
    // 添加单位
    await db.value({ label, value, uid }).add()
    ctx.success()
  } catch (error) {
    ctx.error('添加失败')
  }
})

获取菜品单位

  • 请求地址: /dish/unit
  • 请求方法:GET
  • 请求参数: label:单位名
  • 逻辑: 1. 可根据单位名模糊查询 2. 返回菜品单位列表
ts
// * 获取菜品单位
router.get('/unit', async (ctx) => {
  const { uid } = ctx.state.user
  const { label } = ctx.query as any
  try {
    const data = await flq.from('dishes_unit').where({ uid }).find()
    ctx.success(data)
  } catch (error) {
    ctx.error('获取错误')
  }
})

7.3 菜品类目接口

核心API: 添加菜品类目 获取菜品类目 删除菜品类目 修改菜品类目

解释: 菜品类目是每个菜品对应的所属父级 每个菜品在添加时都需要由类目下级去添加

添加菜品类目

  • 请求地址: /dish/category
  • 请求方法:POST
  • 请求参数: label- 类目名 value - 类目值 rank - 排序值
  • 逻辑: 1. 排序值用于类目显示顺序 2. 类目唯一 3. 校验参数有效性
ts
// 后台 - 添加菜品类目
router.post('/category',Validator(dishesCateRule), async (ctx) => {
  // 根据当前登录 用户ID拉取用户信息
  const { uid } = ctx.state.user
  const { label, value, rank } = ctx.request.body
  const db = flq.from('dishes_category')
  try {
    // 查询数据库是否已存在该类目
    const cateInfo = await db.where({ label, uid }).first()
    if (cateInfo) return ctx.fail('类目已存在', 202)
    // 添加类名
    await db.value({ label, value, rank , uid }).add()
    ctx.success()
  } catch (error) {
    ctx.error('添加失败')
  }
})

获取菜品类目

  • 请求地址: /dish/category
  • 请求方法:GET
  • 请求参数: page- 页码 pageSize - 每页条数 rank - 排序值
  • 逻辑: 1. 排序值用于类目显示顺序 2. 类目唯一 3. 校验参数有效性
ts
// 后台 - 获取菜品类目
router.get('/category', async (ctx) => {
  // 根据当前登录 用户ID拉取用户信息
  const { uid } = ctx.state.user
  const { page = 1, pageSize = 10 } = ctx.query
  const db = flq.from('dishes_category')
  try {
    // 查询数据库是否已存在该类目
    const cateList = await db.where({ uid }).limit({ page: page as number, size: pageSize as number }).order({ rank: 1 }).find()
    const total = await db.where({ uid }).count()
    const result = { list: cateList, page: Number(page), pageSize: Number(pageSize), total: total }
    ctx.success(result)
  } catch (error) {
    ctx.error('获取失败')
  }
})

删除菜品类目

  • 请求地址: /dish/category
  • 请求方法:delete
  • 请求参数: id - 类目ID
  • 逻辑: 1. 校验id是否正确【只能删除自己的类目】 2. 若当前类目 有已添加菜品禁止删除
ts
// 后台 - 删除菜品类目
router.delete('/category', Validator(dishesCate2Rule) ,async (ctx) => {
  const { id } = ctx.query
  const { uid } = ctx.state.user
  const db = flq.from('dishes_category')
  try {
    // 判断当前id是否属于自己
    const data = await db.where({ id: id as string, uid }).first()
    if (!data) return ctx.fail('操作失败', 202)
    // 判断当前类目是否有对应菜品
    
    // 删除对应类目
    const { affectedRows } = await db.where({ id: id as string, uid }).remove()
    if (!affectedRows) return  ctx.fail('id有误', 202)
    ctx.success()
  } catch (error) {
    ctx.error('删除失败')
  }
})

修改菜品类目

  • 请求地址: /dish/category
  • 请求方法:put
  • 请求参数: id - 类目ID label- 类目名 value - 类目值 rank - 排序值
  • 逻辑: 1. 校验参数有效性 2. 类目名不能修改重复 3. 类目名 有修改 对应菜品数据更新

代码略 :happy:

ts
// 后台 - 修改菜品类目
router.put('/category', Validator(dishesCate3Rule) ,async (ctx) => {
  // 1. 解析参数
  const { id, label, rank } = ctx.data
  const { uid } = ctx.state.user
  // 2. 检查类目label是否重复
  const db = flq.from('dishes_category')
  const result = await db.where({ uid, label }).first()
  if (result && result.id != id) return ctx.fail('类目名已重复', 202)
  // 3. 修改类目
  const { affectedRows } = await db.where({ id, uid }).set({ label, value: label, rank }).update()
  if (!affectedRows) return ctx.fail('id有误', 202 )
  // 4. 判断label是否有修改 -> 更新对应菜品
  if (!result) {
    await flq.from('dishes_data').where({ cid: id, uid }).set({ category: label }).update()
  }
  ctx.success()
})

7.4 菜品信息接口

核心API: 添加菜品 获取菜品数据 上下架菜品 编辑菜品 获取菜品详情信息

添加菜品

  • 请求地址: /dish/data

  • 请求方法:POST

  • 请求参数:

    cid 类目iD category 类目名 image 菜品图 name 菜品名

    unitprice 单价 unit 单位 rank 排序值

  • 逻辑: 1. 校验参数有效性 2. 使用DayJS生成时间

ts
// * 添加菜品
router.post('/data', ParamsValidator(dishesDataRule), async (ctx) => {
  const { cid, category, image, name, unitprice, unit, rank } = ctx.request.body
  const { uid } = ctx.state.user
  const time = dayjs().format('YYYY-MM-DD hh:mm:ss')
  try {
    // 新增
    await flq.from('dishes_data').value({ cid, category, image, name, unitprice, unit, time, onsale: 1, uid }).add()
    ctx.success()
  } catch (error) {
    console.log(error)
    ctx.error('添加失败')
  }
})

获取菜品数据

  • 请求地址: /dish/data
  • 请求方法:GET
  • 请求参数: page 页码 pageSize 每页条数 state 菜品状态 name 菜品名
  • 逻辑: 1. 校验参数有效性 2. 分页 + 排序 3. 菜品状态查询 4. 菜品名模糊查询
ts
// * 获取菜品数据 【页码、每页条数、菜品状态、菜品名、类目id】
router.get('/data' ,async (ctx) => {
  const { page = 1, pageSize = 10, state = 1, name = '', cid } = ctx.query as Record<string, any>
  const { uid } = ctx.state.user
  const db = flq.from('dishes_data').where({ uid, cid , onsale: state, name: { com: 'LIKE', val: `%${name}%` } }).limit({ page, size: pageSize }).order({ rank: 1 }).foundRows()
  try {
    // 查询菜品数据
    const data = await db.find()
    const result = { list: data, page: page - 0, pageSize, total: db.total }
    ctx.success(result)
  } catch (error) {
    ctx.error('获取失败')
  }
})

上下架菜品

  • 请求地址: /dish/data/status
  • 请求方法:PUT
  • 请求参数: id 菜品id state 菜品状态
  • 逻辑: 1. 校验参数有效性 2. 只能修改自己的菜品

代码略 :happy:

编辑菜品

  • 请求地址: /dish/data

  • 请求方法:PUT

  • 请求参数:

    id 菜品ID cid 类目iD category 类目名

    image 菜品图 name 菜品名 unitprice 单价 unit 单位 rank 排序值

  • 逻辑: 1. 校验参数有效性 2. 只能修改自己的菜品

**代码略 ** :happy:

获取菜品详情信息

  • 请求地址: /dish/data/:id
  • 请求方法:GET
  • 请求参数: :id 菜品id
  • 逻辑: 1. 根据菜品id查询详细信息
ts
// * 获取菜品详情信息 动态路由
router.get('/data/:id', async (ctx) => {
  const { id } = ctx.params
  const { uid } = ctx.state.user
  try {
    // 检查ID是否正确
    const dish = await flq.from('dishes_data').where({ uid, id }).first()
    if (!dish) return ctx.fail('id有误')
    ctx.success(dish)
  } catch (error) {
    ctx.error('查询失败')    
  }
})