SpringCloud商城day02 分布式文件存储解决方案-2021-09-29

1. CORS: cross-original resource sharing. 跨域资源共享

 (1) http://192.168.200.128:9011/brand
     https://192.168.200.128:9011/brand(协议不同, 跨域)
     https://192.168.200.129:9011/brand(IP不同, 跨域)
     https://192.168.200.128:9012/brand(端口号不同, 跨域)
     http://192.168.200.128:9011/goods(路径不同, 同域)

(2) 前后端跨域:
解决: CORS标准(浏览器和服务器同时支持)
头信息: Access-Control-Request-Headers: access-control-allow-origin

(3)controller开启跨域注解 @CrossOrigin

2. 商品分类表结构和规格参数模板

(1) 基础接口dao

(2) 表:
   规格:specification. 
   参数:parameter
   模板:template
   商品分类表: category
   品牌: brand

(3) 表关系: 
   模板 一对多 参数
   模板 一对多 规格
   模板  一对多 分类
   分类 多对多 品牌 (中间关联表 category_brand)

3. 通用mapper的自定义方法 :  默认只对单表进行CRUD操作,自定义mapper进行多表操作

4. 需求: 通过 category表 查询  brand表

(1) SELECT * FROM tb_brand WHERE id IN (SELECT brand_id FROM tb_category_rabnd WHERE category_id  IN(SELECT id FROM tb_category WHERE name='#{categoryName}'))

(2) 定义 brandMapper extends Mapper<Brand>:  @Select(...)

(3) BrandService接口

(4) BrandServiceImpl实现类: 

(5) BrandController: 

(6) Postman请求携带中文参数会出现乱码 - 浏览器访问即可

5. 需求:  根据商品分类category查询规格表spec:

        (1) category查询 模板template_id

        (2)template_id查询规格表spec

        (3) SpecMapper extends Mapper<Spec>:  @Select(....)

        (4) SpecService接口

        (5) SpecServiceImpl实现类:  遍历返回值map<name, options>, 取出值的","存入数组

        (6) SpecController:  @GetMapping("/category/{categoryName}")

6. 分布式文件存储FastDFS(distributed field system)     

(1) 海量文件: 图片/文档/报表 -> 分布式文件存储

(2) 文件存储/同步/访问/上传/下载/冗余备份/负载均衡/线性扩容

(3) 流程: storage(存储器)汇报信息 ->tracker(追踪器)获取信息 -> client请求-> tracker(追踪器) -> 返回 storageIP和端口 -> 客户端上传文件storage -> storage生成唯一文件id -> storage保存到磁盘 -> 返回文件路径和文件名给client -> 客户端保存

(4) storage文件ID: 组名/虚拟磁盘路径/二级目录00-ff/文件名

(5) 安装FastDFS到docker环境: 

(6) changgou_service_file: 

(7) resources/fdfs_client.conf配置:  

(8) application.yml配置: 

(9) 启动类: @SpringBootApplication  @EnableEurekaClient

(10) file/util/FastDFSClient.java : 工具类

     FastDFSFile.java : 简单文件实体类

(11) file/controller/FileController:  @RestController  @PostMapping("/file")

      a. 判断文件是否存在:  file != null

      b. 获取文件完整名称:  file.getOriginalFilename()

      c. 获取文件扩展名称: filename.substring(filename.lastIndexOf(".")+1)

      d. 获取文件内容: file.getBytes()

      e. 上传的封装实体类:  new FastDFSFile(文件名, 文件内容, 扩展名)

      g. 工具类上传, 接收返回参数 : FastDFSClient.upload(fastDFSFile);

      h. 封装返回结果: getTrackerUrl()+元素一组名[0]+"/"+元素二路径 [1]


版权声明:本文为Oppuser原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。