解决方案(未完待续...)

1.购物车的解决方案

  • 用户未登录
    • 将购物车数据存入cookie
  • 用户已登录
    • 将购物车数据存入redis

注意:当用户由未登录 -> 已登录,需要将未登录状态的购物车数据同步到已登录的redis中。


2.购物车订单提交时,如何减少商品库存?
可采取乐观锁,不能采用重量级锁,因为这是一个高并发的操作。

乐观锁:在sql命令层面进行判断;只有条件满足时才执行sql命令
如:update items set stock = stock - '条件' where id = 'id' and stock >= '条件'


3.图片上传

  1. 取出后缀名并检验
  2. 重命名文件名(可设置为覆盖式与增量式 区别是同一个用户下有多少个图片)
    • 增量式,需要加时间戳
    • 定义保存路径时,最好将路径写在配置文件中(环境变更时修改方便),例如:file-upload-dev.properties
# file-upload-dev.properties
file.imageUserFaceLocation = \\workspaces\\images\\faces
@Data
@Component
@ConfigurationProperties(prefix = "file")
@PropertySource("classpath:file-upload-dev.properties")
public class FileUpload {
    private String imageUserFaceLocation;
}
  1. 将图片做静态资源映射服务器:就是能以web形式访问图片
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
	// web访问形式:http://ip:本项目端口/直接加图片路径不须加映射路径(如:faces/*.png)
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/META-INF/resources/")
                .addResourceLocations("file:/workspaces/images/");
    }
}
  1. 将能以web形式访问的图片路径保存到数据库

    注意:由于浏览器存在缓存的情况,最好加上时间戳来保证更新后的图片可以及时刷新
    浏览器检测图片名称是否发生变化,如果名称没变,则直接从缓存中读取此文件

  2. 限制文件上传大小
    • 可采用 application.yml 中限制(spring.servlet.multipart.max-file-size)
      • 注意:此时抛出异常,MaxUploadSizeExceededException,是不会做到捕获的,前端也不会提示
// spring配置抛出的异常如何捕获呢?可以采用全局异常处理,统一捕获处理异常
@RestControllerAdvice
public class CustomExceptionHandler {
    // 上传文件超过500k,捕获异常:MaxUploadSizeExceededException
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public JsonResult handlerMaxUploadFile(MaxUploadSizeExceededException ex) {
        return JsonResult.errorMsg("文件上传大小不能超过500K!");
    }
}
posted @ 2022-01-29 12:59  原来人生只有十二集  阅读(44)  评论(0)    收藏  举报