谷粒商城-服务2

接口文档

https://easydoc.xyz/s/78237135/ZUqEdvA4/VcZDIGmW

15、SPU与SKU

概念:

  • SPU(Standard Product Unit):标准化产品单元。
    SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性
  • item更多的是用来指“单品”的概念,注意的是单品也是一个抽象概念
  • SKU=stock keeping unit(库存量单位) SKU即库存进出计量的单位

spu的属性叫基本属性,每个spu基本属性是一样的。
决定sku的属性叫做销售属性。
在这里插入图片描述

16、Entity的注释,判断是否返回给前端@JsonInclude

	// 接口返回数据时的判断,此处表示如果children 部位empty时返回
	@JsonInclude(JsonInclude.Include.NON_EMPTY)
	// 表示这个字段不是数据库中的字段
	@TableField(exist = false)
	private List<CategoryEntity> children;

17、冗余字段的使用

在java开发过程中,为了使有些标查询方便,提高速率,我们可以加入一些冗余字段
场景举例:3张表:商品分类表,品牌表,分类与品牌的关系表,在关系表中有分类id,有品牌id,同时还有分类名称和品牌名称,在这里分类名称和品牌名称就是冗余字段。要注意在修改了品牌名称或者分类名称以后,要同步更新关系表中所有关联数据。

   // 事务注解,由于此处更新的时两张表,事务的开启实在config中的MybitsConfig配置的
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void updateDetail(BrandEntity brand) {
    
    
        //保证冗余字段的数据一致
        baseMapper.updateById(brand);

        if (!StringUtils.isEmpty(brand.getName())) {
    
    
            //同步更新其他关联表中的数据
            categoryBrandRelationService.updateBrand(brand.getBrandId(),brand.getName());

            //TODO 更新其他关联
        }
    }

18、 Object 划分

1.PO(persistant object) 持久对象
PO 就是对应数据库中某个表中的一条记录,多个记录可以用 PO 的集合。 PO 中应该不包
含任何对数据库的操作。
2.DO(Domain Object)领域对象
就是从现实世界中抽象出来的有形或无形的业务实体。
3.TO(Transfer Object) ,数据传输对象
不同的应用程序之间传输的对象
4.DTO(Data Transfer Object)数据传输对象
这个概念来源于 J2EE 的设计模式,原来的目的是为了 EJB 的分布式应用提供粗粒度的
数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这
里,泛指用于展示层与服务层之间的数据传输对象。
5.VO(value object) 值对象
通常用于业务层之间的数据传递,和 PO 一样也是仅仅包含数据而已。但应是抽象出
的业务对象 , 可以和表对应 , 也可以不 , 这根据业务的需要 。用 new 关键字创建,由
GC 回收的。
View object:视图对象;
接受页面传递来的数据,封装对象
将业务处理完成的对象,封装成页面要用的数据

一般情况下我们把不同功能的object放在不同的包下,比如vo类型的我们放在vo包下,vo报下的对象用于接收前端数据和返回给前端使用,比如:我们在attrGroupId 分组id是数据表中没有,我们应该单独写一个对象把它放进去,而不建议用@TableField(exist = false)去标注,还有比如返回给前台的用户对象:不能包含密码和身份证等信息,我们就需要单独协议类去返回给前端。
添加时我们可以继承之前对象,减少时可以复制。

19、controller,service中vo的使用场景

Controller:处理请求,接收和效验数据
Service接收Controller传来的数据,进行业务处理
Controller接收Service处理完的数据,封装页面指定的vo

	/**
     * /product/categorybrandrelation/brands/list
     * 1、Controller:处理请求,接收和效验数据
     * 2、Service接收Controller传来的数据,进行业务处理
     * 3、Controller接收Service处理完的数据,封装页面指定的vo
     */
    @GetMapping(value = "/brands/list")
    public R relationBransList(@RequestParam(value = "catId",required = true) Long catId) {
    
    

        List<BrandEntity> vos = categoryBrandRelationService.getBrandsByCatId(catId);

        List<BrandVo> collect = vos.stream().map(item -> {
    
    
            BrandVo brandVo = new BrandVo();
            brandVo.setBrandId(item.getBrandId());
            brandVo.setBrandName(item.getName());
            return brandVo;
        }).collect(Collectors.toList());

        return R.ok().put("data",collect);
    }

20、通过json生成javaben的方法

在网上找一个json在线解析工具,通过它就可以很方便的生成javabean
json解析工具可以为我们生成javabean
https://www.json.cn/json/json2java.html

21、mysql事务未提交时查看过程中的数据

pms_spu_comment 表名
pms_product_attr_value 表名

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED`pms_spu_comment``pms_product_attr_value`	

22、feign的请求有两种,一种时直接给服务发请求,一种是给网关发请求

     *
     *   1)、让所有请求过网关;
     *          1、@FeignClient("gulimall-gateway"):给gulimall-gateway所在的机器发请求
     *          2、/api/product/skuinfo/info/{
    
    skuId}
     *   2)、直接让后台指定服务处理
     *          1、@FeignClient("gulimall-product")
     *          2、/product/skuinfo/info/{
    
    skuId}
	 
	

23、在一个事务方法中想要使得某一处发生异常时不回滚,就把那一处的代码卸载try中

 //TODO 远程查询sku的名字,如果失败整个事务无需回滚
            //1、自己catch异常
            try{
    
    
                R info = productFeignService.info(skuId);
                Map<String,Object> data = (Map<String, Object>) info.get("skuInfo");
                if (info.getCode() == 0) {
    
    
                    wareSkuEntity.setSkuName((String) data.get("skuName"));
                }
            } catch (Exception e) {
    
    

            }

24、404的错误之一,忘记配置网关

在这里插入图片描述

25、微服务中必要配置

25.1 XXapplication.java配置

@EnableFeignClients(basePackages = "com.atguigu.gulimall.ware.feign")
// nacos动态刷新配置文件
@RefreshScope
//开启服务注册于发现
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallWareApplication {
    
    

	public static void main(String[] args) {
    
    
		SpringApplication.run(GulimallWareApplication.class, args);
	}

}

25.2 事务和分页的配置

@Configuration
//开启事务
@EnableTransactionManagement
//指定mapper扫描路径
@MapperScan("com.atguigu.gulimall.ware.dao")
public class MyBatisConfig {
    
    

    //引入分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
    
    
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        paginationInterceptor.setOverflow(true);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        paginationInterceptor.setLimit(1000);
        return paginationInterceptor;
    }

}

25.3 日期格式化和日志级别的配置

#调整某个包的日志等级
logging:
  level: 
    com.atguigu: debug
	

#格式化日期数据
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

26、java8 常用新特性

String.join(",",decript)
List<SkuImagesEntity> imagesEntities = item.getImages().stream().map(img -> {
    
    
	SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
	skuImagesEntity.setSkuId(skuId);
	skuImagesEntity.setImgUrl(img.getImgUrl());
	skuImagesEntity.setDefaultImg(img.getDefaultImg());
	return skuImagesEntity;
}).filter(entity -> {
    
    
	//返回true就是需要,false就是剔除
	return !StringUtils.isEmpty(entity.getImgUrl());
}).collect(Collectors.toList());
BeanUtils.copyProperties(a, skuSaleAttrValueEntity)

27、谷粒商城中遇到的错误

27.1 p84 关于pubsub、publish报错,无法发送查询品牌信息的请求

※p84 关于pubsub、publish报错,无法发送查询品牌信息的请求:
1、npm install --save pubsub-js
2、在src下的main.js中引用:
① import PubSub from pubsub-js
② Vue.prototype.PubSub = PubSub
P100:”400报错解决方法:在 /src/router/index.js 在mainRoutes-children里面加上:
{
    
     path: /product-attrupdate, component: _import(modules/product/attrupdate), name: attr-update, meta: {
    
     title: 规格维护, isTab: true } }

28、把多个微服务放在一个政体中一起启动

微服务基础篇总结

总结:
1.分布式基本概念
	微服务、注册中心、配置中心、远程调用Feign、网关
2.基础开发
	SpringBoot2.0、SpringCloud、Mybaits-Plus、Vue组件化、阿里云对象存储
3.环境
	Vagrant、Linux、Docker、Mysql、Redis、逆向工程&人人开源
4.开发规范
	数据校验JSR303、全局异常处理、全局统一返回、全局跨域处理
	枚举状态、业务状态码、VO与TO与PO划分、逻辑删除
	Lombak:@Data、@Slf4j
5.mysql的数据达到百万级是非常慢的,这就需要elasticsearch为我们进行查询和检索功能。

猜你喜欢

转载自blog.csdn.net/fen_dou_shao_nian/article/details/117624091