基于SSM的订餐系统---超详细实现菜品套餐新增模块
新增套餐
需求分析:
后台系统可以管理套餐系统,通过新增套餐功能来添加一个新的套餐,在添加套餐时需要选择当前套餐所属的套餐分类和包含的菜品,并且需要上传套餐对应的图片,在客户端会按照套餐分类来展示对应的套餐。
数据模型:
新增套餐,就是将新增页面录入的套餐信息插入到setmeal表,还需要向setmeal_dish表插入套餐和菜品关联数据,所以在新增套餐时,涉及两个表。
代码开发-准备工作:
实体类 Setmeal、SetmealDish
DTO SetmealDto
Mapper接口 SetmealMapper、SetmealDishMapper
Service接口 SetmealService、SetmealDishService
Service实现类:SetmealServiceImpl、SetmealDishServiceImpl
控制层:SetmealController
交互过程:
1.页面发送ajax请求,请求服务端获取套餐分类数据并展示到下拉框 (前文已做)
2.页面发送ajax请求,请求服务端获取菜品分类并展示到菜品窗口中
3.页面发送ajax请求,根据菜品分类查询对应的菜品数据并展示到添加菜品窗口中
4.页面发送请求进行图片上传,请求服务端将图片保存到服务端(前文已做)
5.页面发送请求进行图片下载,将上传的图片进行回显(前文已做)
6.点击保存按钮,发送ajax请求,将套餐相关数据以json形式提交到服务端
代码开发:
1.页面发送ajax请求,请求服务端获取套餐分类数据并展示到下拉框 (前文已做)
@GetMapping("/list") //type=2
public R<List<Category>> getCategoryList(Category category){
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(category.getType()!=null,Category::getType,category.getType());
queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
List<Category> list = categoryService.list(queryWrapper);
return R.success(list);
}
2.页面发送ajax请求,请求服务端获取菜品分类并展示到菜品窗口中
@GetMapping("/list")//type=1
public R<List<Category>> getCategoryList(Category category){
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(category.getType()!=null,Category::getType,category.getType());
queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
List<Category> list = categoryService.list(queryWrapper);
return R.success(list);
}
3.页面发送ajax请求,根据菜品分类查询对应的菜品数据并展示到添加菜品窗口中
/**
* 根据分类id查对应的菜品数据
* @param dish
* @return
*/
@GetMapping("/list")
public R<List<Dish>> list(Dish dish){
Long categoryId = dish.getCategoryId();
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
List<Dish> list = dishService.list(queryWrapper);
return R.success(list);
}
4.页面发送请求进行图片上传,请求服务端将图片保存到服务端(前文已做)
5.页面发送请求进行图片下载,将上传的图片进行回显(前文已做)
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {
@Value("${reggie.path}")
private String basePath; //动态获取保存的地址
/**
* 文件上传
*/
@PostMapping("/upload")
public R<String> upload(MultipartFile file){ //此处参数名要与前端发送的一致
//使用UUID重新生成文件名称,防止文件名称重复
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
// 获得文件原始名称
String fileName = file.getOriginalFilename();
// 获得文件后缀名称
String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
// 生成最新的uuid文件名称
String newFileName = uuid + "."+ suffixName;
//创建一个目录文件
File saveFile = new File(basePath);
if(!saveFile.exists()){
//目录不存在,创建该目录
saveFile.mkdirs();
}
//file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除
try {
//将临时文件转存到指定位置
file.transferTo(new File(basePath + newFileName));
} catch (IOException e) {
e.printStackTrace();
}
return R.success(newFileName);
}
/**
* 文件下载
*/
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
try {
//输入流,通过输入流读取文件内容
FileInputStream fileInputStream = new FileInputStream(new File(basePath+name));
//输出流,通过输出流写回浏览器,在浏览器展示图片
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("image/jpeg");
byte[] bytes = new byte[1024];
int len=0;
while ((len = fileInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭资源
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.点击保存按钮,发送ajax请求,将套餐相关数据以json形式提交到服务端
Setmeal:
/**
* 套餐
*/
@Data
public class Setmeal implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//分类id
private Long categoryId;
//套餐名称
private String name;
//套餐价格
private BigDecimal price;
//状态 0:停用 1:启用
private Integer status;
//编码
private String code;
//描述信息
private String description;
//图片
private String image;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
//是否删除
private Integer isDeleted;
}
SetmealDish:
**
* 套餐菜品关系
*/
@Data
public class SetmealDish implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//套餐id
private Long setmealId;
//菜品id
private Long dishId;
//菜品名称 (冗余字段)
private String name;
//菜品原价
private BigDecimal price;
//份数
private Integer copies;
//排序
private Integer sort;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
//是否删除
private Integer isDeleted;
}
SetmealDto:
@Data
public class SetmealDto extends Setmeal {
private List<SetmealDish> setmealDishes;
private String categoryName;
}
SetmealController:
@PostMapping()
public R<String> save(@RequestBody SetmealDto setmealDto){
setmealService.saveWithSetmealDishes(setmealDto);
return R.success("添加成功");
}
SetmealService:
public interface SetmealService extends IService<Setmeal> {
public void saveWithSetmealDishes(SetmealDto setmealDto);
}
SetmealServiceImpl:
@Override
public void saveWithSetmealDishes(SetmealDto setmealDto) {
//保存套餐基本信息
this.save(setmealDto);
//保存套菜中菜品信息
//菜品信息
List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
//将套餐分类id加入
setmealDishes = setmealDishes.stream().map((item)->{
Long setmealId = setmealDto.getId();
item.setSetmealId(setmealId);
return item;
}).collect(Collectors.toList());
setmealDishService.saveBatch(setmealDishes);
}
清晨敲代码: 你好,如果同时整合了redis和ehcache,是不是就不能使用@Cache注解了呢?只能注入对应的cachemanager来缓存呢?
芝士味的椒盐: 文章内容丰富,条理清晰,值得一波关注,希望作者也指点我一番!
YoLo♪: 期待大佬回访
爪哇斗罗: 向大佬致敬,仰望大佬
今天也要写bug: 写的很详细,先收藏一波