gulimall-分布式基础篇-平台属性完善

文章详细介绍了Gulimall项目中如何进行属性分组的管理,包括获取属性分组关联属性、删除属性与分组关联、获取未关联属性以及添加属性关联的操作。涉及到的关键技术包括SpringBoot接口设计、MyBatis的数据库操作以及集合处理。
摘要由CSDN通过智能技术生成

gulimall-分布式基础篇-平台属性完善

一、获取属性分组的关联的所有属性

接口文档

1.1 attrGroupController

因为我们返回的是分组下的属性(就是属性),所以使用attrService

    @GetMapping("/{attrgroupId}/attr/relation")
    public R attrRelation(@PathVariable("attrgroupId") Long attrgroupId){
        List<AttrEntity> data = attrService.getRelationAttr(attrgroupId);
        return R.ok().put("data", data);
    }

1.2 attrServiceImpl

/**
     * 根据分组id查找关联的所有基本属性
     * @param attrgroupId
     * @return
     */
    @Override
    public List<AttrEntity> getRelationAttr(Long attrgroupId) {
        //通过pms_attr_attrgroup_relation中间表中的attr_group_id找到attrgroupId,然后去attr表中找到对应信息即可
        List<AttrAttrgroupRelationEntity> entities = relationDao.selectList(
                new QueryWrapper<AttrAttrgroupRelationEntity>().
                        eq("attr_group_id", attrgroupId));

        //找到所有的attrId的集合
        List<Long> attrIds = entities.stream().map((attr) -> {
            return attr.getAttrId();
        }).collect(Collectors.toList());

        //解决空指针异常问题,不然直接传到listByIds直接出错
        if(attrIds == null || attrIds.size() == 0){
            return null;
        }
        //通过listByIds找到所有的attr实体类
        Collection<AttrEntity> attrEntities = this.listByIds(attrIds);
        //返回
        return (List<AttrEntity>) attrEntities;

    }

二、删除属性与分组的关联关系

接口文档

不希望发送多次请求,使用批量删除

2.1 新建AttrGroupRelationVo

@Data
public class AttrGroupRelationVo {

    private Long attrId;
    private Long attrGroupId;
}

2.2 AttrGroupController

    @PostMapping("/attr/relation/delete")
    public R attrRelationDelete(@RequestBody AttrGroupRelationVo[] vos){
        attrService.deleteRelation(vos);
        return R.ok();
    }

2.3 AttrServiceImpl

    @Override
    public void deleteRelation(AttrGroupRelationVo[] vos) {
        //将数组转换为集合list
        List<AttrGroupRelationVo> relationVos = Arrays.asList(vos);

//         AttrAttrgroupRelationDao relationDao 我们希望使用的是relationDao中使用的AttrAttrgroupRelationEntity这个实体类,所以我们转换
        List<AttrAttrgroupRelationEntity> entities = relationVos.stream().map((relationVo) -> {
            AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
            BeanUtils.copyProperties(relationVo, relationEntity);
            return relationEntity;
        }).collect(Collectors.toList());


        //根据attrId,attrGroupId批量删除关联关系
        relationDao.deleteBatchRelation(entities);
    }

2.4 AttrAttrgroupRelationDao.xml

void deleteBatchRelation(@Param("entities") List<AttrAttrgroupRelationEntity> entities);

2.5 AttrAttrgroupRelationDao.xml

在这里插入图片描述
使用多个or,自定义一个方法

    <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>

三、获取属性分组没有关联的其他属性

接口文档

当前属性分组只能关联自己所属分类里面的所有属性

当前分组只能关联别的分组没有引用的属性

3.1 AttrGroupController

    @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);
    }

3.2 AttrServiceImpl

逻辑

​ - 当前分类下的其他分组

​ - 这些分组关联的属性

​ - 从当前分类的所有属性中移除这些属性
    /**
     * 获取当前分组没有关联的所有属性
     * @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> attrGroupEntities = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));
        List<Long> collect = attrGroupEntities.stream().map(attrGroupEntity1 -> {
            return attrGroupEntity1.getAttrGroupId();
        }).collect(Collectors.toList());
        //2.2 这些分组关联的属性
        List<AttrAttrgroupRelationEntity> relationEntities = relationDao.selectList(new QueryWrapper<AttrAttrgroupRelationEntity>().in("attr_group_id", collect));
        //属性id的集合
        List<Long> attrIds = relationEntities.stream().map((relationEntity) -> {
            return relationEntity.getAttrId();
        }).collect(Collectors.toList());
        //从当前分类的所有属性中移除这些属性
        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);
        return new PageUtils(page);

    }

四、添加属性与分组关联关系

接口文档

4.1 AttrGroupController

    @PostMapping("/attr/relation")
    public R attrRelation(@RequestBody List<AttrGroupRelationVo> vos){
        relationService.saveBatch(vos);
        return R.ok();
    }

4.2 AttrAttrgroupRelationServiceImpl

    @Override
    public void saveBatch(List<AttrGroupRelationVo> vos) {
        List<AttrAttrgroupRelationEntity> entities = vos.stream().map((vo) -> {
            AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
            //属性对拷
            BeanUtils.copyProperties(vo, relationEntity);
            return relationEntity;
        }).collect(Collectors.toList());
        this.saveBatch(entities);
    }

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值