瑞吉外卖Day04

1.文件的上传下载

  @Value("${reggie.path}")private String basePath;/*** 文件上传** @param file* @return*/@PostMapping("/upload")public R<String> upload(MultipartFile file) {log.info("文件上传");//原始文件名String originalFilename = file.getOriginalFilename();String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//使用uuid重新生成文件名,防止文件被覆盖String filename = UUID.randomUUID().toString() + suffix;//创建目录对象File dir = new File(basePath);if (!dir.exists()) {//目录不存在创建dir.mkdir();}try {//将临时文件转存到指定位置file.transferTo(new File(basePath + filename));} catch (IOException e) {e.printStackTrace();}return R.success(filename);}

  /*** 文件下载*/@GetMapping("/download")public void download(String name, HttpServletResponse response) {try {//输入流,读入文件内容FileInputStream fileInputStream = new FileInputStream(basePath + name);//输出流,写回浏览器ServletOutputStream outputStream = response.getOutputStream();response.setContentType("image/jpeg");int len = 0;byte[] bytes = new byte[1024];while ((len = fileInputStream.read(bytes)) != -1) {outputStream.write(bytes, 0, len);outputStream.flush();}fileInputStream.close();outputStream.close();} catch (Exception e) {e.printStackTrace();} 

 2.新增菜品

2.1分类

   /*** 根据条件查询分类数据*/@GetMapping("/list")public R<List<Category>> list(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.2创建实体类

@Data
public class Dish {private Long id;//菜品名称private String name;//菜品分类idprivate Long categoryId;//菜品价格private BigDecimal price;//商品码private String code;//商品图片private String image;//描述信息private String description;//状态private Integer status;//顺序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;@TableLogicprivate Integer is_deleted;
}
@Data
public class DishFlavor implements Serializable {private Long id;private Long dishId;private String name;private String value;@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;@TableLogicprivate Integer is_deleted;}

dto

@Data
public class DishDto extends Dish {private List<DishFlavor> flavors=new ArrayList<>();private String categoryName;private Integer copies;
}

2.3service层

public interface DishService extends IService<Dish> {//新增菜品,同时插入菜品对应的口味public void saveWithFlavor(DishDto dishDto);
}

因为添加了@Transactional事务注解,所以主程序上添加事务驱动注解:

@Slf4j
@SpringBootApplication
@ServletComponentScan
@EnableTransactionManagement
public class ProductRuijiApplication {public static void main(String[] args) {SpringApplication.run(ProductRuijiApplication.class, args);log.info("程序启动成功");}
}

@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {@Autowiredprivate DishFlavorService dishFlavorService;/*** 新增菜品** @param dishDto*/@Override@Transactionalpublic void saveWithFlavor(DishDto dishDto) {//保存菜品的基本信息this.save(dishDto);Long dishId = dishDto.getId();//保存菜品口味List<DishFlavor> flavors = dishDto.getFlavors();flavors = flavors.stream().map(item -> {item.setDishId(dishId);return item;}).collect(Collectors.toList());dishFlavorService.saveBatch(flavors);}
}

2.4controller层

@Slf4j
@RestController
@RequestMapping("/dish")
public class DishController {@Autowiredprivate DishService dishService;@Autowiredprivate DishFlavorService dishFlavorService;@PostMapping()public R<String> save(@RequestBody DishDto dishDto){dishService.saveWithFlavor(dishDto);return R.success("新增菜品成功");}}

3.菜品分页查询

  @GetMapping("/page")public R<Page> page(int page, int pageSize, String name) {//分页构造器Page<Dish> pageInfo = new Page<>(page, pageSize);Page<DishDto> dishDtoPage = new Page<>();//条件构造器LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.like(name != null, Dish::getName, name);queryWrapper.orderByDesc(Dish::getUpdateTime);dishService.page(pageInfo, queryWrapper);//对象拷贝BeanUtils.copyProperties(pageInfo, dishDtoPage, "records");List<Dish> records = pageInfo.getRecords();List<DishDto> list = records.stream().map((item) -> {DishDto dishDto = new DishDto();//拷贝BeanUtils.copyProperties(item, dishDto);Long categoryId = item.getCategoryId();//分类idCategory category = categoryService.getById(categoryId);if (category!=null){String categoryName = category.getName();dishDto.setCategoryName(categoryName);}return dishDto;}).collect(Collectors.toList());dishDtoPage.setRecords(list);return R.success(dishDtoPage);}

4.修改菜品

4.1页面回显

因为需要查两张表,所以自定义查询

/*** 根据id查询菜品信息,以及口味信息** @param id*/@Overridepublic DishDto getWithFlavor(Long id) {//1.菜品基本信息Dish dish = this.getById(id);DishDto dishDto=new DishDto();BeanUtils.copyProperties(dish,dishDto);//2.菜品对应的口味信息LambdaQueryWrapper<DishFlavor> queryWrapper=new LambdaQueryWrapper<>();queryWrapper.eq(DishFlavor::getDishId,dish.getId());List<DishFlavor> flavors = dishFlavorService.list(queryWrapper);dishDto.setFlavors(flavors);return dishDto;}

回显查询

 /*** 根据id查询菜品id*/@GetMapping ("/{id}")public R<DishDto> get(@PathVariable("id") Long id){DishDto dishDto = dishService.getWithFlavor(id);return R.success(dishDto);}

5.批量删除

    @DeleteMappingpublic R<String> delete(String ids) {String[] split = ids.split(","); //将每个id分开//每个id还是字符串,转成LongList<Long> idList = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());dishService.removeByIds(idList);//执行批量删除log.info("删除的ids: {}", ids);return R.success("删除成功"); //返回成功}

6.起售与禁售

@PostMapping("/status/{st}")public R<String> setStatus(@PathVariable int st, String ids) {//处理string 转成LongString[] split = ids.split(",");List<Long> idList = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());//将每个id new出来一个Dish对象,并设置状态List<Dish> dishes = idList.stream().map((item) -> {Dish dish = new Dish();dish.setId(item);dish.setStatus(st);return dish;}).collect(Collectors.toList()); //Dish集合log.info("status ids : {}", ids);dishService.updateBatchById(dishes);//批量操作return R.success("操作成功");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/178123.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向电网巡检的多尺度目标检测算法研究-蛮不错的工作

面向电网巡检的多尺度目标检测算法研究 电网是国民经济发展的重要基础。为确保电网安全稳定运行&#xff0c;需定期开展电网巡检&#xff0c;及时发现并排除输电线路异常。随着无人机技术发展日渐成熟&#xff0c;已经可以支持从不同距离采集到高分辨率的电网巡检图像&#xff…

RedCap推动5G规模应用,紫光展锐赋能产业高质量发展

5G R17 RedCap作为面向中高速物联网场景的关键技术和解决方案&#xff0c;可以大幅降低终端的复杂度、成本和功耗。在当前国内5G应用规模化发展关键时期&#xff0c;5G R17 RedCap拥有广大的市场潜力与广泛的应用场景&#xff0c;将有助于推动5G规模应用、构建融通发展的5G生态…

黄金投资面对K线图有哪些好用的交易策略?

在现货黄金交易中&#xff0c;学会观察K线图能够帮助投资者进行市场分析&#xff0c;根据K线图呈现出来的市场走势制定交易策略&#xff0c;是技术分析的主要作用。在黄金买卖过程中掌握K线交易技巧能够提升理财效率&#xff0c;所以这也就成为了炒金者的必修课。 K线图是以交…

【23-24 秋学期】NNDL 作业7 基于CNN的XO识别

一、用自己的语言解释以下概念 &#xff08;一&#xff09;、局部感知、权值共享 &#xff08;1&#xff09;局部感知 定义&#xff1a;在进行卷积计算的时候&#xff0c;将图片划分为一个个的区域进行计算/考虑&#xff1b; 由于越是接近的像素点之间的关联性越强, 反之则越…

mac下vue-cli从2.9.6升级到最新版本

由于mac之前安装了 vue 2.9.6 的版本&#xff0c;现在想升级到最新版本&#xff0c;用官方给的命令&#xff1a; npm uninstall vue-cli -g 发现不行。 1、究其原因&#xff1a;从vue-cli 3.0版本开始原来的npm install -g vue-cli 安装的都是旧版&#xff0c;最高到2.9.6。安…

SLAM中提到的相机位姿到底指什么?

不小心又绕进去了&#xff0c;所以掰一下。 以我个人最直观的理解&#xff0c;假设无旋转&#xff0c;相机在世界坐标系的(5,0,0)^T的位置上&#xff0c;所谓“位姿”&#xff0c;应该反映相机的位置&#xff0c;所以相机位姿应该如下&#xff1a; Eigen::Matrix4d T Eigen::M…

ubuntu 18.04安裝QT+PCL+VTK+Opencv

资源 qt5.14.1:qt5.14.1.run opencv4.5.5:opecv4.5.5压缩包 1.国内换中科大源&#xff0c;加快下载速度 cd /etc/apt/ sudo gedit sources.list 替换成如下内容 deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse deb-src https://mirro…

初试 jmeter做压力测试

一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试&#xff0c;他可以帮助我们发现系统中的瓶颈问题&#xff0c;减少发布到生产环境后出问题的几率&#xff1b;预估系统的承载能力&#xff0c;使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步…

《QT从基础到进阶·二十八》QProcess使用,从一个exe程序启动另一个exe程序

QString exePath QCoreApplication::applicationDirPath(); //获取要启动的另一个exe路径 exePath exePath “/OffLineProcess.exe”; //路径exe名称 QProcess* Process new QProcess; //创建新的进程 Process->start(exePath)…

【Springboot】基于注解式开发Springboot-Vue3整合Mybatis-plus实现分页查询(二)——前端el-pagination实现

系列文章 【Springboot】基于注解式开发Springboot-Vue3整合Mybatis-plus实现分页查询—后端实现 文章目录 系列文章系统版本实现功能实现思路后端传入的数据格式前端el-table封装axois接口引入Element-plus的el-pagination分页组件Axois 获取后台数据 系统版本 后端&#xf…

如何创建标准操作规程(SOP)[+模板]

创建、分发和管理流程文档和逐步说明的能力是确定企业成功的关键因素。许多组织依赖标准操作规程&#xff08;SOP&#xff09;作为基本形式的文档&#xff0c;指导他们的工作流程操作。 然而&#xff0c;SOP不仅仅是操作路线图&#xff1b;它们就像高性能车辆中的先进GPS系统一…

易货:一种古老而有效的商业模式

在当今的商业世界中&#xff0c;我们常常听到关于电子商务、互联网和社交媒体等新技术的讨论。然而&#xff0c;尽管这些新技术为我们的日常生活带来了许多便利&#xff0c;但它们并没有完全取代传统的商业模式。其中&#xff0c;易货模式是一种古老而有效的商业模式&#xff0…