瑞吉点餐 day01 技术点一:公共字段自动填充 技术点二:图片上传下载

技术点一:公共字段自动填充

mybatisPlus 插件:@TableField注解 + MyMetaObjectHandler 配置类

在设置 创建人、修改人时需要拿到本次请求发起人的id,获取该数据有两种方法:

1.该数据储存在 session 中,可以通过 session 直接获取

@Autowired
    private HttpSession session;

 

2.基于一次请求响应 tomcat服务器指挥创建一个线程来处理

可以通过 ThreadLocal(set/get) 进行获取 ,

1.建立ThreadLocal封装工具类

/**
 * 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
 */
public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
    /**
     * 设置值
     * @param id
     */
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }
    /**
     * 获取值
     * @return
     */
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

2.在过滤器中,当登录用户的  id ,往 TreadLocal 中设置 id

 BaseContext.setCurrentId((Long)empSession);

3.在 MyMetaObjectHandler 获取 id 并赋值 

@TableField(fill = FieldFill.xxxx)
    private Long createUser;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject,
                "createTime",
                LocalDateTime.class,
                LocalDateTime.now());
        this.strictInsertFill(metaObject,
                "updateTime",
                LocalDateTime.class,
                LocalDateTime.now());

        this.strictInsertFill(metaObject,
                "createUser",
                Long.class,
                BaseContext.getCurrentId());
        this.strictInsertFill(metaObject,
                "updateUser",
                Long.class,
                BaseContext.getCurrentId());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.strictInsertFill(metaObject,
                "updateTime",
                LocalDateTime.class,
                LocalDateTime.now());
        this.strictInsertFill(metaObject,
                "updateUser",
                Long.class,
                BaseContext.getCurrentId());
    }
}

 

技术点二:图片上传下载

后台通过 MultipartFile 接受文件,通过 IO 流的操作将文件写入服务器的磁盘

1.在yml配置文件中配置磁盘路径

reggie:
  filepath: E:/images

2.写入文件

@RestController
@RequestMapping("/common")
public class CommonController {
    //    拿到配置文件中的path路径
    @Value("${reggie.filepath}")
    private String path;

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) {
//        方法形参名 由前端 确定
//        拿到 原来的名字 的后缀名,结合 UUID 构成 新名字
        String originalFilename = file.getOriginalFilename();
        String endName = originalFilename.substring(originalFilename.lastIndexOf("."));
        String s = UUID.randomUUID().toString();
        String newName = s + endName;
//          创建 path 文件夹
        File file1 = new File(path);
        if (!file1.exists()) {
            file1.mkdirs();
        }
        try {
//            写入到目标文件
            file.transferTo(new File(path, newName));
        } catch (IOException e) {
            e.printStackTrace();
            return R.error("文件上传失败" + e.getMessage());
        }
//        返回新文件名
        return R.success(newName);
    }
}

3.下载(回显)图片

@RestController
@RequestMapping("/common")
public class CommonController {
    //    拿到配置文件中的path路径
    @Value("${reggie.filepath}")
    private String path;

    @GetMapping("/download")
    public void downLoad(String name, HttpServletResponse response) {
//        设置返回文件格式
        response.setContentType("jpg/png");
        FileInputStream fileInputStream = null;
        try {
//            创建字节输入流 读入文件
            fileInputStream = new FileInputStream(new File(path, name));
//            创建字节输出流,返回文件
            ServletOutputStream outputStream = response.getOutputStream();
//            复制流
            IOUtils.copy(fileInputStream, outputStream);

            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

 

posted @ 2022-03-17 22:19  twb_QAQZ  阅读(205)  评论(0)    收藏  举报