前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >商品购物车微服务(4)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】

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

作者头像
高大北
发布2022-09-16 16:36:45
6400
发布2022-09-16 16:36:45
举报

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

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

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

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

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

  • 商品和购物车微服务核心知识:
    • 商品微服务库存管理
    • 分布式事务知识
    • 电商平台购物车的实现方案
    • 通用购物车数据结构设计
    • 购物车价格统计业务逻辑梳理
    • 重点知识下沉到订单微服务
      • 商品库存锁定和回收
      • 优惠券使用锁定和回收
      • 订单验价
      • 多通道支付设计等
      image-1658804177470
      image-1658804177470
  • 商品服务数据库建立
代码语言: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/%E5%AE%98%E7%BD%91%E8%BD%AE%E6%92%AD%E5%9B%BE/20%E5%B9%B4%E5%8F%8C11%E9%98%BF%E9%87%8C%E4%BA%91/fc-lbt.jpeg', 'https://www.aliyun.com/1111/pintuan-share?ptCode=MTcwMTY3MzEyMjc5MDU2MHx8MTE0fDE%3D&userCode=r5saexap', 3),
	(3, 'https://file.xdclass.net/video/%E5%AE%98%E7%BD%91%E8%BD%AE%E6%92%AD%E5%9B%BE/20%E5%B9%B4%E5%8F%8C11%E9%98%BF%E9%87%8C%E4%BA%91/FAN-lbu-vip.jpeg', 'https://file.xdclass.net/video/%E5%AE%98%E7%BD%91%E8%BD%AE%E6%92%AD%E5%9B%BE/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集 电商平台-常见购物车功能实现介绍

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

image-1658846951084
image-1658846951084
  • 购物车里面的购物项常见字段
    • 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集 购物车功能开发-删除和修改购物项接口

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

  • 删除购物项接口开发
  • 修改购物车商品数量接口开发
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第十八章 1024电商平台-商品购物车微服务介绍和项目创建
    • 第1集 1024电商平台-商品购物车微服务功能需求介绍
      • 第2集 1024电商平台-商品购物车项目核心知识和数据库建立
        • 第3集 商品微服务+MybatisPlusGenerator代码自动生成工具
          • 第4集 商品微服务项目基本配置整合+轮播图列表接口开发
            • 第5集 商品微服务-商品列表分页接口开发
              • 第6集 商品微服务-商品详情接口开发和拦截器配置
              • 第十九章 1024电商平台-购物车数据结构设计+编码落地
                • 第1集 电商平台-常见购物车功能实现介绍
                  • 第2集 1024电商平台-购物车和购物项VO类开发
                    • 第3集 1024电商平台-购物车redis数据结构讲解
                      • 第4集 商品微服务-添加购物车接口开发和方法抽取
                        • 第5集 购物车功能开发-redis乱码问题和清空购物车接口开发
                          • 第6集 购物车功能开发-查看我的购物车接口
                            • 第7集 购物车功能开发-删除和修改购物项接口
                            相关产品与服务
                            云数据库 Redis
                            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档