合并分支

master
pikachu 2021-06-26 11:15:23 +08:00
commit 3c83cc9f50
108 changed files with 3506 additions and 3543 deletions

View File

@ -14,9 +14,10 @@
"js-cookie": "^2.2.1",
"less": "^3.12.2",
"less-loader": "^5.0.0",
"mv-count-down": "^0.1.15",
"psl": "^1.8.0",
"qs": "^6.9.4",
"swiper": "^6.4.1",
"swiper": "^5.2.0",
"uuid": "^8.3.2",
"v-distpicker": "^1.0.17",
"view-design": "^4.3.2",

View File

@ -61,7 +61,7 @@ export function getCateById (id) {
// 店铺入驻协议
export function agreement () {
return request({
url: `/buyer/article/get/1349291301250293760`,
url: `/buyer/article/type/STORE_REGISTER`,
needToken: true,
method: Method.GET
})

View File

@ -11,4 +11,6 @@
<glyph unicode="&#xe901;" glyph-name="next" horiz-adv-x="1025" d="M1024.951 448c0 2.706-1.097 5.193-1.536 7.826-0.585 3.145-0.658 6.363-1.902 9.362l-0.146 0.366c-1.682 3.95-4.389 7.314-7.022 10.606-1.024 1.317-1.463 2.926-2.706 4.096 0 0-0.146 0-0.146 0.146l-241.591 240.274c-8.15 7.642-19.145 12.336-31.236 12.336-25.247 0-45.714-20.467-45.714-45.714 0-12.218 4.793-23.317 12.602-31.518l-0.018 0.019 162.889-162.085h-821.76c-25.247 0-45.714-20.467-45.714-45.714s20.467-45.714 45.714-45.714h821.76l-162.889-162.085c-8.921-8.364-14.479-20.222-14.479-33.379 0-25.247 20.467-45.714 45.714-45.714 13.029 0 24.785 5.451 33.112 14.196l0.018 0.019 241.737 240.421c1.17 1.243 1.682 2.779 2.706 4.096 2.633 3.291 5.339 6.583 7.022 10.606l0.146 0.366c1.243 2.926 1.317 6.217 1.902 9.362 0.439 2.633 1.463 5.12 1.463 7.753v0.073c0 0.073 0 0 0 0z" />
<glyph unicode="&#xe902;" glyph-name="qq" d="M512 929.009c-265.653 0-480.989-215.345-480.989-481.012 0-265.662 215.335-481.006 480.989-481.006s480.989 215.345 480.989 481.006c-0.001 265.668-215.335 481.012-480.989 481.012v0zM776.822 298.086c-12.422-11.596-33.749 1.033-54.249 29.4-8.901-24.019-20.497-46.171-33.956-66.051 28.987-10.353 47.626-26.505 47.626-44.726 0-31.473-55.699-56.942-124.443-56.942-40.79 0-76.819 8.899-99.593 22.777-22.565-13.877-58.799-22.777-99.59-22.777-68.745 0-124.443 25.469-124.443 56.942 0 18.014 18.637 34.373 47.626 44.726-13.666 19.877-25.056 42.033-33.959 66.051-20.496-28.156-41.822-40.997-54.249-29.4-16.978 15.94-10.555 72.263 14.702 125.688 5.799 12.215 12.010 23.188 18.428 32.716 3.518 155.297 105.805 279.947 231.281 279.947h0.413c125.475 0 227.762-124.443 231.281-279.947 6.417-9.527 12.634-20.501 18.427-32.716 25.055-53.425 31.684-109.748 14.701-125.688v0z" />
<glyph unicode="&#xe903;" glyph-name="wechat" d="M579.6 448.4c-11.7 0-23.4-10.8-23.4-24.2 0-10.8 11.7-21.7 23.4-21.7 17.5 0 30 10.8 30 21.7 0 13.4-12.5 24.2-30 24.2zM502.8 561c18.4 0 30 11.7 30 29.2 0 18.4-11.7 29.2-30 29.2-17.5 0-34.2-10.8-34.2-29.2 0-17.5 16.7-29.2 34.2-29.2zM512 960c-282.8 0-512-229.2-512-512s229.2-512 512-512 512 229.2 512 512-229.2 512-512 512zM415.2 318.3c-30.9 0-53.4 5-82.6 13.3l-84.3-42.5 24.2 71.7c-59.2 41.7-94.3 94.3-94.3 158.5 0 113.5 106.8 200.2 236.9 200.2 115.1 0 217.7-68.4 237.7-165.2-8.3 1.7-15.9 2.5-22.5 2.5-113.5 0-201-85.1-201-187.7 0-17.5 2.5-33.4 6.7-50.1-6.6-0.7-14.1-0.7-20.8-0.7zM763.1 236.5l16.7-60.1-63.4 35.9c-24.2-5-47.5-12.5-71.7-12.5-111.8 0-200.2 76.7-200.2 171.8s88.4 171.8 200.2 171.8c105.9 0 201-76.7 201-171.8 0-53.3-35.9-100.9-82.6-135.1zM337.7 619.4c-17.5 0-35.9-10.8-35.9-29.2 0-17.5 18.4-29.2 35.9-29.2 16.7 0 30 11.7 30 29.2 0 18.4-13.4 29.2-30 29.2zM710.5 448.4c-12.5 0-23.4-10.8-23.4-24.2 0-10.8 10.8-21.7 23.4-21.7 16.7 0 29.2 10.8 29.2 21.7 0 13.4-12.5 24.2-29.2 24.2z" />
<glyph unicode="&#xe904;" glyph-name="qrcode" d="M445.077 845.495h-290.715c-20.056 0-36.327-16.27-36.327-36.327v-290.715c0-20.056 16.27-36.327 36.327-36.327h290.715c20.056 0 36.327 16.27 36.327 36.327v290.613c0 20.056-16.27 36.429-36.327 36.429zM449.784 518.351c0-2.558-2.149-4.707-4.707-4.707h-290.715c-2.558 0-4.707 2.149-4.707 4.707v290.715c0 2.558 2.149 4.707 4.707 4.707h290.715c2.558 0 4.707-2.149 4.707-4.707v-290.715zM350.219 737.231h-101.1c-12.689 0-22.922-10.335-22.922-22.922v-101.1c0-12.689 10.335-22.922 22.922-22.922h101.1c12.689 0 22.922 10.335 22.922 22.922v101.1c0.102 12.586-10.233 22.922-22.922 22.922zM341.521 621.907h-83.705v83.705h83.705v-83.705zM350.219 306.122h-101.1c-12.689 0-22.922-10.335-22.922-22.922v-101.1c0-12.689 10.335-22.922 22.922-22.922h101.1c12.689 0 22.922 10.335 22.922 22.922v101.1c0.102 12.689-10.233 22.922-22.922 22.922zM341.521 190.798h-83.705v83.705h83.705v-83.705zM673.474 590.288h101.1c12.689 0 22.922 10.335 22.922 22.922v101.1c0 12.689-10.335 22.922-22.922 22.922h-101.1c-12.689 0-22.922-10.335-22.922-22.922v-101.1c0-12.689 10.233-22.922 22.922-22.922zM682.172 705.612h83.705v-83.705h-83.705v83.705zM445.077 417.148h-290.715c-20.056 0-36.327-16.27-36.327-36.327v-290.715c0-20.056 16.27-36.327 36.327-36.327h290.715c20.056 0 36.327 16.27 36.327 36.327v290.715c0 20.056-16.27 36.327-36.327 36.327zM449.784 90.107c0-2.558-2.149-4.707-4.707-4.707h-290.715c-2.558 0-4.707 2.149-4.707 4.707v290.715c0 2.558 2.149 4.707 4.707 4.707h290.715c2.558 0 4.707-2.149 4.707-4.707v-290.715zM580.458 416.022c-20.056 0-36.327-16.27-36.327-36.327v-167.205c0-8.698 7.061-15.861 15.861-15.861 8.698 0 15.861 7.061 15.861 15.861v167.102c0 2.558 2.149 4.707 4.707 4.707h176.005c8.698 0 15.861 7.061 15.861 15.861s-7.061 15.861-15.861 15.861h-176.107zM578.616 482.024h290.715c20.056 0 36.327 16.27 36.327 36.327v290.715c0 20.056-16.27 36.327-36.327 36.327h-290.715c-20.056 0-36.327-16.27-36.327-36.327v-290.715c0-19.954 16.373-36.327 36.327-36.327zM574.011 809.066c0 2.558 2.149 4.707 4.707 4.707h290.715c2.558 0 4.707-2.149 4.707-4.707v-290.715c0-2.558-2.149-4.707-4.707-4.707h-290.817c-2.558 0-4.707 2.149-4.707 4.707v290.715h0.102zM905.964 400.161c0 8.698-7.061 15.861-15.861 15.861h-58.020c-8.698 0-15.861-7.061-15.861-15.861s7.061-15.861 15.861-15.861h42.159v-60.988h-131.492c-8.698 0-15.861-7.061-15.861-15.861 0-8.698 7.061-15.861 15.861-15.861h147.353c8.698 0 15.861 7.061 15.861 15.861v92.71zM614.226 84.888h-38.475v44.104c0 8.698-7.061 15.861-15.861 15.861s-15.861-7.061-15.861-15.861v-59.862c0-8.698 7.061-15.861 15.861-15.861h54.336c8.698 0 15.861 7.061 15.861 15.861 0 8.698-7.061 15.759-15.861 15.759zM789.412 207.579c0 8.698-7.061 15.861-15.861 15.861h-99.975c-8.698 0-15.861-7.061-15.861-15.861v-140.088c0-8.698 7.061-15.861 15.861-15.861s15.861 7.061 15.861 15.861v124.227h84.114c8.8 0 15.861 7.061 15.861 15.861zM890.001 265.088c-8.698 0-15.861-7.061-15.861-15.861v-166.898h-143.26c-8.698 0-15.861-7.061-15.861-15.861 0-8.698 7.061-15.861 15.861-15.861h159.018c8.698 0 15.861 7.061 15.861 15.861v182.758c0 8.8-7.061 15.861-15.759 15.861zM636.431 350.839c-8.698 0-15.861-7.061-15.861-15.861v-51.471c0-8.698 7.061-15.861 15.861-15.861 8.698 0 15.861 7.061 15.861 15.861v51.471c0 8.8-7.163 15.861-15.861 15.861z" />
<glyph unicode="&#xe905;" glyph-name="uniE905" horiz-adv-x="1055" d="M745.891 349.28c0-26.168 21.214-47.382 47.382-47.382s47.382 21.214 47.382 47.382c0 26.168-21.214 47.382-47.382 47.382v0c-26.168 0-47.382-21.214-47.382-47.382v0zM759.195 244.935c-44.978 0.149-81.399 36.571-81.548 81.534v52.143c0.149 44.978 36.571 81.399 81.534 81.548h296.231v168.518c-0.149 44.978-36.571 81.399-81.534 81.548h-892.329c-44.978-0.149-81.399-36.571-81.548-81.534v-611.144c0.149-44.978 36.571-81.399 81.534-81.548h892.329c44.978 0.149 81.399 36.571 81.548 81.534v227.4zM905.15 762.004l-86.061 155.918c-14.23 25.257-40.876 42.035-71.44 42.035-14.412 0-27.953-3.731-39.71-10.279l0.416 0.213-339.907-187.887z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -1,10 +1,10 @@
@font-face {
font-family: 'icomoon';
src: url('icomoon.eot?4ejtdc');
src: url('icomoon.eot?4ejtdc#iefix') format('embedded-opentype'),
url('icomoon.ttf?4ejtdc') format('truetype'),
url('icomoon.woff?4ejtdc') format('woff'),
url('icomoon.svg?4ejtdc#icomoon') format('svg');
src: url('icomoon.eot?jvagvf');
src: url('icomoon.eot?jvagvf#iefix') format('embedded-opentype'),
url('icomoon.ttf?jvagvf') format('truetype'),
url('icomoon.woff?jvagvf') format('woff'),
url('icomoon.svg?jvagvf#icomoon') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
@ -25,6 +25,14 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-wallet:before {
content: "\e905";
color: #3c56c6;
}
.icon-qrcode:before {
content: "\e904";
color: #999;
}
.icon-customer-service:before {
content: "\e900";
}

View File

@ -64,7 +64,7 @@
</span>
</p>
</div>
<!-- 满减展示 -->
<!-- 满减展示 -->
<div class="item-price-row" v-if="promotionMap['FULL_DISCOUNT']">
<p>
<span class="item-price-title">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
@ -111,7 +111,7 @@
<span class="inventory"> 库存{{skuDetail.quantity}}</span>
</div>
</div>
<div class="item-select">
<div class="item-select" v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'">
<div class="item-select-title">
<p>重量</p>
</div>
@ -119,14 +119,14 @@
<span class="inventory"> {{skuDetail.weight}}kg</span>
</div>
</div>
<div class="add-buy-car" v-if="$route.query.way === 'POINT'">
<div class="add-buy-car" v-if="$route.query.way === 'POINT' && skuDetail.isAuth === 'PASS'">
<Button type="error" :loading="loading" :disabled="skuDetail.quantity === 0" @click="pointPay"></Button>
</div>
<div class="add-buy-car" v-else>
<Button type="error" :loading="loading" :disabled="skuDetail.quantity === 0" @click="addShoppingCartBtn"></Button>
<div class="add-buy-car" v-if="$route.query.way !== 'POINT' && skuDetail.isAuth === 'PASS'">
<Button type="error" v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'" :loading="loading" :disabled="skuDetail.quantity === 0" @click="addShoppingCartBtn"></Button>
<Button type="warning" :loading="loading1" :disabled="skuDetail.quantity === 0" @click="buyNow"></Button>
</div>
</div>
</div>
</div>
@ -151,7 +151,7 @@ export default {
count: 1, //
imgIndex: 0, //
currentSelceted: [], // sku
imgList: this.detail.data.specList[0].specImage, //
imgList: this.detail.data.specList[0].specImage || [], //
skuDetail: this.detail.data, // sku
goodsSpecList: this.detail.specs, // spec
promotionMap: { //
@ -200,12 +200,16 @@ export default {
};
this.loading = true;
addCartGoods(params).then(res => {
debugger;
this.loading = false;
if (res.success) {
this.$router.push({path: '/shoppingCart', query: {detail: this.skuDetail, count: this.count}});
} else {
this.$Message.warning(res.message);
}
}).catch(() => {
console.log('catch');
this.loading = false;
});
},
buyNow () { //
@ -214,14 +218,20 @@ export default {
skuId: this.skuDetail.id,
cartType: 'BUY_NOW'
};
//
if (this.skuDetail.goodsType === 'VIRTUAL_GOODS') {
params.cartType = 'VIRTUAL'
}
this.loading1 = true;
addCartGoods(params).then(res => {
this.loading1 = false;
if (res.success) {
this.$router.push({path: '/pay', query: {way: 'BUY_NOW'}});
this.$router.push({path: '/pay', query: {way: params.cartType}});
} else {
this.$Message.warning(res.message);
}
}).catch(() => {
this.loading1 = false;
});
},
pointPay () { //
@ -317,6 +327,7 @@ export default {
})
},
promotion () { //
if (!this.detail.promotionMap) return false;
let keysArr = Object.keys(this.detail.promotionMap);
if (keysArr.length === 0) return false;
@ -339,7 +350,7 @@ export default {
}
})
}
this.formatSku(this.goodsSpecList);
this.promotion()
document.title = this.skuDetail.goodsName

View File

@ -86,6 +86,14 @@
</div>
</div>
</TabPane>
<TabPane label="商品参数">
<table class="mt_10" border="1" cellpadding='0' cellspacing="0" v-if="skuDetail.goodsParamsList && skuDetail.length">
<tr v-for="param in skuDetail.goodsParamsList" :key="param">
<td>{{param.paramName}}</td><td>{{param.paramValue}}</td>
</tr>
</table>
<!-- <div v-else></div> -->
</TabPane>
</Tabs>
</div>
</div>
@ -475,4 +483,18 @@ export default {
.ivu-rate-star-full:before, .ivu-rate-star-half .ivu-rate-star-content:before {
color: $theme_color;
}
table{
border-color: #eee;
color: #999;
width: 70%;
margin-left: 10px;
tr{
td:nth-child(1){
width: 200px;
}
}
td{
padding: 5px;
}
}
</style>

View File

@ -36,7 +36,7 @@
</template>
<script>
import { Swiper, SwiperSlide, directive } from 'vue-awesome-swiper';
import 'swiper/swiper-bundle.css';
// import 'swiper/swiper-bundle.css';
export default {
components: {
Swiper,

View File

@ -11,42 +11,37 @@
</div> -->
<!-- 普通发票 -->
<div class="nav-content">
<Form
:model="invoiceForm"
ref="form"
label-position="left"
:rules="ruleInline"
:label-width="110"
>
<Form :model="invoiceForm" ref="form" label-position="left" :rules="ruleInline" :label-width="110">
<FormItem label="发票类型">
<RadioGroup v-model="invoiceForm.type" type="button" button-style="solid">
<RadioGroup v-model="invoice" type="button" button-style="solid">
<Radio @on-change="changeInvoice" :label="1">电子普通发票</Radio>
<Radio :label="2" :disabled="true">增值税专用发票</Radio>
</RadioGroup>
</FormItem>
<FormItem label="发票抬头">
<RadioGroup v-model="type" @on-change="changeInvoice" type="button" button-style="solid">
<Radio :label="1">个人</Radio>
<Radio :label="2">单位</Radio>
</RadioGroup>
</FormItem>
<FormItem
label="发票抬头"
v-if="invoiceForm.type == 2"
prop="receiptTitle"
>
<FormItem label="个人名称" v-if="type === 1" prop="receiptTitle">
<i-input v-model="invoiceForm.receiptTitle"></i-input>
</FormItem>
<FormItem
label="纳税人识别号"
v-if="invoiceForm.type == 2"
prop="taxpayerId"
>
<FormItem label="单位名称" v-if="type === 2" prop="receiptTitle">
<i-input v-model="invoiceForm.receiptTitle"></i-input>
</FormItem>
<FormItem label="纳税人识别号" v-if="type === 2" prop="taxpayerId">
<i-input v-model="invoiceForm.taxpayerId"></i-input>
</FormItem>
<FormItem label="发票内容">
<RadioGroup v-model="invoiceForm.receiptContent" type="button" button-style="solid">
<Radio label="不开发票">不开发票</Radio>
<Radio label="商品明细">商品明细</Radio>
<Radio label="商品类别">商品类别</Radio>
</RadioGroup>
</FormItem>
</Form>
<div style="text-align: center">
<Button type="primary" :loading="loading" @click="save"></Button>
<Button type="primary" :loading="loading" @click="submit"></Button>
<Button type="default" @click="invoiceAvailable = false">取消</Button>
</div>
</div>
@ -54,23 +49,24 @@
</div>
</template>
<script>
import { saveReceipt } from '@/api/member.js';
import { receiptSelect } from '@/api/cart.js';
import { TINumber } from '@/plugins/RegExp.js';
export default {
name: 'invoiceModal',
data () {
return {
invoice: 1,
invoiceAvailable: false, //
loading: false, //
invoiceForm: { //
invoiceForm: {
//
//
receiptTitle: '', //
taxpayerId: '', //
receiptContent: '不开发票', //
type: 1 // 1 2
receiptContent: '商品明细', //
},
ruleInline: { //
receiptTitle: [{ required: true, message: '请填写公司名称' }],
type: 1, // 1 2
ruleInline: {
taxpayerId: [
{ required: true, message: '请填写纳税人识别号' },
{ pattern: TINumber, message: '请填写正确的纳税人识别号' }
@ -78,73 +74,76 @@ export default {
}
};
},
methods: {
save () { //
if (this.invoiceForm.type === 1) {
//
let flag = true;
this.receiptItems.forEach((e) => {
if (
e.receiptTitle === '个人' &&
e.receiptContent === this.invoiceForm.receiptContent
) {
this.$emit('change', e);
flag = false;
this.invoiceAvailable = false;
}
});
props: ['invoiceData'],
watch: {
invoiceData: {
handler (val) {
this.invoiceForm = { ...val };
if (flag) {
let params = {
receiptTitle: '个人',
receiptContent: this.invoiceForm.receiptContent
};
this.loading = true;
saveReceipt(params)
.then((res) => {
this.loading = false;
if (res.success) {
this.$emit('change', res.result);
this.invoiceAvailable = false;
}
})
.catch(() => {
this.loading = false;
});
if (val.taxpayerId) {
this.type = 2;
} else {
this.type = 1;
}
} else {
//
},
deep: true,
immeadite: true
}
},
methods: {
/**
* 选择发票抬头
*/
changeInvoice (val) {
this.$nextTick(() => {
this.type = val;
});
},
/**
* 保存判断
*/
save () {
let flage = true;
//
const { type, receiptTitle, receiptContent } = JSON.parse(
JSON.stringify(this.invoiceForm)
);
//
if (!receiptTitle) {
this.$Message.error('请填写发票抬头!');
flage = false;
return false;
}
if (type === 2) {
this.$refs.form.validate((valid) => {
if (valid) {
this.loading = true;
let params = {
receiptTitle: this.invoiceForm.receiptTitle,
taxpayerId: this.invoiceForm.taxpayerId,
receiptContent: this.invoiceForm.receiptContent
};
let flag = true;
this.receiptItems.forEach((e) => {
if (e.taxpayerId === params.taxpayerId) {
flag = false;
}
});
if (!flag) {
this.$Message.error('已有当前税号的发票信息,请直接选择已有发票');
} else {
saveReceipt(params)
.then((res) => {
this.loading = false;
if (res.success) {
this.$emit('change', res.result);
this.invoiceAvailable = false;
}
})
.catch(() => {
this.loading = false;
});
}
if (!valid) {
flage = false;
}
});
} else {
delete this.invoiceForm.taxpayerId;
}
return flage;
},
async submit () {
if (this.save()) {
this.loading = true;
let submit = {
way: this.$route.query.way,
...this.invoiceForm
};
let receipt = await receiptSelect(submit);
if (receipt.success) {
this.$emit('change', true);
}
this.loading = false;
}
}
}

View File

@ -98,14 +98,14 @@ export default {
}
},
created () {
this.getImg();
// this.getImg();
},
watch: {
verifyType: {
immediate: true,
handler: function (v) {
this.type = v;
this.refresh();
// this.refresh();
}
},
show (v) {

View File

@ -50,7 +50,6 @@ export default {
},
created () {
this.getGoodsDetail();
},
data () {
return {

View File

@ -69,7 +69,7 @@
>人评价
</div>
<div class="goods-show-seller">
<span>{{ item.storeName }}</span>
<Tag v-if="item.selfOperated" style="padding:0 4px;" size="small" color="error"></Tag><span>{{ item.storeName }}</span>
</div>
</div>
</div>

View File

@ -108,7 +108,7 @@ export default {
this.pageNumber = 1;
this.params.pageSize = val;
this.getList()
},
}
}
}
</script>
@ -132,10 +132,10 @@ export default {
color: $theme_color;
}
}
.selected-cate{
color: $theme_color;
}
}
.page-size {
width: 1200px;

View File

@ -93,13 +93,13 @@
</div>
<div class="foot">
<Row type="flex" justify="space-around" class="help">
<a class="item" href="https://lilishop.com" target="_blank">帮助</a>
<a class="item" href="https://lilishop.com" target="_blank">隐私</a>
<a class="item" href="https://lilishop.com" target="_blank">条款</a>
<a class="item" href="https://pickmall.cn/" target="_blank">帮助</a>
<a class="item" href="https://pickmall.cn/" target="_blank">隐私</a>
<a class="item" href="https://pickmall.cn/" target="_blank">条款</a>
</Row>
<Row type="flex" justify="center" class="copyright">
Copyright © 2020 - Present
<a href="http://lili.cn" target="_blank" style="margin: 0 5px"
<a href="https://pickmall.cn/" target="_blank" style="margin: 0 5px"
>lili-shop</a
>
版权所有

View File

@ -30,13 +30,13 @@
</div>
<empty v-else />
<!-- 分页 -->
<div class="page-size mt_10" v-if="paging">
<!-- <div class="page-size mt_10" v-if="paging">
<Page :total="total" @on-change="changePageNum"
@on-page-size-change="changePageSize"
:page-size="params.pageSize"
show-sizer>
</Page>
</div>
</div> -->
</div>
</template>
@ -61,7 +61,7 @@ export default {
total: 0, //
params: { //
pageNumber: 1,
pageSize: 10,
pageSize: 100,
type: 'GOODS'
},
spinShow: false //

View File

@ -44,6 +44,12 @@
</tr>
</table>
</div>
<div class="order-card" v-if="afterSale.afterSaleImage">
<h3 class="mb_10">图片信息</h3>
<div v-for="img in afterSale.afterSaleImage.split(',')" :key="img">
<img :src="img" width="200" height="200" @click="perviewImg(img)" class="hover-pointer" alt="">
</div>
</div>
</div>
</template>
<script>
@ -83,6 +89,9 @@ export default {
filterOrderStatus (status) { //
const ob = this.afterSaleStatusList.filter(e => { return e.status === status });
return ob[0].name
},
perviewImg (img) {
window.open(img, '_blank')
}
},
mounted () {

View File

@ -16,11 +16,11 @@
</template>
</Table>
<div>
<Form :model="form" ref="form" :rules="rules" :label-width="80">
<Form :model="form" ref="form" class="mt_10" :rules="rules" :label-width="80">
<FormItem label="售后类别">
<RadioGroup v-model="form.serviceType" @on-change="changeReason" type="button" button-style="solid">
<Radio label="RETURN_GOODS">退</Radio>
<Radio label="RETURN_MONEY">退</Radio>
<Radio v-if="info.returnGoods" label="RETURN_GOODS">退</Radio>
<Radio v-if="info.returnMoney" label="RETURN_MONEY">退</Radio>
</RadioGroup>
</FormItem>
<FormItem label="提交数量" prop="num">
@ -144,6 +144,10 @@ export default {
if (res.success) {
this.info = res.result
this.goodsData.push(res.result)
if (!this.info.returnGoods && this.info.returnMoney) {
this.form.serviceType = 'RETURN_MONEY'
}
this.getReason(this.form.serviceType)
}
})
},
@ -195,7 +199,6 @@ export default {
mounted () {
this.accessToken.accessToken = storage.getItem('accessToken');
this.getInfo()
this.getReason('RETURN_GOODS')
}
}
</script>

View File

@ -29,7 +29,6 @@
<div>{{ filterOrderStatus(order.orderStatus) }}</div>
<div>
订单号{{ order.sn }} &nbsp; &nbsp; &nbsp;{{order.createTime}}
&nbsp; &nbsp;{{ order.memberName | secrecyMobile }}
</div>
</div>
<div>

View File

@ -2,7 +2,7 @@
<div class="order-detail" v-if="order.order">
<card _Title="订单详情" :_Size="16"></card>
<div class="order-card">
<p class="global_color fontsize_18">{{ order.orderStatusValue }}</p>
<p class="global_color fontsize_18">{{ order.orderStatusValue }} <span class="verificationCode" v-if="order.order.verificationCode">{{order.order.verificationCode}}</span></p>
<p class="global_color">订单号{{ order.order.sn }}</p>
<div style="color:#999;" class="operation-time">操作时间{{order.order.updateTime}}</div>
<Steps class="progress" :current="progressList.length" direction="vertical">
@ -22,8 +22,8 @@
</div>
<div class="order-card">
<h3>付款信息</h3>
<p>支付方式在线支付</p>
<p>付款状态未付款</p>
<p>支付方式{{order.paymentMethodValue}}</p>
<p>付款状态{{order.payStatusValue}}</p>
</div>
<div class="order-card">
<h3>配送信息</h3>
@ -234,7 +234,12 @@ table {
font-size: 20px;
}
}
.verificationCode {
font-size: 16px;
margin-left: 240px;
color: rgb(65, 63, 63);
font-weight: bold;
}
/** 订单进度条 */
.progress {
margin: 15px 0;

View File

@ -215,7 +215,7 @@ export default {
color: 'green'
}
},
params.row.money
this.$options.filters.unitPrice(params.row.money, '+ ¥')
)
]);
} else if (params.row.money < 0) {
@ -227,7 +227,7 @@ export default {
color: 'red'
}
},
params.row.money
this.$options.filters.unitPrice(0 - params.row.money, '- ¥')
)
]);
}
@ -252,7 +252,10 @@ export default {
},
{
title: '充值金额',
key: 'rechargeMoney'
key: 'rechargeMoney',
render: (h, params) => {
return h('div', [h('span', this.$options.filters.unitPrice(params.row.rechargeMoney, '¥'))]);
}
},
{
title: '支付状态',
@ -281,7 +284,9 @@ export default {
{
title: '提现金额',
key: 'applyMoney',
width: 120
render: (h, params) => {
return h('div', [h('span', this.$options.filters.unitPrice(params.row.applyMoney, '¥'))]);
}
},
{
title: '提现状态',
@ -392,9 +397,10 @@ export default {
if (valid) {
recharge(this.formData).then((res) => {
if (res.message === 'success') {
// TODO ,sn
console.warn(res.result.rechargeSn);
this.modal = false;
this.$router.push({
path: '/payment',
query: { orderType: 'RECHARGE', sn: res.result.rechargeSn }
});
}
});
}

View File

@ -15,6 +15,14 @@
</span>
</li>
</ul>
<!-- 分页 -->
<div class="page-size">
<Page :total="total" @on-change="changePageNum"
@on-page-size-change="changePageSize"
:page-size="params.pageSize"
show-sizer>
</Page>
</div>
</div>
</template>
@ -25,7 +33,14 @@ export default {
data () {
return {
list: [], //
spinShow: false // loading
spinShow: false, // loading
params: {
pageNumber: 1,
pageSize: 30,
order: 'desc',
sort: 'createTime'
},
total: 0
};
},
mounted () {
@ -71,7 +86,16 @@ export default {
}
})
},
getList () {
changePageNum (val) { //
this.params.pageNumber = val;
this.getList()
},
changePageSize (val) { //
this.pageNumber = 1;
this.params.pageSize = val;
this.getList()
},
getList () { //
this.spinShow = true;
tracksList(this.params).then(res => {
this.spinShow = false

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,8 @@
</div>
<div class="pay-btn">
<Button type="primary" @click="$router.push('/')"></Button>
<Button type="info" @click="$router.push('home/myOrder')"></Button>
<Button type="info" v-if="$route.query.orderType ==='RECHARGE'" @click="$router.push('/home/MoneyManagement')"></Button>
<Button type="info" v-else @click="$router.push('/home/myOrder')"></Button>
</div>
</div>
</template>

View File

@ -5,31 +5,64 @@
<div class="head-left">
<div class="left-tips">订单提交成功请尽快付款</div>
<div class="left-tips-time">请您尽快完成支付否则订单会被自动取消</div>
<div class="left-tips-count-down">
<mv-count-down :startTime="startTime" class="count-down"
:endTime="endTime"
:endText="endText"
:dayTxt="'天'"
:hourTxt="'小时'"
:minutesTxt="'分钟'"
:secondsTxt="'秒'"
:isStart="isStart"></mv-count-down>
</div>
</div>
<div class="head-right">
<div>应付金额 <span class="price">{{payDetail.price | unitPrice}}</span></div>
<div>应付金额 <span class="price">{{ payDetail.price | unitPrice }}</span></div>
</div>
</div>
<div class="wrapper-box">
<div class="-box-item" @click="handlePay('ALIPAY')">
<img src="https://ss3.bdstatic.com/yrwDcj7w0QhBkMak8IuT_XF5ehU5bvGh7c50/logopic/a9936a369e82e0c6c42112674a5220e8_fullsize.jpg" alt="">
<div v-if="support.includes('ALIPAY')" class="-box-item" @click="handlePay('ALIPAY')">
<img
src="https://ss3.bdstatic.com/yrwDcj7w0QhBkMak8IuT_XF5ehU5bvGh7c50/logopic/a9936a369e82e0c6c42112674a5220e8_fullsize.jpg"
alt="">
<span>支付宝</span>
</div>
<div class="-box-item" @click="handlePay('WECHAT')">
<img src="https://dss1.bdstatic.com/6OF1bjeh1BF3odCf/it/u=3774939867,2826752539&fm=74&app=80&f=JPEG&size=f121,121?sec=1880279984&t=796e842a5ef2d16d9edc872d6f1147ef" alt="">
<div v-if="support.includes('WECHAT')" class="-box-item" @click="handlePay('WECHAT')">
<img
src="https://dss1.bdstatic.com/6OF1bjeh1BF3odCf/it/u=3774939867,2826752539&fm=74&app=80&f=JPEG&size=f121,121?sec=1880279984&t=796e842a5ef2d16d9edc872d6f1147ef"
alt="">
<span>微信</span>
</div>
<div v-if="support.includes('WALLET') && $route.query.orderType !== 'RECHARGE'" class="-box-item" @click="handlePay('WALLET')">
<Icon custom="icomoon icon-wallet" size="60"/>
<span>余额支付</span>
<span>当前剩余({{ walletValue | unitPrice('¥') }})</span>
</div>
</div>
<BaseFooter></BaseFooter>
</div>
</template>
<script>
import { tradeDetail } from '@/api/pay.js';
import {tradeDetail, pay} from '@/api/pay.js';
import MvCountDown from 'mv-count-down'
import {Message} from 'view-design';
export default {
components: {
MvCountDown
},
data () {
return {
payDetail: {}, //
qrcode: '' //
support: [], //
walletValue: 0, //
qrcode: '', //
startTime: new Date().getTime(), //
endTime: 0, //
endText: '订单已超时取消', //
isStart: false //
};
},
methods: {
@ -39,15 +72,45 @@ export default {
tradeDetail(params).then(res => {
if (res.success) {
this.payDetail = res.result;
this.endTime = this.payDetail.autoCancel
this.isStart = true
this.support = this.payDetail.support
this.walletValue = this.payDetail.walletValue
}
});
},
//
handlePay (way) {
//
if (way === 'WALLET') {
//
if (this.payDetail.price > this.walletValue) {
Message.error('余额不足以支付当前订单,如需充值请前往会员中心');
return;
}
}
const params = this.$route.query;
params.paymentMethod = way;
params.paymentClient = 'NATIVE';
params.price = this.payDetail.price;
this.$router.push({path: '/qrpay', query: params});
if (way === 'WALLET') {
this.$Modal.confirm({
title: '支付确认',
content: '<p>确认使用余额支付吗?</p>',
onOk: () => {
pay(params).then(res => {
if (res.success) {
this.$Message.warning(res.message)
this.$router.push('/payDone');
} else {
this.$Message.warning(res.message)
}
})
}
});
} else {
this.$router.push({path: '/qrpay', query: params});
}
}
},
mounted () {
@ -56,64 +119,83 @@ export default {
};
</script>
<style scoped lang="scss">
.head-left{
font-weight: bold;
.head-left {
font-weight: bold;
}
.left-tips{
font-size: 21px;
.left-tips {
font-size: 21px;
}
.-box-item{
margin-right: 30px;
display: flex;
font-size: 21px;
font-weight: bold;
align-items: center;
margin: 20px 20px;
cursor: pointer;
@include content_color($light_content_color);
&:hover{color: $theme_color;}
.-box-item {
display: flex;
font-size: 18px;
font-weight: bold;
align-items: center;
margin: 20px 20px;
cursor: pointer;
@include content_color($light_content_color);
>span{
margin-left: 10px;
}
>img{
border-radius: 10px;
width: 60px;
height: 60px;
}
&:hover {
color: $theme_color;
}
> span {
margin-left: 15px;
}
> img {
border-radius: 10px;
width: 60px;
height: 60px;
}
}
.left-tips-time{
font-size: 16px;
.left-tips-time {
font-size: 16px;
}
.wrapper-head{
display: flex;
align-items: center;
justify-content: space-between;
line-height: 1.75;
.left-tips-count-down {
font-size: 10px;
color: red;
}
.wrapper-head {
display: flex;
align-items: center;
justify-content: space-between;
line-height: 1.75;
}
.wrapper-head,
.wrapper-box {
padding: 20px 40px;
width: 1200px;
margin: 20px auto;
}
.wrapper-box {
@include white_background_color();
height: auto;
display: flex;
}
.wrapper {
width: 100%;
height: 100%;
}
.price{
font-size: 18px;
font-weight: bold;
color: $theme_color;
.price {
font-size: 18px;
font-weight: bold;
color: $theme_color;
}
.head-right{
font-weight: bold;
.head-right {
font-weight: bold;
font-size: 18px;
}
.count-down{
font-size: 16px!important;
}
</style>

View File

@ -70,7 +70,7 @@ export default {
payCallback(params).then(res => {
if (res.result) {
clearInterval(this.interval);
this.$router.push('/payDone');
this.$router.push({path: '/payDone', query: {orderType: this.$route.query.orderType}});
}
});
}

View File

@ -9,23 +9,11 @@
<Step title="其他信息"></Step>
<Step title="提交审核"></Step>
</Steps>
<first-apply
v-if="currentIndex == 0 && dataReview"
:content="firstData"
@change="nextPage"
></first-apply>
<first-apply v-if="currentIndex == 0 && dataReview" :content="firstData" @change="nextPage"></first-apply>
<second-apply
v-if="currentIndex == 1 && dataReview"
:content="secondData"
@change="nextPage"
></second-apply>
<second-apply v-if="currentIndex == 1 && dataReview" :content="secondData" @change="nextPage"></second-apply>
<third-apply
v-if="currentIndex == 2 && dataReview"
:content="thirdData"
@change="nextPage"
></third-apply>
<third-apply v-if="currentIndex == 2 && dataReview" :content="thirdData" @change="nextPage"></third-apply>
<div class="success-page" v-if="currentIndex == 3">
<span v-if="storeDisable == '' || storeDisable == 'APPLYING'"></span>
@ -37,62 +25,51 @@
<Button type="primary" @click='currentIndex = 0' v-if="storeDisable === 'REFUSED' && currentIndex === 3"></Button>
</div>
<Modal
title="店铺入驻协议"
v-model="showAgreement"
width="1200"
:closable="false"
:mask-closable="false"
>
<Modal title="店铺入驻协议" v-model="showAgreement" width="1200" :closable="false" :mask-closable="false">
<div class="agreeent-con" v-html="agreementCon"></div>
<div slot="footer" style="text-align: center">
<p><Checkbox v-model="checked"></Checkbox></p>
<Button
type="primary"
:disabled="!checked"
class="margin"
@click="showAgreement = false"
>同意协议填写资质信息</Button
>
<p>
<Checkbox v-model="checked"></Checkbox>
</p>
<Button type="primary" :disabled="!checked" class="margin" @click="showAgreement = false">同意协议填写资质信息</Button>
</div>
</Modal>
</div>
</template>
<script>
import { agreement, applyStatus } from '@/api/shopentry';
import firstApply from './first-apply';
import secondApply from './second-apply';
import thirdApply from './third-apply';
import { agreement, applyStatus } from "@/api/shopentry";
import firstApply from "./first-apply";
import secondApply from "./second-apply";
import thirdApply from "./third-apply";
export default {
components: {
firstApply,
secondApply,
thirdApply
thirdApply,
},
data () {
data() {
return {
currentIndex: 0, //
showAgreement: false, //
agreementCon: '', //
agreementCon: "", //
checked: false, //
applyData: {}, //
firstData: {}, //
secondData: {}, //
thirdData: {}, //
storeDisable: '', // APPLY OPEN CLOSED REFUSED APPLYING
dataReview: true //
storeDisable: "", // APPLY OPEN CLOSED REFUSED APPLYING
dataReview: true, //
};
},
methods: {
getArticle () {
getArticle() {
//
agreement().then((res) => {
console.log(res);
this.agreementCon = res.result;
this.agreementCon = res.result.content;
});
},
getData () {
getData() {
applyStatus().then((res) => {
if (res.success) {
if (!res.result) {
@ -101,34 +78,34 @@ export default {
this.dataReview = false;
let data = res.result;
let first = [
'addressIdPath',
'addressPath',
'companyAddress',
'companyEmail',
'companyName',
'employeeNum',
'legalId',
'legalName',
'licencePhoto',
'legalPhoto',
'licenseNum',
'linkName',
'linkPhone',
'registeredCapital',
'scope'
"addressIdPath",
"addressPath",
"companyAddress",
"companyEmail",
"companyName",
"employeeNum",
"legalId",
"legalName",
"licencePhoto",
"legalPhoto",
"licenseNum",
"linkName",
"linkPhone",
"registeredCapital",
"scope",
];
let second = [
'settlementBankAccountName',
'settlementBankAccountNum',
'settlementBankBranchName',
'settlementBankJointName'
"settlementBankAccountName",
"settlementBankAccountNum",
"settlementBankBranchName",
"settlementBankJointName",
];
let third = [
'goodsManagementCategory',
'storeCenter',
'storeDesc',
'storeLogo',
'storeName'
"goodsManagementCategory",
"storeCenter",
"storeDesc",
"storeLogo",
"storeName",
];
this.storeDisable = data.storeDisable;
@ -143,7 +120,7 @@ export default {
this.thirdData[e] = data[e];
});
if (this.storeDisable === 'APPLY') {
if (this.storeDisable === "APPLY") {
this.currentIndex = 0;
} else {
this.currentIndex = 3;
@ -154,13 +131,14 @@ export default {
}
});
},
nextPage (step) {
nextPage(step) {
this.currentIndex = step;
}
},
},
mounted () {
mounted() {
this.getData();
}
this.getArticle();
},
};
</script>
<style lang="scss" scoped>

View File

@ -1,27 +1,27 @@
// import Vue from 'vue';
import axios from "axios";
import https from "https";
import { Message, Spin, Modal } from "view-design";
import Storage from "./storage";
import config from "@/config";
import router from "../router/index.js";
import store from "../vuex/store";
import { handleRefreshToken } from "@/api/index";
const qs = require("qs");
import axios from 'axios';
import https from 'https';
import { Message, Spin, Modal } from 'view-design';
import Storage from './storage';
import config from '@/config';
import router from '../router/index.js';
import store from '../vuex/store';
import { handleRefreshToken } from '@/api/index';
const qs = require('qs');
export const buyerUrl =
process.env.NODE_ENV === "development"
process.env.NODE_ENV === 'development'
? config.api_dev.buyer
: config.api_prod.buyer;
export const commonUrl =
process.env.NODE_ENV === "development"
process.env.NODE_ENV === 'development'
? config.api_dev.common
: config.api_prod.common;
export const managerUrl =
process.env.NODE_ENV === "development"
process.env.NODE_ENV === 'development'
? config.api_dev.manager
: config.api_prod.manager;
export const sellerUrl =
process.env.NODE_ENV === "development"
process.env.NODE_ENV === 'development'
? config.api_dev.seller
: config.api_prod.seller;
// 创建axios实例
@ -35,7 +35,7 @@ const service = axios.create({
}),
paramsSerializer: params =>
qs.stringify(params, {
arrayFormat: "repeat"
arrayFormat: 'repeat'
})
});
@ -44,15 +44,15 @@ service.interceptors.request.use(
config => {
const { loading } = config;
// 如果是put/post请求用qs.stringify序列化参数
const isPutPost = config.method === "put" || config.method === "post";
const isJson = config.headers["Content-Type"] === "application/json";
const isFile = config.headers["Content-Type"] === "multipart/form-data";
const isPutPost = config.method === 'put' || config.method === 'post';
const isJson = config.headers['Content-Type'] === 'application/json';
const isFile = config.headers['Content-Type'] === 'multipart/form-data';
if (isPutPost && isJson) {
config.data = JSON.stringify(config.data);
}
if (isPutPost && !isFile && !isJson) {
config.data = qs.stringify(config.data, {
arrayFormat: "repeat"
arrayFormat: 'repeat'
});
}
/** 配置全屏加载 */
@ -60,19 +60,19 @@ service.interceptors.request.use(
config.loading = Spin.show();
}
const uuid = Storage.getItem("uuid");
config.headers["uuid"] = uuid;
const uuid = Storage.getItem('uuid');
config.headers['uuid'] = uuid;
// 获取访问Token
let accessToken = Storage.getItem("accessToken");
let accessToken = Storage.getItem('accessToken');
if (accessToken && config.needToken) {
config.headers["accessToken"] = accessToken;
config.headers['accessToken'] = accessToken;
// 解析当前token时间
let jwtData = JSON.parse(
decodeURIComponent(escape(window.atob(accessToken.split(".")[1])))
decodeURIComponent(escape(window.atob(accessToken.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'))))
);
if (jwtData.exp < Math.round(new Date() / 1000)) {
refresh()
refresh(config)
}
}
@ -83,33 +83,32 @@ service.interceptors.request.use(
}
);
async function refresh() {
async function refresh (error) {
const getTokenRes = await refreshToken();
if (getTokenRes === "success") {
if (getTokenRes === 'success') {
// 刷新token
if (isRefreshToken === 1) {
error.response.config.headers.accessToken = Storage.getItem(
"accessToken"
'accessToken'
);
return service(error.response.config);
} else {
router.go(0);
}
} else {
Storage.removeItem("accessToken");
Storage.removeItem("refreshToken");
Storage.removeItem("userInfo");
Storage.setItem("cartNum", 0);
store.commit("SET_CARTNUM", 0);
console.log("1111");
Storage.removeItem('accessToken');
Storage.removeItem('refreshToken');
Storage.removeItem('userInfo');
Storage.setItem('cartNum', 0);
store.commit('SET_CARTNUM', 0);
Modal.confirm({
title: "请登录",
content: "<p>请登录后执行此操作</p>",
okText: "立即登录",
cancelText: "继续浏览",
title: '请登录',
content: '<p>请登录后执行此操作</p>',
okText: '立即登录',
cancelText: '继续浏览',
onOk: () => {
router.push({
path: "/login",
path: '/login',
query: {
rePath: router.history.current.path,
query: JSON.stringify(router.history.current.query)
@ -140,15 +139,17 @@ service.interceptors.response.use(
isRefreshToken++;
if (isRefreshToken === 1) {
refresh()
refresh(error)
isRefreshToken = 0;
}
} else if (errorResponse.status === 404) {
// 避免刷新token时也提示报错信息
} else {
if (error.message) {
let _message =
error.code === "ECONNABORTED"
? "连接超时,请稍候再试!"
: "网络错误,请稍后再试!";
error.code === 'ECONNABORTED'
? '连接超时,请稍候再试!'
: '网络错误,请稍后再试!';
Message.error(errorData.message || _message);
}
}
@ -171,13 +172,13 @@ const closeLoading = target => {
};
export const Method = {
GET: "get",
POST: "post",
PUT: "put",
DELETE: "delete"
GET: 'get',
POST: 'post',
PUT: 'put',
DELETE: 'delete'
};
export default function request(options) {
export default function request (options) {
// 如果是服务端或者是请求的刷新token不需要检查token直接请求。
// if (process.server || options.url.indexOf('passport/token') !== -1) {
return service(options);
@ -186,19 +187,19 @@ export default function request(options) {
}
// 防抖闭包来一波
function getTokenDebounce() {
function getTokenDebounce () {
let lock = false;
let success = false;
return function() {
return function () {
if (!lock) {
lock = true;
let oldRefreshToken = Storage.getItem("refreshToken");
let oldRefreshToken = Storage.getItem('refreshToken');
handleRefreshToken(oldRefreshToken)
.then(res => {
if (res.success) {
let { accessToken, refreshToken } = res.result;
Storage.setItem("accessToken", accessToken);
Storage.setItem("refreshToken", refreshToken);
Storage.setItem('accessToken', accessToken);
Storage.setItem('refreshToken', refreshToken);
success = true;
lock = false;
@ -220,9 +221,9 @@ function getTokenDebounce() {
if (!lock) {
clearInterval(timer);
if (success) {
resolve("success");
resolve('success');
} else {
resolve("fail");
resolve('fail');
}
}
}, 500); // 轮询时间间隔

View File

@ -2051,7 +2051,7 @@ copy-webpack-plugin@^4.0.1:
p-limit "^1.0.0"
serialize-javascript "^1.4.0"
core-js@^2.4.0, core-js@^2.5.0:
core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5:
version "2.6.12"
resolved "https://registry.npm.taobao.org/core-js/download/core-js-2.6.12.tgz?cache=0&sync_timestamp=1607216048810&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
integrity sha1-2TM9+nsGXjR8xWgiGdb2kIWcwuw=
@ -2621,12 +2621,12 @@ dom-serializer@0:
domelementtype "^2.0.1"
entities "^2.0.0"
dom7@^3.0.0:
version "3.0.0"
resolved "https://registry.npm.taobao.org/dom7/download/dom7-3.0.0.tgz#b861ce5d67a6becd7aaa3ad02942ff14b1240331"
integrity sha1-uGHOXWemvs16qjrQKUL/FLEkAzE=
dom7@^2.1.5:
version "2.1.5"
resolved "https://registry.yarnpkg.com/dom7/-/dom7-2.1.5.tgz#a79411017800b31d8400070cdaebbfc92c1f6377"
integrity sha512-xnhwVgyOh3eD++/XGtH+5qBwYTgCm0aW91GFgPJ3XG+jlsRLyJivnbP0QmUBFhI+Oaz9FV0s7cxgXHezwOEBYA==
dependencies:
ssr-window "^3.0.0-alpha.1"
ssr-window "^2.0.0"
domain-browser@^1.1.1:
version "1.2.0"
@ -5150,6 +5150,16 @@ mute-stream@0.0.7:
resolved "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
mv-count-down@^0.1.15:
version "0.1.15"
resolved "https://registry.npmjs.org/mv-count-down/-/mv-count-down-0.1.15.tgz#a3f3c1677576e592c7710b441b2dda96acac2702"
integrity sha512-7poh86i27D/u4AvE9Ne8QHhy61p4MYAhSf4XAVyxzL0gXVCyccJ0NtJferEOxBP6C2q9jImknpKLGdwnEeJ7qQ==
dependencies:
core-js "^2.6.5"
vue "^2.6.10"
vue-router "^3.0.3"
vuex "^3.0.1"
nan@^2.12.1, nan@^2.13.2:
version "2.14.2"
resolved "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591700047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
@ -7477,10 +7487,10 @@ sshpk@^1.7.0:
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
ssr-window@^3.0.0, ssr-window@^3.0.0-alpha.1:
version "3.0.0"
resolved "https://registry.npm.taobao.org/ssr-window/download/ssr-window-3.0.0.tgz#fd5b82801638943e0cc704c4691801435af7ac37"
integrity sha1-/VuCgBY4lD4MxwTEaRgBQ1r3rDc=
ssr-window@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ssr-window/-/ssr-window-2.0.0.tgz#98c301aef99523317f8d69618f0010791096efc4"
integrity sha512-NXzN+/HPObKAx191H3zKlYomE5WrVIkoCB5IaSdvKokxTpjBdWfr0RaP+1Z5KOfDT0ZVz+2tdtiBkhsEQ9p+0A==
ssri@^5.2.4:
version "5.3.0"
@ -7743,14 +7753,13 @@ svgo@^1.0.0:
unquote "~1.1.1"
util.promisify "~1.0.0"
swiper@^6.4.1:
version "6.4.1"
resolved "https://registry.npm.taobao.org/swiper/download/swiper-6.4.1.tgz?cache=0&sync_timestamp=1607518804170&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fswiper%2Fdownload%2Fswiper-6.4.1.tgz#6d4e9252ed4226821d4005e77924e929848de8af"
integrity sha1-bU6SUu1CJoIdQAXneSTpKYSN6K8=
swiper@^5.2.0:
version "5.4.5"
resolved "https://registry.yarnpkg.com/swiper/-/swiper-5.4.5.tgz#a350f654bf68426dbb651793824925512d223c0f"
integrity sha512-7QjA0XpdOmiMoClfaZ2lYN6ICHcMm72LXiY+NF4fQLFidigameaofvpjEEiTQuw3xm5eksG5hzkaRsjQX57vtA==
dependencies:
dom7 "^3.0.0"
ssr-window "^3.0.0"
tslib "^2.0.0"
dom7 "^2.1.5"
ssr-window "^2.0.0"
table@4.0.2:
version "4.0.2"
@ -7932,11 +7941,6 @@ tslib@^1.10.0:
resolved "https://registry.npm.taobao.org/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1602286724979&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=
tslib@^2.0.0:
version "2.0.3"
resolved "https://registry.npm.taobao.org/tslib/download/tslib-2.0.3.tgz?cache=0&sync_timestamp=1602286724979&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
integrity sha1-jgdBrEX8DCJuWKF7/D5kubxsphw=
tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@ -8315,6 +8319,11 @@ vue-router@^3.0.1:
resolved "https://registry.npm.taobao.org/vue-router/download/vue-router-3.4.9.tgz?cache=0&sync_timestamp=1607347231238&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.4.9.tgz#c016f42030ae2932f14e4748b39a1d9a0e250e66"
integrity sha1-wBb0IDCuKTLxTkdIs5odmg4lDmY=
vue-router@^3.0.3:
version "3.5.2"
resolved "https://registry.npmjs.org/vue-router/-/vue-router-3.5.2.tgz#5f55e3f251970e36c3e8d88a7cd2d67a350ade5c"
integrity sha512-807gn82hTnjCYGrnF3eNmIw/dk7/GE4B5h69BlyCK9KHASwSloD1Sjcn06zg9fVG4fYH2DrsNBZkpLtb25WtaQ==
vue-style-loader@^3.0.0, vue-style-loader@^3.0.1:
version "3.1.2"
resolved "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-3.1.2.tgz#6b66ad34998fc9520c2f1e4d5fa4091641c1597a"

View File

@ -31,6 +31,7 @@
"sockjs-client": "^1.4.0",
"stompjs": "^2.3.3",
"swiper": "^6.3.5",
"uuid": "^8.3.2",
"view-design": "^4.2.0",
"vue": "^2.6.10",
"vue-apexcharts": "^1.5.1",
@ -48,8 +49,7 @@
"vuex": "^3.4.0",
"wangeditor": "^4.5.3",
"xlsx": "^0.16.2",
"xss": "^1.0.7",
"uuid": "^8.3.2"
"xss": "^1.0.7"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.4.4",

View File

@ -5,6 +5,13 @@ import { getRequest, postRequest, putRequest, deleteRequest} from '@/libs/axios'
export const getManagerBrandPage = (params) => {
return getRequest('/goods/brand/getByPage', params)
}
// 批量删除
export const delBrand = (ids) =>{
return deleteRequest(`/goods/brand/delByIds/${ids}`)
}
// 添加
export const addBrand = (params) => {
return postRequest('/goods/brand', params)
@ -69,15 +76,15 @@ export const disableCategory = (id, type) => {
// 获取商品规格分页列表
export const getSpecListData = (params) => {
return getRequest('/goods/spec/page', params)
return getRequest('/goods/spec', params)
}
// 添加或修改规格设置
export const insertSpec = (params) => {
return postRequest('/goods/spec', params)
}
// 添加或修改规格设置
export const updateSpec = (params) => {
return putRequest('/goods/spec', params)
export const updateSpec = (id,params) => {
return putRequest(`/goods/spec/${id}`, params)
}
//根据分类id获取关联规格
export const getCategorySpecListData = (category_id, params) => {
@ -87,15 +94,6 @@ export const getCategorySpecListData = (category_id, params) => {
export const delSpec = (id, params) => {
return deleteRequest(`/goods/spec/${id}`, params)
}
// 获取商品规格值列表
export const getSpecValuesListData = (id, params) => {
return getRequest(`/goods/specValues/values/${id}`, params)
}
// 添加商品规格值
export const saveSpecValues = (id, params) => {
return postRequest(`/goods/specValues/save/${id}`, params)
}
// 查询某分类下的全部子分类列表
export const getGoodsCategory = (parent_id) => {

View File

@ -30,7 +30,7 @@ export const getLiveList = params => {
// 获取直播间详情
export const getLiveInfo = studioId => {
return getRequest(`/broadcast/studio/studioInfo/${studioId}`);
return getRequest(`/broadcast/studio/${studioId}`);
};
// 获取当前进行中的促销活动商品

View File

@ -64,14 +64,6 @@ service.interceptors.response.use(
}
return data;
break;
case 403:
// 权限不足
if (data.message !== null) {
Message.error(data.message);
} else {
Message.error("权限不足");
}
break;
case 500:
// 系统异常
if (data.message !== null) {
@ -89,6 +81,8 @@ service.interceptors.response.use(
if (error.response) {
if (error.response.status === 401) {
// 这种情况一般调到登录页
} else if (error.response.status === 404) {
// 避免刷新token报错
} else if (error.response.status === 403) {
isRefreshToken++;
if(isRefreshToken === 1) {

View File

@ -6,7 +6,7 @@ import ViewUI from 'view-design'
import './styles/theme.less';
import "core-js/stable"
import "regenerator-runtime/runtime"
// import "regenerator-runtime/runtime"
import App from './App'
import { router } from './router/index'
import store from './store'

View File

@ -16,6 +16,22 @@ export function unitPrice(val, unit, location) {
return (unit || '') + price
}
/**
* 订单来源
*/
export function clientTypeWay(val) {
if (val == "H5") {
return "移动端";
} else if (val == "PC") {
return "PC端";
} else if (val == "WECHAT_MP") {
return "小程序端";
} else if (val == "APP") {
return "移动应用端";
} else {
return val;
}
}

View File

@ -147,21 +147,13 @@ export default {
sortable: false,
render: (h, params) => {
if (params.row.distributionStatus == "PASS") {
return h("Badge", {
props: { status: "success", text: "审核通过" },
});
return h("Tag", {props: {color: "green",},},"通过");
} else if (params.row.distributionStatus == "APPLY") {
return h("Badge", {
props: { status: "processing", text: "申请中" },
});
return h("Tag", {props: {color: "geekblue",},},"待审核");
} else if (params.row.distributionStatus == "RETREAT") {
return h("Badge", {
props: { status: "warning", text: "已清退" },
});
return h("Tag", {props: {color: "volcano",},},"清退");
} else if (params.row.distributionStatus == "REFUSE") {
return h("Badge", {
props: { status: "error", text: "审核拒绝" },
});
return h("Tag", {props: {color: "red",},},"拒绝");
}
},
},

View File

@ -67,10 +67,12 @@ export default {
{
type: "selection",
width: 60,
align: "center"
align: "center",
fixed: "left",
},
{
title: "商品图片",
fixed: "left",
key: "thumbnail",
width: 120,
align: "center",

View File

@ -38,6 +38,12 @@
<Option value="DOWN">下架</Option>
</Select>
</Form-item>
<Form-item label="商品类型" prop="status">
<Select v-model="searchForm.goodsType" placeholder="请选择" clearable style="width: 200px">
<Option value="PHYSICAL_GOODS">实物商品</Option>
<Option value="VIRTUAL_GOODS">虚拟商品</Option>
</Select>
</Form-item>
<Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search" >搜索</Button>
</Form>
</Row>
@ -174,29 +180,29 @@ export default {
);
},
},
{
title: "商品类型",
key: "goodsType",
width: 130,
render: (h, params) => {
if (params.row.goodsType === 'PHYSICAL_GOODS') {
return h("Tag", {props: {color: "green",},}, "实物商品");
} else if (params.row.goodsType === 'VIRTUAL_GOODS') {
return h("Tag", {props: {color: "volcano",},}, "虚拟商品");
} else {
return h("Tag", {props: {color: "geekblue",},}, "电子卡券");
}
},
},
{
title: "状态",
key: "marketEnable",
width: 100,
render: (h, params) => {
if (params.row.marketEnable == "DOWN") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "下架",
},
}),
]);
return h("Tag", {props: {color: "green"},},"上架");
} else if (params.row.marketEnable == "UPPER") {
return h("div", [
h("Badge", {
props: {
status: "success",
text: "上架",
},
}),
]);
return h("Tag", {props: {color: "volcano",},},"下架");
}
},
},
@ -206,36 +212,14 @@ export default {
width: 130,
render: (h, params) => {
if (params.row.isAuth == "TOBEAUDITED") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "待审核",
},
}),
]);
return h("Tag", {props: {color: "volcano",},},"待审核");
} else if (params.row.isAuth == "PASS") {
return h("div", [
h("Badge", {
props: {
status: "success",
text: "审核通过",
},
}),
]);
return h("Tag", {props: {color: "green"},},"通过");
} else if (params.row.isAuth == "REFUSE") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "审核拒绝",
},
}),
]);
return h("Tag", {props: {color: "red",},},"拒绝");
}
},
},
{
title: "店铺名称",
key: "storeName",

View File

@ -1,25 +1,13 @@
<style lang="scss">
@import "@/styles/table-common.scss";
@import "@/styles/table-common.scss";
</style>
<template>
<div class="search">
<Card>
<Row @keydown.enter.native="handleSearch">
<Form
ref="searchForm"
:model="searchForm"
inline
:label-width="70"
class="search-form"
>
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="品牌名称" prop="name">
<Input
type="text"
v-model="searchForm.name"
placeholder="请输入品牌名称"
clearable
style="width: 200px"
/>
<Input type="text" v-model="searchForm.name" placeholder="请输入品牌名称" clearable style="width: 200px" />
</Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
@ -28,370 +16,361 @@
<Row class="operation padding-row">
<Button @click="add" type="primary">添加</Button>
</Row>
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
sortable="custom"
@on-sort-change="changeSort"
@on-selection-change="changeSelect"
></Table>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" @on-sort-change="changeSort" @on-selection-change="changeSelect"></Table>
<Row type="flex" justify="end" class="page">
<Page
:current="searchForm.pageNumber"
:total="total"
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-elevator
show-sizer
></Page>
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small"
show-total show-elevator show-sizer></Page>
</Row>
</Card>
<Modal
:title="modalTitle"
v-model="modalVisible"
:mask-closable="false"
:width="500"
>
<Modal :title="modalTitle" v-model="modalVisible" :mask-closable="false" :width="500">
<Form ref="form" :model="form" :label-width="100" :rules="formValidate">
<FormItem label="品牌名称" prop="name">
<Input v-model="form.name" clearable style="width: 100%"/>
<Input v-model="form.name" clearable style="width: 100%" />
</FormItem>
<FormItem label="品牌图标" prop="logo">
<upload-pic-input
v-model="form.logo"
style="width: 100%"
></upload-pic-input>
<upload-pic-input v-model="form.logo" style="width: 100%"></upload-pic-input>
</FormItem>
</Form>
<div slot="footer">
<Button type="text" @click="modalVisible = false">取消</Button>
<Button type="primary" :loading="submitLoading" @click="handleSubmit"
>提交
</Button
>
<Button type="primary" :loading="submitLoading" @click="handleSubmit">
</Button>
</div>
</Modal>
</div>
</template>
<script>
import {getManagerBrandPage, addBrand,updateBrand, disableBrand} from "@/api/goods";
import uploadPicInput from "@/views/my-components/lili/upload-pic-input";
import {
getManagerBrandPage,
addBrand,
updateBrand,
disableBrand,
delBrand,
} from "@/api/goods";
import uploadPicInput from "@/views/my-components/lili/upload-pic-input";
export default {
name: "brand",
components: {
uploadPicInput,
},
data() {
return {
loading: true, //
modalType: 0, //
modalVisible: false, //
modalTitle: "", //
searchForm: {
//
pageNumber: 1, //
pageSize: 10, //
sort: "create_time", //
order: "desc", //
export default {
name: "brand",
components: {
uploadPicInput,
},
data() {
return {
loading: true, //
modalType: 0, //
modalVisible: false, //
modalTitle: "", //
searchForm: {
//
pageNumber: 1, //
pageSize: 10, //
sort: "create_time", //
order: "desc", //
},
form: {
//
name: "",
logo: "",
deleteFlag: "",
},
//
formValidate: {},
submitLoading: false, //
selectList: [], //
selectCount: 0, //
columns: [
{
title: "品牌名称",
key: "name",
width: 200,
resizable: true,
sortable: false,
},
form: {
//
name: "",
logo: "",
deleteFlag: "",
{
title: "品牌图标",
key: "logo",
align: "left",
render: (h, params) => {
return h("img", {
attrs: {
src: params.row.logo,
alt: "加载图片失败",
},
style: {
cursor: "pointer",
width: "80px",
height: "60px",
margin: "10px 0",
"object-fit": "contain",
},
});
},
},
//
formValidate: {},
submitLoading: false, //
selectList: [], //
selectCount: 0, //
columns: [
{
title: "品牌名称",
key: "name",
width: 200,
resizable: true,
sortable: false,
},
{
title: "品牌图标",
key: "logo",
align: "left",
render: (h, params) => {
return h("img", {
attrs: {
src: params.row.logo,
alt: "加载图片失败",
},
style: {
cursor: "pointer",
width: "80px",
height: "60px",
margin: "10px 0",
"object-fit": "contain",
},
});
},
},
{
title: "状态",
key: "deleteFlag",
align: "left",
render: (h, params) => {
if (params.row.deleteFlag == 0) {
return h("div", [
h("Badge", {
props: {
status: "success",
text: "启用",
},
}),
]);
} else if (params.row.deleteFlag == 1) {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "禁用",
},
}),
]);
}
},
filters: [
{
label: "启用",
value: 0,
},
{
label: "禁用",
value: 1,
},
],
filterMultiple: false,
filterMethod(value, row) {
if (value == 0) {
return row.deleteFlag == 0;
} else if (value == 1) {
return row.deleteFlag == 1;
}
},
},
{
title: "操作",
key: "action",
width: 180,
align: "center",
fixed: "right",
render: (h, params) => {
let enableOrDisable = "";
if (params.row.deleteFlag == 0) {
enableOrDisable = h(
"Button",
{
props: {
size: "small",
type: "error",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.disable(params.row);
},
},
},
"禁用"
);
} else {
enableOrDisable = h(
"Button",
{
props: {
type: "success",
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.enable(params.row);
},
},
},
"启用"
);
}
return h("div", [
h(
"Button",
{
props: {
type: "info",
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.edit(params.row);
},
},
},
"编辑"
),
enableOrDisable,
]);
},
},
],
data: [], //
total: 0, //
};
},
methods: {
init() {
this.getDataList();
},
changePage(v) {
this.searchForm.pageNumber = v;
this.getDataList();
this.clearSelectAll();
},
changePageSize(v) {
this.searchForm.pageSize = v;
this.getDataList();
},
handleSearch() {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.getDataList();
},
changeSort(e) {
this.searchForm.sort = e.key;
this.searchForm.order = e.order;
if (e.order === "normal") {
this.searchForm.order = "";
}
this.getDataList();
},
clearSelectAll() {
this.$refs.table.selectAll(false);
},
changeSelect(e) {
this.selectList = e;
this.selectCount = e.length;
},
getDataList() {
this.loading = true;
//
getManagerBrandPage(this.searchForm).then((res) => {
this.loading = false;
if (res.success) {
console.warn(12)
this.data = res.result.records;
this.total = res.result.total;
}
});
},
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.submitLoading = true;
if (this.modalType === 0) {
// id
delete this.form.id;
addBrand(this.form).then((res) => {
this.submitLoading = false;
if (res.success) {
this.$Message.success("操作成功");
this.getDataList();
this.modalVisible = false;
}
});
} else {
//
updateBrand(this.form).then((res) => {
this.submitLoading = false;
if (res.success) {
this.$Message.success("操作成功");
this.getDataList();
this.modalVisible = false;
}
});
{
title: "状态",
key: "deleteFlag",
align: "left",
render: (h, params) => {
if (params.row.deleteFlag == 0) {
return h("Tag", {props: {color: "green",},},"启用");
} else if (params.row.deleteFlag == 1) {
return h("Tag", {props: {color: "volcano",},},"禁用");
}
}
});
},
add() {
this.modalType = 0;
this.modalTitle = "添加";
this.$refs.form.resetFields();
delete this.form.id;
this.modalVisible = true;
},
edit(v) {
this.modalType = 1;
this.modalTitle = "编辑";
this.$refs.form.resetFields();
// null""
for (let attr in v) {
if (v[attr] === null) {
v[attr] = "";
},
filters: [
{
label: "启用",
value: 0,
},
{
label: "禁用",
value: 1,
},
],
filterMultiple: false,
filterMethod(value, row) {
if (value == 0) {
return row.deleteFlag == 0;
} else if (value == 1) {
return row.deleteFlag == 1;
}
},
},
{
title: "操作",
key: "action",
width: 180,
align: "center",
fixed: "right",
render: (h, params) => {
let enableOrDisable = "";
if (params.row.deleteFlag == 0) {
enableOrDisable = h(
"Button",
{
props: {
size: "small",
type: "error",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.disable(params.row);
},
},
},
"禁用"
);
} else {
enableOrDisable = h(
"Button",
{
props: {
type: "success",
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.enable(params.row);
},
},
},
"启用"
);
}
return h("div", [
h(
"Button",
{
props: {
type: "info",
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.edit(params.row);
},
},
},
"编辑"
),
enableOrDisable,
h(
"Button",
{
props: {
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.delBrand(params.row.id);
},
},
},
"删除"
),
]);
},
},
],
data: [], //
total: 0, //
};
},
methods: {
//
async delBrand(id) {
let res = await delBrand(id);
if (res.success) {
this.$Message.success("品牌删除成功!");
this.getDataList();
}
},
init() {
this.getDataList();
},
changePage(v) {
this.searchForm.pageNumber = v;
this.getDataList();
this.clearSelectAll();
},
changePageSize(v) {
this.searchForm.pageSize = v;
this.getDataList();
},
handleSearch() {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.getDataList();
},
changeSort(e) {
this.searchForm.sort = e.key;
this.searchForm.order = e.order;
if (e.order === "normal") {
this.searchForm.order = "";
}
this.getDataList();
},
clearSelectAll() {
this.$refs.table.selectAll(false);
},
changeSelect(e) {
this.selectList = e;
this.selectCount = e.length;
},
getDataList() {
this.loading = true;
//
getManagerBrandPage(this.searchForm).then((res) => {
this.loading = false;
if (res.success) {
console.warn(12);
this.data = res.result.records;
this.total = res.result.total;
}
});
},
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
this.submitLoading = true;
if (this.modalType === 0) {
// id
delete this.form.id;
addBrand(this.form).then((res) => {
this.submitLoading = false;
if (res.success) {
this.$Message.success("操作成功");
this.getDataList();
this.modalVisible = false;
}
});
} else {
//
updateBrand(this.form).then((res) => {
this.submitLoading = false;
if (res.success) {
this.$Message.success("操作成功");
this.getDataList();
this.modalVisible = false;
}
});
}
}
let str = JSON.stringify(v);
let data = JSON.parse(str);
this.form = data;
this.modalVisible = true;
},
enable(v) {
this.$Modal.confirm({
title: "确认启用",
content: "您确认要启用品牌 " + v.name + " ?",
loading: true,
onOk: () => {
disableBrand(v.id, {disable: false}).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("操作成功");
this.getDataList();
}
});
},
});
},
disable(v) {
this.$Modal.confirm({
title: "确认禁用",
content: "您确认要禁用品牌 " + v.name + " ?",
loading: true,
onOk: () => {
disableBrand(v.id, {disable: true}).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("操作成功");
this.getDataList();
}
});
},
});
},
});
},
mounted() {
this.init();
add() {
this.modalType = 0;
this.modalTitle = "添加";
this.$refs.form.resetFields();
delete this.form.id;
this.modalVisible = true;
},
};
edit(v) {
this.modalType = 1;
this.modalTitle = "编辑";
this.$refs.form.resetFields();
// null""
for (let attr in v) {
if (v[attr] === null) {
v[attr] = "";
}
}
let str = JSON.stringify(v);
let data = JSON.parse(str);
this.form = data;
this.modalVisible = true;
},
enable(v) {
this.$Modal.confirm({
title: "确认启用",
content: "您确认要启用品牌 " + v.name + " ?",
loading: true,
onOk: () => {
disableBrand(v.id, { disable: false }).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("操作成功");
this.getDataList();
}
});
},
});
},
disable(v) {
this.$Modal.confirm({
title: "确认禁用",
content: "您确认要禁用品牌 " + v.name + " ?",
loading: true,
onOk: () => {
disableBrand(v.id, { disable: true }).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("操作成功");
this.getDataList();
}
});
},
});
},
},
mounted() {
this.init();
},
};
</script>

View File

@ -11,7 +11,7 @@
<tree-table ref="treeTable" size="default" :loading="loading" :data="tableData" :columns="columns" :border="true" :show-index="false" :is-fold="true" :expand-type="false" primary-key="id">
<template slot="action" slot-scope="scope">
<Dropdown v-show="scope.row.level == 2" transfer="true" trigger="click">
<Dropdown v-show="scope.row.level == 2" transfer="true" trigger="click">
<Button size="small">
绑定
<Icon type="ios-arrow-down"></Icon>
@ -106,7 +106,7 @@
<Modal :title="modalSpecTitle" v-model="modalSpecVisible" :mask-closable="false" :width="500">
<Form ref="specForm" :model="specForm" :label-width="100">
<Select v-model="specForm.category_specs" multiple>
<Select v-model="specForm.categorySpecs" multiple>
<Option v-for="item in specifications" :value="item.id" :key="item.id" :label="item.specName">
</Option>
</Select>
@ -134,7 +134,6 @@ import {
} from "@/api/goods";
import TreeTable from "@/views/my-components/tree-table/Table/Table";
import uploadPicInput from "@/views/my-components/lili/upload-pic-input";
import * as filters from "@/utils/filters";
export default {
name: "lili-components",
@ -153,7 +152,7 @@ export default {
specifications: [], //
categoryId: "", // id
category_brands: [], //
category_specs: [], //
categorySpecs: [], //
expandLevel: 1, //
modalType: 0, //
modalVisible: false, //
@ -212,13 +211,17 @@ export default {
},
],
tableData: [],
categoryIndex: 0,
};
},
methods: {
changeSortCate(val) {
let way = this.categoryList.find((item) => {
return item.name == val;
let way = this.categoryList.find((item, index) => {
if (item.name == val) {
this.categoryIndex = index;
console.log((this.categoryIndex = index));
return item.name == val;
}
});
this.tableData = [way];
},
@ -236,7 +239,8 @@ export default {
//
getSpecList() {
getSpecificationList().then((res) => {
if (res.success) {
if (res.length != 0) {
this.specifications = res;
}
});
@ -244,7 +248,7 @@ export default {
//
brandOperation(v) {
getCategoryBrandListData(v.id).then((res) => {
console.warn(res)
console.warn(res);
this.categoryId = v.id;
this.modalBrandTitle = "品牌关联";
this.brandForm.categoryBrands = res.result.map((item) => item.id);
@ -257,7 +261,7 @@ export default {
getCategorySpecListData(v.id).then((res) => {
this.categoryId = v.id;
this.modalSpecTitle = "规格关联";
this.specForm.category_specs = res.map((item) => item.id);
this.specForm.categorySpecs = res.map((item) => item.id);
this.modalSpecVisible = true;
});
},
@ -337,7 +341,7 @@ export default {
this.submitLoading = false;
if (res.success) {
this.$Message.success("添加成功");
this.getAllList(0);
this.getAllList(this.categoryIndex);
this.modalVisible = false;
this.$refs.form.resetFields();
}
@ -348,7 +352,7 @@ export default {
this.submitLoading = false;
if (res.success) {
this.$Message.success("修改成功");
this.getAllList(0);
this.getAllList(this.categoryIndex);
this.modalVisible = false;
this.$refs.form.resetFields();
}
@ -376,13 +380,11 @@ export default {
});
},
getAllList(parent_id) {
this.sortCateList = []
this.sortCateList = [];
this.loading = true;
getCategoryTree(parent_id).then((res) => {
this.loading = false;
if (res.success) {
//
let expandLevel = this.expandLevel;
localStorage.setItem("category", JSON.stringify(res.result));
res.result.forEach((e, index, arr) => {
this.sortCateList.push({
@ -390,65 +392,13 @@ export default {
value: e.name,
});
this.sortCate = arr[0].name;
if (expandLevel == 1) {
if (e.level == 0) {
e.expand = false;
}
if (e.children && e.children.length > 0) {
e.children.forEach(function (c) {
if (c.level == 1) {
c.expand = false;
}
if (c.children && c.children.length > 0) {
c.children.forEach(function (b) {
if (b.level == 2) {
b.expand = false;
}
});
}
});
}
} else if (expandLevel == 2) {
if (e.level == 0) {
e.expand = true;
}
if (e.children && e.children.length > 0) {
e.children.forEach(function (c) {
if (c.level == 1) {
c.expand = false;
}
if (c.children && c.children.length > 0) {
c.children.forEach(function (b) {
if (b.level == 2) {
b.expand = false;
}
});
}
});
}
} else if (expandLevel == 3) {
if (e.level == 0) {
e.expand = true;
}
if (e.children && e.children.length > 0) {
e.children.forEach(function (c) {
if (c.level == 1) {
c.expand = true;
}
if (c.children && c.children.length > 0) {
c.children.forEach(function (b) {
if (b.level == 2) {
b.expand = false;
}
});
}
});
}
}
});
this.categoryList = res.result;
this.tableData = [res.result[0]];
this.$nextTick(() => {
this.$set(this, "tableData", [res.result[this.categoryIndex]]);
});
}
});
},
@ -508,22 +458,8 @@ export default {
background: #fff;
padding: 20px;
}
.article {
font-size: 16px;
font-weight: 400;
margin: 12px 0;
}
.href-text {
font-size: 12px;
}
.operation {
margin-bottom: 2vh;
}
.select-count {
font-weight: 600;
color: #40a9ff;
}
</style>

View File

@ -23,8 +23,8 @@
</Form>
</Row>
<Row class="operation padding-row">
<Button @click="add" type="primary" >添加</Button>
<Button @click="delAll" >批量删</Button>
<Button @click="add" type="primary">添加</Button>
<Button @click="delAll"></Button>
</Row>
<Table
:loading="loading"
@ -60,53 +60,33 @@
>
<Form ref="form" :model="form" :label-width="100" :rules="formValidate">
<FormItem label="规格名称" prop="specName">
<Input v-model="form.specName" maxlength="30" clearable style="width: 100%" />
<Input v-model="form.specName" maxlength="30" clearable style="width: 100%"/>
</FormItem>
<FormItem label="规格值" prop="specValue">
<Select
v-model="form.specValue"
placeholder="输入后回车添加"
multiple
filterable
allow-create
:popper-append-to-body="false"
popper-class="spec-values-popper"
style="width: 100%; text-align: left; margin-right: 10px"
>
<Option
v-for="item in specValue"
:value="item"
:label="item"
>
</Option>
</Select>
</FormItem>
</Form>
<div slot="footer">
<Button type="text" @click="modalVisible = false">取消</Button>
<Button type="primary" :loading="submitLoading" @click="saveSpec"
>提交</Button
>
</div>
</Modal>
<Modal
:title="modalTitle"
v-model="dialogSpecValuesVisible"
:mask-closable="false"
:width="500"
:styles="{ top: '30px' }"
class="permModal"
>
<Form ref="specForm" :model="specForm" :label-width="100">
<Select
v-model="specForm.specValue"
placeholder="输入后回车添加"
multiple
filterable
allow-create
:popper-append-to-body="false"
popper-class="spec-values-popper"
style="width: 100%; text-align: left; margin-right: 10px"
>
<Option
v-for="item in specValues"
:value="item.specValue"
:key="item.id"
:label="item.specValue"
>
</Option>
</Select>
</Form>
<div slot="footer">
<Button type="text" @click="dialogSpecValuesVisible = false"
>取消</Button
>
<Button
type="primary"
:loading="submitLoading"
@click="submitSpecValuesForm"
>提交</Button
>提交
</Button
>
</div>
</Modal>
@ -118,10 +98,9 @@ import {
getSpecListData,
insertSpec,
updateSpec,
delSpec,
getSpecValuesListData,
saveSpecValues,
delSpec
} from "@/api/goods";
export default {
name: "spec",
components: {},
@ -131,7 +110,6 @@ export default {
modalType: 0, //
modalVisible: false, //
modalTitle: "", //
dialogSpecValuesVisible: false, //
specTitle: "", //
searchForm: {
//
@ -145,9 +123,8 @@ export default {
specName: "",
specValue: "",
},
specForm: {},
/** 编辑规格值 */
specValues: [],
specValue: [],
//
formValidate: {},
submitLoading: false, //
@ -179,24 +156,7 @@ export default {
width: 250,
render: (h, params) => {
return h("div", [
h(
"Button",
{
props: {
type: "primary",
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.editSpec(params.row);
},
},
},
"编辑规格值"
),
h(
"Button",
{
@ -239,23 +199,28 @@ export default {
};
},
methods: {
//
init() {
this.getDataList();
},
//
changePage(v) {
this.searchForm.pageNumber = v;
this.getDataList();
this.clearSelectAll();
},
//
changePageSize(v) {
this.searchForm.pageSize = v;
this.getDataList();
},
//
handleSearch() {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.getDataList();
},
//
handleReset() {
this.$refs.searchForm.resetFields();
this.searchForm.pageNumber = 1;
@ -263,6 +228,7 @@ export default {
//
this.getDataList();
},
//
changeSort(e) {
this.searchForm.sort = e.key;
this.searchForm.order = e.order;
@ -271,36 +237,27 @@ export default {
}
this.getDataList();
},
//
clearSelectAll() {
this.$refs.table.selectAll(false);
},
//
changeSelect(e) {
this.selectList = e;
this.selectCount = e.length;
},
//
getDataList() {
this.loading = true;
//
getSpecListData(this.searchForm).then((res) => {
this.loading = false;
if (res.success) {
this.data = res.result.records;
this.total = res.result.total;
}
this.data = res.records;
this.total = res.total;
});
this.loading = false;
},
submitSpecValuesForm() {
saveSpecValues(this.specForm.specId, this.specForm).then((res) => {
this.submitLoading = false;
if (res.success) {
this.$Message.success("规格值保存成功");
this.getDataList();
this.modalVisible = false;
this.dialogSpecValuesVisible = false;
}
});
},
//
saveSpec() {
this.$refs.form.validate((valid) => {
if (valid) {
@ -318,7 +275,7 @@ export default {
});
} else {
//
updateSpec(this.form).then((res) => {
updateSpec(this.form.id, this.form).then((res) => {
this.submitLoading = false;
if (res.success) {
this.$Message.success("操作成功");
@ -330,6 +287,7 @@ export default {
}
});
},
//
add() {
this.modalType = 0;
this.modalTitle = "添加";
@ -337,31 +295,31 @@ export default {
delete this.form.id;
this.modalVisible = true;
},
//
edit(v) {
this.modalType = 1;
this.modalTitle = "编辑";
this.$refs.form.resetFields();
// null""
for (let attr in v) {
if (v[attr] === null) {
v[attr] = "";
}
}
let str = JSON.stringify(v);
let data = JSON.parse(str);
this.form = data;
let localVal = v.specValue;
this.form.specName = v.specName;
this.form.id = v.id;
this.form.specValue = v.specValue;
if (localVal && localVal.indexOf("," > 0)) {
this.form.specValue = localVal.split(",")
this.specValue = this.form.specValue
this.$set(this, 'specValue', this.form.specValue)
} else {
this.specValue = [];
}
this.modalVisible = true;
},
editSpec(v) {
getSpecValuesListData(v.id).then((res) => {
this.modalType = 1;
this.modalTitle = "编辑";
this.specValues = res.result;
this.specForm.specValue = res.result.map(item => item.specValue)
this.specForm.specId = v.id;
this.dialogSpecValuesVisible = true;
});
},
remove(v) {
this.$Modal.confirm({
title: "确认删除",
@ -415,5 +373,5 @@ export default {
};
</script>
<style lang="scss">
@import "@/styles/table-common.scss";
@import "@/styles/table-common.scss";
</style>

View File

@ -135,35 +135,11 @@ export default {
width: 90,
render: (h, params) => {
if (params.row.grade == "GOOD") {
return h(
"Tag",
{
props: {
color: "success",
},
},
"好评"
);
return h("Tag", {props: {color: "green",},}, "好评");
} else if (params.row.grade == "MODERATE") {
return h(
"Tag",
{
props: {
color: "warning",
},
},
"中评"
);
return h("Tag", {props: {color: "orange",},}, "中评");
} else {
return h(
"Tag",
{
props: {
color: "error",
},
},
"差评"
);
return h("Tag", {props: {color: "red",},}, "差评");
}
},
},

View File

@ -18,7 +18,7 @@
<Input type="text" @keyup="handleLink(linkItem,linkList.length)" v-model="linkItem.url" placeholder="https://"></Input>
</div>
</Poptip>
</div>
</Col>
</Row>
@ -74,7 +74,12 @@ export default {
icon: "md-happy",
___type: "sign",
},
{
title: "小程序直播",
icon: "ios-videocam",
___type: "live",
},
],
linkItem: {
title: "外部链接",

View File

@ -8,7 +8,7 @@
<Row type="flex" justify="center" class="copyright">
Copyright © 2020 - Present
<a
href="http://lili.cn"
href="https://pickmall.cn/"
target="_blank"
style="margin:0 5px;"
>lili-shop</a> {{ $t('rights') }}

View File

@ -131,23 +131,9 @@
sortable: false,
render: (h, params) => {
if (params.row.payStatus == "PAID") {
return h("div", [
h("Badge", {
props: {
status: "success",
text: "已付款",
},
}),
]);
} else if (params.row.payStatus == "UNPAID") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "未付款",
},
}),
]);
return h("Tag", {props: {color: "green",},}, "已付款");
} else {
return h("Tag", {props: {color: "red",},}, "未付款");
}
},
},

View File

@ -1,47 +1,48 @@
<template>
<div>
<vuedraggable
:list="uploadList"
:disabled="!draggable||!multiple"
:animation="200"
class="list-group"
ghost-class="thumb-ghost"
@end="onEnd"
>
<div class="upload-list" v-for="(item, index) in uploadList" :key="index">
<div v-if="item.status == 'finished'" style="height:60px;">
<img :src="item.url" />
<div class="upload-list-cover">
<Icon type="ios-eye-outline" @click="handleView(item.url)"></Icon>
<Icon type="ios-trash-outline" @click="handleRemove(item)"></Icon>
<div class="upload-pic-thumb">
<vuedraggable
:list="uploadList"
:disabled="!draggable||!multiple"
:animation="200"
class="list-group"
ghost-class="thumb-ghost"
@end="onEnd"
>
<div class="upload-list" v-for="(item, index) in uploadList" :key="index">
<div v-if="item.status == 'finished'" style="height:60px;">
<img :src="item.url" />
<div class="upload-list-cover">
<Icon type="ios-eye-outline" @click="handleView(item.url)"></Icon>
<Icon type="ios-trash-outline" @click="handleRemove(item)"></Icon>
</div>
</div>
<div v-else>
<Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>
</div>
</div>
<div v-else>
<Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>
</vuedraggable>
<Upload
ref="upload"
:multiple="multiple"
:show-upload-list="false"
:on-success="handleSuccess"
:on-error="handleError"
:format="['jpg','jpeg','png','gif']"
:max-size="maxSize*1024"
:on-format-error="handleFormatError"
:on-exceeded-size="handleMaxSize"
:before-upload="handleBeforeUpload"
type="drag"
:action="uploadFileUrl"
:headers="accessToken"
style="display: inline-block;width:58px;"
>
<div style="width: 58px;height:58px;line-height: 58px;">
<Icon type="md-camera" size="20"></Icon>
</div>
</div>
</vuedraggable>
<Upload
ref="upload"
:multiple="multiple"
:show-upload-list="false"
:on-success="handleSuccess"
:on-error="handleError"
:format="['jpg','jpeg','png','gif']"
:max-size="maxSize*1024"
:on-format-error="handleFormatError"
:on-exceeded-size="handleMaxSize"
:before-upload="handleBeforeUpload"
type="drag"
:action="uploadFileUrl"
:headers="accessToken"
style="display: inline-block;width:58px;"
>
<div style="width: 58px;height:58px;line-height: 58px;">
<Icon type="md-camera" size="20"></Icon>
</div>
</Upload>
</Upload>
</div>
<Modal title="图片预览" v-model="viewImage" :styles="{top: '30px'}" draggable>
<img :src="imgUrl" alt="无效的图片链接" style="width: 100%;margin: 0 auto;display: block;" />
<div slot="footer">
@ -242,6 +243,9 @@ export default {
</script>
<style lang="scss" scoped>
.upload-pic-thumb{
display: flex;
}
.upload-list {
display: inline-block;
width: 60px;
@ -255,6 +259,7 @@ export default {
position: relative;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
margin-right: 5px;
vertical-align: middle;
}
.upload-list img {
width: 100%;

View File

@ -98,14 +98,14 @@ export default {
}
},
created () {
this.getImg();
// this.getImg();
},
watch: {
verifyType: {
immediate: true,
handler: function (v) {
this.type = v;
this.refresh();
// this.refresh();
}
},
show (v) {

View File

@ -216,11 +216,11 @@
width: 100,
render: (h, params) => {
if (params.row.serviceType == "RETURN_MONEY") {
return h('div', [h('span', {}, '退款'),]);
return h('div', [h('tag', {props: {color: "blue"}}, '退款'),]);
} else if (params.row.serviceType == "RETURN_GOODS") {
return h('div', [h('span', {}, '退货'),]);
return h('div', [h('tag', {props: {color: "volcano"}}, '退货'),]);
} else if (params.row.serviceType == "EXCHANGE_GOODS") {
return h('div', [h('span', {}, '换货'),]);
return h('div', [h('tag', {props: {color: "green"}}, '换货'),]);
}
}
},
@ -231,27 +231,23 @@
width: 110,
render: (h, params) => {
if (params.row.serviceStatus == "APPLY") {
return h('div', [h('span', {}, '申请中'),]);
return h('div', [h('tag', {props: {color: "blue"}}, '申请中'),]);
} else if (params.row.serviceStatus == "PASS") {
return h('div', [h('span', {}, '通过售后'),]);
return h('div', [h('tag', {props: {color: "cyan"}}, '通过售后'),]);
} else if (params.row.serviceStatus == "REFUSE") {
return h('div', [h('span', {}, '拒绝售后'),]);
return h('div', [h('tag', {props: {color: "volcano"}}, '拒绝售后'),]);
} else if (params.row.serviceStatus == "BUYER_RETURN") {
return h('div', [h('span', {}, '买家退货,待卖家收货'),]);
} else if (params.row.serviceStatus == "SELLER_RE_DELIVERY") {
return h('div', [h('span', {}, '商家换货/补发'),]);
return h('div', [h('tag', {props: {color: "orange"}}, '买家退货,待卖家收货'),]);
} else if (params.row.serviceStatus == "SELLER_CONFIRM") {
return h('div', [h('span', {}, '卖家确认收货'),]);
return h('div', [h('tag', {props: {color: "gold"}}, '卖家确认收货'),]);
} else if (params.row.serviceStatus == "SELLER_TERMINATION") {
return h('div', [h('span', {}, '卖家终止售后'),]);
} else if (params.row.serviceStatus == "BUYER_CONFIRM") {
return h('div', [h('span', {}, '买家确认收货'),]);
return h('div', [h('tag', {props: {color: "lime"}}, '卖家终止售后'),]);
} else if (params.row.serviceStatus == "BUYER_CANCEL") {
return h('div', [h('span', {}, '买家取消售后'),]);
return h('div', [h('tag', {props: {color: "purple"}}, '买家取消售后'),]);
} else if (params.row.serviceStatus == "COMPLETE") {
return h('div', [h('span', {}, '完成售后'),]);
return h('div', [h('tag', {props: {color: "green"}}, '完成售后'),]);
}else if (params.row.serviceStatus == "WAIT_REFUND") {
return h('div', [h('span', {}, '待平台退款'),]);
return h('div', [h('tag', {props: {color: "geekblue"}}, '待平台退款'),]);
}
}
},

View File

@ -191,17 +191,17 @@
width: 100,
render: (h, params) => {
if (params.row.complainStatus == "NEW") {
return h('div', [h('span', { }, '新投诉'),]);
return h('div', [h('tag',{props: {color: "purple"}}, '新投诉'),]);
} else if (params.row.complainStatus == "CANCEL") {
return h('div', [h('span', { }, '已撤销'),]);
return h('div', [h('tag', {props: {color: "cyan"}}, '已撤销'),]);
} else if (params.row.complainStatus == "WAIT_APPEAL") {
return h('div', [h('span', { }, '待申诉'),]);
return h('div', [h('tag', {props: {color: "volcano"}}, '待申诉'),]);
} else if (params.row.complainStatus == "COMMUNICATION") {
return h('div', [h('span', { }, '对话中'),]);
return h('div', [h('tag', {props: {color: "orange"}}, '对话中'),]);
}else if (params.row.complainStatus == "WAIT_ARBITRATION") {
return h('div', [h('span', { }, '等待仲裁'),]);
return h('div', [h('tag', {props: {color: "blue"}}, '等待仲裁'),]);
}else if (params.row.complainStatus == "COMPLETE") {
return h('div', [h('span', { }, '已完成'),]);
return h('div', [h('tag', {props: {color: "green"}}, '已完成'),]);
}
}
},

View File

@ -72,51 +72,13 @@ export default {
align: "center",
render: (h, params) => {
if (params.row.paymentMethod === "WECHAT") {
return h("div", [
h(
"Tag",
{
props: {
color: "green",
},
},
"微信"
),
]);
return h("div", [h("Tag", {props: {color: "green",},}, "微信"),]);
} else if (params.row.paymentMethod === "ALIPAY") {
return h("div", [
h(
"Tag",
{
props: {
color: "blue",
},
},
"支付宝"
),
]);
return h("div", [h("Tag", {props: {color: "blue",},}, "支付宝"),]);
} else if (params.row.paymentMethod === "WALLET") {
return h("div", [
h(
"Tag",
{
props: {},
},
"余额支付"
),
]);
return h("div", [h("Tag", {props: {color: "geekblue",},}, "余额支付"),]);
} else if (params.row.paymentMethod === "BANK_TRANSFER") {
return h("div", [
h(
"Tag",
{
props: {
color: "orange",
},
},
"银行转帐"
),
]);
return h("div", [h("Tag", {props: {color: "orange",},}, "银行转帐"),]);
} else {
return h("div", [h("Tag", {}, "暂未付款")]);
}

View File

@ -100,9 +100,9 @@ export default {
width: 95,
render: (h, params) => {
if (params.row.isRefund == "1") {
return h("div", [h("span", {}, "已退款")]);
return h("div", [h("Tag", {props: {color: "green",},}, "已退款")]);
} else {
return h("div", [h("span", {}, "未退款")]);
return h("div", [h("Tag", {props: {color: "orange",},}, "未退款")]);
}
},
},

View File

@ -94,8 +94,8 @@
//
pageNumber: 1, //
pageSize: 10, //
sort: "createTime", //
order: "desc", //
sort: "", //
order: "", //
startDate: "", //
endDate: "", //
orderType: "FICTITIOUS",
@ -118,8 +118,6 @@
title: "下单时间",
key: "createTime",
width: 200,
sortable: true,
sortType: "desc",
},
{
title: "订单来源",
@ -150,19 +148,15 @@
width:95,
render: (h, params) => {
if (params.row.orderStatus == "UNPAID") {
return h('div', [h('span', { }, '未付款'),]);
return h("div", [h("tag", {props: {color: "magenta"}}, "未付款")]);
} else if (params.row.orderStatus == "PAID") {
return h('div', [h('span', { }, '已付款'),]);
} else if (params.row.orderStatus == "UNDELIVERED") {
return h('div', [h('span', { }, '待发货'),]);
} else if (params.row.orderStatus == "DELIVERED") {
return h('div', [h('span', { }, '已发货'),]);
}else if (params.row.orderStatus == "COMPLETED") {
return h('div', [h('span', { }, '已完成'),]);
}else if (params.row.orderStatus == "TAKE") {
return h('div', [h('span', { }, '待核验'),]);
}else if (params.row.orderStatus == "CANCELLED") {
return h('div', [h('span', { }, '已取消'),]);
return h("div", [h("tag", {props: {color: "blue"}}, "已付款")]);
} else if (params.row.orderStatus == "COMPLETED") {
return h("div", [h("tag", {props: {color: "green"}}, "已完成")]);
} else if (params.row.orderStatus == "TAKE") {
return h("div", [h("tag", {props: {color: "volcano"}}, "待核验")]);
} else if (params.row.orderStatus == "CANCELLED") {
return h("div", [h("tag", {props: {color: "red"}}, "已取消")]);
}
}
},

View File

@ -37,7 +37,7 @@
<div class="div-item">
<div class="div-item-left">订单来源</div>
<div class="div-item-right">
{{ orderInfo.order.clientType }}
{{ orderInfo.order.clientType | clientTypeWay}}
</div>
</div>

View File

@ -40,7 +40,7 @@
</Row>
<div>
<download-excel class="export-excel-wrapper" :data="data" :fields="fields" name="商品订单.xls">
<Button type="primary" class="export">
<Button type="info" class="export">
导出Excel
</Button>
</download-excel>
@ -72,10 +72,6 @@ export default {
订单编号: "sn",
下单时间: "createTime",
客户名称: "memberName",
客户账号: "",
收货人: "",
收货人手机号: "",
收货人地址: "",
支付方式: {
field: "clientType",
callback: (value) => {
@ -92,15 +88,7 @@ export default {
}
},
},
配送方式: "",
配送费用: "",
订单商品金额: "",
订单优惠金额: "",
订单应付金额: "",
商品SKU编号: "",
商品数量: "groupNum",
买家备注: "",
订单状态: "",
付款状态: {
field: "payStatus",
callback: (value) => {
@ -111,9 +99,6 @@ export default {
: "";
},
},
发货状态: "",
发票类型: "",
发票抬头: "",
店铺: "storeName",
},
loading: true, //
@ -166,13 +151,13 @@ export default {
width: 120,
render: (h, params) => {
if (params.row.orderType == "NORMAL") {
return h("div", [h("span", {}, "普通订单")]);
return h("div", [h("tag", {props: {color: "blue"}}, "普通订单")]);
} else if (params.row.orderType == "PINTUAN") {
return h("div", [h("span", {}, "拼团订单")]);
return h("div", [h("tag", {props: {color: "volcano"}}, "拼团订单")]);
} else if (params.row.orderType == "GIFT") {
return h("div", [h("span", {}, "赠品订单")]);
return h("div", [h("tag", {props: {color: "green"}}, "赠品订单")]);
} else if (params.row.orderType == "VIRTUAL") {
return h("div", [h("tag", {}, "核验订单")]);
return h("div", [h("tag", {props: {color: "geekblue"}}, "核验订单")]);
}
},
},
@ -202,19 +187,19 @@ export default {
minWidth: 100,
render: (h, params) => {
if (params.row.orderStatus == "UNPAID") {
return h("div", [h("span", {}, "未付款")]);
return h("div", [h("tag", {props: {color: "magenta"}}, "未付款")]);
} else if (params.row.orderStatus == "PAID") {
return h("div", [h("span", {}, "已付款")]);
return h("div", [h("tag", {props: {color: "blue"}}, "已付款")]);
} else if (params.row.orderStatus == "UNDELIVERED") {
return h("div", [h("span", {}, "待发货")]);
return h("div", [h("tag", {props: {color: "geekblue"}}, "待发货")]);
} else if (params.row.orderStatus == "DELIVERED") {
return h("div", [h("span", {}, "已发货")]);
return h("div", [h("tag", {props: {color: "cyan"}}, "已发货")]);
} else if (params.row.orderStatus == "COMPLETED") {
return h("div", [h("span", {}, "已完成")]);
return h("div", [h("tag", {props: {color: "green"}}, "已完成")]);
} else if (params.row.orderStatus == "TAKE") {
return h("div", [h("span", {}, "待核验")]);
return h("div", [h("tag", {props: {color: "volcano"}}, "待核验")]);
} else if (params.row.orderStatus == "CANCELLED") {
return h("div", [h("span", {}, "已取消")]);
return h("div", [h("tag", {props: {color: "red"}}, "已取消")]);
}
},
},
@ -222,56 +207,23 @@ export default {
title: "下单时间",
key: "createTime",
width: 170,
sortable: true,
sortType: "desc",
},
{
title: "操作",
key: "action",
align: "center",
width: 100,
width: 150,
render: (h, params) => {
return h("div", [
h(
"Button",
{
props: {
type: "primary",
size: "small",
},
attrs: {
disabled: params.row.orderStatus == "UNPAID" ? false : true,
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.confirmPrice(params.row);
},
},
},
"收款"
return h("div", [h("Button", {props: {type: "primary", size: "small",},
attrs: {disabled: params.row.orderStatus == "UNPAID" ? false : true,},
style: {marginRight: "5px",},
on: {click: () => {this.confirmPrice(params.row);},},
}, "收款"
),
h(
"Button",
{
props: {
type: "info",
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.detail(params.row);
},
},
},
"查看"
h("Button", {props: {type: "info", size: "small",},
style: {marginRight: "5px",},
on: {click: () => {this.detail(params.row);},},
}, "查看"
),
]);
},

View File

@ -57,7 +57,7 @@
<Input type="number" v-model="form.sort" clearable style="width: 10%" />
</FormItem>
<FormItem class="form-item-view-el" label="文章内容" prop="content">
<editor openXss v-model="form.content"></editor>
<editor openXss v-model="form.content"></editor>
</FormItem>
<FormItem label="是否展示" prop="openStatus">
<i-switch size="large" v-model="form.openStatus" :true-value="open" :false-value="close">
@ -435,28 +435,13 @@ export default {
this.form.categoryId = res.result.categoryId;
this.treeValue = data.articleCategoryName;
this.form.id = data.id;
this.form.content = htmlEscape(res.result.content);
this.form.content =res.result.content;
this.form.title = res.result.title;
this.form.sort = res.result.sort;
this.form.openStatus = res.result.openStatus;
}
});
},
htmlEscape(text) {
return text.replace(/[<>"&]/g, function (match, pos, originalText) {
switch (match) {
case "<":
return "&lt;";
case ">":
return "&gt;";
case "&":
return "&amp;";
case '"':
return "&quot;";
}
});
},
remove(v) {
this.$Modal.confirm({
title: "确认删除",

View File

@ -101,7 +101,7 @@ export default {
{
title: "面额/折扣",
key: "price",
width: 120,
width: 100,
render: (h, params) => {
if (params.row.price) {
return h(
@ -117,27 +117,28 @@ export default {
{
title: "领取数量/总数量",
key: "publishNum",
width: 150,
width: 130,
render: (h, params) => {
return h(
"div",
params.row.receivedNum + "/" + params.row.publishNum
);
},
minWidth: 130,
},
{
title: "优惠券类型",
key: "couponType",
width: 120,
render: (h, params) => {
let text = "未知";
let text = "";
if (params.row.couponType === "DISCOUNT") {
text = "打折";
return h("Tag", {props: {color: "blue",},}, "打折");
} else if (params.row.couponType === "PRICE") {
text = "减免现金";
return h("Tag", {props: {color: "geekblue",},}, "减免现金");
}else {
return h("Tag", {props: {color: "purple",},}, "未知");
}
return h("div", [text]);
},
},
{
@ -160,7 +161,7 @@ export default {
},
{
title: "活动时间",
width: 150,
render: (h, params) => {
if (params.row.getType === "ACTIVITY") {
return h("div", "长期有效");
@ -184,7 +185,7 @@ export default {
color = "red";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "default";
color = "geekblue";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "green";

View File

@ -39,9 +39,11 @@
</FormItem>
<FormItem label="发放数量" prop="publishNum" v-if="form.getType==='FREE'">
<Input v-model="form.publishNum" placeholder="发放数量" style="width: 260px"/>
<div class="tips">如果发放数量为0时,则代表不限制发放数量</div>
</FormItem>
<FormItem label="领取数量限制" prop="couponLimitNum" v-if="form.getType==='FREE'">
<Input v-model="form.couponLimitNum" placeholder="领取限制" clearable style="width: 260px"/>
<div class="tips">如果领取数量为0时,则代表不限制领取数量</div>
</FormItem>
<FormItem label="范围描述" prop="description">
<Input v-model="form.description" type="textarea" :rows="4" maxlength="50" show-word-limit clearable
@ -576,5 +578,9 @@ h4 {
margin: 0 4px;
}
}
.tips {
font-size: 12px;
color: #999;
}
</style>

View File

@ -44,7 +44,7 @@ export default {
//
pageNumber: 0, //
pageSize: 10, //
sort: "startTime", //
sort: "createTime", //
order: "desc", //
},
form: {

View File

@ -132,19 +132,19 @@ export default {
minWidth: 60,
render: (h, params) => {
let text = "未知",
color = "default";
color = "purple";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "default";
color = "geekblue";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "green";
color = "blue";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "blue";
color = "green";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "red";
color = "volcano";
}
return h("div", [
h(

View File

@ -119,14 +119,13 @@ export default {
{
title: "直播状态",
render: (h, params) => {
return h(
"span",
params.row.status == "NEW"
? "未开始"
: params.row.status == "START"
? "直播中"
: "已结束"
);
if(params.row.status == "NEW"){
return h("div", [h("tag", {props: {color: "blue"}}, "未开始")]);
}else if(params.row.status == "START"){
return h("div", [h("tag", {props: {color: "green"}}, "直播中")]);
}else{
return h("div", [h("tag", {props: {color: "volcano"}}, "已结束")]);
}
},
},
{

View File

@ -122,16 +122,16 @@ export default {
color = "";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "default";
color = "geekblue";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "green";
color = "blue";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "blue";
color = "green";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "red";
color = "volcano";
}
return h("div", [
h(

View File

@ -2,78 +2,37 @@
<div class="search">
<Card>
<Row>
<Form
ref="searchForm"
:model="searchForm"
inline
:label-width="70"
class="search-form"
>
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="商品名称">
<Input
type="text"
v-model="searchForm.goodsName"
placeholder="请输入商品名称"
clearable
style="width: 200px"
/>
<Input type="text" v-model="searchForm.goodsName" placeholder="请输入商品名称" clearable style="width: 200px" />
</Form-item>
<Form-item label="积分区间">
<Input
type="text"
v-model="searchForm.pointsS"
placeholder="请输入开始区间"
clearable
style="width: 200px"
/>
<Input type="text" v-model="searchForm.pointsS" placeholder="请输入开始区间" clearable style="width: 200px" />
-
<Input
type="text"
v-model="searchForm.pointsE"
placeholder="请输入结束区间"
clearable
style="width: 200px"
/>
<Input type="text" v-model="searchForm.pointsE" placeholder="请输入结束区间" clearable style="width: 200px" />
</Form-item>
<Form-item label="状态">
<Select v-model="searchForm.promotionStatus" style="width: 200px">
<Option
v-for="item in statusList"
:value="item.value"
:key="item.value"
>{{ item.label }}</Option
>
<Option v-for="item in statusList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
</Form-item>
<Form-item label="SKU编码">
<Input
type="text"
v-model="searchForm.skuId"
placeholder="请输入SKU编码"
clearable
style="width: 200px"
/>
<Input type="text" v-model="searchForm.skuId" placeholder="请输入SKU编码" clearable style="width: 200px" />
</Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
</Form>
</Row>
<Row class="operation padding-row">
<Button @click="addPointsGoods" type="primary" >添加积分商品</Button>
<Button @click="addPointsGoods" type="primary">添加积分商品</Button>
</Row>
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
>
<Table :loading="loading" border :columns="columns" :data="data" ref="table">
<template slot-scope="{ row }" slot="goodsName">
<div>
<a class="mr_10" @click="linkTo(row.goodsSku.goodsId,row.goodsSku.skuId)">{{row.goodsSku.goodsName}}</a>
<Poptip trigger="hover" title="扫码在手机中查看" transfer>
<div slot="content">
<vue-qr :text="wapLinkTo(row.goodsSku.goodsId,row.goodsSku.skuId)" :margin="0" colorDark="#000" colorLight="#fff" :size="150"></vue-qr>
<vue-qr :text="wapLinkTo(row.goodsSku.goodsId,row.goodsSku.skuId)" :margin="0" colorDark="#000" colorLight="#fff" :size="150"></vue-qr>
</div>
<img src="../../../assets/qrcode.svg" style="vertical-align:middle;" class="hover-pointer" width="20" height="20" alt="">
</Poptip>
@ -92,50 +51,17 @@
<div>{{ row.startTime }}</div>
<div>{{ row.endTime }}</div>
</template>
<template slot-scope="{ row }" slot="action">
<Button
v-if="row.promotionStatus == 'NEW'"
type="info"
size="small"
@click="edit(row.id)"
style="margin-right: 5px"
>编辑</Button
>
<Button
v-if="row.promotionStatus == 'START'"
type="warning"
size="small"
@click="statusChanged(row.id, 'CLOSE')"
style="margin-right: 5px"
>停用</Button
>
<Button
v-if="row.promotionStatus == 'CLOSE'"
type="warning"
size="small"
@click="statusChanged(row.id, 'START')"
style="margin-right: 5px"
>启用</Button
>
<Button type="error" size="small" @click="close(row.id)"
>删除</Button
>
<Button v-if="row.promotionStatus == 'NEW'" type="info" size="small" @click="edit(row.id)" style="margin-right: 5px"></Button>
<Button v-if="row.promotionStatus == 'START'" type="warning" size="small" @click="statusChanged(row.id, 'CLOSE')" style="margin-right: 5px"></Button>
<Button v-if="row.promotionStatus == 'CLOSE'" type="warning" size="small" @click="statusChanged(row.id, 'START')" style="margin-right: 5px"></Button>
<Button type="error" size="small" @click="close(row.id)"></Button>
</template>
</Table>
<Row type="flex" justify="end" class="page">
<Page
:current="searchForm.pageNumber"
:total="total"
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-elevator
show-sizer
></Page>
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small"
show-total show-elevator show-sizer></Page>
</Row>
</Card>
</div>
@ -159,78 +85,91 @@ export default {
pageSize: 10, //
order: "desc", //
},
statusList: [ //
statusList: [
//
{ label: "未开始", value: "NEW" },
{ label: "已开始", value: "START" },
{ label: "已结束", value: "END" },
{ label: "已关闭", value: "CLOSE" },
],
columns: [ //
columns: [
//
{
title: "商品名称",
slot: "goodsName",
minWidth: 120,
minWidth: 150,
fixed: "left",
tooltip: true,
},
{
title: "市场价",
slot: "price",
width: 100,
},
{
title: "结算价",
slot: "settlementPrice",
width: 100,
},
{
title: "分类",
key: "pointsGoodsCategoryName",
},
{
title: "库存数量",
slot: "quantity",
width: 100,
},
{
title: "活动剩余库存",
key: "activeStock",
width: 150,
},
{
title: "兑换积分",
key: "points",
width: 100,
},
{
title: "所属店铺",
key: "storeName",
width: 100,
},
{
title: "活动开始时间",
slot: "startTime",
minWidth:100
minWidth: 150,
},
{
title: "状态",
key: "promotionStatus",
width: 100,
render: (h, params) => {
let text = "未知",
color = "";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "default";
color = "geekblue";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "green";
color = "blue";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "blue";
color = "green";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "red";
color = "volcano";
}
return h("div", [h("Tag", { props: { color: color } }, text)]);
},
},
{
title: "分类",
key: "pointsGoodsCategoryName",
width: 100,
},
{
title: "操作",
slot: "action",
align: "center",
fixed: "right",
width: 150,
},
],
@ -327,5 +266,5 @@ export default {
};
</script>
<style lang="scss">
@import "@/styles/table-common.scss";
@import "@/styles/table-common.scss";
</style>

View File

@ -24,78 +24,35 @@
<Row class="operation padding-row">
<Button type="primary" @click="add"></Button>
</Row>
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
class="page"
>
<template slot-scope="{ row }" slot="action">
<Button
type="info"
size="small"
class="mr_5"
v-if="row.promotionStatus == 'NEW'"
@click="edit(row)"
>编辑</Button
>
<Tabs value="list" @on-click="clickTabPane">
<TabPane label="秒杀活动列表" name="list">
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="page">
<template slot-scope="{ row }" slot="action">
<Button type="info" size="small" class="mr_5" v-if="row.promotionStatus == 'NEW'" @click="edit(row)"></Button>
<Button
type="info"
size="small"
class="mr_5"
v-else
@click="manage(row)"
>查看</Button
>
<Button type="info" size="small" class="mr_5" v-else @click="manage(row)"></Button>
<Button
type="primary"
size="small"
class="mr_5"
v-if="row.promotionStatus == 'NEW'"
@click="manage(row)"
>管理</Button
>
<Button type="primary" size="small" class="mr_5" v-if="row.promotionStatus == 'NEW'" @click="manage(row)"></Button>
<!-- <Button type="success" size="small" class="mr_5" v-if="row.promotionStatus == 'NEW' || row.promotionStatus == 'END'" @click="upper(row)"></Button> -->
<Button
type="error"
size="small"
v-if="
row.promotionStatus == 'START' || row.promotionStatus == 'NEW'
"
class="mr_5"
@click="off(row)"
>下架</Button
>
<Button type="error" size="small" v-if="
row.promotionStatus == 'START' || row.promotionStatus == 'NEW'
" class="mr_5" @click="off(row)">下架</Button>
&nbsp;
<Button type="error" size="small" v-if="row.promotionStatus == 'CLOSE'" ghost @click="expire(row)"></Button>
</template>
</Table>
<Row type="flex" justify="end" class="page">
<Page style="margin: 20px 0;" :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]" size="small" show-total show-elevator show-sizer></Page>
</Row>
</TabPane>
<TabPane label="秒杀活动设置" name="setup">
<setupSeckill v-if="setupFlag"></setupSeckill>
</TabPane>
</Tabs>
<Button
type="error"
size="small"
v-if="row.promotionStatus == 'CLOSE'"
ghost
@click="expire(row)"
>删除</Button
>
</template>
</Table>
<Row type="flex" justify="end" class="page">
<Page
:current="searchForm.pageNumber + 1"
:total="total"
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-elevator
show-sizer
></Page>
</Row>
</Card>
</div>
</template>
@ -145,41 +102,13 @@ export default {
width: 100,
render: (h, params) => {
if (params.row.promotionStatus == "NEW") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "新建",
},
}),
]);
return h("Tag", {props: {color: "geekblue",},},"新建");
} else if (params.row.promotionStatus == "START") {
return h("div", [
h("Badge", {
props: {
status: "success",
text: "开始",
},
}),
]);
return h("Tag", {props: {color: "green",},},"开始");
} else if (params.row.promotionStatus == "END") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "结束",
},
}),
]);
return h("Tag", {props: {color: "volcano",},},"结束");
} else if (params.row.promotionStatus == "CLOSE") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "废弃",
},
}),
]);
return h("Tag", {props: {color: "red",},},"结束");
}
},
},
@ -302,7 +231,7 @@ export default {
</script>
<style lang="scss">
@import "@/styles/table-common.scss";
.mr_5{
margin: 0 4px;
.mr_5 {
margin: 0 5px;
}
</style>

View File

@ -1,5 +1,5 @@
<template>
<div>
<div v-if="templateShow">
<Form :model="form" :label-width="120">
<FormItem label="每日场次设置">
<Row :gutter="16" class="row">
@ -27,6 +27,7 @@ import { getSetting, setSetting } from "@/api/index";
export default {
data() {
return {
templateShow:false,
submitLoading: false,
selectedTime: [],
times: [], // 1-24
@ -81,6 +82,7 @@ export default {
async init() {
let result = await getSetting("SECKILL_SETTING");
if (result.success) {
this.templateShow = true
this.form.seckillRule = result.result.seckillRule;
this.times=[]
for (let i = 0; i < 24; i++) {

View File

@ -95,13 +95,13 @@ export default {
width: 100,
render: (h, params) => {
if (params.row.billStatus == "OUT") {
return h("div", "已出账");
return h("Tag", {props: {color: "blue",},},"已出账");
} else if (params.row.billStatus == "CHECK") {
return h("div", "已对账");
return h("Tag", {props: {color: "geekblue",},},"已对账");
} else if (params.row.billStatus == "EXAMINE") {
return h("div", "已审核");
return h("Tag", {props: {color: "purple",},},"已审核");
} else {
return h("div", "已付款");
return h("Tag", {props: {color: "green",},},"已付款");
}
},
},

View File

@ -106,13 +106,13 @@ export default {
width: 100,
render: (h, params) => {
if (params.row.billStatus == "OUT") {
return h("div", "已出账");
return h("Tag", {props: {color: "blue",},},"已出账");
} else if (params.row.billStatus == "CHECK") {
return h("div", "已对账");
return h("Tag", {props: {color: "geekblue",},},"已对账");
} else if (params.row.billStatus == "EXAMINE") {
return h("div", "已审核");
return h("Tag", {props: {color: "purple",},},"已审核");
} else {
return h("div", "已付款");
return h("Tag", {props: {color: "green",},},"已付款");
}
},
},

View File

@ -126,7 +126,7 @@ export default {
"Tag",
{
props: {
color: params.row.selfOperated ? "error" : "success",
color: params.row.selfOperated ? "volcano" : "green",
},
},
params.row.selfOperated ? "自营" : "非自营"
@ -141,50 +141,15 @@ export default {
width: 130,
render: (h, params) => {
if (params.row.storeDisable == "OPEN") {
return h("div", [
h("Badge", {
props: {
status: "success",
text: "开启中",
},
}),
]);
return h("Tag", {props: {color: "green",},},"开启中");
} else if (params.row.storeDisable == "CLOSED") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "已关闭",
},
}),
]);
return h("Tag", {props: {color: "volcano",},},"已关闭");
} else if (params.row.storeDisable == "APPLY") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "申请中",
},
}),
]);
return h("Tag", {props: {color: "geekblue",},},"申请中");
} else if (params.row.storeDisable == "APPLYING") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "审核中",
},
}),
]);
return h("Tag", {props: {color: "purple",},},"审核中");
} else if (params.row.storeDisable == "REFUSED") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "审核拒绝",
},
}),
]);
return h("Tag", {props: {color: "red",},},"审核拒绝");
}
},
},

View File

@ -65,13 +65,13 @@
<FormItem label="详细地址" prop="salesConsigneeDetail">
<Input v-model="shopForm.salesConsigneeDetail" clearable style="width: 350px" />
</FormItem>
<!-- <Divider orientation="left">腾讯云智服</Divider>
<Divider orientation="left">腾讯云智服</Divider>
<FormItem label="唯一标识" prop="salesConsigneeDetail">
<Input v-model="shopForm.yzfSign" clearable style="width: 350px" />
</FormItem>
<FormItem label="小程序唯一标识" prop="salesConsigneeDetail">
<Input v-model="shopForm.yzfMpSign" clearable style="width: 350px" />
</FormItem> -->
</FormItem>
<Spin fix v-if="loading"></Spin>
</div>
</TabPane>

View File

@ -6,7 +6,7 @@
<div class="shop-item">
<div class="label-item">
<span>订单来源</span>
<span>{{res.clientType}}</span>
<span>{{res.clientType | clientTypeWay}}</span>
</div>
<div class="label-item">
<span>订单状态</span>

View File

@ -29,7 +29,7 @@
"sockjs-client": "^1.4.0",
"stompjs": "^2.3.3",
"swiper": "^6.3.5",
"vue-qr": "^2.3.0",
"uuid": "^8.3.2",
"view-design": "^4.2.0",
"vue": "^2.6.10",
"vue-awesome": "^4.0.2",
@ -37,15 +37,16 @@
"vue-clipboard2": "^0.3.0",
"vue-cropper": "^0.4.9",
"vue-i18n": "^8.15.1",
"vue-json-excel": "^0.3.0",
"vue-json-pretty": "^1.4.1",
"vue-lazyload": "^1.3.3",
"vue-qr": "^2.3.0",
"vue-router": "^3.1.3",
"vuedraggable": "^2.23.2",
"vuex": "^3.4.0",
"wangeditor": "^4.6.13",
"xlsx": "^0.16.2",
"xss": "^1.0.7",
"uuid": "^8.3.2"
"xss": "^1.0.7"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.4.4",

View File

@ -132,13 +132,13 @@ export const delSpec = (id, params) => {
return deleteRequest(`/goods/spec/del/${id}`, params);
};
// 获取商品规格值列表
export const getSpecValuesListData = (id, params) => {
return getRequest(`/goods/spec-values/values/${id}`, params);
};
// export const getSpecValuesListData = (id, params) => {
// return getRequest(`/goods/spec-values/values/${id}`, params);
// };
// 添加商品规格值
export const saveSpecValues = (id, params) => {
return postRequest(`/goods/spec-values/save/${id}`, params);
};
// export const saveSpecValues = (id, params) => {
// return postRequest(`/goods/spec-values/save/${id}`, params);
// };
// 查询某分类下的全部子分类列表
export const getGoodsCategory = parent_id => {
@ -209,24 +209,19 @@ export const deleteParamsGroup = (id, params) => {
return deleteRequest(`/goods/category/parameters/${id}`, params);
};
//保存获取关联规格
export const getGoodsSpecInfo = (category_id, params) => {
return getRequest(`/goods/category/spec/goods/${category_id}`, params);
};
//获取sku列表
export const getSkuPage = params => {
return getRequest(`/goodsSku/getByPage`, params);
};
// 获取商品规格值列表
export const getSpecValuesListSellerData = (id, params) => {
return getRequest(`/goods/spec-values/values/${id}`, params);
};
// export const getSpecValuesListSellerData = (id, params) => {
// return getRequest(`/goods/spec-values/values/${id}`, params);
// };
// 添加商品规格值
export const saveSpecValuesSeller = (id, params) => {
return postRequest(`/goods/spec-values/save/${id}`, params);
};
// export const saveSpecValuesSeller = (id, params) => {
// return postRequest(`/goods/spec-values/save/${id}`, params);
// };
// 获取商品规格分页列表
export const getSpecListSellerData = params => {
@ -317,8 +312,8 @@ export const getCategoryParamsListDataSeller = (id, params) => {
};
//保存获取关联规格
export const getGoodsSpecInfoSeller = (category_id, params) => {
return getRequest(`/goods/category/spec/goods/${category_id}`, params);
export const getGoodsSpecInfoSeller = (category_id) => {
return getRequest(`/goods/spec/${category_id}`);
};
//批量设置运费模板

View File

@ -69,14 +69,6 @@ service.interceptors.response.use(
router.push("/login");
}
break;
case 403:
// 权限不足
if (data.message !== null) {
Message.error(data.message);
} else {
Message.error("权限不足");
}
break;
case 500:
// 系统异常
if (data.message !== null) {
@ -94,6 +86,8 @@ service.interceptors.response.use(
if (error.response) {
if (error.response.status === 401) {
// 这种情况一般调到登录页
} else if (error.response.status === 404) {
// 避免刷新token报错
} else if (error.response.status === 403) {
isRefreshToken++;
if (isRefreshToken === 1) {

View File

@ -54,20 +54,20 @@ export const result = [
children: null,
permTypes: []
},
{
name: "daft-goods",
showAlways: true,
level: 2,
type: 0,
title: "草稿商品",
path: "daft-goods",
component: "goods/goods-seller/draftGoods",
icon: "md-person",
isMenu: true,
url: "",
children: null,
permTypes: []
},
// {
// name: "daft-goods",
// showAlways: true,
// level: 2,
// type: 0,
// title: "草稿商品",
// path: "daft-goods",
// component: "goods/goods-seller/draftGoods",
// icon: "md-person",
// isMenu: true,
// url: "",
// children: null,
// permTypes: []
// },
{
path: "template-goods",
@ -143,6 +143,20 @@ export const result = [
url: "",
children: null,
permTypes: []
},
{
name: "virtualOrderList",
showAlways: true,
level: 2,
type: 0,
title: "虚拟订单",
path: "virtualOrderList",
component: "order/order/virtualOrderList",
icon: "md-person",
isMenu: true,
url: "",
children: null,
permTypes: []
}
]
},
@ -381,6 +395,49 @@ export const result = [
}
]
},
{
name: "lives",
showAlways: true,
level: 1,
type: 0,
title: "直播活动",
path: "/promotion",
component: "Main",
icon: "md-person",
isMenu: true,
url: "",
permTypes: [],
children: [
{
name: "live",
showAlways: true,
level: 2,
type: 0,
title: "直播管理",
path: "live",
component: "promotion/live/live",
icon: "md-person",
isMenu: true,
url: "",
permTypes: [],
children: null
},
{
name: "liveGoods",
showAlways: true,
level: 2,
type: 0,
title: "直播商品",
path: "liveGoods",
component: "promotion/live/liveGoods",
icon: "md-person",
isMenu: true,
url: "",
permTypes: [],
children: null
}
]
},
{
name: "storePromotion",
showAlways: true,
@ -422,34 +479,7 @@ export const result = [
permTypes: [],
children: null
},
{
name: "live",
showAlways: true,
level: 2,
type: 0,
title: "直播管理",
path: "live",
component: "promotion/live/live",
icon: "md-person",
isMenu: true,
url: "",
permTypes: [],
children: null
},
{
name: "liveGoods",
showAlways: true,
level: 2,
type: 0,
title: "直播商品",
path: "liveGoods",
component: "promotion/live/liveGoods",
icon: "md-person",
isMenu: true,
url: "",
permTypes: [],
children: null
}
]
},
{

View File

@ -5,7 +5,7 @@ import ViewUI from "view-design";
import "./styles/theme.less";
import "core-js/stable";
import "regenerator-runtime/runtime";
// import "regenerator-runtime/runtime";
import vueQr from 'vue-qr'
import App from "./App";

View File

@ -5,7 +5,7 @@ export const loginRouter = {
path: "/login",
name: "login",
meta: {
title: "登录 - lili商家后台 "
title: "登录 - lili商家后台"
},
component: () => import("@/views/login.vue")
};

View File

@ -7,6 +7,7 @@ import Vue from 'vue';
const app = {
state: {
shipTemplates:"",
regions:[], //此处是在地区选择器时赋值一次
styleStore:"", //移动端楼层装修中选择风格存储
loading: false, // 全局加载动画
added: false, // 加载路由标识

View File

@ -6,17 +6,32 @@
* @returns {*}
*/
export function unitPrice(val, unit, location) {
let price = formatPrice(val)
if (location === 'before') {
return price.substr(0, price.length - 3)
let price = formatPrice(val);
if (location === "before") {
return price.substr(0, price.length - 3);
}
if (location === 'after') {
return price.substr(-2)
if (location === "after") {
return price.substr(-2);
}
return (unit || '') + price
return (unit || "") + price;
}
/**
* 订单来源
*/
export function clientTypeWay(val) {
if (val == "H5") {
return "移动端";
} else if (val == "PC") {
return "PC端";
} else if (val == "WECHAT_MP") {
return "小程序端";
} else if (val == "APP") {
return "移动应用端";
} else {
return val;
}
}
/**
* 货币格式化
@ -24,8 +39,8 @@ export function unitPrice(val, unit, location) {
* @returns {string}
*/
export function formatPrice(price) {
if (typeof price !== 'number') return price
return String(Number(price).toFixed(2)).replace(/\B(?=(\d{3})+(?!\d))/g, ',')
if (typeof price !== "number") return price;
return String(Number(price).toFixed(2)).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
/**
@ -35,51 +50,60 @@ export function formatPrice(price) {
* @returns {*|string}
*/
export function unixToDate(unix, format) {
let _format = format || 'yyyy-MM-dd hh:mm:ss'
const d = new Date(unix * 1000)
let _format = format || "yyyy-MM-dd hh:mm:ss";
const d = new Date(unix * 1000);
const o = {
'M+': d.getMonth() + 1,
'd+': d.getDate(),
'h+': d.getHours(),
'm+': d.getMinutes(),
's+': d.getSeconds(),
'q+': Math.floor((d.getMonth() + 3) / 3),
"M+": d.getMonth() + 1,
"d+": d.getDate(),
"h+": d.getHours(),
"m+": d.getMinutes(),
"s+": d.getSeconds(),
"q+": Math.floor((d.getMonth() + 3) / 3),
S: d.getMilliseconds()
}
if (/(y+)/.test(_format)) _format = _format.replace(RegExp.$1, (d.getFullYear() + '').substr(4 - RegExp.$1.length))
for (const k in o) if (new RegExp('(' + k + ')').test(_format)) _format = _format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
return _format
};
if (/(y+)/.test(_format))
_format = _format.replace(
RegExp.$1,
(d.getFullYear() + "").substr(4 - RegExp.$1.length)
);
for (const k in o)
if (new RegExp("(" + k + ")").test(_format))
_format = _format.replace(
RegExp.$1,
RegExp.$1.length === 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
);
return _format;
}
//是否格式化
export function unixWhether(status) {
switch (status) {
case 'YES':
return "是"
case 'NO':
return "否"
case "YES":
return "是";
case "NO":
return "否";
}
}
export function unixSellerBillStatus(status_code) {
switch (status_code) {
case 'OUT':
return '已出账'
case 'CHECK':
return '已对账'
case 'EXAMINE':
return '已审核'
case 'PAY':
return '已结算'
case 'COMPLETE':
return '已完成'
case "OUT":
return "已出账";
case "CHECK":
return "已对账";
case "EXAMINE":
return "已审核";
case "PAY":
return "已结算";
case "COMPLETE":
return "已完成";
}
}
export function unixSwitchStatus(status_code) {
switch (status_code) {
case 'OPEN':
return '开启'
case 'CLOSE':
return '关闭'
case "OPEN":
return "开启";
case "CLOSE":
return "关闭";
}
}
@ -89,30 +113,35 @@ export function unixSwitchStatus(status_code) {
* @returns {*}
*/
export function secrecyMobile(mobile) {
mobile = String(mobile)
mobile = String(mobile);
if (!/\d{11}/.test(mobile)) {
return mobile
return mobile;
}
return mobile.replace(/(\d{3})(\d{4})(\d{4})/, '$1****$3')
return mobile.replace(/(\d{3})(\d{4})(\d{4})/, "$1****$3");
}
export function formatDate(date, fmt) {
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
fmt = fmt.replace(
RegExp.$1,
(date.getFullYear() + "").substr(4 - RegExp.$1.length)
);
}
let o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds()
"M+": date.getMonth() + 1,
"d+": date.getDate(),
"h+": date.getHours(),
"m+": date.getMinutes(),
"s+": date.getSeconds()
};
for (let k in o) {
if (new RegExp(`(${k})`).test(fmt)) {
let str = o[k] + '';
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str));
}
if (new RegExp(`(${k})`).test(fmt)) {
let str = o[k] + "";
fmt = fmt.replace(
RegExp.$1,
RegExp.$1.length === 1 ? str : padLeftZero(str)
);
}
}
return fmt;
};
}

View File

@ -395,11 +395,11 @@ div.base-info-item {
text-align: center;
border: 1px solid transparent;
border-radius: 4px;
display: inline-flex;
flex-direction: column;
display: inline-block;
background: #fff;
position: relative;
margin-right: 4px;
vertical-align: bottom;
}
.demo-upload-list img {
width: 100%;

View File

@ -12,6 +12,12 @@
<Option value="UPPER">上架</Option>
</Select>
</Form-item>
<Form-item label="商品类型" prop="status">
<Select v-model="searchForm.goodsType" placeholder="请选择" clearable style="width: 200px">
<Option value="PHYSICAL_GOODS">实物商品</Option>
<Option value="VIRTUAL_GOODS">虚拟商品</Option>
</Select>
</Form-item>
<Form-item label="商品编号" prop="sn">
<Input type="text" v-model="searchForm.sn" placeholder="商品编号" clearable style="width: 200px" />
</Form-item>
@ -45,11 +51,11 @@
<div style="margin-left: 13px;">
<div class="div-zoom">
<a @click="linkTo(row.id,row.skuId)">{{row.goodsName}}</a>
<a @click="linkTo(row.id,row.skuId)">{{ row.goodsName }}</a>
</div>
<Poptip trigger="hover" title="扫码在手机中查看" transfer>
<div slot="content">
<vue-qr :text="wapLinkTo(row.id,row.skuId)" :margin="0" colorDark="#000" colorLight="#fff" :size="150"></vue-qr>
<vue-qr :text="wapLinkTo(row.id,row.skuId)" :margin="0" colorDark="#000" colorLight="#fff" :size="150"></vue-qr>
</div>
<img src="../../../assets/qrcode.svg" class="hover-pointer" width="20" height="20" alt="">
</Poptip>
@ -66,8 +72,15 @@
</Card>
<Modal title="更新库存" v-model="updateStockModalVisible" :mask-closable="false" :width="500">
<Input type="number" v-model="stockAllUpdate" placeholder="全部修改,如不需全部修改,则不需输入" />
<Table :columns="updateStockColumns" :data="stockList" border :span-method="handleSpan"></Table>
<Tabs value="updateStock">
<TabPane label="手动规格更新" name="updateStock">
<Table :columns="updateStockColumns" :data="stockList" border :span-method="handleSpan"></Table>
</TabPane>
<TabPane label="批量规格更新" name="stockAll">
<Input type="number" v-model="stockAllUpdate" placeholder="统一规格修改" />
</TabPane>
</Tabs>
<div slot="footer">
<Button type="text" @click="updateStockModalVisible = false">取消</Button>
<Button type="primary" @click="updateStock"></Button>
@ -161,32 +174,11 @@ export default {
width: 130,
render: (h, params) => {
if (params.row.isAuth == "TOBEAUDITED") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "待审核",
},
}),
]);
return h("Tag", {props: {color: "blue",},},"待审核");
} else if (params.row.isAuth == "PASS") {
return h("div", [
h("Badge", {
props: {
status: "success",
text: "审核通过",
},
}),
]);
return h("Tag", {props: {color: "green",},},"通过");
} else if (params.row.isAuth == "REFUSE") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "审核拒绝",
},
}),
]);
return h("Tag", {props: {color: "red",},},"审核拒绝");
}
},
},
@ -245,6 +237,20 @@ export default {
);
},
},
{
title: "商品类型",
key: "goodsType",
width: 130,
render: (h, params) => {
if (params.row.goodsType === 'PHYSICAL_GOODS') {
return h("Tag", {props: {color: "geekblue"}},"实物商品");
} else if (params.row.goodsType === 'VIRTUAL_GOODS') {
return h("Tag", {props: {color: "purple"}},"虚拟商品");
} else {
return h("Tag", {props: {color: "cyan"}},"电子卡券");
}
},
},
{
title: "商品价格",
key: "price",
@ -274,32 +280,11 @@ export default {
width: 120,
render: (h, params) => {
if (params.row.isAuth == "PASS") {
return h("div", [
h("Badge", {
props: {
status: "success",
text: "审核通过",
},
}),
]);
return h("Tag", {props: {color: "green"}},"通过");
} else if (params.row.isAuth == "TOBEAUDITED") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "待审核",
},
}),
]);
return h("Tag", {props: {color: "volcano"}},"待审核");
} else if (params.row.isAuth == "REFUSE") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "审核拒绝",
},
}),
]);
return h("Tag", {props: {color: "red"}},"审核拒绝");
}
},
},
@ -310,28 +295,12 @@ export default {
sortable: false,
render: (h, params) => {
if (params.row.marketEnable == "DOWN") {
return h("div", [
h("Badge", {
props: {
status: "error",
text: "下架",
},
}),
]);
return h("Tag", {props: {color: "red"}},"下架");
} else if (params.row.marketEnable == "UPPER") {
return h("div", [
h("Badge", {
props: {
status: "success",
text: "上架",
},
}),
]);
} else {
return h("Tag", {props: {color: "green"}},"上架");
}
},
},
{
title: "操作",
key: "action",
@ -481,28 +450,28 @@ export default {
}
});
},
changePage (v) {
changePage(v) {
this.searchForm.pageNumber = v;
this.getDataList();
this.clearSelectAll();
},
changePageSize (v) {
changePageSize(v) {
this.searchForm.pageSize = v;
this.getDataList();
},
handleSearch () {
handleSearch() {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.getDataList();
},
handleReset () {
handleReset() {
this.searchForm = {};
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
//
this.getDataList();
},
changeSort (e) {
changeSort(e) {
this.searchForm.sort = e.key;
this.searchForm.order = e.order;
if (e.order === "normal") {
@ -510,15 +479,15 @@ export default {
}
this.getDataList();
},
clearSelectAll () {
clearSelectAll() {
this.$refs.table.selectAll(false);
},
changeSelect (e) {
changeSelect(e) {
this.selectList = e;
this.selectCount = e.length;
},
//
saveShipTemplate () {
saveShipTemplate() {
if (this.shipTemplateForm.freightPayer == "STORE") {
{
this.shipTemplateForm.templateId = 0;
@ -716,10 +685,10 @@ export default {
});
},
},
mounted () {
this.init();
mounted() {
this.init();
},
activated () {
activated() {
this.init();
},
};

File diff suppressed because it is too large Load Diff

View File

@ -44,23 +44,27 @@ export default {
*/
open(val, index) {
if (val) {
// console.warn(val);
//
let checkedData = this.$store.state.shipTemplate;
// console.warn(this.$store.state.shipTemplate);
//
let disabledData = checkedData.filter((item, i) => {
return i != index;
});
disabledData.forEach((dis) => {
console.log(dis)
// id
dis.areaId.split(",").forEach((ids) => {
//
this.data.forEach((item) => {
//
if (dis.selectedAll) {
dis.area.split(",").forEach((area) => {
if (area == item.name) {
console.log(item.name +"选中")
this.$set(item, "disabled", true);
}
});
@ -99,7 +103,11 @@ export default {
//
sort.forEach((sortItem, sortIndex) => {
if (item.level != "province" && sortItem.id == item.parentId && !item.disabled) {
if (
item.level != "province" &&
sortItem.id == item.parentId &&
!item.disabled
) {
sortItem.selectedList.push({
...item,
});
@ -147,6 +155,7 @@ export default {
this.selectedWay.push({ name: data.title, id: data.id });
});
console.log(this.data);
this.$store.state.regions = this.data;
}
});
},

View File

@ -162,7 +162,7 @@ export default {
}
.login {
height: 100%;
background: url("../assets/background.svg") no-repeat;
background: url("../assets/background.png") no-repeat;
background-size: 100%;
background-position-y: bottom;
background-color: #edf0f3;

View File

@ -134,21 +134,18 @@ export default {
key: "name",
minWidth: 120
},
{
title: "状态",
key: "disabled",
minWidth: 50,
render(h, params) {
return h("Badge", {
props: {
status: params.row.disabled ? "success" : "error",
text: params.row.disabled ? "开启" : "关闭",
},
});
if(params.row.disabled){
return h("div", [h("tag", {props: {color: "green"}}, "开启")]);
}else{
return h("div", [h("tag", {props: {color: "volcano"}}, "关闭")]);
}
},
},
{
title: "操作",
key: "action",

View File

@ -1,14 +1,14 @@
<template>
<div class="foot">
<Row type="flex" justify="space-around" class="help">
<a class="item" href="https://lilishop.com" target="_blank">{{ $t('help') }}</a>
<a class="item" href="https://lilishop.com" target="_blank">{{ $t('privacy') }}</a>
<a class="item" href="https://lilishop.com" target="_blank">{{ $t('terms') }}</a>
<a class="item" href="https://pickmall.cn/" target="_blank">{{ $t('help') }}</a>
<a class="item" href="https://pickmall.cn/" target="_blank">{{ $t('privacy') }}</a>
<a class="item" href="https://pickmall.cn/" target="_blank">{{ $t('terms') }}</a>
</Row>
<Row type="flex" justify="center" class="copyright">
Copyright © 2020 - Present
<a
href="http://lili.cn"
href="https://pickmall.cn/"
target="_blank"
style="margin:0 5px;"
>lili-shop</a> {{ $t('rights') }}

View File

@ -210,11 +210,11 @@ export default {
width: 100,
render: (h, params) => {
if (params.row.grade == "GOOD") {
return h("Badge", {props: {status: "success", text: "好评"}})
return h("Tag", {props: {color: "green",},}, "好评");
} else if (params.row.grade == "MODERATE") {
return h("Badge", {props: {status: "success", text: "中评"}})
} else if (params.row.grade == "WORSE") {
return h("Badge", {props: {status: "error", text: "差评"}})
return h("Tag", {props: {color: "orange",},}, "中评");
} else {
return h("Tag", {props: {color: "red",},}, "差评");
}
}
},
@ -224,9 +224,9 @@ export default {
width: 100,
render: (h, params) => {
if (params.row.status === "OPEN") {
return h("Badge", {props: {status: "success", text: "展示"}})
return h("Tag", {props: {color: "green"}},"展示")
} else {
return h("Badge", {props: {status: "error", text: "隐藏"}})
return h("Tag", {props: {color: "red"}},"隐藏")
}
},
},
@ -236,9 +236,9 @@ export default {
width: 110,
render: (h, params) => {
if (params.row.replyStatus) {
return h("Badge", {props: {status: "success", text: "已回复"}})
return h("Tag", {props: {color: "green"}},"已回复")
} else {
return h("Badge", {props: {status: "error", text: "未回复"}})
return h("Tag", {props: {color: "blue"}},"未回复")
}
},
},
@ -334,7 +334,7 @@ export default {
this.loading = false;
if (res.success) {
this.data = res.result.records;
this.total = res.result.total;
this.total = res.result.total;
}
});
},

View File

@ -1,49 +1,50 @@
<template>
<div>
<vuedraggable
:list="uploadList"
:disabled="!draggable||!multiple"
:animation="200"
class="list-group"
ghost-class="thumb-ghost"
@end="onEnd"
>
<div class="upload-list" v-for="(item, index) in uploadList" :key="index">
<div v-if="item.status == 'finished'">
<img :src="item.url" />
<div class="upload-list-cover">
<Icon type="ios-eye-outline" @click="handleView(item.url)"></Icon>
<Icon v-if="remove" type="ios-trash-outline" @click="handleRemove(item)"></Icon>
<div class="upload-pic-thumb">
<vuedraggable
:list="uploadList"
:disabled="!draggable||!multiple"
:animation="200"
class="list-group"
ghost-class="thumb-ghost"
@end="onEnd"
>
<div class="upload-list" v-for="(item, index) in uploadList" :key="index">
<div v-if="item.status == 'finished'">
<img :src="item.url" />
<div class="upload-list-cover">
<Icon type="ios-eye-outline" @click="handleView(item.url)"></Icon>
<Icon v-if="remove" type="ios-trash-outline" @click="handleRemove(item)"></Icon>
</div>
</div>
<div v-else>
<Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>
</div>
</div>
<div v-else>
<Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>
</vuedraggable>
<Upload
:disabled="disable"
ref="upload"
:multiple="multiple"
:show-upload-list="false"
:on-success="handleSuccess"
:on-error="handleError"
:format="['jpg','jpeg','png','gif']"
:max-size="maxSize*1024"
:on-format-error="handleFormatError"
:on-exceeded-size="handleMaxSize"
:before-upload="handleBeforeUpload"
type="drag"
:action="uploadFileUrl"
:headers="accessToken"
style="display: inline-block;width:58px;"
v-if="!isView"
>
<div style="width: 58px;height:58px;line-height: 58px;">
<Icon type="md-camera" size="20"></Icon>
</div>
</div>
</vuedraggable>
<Upload
:disabled="disable"
ref="upload"
:multiple="multiple"
:show-upload-list="false"
:on-success="handleSuccess"
:on-error="handleError"
:format="['jpg','jpeg','png','gif']"
:max-size="maxSize*1024"
:on-format-error="handleFormatError"
:on-exceeded-size="handleMaxSize"
:before-upload="handleBeforeUpload"
type="drag"
:action="uploadFileUrl"
:headers="accessToken"
style="display: inline-block;width:58px;"
v-if="!isView"
>
<div style="width: 58px;height:58px;line-height: 58px;">
<Icon type="md-camera" size="20"></Icon>
</div>
</Upload>
</Upload>
</div>
<Modal title="图片预览" v-model="viewImage" :styles="{top: '30px'}" draggable>
<img :src="imgUrl" alt="无效的图片链接" style="width: 100%;margin: 0 auto;display: block;" />
<div slot="footer">
@ -252,10 +253,12 @@ export default {
}
};
</script>
<style lang="scss" scoped>
.upload-pic-thumb{
display: flex;
}
.upload-list {
display: inline-block;
display: inline-flex;
width: 60px;
height: 60px;
text-align: center;
@ -267,6 +270,7 @@ export default {
position: relative;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
margin-right: 5px;
vertical-align: middle;
}
.upload-list img {
width: 100%;

View File

@ -98,14 +98,14 @@ export default {
}
},
created () {
this.getImg();
// this.getImg();
},
watch: {
verifyType: {
immediate: true,
handler: function (v) {
this.type = v;
this.refresh();
// this.refresh();
}
},
show (v) {

View File

@ -185,17 +185,17 @@
key: "complainStatus",
render: (h, params) => {
if (params.row.complainStatus == "NEW") {
return h('div', [h('span', { }, '新投诉'),]);
return h('div', [h('tag',{props: {color: "purple"}}, '新投诉'),]);
} else if (params.row.complainStatus == "CANCEL") {
return h('div', [h('span', { }, '已撤销'),]);
return h('div', [h('tag', {props: {color: "cyan"}}, '已撤销'),]);
} else if (params.row.complainStatus == "WAIT_APPEAL") {
return h('div', [h('span', { }, '待申诉'),]);
return h('div', [h('tag', {props: {color: "volcano"}}, '待申诉'),]);
} else if (params.row.complainStatus == "COMMUNICATION") {
return h('div', [h('span', { }, '对话中'),]);
return h('div', [h('tag', {props: {color: "orange"}}, '对话中'),]);
}else if (params.row.complainStatus == "WAIT_ARBITRATION") {
return h('div', [h('span', { }, '等待仲裁'),]);
return h('div', [h('tag', {props: {color: "blue"}}, '等待仲裁'),]);
}else if (params.row.complainStatus == "COMPLETE") {
return h('div', [h('span', { }, '已完成'),]);
return h('div', [h('tag', {props: {color: "green"}}, '已完成'),]);
}
}
},

View File

@ -176,25 +176,23 @@
width: 120,
render: (h, params) => {
if (params.row.serviceStatus == "APPLY") {
return h('div', [h('span', { }, '申请售后'),]);
return h('div', [h('tag', {props: {color: "blue"}}, '申请中'),]);
} else if (params.row.serviceStatus == "PASS") {
return h('div', [h('span', { }, '审核通过'),]);
return h('div', [h('tag', {props: {color: "cyan"}}, '通过售后'),]);
} else if (params.row.serviceStatus == "REFUSE") {
return h('div', [h('span', { }, '审核拒绝'),]);
return h('div', [h('tag', {props: {color: "volcano"}}, '拒绝售后'),]);
} else if (params.row.serviceStatus == "BUYER_RETURN") {
return h('div', [h('span', { }, '买家退货,待卖家收货'),]);
}else if (params.row.serviceStatus == "SELLER_RE_DELIVERY") {
return h('div', [h('span', { }, '商家换货/补发'),]);
}else if (params.row.serviceStatus == "SELLER_CONFIRM") {
return h('div', [h('span', { }, '卖家确认收货'),]);
}else if (params.row.serviceStatus == "SELLER_TERMINATION") {
return h('div', [h('span', { }, '卖家终止售后'),]);
}else if (params.row.serviceStatus == "BUYER_CONFIRM") {
return h('div', [h('span', { }, '买家确认收货'),]);
}else if (params.row.serviceStatus == "BUYER_CANCEL") {
return h('div', [h('span', { }, '买家取消售后'),]);
}else if (params.row.serviceStatus == "COMPLETE") {
return h('div', [h('span', { }, '完成'),]);
return h('div', [h('tag', {props: {color: "orange"}}, '买家退货,待卖家收货'),]);
} else if (params.row.serviceStatus == "SELLER_CONFIRM") {
return h('div', [h('tag', {props: {color: "gold"}}, '卖家确认收货'),]);
} else if (params.row.serviceStatus == "SELLER_TERMINATION") {
return h('div', [h('tag', {props: {color: "lime"}}, '卖家终止售后'),]);
} else if (params.row.serviceStatus == "BUYER_CANCEL") {
return h('div', [h('tag', {props: {color: "purple"}}, '买家取消售后'),]);
} else if (params.row.serviceStatus == "COMPLETE") {
return h('div', [h('tag', {props: {color: "green"}}, '完成售后'),]);
}else if (params.row.serviceStatus == "WAIT_REFUND") {
return h('div', [h('tag', {props: {color: "geekblue"}}, '待平台退款'),]);
}
}
},

View File

@ -182,27 +182,17 @@
minWidth: 120,
render: (h, params) => {
if (params.row.serviceStatus == "APPLY") {
return h('div', [h('span', { }, '申请售后'),]);
return h('div', [h('tag', {props: {color: "blue"}}, '申请中'),]);
} else if (params.row.serviceStatus == "PASS") {
return h('div', [h('span', { }, '审核通过'),]);
return h('div', [h('tag', {props: {color: "cyan"}}, '通过售后'),]);
} else if (params.row.serviceStatus == "REFUSE") {
return h('div', [h('span', { }, '审核拒绝'),]);
} else if (params.row.serviceStatus == "BUYER_RETURN") {
return h('div', [h('span', { }, '买家退货,待卖家收货'),]);
}else if (params.row.serviceStatus == "SELLER_RE_DELIVERY") {
return h('div', [h('span', { }, '商家换货/补发'),]);
}else if (params.row.serviceStatus == "SELLER_CONFIRM") {
return h('div', [h('span', { }, '卖家确认收货'),]);
}else if (params.row.serviceStatus == "SELLER_TERMINATION") {
return h('div', [h('span', { }, '卖家终止售后'),]);
}else if (params.row.serviceStatus == "BUYER_CONFIRM") {
return h('div', [h('span', { }, '买家确认收货'),]);
}else if (params.row.serviceStatus == "BUYER_CANCEL") {
return h('div', [h('span', { }, '买家取消售后'),]);
return h('div', [h('tag', {props: {color: "volcano"}}, '拒绝售后'),]);
} else if (params.row.serviceStatus == "BUYER_CANCEL") {
return h('div', [h('tag', {props: {color: "purple"}}, '买家取消售后'),]);
} else if (params.row.serviceStatus == "COMPLETE") {
return h('div', [h('tag', {props: {color: "green"}}, '完成售后'),]);
}else if (params.row.serviceStatus == "WAIT_REFUND") {
return h('div', [h('span', { }, '等待平台退款'),]);
}else if (params.row.serviceStatus == "COMPLETE") {
return h('div', [h('span', { }, '完成'),]);
return h('div', [h('tag', {props: {color: "geekblue"}}, '待平台退款'),]);
}
}
},

View File

@ -17,8 +17,8 @@
</div>
<!-- 上传 -->
<div v-if="item.checked && index ==1" class="tpl">
<Upload :before-upload="handleUpload" name="files" style="width:50%; height:400px;"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" multiple type="drag" :action="action" :headers="accessToken">
<Upload :before-upload="handleUpload" name="files" style="width:50%; height:400px;" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
multiple type="drag" :action="action" :headers="accessToken">
<div style="padding: 50px 0">
<Icon type="ios-cloud-upload" size="102" style="color: #3399ff"></Icon>
<h2>选择或拖拽文件上传</h2>
@ -26,11 +26,13 @@
</Upload>
</div>
<!-- 上传 -->
<div v-if="item.checked && index ==2" class="tpl">
<div v-if="item.checked && index ==2" class="tpl success">
<h1>发货完成</h1>
<div>
<Button>关闭页面</Button>
<Button class="btn" @click="close"></Button>
<Button class="btn" type="primary" @click="navigationToGoodsOrder"></Button>
</div>
</div>
@ -79,28 +81,50 @@ export default {
methods: {
//
handleCheckStep(val) {
this.stepList.map((item) => {
item.checked = false;
});
val.checked = true;
if (val.title.search("3") == -1) {
console.warn(val);
this.stepList.map((item) => {
item.checked = false;
});
val.checked = true;
}
},
handleUpload(file) {
this.file = file;
this.upload();
return false;
},
navigationToGoodsOrder() {
this.$router.push({
path: "/order/orderList",
});
},
close() {
this.$store.commit("removeTag", "export-order-deliver");
localStorage.storeOpenedList = JSON.stringify(
this.$store.state.app.storeOpenedList
);
this.$router.go(-1);
},
/**
* 上传文件
*/
async upload() {
let fd = new FormData();
fd.append("files", this.file);
await uploadDeliverExcel(fd);
},
let res = await uploadDeliverExcel(fd);
if (res.success) {
this.stepList.map((item) => {
item.checked = false;
});
this.stepList[2].checked = true;
}
},
/**
* 下载excel
@ -172,4 +196,15 @@ img {
width: 100px;
height: 100px;
}
.success {
align-items: center;
flex-direction: column;
> h1 {
font-size: 28px;
margin: 10px;
}
/deep/ .btn {
margin: 10px;
}
}
</style>

View File

@ -21,7 +21,7 @@
<div class="div-item">
<div class="div-item-left">订单来源</div>
<div class="div-item-right">
{{ orderInfo.order.clientType }}
{{ orderInfo.order.clientType | clientTypeWay }}
</div>
</div>
</div>
@ -94,7 +94,7 @@
<div class="div-item-right">{{ orderInfo.order.remark }}</div>
</div>
<div class="div-item">
<div class="div-item" v-if="orderInfo.order.orderType != 'VIRTUAL'">
<div class="div-item-left">配送方式</div>
<div class="div-item-right">
{{
@ -521,6 +521,7 @@ export default {
},
//
orderTake() {
this.orderTakeForm.qrCode = this.orderInfo.order.verificationCode
this.orderTakeModal = true;
},
//

View File

@ -8,14 +8,6 @@
</Form-item>
<Form-item label="会员名称" prop="buyerName">
<Input type="text" v-model="searchForm.buyerName" clearable placeholder="请输入会员名称" style="width: 160px" />
</Form-item>
<Form-item label="订单类型" prop="orderType">
<Select v-model="searchForm.orderType" placeholder="请选择" clearable style="width: 160px">
<Option value="NORMAL">普通订单</Option>
<Option value="PINTUAN">拼团订单</Option>
<Option value="GIFT">赠品订单</Option>
<Option value="VIRTUAL">核验订单</Option>
</Select>
</Form-item>
<Form-item label="订单状态" prop="orderStatus">
<Select v-model="searchForm.orderStatus" placeholder="请选择" clearable style="width: 160px">
@ -24,7 +16,6 @@
<Option value="UNDELIVERED">待发货</Option>
<Option value="DELIVERED">已发货</Option>
<Option value="COMPLETED">已完成</Option>
<Option value="TAKE">待核验</Option>
<Option value="CANCELLED">已取消</Option>
</Select>
</Form-item>
@ -38,21 +29,7 @@
<div>
<Button type="primary" class="export" @click="expressOrderDeliver">
批量发货
<Icon type="ios-arrow-down"></Icon>
</Button>
<Poptip @keydown.enter.native="orderVerification" placement="bottom-start" width="400">
<Button class="export">
核验订单
</Button>
<div class="api" slot="content">
<h2>核验订单号</h2>
<div style="margin:10px 0;">
<Input v-model="orderCode" style="width:300px; margin-right:10px;" />
<Button style="primary" @click="orderVerification"></Button>
</div>
</div>
</Poptip>
</div>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" @on-sort-change="changeSort" @on-selection-change="changeSelect"></Table>
<Row type="flex" justify="end" class="page">
@ -76,13 +53,14 @@ export default {
//
pageNumber: 1, //
pageSize: 10, //
sort: "createTime", //
order: "desc", //
sort: "", //
order: "", //
startDate: "", //
endDate: "", //
orderSn: "",
buyerName: "",
orderStatus: "",
orderType: "NORMAL",
},
selectDate: null,
form: {
@ -102,7 +80,7 @@ export default {
{
title: "订单号",
key: "sn",
minWidth: 240,
minWidth: 200,
tooltip: true,
},
{
@ -117,28 +95,12 @@ export default {
} else if (params.row.clientType == "WECHAT_MP") {
return h("div", {}, "小程序端");
} else if (params.row.clientType == "APP") {
return h("div", {}, "移动应用端");
return h("div", {}, "APP端");
} else {
return h("div", {}, params.row.clientType);
}
},
},
{
title: "订单类型",
key: "orderType",
width: 120,
render: (h, params) => {
if (params.row.orderType == "NORMAL") {
return h("div", [h("span", {}, "普通订单")]);
} else if (params.row.orderType == "PINTUAN") {
return h("div", [h("span", {}, "拼团订单")]);
} else if (params.row.orderType == "GIFT") {
return h("div", [h("span", {}, "赠品订单")]);
} else if (params.row.orderType == "VIRTUAL") {
return h("div", [h("tag", {}, "核验订单")]);
}
},
},
{
title: "买家名称",
key: "memberName",
@ -164,30 +126,27 @@ export default {
minWidth: 100,
render: (h, params) => {
if (params.row.orderStatus == "UNPAID") {
return h("div", [h("span", {}, "未付款")]);
return h("div", [h("tag", {props: {color: "magenta"}}, "未付款")]);
} else if (params.row.orderStatus == "PAID") {
return h("div", [h("span", {}, "已付款")]);
return h("div", [h("tag", {props: {color: "blue"}}, "已付款")]);
} else if (params.row.orderStatus == "UNDELIVERED") {
return h("div", [h("span", {}, "待发货")]);
return h("div", [h("tag", {props: {color: "geekblue"}}, "待发货")]);
} else if (params.row.orderStatus == "DELIVERED") {
return h("div", [h("span", {}, "已发货")]);
return h("div", [h("tag", {props: {color: "cyan"}}, "已发货")]);
} else if (params.row.orderStatus == "COMPLETED") {
return h("div", [h("span", {}, "已完成")]);
return h("div", [h("tag", {props: {color: "green"}}, "已完成")]);
} else if (params.row.orderStatus == "TAKE") {
return h("div", [h("span", {}, "待核验")]);
return h("div", [h("tag", {props: {color: "volcano"}}, "待核验")]);
} else if (params.row.orderStatus == "CANCELLED") {
return h("div", [h("span", {}, "已取消")]);
return h("div", [h("tag", {props: {color: "red"}}, "已取消")]);
}
},
},
{
title: "下单时间",
key: "createTime",
width: 170,
sortable: true,
sortType: "desc",
width: 170
},
{
title: "操作",
key: "action",
@ -229,8 +188,6 @@ export default {
let result = await verificationCode(this.orderCode);
if (result.success) {
this.$router.push({
name: "order-detail",
query: { sn: result.result.sn || this.orderCode },
@ -309,6 +266,9 @@ export default {
});
},
},
mounted() {
this.init();
},
activated() {
this.init();
},

View File

@ -0,0 +1,285 @@
<template>
<div class="search">
<Card>
<Row @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="订单编号" prop="orderSn">
<Input type="text" v-model="searchForm.orderSn" clearable placeholder="请输入订单编号" style="width: 160px" />
</Form-item>
<Form-item label="会员名称" prop="buyerName">
<Input type="text" v-model="searchForm.buyerName" clearable placeholder="请输入会员名称" style="width: 160px" />
</Form-item>
<Form-item label="订单状态" prop="orderStatus">
<Select v-model="searchForm.orderStatus" placeholder="请选择" clearable style="width: 160px">
<Option value="UNPAID">未付款</Option>
<Option value="PAID">已付款</Option>
<Option value="COMPLETED">已完成</Option>
<Option value="TAKE">待核验</Option>
<Option value="CANCELLED">已取消</Option>
</Select>
</Form-item>
<Form-item label="下单时间">
<DatePicker v-model="selectDate" type="datetimerange" format="yyyy-MM-dd" clearable @on-change="selectDateRange" placeholder="选择起始时间" style="width: 160px"></DatePicker>
</Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
<Button @click="handleReset" class="search-btn">重置</Button>
</Form>
</Row>
<div>
<Poptip @keydown.enter.native="orderVerification" placement="bottom-start" width="400">
<Button class="export">
核验订单
</Button>
<div class="api" slot="content">
<h2>核验码</h2>
<div style="margin:10px 0;">
<Input v-model="orderCode" style="width:300px; margin-right:10px;" />
<Button style="primary" @click="orderVerification"></Button>
</div>
</div>
</Poptip>
</div>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" @on-sort-change="changeSort" @on-selection-change="changeSelect"></Table>
<Row type="flex" justify="end" class="page">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small"
show-total show-elevator show-sizer></Page>
</Row>
</Card>
</div>
</template>
<script>
import * as API_Order from "@/api/order";
import { verificationCode } from "@/api/order";
export default {
name: "virtualOrderList",
data() {
return {
orderCode: "",
loading: true, //
searchForm: {
//
pageNumber: 1, //
pageSize: 10, //
sort: "createTime", //
order: "desc", //
startDate: "", //
endDate: "", //
orderSn: "",
buyerName: "",
orderStatus: "",
orderType: "VIRTUAL",
},
selectDate: null,
form: {
//
sn: "",
sellerName: "",
startTime: "",
endTime: "",
billPrice: "",
},
//
formValidate: {},
submitLoading: false, //
selectList: [], //
selectCount: 0, //
columns: [
{
title: "订单号",
key: "sn",
minWidth: 240,
tooltip: true,
},
{
title: "订单来源",
key: "clientType",
width: 120,
render: (h, params) => {
if (params.row.clientType == "H5") {
return h("div", {}, "移动端");
} else if (params.row.clientType == "PC") {
return h("div", {}, "PC端");
} else if (params.row.clientType == "WECHAT_MP") {
return h("div", {}, "小程序端");
} else if (params.row.clientType == "APP") {
return h("div", {}, "移动应用端");
} else {
return h("div", {}, params.row.clientType);
}
},
},
{
title: "买家名称",
key: "memberName",
minWidth: 130,
tooltip: true,
},
{
title: "订单金额",
key: "flowPrice",
minWidth: 100,
tooltip: true,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.flowPrice, "¥")
);
},
},
{
title: "订单状态",
key: "orderStatus",
minWidth: 100,
render: (h, params) => {
if (params.row.orderStatus == "UNPAID") {
return h("div", [h("tag", {props: {color: "magenta"}}, "未付款")]);
} else if (params.row.orderStatus == "PAID") {
return h("div", [h("tag", {props: {color: "blue"}}, "已付款")]);
} else if (params.row.orderStatus == "UNDELIVERED") {
return h("div", [h("tag", {props: {color: "geekblue"}}, "待发货")]);
} else if (params.row.orderStatus == "DELIVERED") {
return h("div", [h("tag", {props: {color: "cyan"}}, "已发货")]);
} else if (params.row.orderStatus == "COMPLETED") {
return h("div", [h("tag", {props: {color: "green"}}, "已完成")]);
} else if (params.row.orderStatus == "TAKE") {
return h("div", [h("tag", {props: {color: "volcano"}}, "待核验")]);
} else if (params.row.orderStatus == "CANCELLED") {
return h("div", [h("tag", {props: {color: "red"}}, "已取消")]);
}
},
},
{
title: "下单时间",
key: "createTime",
width: 170,
sortable: true,
sortType: "desc",
},
{
title: "操作",
key: "action",
align: "center",
width: 100,
render: (h, params) => {
return h("div", [
h(
"Button",
{
props: {
type: "info",
size: "small",
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.detail(params.row);
},
},
},
"查看"
),
]);
},
},
],
data: [], //
total: 0, //
};
},
methods: {
/**
* 核验订单
*/
async orderVerification() {
let result = await verificationCode(this.orderCode);
if (result.success) {
this.$router.push({
name: "order-detail",
query: { sn: result.result.sn || this.orderCode },
});
}
},
init() {
this.getDataList();
},
changePage(v) {
this.searchForm.pageNumber = v;
this.getDataList();
},
changePageSize(v) {
this.searchForm.pageSize = v;
this.getDataList();
},
handleSearch() {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.getDataList();
},
handleReset() {
this.searchForm = {};
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.searchForm.orderType = "VIRTUAL";
this.selectDate = null;
this.searchForm.startDate = "";
this.searchForm.endDate = "";
//
this.getDataList();
},
changeSort(e) {
this.searchForm.sort = e.key;
this.searchForm.order = e.order;
if (e.order === "normal") {
this.searchForm.order = "";
}
this.getDataList();
},
changeSelect(e) {
this.selectList = e;
this.selectCount = e.length;
},
selectDateRange(v) {
if (v) {
this.searchForm.startDate = v[0];
this.searchForm.endDate = v[1];
}
},
getDataList() {
this.loading = true;
API_Order.getOrderList(this.searchForm).then((res) => {
this.loading = false;
if (res.success) {
this.data = res.result.records;
this.total = res.result.total;
}
});
},
detail(v) {
let sn = v.sn;
this.$router.push({
name: "order-detail",
query: { sn: sn },
});
},
},
activated() {
this.init();
},
};
</script>
<style lang="scss">
//
@import "@/styles/table-common.scss";
.export {
margin: 10px 20px 10px 0;
}
</style>

View File

@ -2,39 +2,15 @@
<div class="search">
<Card>
<Row @keydown.enter.native="handleSearch">
<Form
ref="searchForm"
:model="searchForm"
inline
:label-width="70"
class="search-form"
>
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form">
<Form-item label="订单编号" prop="orderSn">
<Input
type="text"
v-model="searchForm.orderSn"
clearable
placeholder="请输入订单编号"
style="width: 200px"
/>
<Input type="text" v-model="searchForm.orderSn" clearable placeholder="请输入订单编号" style="width: 200px" />
</Form-item>
<Form-item label="会员名称" prop="memberName">
<Input
type="text"
v-model="searchForm.memberName"
clearable
placeholder="请输入会员名称"
style="width: 200px"
/>
<Input type="text" v-model="searchForm.memberName" clearable placeholder="请输入会员名称" style="width: 200px" />
</Form-item>
<Form-item label="发票抬头" prop="receiptTitle">
<Input
type="text"
v-model="searchForm.receiptTitle"
clearable
placeholder="请输入发票抬头"
style="width: 200px"
/>
<Input type="text" v-model="searchForm.receiptTitle" clearable placeholder="请输入发票抬头" style="width: 200px" />
</Form-item>
<Form-item label="状态" prop="receiptStatus">
<Select v-model="searchForm.receiptStatus" placeholder="请选择" clearable style="width: 200px">
@ -46,275 +22,280 @@
<Button @click="handleReset" class="search-btn">重置</Button>
</Form>
</Row>
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
sortable="custom"
@on-sort-change="changeSort"
@on-selection-change="changeSelect"
>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" @on-sort-change="changeSort" @on-selection-change="changeSelect">
<!-- 订单详情格式化 -->
<template slot="orderSlot" slot-scope="scope">
<a
@click="$router.push({name: 'order-detail',query: {sn: scope.row.orderSn}})">{{scope.row.orderSn}}</a>
<a @click="$router.push({name: 'order-detail',query: {sn: scope.row.orderSn}})">{{scope.row.orderSn}}</a>
</template>
</Table>
<Row type="flex" justify="end" class="page">
<Page
:current="searchForm.pageNumber"
:total="total"
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-elevator
show-sizer
></Page>
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small"
show-total show-elevator show-sizer></Page>
</Row>
</Card>
</div>
</template>
<script>
import * as API_Order from "@/api/order";
import * as API_Order from "@/api/order";
export default {
name: "storeBill",
components: {},
data() {
return {
loading: true, //
searchForm: {
//
pageNumber: 1, //
pageSize: 10, //
sort: "createTime", //
order: "desc", //
receiptStatus: "", //
export default {
name: "storeBill",
components: {},
data() {
return {
loading: true, //
searchForm: {
//
pageNumber: 1, //
pageSize: 10, //
sort: "createTime", //
order: "desc", //
receiptStatus: "", //
},
form: {
//
sn: "",
sellerName: "",
startTime: "",
endTime: "",
billPrice: "",
},
//
formValidate: {},
submitLoading: false, //
selectList: [], //
selectCount: 0, //
columns: [
{
title: "订单号",
key: "orderSn",
minWidth: 120,
slot: "orderSlot",
},
form: {
//
sn: "",
sellerName: "",
startTime: "",
endTime: "",
billPrice: "",
{
title: "会员名称",
key: "memberName",
minWidth: 90,
tooltip: true,
},
//
formValidate: {},
submitLoading: false, //
selectList: [], //
selectCount: 0, //
columns: [
{
title: "订单号",
key: "orderSn",
minWidth: 120,
slot: "orderSlot",
},
{
title: "会员名称",
key: "memberName",
minWidth: 90,
tooltip: true
},
{
title: "发票抬头",
key: "receiptTitle",
minWidth: 90,
tooltip: true
{
title: "发票抬头",
key: "receiptTitle",
minWidth: 90,
tooltip: true,
render: (h, params) => {
return h("div", params.row.receiptTitle || "暂未填写");
},
{
title: "纳税人识别号",
key: "taxpayerId",
minWidth: 100,
tooltip: true
},
{
title: "纳税人识别号",
key: "taxpayerId",
minWidth: 100,
tooltip: true,
render: (h, params) => {
return h("div", params.row.taxpayerId || "暂未填写");
},
{
title: "发票内容",
key: "receiptContent",
minWidth: 120,
tooltip: true
},
{
title: "发票内容",
key: "receiptContent",
minWidth: 120,
tooltip: true,
render: (h, params) => {
return h("div", params.row.receiptContent || "暂未填写");
},
{
title: "发票金额",
key: "billPrice",
width: 90,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.receiptPrice, "¥")
);
},
},
{
title: "发票金额",
key: "billPrice",
width: 150,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.receiptPrice, "¥")
);
},
{
title: "发票状态",
key: "receiptStatus",
width: 90,
tooltip: true,
render: (h, params) => {
if(params.row.receiptStatus == 0){
return h(
"div",
"未开票"
);
}else{
return h(
"div",
"已开票"
);
}
},
},
{
title: "订单状态",
key: "orderStatus",
width: 90,
render: (h, params) => {
if (params.row.orderStatus == "UNPAID") {
return h('div', [h('span', { }, '未付款'),]);
} else if (params.row.orderStatus == "PAID") {
return h('div', [h('span', { }, '已付款'),]);
} else if (params.row.orderStatus == "UNDELIVERED") {
return h('div', [h('span', { }, '待发货'),]);
}else if (params.row.orderStatus == "DELIVERED") {
return h('div', [h('span', { }, '已发货'),]);
}else if (params.row.orderStatus == "COMPLETED") {
return h('div', [h('span', { }, '已完成'),]);
}else if (params.row.orderStatus == "TAKE") {
return h('div', [h('span', { }, '待核验'),]);
}else if (params.row.orderStatus == "CANCELLED") {
return h('div', [h('span', { }, '已取消'),]);
}
},
{
title: "发票状态",
key: "receiptStatus",
width: 90,
tooltip: true,
render: (h, params) => {
if (params.row.receiptStatus == 0) {
return h("div", [
h("tag", { props: { color: "volcano" } }, "未开票"),
]);
} else {
return h("div", [
h("tag", { props: { color: "green" } }, "未开票"),
]);
}
},
{
title: "操作",
key: "action",
align: "center",
width: 80,
render: (h, params) => {
},
{
title: "订单状态",
key: "orderStatus",
width: 90,
render: (h, params) => {
if (params.row.orderStatus == "UNPAID") {
return h("div", [
h(
"Button",
{
props: {
type: "info",
size: "small",
},
attrs: {
disabled: params.row.orderStatus == "COMPLETED" && params.row.receiptStatus == 0? false : true,
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.invoicing(params.row);
},
h("tag", { props: { color: "magenta" } }, "未付款"),
]);
} else if (params.row.orderStatus == "PAID") {
return h("div", [
h("tag", { props: { color: "blue" } }, "已付款"),
]);
} else if (params.row.orderStatus == "UNDELIVERED") {
return h("div", [
h("tag", { props: { color: "geekblue" } }, "待发货"),
]);
} else if (params.row.orderStatus == "DELIVERED") {
return h("div", [
h("tag", { props: { color: "cyan" } }, "已发货"),
]);
} else if (params.row.orderStatus == "COMPLETED") {
return h("div", [
h("tag", { props: { color: "green" } }, "已完成"),
]);
} else if (params.row.orderStatus == "TAKE") {
return h("div", [
h("tag", { props: { color: "volcano" } }, "待核验"),
]);
} else if (params.row.orderStatus == "CANCELLED") {
return h("div", [
h("tag", { props: { color: "red" } }, "已取消"),
]);
}
},
},
{
title: "操作",
key: "action",
align: "center",
width: 80,
render: (h, params) => {
return h("div", [
h(
"Button",
{
props: {
type: "info",
size: "small",
},
attrs: {
disabled:
params.row.orderStatus == "COMPLETED" &&
params.row.receiptStatus == 0
? false
: true,
},
style: {
marginRight: "5px",
},
on: {
click: () => {
this.invoicing(params.row);
},
},
"开票"
),
]);
},
},
"开票"
),
]);
},
],
data: [], //
total: 0, //
};
},
],
data: [], //
total: 0, //
};
},
methods: {
init() {
this.getData();
},
methods: {
init() {
this.getData();
},
changePage(v) {
this.searchForm.pageNumber = v;
this.getData();
this.clearSelectAll();
},
changePageSize(v) {
this.searchForm.pageSize = v;
this.getData();
},
handleSearch() {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.getData();
},
handleReset() {
this.searchForm = {}
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.getData();
},
changeSort(e) {
this.searchForm.sort = e.key;
this.searchForm.order = e.order;
if (e.order === "normal") {
this.searchForm.order = "";
}
this.getData();
},
clearSelectAll() {
this.$refs.table.selectAll(false);
},
changeSelect(e) {
this.selectList = e;
this.selectCount = e.length;
},
selectDateRange(v) {
if (v) {
this.searchForm.startDate = v[0];
this.searchForm.endDate = v[1];
}
},
getData() {
this.loading = true;
API_Order.getReceiptPage(this.searchForm).then((res) => {
this.loading = false;
if (res.success) {
this.data = res.result.records;
this.total = res.result.total;
}
});
this.total = this.data.length;
changePage(v) {
this.searchForm.pageNumber = v;
this.getData();
this.clearSelectAll();
},
changePageSize(v) {
this.searchForm.pageSize = v;
this.getData();
},
handleSearch() {
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.getData();
},
handleReset() {
this.searchForm = {};
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.getData();
},
changeSort(e) {
this.searchForm.sort = e.key;
this.searchForm.order = e.order;
if (e.order === "normal") {
this.searchForm.order = "";
}
this.getData();
},
clearSelectAll() {
this.$refs.table.selectAll(false);
},
changeSelect(e) {
this.selectList = e;
this.selectCount = e.length;
},
selectDateRange(v) {
if (v) {
this.searchForm.startDate = v[0];
this.searchForm.endDate = v[1];
}
},
getData() {
this.loading = true;
API_Order.getReceiptPage(this.searchForm).then((res) => {
this.loading = false;
},
//
invoicing(params){
this.$Modal.confirm({
title: "确认开票",
content: "您确认已经开具发票 ?",
loading: true,
onOk: () => {
API_Order.invoicing(params.id).then((res) => {
if (res.success) {
this.$Message.success("开票成功");
}
this.$Modal.remove();
this.getData();
});
}
});
},
if (res.success) {
this.data = res.result.records;
this.total = res.result.total;
}
});
this.total = this.data.length;
this.loading = false;
},
activated() {
this.init();
//
invoicing(params) {
this.$Modal.confirm({
title: "确认开票",
content: "您确认已经开具发票 ?",
loading: true,
onOk: () => {
API_Order.invoicing(params.id).then((res) => {
if (res.success) {
this.$Message.success("开票成功");
}
this.$Modal.remove();
this.getData();
});
},
});
},
};
},
mounted() {
this.init();
},
activated() {
this.init();
},
};
</script>
<style lang="scss">
//
@import "@/styles/table-common.scss";
//
@import "@/styles/table-common.scss";
</style>

View File

@ -2,29 +2,12 @@
<div class="search">
<Card>
<Row>
<Form
ref="searchForm"
:model="searchForm"
inline
:label-width="100"
class="search-form"
>
<Form ref="searchForm" :model="searchForm" inline :label-width="100" class="search-form">
<Form-item label="优惠券名称">
<Input
type="text"
v-model="searchForm.couponName"
placeholder="请输入优惠券名称"
clearable
style="width: 200px"
/>
<Input type="text" v-model="searchForm.couponName" placeholder="请输入优惠券名称" clearable style="width: 200px" />
</Form-item>
<Form-item label="活动状态" prop="promotionStatus">
<Select
v-model="searchForm.promotionStatus"
placeholder="请选择"
clearable
style="width: 200px"
>
<Select v-model="searchForm.promotionStatus" placeholder="请选择" clearable style="width: 200px">
<Option value="NEW">未开始</Option>
<Option value="START">已开始/上架</Option>
<Option value="END">已结束/下架</Option>
@ -32,21 +15,9 @@
</Select>
</Form-item>
<Form-item label="活动时间">
<DatePicker
v-model="selectDate"
type="daterange"
clearable
placeholder="选择起始时间"
style="width: 200px"
></DatePicker>
<DatePicker v-model="selectDate" type="daterange" clearable placeholder="选择起始时间" style="width: 200px"></DatePicker>
</Form-item>
<Button
@click="handleSearch"
type="primary"
class="search-btn"
icon="ios-search"
>搜索</Button
>
<Button @click="handleSearch" type="primary" class="search-btn" icon="ios-search">搜索</Button>
<Button @click="handleReset" class="search-btn">重置</Button>
</Form>
</Row>
@ -55,57 +26,22 @@
<Button @click="delAll" class="ml_10">批量下架</Button>
<!-- <Button @click="upAll"></Button> -->
</Row>
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
sortable="custom"
@on-sort-change="changeSort"
@on-selection-change="changeSelect"
>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom" @on-sort-change="changeSort" @on-selection-change="changeSelect">
<template slot-scope="{ row }" slot="action">
<Button
v-if="row.promotionStatus === 'NEW' || row.promotionStatus === 'CLOSE'"
type="info"
size="small"
style="margin-right: 10px"
@click="edit(row)"
>编辑</Button
>
<Button
v-if="row.promotionStatus !== 'CLOSE'"
type="error"
size="small"
@click="remove(row)"
>下架</Button
>
<Button v-if="row.promotionStatus === 'NEW' || row.promotionStatus === 'CLOSE'" type="info" size="small" style="margin-right: 10px" @click="edit(row)"></Button>
<Button v-if="row.promotionStatus !== 'CLOSE'" type="error" size="small" @click="remove(row)"></Button>
</template>
</Table>
<Row type="flex" justify="end" class="page">
<Page
:current="searchForm.pageNumber + 1"
:total="total"
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-elevator
show-sizer
></Page>
<Page :current="searchForm.pageNumber + 1" :total="total" :page-size="searchForm.pageSize" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]"
size="small" show-total show-elevator show-sizer></Page>
</Row>
</Card>
</div>
</template>
<script>
import {
getShopCouponList,
updateCouponStatus,
} from "@/api/promotion";
import { getShopCouponList, updateCouponStatus } from "@/api/promotion";
export default {
name: "coupon",
@ -143,18 +79,19 @@ export default {
{
title: "活动名称",
key: "promotionName",
width: 120,
minWidth: 100,
fixed: "left",
},
{
title: "优惠券名称",
key: "couponName",
width: 120,
tooltip: true
}, {
minWidth: 100,
tooltip: true,
},
{
title: "面额/折扣",
key: "price",
width: 120,
width: 100,
render: (h, params) => {
if (params.row.price) {
return h(
@ -170,11 +107,13 @@ export default {
{
title: "领取数量/总数量",
key: "publishNum",
width: 130,
render: (h, params) => {
return h(
"div", params.row.receivedNum + "/" + params.row.publishNum)
"div",
params.row.receivedNum + "/" + params.row.publishNum
);
},
minWidth:130,
},
{
title: "优惠券类型",
@ -210,21 +149,28 @@ export default {
},
{
title: "活动时间",
render: (h, params) => {
return h("div", {
domProps:
{innerHTML: params.row.startTime + "<br/>" + params.row.endTime}
});
if (params.row.getType === "ACTIVITY") {
return h("div", "长期有效");
} else {
return h("div", {
domProps: {
innerHTML:
params.row.startTime + "<br/>" + params.row.endTime,
},
});
}
},
minWidth:150,
},
{
title: "状态",
width: 100,
key: "promotionStatus",
fixed: "right",
render: (h, params) => {
let text = "未知",
color = "";
color = "red";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "default";
@ -250,14 +196,14 @@ export default {
),
]);
},
minWidth:70,
minWidth: 70,
},
{
title: "操作",
slot: "action",
align: "center",
fixed: "right",
minWidth: 140
maxWidth: 140,
},
],
data: [], //
@ -292,8 +238,8 @@ export default {
this.getDataList();
},
handleReset() {
this.searchForm = {}
this.selectDate = ''
this.searchForm = {};
this.selectDate = "";
this.searchForm.pageNumber = 0;
this.getDataList();
},
@ -423,7 +369,7 @@ export default {
});
},
},
activated () {
activated() {
this.init();
},
};

View File

@ -6,22 +6,10 @@
<h4>基本信息</h4>
<div class="form-item-view">
<FormItem label="活动名称" prop="promotionName">
<Input
type="text"
v-model="form.promotionName"
placeholder="活动名称"
clearable
style="width: 260px"
/>
<Input type="text" v-model="form.promotionName" placeholder="活动名称" clearable style="width: 260px" />
</FormItem>
<FormItem label="优惠券名称" prop="couponName">
<Input
type="text"
v-model="form.couponName"
placeholder="优惠券名称"
clearable
style="width: 260px"
/>
<Input type="text" v-model="form.couponName" placeholder="优惠券名称" clearable style="width: 260px" />
</FormItem>
<FormItem label="优惠券类型" prop="couponType">
<Select v-model="form.couponType" style="width: 260px">
@ -29,32 +17,12 @@
<Option value="PRICE">减免现金</Option>
</Select>
</FormItem>
<FormItem
label="折扣"
prop="discount"
v-if="form.couponType == 'DISCOUNT'"
>
<Input
type="number"
v-model="form.couponDiscount"
placeholder="折扣"
clearable
style="width: 260px"
/>
<FormItem label="折扣" prop="discount" v-if="form.couponType == 'DISCOUNT'">
<Input type="number" v-model="form.couponDiscount" placeholder="折扣" clearable style="width: 260px" />
<span class="describe">请输入0-10之间数字可以输入一位小数</span>
</FormItem>
<FormItem
label="面额"
prop="price"
v-if="form.couponType == 'PRICE'"
>
<Input
type="text"
v-model="form.price"
placeholder="面额"
clearable
style="width: 260px"
/>
<FormItem label="面额" prop="price" v-if="form.couponType == 'PRICE'">
<Input type="text" v-model="form.price" placeholder="面额" clearable style="width: 260px" />
</FormItem>
<FormItem label="活动类型" prop="getType">
<Select v-model="form.getType" style="width: 260px">
@ -63,42 +31,22 @@
</Select>
</FormItem>
<FormItem label="发放数量" prop="publishNum">
<Input
v-model="form.publishNum"
placeholder="发放数量"
style="width: 260px"
/>
<FormItem label="发放数量" v-if="form.getType == 'FREE'" prop="publishNum">
<Input v-model="form.publishNum" placeholder="发放数量" style="width: 260px" />
<div class="tips">如果发放数量为0时,则代表不限制发放数量</div>
</FormItem>
</div>
<h4>使用限制</h4>
<div class="form-item-view">
<FormItem label="消费门槛" prop="consumeThreshold">
<Input
type="text"
v-model="form.consumeThreshold"
placeholder="消费门槛"
clearable
style="width: 260px"
/>
<Input type="text" v-model="form.consumeThreshold" placeholder="消费门槛" clearable style="width: 260px" />
</FormItem>
<FormItem label="领取限制" prop="couponLimitNum">
<Input
v-model="form.couponLimitNum"
placeholder="领取限制"
clearable
style="width: 260px"
/>
<FormItem label="领取限制" v-if="form.getType == 'FREE'" prop="couponLimitNum">
<Input v-model="form.couponLimitNum" placeholder="领取限制" clearable style="width: 260px" />
<div class="tips">如果领取限制为0时,则代表不限制领取数量</div>
</FormItem>
<FormItem label="有效期" prop="rangeTime">
<DatePicker
type="datetimerange"
v-model="form.rangeTime"
format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择"
:options="options"
style="width: 260px"
>
<DatePicker type="datetimerange" v-model="form.rangeTime" format="yyyy-MM-dd HH:mm:ss" placeholder="请选择" :options="options" style="width: 260px">
</DatePicker>
</FormItem>
<FormItem label="使用范围" prop="scopeType">
@ -109,34 +57,14 @@
</RadioGroup>
</FormItem>
<FormItem
style="width: 100%"
v-if="form.scopeType == 'PORTION_GOODS'"
>
<FormItem style="width: 100%" v-if="form.scopeType == 'PORTION_GOODS'">
<div style="display: flex; margin-bottom: 10px">
<Button type="primary" @click="openSkuList"
>选择商品</Button>
<Button
type="error"
ghost
style="margin-left: 10px"
@click="delSelectGoods"
>批量删除</Button
>
<Button type="primary" @click="openSkuList"></Button>
<Button type="error" ghost style="margin-left: 10px" @click="delSelectGoods"></Button>
</div>
<Table
border
:columns="columns"
:data="form.promotionGoodsList"
@on-selection-change="changeSelect"
>
<Table border :columns="columns" :data="form.promotionGoodsList" @on-selection-change="changeSelect">
<template slot-scope="{ row }" slot="QRCode">
<img
:src="row.QRCode || '../../../assets/lili.png'"
width="50px"
height="50px"
alt=""
/>
<img :src="row.QRCode || '../../../assets/lili.png'" width="50px" height="50px" alt="" />
</template>
</Table>
</FormItem>
@ -147,35 +75,17 @@
</FormItem>
<FormItem label="范围描述" prop="description">
<Input
v-model="form.description"
type="textarea"
:rows="4"
maxlength="50"
show-word-limit
clearable
style="width: 260px"
/>
<Input v-model="form.description" type="textarea" :rows="4" maxlength="50" show-word-limit clearable style="width: 260px" />
</FormItem>
<div>
<Button type="text" @click="$router.push({ name: 'coupon' })"
>返回</Button
>
<Button
type="primary"
:loading="submitLoading"
@click="handleSubmit"
>提交</Button
>
<Button type="text" @click="$router.push({ name: 'coupon' })">返回</Button>
<Button type="primary" :loading="submitLoading" @click="handleSubmit"></Button>
</div>
</div>
</div>
</Form>
</Card>
<sku-select
ref="skuSelect"
@selectedGoodsData="selectedGoodsData"
></sku-select>
<sku-select ref="skuSelect" @selectedGoodsData="selectedGoodsData"></sku-select>
</div>
</template>
@ -212,7 +122,7 @@ export default {
callback();
}
};
return {
modalType: 0, // 0 1
categoryId: 0, // id
@ -232,6 +142,7 @@ export default {
getType: "FREE",
promotionGoodsList: [],
scopeIdGoods: [],
rangeDayType: "FIXEDTIME",
},
id: this.$route.query.id,
submitLoading: false, //
@ -392,7 +303,11 @@ export default {
params.endTime = this.$options.filters.unixToDate(
this.form.rangeTime[1] / 1000
);
delete params.rangeTime
if (params.getType == "ACTIVITY") {
params.couponLimitNum = 0;
params.publishNum = 0;
}
delete params.rangeTime;
let scopeId = [];
if (
params.scopeType == "PORTION_GOODS" &&
@ -465,12 +380,13 @@ export default {
name: "coupon",
});
},
openSkuList() { //
openSkuList() {
//
this.$refs.skuSelect.open("goods");
let data = JSON.parse(JSON.stringify(this.form.promotionGoodsList))
data.forEach(e => {
e.id = e.skuId
})
let data = JSON.parse(JSON.stringify(this.form.promotionGoodsList));
data.forEach((e) => {
e.id = e.skuId;
});
this.$refs.skuSelect.goodsData = data;
},
changeSelect(e) {
@ -507,15 +423,15 @@ export default {
//
let list = [];
item.forEach((e) => {
list.push({
goodsName: e.goodsName,
price: e.price,
originalPrice: e.price,
quantity: e.quantity,
storeId: e.storeId,
sellerName: e.sellerName,
skuId: e.id,
});
list.push({
goodsName: e.goodsName,
price: e.price,
originalPrice: e.price,
quantity: e.quantity,
storeId: e.storeId,
sellerName: e.sellerName,
skuId: e.id,
});
});
this.form.promotionGoodsList = list;
},
@ -598,11 +514,15 @@ h4 {
margin-left: 10px;
color: #999;
}
.ivu-form-item{
.ivu-form-item {
margin-bottom: 24px !important;
}
.wrapper{
.wrapper {
min-height: 1000px;
}
.tips {
font-size: 12px;
color: #999;
}
</style>

View File

@ -113,9 +113,11 @@
>&nbsp;
<Checkbox
:disabled="form.promotionStatus != 'NEW'"
v-if="JSON.parse(getStore('userInfo')).selfOperated"
v-model="form.isPoint"
>送积分</Checkbox
>
</FormItem>
<FormItem v-if="form.isCoupon" label="赠送优惠券" prop="couponId">
<Select

View File

@ -97,7 +97,7 @@
</FormItem>
<FormItem label="商品" v-if="$route.query.id">
<Button type="primary" :disabled="liveStatus!='NEW'" ghost @click="liveGoodsVisible=true" icon="md-add">添加商品</Button>
<Button type="primary" ghost @click="liveGoodsVisible=true" :disabled="liveStatus!='NEW'" icon="md-add">添加商品</Button>
<Table class="goods-table" :columns="liveColumns" :data="liveData">
<template slot-scope="{ row,index }" slot="goodsName">
<div class="flex-goods">
@ -130,7 +130,7 @@
</FormItem>
<FormItem>
<Button type="primary" @click="createLives()"></Button>
<Button type="primary" v-if="liveStatus=='NEW'" @click="createLives()"></Button>
</FormItem>
</Form>
@ -140,8 +140,8 @@
<img :src="imageSrc" v-if="imageVisible" style="width: 100%">
</Modal>
<Modal width="800" v-model="liveGoodsVisible" @on-ok="addGoods">
<liveGoods :init="liveData" @selectedGoods="callBackData" reviewed />
<Modal width="800" v-model="liveGoodsVisible" footer-hide>
<liveGoods @selectedGoods="callBackData" reviewed />
</Modal>
</div>
</template>
@ -172,6 +172,7 @@ export default {
//
optionsTime: {
disabledDate(date) {
// console.log(data)
return date && date.valueOf() < Date.now() - 86400000;
},
},
@ -191,7 +192,7 @@ export default {
startTime: [
{
required: true,
message: "请输入开始时间以及结束时间",
message: "请正确输入开始时间以及结束时间",
},
],
feedsImg: [
@ -258,10 +259,14 @@ export default {
* 删除直播间商品
*/
async deleteGoods(val, index) {
this.$Spin.show();
let res = await delRoomLiveGoods(this.liveForm.roomId, val.liveGoodsId);
if (res.success) {
this.$Message.success("删除成功!");
this.liveData.splice(index, 1);
this.$Spin.hide();
} else {
this.$Spin.hide();
}
},
/**
@ -324,22 +329,20 @@ export default {
* 回调的商品选择数据
*/
callBackData(way) {
this.$set(this, "liveData", way);
},
/**
* dialog点击确定时判断
*/
addGoods() {
this.liveData.forEach((item) => {
this.commodityList.forEach((oldVal) => {
if (oldVal.liveGoodsId != item.liveGoodsId) {
addLiveGoods({
roomId: this.$route.query.roomId,
liveGoodsId: item.liveGoodsId,
});
}
});
console.log(way);
this.liveGoodsVisible = false;
this.$Spin.show();
addLiveGoods({
roomId: this.$route.query.roomId,
liveGoodsId: way.liveGoodsId,
}).then((res) => {
if (res.success) {
this.liveData.push(way);
this.$Spin.hide();
console.log(this.liveData);
} else {
this.$Spin.hide();
}
});
},
@ -389,21 +392,66 @@ export default {
this.liveForm.coverImg = res.result;
},
tipsDateError() {
this.$Message.error({
content:
"直播开播时间需要在当前时间的10分钟后并且,开始时间不能在6个月后,直播计划结束时间开播时间和结束时间间隔不得短于30分钟不得超过24小时",
duration: 5,
});
},
/**
* 选择时间后的回调
*/
handleChangeTime(daterange) {
this.times = daterange;
this.$set(
this.liveForm,
"startTime",
new Date(daterange[0]).getTime() / 1000
);
this.$set(
this.liveForm,
"endTime",
new Date(daterange[1]).getTime() / 1000
);
/**
* 直播开播时间需要在当前时间的10分钟后
* 此处设置默认为15分钟方便调整
*/
let siteTime = new Date().getTime() / 1000;
let selectTime = new Date(daterange[0]).getTime() / 1000;
let currentTime = this.$options.filters.unixToDate(siteTime);
/**
* 开播时间和结束时间间隔不得短于30分钟不得超过24小时
* 判断用户设置的结束时间
*/
let endTime = new Date(daterange[1]).getTime() / 1000;
if (selectTime <= siteTime + 15 * 60) {
this.tipsDateError();
return false;
} else if (selectTime + 30 * 60 >= endTime) {
// 30
this.tipsDateError();
return false;
} else if (selectTime + 24 * 60 * 60 <= endTime) {
// 24
this.tipsDateError();
return false;
} else if (
// 6
siteTime >=
new Date().getTime() + 6 * 31 * 24 * 3600 * 1000 + 86400000
) {
this.tipsDateError();
return false;
} else {
this.$set(this.times, [0], currentTime);
this.times[1] = daterange[1];
// this.times = daterange;
this.$set(
this.liveForm,
"startTime",
new Date(daterange[0]).getTime() / 1000
);
this.$set(
this.liveForm,
"endTime",
new Date(daterange[1]).getTime() / 1000
);
}
},
/**
@ -448,13 +496,15 @@ export default {
//
if (this.$route.query.id && this.liveData.length != 0) {
this.spinShow = true;
this.liveForm.commodityList = JSON.stringify(this.liveForm.commodityList);
this.liveForm.commodityList = JSON.stringify(
this.liveForm.commodityList
);
//
editLive(this.liveForm).then((res) => {
if (res.success) {
this.$Message.success("修改成功!");
this.$router.push({ path: "/storePromotion/live" });
this.$router.push({ path: "/promotion/live" });
}
this.spinShow = false;
});
@ -465,7 +515,7 @@ export default {
if (res.success) {
this.$Message.success("添加成功!");
this.$router.push({ path: "/storePromotion/live" });
this.$router.push({ path: "/promotion/live" });
}
this.spinShow = false;
});

Some files were not shown because too many files have changed in this diff Show More