设为首页 加入收藏

TOP

瑞吉外卖day4(一)
2023-07-25 21:25:15 】 浏览:41
Tags:吉外卖 day4

菜品管理业务开发

文件上传与下载

文件上传

介绍

 服务端要接收客户端页面上传的文件,通常都会使用Apache的两个组件

1.commons-file upload

2.commons-io

Spring框架在spring-web包中对文件上传进行了封装。只需要在Controller的方法中声明一个MultipartFile类型的参数即可接受上传的文件

代码实现

@Value("${reggie.path}")
    private String basePath;
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
        //file是一个临时文件,需要把他转存到指定文件,否则本次请求完成后会被删除
        log.info("上传的文件{}",file.toString());
        //原始文件名
        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.mkdirs();
        }

        try {
            file.transferTo(new File(basePath+fileName));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return R.success(fileName);
    }

upload方法里的形参名要保证与前端提交的表单名一致

在yml配置文件中定义路径变量path

文件下载

 代码实现

 

 @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");//设置文件写入类型

            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len=fileInputStream.read(bytes))!=-1){//len:m每次读取的有效字节数当len=-1表示读取到文件末尾
                outputStream.write(bytes,0,len);//**写出指定长度字节数组**:`write(byte[] b, int off, int len)` ,每次写出从off索引开始,len个字节,
                outputStream.flush();
            }
            outputStream.close();
            fileInputStream.close();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

新增菜品功能

需求分析

后台系统中可以管理菜品信息,通过新增功能来添加一个新的菜品,在添加菜品时需要选择当前菜品所属菜品分类,并且需要上传菜品图片,在移动端会按照菜品分类来展示对应的菜品信息

数据模型

 代码开发

准备工作:

实体类DishFlavor

Mapper接口DishFlavorMapper

业务层接口DishFlavorService

业务层实现类 DishFlavorServicelmpl控制层 DishController

交互过程:

1、页面(backend/page/food/ add.html)发送ajax请求,请求服务端获取菜品分类数据并展示到下拉框中

  /**
     *
     * @param category
     * @return
     */
    @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、页面发送请求进行图片上传,请求服务端将图片保存到服务器

3、页面发送请求进行图片下载,将上传的图片进行回显

4、点击保存按钮,发送ajax请求,将菜品相关数据以json形式提交到服务端

前端提交的json数据与dish实体类不是一一对应,需要定义dishDao类来接受数据

DTO:全称为Data Transfer Object,即数据传输对象,一般用于展示层和服务层之间的数据传输

@Data
public class DishDto extends Dish {

    private List<DishFlavor> flavors = new ArrayList<>();

    private String categoryName;

    private Integer copies;
}

 菜品信息分页查询

代码开发-梳理交互

 


1、页面(backend/page/food/list.html)发送ajax请求,将分页查询参数(page、pageSize,name)
提交到服务端,获取分页数据
2、页面发送请求,请求服务端进行图片下载,用于页面图片展示

代码实现

/**
* 菜品分页查询
* @param page
* @param pageSiz
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇聊一聊模板方法模式 下一篇java~"与运算"实现保留..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目