本系列博客基于B站谷粒商城,只作为本人学习总结使用。这里我会比较注重业务逻辑的编写和相关配置的流程。有问题可以评论或者联系我互相交流。原视频地址谷粒商城雷丰阳版。本人git仓库地址Draknessssw的谷粒商城
/**
* 获取属性分组有关联的其他属性
* @param attrgroupId
* @return
*/
///product/attrgroup/{attrgroupId}/attr/relation
@GetMapping(value = "/{attrgroupId}/attr/relation")
public R attrRelation(@PathVariable("attrgroupId") Long attrgroupId) {
List<AttrEntity> entities = attrService.getRelationAttr(attrgroupId);
return R.ok().put("data",entities);
}
实现类
查询中间表(属性&属性分组表)的分组是请求参数分组id的记录
List<AttrAttrgroupRelationEntity> entities = relationDao.selectList
(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_group_id", attrgroupId));
通过streamAPI抽取出来属性id
List<Long> attrIds = entities.stream().map((attr) -> {
return attr.getAttrId();
}).collect(Collectors.toList());
判断一下为空的情况
//如果attrIds为空就直接返回一个null值出去
if (attrIds == null || attrIds.size() == 0) {
return null;
}
根据上面抽取的属性id在属性表里面查完后返回查询结果
List<AttrEntity> attrEntityList = this.baseMapper.selectBatchIds(attrIds);
return attrEntityList;
最终效果如下
@Autowired
AttrAttrgroupRelationDao relationDao;
/**
* 根据分组id查找关联的所有基本属性
* @param attrgroupId
* @return
*/
@Override
public List<AttrEntity> getRelationAttr(Long attrgroupId) {
List<AttrAttrgroupRelationEntity> entities = relationDao.selectList
(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_group_id", attrgroupId));
List<Long> attrIds = entities.stream().map((attr) -> {
return attr.getAttrId();
}).collect(Collectors.toList());
//如果attrIds为空就直接返回一个null值出去
if (attrIds == null || attrIds.size() == 0) {
return null;
}
List<AttrEntity> attrEntityList = this.baseMapper.selectBatchIds(attrIds);
return attrEntityList;
}
新建属性id和属性分组id的Vo
package com.xxxx.gulimall.product.vo;
import lombok.Data;
@Data
public class AttrGroupRelationVo {
//[{"attrId":1,"attrGroupId":2}]
private Long attrId;
private Long attrGroupId;
}
/**
* 删除关联
* @param vos
* @return
*/
@PostMapping("/attr/relation/delete")
public R deleteRelation(@RequestBody AttrGroupRelationVo[] vos ) {
attrService.deleteRelation(vos);
return R.ok();
}
实现类
将这个Vo数据里面的组id数据和属性id数据拷贝到AttrAttrgroupRelationEntity实体类,也就是通过组id和属性id确定需要删除的记录。
把记录传给删除方法,接着来创建这个删除方法。
最终效果如下
@Autowired
AttrAttrgroupRelationDao relationDao;
@Override
public void deleteRelation(AttrGroupRelationVo[] vos) {
// relationDao.delete(new QueryWrapper<>().eq("attr_id",1L).eq("attr_group_id",1L));
List<AttrAttrgroupRelationEntity> entities = Arrays.asList(vos).stream().map((item) ->{
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
BeanUtils.copyProperties(item,relationEntity);
return relationEntity;
}).collect(Collectors.toList());
relationDao.deleteBatchRelation(entities);
}
删除dao
@Mapper
public interface AttrAttrgroupRelationDao extends BaseMapper<AttrAttrgroupRelationEntity> {
void deleteBatchRelation(@Param("entities") List<AttrAttrgroupRelationEntity> entities);
}
xml文件
从属性&属性关联关系表中删除组id和属性id对应的记录
<delete id="deleteBatchRelation">
DELETE FROM
`pms_attr_attrgroup_relation`
WHERE
<foreach collection="entities" item="item" separator=" OR ">
(attr_id=#{item.attrId} AND attr_group_id=#{item.attrGroupId})
</foreach>
</delete>
这里会返回所有当前页面的信息,以及分组id
/**
* 获取属性分组没有关联的其他属性
*/
@GetMapping(value = "/{attrgroupId}/noattr/relation")
public R attrNoattrRelation(@RequestParam Map<String, Object> params,
@PathVariable("attrgroupId") Long attrgroupId) {
// List entities = attrService.getRelationAttr(attrgroupId);
PageUtils page = attrService.getNoRelationAttr(params,attrgroupId);
return R.ok().put("page",page);
}
实现类
首先,根据传入的组id去查询当前属性组分类表的记录。然后再从记录中获取它所属的分类id
//1、当前分组只能关联自己所属的分类里面的所有属性
AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupId);
//获取当前分类的id
Long catelogId = attrGroupEntity.getCatelogId();
根据这个分类id获取属性分组表中的这个分类拥有的所有分组,然后抽取出所有的分组id
//2.1)、当前分类下的其它分组
List<AttrGroupEntity> groupEntities = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>()
.eq("catelog_id", catelogId));
//获取到所有的attrGroupId
List<Long> collect = groupEntities.stream().map((item) -> {
return item.getAttrGroupId();
}).collect(Collectors.toList());
再根据这些组id去属性&属性关联关系表这个中间表抽取这些分组对应的所有的属性id
//2.2)、这些分组关联的属性
List<AttrAttrgroupRelationEntity> groupId = relationDao.selectList
(new QueryWrapper<AttrAttrgroupRelationEntity>().in("attr_group_id", collect));
List<Long> attrIds = groupId.stream().map((item) -> {
return item.getAttrId();
}).collect(Collectors.toList());
封装一个查询条件,查询当前分组所属分类下的所有基本属性。再从所有的属性中移除当前分类下所有分组关联的所有属性。此时查询的属性表的记录就是没有被关联的属性。
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>()
.eq("catelog_id", catelogId).eq("attr_type",ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode());
if (attrIds != null && attrIds.size() > 0) {
queryWrapper.notIn("attr_id", attrIds);
}
要是前端传来了想要关联的属性,查询条件再进行一个模糊匹配。
String key = (String) params.get("key");
if (!org.apache.commons.lang.StringUtils.isEmpty(key)) {
queryWrapper.and((w) -> {
w.eq("attr_id",key).or().like("attr_name",key);
});
}
封装好分页数据后返回
IPage<AttrEntity> page = this.page(new Query<AttrEntity>().getPage(params), queryWrapper);
PageUtils pageUtils = new PageUtils(page);
return pageUtils;
最终效果如下
@Autowired
AttrAttrgroupRelationDao relationDao;
@Autowired
AttrGroupDao attrGroupDao;
/**
* 获取当前分组没有被关联的所有属性
* @param params
* @param attrgroupId
* @return
*/
@Override
public PageUtils getNoRelationAttr(Map<String, Object> params, Long attrgroupId) {
//1、当前分组只能关联自己所属的分类里面的所有属性
AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupId);
//获取当前分类的id
Long catelogId = attrGroupEntity.getCatelogId();
//2、当前分组只能关联别的分组没有引用的属性
//2.1)、当前分类下的其它分组
List<AttrGroupEntity> groupEntities = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>()
.eq("catelog_id", catelogId));
//获取到所有的attrGroupId
List<Long> collect = groupEntities.stream().map((item) -> {
return item.getAttrGroupId();
}).collect(Collectors.toList());
//2.2)、这些分组关联的属性
List<AttrAttrgroupRelationEntity> groupId = relationDao.selectList
(new QueryWrapper<AttrAttrgroupRelationEntity>().in("attr_group_id", collect));
List<Long> attrIds = groupId.stream().map((item) -> {
return item.getAttrId();
}).collect(Collectors.toList());
//2.3)、从当前分类的所有属性移除这些属性
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>()
.eq("catelog_id", catelogId).eq("attr_type",ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode());
if (attrIds != null && attrIds.size() > 0) {
queryWrapper.notIn("attr_id", attrIds);
}
//判断是否有参数进行模糊查询
String key = (String) params.get("key");
if (!org.apache.commons.lang.StringUtils.isEmpty(key)) {
queryWrapper.and((w) -> {
w.eq("attr_id",key).or().like("attr_name",key);
});
}
IPage<AttrEntity> page = this.page(new Query<AttrEntity>().getPage(params), queryWrapper);
PageUtils pageUtils = new PageUtils(page);
return pageUtils;
}
@Autowired
AttrAttrgroupRelationService relationService;
批量保存
///product/attrgroup/attr/relation
@PostMapping(value = "/attr/relation")
public R addRelation(@RequestBody List<AttrGroupRelationVo> vos) {
relationService.saveBatch(vos);
return R.ok();
}
前端映射的Vo数据
@Data
public class AttrGroupRelationVo {
//[{"attrId":1,"attrGroupId":2}]
private Long attrId;
private Long attrGroupId;
}
实现类
通过前端传过来的Vo的分组id和属性id,映射出属性&属性分组这个中间表的记录。然后批量保存
最终效果如下
/**
* 批量添加属性与分组关联关系
* @param vos
*/
@Override
public void saveBatch(List<AttrGroupRelationVo> vos) {
List<AttrAttrgroupRelationEntity> collect = vos.stream().map((item) -> {
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
BeanUtils.copyProperties(item, relationEntity);
return relationEntity;
}).collect(Collectors.toList());
this.saveBatch(collect);
}