瑞吉外卖-套餐管理、短信、验证码

套餐管理

新增套餐

image-20220816094904638

代码准备:

image-20220816100013442

代码的交互过程:

image-20220816100551172

步骤一,已经在新增菜品中实现完成。

步骤二:

添加菜品时,所发送的请求:

image-20220816105907365

DishController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 添加套餐时,显示套餐中所对应的菜品
*/
@GetMapping("/list")
public R<List<Dish>> list(Dish dish){

LambdaQueryWrapper<Dish> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//根据分类id查询dish表中都有哪些菜品
lambdaQueryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
lambdaQueryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);

//添加状态,查询状态为1的,1表示起售
lambdaQueryWrapper.eq(Dish::getStatus,1);
List<Dish> list = dishService.list(lambdaQueryWrapper);

return R.success(list);
}

显示成功:

image-20220816105947613

步骤四和五,已经实现完成,

步骤六:

点击保存时发送的请求为:

image-20220816110048198

在这个保存套餐的过程中,不是普通的保存,所以不能用自带的方法,因为要同时保存两个表:setmeal和setmeal_dish两个表,因此在SermealService中重写一个保存的方法为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {

@Autowired
private SetmealDishService setmealDishService;

@Override
@Transactional
public void saveWithDish(SetmealDto setmealDto) {
//保存到套餐列表
this.save(setmealDto);
//保存套餐和菜品对应关系的列表:setmeal_dish
//获取套餐中的菜品
List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
//设置套餐中菜品的套餐id
setmealDishes.stream().map((item)->{
item.setSetmealId(setmealDto.getId());
return item;
}).collect(Collectors.toList());
//保存到setmeal-dish表中
setmealDishService.saveBatch(setmealDishes);
}
}

SetmealController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 套餐管理
*/
@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {

@Autowired
private SetmealService setmealService;

@Autowired
private SetmealDishService setmealDishService;

/**
* 新增套餐
*/
@PostMapping
public R<String> save(@RequestBody SetmealDto setmealDto){
setmealService.saveWithDish(setmealDto);
return R.success("成功添加套餐");
}

}

套餐信息分页查询

与菜品管理中的分页查询一致

代码为:

SetmealController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* 分页
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> page(int page,int pageSize,String name){

//构造分页构造器
Page<Setmeal> pageInfo = new Page<>();

//由于setmeal中有分类id,但是页面上要展示分类名称,所以要用setmealDto
Page<SetmealDto> setmealDtoPage = new Page<>();

//条件查询,根据名字查询套餐
LambdaQueryWrapper<Setmeal> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(name!=null,Setmeal::getName,name);
lambdaQueryWrapper.orderByDesc(Setmeal::getCreateTime);

//执行分页查询
setmealService.page(pageInfo,lambdaQueryWrapper);

//属性复制,忽略records属性,因为records是所有的套餐的数据链表,先不拷贝过去,因为要修改里面的套餐id为套餐名称
BeanUtils.copyProperties(pageInfo,setmealDtoPage,"records");
//获取records以便修改
List<Setmeal> records = pageInfo.getRecords();


List<SetmealDto> setmealDtoList = records.stream().map((item)->{
///新建setmealDto对象
SetmealDto setmealDto = new SetmealDto();
//将每个套餐项拷贝
BeanUtils.copyProperties(item,setmealDto);
//通过分类id获取分类名称
Long categoryId = item.getCategoryId();
Category category = categoryService.getById(categoryId);
if (category!=null){
String categoryName = category.getName();
//设置分类名称
setmealDto.setCategoryName(categoryName);
}
return setmealDto;
}).collect(Collectors.toList());

setmealDtoPage.setRecords(setmealDtoList);

return R.success(setmealDtoPage);
}

删除套餐

需求分析:

image-20220816135731833

由于删除套餐前要确定商品是否是停售,因此在解决删除功能之前要先解决停售和启售的代码。

停售(批量停售)和启售(批量启售)的代码:

SetmealController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 停售和启售
*/
@PostMapping("/status/{status}")
public R<String> sale(@PathVariable("status") Integer status,@RequestParam List<Long> ids){
for (Long id:ids){
//获取套餐
Setmeal setmeal = setmealService.getById(id);
//设置状态
setmeal.setStatus(status);
//将新状态更新数据库
setmealService.updateById(setmeal);
}
return R.success("修改成功");
}

删除和批量删除的代码:

SetmealServiceimpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//删除套餐和套餐菜品关联的表
@Override
@Transactional
public void deleteWithDish(List<Long> ids) {
//select count(*) from setmeal where id in (1,23) and status = 1;
//判断该套餐是否可以删除,也就是是否停售
LambdaQueryWrapper<Setmeal> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(Setmeal::getId,ids);
lambdaQueryWrapper.eq(Setmeal::getStatus,1);
int count = this.count(lambdaQueryWrapper);
if (count>0){
//如果不是停售,则不能删除,抛出业务异常
throw new CustomException("该套餐是启售状态,不能删除");
}else {
//可以删除,删除套餐
this.removeByIds(ids);
//删除套餐菜品关联表
//delete from setmeal_dish where setmeal_id in ?;
LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
lambdaQueryWrapper1.in(SetmealDish::getSetmealId,ids);
setmealDishService.remove(lambdaQueryWrapper1);
}
}

SetmealController.java

1
2
3
4
5
6
7
8
/**
* 删除套餐
*/
@DeleteMapping
public R<String> delete(@RequestParam List<Long> ids){
setmealService.deleteWithDish(ids);
return R.success("删除套餐成功");
}

修改套餐

需求分析

在套餐管理列表页面点击修改按钮,跳转到修改套餐页面,在修改页面回显套餐相关信息并进行修改,最后点击确定按钮完成修改操作

代码开发-梳理交互过程

在开发代码之前,需要梳理一下修改套餐时前端页面( add.html)和服务端的交互过程:

1、页面发送ajax请求,请求服务端获取分类数据,用于套餐分类下拉框中数据展示

2、页面发送ajax请求,请求服务端,根据id查询当前套餐信息,用于套餐信息回显

SetmealController处理

1
2
3
4
5
6
7
//根据Id查询套餐信息
@GetMapping("/{id}")
public R<SetmealDto> getById(@PathVariable Long id){
SetmealDto setmealDto=setmealService.getByIdWithDish(id);

return R.success(setmealDto);
}

SetmealServiceImpl添加getByIdWithDish方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
public SetmealDto getByIdWithDish(Long id) {
//查询套餐基本信息
Setmeal setmeal = this.getById(id);
SetmealDto setmealDto = new SetmealDto();
BeanUtils.copyProperties(setmeal, setmealDto);

//查询套餐菜品信息
LambdaQueryWrapper<SetmealDish> queryWrapper=new LambdaQueryWrapper<>();
queryWrapper.eq(SetmealDish::getSetmealId,setmeal.getId());
List<SetmealDish> list = setmealDishService.list(queryWrapper);

setmealDto.setSetmealDishes(list);
return setmealDto;
}

以上进行了回显:

image-20221010131822976

点击保存:

image-20221010131900053

1
2
3
4
5
6
7
8
/**
* 套餐修改后点击保存
*/
@PutMapping
public R<String> update(@RequestBody SetmealDto setmealDto){
setmealService.updateWithDish(setmealDto);
return R.success("修改成功");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* 修改套餐
* @param setmealDto
*/
public void updateWithDish(SetmealDto setmealDto){
//更新setmeal表的基本信息
this.updateById(setmealDto);

//更新套餐和菜品关联表
//先清楚套餐关联的菜品
LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(SetmealDish::getSetmealId,setmealDto.getId());
setmealDishService.remove(lambdaQueryWrapper);

List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();

//再重新加入修改后的菜品
setmealDishes.stream().map((item)->{
item.setSetmealId(setmealDto.getId());
return item;
}).collect(Collectors.toList());

//保存到关联表中
setmealDishService.saveBatch(setmealDishes);

}

订单明细

发送的请求

image-20220818221900343

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* 后台展示订单明细
* @param page
* @param pageSize
* @param orderId
* @param beginTime
* @param endTime
* @return
*/
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String orderId, String beginTime, String endTime ){

//构造分页构造器
Page<Orders> pageInfo = new Page(page, pageSize);
//由于要显示用户所以使用OrderDto显示用户名字
Page<OrderDto> dtoPage = new Page<>();
//查询订单
LambdaQueryWrapper<Orders> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(orderId!=null,Orders::getNumber,orderId);
if(beginTime!=null&&endTime!=null){
lambdaQueryWrapper.ge(Orders::getOrderTime,beginTime);
lambdaQueryWrapper.le(Orders::getOrderTime,endTime);
}
lambdaQueryWrapper.orderByDesc(Orders::getOrderTime);
//执行查询
orderService.page(pageInfo,lambdaQueryWrapper);
//复制
BeanUtils.copyProperties(pageInfo,dtoPage,"records");
List<Orders> orders = pageInfo.getRecords();
List<OrderDto> dtoList = orders.stream().map((item)->{
OrderDto orderDto = new OrderDto();
BeanUtils.copyProperties(item,orderDto);
String name="用户"+item.getUserId();
orderDto.setUserName(name);

return orderDto;
}).collect(Collectors.toList());
dtoPage.setRecords(dtoList);
return R.success(dtoPage);
}

瑞吉外卖-套餐管理、短信、验证码
http://example.com/2022/08/16/瑞吉外卖-day04/
作者
zlw
发布于
2022年8月16日
许可协议