接上篇《55、商品添加功能(五)-商品内容模块》 上一篇我们完成了商品内容编辑模块的开发,也即是完成了商品所有的信息编辑,本篇我们就来开发提交商品所有信息到后台的功能。
一、要实现的效果
我们要实现点击“添加商品”的按钮,将5个页签中的所有信息全部封装为一个表单对象,然后统一提交至后台:
我们在之前每个页签的开发中其实已经将所有商品信息统一封装在addForm对象中去了,我们只要向后台提交该表单即可。
二、进行表单预验证
首先在提交商品信息之前,需要校验我们提交的数据是否全部合法,需要对addForm对象进行表单预验证。 首先我们为“添加商品”按钮新增一个点击事件函数“add”:
<el-tab-pane label="商品内容" name="5">
? ? <!-- 富文本编辑器组件 -->
? ? <quill-editor v-model="addForm.goods_introduce"></quill-editor>
? ? <el-button type="primary" style="margin-top:15px" @click="add()">添加商品</el-button>
</el-tab-pane>
然后我们在add方法中,第一步来通过表单的引用“addFormRef”的validate方法进行表单预验证:
//添加商品
add(){
? ? this.$refs.addFormRef.validate(valid=>{
? ? ? ? if(!valid){
? ? ? ? ? ? return this.$message.error('请填写必要的表单项!');
? ? ? ? }
? ? ? ? //执行添加的业务逻辑
? ? })
}
如果验证不通过,就提示错误消息,通过则放行,进入添加商品的逻辑。 我们回到页面,选择一个商品,什么信息也不填写,点击添加就可以看到报错:
然后回到基本信息页面可以看到被拦截的第一个未填参数,说明预校验生效:
三、对表单数据进行处理
在向后台提交商品之前,我们还需要对商品的参数进行一些处理,因为有一些格式类型还不符合API的要求,我们的商品提交API结构如下:
●请求数据
{
? "goods_name":"test_goods_name2",
? "goods_cat": "1,2,3",
? "goods_price":20,
? "goods_number":30,
? "goods_weight":40,
? "goods_introduce":"abc",
? "pics":[
? ? {"pic":"/tmp_uploads/30f08d52c551ecb447277eae232304b8"}
? ? ],
? "attrs":[
? ? {
? ? ? "attr_id":15,
? ? ? "attr_value":"ddd"
? ? },
? ? {
? ? ? "attr_id":15,
? ? ? "attr_value":"eee"
? ? }
? ? ]
}
在提交的参数中,有两项比较特殊,一个是“goods_cat”商品分类ID列表,一个是“attrs”商品的参数。 其中“goods_cat”是一个以英文逗号为分隔的字符串,其中从左到右放置了一级、二级和三级分类的ID。而我们当前提交的addForm表单对象中,goods_cat实际是一个数组对象,不是字符串,所以我们需要将goods_cat数组改造为字符串。这里我们使用数组对象的join函数:
//添加商品
add(){
? ? this.$refs.addFormRef.validate(valid=>{
? ? ? ? if(!valid){
? ? ? ? ? ? return this.$message.error('请填写必要的表单项!');
? ? ? ? }
? ? ? ? //执行添加的业务逻辑
? ? ? ? //1.将addForm表单对象复制一个,避免影响原有的双向绑定
? ? ? ? let form = JSON.parse(JSON.stringify(this.addForm));
? ? ? ? //2.处理goods_cat,将其由数组转为字符串
? ? ? ? form.goods_cat = form.goods_cat.join(",");
? ? ? ? console.log(form);
? ? })
}
这里我们不在原来的addForm上操作而是复制一个,是因为原来的addForm对象有很多参数使用了v-model与html组件进行了双向绑定,一旦修改的数据格式和绑定的html组件的数据格式不同,就会报错,为了避免这种情况,我们单独复制一个表单对象进行处理提交。
然后来处理“attrs”商品参数,我们在页面上选择的商品参数和属性都要存到这个数组中去,页面上的属性和参数分别存在“manyTableData”和“onlyTableData”中,在data区域定义:
//商品参数列表数据
manyTableData: [],
//商品属性列表数据
onlyTableData: [],
我们将这两个数组对象处理为单个对象,并组合为一个attr数组,然后挂到待提交的form表单对象上:
//添加商品
add(){
? ? this.$refs.addFormRef.validate(valid=>{
? ? ? ? if(!valid){
? ? ? ? ? ? return this.$message.error('请填写必要的表单项!');
? ? ? ? }
? ? ? ? //执行添加的业务逻辑
? ? ? ? //1.将addForm表单对象复制一个,避免影响原有的双向绑定
? ? ? ? let form = JSON.parse(JSON.stringify(this.addForm));
? ? ? ? //2.处理goods_cat,将其由数组转为字符串
? ? ? ? form.goods_cat = form.goods_cat.join(",");
? ? ? ? //3.处理动态参数
? ? ? ? let attrsArray = [];
? ? ? ? this.manyTableData.forEach(item=>{
? ? ? ? ? ? const newInfo = {attr_id:item.attr_id,
? ? ? ? ? ? attr_value:item.attr_vals.join(" ")};
? ? ? ? ? ? attrsArray.push(newInfo);
? ? ? ? })
? ? ? ? //4.处理静态属性
? ? ? ? this.onlyTableData.forEach(item=>{
? ? ? ? ? ? const newInfo = {attr_id:item.attr_id,
? ? ? ? ? ? attr_value:item.attr_vals};
? ? ? ? ? ? attrsArray.push(newInfo);
? ? ? ? })
? ? ? ? form['attrs']=attrsArray;//将参数数组赋值到新属性attrs上
? ? ? ? console.log(form);
? ? })
}
我们在页面上将所有商品信息填写完毕,看看最后打印的form表单数据格式:
发现已经完全符合API要提交的格式了。
四、向后台提交商品信息
我们向后台发起post请求,请求API地址为“goods”,将商品信息表单对象提交:
//添加商品
add(){
? ? this.$refs.addFormRef.validate(async valid=>{
? ? ? ? if(!valid){
? ? ? ? ? ? return this.$message.error('请填写必要的表单项!');
? ? ? ? }
? ? ? ? //执行添加的业务逻辑
? ? ? ? //1.将addForm表单对象复制一个,避免影响原有的双向绑定
? ? ? ? let form = JSON.parse(JSON.stringify(this.addForm));
? ? ? ? //2.处理goods_cat,将其由数组转为字符串
? ? ? ? form.goods_cat = form.goods_cat.join(",");
? ? ? ? //3.处理动态参数
? ? ? ? let attrsArray = [];
? ? ? ? this.manyTableData.forEach(item=>{
? ? ? ? ? ? const newInfo = {attr_id:item.attr_id,
? ? ? ? ? ? attr_value:item.attr_vals.join(" ")};
? ? ? ? ? ? attrsArray.push(newInfo);
? ? ? ? })
? ? ? ? //4.处理静态属性
? ? ? ? this.onlyTableData.forEach(item=>{
? ? ? ? ? ? const newInfo = {attr_id:item.attr_id,
? ? ? ? ? ? attr_value:item.attr_vals};
? ? ? ? ? ? attrsArray.push(newInfo);
? ? ? ? })
? ? ? ? form['attrs']=attrsArray;//将参数数组赋值到新属性attrs上
? ? ? ? console.log(form);
? ? ? ? //5.将商品信息表单对象通过API提交至后台
? ? ? ? const {data:res} = await this.$http.post('goods',form);
? ? ? ? if(res.meta.status!==201){
? ? ? ? ? ? return this.$message.error("添加商品失败!原因:"+res.meta.msg);
? ? ? ? }
? ? ? ? this.$message.success("添加商品成功!");
? ? ? ? //6.跳转回商品列表页面
? ? ? ? this.$router.push("/goods");
? ? })
}
测试:
可以看到商品添加成功。
五、提交与合并分支代码
至此我们的商品添加功能完成了,我们需要将这个分支提交并合并到主分支上。 首先使用“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
|