• 【VUE项目实战】56、商品添加功能(六)-提交添加的商品


    接上篇《55、商品添加功能(五)-商品内容模块
    上一篇我们完成了商品内容编辑模块的开发,也即是完成了商品所有的信息编辑,本篇我们就来开发提交商品所有信息到后台的功能。

    一、要实现的效果

    我们要实现点击“添加商品”的按钮,将5个页签中的所有信息全部封装为一个表单对象,然后统一提交至后台:

    我们在之前每个页签的开发中其实已经将所有商品信息统一封装在addForm对象中去了,我们只要向后台提交该表单即可。

    二、进行表单预验证

    首先在提交商品信息之前,需要校验我们提交的数据是否全部合法,需要对addForm对象进行表单预验证。
    首先我们为“添加商品”按钮新增一个点击事件函数“add”:

    1. <el-tab-pane label="商品内容" name="5">
    2.     <!-- 富文本编辑器组件 -->
    3.     <quill-editor v-model="addForm.goods_introduce"></quill-editor>
    4.     <el-button type="primary" style="margin-top:15px" @click="add()">添加商品</el-button>
    5. </el-tab-pane>

    然后我们在add方法中,第一步来通过表单的引用“addFormRef”的validate方法进行表单预验证:

    1. //添加商品
    2. add(){
    3.     this.$refs.addFormRef.validate(valid=>{
    4.         if(!valid){
    5.             return this.$message.error('请填写必要的表单项!');
    6.         }
    7.         //执行添加的业务逻辑
    8.     })
    9. }

    如果验证不通过,就提示错误消息,通过则放行,进入添加商品的逻辑。
    我们回到页面,选择一个商品,什么信息也不填写,点击添加就可以看到报错:


    然后回到基本信息页面可以看到被拦截的第一个未填参数,说明预校验生效:

    三、对表单数据进行处理

    在向后台提交商品之前,我们还需要对商品的参数进行一些处理,因为有一些格式类型还不符合API的要求,我们的商品提交API结构如下:

    ●请求数据

    1. {
    2.   "goods_name":"test_goods_name2",
    3.   "goods_cat": "1,2,3",
    4.   "goods_price":20,
    5.   "goods_number":30,
    6.   "goods_weight":40,
    7.   "goods_introduce":"abc",
    8.   "pics":[
    9.     {"pic":"/tmp_uploads/30f08d52c551ecb447277eae232304b8"}
    10.     ],
    11.   "attrs":[
    12.     {
    13.       "attr_id":15,
    14.       "attr_value":"ddd"
    15.     },
    16.     {
    17.       "attr_id":15,
    18.       "attr_value":"eee"
    19.     }
    20.     ]
    21. }

    在提交的参数中,有两项比较特殊,一个是“goods_cat”商品分类ID列表,一个是“attrs”商品的参数。
    其中“goods_cat”是一个以英文逗号为分隔的字符串,其中从左到右放置了一级、二级和三级分类的ID。而我们当前提交的addForm表单对象中,goods_cat实际是一个数组对象,不是字符串,所以我们需要将goods_cat数组改造为字符串。这里我们使用数组对象的join函数:

    1. //添加商品
    2. add(){
    3.     this.$refs.addFormRef.validate(valid=>{
    4.         if(!valid){
    5.             return this.$message.error('请填写必要的表单项!');
    6.         }
    7.         //执行添加的业务逻辑
    8.         //1.将addForm表单对象复制一个,避免影响原有的双向绑定
    9.         let form = JSON.parse(JSON.stringify(this.addForm));
    10.         //2.处理goods_cat,将其由数组转为字符串
    11.         form.goods_cat = form.goods_cat.join(",");
    12.         console.log(form);
    13.     })
    14. }

    这里我们不在原来的addForm上操作而是复制一个,是因为原来的addForm对象有很多参数使用了v-model与html组件进行了双向绑定,一旦修改的数据格式和绑定的html组件的数据格式不同,就会报错,为了避免这种情况,我们单独复制一个表单对象进行处理提交。

    然后来处理“attrs”商品参数,我们在页面上选择的商品参数和属性都要存到这个数组中去,页面上的属性和参数分别存在“manyTableData”和“onlyTableData”中,在data区域定义:

    1. //商品参数列表数据
    2. manyTableData: [],
    3. //商品属性列表数据
    4. onlyTableData: [],

    我们将这两个数组对象处理为单个对象,并组合为一个attr数组,然后挂到待提交的form表单对象上:

    1. //添加商品
    2. add(){
    3.     this.$refs.addFormRef.validate(valid=>{
    4.         if(!valid){
    5.             return this.$message.error('请填写必要的表单项!');
    6.         }
    7.         //执行添加的业务逻辑
    8.         //1.将addForm表单对象复制一个,避免影响原有的双向绑定
    9.         let form = JSON.parse(JSON.stringify(this.addForm));
    10.         //2.处理goods_cat,将其由数组转为字符串
    11.         form.goods_cat = form.goods_cat.join(",");
    12.         //3.处理动态参数
    13.         let attrsArray = [];
    14.         this.manyTableData.forEach(item=>{
    15.             const newInfo = {attr_id:item.attr_id,
    16.             attr_value:item.attr_vals.join(" ")};
    17.             attrsArray.push(newInfo);
    18.         })
    19.         //4.处理静态属性
    20.         this.onlyTableData.forEach(item=>{
    21.             const newInfo = {attr_id:item.attr_id,
    22.             attr_value:item.attr_vals};
    23.             attrsArray.push(newInfo);
    24.         })
    25.         form['attrs']=attrsArray;//将参数数组赋值到新属性attrs上
    26.         console.log(form);
    27.     })
    28. }

    我们在页面上将所有商品信息填写完毕,看看最后打印的form表单数据格式:

    发现已经完全符合API要提交的格式了。

    四、向后台提交商品信息

    我们向后台发起post请求,请求API地址为“goods”,将商品信息表单对象提交:

    1. //添加商品
    2. add(){
    3.     this.$refs.addFormRef.validate(async valid=>{
    4.         if(!valid){
    5.             return this.$message.error('请填写必要的表单项!');
    6.         }
    7.         //执行添加的业务逻辑
    8.         //1.将addForm表单对象复制一个,避免影响原有的双向绑定
    9.         let form = JSON.parse(JSON.stringify(this.addForm));
    10.         //2.处理goods_cat,将其由数组转为字符串
    11.         form.goods_cat = form.goods_cat.join(",");
    12.         //3.处理动态参数
    13.         let attrsArray = [];
    14.         this.manyTableData.forEach(item=>{
    15.             const newInfo = {attr_id:item.attr_id,
    16.             attr_value:item.attr_vals.join(" ")};
    17.             attrsArray.push(newInfo);
    18.         })
    19.         //4.处理静态属性
    20.         this.onlyTableData.forEach(item=>{
    21.             const newInfo = {attr_id:item.attr_id,
    22.             attr_value:item.attr_vals};
    23.             attrsArray.push(newInfo);
    24.         })
    25.         form['attrs']=attrsArray;//将参数数组赋值到新属性attrs上
    26.         console.log(form);
    27.         //5.将商品信息表单对象通过API提交至后台
    28.         const {data:res} = await this.$http.post('goods',form);
    29.         if(res.meta.status!==201){
    30.             return this.$message.error("添加商品失败!原因:"+res.meta.msg);
    31.         }
    32.         this.$message.success("添加商品成功!");
    33.         //6.跳转回商品列表页面
    34.         this.$router.push("/goods");
    35.     })
    36. }

    测试:


    可以看到商品添加成功。

    五、提交与合并分支代码

    至此我们的商品添加功能完成了,我们需要将这个分支提交并合并到主分支上。
    首先使用“git branch”查看当前所在分支,是goods_list分支;然后使用“git add .”将修改内容添加到暂存区,然后执行“git commit”将修改内容提交至当前本地分支;然后使用“git push”将本地分支push到云端;最后通过“git checkout master”将分支切换到master分支,执行“git merge goods_list”将goods_list的内容合并至master主分支,然后将本地master分支推送到云端,此时master更新到了最新


    前往Gitee查看首页的提交记录,可以看到合并成功:

    至此我们的商品内容提交功能就完成了。
    下一篇我们来开发一个新的模块——————订单管理。

    参考:黑马程序员(www.itheima.com)Vue项目实战教学视频

    转载请注明出处:https://blog.csdn.net/acmman/article/details/125470496

  • 相关阅读:
    【面试算法——动态规划 21】不同的子序列(hard)&& 通配符匹配(hard)
    Spring一些面试知识点
    Java-Optional(空处理)
    什么是自动化测试框架?如何搭建自动化测试框架详解
    原型和原型对象
    mysql隔离级别RR下的行锁、临键锁、间隙锁详解及运用
    Openstack 通信
    洛谷 P1438 无聊的数列(线段树,差分)
    centos7 宝塔php7安装mongodb扩展
    Mybatis中Like 的三种使用方式
  • 原文地址:https://blog.csdn.net/u013517797/article/details/125470496