商城项目12_规格参数新增与VO列表展示回显数据进行修改销售属性维护

Posted 所得皆惊喜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了商城项目12_规格参数新增与VO列表展示回显数据进行修改销售属性维护相关的知识,希望对你有一定的参考价值。

文章目录

①. 引入VO、PO、DO、TO、DTO

  • ①. VO(value object)值对象
    通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要。用new关键字创建,由GC回收的

  • ②. DO(Domain 0bject)领域对象
    就是从现实世界中推象出来的有形或无形的业务实体

  • ③. TO(Transfer 0bject),数据传输对象传输的对象
    不同的应用程序之间传输的对象。微服务

  • ④. DTO(Data Transfer Obiect)数据传输对象
    这个概念来源于J2EE的设汁模式,原来的目的是为了EJB的分布式应用握供粗粒度的数据实体,以减少分布式调用的次数,从而握分布式调用的性能和降低网络负载,但在这里,泛指用于示层与服务层之间的数据传输对象

  • ⑤. PO持久对象
    PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据的操作

  • ⑥. POJO简单无规则java对象

②. 规格参数 - 新增

  • ①. 新建VO对象
    Request URL: http://localhost:88/api/product/attr/save,现在的情况是,它在保存的时候,只是保存了attr,并没有保存attrgroup,为了解决这个问题,我们新建了一个vo/AttrVo.java,在原Attr基础上增加了attrGroupId字段,使得保存新增数据的时候,也保存了它们之间的关系。
//如在一些Entity中,为了让mybatis-plus知道某个字段不与数据库匹配,那么就加个@TableField(exist=false)
@TableField(exist=false)
private Long attrGroupId;

@Data
public class AttrVo implements Serializable 
    private static final long serialVersionUID = 1L;

    // 属性id
    private Long attrId;
    // 属性名
    private String attrName;
    // 是否需要检索[0-不需要,1-需要]
    private Integer searchType;
    // 属性图标
    private String icon;
    // 可选值列表[用逗号分隔]
    private String valueSelect;
    // 属性类型[0-销售属性,1-基本属性,2-既是销售属性又是基本属性]
    private Integer attrType;
    // 启用状态[0 - 禁用,1 - 启用]
    private Long enable;
    // 所属分类
    private Long catelogId;
    // 快速展示【是否展示在介绍上;0-否 1-是】,在sku中仍然可以调整
    private Integer showDesc;
    // 参数分组id
    private Long attrGroupId;

  • ②. 新增的时候我们需要给pms_attr表和关联表pms_attr_attrgroup_relation表新增记录
    通过"BeanUtils.copyProperties(attr,attrEntity)" 能够实现在两个Bean之间属性对拷
@Transactional
@Override
public void saveAttr(AttrVo attrVo) 
    AttrEntity attrEntity = new AttrEntity();
    BeanUtils.copyProperties(attrVo,attrEntity);
    //1. 保存基本数据
    this.save(attrEntity);
    //2. 保存关联关系
    AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
    relationEntity.setAttrGroupId(attrVo.getAttrGroupId());
    relationEntity.setAttrId(attrEntity.getAttrId());
    relationDao.insert(relationEntity);

③. 规格参数 - 列表展示

  • ①. 思路:
    由于返回的字段中有所属分类、所属分组,原来的attrEntity不能满足需求,这里重新抽取返回对象的VO
    所属分类:需要根据分类ID去pms_category表中查询出分类名称
    所属分组:需要根据attr_id去参数分组关联表pms_attr_attrgroup_relation查询出分组attr_group_id,根据分组attr_group_id去pms_attr_group表中查询分组名称
@Data
public class AttrRespVo implements Serializable 
    // 属性id
    private Long attrId;
    // 属性名
    private String attrName;
    // 是否需要检索[0-不需要,1-需要]
    private Integer searchType;
    // 属性图标
    private String icon;
    // 可选值列表[用逗号分隔]
    private String valueSelect;
    // 属性类型[0-销售属性,1-基本属性,2-既是销售属性又是基本属性]
    private Integer attrType;
    // 启用状态[0 - 禁用,1 - 启用]
    private Long enable;
    // 所属分类
    private Long catelogId;
    // 快速展示【是否展示在介绍上;0-否 1-是】,在sku中仍然可以调整
    private Integer showDesc;
    // 所属分类名字
    private String catelogName;
    // 所属分组名字
    private String groupName;

  • ②. 核心代码展示
    @Override
    public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId) 
        QueryWrapper<AttrEntity> wrapper = new QueryWrapper<>();
        String key = (String)params.get("key");
        if(!StringUtils.isEmpty(key))
            wrapper.and(item->item.eq("attr_id",key).or().like("attr_name",key));
        
        if(catelogId!=0)
            wrapper.eq("catelog_id",catelogId);
        

        IPage<AttrEntity> page = this.page(
                new Query<AttrEntity>().getPage(params),
                wrapper);
        PageUtils pageUtils = new PageUtils(page);
        List<AttrEntity> records = page.getRecords();

        List<AttrRespVo> respVos = records.stream().map((attrEntity) -> 
            AttrRespVo attrRespVo = new AttrRespVo();
            BeanUtils.copyProperties(attrEntity, attrRespVo);
            //1. 设置分类的名字
            CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
            if (categoryEntity != null) 
                attrRespVo.setCatelogName(categoryEntity.getName());
            
            //2. 设置分组的名字
            // 需要根据attr_id去参数分组关联表pms_attr_attrgroup_relation查询出分组attr_group_id,根据分组attr_group_id去pms_attr_group表中查询分组名称
            AttrAttrgroupRelationEntity attrId = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrEntity.getAttrId()));
            if (attrId != null) 
                AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrId.getAttrGroupId());
                attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());
            
            return attrRespVo;
        ).collect(Collectors.toList());

        pageUtils.setList(respVos);
        return pageUtils;
    

④. 规格参数 - 修改

  • ①. 规格参数修改的第一步,需要回显页面数据。这里需要额外的去回显attrGroupId、catelogPath、使用AttrVO进行接收前台传递过来的数据

/**
 * 信息
 */
@RequestMapping("/info/attrId")
public R info(@PathVariable("attrId") Long attrId)
	AttrRespVo attr = attrService.getAttrInfo(attrId);
    return R.ok().put("attr", attr);


/**
 * 查询属性详情
 * @param attrId
 * @return
 */
@Override
public AttrRespVo getAttrInfo(Long attrId) 
    AttrEntity attrEntity = this.getById(attrId);
    AttrRespVo attrRespVo = new AttrRespVo();
    BeanUtils.copyProperties(attrEntity,attrRespVo);
    //1. 设置分组信息(获取attrGroupId)
    AttrAttrgroupRelationEntity relationEntity = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id",attrId));
    if(relationEntity!=null)
        attrRespVo.setAttrGroupId(relationEntity.getAttrGroupId());
    
    //2. 设置分类信息(获取catelogPath)
    Long[] categoryPath = categoryService.findCategoryPath(attrEntity.getCatelogId());
    if(categoryPath!=null)
     attrRespVo.setCatelogPath(categoryPath);
    
    return attrRespVo;

  • ②. 规格参数修改功能:将pms_attr信息进行修改后,还需要对pms_attr_attrgroup_relation关联表进行修改或者新增操作
/**
 * 修改
 * @param attr
 */
@Transactional
@Override
public void updateAttr(AttrVo attr) 
    AttrEntity attrEntity = new AttrEntity();
    BeanUtils.copyProperties(attr,attrEntity);
    this.updateById(attrEntity);
    // 级联修改属性分组表
    Integer count = relationDao.selectCount(new QueryWrapper<AttrAttrgroupRelationEntity>());
    if(count>0)
        // 如果有记录就修改
        UpdateWrapper<AttrAttrgroupRelationEntity> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("attr_id",attrEntity.getAttrId());
        updateWrapper.set("attr_group_id",attr.getAttrGroupId());
        relationDao.update(null,updateWrapper);
    else
        // 如果没记录就新增
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
        relationEntity.setAttrId(attrEntity.getAttrId());
        relationEntity.setAttrGroupId(attr.getAttrGroupId());
        relationDao.insert(relationEntity);
    

⑤. 销售属性 - 查询、新增、修改

  • ①. 销售属性的维护和规格参数一致,我们这里公用一个方法,销售属性不涉及到去新增或者修改关联表pms_attr_attrgroup_relation,我们在销售属性的新增、查询、修改的时候,需要对这些公共的方法进行if判断
  • ②. 在数据库表中,使用attr_type来区分是销售属性还是基本属性、由于在后续的代码中我们会用到这个字段1和0的大量判断,这里我们将其抽取为商品的枚举类

public class ProductConstant 
    public enum  AttrEnum
        ATTR_TYPE_BASE(1,"基本属性"),
        ATTR_TYPE_SALE(0,"销售属性");
        AttrEnum(int code,String msg)
            this.code=code;
            this.msg=msg;
        
        
        private int code;
        private String msg;
        
        public int getCode() 
            return code;
        
        public String getMsg() 
            return msg;
        
    

  • ③. 查询方法
//@RequestMapping("/base/list/catelogId")
@RequestMapping("/attrType/list/catelogId")
public R baseAttrList(@RequestParam Map<String, Object> params,
                      @PathVariable("catelogId")Long catelogId,
                      @PathVariable("attrType")String type)
    PageUtils page = attrService.queryBaseAttrPage(params,catelogId,type);
    return R.ok().put("page", page);

/**
 * 规则参数列表展示
 * @param params
 * @param catelogId
 * @param type
 * @return
 */
@Override
public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId, String type) 
    QueryWrapper<AttrEntity> wrapper = new QueryWrapper<AttrEntity>();
    //销售属性和规格参数属性是同一张表,都记录在pms_attr表中
    //如果attr_type=1表示的是规则参数属性(基本属性)、如果attr_type=0表示的是销售属性
    wrapper.eq("attr_type","base".equalsIgnoreCase(type)?
            ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode():
            ProductConstant.AttrEnum.ATTR_TYPE_SALE.getCode());
    String key = (String)params.get("key");
    if(!StringUtils.isEmpty(key))
        wrapper.and(item->item.eq("attr_id",key).or().like("attr_name",key));
    
    if(catelogId!=0)
        wrapper.eq("catelog_id",catelogId);
    

    IPage<AttrEntity> page = this.page(
            new Query<AttrEntity>().getPage(params),
            wrapper);
    PageUtils pageUtils = new PageUtils(page);
    List<AttrEntity> records = page.getRecords();

    List<AttrRespVo> respVos = records.stream().map((attrEntity) -> 
        AttrRespVo attrRespVo = new AttrRespVo();
        BeanUtils.copyProperties(attrEntity, attrRespVo);
        //1. 设置分类的名字
        CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
        if (categoryEntity != null) 
            attrRespVo.setCatelogName(categoryEntity.getName());
        
        //2. 设置分组的名字(只有是规格参数基本属性的时候才去设置分组的名字)
        // 需要根据attr_id去参数分组关联表pms_attr_attrgroup_relation查询出分组attr_group_id,根据分组attr_group_id去pms_attr_group表中查询分组名称
        if("base".equalsIgnoreCase(type))
            AttrAttrgroupRelationEntity attrId = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrEntity.getAttrId()));
            if (attrId != null) 
                AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrId.getAttrGroupId());
                attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());
            
        
        return attrRespVo;
    ).collect(Collectors.toList());

    pageUtils.setList(respVos);
    return pageUtils;

  • ④. 新增、修改方法需要对关联表attr_attrgroup_relation表进行判断
   /**
     * 查询属性详情
     * @param attrId
     * @return
     */
    @Override
    public AttrRespVo getAttrInfo(Long attrId) 
        AttrEntity attrEntity = this.getById(attrId);
        AttrRespVo attrRespVo = new AttrRespVo();
        BeanUtils.copyProperties(attrEntity,attrRespVo);
        //1. 设置分组信息(获取attrGroupId)
        if (attrEntity.getAttrType()==ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode())
            AttrAttrgroupRelationEntity relationEntity = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id",attrId));
            if(relationEntity!=null)
                attrRespVo.setAttrGroupId(relationEntity.getAttrGroupId());
            
        
        //2. 设置分类信息(获取catelogPath)
        Long[] categoryPath = categoryService.findCategoryPath(attrEntity.getCatelogId());
        if(categoryPath!=null)
         attrRespVo.setCatelogPath(categoryPath第188天学习打卡(项目 谷粒商城30 规格参数新增与VO 规格参数列表)

商城项目14_商品新增vo抽取修改vo新增逻辑代码的具体落地SPU检测SKU检测流程图

商城项目14_商品新增vo抽取修改vo新增逻辑代码的具体落地SPU检测SKU检测流程图

商城项目14_商品新增vo抽取修改vo新增逻辑代码的具体落地SPU检测SKU检测流程图

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

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