1.给属性分组模块添加模糊查询功能
@Override
public PageUtils queryPage(Map<String, Object> params, Long catelogId) {
String key = (String) params.get("key");
//带有模糊查询数据的就用new QueryWrapper
QueryWrapper<AttrGroupEntity> wrapper = new QueryWrapper<AttrGroupEntity>();
// 如果传过来的key不为空
if (!StringUtils.isEmpty(key)){
// 拼接后面的模糊查询and (attr_group_id = key or attr_group_name like %key%)
wrapper.and(obj->{
obj.eq("attr_group_id",key).or().like("attr_group_name",key);
});
}
if (catelogId==0){
//等于0就相当于查询所有~~
IPage<AttrGroupEntity> page = this.page(
new Query<AttrGroupEntity>().getPage(params),
wrapper
);
return new PageUtils(page);
}else {
//检索条件
// select * from pms_attr_group where catelog_id = ? and (attr_group_id = key or attr_group_name like %key%)
wrapper.eq("catelog_id",catelogId);
// 查询出来数据之后开始跟分页一起返回封装
IPage<AttrGroupEntity> page = this.page(new Query<AttrGroupEntity>().getPage(params),wrapper);
return new PageUtils(page);
}
}
2.介绍一下VO对象
1.view object (vo) 它类似与一个实体类,它是接受页面传递过来的数据,将业务处理完成的对象,封装成页面想要的对象,
好比如说实体类中的每一个对象,对应的是数据库中的每一个字段,这时候前台需要接受一个数据库中没有的字段,这个
时候就可以创建一个vo对象,这个类中可以不加任何的注解。
package com.atdada.dadamall.product.vo;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
/**
* @Author:dada
* @Date:2020/11/5 21:53
* @Version 1.0
*/
@Data
public class AttrVo {
/**
* 属性id
*/
private Long attrId;
/**
* 属性名
*/
private String attrName;
/**
* 是否需要检索[0-不需要,1-需要]
*/
private Integer searchType;
/**
* 属性图标
*/
private String icon;
/**
* 可选值列表[用逗号分隔]
*/
private String valueSelect;
/**
* 属性类型[0-销售属性,1-基本属性,2-既是销售属性又是基本属性]
*/
private Integer attrType;
/**
* 启用状态[0 - 禁用,1 - 启用]
*/
private Long enable;
/**
* 所属分类
*/
private Long catelogId;
/**
* 快速展示【是否展示在介绍上;0-否 1-是】,在sku中仍然可以调整
*/
private Integer showDesc;
/**
*不是库里面的
*/
private Long attrGroupId;
}
2.钱太多传递了一个数据库中字段没有的参数(attrGroupId字段),接下来就在项目中创建vo对象,在做保存方法的时候
加上vo的这个参数,下面是我写的实现层:
//整个方法也是一个事务
@Transactional
@Override
public void saveAttr(AttrVo attr) {
//new出来的是一个PO,是对应数据库的,AttrVo对象是来源于页面的数据
AttrEntity attrEntity = new AttrEntity();
//前台传过来的数据(vo对象)再次赋值给这个(PO)实体类的对象
// attrEntity.setAttrName(attr.getAttrName());
//发现上面的做法太累了,可以使用一个封装好的类,将前台传递的值,复制给数据库的字段
BeanUtils.copyProperties(attr,attrEntity);
//1.保存基本数据完成
this.save(attrEntity);
//2.保存关联的信息
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
relationEntity.setAttrGroupId(attr.getAttrGroupId());
relationEntity.setAttrId(attrEntity.getAttrId());
attrAttrgroupRelationDao.insert(relationEntity);
}
3.写查询的功能
接口文档
实现的代码Controlelr层
@GetMapping("/base/list/{catelogId}")
public R baseAttrList(@RequestParam Map<String, Object> params,@PathVariable("catelogId") Long catelogId/*路径变量就要用上这个参数*/){
//开始带上参数查询数据返回PageUtils page
PageUtils page = attrService.queryBaseAttrPage(params,catelogId);
return R.ok().put("page", page);
}
实现层
@Override
public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId) {
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<>();
//如果catelogId==0说明是查看所有的,反之~
if (catelogId != 0){
queryWrapper.eq("catelog_id",catelogId);
}
//获取key的就值
String key = (String) params.get("key");
//如果key不为空的时候说明是有参数传进来的
if (!StringUtils.isEmpty(key)){
//sql语句后面接and并且后面两个条件需要()一起括起来就可以写这个()—>箭头函数
queryWrapper.and((wrapper)->{
wrapper.eq("attr_id",key).or().like("attr_name",key);
});
}
IPage<AttrEntity> page = this.page(
new Query<AttrEntity>().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
返给前台页面显示效果
我们发现有两个字段是空的,加下来还要写一个VO对象
package com.atdada.dadamall.product.vo;
import lombok.Data;
/**
* @Author:dada
* @Date:2020/11/5 22:32
* @Version 1.0
*/
@Data
//这个类是一个相应给前台的Vo对象,可以继承AttrVo里面的所有对象值
public class AttrRespVo extends AttrVo{
private String catelogName;
private String groupName;
}
接下来继续在实现层做增加一些逻辑
@Override
public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId) {
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<>();
//如果catelogId==0说明是查看所有的,反之~
if (catelogId != 0){
queryWrapper.eq("catelog_id",catelogId);
}
//获取key的就值
String key = (String) params.get("key");
//如果key不为空的时候说明是有参数传进来的
if (!StringUtils.isEmpty(key)){
//sql语句后面接and并且后面两个条件需要()一起括起来就可以写这个()—>箭头函数
queryWrapper.and((wrapper)->{
wrapper.eq("attr_id",key).or().like("attr_name",key);
});
}
IPage<AttrEntity> page = this.page(
new Query<AttrEntity>().getPage(params),
queryWrapper
);
//这里通过测试发现少了两个字段名称(catelogName,groupName)没有显示出来,但是可以通过这个分页中获取出来
PageUtils pageUtils = new PageUtils(page);
List<AttrEntity> records = page.getRecords();//获取记录
List<AttrRespVo> attr_id1 = records.stream().map(item -> {
AttrRespVo attrRespVo = new AttrRespVo();
//创建出新的对象,可以把基本的数据拷贝过来
BeanUtils.copyProperties(item, attrRespVo);
//接下来调用dao去数据库查询来设置分类分组的名字
//1.关联关系的表查询一条记录
AttrAttrgroupRelationEntity attr_id = attrAttrgroupRelationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", item.getAttrId()));
//2.得到这个组的di,这里有可能会是空的,因为第一次录数据没有指点组,就会出现空,这里还需要判定空指针
if (attr_id != null) {
//根据id查询出一条数据来,然后开始取值
AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attr_id.getAttrGroupId());
attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());
}
//以上是分组的就赋值好了
//以下是分类
CategoryEntity categoryEntity = categoryDao.selectById(item.getCatelogId());
if (categoryEntity != null) {
attrRespVo.setCatelogName(categoryEntity.getName());
}
return attrRespVo;
//收集成一个集合返回
}).collect(Collectors.toList());
//赋值到pageUtils中
pageUtils.setList(attr_id1);
return pageUtils;
}
最终效果如下:
以上是我的个人笔记,探索未知密宝,记录学习笔记,分享有趣的故事,欢迎大家来访!