开发任务-1-分类搜索
需求设计实现三级分类树
具体实现步骤
1、准备数据库
mall-pms---对应项目mall-product--server.port== 9010
2、业务层
分析业务逻辑:分类信息频繁使用且修改不频繁故考虑放到redis里面,所以在业务成不直接从数据库查询,先判断redis中是否有分类的信息,如果没有再从数据库查询,构建分类信息的父子结构,实现查询返回父子结构的分类信息,之后保存到redis里面顺便返回分类信息
执行思路:第一次去执行查询分类信息,redis为null,故而从数据库里面去查询,将结果保存在redis里面顺便返回
之后再次进行查询,判断redis里面有数据就直接进行返回,提升效率
最后:完成控制层(实现前端接口)
对应项目是
mall-front–server.port=10004
nacos—注册信息、方便远程调用
seata—分布式事务(只要涉及数据库的操作都启动)
redis----存储分类信息
测试步骤:
在Nacos\Seata\redis启动的前提下
顺序启动Product\Front
进行测试接口文档
http://localhost:10004/doc.html
开发任务-2-商品列表
需求设计实现商品列表
用户会根据分类树中的分类的名称,查询它需要的商品类别
具体实现步骤
1、准备数据库
mall-pms---对应项目mall-product--server.port== 9010
2、业务层
分析业务逻辑:用户会根据分类树中的分类的名称,查询它需要的商品类别,点击商品分类名称时,实际上我们获得了它的分类id(categoryId),我们可以根据这个id到pms_spu表中查询商品信息,并进行分页显示。
属性值、特性相同的商品就可以称为一个SPU
查询全部商品信息,但是可能出现查询结果数据较多时—采用分页显示的方式呈现(PageHelper实现分页查询)
分页查询的优点
服务器:一次性查询所有信息,服务器压力大,分页查询服务器压力小
客户端:一次性显示所有信息,需要更多流量,加载时间也会边长,分页显示没有这个问题
用户体验上:一般最有价值的信息都是会在前几页展示,也方便用户记忆,多查询的数据使用率低
执行思路:根据分类id分页查询spu列表
最后:完成控制层(实现前端接口)–需要参数有–分类id,页码,每页条数
对应项目是
mall-front–server.port=10004
nacos—注册信息、方便远程调用
seata—分布式事务(只要涉及数据库的操作都启动)
测试步骤:
在Nacos\Seata启动的前提下
顺序启动Product\Front
进行测试接口文档
http://localhost:10004/doc.html
开发任务-3-商品详情
需求设计实现商品详情
在商品列表中选中商品后,会显示这个商品的详情信息
具体实现步骤
1、准备数据库
mall-pms---对应项目mall-product--server.port== 9010
2、业务层
分析业务逻辑:上面完成了查询spu列表,那点击某一个spu会通过对应spuId查询spu信息
商品详情页我们需要显示的信息包括
根据spuId查询spu信息
根据spuId查询spuDetail详情
根据spuId查询当前Spu包含的所有属性
根据spuId查询对应的sku列表
SKU是物理上不可分割的最小存货单元
其中根据spuId查询当前Spu包含的所有属性功能涉及了一个比较复杂的连表查询
根据spuId查询参数选项的思路
1.根据spu_id去pms_spu表查询category_id
2.根据category_id去pms_category表查询分类对象
3.根据category_id去pms_category_attribute_template表查询attribute_template_id
4.根据attribute_template_id去pms_attribute_template表查询attribute_template数据行
5.根据attribute_template_id去pms_attribute表查询对应所有属性信息行
SELECT
pa.id , pa.template_id , pa.name,
pa.description , pa.type,
pa.value_list , pa.unit
FROM pms_spu ps
JOIN pms_category pc ON ps.category_id=pc.id
JOIN pms_category_attribute_template pcat ON
pc.id=pcat.category_id
JOIN pms_attribute_template pat ON
pcat.attribute_template_id=pat.id
JOIN pms_attribute pa ON pa.template_id=pat.id
WHERE ps.id=4
执行思路:根据spuId查询查询当前商品的所有属性/规格用的对象,以及spuId查询sku信息用的对象
最后:完成控制层对应2个方法(实现前端接口)
- 根据spuId查询spu信息 --需要的参数—spuId
- 根据spuId查询参数列表的 --需要的参数—spuId
- 根据spuId查询sku列表–需要的参数—spuId
- 根据spuId查询spuDetail–需要的参数—spuId
对应项目是
mall-front–server.port=10004
nacos—注册信息、方便远程调用
seata—分布式事务(只要涉及数据库的操作都启动)
(这里其实不启动redis也不报错,因为暂时没有用到,但考虑到我们后续会把商品信息放到redis里面,所以启动也可以)
测试步骤
nacos\seata\redis保持启动
启动product 重起front
访问10004测试,测试上面四个控制器模块的方法
开发任务-4-购物车管理
需求设计实现购物车管理
登陆查看自己的购物车
这块涉及单点登陆知识
Spring Security框架用于实现登录,同时还可以将当前登录用户的权限信息保存
单点登录–涉及知识点sessionID,jwt、redis
如果判断一个用户是否具有指定角色\权限?
可以在控制器方法代码上添加@PreAuthorize(“[权限名称]”)
SpringSecurity在运行该方法之前进行检查,如果不具备这个权限返回403状态码
具体实现步骤
1、准备数据库
mall-pms---对应项目mall-product--server.port== 9010
mall-oms----对应项目mall-order--server.port== 10005
2、业务层
分析业务逻辑:首先处理登录涉及sso模块,登录到商城系统之后,查询商品点击添加到购物车、查询购物车、删除购物车中的商品、清空购物车
①添加到购物车
- 判断用户是否登录,只有登录后才能将商品新增到购物车
- 验证购物车信息的完整性(SpringValidation)
- 业务逻辑层要判断新增的sku是否在当前用户的购物车表中已经存在
- 如果不存在是新增sku流程
- 如果已经存在,是修改数量的流程
执行思路:
①在商品详情页面、可以通过选中具体规格之后确定要购买的sku信息、再点击"添加到购物车"按钮、就应该将选中的sku的信息保存在购物车中、最后:完成控制层(实现前端接口)
对应项目是
mall-order–server.port10005
mall-sso–server.port10002
nacos—注册信息、方便远程调用
seata—分布式事务(只要涉及数据库的操作都启动)
redis----存储分类信息
先启动Nacos/Seata
启动 passport(sso)/order
②查询购物车
根据用户id查询购物车中sku信息
返回值支持分页结果,按分页条件查询
开发控制层
需要启动的项目和插件参考①
重启order模块
③删除购物车中的商品
我们删除购物车的功能支持同时删除一个或多个购物车中的商品
基本思路就是将要删除的购物车商品的id数组传入到Mapper中进行删除
支持批量删除购物车中sku商品的方法(Long[] ids)
开发控制层
需要启动的项目和插件参考①
重启Order模块,测试删除功能
④清空当前登录用户购物车的功能
清空指定用户购物车中所有sku商品(Long userId)
需要启动的项目和插件参考①
重启order模块
⑤修改购物车的商品数量
修改购物车中商品数量的业务逻辑层方法
需要启动的项目和插件参考①
重启order模块
开发任务-5-新增订单和订单列表
需求设计实现购物最后一步付钱结算
在购物车里面点击对应商品进行结算付钱,生成订单
具体实现步骤
1、准备数据库
mall-pms---对应项目mall-product--server.port== 9010
mall-oms----对应项目mall-order--server.port== 10005
leafdb----对应项目mall-leaf--server.port=9090
2、业务层
分析业务逻辑:用户选中购物车中的商品后,点击添加订单、要收集订单信息(sku商品信息,价格信息,优惠和运费信息等)然后才能执行生成订单操作
1.首先将用户选中的sku库存减少相应的数量
2.用户购物车要删除对应的商品
3.对应oms_order表执行新增,也就是创建一个订单
4.在新增订单成功后,我们还要将订单中的每种商品和订单关系添加在oms_order_item表中
最后:完成控制层(实现前端接口)
除了之前一直使用的Nacos\Dubbo之外,创建订单的业务在减少库存时,是Dubbo调用的pms中的sku表,这就涉及了分布式事务seata,删除购物车,新增订单和新增订单项是order模块的功能
除了之前一直使用的Nacos\Dubbo之外,创建订单的业务在减少库存时,是Dubbo调用的pms中的sku表,这就涉及了分布式事务seata,删除购物车,新增订单和新增订单项是order模块的功能
执行思路:
1、用户id和skuId来指定要删除的购物车商品
2、编写新增订单功能
一个订单可能包含多件商品,如果每件商品都单独新增到数据库,会造成连库次数多,效率低
我们采用一次连库增加多条订单项的方式,提升连接\操作数据库的效率
Leaf—Leaf是美团公司开源的一个分布式序列号(id)生成系统
实际开发中常见的读写分离的数据库部署格式 专门进行数据更新(写)的有两个数据库节点 它们同时新增数据可能产生相同的自增列id
一旦生成相同的id,数据同步就会有问题 会产生id冲突,甚至引发异常 我们为了在这种多数据库节点的环境下能够产生唯一id可以使用Leaf来生成 leaf要想设置起始值和缓存数 需要给leaf创建一个指定格式的数据库表 运行过程中会从数据库表获取信息
我们当前的信息保存在leafdb.leaf_alloc表中
对应项目是
mall-leaf–server.port=9090
mall-product–server.port=9010
mall-sso–server.port10002
mall-order–server.port10005
nacos—注册信息、方便远程调用
seata—分布式事务(只要涉及数据库的操作都启动)
查询订单数据
分析:在新增订单成功之后,用户会看到订单列表,可以按照一定时间范围内进行查询、默认是一个月、指定时间分页查询订单列表
测试同上
修改订单状态–订单id修改订单状态
0=未支付 (订单的默认状态)
1=已关闭 (超时未支付)
2=已取消
3=已支付
4=已签收
5=已拒收
6=退款处理中
7=已退款
开发任务-6-搜索商品
需求设计实现搜索商品
通过搜索查询想要的商品
具体实现步骤
1、准备数据库
mall-pms---对应项目mall-product--server.port== 9010
2、业务层
分析业务逻辑:
电商网站一定会有按用户输入的关键字进行搜索的功能
这样的搜索都是搜索ES查询到的结果
执行思路:
最后:完成控制层(实现前端接口)
对应项目是
mall-search–server.port=10008
mall-sso–server.port==10002
nacos—注册信息、方便远程调用
seata—分布式事务(只要涉及数据库的操作都启动)
ES----搜索
开发任务-7-高并发秒杀商品
需求设计实现XXX
具体实现步骤
1、准备数据库
mall-pms---对应项目mall-product--server.port== 9010
2、业务层
分析业务逻辑:
执行思路:
最后:完成控制层(实现前端接口)
对应项目是
mall-front–server.port=10004
nacos—注册信息、方便远程调用
seata—分布式事务(只要涉及数据库的操作都启动)
redis----存储分类信息