抽取出一个tree组件放到modules下的common下的category.vue
在attrgroup.vue中的左边6列使用刚才抽取的组件
在右边18列使用表格,直接复制自动生成的attrgroup.vue中的表格
查询
查询全部
新增
批量删除
关联
修改
删除
attrgroup-add-or-update.vue
效果展示:

父子组件传递数据
1、子组件给父组件传递数据,事件机制
2、父组件给父组件发送一个事件this.$emit(“事件名”,携带的数据),携带上数据
具体实现:
在抽取的category.vue中,当树被点击后,给父组件发送一个事件
//树被点击
nodeclick(data,node,component){
console.log("子组件的节点被点击",data,node,component);
//向父组件发送事件
this.$emit("tree-node-click",data,node,component)
}
},
//感知树节点被点击
treenodeclick(data, node, component) {
console.log("父组件感知到树节点被点击了",data.catId);
},
实现点击节点和输入查询条件进行查询
当我们不点击节点时,默认查询全部

当点击节点时,则需要根据节点查询数据
修改后端代码添加一个Long catelogId
/**
* 列表
*/
@RequestMapping("/list/{catelogId}")
public R list(@RequestParam Map params,
@PathVariable("catelogId") Long catelogId){
// PageUtils page = attrGroupService.queryPage(params);
PageUtils page = attrGroupService.queryPage(params,catelogId);
return R.ok().put("page", page);
}
实现queryPage()方法
@Override
public PageUtils queryPage(Map<String, Object> params, Long catelogId) {
if (catelogId==0){
//如果没有点击节点
//查询全部
IPage<AttrGroupEntity> page = this.page(
new Query<AttrGroupEntity>().getPage(params),
new QueryWrapper<AttrGroupEntity>()
);
return new PageUtils(page);
}
else{
QueryWrapper<AttrGroupEntity> queryWrapper=new QueryWrapper<>();
//SELECT attr_group_id,icon,catelog_id,sort,descript,attr_group_name FROM pms_attr_group WHERE (catelog_id = ?)
//构造查询条件
queryWrapper.eq("catelog_id",catelogId);
String key = (String)params.get("key");
if (!StringUtils.isEmpty(key)){
queryWrapper.and((obj)->{
obj.like("attr_group_id",key).or().like("attr_group_name",key);
});
}
//还需要模糊查询
IPage<AttrGroupEntity> page=this.page(
new Query<AttrGroupEntity>().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
}
修改前端代码
//感知树节点被点击
treenodeclick(data, node, component) {
console.log("父组件感知到树节点被点击了",data.catId)
if(data.catLevel==3){
//三级节点
this.catId=data.catId;
//调用查询方法
this.getDataList();
}
},
在data中定义一个catId用来存放当前被点击的id

设置所属分类选项为级联选择器
在data中设置
categorys:[],
prop:{
value:"catId",
label:"name",
children:"children"
},
在页面初始化时查询分类
created() {
this.getCategorys();
}

发现当音乐的children为空时,右边会显示
使用@JsonInclude(JsonInclude.Include.NON_EMPTY)注解
当节点的children为空时,不返回children
//子分类
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@TableField(exist = false)//不是表中的数据
private List children;


将catelogIds变成数组
定义cattelogId,存放所属分类id
修改表单提交传的数据catelogId为catelogId数组的最后一个单词
// 表单提交
dataFormSubmit () {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
this.$http({
url: this.$http.adornUrl(`/product/attrgroup/${!this.dataForm.attrGroupId ? 'save' : 'update'}`),
method: 'post',
data: this.$http.adornData({
'attrGroupId': this.dataForm.attrGroupId || undefined,
'attrGroupName': this.dataForm.attrGroupName,
'sort': this.dataForm.sort,
'descript': this.dataForm.descript,
'icon': this.dataForm.icon,
'catelogId': this.dataForm.catelogIds[this.dataForm.catelogIds.length-1]
实现所属分类的回显

统一将this.dataForm.catelogIds变为catelogPath存放路径
要想实现回显所属分类id,就需要查找完整路径

修改查询信息
给AttrGroupEntity添加属性
@TableField(exist = false)
private Long[] catelogPath;
/**
* 信息
*/
@RequestMapping("/info/{attrGroupId}")
public R info(@PathVariable("attrGroupId") Long attrGroupId){
AttrGroupEntity attrGroup = attrGroupService.getById(attrGroupId);
Long catelogId = attrGroup.getCatelogId();
Long[] path=categoryService.findCatelogPath(catelogId);
attrGroup.setCatelogPath(path);
return R.ok().put("attrGroup", attrGroup);
}
编写findCatelogPath(catelogId)方法
//找到catelogId的完整路径[父/子/孙子]
@Override
public Long[] findCatelogPath(Long catelogId) {
List paths=new ArrayList<>();
List parentPath = findParentPath(catelogId, paths);
Collections.reverse(parentPath );
//转换成数组
return parentPath.toArray(new Long[parentPath.size()]);
}
private List findParentPath(Long catelogId,List paths) {
paths.add(catelogId);
CategoryEntity byId = this.getById(catelogId);
if (byId.getParentCid()!=0){
//有父分类
findParentPath(byId.getParentCid(),paths);
}
return paths;
}
问题:当我们点击新增时,所属分类id没有清空
当关闭对话框时,清空所属分类id
使用对话框的closed事件
dialogClosed(){
this.dataForm.catelogPath=[];
},
优化所属分类id的级联关系显示

解决分页问题
使用mybatisPlus的分页插件
@Configuration
public class MyBatisConfig {
@Bean
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor=new PaginationInterceptor();
paginationInterceptor.setOverflow(true);
paginationInterceptor.setLimit(500);
return paginationInterceptor;
}
}

实现品牌管理的模糊查询功能
@Service("brandService")
public class BrandServiceImpl extends ServiceImpl implements BrandService {
@Override
public PageUtils queryPage(Map params) {
QueryWrapper queryWrapper = new QueryWrapper<>();
String key = (String)params.get("key");
if (!StringUtils.isEmpty(key)){
//进行模糊查询
queryWrapper.eq("brand_id",key).or().like("name",key);
}
IPage page = this.page(
new Query().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
将资料中前端的product和common覆盖自己写的
出现关联分类按钮
自己新增下面四个品牌
