• 2022谷粒商城学习笔记(九)分组关联属性相关功能


    前言

    本系列博客基于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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    实现类

    查询中间表(属性&属性分组表)的分组是请求参数分组id的记录

    List<AttrAttrgroupRelationEntity> entities = relationDao.selectList
                    (new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_group_id", attrgroupId));
    
    
    • 1
    • 2
    • 3

    通过streamAPI抽取出来属性id

    		List<Long> attrIds = entities.stream().map((attr) -> {
                return attr.getAttrId();
            }).collect(Collectors.toList());
    
    • 1
    • 2
    • 3

    判断一下为空的情况

    		//如果attrIds为空就直接返回一个null值出去
            if (attrIds == null || attrIds.size() == 0) {
                return null;
            }
    
    • 1
    • 2
    • 3
    • 4

    根据上面抽取的属性id在属性表里面查完后返回查询结果

    		List<AttrEntity> attrEntityList = this.baseMapper.selectBatchIds(attrIds);
    
            return attrEntityList;
    
    • 1
    • 2
    • 3

    最终效果如下

    	@Autowired
        AttrAttrgroupRelationDao relationDao;
    
    • 1
    • 2
    /**
         * 根据分组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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    删除属性和分组的关联关系

    新建属性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;
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    /**
         * 删除关联
         * @param vos
         * @return
         */
        @PostMapping("/attr/relation/delete")
        public R deleteRelation(@RequestBody AttrGroupRelationVo[] vos ) {
            attrService.deleteRelation(vos);
            return R.ok();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    实现类

    将这个Vo数据里面的组id数据和属性id数据拷贝到AttrAttrgroupRelationEntity实体类,也就是通过组id和属性id确定需要删除的记录。

    把记录传给删除方法,接着来创建这个删除方法。

    最终效果如下

    	@Autowired
        AttrAttrgroupRelationDao relationDao;
    
    • 1
    • 2
    @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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    删除dao

    @Mapper
    public interface AttrAttrgroupRelationDao extends BaseMapper<AttrAttrgroupRelationEntity> {
    
        void deleteBatchRelation(@Param("entities") List<AttrAttrgroupRelationEntity> entities);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    在这里插入图片描述

    这里会返回所有当前页面的信息,以及分组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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    实现类

    首先,根据传入的组id去查询当前属性组分类表的记录。然后再从记录中获取它所属的分类id

    		//1、当前分组只能关联自己所属的分类里面的所有属性
            AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupId);
            //获取当前分类的id
            Long catelogId = attrGroupEntity.getCatelogId();
    
    • 1
    • 2
    • 3
    • 4

    根据这个分类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());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    再根据这些组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());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    封装一个查询条件,查询当前分组所属分类下的所有基本属性。再从所有的属性中移除当前分类下所有分组关联的所有属性。此时查询的属性表的记录就是没有被关联的属性。

    		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);
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    要是前端传来了想要关联的属性,查询条件再进行一个模糊匹配。

    		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);
                });
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    封装好分页数据后返回

    		IPage<AttrEntity> page = this.page(new Query<AttrEntity>().getPage(params), queryWrapper);
    
            PageUtils pageUtils = new PageUtils(page);
    
    
            return pageUtils;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    最终效果如下

    	@Autowired
        AttrAttrgroupRelationDao relationDao;
    
        @Autowired
        AttrGroupDao attrGroupDao;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    /**
         * 获取当前分组没有被关联的所有属性
         * @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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    新建关联关系

    在这里插入图片描述

    	@Autowired
        AttrAttrgroupRelationService relationService;
    
    • 1
    • 2

    批量保存

    	///product/attrgroup/attr/relation
        @PostMapping(value = "/attr/relation")
        public R addRelation(@RequestBody List<AttrGroupRelationVo> vos) {
    
            relationService.saveBatch(vos);
    
            return R.ok();
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    前端映射的Vo数据

    @Data
    public class AttrGroupRelationVo {
    
        //[{"attrId":1,"attrGroupId":2}]
        private Long attrId;
    
        private Long attrGroupId;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    实现类

    通过前端传过来的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);
    
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    十天学完基础数据结构-第八天(哈希表(Hash Table))
    ICLR24大模型提示(1/11) | BadChain:大型语言模型的后门思维链提示
    点云缩放(附open3d python代码)
    springboot jdbctemplate 实现多数据源
    LeetCode 0938.二叉搜索树的范围和:深度优先搜索(可中序遍历)
    ES关于文档的基本操作
    java+ssm基于微信小程序的游泳馆管理系统 uniapp 小程序
    MongoDB系列之适用场景和不适用场景
    数字IC笔试面试题之--时钟偏斜(skew)与抖动(jitter)
    leetcode100相同的树,C语言时间击败百分之百
  • 原文地址:https://blog.csdn.net/qq_44737138/article/details/126416487