商城项目13_查询分组关联属性删除新增查询分组未关联的属性调整会员服务获取分类关联的品牌

Posted 所得皆惊喜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了商城项目13_查询分组关联属性删除新增查询分组未关联的属性调整会员服务获取分类关联的品牌相关的知识,希望对你有一定的参考价值。

文章目录

①. 查询分组关联属性

  • ①. 根据后台接口,进行分析: /product/attrgroup/attrgroupId/attr/relation

  • ②. 代码编写
//查询分组关联的属性
@GetMapping("/attrgroupId/attr/relation")
public R attrRelation(@PathVariable("attrgroupId")Long attrgroupId)
    List<AttrEntity> attrEntity=attrService.getRelationAttr(attrgroupId);
    return R.ok().put("data", attrEntity);


//查询分组id查找关联的所有属性
@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(item->item.getAttrId())
            .collect(Collectors.toList());
    List<AttrEntity>attrEntityList=null;
    if(!CollectionUtils.isEmpty(attrIds))
        attrEntityList=this.listByIds(attrIds);
    

//        List<AttrEntity>attrEntityList=null;
//        if(!CollectionUtils.isEmpty(attrIds))
//            attrEntityList=attrDao.findAttrEntityByAttrIds(attrIds);
//        
    return attrEntityList;

②. 删除属性与分组的关联关系

  • ①. 根据后台接口,进行分析: /product/attrgroup/attr/relation/delete
  • ②. 编写接口,这里controller中的AttrGroupRelationVo[] vos可以使用数组接收,也可以使用集合接收
//删除属性与分组的关联关系
@PostMapping("/attr/relation/delete")
public R deleteRelation(@RequestBody AttrGroupRelationVo[]vos)
    relationService.deleteRelation(vos);
    return R.ok();

@Override
public void deleteRelation(AttrGroupRelationVo[] vos) 
    List<AttrAttrgroupRelationEntity> entities = Arrays.asList(vos).stream().map((item) -> 
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
        BeanUtils.copyProperties(item, relationEntity);
        return relationEntity;
    ).collect(Collectors.toList());
    this.baseMapper.deleteBatchRelation(entities);


@Repository
@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>
  • ③. 页面效果

③. 查询分组未关联的属性

  • ①. 根据后台接口,进行分析: /product/attrgroup/attrgroupId/noattr/relation

//响应数据

	"msg": "success",
	"code": 0,
	"page": 
		"totalCount": 3,
		"pageSize": 10,
		"totalPage": 1,
		"currPage": 1,
		"list": [
			"attrId": 1,
			"attrName": "aaa",
			"searchType": 1,
			"valueType": 1,
			"icon": "aa",
			"valueSelect": "aa;ddd;sss;aaa2",
			"attrType": 1,
			"enable": 1,
			"catelogId": 225,
			"showDesc": 1
		]
	

  • ②. 编写接口
  1. 使用attrgroupId去pms_attr_group表中根据分类ID查询所有的当前分类ID的分组
  2. 获取到当前分类ID分组的attrGroupId,去中间表psm_attr_attrgroup_relation根据attrGroupId获取到attr_id
  3. 获取到attr_id后,去pms_attr表中查询出不在获取到的attr_id的属性
//获取属性分组没有关联的其他属性
@GetMapping("/attrgroupId/noattr/relation")
public R attrNoattrRelation(@RequestParam Map<String,Object>params,
                            @PathVariable("attrgroupId")Long attrgroupId)
    PageUtils page= attrService.getNoattrRelationAttr(params,attrgroupId);
    return R.ok().put("page",page);


/**
 * 获取属性分组没有关联的其他属性
 * @param params
 * @param attrgroupId
 * @return
 */
@Override
public PageUtils getNoattrRelationAttr(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).ne("attr_group_id", attrgroupId));
    List<AttrGroupEntity> group = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));
    List<Long> collect = group.stream().map(item -> 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 -> item.getAttrId()).collect(Collectors.toList());

    //2.3 从当前分类的所有属性中移除这些属性
    QueryWrapper<AttrEntity> wrapper = new QueryWrapper<AttrEntity>().eq("catelog_id", catelogId);
    if(!CollectionUtils.isEmpty(attrIds))
        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));
    
    wrapper.eq("attr_type",ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode());
    IPage<AttrEntity> page = this.page(new Query<AttrEntity>().getPage(params),wrapper);

    return new PageUtils(page);

④. 新增分组与属性关联

  • ①. 根据后台接口,进行分析: /product/attrgroup/attr/relation

  • ②. 代码编写,controller中可以使用数组接收,也可以使用list集合接收
@Data
public class AttrGroupRelationVo 
    private Long attrId;
    private Long attrGroupId;


//添加属性与分组关联关系
@PostMapping("/attr/relation")
//public R addRelation(@RequestBody List<AttrGroupRelationVo>vos)
public R addRelation(@RequestBody AttrGroupRelationVo[] vos)
    relationService.saveAttrRelation(vos);
    return R.ok();


/**
 * 添加属性与分组关联关系
 * @param vos
 */
@Override
public void saveAttrRelation(AttrGroupRelationVo[] vos) 
    List<AttrAttrgroupRelationEntity> entities = Arrays.asList(vos).stream().map(item -> 
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
        BeanUtils.copyProperties(item, relationEntity);
        return relationEntity;
    ).collect(Collectors.toList());
    this.saveBatch(entities);

⑤. 调试会员等级相关接口

  • ①. 在商品发布章节(83左右),如果遇到提示 ”PubSub“未定义错误,则需要安装 pubsub-js,具体步骤:
(1). 安装 pubsub-js:
    npm install --save pubsub-js 
(2). 在 main.js 中引入
    //导入
    import PubSub from 'pubsub-js'
    //挂载全局
    Vue.prototype.PubSub = PubSu
  • ②. 我们在新增商品的时候,会出现会员接口404,这个时候需要调整会员接口

  • ③. 配置会员服务的网关地址、配置注册中心地址

spring:
  cloud:
    gateway:
      routes:
        # 会员服务
        - id: member_route
          uri: lb://gulimall-member
          predicates:
            - Path=/api/member/**
          filters:
            - RewritePath=/api/(?<segment>/?.*), /$\\segment
// application.properties
spring.cloud.nacos.config.server-addr=127.0.0.1
spring.cloud.nacos.config.namespace=f8608f8a-635c-4883-9613-996910120e57
spring.cloud.nacos.config.file-extension=yml
spring.application.name=gulimall-member
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.56.11:3306/gulimall_ums?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
    username: root
    password: root
  application:
    name: gulimall-member
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
mybatis-plus:
  # classpath*:/mapper/**/*.xml 表示不止扫描自己类路径下的mapper,其他引入的mapper也会进行扫描
  # classpath*:/mapper/**/*.xml 只扫描自己的路径下
  mapper-locations: classpath:/mapper/**/*.xml
  # 如下代码是mybatisplus中配置自增主键
  global-config:
    db-config:
      id-type: auto
server:
  port: 8000
  • ④. 调整会员接口
@Override
public PageUtils queryPage(Map<String, Object> params) 
    QueryWrapper<MemberLevelEntity> wrapper = new QueryWrapper<>();
    String key=(String) params.get("key");
    if(!StringUtils.isEmpty(key))
        wrapper.and(w->w.eq("id",key).or().like("name",key));
    

    IPage<MemberLevelEntity> page = this.page(
            new Query<MemberLevelEntity>().getPage(params),
            wrapper
    );
    return new PageUtils(page);

⑥. 获取分类关联的品牌

  • ①. 根据后台接口,进行分析:/product/categorybrandrelation/brands/list

  • ②. 核心代码如下

  1. controller只来处理请求,接收和校验数据
  2. service接收controller数据,进行业务处理
  3. controller接收service处理完的数据,封装成页面指定的vo
/**
 * 获取分类关联的品牌
 * 1.controller只来处理请求,接收和校验数据
 * 2.service接收controller数据,进行业务处理
 * 3.controller接收service处理完的数据,封装成页面指定的vo
 * @param catId
 * @return
 */
@GetMapping("/brands/list")
public R relationBrandsList(@RequestParam(value = "catId",required = true)Long catId)
    List<BrandEntity> brandEntities=categoryBrandRelationService.getBrandsByCatId(catId);
    List<BrandVo> data = brandEntities.stream().map(item -> 
        //这里属性没有对应,需要对拷贝
        BrandVo brandVo = new BrandVo();
        brandVo.setBrandName(item.getName());
        brandVo.setBrandId(item.getBrandId());
        return brandVo;
    ).collect(Collectors.toList());
    return R.ok().put("data",data);



@Override
public List<BrandEntity> getBrandsByCatId(Long catId) 
	   List<CategoryBrandRelationEntity> catelogId = this.list(new QueryWrapper<CategoryBrandRelationEntity>().eq("catelog_id", catId));
	   List<BrandEntity> brandEntities = catelogId.stream().map(item -> 
	       Long brandId = item.getBrandId();
	       BrandEntity byId = brandService.getById(brandId);
	       return byId;
	   ).collect(Collectors.toList());
	   return brandEntities;

⑦. 获取分类下所有分组以及属性

  • ①. 根据后台接口,进行分析: /product/attrgroup/catelogId/withattr

  • ②. 核心接口编写
@Data
public class AttrGroupWithAttrsVo 
    //分组id
    private Long attrGroupId;
    //组名
    private String attrGroupName;
    //排序
    private Integer sort;
    //描述
    private String descript;
    //组图标
    private String icon;
    //所属分类id
    private Long catelogId;
    private Integer valueType;
    private List<AttrEntity> attrs;

第190天学习打卡(项目 谷粒商城 32 销售属性维护 查询分组关联属性和删除关联)

第191天学习打卡(项目 谷粒商城33 查询分组未关联的属性)

第192天学习打卡(项目 谷粒商城 34 新增分组和属性关联)

商城项目11_商品SPUSKU详解表结构属性分组列表展示修改新增分类级联更新

商城项目11_商品SPUSKU详解表结构属性分组列表展示修改新增分类级联更新

Django_查询类型_关联查询_聚合查询_分组查询_更新_删除操作