00:00
接下来我们编写测试属性分组的功能,首先前面我们将属性分组的一些基本增删改查写完了,包括我们的模糊查询,比如我们现在来选中手机类下,它会查到手机类下的分组来查询一号,点击查询是没问题的,我们还新添了查询全部的功能,当我们点击查询,我们发送请求的时候呢,会自动的将我们的分类ID至为零,这样我们就是查所有了。当然在查询全部的时候,我们发现在这一块并没有带上模糊查询的功能,我们来调整一下接口。来到我们product at tr group list里边来找一下at tr group control product at tr group list,那现在来如果传的是零。那我们就要查所有,先查所有呢,没有模糊查询,我们进来ctrl out,点击鼠标我们跳进来,我们发现呢,我们在这给它拼接模糊条件的时候,放到了else里边,也就是分类ID不是零的情况,但无论是零不是零,查询全部还是查询指定分类,我们都要模糊查询条件,那我把它提前,大家呢都用这个wrapper,都用我们指定的这个waper。
01:11
只不过wapper后边要瓶装的这个一口。这个就。不是上来就拼装了,我把这个剪贴过来,我们这个依口条件呢是else,当我们有分类ID的时候,我们才拼分类ID,那我们就把这个vaper来拼装上waper第2E口。我们重新启动来进行测试启动。我们现在来测试一下,当我来搜索主,我们来查询全部的时候,现在也拥有了模糊检索功能,来,我们来把这个条件给它制空,我们现在就查手机分类下,那么属性分组里边呢,还有一个功能叫关联,当我来点击关联,首先呢,我们看这会发送请求,在这一块呢,会查出当前分组关联的所有属性,以京东为例,我们每一个商品的这些规格参数,它都有它所属的分组,所以我们要维护它们之间的关联关系,在我们这里边呢,就可以查出它的关联关系,但我们还可以新建关联,将我们某个属性与当前分组继续进行关联。
02:17
好,我们先把这些都关掉,那我们想要关联一些属性,那我们就得先录入一些属性,我们先来到规格参数里边,我们点击规格参数呢,它会发送请求,我把它删掉,来看一下,来点击规格参数,它来发送第一个请求,叫product at t base list,它是来获取基础属性的列表,基础属性就是我们说的这些规格参数,我们可以录入一些这些属性,那么就先来调试新增功能,在新增的时候呢,我们可以选择属性名。以及我们属性类型,比如我们来写了一个属性名,我们照着这复制一个,比如我们就叫入网型号。复制,当我们在这儿选中属性名以后,来可以选中它是什么属性,是销售属性还是规格参数,包括这个属性在我们后来录商品信息的时候,这个属性可以允许我们录入多个值,还是只能使用单个值,包括我们自己也可以提前先录入一些可选值列表,那后来我们在录商品的时候,比如新增这个iPhone的时候,我们就可以在CPU型号里边,在我们已经录入的可选值列表里边选中一个也是很方便的。好,我们继续录入可选值,比如我写一个a ABB。
03:33
好,我们来点击。这个属性图标呢,我们也可以写上,包括所属的分类,在这一块呢,我们可以选中这个属性是属于哪个三级分类里边的,选中分类以后呢,我们在这还可以获取到当前三级分类关联的所有属性分组信息,那这个接口呢,是product at tr group list,那这个呢,我们以前都写过,我们写过这个获取某一个分类下的所有属性分组,就是这个分页查询。
04:01
因为我们这个属性分组之前都能用,所以他在这儿展示出来,包括这个属性是不是可以被检索的,是不是一个快速展示,快速展示呢,我们是可以放到商品介绍里边,作为一个提前预览信息,当我们属性录入完成以后,当我们来点击保存,点击确定,我们就会发送保存请求,但这个保存呢,我们来看一下效果,那在这发送保存的时候会提交非常多的数据,首先属性名等等这些信息,包括它属于的三级分类,以及它属于哪个分组的,但是这个保存默认能成功的原因是我们已经使用了逆向生成的这个保存,来看一下他发的这个请求叫。Product at tr save,我们来到at tr controlrler,在save里边,它这是一个基本保存,在这个基本保存呢,它会封装at tr dt里边的这些信息,这些信息里边呢,只包含了三级分类的ID,并没有包含这个属性所属于哪个分组的,所以我们发的这个请求虽然将数据保存进来了,来看一下at tr,我们来刷新七号的属性,叫入网型号,这些信息呢都有,但它跟属性的分组没有关联起来,来看关联关系,在这张表呢,都是空的。
05:18
所以我们要重写这个保存方法,而且我们页面提交的数据还会多一个at tr group ID字段。我们以前的做法呢,是可以给这来添加一个字段,告诉WMVC来多封装一个这个值,同时还要告诉满杯这个不属于表里边的池。Exist等于false,但是我们以后就不这么写了,因为这样不规范。我们提倡大家在这个包下专门来写一个包,叫VO。那什么是VO呢?为了我们项目更清晰的分层,我们将每种不同的对象按照它功能进行了一些划分。比如我们Java里边常用的有这么多种,O po persistent object就是持久对象,它就是对应数据表中的某一条记录。比如我们的这些entity实体类,每一个实体类都是对应某一张表,那它的一个对象就应该对应表中的一条记录,我们把它可以称为po。还有我们的do叫领域对象,只要是抽取我们业务的一些概念形成的对象,我们都可以为领域对象。还有我们说的po叫数据传输对象,比如我们后来微服务跟微服务之间要互相调用并且传输数据,那这些数据呢,最终会被封装或者。
06:37
发送出去,那被封装和发送出去的这个对象,我们就可以称为to,它叫传输对象,还有d to跟它一个概念,都是传输对象。接下来就是我们的view,我们叫值对象,其实在我们这一块的应用,我们一般可以称为它叫view object,叫视图对象,这样呢更形象。视图对象的作用是什么?它就是在这儿来接收请求,将请求的数据封装,那业务层处理完了以后呢,还要响应出去,而且响应的数据往往都是一些自定义信息,不是我们整个实体类的完整数据,比如一些用户信息,那响应的时候可能没有密码,要去掉一些其他字段等等,而且不同这种场景接收请求封装的值也不一样,我们都在这儿,比如以前我们品牌进行数据校验的时候呢,我们都将这些注解标注在我们实体类上,也就是我们这些po对应的数据库这些类上,这很麻烦,后来呢,每一个对象都标了超多。
07:38
做的注解也很乱,比如有一些我们这些校验注解,那么之前还标过咱们这个杰森注解,其实这个杰森呢,就是为了响应出去将滞空的不返回的,那么将这些功能都标注在这些实体类上,是一个非常不规范的操作,所以我们推荐我们用VO,那VO以后的作用就是接收我们页面传递来的数据封装对象。
08:04
除此之外呢,我们还应该是将业务处理完的对象,将业务处理完成的对象封装成页面。要用的数据。比如用户信息,我们最终封装出来不要password,不要他身份证号等等等等,包括还有其他各种o Bo是我们业务对象,比如这举一个例子,我们一个简历呢,很复杂,有教育经历、工作经历、社会关系等等,那教育经历呢,可能是数据库里边的一条或几条字段对应一个po,工作经验也对应数据库的,社会关系也对应数据库的,但他们三个合起来就组成了我们一个业务对象,就是我们的简历,那么就可以用一个类来封装这三个属性,那我们把这个类创建的对象我们就叫Bo,还有po go就是一个普通的Java对象。我们可以认为以上所有的O都是pogo,包括DAO,这就是大家最熟悉的了,用来访问数据库的对象,我们就称为DAO,比如我们的这些map,最终MY贝蒂斯会为他们创建出代理对象,由他们来访问数据库,那他们就是DAO,所以我们给这儿加了DAO3个字。
09:20
那基于这个特点呢,我就在这来编写一个叫at tr VO,在at tr VO里边呢,我们将at tr实体类里边所有的属性我都可以复制过来,CTRLC。CTRLC,而且呢,我们还会多加一个属性,就是分类的ID,但是在VIVO里边我们就不需要标注跟数据库有关的注解了,微由是来封装请求和响应数据的,好,我们再来把这个分组的ID复制过来。放在这个VO上边,同样的我们为它标注an注解。让long bank自动为我们生成get set方法,那我们这一块的save at tr CTR了,那我我的这个save呢,我就变成at tr VO,此时呢,这个VO就能收集来源于页面的这些数据,特别能多收集一个at tr group ID。
10:16
那接下来呢,我们就要调用业务进行处理,我们可以来新增一个方法,就叫save at tr,我们将at tr VO收集来的数据传给我们这个service,那service来进行处理好,我们创建出这个方法,但要处理之前的第一步,首先给at tr表里边保存基本信息,然后再保存它关联的这个分组信息,所以我们需要做的就是this.save那们首先要保存一个at tr n t来又一个at tr nt。这个呢是一个po,它是来对应数据库的,我们最终要把这个保存到数据库,然后这里边的所有值都是来源于页面的,所以我们应该将页面提交来的这些值,比如我将它的at tr name catalog ID等等都取出来,封装镜at t r nity里边,那我们要一个一个的来写这个封装方法,At t r nity.set比如我们这个set at tr name是从at tr里边取出的at tr name,这样会是很麻烦,我们呢使用spring家提供的一个工具类叫being us,它有一个叫copy properties。
11:31
叫复制属性,第一个参数是属性的来源要复制到哪个对象里边,那我们相当于要将页面来的这些封装的值最终封装到这个po里边。将VO的值封装到po里边,前提条件,那就是VO里边的这些属性名跟我们的po里边的这些属性名是一一对应的,跟我们实体类里边这些是一一对应的。好,那么这个封装完我们这个实体类就有数据了,那这是第一步就完成了,保存基本数据,保存基本数据,接下来我们来做第二步,保存关联关系,保存关联关系,保存关联。
12:18
关系,关联关系呢,要使用关联关系的DAO,那我们就来有一个叫at t RA at tr group relation DA,我们就将关联关系的do拿过来,我们要保存它们的关联关系,我们就在这这呢有一个insert方法,我们直接拿它的do,他想要保存呢,它是保存这个,你有一个里边来传入我们at tr at tr group relation这个实体类。而这个实体类里边呢,主要接收两个,一个是我们属性的ID,还有一个属性分组的ID,那属性的ID和属性分组的ID都在哪里呢?首先属性分组的ID它在页面提交的这个VO里边,那么relation n我们set属性分组的ID,我们从这个VO里边获取到属性分组的ID,这是页面提交的。
13:15
而属性的ID我们刚才新增完,新增完我们也可以知道属性的ID,只需要把这个对象拿来,再调用get方法拿到它的ID就行了,那么将这个实体内呢,再一保存。整个方法呢,当然也是一个事物。我们重新启动测试一下这个保存。好,我们在这重新新增一个属性。比如我们这个属性呢,我再来录入一个值。在主体类里边。我们再录一个上市年份来复制一下,我们在这属性名叫上市年份,它只能允许单个值可选的值,比如2018。
14:03
2019。包括属性图标,我先都不设置所属的分类手机。它所属的分组是主体信息里边的。上市年份呢,不用来检索,也不用来快速展示,但是它是启用状态的,当来点击确定。好,保存成功来看数据库,数据库的这个关联关系里边已经有了at tri8号,对应分组是一号。那我们八号的at tr就是上市年份没问题,那么这个保存就写完了,下一节课我们再来编写查询它的这个列表功能。
我来说两句