|
@@ -0,0 +1,3951 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <Drawer :value="visible" :closable="true" :styles="{ padding: '0 0 60px' }" width="1000"
|
|
|
|
|
+ @on-visible-change="drawerChange">
|
|
|
|
|
+ <div class="header">
|
|
|
|
|
+ <Icon custom="iconfont iconmanjianmanzhe" size="60" />
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="title">{{ formValidate.store_name }}</div>
|
|
|
|
|
+ <div>商品ID:{{ productId }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <Tabs v-model="currentTab">
|
|
|
|
|
+ <TabPane v-for="(item, index) in headTab" v-if="index !=6 || (index==6 && merchantType==0)" :key="item.name" :label="item.title" :name="item.name">
|
|
|
|
|
+ </TabPane>
|
|
|
|
|
+ </Tabs>
|
|
|
|
|
+ <Form class="formValidate" ref="formValidate" :model="formValidate" :label-width="labelWidth"
|
|
|
|
|
+ :label-position="labelPosition" @submit.native.prevent>
|
|
|
|
|
+ <Row type="flex" v-show="currentTab === '1'">
|
|
|
|
|
+ <!-- 商品信息-->
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品类型:" props="is_virtual">
|
|
|
|
|
+ <RadioGroup v-model="formValidate.product_type">
|
|
|
|
|
+ <Radio v-for="item in productType" :key="item.id" :label="item.id" disabled>{{ item.name }}</Radio>
|
|
|
|
|
+ </RadioGroup>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品分类:" prop="cate_id">
|
|
|
|
|
+ <el-cascader placeholder="请选择商品分类" v-width="'50%'" size="mini" v-model="formValidate.cate_id"
|
|
|
|
|
+ :options="treeSelect" :props="props" filterable clearable>
|
|
|
|
|
+ </el-cascader>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品名称:" prop="store_name">
|
|
|
|
|
+ <Input v-model="formValidate.store_name" placeholder="请输入商品名称" v-width="'50%'" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" class="brandName">
|
|
|
|
|
+ <FormItem label="商品品牌:" prop="">
|
|
|
|
|
+ <Cascader :data="brandData" placeholder="请选择商品品牌" change-on-select v-model="formValidate.brand_id" filterable
|
|
|
|
|
+ v-width="'50%'"></Cascader>
|
|
|
|
|
+ <!-- <span class="addClass" @click="addBrand">新增品牌</span> -->
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="单位:" prop="unit_name">
|
|
|
|
|
+ <Select v-model="formValidate.unit_name" clearable filterable v-width="'50%'" placeholder="请输入单位">
|
|
|
|
|
+ <Option v-for="(item, index) in unitNameList" :value="item.name" :key="item.id">{{ item.name }}</Option>
|
|
|
|
|
+ </Select>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品编码:" prop="">
|
|
|
|
|
+ <Input v-model="formValidate.code" placeholder="请输入商品编码" v-width="'50%'" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品轮播图:" prop="slider_image">
|
|
|
|
|
+ <div class="acea-row">
|
|
|
|
|
+ <div class="pictrue" v-for="(item, index) in formValidate.slider_image" :key="index+'img'" draggable="true"
|
|
|
|
|
+ @dragstart="handleDragStart($event, item)" @dragover.prevent="handleDragOver($event, item)"
|
|
|
|
|
+ @dragenter="handleDragEnter($event, item)" @dragend="handleDragEnd($event, item)">
|
|
|
|
|
+ <img v-lazy="item" />
|
|
|
|
|
+ <Button shape="circle" icon="md-close" @click.native="handleRemove(index)" class="btndel"></Button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div v-if="formValidate.slider_image.length < 10" class="upLoad acea-row row-center-wrapper"
|
|
|
|
|
+ @click="modalPicTap('duo')">
|
|
|
|
|
+ <Icon type="ios-camera-outline" size="26" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <Input v-model="formValidate.slider_image[0]" class="input-display"></Input>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="tips">
|
|
|
|
|
+ 建议尺寸:800
|
|
|
|
|
+ *800px,可拖拽改变图片顺序,默认首张图为主图,最多上传10张
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品标签:" prop="store_label_id" class="labelClass">
|
|
|
|
|
+ <div class="acea-row row-middle">
|
|
|
|
|
+ <div class="labelInput acea-row row-between-wrapper" @click="openStoreLabel">
|
|
|
|
|
+ <div v-if="storeDataLabel.length">
|
|
|
|
|
+ <Tag closable v-for="(item, index) in storeDataLabel" :key="item.id" @on-close="closeStoreLabel(item)">{{
|
|
|
|
|
+ item.label_name
|
|
|
|
|
+ }}</Tag>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <span class="span" v-else>选择商品标签</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <!-- <Col span="24">
|
|
|
|
|
+ <FormItem label="供应商:" prop="supplier_id" v-if="formValidate.product_type == 0 && merchantType!=1">
|
|
|
|
|
+ <Select v-model="formValidate.supplier_id" clearable filterable v-width="'50%'" placeholder="请选择供应商">
|
|
|
|
|
+ <Option v-for="(item, index) in supplierList" :value="item.id" :key="item.id">{{ item.supplier_name }}
|
|
|
|
|
+ <Option v-for="(item, index) in supplierList" :value="item.id" :key="item.id">{{ item.supplier_name }}
|
|
|
|
|
+ </Option>
|
|
|
|
|
+ </Select>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col> -->
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="添加视频:">
|
|
|
|
|
+ <i-switch v-model="formValidate.video_open" size="large">
|
|
|
|
|
+ <span slot="open">开启</span>
|
|
|
|
|
+ <span slot="close">关闭</span>
|
|
|
|
|
+ </i-switch>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.video_open">
|
|
|
|
|
+ <FormItem label="视频类型:">
|
|
|
|
|
+ <RadioGroup v-model="seletVideo" @on-change="changeVideo">
|
|
|
|
|
+ <Radio :label="0" class="radio">本地视频</Radio>
|
|
|
|
|
+ <Radio :label="1">视频链接</Radio>
|
|
|
|
|
+ </RadioGroup>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.video_open">
|
|
|
|
|
+ <FormItem label="" prop="video_link">
|
|
|
|
|
+ <Input v-if="seletVideo == 1 && !formValidate.video_link" v-width="'50%'" v-model="videoLink"
|
|
|
|
|
+ placeholder="请输入视频链接" />
|
|
|
|
|
+ <input type="file" ref="refid" @change="zh_uploadFile_change" class="input-display" />
|
|
|
|
|
+ <div v-if="
|
|
|
|
|
+ seletVideo == 0 &&
|
|
|
|
|
+ (upload_type !== '1' || videoLink) &&
|
|
|
|
|
+ !formValidate.video_link
|
|
|
|
|
+ " class="ml10 videbox" @click="zh_uploadFile">
|
|
|
|
|
+ +
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <Button v-if="
|
|
|
|
|
+ seletVideo == 1 &&
|
|
|
|
|
+ (upload_type !== '1' || videoLink) &&
|
|
|
|
|
+ !formValidate.video_link
|
|
|
|
|
+ " type="primary" icon="ios-cloud-upload-outline" class="uploadVideo" @click="zh_uploadFile">确认添加</Button>
|
|
|
|
|
+ <Upload v-if="upload_type === '1' && !formValidate.video_link" :show-upload-list="false" :action="fileUrl2"
|
|
|
|
|
+ :before-upload="videoSaveToUrl" :data="uploadData" :headers="header" :multiple="true"
|
|
|
|
|
+ style="display: inline-block">
|
|
|
|
|
+ <div v-if="seletVideo === 0 && !formValidate.video_link" class="videbox">
|
|
|
|
|
+ +
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </Upload>
|
|
|
|
|
+ <div class="iview-video-style" v-if="formValidate.video_link">
|
|
|
|
|
+ <video class="video-style" :src="formValidate.video_link" controls="controls">
|
|
|
|
|
+ 您的浏览器不支持 video 标签。
|
|
|
|
|
+ </video>
|
|
|
|
|
+ <div class="mark"></div>
|
|
|
|
|
+ <Icon type="ios-trash-outline" class="iconv" @click="delVideo" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <Progress class="progress" :percent="progress" :stroke-width="5" v-if="upload.videoIng || videoIng" />
|
|
|
|
|
+ <div class="tips">建议时长:9~30秒,视频宽高比16:9</div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" class="goodsShow">
|
|
|
|
|
+ <FormItem label="上架时间:">
|
|
|
|
|
+ <RadioGroup v-model="formValidate.is_show" @on-change="goodsOn">
|
|
|
|
|
+ <Radio :label="1">
|
|
|
|
|
+ <Icon type="social-apple"></Icon>
|
|
|
|
|
+ <span>立即上架</span>
|
|
|
|
|
+ </Radio>
|
|
|
|
|
+ <Radio :label="2">
|
|
|
|
|
+ <Icon type="social-android"></Icon>
|
|
|
|
|
+ <span>定时上架</span>
|
|
|
|
|
+ </Radio>
|
|
|
|
|
+ <Radio :label="0">
|
|
|
|
|
+ <Icon type="social-windows"></Icon>
|
|
|
|
|
+ <span>放入仓库</span>
|
|
|
|
|
+ </Radio>
|
|
|
|
|
+ </RadioGroup>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.is_show == 2">
|
|
|
|
|
+ <FormItem label="">
|
|
|
|
|
+ <DatePicker type="datetime" @on-change="onchangeShow" :options="startPickOptions"
|
|
|
|
|
+ :value="formValidate.auto_on_time" v-model="formValidate.auto_on_time" placeholder="请选择上架时间"
|
|
|
|
|
+ format="yyyy-MM-dd HH:mm" style="width: 260px"></DatePicker>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" class="goodsShow">
|
|
|
|
|
+ <FormItem label="定时下架:">
|
|
|
|
|
+ <Switch v-model="off_show" :true-value="1" :false-value="0" size="large" @on-change="goodsOff">
|
|
|
|
|
+ <span slot="open">开启</span>
|
|
|
|
|
+ <span slot="close">关闭</span>
|
|
|
|
|
+ </Switch>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="off_show == 1">
|
|
|
|
|
+ <FormItem label="">
|
|
|
|
|
+ <DatePicker type="datetime" @on-change="onchangeOff" :options="endPickOptions"
|
|
|
|
|
+ :value="formValidate.auto_off_time" v-model="formValidate.auto_off_time" placeholder="请选择下架时间"
|
|
|
|
|
+ format="yyyy-MM-dd HH:mm" style="width: 260px"></DatePicker>
|
|
|
|
|
+ <div class="tips">
|
|
|
|
|
+ 开启定时下架后,系统会在设置时间下架该商品。下架时间需晚于开售时间,商品才能定时开售。
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ </Row>
|
|
|
|
|
+ <Row :gutter="24" type="flex" v-show="currentTab === '2'">
|
|
|
|
|
+ <Col span="24" v-if="formValidate.product_type != 4">
|
|
|
|
|
+ <FormItem label="商品规格:" props="spec_type">
|
|
|
|
|
+ <RadioGroup v-model="formValidate.spec_type" @on-change="changeSpec">
|
|
|
|
|
+ <Radio :label="0" class="radio">单规格</Radio>
|
|
|
|
|
+ <Radio :label="1">多规格</Radio>
|
|
|
|
|
+ </RadioGroup>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <!-- 多规格添加-->
|
|
|
|
|
+ <Col span="24" v-if="formValidate.spec_type === 1 && formValidate.product_type != 4" class="noForm">
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="选择规格:" prop="">
|
|
|
|
|
+ <div class="acea-row row-middle">
|
|
|
|
|
+ <Select v-model="formValidate.selectRule" style="width: 23%">
|
|
|
|
|
+ <Option v-for="(item, index) in ruleList" :value="item.rule_name" :key="item.id">{{ item.rule_name }}
|
|
|
|
|
+ </Option>
|
|
|
|
|
+ </Select>
|
|
|
|
|
+ <Button type="primary" class="mr20" @click="confirm">确认</Button>
|
|
|
|
|
+ <Button @click="addRule">添加规格模板</Button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem v-if="attrs.length !== 0">
|
|
|
|
|
+ <draggable class="dragArea list-group" :list="attrs" group="peoples" handle=".move-icon" :move="checkMove"
|
|
|
|
|
+ @end="end">
|
|
|
|
|
+ <div v-for="(item, index) in attrs" :key="index+'attrs'" class="acea-row row-middle mb10">
|
|
|
|
|
+ <div class="move-icon">
|
|
|
|
|
+ <span class="iconfont icondrag2"></span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div style="width: 90%" :class="moveIndex === index ? 'borderStyle' : ''">
|
|
|
|
|
+ <div class="acea-row row-middle">
|
|
|
|
|
+ <span class="mr5">{{ item.value }}</span>
|
|
|
|
|
+ <Icon type="ios-close-circle" size="14" class="curs" @click="handleRemoveRole(index)" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="rulesBox">
|
|
|
|
|
+ <draggable :list="item.detail" handle=".drag">
|
|
|
|
|
+ <Tag type="dot" closable color="primary" v-for="(j, indexn) in item.detail" :key="indexn" :name="j"
|
|
|
|
|
+ class="mr20 drag" @on-close="handleRemove2(item.detail, indexn)">{{ j }}</Tag>
|
|
|
|
|
+ </draggable>
|
|
|
|
|
+ <Input search enter-button="添加" placeholder="请输入属性名称" v-model="item.detail.attrsVal"
|
|
|
|
|
+ @on-search="createAttr(item.detail.attrsVal, index)" class="width-add" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </draggable>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="createBnt">
|
|
|
|
|
+ <FormItem>
|
|
|
|
|
+ <Button type="primary" icon="md-add" @click="addBtn" class="mr15">添加新规格</Button>
|
|
|
|
|
+ <Button type="success" @click="generate(1)">立即生成</Button>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="showIput">
|
|
|
|
|
+ <Col :xl="6" :lg="9" :md="10" :sm="24" :xs="24">
|
|
|
|
|
+ <FormItem label="规格:">
|
|
|
|
|
+ <Input placeholder="请输入规格" v-model="formDynamic.attrsName" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col :xl="6" :lg="9" :md="10" :sm="24" :xs="24">
|
|
|
|
|
+ <FormItem label="规格值:">
|
|
|
|
|
+ <Input v-model="formDynamic.attrsVal" placeholder="请输入规格值" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col :xl="6" :lg="5" :md="10" :sm="24" :xs="24">
|
|
|
|
|
+ <FormItem>
|
|
|
|
|
+ <Button type="primary" class="mr15" @click="createAttrName">确定</Button>
|
|
|
|
|
+ <Button @click="offAttrName">取消</Button>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <!-- 多规格设置-->
|
|
|
|
|
+ <Col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" v-if="
|
|
|
|
|
+ manyFormValidate.length &&
|
|
|
|
|
+ formValidate.header.length !== 0 &&
|
|
|
|
|
+ attrs.length !== 0
|
|
|
|
|
+ ">
|
|
|
|
|
+ <!-- 批量设置-->
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="批量设置:" class="labeltop">
|
|
|
|
|
+ <Table :data="oneFormBatch" :columns="
|
|
|
|
|
+ formValidate.product_type == 1
|
|
|
|
|
+ ? columnsCarMy
|
|
|
|
|
+ : formValidate.product_type == 3
|
|
|
|
|
+ ? columnsFictitious
|
|
|
|
|
+ : columns2
|
|
|
|
|
+ " border>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="attr">
|
|
|
|
|
+ <div @click="batchAttr" class="acea-row row-between-wrapper" style="cursor: pointer">
|
|
|
|
|
+ <div style="width: 41px">{{ oneFormBatch[0].attr }}</div>
|
|
|
|
|
+ <span class="iconfont icondrop-down"></span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="pic">
|
|
|
|
|
+ <div class="acea-row row-middle row-center-wrapper" @click="modalPicTap('dan', 'duopi', index)">
|
|
|
|
|
+ <div class="pictrue pictrueTab" v-if="oneFormBatch[0].pic">
|
|
|
|
|
+ <img v-lazy="oneFormBatch[0].pic" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="upLoad pictrueTab acea-row row-center-wrapper" v-else>
|
|
|
|
|
+ <Icon type="ios-camera-outline" size="26" class="iosfont" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="price">
|
|
|
|
|
+ <InputNumber v-model="oneFormBatch[0].price" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="settle_price" v-if='merchantType == 2'>
|
|
|
|
|
+ <InputNumber
|
|
|
|
|
+ v-model="oneFormBatch[0].settle_price"
|
|
|
|
|
+ :min="0"
|
|
|
|
|
+ class="priceBox"
|
|
|
|
|
+ ></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="cost">
|
|
|
|
|
+ <InputNumber v-model="oneFormBatch[0].cost" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="ot_price">
|
|
|
|
|
+ <InputNumber v-model="oneFormBatch[0].ot_price" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="stock">
|
|
|
|
|
+ <InputNumber v-model="oneFormBatch[0].stock" :min="0"
|
|
|
|
|
+ :disabled="formValidate.product_type == 1 || openErp" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="bar_code">
|
|
|
|
|
+ <Input v-model="oneFormBatch[0].bar_code"></Input>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="code">
|
|
|
|
|
+ <Input v-model="oneFormBatch[0].code"></Input>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="weight">
|
|
|
|
|
+ <InputNumber v-model="oneFormBatch[0].weight" :step="0.1" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="volume">
|
|
|
|
|
+ <InputNumber v-model="oneFormBatch[0].volume" :step="0.1" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="fictitious" v-if="formValidate.product_type == 1">
|
|
|
|
|
+ <Button v-if="!row.virtual_list && !row.stock" @click="addVirtual(0, 'oneFormBatch')">添加卡密</Button>
|
|
|
|
|
+ <span v-else class="seeCatMy" @click="seeVirtual(oneFormBatch[0], 'oneFormBatch', 0)">已设置</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="action">
|
|
|
|
|
+ <a @click="batchAdd">批量设置</a>
|
|
|
|
|
+ <Divider type="vertical" />
|
|
|
|
|
+ <a @click="batchDel">清空</a>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </Table>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <!-- 多规格表格-->
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品属性:" class="labeltop">
|
|
|
|
|
+ <Table :data="manyFormValidate" :columns="formValidate.header" border>
|
|
|
|
|
+ <template slot-scope="{ row, index }" v-for="(item, i) in attrData.length" :slot="'value' + (i + 1)">
|
|
|
|
|
+ <div :class="manyFormValidate[index].select ? 'selectOn' : ''">
|
|
|
|
|
+ {{ manyFormValidate[index]['value' + (i + 1)] }}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="pic">
|
|
|
|
|
+ <div class="acea-row row-middle row-center-wrapper" @click="modalPicTap('dan', 'duoTable', index)">
|
|
|
|
|
+ <div class="pictrue pictrueTab" v-if="manyFormValidate[index].pic">
|
|
|
|
|
+ <img v-lazy="manyFormValidate[index].pic" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="upLoad pictrueTab acea-row row-center-wrapper" v-else>
|
|
|
|
|
+ <Icon type="ios-camera-outline" size="21" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="price">
|
|
|
|
|
+ <InputNumber v-model="manyFormValidate[index].price" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="settle_price" v-if="merchantType == 2">
|
|
|
|
|
+ <InputNumber
|
|
|
|
|
+ v-model="manyFormValidate[index].settle_price"
|
|
|
|
|
+ :min="0"
|
|
|
|
|
+ class="priceBox"
|
|
|
|
|
+ ></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="cost">
|
|
|
|
|
+ <InputNumber v-model="manyFormValidate[index].cost" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="ot_price">
|
|
|
|
|
+ <InputNumber v-model="manyFormValidate[index].ot_price" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="stock">
|
|
|
|
|
+ <InputNumber v-model="manyFormValidate[index].stock" :min="0" :precision="0"
|
|
|
|
|
+ :disabled="formValidate.product_type == 1 || openErp" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="fictitious" v-if="formValidate.product_type == 1">
|
|
|
|
|
+ <Button v-if="
|
|
|
|
|
+ (!row.virtual_list || !row.virtual_list.length) &&
|
|
|
|
|
+ !row.stock
|
|
|
|
|
+ " @click="addVirtual(index, 'manyFormValidate')">添加卡密</Button>
|
|
|
|
|
+ <span v-else class="seeCatMy" @click="seeVirtual(row, 'manyFormValidate', index)">已设置</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="bar_code">
|
|
|
|
|
+ <Input v-model="manyFormValidate[index].bar_code"></Input>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="code">
|
|
|
|
|
+ <Input v-model="manyFormValidate[index].code"></Input>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="weight">
|
|
|
|
|
+ <InputNumber v-model="manyFormValidate[index].weight" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="volume">
|
|
|
|
|
+ <InputNumber v-model="manyFormValidate[index].volume" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="action">
|
|
|
|
|
+ <a @click="delAttrTable(index)">删除</a>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </Table>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <!-- 单规格表格-->
|
|
|
|
|
+ <div v-if="formValidate.spec_type === 0 || formValidate.product_type == 4" style="width: 100%">
|
|
|
|
|
+ <Col span="24" v-if="formValidate.product_type != 4">
|
|
|
|
|
+ <FormItem label="图片:" prop="image">
|
|
|
|
|
+ <div class="pictrueBox" @click="modalPicTap('dan', 'danTable', 0)">
|
|
|
|
|
+ <div class="pictrue" v-if="oneFormValidate[0].pic">
|
|
|
|
|
+ <img v-lazy="oneFormValidate[0].pic" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="upLoad acea-row row-center-wrapper" v-else>
|
|
|
|
|
+ <Input v-model="oneFormValidate[0].pic" class="input-display"></Input>
|
|
|
|
|
+ <Icon type="ios-camera-outline" size="26" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col class="asterisk" span="24" v-if="formValidate.product_type == 4">
|
|
|
|
|
+ <div class="asteriskInfo on2">*</div>
|
|
|
|
|
+ <FormItem label="核销次数:">
|
|
|
|
|
+ <InputNumber
|
|
|
|
|
+ v-model="oneFormValidate[0].write_times"
|
|
|
|
|
+ :min="1"
|
|
|
|
|
+ :max="99999999"
|
|
|
|
|
+ :precision="0"
|
|
|
|
|
+ v-width="'50%'"
|
|
|
|
|
+ placeholder="请输入核销次数"
|
|
|
|
|
+ ></InputNumber>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.product_type == 4">
|
|
|
|
|
+ <FormItem required label="核销时效:">
|
|
|
|
|
+ <RadioGroup v-model="oneFormValidate[0].write_valid">
|
|
|
|
|
+ <Radio :label="1">永久有效</Radio>
|
|
|
|
|
+ <Radio :label="2">购买后几天有效</Radio>
|
|
|
|
|
+ <Radio :label="3">固定有效期</Radio>
|
|
|
|
|
+ </RadioGroup>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="oneFormValidate[0].write_valid==2">
|
|
|
|
|
+ <FormItem
|
|
|
|
|
+ label=""
|
|
|
|
|
+ prop="freight"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="acea-row row-middle">
|
|
|
|
|
+ <InputNumber
|
|
|
|
|
+ :min="1"
|
|
|
|
|
+ v-model="oneFormValidate[0].days"
|
|
|
|
|
+ placeholder="请输入有效天数"
|
|
|
|
|
+ v-width="'50%'"
|
|
|
|
|
+ />
|
|
|
|
|
+ <span class="ml10">天</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="oneFormValidate[0].write_valid==3">
|
|
|
|
|
+ <FormItem
|
|
|
|
|
+ label=""
|
|
|
|
|
+ prop="freight"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="acea-row row-middle">
|
|
|
|
|
+ <DatePicker :editable="false" type="daterange" format="yyyy-MM-dd" placeholder="请选择固定有效期"
|
|
|
|
|
+ @on-change="onchangeTime" v-width="'50%'" :value="oneFormValidate[0].section_time" v-model="oneFormValidate[0].section_time"></DatePicker>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" class="asterisk">
|
|
|
|
|
+ <!-- <div class="asteriskInfo">*</div> -->
|
|
|
|
|
+ <FormItem label="售价:">
|
|
|
|
|
+ <InputNumber v-model="oneFormValidate[0].price" :min="0" :max="99999999" v-width="'50%'"></InputNumber>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" class="asterisk" v-if="merchantType == 2">
|
|
|
|
|
+ <!-- <div class="asteriskInfo on">*</div> -->
|
|
|
|
|
+ <FormItem label="结算价:">
|
|
|
|
|
+ <InputNumber
|
|
|
|
|
+ v-model="oneFormValidate[0].settle_price"
|
|
|
|
|
+ :min="0"
|
|
|
|
|
+ :max="99999999"
|
|
|
|
|
+ v-width="'50%'"
|
|
|
|
|
+ ></InputNumber>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" class="asterisk">
|
|
|
|
|
+ <!-- <div class="asteriskInfo on">*</div> -->
|
|
|
|
|
+ <FormItem label="成本价:">
|
|
|
|
|
+ <InputNumber v-model="oneFormValidate[0].cost" :min="0" :max="99999999" v-width="'50%'"></InputNumber>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="原价:">
|
|
|
|
|
+ <InputNumber v-model="oneFormValidate[0].ot_price" :min="0" :max="99999999" v-width="'50%'"></InputNumber>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" class="asterisk">
|
|
|
|
|
+ <!-- <div class="asteriskInfo">*</div> -->
|
|
|
|
|
+ <FormItem label="库存:">
|
|
|
|
|
+ <InputNumber v-model="oneFormValidate[0].stock" :min="0" :max="99999999"
|
|
|
|
|
+ :disabled="formValidate.product_type == 1 || openErp" :precision="0" v-width="'50%'"></InputNumber>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.product_type != 4">
|
|
|
|
|
+ <FormItem label="商品条形码:">
|
|
|
|
|
+ <Input v-model.trim="oneFormValidate[0].bar_code" v-width="'50%'" placeholder="请输入商品条形码"></Input>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.product_type != 4">
|
|
|
|
|
+ <FormItem label="商品编号:">
|
|
|
|
|
+ <Input v-model.trim="oneFormValidate[0].code" v-width="'50%'" placeholder="请输入商品编码"></Input>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.product_type == 0">
|
|
|
|
|
+ <FormItem label="重量(KG):">
|
|
|
|
|
+ <InputNumber v-model="oneFormValidate[0].weight" :min="0" :max="99999999" v-width="'50%'"></InputNumber>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.product_type == 0">
|
|
|
|
|
+ <FormItem label="体积(m³):">
|
|
|
|
|
+ <InputNumber v-model="oneFormValidate[0].volume" :min="0" :max="99999999" v-width="'50%'"></InputNumber>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.product_type == 1">
|
|
|
|
|
+ <FormItem label="卡密设置:">
|
|
|
|
|
+ <Button v-if="
|
|
|
|
|
+ !oneFormValidate[0].virtual_list.length &&
|
|
|
|
|
+ !oneFormValidate[0].stock
|
|
|
|
|
+ " @click="addVirtual(0, 'oneFormValidate')">添加卡密</Button>
|
|
|
|
|
+ <span v-else class="seeCatMy" @click="seeVirtual(oneFormValidate[0], 'oneFormValidate', 0)">已设置</span>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </Row>
|
|
|
|
|
+ <!-- 商品详情 -->
|
|
|
|
|
+ <Row v-if="currentTab === '3'">
|
|
|
|
|
+ <Col span="20">
|
|
|
|
|
+ <wangeditor style="width: 100%" :content="contents" @editorContent="getEditorContent"></wangeditor>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <!-- <Col span="6">
|
|
|
|
|
+ <div class="ifam">
|
|
|
|
|
+ <div class="content" v-html="content"></div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </Col> -->
|
|
|
|
|
+ </Row>
|
|
|
|
|
+ <!-- 物流设置 -->
|
|
|
|
|
+ <Row v-show="currentTab === '4'">
|
|
|
|
|
+ <Col v-bind="grid3">
|
|
|
|
|
+ <FormItem label="配送方式:" prop="" required>
|
|
|
|
|
+ <CheckboxGroup v-model="formValidate.delivery_type">
|
|
|
|
|
+ <Checkbox label="1" v-if="merchantType!=1">快递</Checkbox>
|
|
|
|
|
+ <Checkbox label="3">门店配送</Checkbox>
|
|
|
|
|
+ <Checkbox label="2">到店自提</Checkbox>
|
|
|
|
|
+ </CheckboxGroup>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="运费设置:">
|
|
|
|
|
+ <RadioGroup v-model="formValidate.freight">
|
|
|
|
|
+ <Radio :label="1">包邮</Radio>
|
|
|
|
|
+ <Radio :label="2">固定邮费</Radio>
|
|
|
|
|
+ <Radio :label="3">运费模板</Radio>
|
|
|
|
|
+ </RadioGroup>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.freight == 2">
|
|
|
|
|
+ <FormItem label="" prop="freight">
|
|
|
|
|
+ <div class="acea-row row-middle">
|
|
|
|
|
+ <InputNumber :min="0" v-model="formValidate.postage" placeholder="请输入金额" class="perW20 maxW" />
|
|
|
|
|
+ <span class="ml10">元</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.freight == 3">
|
|
|
|
|
+ <FormItem label="" prop="">
|
|
|
|
|
+ <div class="acea-row">
|
|
|
|
|
+ <Select v-model="formValidate.temp_id" clearable class="perW20 maxW">
|
|
|
|
|
+ <Option v-for="(item, index) in templateList" :value="item.id" :key="item.id">{{ item.name }}</Option>
|
|
|
|
|
+ </Select>
|
|
|
|
|
+ <!-- <Button @click="addTemp" class="ml15">添加运费模板</Button> -->
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ </Row>
|
|
|
|
|
+ <!-- 营销设置 -->
|
|
|
|
|
+ <Row v-show="currentTab === '5'">
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="虚拟销量:">
|
|
|
|
|
+ <InputNumber v-width="'50%'" :min="0" :max="999999" v-model="formValidate.ficti" placeholder="请输入虚拟销量" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="排序:">
|
|
|
|
|
+ <InputNumber :min="0" :max="999999" v-width="'50%'" v-model="formValidate.sort" placeholder="请输入排序" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <div class="lines"></div>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="merchantType==0">
|
|
|
|
|
+ <FormItem label="赠送积分:" prop="give_integral">
|
|
|
|
|
+ <InputNumber v-width="'50%'" v-model="formValidate.give_integral" :min="0" :max="999999"
|
|
|
|
|
+ placeholder="请输入积分" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col v-bind="grid3" v-if="merchantType==0">
|
|
|
|
|
+ <FormItem label="赠送优惠券:">
|
|
|
|
|
+ <div v-if="couponName.length" class="mb20">
|
|
|
|
|
+ <Tag closable v-for="(item, index) in couponName" :key="index+'coupon'" @on-close="handleClose(item)">{{ item.title
|
|
|
|
|
+ }}</Tag>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <Button type="primary" @click="addCoupon">添加优惠券</Button>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="merchantType==0">
|
|
|
|
|
+ <FormItem label="关联用户标签:" prop="label_id" class="labelClass">
|
|
|
|
|
+ <div class="labelInput acea-row row-between-wrapper" @click="openLabel">
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div v-if="dataLabel.length">
|
|
|
|
|
+ <Tag closable v-for="(item, index) in dataLabel" :key="item.id" @on-close="closeLabel(item)">{{ item.label_name }}
|
|
|
|
|
+ </Tag>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <span class="span" v-else>选择用户关联标签</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <Icon type="ios-arrow-down" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="merchantType==0">
|
|
|
|
|
+ <FormItem label="仅会员可见:">
|
|
|
|
|
+ <i-switch v-model="formValidate.is_vip_product" :true-value="1" :false-value="0" size="large">
|
|
|
|
|
+ <span slot="open">开启</span>
|
|
|
|
|
+ <span slot="close">关闭</span>
|
|
|
|
|
+ </i-switch>
|
|
|
|
|
+ <div class="tips">开启后仅付费会员可以看见并购买此商品</div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="merchantType==0">
|
|
|
|
|
+ <FormItem label="单独设置:">
|
|
|
|
|
+ <CheckboxGroup class="checkAlls" v-model="formValidate.is_sub" @on-change="checkAllGroupChange">
|
|
|
|
|
+ <Checkbox :label="1">佣金设置(数字即返佣金额)</Checkbox>
|
|
|
|
|
+ <Checkbox :label="0">付费会员价</Checkbox>
|
|
|
|
|
+ </CheckboxGroup>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.is_sub.length">
|
|
|
|
|
+ <!--单规格返佣-->
|
|
|
|
|
+ <FormItem label="商品属性:" v-if="formValidate.spec_type === 0">
|
|
|
|
|
+ <Table :data="oneFormValidate" :columns="columnsInstall" border>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="pic">
|
|
|
|
|
+ <div class="pictrue pictrueTab">
|
|
|
|
|
+ <img v-lazy="oneFormValidate[0].pic" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="price">{{
|
|
|
|
|
+ oneFormValidate[0].price
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="cost">{{
|
|
|
|
|
+ oneFormValidate[0].cost
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="ot_price">{{
|
|
|
|
|
+ oneFormValidate[0].ot_price
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="stock">{{
|
|
|
|
|
+ oneFormValidate[0].stock
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="bar_code">{{
|
|
|
|
|
+ oneFormValidate[0].bar_code
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="code">{{
|
|
|
|
|
+ oneFormValidate[0].code
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="weight">{{
|
|
|
|
|
+ oneFormValidate[0].weight
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="volume">{{
|
|
|
|
|
+ oneFormValidate[0].volume
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="brokerage">
|
|
|
|
|
+ <InputNumber v-model="oneFormValidate[0].brokerage" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="brokerage_two">
|
|
|
|
|
+ <InputNumber v-model="oneFormValidate[0].brokerage_two" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="vip_price">
|
|
|
|
|
+ <InputNumber v-model="oneFormValidate[0].vip_price" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </Table>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ <!--多规格返佣-->
|
|
|
|
|
+ <FormItem label="批量设置:" v-if="formValidate.spec_type === 1">
|
|
|
|
|
+ <span v-if="formValidate.is_sub.indexOf(1) > -1">
|
|
|
|
|
+ 一级返佣:<InputNumber placeholder="请输入一级返佣" :min="0" class="columnsBox perW20" v-model="manyBrokerage">
|
|
|
|
|
+ </InputNumber>
|
|
|
|
|
+ 二级返佣:<InputNumber placeholder="请输入二级返佣" :min="0" class="columnsBox perW20" v-model="manyBrokerageTwo">
|
|
|
|
|
+ </InputNumber>
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <span v-if="formValidate.is_sub.indexOf(0) > -1">
|
|
|
|
|
+ 会员价:<InputNumber placeholder="请输入会员价" :min="0" class="columnsBox perW20" v-model="manyVipPrice">
|
|
|
|
|
+ </InputNumber>
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <Button type="primary" @click="brokerageSetUp">批量设置</Button>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ <FormItem label="商品属性:" v-if="formValidate.spec_type === 1 && manyFormValidate.length">
|
|
|
|
|
+ <Table v-if="formValidate.is_sub && visible" :data="manyFormValidate" :columns="columnsInstal2" border>
|
|
|
|
|
+ <template slot-scope="{ row, index }" v-for="(item, i) in attrData.length" :slot="'value' + (i + 1)">
|
|
|
|
|
+ <div>{{ manyFormValidate[index]['value' + (i + 1)] }}</div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="pic">
|
|
|
|
|
+ <div class="pictrue pictrueTab">
|
|
|
|
|
+ <img v-lazy="manyFormValidate[index].pic" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="price">{{
|
|
|
|
|
+ manyFormValidate[index].price
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="cost">{{
|
|
|
|
|
+ manyFormValidate[index].cost
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="ot_price">{{
|
|
|
|
|
+ manyFormValidate[index].ot_price
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="stock">{{
|
|
|
|
|
+ manyFormValidate[index].stock
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="bar_code">{{
|
|
|
|
|
+ manyFormValidate[index].bar_code
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="code">{{
|
|
|
|
|
+ manyFormValidate[index].code
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="weight">{{
|
|
|
|
|
+ manyFormValidate[index].weight
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="volume">{{
|
|
|
|
|
+ manyFormValidate[index].volume
|
|
|
|
|
+ }}</template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="brokerage">
|
|
|
|
|
+ <InputNumber v-model="manyFormValidate[index].brokerage" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="brokerage_two">
|
|
|
|
|
+ <InputNumber v-model="manyFormValidate[index].brokerage_two" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="vip_price">
|
|
|
|
|
+ <InputNumber v-model="manyFormValidate[index].vip_price" :min="0" class="priceBox"></InputNumber>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </Table>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="merchantType==0">
|
|
|
|
|
+ <div class="lines"></div>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="是否限购:">
|
|
|
|
|
+ <i-switch v-model="formValidate.is_limit" :true-value="1" :false-value="0" size="large" @on-change="limitTap">
|
|
|
|
|
+ <span slot="open">开启</span>
|
|
|
|
|
+ <span slot="close">关闭</span>
|
|
|
|
|
+ </i-switch>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.is_limit">
|
|
|
|
|
+ <FormItem label="限购类型:">
|
|
|
|
|
+ <RadioGroup v-model="formValidate.limit_type">
|
|
|
|
|
+ <Radio :label="1">单次限购</Radio>
|
|
|
|
|
+ <Radio :label="2">长期限购</Radio>
|
|
|
|
|
+ </RadioGroup>
|
|
|
|
|
+ <div class="tips">
|
|
|
|
|
+ 单次限购是限制每次下单最多购买的数量,长期限购是限制一个用户总共可以购买的数量
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.is_limit">
|
|
|
|
|
+ <FormItem label="限购数量:">
|
|
|
|
|
+ <InputNumber :min="1" v-model="formValidate.limit_num" placeholder="请输入限购数量" class="perW20 maxW" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.product_type == 0 && merchantType==0">
|
|
|
|
|
+ <FormItem label="预售商品:">
|
|
|
|
|
+ <i-switch v-model="formValidate.is_presale_product" :true-value="1" :false-value="0" size="large">
|
|
|
|
|
+ <span slot="open">开启</span>
|
|
|
|
|
+ <span slot="close">关闭</span>
|
|
|
|
|
+ </i-switch>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="
|
|
|
|
|
+ formValidate.product_type == 0 && formValidate.is_presale_product
|
|
|
|
|
+ ">
|
|
|
|
|
+ <FormItem label="预售活动时间:" prop="presale_time">
|
|
|
|
|
+ <div class="acea-row row-middle">
|
|
|
|
|
+ <DatePicker :editable="false" :options="datePickerOptions" type="datetimerange" format="yyyy-MM-dd HH:mm"
|
|
|
|
|
+ placeholder="请选择活动时间" @on-change="onchangeTime" :value="formValidate.presale_time"
|
|
|
|
|
+ v-model="formValidate.presale_time" v-width="'50%'"></DatePicker>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="tips">
|
|
|
|
|
+ 设置活动开启结束时间,用户可以在设置时间内发起参与预售
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="
|
|
|
|
|
+ formValidate.product_type == 0 && formValidate.is_presale_product
|
|
|
|
|
+ ">
|
|
|
|
|
+ <FormItem label="发货时间:" prop="presale_day">
|
|
|
|
|
+ <div class="acea-row row-middle">
|
|
|
|
|
+ <span class="mr10">预售活动结束后</span>
|
|
|
|
|
+ <InputNumber placeholder="请输入发货时间" :precision="0" :min="1" style="width: 100px"
|
|
|
|
|
+ v-model="formValidate.presale_day" />
|
|
|
|
|
+ <span class="ml10">天之内</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="merchantType==0">
|
|
|
|
|
+ <FormItem label="优品推荐:">
|
|
|
|
|
+ <i-switch v-model="formValidate.is_good" :true-value="1" :false-value="0" size="large">
|
|
|
|
|
+ <span slot="open">开启</span>
|
|
|
|
|
+ <span slot="close">关闭</span>
|
|
|
|
|
+ </i-switch>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ <!-- <FormItem label="商品推荐:">
|
|
|
|
|
+ <CheckboxGroup v-model="formValidate.recommend" class="checkAlls">
|
|
|
|
|
+ <Checkbox label="is_hot">热卖单品</Checkbox>
|
|
|
|
|
+ <Checkbox label="is_benefit">促销单品</Checkbox>
|
|
|
|
|
+ <Checkbox label="is_best">精品推荐</Checkbox>
|
|
|
|
|
+ <Checkbox label="is_new">首发新品</Checkbox>
|
|
|
|
|
+ <Checkbox label="is_good">优品推荐</Checkbox>
|
|
|
|
|
+ </CheckboxGroup>
|
|
|
|
|
+ </FormItem> -->
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col v-bind="grid3" v-if="merchantType==0">
|
|
|
|
|
+ <FormItem label="活动优先级:">
|
|
|
|
|
+ <div class="color-list acea-row row-middle">
|
|
|
|
|
+ <div class="color-item acea-row row-center-wrapper" :class="activity[color]"
|
|
|
|
|
+ v-for="(color, index) in formValidate.activity" v-dragging="{
|
|
|
|
|
+ item: color,
|
|
|
|
|
+ list: formValidate.activity,
|
|
|
|
|
+ group: 'color',
|
|
|
|
|
+ }" :key="color">
|
|
|
|
|
+ <div class="num">{{ index + 1 }}</div>
|
|
|
|
|
+ <div>{{ color }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="tips">可拖动按钮调整活动的优先展示顺序</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="merchantType==0">
|
|
|
|
|
+ <FormItem label="选择优品推荐商品:">
|
|
|
|
|
+ <div class="acea-row">
|
|
|
|
|
+ <div class="pictrue" v-for="(item, index) in goodsData" :key="index+'goods'">
|
|
|
|
|
+ <img v-lazy="item.image" />
|
|
|
|
|
+ <Button shape="circle" icon="md-close" @click.native="bindDelete(index)" class="btndel"></Button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div v-if="goodsData.length < 12" class="upLoad acea-row row-center-wrapper" @click="goodsTap">
|
|
|
|
|
+ <Icon type="ios-camera-outline" size="26" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ </Row>
|
|
|
|
|
+ <!-- 其他设置-->
|
|
|
|
|
+ <Row v-show="currentTab === '6'">
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品关键字:" prop="">
|
|
|
|
|
+ <Input v-model="formValidate.keyword" placeholder="请输入商品关键字" v-width="'50%'" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品简介:" prop="">
|
|
|
|
|
+ <Input v-model="formValidate.store_info" type="textarea" :rows="3" placeholder="请输入商品简介" v-width="'50%'" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品口令:">
|
|
|
|
|
+ <Input v-model="formValidate.command_word" type="textarea" :rows="3" placeholder="请输入商品口令" v-width="'50%'" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品推荐图:">
|
|
|
|
|
+ <div class="pictrueBox" @click="modalPicTap('dan', 'recommend_image')">
|
|
|
|
|
+ <div class="pictrue" v-if="formValidate.recommend_image">
|
|
|
|
|
+ <img v-lazy="formValidate.recommend_image" />
|
|
|
|
|
+ <Input v-model="formValidate.recommend_image" class="input-display"></Input>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="upLoad acea-row row-center-wrapper" v-else>
|
|
|
|
|
+ <Input v-model="formValidate.recommend_image" class="input-display"></Input>
|
|
|
|
|
+ <Icon type="ios-camera-outline" size="26" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="tips">(建议图片比例5:2)</div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="服务保障:">
|
|
|
|
|
+ <CheckboxGroup v-model="formValidate.ensure_id" class="checkAlls">
|
|
|
|
|
+ <Checkbox :label="item.id" v-for="(item, index) in ensureData" :key="item.id">{{
|
|
|
|
|
+ item.name
|
|
|
|
|
+ }}</Checkbox>
|
|
|
|
|
+ </CheckboxGroup>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="商品参数:" prop="">
|
|
|
|
|
+ <Select v-model="formValidate.specs_id" clearable filterable v-width="'50%'" placeholder="请输入商品参数"
|
|
|
|
|
+ @on-change="specsInfo">
|
|
|
|
|
+ <Option v-for="(item, index) in specsData" :value="item.id" :key="item.id">{{ item.name }}</Option>
|
|
|
|
|
+ </Select>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.specs_id">
|
|
|
|
|
+ <FormItem label="" props="">
|
|
|
|
|
+ <Table border :columns="specsColumns" :data="specsList" ref="table" class="specsList" width="700">
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="action">
|
|
|
|
|
+ <a @click="delSpecs(index)" v-if="index > 0">删除</a>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </Table>
|
|
|
|
|
+ <Button class="mt20" @click="addSpecs">添加参数</Button>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="formValidate.product_type">
|
|
|
|
|
+ <FormItem label="支持退款:" props="status" label-for="status">
|
|
|
|
|
+ <i-switch v-model="formValidate.is_support_refund" :true-value="1" :false-value="0" size="large">
|
|
|
|
|
+ <span slot="open">开启</span>
|
|
|
|
|
+ <span slot="close">关闭</span>
|
|
|
|
|
+ </i-switch>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <FormItem label="自定义留言:">
|
|
|
|
|
+ <i-switch
|
|
|
|
|
+ v-model="customBtn"
|
|
|
|
|
+ @on-change="customMessBtn"
|
|
|
|
|
+ size="large"
|
|
|
|
|
+ >
|
|
|
|
|
+ <span slot="open">开启</span>
|
|
|
|
|
+ <span slot="close">关闭</span>
|
|
|
|
|
+ </i-switch>
|
|
|
|
|
+ <div class="mt10" v-if="customBtn">
|
|
|
|
|
+ <Select
|
|
|
|
|
+ v-model="formValidate.system_form_id"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ filterable
|
|
|
|
|
+ v-width="'50%'"
|
|
|
|
|
+ placeholder="请选择"
|
|
|
|
|
+ @on-change="changeForm"
|
|
|
|
|
+ >
|
|
|
|
|
+ <Option
|
|
|
|
|
+ v-for="(item, index) in formList"
|
|
|
|
|
+ :value="item.id"
|
|
|
|
|
+ :key="item.id"
|
|
|
|
|
+ >{{ item.name }}</Option
|
|
|
|
|
+ >
|
|
|
|
|
+ </Select>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+<!-- <FormItem label="自定义留言:">-->
|
|
|
|
|
+<!-- <i-switch v-model="customBtn" @on-change="customMessBtn" size="large">-->
|
|
|
|
|
+<!-- <span slot="open">开启</span>-->
|
|
|
|
|
+<!-- <span slot="close">关闭</span>-->
|
|
|
|
|
+<!-- </i-switch>-->
|
|
|
|
|
+<!-- <div class="addCustom_content" v-if="customBtn">-->
|
|
|
|
|
+<!-- <div v-for="(item, index) in formValidate.custom_form" type="flex" :key="index+'custom'" class="custom_box">-->
|
|
|
|
|
+<!-- <Input v-model.trim="item.title" :placeholder="'留言标题' + (index + 1)" class="custom-input" />-->
|
|
|
|
|
+<!-- <Select v-model="item.label" class="select-add">-->
|
|
|
|
|
+<!-- <Option v-for="items in customList" :value="items.value" :key="items.value">{{ items.label }}</Option>-->
|
|
|
|
|
+<!-- </Select>-->
|
|
|
|
|
+<!-- <Checkbox v-model="item.status" :true-value="1" :false-value="0">必填</Checkbox>-->
|
|
|
|
|
+<!-- <div class="addfont" @click="delcustom(index)">删除</div>-->
|
|
|
|
|
+<!-- </div>-->
|
|
|
|
|
+<!-- </div>-->
|
|
|
|
|
+<!-- <div class="addCustomBox" v-show="customBtn">-->
|
|
|
|
|
+<!-- <div class="btn" @click="addcustom">+ 添加表单</div>-->
|
|
|
|
|
+<!-- <div class="tips">用户下单时需填写的信息,最多可设置10条</div>-->
|
|
|
|
|
+<!-- </div>-->
|
|
|
|
|
+<!-- </FormItem>-->
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" v-if="customBtn && formValidate.system_form_id">
|
|
|
|
|
+ <FormItem label="" props="">
|
|
|
|
|
+ <Table border :columns="formColumns" :data="formTypeList" ref="table" class="specsList on">
|
|
|
|
|
+ <template slot-scope="{ row }" slot="require">
|
|
|
|
|
+ <span>{{row.require?'必填':'不必填'}}</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </Table>
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ </Row>
|
|
|
|
|
+ <Row v-show="currentTab === '8' && merchantType==0" class="storeModule">
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <RadioGroup v-model="formValidate.applicable_type" class="radioGroup">
|
|
|
|
|
+ <Radio :label="1">全部门店</Radio>
|
|
|
|
|
+ <Radio :label="2">部分门店</Radio>
|
|
|
|
|
+ <Radio :label="0">仅平台适用</Radio>
|
|
|
|
|
+ </RadioGroup>
|
|
|
|
|
+ <div class="tips on">可选择将商品同步到哪些门店使用,选择“仅平台适用“则商品不同步任何门店</div>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24" class="mt20 mb20" v-if="formValidate.applicable_type == 2">
|
|
|
|
|
+ <Button type="primary" @click="addStore">添加门店</Button>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ <Col span="24">
|
|
|
|
|
+ <div class="storeTable" v-if="formValidate.applicable_type == 2">
|
|
|
|
|
+ <Table
|
|
|
|
|
+ :columns="storeColumns"
|
|
|
|
|
+ :data="storesList"
|
|
|
|
|
+ ref="table"
|
|
|
|
|
+ class="ivu-mt"
|
|
|
|
|
+ highlight-row
|
|
|
|
|
+ no-userFrom-text="暂无数据"
|
|
|
|
|
+ no-filtered-userFrom-text="暂无筛选结果"
|
|
|
|
|
+ >
|
|
|
|
|
+ <template slot-scope="{ row }" slot="image">
|
|
|
|
|
+ <img :src="row.image" />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="action">
|
|
|
|
|
+ <a @click="delte(index)">删除</a>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </Table>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </Col>
|
|
|
|
|
+ </Row>
|
|
|
|
|
+ <Spin size="large" fix v-if="spinShow"></Spin>
|
|
|
|
|
+ </Form>
|
|
|
|
|
+ <!-- 商品评论表格 -->
|
|
|
|
|
+ <Table width="940" v-if="currentTab === '7'" ref="table" :columns="replyColumns" :data="replyData" class="ivu-mt"
|
|
|
|
|
+ :loading="replyLoading" no-data-text="暂无数据" no-filtered-data-text="暂无筛选结果">
|
|
|
|
|
+ <template slot-scope="{ row }" slot="info">
|
|
|
|
|
+ <div class="imgPic acea-row row-middle">
|
|
|
|
|
+ <viewer>
|
|
|
|
|
+ <div class="pictrue"><img v-lazy="row.image" /></div>
|
|
|
|
|
+ </viewer>
|
|
|
|
|
+ <div class="info line2">{{ row.store_name }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template slot-scope="{ row }" slot="content">
|
|
|
|
|
+ <div>用户:{{ row.nickname }}</div>
|
|
|
|
|
+ <div>评分:{{ row.score }}</div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="mb5 content_font">{{ row.comment }}</div>
|
|
|
|
|
+ <viewer>
|
|
|
|
|
+ <div class="pictrue mr10" v-for="(item, index) in row.pics || []" :key="index+'pics'">
|
|
|
|
|
+ <img v-lazy="item" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </viewer>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <!-- <template slot-scope="{ row }" slot="reply">
|
|
|
|
|
+ <Tooltip max-width="200" placement="bottom">
|
|
|
|
|
+ <span class="line2">{{
|
|
|
|
|
+ row.replyComment ? row.replyComment.content : ''
|
|
|
|
|
+ }}</span>
|
|
|
|
|
+ <p slot="content">
|
|
|
|
|
+ {{ row.replyComment ? row.replyComment.content : '' }}
|
|
|
|
|
+ </p>
|
|
|
|
|
+ </Tooltip>
|
|
|
|
|
+ </template> -->
|
|
|
|
|
+ <template slot-scope="{ row, index }" slot="action">
|
|
|
|
|
+ <a @click="seeReply(row)">查看</a>
|
|
|
|
|
+ <Divider type="vertical" />
|
|
|
|
|
+ <a @click="reply(row)">回复</a>
|
|
|
|
|
+ <Divider type="vertical" />
|
|
|
|
|
+ <a @click="delReply(row, '删除评论', index)">删除</a>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </Table>
|
|
|
|
|
+ <div class="drawer-footer">
|
|
|
|
|
+ <Button type="primary" @click="handleSubmit('formValidate')">保存</Button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <Modal v-model="modalPic" width="960px" scrollable footer-hide closable title="上传商品图" :mask-closable="false">
|
|
|
|
|
+ <uploadPictures :isChoice="isChoice" @getPic="getPic" @getPicD="getPicD" :gridBtn="gridBtn" :gridPic="gridPic"
|
|
|
|
|
+ v-if="modalPic"></uploadPictures>
|
|
|
|
|
+ </Modal>
|
|
|
|
|
+ <coupon-list ref="couponTemplates" @nameId="nameId" :couponids="formValidate.coupon_ids" :updateIds="updateIds"
|
|
|
|
|
+ :updateName="updateName"></coupon-list>
|
|
|
|
|
+ <!-- 商品列表 -->
|
|
|
|
|
+ <Modal v-model="goodsModals" title="商品列表" footerHide scrollable width="900" @on-cancel="goodCancel">
|
|
|
|
|
+ <goods-list v-if="goodsModals" ref="goodslist" @getProductId="getProductId" :ischeckbox="true"></goods-list>
|
|
|
|
|
+ </Modal>
|
|
|
|
|
+ <!-- 用户标签 -->
|
|
|
|
|
+ <Modal v-model="labelShow" scrollable title="选择用户标签" :closable="true" width="540" :footer-hide="true"
|
|
|
|
|
+ :mask-closable="false">
|
|
|
|
|
+ <userLabel ref="userLabel" @activeData="activeData" @close="labelClose"></userLabel>
|
|
|
|
|
+ </Modal>
|
|
|
|
|
+ <!-- 商品标签 -->
|
|
|
|
|
+ <Modal v-model="storeLabelShow" scrollable title="请选择商品标签" :closable="true" width="540" :footer-hide="true"
|
|
|
|
|
+ :mask-closable="false">
|
|
|
|
|
+ <storeLabelList ref="storeLabel" @activeData="activeStoreData" @close="storeLabelClose"></storeLabelList>
|
|
|
|
|
+ </Modal>
|
|
|
|
|
+ <replyList ref="replyList"></replyList>
|
|
|
|
|
+ <Modal v-model="replyModal" scrollable title="回复内容" closable>
|
|
|
|
|
+ <Form ref="replyForm" :model="replyForm" :rules="ruleInline" :label-position="labelPosition"
|
|
|
|
|
+ @submit.native.prevent>
|
|
|
|
|
+ <FormItem prop="content">
|
|
|
|
|
+ <Input v-model="replyForm.content" type="textarea" :rows="4" placeholder="请输入回复内容" />
|
|
|
|
|
+ </FormItem>
|
|
|
|
|
+ </Form>
|
|
|
|
|
+ <div slot="footer">
|
|
|
|
|
+ <Button type="primary" @click="oks">确定</Button>
|
|
|
|
|
+ <Button @click="cancels">取消</Button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </Modal>
|
|
|
|
|
+ <Modal v-model="storeModals" title="门店列表" footerHide scrollable width="900" @on-cancel="cancelStore">
|
|
|
|
|
+ <store-list ref="storelist" @getStoreId="getStoreId" v-if="storeModals"></store-list>
|
|
|
|
|
+ </Modal>
|
|
|
|
|
+ </Drawer>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script>
|
|
|
|
|
+import { mapState, mapMutations } from 'vuex';
|
|
|
|
|
+import Setting from '@/setting';
|
|
|
|
|
+import util from '@/libs/util';
|
|
|
|
|
+import vuedraggable from 'vuedraggable';
|
|
|
|
|
+import uploadPictures from '@/components/uploadPictures';
|
|
|
|
|
+import freightTemplate from '@/components/freightTemplate';
|
|
|
|
|
+import wangeditor from '@/components/wangEditor/index.vue';
|
|
|
|
|
+import storeList from "@/components/storeList";
|
|
|
|
|
+import menusFrom from '../productBrand/components/menusFrom';
|
|
|
|
|
+import userLabel from '@/components/labelList';
|
|
|
|
|
+import storeLabelList from '@/components/storeLabelList';
|
|
|
|
|
+import couponList from '@/components/couponList';
|
|
|
|
|
+import goodsList from '@/components/goodsList/index';
|
|
|
|
|
+import addAttr from '../productAttr/addAttr';
|
|
|
|
|
+import attrList from './attrList';
|
|
|
|
|
+import addCarMy from './addCarMy';
|
|
|
|
|
+import taoBao from '../productAdd/taoBao';
|
|
|
|
|
+import replyList from './replyList.vue';
|
|
|
|
|
+import {
|
|
|
|
|
+ productInfoApi,
|
|
|
|
|
+ cascaderListApi,
|
|
|
|
|
+ productAddApi,
|
|
|
|
|
+ generateAttrApi,
|
|
|
|
|
+ productGetRuleApi,
|
|
|
|
|
+ productGetTemplateApi,
|
|
|
|
|
+ productGetTempKeysApi,
|
|
|
|
|
+ checkActivityApi,
|
|
|
|
|
+ labelListApi,
|
|
|
|
|
+ productCache,
|
|
|
|
|
+ cacheDelete,
|
|
|
|
|
+ brandList,
|
|
|
|
|
+ productCreateApi,
|
|
|
|
|
+ productAllUnit,
|
|
|
|
|
+ productUnitCreate,
|
|
|
|
|
+ uploadType,
|
|
|
|
|
+ productAllEnsure,
|
|
|
|
|
+ productLabelAdd,
|
|
|
|
|
+ productAllSpecs,
|
|
|
|
|
+ setReplyApi,
|
|
|
|
|
+ replyListApi,
|
|
|
|
|
+ allSystemForm
|
|
|
|
|
+} from '@/api/product';
|
|
|
|
|
+import { systemFormInfo } from '@/api/setting'
|
|
|
|
|
+import { getSupplierList } from '@/api/supplier';
|
|
|
|
|
+import { erpConfig } from '@/api/erp';
|
|
|
|
|
+import { uploadByPieces } from '@/utils/upload'; //引入uploadByPieces方法
|
|
|
|
|
+export default {
|
|
|
|
|
+ name: 'product_productAdd',
|
|
|
|
|
+ components: {
|
|
|
|
|
+ storeList,
|
|
|
|
|
+ uploadPictures,
|
|
|
|
|
+ freightTemplate,
|
|
|
|
|
+ goodsList,
|
|
|
|
|
+ addAttr,
|
|
|
|
|
+ couponList,
|
|
|
|
|
+ taoBao,
|
|
|
|
|
+ userLabel,
|
|
|
|
|
+ menusFrom,
|
|
|
|
|
+ attrList,
|
|
|
|
|
+ addCarMy,
|
|
|
|
|
+ storeLabelList,
|
|
|
|
|
+ wangeditor,
|
|
|
|
|
+ draggable: vuedraggable,
|
|
|
|
|
+ replyList,
|
|
|
|
|
+ },
|
|
|
|
|
+ props: {
|
|
|
|
|
+ visible: {
|
|
|
|
|
+ type: Boolean,
|
|
|
|
|
+ default: false,
|
|
|
|
|
+ },
|
|
|
|
|
+ productId: {
|
|
|
|
|
+ type: Number,
|
|
|
|
|
+ default: 0,
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ data() {
|
|
|
|
|
+ return {
|
|
|
|
|
+ formTypeList: [],
|
|
|
|
|
+ formColumns: [
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '表单标题',
|
|
|
|
|
+ key: 'title',
|
|
|
|
|
+ // align:'center',
|
|
|
|
|
+ minWidth: 100
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '表单类型',
|
|
|
|
|
+ key: 'name',
|
|
|
|
|
+ // align:'center',
|
|
|
|
|
+ minWidth: 100
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '是否必填',
|
|
|
|
|
+ slot: 'require',
|
|
|
|
|
+ // align:'center',
|
|
|
|
|
+ minWidth: 100
|
|
|
|
|
+ }
|
|
|
|
|
+ ],
|
|
|
|
|
+ storesList:[],
|
|
|
|
|
+ tableData:[],
|
|
|
|
|
+ storeModals: false,
|
|
|
|
|
+ roterPre: Setting.roterPre,
|
|
|
|
|
+ specsList: [],
|
|
|
|
|
+ supplierList: [],
|
|
|
|
|
+ specsColumns: [
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '参数名称',
|
|
|
|
|
+ key: 'name',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ width: 150,
|
|
|
|
|
+ render: (h, params) => {
|
|
|
|
|
+ return h('div', [
|
|
|
|
|
+ h('Input', {
|
|
|
|
|
+ props: {
|
|
|
|
|
+ value: params.row.name,
|
|
|
|
|
+ placeholder: '请输入参数名称',
|
|
|
|
|
+ },
|
|
|
|
|
+ on: {
|
|
|
|
|
+ 'on-change': (e) => {
|
|
|
|
|
+ params.row.name = e.target.value;
|
|
|
|
|
+ this.specsList[params.index].name = e.target.value;
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ }),
|
|
|
|
|
+ ]);
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '参数值',
|
|
|
|
|
+ key: 'value',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ width: 300,
|
|
|
|
|
+ render: (h, params) => {
|
|
|
|
|
+ return h('div', [
|
|
|
|
|
+ h('Input', {
|
|
|
|
|
+ props: {
|
|
|
|
|
+ value: params.row.value,
|
|
|
|
|
+ placeholder: '请输入参数值',
|
|
|
|
|
+ },
|
|
|
|
|
+ on: {
|
|
|
|
|
+ 'on-change': (e) => {
|
|
|
|
|
+ params.row.value = e.target.value;
|
|
|
|
|
+ this.specsList[params.index].value = e.target.value;
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ }),
|
|
|
|
|
+ ]);
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '排序',
|
|
|
|
|
+ key: 'sort',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ width: 100,
|
|
|
|
|
+ render: (h, params) => {
|
|
|
|
|
+ return h('div', [
|
|
|
|
|
+ h('InputNumber', {
|
|
|
|
|
+ props: {
|
|
|
|
|
+ value: parseInt(params.row.sort) || 0,
|
|
|
|
|
+ placeholder: '排序',
|
|
|
|
|
+ precision: 0,
|
|
|
|
|
+ },
|
|
|
|
|
+ on: {
|
|
|
|
|
+ 'on-change': (e) => {
|
|
|
|
|
+ params.row.sort = e;
|
|
|
|
|
+ this.specsList[params.index].sort = e;
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ }),
|
|
|
|
|
+ ]);
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '操作',
|
|
|
|
|
+ slot: 'action',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 120,
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ //自定义留言下拉选择
|
|
|
|
|
+ customList: [
|
|
|
|
|
+ {
|
|
|
|
|
+ value: 'text',
|
|
|
|
|
+ label: '文本框',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ value: 'number',
|
|
|
|
|
+ label: '数字',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ value: 'email',
|
|
|
|
|
+ label: '邮件',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ value: 'data',
|
|
|
|
|
+ label: '日期',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ value: 'time',
|
|
|
|
|
+ label: '时间',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ value: 'id',
|
|
|
|
|
+ label: '身份证',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ value: 'phone',
|
|
|
|
|
+ label: '手机号',
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ value: 'img',
|
|
|
|
|
+ label: '图片',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ headTab: [
|
|
|
|
|
+ { title: '基础信息', name: '1' },
|
|
|
|
|
+ { title: '规格库存', name: '2' },
|
|
|
|
|
+ { title: '商品详情', name: '3' },
|
|
|
|
|
+ { title: '物流设置', name: '4' },
|
|
|
|
|
+ { title: '营销设置', name: '5' },
|
|
|
|
|
+ { title: '其他设置', name: '6' },
|
|
|
|
|
+ { title: "适用门店", name: "8" },
|
|
|
|
|
+ { title: '商品评论', name: '7' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ productType: [
|
|
|
|
|
+ { name: '普通商品', title: '物流发货', id: 0 },
|
|
|
|
|
+ { name: '卡密/网盘', title: '自动发货', id: 1 },
|
|
|
|
|
+ { name: '虚拟商品', title: '虚拟发货', id: 3 },
|
|
|
|
|
+ { name: "次卡商品", title: "到店核销", id: 4 },
|
|
|
|
|
+ ],
|
|
|
|
|
+ virtualList: [],
|
|
|
|
|
+ carMyShow: false, //是否开启卡密弹窗
|
|
|
|
|
+ recommend: [], //商品推荐
|
|
|
|
|
+ customBtn: false, //自定义留言开关
|
|
|
|
|
+ attrShow: false,
|
|
|
|
|
+ content: '',
|
|
|
|
|
+ contents: '',
|
|
|
|
|
+ seletVideo: 0,
|
|
|
|
|
+ fileUrl: Setting.apiBaseURL + '/file/upload',
|
|
|
|
|
+ fileUrl2: Setting.apiBaseURL + '/file/video_upload',
|
|
|
|
|
+ upload_type: '', //视频上传类型 1 本地上传 2 3 4 OSS上传
|
|
|
|
|
+ uploadData: {}, // 上传参数
|
|
|
|
|
+ header: {},
|
|
|
|
|
+ dataLabel: [],
|
|
|
|
|
+ storeDataLabel: [],
|
|
|
|
|
+ labelShow: false,
|
|
|
|
|
+ storeLabelShow: false,
|
|
|
|
|
+ props: { emitPath: false, multiple: true, checkStrictly: true },
|
|
|
|
|
+ type: 0,
|
|
|
|
|
+ goodsModals: false,
|
|
|
|
|
+ off_show: 0,
|
|
|
|
|
+ modals: false,
|
|
|
|
|
+ spinShow: false,
|
|
|
|
|
+ openSubimit: false,
|
|
|
|
|
+ grid2: {
|
|
|
|
|
+ xl: 10,
|
|
|
|
|
+ lg: 12,
|
|
|
|
|
+ md: 12,
|
|
|
|
|
+ sm: 24,
|
|
|
|
|
+ xs: 24,
|
|
|
|
|
+ },
|
|
|
|
|
+ grid3: {
|
|
|
|
|
+ xl: 18,
|
|
|
|
|
+ lg: 18,
|
|
|
|
|
+ md: 20,
|
|
|
|
|
+ sm: 24,
|
|
|
|
|
+ xs: 24,
|
|
|
|
|
+ },
|
|
|
|
|
+ // 批量设置表格data
|
|
|
|
|
+ oneFormBatch: [
|
|
|
|
|
+ {
|
|
|
|
|
+ attr: '全部',
|
|
|
|
|
+ pic: '',
|
|
|
|
|
+ price: 0,
|
|
|
|
|
+ settle_price: 0,
|
|
|
|
|
+ cost: 0,
|
|
|
|
|
+ ot_price: 0,
|
|
|
|
|
+ stock: 0,
|
|
|
|
|
+ bar_code: '',
|
|
|
|
|
+ code: '',
|
|
|
|
|
+ weight: 0,
|
|
|
|
|
+ volume: 0,
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ // 规格数据
|
|
|
|
|
+ formDynamic: {
|
|
|
|
|
+ attrsName: '',
|
|
|
|
|
+ attrsVal: '',
|
|
|
|
|
+ },
|
|
|
|
|
+ formDynamicNameData: [],
|
|
|
|
|
+ isBtn: false,
|
|
|
|
|
+ columnsCarMy: [],
|
|
|
|
|
+ columns2: [
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '商品规格',
|
|
|
|
|
+ slot: 'attr',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 80,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '图片',
|
|
|
|
|
+ slot: 'pic',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 80,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '售价',
|
|
|
|
|
+ slot: 'price',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 95,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '成本价',
|
|
|
|
|
+ slot: 'cost',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 95,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '原价',
|
|
|
|
|
+ slot: 'ot_price',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 95,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '库存',
|
|
|
|
|
+ slot: 'stock',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 95,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '商品条形码',
|
|
|
|
|
+ slot: 'bar_code',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 120,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '商品编号',
|
|
|
|
|
+ slot: 'code',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 120,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '重量(KG)',
|
|
|
|
|
+ slot: 'weight',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 95,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '体积(m³)',
|
|
|
|
|
+ slot: 'volume',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 95,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '操作',
|
|
|
|
|
+ slot: 'action',
|
|
|
|
|
+ // fixed: "right",
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ minWidth: 140,
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ columns: [],
|
|
|
|
|
+ columnsInstall: [],
|
|
|
|
|
+ columnsInstal2: [],
|
|
|
|
|
+ gridPic: {
|
|
|
|
|
+ xl: 6,
|
|
|
|
|
+ lg: 8,
|
|
|
|
|
+ md: 12,
|
|
|
|
|
+ sm: 12,
|
|
|
|
|
+ xs: 12,
|
|
|
|
|
+ },
|
|
|
|
|
+ gridBtn: {
|
|
|
|
|
+ xl: 4,
|
|
|
|
|
+ lg: 8,
|
|
|
|
|
+ md: 8,
|
|
|
|
|
+ sm: 8,
|
|
|
|
|
+ xs: 8,
|
|
|
|
|
+ },
|
|
|
|
|
+ formValidate: {
|
|
|
|
|
+ system_form_id: 0, //自定义表单
|
|
|
|
|
+ supplier_id: 0, //供应商
|
|
|
|
|
+ is_presale_product: 0, //预售商品开关
|
|
|
|
|
+ is_limit: 0, //是否限购开关
|
|
|
|
|
+ limit_type: 1, //1单次限购,2长期限购
|
|
|
|
|
+ limit_num: 1, //限购数量
|
|
|
|
|
+ is_vip_product: 0, //付费会员专属开关
|
|
|
|
|
+ is_support_refund: 0,
|
|
|
|
|
+ disk_info: '', //卡密简介
|
|
|
|
|
+ presale_day: 1, //预售发货时间-结束
|
|
|
|
|
+ presale_time: [],
|
|
|
|
|
+ auto_on_time: '',
|
|
|
|
|
+ video_open: false, //视频按钮是否显示
|
|
|
|
|
+ store_name: '',
|
|
|
|
|
+ freight: 1, //运费设置
|
|
|
|
|
+ postage: 0, //设置运费金额
|
|
|
|
|
+ custom_form: [], //自定义留言
|
|
|
|
|
+ cate_id: [],
|
|
|
|
|
+ label_id: [],
|
|
|
|
|
+ ensure_id: [],
|
|
|
|
|
+ keyword: '',
|
|
|
|
|
+ applicable_type: 1,
|
|
|
|
|
+ unit_name: '',
|
|
|
|
|
+ specs_id: 0,
|
|
|
|
|
+ store_info: '',
|
|
|
|
|
+ bar_code: '',
|
|
|
|
|
+ code: '',
|
|
|
|
|
+ image: '',
|
|
|
|
|
+ recommend_image: '',
|
|
|
|
|
+ slider_image: [],
|
|
|
|
|
+ description: '',
|
|
|
|
|
+ ficti: 0,
|
|
|
|
|
+ give_integral: 0,
|
|
|
|
|
+ sort: 0,
|
|
|
|
|
+ is_show: 1,
|
|
|
|
|
+ is_hot: 0,
|
|
|
|
|
+ is_benefit: 0,
|
|
|
|
|
+ is_best: 0,
|
|
|
|
|
+ is_new: 0,
|
|
|
|
|
+ is_good: 0,
|
|
|
|
|
+ is_postage: 0,
|
|
|
|
|
+ is_sub: [],
|
|
|
|
|
+ id: 0,
|
|
|
|
|
+ spec_type: 0,
|
|
|
|
|
+ video_link: '',
|
|
|
|
|
+ temp_id: '',
|
|
|
|
|
+ attrs: [],
|
|
|
|
|
+ items: [
|
|
|
|
|
+ {
|
|
|
|
|
+ pic: '',
|
|
|
|
|
+ price: 0,
|
|
|
|
|
+ cost: 0,
|
|
|
|
|
+ ot_price: 0,
|
|
|
|
|
+ stock: 0,
|
|
|
|
|
+ bar_code: '',
|
|
|
|
|
+ code: '',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ activity: ['默认', '秒杀', '砍价', '拼团'],
|
|
|
|
|
+ couponName: [],
|
|
|
|
|
+ header: [],
|
|
|
|
|
+ selectRule: '',
|
|
|
|
|
+ coupon_ids: [],
|
|
|
|
|
+ command_word: '',
|
|
|
|
|
+ delivery_type: ['1'],
|
|
|
|
|
+ specs: [],
|
|
|
|
|
+ recommend_list: [],
|
|
|
|
|
+ brand_id: [],
|
|
|
|
|
+ product_type: 0,
|
|
|
|
|
+ },
|
|
|
|
|
+ ruleList: [],
|
|
|
|
|
+ templateList: [],
|
|
|
|
|
+ createBnt: false,
|
|
|
|
|
+ showIput: false,
|
|
|
|
|
+ manyFormValidate: [],
|
|
|
|
|
+ // 单规格表格data
|
|
|
|
|
+ oneFormValidate: [
|
|
|
|
|
+ {
|
|
|
|
|
+ pic: '',
|
|
|
|
|
+ price: 0,
|
|
|
|
|
+ settle_price: 0,
|
|
|
|
|
+ cost: 0,
|
|
|
|
|
+ ot_price: 0,
|
|
|
|
|
+ stock: 0,
|
|
|
|
|
+ bar_code: '',
|
|
|
|
|
+ code: '',
|
|
|
|
|
+ weight: 0,
|
|
|
|
|
+ volume: 0,
|
|
|
|
|
+ brokerage: 0,
|
|
|
|
|
+ brokerage_two: 0,
|
|
|
|
|
+ vip_price: 0,
|
|
|
|
|
+ virtual_list: [],
|
|
|
|
|
+ write_times: 0, //核销次数
|
|
|
|
|
+ write_valid: 1, //核销时效
|
|
|
|
|
+ days: 1
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ images: [],
|
|
|
|
|
+ imagesTable: '',
|
|
|
|
|
+ currentTab: '1',
|
|
|
|
|
+ isChoice: '',
|
|
|
|
|
+ grid: {
|
|
|
|
|
+ xl: 8,
|
|
|
|
|
+ lg: 8,
|
|
|
|
|
+ md: 12,
|
|
|
|
|
+ sm: 24,
|
|
|
|
|
+ xs: 24,
|
|
|
|
|
+ },
|
|
|
|
|
+ loading: false,
|
|
|
|
|
+ modalPic: false,
|
|
|
|
|
+ template: false,
|
|
|
|
|
+ uploadList: [],
|
|
|
|
|
+ treeSelect: [],
|
|
|
|
|
+ labelSelect: [],
|
|
|
|
|
+ ensureData: [],
|
|
|
|
|
+ specsData: [],
|
|
|
|
|
+ picTit: '',
|
|
|
|
|
+ tableIndex: 0,
|
|
|
|
|
+ ruleValidate: {
|
|
|
|
|
+ store_name: [
|
|
|
|
|
+ { required: true, message: '请输入商品名称', trigger: 'blur' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ cate_id: [
|
|
|
|
|
+ {
|
|
|
|
|
+ required: true,
|
|
|
|
|
+ message: '请选择商品分类',
|
|
|
|
|
+ trigger: 'change',
|
|
|
|
|
+ type: 'array',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ keyword: [
|
|
|
|
|
+ { required: true, message: '请输入商品关键字', trigger: 'blur' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ unit_name: [
|
|
|
|
|
+ {
|
|
|
|
|
+ required: true,
|
|
|
|
|
+ message: '请输入单位',
|
|
|
|
|
+ trigger: 'change',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ store_info: [
|
|
|
|
|
+ { required: true, message: '请输入商品简介', trigger: 'blur' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ //image: [{ required: true, message: "请上传商品图", trigger: "change" }],
|
|
|
|
|
+ slider_image: [
|
|
|
|
|
+ {
|
|
|
|
|
+ required: true,
|
|
|
|
|
+ message: '请上传商品轮播图',
|
|
|
|
|
+ type: 'array',
|
|
|
|
|
+ trigger: 'change',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ spec_type: [
|
|
|
|
|
+ { required: true, message: '请选择商品规格', trigger: 'change' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ selectRule: [
|
|
|
|
|
+ { required: true, message: '请选择商品规格属性', trigger: 'change' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ give_integral: [{ type: 'integer', message: '请输入整数' }],
|
|
|
|
|
+ // delivery_type:[
|
|
|
|
|
+ // { required: true, type: 'array', min: 1, message: '请选择配送方式', trigger: 'change' },
|
|
|
|
|
+ // ]
|
|
|
|
|
+ },
|
|
|
|
|
+ manyBrokerage: 0,
|
|
|
|
|
+ manyBrokerageTwo: 0,
|
|
|
|
|
+ manyVipPrice: 0,
|
|
|
|
|
+ upload: {
|
|
|
|
|
+ videoIng: false, // 是否显示进度条;
|
|
|
|
|
+ },
|
|
|
|
|
+ videoIng: false, // 是否显示进度条;
|
|
|
|
|
+ progress: 0, // 进度条默认0
|
|
|
|
|
+ videoLink: '',
|
|
|
|
|
+ attrs: [],
|
|
|
|
|
+ activity: {
|
|
|
|
|
+ 默认: 'colorBlue',
|
|
|
|
|
+ 秒杀: 'colorBlue',
|
|
|
|
|
+ 砍价: 'colorBlue',
|
|
|
|
|
+ 拼团: 'colorBlue',
|
|
|
|
|
+ },
|
|
|
|
|
+ couponName: [],
|
|
|
|
|
+ updateIds: [],
|
|
|
|
|
+ updateName: [],
|
|
|
|
|
+ rakeBack: [
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '一级返佣',
|
|
|
|
|
+ slot: 'brokerage',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ width: 95,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '二级返佣',
|
|
|
|
|
+ slot: 'brokerage_two',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ width: 95,
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ member: [
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '会员价',
|
|
|
|
|
+ slot: 'vip_price',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ width: 95,
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ headerCarMy: {
|
|
|
|
|
+ title: '卡密设置',
|
|
|
|
|
+ slot: 'fictitious',
|
|
|
|
|
+ align: 'center',
|
|
|
|
|
+ width: 95,
|
|
|
|
|
+ },
|
|
|
|
|
+ columnsInstalM: [],
|
|
|
|
|
+ moveIndex: '',
|
|
|
|
|
+ goodsData: [],
|
|
|
|
|
+ brandData: [],
|
|
|
|
|
+ unitNameList: [],
|
|
|
|
|
+ formBrand: {},
|
|
|
|
|
+ attrsList: [],
|
|
|
|
|
+ activeAtter: [],
|
|
|
|
|
+ tabIndex: 0,
|
|
|
|
|
+ tabName: '',
|
|
|
|
|
+ attrData: [],
|
|
|
|
|
+ datePickerOptions: {
|
|
|
|
|
+ disabledDate(date) {
|
|
|
|
|
+ return date && date.valueOf() < Date.now() - 86400000;
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ openErp: false,
|
|
|
|
|
+ replyColumns: [
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '评论ID',
|
|
|
|
|
+ key: 'id',
|
|
|
|
|
+ width: 80,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '商品信息',
|
|
|
|
|
+ slot: 'info',
|
|
|
|
|
+ minWidth: 250,
|
|
|
|
|
+ },
|
|
|
|
|
+ // {
|
|
|
|
|
+ // title: '用户名称',
|
|
|
|
|
+ // key: 'nickname',
|
|
|
|
|
+ // minWidth: 150,
|
|
|
|
|
+ // },
|
|
|
|
|
+ // {
|
|
|
|
|
+ // title: '评分',
|
|
|
|
|
+ // key: 'score',
|
|
|
|
|
+ // sortable: true,
|
|
|
|
|
+ // minWidth: 70,
|
|
|
|
|
+ // },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '评价内容',
|
|
|
|
|
+ slot: 'content',
|
|
|
|
|
+ minWidth: 300,
|
|
|
|
|
+ },
|
|
|
|
|
+ // {
|
|
|
|
|
+ // title: '回复内容',
|
|
|
|
|
+ // slot: 'reply',
|
|
|
|
|
+ // minWidth: 160,
|
|
|
|
|
+ // },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '评价时间',
|
|
|
|
|
+ key: 'add_time',
|
|
|
|
|
+ sortable: true,
|
|
|
|
|
+ width: 150,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '操作',
|
|
|
|
|
+ slot: 'action',
|
|
|
|
|
+ // fixed: 'right',
|
|
|
|
|
+ width: 150,
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ replyData: [],
|
|
|
|
|
+ replyLoading: false,
|
|
|
|
|
+ replyModal: false,
|
|
|
|
|
+ rows: {},
|
|
|
|
|
+ replyForm: {
|
|
|
|
|
+ content: '',
|
|
|
|
|
+ },
|
|
|
|
|
+ ruleInline: {
|
|
|
|
|
+ content: [
|
|
|
|
|
+ { required: true, message: '请输入回复内容', trigger: 'blur' },
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ replyValidate: {
|
|
|
|
|
+ is_reply: '',
|
|
|
|
|
+ data: '',
|
|
|
|
|
+ store_name: '',
|
|
|
|
|
+ account: '',
|
|
|
|
|
+ product_id: this.productId,
|
|
|
|
|
+ page: 1,
|
|
|
|
|
+ limit: 15,
|
|
|
|
|
+ },
|
|
|
|
|
+ total: 0,
|
|
|
|
|
+ merchantType: 0,
|
|
|
|
|
+ formList: [],
|
|
|
|
|
+ storeColumns: [
|
|
|
|
|
+ {
|
|
|
|
|
+ title: "ID",
|
|
|
|
|
+ key: "id",
|
|
|
|
|
+ width: 60,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: "门店图片",
|
|
|
|
|
+ slot: "image",
|
|
|
|
|
+ minWidth: 80,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: "门店分类",
|
|
|
|
|
+ key: "cate_name",
|
|
|
|
|
+ minWidth: 80,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: "门店名称",
|
|
|
|
|
+ key: "name",
|
|
|
|
|
+ minWidth: 80,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: "联系电话",
|
|
|
|
|
+ key: "phone",
|
|
|
|
|
+ minWidth: 90,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: "门店地址",
|
|
|
|
|
+ key: "address",
|
|
|
|
|
+ ellipsis: true,
|
|
|
|
|
+ minWidth: 150,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: "营业时间",
|
|
|
|
|
+ key: "day_time",
|
|
|
|
|
+ minWidth: 120,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: "营业状态",
|
|
|
|
|
+ key: "status_name",
|
|
|
|
|
+ minWidth: 80,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: "操作",
|
|
|
|
|
+ slot: "action",
|
|
|
|
|
+ width: 100,
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
|
|
+ };
|
|
|
|
|
+ },
|
|
|
|
|
+ computed: {
|
|
|
|
|
+ ...mapState('admin/layout', ['isMobile', 'menuCollapse']),
|
|
|
|
|
+ labelWidth() {
|
|
|
|
|
+ return this.isMobile ? undefined : 120;
|
|
|
|
|
+ },
|
|
|
|
|
+ labelPosition() {
|
|
|
|
|
+ return this.isMobile ? 'top' : 'right';
|
|
|
|
|
+ },
|
|
|
|
|
+ labelBottom() {
|
|
|
|
|
+ return this.isMobile ? undefined : 15;
|
|
|
|
|
+ },
|
|
|
|
|
+ startPickOptions() {
|
|
|
|
|
+ const that = this;
|
|
|
|
|
+ return {
|
|
|
|
|
+ disabledDate(time) {
|
|
|
|
|
+ if (that.formValidate.auto_off_time) {
|
|
|
|
|
+ return (
|
|
|
|
|
+ time.getTime() >
|
|
|
|
|
+ new Date(that.formValidate.auto_off_time).getTime() - 86400000
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ return '';
|
|
|
|
|
+ },
|
|
|
|
|
+ };
|
|
|
|
|
+ },
|
|
|
|
|
+ endPickOptions() {
|
|
|
|
|
+ const that = this;
|
|
|
|
|
+ return {
|
|
|
|
|
+ disabledDate(time) {
|
|
|
|
|
+ if (that.formValidate.is_show == '1') {
|
|
|
|
|
+ return time.getTime() < Date.now();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (that.formValidate.auto_on_time) {
|
|
|
|
|
+ return (
|
|
|
|
|
+ time.getTime() <
|
|
|
|
|
+ new Date(that.formValidate.auto_on_time).getTime() + 86400000
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ return '';
|
|
|
|
|
+ },
|
|
|
|
|
+ };
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ created() {
|
|
|
|
|
+ this.getSupplierList();
|
|
|
|
|
+ this.columns = this.columns2.slice(1, 10);
|
|
|
|
|
+ let data = JSON.parse(JSON.stringify(this.columns2));
|
|
|
|
|
+ data.splice(8, 2, this.headerCarMy);
|
|
|
|
|
+ this.columnsCarMy = data;
|
|
|
|
|
+ let fictitious = JSON.parse(JSON.stringify(this.columns2));
|
|
|
|
|
+ fictitious.splice(8, 2);
|
|
|
|
|
+ this.columnsFictitious = fictitious;
|
|
|
|
|
+ this.getToken();
|
|
|
|
|
+ this.getErpConfig();
|
|
|
|
|
+ // this.columnsInstall = this.columns2.slice(0, 4).concat(this.columnsInstall);
|
|
|
|
|
+ // this.columnsInsta8 = this.columns2.slice(0, 4).concat(this.columnsInsta8);
|
|
|
|
|
+ },
|
|
|
|
|
+ mounted() {
|
|
|
|
|
+ this.setCopyrightShow({ value: false });
|
|
|
|
|
+ // if (this.productId !== '0' && this.productId) {
|
|
|
|
|
+ // this.getInfo();
|
|
|
|
|
+ // } else if (this.productId === '0') {
|
|
|
|
|
+ // productCache()
|
|
|
|
|
+ // .then((res) => {
|
|
|
|
|
+ // let data = res.data.info;
|
|
|
|
|
+ // if (!Array.isArray(data)) {
|
|
|
|
|
+ // let cate_id = data.cate_id.map(Number);
|
|
|
|
|
+ // let label_id = data.label_id.map(Number);
|
|
|
|
|
+ // this.attrs = data.items || [];
|
|
|
|
|
+ // let ids = [];
|
|
|
|
|
+ // // let names = [];
|
|
|
|
|
+ // if (data.coupons) {
|
|
|
|
|
+ // data.coupons.map((item) => {
|
|
|
|
|
+ // ids.push(item.id);
|
|
|
|
|
+ // // names.push(item.title);
|
|
|
|
|
+ // });
|
|
|
|
|
+ // this.couponName = data.coupons;
|
|
|
|
|
+ // }
|
|
|
|
|
+ // this.storesList = data.stores || [];
|
|
|
|
|
+ // let brandIds = [];
|
|
|
|
|
+ // data.brand_id.forEach(item=>{
|
|
|
|
|
+ // brandIds.push(item.toString())
|
|
|
|
|
+ // })
|
|
|
|
|
+ // this.formValidate = data;
|
|
|
|
|
+ // // this.couponName = data.coupons;
|
|
|
|
|
+ // // that.couponName = names;
|
|
|
|
|
+ // this.formValidate.brand_id = brandIds;
|
|
|
|
|
+ // this.formValidate.coupon_ids = ids;
|
|
|
|
|
+ // this.formValidate.is_limit = this.formValidate.is_limit ? 1 : 0;
|
|
|
|
|
+ // this.formValidate.limit_type = parseInt(
|
|
|
|
|
+ // this.formValidate.limit_type
|
|
|
|
|
+ // );
|
|
|
|
|
+ // this.formValidate.is_support_refund = parseInt(
|
|
|
|
|
+ // this.formValidate.is_support_refund
|
|
|
|
|
+ // );
|
|
|
|
|
+ // this.updateIds = ids;
|
|
|
|
|
+ // this.updateName = data.coupons;
|
|
|
|
|
+ // this.formValidate.cate_id = cate_id;
|
|
|
|
|
+ // this.dataLabel = data.label_id;
|
|
|
|
|
+ // this.storeDataLabel = data.store_label_id;
|
|
|
|
|
+ // this.specsList = data.specs;
|
|
|
|
|
+ // this.oneFormValidate = data.attrs;
|
|
|
|
|
+ // this.formValidate.header = [];
|
|
|
|
|
+ // this.generate(0);
|
|
|
|
|
+ // this.addmanyData(data.attrs);
|
|
|
|
|
+ // this.productTypeTap(2);
|
|
|
|
|
+ // this.columns = this.columns2.slice(1, 10);
|
|
|
|
|
+ // //this.manyFormValidate = data.attrs;
|
|
|
|
|
+ // this.formValidate.system_form_id = data.system_form_id || 0;
|
|
|
|
|
+ // if (this.formValidate.system_form_id) {
|
|
|
|
|
+ // this.customBtn = true;
|
|
|
|
|
+ // }
|
|
|
|
|
+ // this.spec_type = data.spec_type;
|
|
|
|
|
+ // if (data.spec_type === 0) {
|
|
|
|
|
+ // this.manyFormValidate = [];
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // this.createBnt = true;
|
|
|
|
|
+ // this.oneFormValidate = [
|
|
|
|
|
+ // {
|
|
|
|
|
+ // pic: data.slider_image[0],
|
|
|
|
|
+ // price: 0,
|
|
|
|
|
+ // cost: 0,
|
|
|
|
|
+ // ot_price: 0,
|
|
|
|
|
+ // stock: 0,
|
|
|
|
|
+ // bar_code: '',
|
|
|
|
|
+ // code: '',
|
|
|
|
|
+ // weight: 0,
|
|
|
|
|
+ // volume: 0,
|
|
|
|
|
+ // brokerage: 0,
|
|
|
|
|
+ // brokerage_two: 0,
|
|
|
|
|
+ // vip_price: 0,
|
|
|
|
|
+ // virtual_list: [],
|
|
|
|
|
+ // write_times: 0, //核销次数
|
|
|
|
|
+ // write_valid: 1, //核销时效
|
|
|
|
|
+ // days: 1
|
|
|
|
|
+ // },
|
|
|
|
|
+ // ];
|
|
|
|
|
+ // }
|
|
|
|
|
+ // this.spinShow = false;
|
|
|
|
|
+ // }
|
|
|
|
|
+ // })
|
|
|
|
|
+ // .catch((err) => {
|
|
|
|
|
+ // this.$Message.error(err.msg);
|
|
|
|
|
+ // });
|
|
|
|
|
+ // }
|
|
|
|
|
+ },
|
|
|
|
|
+ destroyed() {
|
|
|
|
|
+ this.setCopyrightShow({ value: true });
|
|
|
|
|
+ },
|
|
|
|
|
+ methods: {
|
|
|
|
|
+ ...mapMutations('admin/layout', ['setCopyrightShow']),
|
|
|
|
|
+ changeForm(e){
|
|
|
|
|
+ this.getSystemFormInfo(e,{type:1});
|
|
|
|
|
+ },
|
|
|
|
|
+ getSystemFormInfo(e,data){
|
|
|
|
|
+ systemFormInfo(e,data).then(res=>{
|
|
|
|
|
+ this.formTypeList = res.data.info;
|
|
|
|
|
+ }).catch(err=>{
|
|
|
|
|
+ this.$Message.error(err.msg);
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
|
|
+ //删除门店
|
|
|
|
|
+ delte(index){
|
|
|
|
|
+ this.storesList.splice(index, 1)
|
|
|
|
|
+ },
|
|
|
|
|
+ //添加门店
|
|
|
|
|
+ addStore(){
|
|
|
|
|
+ this.storeModals = true;
|
|
|
|
|
+ },
|
|
|
|
|
+ //关闭门店弹窗
|
|
|
|
|
+ cancelStore(){
|
|
|
|
|
+ this.storeModals = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ allFormList(){
|
|
|
|
|
+ allSystemForm().then(res=>{
|
|
|
|
|
+ this.formList = res.data;
|
|
|
|
|
+ }).catch(err=>{
|
|
|
|
|
+ this.$Message.error(err.msg);
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
|
|
+ limitTap(e) {
|
|
|
|
|
+ if (e) {
|
|
|
|
|
+ this.formValidate.limit_type =
|
|
|
|
|
+ this.formValidate.is_limit && !this.formValidate.limit_type ? 1 : 0;
|
|
|
|
|
+ this.formValidate.limit_num =
|
|
|
|
|
+ this.formValidate.is_limit && this.formValidate.limit_num == 0
|
|
|
|
|
+ ? 1
|
|
|
|
|
+ : 0;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.formValidate.limit_type = 0;
|
|
|
|
|
+ this.formValidate.limit_num = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ //erp配置
|
|
|
|
|
+ getErpConfig() {
|
|
|
|
|
+ erpConfig()
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ this.openErp = res.data.open_erp;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((err) => {
|
|
|
|
|
+ this.$Message.error(err.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ delSpecs(index) {
|
|
|
|
|
+ this.specsList.splice(index, 1);
|
|
|
|
|
+ },
|
|
|
|
|
+ addSpecs() {
|
|
|
|
|
+ let obj = { name: '', value: '', sort: 0 };
|
|
|
|
|
+ this.specsList.push(obj);
|
|
|
|
|
+ },
|
|
|
|
|
+ specsInfo(e) {
|
|
|
|
|
+ this.specsData.forEach((item) => {
|
|
|
|
|
+ if (item.id == e) {
|
|
|
|
|
+ this.specsList = item.specs;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ getProductAllSpecs() {
|
|
|
|
|
+ productAllSpecs()
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ this.specsData = res.data;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((err) => {
|
|
|
|
|
+ this.$Message.error(err.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ getProductAllEnsure() {
|
|
|
|
|
+ productAllEnsure()
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ this.ensureData = res.data;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((err) => {
|
|
|
|
|
+ this.$Message.error(err.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ //添加倒入卡密的值
|
|
|
|
|
+ changeVirtual(e) {
|
|
|
|
|
+ this.virtualList = this.virtualList.concat(e);
|
|
|
|
|
+ },
|
|
|
|
|
+ //添加卡密
|
|
|
|
|
+ addVirtual(index, name) {
|
|
|
|
|
+ this.tabIndex = index;
|
|
|
|
|
+ this.tabName = name;
|
|
|
|
|
+ this.virtualListClear();
|
|
|
|
|
+ this.$refs.addCarMy.fixedCar = {
|
|
|
|
|
+ disk_info: '',
|
|
|
|
|
+ stock: 0,
|
|
|
|
|
+ };
|
|
|
|
|
+ this.$refs.addCarMy.cartMyType = 1;
|
|
|
|
|
+ this.carMyShow = true;
|
|
|
|
|
+ },
|
|
|
|
|
+ //确认提交卡密
|
|
|
|
|
+ fixdBtn(e) {
|
|
|
|
|
+ if (e.cartMyType == 1) {
|
|
|
|
|
+ this.$set(this[this.tabName][this.tabIndex], 'disk_info', e.disk_info);
|
|
|
|
|
+ this.$set(this[this.tabName][this.tabIndex], 'stock', Number(e.stock));
|
|
|
|
|
+ this[this.tabName][this.tabIndex].virtual_list = [];
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.$set(
|
|
|
|
|
+ this[this.tabName][this.tabIndex],
|
|
|
|
|
+ 'virtual_list',
|
|
|
|
|
+ e.virtualList
|
|
|
|
|
+ );
|
|
|
|
|
+ this.$set(
|
|
|
|
|
+ this[this.tabName][this.tabIndex],
|
|
|
|
|
+ 'stock',
|
|
|
|
|
+ e.virtualList.length
|
|
|
|
|
+ );
|
|
|
|
|
+ this[this.tabName][this.tabIndex].disk_info = '';
|
|
|
|
|
+ }
|
|
|
|
|
+ this.carMyShow = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ closeCarMy() {
|
|
|
|
|
+ this.carMyShow = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ //清空卡密
|
|
|
|
|
+ virtualListClear() {
|
|
|
|
|
+ this.virtualList = [
|
|
|
|
|
+ {
|
|
|
|
|
+ key: '',
|
|
|
|
|
+ value: '',
|
|
|
|
|
+ },
|
|
|
|
|
+ ];
|
|
|
|
|
+ },
|
|
|
|
|
+ seeVirtual(data, name, index) {
|
|
|
|
|
+ this.tabName = name;
|
|
|
|
|
+ this.tabIndex = index;
|
|
|
|
|
+ this.virtualListClear();
|
|
|
|
|
+ this.$refs.addCarMy.fixedCar = {
|
|
|
|
|
+ disk_info: '',
|
|
|
|
|
+ stock: 0,
|
|
|
|
|
+ };
|
|
|
|
|
+ if (data.virtual_list && data.virtual_list.length) {
|
|
|
|
|
+ this.$refs.addCarMy.cartMyType = 2;
|
|
|
|
|
+ this.virtualList = data.virtual_list;
|
|
|
|
|
+ } else if (data.disk_info) {
|
|
|
|
|
+ this.$refs.addCarMy.cartMyType = 1;
|
|
|
|
|
+ this.$refs.addCarMy.fixedCar.disk_info = data.disk_info;
|
|
|
|
|
+ this.$refs.addCarMy.fixedCar.stock = data.stock;
|
|
|
|
|
+ }
|
|
|
|
|
+ this.carMyShow = true;
|
|
|
|
|
+ },
|
|
|
|
|
+ //动态添加组件
|
|
|
|
|
+ addAssembly() {
|
|
|
|
|
+ this.formValidate.custom_form.push({
|
|
|
|
|
+ title: '',
|
|
|
|
|
+ label: 'text',
|
|
|
|
|
+ value: '',
|
|
|
|
|
+ status: 0,
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ customMessBtn(e) {
|
|
|
|
|
+ if (!e) {
|
|
|
|
|
+ this.formValidate.system_form_id = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ addcustom() {
|
|
|
|
|
+ if (this.formValidate.custom_form.length > 9) {
|
|
|
|
|
+ this.$Message.warning('最多添加10条');
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.addAssembly();
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ delcustom(index) {
|
|
|
|
|
+ this.formValidate.custom_form.splice(index, 1);
|
|
|
|
|
+ },
|
|
|
|
|
+ // 预售具体日期
|
|
|
|
|
+ onchangeTime(e) {
|
|
|
|
|
+ this.formValidate.presale_time = e;
|
|
|
|
|
+ },
|
|
|
|
|
+ //定时上架
|
|
|
|
|
+ onchangeShow(e) {
|
|
|
|
|
+ this.formValidate.auto_on_time = e;
|
|
|
|
|
+ },
|
|
|
|
|
+ //定时下架
|
|
|
|
|
+ onchangeOff(e) {
|
|
|
|
|
+ this.formValidate.auto_off_time = e;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 获取供应商内容
|
|
|
|
|
+ getSupplierList() {
|
|
|
|
|
+ getSupplierList()
|
|
|
|
|
+ .then(async (res) => {
|
|
|
|
|
+ this.supplierList = res.data;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ //打开属性
|
|
|
|
|
+ batchAttr() {
|
|
|
|
|
+ this.attrShow = true;
|
|
|
|
|
+ // if(!this.activeAtter.length){
|
|
|
|
|
+ // let data = this.attrs;
|
|
|
|
|
+ // data.map(el=>{
|
|
|
|
|
+ // el.details = [];
|
|
|
|
|
+ // el.detail.map(label=>{
|
|
|
|
|
+ // el.details.push({
|
|
|
|
|
+ // name:label,
|
|
|
|
|
+ // select:false
|
|
|
|
|
+ // })
|
|
|
|
|
+ // })
|
|
|
|
|
+ // })
|
|
|
|
|
+ // this.attrsList = data;
|
|
|
|
|
+ // }
|
|
|
|
|
+ },
|
|
|
|
|
+ //获取属性
|
|
|
|
|
+ getAttr() {
|
|
|
|
|
+ this.oneFormBatch[0].attr = '全部';
|
|
|
|
|
+ let data = this.attrs;
|
|
|
|
|
+ data.map((el) => {
|
|
|
|
|
+ el.details = [];
|
|
|
|
|
+ el.detail.map((label) => {
|
|
|
|
|
+ el.details.push({
|
|
|
|
|
+ name: label,
|
|
|
|
|
+ select: false,
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ this.attrsList = data;
|
|
|
|
|
+ },
|
|
|
|
|
+ //选中属性
|
|
|
|
|
+ activeAttr(e) {
|
|
|
|
|
+ this.attrsList = e;
|
|
|
|
|
+ },
|
|
|
|
|
+ //关闭属性弹窗
|
|
|
|
|
+ labelAttr() {
|
|
|
|
|
+ this.attrShow = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ //多属性为空
|
|
|
|
|
+ manyEmpty(j) {
|
|
|
|
|
+ j.pic = '';
|
|
|
|
|
+ j.price = 0;
|
|
|
|
|
+ j.settle_price = 0;
|
|
|
|
|
+ j.cost = 0;
|
|
|
|
|
+ j.ot_price = 0;
|
|
|
|
|
+ j.stock = 0;
|
|
|
|
|
+ j.bar_code = '';
|
|
|
|
|
+ j.code = '';
|
|
|
|
|
+ j.weight = 0;
|
|
|
|
|
+ j.volume = 0;
|
|
|
|
|
+ j.virtual_list = [];
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ doCombination(arr) {
|
|
|
|
|
+ var count = arr.length - 1; //数组长度(从0开始)
|
|
|
|
|
+ var tmp = [];
|
|
|
|
|
+ var totalArr = []; // 总数组
|
|
|
|
|
+
|
|
|
|
|
+ return doCombinationCallback(arr, 0); //从第一个开始
|
|
|
|
|
+ //js 没有静态数据,为了避免和外部数据混淆,需要使用闭包的形式
|
|
|
|
|
+ function doCombinationCallback(arr, curr_index) {
|
|
|
|
|
+ for (let val of arr[curr_index]) {
|
|
|
|
|
+ tmp[curr_index] = val; //以curr_index为索引,加入数组
|
|
|
|
|
+ //当前循环下标小于数组总长度,则需要继续调用方法
|
|
|
|
|
+ if (curr_index < count) {
|
|
|
|
|
+ doCombinationCallback(arr, curr_index + 1); //继续调用
|
|
|
|
|
+ } else {
|
|
|
|
|
+ totalArr.push(tmp.join(',')); //(直接给push进去,push进去的不是值,而是值的地址)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //js 对象都是 地址引用(引用关系),每次都需要重新初始化,否则 totalArr的数据都会是最后一次的 tmp 数据;
|
|
|
|
|
+ let oldTmp = tmp;
|
|
|
|
|
+ tmp = [];
|
|
|
|
|
+ for (let index of oldTmp) {
|
|
|
|
|
+ tmp.push(index);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return totalArr;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ //提交属性值;
|
|
|
|
|
+ subAttrs(e) {
|
|
|
|
|
+ let selectData = [];
|
|
|
|
|
+ this.attrsList.forEach((el, index) => {
|
|
|
|
|
+ let obj = [];
|
|
|
|
|
+ el.details.forEach((label) => {
|
|
|
|
|
+ if (label.select) {
|
|
|
|
|
+ obj.push(label.name);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ if (obj.length) {
|
|
|
|
|
+ selectData.push(obj);
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ let newData = [];
|
|
|
|
|
+ if (selectData.length) {
|
|
|
|
|
+ newData = this.doCombination(selectData);
|
|
|
|
|
+ }
|
|
|
|
|
+ this.attrShow = false;
|
|
|
|
|
+ this.activeAtter = selectData;
|
|
|
|
|
+ this.oneFormBatch[0].attr = newData.length ? newData.join(';') : '全部';
|
|
|
|
|
+ this.manyFormValidate.forEach((j) => {
|
|
|
|
|
+ j.select = false;
|
|
|
|
|
+ if (newData.length) {
|
|
|
|
|
+ newData.forEach((item) => {
|
|
|
|
|
+ if (j.values.split('').length == item.split('').length) {
|
|
|
|
|
+ if (j.values == item) {
|
|
|
|
|
+ j.select = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (j.values.indexOf(item) != -1) {
|
|
|
|
|
+ j.select = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ } else {
|
|
|
|
|
+ j.select = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ this.$set(this, 'manyFormValidate', this.manyFormValidate);
|
|
|
|
|
+ },
|
|
|
|
|
+ goodsOn(e) {
|
|
|
|
|
+ if (e == 0 || e == 1) {
|
|
|
|
|
+ this.formValidate.auto_on_time = '';
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ goodsOff(e) {
|
|
|
|
|
+ if (!e) {
|
|
|
|
|
+ this.formValidate.auto_off_time = '';
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ addBrand() {
|
|
|
|
|
+ this.$refs.menusFrom.modals = true;
|
|
|
|
|
+ this.$refs.menusFrom.titleFrom = '添加品牌分类';
|
|
|
|
|
+ this.formBrand = {
|
|
|
|
|
+ sort: 0,
|
|
|
|
|
+ is_show: 1,
|
|
|
|
|
+ };
|
|
|
|
|
+ this.formBrand.fid = [0];
|
|
|
|
|
+ this.$refs.menusFrom.type = 1;
|
|
|
|
|
+ },
|
|
|
|
|
+ getAllUnit() {
|
|
|
|
|
+ productAllUnit()
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ this.unitNameList = res.data;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((err) => {
|
|
|
|
|
+ this.$Message.error(err.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ addClass() {
|
|
|
|
|
+ this.$modalForm(productCreateApi()).then(() => this.goodsCategory());
|
|
|
|
|
+ },
|
|
|
|
|
+ addUnit() {
|
|
|
|
|
+ this.$modalForm(productUnitCreate()).then(() => this.getAllUnit());
|
|
|
|
|
+ },
|
|
|
|
|
+ addStoreLabel() {
|
|
|
|
|
+ this.$modalForm(productLabelAdd()).then(() => { });
|
|
|
|
|
+ },
|
|
|
|
|
+ productTypeTap(num, item) {
|
|
|
|
|
+ if (num == 1) {
|
|
|
|
|
+ if (this.productId) return this.$Message.error('商品类型不能切换!');
|
|
|
|
|
+ this.formValidate.product_type = item.id;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.formValidate.product_type && this.formValidate.product_type != 4) {
|
|
|
|
|
+ this.headTab = [
|
|
|
|
|
+ { title: '基础信息', name: '1' },
|
|
|
|
|
+ { title: '规格库存', name: '2' },
|
|
|
|
|
+ { title: '商品详情', name: '3' },
|
|
|
|
|
+ { title: '营销设置', name: '5' },
|
|
|
|
|
+ { title: '其他设置', name: '6' },
|
|
|
|
|
+ { title: '商品评论', name: '7' },
|
|
|
|
|
+ ];
|
|
|
|
|
+ this.formValidate.postage = 0;
|
|
|
|
|
+ this.formValidate.supplier_id = 0;
|
|
|
|
|
+ } else if(this.formValidate.product_type == 4){
|
|
|
|
|
+ this.headTab = [
|
|
|
|
|
+ { title: "基础信息", name: "1" },
|
|
|
|
|
+ { title: "规格库存", name: "2" },
|
|
|
|
|
+ { title: "商品详情", name: "3" },
|
|
|
|
|
+ { title: "营销设置", name: "5" },
|
|
|
|
|
+ { title: "其他设置", name: "6" },
|
|
|
|
|
+ { title: '商品评论', name: '7' },
|
|
|
|
|
+ { title: "适用门店", name: "8" },
|
|
|
|
|
+ ]
|
|
|
|
|
+ }else {
|
|
|
|
|
+ this.headTab = [
|
|
|
|
|
+ { title: '基础信息', name: '1' },
|
|
|
|
|
+ { title: '规格库存', name: '2' },
|
|
|
|
|
+ { title: '商品详情', name: '3' },
|
|
|
|
|
+ { title: '物流设置', name: '4' },
|
|
|
|
|
+ { title: '营销设置', name: '5' },
|
|
|
|
|
+ { title: '其他设置', name: '6' },
|
|
|
|
|
+ { title: "适用门店", name: "8" },
|
|
|
|
|
+ { title: '商品评论', name: '7' },
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ closeLabel(label) {
|
|
|
|
|
+ let index = this.dataLabel.indexOf(
|
|
|
|
|
+ this.dataLabel.filter((d) => d.id == label.id)[0]
|
|
|
|
|
+ );
|
|
|
|
|
+ this.dataLabel.splice(index, 1);
|
|
|
|
|
+ },
|
|
|
|
|
+ activeData(dataLabel) {
|
|
|
|
|
+ this.labelShow = false;
|
|
|
|
|
+ this.dataLabel = dataLabel;
|
|
|
|
|
+ },
|
|
|
|
|
+ openLabel(row) {
|
|
|
|
|
+ this.labelShow = true;
|
|
|
|
|
+ this.$refs.userLabel.userLabel(
|
|
|
|
|
+ JSON.parse(JSON.stringify(this.dataLabel))
|
|
|
|
|
+ );
|
|
|
|
|
+ },
|
|
|
|
|
+ // 标签弹窗关闭
|
|
|
|
|
+ labelClose() {
|
|
|
|
|
+ this.labelShow = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ closeStoreLabel(label) {
|
|
|
|
|
+ let index = this.storeDataLabel.indexOf(
|
|
|
|
|
+ this.storeDataLabel.filter((d) => d.id == label.id)[0]
|
|
|
|
|
+ );
|
|
|
|
|
+ this.storeDataLabel.splice(index, 1);
|
|
|
|
|
+ },
|
|
|
|
|
+ activeStoreData(storeDataLabel) {
|
|
|
|
|
+ this.storeLabelShow = false;
|
|
|
|
|
+ this.storeDataLabel = storeDataLabel;
|
|
|
|
|
+ },
|
|
|
|
|
+ openStoreLabel(row) {
|
|
|
|
|
+ this.storeLabelShow = true;
|
|
|
|
|
+ this.$refs.storeLabel.storeLabel(
|
|
|
|
|
+ JSON.parse(JSON.stringify(this.storeDataLabel))
|
|
|
|
|
+ );
|
|
|
|
|
+ },
|
|
|
|
|
+ // 标签弹窗关闭
|
|
|
|
|
+ storeLabelClose() {
|
|
|
|
|
+ this.storeLabelShow = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 品牌列表
|
|
|
|
|
+ getBrandList() {
|
|
|
|
|
+ brandList()
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ //initBran()函数作用iview中规定value必须是字符串,后台返回成了数字,用于处理这个,给了个递归;
|
|
|
|
|
+ this.initBran(res.data);
|
|
|
|
|
+ this.brandData = res.data;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((err) => {
|
|
|
|
|
+ this.$Message.error(err.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ initBran(data){
|
|
|
|
|
+ data.map(item=>{
|
|
|
|
|
+ item.value = item.value.toString();
|
|
|
|
|
+ if(item.children && item.children.length){
|
|
|
|
|
+ this.initBran(item.children);
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
|
|
+ getProductId(e) {
|
|
|
|
|
+ this.goodsModals = false;
|
|
|
|
|
+ let nArr = this.goodsData.concat(e).filter((element, index, self) => {
|
|
|
|
|
+ return (
|
|
|
|
|
+ self.findIndex((x) => x.product_id == element.product_id) == index
|
|
|
|
|
+ );
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ this.goodsData = nArr.slice(0, 12);
|
|
|
|
|
+ },
|
|
|
|
|
+ goodCancel() {
|
|
|
|
|
+ this.goodsModals = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ goodsTap() {
|
|
|
|
|
+ this.goodsModals = true;
|
|
|
|
|
+ this.$refs.goodslist.handleSelectAll();
|
|
|
|
|
+ },
|
|
|
|
|
+ bindDelete(index) {
|
|
|
|
|
+ this.goodsData.splice(index, 1);
|
|
|
|
|
+ },
|
|
|
|
|
+ cancel() {
|
|
|
|
|
+ this.$router.push({ path: this.roterPre + '/product/product_list' });
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ videoSaveToUrl(file) {
|
|
|
|
|
+ let imgTypeArr = ['video/mp4'];
|
|
|
|
|
+ let imgType = imgTypeArr.indexOf(file.type) !== -1;
|
|
|
|
|
+ if (!imgType) {
|
|
|
|
|
+ return this.$Message.warning({
|
|
|
|
|
+ content: '文件 ' + file.name + ' 格式不正确, 请选择格式正确的视频',
|
|
|
|
|
+ duration: 5,
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ uploadByPieces({
|
|
|
|
|
+ randoms: '', // 随机数,这里作为给后端处理分片的标识 根据项目看情况 是否要加
|
|
|
|
|
+ file: file, // 视频实体
|
|
|
|
|
+ pieceSize: 3, // 分片大小
|
|
|
|
|
+ success: (data) => {
|
|
|
|
|
+ this.formValidate.video_link = data.file_path;
|
|
|
|
|
+ this.progress = 100;
|
|
|
|
|
+ },
|
|
|
|
|
+ error: (e) => {
|
|
|
|
|
+ this.$Message.error(e.msg);
|
|
|
|
|
+ },
|
|
|
|
|
+ uploading: (chunk, allChunk) => {
|
|
|
|
|
+ this.videoIng = true;
|
|
|
|
|
+ let st = Math.floor((chunk / allChunk) * 100);
|
|
|
|
|
+ this.progress = st;
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
|
|
+ return false;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // 上传头部token
|
|
|
|
|
+ getToken() {
|
|
|
|
|
+ this.header['Authori-zation'] = 'Bearer ' + util.cookies.get('token');
|
|
|
|
|
+ },
|
|
|
|
|
+ // beforeUpload() {
|
|
|
|
|
+ // this.uploadData = {};
|
|
|
|
|
+ // let promise = new Promise((resolve) => {
|
|
|
|
|
+ // this.$nextTick(function () {
|
|
|
|
|
+ // resolve(true);
|
|
|
|
|
+ // });
|
|
|
|
|
+ // });
|
|
|
|
|
+ // return promise;
|
|
|
|
|
+ // },
|
|
|
|
|
+ // 上传成功
|
|
|
|
|
+ handleSuccess(res, file, fileList) {
|
|
|
|
|
+ if (res.status === 200) {
|
|
|
|
|
+ this.formValidate.video_link = res.data.src;
|
|
|
|
|
+ this.$Message.success(res.msg);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ //获取视频上传类型
|
|
|
|
|
+ uploadType() {
|
|
|
|
|
+ uploadType().then((res) => {
|
|
|
|
|
+ this.upload_type = res.data.upload_type;
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ getEditorContent(data) {
|
|
|
|
|
+ this.content = data;
|
|
|
|
|
+ },
|
|
|
|
|
+ infoData(data) {
|
|
|
|
|
+ this.storesList = data.stores || [];
|
|
|
|
|
+ let cate_id = data.cate_id.map(Number);
|
|
|
|
|
+ this.attrs = data.items || [];
|
|
|
|
|
+ let ids = [];
|
|
|
|
|
+ data.coupons.map((item) => {
|
|
|
|
|
+ ids.push(item.id);
|
|
|
|
|
+ });
|
|
|
|
|
+ this.goodsData = data.recommend_list;
|
|
|
|
|
+ if (data.auto_off_time) {
|
|
|
|
|
+ this.off_show = 1;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.off_show = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ let brandIds = [];
|
|
|
|
|
+ data.brand_id.forEach(item=>{
|
|
|
|
|
+ brandIds.push(item.toString())
|
|
|
|
|
+ })
|
|
|
|
|
+ this.formValidate = data;
|
|
|
|
|
+ this.formTypeList = data.custom_form_info;
|
|
|
|
|
+ this.formValidate.brand_id = brandIds;
|
|
|
|
|
+ if (data.type == 2) {
|
|
|
|
|
+ this.formValidate.supplier_id = data.relation_id;
|
|
|
|
|
+ }
|
|
|
|
|
+ this.formValidate.is_limit = this.formValidate.is_limit ? 1 : 0;
|
|
|
|
|
+ this.formValidate.limit_type = parseInt(data.limit_type);
|
|
|
|
|
+ this.formValidate.is_support_refund = parseInt(
|
|
|
|
|
+ this.formValidate.is_support_refund
|
|
|
|
|
+ );
|
|
|
|
|
+ this.contents = this.content = data.description;
|
|
|
|
|
+ this.couponName = data.coupons;
|
|
|
|
|
+ this.formValidate.coupon_ids = ids;
|
|
|
|
|
+ this.updateIds = ids;
|
|
|
|
|
+ this.updateName = data.coupons;
|
|
|
|
|
+ this.formValidate.cate_id = cate_id;
|
|
|
|
|
+ this.dataLabel = data.label_id;
|
|
|
|
|
+ this.storeDataLabel = data.store_label_id;
|
|
|
|
|
+ this.specsList = data.specs;
|
|
|
|
|
+ if (data.attr) {
|
|
|
|
|
+ this.oneFormValidate = [data.attr];
|
|
|
|
|
+ }
|
|
|
|
|
+ this.formValidate.header = [];
|
|
|
|
|
+ this.generate(0);
|
|
|
|
|
+ //this.manyFormValidate = data.attrs;
|
|
|
|
|
+ this.addmanyData(data.attrs);
|
|
|
|
|
+ this.productTypeTap(2);
|
|
|
|
|
+ this.formValidate.system_form_id = data.system_form_id || 0;
|
|
|
|
|
+ if (this.formValidate.system_form_id) {
|
|
|
|
|
+ this.customBtn = true;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ this.customBtn = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ this.spec_type = data.spec_type;
|
|
|
|
|
+ if (data.spec_type === 0) {
|
|
|
|
|
+ this.manyFormValidate = [];
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.createBnt = true;
|
|
|
|
|
+ this.oneFormValidate = [
|
|
|
|
|
+ {
|
|
|
|
|
+ pic: '',
|
|
|
|
|
+ price: 0,
|
|
|
|
|
+ settle_price: 0,
|
|
|
|
|
+ cost: 0,
|
|
|
|
|
+ ot_price: 0,
|
|
|
|
|
+ stock: 0,
|
|
|
|
|
+ bar_code: '',
|
|
|
|
|
+ code: '',
|
|
|
|
|
+ weight: 0,
|
|
|
|
|
+ volume: 0,
|
|
|
|
|
+ brokerage: 0,
|
|
|
|
|
+ brokerage_two: 0,
|
|
|
|
|
+ vip_price: 0,
|
|
|
|
|
+ virtual_list: [],
|
|
|
|
|
+ write_times: 0, //核销次数
|
|
|
|
|
+ write_valid: 1, //核销时效
|
|
|
|
|
+ days: 1
|
|
|
|
|
+ },
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ //关闭淘宝弹窗并生成数据;
|
|
|
|
|
+ onClose(data) {
|
|
|
|
|
+ this.modals = false;
|
|
|
|
|
+ this.infoData(data);
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ checkMove(evt) {
|
|
|
|
|
+ this.moveIndex = evt.draggedContext.index;
|
|
|
|
|
+ },
|
|
|
|
|
+ end() {
|
|
|
|
|
+ this.moveIndex = '';
|
|
|
|
|
+ },
|
|
|
|
|
+ checkAllGroupChange(data) {
|
|
|
|
|
+ this.checkAllGroup(data);
|
|
|
|
|
+ },
|
|
|
|
|
+ checkAllGroup(data) {
|
|
|
|
|
+ if (this.formValidate.spec_type === 0) {
|
|
|
|
|
+ if (data.indexOf(0) > -1) {
|
|
|
|
|
+ this.columnsInstall = this.columns2.slice(1, 5).concat(this.member);
|
|
|
|
|
+ } else if (data.indexOf(1) > -1) {
|
|
|
|
|
+ this.columnsInstall = this.columns2.slice(1, 5).concat(this.rakeBack);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.columnsInstall = this.columns2.slice(1, 5);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (data.length === 2) {
|
|
|
|
|
+ this.columnsInstall = this.columns2
|
|
|
|
|
+ .slice(1, 5)
|
|
|
|
|
+ .concat(this.rakeBack)
|
|
|
|
|
+ .concat(this.member);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (data.indexOf(0) > -1) {
|
|
|
|
|
+ this.columnsInstal2 = this.columnsInstalM
|
|
|
|
|
+ .slice(0, 4)
|
|
|
|
|
+ .concat(this.member);
|
|
|
|
|
+ } else if (data.indexOf(1) > -1) {
|
|
|
|
|
+ this.columnsInstal2 = this.columnsInstalM
|
|
|
|
|
+ .slice(0, 4)
|
|
|
|
|
+ .concat(this.rakeBack);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.columnsInstal2 = this.columnsInstalM.slice(0, 4);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (data.length === 2) {
|
|
|
|
|
+ this.columnsInstal2 = this.columnsInstalM
|
|
|
|
|
+ .slice(0, 4)
|
|
|
|
|
+ .concat(this.rakeBack)
|
|
|
|
|
+ .concat(this.member);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 添加优惠券
|
|
|
|
|
+ addCoupon() {
|
|
|
|
|
+ this.$refs.couponTemplates.isTemplate = true;
|
|
|
|
|
+ this.$refs.couponTemplates.tableList();
|
|
|
|
|
+ },
|
|
|
|
|
+ //对象数组去重;
|
|
|
|
|
+ unique(arr) {
|
|
|
|
|
+ const res = new Map();
|
|
|
|
|
+ return arr.filter((arr) => !res.has(arr.id) && res.set(arr.id, 1));
|
|
|
|
|
+ },
|
|
|
|
|
+ nameId(id, names) {
|
|
|
|
|
+ this.formValidate.coupon_ids = id;
|
|
|
|
|
+ this.couponName = this.unique(names);
|
|
|
|
|
+ },
|
|
|
|
|
+ handleClose(name) {
|
|
|
|
|
+ let index = this.couponName.indexOf(name);
|
|
|
|
|
+ this.couponName.splice(index, 1);
|
|
|
|
|
+ let couponIds = this.formValidate.coupon_ids;
|
|
|
|
|
+ couponIds.splice(index, 1);
|
|
|
|
|
+ this.updateIds = couponIds;
|
|
|
|
|
+ this.updateName = this.couponName;
|
|
|
|
|
+ },
|
|
|
|
|
+ getStoreId (data) {
|
|
|
|
|
+ this.storeModals = false;
|
|
|
|
|
+ let list = this.storesList.concat(data);
|
|
|
|
|
+ let uni = this.unique(list);
|
|
|
|
|
+ this.storesList = uni;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 运费模板
|
|
|
|
|
+ getList() {
|
|
|
|
|
+ this.productGetTemplate();
|
|
|
|
|
+ },
|
|
|
|
|
+ // 添加运费模板
|
|
|
|
|
+ addTemp() {
|
|
|
|
|
+ this.$refs.templates.isTemplate = true;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 删除视频;
|
|
|
|
|
+ delVideo() {
|
|
|
|
|
+ let that = this;
|
|
|
|
|
+ that.$set(that.formValidate, 'video_link', '');
|
|
|
|
|
+ that.$set(that, 'progress', 0);
|
|
|
|
|
+ that.videoIng = false;
|
|
|
|
|
+ that.upload.videoIng = false;
|
|
|
|
|
+ that.$refs.refid.value = '';
|
|
|
|
|
+ },
|
|
|
|
|
+ zh_uploadFile() {
|
|
|
|
|
+ if (this.seletVideo == 1) {
|
|
|
|
|
+ if (this.videoLink && this.$getFileType(this.videoLink) == 'video') {
|
|
|
|
|
+ this.formValidate.video_link = this.videoLink;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return this.$Message.error('请输入正确的视频链接');
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.$refs.refid.click();
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ zh_uploadFile_change(evfile) {
|
|
|
|
|
+ let that = this;
|
|
|
|
|
+ let suffix = evfile.target.files[0].name.substr(
|
|
|
|
|
+ evfile.target.files[0].name.indexOf('.')
|
|
|
|
|
+ );
|
|
|
|
|
+ if (suffix.indexOf('.mp4') === -1) {
|
|
|
|
|
+ return that.$Message.error('只能上传MP4文件');
|
|
|
|
|
+ }
|
|
|
|
|
+ let types = {
|
|
|
|
|
+ key: evfile.target.files[0].name,
|
|
|
|
|
+ contentType: evfile.target.files[0].type,
|
|
|
|
|
+ };
|
|
|
|
|
+ productGetTempKeysApi(types)
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ that.$videoCloud
|
|
|
|
|
+ .videoUpload({
|
|
|
|
|
+ type: res.data.type,
|
|
|
|
|
+ evfile: evfile,
|
|
|
|
|
+ res: res,
|
|
|
|
|
+ uploading(status, progress) {
|
|
|
|
|
+ that.upload.videoIng = status;
|
|
|
|
|
+ if (res.status == 200) {
|
|
|
|
|
+ that.progress = 100;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ })
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ that.formValidate.video_link = res.url;
|
|
|
|
|
+ that.$Message.success('视频上传成功');
|
|
|
|
|
+ that.upload.videoIng = false;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ that.$Message.error(res);
|
|
|
|
|
+ });
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ that.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ // 上一页;
|
|
|
|
|
+ upTab() {
|
|
|
|
|
+ if (this.currentTab == 5 && this.formValidate.product_type != 0) {
|
|
|
|
|
+ this.currentTab = (Number(this.currentTab) - 2).toString();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.currentTab = (Number(this.currentTab) - 1).toString();
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 下一页;
|
|
|
|
|
+ downTab(name) {
|
|
|
|
|
+ this.$refs[name].validate((valid) => {
|
|
|
|
|
+ if (valid) {
|
|
|
|
|
+ if (
|
|
|
|
|
+ this.formValidate.is_show == 2 &&
|
|
|
|
|
+ !this.formValidate.auto_on_time
|
|
|
|
|
+ ) {
|
|
|
|
|
+ return this.$Message.warning('请填写定时上架时间');
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.off_show == 1 && !this.formValidate.auto_off_time) {
|
|
|
|
|
+ return this.$Message.warning('请填写定时下架时间');
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.currentTab == 4 && !this.formValidate.delivery_type.length) {
|
|
|
|
|
+ return this.$Message.warning('请选择配送方式');
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.currentTab == 3 && this.formValidate.product_type != 0) {
|
|
|
|
|
+ this.currentTab = (Number(this.currentTab) + 2).toString();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.currentTab = (Number(this.currentTab) + 1).toString();
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.$Message.warning('请完善数据');
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ // 属性弹窗回调函数;
|
|
|
|
|
+ userSearchs() {
|
|
|
|
|
+ this.productGetRule();
|
|
|
|
|
+ },
|
|
|
|
|
+ // 添加规则;
|
|
|
|
|
+ addRule() {
|
|
|
|
|
+ this.$refs.addattr.modal = true;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 批量设置分佣;
|
|
|
|
|
+ brokerageSetUp() {
|
|
|
|
|
+ let that = this;
|
|
|
|
|
+ if (that.formValidate.is_sub.indexOf(1) > -1) {
|
|
|
|
|
+ if (that.manyBrokerage <= 0 || that.manyBrokerageTwo <= 0) {
|
|
|
|
|
+ return that.$Message.error('请填写返佣金额后进行批量添加');
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if (that.formValidate.is_sub.indexOf(0) > -1) {
|
|
|
|
|
+ if (that.manyVipPrice <= 0) {
|
|
|
|
|
+ return that.$Message.error('请填写会员价后进行批量添加');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.formValidate.is_sub.length === 2) {
|
|
|
|
|
+ if (
|
|
|
|
|
+ that.manyBrokerage <= 0 ||
|
|
|
|
|
+ that.manyBrokerageTwo <= 0 ||
|
|
|
|
|
+ that.manyVipPrice <= 0
|
|
|
|
|
+ ) {
|
|
|
|
|
+ return that.$Message.error('请填写完金额后进行批量添加');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ for (let val of that.manyFormValidate) {
|
|
|
|
|
+ this.$set(val, 'brokerage', that.manyBrokerage);
|
|
|
|
|
+ this.$set(val, 'brokerage_two', that.manyBrokerageTwo);
|
|
|
|
|
+ this.$set(val, 'vip_price', that.manyVipPrice);
|
|
|
|
|
+ }
|
|
|
|
|
+ // let that = this;
|
|
|
|
|
+ // if (that.manyBrokerage <= 0 || that.manyBrokerageTwo <= 0) {
|
|
|
|
|
+ // return that.$Message.error('请填写返佣金额在进行批量添加');
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // for (let val of that.manyFormValidate) {
|
|
|
|
|
+ // this.$set(val, 'brokerage', that.manyBrokerage);
|
|
|
|
|
+ // this.$set(val, 'brokerage_two', that.manyBrokerageTwo);
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 批量设置会员价
|
|
|
|
|
+ vipPriceSetUp() {
|
|
|
|
|
+ let that = this;
|
|
|
|
|
+ if (that.manyVipPrice <= 0) {
|
|
|
|
|
+ return that.$Message.error('请填写会员价在进行批量添加');
|
|
|
|
|
+ } else {
|
|
|
|
|
+ for (let val of that.manyFormValidate) {
|
|
|
|
|
+ this.$set(val, 'vip_price', that.manyVipPrice);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ batchDel() {
|
|
|
|
|
+ this.oneFormBatch = [
|
|
|
|
|
+ {
|
|
|
|
|
+ attr: '全部',
|
|
|
|
|
+ pic: '',
|
|
|
|
|
+ price: 0,
|
|
|
|
|
+ settle_price: 0,
|
|
|
|
|
+ cost: 0,
|
|
|
|
|
+ ot_price: 0,
|
|
|
|
|
+ stock: 0,
|
|
|
|
|
+ bar_code: '',
|
|
|
|
|
+ code: '',
|
|
|
|
|
+ weight: 0,
|
|
|
|
|
+ volume: 0,
|
|
|
|
|
+ virtualList: [],
|
|
|
|
|
+ disk_info: '',
|
|
|
|
|
+ },
|
|
|
|
|
+ ];
|
|
|
|
|
+ this.activeAtter = [];
|
|
|
|
|
+ for (let val of this.manyFormValidate) {
|
|
|
|
|
+ val.select = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ confirm() {
|
|
|
|
|
+ let that = this;
|
|
|
|
|
+ that.createBnt = true;
|
|
|
|
|
+ if (that.formValidate.selectRule.trim().length <= 0) {
|
|
|
|
|
+ return that.$Message.error('请选择属性');
|
|
|
|
|
+ }
|
|
|
|
|
+ that.ruleList.forEach(function (item, index) {
|
|
|
|
|
+ if (item.rule_name === that.formValidate.selectRule) {
|
|
|
|
|
+ that.attrs = item.rule_value;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ // 获取商品属性模板;
|
|
|
|
|
+ productGetRule() {
|
|
|
|
|
+ productGetRuleApi().then((res) => {
|
|
|
|
|
+ this.ruleList = res.data;
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ // 获取运费模板;
|
|
|
|
|
+ productGetTemplate() {
|
|
|
|
|
+ productGetTemplateApi({id:this.productId}).then((res) => {
|
|
|
|
|
+ this.templateList = res.data;
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ // 删除表格中的属性
|
|
|
|
|
+ delAttrTable(index) {
|
|
|
|
|
+ let id = this.productId;
|
|
|
|
|
+ if (id) {
|
|
|
|
|
+ checkActivityApi(id)
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ this.manyFormValidate.splice(index, 1);
|
|
|
|
|
+ this.$Message.success(res.msg);
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.manyFormValidate.splice(index, 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 批量添加
|
|
|
|
|
+ batchAdd() {
|
|
|
|
|
+ for (let val of this.manyFormValidate) {
|
|
|
|
|
+ //this.manyEmpty(val);
|
|
|
|
|
+ if (val.select) {
|
|
|
|
|
+ if (this.oneFormBatch[0].pic) {
|
|
|
|
|
+ this.$set(val, 'pic', this.oneFormBatch[0].pic);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.oneFormBatch[0].price > 0) {
|
|
|
|
|
+ this.$set(val, 'price', this.oneFormBatch[0].price);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.oneFormBatch[0].settle_price > 0 && this.merchantType == 2) {
|
|
|
|
|
+ this.$set(val, "settle_price", this.oneFormBatch[0].settle_price);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.oneFormBatch[0].cost > 0) {
|
|
|
|
|
+ this.$set(val, 'cost', this.oneFormBatch[0].cost);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.oneFormBatch[0].ot_price > 0) {
|
|
|
|
|
+ this.$set(val, 'ot_price', this.oneFormBatch[0].ot_price);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.oneFormBatch[0].stock > 0) {
|
|
|
|
|
+ this.$set(val, 'stock', this.oneFormBatch[0].stock);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.oneFormBatch[0].bar_code !== '') {
|
|
|
|
|
+ this.$set(val, 'bar_code', this.oneFormBatch[0].bar_code);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.oneFormBatch[0].code !== '') {
|
|
|
|
|
+ this.$set(val, 'code', this.oneFormBatch[0].code);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.oneFormBatch[0].weight > 0) {
|
|
|
|
|
+ this.$set(val, 'weight', this.oneFormBatch[0].weight);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.oneFormBatch[0].volume > 0) {
|
|
|
|
|
+ this.$set(val, 'volume', this.oneFormBatch[0].volume);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.formValidate.product_type == 1) {
|
|
|
|
|
+ if (
|
|
|
|
|
+ this.oneFormBatch[0].virtual_list &&
|
|
|
|
|
+ this.oneFormBatch[0].virtual_list.length
|
|
|
|
|
+ ) {
|
|
|
|
|
+ this.$set(val, 'virtual_list', this.oneFormBatch[0].virtual_list);
|
|
|
|
|
+ } else if (this.oneFormBatch[0].disk_info) {
|
|
|
|
|
+ this.$refs.addCarMy.cartMyType = 1;
|
|
|
|
|
+ this.$set(val, 'disk_info', this.oneFormBatch[0].disk_info);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 添加按钮
|
|
|
|
|
+ addBtn() {
|
|
|
|
|
+ let id = this.productId;
|
|
|
|
|
+ if (id) {
|
|
|
|
|
+ checkActivityApi(id)
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ this.clearAttr();
|
|
|
|
|
+ this.createBnt = false;
|
|
|
|
|
+ this.showIput = true;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ addmanyData(data) {
|
|
|
|
|
+ data.forEach((item) => {
|
|
|
|
|
+ item.select = true;
|
|
|
|
|
+ });
|
|
|
|
|
+ this.manyFormValidate = data;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 立即生成
|
|
|
|
|
+ generate(type) {
|
|
|
|
|
+ generateAttrApi(
|
|
|
|
|
+ { attrs: this.attrs, product_type: this.formValidate.product_type },
|
|
|
|
|
+ this.formValidate.id,
|
|
|
|
|
+ type
|
|
|
|
|
+ )
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ let info = res.data.info,
|
|
|
|
|
+ header1 = JSON.parse(JSON.stringify(info.header));
|
|
|
|
|
+ if (this.productId !== '0') {
|
|
|
|
|
+ this.addmanyData(info.value);
|
|
|
|
|
+ }
|
|
|
|
|
+ this.formValidate.header = header1;
|
|
|
|
|
+ this.attrData = res.data.info.attr;
|
|
|
|
|
+ let header = info.header;
|
|
|
|
|
+ header.pop();
|
|
|
|
|
+ this.columnsInstalM = info.header;
|
|
|
|
|
+ this.checkAllGroup(this.formValidate.is_sub);
|
|
|
|
|
+ if (!this.productId && this.formValidate.spec_type === 1) {
|
|
|
|
|
+ this.manyFormValidate.map((item) => {
|
|
|
|
|
+ item.pic = this.formValidate.slider_image[0];
|
|
|
|
|
+ });
|
|
|
|
|
+ this.oneFormBatch[0].pic = this.formValidate.slider_image[0];
|
|
|
|
|
+ } else if (this.productId) {
|
|
|
|
|
+ this.manyFormValidate.map((item) => {
|
|
|
|
|
+ if (!item.pic) {
|
|
|
|
|
+ item.pic = this.formValidate.slider_image[0];
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ this.oneFormBatch[0].pic = this.formValidate.slider_image[0];
|
|
|
|
|
+ }
|
|
|
|
|
+ this.getAttr();
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ // 取消
|
|
|
|
|
+ offAttrName() {
|
|
|
|
|
+ this.showIput = false;
|
|
|
|
|
+ this.createBnt = true;
|
|
|
|
|
+ },
|
|
|
|
|
+ clearAttr() {
|
|
|
|
|
+ this.formDynamic.attrsName = '';
|
|
|
|
|
+ this.formDynamic.attrsVal = '';
|
|
|
|
|
+ },
|
|
|
|
|
+ // 删除规格
|
|
|
|
|
+ handleRemoveRole(index) {
|
|
|
|
|
+ this.attrs.splice(index, 1);
|
|
|
|
|
+ this.manyFormValidate.splice(index, 1);
|
|
|
|
|
+ },
|
|
|
|
|
+ // 删除属性
|
|
|
|
|
+ handleRemove2(item, index) {
|
|
|
|
|
+ item.splice(index, 1);
|
|
|
|
|
+ },
|
|
|
|
|
+ // 添加规则名称
|
|
|
|
|
+ createAttrName() {
|
|
|
|
|
+ if (this.formDynamic.attrsName && this.formDynamic.attrsVal) {
|
|
|
|
|
+ let data = {
|
|
|
|
|
+ value: this.formDynamic.attrsName,
|
|
|
|
|
+ detail: [this.formDynamic.attrsVal],
|
|
|
|
|
+ };
|
|
|
|
|
+ this.attrs.push(data);
|
|
|
|
|
+ var hash = {};
|
|
|
|
|
+ this.attrs = this.attrs.reduce(function (item, next) {
|
|
|
|
|
+ /* eslint-disable */
|
|
|
|
|
+ hash[next.value] ? '' : (hash[next.value] = true && item.push(next));
|
|
|
|
|
+ return item;
|
|
|
|
|
+ }, []);
|
|
|
|
|
+ this.clearAttr();
|
|
|
|
|
+ this.showIput = false;
|
|
|
|
|
+ this.createBnt = true;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.$Message.warning('请添加完整的规格!');
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 添加属性
|
|
|
|
|
+ createAttr(num, idx) {
|
|
|
|
|
+ if (num) {
|
|
|
|
|
+ this.attrs[idx].detail.push(num);
|
|
|
|
|
+ var hash = {};
|
|
|
|
|
+ this.attrs[idx].detail = this.attrs[idx].detail.reduce(function (
|
|
|
|
|
+ item,
|
|
|
|
|
+ next
|
|
|
|
|
+ ) {
|
|
|
|
|
+ /* eslint-disable */
|
|
|
|
|
+ hash[next] ? '' : (hash[next] = true && item.push(next));
|
|
|
|
|
+ return item;
|
|
|
|
|
+ },
|
|
|
|
|
+ []);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.$Message.warning('请添加属性');
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 商品分类;
|
|
|
|
|
+ goodsCategory() {
|
|
|
|
|
+ cascaderListApi(1)
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ this.treeSelect = res.data;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ //视视上传类型
|
|
|
|
|
+ changeVideo(e) {
|
|
|
|
|
+ this.formValidate.video_link = '';
|
|
|
|
|
+ this.videoLink = '';
|
|
|
|
|
+ },
|
|
|
|
|
+ // 改变规格
|
|
|
|
|
+ changeSpec() {
|
|
|
|
|
+ this.formValidate.is_sub = [];
|
|
|
|
|
+ let id = this.productId;
|
|
|
|
|
+ if (id) {
|
|
|
|
|
+ checkActivityApi(id)
|
|
|
|
|
+ .then((res) => { })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.formValidate.spec_type = this.spec_type;
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 详情
|
|
|
|
|
+ getInfo() {
|
|
|
|
|
+ let that = this;
|
|
|
|
|
+ that.spinShow = true;
|
|
|
|
|
+ productInfoApi(that.productId)
|
|
|
|
|
+ .then(async (res) => {
|
|
|
|
|
+ let data = res.data.productInfo;
|
|
|
|
|
+ this.merchantType = parseInt(data.type);
|
|
|
|
|
+ if(this.merchantType == 2){
|
|
|
|
|
+ let obj = {
|
|
|
|
|
+ title: "结算价",
|
|
|
|
|
+ slot: "settle_price",
|
|
|
|
|
+ align: "center",
|
|
|
|
|
+ minWidth: 95,
|
|
|
|
|
+ }
|
|
|
|
|
+ this.columns2.splice(3,0,obj)
|
|
|
|
|
+ }
|
|
|
|
|
+ this.infoData(data);
|
|
|
|
|
+ // let cate_id = data.cate_id.map(Number);
|
|
|
|
|
+ // let label_id = data.label_id.map(Number);
|
|
|
|
|
+ // this.attrs = data.items || [];
|
|
|
|
|
+ // let ids = [];
|
|
|
|
|
+ // data.coupons.map((item) => {
|
|
|
|
|
+ // ids.push(item.id);
|
|
|
|
|
+ // });
|
|
|
|
|
+ // that.formValidate = data;
|
|
|
|
|
+ // that.couponName = data.coupons;
|
|
|
|
|
+ // that.formValidate.coupon_ids = ids;
|
|
|
|
|
+ // that.updateIds = ids;
|
|
|
|
|
+ // that.updateName = data.coupons;
|
|
|
|
|
+ // that.formValidate.cate_id = cate_id;
|
|
|
|
|
+ // that.formValidate.label_id = label_id;
|
|
|
|
|
+ // that.oneFormValidate = [data.attr];
|
|
|
|
|
+ // that.formValidate.header = [];
|
|
|
|
|
+ // that.manyFormValidate = data.attrs;
|
|
|
|
|
+ // that.generate(0);
|
|
|
|
|
+ // that.spec_type = data.spec_type;
|
|
|
|
|
+ // if (data.spec_type === 0) {
|
|
|
|
|
+ // that.manyFormValidate = [];
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // that.createBnt = true;
|
|
|
|
|
+ // that.oneFormValidate = [
|
|
|
|
|
+ // {
|
|
|
|
|
+ // pic: data.image,
|
|
|
|
|
+ // price: 0,
|
|
|
|
|
+ // cost: 0,
|
|
|
|
|
+ // ot_price: 0,
|
|
|
|
|
+ // stock: 0,
|
|
|
|
|
+ // bar_code: "",
|
|
|
|
|
+ // weight: 0,
|
|
|
|
|
+ // volume: 0,
|
|
|
|
|
+ // brokerage: 0,
|
|
|
|
|
+ // brokerage_two: 0,
|
|
|
|
|
+ // vip_price: 0,
|
|
|
|
|
+ // },
|
|
|
|
|
+ // ];
|
|
|
|
|
+ // }
|
|
|
|
|
+ this.spinShow = false;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.spinShow = false;
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ // tab切换
|
|
|
|
|
+ onhangeTab(name) {
|
|
|
|
|
+ this.currentTab = name;
|
|
|
|
|
+ },
|
|
|
|
|
+ handleRemove(i) {
|
|
|
|
|
+ this.images.splice(i, 1);
|
|
|
|
|
+ this.formValidate.slider_image.splice(i, 1);
|
|
|
|
|
+ this.oneFormValidate[0].pic = this.formValidate.slider_image[0];
|
|
|
|
|
+ },
|
|
|
|
|
+ // 关闭图片上传模态框
|
|
|
|
|
+ changeCancel(msg) {
|
|
|
|
|
+ this.modalPic = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 点击商品图
|
|
|
|
|
+ modalPicTap(tit, picTit, index) {
|
|
|
|
|
+ this.modalPic = true;
|
|
|
|
|
+ this.isChoice = tit === 'dan' ? '单选' : '多选';
|
|
|
|
|
+ this.picTit = picTit;
|
|
|
|
|
+ this.tableIndex = index;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 获取单张图片信息
|
|
|
|
|
+ getPic(pc) {
|
|
|
|
|
+ switch (this.picTit) {
|
|
|
|
|
+ case 'danFrom':
|
|
|
|
|
+ this.formValidate.image = pc.att_dir;
|
|
|
|
|
+ if (!this.productId) {
|
|
|
|
|
+ if (this.formValidate.spec_type === 0) {
|
|
|
|
|
+ this.oneFormValidate[0].pic = pc.att_dir;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.manyFormValidate.map((item) => {
|
|
|
|
|
+ item.pic = pc.att_dir;
|
|
|
|
|
+ });
|
|
|
|
|
+ this.oneFormBatch[0].pic = pc.att_dir;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 'danTable':
|
|
|
|
|
+ this.oneFormValidate[this.tableIndex].pic = pc.att_dir;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 'duopi':
|
|
|
|
|
+ this.oneFormBatch[this.tableIndex].pic = pc.att_dir;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 'recommend_image':
|
|
|
|
|
+ this.formValidate.recommend_image = pc.att_dir;
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ this.manyFormValidate[this.tableIndex].pic = pc.att_dir;
|
|
|
|
|
+ }
|
|
|
|
|
+ this.modalPic = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 获取多张图信息
|
|
|
|
|
+ getPicD(pc) {
|
|
|
|
|
+ this.images = pc;
|
|
|
|
|
+ this.images.map((item) => {
|
|
|
|
|
+ this.formValidate.slider_image.push(item.att_dir);
|
|
|
|
|
+ this.formValidate.slider_image = this.formValidate.slider_image.splice(
|
|
|
|
|
+ 0,
|
|
|
|
|
+ 10
|
|
|
|
|
+ );
|
|
|
|
|
+ });
|
|
|
|
|
+ this.oneFormValidate[0].pic = this.formValidate.slider_image[0];
|
|
|
|
|
+ this.modalPic = false;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 提交
|
|
|
|
|
+ handleSubmit(name) {
|
|
|
|
|
+ this.$refs[name].validate((valid) => {
|
|
|
|
|
+ if (valid) {
|
|
|
|
|
+ if (!this.formValidate.store_name.trim()) {
|
|
|
|
|
+ return this.$Message.warning('基础信息-商品名称不能为空');
|
|
|
|
|
+ }
|
|
|
|
|
+ if (
|
|
|
|
|
+ this.formValidate.is_show == 2 &&
|
|
|
|
|
+ !this.formValidate.auto_on_time
|
|
|
|
|
+ ) {
|
|
|
|
|
+ return this.$Message.warning('基础信息-定时上架时间不能为空');
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.off_show == 1 && !this.formValidate.auto_off_time) {
|
|
|
|
|
+ return this.$Message.warning('基础信息-定时下架时间不能为空');
|
|
|
|
|
+ }
|
|
|
|
|
+ if(this.formValidate.product_type == 4 && !this.oneFormValidate[0].write_times){
|
|
|
|
|
+ return this.$Message.warning("规格库存-核销次数必须大于0");
|
|
|
|
|
+ }
|
|
|
|
|
+ if(this.formValidate.product_type == 4 && this.oneFormValidate[0].write_valid==2 && !this.oneFormValidate[0].days){
|
|
|
|
|
+ return this.$Message.warning("规格库存-有效天数必须大于0");
|
|
|
|
|
+ }
|
|
|
|
|
+ if(this.formValidate.product_type == 4 && this.oneFormValidate[0].write_valid==3 && !this.oneFormValidate[0].section_time.length){
|
|
|
|
|
+ return this.$Message.warning("规格库存-请输入固定有效期");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (
|
|
|
|
|
+ this.formValidate.freight == 2 &&
|
|
|
|
|
+ this.formValidate.product_type == 0 &&
|
|
|
|
|
+ this.formValidate.postage <= 0
|
|
|
|
|
+ ) {
|
|
|
|
|
+ return this.$Message.warning('物流设置-固定邮费不能为0');
|
|
|
|
|
+ }
|
|
|
|
|
+ if (
|
|
|
|
|
+ this.formValidate.freight == 3 &&
|
|
|
|
|
+ this.formValidate.product_type == 0 &&
|
|
|
|
|
+ !this.formValidate.temp_id
|
|
|
|
|
+ ) {
|
|
|
|
|
+ return this.$Message.warning('物流设置-运费模板不能为空');
|
|
|
|
|
+ }
|
|
|
|
|
+ if (
|
|
|
|
|
+ this.formValidate.product_type == 0 &&
|
|
|
|
|
+ this.formValidate.is_presale_product &&
|
|
|
|
|
+ !this.formValidate.presale_time[0]
|
|
|
|
|
+ ) {
|
|
|
|
|
+ return this.$Message.warning('营销设置-预售时间不能为空');
|
|
|
|
|
+ }
|
|
|
|
|
+ // for (let i = 0; i < this.formValidate.custom_form.length; i++) {
|
|
|
|
|
+ // const element = this.formValidate.custom_form[i];
|
|
|
|
|
+ // if (!element.title) {
|
|
|
|
|
+ // return this.$Message.warning('其他设置-留言标题不能为空');
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
+ if(this.customBtn && this.formValidate.system_form_id == 0){
|
|
|
|
|
+ return this.$Message.warning('其他设置-请选择自定义表单模板');
|
|
|
|
|
+ }
|
|
|
|
|
+ let storeId = []
|
|
|
|
|
+ this.storesList.forEach(item=>{
|
|
|
|
|
+ storeId.push(item.id)
|
|
|
|
|
+ })
|
|
|
|
|
+ if(this.formValidate.applicable_type==2 && !storeId.length){
|
|
|
|
|
+ return this.$Message.warning('适用门店-请选择适用门店');
|
|
|
|
|
+ }
|
|
|
|
|
+ this.formValidate.applicable_store_id = storeId;
|
|
|
|
|
+ this.formValidate.type = this.type;
|
|
|
|
|
+ if (this.formValidate.spec_type === 0) {
|
|
|
|
|
+ this.formValidate.attrs = this.oneFormValidate;
|
|
|
|
|
+ this.formValidate.header = [];
|
|
|
|
|
+ this.formValidate.items = [];
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.formValidate.items = this.attrs;
|
|
|
|
|
+ this.formValidate.attrs = this.manyFormValidate;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (
|
|
|
|
|
+ this.formValidate.spec_type === 1 &&
|
|
|
|
|
+ this.manyFormValidate.length === 0
|
|
|
|
|
+ ) {
|
|
|
|
|
+ return this.$Message.warning('规格库存-请点击生成多规格');
|
|
|
|
|
+ // return this.$Message.warning('请点击生成规格!');
|
|
|
|
|
+ }
|
|
|
|
|
+ let item = this.formValidate.attrs;
|
|
|
|
|
+ if (this.formValidate.is_sub.indexOf(1) != -1) {
|
|
|
|
|
+ for (let i = 0; i < item.length; i++) {
|
|
|
|
|
+ if (
|
|
|
|
|
+ item[i].brokerage === null ||
|
|
|
|
|
+ item[i].brokerage_two === null
|
|
|
|
|
+ ) {
|
|
|
|
|
+ return this.$Message.warning('营销设置- 一二级返佣不能为空');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.formValidate.is_sub.indexOf(0) != -1) {
|
|
|
|
|
+ for (let i = 0; i < item.length; i++) {
|
|
|
|
|
+ if (item[i].vip_price === null) {
|
|
|
|
|
+ return this.$Message.warning('营销设置-会员价不能为空');
|
|
|
|
|
+ }
|
|
|
|
|
+ if (item[i].vip_price === 0) {
|
|
|
|
|
+ return this.$Message.warning('营销设置-会员价不能为0');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this.formValidate.is_sub.length === 2) {
|
|
|
|
|
+ for (let i = 0; i < item.length; i++) {
|
|
|
|
|
+ if (
|
|
|
|
|
+ item[i].brokerage === null ||
|
|
|
|
|
+ item[i].brokerage_two === null ||
|
|
|
|
|
+ item[i].vip_price === null
|
|
|
|
|
+ ) {
|
|
|
|
|
+ return this.$Message.error(
|
|
|
|
|
+ '营销设置- 一二级返佣和会员价不能为空'
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ for (let i = 0; i < this.specsList.length; i++) {
|
|
|
|
|
+ let data = this.specsList[i];
|
|
|
|
|
+ if (!data.name.trim()) {
|
|
|
|
|
+ return this.$Message.error('请输入参数名称');
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!data.value.trim()) {
|
|
|
|
|
+ return this.$Message.error('请输入参数值');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!this.formValidate.product_type) {
|
|
|
|
|
+ this.formValidate.is_support_refund = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ this.openSubimit = false;
|
|
|
|
|
+ this.formValidate.description = this.formatRichText(this.content);
|
|
|
|
|
+ let goodsId = [];
|
|
|
|
|
+ this.goodsData.forEach((item) => {
|
|
|
|
|
+ goodsId.push(item.product_id);
|
|
|
|
|
+ });
|
|
|
|
|
+ this.formValidate.recommend_list = goodsId;
|
|
|
|
|
+ // 用户标签
|
|
|
|
|
+ let activeIds = [];
|
|
|
|
|
+ this.dataLabel.forEach((item) => {
|
|
|
|
|
+ activeIds.push(item.id);
|
|
|
|
|
+ });
|
|
|
|
|
+ this.formValidate.label_id = activeIds;
|
|
|
|
|
+ // 商品标签
|
|
|
|
|
+ let storeActiveIds = [];
|
|
|
|
|
+ this.storeDataLabel.forEach((item) => {
|
|
|
|
|
+ storeActiveIds.push(item.id);
|
|
|
|
|
+ });
|
|
|
|
|
+ this.formValidate.store_label_id = storeActiveIds;
|
|
|
|
|
+ // 商品参数
|
|
|
|
|
+ this.formValidate.specs = this.specsList;
|
|
|
|
|
+ if(this.formValidate.product_type == 4){
|
|
|
|
|
+ this.formValidate.delivery_type = 2
|
|
|
|
|
+ }
|
|
|
|
|
+ productAddApi(this.formValidate)
|
|
|
|
|
+ .then(async (res) => {
|
|
|
|
|
+ this.openSubimit = true;
|
|
|
|
|
+ this.$Message.success(res.msg);
|
|
|
|
|
+ if (this.productId === '0') {
|
|
|
|
|
+ cacheDelete().catch((err) => {
|
|
|
|
|
+ this.$Message.error(err.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ // this.$refs[name].resetFields();
|
|
|
|
|
+ // setTimeout(() => {
|
|
|
|
|
+ // this.$router.push({ path: '/product/product_list' });
|
|
|
|
|
+ // }, 500);
|
|
|
|
|
+ this.$emit('saved');
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.openSubimit = false;
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (!this.formValidate.store_name) {
|
|
|
|
|
+ return this.$Message.warning('基础信息-商品名称不能为空');
|
|
|
|
|
+ } else if (!this.formValidate.cate_id.length) {
|
|
|
|
|
+ return this.$Message.warning('基础信息-商品分类不能为空');
|
|
|
|
|
+ } else if (!this.formValidate.unit_name) {
|
|
|
|
|
+ return this.$Message.warning('基础信息-商品单位不能为空');
|
|
|
|
|
+ } else if (!this.formValidate.slider_image.length) {
|
|
|
|
|
+ return this.$Message.warning('基础信息-商品轮播图不能为空');
|
|
|
|
|
+ }
|
|
|
|
|
+ // if(!this.formValidate.store_name || !this.formValidate.cate_id || !this.formValidate.keyword
|
|
|
|
|
+ // || !this.formValidate.unit_name || !this.formValidate.store_info
|
|
|
|
|
+ // || !this.formValidate.image || !this.formValidate.slider_image){
|
|
|
|
|
+ // this.$Message.warning("请填写完整商品信息!");
|
|
|
|
|
+ // }
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ changeTemplate(msg) {
|
|
|
|
|
+ this.template = msg;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 表单验证
|
|
|
|
|
+ validate(prop, status, error) {
|
|
|
|
|
+ if (status === false) {
|
|
|
|
|
+ this.$Message.warning(error);
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 移动
|
|
|
|
|
+ handleDragStart(e, item) {
|
|
|
|
|
+ this.dragging = item;
|
|
|
|
|
+ },
|
|
|
|
|
+ handleDragEnd(e, item) {
|
|
|
|
|
+ this.dragging = null;
|
|
|
|
|
+ },
|
|
|
|
|
+ handleDragOver(e) {
|
|
|
|
|
+ e.dataTransfer.dropEffect = 'move';
|
|
|
|
|
+ },
|
|
|
|
|
+ handleDragEnter(e, item) {
|
|
|
|
|
+ e.dataTransfer.effectAllowed = 'move';
|
|
|
|
|
+ if (item === this.dragging) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ const newItems = [...this.formValidate.slider_image];
|
|
|
|
|
+ const src = newItems.indexOf(this.dragging);
|
|
|
|
|
+ const dst = newItems.indexOf(item);
|
|
|
|
|
+ newItems.splice(dst, 0, ...newItems.splice(src, 1));
|
|
|
|
|
+ this.formValidate.slider_image = newItems;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 添加自定义弹窗
|
|
|
|
|
+ addCustomDialog(editorId) {
|
|
|
|
|
+ window.UE.registerUI(
|
|
|
|
|
+ 'test-dialog',
|
|
|
|
|
+ function (editor, uiName) {
|
|
|
|
|
+ // 创建 dialog
|
|
|
|
|
+ let dialog = new window.UE.ui.Dialog({
|
|
|
|
|
+ iframeUrl: '/admin/widget.images/index.html?fodder=dialog',
|
|
|
|
|
+ editor: editor,
|
|
|
|
|
+ name: uiName,
|
|
|
|
|
+ title: '上传图片',
|
|
|
|
|
+ cssRules: 'width:1200px;height:500px;padding:20px;',
|
|
|
|
|
+ });
|
|
|
|
|
+ this.dialog = dialog;
|
|
|
|
|
+ let btn = new window.UE.ui.Button({
|
|
|
|
|
+ name: 'dialog-button',
|
|
|
|
|
+ title: '上传图片',
|
|
|
|
|
+ cssRules: `background-image: url(https://cdn.oss.9gt.net/prov1.1/1/icons.png);background-position: -726px -77px;`,
|
|
|
|
|
+ onclick: function () {
|
|
|
|
|
+ // 渲染dialog
|
|
|
|
|
+ dialog.render();
|
|
|
|
|
+ dialog.open();
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
|
|
+ return btn;
|
|
|
|
|
+ },
|
|
|
|
|
+ 37
|
|
|
|
|
+ );
|
|
|
|
|
+ window.UE.registerUI(
|
|
|
|
|
+ 'video-dialog',
|
|
|
|
|
+ function (editor, uiName) {
|
|
|
|
|
+ let dialog = new window.UE.ui.Dialog({
|
|
|
|
|
+ iframeUrl: '/admin/widget.video/index.html?fodder=video',
|
|
|
|
|
+ editor: editor,
|
|
|
|
|
+ name: uiName,
|
|
|
|
|
+ title: '上传视频',
|
|
|
|
|
+ cssRules: 'width:1000px;height:500px;padding:20px;',
|
|
|
|
|
+ });
|
|
|
|
|
+ this.dialog = dialog;
|
|
|
|
|
+ let btn = new window.UE.ui.Button({
|
|
|
|
|
+ name: 'video-button',
|
|
|
|
|
+ title: '上传视频',
|
|
|
|
|
+ cssRules: `background-image: url(../../../assets/images/icons.png);background-position: -320px -20px;`,
|
|
|
|
|
+ onclick: function () {
|
|
|
|
|
+ // 渲染dialog
|
|
|
|
|
+ dialog.render();
|
|
|
|
|
+ dialog.open();
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
|
|
+ return btn;
|
|
|
|
|
+ },
|
|
|
|
|
+ 38
|
|
|
|
|
+ );
|
|
|
|
|
+ },
|
|
|
|
|
+ formatRichText(html) {
|
|
|
|
|
+ let newContent = html.replace(/<img[^>]*>/gi, function (match, capture) {
|
|
|
|
|
+ match = match
|
|
|
|
|
+ .replace(/style="[^"]+"/gi, '')
|
|
|
|
|
+ .replace(/style='[^']+'/gi, '');
|
|
|
|
|
+ match = match
|
|
|
|
|
+ .replace(/width="[^"]+"/gi, '')
|
|
|
|
|
+ .replace(/width='[^']+'/gi, '');
|
|
|
|
|
+ match = match
|
|
|
|
|
+ .replace(/height="[^"]+"/gi, '')
|
|
|
|
|
+ .replace(/height='[^']+'/gi, '');
|
|
|
|
|
+ return match;
|
|
|
|
|
+ });
|
|
|
|
|
+ newContent = newContent.replace(
|
|
|
|
|
+ /style="[^"]+"/gi,
|
|
|
|
|
+ function (match, capture) {
|
|
|
|
|
+ match = match
|
|
|
|
|
+ .replace(/width:[^;]+;/gi, 'max-width:100%;')
|
|
|
|
|
+ .replace(/width:[^;]+;/gi, 'max-width:100%;');
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+ );
|
|
|
|
|
+ // newContent = newContent.replace(/<br[^>]*\/>/gi, '');
|
|
|
|
|
+ newContent = newContent.replace(
|
|
|
|
|
+ /\<img/gi,
|
|
|
|
|
+ '<img style="max-width:100%;height:auto;display:block;margin-top:0;margin-bottom:0;"'
|
|
|
|
|
+ );
|
|
|
|
|
+ return newContent;
|
|
|
|
|
+ },
|
|
|
|
|
+ drawerChange(e) {
|
|
|
|
|
+ if (e) {
|
|
|
|
|
+ this.currentTab = '1';
|
|
|
|
|
+ this.type = 0;
|
|
|
|
|
+ this.getInfo();
|
|
|
|
|
+ this.getReplyList();
|
|
|
|
|
+ this.goodsCategory();
|
|
|
|
|
+ this.productGetRule();
|
|
|
|
|
+ this.productGetTemplate();
|
|
|
|
|
+ this.getBrandList();
|
|
|
|
|
+ this.getAllUnit();
|
|
|
|
|
+ this.uploadType();
|
|
|
|
|
+ this.getProductAllEnsure();
|
|
|
|
|
+ this.getProductAllSpecs();
|
|
|
|
|
+ this.allFormList();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.$emit('update:visible', false);
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ // 查看评论列表
|
|
|
|
|
+ seeReply(row) {
|
|
|
|
|
+ this.$refs.replyList.modals = true;
|
|
|
|
|
+ this.$refs.replyList.getList(row.id);
|
|
|
|
|
+ },
|
|
|
|
|
+ // 回复评论
|
|
|
|
|
+ reply(row) {
|
|
|
|
|
+ this.replyModal = true;
|
|
|
|
|
+ this.rows = row;
|
|
|
|
|
+ this.replyForm.content = row.replyComment ? row.replyComment.content : '';
|
|
|
|
|
+ },
|
|
|
|
|
+ // 删除评论
|
|
|
|
|
+ delReply(row, tit, num) {
|
|
|
|
|
+ let delfromData = {
|
|
|
|
|
+ title: tit,
|
|
|
|
|
+ num: num,
|
|
|
|
|
+ url: `product/reply/${row.id}`,
|
|
|
|
|
+ method: 'DELETE',
|
|
|
|
|
+ ids: '',
|
|
|
|
|
+ };
|
|
|
|
|
+ this.$modalSure(delfromData)
|
|
|
|
|
+ .then((res) => {
|
|
|
|
|
+ this.$Message.success(res.msg);
|
|
|
|
|
+ this.replyData.splice(num, 1);
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ cancels() {
|
|
|
|
|
+ this.replyModal = false;
|
|
|
|
|
+ this.$refs['replyForm'].resetFields();
|
|
|
|
|
+ },
|
|
|
|
|
+ oks() {
|
|
|
|
|
+ this.replyModal = true;
|
|
|
|
|
+ this.$refs['replyForm'].validate((valid) => {
|
|
|
|
|
+ if (valid) {
|
|
|
|
|
+ setReplyApi(this.replyForm, this.rows.id)
|
|
|
|
|
+ .then(async (res) => {
|
|
|
|
|
+ this.$Message.success(res.msg);
|
|
|
|
|
+ this.replyModal = false;
|
|
|
|
|
+ this.$refs['replyForm'].resetFields();
|
|
|
|
|
+ this.getReplyList();
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ // 商品评论
|
|
|
|
|
+ getReplyList() {
|
|
|
|
|
+ this.replyLoading = true;
|
|
|
|
|
+ // this.formValidate.is_reply = this.formValidate.is_reply || "";
|
|
|
|
|
+ // this.formValidate.store_name = this.formValidate.store_name || "";
|
|
|
|
|
+ this.replyValidate.product_id = this.productId;
|
|
|
|
|
+ replyListApi(this.replyValidate)
|
|
|
|
|
+ .then(async (res) => {
|
|
|
|
|
+ let data = res.data;
|
|
|
|
|
+ this.replyData = data.list;
|
|
|
|
|
+ this.total = res.data.count;
|
|
|
|
|
+ this.replyLoading = false;
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch((res) => {
|
|
|
|
|
+ this.replyLoading = false;
|
|
|
|
|
+ this.$Message.error(res.msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+};
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<style lang="stylus" scoped>
|
|
|
|
|
+.specsList{
|
|
|
|
|
+ /deep/.ivu-table th{
|
|
|
|
|
+ padding 0 !important
|
|
|
|
|
+ }
|
|
|
|
|
+ /deep/.ivu-table-cell{
|
|
|
|
|
+ padding 5px !important
|
|
|
|
|
+ }
|
|
|
|
|
+ &.on{
|
|
|
|
|
+ width 50% !important;
|
|
|
|
|
+ /deep/.ivu-table{
|
|
|
|
|
+ width 100% !important;
|
|
|
|
|
+ }
|
|
|
|
|
+ /deep/.ivu-table table{
|
|
|
|
|
+ width 100% !important;
|
|
|
|
|
+ }
|
|
|
|
|
+ /deep/.ivu-table td{
|
|
|
|
|
+ height 40px;
|
|
|
|
|
+ padding 0 !important;
|
|
|
|
|
+ }
|
|
|
|
|
+ /deep/.ivu-table-cell{
|
|
|
|
|
+ padding 0 16px !important;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+.asterisk{
|
|
|
|
|
+ position relative;
|
|
|
|
|
+ .asteriskInfo{
|
|
|
|
|
+ position absolute;
|
|
|
|
|
+ color #ed4014;
|
|
|
|
|
+ left 73px;
|
|
|
|
|
+ top 5px;
|
|
|
|
|
+ font-size 20px;
|
|
|
|
|
+ &.on{
|
|
|
|
|
+ left:62px;
|
|
|
|
|
+ }
|
|
|
|
|
+ &.on2{
|
|
|
|
|
+ left:54px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+.storeModule{
|
|
|
|
|
+ width 950px;
|
|
|
|
|
+ margin -10px auto 0 auto;
|
|
|
|
|
+}
|
|
|
|
|
+.storeTable img{
|
|
|
|
|
+ width 36px;
|
|
|
|
|
+ height 36px;
|
|
|
|
|
+}
|
|
|
|
|
+.storeTable /deep/.ivu-table-wrapper{
|
|
|
|
|
+ border:0!important
|
|
|
|
|
+}
|
|
|
|
|
+.radioGroup .ivu-radio-wrapper{
|
|
|
|
|
+ margin-right 20px;
|
|
|
|
|
+}
|
|
|
|
|
+/deep/.ivu-drawer-close{
|
|
|
|
|
+ right: 30px;
|
|
|
|
|
+}
|
|
|
|
|
+.iview-video-style {
|
|
|
|
|
+ width: 40%;
|
|
|
|
|
+ height: 180px;
|
|
|
|
|
+ border-radius: 10px;
|
|
|
|
|
+ background-color: #707070;
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ .video-style{
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.iview-video-style .iconv {
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ line-height: 180px;
|
|
|
|
|
+ width: 50px;
|
|
|
|
|
+ height: 50px;
|
|
|
|
|
+ display: inherit;
|
|
|
|
|
+ font-size: 26px;
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ top: -74px;
|
|
|
|
|
+ left: 50%;
|
|
|
|
|
+ margin-left: -25px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.iview-video-style .mark {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 30px;
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ background-color: rgba(0, 0, 0, 0.5);
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+}
|
|
|
|
|
+.ivu-mt{
|
|
|
|
|
+ margin: 0 auto!important;
|
|
|
|
|
+}
|
|
|
|
|
+.header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ padding: 30px 0 25px 25px;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ color: #606266;
|
|
|
|
|
+
|
|
|
|
|
+ .iconfont {
|
|
|
|
|
+ margin-right: 12px;
|
|
|
|
|
+ color: #2D8CF0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .title {
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ color: #000000;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.ivu-tabs {
|
|
|
|
|
+ >>>.ivu-tabs-bar {
|
|
|
|
|
+ border-bottom: 0;
|
|
|
|
|
+ margin-bottom: 30px;
|
|
|
|
|
+ background-color: #F5F7FA;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ >>>.ivu-tabs-tab {
|
|
|
|
|
+ height: 40px;
|
|
|
|
|
+ padding: 0 20px;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ line-height: 40px;
|
|
|
|
|
+ color: #000000;
|
|
|
|
|
+
|
|
|
|
|
+ &:hover {
|
|
|
|
|
+ color: #000000 !important;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ >>>.ivu-tabs-tab-active {
|
|
|
|
|
+ background-color: #FFFFFF;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ >>>.ivu-tabs-ink-bar {
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ bottom: auto;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .ivu-tabs-tabpane {
|
|
|
|
|
+ padding: 0 24px;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.ivu-form {
|
|
|
|
|
+ >>>.ivu-form-item-label {
|
|
|
|
|
+ padding: 10px 6px 10px 0;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+>>>.pictrue {
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ display: inline-block;
|
|
|
|
|
+ width: 60px;
|
|
|
|
|
+ height: 60px;
|
|
|
|
|
+ border: 1px dotted rgba(0, 0, 0, 0.1);
|
|
|
|
|
+ margin: 0 15px 10px 0;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+
|
|
|
|
|
+ img {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .btndel {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ top: -4px;
|
|
|
|
|
+ left: 46px;
|
|
|
|
|
+ width: 20px;
|
|
|
|
|
+ height: 20px;
|
|
|
|
|
+ z-index: 1;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+>>>.upLoad {
|
|
|
|
|
+ width: 58px;
|
|
|
|
|
+ height: 58px;
|
|
|
|
|
+ border: 1px dotted rgba(0, 0, 0, 0.1);
|
|
|
|
|
+ border-radius: 4px;
|
|
|
|
|
+ background-color: rgba(0, 0, 0, 0.02);
|
|
|
|
|
+ line-height: 58px;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.input-display {
|
|
|
|
|
+ display: none;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.ifam {
|
|
|
|
|
+ width: 344px;
|
|
|
|
|
+ height: 644px;
|
|
|
|
|
+ background: url('../../../assets/images/phonebg.png') no-repeat center top;
|
|
|
|
|
+ background-size: 344px 644px;
|
|
|
|
|
+ padding: 40px 20px;
|
|
|
|
|
+ padding-top: 50px;
|
|
|
|
|
+
|
|
|
|
|
+ .content {
|
|
|
|
|
+ height: 560px;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ scrollbar-width: none; /* firefox */
|
|
|
|
|
+ -ms-overflow-style: none; /* IE 10+ */
|
|
|
|
|
+ overflow-x: hidden;
|
|
|
|
|
+ overflow-y: auto;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.videbox {
|
|
|
|
|
+ width: 60px;
|
|
|
|
|
+ height: 60px;
|
|
|
|
|
+ background: rgba(0, 0, 0, 0.02);
|
|
|
|
|
+ border-radius: 4px;
|
|
|
|
|
+ border: 1px dashed #ddd;
|
|
|
|
|
+ line-height: 50px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ color: #898989;
|
|
|
|
|
+ font-size: 30px;
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+}
|
|
|
|
|
+.drawer-footer {
|
|
|
|
|
+ position fixed
|
|
|
|
|
+ right 0
|
|
|
|
|
+ bottom 0
|
|
|
|
|
+ z-index 2
|
|
|
|
|
+ width 1000px
|
|
|
|
|
+ padding 13px
|
|
|
|
|
+ border-top 1px solid #EEEEEE
|
|
|
|
|
+ background-color #FFFFFF
|
|
|
|
|
+ text-align center
|
|
|
|
|
+}
|
|
|
|
|
+.labelInput{
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ border: 1px solid #dcdee2;
|
|
|
|
|
+ width: 50%;
|
|
|
|
|
+ border-radius: 4px;
|
|
|
|
|
+ min-height: 32px;
|
|
|
|
|
+ padding-right: 24px;
|
|
|
|
|
+ padding-left: 8px;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+
|
|
|
|
|
+ >div{
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ min-height: 30px;
|
|
|
|
|
+ font-size: 0;
|
|
|
|
|
+ line-height: 30px;
|
|
|
|
|
+
|
|
|
|
|
+ .span {
|
|
|
|
|
+ vertical-align: middle;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ color: #c5c8ce;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .ivu-icon {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ top: 50%;
|
|
|
|
|
+ right: 8px;
|
|
|
|
|
+ transform: translateY(-50%);
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ line-height: 1;
|
|
|
|
|
+ color: #808695;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+.color-list .color-item{
|
|
|
|
|
+ width: 70px;
|
|
|
|
|
+ height: 28px;
|
|
|
|
|
+ line-height: 28px;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ margin-right: 10px;
|
|
|
|
|
+ border-radius: 2px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+}
|
|
|
|
|
+.color-list .color-item.colorBlue{
|
|
|
|
|
+ background: linear-gradient(270deg, #5ecfff 0%, #0084ff 100%);
|
|
|
|
|
+}
|
|
|
|
|
+.color-list .color-item .num{
|
|
|
|
|
+ color: #1890ff;
|
|
|
|
|
+ width: 14px;
|
|
|
|
|
+ height: 14px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ line-height: 14px;
|
|
|
|
|
+ border-radius: 50%;
|
|
|
|
|
+ background-color: #fff;
|
|
|
|
|
+ margin-right: 6px;
|
|
|
|
|
+}
|
|
|
|
|
+.addCustom_content{
|
|
|
|
|
+ margin-top: 20px;
|
|
|
|
|
+}
|
|
|
|
|
+.addCustom_content .custom_box{
|
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
+}
|
|
|
|
|
+.custom-input{
|
|
|
|
|
+ width: 100px;
|
|
|
|
|
+ margin-right: 10px;
|
|
|
|
|
+}
|
|
|
|
|
+.ivu-checkbox-wrapper{
|
|
|
|
|
+ margin-right: 19px;
|
|
|
|
|
+}
|
|
|
|
|
+.addCustom_content .addfont{
|
|
|
|
|
+ display: inline-block;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ color: #1890ff;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+}
|
|
|
|
|
+.select-add{
|
|
|
|
|
+ width: 200px;
|
|
|
|
|
+ margin-left: 6px;
|
|
|
|
|
+ margin-right: 10px;
|
|
|
|
|
+}
|
|
|
|
|
+.addCustomBox{
|
|
|
|
|
+ margin-top: 12px;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ color: #1890ff;
|
|
|
|
|
+}
|
|
|
|
|
+.addCustomBox .btn{
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ width: max-content;
|
|
|
|
|
+}
|
|
|
|
|
+.tips{
|
|
|
|
|
+ display: inline-bolck;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ font-weight: 400;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+ &.on{
|
|
|
|
|
+ margin-top: 14px;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+>>>.wang-editor {
|
|
|
|
|
+ margin-left: 20px;
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|