谷粒商城--分布式基础篇P28~P101(完结)

前面1-27节主要是环境配置特别难,后面的28~101节主要是前端编写的代码较多以及后台的CRUD操作比较多。因为内容很多,所以我是根据自己想学的点进行相应学习,故前端我直接跳过了,前端代码用的别人完整的。主要学习点集中在后台三级目录、库表设计、OSS以及代码规范的相关学习了。

Fork代码:https://gitee.com/empirefree/GuliMall

(个人建议学后端的只用renren-fast-vue前端代码,后端代码除开CRUD的操作,其余都自己敲)






@

1.商品服务

1.1 商品树形图(Lambda8代码实现)
  • 排序类:id,parentId,sort(权重)、List(自定义添加)

  • 组装逻辑:先获取所有商品,然后再获取第一级商品,递归并排序找到所有子商品。代码如下

1.2 网关配置

​ 前端为了统一管理,全部向网关发起访问。所以验证码、后续数据获取端口都需要修改。修改逻辑如下:

  1. 原始验证码地址:http://localhost:8080/renren-fast/captcha.jpg
  2. 前端发起访问的地址:http://localhost:88/api/captcha.jpg
  3. 经过Gateway从nacos映射与路径转换:http://localhost:8080/renrenfast/captcha.jpg(前面的8080路径是从nacos中找到的renrenfast端口,后面路径是gateway转换的路径)

GateWay请求拦截与转换

spring:
cloud:
gateway:
routes:
- id: product_route
uri: lb://gulimall-product
predicates:
- Path=/api/product/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment} - id: third_party_route
uri: lb://gulimall-third-party
predicates:
- Path=/api/thirdparty/**
filters:
- RewritePath=/api/thirdparty/(?<segment>.*),/thirdparty/$\{segment} - id: member_route
uri: lb://gulimall-member
predicates:
- Path=/api/member/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment} - id: ware_route
uri: lb://gulimall-ware
predicates:
- Path=/api/ware/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment} - id: admin_route
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
1.3 阿里云oss

​ 官网给的oss的dependency无法导入,应该使用如下dependency

        <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-oss</artifactId>
</dependency>

​ 另外,共有2种上传文件方式

  1. client->server->oss(不推荐但很常见):服务器处理上传
  2. server返回policy
1.4 获取商品id完整路径

​ 针对上面给的商品树,给出某个id获取根id到这个id路径

2.代码规范环境

JSR303、全局异常处理、全局统一返回、全局跨域处理、VO与TO与PO划分

2.1.JSR303

​ 就是入参的校验注解,极大简化了对于前端入参的代码判断

	/**
* 为空的数据就不查询了
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
/**
* 表中不存在
*/
@TableField(exist = false)

2.2.全局异常处理与统一返回

​ 在正常前后端分离项目中,前端对于参数的要求有个规范,所以无论正确还是错误代码,后端都需要有个全局参数的返回

package com.empirefree.gulimall.product.exception;

import com.empirefree.common.exception.BizCodeEnum;
import com.empirefree.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.support.WebExchangeBindException; import java.util.HashMap;
import java.util.Map; /**
* <p>Title: MallExceptionControllerAdvice</p>
* Description:集中处理所有异常
* date:2020/6/1 21:19
*/
@Slf4j
@RestControllerAdvice(basePackages = "com.empirefree.gulimall.product.controller")
public class MallExceptionControllerAdvice { @ExceptionHandler(value = {WebExchangeBindException.class})
public R handleVaildException(WebExchangeBindException e) {
log.error("数据校验出现问题{},异常类型:{}", e.getMessage(), e.getClass());
BindingResult bindingResult = e.getBindingResult(); Map<String, String> errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach((fieldError) -> {
// 错误字段 、 错误提示
errorMap.put(fieldError.getField(), fieldError.getDefaultMessage());
});
return R.error(BizCodeEnum.VAILD_EXCEPTION.getCode(), BizCodeEnum.VAILD_EXCEPTION.getMsg()).put("data", errorMap);
} @ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable) { log.error("错误:", throwable);
return R.error(BizCodeEnum.UNKNOW_EXCEPTION.getCode(), BizCodeEnum.UNKNOW_EXCEPTION.getMsg());
}
}
2.3.全局跨域处理

​ 由于前端统一访问gateway网关,所以gateway需要配置允许跨域

package com.empirefree.gulimall.gateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; @Configuration
public class GulimallCorsConfiguration { @Bean
public CorsWebFilter corsWebFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration();
//1、配置跨域
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true); source.registerCorsConfiguration("/**", corsConfiguration);
return new CorsWebFilter(source);
}
}
2.4.VO、TO

​ 由于入参出参数据与dao层差距很大,所以需要自定义一些参数,结合代码赋值完成参数传递

	BeanUtils.copyProperties(group, attrVo);

(我用的比较多的就是XXrequest、XXresponse、XXDTO、XXVO)

3.总结

​ 老师后端讲得很多东西虽然都是一句话带过,但是其实真的很重要,而且我觉得需要有针对性学习,个人感觉效率高点

  • 分布式相关内容:nacos,gateway,feign
  • 后端相关内容:oss,树形商品,商品路径,全局处理(异常、跨域、统一处理),代码规范(JSR303,VO|DTO|DO)
  • 数据库相关内容:库表的设计(重要:个人感觉对提高后端开发有启迪性作用)
  • 服务器相关内容:docker(还只是停留在使用阶段,自己还需要提高)

书山有路勤为径,学海无涯苦作舟。程序员不仅要懂代码,更要懂生活,关注我,一起进步。

谷粒商城--分布式基础篇P28~P101(完结)的更多相关文章

  1. 谷粒商城--分布式基础篇(P1~P27)

    谷粒商城--分布式基础篇P1~P27 去年3月份谷粒商城分布式基础.进阶.高级刚出的时候就开始学了,但是中途因为一些事就中断了,结果一直到现在才有时间重新开始学,看到现在网上这么多人都学完了,确实感觉 ...

  2. 谷粒商城--分布式高级篇P102~P128

    谷粒商城--分布式高级篇P102~P128 由于学习的时间也比较少,只有周六周末才有时间出来学习总结,所以一篇一篇慢慢更新吧,本次总结内容为Elasticsearch(相关内容:kibana,es,n ...

  3. 算法笔记——C/C++语言基础篇(已完结)

    开始系统学习算法,希望自己能够坚持下去,期间会把常用到的算法写进此博客,便于以后复习,同时希望能够给初学者提供一定的帮助,手敲难免存在错误,欢迎评论指正,共同学习.博客也可能会引用别人写的代码,如有引 ...

  4. 有评论就是我最大的动力~MySQL基础篇完结(存储引擎和图形化管理工具)

    hi 今天登上来,发现竟然有了3个评论~~加油吧! 这周的计划其实远远没有达到,然后下周还有一大堆事情...那么...周末好好玩吧~ 今天试图完结MySQL的基础篇知识,小白变为大白? 1.MySQL ...

  5. g4e基础篇#2 Git分布式版本控制系统的优势

    g4e 是 Git for Enterprise Developer的简写,这个系列文章会统一使用g4e作为标识,便于大家查看和搜索. 章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git ...

  6. 3.高并发教程-基础篇-之分布式全文搜索引擎elasticsearch的搭建

    高并发教程-基础篇-之分布式全文搜索引擎elasticsearch的搭建 如果大家看了我的上一篇<2.高并发教程-基础篇-之nginx+mysql实现负载均衡和读写分离>文章,如果能很好的 ...

  7. 手摸手,带你用Beego撸商城系列一(基础篇)

    完整项目地址: go-shop-b2c 系列文章: 手摸手,带你用 Beego撸商城 系列一(基础篇) 手摸手,带你用 Beego撸商城 系列二(登录篇) 手摸手,带你用 Beego撸商城 系列三(系 ...

  8. [源码解析] TensorFlow 分布式 DistributedStrategy 之基础篇

    [源码解析] TensorFlow 分布式 DistributedStrategy 之基础篇 目录 [源码解析] TensorFlow 分布式 DistributedStrategy 之基础篇 1. ...

  9. 使用 FreeRTOS 时注意事项总结(基础篇教程完结)

    以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的初始化流程推荐的初始化流程如下,本教程配套的所有例子都是采用的这种形式,当然,不限制必须 ...

随机推荐

  1. 如何在TVM上集成Codegen(上)

    如何在TVM上集成Codegen(上) 许多常用的深度学习内核,或者提供DNNL或TensorRT等框架和图形引擎,让用户以某种方式描述他们的模型,从而获得高性能.此外,新兴的深度学习加速器也有自己的 ...

  2. RGBD动作识别的多视图层融合模型

    摘要 基于视觉的动作识别在实践中遇到了不同的挑战,包括从任何角度识别主题,实时处理数据以及在现实环境中提供隐私.甚至识别基于配置文件的人类动作(基于视觉的动作识别的一个子集),在计算机视觉中也是一个巨 ...

  3. 牛客网sql实战参考答案(mysql版):1-15

    1.查找最晚入职员工的所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天(sqlite里面的注释为--,mysql为comment) CREATE TABLE `employees ...

  4. UF_TRNS 变换相关

    Open C uf5940uf5941uf5942  矩阵乘积变换uf5943  平移变换uf5944  缩放变换uf5945  旋转变换uf5946  镜像变换uf5947  实现变换,根据变换矩阵 ...

  5. 彻底搞懂彻底搞懂事件驱动模型 - Reactor

    在高性能网络技术中,大家应该经常会看到Reactor模型.并且很多开源软件中都使用了这个模型,如:Redis.Nginx.Memcache.Netty等. 刚开始接触时可能一头雾水,这到底是个什么东东 ...

  6. 老公 今晚还玩“丝袜哥”Swagger 么?

    大家都知道Swagger是一个常用的Spring Boot接口文档生成工具,但是我们今天再介绍另外一个无需额外注解的 Spring Boot API文档生成神器,非常方便好用! JApiDocs是一个 ...

  7. 什么是TCP和UDP?

    1.什么是IP和TCP? Internet协议(IP)是Internet的地址系统,具有将数据包从源设备传递到目标设备的核心功能.IP是建立网络连接的主要方式,奠定了Internet的基础.IP不负责 ...

  8. BFS经典面试题——C++版

    文章目录 蛇梯棋 单词接龙 青蛙过河 蛇梯棋 N x N 的棋盘 board 上,按从 1 到 N*N 的数字给方格编号,编号 从左下角开始,每一行交替方向. 例如,一块 6 x 6 大小的棋盘,编号 ...

  9. 5、could not start the service mysql

    1.这个原因是因为mysql多次安装没有卸载干净的原因; 2.解决办法是: (1)删除系统中已经安装的mysql目录中的内容: (2)同时按住"win+r"键调出"运行& ...

  10. 通过winsw将jar包做成window后台服务运行

    第一步:下载Winsw地址 https://github.com/kohsuke/winsw/releases  第二步: 将下载好的sample-minimal.xml和WinSW.NET4.exe ...