谷粒商城P80-82
前言
本文主要记录B站谷粒商城项目视频 P80-82 的内容,做到知识点的梳理和总结的作用,接口文档地址:gulimall接口文档。
一、查询分组关联属性与删除关联
1.1 属性分组与属性关联关系
(1)需求描述:每个属性分组可以关联多个属性例如:主体这个属性分组可以关联入网型号,品牌,上市年份等多个基本属性(也称规格参数)。如下图:点击关联前端带上属性分组id发送如下请求,能够查询出该分组下所有关联的基本属性(也称规格参数)。
(2)代码实现如下
/**
* 获取属性分组关联的所有属性
* @param attrgroupId
* @return
*/
@GetMapping("/{attrgroupId}/attr/relation")
public R attrRelation(@PathVariable("attrgroupId") Long attrgroupId){
List<AttrEntity> entities = attrService.getRelationAttr(attrgroupId);
return R.ok().put("data",entities);
}
/**
* 根据分组id查找关联的所有基本属性
* @param attrgroupId
* @return
*/
@Override
public List<AttrEntity> getRelationAttr(Long attrgroupId) {
//根据属性分组id查询属性与属性分组关联表 attr_group_id = attrgroupId的List集合
List<AttrAttrgroupRelationEntity> entities = relationDao.selectList(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_group_id", attrgroupId));
//对entities过滤返回属性id封装成List集合
List<Long> attrIds = entities.stream().map((attr) -> {
return attr.getAttrId();
}).collect(Collectors.toList());
//集合为空,表明该属性分组没有关联基本属性
if(attrIds == null || attrIds.size() == 0){
return null;
}
//通过attrIds查找AttrEntity封装成List并返回
Collection<AttrEntity> attrEntities = this.listByIds(attrIds);
return (List<AttrEntity>) attrEntities;
}
1.2 属性分组与属性关联移除
(1)需求描述:点击移除前端发送如下请求,能够移除属性分组与属性的关联关系。
(2)请求参数是个集合,能做到批量删除的效果
[{“attrId”:1,“attrGroupId”:2}]
(3)代码实现如下
@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();
}
@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);
}
@Mapper
public interface AttrAttrgroupRelationDao extends BaseMapper<AttrAttrgroupRelationEntity> {
void deleteBatchRelation(@Param("entities") List<AttrAttrgroupRelationEntity> entities);
}
<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>
二、查询分组未关联的属性
2.1 查询分组未关联的属性列表
(1)需求描述:如下图点击新建关联,弹出对话框,我们可以根据该分类下没被其他属性分组关联的基本属性(也称规格参数)设置关联,让基本属性与属性分组产生关联关系。
(2)例如下图:属性名为AA的,所属分类为手机分类但是其属性分组为空即没有与其他属性分组关联。所以我们可以在上图点勾,让它与主体产生关联。
(3)代码实现如下
/**
* 获取属性分组里面还没有关联的本分类里面的其他基本属性
* 方便添加新的关联
* @param params
* @param catelogId
* @param type
* @return
*/
@GetMapping("/{attrgroupId}/noattr/relation")
public R attrNoRelation(@PathVariable("attrgroupId") Long attrgroupId,
@RequestParam Map<String, Object> params){
PageUtils page = attrService.getNoRelationAttr(params,attrgroupId);
return R.ok().put("page",page);
}
/**
* 获取当前分组没有关联的所有属性
* @param params
* @param attrgroupId
* @return
*/
@Override
public PageUtils getNoRelationAttr(Map<String, Object> params, Long attrgroupId) {
//1、当前分组只能关联自己所属的分类里面的所有属性
AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupId);
Long catelogId = attrGroupEntity.getCatelogId();
//2、当前分组只能关联别的分组没有引用的属性
//2.1)、当前分类下的其他分组
List<AttrGroupEntity> group = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));
List<Long> collect = group.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> wrapper = new QueryWrapper<AttrEntity>().eq("catelog_id", catelogId).eq("attr_type",ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode());
if(attrIds!=null && attrIds.size()>0){
wrapper.notIn("attr_id", attrIds);
}
String key = (String) params.get("key");
if(!StringUtils.isEmpty(key)){
wrapper.and((w)->{
w.eq("attr_id",key).or().like("attr_name",key);
});
}
IPage<AttrEntity> page = this.page(new Query<AttrEntity>().getPage(params), wrapper);
PageUtils pageUtils = new PageUtils(page);
return pageUtils;
}
三、新增分组与属性的关联
3.1 新增分组与属性的关联关系
(1)前面完成了查询属性分组未关联的基本属性列表,接下来完成属性分组新增基本属性的功能。需求描述:AA打勾确认新增,即可完成新增分组与属性的关联关系,如下图。
(2)代码实现
@Data
public class AttrGroupRelationVo {
//"attrId":1,"attrGroupId":2
private Long attrId;
private Long attrGroupId;
}
/**
* 方法参数为List<AttrGroupRelationVo> vos 可批量新增
* 新增基本属性与属性分组关联关系
* @param vos
* @return
*/
@PostMapping("/attr/relation")
public R addRelation(@RequestBody List<AttrGroupRelationVo> vos){
relationService.saveBatch(vos);
return R.ok();
}
@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);
}