前端:brand.vue
后端:BrandController Brandservice BrandEntity
1.查询品牌列表 分页查询
前端发送请求:
// 获取数据列表
getDataList() {
this.dataListLoading = true;
this.$http({
url: this.$http.adornUrl("/gulimallproduct/brand/list"),
method: "get",
params: this.$http.adornParams({
page: this.pageIndex,
limit: this.pageSize,
key: this.dataForm.key,
}),
后端接收
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
PageUtils page = brandService.queryPage(params);
return R.ok().put("page", page);
}
返回R R中包含key为“page”的value ,也就是PageUtils类型的数据 ,此类为自定义类,有当前页 每页记录数 总记录数等属性
queryPage方法
@Override
public PageUtils queryPage(Map<String, Object> params) {
//需要先判断是不是带有条件 依据就是前端如果带条件,请求就会带一个key属性。
//http://localhost:88/api/gulimallproduct/brand/list?t=1636852820475&page=1&limit=10&key=aa
//查询条件
QueryWrapper<BrandEntity> queryWrapper = new QueryWrapper<>();
//从请求参数中获取到key
String key = (String) params.get("key");
//如果key不为空,就开始封装条件,eq相等,like模糊查询。
if(!StringUtils.isEmpty(key)){
queryWrapper.eq("brand_id",key).or().like("name",key);
}
//查询
IPage<BrandEntity> page = this.page(
new Query<BrandEntity>().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
如果带有条件需要先根据条件查询
此处调用ServiceImpl的方法 page 返回mybatisplus的IPage接口类型,传入IPage类型和QueryWrapper类型。此处通过自定义的类Query 获取到IPage类型
其他增删改查都是调用基础方法,修改和保存需要进行数据校验(前端和后端),此处采用JSR303校验。
使用步骤:
1.pom引入依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
2.在需要校验的字段加上注解(@NotNull,@NotEmpty,@NotBlank),可以指定错误返回信息
@NotNull 可以接收任何类型 数据不能为空
@NotEmpty 字段不能为null或"",可以接收字符串,数组,集合
@NotBlank 只能接收字符,字段不能为空,必须有一个非空字符
3.在请求方法中加入validated注解
4.测试结果
5.返回结果不符合要求,必须是我们自定义的返回结果
6.这种是针对于该请求设置了一个内容校验,如果针对于每个请求都单独进行配置,显然不是太合适,实际上可以统一的对于异常进行处理。方法:抽取一个异常处理类
7.测试
8.分组校验
(1)给校验注解加上groups
(2) 业务方法使用@validated注解
9自定义校验器和校验注解
(1)校验器
(2)自定义校验注解
(3)使用
**品牌分类关联 数据库表名:pms_category_brand_relation
比如华为品牌,可以关联手机电视等分类
(1)查询关联列表
前端请求:
getCateRelation() {
this.$http({
url: this.$http.adornUrl("/gulimallproduct/categorybrandrelation/catelog/list"),
method: "get",
params: this.$http.adornParams({
brandId: this.brandId
})
后端接收:
/**
* 根据当前的品牌id获取所有关联的分类
*/
@GetMapping("/catelog/list")
//@RequiresPermissions("product:categorybrandrelation:list")
public R cateloglist(@RequestParam("brandId")Long brandId){
List<CategoryBrandRelationEntity> data = categoryBrandRelationService.list(
new QueryWrapper<CategoryBrandRelationEntity>().eq("brand_id",brandId)
);
return R.ok().put("data", data);
}
(2)新增品牌分类关联
前端请求:
this.$http({
url: this.$http.adornUrl("/gulimallproduct/categorybrandrelation/save"),
method: "post",
data: this.$http.adornData({
brandId:this.brandId,catelogId:this.catelogPath[this.catelogPath.length-1]}, false)
}).then(({
data }) => {
this.getCateRelation();
});
},
后端接收:
/**
* 保存 品牌分类关联
*/
@RequestMapping("/save")
public R save(@RequestBody CategoryBrandRelationEntity categoryBrandRelation){
categoryBrandRelationService.saveDetail(categoryBrandRelation);
return R.ok();
}
saveDetail方法:
@Override
public void saveDetail(CategoryBrandRelationEntity categoryBrandRelation) {
Long brandId = categoryBrandRelation.getBrandId();
Long catelogId = categoryBrandRelation.getCatelogId();
//1、查询详细名字
BrandEntity brandEntity = brandDao.selectById(brandId);
CategoryEntity categoryEntity = categoryDao.selectById(catelogId);
categoryBrandRelation.setBrandName(brandEntity.getName());
categoryBrandRelation.setCatelogName(categoryEntity.getName());
this.save(categoryBrandRelation);
}
先获取到品牌id和分类id,根据id查询品牌和分类名,然后保存。
此处表中两个名字为冗余字段,避免关联查询,(关联查询对数据库影响比较大)
所以保存的时候,把名字也查出来进行保存。
这样带来一个问题,就是修改品牌名或分类名时,该表中的数据要同步更新,保证冗余字段的数据一致性
CatrgoryServiceImpl中:
@Override
public void updateDetail(BrandEntity brand) {
//保证冗余字段的数据一致
this.updateById(brand);
//如果修改了名字 ,品牌分类关联表也要修改
if(!StringUtils.isEmpty(brand.getName())){
//同步更新其他关联表中的数据
categoryBrandRelationService.updateBrand(brand.getBrandId(),brand.getName());
}
//TODO 更新其他关联
}
CategoryServiceImpl中:
@Transactional
@Override
public void updateCascade(CategoryEntity category) {
this.updateById(category);
categoryBrandRelationService.updateCategory(category.getCatId(),category.getName());
}
更新的同时都要更新关联表的名字
CategoryBrandRelationServiceImpl中:
@Override
public void updateCategory(Long catId, String name) {
//两种方式 一种是创建实体类,然后调用this.update进行更新
//第二种mapper.xml中写sql语句
this.baseMapper.updateCategory(catId,name);
}
@Override
public void updateBrand(Long brandId, String name) {
CategoryBrandRelationEntity categoryBrandRelationEntity = new CategoryBrandRelationEntity();
categoryBrandRelationEntity.setBrandId(brandId);
categoryBrandRelationEntity.setBrandName(name);
this.update(categoryBrandRelationEntity,new UpdateWrapper<CategoryBrandRelationEntity>().eq("brand_id",brandId));
}