<template>
|
<div class="app-container">
|
<el-card class="box-card">
|
<h3>商品(Spu)介绍</h3>
|
<el-form ref="dataForm" :rules="rules" :model="product" label-width="150px">
|
<el-form-item label="商品名称" prop="title">
|
<el-input v-model="product.title" />
|
</el-form-item>
|
|
<!-- <el-form-item label="原始价格" prop="originalPriceRaw">
|
<el-input v-model="product.originalPriceRaw" placeholder="0.00">
|
<template slot="append">元</template>
|
</el-input>
|
</el-form-item>
|
<el-form-item label="当前价格" prop="priceRaw">
|
<el-input v-model="product.priceRaw" placeholder="0.00">
|
<template slot="append">元</template>
|
</el-input>
|
</el-form-item>
|
<el-form-item label="VIP价格" prop="vipPriceRaw">
|
<el-input v-model="product.vipPriceRaw" placeholder="0.00">
|
<template slot="append">元</template>
|
</el-input>
|
</el-form-item>
|
|
<el-form-item label="剩余库存" prop="stock">
|
<el-input v-model="product.stock" :disabled="true" placeholder="0"/>
|
</el-form-item> -->
|
|
<el-form-item label="运费模板" prop="freightTemplateId">
|
<el-select v-model="product.freightTemplateId" placeholder="选择商品运费模板">
|
<el-option v-for="(item, index) in freightList" :key="index" :label="item.title" :value="item.id"/>
|
</el-select>
|
</el-form-item>
|
|
<el-form-item label="是否在售" prop="status">
|
<el-radio-group v-model="product.status">
|
<el-radio :label="1">在售</el-radio>
|
<el-radio :label="0">下架</el-radio>
|
</el-radio-group>
|
</el-form-item>
|
|
<el-form-item label="商品图片">
|
<el-upload
|
:action="uploadPath"
|
:headers="headers"
|
:limit="5"
|
:file-list="imgsFileList"
|
:on-exceed="uploadOverrun"
|
:on-success="handleimgsUrl"
|
:on-remove="handleRemove"
|
multiple
|
accept=".jpg, .jpeg, .png, .gif"
|
list-type="picture-card"
|
>
|
<i class="el-icon-plus" />
|
</el-upload>
|
</el-form-item>
|
|
<el-form-item label="商品单位" prop="unit">
|
<el-input v-model="product.unit" placeholder="件 / 个 / 盒" />
|
</el-form-item>
|
|
<el-form-item label="所属类目" prop="categoryId">
|
<el-cascader
|
:options="categoryList"
|
:props="{label:'title', value:'id', children:'childrenList'}"
|
v-model="categoryIds"
|
expand-trigger="hover"
|
@change="handleCategoryChange"
|
/>
|
</el-form-item>
|
|
<el-form-item label="商品简介" prop="description">
|
<el-input v-model="product.description" />
|
</el-form-item>
|
|
<el-form-item label="商品详细介绍" prop="detail">
|
<editor :init="editorInit" v-model="product.detail" />
|
</el-form-item>
|
|
</el-form>
|
</el-card>
|
|
<el-card class="box-card">
|
<h3>商品参数</h3>
|
<el-button :plain="true" type="primary" @click="handleAttributeShow">添加</el-button>
|
<el-table :data="attributes">
|
<el-table-column property="attribute" label="参数名称" />
|
<el-table-column property="value" label="参数值" />
|
<el-table-column
|
align="center"
|
label="操作"
|
width="100"
|
class-name="small-padding fixed-width"
|
>
|
<template slot-scope="scope">
|
<el-button type="danger" size="mini" @click="handleAttributeDelete(scope.row)">删除</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
|
<el-dialog :visible.sync="attributeVisiable" title="设置商品参数">
|
<el-form
|
ref="attributeForm"
|
:model="attributeForm"
|
:rules="attrRules"
|
:data = "attributes"
|
status-icon
|
label-position="left"
|
label-width="100px"
|
style="width: 400px; margin-left:50px;"
|
>
|
<el-form-item label="参数名称" prop="attribute">
|
<el-input v-model="attributeForm.attribute" />
|
</el-form-item>
|
<el-form-item label="参数值" prop="value">
|
<el-input v-model="attributeForm.value" />
|
</el-form-item>
|
</el-form>
|
<div slot="footer" class="dialog-footer">
|
<el-button @click="attributeVisiable = false">取消</el-button>
|
<el-button type="primary" @click="handleAttributeAdd">确定</el-button>
|
</div>
|
</el-dialog>
|
</el-card>
|
|
<el-card class="box-card">
|
<h3><span style="color: red"> * </span><span>规格维度</span><el-tooltip class="item" effect="dark" content="添加例如 颜色,尺码等规格维度(至少存在一个规格维度)" placement="top-start">
|
<i class="el-icon-question" />
|
</el-tooltip></h3>
|
<el-button :plain="true" type="primary" @click="createSpecDialogShow">添加</el-button>
|
<el-table :data="specList">
|
<el-table-column property="id" label="维度Id"/>
|
<el-table-column property="title" label="维度名称" />
|
<el-table-column property="gmtCreate" label="创建时间" >
|
<template slot-scope="scope">{{ scope.row.gmtCreate | formatTime }}</template>
|
</el-table-column>
|
<el-table-column
|
align="center"
|
label="操作"
|
width="180"
|
class-name="small-padding fixed-width"
|
>
|
<template slot-scope="scope">
|
<el-button type="primary" size="mini" @click="updateSpecDialogShow(scope.row)">修改</el-button>
|
<el-button type="danger" size="mini" @click="handleSpecDelete(scope.row)">删除</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
|
<!-- 添加规格的Dialog -->
|
<el-dialog :visible.sync="specVisiable" :title="specStatusDialogMap[specStatus]">
|
<el-form
|
ref="specForm"
|
:model="specForm"
|
:rules="specRules"
|
status-icon
|
label-position="left"
|
label-width="100px"
|
style="width: 400px; margin-left:50px;"
|
>
|
<el-input v-model="specForm.id" type="hidden" />
|
<el-form-item label="类型名称" prop="title">
|
<el-input v-model="specForm.title" />
|
</el-form-item>
|
</el-form>
|
<div slot="footer" class="dialog-footer">
|
<el-button @click="specVisiable = false">取消</el-button>
|
<el-button type="primary" @click="handleSpecAdd">确定</el-button>
|
</div>
|
</el-dialog>
|
</el-card>
|
|
<el-card class="box-card">
|
<div slot="header" class="clearfix">
|
<h3><span style="color: red"> * </span><span>商品(Sku)详情</span></h3>
|
<el-button :plain="true" type="primary" @click="skuBatchPriceVisiable = true">批量定价</el-button>
|
</div>
|
<div v-for="(item, index) in specList" :key="index" class="tag-group">
|
<el-tag
|
size="medium"
|
type="warning"
|
>
|
{{ item.title }}
|
</el-tag>
|
<el-tag
|
v-for="tag in item.values"
|
:key="tag"
|
:disable-transitions="false"
|
size="medium"
|
closable
|
@close="handleSkuTagClose(index, tag, item)">
|
{{ tag }}
|
</el-tag>
|
<el-input
|
v-if="item.inputSkuTagVisible"
|
v-model="item.inputSkuTagValue"
|
class="input-new-tag"
|
size="small"
|
maxlength="30"
|
@keyup.enter.native="handleSkuTagInputConfirm(index, item)"
|
@blur="handleSkuTagInputConfirm(index, item)"
|
/>
|
<el-button v-else class="button-new-tag" size="small" @click="handleSkuTagCreate(item)">+ 添加</el-button>
|
|
</div>
|
<el-table
|
:data="skuTableData"
|
:span-method="skuTableSpanMethod"
|
border
|
style="width: 100%; margin-top: 20px">
|
<el-table-column
|
v-for="(item, index) in specList"
|
:key="index"
|
:prop="'id_' + item.title"
|
:label="item.title"
|
width="120"/>
|
<el-table-column
|
prop="id"
|
label="SkuId"
|
width="80"/>
|
<el-table-column
|
width="155"
|
prop="price"
|
label="¥价格(元)">
|
<template slot-scope="scope">
|
<el-input-number v-model="scope.row.priceRaw" :precision="2" :min="0.01" :max="2147483647" size="small" />
|
</template>
|
</el-table-column>
|
<el-table-column
|
prop="originalPrice"
|
width="155"
|
label="¥VIP价(元)">
|
<template slot-scope="scope">
|
<el-input-number v-model="scope.row.vipPriceRaw" :precision="2" :min="0.01" :max="2147483647" size="small" />
|
</template>
|
</el-table-column>
|
<el-table-column
|
prop="originalPrice"
|
width="155"
|
label="¥吊牌价(元)">
|
<template slot-scope="scope">
|
<el-input-number v-model="scope.row.originalPriceRaw" :precision="2" :min="0.01" :max="2147483647" size="small" />
|
</template>
|
</el-table-column>
|
<el-table-column
|
:label="'库存(' + (product.unit ? product.unit : '件') + ')'"
|
width="155"
|
prop="stock">
|
<template slot-scope="scope">
|
<el-input-number v-model="scope.row.stock" :precision="0" :max="2147483647" :min="0" size="small" />
|
</template>
|
</el-table-column>
|
<el-table-column
|
label="重量(克)"
|
width="155"
|
prop="stock">
|
<template slot-scope="scope">
|
<el-input-number v-model="scope.row.weight" :precision="0" :max="2147483647" :min="0" size="small" />
|
</template>
|
</el-table-column>
|
<el-table-column
|
prop="img"
|
width="85"
|
label="SKU图片">
|
<template slot-scope="scope">
|
<!-- on-success 接收的是一个变量,而非事件,也就是说是一个函数指针,所以无法将row给传过去 -->
|
<el-upload
|
:headers="headers"
|
:show-file-list="false"
|
:on-success="(e, file) => {
|
handleSkuImgSuccess(e, file, scope)
|
}"
|
:before-upload="beforSkuImgUpload"
|
:action="uploadPath"
|
accept=".jpg, .jpeg, .png, .gif"
|
class="sku-uploader">
|
<img v-if="scope.row.img" :src="scope.row.img" class="sku">
|
<i v-else class="el-icon-plus sku-uploader-icon"/>
|
</el-upload>
|
</template>
|
</el-table-column>
|
<el-table-column
|
prop="barCode"
|
width="210"
|
label="条形码">
|
<template slot-scope="scope">
|
<el-input v-model="scope.row.barCode" maxlength="200">
|
<el-button slot="append" @click="randonBarcode(scope.row)">随机</el-button>
|
</el-input>
|
</template>
|
</el-table-column>
|
<el-table-column
|
prop=""
|
label=""/>
|
</el-table>
|
|
<!-- 批量定价Dialog -->
|
<el-dialog :visible.sync="skuBatchPriceVisiable" title="批量定价">
|
<el-form
|
ref="skuBatchPriceForm"
|
:model="skuBatchPriceForm"
|
status-icon
|
label-position="left"
|
label-width="100px"
|
style="width: 400px; margin-left:50px;"
|
>
|
<el-form-item label="现价(¥)" prop="price">
|
<el-input-number v-model="skuBatchPriceForm.price" :precision="2" :min="0.01" :max="2147483647" size="small" />
|
</el-form-item>
|
<el-form-item label="VIP价格(¥)" prop="vipPrice">
|
<el-input-number v-model="skuBatchPriceForm.vipPrice" :precision="2" :min="0.01" :max="2147483647" size="small" />
|
</el-form-item>
|
<el-form-item label="吊牌价(¥)" prop="originalPrice">
|
<el-input-number v-model="skuBatchPriceForm.originalPrice" :precision="2" :min="0.01" :max="2147483647" size="small" />
|
</el-form-item>
|
</el-form>
|
<div slot="footer" class="dialog-footer">
|
<el-button @click="skuBatchPriceVisiable = false">取消</el-button>
|
<el-button type="primary" @click="handleBatchPrice">确定</el-button>
|
</div>
|
</el-dialog>
|
</el-card>
|
|
<div class="op-container">
|
<el-button @click="handleCancel">取消</el-button>
|
<el-button v-if="!product.id" type="primary" @click="handleUpsert('create')">保存商品</el-button>
|
<el-button v-if="product.id" type="primary" @click="handleUpsert('edit')">更新商品</el-button>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import { detailProduct, editProduct, createProduct } from '@/api/product'
|
import { categoryTree } from '@/api/category'
|
import { listFreight } from '@/api/freight'
|
import { uploadPath, createStorage } from '@/api/storage'
|
import Editor from '@tinymce/tinymce-vue'
|
import { MessageBox } from 'element-ui'
|
import { getToken } from '@/utils/auth'
|
export default {
|
name: 'ProductUpsert',
|
components: { Editor },
|
data() {
|
return {
|
uploadPath,
|
freightList: [],
|
imgsFileList: [],
|
categoryList: [],
|
categoryIds: [],
|
skuTableData: [],
|
product: {
|
imgList: [],
|
type: 0
|
},
|
attributeVisiable: false,
|
attributeForm: { attribute: '', value: '' },
|
attributes: [],
|
skuBatchPriceVisiable: false,
|
skuBatchPriceForm: {},
|
specVisiable: false,
|
specForm: { title: undefined },
|
skuList: [],
|
specList: [],
|
skuStatusDialogMap: { 'create': '创建sku', 'update': '更新sku' },
|
specStatusDialogMap: { 'create': '创建规格', 'update': '更新规格' },
|
skuStatus: '',
|
specStatus: '',
|
rules: {
|
categoryId: [
|
{ required: true, message: '请选择商品类目', trigger: 'blur' }
|
],
|
status: [
|
{ required: true, message: '请选择商品状态', trigger: 'blur' }
|
],
|
title: [
|
{ required: true, message: '商品名称不能为空', trigger: 'blur' }
|
],
|
unit: [
|
{ required: true, message: '物件单位不能为空', trigger: 'blur' }
|
],
|
detail: [
|
{ required: true, message: '请填写商品详情', trigger: 'blur' }
|
],
|
freightTemplateId: [
|
{ required: true, message: '请选择运费模板', trigger: 'blur' }
|
]
|
},
|
specRules: {
|
title: [
|
{ required: true, message: '规格维度标题不能为空', trigger: 'blur' }
|
]
|
},
|
attrRules: {
|
attribute: [
|
{ required: true, message: '属性名称不能为空', trigger: 'blur' }
|
],
|
value: [
|
{ required: true, message: '属性值不能为空', trigger: 'blur' }
|
]
|
},
|
editorInit: {
|
language: 'zh_CN',
|
convert_urls: false,
|
plugins: ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools importcss insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount'],
|
toolbar: ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen'],
|
images_upload_handler: function(blobInfo, success, failure) {
|
const formData = new FormData()
|
formData.append('file', blobInfo.blob())
|
createStorage(formData).then(res => {
|
success(res.data.url)
|
}).catch(() => {
|
failure('上传失败,请重新上传')
|
})
|
}
|
}
|
|
}
|
},
|
computed: {
|
headers() {
|
return {
|
ADMINTOKEN: getToken()
|
}
|
}
|
},
|
created() {
|
this.init()
|
},
|
methods: {
|
init: function() {
|
const productId = this.$route.query.id
|
if (productId) {
|
detailProduct(productId).then(response => {
|
// 将分转换为元
|
response.data.data.priceRaw = response.data.data.price / 100
|
response.data.data.originalPriceRaw = response.data.data.originalPrice / 100
|
response.data.data.vipPriceRaw = response.data.data.vipPrice / 100
|
// 深拷贝
|
this.product = JSON.parse(JSON.stringify(response.data.data))
|
this.attributes = response.data.data.attributeList ? response.data.data.attributeList : []
|
this.categoryIds = response.data.data.categoryIds
|
this.skuList = response.data.data.skuList
|
for (let i = 0; i < response.data.data.specificationList.length; i++) {
|
response.data.data.specificationList[i].values = []
|
response.data.data.specificationList[i].inputSkuTagValue = false
|
response.data.data.specificationList[i].inputSkuTagValue = ''
|
}
|
// spu规格列表
|
this.specList = response.data.data.specificationList
|
this.imgsFileList = []
|
for (var i = 0; i < this.product.imgList.length; i++) {
|
this.imgsFileList.push({
|
url: this.product.imgList[i]
|
})
|
}
|
let stock = 0
|
if (this.product.skuList) {
|
for (var j = 0; j < this.product.skuList.length; j++) {
|
this.skuList[j].priceRaw = this.skuList[j].price / 100
|
this.skuList[j].originalPriceRaw = this.skuList[j].originalPrice / 100
|
this.skuList[j].vipPriceRaw = this.skuList[j].vipPrice / 100
|
stock += this.skuList[j].stock
|
}
|
}
|
this.product.stock = stock
|
if (this.product.skuList) {
|
this.product.skuList.forEach(item => {
|
this.product.stock += item.stock
|
item.priceRaw = item.price / 100
|
item.originalPriceRaw = item.originalPrice / 100
|
item.vipPriceRaw = item.vipPrice / 100
|
const tempArray = item.specification.split(',')
|
for (let i = 0; i < tempArray.length; i++) {
|
const skuSpecTemp = tempArray[i]
|
const singleArray = skuSpecTemp.split('_')
|
item['id_' + singleArray[0]] = singleArray[1]
|
for (let j = 0; j < this.specList.length; j++) {
|
if (this.specList[j].title === singleArray[0]) {
|
// 若是同一个Key。则将value追加到其values里面
|
if (this.specList[j].values) {
|
if (this.specList[j].values.indexOf(singleArray[1]) < 0) {
|
this.specList[j].values.push(singleArray[1])
|
}
|
} else {
|
this.specList[j].inputSkuTagVisible = false
|
this.specList[j].inputSkuTagValue = ''
|
this.specList[j].values = [singleArray[1]]
|
}
|
}
|
}
|
}
|
})
|
}
|
this.product.skuList.sort((sku1, sku2) => {
|
const key1 = this.getSortKey(sku1.specification)
|
const key2 = this.getSortKey(sku2.specification)
|
return key1.localeCompare(key2)
|
})
|
this.skuTableData = JSON.parse(JSON.stringify(this.product.skuList))
|
})
|
}
|
|
categoryTree().then(response => {
|
this.categoryList = response.data.data
|
})
|
|
listFreight().then(response => {
|
this.freightList = response.data.data
|
})
|
},
|
getSortKey(specification) {
|
// 尺码_S,颜色_经典款短袖黑色A
|
const array1 = specification.split(',')
|
let str = ''
|
for (let i = 0; i < array1.length; i++) {
|
const array2 = array1[i].split('_')
|
str += array2[0] + '_'
|
}
|
for (let i = 0; i < array1.length; i++) {
|
const array2 = array1[i].split('_')
|
str += array2[1] + '_'
|
}
|
// 尺码_颜色_S_经典款短袖黑色A_
|
return str
|
},
|
handleCategoryChange(value) {
|
this.product.categoryId = value[value.length - 1]
|
},
|
handleCancel: function() {
|
this.$router.push({ path: '/product/list' })
|
},
|
/**
|
* 执行更新添加操作,传入操作action字符串: 'create', 'edit'
|
*/
|
handleUpsert(action) {
|
this.$refs['dataForm'].validate(valid => {
|
if (valid) {
|
if (this.product.freightTemplateId === undefined || this.product.freightTemplateId === null) {
|
this.$notify.error({
|
title: '失败',
|
message: '请添加运费模板'
|
})
|
} else if (this.skuTableData.length === 0) {
|
this.$notify.error({
|
title: '失败',
|
message: '请添加类型(Sku)'
|
})
|
} else if (this.categoryIds.length !== 2) {
|
this.$notify.error({
|
title: '失败',
|
message: '请选择(第二级)类目'
|
})
|
} else if (this.product.imgList.length === 0) {
|
this.$notify.error({
|
title: '失败',
|
message: '请上传至少一张图片'
|
})
|
} else {
|
this.product.categoryId = this.categoryIds[1]
|
this.product.price = parseInt(this.product.priceRaw * 100)
|
this.product.originalPrice = parseInt(this.product.originalPriceRaw * 100)
|
this.product.vipPrice = parseInt(this.product.vipPriceRaw * 100)
|
this.product.specificationList = this.specList
|
const skuList = []
|
for (let i = 0; i < this.skuTableData.length; i++) {
|
let title = ''
|
let specification = ''
|
for (const field in this.skuTableData[i]) {
|
if (field.startsWith('id_')) {
|
title += (this.skuTableData[i][field] + ',')
|
specification += (field.substring(3) + '_' + this.skuTableData[i][field] + ',')
|
}
|
}
|
title = title.substring(0, title.length - 1)
|
specification = specification.substring(0, specification.length - 1)
|
const sku = {
|
originalPrice: parseInt(this.skuTableData[i].originalPriceRaw * 100),
|
price: parseInt(this.skuTableData[i].priceRaw * 100),
|
vipPrice: parseInt(this.skuTableData[i].vipPriceRaw * 100),
|
stock: this.skuTableData[i].stock,
|
barCode: this.skuTableData[i].barCode,
|
weight: this.skuTableData[i].weight,
|
img: this.skuTableData[i].img,
|
title,
|
specification
|
}
|
if (this.skuTableData[i].id) {
|
// 编辑SKU情况下,加上SkuId
|
sku.id = this.skuTableData[i].id
|
}
|
skuList.push(sku)
|
}
|
const finalProduct = {
|
...this.product,
|
attributeList: this.attributes,
|
skuList: skuList
|
}
|
let method = createProduct
|
let successWords = '创建成功'
|
if (action === 'edit') {
|
method = editProduct
|
successWords = '编辑成功'
|
}
|
method(finalProduct)
|
.then(response => {
|
this.$notify.success({
|
title: '成功',
|
message: successWords
|
})
|
this.$router.push({ path: '/product/list' })
|
})
|
.catch(response => {
|
MessageBox.alert('业务错误:' + response.data.errmsg, '警告', {
|
confirmButtonText: '确定',
|
type: 'error'
|
})
|
})
|
}
|
} else {
|
this.$notify.error({
|
title: '失败',
|
message: '请完善以上表单'
|
})
|
}
|
})
|
},
|
handleAttributeShow() {
|
this.attributeForm = {}
|
this.attributeVisiable = true
|
},
|
handleAttributeAdd() {
|
this.$refs['attributeForm'].validate(valid => {
|
if (valid) {
|
this.attributes.unshift(this.attributeForm)
|
this.attributeVisiable = false
|
}
|
})
|
},
|
handleAttributeDelete(row) {
|
const index = this.attributes.indexOf(row)
|
this.attributes.splice(index, 1)
|
},
|
// SKU相关
|
handleSkuTagClose(index, tag, item) {
|
item.values.splice(item.values.indexOf(tag), 1)
|
this.loadSkuTable()
|
},
|
skuTableSpanMethod({ row, column, rowIndex, columnIndex }) {
|
if (columnIndex < this.specList.length) {
|
// 若是前N列
|
// 后面N - 1个
|
let ji = 1
|
for (let z = columnIndex + 1; z < this.specList.length; z++) {
|
ji = ji * this.specList[z].values.length
|
}
|
if (rowIndex % ji === 0) {
|
return {
|
rowspan: ji, // 后面的乘积
|
colspan: 1
|
}
|
} else {
|
return {
|
rowspan: 0,
|
colspan: 0
|
}
|
}
|
} else {
|
return {
|
rowspan: 1,
|
colspan: 1
|
}
|
}
|
},
|
loadSkuTable() {
|
// 从specList中获取数据
|
const attrList = this.specList
|
const cacheTable = this.skuTableData
|
let newTable = []
|
|
for (let i = 0; i < attrList.length; i++) {
|
const attr = attrList[i]
|
const tmpArray = []
|
|
if (i === 0) {
|
for (let j = 0; j < attr.values.length; j++) {
|
const tempTemp = []
|
tempTemp.push(attr.values[j])
|
tmpArray.push(tempTemp)
|
}
|
newTable = tmpArray
|
} else {
|
for (let z = 0; z < newTable.length; z++) {
|
for (let j = 0; j < attr.values.length; j++) {
|
const tempTemp = Object.assign([], newTable[z])
|
tempTemp.push(attr.values[j])
|
tmpArray.push(tempTemp)
|
}
|
}
|
newTable = tmpArray
|
}
|
}
|
const finalNewTable = []
|
for (let i = 0; i < newTable.length; i++) {
|
const obj = {}
|
for (let j = 0; j < newTable[i].length; j++) {
|
obj['id_' + attrList[j].title] = newTable[i][j]
|
}
|
for (let j = 0; j < cacheTable.length; j++) {
|
let equals = true
|
for (let z = 0; z < this.specList.length; z++) {
|
const title = this.specList[z].title
|
if (cacheTable[j]['id_' + title] !== obj['id_' + title]) {
|
equals = false
|
}
|
}
|
if (equals) {
|
obj.originalPrice = cacheTable[j].originalPrice
|
obj.price = cacheTable[j].price
|
obj.originalPriceRaw = cacheTable[j].originalPriceRaw
|
obj.vipPrice = cacheTable[j].vipPrice
|
obj.vipPriceRaw = cacheTable[j].vipPriceRaw
|
obj.priceRaw = cacheTable[j].priceRaw
|
obj.stock = cacheTable[j].stock
|
obj.barCode = cacheTable[j].barCode
|
obj.weight = cacheTable[j].weight
|
obj.id = cacheTable[j].id
|
}
|
}
|
// 从缓存表中加上默认的值
|
finalNewTable.push(obj)
|
}
|
// 变成对象
|
this.skuTableData = finalNewTable
|
},
|
handleSkuTagInputConfirm(index, item) {
|
const inputSkuTagValue = item.inputSkuTagValue
|
if (item.values.indexOf(inputSkuTagValue) > -1) {
|
this.$notify.warning({
|
title: '失败',
|
message: '请不要添加重复属性'
|
})
|
} else {
|
if (inputSkuTagValue) {
|
item.values.push(inputSkuTagValue)
|
}
|
}
|
item.inputSkuTagVisible = false
|
item.inputSkuTagValue = ''
|
this.loadSkuTable()
|
},
|
handleSkuTagCreate(item) {
|
item.inputSkuTagVisible = true
|
this.$forceUpdate()
|
},
|
// 规格相关代码START
|
createSpecDialogShow() {
|
this.specStatus = 'create'
|
this.specForm = {}
|
this.specVisiable = true
|
},
|
updateSpecDialogShow(row) {
|
this.specStatus = 'update'
|
this.specForm = Object.assign({}, row)
|
this.specVisiable = true
|
},
|
handleSpecAdd() {
|
this.$refs['specForm'].validate(valid => {
|
if (valid) {
|
const title = this.specForm.title
|
// 重复校验
|
if (this.specList.indexOf(title) >= 0) {
|
this.$notify.error({
|
title: '失败',
|
message: '规格维度不能重复'
|
})
|
return
|
}
|
const obj = Object.assign({}, this.specForm)
|
obj.values = []
|
obj.inputSkuTagVisible = false
|
obj.gmtCreate = new Date().getTime()
|
this.specList.push(obj)
|
this.specVisiable = false
|
}
|
})
|
},
|
handleSpecDelete(row) {
|
const index = this.specList.indexOf(row)
|
this.specList.splice(index, 1)
|
},
|
randonBarcode(row) {
|
row.barCode = new Date().getTime() + ''
|
this.$forceUpdate()
|
},
|
handleBatchPrice() {
|
for (let i = 0; i < this.skuTableData.length; i++) {
|
if (this.skuBatchPriceForm.price) {
|
this.skuTableData[i].priceRaw = this.skuBatchPriceForm.price
|
}
|
if (this.skuBatchPriceForm.vipPrice) {
|
this.skuTableData[i].vipPriceRaw = this.skuBatchPriceForm.vipPrice
|
}
|
if (this.skuBatchPriceForm.originalPrice) {
|
this.skuTableData[i].originalPriceRaw = this.skuBatchPriceForm.originalPrice
|
}
|
}
|
this.skuBatchPriceVisiable = false
|
},
|
/** ******************* 图片上传相关 *********************/
|
uploadOverrun: function() {
|
this.$message({
|
type: 'error',
|
message: '上传文件个数超出限制!最多上传5张图片!'
|
})
|
},
|
handleimgsUrl(response, file, fileList) {
|
if (response.errno === 200) {
|
this.product.imgList.push(response.url)
|
this.product.img = this.product.imgList[0]
|
}
|
},
|
handleRemove: function(file, fileList) {
|
for (var i = 0; i < this.product.imgList.length; i++) {
|
// 这里存在两种情况
|
// 1. 如果所删除图片是刚刚上传的图片,那么图片地址是file.response.url
|
// 此时的file.url虽然存在,但是是本机地址,而不是远程地址。
|
// 2. 如果所删除图片是后台返回的已有图片,那么图片地址是file.url
|
var url
|
if (file.response === undefined) {
|
url = file.url
|
} else {
|
url = file.response.url
|
}
|
|
if (this.product.imgList[i] === url) {
|
this.product.imgList.splice(i, 1)
|
}
|
}
|
if (this.product.imgList.length > 0) {
|
this.product.img = this.product.imgList[0]
|
}
|
},
|
beforSkuImgUpload(file) {
|
const isLt2M = file.size / 1024 / 1024 < 1
|
if (!isLt2M) {
|
this.$message.error('上传头像图片大小不能超过 1MB!')
|
}
|
return isLt2M
|
},
|
handleSkuImgSuccess(e, file, scope) {
|
this.$set(this.skuTableData[scope.$index], 'img', e.url)
|
}
|
|
}
|
}
|
</script>
|
|
<style>
|
.el-card {
|
margin-bottom: 10px;
|
}
|
.el-tag + .el-tag {
|
margin-left: 10px;
|
}
|
.input-new-keyword {
|
width: 90px;
|
margin-left: 10px;
|
vertical-align: bottom;
|
}
|
.avatar-uploader .el-upload {
|
border: 1px dashed #d9d9d9;
|
border-radius: 6px;
|
cursor: pointer;
|
position: relative;
|
overflow: hidden;
|
}
|
.avatar-uploader .el-upload:hover {
|
border-color: #20a0ff;
|
}
|
.avatar-uploader-icon {
|
font-size: 28px;
|
color: #8c939d;
|
width: 120px;
|
height: 120px;
|
line-height: 120px;
|
text-align: center;
|
}
|
|
.avatar {
|
width: 145px;
|
height: 145px;
|
display: block;
|
}
|
|
.sku-uploader .el-upload {
|
border: 1px dashed #d9d9d9;
|
border-radius: 6px;
|
cursor: pointer;
|
position: relative;
|
overflow: hidden;
|
}
|
.sku-uploader .el-upload:hover {
|
border-color: #20a0ff;
|
}
|
.sku-uploader-icon {
|
font-size: 28px;
|
color: #8c939d;
|
width: 60px;
|
height: 60px;
|
line-height: 60px;
|
text-align: center;
|
}
|
|
.sku {
|
width: 60px;
|
height: 60px;
|
display: block;
|
}
|
|
.input-new-tag {
|
width: 90px;
|
margin-left: 10px;
|
vertical-align: bottom;
|
}
|
</style>
|