第十八章 1024电商平台-商品购物车微服务介绍和项目创建
第1集 1024电商平台-商品购物车微服务功能需求介绍
简介:商品-购物车-微服务功能需求介绍
- 电商里面的知识介绍
- 类目
- 一个树状结构的系统,根据业务可以分成4-5级。如手机->智能手机->国产手机 类目,在这里面,手机是一级类目,国产手机是三级类目,也是叶子类目
- SPU
- Standard Product Unit:标准化产品单元。是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU
- 比如 Iphone100 就是一个SPU
- SKU
- 一般指库存保有单位。库存保有单位即库存进出计量的单位, 可以是以件、盒、托盘等为单位。SKU是物理上不可分割的最小存货单元,在服装、鞋类商品中使用最多最普遍,买家购买、商家进货、供应商备货、工厂生产都是依据SKU进行的
- 比如Iphone100 128g 土豪金就是一个SKU
- 1024电商平不做多类目SPU/SKU设计
- 否则这个就多了好几百集内容了,且不通用
- 大课训练营核心还是把多个技术知识点综合起来
- 有兴趣的同学可以看我们《小滴课堂的电商供应链平台设计专题视频》
- 类目
- 商品微服务介绍
- 首页商品分页展示
- 商品详情展示
- 库存控制
- 购物车功能介绍
- 加入购物车
- 清空购物车
- 修改购物车数量
第2集 1024电商平台-商品购物车项目核心知识和数据库建立
简介:商品购物车项目核心知识和数据库建立
- 商品和购物车微服务核心知识:
- 商品微服务库存管理
- 分布式事务知识
- 电商平台购物车的实现方案
- 通用购物车数据结构设计
- 购物车价格统计业务逻辑梳理
- 重点知识下沉到订单微服务
- 商品库存锁定和回收
- 优惠券使用锁定和回收
- 订单验价
- 多通道支付设计等
- 商品服务数据库建立
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的记得修改)
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项目启动类和配置文件配置
- 轮播接口开发
@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集 商品微服务-添加购物车接口开发和方法抽取
简介:添加购物车接口开发和方法抽取
- 拦截器配置(添加商品到购物车需要登录)
- 添加购物车接口
@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));
}
}
- 购物车方法抽取
/**
* 抽取我的购物车通用方法
*
* @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集 购物车功能开发-删除和修改购物项接口
简介:购物车-删除购物项和修改购物车数量接口开发
- 删除购物项接口开发
- 修改购物车商品数量接口开发