• 谷粒商城 (二十四) --------- 商品服务 API 平台属性 ① 规格参数



    一、Object 划分

    1.PO(persistant object) 持久对象

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

    2.DO (Domain Object) 领域对象

    领域对象就是从现实世界中抽象出来的有形或无形的业务实体。

    3.TO (Transfer Object) 数据传输对象

    不同的应用程序之间传输的对象

    4.DTO (Data Transfer Object)

    数据传输对象这个概念来源于 J2EE 的设计模式,原来的目的是为了 EJB 的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,泛指用于展示层与服务层之间的数据传输对象。

    5.VO(value object) 值对象

    通常用于业务层之间的数据传递,和 PO 一样也是仅仅包含数据而已。但应是抽象出的业务对象 , 可以和表对应 , 也可以不 , 这根据业务的需要 。用 new 关键字创建,由GC 回收的。
    View object:视图对象;
    接受页面传递来的数据,封装对象
    将业务处理完成的对象,封装成页面要用的数据

    6.BO(business object) 业务对象

    从业务模型的角度看 , 见 UML 元件领域模型中的领域对象。封装业务逻辑的java 对象 , 通过调用 DAO 方法 , 结合 PO,VO 进行业务操作。business object: 业务对象主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。比如一个简历,有教育经历、工作经历、社会关系等等。 我们可以把教育经历对应一个PO ,工作经历对应一个 PO ,社会关系对应一个 PO 。 建立一个对应简历的 BO 对象处理简历,每个 BO 包含这些 PO 。 这样处理业务逻辑时,我们就可以针对 BO 去处理。

    7.POJO(plain ordinary java object) 简单无规则java 对象

    传统意义的 java 对象。就是说在一些 Object/Relation Mapping 工具中,能够做到维护数据库表记录的 persisent object 完全是一个符合 Java Bean 规范的纯Java 对象,没有增加别的属性和方法。我的理解就是最基本的 java Bean ,只有属性字段及setter 和getter方法!。POJO 是 DO/DTO/BO/VO 的统称。

    8.DAO(data access object) 数据访问对象

    是一个 sun 的一个标准 J2EE 设计模式, 这个模式中有个接口就是DAO ,它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和 PO 结合使用,DAO中包含了各种数据库的操作方法。通过它的方法 , 结合 PO 对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。配合 VO, 提供数据库的 CRUD 操作

    我们此阶段主要用到的是 VO

    实例:

    Vo 包下:

    package com.fancy.gulimall.product.vo;
    
    import com.baomidou.mybatisplus.annotation.TableId;
    import lombok.Data;
    
    @Data
    public class AttrVo {
        private Long attrId;
        /**
         * 属性名
         */
        private String attrName;
        /**
         * 是否需要检索[0-不需要,1-需要]
         */
        private Integer searchType;
        /**
         * 值类型[0-为单个值,1-可以选择多个值]
         */
        private Integer valueType;
        /**
         * 属性图标
         */
        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 Long attrGroupId;
    }
    
    
    • 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

    Controller 方法中:

    /**
    * 保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody AttrVo attr){
    attrService.saveAttr(attr);
    
       return R.ok();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Service 方法中:

     @Transactional
     @Override
     public void saveAttr(AttrVo attr) {
         AttrEntity attrEntity = new AttrEntity();
         BeanUtils.copyProperties(attr, attrEntity);
         // 1. 保存基本数据
         this.save(attrEntity);
         // 2. 保存关联关系
         AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
         relationEntity.setAttrGroupId(attr.getAttrGroupId());
         relationEntity.setAttrId(attrEntity.getAttrId());
         relationDao.insert(relationEntity);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    二、获取分类下的规格参数

    在 AttrController 中

    @GetMapping("/base/list/{catelogId}")
    public R baseAttrList(@RequestParam Map<String, Object> params,@PathVariable("catelogId") Long catelogId) {
        PageUtils page = attrService.queryBaseAttrPage(params, catelogId);
        return R.ok().put("page", page);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    对应 service 中

    @Override
    public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId) {
        QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<>();
    
        if (catelogId != 0) {
            queryWrapper.eq("catelog_id", catelogId);
        }
        String key = (String) params.get("key");
    
        if (!StringUtils.hasText(key)) {
            queryWrapper.and((wrapper)->{
                wrapper.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);
    
        List<AttrEntity> records = page.getRecords();
        records.stream().map((attrEntity) -> {
            AttrRespVo attrRespVo = new AttrRespVo();
            BeanUtils.copyProperties(attrEntity, attrRespVo);
            //1. 设置分类和分组的名字
            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());
            }
            CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
            if (categoryEntity != null) {
                attrRespVo.setCatelogName(categoryEntity.getName());
            }
            return attrRespVo;
        }).collect(Collectors.toList());
        return new PageUtils(page);
    }
    
    • 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

    要注意返回的数据我们单独封装成了一个 attrRespVo

    package com.fancy.gulimall.product.vo;
    
    import lombok.Data;
    
    @Data
    public class AttrRespVo extends AttrVo {
        private String catelogName;
        private String groupName;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    三、规格修改

    首先我们查看接口文档,需要编写查询属性详情的接口

    AttrRespVo 新增属性

    private Long[] catelogPath;
    
    • 1

    修改 AttrController 中的 info 方法

    @RequestMapping("/info/{attrId}")
    public R info(@PathVariable("attrId") Long attrId){
    //AttrEntity attr = attrService.getById(attrId);
        AttrRespVo respVo = attrService.getAttrInfo(attrId);
        return R.ok().put("attr", respVo);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    对应 service 中

    public AttrRespVo getAttrInfo(Long attrId) {
        AttrRespVo respVo = new AttrRespVo();
        AttrEntity attrEntity = this.getById(attrId);
        BeanUtils.copyProperties(attrEntity, respVo);
        AttrAttrgroupRelationEntity attrgroupRelation = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrId));
        // 1. 设置分组信息
        if (attrgroupRelation != null) {
    
            respVo.setAttrGroupId(attrgroupRelation.getAttrGroupId());
    
            AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupRelation.getAttrGroupId());
            if(attrGroupEntity != null)
            respVo.setGroupName(attrGroupEntity.getAttrGroupName());
        }
    
        // 2. 设置分类信息
        Long catelogId = attrEntity.getCatelogId();
        Long[] catelogPath = categoryService.findCatelogPath(catelogId);
        respVo.setCatelogPath(catelogPath);
    
        CategoryEntity categoryEntity = categoryDao.selectById(catelogId);
    
        if (categoryEntity != null) {
            respVo.setCatelogName(categoryEntity.getName());
        }
    
        return respVo;
    }
    
    • 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

    然后在 AttrController 中修改 update 方法

    @RequestMapping("/update")
    public R update(@RequestBody AttrVo attr){
    	attrService.updateAttr(attr);
        return R.ok();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    对应 service 中的方法,我们在此要分为修改和新增的情况。。。

    @Override
    public void updateAttr(AttrVo attr) {
        AttrEntity attrEntity = new AttrEntity();
        BeanUtils.copyProperties(attr, attrEntity);
        this.updateById(attrEntity);
    
        //1. 修改分组关联
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
        relationEntity.setAttrGroupId(attr.getAttrGroupId());
        relationEntity.setAttrId(attr.getAttrId());
    
        Integer count = relationDao.selectCount(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attr.getAttrId()));
    
        if (count > 0) {
            relationDao.update(relationEntity, new UpdateWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attr.getAttrId()));
        } else {
            relationDao.insert(relationEntity);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    【微机原理笔记】第 3 章 - 8086/8088的指令系统
    风管静压箱的作用及选型
    大二Web课程设计——家乡主题网页设计(web前端网页制作课作业) 四川旅游网页设计制作
    java毕业设计—— 基于java+JSP+SSH的网上购物系统设计与实现(毕业论文+程序源码)——网上购物系统
    Linux 线程概念&线程控制
    php tp5微信小程序发送模板消息【复制皆可用】
    4 AI scams to be aware of
    03.操作系统内存管理
    6183. 字符串的前缀分数和(每日一难phase2--day18)
    循环优化方法如数家珍
  • 原文地址:https://blog.csdn.net/m0_51111980/article/details/126774407