谷粒商城-基础篇-商品服务5-平台属性(P76-P82)


商品服务-平台属性

一、商品服务-API-平台属性


1、规格参数

(1)PO、DO、TO、DTO

1.PO持久对象

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

2、DO(Domain 0bject)领域对象

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

3.TO(Transfer 0bject),数据传输对象传输的对象

不同的应用程序之间传输的对象。微服务

4.DTO(Data Transfer Obiect)数据传输对象

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

5.VO(value object)值对象

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

View object:视图对象

接受页面传递来的对象,封装对象

将业务处理完成的对象,封装成页面要用的数据

6.BO(business object)业务对象

从业务模型的度看.见IJML元#领嵫模型的领嵫对象。封装业务逻辑的java对象,通过用DAO方法,结合PO,VO进行业务操作。businessobject:业务对象主要作用是把业务逻辑封装为一个对苤。这个对象可以包括一个或多个其它的对彖。比如一个简历,有教育经历、工怍经历、社会关系等等。我们可以把教育经历对应一个PO工作经历

7、POJO简单无规则java对象

8、DAO


(2)新增关联关系功能完善

在这里插入图片描述

Request URL: http://localhost:88/api/product/attr/save,现在的情况是,它在保存的时候,只是保存了attr,并没有保存attrgroup,为了解决这个问题,我们新建了一个vo/AttrVo.java,在原Attr基础上增加了attrGroupId字段,使得保存新增数据的时候,也保存了它们之间的关系

AttrServiceImpl

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

(3)规格参数列表

在这里插入图片描述

  • 先用mp的正常分页查出来数据,得到Page对象
  • 然后用PageUtils把分页信息得到,但里面的数据需要替换一下
  • 替换数据是为了解决“不使用联表查询”
 @Override
    public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId) {

        QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<>();

        if (catelogId != 0) {
            queryWrapper.eq("catelog_id", catelogId);
        }

        // 获取key
        String key = (String) params.get("key");
        if (!StringUtils.isEmpty(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 pageUtils = new PageUtils(page);
        // 1. 获取记录
        List<AttrEntity> records = page.getRecords();
        // 2. 重新处理,映射元素
        List<AttrResVo> resVoList = records.stream().map((attrEntity) -> {
            AttrResVo attrResVo = new AttrResVo();
            // 2.1 拷贝基本属性
            BeanUtils.copyProperties(attrEntity, attrResVo);
            // 2.2 设置分类和分组的名字

            // 关联表中根据属性id 查到 分组id
            AttrAttrgroupRelationEntity attrId = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrEntity.getAttrId()));
            // 根据 attrId 得到分组信息
            if (attrId != null) {
                AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrId);
                // 设置分组名
                attrResVo.setGroupName(attrGroupEntity.getAttrGroupName());
            }
            // 设置分类名
            CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
            if (categoryEntity != null) {
                attrResVo.setCatelogName(categoryEntity.getName());
            }

            return attrResVo;
        }).collect(Collectors.toList());

        pageUtils.setList(resVoList);
        return pageUtils;
    }


(4)规格参数修改

在这里插入图片描述

AttrServiceImpl

 // 信息回显
    @Override
    public AttrResVo getAttrInfo(Long attrId) {
        AttrResVo resVo = new AttrResVo();
        // 获取当前attr
        AttrEntity attrEntity = this.getById(attrId);
        // 基本属性拷贝到reVo
        BeanUtils.copyProperties(attrEntity, resVo);

        // 1.分组信息设置
        // 1.1 在关联表中查询 attr_id 对应的 分组信息
        AttrAttrgroupRelationEntity attrgroupRelation = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrId));
        if (attrgroupRelation != null) {
            // 1.2 根据分组关联信息得到分组id
            resVo.setAttrGroupId(attrgroupRelation.getAttrGroupId());
            // 1.3 设置分组名字
            AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupRelation.getAttrGroupId());
            if (attrGroupEntity != null) {
                resVo.setGroupName(attrGroupEntity.getAttrGroupName());
            }
        }

        // 2.设置分类信息
        // 2.1 设置分类id
        Long catelogId = attrEntity.getCatelogId();
        // 2.2 获取完整路径
        Long[] cateLogPath = categoryService.findCateLogPath(catelogId);
        resVo.setCatelogPath(cateLogPath);
        CategoryEntity categoryEntity = categoryDao.selectById(catelogId);
        if (categoryEntity != null) {
            resVo.setCatelogName(categoryEntity.getName());
        }
        return resVo;
    }

    // 修改数据
    @Override
    public void updateAttr(AttrVo attr) {
        AttrEntity attrEntity = new AttrEntity();
        BeanUtils.copyProperties(attr, attrEntity);
        // 修改基本数据
        this.updateById(attrEntity);

        // 修改分组关联
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
        relationEntity.setAttrGroupId(attr.getAttrGroupId());
        relationEntity.setAttrId(attr.getAttrId());
        // 条件
        QueryWrapper<AttrAttrgroupRelationEntity> wrapper = new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attr.getAttrId());

        Integer count = relationDao.selectCount(wrapper);
        if (count > 0) {
            // 更新
            relationDao.update(relationEntity, wrapper);
        } else {
            // 新增
            relationDao.insert(relationEntity);
        }

    }


2、销售属性

(1) 获取分类销售属性:

在这里插入图片描述

/product/attr/sale/list/{catelogId}

  • 直接修改queryBaseAttrPage,增加参数type用于判断类型是base 还是 sale
 public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId, String type) {

        QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>();
        // 判断type类型,是base 还是 sale
        queryWrapper.eq("attr_type", "base".equalsIgnoreCase(type) ? 1 : 0);

(2)优化

  • 基本属性才需要进行分组信息设置
  • common 中增加ProductConstant常量

public class ProductConstant {

    public enum AttrEnum{
        ATTR_TYPE_BASE(1,"基本属性"),ATTR_TYPE_SALE(0,"销售属性");
        private int code;
        private String msg;

        AttrEnum(int code, String msg) {
            this.code = code;
            this.msg = msg;
        }

if (attrEntity.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()) {
            // 1.分组信息设置if (attrEntity.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()) {
            // 1.分组信息设置

3、分组关联

(1)获取分组关联属性

在这里插入图片描述

AttrServiceImpl

/**
     * 根据分组id 查找所有关联属性
     *
     * @param attrgroupId
     * @return
     */
    @Override
    public List<AttrEntity> getRelationAttr(Long attrgroupId) {
        // 1. 查询关联表
        List<AttrAttrgroupRelationEntity> entities = relationDao.selectList(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_group_id", attrgroupId));

        // 2. 收集属性id attr_id
        List<Long> attrIds = entities.stream().map((attr) -> {
            return attr.getAttrId();
        }).collect(Collectors.toList());

		if (attrIds == null || attrIds.size() == 0) {
            return null;
        }

        // 3. 根据属性id集合查询所有信息
        List<AttrEntity> attrEntities = this.listByIds(attrIds);

        return attrEntities;
    }

(2)删除关联

AttrServiceImpl

   /**
     * 批量删除
     *
     * @param vos
     */
    @Override
    public void deleteRelations(AttrGroupRelationVo[] vos) {
        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);
    }

AttrAttrgroupRelationDao.xml

   <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)查询分组未关联属性

在这里插入图片描述

AttrServiceImpl

/**
     * 获取当前分组未关联的属性
     *
     * @param params
     * @param attrgroupId
     * @return
     */
    @Override
    public PageUtils getNoRelationAttr(Map<String, Object> params, Long attrgroupId) {
        // 1. 当前分组只能关联自己所属分类里面的所有属性
        //  1.1 获取当前分组信息
        AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupId);
        //  1.2 根据当前分组信息获取分类id
        Long catelogId = attrGroupEntity.getCatelogId();

        // 2. 当前分组只能关联别的分组没有引用的属性
        //  2.1 当前分类下的其他分组
        List<AttrGroupEntity> group = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>()
                .eq("catelog_id", catelogId));

        List<Object> collect = group.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> 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);
        PageUtils pageUtils = new PageUtils(page);

        return pageUtils;
    }

(4)新增 分组与属性 关联

在这里插入图片描述


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据教材 P76-78 4.5 预测分析程序的方法,我们可以按照以下步骤构造相关预测分析程序: 1. 构造预测分析表 根据教材 P76 表 4.1,我们可以构造出预测分析表如下: | | id | + | * | ( | ) | # | E | T | F | | -- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | | 0 | S | | | S->E | | | 1 | 2 | 3 | | 1 | | S->E+T| | | err | acc | | | | | 2 | | R3 | S->T | | R3 | R3 | | | | | 3 | | R6 | R6 | | R6 | R6 | | | | 其中,S 表示起始符号,# 表示输入串的结束符号,err 表示出错,acc 表示成功接受。 2. 编写预测分析程序 根据预测分析表,我们可以编写一个预测分析程序,程序的基本框架如下: ``` bool analyze(string input) { stack<int> stk; stk.push(0); // 初始状态为 0 int i = 0; // 输入串的指针 char X; // 栈顶符号 int state; // 状态编号 while (true) { X = stk.top(); // 取出栈顶符号 state = X - '0'; // 获取状态编号 char ch = input[i]; // 获取输入串的下一个字符 int col = getColumn(ch); // 获取输入字符对应的列号 char action = table[state][col]; // 查表获取动作 if (action == ' ') { // 出错 cout << "Error!" << endl; return false; } else if (action == 'acc') { // 成功接受 cout << "Accepted!" << endl; return true; } else if (action == 'S') { // 移进 stk.push(ch); // 将字符压入栈中 stk.push(action - '0'); // 将新状态压入栈中 i++; // 输入串指针后移 } else { // 规约 int len = getLength(action); // 获取规约所需弹出的符号数 for (int j = 0; j < 2 * len; j++) { // 弹出符号 stk.pop(); } X = stk.top(); // 取出新的栈顶符号 state = X - '0'; // 获取新的状态编号 int row = getRow(X); // 获取新的行号 char newSymbol = table[row][getColumn(X)]; // 查表获取新的动作 stk.push(X); // 将新符号压入栈中 stk.push(newSymbol - '0'); // 将新状态压入栈中 } } } ``` 其中,getColumn 和 getRow 函数分别用于获取输入字符对应的列号和栈顶符号对应的行号,getLength 函数用于获取规约所需弹出的符号数。这些函数的具体实现可以参考教材 P77-78。 3. 测试程序 我们可以编写一个简单的测试程序来测试预测分析程序,代码如下: ``` int main() { string input; cout << "Please enter a string: "; cin >> input; input += '#'; // 在输入串末尾加上结束符号 # bool result = analyze(input); return 0; } ``` 在运行测试程序时,我们需要手动输入一个待分析的符号串。例如,如果我们输入符号串 "id+id*id",程序应该输出 "Accepted!",表示该符号串是一个合法的符号串。如果输入不合法的符号串,程序会输出 "Error!"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿箭柠檬茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值