七、后台管理端【菜品管理】接口
菜品管理:
菜品单位
,菜品信息
,菜品类目
7.1 创建菜品管理表
各表名: dishes_unit
菜品单位 dishes_category
菜品类目 dishes_data
菜品信息
菜品单位
表名:
dishes_unit
表字段:
字段名 字段类型 备注 id int 菜品单位id 主键 自增 label varchar 单位名 value varchar 单位值 uid varchar 商家ID
菜品类目
表名:
dishes_category
表字段:
字段名 字段类型 备注 id int 菜品类目id 主键 自增 label varchar 类目名 value varchar 类目值 uid varchar 商家ID rank int 排序值
菜品信息
表名:
dishes_data
表字段:
字段名 字段类型 备注 id int 菜品信息id 主键 自增 cid int 菜品类目ID category varchar 菜品类目名 image varchar 菜品图片 name varchar 菜品名 monthlysale int 月销量 unitprice float 菜品单价 unit varchar 菜品单位 time varchar 上架时间 onsale tinyint 菜品状态 0下架 1上架 默认为1 uid varchart 商家ID rank int 排序值
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
- 类目IDlabel
- 类目名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
类目iDcategory
类目名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
菜品idstate
菜品状态 - 逻辑: 1. 校验参数有效性 2. 只能修改自己的菜品
代码略 :happy:
编辑菜品
请求地址:
/dish/data
请求方法:
PUT
请求参数:
id
菜品IDcid
类目iDcategory
类目名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('查询失败')
}
})