
查询分类
接口实际设计

接口定位
接口名称:查询分类
Path: /user/category/list
Method: GET
作用:给前端返回"分类列表"
请求参数
-
type=1:菜品分类(dish category)
-
type=2:套餐分类(setmeal category)
分类类型:1 菜品分类;2 套餐分类
响应信息
-
code:integer(一般 1 表示成功,0/其他表示失败) -
data:object[](数组,列表 -
msg:string(消息)
代码开发
controller
@RestController("userCategoryController")
@RequestMapping("/user/category")
@Api(tags = "查询分类接口")
public class CategoryController {
@Autowired
private CategoryService categoryService;
/**
* 查询分类
* @param type
* @return
*/
@GetMapping("/list")
@ApiOperation("查询分类")
public Result<List<Category>> list(Integer type) {
List<Category> list = categoryService.list(type);
return Result.success(list);
}
}
@RestController("userCategoryController"):这个注解标记了一个控制器类,它是一个 Spring MVC 控制器,并且返回的内容会自动序列化成 JSON
@RequestMapping("/user/category"):所有请求路径基于对应的/user/category
controller接受前端所传递的对应的type信息内容然后调用service其中内容
service
@Override
public List<Category> list(Integer type) {
// 校验分类类型是否合法
if (type == null || (type != 1 && type != 2)) {
throw new IllegalArgumentException("分类类型非法");
}
return categoryMapper.list(type);
}
参数校验:
检查 type 是否为 null,针对异常与否决定抛出抛出 IllegalArgumentException 异常
查询数据:
- 如果
type参数有效(即type为 1 或 2),则通过categoryMapper.list(type)查询数据库中的分类数据,并返回结果。
Mapper


-
id="list":这是该 SQL 查询的标识符。 -
list是你在 Mapper 接口中对应的方法名称,表示查询分类列表。 -
resultType="com.sky.entity.Category":表示查询结果的映射类型,即查询结果会映射到com.sky.entity.Category这个类 -
where status = 1:- 这表示只查询
status = 1的分类,假设status字段用来标识分类的状态,比如是否启用。
- 这表示只查询
-
<if test="type != null">:-
if标签用于动态 SQL 生成。test="type != null"的意思是:如果方法中的type参数不为null,则会加入条件and type = #{type}。 -
关键点: 如果
type为null,这部分 SQL 就会被跳过,意味着查询条件中不会包括type。
-
-
and type = #{type}:- 如果
type不为null,这部分 SQL 会被加上。#{type}表示将type参数的值传递给 SQL 查询,用来过滤不同类型的分类。
- 如果
-
</if>:- 结束
if标签。
- 结束
-
order by sort asc, create_time desc:- 排序条件:首先按
sort升序排序,然后按create_time降序排序。通常,sort用来控制显示顺序,create_time用来按时间倒序展示最新的分类。
- 排序条件:首先按
根据分类id去进行实际查询菜品信息
接口实际设计

接口定位
-
接口路径:
/user/dish/list -
请求方式:
GET -
接口功能: 查询菜品列表
请求参数

查询参数:
- categoryId:分类 ID,用于指定查询某个特定分类的数据
响应信息

code:业务状态码
data:返回信息。数组内容,包含对应的菜品/套餐信息内容
-
categoryId(integer,可选):表示菜品或套餐所属的分类 ID。 -
createTime(string,可选):表示该菜品或套餐的创建时间,通常是一个日期时间字符串。 -
createUser(integer,可选):表示创建该菜品或套餐的用户 ID。 -
description(string,可选):菜品或套餐的描述。 -
id(integer,必填):该菜品或套餐的唯一标识符。 -
image(string,可选):该菜品或套餐的图片 URL 或路径。 -
name(string,必填):菜品或套餐的名称。 -
price(number,可选):该菜品或套餐的价格。 -
status(integer,必填):菜品或套餐的状态,通常0表示禁用,1表示启用。 -
updateTime(string,可选):最后更新时间,通常是一个日期时间字符串。 -
updateUser(integer,可选):最后更新该菜品或套餐的用户 ID
msg:提示信息
代码开发
controller

@RestController("userDishController"):表示这是一个 RESTful 风格的控制器,会返回 JSON 数据。
@RequestMapping("/user/dish"):处理请求基础路径
注入服务层
@Autowired
private DishService dishService;
接口方法
@GetMapping("/list")
@ApiOperation("根据分类查询菜品")
public Result<List<DishVO>> list(Long categoryId) {
Dish dish = new Dish();
dish.setCategoryId(categoryId);
dish.setStatus(StatusConstant.ENABLE); // 在查询时只获取启用的菜品
List<DishVO> list = dishService.listWithFlavor(dish);
return Result.success(list);
}
@GetMapping("/list"):
- 这个注解表示该方法处理
GET请求,路径为/user/dish/list
Long categoryId:
-
这是方法的参数,表示查询时需要传入一个
categoryId,即菜品的分类 ID。 -
该参数通过 URL 请求传递
创建Dish菜品对象,传递对应属性值,给service/Mapper其中来进行使用
Service

方法定义
public List<DishVO> listWithFlavor(Dish dish) {
// 查询符合条件的菜品
List<Dish> dishList = dishMapper.list(dish);
// 用于存储返回的结果
List<DishVO> dishVOList = new ArrayList<>();
List<Dish> dishList = dishMapper.list(dish);:
调用 dishMapper.list(dish) 查询符合条件的菜品数据
List<DishVO> dishVOList = new ArrayList<>();
创建一个空的 dishVOList,用于存储查询结果的转换数据
循环处理每个菜品
for (Dish d : dishList) {
DishVO dishVO = new DishVO();
BeanUtils.copyProperties(d, dishVO);
遍历查询结果 dishList 中的每个菜品。
创建一个新的 DishVO 对象,用于存储当前菜品的转换结果。
使用 BeanUtils.copyProperties() 将 Dish 对象的数据复制到 DishVO 对象中。这样 dishVO 就会包含 dish 的所有属性
查询菜品的口味信息
// 根据菜品ID查询对应的口味
List<DishFlavor> flavors = dishFlavorMapper.getByDishId(d.getId());
调用 dishFlavorMapper.getByDishId(d.getId()) 方法,根据当前菜品的 id 查询该菜品的口味信息。getByDishId(d.getId()) 返回的是一个 List<DishFlavor>,即该菜品的多个口味
设置口味信息将菜品对象加入结果列表返回结果
Mapper

根据分类id来查询套餐接口
接口实际设计
接口定位

-
接口路径 :
/user/setmeal/list -
请求方式 :
GET -
功能说明:根据分类 ID 查询套餐列表。
请求参数

categoryId (类型:string):
- 描述:分类 ID,用于指定查询哪个分类下的套餐。
返回响应

code (integer 类型) 状态码,通常用来标识接口是否成功执行
data这是实际返回的数据,包含了一个数组,数组内每个元素是一个套餐对象
-
categoryId(integer):表示套餐所属分类的 ID。 -
createTime(string):表示套餐创建时间,通常是一个日期时间字符串。 -
createUser(integer):表示创建该套餐的用户 ID。 -
description(string):套餐的描述,通常是字符串。 -
id(integer):套餐的唯一 ID。 -
image(string):套餐的图片链接或路径。 -
name(string):套餐的名称。 -
price(number):套餐的价格。 -
status(integer):套餐的状态,通常1表示启用,0表示禁用。 -
updateTime(string):表示套餐的最后更新时间,通常是一个日期时间字符串。 -
updateUser(integer):表示最后更新该套餐的用户 ID。
msg:提示信息内容
代码开发
controller

注解分析
@RestController("userSetmealController")
表示该类是一个控制器,并且返回的是 JSON 数据(而不是视图)。
@RequestMapping("/user/setmeal")
该注解指定了类级别的 URL 路径前缀,表示所有方法的路径都以 /user/setmeal 开头
@Autowired
@Autowired注解表示将SetmealService注入到该控制器中
list 方法分析
@GetMapping("/list")
@ApiOperation("根据分类id查询套餐")
public Result<List<Setmeal>> list(Long categoryId) {
Setmeal setmeal = new Setmeal();
setmeal.setCategoryId(categoryId);
setmeal.setStatus(StatusConstant.ENABLE); // 只查询启用状态的套餐
List<Setmeal> list = setmealService.list(setmeal);
return Result.success(list);
}
@GetMapping("/list"):该方法用于处理 GET 请求,路径为 /user/setmeal/list,即客户端访问 /user/setmeal/list 时会调用该方法
方法体
-
Setmeal setmeal = new Setmeal();:- 创建一个新的
Setmeal对象,用来封装查询条件。
- 创建一个新的
-
setmeal.setCategoryId(categoryId);:- 设置查询的分类 ID,
categoryId是方法参数,表示需要查询该分类下的套餐。
- 设置查询的分类 ID,
-
setmeal.setStatus(StatusConstant.ENABLE);:- 设置套餐的状态为启用(
StatusConstant.ENABLE)。这意味着只查询状态为启用的套餐,StatusConstant.ENABLE是一个常量,通常为1,表示该套餐处于启用状态。
- 设置套餐的状态为启用(
-
List<Setmeal> list = setmealService.list(setmeal);:- 调用
setmealService.list(setmeal)查询符合条件的套餐。list(setmeal)方法接受一个Setmeal对象作为查询条件,查询所有符合该条件的套餐列表。
- 调用
-
return Result.success(list);:- 将查询到的套餐列表
list包装成Result对象并返回。Result.success(list)表示返回一个成功的响应,list是查询结果
- 将查询到的套餐列表
Service

Mapper


id="list" 表示该查询方法的标识符,
parameterType="Setmeal" 表示该查询接受一个 Setmeal 类型的参数。
resultType="Setmeal" 表示查询结果会映射成 Setmeal 类型。
动态 SQL拼接条件来进行实际查询操作