谷粒商城P76为【平台属性】->【属性分组】页面的 -查询全部- 按钮增加模糊查询的功能;【平台属性】->【规格参数】新增规格参数,引入vo包

  1. 为【平台属性】->【属性分组】页面的 -查询全部- 按钮增加模糊查询的功能
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 【平台属性】->【属性分组】 为每个分组关联属性
    在这里插入图片描述
    要关联属性首先要录入一些属性,先编写【平台属性】->【规格参数】页面
    在这里插入图片描述

新增规格参数:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
保存成功是调用了逆向生成的接口,只修改了pms_attr这张表
在这里插入图片描述
跟属性分组没有关联起来,也就是没修改pms_attr_attrgroup_relation这张表
在这里插入图片描述
所以我们需要重写这个保存方法~
而且前端发来的数据多了一个字段:attrGroupId
想想我们之前是怎么解决的?

在P74,点击修改按钮对属性分组进行修改的时候级联选择器没有正确回显
我们希望后端的@RequestMapping("product/attrgroup")@RequestMapping("/list/{attrGroupId}")
能多返回一个catelogId的完整路径
---我们为 AttrGroupEntity增加了一个字段:private Long[] catelogIdPath;
表示catelogId的完整路径,并用@TableField(exist = false)注解标注.数据库中不存在此字段

然后修改@RequestMapping("product/attrgroup")@RequestMapping("/list/{attrGroupId}")
对应的方法,让它返回的信息带上catelogIdPath。计算catelogIdPath的工作则交给categoryService

这种解决方式并不规范
更好的解决方式是专门写一个vo包,里面专门来放value object(值对象)或者称为view object(视图对象)
在这里插入图片描述
我们用vo来封装请求和响应对象。
在这里插入图片描述

package xyz.guawaz.gmall.product.vo;

//import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

@Data
public class AttrVo {

    /**
     * 属性id
     */
//    @TableId
    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;
}

这样就可以拿这个vo去Controller的方法中去接收请求对象了

    /**
     * 保存
     */
    @RequestMapping("/save")
    @RequiresPermissions("product:attr:save")
//    public R save(@RequestBody AttrEntity attr){
//		attrService.save(attr);
//
//        return R.ok();
//    }
//改成如下
    @RequestMapping("/save")
//    @RequiresPermissions("product:attr:save")
    public R save(@RequestBody AttrVo attr){
		attrService.saveAttr(attr);

        return R.ok();
    }

    @Transactional
    @Override
    public void saveAttr(AttrVo attr) {
        AttrEntity attrEntity = new AttrEntity();
//        attrEntity.setAttrId(attr.getAttrId()); 太麻烦 有工具类
        BeanUtils.copyProperties(attr,attrEntity);
        //保存基本数据
        this.save(attrEntity);
        //保存关联关系
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
        relationEntity.setAttrGroupId(attr.getAttrGroupId());
        relationEntity.setAttrId(attrEntity.getAttrId());
        relationDao.insert(relationEntity);
    }

测试:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
预测分析程序是一种自顶向下的语法分析方法,它可以根据给定的文法和预测分析表来判断一个符号串是否为该文法的句子,并给出该句子的分析过程。 以下是该文法对应的预测分析表: | | id | + | * | ( | ) | $ | |---|---|---|---|---|---|---| | E | E->TX | | | E->TX | | | | X | | E->+TX | | | E->ε | E->ε | | T | T->FY | | | T->FY | | | | Y | | E->ε | T->*FY | | E->ε | E->ε | | F | F->id | | | F->(E) | | | 其中,每个非终结符号对应一行,每个终结符号对应一列,表格中的每个格子里都填写了相应的产生式。例如,第一行第一列的格子填写了 E->TX,表示当遇到输入符号串中的 id 时,应该使用该产生式进行推导。 根据上述预测分析表,我们可以编写对应的预测分析程序,具体步骤如下: 1. 定义一个栈 stack 和一个输入符号串 input。 2. 将 $ 和文法的起始符号 E 入栈。 3. 从输入符号串中读入一个符号 a,如果 a 不是 $,则重复步骤 4 到 6,否则进入步骤 7。 4. 弹出栈顶的符号 X。 5. 如果 X 是一个终结符号,则比较 X 和 a 是否相等,如果相等则从输入符号串中读入下一个符号 a,否则表示输入错误,返回 False。 6. 如果 X 是一个非终结符号,则查找预测分析表中对应的产生式 A->β,将 β 的倒序依次压入栈中。 7. 如果栈顶符号为 $,且输入符号串中也只剩下 $,则表示分析成功,返回 True,否则表示输入错误,返回 False。 根据上述算法,我们可以编写出以下 Python 代码实现该预测分析程序: ```python def analyze(input_str): stack = ['$','E'] input_str += '$' i = 0 while len(stack) > 0: X = stack.pop() a = input_str[i] if X == a: i += 1 elif X in ['id','+','*','(',')']: return False else: rule = P[X][a] if rule != None: for symbol in reversed(rule): if symbol != 'ε': stack.append(symbol) else: return False return True P = { 'E': {'id':['T','X'],'+':None,'*':None,'(':['T','X'],')':None,'$':None}, 'X': {'id':None,'+':['+','T','X'],'*':None,'(':None,')':['ε'],'$':['ε']}, 'T': {'id':['F','Y'],'+':None,'*':None,'(':['F','Y'],')':None,'$':None}, 'Y': {'id':['ε'],'+':['ε'],'*':['*','F','Y'],'(':None,')':['ε'],'$':['ε']}, 'F': {'id':['id'],'+':None,'*':None,'(':['(','E',')'],')':None,'$':None} } input_str = 'id*id+id$' print(analyze(input_str)) # True ``` 其中,预测分析表 P 以字典形式表示,每个非终结符号对应一个子字典,子字典中每个终结符号都对应一个产生式。例如,P['E']['id'] 表示 E 非终结符号在遇到输入符号串中的 id 时应该采用的产生式。如果遇到输入符号与预测分析表中的格子为空,则说明输入错误,返回 False。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值