圣诞快乐

# v1.3 更新列表
    1. 【新增】砍价
	2. 【新增】拼团
	3. 【新增】一号通
	4. 【修复】商品sku 编辑时出现商品属性对应错误的问题
	5. 【修复】商品推广海报生成二维码可能会出错的问题【小程序调试中】
	6. 【修复】微信公众号和小程序头像可能获取不到的问题
	7. 【修复】下单时可能会出错的问题
	8. 【修复】pc管理端用户访问量
	9. 【修复】微信退款
	10. 【修复】管理端订单状态可能出现不正确的情况
	11. 【修复】WEB管理端-菜单色调,短信API更新,首页用户访问量,系统设置tab是自动选择下一及表单
	12. 【修复】系统设置出现更新不正确的问题
This commit is contained in:
stivepeim
2020-12-23 15:56:45 +08:00
parent d5fc46a211
commit 099fc3de81
768 changed files with 40200 additions and 46123 deletions

View File

@@ -14,7 +14,7 @@
<!-- 商品信息-->
<el-col v-bind="grid2">
<el-form-item label="商品名称:" prop="storeName">
<el-input v-model="formValidate.storeName" placeholder="请输入商品名称" />
<el-input v-model="formValidate.storeName" maxlength="249" placeholder="请输入商品名称" />
</el-form-item>
</el-col>
<el-col v-bind="grid2">
@@ -34,7 +34,7 @@
</el-col>
<el-col v-bind="grid2">
<el-form-item label="商品简介:">
<el-input v-model="formValidate.storeInfo" type="textarea" :rows="3" placeholder="请输入商品简介" />
<el-input v-model="formValidate.storeInfo" type="textarea" maxlength="250" :rows="3" placeholder="请输入商品简介" />
</el-form-item>
</el-col>
<el-col v-bind="grid2">
@@ -63,7 +63,7 @@
<img :src="item">
<i class="el-icon-error btndel" @click="handleRemove(index)" />
</div>
<div class="upLoadPicBox" @click="modalPicTap('2')">
<div v-if="formValidate.sliderImages.length<10" class="upLoadPicBox" @click="modalPicTap('2')">
<div class="upLoad">
<i class="el-icon-camera cameraIconfont" />
</div>
@@ -329,19 +329,17 @@
<el-input v-model="scope.row[iii]" :type="formThead[iii].title==='商品编号'?'text':'number'" class="priceBox" />
</template>
</el-table-column>
<template v-if="formValidate.isSub">
<el-table-column align="center" label="一级返佣(元)" min-width="120">
<template slot-scope="scope">
<el-input v-model="scope.row.brokerage" type="number" :min="0" class="priceBox" />
</template>
</el-table-column>
<el-table-column align="center" label="二级返佣(元)" min-width="120">
<template slot-scope="scope">
<el-input v-model="scope.row.brokerageTwo" type="number" :min="0" class="priceBox" />
</template>
</el-table-column>
</template>
<el-table-column align="center" label="操作" min-width="80">
<el-table-column align="center" label="一级返佣(元)" min-width="120" v-if="formValidate.isSub">
<template slot-scope="scope">
<el-input v-model="scope.row.brokerage" type="number" :min="0" class="priceBox" />
</template>
</el-table-column>
<el-table-column align="center" label="二级返佣(元)" min-width="120" v-if="formValidate.isSub">
<template slot-scope="scope">
<el-input v-model="scope.row.brokerageTwo" type="number" :min="0" class="priceBox" />
</template>
</el-table-column>
<el-table-column key="3" align="center" label="操作" min-width="80">
<template slot-scope="scope">
<el-button type="text" class="submission" @click="delAttrTable(scope.$index)">删除</el-button>
</template>
@@ -366,6 +364,7 @@
import { shippingTemplatesList } from '@/api/logistics'
import { clearTreeData } from '@/utils/ZBKJIutil'
import CreatTemplates from '@/views/systemSetting/logistics/shippingTemplates/creatTemplates'
import Templates from "../../appSetting/wxAccount/wxTemplate/index";
const defaultObj = {
image: '',
sliderImages: [],
@@ -432,7 +431,7 @@
const proOptions = [{ name: '是否热卖', value: 'isHot' }, { name: '优品推荐', value: 'isGood' }, { name: '促销单品', value: 'isBenefit' }, { name: '是否精品', value: 'isBest' }, { name: '是否新品', value: 'isNew' }]
export default {
name: 'ProductProductAdd',
components: { CreatTemplates },
components: {Templates, CreatTemplates },
data() {
return {
activity: { '默认': 'red', '秒杀': 'blue', '砍价': 'green', '拼团': 'yellow' },
@@ -525,7 +524,8 @@
keywords: ''
},
tempRoute: {},
keyNum: 0
keyNum: 0,
isAttr: false
}
},
computed: {
@@ -543,7 +543,7 @@
watch: {
'formValidate.attr': {
handler: function(val) {
if (this.formValidate.specType) this.watCh(val)
if (this.formValidate.specType && this.isAttr) this.watCh(val)
},
immediate: false,
deep: true
@@ -571,6 +571,7 @@
},
methods: {
handleCloseCoupon(tag) {
this.isAttr = true
this.formValidate.coupons.splice(this.formValidate.coupons.indexOf(tag), 1)
},
addCoupon() {
@@ -697,10 +698,12 @@
},
// 选择规格
onChangeSpec(num) {
this.isAttr = true;
if (num) this.productGetRule()
},
// 选择属性确认
confirm() {
this.isAttr = true
if (!this.formValidate.selectRule) {
return this.$message.warning('请选择属性')
}
@@ -810,6 +813,7 @@
},
// 删除规格
handleRemoveAttr(index) {
this.isAttr = true
this.formValidate.attr.splice(index, 1)
this.manyFormValidate.splice(index, 1)
},
@@ -819,6 +823,7 @@
},
// 添加规则名称
createAttrName() {
this.isAttr = true
if (this.formDynamic.attrsName && this.formDynamic.attrsVal) {
const data = {
attrName: this.formDynamic.attrsName,
@@ -841,6 +846,7 @@
},
// 添加属性
createAttr (num, idx) {
this.isAttr = true
if (num) {
this.formValidate.attr[idx].attrValue.push(num);
var hash = {};
@@ -858,6 +864,7 @@
getInfo () {
this.fullscreenLoading = true
productDetailApi(this.$route.params.id).then(async res => {
this.isAttr = false;
let info = res
this.formValidate = {
image: info.image,
@@ -903,10 +910,20 @@
// inputVisible: false
}
})
this.ManyAttrValue = info.attrValues
this.ManyAttrValue = info.attrValues;
this.ManyAttrValue.forEach((val) => {
this.attrInfo[Object.values(val.attrValue).sort().join('/')] = val
})
const tmp = {}
const tmpTab = {}
this.formValidate.attr.forEach((o, i) => {
tmp['value' + i] = { title: o.attrName }
tmpTab['value' + i] = ''
})
this.manyTabTit = tmp
this.manyTabDate = tmpTab
this.formThead = Object.assign({}, this.formThead, tmp)
}else{
this.OneattrValue = info.attrValue
this.formValidate.attr = []
@@ -929,6 +946,8 @@
_this.OneattrValue[0].image = img[0].sattDir
}
if(tit==='2'&& !num){
if(img.length>10) return this.$message.warning("最多选择10张图片");
if(img.length + _this.formValidate.sliderImages.length > 10) return this.$message.warning("最多选择10张图片");
img.map((item) => {
_this.formValidate.sliderImages.push(item.sattDir)
});
@@ -949,19 +968,17 @@
if (this.currentTab-- <0) this.currentTab = 0;
},
handleSubmitNest(name){
if (this.currentTab++ > 2) this.currentTab = 0
// this.$refs[name].validate((valid) => {
// if (valid) {
// if (this.currentTab++ > 2) this.currentTab = 0;
// // this.currentTab=1
// } else {
// 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("请填写完整商品信息!");
// }
// }
// })
this.$refs[name].validate((valid) => {
if (valid) {
if (this.currentTab++ > 2) this.currentTab = 0;
} else {
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("请填写完整商品信息!");
}
}
})
},
// 提交
handleSubmit (name) {

View File

@@ -11,7 +11,7 @@
<el-cascader v-model="tableFrom.cateId" :options="merCateList" :props="props" clearable class="selWidth mr20" @change="seachList" size="small"/>
</el-form-item>
<el-form-item label="商品搜索:">
<el-input v-model="tableFrom.keywords" placeholder="请输入商品名称关键字商品ID" class="selWidth" size="small">
<el-input v-model="tableFrom.keywords" placeholder="请输入商品名称关键字商品ID" class="selWidth" size="small" clearable>
<el-button slot="append" icon="el-icon-search" @click="seachList" size="small"/>
</el-input>
</el-form-item>
@@ -20,7 +20,7 @@
<router-link :to=" { path:'/store/list/creatProduct' } ">
<el-button size="small" type="primary" class="mr10">添加商品</el-button>
</router-link>
<el-button size="small" type="success" class="mr10" @click="onCopy">复制淘宝天猫拼多多京东苏宁</el-button>
<el-button size="small" type="success" class="mr10" @click="onCopy">商品采集</el-button>
<el-button size="small" @click="exports">导出</el-button>
</div>
<el-table
@@ -116,13 +116,13 @@
<span>{{scope.row.addTime | formatDate}}</span>
</template>
</el-table-column>
<el-table-column label="操作" min-width="120" fixed="right" align="center">
<el-table-column label="操作" min-width="150" fixed="right" align="center">
<template slot-scope="scope">
<router-link :to="{path: '/store/list/creatProduct/' + scope.row.id}">
<el-button type="text" size="small" class="mr10">编辑</el-button>
</router-link>
<el-button v-if="tableFrom.type === '5'" type="text" size="small" @click="handleRestore(scope.row.id, scope.$index)">恢复商品</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.id, scope.$index)">{{ tableFrom.type === '5' ? '删除' : '加入回收站' }}</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.id, tableFrom.type)">{{ tableFrom.type === '5' ? '删除' : '加入回收站' }}</el-button>
</template>
</el-table-column>
</el-table>
@@ -140,19 +140,19 @@
</el-card>
<el-dialog
title="复制淘宝、天猫、拼多多、京东、苏宁"
title="复制淘宝、天猫、京东、苏宁"
:visible.sync="dialogVisible"
width="1000px"
width="1200px"
:modal="false"
class="taoBaoModal"
:before-close="handleClose">
<tao-bao v-if="dialogVisible"></tao-bao>
<tao-bao v-if="dialogVisible" @handleClose="handleClose"></tao-bao>
</el-dialog>
</div>
</template>
<script>
import { productLstApi, productDeleteApi, categoryApi, putOnShellApi, offShellApi, productHeadersApi, productExportApi, restoreApi } from '@/api/store'
import { productLstApi, productDeleteApi, categoryApi, putOnShellApi, offShellApi, productHeadersApi, productExportApi, restoreApi, productExcelApi } from '@/api/store'
import { getToken } from '@/utils/auth'
import taoBao from './taoBao'
export default {
@@ -209,13 +209,21 @@ export default {
handleClose() {
this.dialogVisible = false
},
handleCloseMod(item){
this.dialogVisible = item
this.goodHeade();
this.getList();
},
// 复制
onCopy(){
this.dialogVisible = true
},
// 导出
exports () {
window.open(this.objectUrl + 'admin/export/excel/product?type=1&Authori-zation=' + getToken())
productExcelApi({cateId:this.tableFrom.cateId,keywords: this.tableFrom.keywords, type:this.tableFrom.type}).then((res) => {
window.open(res.fileName)
})
// window.open(this.objectUrl + 'admin/export/excel/product?type=1&Authori-zation=' + getToken())
},
// 获取商品表单头数量
goodHeade () {
@@ -231,6 +239,7 @@ export default {
this.merCateList = res
}).catch(res => {
this.$message.error(res.message)
this.$message.error(res.message)
})
},
// 列表
@@ -270,10 +279,14 @@ export default {
this.$message.success('上架成功')
this.getList()
this.goodHeade();
}).catch(()=>{
row.isShow = !row.isShow
}) : offShellApi(row.id).then(() => {
this.$message.success('下架成功')
this.getList()
this.goodHeade();
}).catch(()=>{
row.isShow = !row.isShow
})
}
}

View File

@@ -5,7 +5,7 @@
<div class="container">
<el-form inline size="small">
<el-form-item label="规格搜索:">
<el-input v-model="tableFrom.keywords" placeholder="请输入商品规格" class="selWidth">
<el-input v-model="tableFrom.keywords" placeholder="请输入商品规格" class="selWidth" clearable>
<el-button slot="append" icon="el-icon-search" @click="seachList" />
</el-input>
</el-form-item>

View File

@@ -46,7 +46,7 @@
<i class="el-icon-error btndel" @click="handleRemove(index)" />
<!--<Button shape="circle" icon="md-close" class="btndel" @click.native="handleRemove(index)" />-->
</div>
<div class="upLoadPicBox" @click="modalPicTap('2')">
<div v-if="pics<10" class="upLoadPicBox" @click="modalPicTap('2')">
<div class="upLoad">
<i class="el-icon-camera cameraIconfont" />
</div>

View File

@@ -17,26 +17,25 @@
</el-select>
</el-form-item>
<el-form-item label="商品搜索:" class="mr10">
<el-input v-model="tableFrom.productSearch" placeholder="请输入商品名称商品id" class="selWidth" size="small">
<el-input v-model="tableFrom.productSearch" placeholder="请输入商品名称商品id" class="selWidth" size="small" clearable>
<el-button slot="append" icon="el-icon-search" @click="seachList" size="small"/>
</el-input>
</el-form-item>
<el-form-item label="用户名称:">
<el-select v-model="uids" class="selWidth" reserve-keyword multiple remote filterable
:remote-method="remoteMethod" :loading="loading" placeholder="请输入用户名称" clearable @change="seachList">
<el-option
v-for="item in options"
:key="item.uid"
:label="item.nickname"
:value="item.uid">
</el-option>
</el-select>
<el-input v-model="tableFrom.nickname" placeholder="请输入用户名称" class="selWidth" size="small" clearable>
<el-button slot="append" icon="el-icon-search" @click="seachList" size="small"/>
</el-input>
</el-form-item>
<!--<el-form-item label="用户名称:">-->
<!--<el-input v-model="tableFrom.nickname" placeholder="请输入用户名称" class="selWidth" size="small">-->
<!--<el-button slot="append" icon="el-icon-search" @click="seachList" size="small"/>-->
<!--</el-input>-->
<!--</el-form-item>-->
<!--<el-select v-model="uids" class="selWidth" reserve-keyword multiple remote filterable-->
<!--:remote-method="remoteMethod" :loading="loading" placeholder="请输入用户名称" clearable @change="seachList">-->
<!--<el-option-->
<!--v-for="item in options"-->
<!--:key="item.uid"-->
<!--:label="item.nickname"-->
<!--:value="item.uid">-->
<!--</el-option>-->
<!--</el-select>-->
</el-form>
</div>
<el-button size="small" type="primary" @click="add">添加虚拟评论</el-button>
@@ -71,9 +70,14 @@
label="用户名称"
min-width="200"
/>
<el-table-column
prop="productScore"
label="商品评分"
min-width="90"
/>
<el-table-column
prop="serviceScore"
label="评分"
label="服务评分"
min-width="90"
/>
<el-table-column
@@ -185,7 +189,8 @@ export default {
limit: 20,
isReply: '',
dateLimit: '',
uid: '',
// uid: '',
nickname: '',
productSearch:'',
isDel: false
},

View File

@@ -1,21 +1,29 @@
<template>
<div class="Box">
<el-card>
<div>生成的商品默认是没有上架的请手动上架商品</div>
<div>生成的商品默认是没有上架的请手动上架商品
<span v-if="copyConfig.copyType && copyConfig.copyType==1">您当前剩余{{copyConfig.copyNum}}条采集次数
<router-link :to="{path:'/operation/onePass'}">
<el-link type="primary" :underline="false">增加采集次数</el-link>
</router-link>
</span>
<el-link v-if="copyConfig.copyType && copyConfig.copyType!=1" type="primary" :underline="false" href="https://www.kancloud.cn/crmeb/crmeb_java/1909022" target="_blank">如何配置密钥</el-link>
<br>
商品采集设置设置 > 系统设置 > 第三方接口设置 > 采集商品配置如配置一号通采集请先登录一号通账号无一号通请选择99Api设置</div>
</el-card>
<el-form class="formValidate mt20" ref="formValidate" :model="formValidate" :rules="ruleInline" label-width="120px"
@submit.native.prevent v-loading="loading">
<el-form-item>
<el-form-item v-if="copyConfig.copyType && copyConfig.copyType!=1">
<el-radio-group v-model="form">
<el-radio :label="1">淘宝</el-radio>
<el-radio :label="2">京东</el-radio>
<el-radio :label="3">苏宁</el-radio>
<el-radio :label="4">拼多多</el-radio>
<!--<el-radio :label="3">苏宁</el-radio>-->
<!--<el-radio :label="4">拼多多</el-radio>-->
<el-radio :label="5">天猫</el-radio>
</el-radio-group>
</el-form-item>
<el-row :gutter="24">
<el-col :span="24">
<el-col :span="24" v-if="copyConfig.copyType">
<el-form-item label="链接地址:">
<el-input v-model="url" placeholder="请输入链接地址" class="selWidth" size="small">
<el-button slot="append" icon="el-icon-search" @click="add" size="small"/>
@@ -25,12 +33,12 @@
<el-col v-if="formValidate">
<el-col :span="24">
<el-form-item label="商品名称:" prop="storeName">
<el-input v-model="formValidate.storeName" placeholder="请输入商品名称"></el-input>
<el-input v-model="formValidate.storeName" maxlength="249" placeholder="请输入商品名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="商品简介:">
<el-input v-model="formValidate.storeInfo" type="textarea" :rows="3" placeholder="请输入商品简介"></el-input>
<el-input v-model="formValidate.storeInfo" maxlength="250" type="textarea" :rows="3" placeholder="请输入商品简介"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
@@ -103,7 +111,7 @@
</div>
</el-form-item>
</el-col>
<el-col v-if="formValidate.specType" :span="24" class="noForm">
<el-col v-if="formValidate.specType || formValidate.attr.length" :span="24" class="noForm">
<el-form-item label="批量设置:" class="labeltop">
<el-table :data="oneFormBatch" border class="tabNumWidth" size="mini">
<el-table-column align="center" label="图片" min-width="80">
@@ -186,13 +194,13 @@
</template>
<script>
import {crawlFromApi, treeListApi, crawlSaveApi, categoryApi, importProductApi, productCreateApi} from '@/api/store';
import {crawlFromApi, treeListApi, crawlSaveApi, categoryApi, importProductApi, productCreateApi, copyConfigApi} from '@/api/store';
import { shippingTemplatesList } from '@/api/logistics'
const defaultObj = [{
image: '',
price: null,
cost: null,
ot_price: null,
otPrice: null,
stock: null,
barCode: '',
weight: null,
@@ -205,7 +213,7 @@
cost: {
title: '成本价'
},
ot_price: {
otPrice: {
title: '原价'
},
stock: {
@@ -274,7 +282,8 @@
md: 12,
sm: 24,
xs: 24
}
},
copyConfig: {}
}
},
created() {
@@ -303,8 +312,18 @@
},
mounted() {
this.productGetTemplate();
this.getCopyConfig();
},
methods: {
// 删除表格中的属性
delAttrTable(index) {
this.ManyAttrValue.splice(index, 1)
},
getCopyConfig(){
copyConfigApi().then(res => {
this.copyConfig = res
})
},
// 批量添加
batchAdd() {
// if (!this.oneFormBatch[0].pic || !this.oneFormBatch[0].price || !this.oneFormBatch[0].cost || !this.oneFormBatch[0].ot_price ||
@@ -313,7 +332,7 @@
this.$set(val, 'image', this.oneFormBatch[0].image)
this.$set(val, 'price', this.oneFormBatch[0].price)
this.$set(val, 'cost', this.oneFormBatch[0].cost)
this.$set(val, 'ot_price', this.oneFormBatch[0].ot_price)
this.$set(val, 'otPrice', this.oneFormBatch[0].otPrice)
this.$set(val, 'stock', this.oneFormBatch[0].stock)
this.$set(val, 'barCode', this.oneFormBatch[0].barCode)
this.$set(val, 'weight', this.oneFormBatch[0].weight)
@@ -350,7 +369,7 @@
image: '',
price: 0,
cost: 0,
ot_price: 0,
otPrice: 0,
stock: 0,
barCode: '',
weight: 0,
@@ -381,7 +400,7 @@
image: '',
price: 0,
cost: 0,
ot_price: 0,
otPrice: 0,
stock: 0,
barCode: '',
weight: 0,
@@ -429,17 +448,16 @@
// }
this.loading = true;
importProductApi({ url: this.url, form: this.form}).then(res => {
let info = res
this.formValidate = {
image: info.image,
sliderImages: JSON.parse(info.sliderImage),
sliderImage: info.sliderImage,
storeName: info.storeName,
storeInfo: info.storeInfo,
keyword: info.keyword,
cateIds: info.cateId ? info.cateId.split(',') : [], // 商品分类id
cateId: info.cateId,// 商品分类id传值
unitName: info.unitName,
image: res.image,
sliderImages: JSON.parse(res.sliderImage),
sliderImage: res.sliderImage,
storeName: res.storeName,
storeInfo: res.storeInfo,
keyword: res.keyword,
cateIds: res.cateId ? res.cateId.split(',') : [], // 商品分类id
cateId: res.cateId,// 商品分类id传值
unitName: res.unitName,
sort: 0,
isShow: 0,
isBenefit: 0,
@@ -447,20 +465,20 @@
isGood: 0,
isHot: 0,
isBest: 0,
tempId: info.tempId,
attrValue: info.attrValue,
attr: info.attr || [],
selectRule: info.selectRule,
tempId: res.tempId,
attrValue: res.attrValue,
attr: res.attr || [],
selectRule: res.selectRule,
isSub: false,
content: info.content,
specType: info.specType || false,
id: info.id,
giveIntegral: info.giveIntegral,
ficti: info.ficti
content: res.content,
specType: res.attr.length ? true : false,
id: res.id,
giveIntegral: res.giveIntegral,
ficti: res.ficti
}
if(this.formValidate.attr.length){
for (var i = 0; i < this.formValidate.attr.length; i++) {
this.formValidate.attr[i].attrValue = JSON.parse(info.attr[i].attrValues)
this.formValidate.attr[i].attrValue = JSON.parse(this.formValidate.attr[i].attrValues)
}
}
this.loading = false;
@@ -473,13 +491,9 @@
},
// 提交
handleSubmit (name) {
this.formValidate.attr.length ? this.formValidate.attrValue=JSON.stringify(this.ManyAttrValue):this.formValidate.attrValue=[]
this.formValidate.attr.length ? this.formValidate.attrValue=this.ManyAttrValue:this.formValidate.attrValue=[]
this.formValidate.cateId = this.formValidate.cateIds.join(',')
this.formValidate.sliderImage = JSON.stringify(this.formValidate.sliderImages)
if(!this.formValidate.specType){
this.formValidate.attr = []
this.formValidate.attrValue = ''
}
for (var i = 0; i < this.formValidate.attr.length; i++) {
this.formValidate.attr[i].attrValues = JSON.stringify(this.formValidate.attr[i].attrValue)
}
@@ -488,7 +502,7 @@
this.modal_loading = true
productCreateApi(this.formValidate).then(async res => {
this.$message.success('新增成功');
this.$parent.dialogVisible = false
this.$emit('handleCloseMod', false)
this.modal_loading = false
}).catch(() => {
this.modal_loading = false
@@ -510,6 +524,8 @@
_this.OneattrValue[0].image = img[0].sattDir
}
if(tit==='2'&& !num){
if(img.length>10) return this.$message.warning("最多选择10张图片");
if(img.length + _this.formValidate.sliderImages.length > 10) return this.$message.warning("最多选择10张图片");
img.map((item) => {
_this.formValidate.sliderImages.push(item.sattDir)
});