商品购物车微服务(4)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】

2022-09-16 16:36:45 浏览数 (1)

第十八章 1024电商平台-商品购物车微服务介绍和项目创建

第1集 1024电商平台-商品购物车微服务功能需求介绍

简介:商品-购物车-微服务功能需求介绍

  • 电商里面的知识介绍
    • 类目
      • 一个树状结构的系统,根据业务可以分成4-5级。如手机->智能手机->国产手机 类目,在这里面,手机是一级类目,国产手机是三级类目,也是叶子类目
    • SPU
      • Standard Product Unit:标准化产品单元。是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU
      • 比如 Iphone100 就是一个SPU
    • SKU
      • 一般指库存保有单位。库存保有单位即库存进出计量的单位, 可以是以件、盒、托盘等为单位。SKU是物理上不可分割的最小存货单元,在服装、鞋类商品中使用最多最普遍,买家购买、商家进货、供应商备货、工厂生产都是依据SKU进行的
      • 比如Iphone100 128g 土豪金就是一个SKU
    • 1024电商平不做多类目SPU/SKU设计
      • 否则这个就多了好几百集内容了,且不通用
      • 大课训练营核心还是把多个技术知识点综合起来
      • 有兴趣的同学可以看我们《小滴课堂的电商供应链平台设计专题视频》
  • 商品微服务介绍
    • 首页商品分页展示
    • 商品详情展示
    • 库存控制
  • 购物车功能介绍
    • 加入购物车
    • 清空购物车
    • 修改购物车数量
第2集 1024电商平台-商品购物车项目核心知识和数据库建立

简介:商品购物车项目核心知识和数据库建立

  • 商品和购物车微服务核心知识:
    • 商品微服务库存管理
    • 分布式事务知识
    • 电商平台购物车的实现方案
    • 通用购物车数据结构设计
    • 购物车价格统计业务逻辑梳理
    • 重点知识下沉到订单微服务
      • 商品库存锁定和回收
      • 优惠券使用锁定和回收
      • 订单验价
      • 多通道支付设计等
  • 商品服务数据库建立
代码语言:javascript复制
CREATE TABLE `banner` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `img` varchar(524) DEFAULT NULL COMMENT '图片',
  `url` varchar(524) DEFAULT NULL COMMENT '跳转地址',
  `weight` int(11) DEFAULT NULL COMMENT '权重',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

INSERT INTO `banner` (`id`, `img`, `url`, `weight`)
VALUES
	(1, 'https://file.xdclass.net/video/2020/alibabacloud/zx-lbt.jpeg', 'https://m.xdclass.net/#/member', 1),
	(2, 'https://file.xdclass.net/video/官网轮播图/20年双11阿里云/fc-lbt.jpeg', 'https://www.aliyun.com/1111/pintuan-share?ptCode=MTcwMTY3MzEyMjc5MDU2MHx8MTE0fDE=&userCode=r5saexap', 3),
	(3, 'https://file.xdclass.net/video/官网轮播图/20年双11阿里云/FAN-lbu-vip.jpeg', 'https://file.xdclass.net/video/官网轮播图/Nginx.jpeg', 2);



CREATE TABLE `product` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(128) DEFAULT NULL COMMENT '标题',
  `cover_img` varchar(128) DEFAULT NULL COMMENT '封面图',
  `detail` varchar(256) DEFAULT '' COMMENT '详情',
  `old_price` decimal(16,2) DEFAULT NULL COMMENT '老价格',
  `price` decimal(16,2) DEFAULT NULL COMMENT '新价格',
  `stock` int(11) DEFAULT NULL COMMENT '库存',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `lock_stock` int(11) DEFAULT '0' COMMENT '锁定库存',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;


INSERT INTO `product` (`id`, `title`, `cover_img`, `detail`, `old_price`, `price`, `stock`, `create_time`, `lock_stock`)
VALUES
	(1, '小滴课堂抱枕', 'https://file.xdclass.net/video/2020/alibabacloud/zt-alibabacloud.png', 'https://file.xdclass.net/video/2021/60-MLS/summary.jpeg', 32.00, 213.00, 100, '2021-09-12 00:00:00', 31),
	(2, '技术人的杯子Linux', 'https://file.xdclass.net/video/2020/alibabacloud/zt-alibabacloud.png', 'https://file.xdclass.net/video/2021/59-Postman/summary.jpeg', 432.00, 42.00, 20, '2021-03-12 00:00:00', 2),
	(3, '技术人的杯子docker', 'https://file.xdclass.net/video/2020/alibabacloud/zt-alibabacloud.png', 'https://file.xdclass.net/video/2021/60-MLS/summary.jpeg', 35.00, 12.00, 20, '2022-09-22 00:00:00', 13),
	(4, '技术人的杯子git', 'https://file.xdclass.net/video/2020/alibabacloud/zt-alibabacloud.png', 'https://file.xdclass.net/video/2021/60-MLS/summary.jpeg', 12.00, 14.00, 20, '2022-11-12 00:00:00', 2);
第3集 商品微服务 MybatisPlusGenerator代码自动生成工具

简介:Mybatis-plus-generator代码自动化生成微服务相关类

  • 配置代码生成(标记TODO的记得修改)
代码语言:javascript复制
public class MyBatisPlusGenerator {

    public static void main(String[] args) {
        //1. 全局配置
        GlobalConfig config = new GlobalConfig();

                // 作者
                config.setAuthor("二当家小D")
                // 生成路径,最好使用绝对路径,window路径是不一样的
                //TODO  TODO  TODO  TODO
                .setOutputDir("/Users/xdclass/Desktop/demo/src/main/java")
                // 文件覆盖
                .setFileOverride(true)
                // 主键策略
                .setIdType(IdType.AUTO)

                .setDateType(DateType.ONLY_DATE)
                // 设置生成的service接口的名字的首字母是否为I,默认Service是以I开头的
                .setServiceName("%sService")

                //实体类结尾名称
                .setEntityName("%sDO")

                //生成基本的resultMap
                .setBaseResultMap(true)

                //不使用AR模式
                .setActiveRecord(false)

                //生成基本的SQL片段
                .setBaseColumnList(true);

        //2. 数据源配置
        DataSourceConfig dsConfig = new DataSourceConfig();
        // 设置数据库类型
        dsConfig.setDbType(DbType.MYSQL)
                .setDriverName("com.mysql.cj.jdbc.Driver")
                //TODO  TODO  TODO  TODO
                .setUrl("jdbc:mysql://127.0.0.1:3306/xdclass_product?useSSL=false")
                .setUsername("root")
                .setPassword("xdclass.net");

        //3. 策略配置globalConfiguration中
        StrategyConfig stConfig = new StrategyConfig();

        //全局大写命名
        stConfig.setCapitalMode(true)
                // 数据库表映射到实体的命名策略
                .setNaming(NamingStrategy.underline_to_camel)

                //使用lombok
                .setEntityLombokModel(true)

                //使用restcontroller注解
                .setRestControllerStyle(true)

                // 生成的表, 支持多表一起生成,以数组形式填写
                //TODO  TODO  TODO  TODO
                .setInclude("banner","product");

        //4. 包名策略配置
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent("net.xdclass")
                .setMapper("mapper")
                .setService("service")
                .setController("controller")
                .setEntity("model")
                .setXml("mapper");

        //5. 整合配置
        AutoGenerator ag = new AutoGenerator();
        ag.setGlobalConfig(config)
                .setDataSource(dsConfig)
                .setStrategy(stConfig)
                .setPackageInfo(pkConfig);

        //6. 执行操作
        ag.execute();
        System.out.println("======= 小滴课堂 Done 相关代码生成完毕  ========");
    }
}
  • 导入生成好的代码
    • model (为啥不放common项目,如果是确定每个服务都用到的依赖或者类才放到common项目)
    • mapper 类接口拷贝
    • resource/mapper文件夹 xml脚本拷贝
    • controller
    • service 不拷贝
第4集 商品微服务项目基本配置整合 轮播图列表接口开发

简介:项目相关配置整合和轮播图接口开发

  • SpringBoot项目启动类和配置文件配置
  • 轮播接口开发
代码语言:javascript复制
@Service
public class BannerServiceImpl implements BannerService {

    @Autowired
    private BannerMapper bannerMapper;

    @Override
    public List<BannerVO> list() {
        List<BannerDO> list = bannerMapper.selectList(new QueryWrapper<BannerDO>().
                orderByAsc("weight"));

        List<BannerVO> bannerVOS  = list.stream().map(obj -> {
                    BannerVO vo = new BannerVO();
                    BeanUtils.copyProperties(obj, vo);
                    return vo;
                }
        ).collect(Collectors.toList());

        return bannerVOS;
    }

}
第5集 商品微服务-商品列表分页接口开发

简介:商品首页分页列表接口开发

  • 分页列表接口controller开发
  • 分页列表接口service开发
第6集 商品微服务-商品详情接口开发和拦截器配置

简介:商品首页分页列表接口开发和拦截器配置

  • 商品详情接口controller开发
  • 商品详情接口service开发
  • 拦截器配置

第十九章 1024电商平台-购物车数据结构设计 编码落地

第1集 电商平台-常见购物车功能实现介绍

简介:电商平台常见购物车 功能实现介绍

  • 购物车里面的购物项常见字段
    • user_id、product_id、buy_num
  • 购物车常见实现方式
    • 实现方式一:存储到数据库
      • 性能存在瓶颈
    • 实现方式二:前端本地存储-localstorage-sessionstorage
      • localstorage在浏览器中存储 key/value 对,没有过期时间。
      • sessionstorage在浏览器中存储 key/value 对,在关闭会话窗口后将会删除这些数据。
    • 实现方式三:后端存储到缓存如redis
      • 可以开启AOF持久化防止重启丢失(推荐)
    • 实现方式四:后端存储到缓存如redis-并同步更新到数据库
      • 大家可能会想到缓存和数据库的一致性,加了用户唯一标识后,没高并发操作同一数据的场景
第2集 1024电商平台-购物车和购物项VO类开发

简介:购物车和购物项VO类开发

  • 一个购物车里面,存在多个购物项
  • CartVO 购物车
    • 商品总件数
    • 整个购物车总价
    • 实际支付总价
  • CartItemVO 购物项
    • 商品id
    • 购买数量
    • 商品标题(冗余)
    • 商品图片(冗余)
    • 商品单价
    • 总价格 ( 单价*数量 )
  • CartVO 和 CartItemVO 编写
第3集 1024电商平台-购物车redis数据结构讲解

简介:购物车redis数据结构讲解

  • 购物车数据结构介绍
    • 一个购物车里面,存在多个购物项
    • 所以 购物车结构是一个双层Map:
      • Map<String,Map<String,String>>
      • 第一层Map,Key是用户id
      • 第二层Map,Key是购物车中商品id,值是购物车数据
  • 对应redis里面的存储
    • redis里面有多种数据结构,应该使用哪种?
    • 答案是 hash结构
第4集 商品微服务-添加购物车接口开发和方法抽取

简介:添加购物车接口开发和方法抽取

  • 拦截器配置(添加商品到购物车需要登录)
  • 添加购物车接口
代码语言:javascript复制
@Override
    public void addToCart(CartItemRequest cartItemRequest) {

        Long productId = cartItemRequest.getProductId();

        int buyNum = cartItemRequest.getBuyNum();
        //获取购物车
        BoundHashOperations<String, Object, Object> myCart = getMyCartOps();

        Object cacheObj = myCart.get(productId);
        String result = "";

        if (cacheObj != null) {
            result = (String) cacheObj;
        }
        if (StringUtils.isBlank(result)) {
            //不存在则新建一个购物项
            CartItemVO cartItem = new CartItemVO();
            ProductVO productVO = productService.findDetailById(productId);
            cartItem.setAmount(productVO.getAmount());
            cartItem.setBuyNum(buyNum);
            cartItem.setProductId(productId);
            cartItem.setProductImg(productVO.getCoverImg());
            cartItem.setProductTitle(productVO.getTitle());
            myCart.put(productId, JSON.toJSONString(cartItem));
        } else {
            //存在则新增数量
            CartItemVO cartItem = JSON.parseObject(result, CartItemVO.class);
            cartItem.setBuyNum(cartItem.getBuyNum()   buyNum);
            myCart.put(productId, JSON.toJSONString(cartItem));
        }

    }
  • 购物车方法抽取
代码语言:javascript复制
    /**
     * 抽取我的购物车通用方法
     *
     * @return
     */
    private BoundHashOperations<String, Object, Object> getMyCartOps() {
        String cartKey = getCartKey();
        return redisTemplate.boundHashOps(cartKey);
    }


    /**
     * 获取购物车的key
     *
     * @return
     */
    private String getCartKey() {
        LoginUser loginUser = LoginInterceptor.threadLocal.get();
        String cartKey = String.format(CacheKey.CART_KEY, loginUser.getId());
        return cartKey;
    }
  • 注意:字段修改,统一使用 amount, 不使用price
第5集 购物车功能开发-redis乱码问题和清空购物车接口开发

简介:redis乱码问题和清空购物车接口开发

  • redis存储乱码问题
    • 默认使用JdkSerializationRedisSerializer进行序列化
    • 修改key-value序列化方式,hash结构不修改
  • 清空购物车接口开发
第6集 购物车功能开发-查看我的购物车接口

简介:查看我的购物车接口开发

  • 查看我的购物车接口开发
  • 抽取方法-需要支持查询商品最新价格
第7集 购物车功能开发-删除和修改购物项接口

简介:购物车-删除购物项和修改购物车数量接口开发

  • 删除购物项接口开发
  • 修改购物车商品数量接口开发

0 人点赞