128.(前端)增加商品前数据处理——将二维数组转成字符串形式传递

1.概述

在这里插入图片描述
当我们点击添加商品时,获取之前的信息数据,对此,我们需要对tab传递的数据进行处理

2.流程

2.1参数没有返回问题

需要在addForm返回值中,添加变量,然后在点击按钮中赋值。
在这里插入图片描述
在这里插入图片描述

2.2修改后测试结果

在这里插入图片描述

2.3前端编写发送请求保存数据并查看

 goodsAdd() {
            this.addForm.attr_static = this.attr_static
            this.addForm.attr_dynamic = this.attr_dynamic
            console.log(this.addForm);
            this.saveGoods()
        },
        async saveGoods(){
            const { data: resp } = await this.$axios.post('/api/goods', this.$qs.stringify(this.addForm))
            if(resp.status !== 200) return this.$msg.error(resp.msg)
            this.$msg.success(resp.msg)
        }

当我们查看在这里插入图片描述

当我们查看发送请求的表单内容发现,我们的多级参数传递时变成了二维数组的形式进行传送,这样对后端接口的编写很不友好,我们需要对其进行修改

2.3修改二维数组数据传送为字符串列表形式

goodsAdd() {
            const staticList = []
            this.attr_static.forEach(atr => {
                // console.log("id",atr.id);
                staticList.push({ id: atr.id, val: atr.val})
            })
            console.log(this.attr_static);
            this.addForm.attr_static = JSON.stringify(staticList)

            const dynamicList = []
            this.attr_dynamic.forEach(atr => {
                dynamicList.push({ id: atr.id, val: atr.val.join(',')})
            })
            this.addForm.attr_dynamic = JSON.stringify(dynamicList)
            this.addForm.pics = JSON.stringify(this.addForm.pics)
            console.log(this.addForm);
            // this.saveGoods()
        },

3.效果展示

![erwei

4.完整代码展示

<!-- src/components/goods/Add.vue -->
<template>
    <div>
        <!-- 面包屑 -->
        <el-breadcrumb separator-class="el-icon-arrow-right">
            <el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
            <el-breadcrumb-item>商品管理</el-breadcrumb-item>
            <el-breadcrumb-item>增加商品</el-breadcrumb-item>
        </el-breadcrumb>
        <el-card>
            <!-- 提示信息 -->
            <el-alert title="增加商品信息" type="info" center show-icon></el-alert>
            <!-- 步骤条 -->
                <el-steps :active="active-0" finish-status="success" align-center>
                    <!-- 设置active属性,接受一个Number,表明步骤的 index,从 0 开始。  -->
                    <el-step title="基本信息"></el-step>
                    <el-step title="商品静态参数"></el-step>
                    <el-step title="商品动态参数"></el-step>
                    <el-step title="商品图片"></el-step>
                    <el-step title="商品内容"></el-step>
                    <el-step title="完成"></el-step>
                </el-steps>
            <!-- Tabs标签页:利用一个表单包裹整个内容 -->
            <el-form :model="addForm" ref="addRef" :rules="addRules" label-position="top">
                <el-tabs v-model="active" :tab-position="'left'" :before-leave="beforeLeave">
                    <el-tab-pane label="基本信息" name="0">
                        <!-- prop是用于 -->
                        <el-form-item label="商品名称" prop="name">
                            <el-input v-model="addForm.name"></el-input>
                        </el-form-item>
                        <el-form-item label="商品价格" prop="price">
                            <el-input v-model="addForm.price"></el-input>
                        </el-form-item>
                        <el-form-item label="商品数量" prop="number">
                            <el-input v-model="addForm.number"></el-input>
                        </el-form-item>
                        <el-form-item label="商品权重" prop="weight">
                            <el-input v-model="addForm.weight"></el-input>
                        </el-form-item>
                        <el-form-item label="商品分类">
                            <el-cascader v-model="selectKeys" :options="cateIdList"
                                :props="{ expandTrigger: 'hover', label:'name', value:'id', checkStrictly: true }"
                                @change="changeSeletor"
                                clearable
                                separator=">">
                            </el-cascader>
                        </el-form-item>
                    </el-tab-pane>
                    <el-tab-pane label="商品静态参数" name="1">
                        <!-- 创建一个输入框,可以对内容进行修改和展示,方便后期想修改 -->
                        <el-form-item :label="s.name" v-for="s in attr_static" :key="s.id">
                            <el-input v-model="s.val"></el-input>
                        </el-form-item>
                    </el-tab-pane>
                    <el-tab-pane label="商品动态参数" name="2">
                        <el-form-item :label="d.name" v-for="d in attr_dynamic" :key="d.id">
                            <el-checkbox-group v-model="d.val">
                                <el-checkbox :label="dv" v-for="(dv,i) in d.val" :key="i" border></el-checkbox>
                            </el-checkbox-group>
                        </el-form-item>
                    </el-tab-pane>
                    <el-tab-pane label="商品图片" name="3">
                        <el-upload 
                        class="upload-demo" 
                        action="/api/upload_img" 
                        :on-preview="handlePreview"
                        :on-remove="handleRemove" 
                        :on-success="handleSuccess"
                        :file-list="fileList" 
                        list-type="picture">
                            <el-button size="small" type="primary">点击上传</el-button>
                        </el-upload>
                    </el-tab-pane>
                    <el-tab-pane label="商品内容" name="4">
                        <quill-editor v-model="addForm.introduce"></quill-editor>
                        <el-button type="primary" @click="goodsAdd" class="btnAdd">添加商品</el-button>
                    </el-tab-pane>
                </el-tabs>
            </el-form>
        </el-card>
        <el-dialog title="图片预览" :visible.sync="previewVisible" width="40%">
            <img :src="previewPath" class="previewImg"/>
        </el-dialog>
    </div>
</template>

<script>
export default {
    data() {
        return {
            active: '0',
            addForm:{
                name:'',
                price:0,
                number:0,
                weight:0,
                cid_one:0,
                cid_two:0,
                cid_three:0,
                pics: [],
                introduce:'',
                attr_static:[],
                attr_dynamic:[]
            },
            addRules:{
                name:[{required:true, message:"请输入填写商品名称", tigger:'blur'}],
                price:[{required:true, message:"请输入填写商品价格", tigger:'blur'}],
                number:[{required:true, message:"请输入填写商品数量", tigger:'blur'}],
                weight:[{required:true, message:"请输入填写商品权重", tigger:'blur'}]
            },
            cateIdList:[],
            selectKeys:[],
            attr_static: [],
            attr_dynamic:[],
            previewVisible: false,
            previewPath: ''
        }
    },
    created() {
        this.getCateList()
    },
    methods: {
        // 获取全部列表,用于展示
        async getCateList() {
            const { data: resp } = await this.$axios.get('/api/category_list')
            if (resp.status !== 200) return this.$msg.error(resp.msg)
            this.cateIdList = resp.data.data
        },
        // 发生变更时
        changeSeletor() {
            if(this.selectKeys.length < 3) return
            this.addForm.cid_one = this.selectKeys[0]
            this.addForm.cid_two = this.selectKeys[1]
            this.addForm.cid_three = this.selectKeys[2]
            console.log(this.addForm);
        },
        // 验证是否能跳转到下一级tabs的函数
        beforeLeave(activeName, oldActiveName){
            // 验证是否存在三级目录的输入
            if(this.selectKeys.length < 3) {
                this.$msg.error("请先输入三级商品分类信息!!!!")
                return false
            }
            // console.log(activeName)
            // console.log(oldActiveName)
            // 在准备跳转到下一级时,发送请求获取到下一级静态的内容
            if (activeName === '1') this.getAttribute('static')
            if (activeName === '2') this.getAttribute('dynamic')
        },
        // 获取静态参数
        async getAttribute(_type) {
            const { data: resp } = await this.$axios.get('/api/category/attr_list', {
                params: { cid: this.selectKeys[2], _type: _type}
            })
            if (resp.status !== 200) return this.$msg.error(resp.msg)
            // console.log(resp.data);
            if (_type === 'static'){
                this.attr_static = resp.data
            }else{
                resp.data.forEach(item => {
                    item.val = item.val?item.val.split(','):[]
                })
                this.attr_dynamic = resp.data
            }
        },
        // 上传成功时触发:绑定上传图片的路径
        handleSuccess(resp){
            // console.log(resp); //查看返回值
            this.addForm.pics.push(resp.data.path)
        },
        // 删除上传图片
        handleRemove(file){
            // console.log(file);
            // console.log(this.addForm.pics);
            const i = this.addForm.pics.findIndex( x => x===file.response.data.path)
            this.addForm.pics.splice(i,1)
            // console.log(this.addForm.pics);
        },
        // 上传图片的预览
        handlePreview(file){
            this.previewVisible = true
            this.previewPath = file.response.data.url
        },
        goodsAdd() {
            const staticList = []
            this.attr_static.forEach(atr => {
                // console.log("id",atr.id);
                staticList.push({ id: atr.id, val: atr.val})
            })
            console.log(this.attr_static);
            this.addForm.attr_static = JSON.stringify(staticList)

            const dynamicList = []
            this.attr_dynamic.forEach(atr => {
                dynamicList.push({ id: atr.id, val: atr.val.join(',')})
            })
            this.addForm.attr_dynamic = JSON.stringify(dynamicList)
            this.addForm.pics = JSON.stringify(this.addForm.pics)
            console.log(this.addForm);
            // this.saveGoods()
        },
        async saveGoods(){
            const { data: resp } = await this.$axios.post('/api/goods', this.$qs.stringify(this.addForm))
            if(resp.status !== 200) return this.$msg.error(resp.msg)
            this.$msg.success(resp.msg)
        }
    }
}
</script>

<style lang="less" scoped>
.el-tabs{
    margin-top: 10px
}
.el-alert{
    margin-bottom: 5px;
}
.el-cascader{
    width:500px
}
.el-checkbox{
    margin: 0 10px 0 0 !important;
}
.previewImg{
    width: 100%;
}
.btnAdd{
    margin-top: 5px;
}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

想成为数据分析师的开发工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值