因最近又被困在了OSGI技术POC,更新进度有点慢,希望大家不要怪罪哦。
上节 我们实现了登录之后前端的展示,如:
接着,我们来实现左侧分类栏目的功能。
从上图我们可以看出,商品的分类其实是有层级关系的,而且这种关系一般都是无限层级。在我们的实现中,为了效果的展示,我们仅仅是展示3级分类,在大多数的中小型电商系统中,三级分类完全足够应对SKU的分类。
先来分析分类都包含哪些元素,以jd
为例:
分类Id
跳转到固定的分类商品列表展示页面,但是在一些特殊的场景,比如我们要做一个活动,希望可以点击某一个分类的主图直接定位到活动页面,这个url就可以使用了。在上一小节,我们简单分析了一下要实现商品分类的一些points
,那么我们最好在每次拿到需求【开发之前】,对需求进行拆解,然后分解开发流程,这样可以保证我们更好的理解需求,以及在开发之前发现一部分不合理的需求,并且如果需求设计不合理的话,开发人员完全有权,也有责任告知PM。大家的终极目的都是为了我们做的产品更加合理,好用,受欢迎!
1.在com.liferunner.service
中创建service 接口ICategoryService.java
, 编写查询所有一级分类的方法getAllRootCategorys
,如下:
2.编写实现类com.liferunner.service.ICategoryService.java
上述代码很好理解,创建tk.mybatis.mapper.entity.Example
,将条件传入,然后使用通用Mapper
查询到type=1
的一级分类,接着将查到的对象列表转换为DTO对象列表。
一般情况下,此类查询都会出现在网站的首页,因此我们来创建一个com.liferunner.api.controller.IndexController
,并对外暴露一个查询一级分类的接口:
编写完成之后,我们需要对我们的代码进行测试验证,还是通过使用RestService
插件来实现,当然,大家也可以通过Postman来测试。
因为根据一级id查询子分类的时候,我们是在同一张表中做自连接查询,因此,通用mapper已经不适合我们的使用,因此我们需要自定义mapper来实现我们的需求。
在之前的编码中,我们都是使用的插件帮我们实现的通用Mapper
,但是这种查询只能处理简单的单表CRUD
,一旦我们需要SQL 包含一部分逻辑处理的时候,那就必须得自己来编写了,let's code.
1.在项目mscx-shop-mapper
中,创建一个新的custom package
,在该目录下创建自定义mappercom.liferunner.custom.CategoryCustomMapper
。
2.resources
目录下创建目录mapper.custom
,以及创建和上面的接口相同名称的XML
文件mapper/custom/CategoryCustomMapper.xml
TIPS 上述创建的package,一定要在项目的启动类
com.liferunner.api.ApiApplication
中修改@MapperScan(basePackages = { "com.liferunner.mapper", "com.liferunner.custom"})
,如果不把我们的custom
package加上,会造成扫描不到而报错。
在上面的xml中,我们定义了两个DTO对象,分别用来处理二级和三级分类的DTO,实现如下:
编写完自定义mapper之后,我们就可以继续编写service了,在com.liferunner.service.ICategoryService
中新增一个方法:getAllSubCategorys(parentId)
.如下:
在com.liferunner.service.impl.CategorySericeImpl
实现上述方法:
以上我们就已经实现了和jd
类似的商品分类的功能实现。
这个就是jd
或者tb
首先的最顶部的广告图片是一样的,每隔1秒自动切换图片。接下来我们分析一下轮播图中都包含哪些信息:
直接查询出所有的有效的
轮播图片,并且进行排序
。
和商品分类实现一样,在mscx-shop-service
中创建com.liferunner.service.ISlideAdService
并实现,代码如下:
从上述可以看到,这里我使用的是构造函数注入SlideAdsMapper
,其余代码单表查询没什么特别的,根据条件查询轮播图,并返回结果,返回的对象是com.liferunner.dto.SlideAdResponseDTO
列表,代码如下:
在com.liferunner.api.controller.IndexController
中,新添加一个查询轮播图API,代码如下:
在我们的实现代码中,有心的同学可以看到,我使用了3种不同的Bean注入方式:
那么,这几种注入都有什么区别呢?首先我们下了解一下Spring的注入是干什么的?
Spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。 依赖注入的另一种说法是"控制反转"。通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员, 而控制反转是指new实例工作不由我们程序员来做而是交给Spring容器来做。
在传统的SpringMVC中,大家使用的都是XML注入
,比如:
注入之后,使用@Autowired
,我们可以很方便的自动从IOC容器中查找属性,并返回。
@Autowired的原理 在启动spring IoC时,容器自动装载了一个
AutowiredAnnotationBeanPostProcessor
后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。 注意事项: 在使用@Autowired时,首先在容器中查询对应类型的bean 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据 如果查询的结果不止一个,那么@Autowired会根据名称来查找。 如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false source传送门
上述三种注解方式,其实本质上还是注入的2种:set属性注入
& 构造器注入
,使用方式都可以,根据个人喜好来用,本人喜欢使用lombok插件注入
是因为,它将代码整合在一起,更加符合我们Spring自动注入的规范。
下一节我们将继续开发我们电商的核心部分-商品列表和详情展示,在过程中使用到的任何开发组件,我都会通过专门的一节来进行介绍的,兄弟们末慌!
gogogo!