This commit is contained in:
lemon橪
2021-12-13 19:27:23 +08:00
42 changed files with 2598 additions and 1505 deletions

View File

@@ -60,8 +60,8 @@ export const getPintuanGoodsList = params => {
};
// 关闭拼团活动
export const closePintuan = pintuanId => {
return putRequest(`/promotion/pintuan/close/${pintuanId}`);
export const updatePintuanStatus = (pintuanId, params) => {
return putRequest(`/promotion/pintuan/status/${pintuanId}`, params);
};
// 修改砍价活动商品
@@ -187,12 +187,14 @@ export const saveSeckill = params => {
// 修改秒杀活动
export const updateSeckill = params => {
return putRequest("/promotion/seckill", params);
return putRequest("/promotion/seckill", params, {
"Content-type": "application/json"
});
};
// 关闭秒杀活动
export const closeSeckill = id => {
return putRequest(`/promotion/seckill/close/${id}`);
export const updateSeckillStatus = (id, params) => {
return putRequest(`/promotion/seckill/status/${id}`, params);
};
// 删除秒杀商品
export const delSeckillGoods = params => {

View File

@@ -154,103 +154,103 @@ export const otherRouter = {
component: () => import("@/views/goods/goods-info/goodsDetail.vue")
},
{
path: "promotion/add-points-goods",
path: "promotions/add-points-goods",
title: "添加积分商品",
name: "add-points-goods",
component: () =>
import("@/views/promotion/pointsGoods/addPointsGoods.vue")
import("@/views/promotions/points-goods/points-goods-add.vue")
},
{
path: "promotion/edit-points-goods",
path: "promotions/edit-points-goods",
title: "修改积分商品",
name: "edit-points-goods",
component: () =>
import("@/views/promotion/pointsGoods/editPointsGoods.vue")
import("@/views/promotions/points-goods/points-goods-edit.vue")
},
{
path: "promotion/manager-points-goods-category",
path: "promotions/manager-points-goods-category",
title: "积分商品分类",
name: "manager-points-goods-category",
component: () =>
import("@/views/promotion/pointsGoodsCategory/pointsGoodsCategory.vue")
import("@/views/promotions/points-goods-category/points-goods-category.vue")
},
{
path: "promotion/add-kanJia-activity-goods",
path: "promotions/add-kanJia-activity-goods",
title: "添加砍价活动",
name: "add-kanJia-activity-goods",
component: () => import("@/views/promotion/kanjia/kanjiaActivityAddGoods.vue")
component: () => import("@/views/promotions/kanjia/kanjia-activity-add-goods.vue")
},
{
path: "promotion/edit-kanJia-activity-goods",
path: "promotions/edit-kanJia-activity-goods",
title: "修改砍价活动",
name: "edit-kanJia-activity-goods",
component: () => import("@/views/promotion/kanjia/kanjiaActivityEditGoods.vue")
component: () => import("@/views/promotions/kanjia/kanjia-activity-edit-goods.vue")
},
{
path: "promotion/manager-coupon",
path: "promotions/manager-coupon",
title: "平台优惠券",
name: "manager-coupon",
component: () => import("@/views/promotion/coupon/coupon.vue")
component: () => import("@/views/promotions/coupon/coupon.vue")
},
{
path: "promotion/add-platform-coupon",
path: "promotions/add-platform-coupon",
title: "添加平台优惠券",
name: "add-platform-coupon",
component: () => import("@/views/promotion/coupon/couponPublish.vue")
component: () => import("@/views/promotions/coupon/coupon-publish.vue")
},
{
path: "promotion/edit-platform-coupon",
path: "promotions/edit-platform-coupon",
title: "编辑平台优惠券",
name: "edit-platform-coupon",
component: () => import("@/views/promotion/coupon/couponPublish.vue")
component: () => import("@/views/promotions/coupon/coupon-publish.vue")
},
{
path: "coupon-activity/add",
path: "promotions/add-coupon-activity",
title: "添加优惠券活动",
name: "add-coupon-activity",
component: () => import("@/views/promotion/couponActivity/couponPublish.vue")
component: () => import("@/views/promotions/coupon-activity/coupon-publish.vue")
},
{
path: "coupon-activity/edit",
path: "promotions/edit-coupon-activity",
title: "编辑平台优惠券活动",
name: "edit-coupon-activity",
component: () => import("@/views/promotion/couponActivity/couponPublish.vue")
component: () => import("@/views/promotions/coupon-activity/coupon-publish.vue")
},
{
path: "promotion/coupon-activity-info",
path: "promotions/coupon-activity-info",
title: "券活动详情",
name: "coupon-activity-info",
component: () => import("@/views/promotion/couponActivity/couponInfo.vue")
component: () => import("@/views/promotions/coupon-activity/coupon-info.vue")
},
{
path: "promotion/manager-pintuan",
path: "promotions/manager-pintuan",
title: "平台拼团",
name: "manager-pintuan",
component: () => import("@/views/promotion/pintuan/pintuan.vue")
component: () => import("@/views/promotions/pintuan/pintuan.vue")
},
{
path: "promotion/pintuan/pintuan-goods",
path: "promotions/pintuan/pintuan-goods",
title: "拼团商品",
name: "pintuan-goods",
component: () => import("@/views/promotion/pintuan/pintuanGoods.vue")
component: () => import("@/views/promotions/pintuan/pintuan-goods.vue")
},
{
path: "promotion/full-cut-detail",
path: "promotions/full-discount-detail",
title: "满减满折详情",
name: "full-cut-detail",
component: () => import("@/views/promotion/fullCut/fullCutDetail.vue")
name: "full-discount-detail",
component: () => import("@/views/promotions/full-discount/full-discount-detail.vue")
},
{
path: "promotion/seckill/manager-seckill-add",
path: "promotions/seckill/manager-seckill-add",
title: "编辑秒杀活动",
name: "manager-seckill-add",
component: () => import("@/views/promotion/seckill/addSeckill.vue")
component: () => import("@/views/promotions/seckill/seckill-add.vue")
},
{
path: "promotion/seckill/seckill-goods",
path: "promotions/seckill/seckill-goods",
title: "秒杀商品",
name: "seckill-goods",
component: () => import("@/views/promotion/seckill/seckillGoods.vue")
component: () => import("@/views/promotions/seckill/seckill-goods.vue")
},
{
path: "/floorList/renovation",
@@ -271,10 +271,10 @@ export const otherRouter = {
component: () => import("@/views/sys/message/smsSign.vue")
},
{
path: "liveDetail",
path: "live-detail",
title: "查看直播",
name: "liveDetail",
component: () => import("@/views/promotion/live/liveDetail.vue")
name: "live-detail",
component: () => import("@/views/promotions/live/live-detail.vue")
}
]
};

View File

@@ -0,0 +1,60 @@
export function promotionsStatusRender(h, params) {
let text = "未知",
color = "red";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "geekblue";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "green";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "red";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "red";
}
return h("div", [
h(
"Tag",
{
props: {
color: color,
},
},
text
),
]);
}
export function promotionsScopeTypeRender(h, params) {
let text = "未知",
color = "red";
if (params.row.scopeType == "ALL") {
text = "全品类";
color = "default";
} else if (params.row.scopeType == "PORTION_GOODS_CATEGORY") {
text = "商品分类";
color = "yellow";
} else if (params.row.scopeType == "PORTION_SHOP_CATEGORY") {
text = "店铺分类";
color = "pink";
} else if (params.row.scopeType == "PORTION_GOODS") {
text = "指定商品";
color = "magenta";
}
return h("div", [
h(
"Tag",
{
props: {
color: color,
},
},
text
),
]);
}

View File

@@ -9,27 +9,31 @@
<span>{{ couponActivity.promotionName }}</span>
</FormItem>
<FormItem label="活动类型">
<span v-if="couponActivity.couponActivityType === 'REGISTERED'" >新人发券</span>
<span v-if="couponActivity.couponActivityType === 'REGISTERED'"
>新人发券</span
>
<spin v-else>精确发券</spin>
</FormItem>
<FormItem label="活动范围" v-if="couponActivity.couponActivityType === 'SPECIFY'" >
<span v-if="couponActivity.activityScope === 'ALL'" >全部会员</span>
<FormItem
label="活动范围"
v-if="couponActivity.couponActivityType === 'SPECIFY'"
>
<span v-if="couponActivity.activityScope === 'ALL'">全部会员</span>
<spin v-else>指定会员</spin>
</FormItem>
<FormItem label="活动时间">
<span>{{ couponActivity.startTime }}{{ couponActivity.endTime }}</span>
</FormItem>
<FormItem label="活动状态">
<span v-if="couponActivity.promotionStatus==='NEW'">新建</span>
<span v-if="couponActivity.promotionStatus==='START'">已开始</span>
<span v-if="couponActivity.promotionStatus==='END'">已结束</span>
<span v-if="couponActivity.promotionStatus==='CLOSE'">废弃</span>
<span v-if="couponActivity.promotionStatus === 'NEW'">未开始</span>
<span v-if="couponActivity.promotionStatus === 'START'">已开始</span>
<span v-if="couponActivity.promotionStatus === 'END'">已结束</span>
<span v-if="couponActivity.promotionStatus === 'CLOSE'">关闭</span>
</FormItem>
</div>
<h4>优惠券列表</h4>
<Table :columns="couponColumn" :data="couponData" ref="table">
</Table>
<template v-if="couponActivity.activityScopeInfo && memberData.length>0">
<Table :columns="couponColumn" :data="couponData" ref="table"> </Table>
<template v-if="couponActivity.activityScopeInfo && memberData.length > 0">
<h4 class="mt_10">会员列表列表</h4>
<Table :columns="memberColumn" :data="memberData"></Table>
</template>
@@ -44,28 +48,26 @@
</template>
<script>
import {getCouponActivity} from "@/api/promotion";
import { getCouponActivity } from "@/api/promotion";
export default {
name: "couponActivityInfo",
name: "coupon-activity-info",
data() {
return {
id: this.$route.query.id,//id
couponActivity: {
},//
id: this.$route.query.id, //id
couponActivity: {}, //
couponColumn: [
{
title: "优惠券名称",
key: 'couponName'
key: "couponName",
},
{
title: "优惠券金额",
key: 'price',
key: "price",
render: (h, params) => {
let text = "未知";
if (params.row.couponType === "DISCOUNT") {
text = params.row.price + "折";
text = params.row.couponDiscount + "折";
} else if (params.row.couponType === "PRICE") {
text = "¥" + params.row.price;
}
@@ -74,7 +76,7 @@ export default {
},
{
title: "优惠券类型",
key: 'couponType',
key: "couponType",
render: (h, params) => {
let text = "未知";
if (params.row.couponType == "DISCOUNT") {
@@ -88,7 +90,7 @@ export default {
{
title: "赠送数量",
key: "num",
}
},
],
couponData: [],
memberColumn: [
@@ -173,4 +175,3 @@ div.base-info-item {
z-index: 9999;
}
</style>

View File

@@ -6,81 +6,143 @@
<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="活动时间">
<DatePicker type="datetimerange" :options="options" v-model="rangeTime" format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择活动时间" style="width: 260px">
<DatePicker
type="datetimerange"
:options="options"
v-model="rangeTime"
format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择活动时间"
style="width: 260px"
>
</DatePicker>
</FormItem>
<FormItem label="优惠券活动类型" prop="couponActivityType">
<RadioGroup type="button" button-style="solid" v-model="form.couponActivityType">
<RadioGroup
type="button"
button-style="solid"
v-model="form.couponActivityType"
>
<Radio label="REGISTERED">新人发券</Radio>
<Radio label="SPECIFY">精确发券</Radio>
</RadioGroup>
</FormItem>
<FormItem label="活动范围" prop="activityScope" v-if="form.couponActivityType==='SPECIFY'">
<FormItem
label="活动范围"
prop="activityScope"
v-if="form.couponActivityType === 'SPECIFY'"
>
<RadioGroup type="button" button-style="solid" v-model="form.activityScope">
<Radio label="ALL">全部会员</Radio>
<Radio label="DESIGNATED">指定会员</Radio>
</RadioGroup>
</FormItem>
<FormItem label="选择会员" prop="scopeType"
v-if="form.couponActivityType==='SPECIFY' && form.activityScope==='DESIGNATED'">
<Button type="primary" icon="ios-add" @click="addVip" ghost>选择会员</Button>
<div style="margin-top:24px;" v-if="form.activityScope == 'DESIGNATED'">
<Table border :columns="userColumns" :data="this.selectedMember">
</Table>
<FormItem
label="选择会员"
prop="scopeType"
v-if="
form.couponActivityType === 'SPECIFY' &&
form.activityScope === 'DESIGNATED'
"
>
<Button type="primary" icon="ios-add" @click="addVip" ghost
>选择会员</Button
>
<div style="margin-top: 24px" v-if="form.activityScope == 'DESIGNATED'">
<Table border :columns="userColumns" :data="this.selectedMember"> </Table>
</div>
</FormItem>
</div>
<h4>配置优惠券</h4>
<div class="form-item-view">
<FormItem label="选择优惠券" prop="scopeType">
<Button type="primary" :loading="submitLoading" @click="showSelector">选择优惠券</Button>
<Button type="primary" :loading="submitLoading" @click="showSelector"
>选择优惠券</Button
>
</FormItem>
<FormItem label="赠送配置" prop="scopeType">
<Table border :columns="columns" :data="this.selectCouponList">
<template slot="sendNum" slot-scope="scope">
<Input type="text" v-model="form.couponActivityItems[scope.index].num" placeholder="赠送数量"/>
<Input type="text" v-model="form.couponActivityItems[scope.index].couponId" v-show="false"/>
<Input
type="text"
v-model="form.couponActivityItems[scope.index].num"
placeholder="赠送数量"
/>
<Input
type="text"
v-model="form.couponActivityItems[scope.index].couponId"
v-show="false"
/>
</template>
</Table>
</FormItem>
<div>
<Button type="text" @click="closeCurrentPage">返回</Button>
<Button type="primary" :loading="submitLoading" @click="handleSubmit">提交</Button>
<Button type="primary" :loading="submitLoading" @click="handleSubmit"
>提交</Button
>
</div>
</div>
</div>
</Form>
</Card>
<Modal @on-ok="()=>{this.showCouponSelect = false}" @on-cancel="()=>{this.showCouponSelect = false}"
v-model="showCouponSelect" width="80%">
<couponTemplate :checked="true" :selectedList="selectCouponList" getType="ACTIVITY" @selected="selectedCoupon"/>
<Modal
@on-ok="
() => {
this.showCouponSelect = false;
}
"
@on-cancel="
() => {
this.showCouponSelect = false;
}
"
v-model="showCouponSelect"
width="80%"
>
<couponTemplate
:checked="true"
:selectedList="selectCouponList"
getType="ACTIVITY"
promotionStatus="START"
@selected="selectedCoupon"
/>
</Modal>
<Modal width="1200" v-model="checkUserList">
<userList v-if="checkUserList" @callback="callbackSelectUser" :selectedList="selectedMember" ref="memberLayout"/>
<userList
v-if="checkUserList"
@callback="callbackSelectUser"
:selectedList="selectedMember"
ref="memberLayout"
/>
</Modal>
</div>
</template>
<script>
import couponTemplate from "@/views/promotion/coupon/coupon";
import couponTemplate from "@/views/promotions/coupon/coupon";
import userList from "@/views/member/list/index";
import {saveActivityCoupon} from "@/api/promotion";
import { saveActivityCoupon } from "@/api/promotion";
import { promotionsScopeTypeRender } from "@/utils/promotions";
export default {
name: "addCouponActivity",
name: "add-coupon-activity",
components: {
couponTemplate,
userList
userList,
},
data () {
data() {
return {
options: {
disabledDate(date) {
@@ -98,14 +160,14 @@ export default {
startTime: "", //
endTime: "", //
memberDTOS: [], //
couponActivityItems: [],//
couponActivityItems: [], //
},
submitLoading: false, //
selectCouponList: [], //
formRule: {
promotionName: [{required: true, message: "活动名称不能为空"}],
rangeTime: [{required: true, message: "请选择活动有效期"}],
description: [{required: true, message: "请输入范围描述"}],
promotionName: [{ required: true, message: "活动名称不能为空" }],
rangeTime: [{ required: true, message: "请选择活动有效期" }],
description: [{ required: true, message: "请输入范围描述" }],
},
//
userColumns: [
@@ -160,19 +222,9 @@ export default {
{
title: "品类描述",
key: "scopeType",
width: 100,
width: 120,
render: (h, params) => {
let text = "未知";
if (params.row.scopeType == "ALL") {
text = "全品类";
} else if (params.row.scopeType == "PORTION_GOODS_CATEGORY") {
text = "商品分类";
} else if (params.row.scopeType == "PORTION_SHOP_CATEGORY") {
text = "店铺分类";
} else if (params.row.scopeType == "PORTION_GOODS") {
text = "指定商品";
}
return h("div", [text]);
return promotionsScopeTypeRender(h, params);
},
},
{
@@ -181,10 +233,7 @@ export default {
minWidth: 120,
render: (h, params) => {
if (params.row.price) {
return h(
"div",
this.$options.filters.unitPrice(params.row.price, "¥")
);
return h("div", this.$options.filters.unitPrice(params.row.price, "¥"));
} else {
return h("div", params.row.couponDiscount + "折");
}
@@ -255,8 +304,8 @@ export default {
this.form.memberDTOS = this.selectedMember.map((item) => {
return {
nickName: item.nickName,
id: item.id
}
id: item.id,
};
});
},
/**
@@ -276,7 +325,7 @@ export default {
return {
num: 0,
couponId: item.id,
}
};
});
},
//
@@ -292,12 +341,8 @@ export default {
},
/** 保存平台优惠券 */
handleSubmit() {
this.form.startTime = this.$options.filters.unixToDate(
this.rangeTime[0] / 1000
);
this.form.endTime = this.$options.filters.unixToDate(
this.rangeTime[1] / 1000
);
this.form.startTime = this.$options.filters.unixToDate(this.rangeTime[0] / 1000);
this.form.endTime = this.$options.filters.unixToDate(this.rangeTime[1] / 1000);
this.$refs.form.validate((valid) => {
if (valid) {
@@ -318,9 +363,7 @@ export default {
//
closeCurrentPage() {
this.$store.commit("removeTag", "add-platform-coupon");
localStorage.pageOpenedList = JSON.stringify(
this.$store.state.app.pageOpenedList
);
localStorage.pageOpenedList = JSON.stringify(this.$store.state.app.pageOpenedList);
this.$router.go(-1);
},
},
@@ -355,4 +398,3 @@ h4 {
}
}
</style>

View File

@@ -4,33 +4,55 @@
<Row class="operation padding-row">
<Button @click="add" type="primary">添加活动</Button>
</Row>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom">
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
sortable="custom"
>
<template slot-scope="{ row }" slot="action">
<Button type="info" size="small" style="margin-right: 10px" @click="info(row)">
查看
</Button>
<Button v-if="!checked && row.promotionStatus === 'START' || row.promotionStatus === 'NEW'" type="error"
size="small" style="margin-right: 10px" @click="remove(row)">停止
<Button
v-if="
(!checked && row.promotionStatus === 'START') ||
row.promotionStatus === 'NEW'
"
type="error"
size="small"
style="margin-right: 10px"
@click="remove(row)"
>关闭
</Button>
</template>
</Table>
<Row type="flex" justify="end" class="mt_10">
<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 {
getCouponActivityList,
closeActivity,
} from "@/api/promotion";
import { getCouponActivityList, closeActivity } from "@/api/promotion";
import { promotionsStatusRender } from "@/utils/promotions";
export default {
name: "couponActivity",
name: "coupon-activity",
components: {},
data() {
return {
@@ -51,9 +73,7 @@ export default {
},
//
formValidate: {
promotionName: [
{required: true, message: "不能为空", trigger: "blur"},
],
promotionName: [{ required: true, message: "不能为空", trigger: "blur" }],
},
submitLoading: false, //
selectList: [], //
@@ -70,7 +90,7 @@ export default {
key: "couponActivityType",
minWidth: 120,
render: (h, params) => {
if (params.row.couponActivityType === 'REGISTERED') {
if (params.row.couponActivityType === "REGISTERED") {
return h("div", ["注册赠券"]);
} else {
return h("div", ["精确发券"]);
@@ -95,11 +115,13 @@ export default {
title: "活动时间",
minWidth: 150,
render: (h, params) => {
return h("div", {
domProps: {
innerHTML: params.row.startTime + "<br/>" + params.row.endTime,
},
});
if (params.row.startTime && params.row.endTime) {
return h("div", {
domProps: {
innerHTML: params.row.startTime + "<br/>" + params.row.endTime,
},
});
}
},
},
{
@@ -108,32 +130,7 @@ export default {
key: "promotionStatus",
fixed: "right",
render: (h, params) => {
let text = "未知",
color = "red";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "default";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "green";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "red";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "red";
}
return h("div", [
h(
"Tag",
{
props: {
color: color,
},
},
text
),
]);
return promotionsStatusRender(h, params);
},
},
{
@@ -162,11 +159,11 @@ export default {
},
//
add() {
this.$router.push({name: "add-coupon-activity"});
this.$router.push({ name: "add-coupon-activity" });
},
//
info(v) {
this.$router.push({name: "coupon-activity-info", query: {id: v.id}});
this.$router.push({ name: "coupon-activity-info", query: { id: v.id } });
},
//
changePage(v) {
@@ -206,24 +203,25 @@ export default {
},
//
edit(v) {
this.$router.push({name: "edit-platform-coupon", query: {id: v.id}});
this.$router.push({ name: "edit-platform-coupon", query: { id: v.id } });
},
//
remove(v) {
this.$Modal.confirm({
title: "确认停止",
//
content: "确认要停止此优惠券活动么?停止活动只能重新创建",
title: "确认关闭",
content: "确认要关闭此优惠券活动么?关闭活动只能重新创建",
loading: true,
onOk: () => {
//
closeActivity(v.id).then((res) => {
if (res.success) {
this.$Message.success("优惠券活动已停止");
this.getDataList();
this.$Modal.remove()
}
}).catch(() => {});
closeActivity(v.id)
.then((res) => {
if (res.success) {
this.$Message.success("优惠券活动已关闭");
this.getDataList();
this.$Modal.remove();
}
})
.catch(() => {});
},
});
},

View File

@@ -6,10 +6,24 @@
<h4>基本信息</h4>
<div class="form-item-view">
<FormItem label="活动名称" prop="promotionName">
<Input :disabled="disabled" type="text" v-model="form.promotionName" placeholder="活动名称" clearable style="width: 260px"/>
<Input
:disabled="disabled"
type="text"
v-model="form.promotionName"
placeholder="活动名称"
clearable
style="width: 260px"
/>
</FormItem>
<FormItem label="优惠券名称" prop="couponName">
<Input :disabled="disabled" type="text" v-model="form.couponName" placeholder="优惠券名称" clearable style="width: 260px"/>
<Input
:disabled="disabled"
type="text"
v-model="form.couponName"
placeholder="优惠券名称"
clearable
style="width: 260px"
/>
</FormItem>
<FormItem label="优惠券类型" prop="couponType">
<Select :disabled="disabled" v-model="form.couponType" style="width: 260px">
@@ -17,12 +31,30 @@
<Option value="PRICE">减免现金</Option>
</Select>
</FormItem>
<FormItem label="折扣" prop="couponDiscount" v-if="form.couponType == 'DISCOUNT'">
<Input :disabled="disabled" type="number" v-model="form.couponDiscount" placeholder="折扣" clearable style="width: 260px"/>
<FormItem
label="折扣"
prop="couponDiscount"
v-if="form.couponType == 'DISCOUNT'"
>
<Input
:disabled="disabled"
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 :disabled="disabled" type="text" v-model="form.price" placeholder="面额" clearable style="width: 260px"/>
<Input
:disabled="disabled"
type="text"
v-model="form.price"
placeholder="面额"
clearable
style="width: 260px"
/>
</FormItem>
<FormItem label="活动类型" prop="getType">
<Select :disabled="disabled" v-model="form.getType" style="width: 260px">
@@ -32,48 +64,91 @@
</FormItem>
<FormItem label="店铺承担比例" prop="storeCommission">
<Input :disabled="disabled" v-model="form.storeCommission" placeholder="店铺承担比例" style="width: 260px">
<Input
:disabled="disabled"
v-model="form.storeCommission"
placeholder="店铺承担比例"
style="width: 260px"
>
<span slot="append">%</span>
</Input>
<span class="describe">店铺承担比例输入0-100之间数值</span>
</FormItem>
<FormItem label="发放数量" prop="publishNum" v-if="form.getType==='FREE'">
<Input :disabled="disabled" v-model="form.publishNum" placeholder="发放数量" style="width: 260px"/>
<FormItem label="发放数量" prop="publishNum" v-if="form.getType === 'FREE'">
<Input
:disabled="disabled"
v-model="form.publishNum"
placeholder="发放数量"
style="width: 260px"
/>
<div class="tips">如果发放数量为0时,则代表不限制发放数量</div>
</FormItem>
<FormItem label="领取数量限制" prop="couponLimitNum" v-if="form.getType==='FREE'">
<Input :disabled="disabled" v-model="form.couponLimitNum" placeholder="领取限制" clearable style="width: 260px"/>
<FormItem
label="领取数量限制"
prop="couponLimitNum"
v-if="form.getType === 'FREE'"
>
<Input
:disabled="disabled"
v-model="form.couponLimitNum"
placeholder="领取限制"
clearable
style="width: 260px"
/>
<div class="tips">如果领取数量为0时,则代表不限制领取数量</div>
</FormItem>
<FormItem label="范围描述" prop="description">
<Input :disabled="disabled" v-model="form.description" type="textarea" :rows="4" maxlength="50" show-word-limit clearable
style="width: 260px"/>
<Input
:disabled="disabled"
v-model="form.description"
type="textarea"
:rows="4"
maxlength="50"
show-word-limit
clearable
style="width: 260px"
/>
</FormItem>
</div>
<h4>使用限制</h4>
<div class="form-item-view">
<FormItem label="消费门槛" prop="consumeThreshold">
<Input :disabled="disabled" type="text" v-model="form.consumeThreshold" placeholder="消费门槛" clearable style="width: 260px"/>
<Input
:disabled="disabled"
type="text"
v-model="form.consumeThreshold"
placeholder="消费门槛"
clearable
style="width: 260px"
/>
</FormItem>
<FormItem label="有效期" prop="rangeTime">
<div v-if="form.getType == 'ACTIVITY'">
<RadioGroup v-model="rangeTimeType">
<Radio :disabled="disabled" :label="1">
起止时间
</Radio>
<Radio :disabled="disabled" :label="1">起止时间</Radio>
<Radio :disabled="disabled" :label="0">固定时间</Radio>
</RadioGroup>
</div>
<div v-if="rangeTimeType == 1">
<DatePicker :disabled="disabled" type="datetimerange" v-model="form.rangeTime" format="yyyy-MM-dd HH:mm:ss" placeholder="请选择"
:options="options" style="width: 260px">
<DatePicker
:disabled="disabled"
type="datetimerange"
v-model="form.rangeTime"
format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择"
:options="options"
style="width: 260px"
>
</DatePicker>
</div>
<div class="effectiveDays" v-if="rangeTimeType == 0">
领取当天开始
<InputNumber v-model="form.effectiveDays" :min="1" style="width:100px;" :max="365"/>
<InputNumber
v-model="form.effectiveDays"
:min="1"
style="width: 100px"
:max="365"
/>
天内有效(1-365间的整数)
</div>
</FormItem>
@@ -82,31 +157,62 @@
<RadioGroup type="button" button-style="solid" v-model="form.scopeType">
<Radio :disabled="disabled" label="ALL">全品类</Radio>
<Radio :disabled="disabled" label="PORTION_GOODS">指定商品</Radio>
<Radio :disabled="disabled" label="PORTION_GOODS_CATEGORY">部分商品分类</Radio>
<Radio :disabled="disabled" label="PORTION_GOODS_CATEGORY"
>部分商品分类</Radio
>
</RadioGroup>
</FormItem>
<FormItem style="width: 100%" v-if="form.scopeType == 'PORTION_GOODS'">
<div style="display: flex; margin-bottom: 10px">
<Button :disabled="disabled" type="primary" @click="openSkuList">选择商品</Button>
<Button :disabled="disabled" type="error" ghost style="margin-left: 10px" @click="delSelectGoods">批量删除</Button>
<Button :disabled="disabled" type="primary" @click="openSkuList"
>选择商品</Button
>
<Button
:disabled="disabled"
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>
<FormItem v-if="form.scopeType == 'PORTION_GOODS_CATEGORY'">
<Cascader :disabled="disabled" :data="goodsCategoryList" style="width:260px;"
v-model="form.scopeIdGoods"></Cascader>
<Cascader
:disabled="disabled"
:data="goodsCategoryList"
style="width: 260px"
v-model="form.scopeIdGoods"
></Cascader>
</FormItem>
<div>
<Button :disabled="disabled" type="text" @click="closeCurrentPage">返回</Button>
<Button :disabled="disabled" type="primary" :loading="submitLoading" @click="handleSubmit">提交</Button>
<Button :disabled="disabled" type="text" @click="closeCurrentPage"
>返回</Button
>
<Button
:disabled="disabled"
type="primary"
:loading="submitLoading"
@click="handleSubmit"
>提交</Button
>
</div>
</div>
</div>
@@ -122,8 +228,8 @@ import {
getPlatformCoupon,
editPlatformCoupon,
} from "@/api/promotion";
import {getCategoryTree} from "@/api/goods";
import {regular} from "@/utils";
import { getCategoryTree } from "@/api/goods";
import { regular } from "@/utils";
import skuSelect from "@/views/lili-dialog";
export default {
@@ -140,14 +246,15 @@ export default {
},
deep: true,
},
$route(e) { //
$route(e) {
//
this.id = e.query.id;
if (this.id) {
this.getCoupon()
this.getCoupon();
} else {
this.$refs.form.resetFields()
this.$refs.form.resetFields();
}
}
},
},
data() {
const checkPrice = (rule, value, callback) => {
@@ -200,37 +307,34 @@ export default {
selectedGoods: [], // 便
goodsCategoryList: [], //
formRule: {
promotionName: [{required: true, message: "活动名称不能为空"}],
couponName: [{required: true, message: "优惠券名称不能为空"}],
price: [
{required: true, message: "请输入面额"},
{validator: checkPrice},
],
rangeTime: [{required: true, message: "请选择优惠券有效期"}],
promotionName: [{ required: true, message: "活动名称不能为空" }],
couponName: [{ required: true, message: "优惠券名称不能为空" }],
price: [{ required: true, message: "请输入面额" }, { validator: checkPrice }],
rangeTime: [{ required: true, message: "请选择优惠券有效期" }],
consumeThreshold: [
{required: true, message: "请输入消费门槛"},
{validator: checkWeight},
{ required: true, message: "请输入消费门槛" },
{ validator: checkWeight },
],
couponDiscount: [
{required: true, message: "请输入折扣"},
{ required: true, message: "请输入折扣" },
{
pattern: regular.discount,
message: "请输入0-10的数字,可有一位小数",
},
],
storeCommission: [
{required: true, message: "请输入店铺承担比例"},
{pattern: regular.rate, message: "请输入0-100的正整数"},
{ required: true, message: "请输入店铺承担比例" },
{ pattern: regular.rate, message: "请输入0-100的正整数" },
],
publishNum: [
{required: true, message: "请输入发放数量"},
{pattern: regular.Integer, message: "请输入正整数"},
{ required: true, message: "请输入发放数量" },
{ pattern: regular.Integer, message: "请输入正整数" },
],
couponLimitNum: [
{required: true, message: "领取限制不能为空"},
{pattern: regular.Integer, message: "请输入正整数"},
{ required: true, message: "领取限制不能为空" },
{ pattern: regular.Integer, message: "请输入正整数" },
],
description: [{required: true, message: "请输入范围描述"}],
description: [{ required: true, message: "请输入范围描述" }],
},
columns: [
{
@@ -248,10 +352,7 @@ export default {
key: "price",
minWidth: 40,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.price, "¥")
);
return h("div", this.$options.filters.unitPrice(params.row.price, "¥"));
},
},
{
@@ -292,7 +393,7 @@ export default {
},
};
},
async mounted () {
async mounted() {
await this.getCagetoryList();
// id
if (this.id) {
@@ -306,12 +407,12 @@ export default {
getPlatformCoupon(this.id).then((res) => {
let data = res.result;
if (!data.promotionGoodsList) data.promotionGoodsList = [];
this.rangeTimeType = data.rangeDayType === "DYNAMICTIME" ? 0 : 1;
if (data.scopeType == "PORTION_GOODS_CATEGORY") {
let prevCascader = data.scopeId.split(",");
function next(params, prev) {
for (let i = 0; i < params.length; i++) {
const item = params[i];
if (item.children) {
next(item.children, [...prev, item]);
} else {
@@ -336,7 +437,9 @@ export default {
data.scopeIdGoods = prevCascader;
}
data.rangeTime = [];
data.rangeTime.push(new Date(data.startTime), new Date(data.endTime));
if (data.startTime && data.endTime) {
data.rangeTime.push(new Date(data.startTime), new Date(data.endTime));
}
this.form = data;
});
},
@@ -367,10 +470,9 @@ export default {
if (
params.scopeType == "PORTION_GOODS" &&
(!params.promotionGoodsList ||
params.promotionGoodsList.length == 0)
(!params.promotionGoodsList || params.promotionGoodsList.length == 0)
) {
this.$Modal.warning({title: "提示", content: "请选择指定商品"});
this.$Modal.warning({ title: "提示", content: "请选择指定商品" });
return;
}
@@ -378,7 +480,7 @@ export default {
params.scopeType == "PORTION_GOODS_CATEGORY" &&
(!params.scopeIdGoods || params.scopeIdGoods.length == 0)
) {
this.$Modal.warning({title: "提示", content: "请选择商品分类"});
this.$Modal.warning({ title: "提示", content: "请选择商品分类" });
return;
}
@@ -429,9 +531,7 @@ export default {
//
closeCurrentPage() {
this.$store.commit("removeTag", "add-platform-coupon");
localStorage.pageOpenedList = JSON.stringify(
this.$store.state.app.pageOpenedList
);
localStorage.pageOpenedList = JSON.stringify(this.$store.state.app.pageOpenedList);
this.$router.go(-1);
},
openSkuList() {
@@ -461,11 +561,9 @@ export default {
this.selectedGoods.forEach(function (e) {
ids.push(e.id);
});
this.form.promotionGoodsList = this.form.promotionGoodsList.filter(
(item) => {
return !ids.includes(item.id);
}
);
this.form.promotionGoodsList = this.form.promotionGoodsList.filter((item) => {
return !ids.includes(item.id);
});
},
});
},
@@ -485,6 +583,11 @@ export default {
storeId: e.storeId,
storeName: e.storeName,
skuId: e.id,
categoryPath: e.categoryPath,
thumbnail: e.small,
goodsType: e.goodsType,
goodsId: e.goodsId,
originPrice: e.price,
});
});
this.form.promotionGoodsList = list;
@@ -517,7 +620,7 @@ export default {
}
});
}
return {value: item.id, label: item.name, children: item.children};
return { value: item.id, label: item.name, children: item.children };
});
},
filterCategoryId(list, idArr) {
@@ -567,4 +670,3 @@ h4 {
color: #999;
}
</style>

View File

@@ -1,12 +1,29 @@
<template>
<div class="search">
<Card>
<Form ref="searchForm" :model="searchForm" inline :label-width="70" class="search-form mb_10">
<Form
ref="searchForm"
:model="searchForm"
inline
:label-width="70"
class="search-form mb_10"
>
<Form-item label="活动名称" prop="couponName">
<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>
@@ -14,28 +31,74 @@
</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" icon="ios-search" class="search-btn">搜索</Button>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn"
>搜索</Button
>
</Form>
<Row class="operation padding-row" v-if="getType !== 'ACTIVITY'">
<Button @click="add" type="primary">添加优惠券</Button>
<Button @click="delAll">批量下架</Button>
<Button @click="delAll">批量关闭</Button>
</Row>
<Table v-if="refreshTable" :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10" @on-selection-change="changeSelect">
<Table
v-if="refreshTable"
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
class="mt_10"
@on-selection-change="changeSelect"
>
<template slot-scope="{ row }" slot="action">
<Button v-if="row.promotionStatus === 'NEW' || row.promotionStatus === 'CLOSE'" type="info" size="small" @click="see(row)">编辑
<Button
v-if="row.promotionStatus !== 'START'"
type="info"
size="small"
@click="see(row)"
>编辑
</Button>
<Button v-else type="default" size="small" @click="see(row,'onlyView')">查看
<Button v-else type="default" size="small" @click="see(row, 'onlyView')"
>查看
</Button>
<Button class="ml_5" v-if="row.promotionStatus === 'START' || row.promotionStatus === 'NEW'" type="error" size="small" @click="remove(row)">下架
<Button
class="ml_5"
v-if="row.promotionStatus === 'START' || row.promotionStatus === 'NEW'"
type="error"
size="small"
@click="close(row)"
>关闭
</Button>
<Button
class="ml_5"
v-if="row.promotionStatus === 'CLOSE'"
type="error"
size="small"
@click="remove(row)"
>删除
</Button>
</template>
</Table>
<Row type="flex" justify="end" class="mt_10">
<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>
@@ -44,7 +107,9 @@
import {
getPlatformCouponList,
updatePlatformCouponStatus,
deletePlatformCoupon,
} from "@/api/promotion";
import { promotionsStatusRender, promotionsScopeTypeRender } from "@/utils/promotions";
export default {
name: "coupon",
@@ -87,10 +152,7 @@ export default {
width: 100,
render: (h, params) => {
if (params.row.price) {
return h(
"div",
this.$options.filters.unitPrice(params.row.price, "¥")
);
return h("div", this.$options.filters.unitPrice(params.row.price, "¥"));
} else {
return h("div", params.row.couponDiscount + "折");
}
@@ -104,10 +166,11 @@ export default {
render: (h, params) => {
return h(
"div",
params.row.receivedNum + "/" + (params.row.publishNum === 0 ? '不限制' : params.row.publishNum)
params.row.receivedNum +
"/" +
(params.row.publishNum === 0 ? "不限制" : params.row.publishNum)
);
},
},
{
title: "优惠券类型",
@@ -116,43 +179,35 @@ export default {
render: (h, params) => {
let text = "";
if (params.row.couponType === "DISCOUNT") {
return h("Tag", {props: {color: "blue",},}, "打折");
return h("Tag", { props: { color: "blue" } }, "打折");
} else if (params.row.couponType === "PRICE") {
return h("Tag", {props: {color: "geekblue",},}, "减免现金");
}else {
return h("Tag", {props: {color: "purple",},}, "未知");
return h("Tag", { props: { color: "geekblue" } }, "减免现金");
} else {
return h("Tag", { props: { color: "purple" } }, "未知");
}
},
},
{
title: "品类描述",
key: "scopeType",
width: 100,
width: 120,
render: (h, params) => {
let text = "未知";
if (params.row.scopeType == "ALL") {
text = "全品类";
} else if (params.row.scopeType == "PORTION_GOODS_CATEGORY") {
text = "商品分类";
} else if (params.row.scopeType == "PORTION_SHOP_CATEGORY") {
text = "店铺分类";
} else if (params.row.scopeType == "PORTION_GOODS") {
text = "指定商品";
}
return h("div", [text]);
return promotionsScopeTypeRender(h, params);
},
},
{
title: "活动时间",
width: 150,
render: (h, params) => {
if (params.row.getType === "ACTIVITY" && params.row.rangeDayType == 'DYNAMICTIME') {
if (
params?.row?.getType === "ACTIVITY" &&
params?.row?.rangeDayType === "DYNAMICTIME"
) {
return h("div", "长期有效");
} else {
} else if (params?.row?.startTime && params?.row?.endTime) {
return h("div", {
domProps: {
innerHTML:
params.row.startTime + "<br/>" + params.row.endTime,
innerHTML: params.row.startTime + "<br/>" + params.row.endTime,
},
});
}
@@ -164,32 +219,7 @@ export default {
key: "promotionStatus",
fixed: "right",
render: (h, params) => {
let text = "未知",
color = "red";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "geekblue";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "green";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "red";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "red";
}
return h("div", [
h(
"Tag",
{
props: {
color: color,
},
},
text
),
]);
return promotionsStatusRender(h, params);
},
minWidth: 70,
},
@@ -204,7 +234,7 @@ export default {
data: [], //
total: 0, //
refreshTable: true, //
selectDate:[], //
selectDate: [], //
};
},
props: {
@@ -213,17 +243,21 @@ export default {
type: String,
default: "",
},
promotionStatus: {
type: String,
default: "",
},
//
selectedList: {
type: Array,
default: ()=>{
return []
default: () => {
return [];
},
},
},
watch: {
$route(to, from) {
if (to.fullPath == "/promotion/manager-coupon") {
if (to.fullPath == "/promotions/manager-coupon") {
this.init();
}
},
@@ -249,42 +283,49 @@ export default {
});
}
this.refreshTable = false;
this.$nextTick(() =>{
this.$nextTick(() => {
this.refreshTable = true;
})
});
},
deep: true,
},
},
methods: {
check() { //
check() {
//
this.$emit("selected", this.selectList);
},
//
init() {
this.getDataList();
},
add() { //
add() {
//
this.$router.push({ name: "add-platform-coupon" });
},
info(v) { //
info(v) {
//
this.$router.push({ name: "platform-coupon-info", query: { id: v.id } });
},
changePage(v) { //
changePage(v) {
//
this.searchForm.pageNumber = v;
this.getDataList();
},
changePageSize(v) { //
changePageSize(v) {
//
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = v;
this.getDataList();
},
handleSearch() { //
handleSearch() {
//
this.searchForm.pageNumber = 1;
this.searchForm.pageSize = 10;
this.getDataList();
},
clearSelectAll() { //
clearSelectAll() {
//
this.$refs.table.selectAll(false);
},
/**
@@ -293,9 +334,10 @@ export default {
changeSelect(e) {
this.selectList = e;
this.selectCount = e.length;
if (this.getType === 'ACTIVITY') this.check()
if (this.getType === "ACTIVITY") this.check();
},
getDataList() { //
getDataList() {
//
this.loading = true;
if (this.selectDate && this.selectDate[0] && this.selectDate[1]) {
this.searchForm.startTime = this.selectDate[0].getTime();
@@ -315,27 +357,29 @@ export default {
this.loading = false;
},
see(v,only) { //
let data
only ? data = { onlyView : true,id: v.id } : data = { id: v.id }
this.$router.push({ name: "edit-platform-coupon", query:data });
see(v, only) {
//
let data;
only ? (data = { onlyView: true, id: v.id }) : (data = { id: v.id });
this.$router.push({ name: "edit-platform-coupon", query: data });
},
remove(v) { //
close(v) {
//
this.$Modal.confirm({
title: "确认下架",
title: "确认关闭",
//
content: "确认要下架此优惠券么?",
content: "确认要关闭此优惠券么?",
loading: true,
onOk: () => {
//
updatePlatformCouponStatus({
couponIds: v.id,
promotionStatus: "CLOSE",
effectiveDays: 0,
})
.then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("优惠券已作废");
this.$Message.success("优惠券已关闭");
this.getDataList();
}
})
@@ -345,7 +389,31 @@ export default {
},
});
},
delAll() { //
remove(v) {
//
this.$Modal.confirm({
title: "确认删除",
//
content: "确认要删除此优惠券么?",
loading: true,
onOk: () => {
//
deletePlatformCoupon(v.id)
.then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("优惠券已删除");
this.getDataList();
}
})
.catch(() => {
this.$Modal;
});
},
});
},
delAll() {
//
if (this.selectCount <= 0) {
this.$Message.warning("您还未选择要下架的优惠券");
return;
@@ -380,7 +448,11 @@ export default {
//
if (this.getType) {
this.searchForm.getType = this.getType;
this.columns.pop()
this.columns.pop();
}
if (this.promotionStatus) {
this.searchForm.promotionStatus = this.promotionStatus;
this.columns.pop();
}
this.init();
},

View File

@@ -88,10 +88,8 @@
<span class="describe">优惠折扣为0-10之间数字可有一位小数</span>
</FormItem>
<FormItem label="额外赠送">
<Checkbox v-model="form.isFreeFreight" disabled>免邮费</Checkbox
>&nbsp;
<Checkbox v-model="form.isCoupon" disabled>送优惠券</Checkbox
>&nbsp;
<Checkbox v-model="form.isFreeFreight" disabled>免邮费</Checkbox>&nbsp;
<Checkbox v-model="form.isCoupon" disabled>送优惠券</Checkbox>&nbsp;
<Checkbox v-model="form.isGift" disabled>送赠品</Checkbox>&nbsp;
<Checkbox v-model="form.isPoint" disabled>送积分</Checkbox>
</FormItem>
@@ -105,12 +103,9 @@
:loading="couponLoading"
style="width: 260px"
>
<Option
v-for="item in couponList"
:value="item.id"
:key="item.id"
>{{ item.couponName }}</Option
>
<Option v-for="item in couponList" :value="item.id" :key="item.id">{{
item.couponName
}}</Option>
</Select>
</FormItem>
<FormItem v-if="form.isGift" label="赠品" prop="giftId">
@@ -123,21 +118,13 @@
:loading="giftLoading"
style="width: 260px"
>
<Option
v-for="item in giftList"
:value="item.id"
:key="item.id"
>{{ item.goodsName }}</Option
>
<Option v-for="item in giftList" :value="item.id" :key="item.id">{{
item.goodsName
}}</Option>
</Select>
</FormItem>
<FormItem v-if="form.isPoint" label="赠积分" prop="point">
<Input
v-model="form.point"
type="number"
disabled
style="width: 260px"
/>
<Input v-model="form.point" type="number" disabled style="width: 260px" />
</FormItem>
<FormItem label="使用范围" prop="scopeType">
<RadioGroup type="button" button-style="solid" v-model="form.scopeType">
@@ -146,23 +133,31 @@
</RadioGroup>
</FormItem>
<FormItem
style="width: 100%"
v-if="form.scopeType == 'PORTION_GOODS'"
>
<Table
border
:columns="columns"
:data="form.promotionGoodsList"
>
<FormItem style="width: 100%" v-if="form.scopeType == 'PORTION_GOODS'">
<Table border :columns="columns" :data="form.promotionGoodsList">
<template slot-scope="{ row }" slot="goodsName">
<div>
<a class="mr_10" @click="linkTo(row.goodsId,row.skuId)">{{row.goodsName}}</a>
<a class="mr_10" @click="linkTo(row.goodsId, row.skuId)">{{
row.goodsName
}}</a>
<Poptip trigger="hover" title="扫码在手机中查看" transfer>
<div slot="content">
<vue-qr :text="wapLinkTo(row.goodsId,row.skuId)" :margin="0" colorDark="#000" colorLight="#fff" :size="150"></vue-qr>
<vue-qr
:text="wapLinkTo(row.goodsId, row.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="">
<img
src="../../../assets/qrcode.svg"
style="vertical-align: middle"
class="hover-pointer"
width="20"
height="20"
alt=""
/>
</Poptip>
</div>
</template>
@@ -182,15 +177,16 @@
<script>
import { getPlatformCouponList, getFullDiscountById } from "@/api/promotion";
import { getGoodsSkuData } from "@/api/goods";
import vueQr from 'vue-qr'
import vueQr from "vue-qr";
export default {
name: "addFullCut",
name: "add-full-discount",
components: {
"vue-qr":vueQr
"vue-qr": vueQr,
},
data() {
return {
form: { //
form: {
//
discountType: "isFullMinus",
scopeType: "ALL",
promotionGoodsList: [],
@@ -215,17 +211,14 @@ export default {
key: "price",
minWidth: 40,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.price, "¥")
);
return h("div", this.$options.filters.unitPrice(params.row.price, "¥"));
},
},
{
title: "库存",
key: "quantity",
minWidth: 40,
}
},
],
options: {
disabledDate(date) {
@@ -246,11 +239,8 @@ export default {
//
getFullDiscountById(this.id).then((res) => {
let data = res.result;
if (!data.promotionGoodsList) {
if (!data.scopeType === "ALL") {
data.promotionGoodsList = [];
data.scopeType = "ALL";
} else {
data.scopeType = "PORTION_GOODS";
}
if (data.isFullMinus) {
data.discountType = "isFullMinus";
@@ -271,7 +261,7 @@ export default {
pageSize: 10,
pageNumber: 0,
couponName: query,
promotionStatus:"START"
promotionStatus: "START",
};
this.couponLoading = true;
getPlatformCouponList(params).then((res) => {
@@ -318,4 +308,3 @@ h4 {
color: #999;
}
</style>

View File

@@ -2,13 +2,29 @@
<div class="full-cut">
<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="活动名称" prop="promotionName">
<Input type="text" v-model="searchForm.promotionName" placeholder="请输入活动名称" clearable
style="width: 200px" />
<Input
type="text"
v-model="searchForm.promotionName"
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>
@@ -16,13 +32,33 @@
</Select>
</Form-item>
<Form-item label="活动时间">
<DatePicker v-model="selectDate" type="daterange" clearable placeholder="选择起始时间" style="width: 200px">
<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
>
</Form>
</Row>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10" sortable="custom">
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
class="mt_10"
sortable="custom"
>
<template slot-scope="{ row }" slot="applyEndTime">
{{ unixDate(row.applyEndTime) }}
</template>
@@ -30,28 +66,50 @@
{{ row.isFullMinus ? "满减" : "满折" }}
</template>
<template slot-scope="{ row }" slot="hours">
<Tag v-for="item in unixHours(row.hours)" :key="item">{{item}}</Tag>
<Tag v-for="item in unixHours(row.hours)" :key="item">{{ item }}</Tag>
</template>
<template slot-scope="{ row }" slot="action">
<div>
<Button type="info" size="small" @click="view(row)">查看</Button>
<Button type="error" v-if="row.promotionStatus === 'START'" style="margin-left:5px" size="small"
@click="openOrClose(row)">关闭</Button>
<Button type="success" v-if="row.promotionStatus === 'CLOSE' || row.promotionStatus === 'NEW'"
style="margin-left:5px" size="small" @click="openOrClose(row)">开启</Button>
<Button
type="error"
v-if="row.promotionStatus === 'START'"
style="margin-left: 5px"
size="small"
@click="openOrClose(row)"
>关闭</Button
>
<Button
type="success"
v-if="row.promotionStatus === 'CLOSE' || row.promotionStatus === 'NEW'"
style="margin-left: 5px"
size="small"
@click="openOrClose(row)"
>开启</Button
>
</div>
</template>
</Table>
<Row type="flex" justify="end" class="mt_10">
<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 { getFullDiscountList, updateFullDiscount } from "@/api/promotion.js";
import { promotionsStatusRender } from "@/utils/promotions";
export default {
data() {
@@ -98,32 +156,7 @@ export default {
key: "promotionStatus",
minWidth: 60,
render: (h, params) => {
let text = "未知",
color = "purple";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "geekblue";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "blue";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "green";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "volcano";
}
return h("div", [
h(
"Tag",
{
props: {
color: color,
},
},
text
),
]);
return promotionsStatusRender(h, params);
},
},
{
@@ -203,7 +236,7 @@ export default {
},
view(row) {
//
this.$router.push({ name: "full-cut-detail", query: { id: row.id } });
this.$router.push({ name: "full-discount-detail", query: { id: row.id } });
},
},
mounted() {

View File

@@ -13,21 +13,33 @@
</FormItem>
<FormItem astyle="width: 100%">
<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="skuId">
<div>{{ row.skuId }}</div>
</template>
<template slot-scope="{ index }" slot="settlementPrice">
<InputNumber :min="0" v-model="form.promotionGoodsList[index].settlementPrice" />
<InputNumber
:min="0"
v-model="form.promotionGoodsList[index].settlementPrice"
/>
</template>
<template slot-scope="{ index }" slot="lowestPrice">
<InputNumber :min="0" v-model="form.promotionGoodsList[index].lowestPrice" />
<InputNumber
:min="0"
v-model="form.promotionGoodsList[index].lowestPrice"
/>
</template>
<template slot-scope="{ index }" slot="highestPrice">
<InputNumber :min="0" v-model="form.promotionGoodsList[index].highestPrice" />
<InputNumber
:min="0"
v-model="form.promotionGoodsList[index].highestPrice"
/>
</template>
<template slot-scope="{ index }" slot="stock">
<InputNumber :min="0" v-model="form.promotionGoodsList[index].stock" />
@@ -35,13 +47,21 @@
</Table>
</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>
<div>
<Button type="text" @click="closeCurrentPage">返回</Button>
<Button type="primary" :loading="submitLoading" @click="handleSubmit">提交</Button>
<Button type="primary" :loading="submitLoading" @click="handleSubmit"
>提交</Button
>
</div>
</div>
</div>
@@ -57,7 +77,7 @@ import { regular } from "@/utils";
import skuSelect from "@/views/lili-dialog";
export default {
name: "addKanJiaActivityGoods",
name: "add-kanjia-activity-goods",
components: {
skuSelect,
},
@@ -92,10 +112,7 @@ export default {
key: "price",
width: 120,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.price, "¥")
);
return h("div", this.$options.filters.unitPrice(params.row.price, "¥"));
},
},
{
@@ -199,7 +216,7 @@ export default {
this.$Message.error("活动库存不能为0且不能超过商品库存");
return;
}
//
if (!regular.money.test(res.settlementPrice)) {
checkResult = false;
@@ -260,9 +277,7 @@ export default {
//
closeCurrentPage() {
this.$store.commit("removeTag", "add-kan-jia-goods");
localStorage.pageOpenedList = JSON.stringify(
this.$store.state.app.pageOpenedList
);
localStorage.pageOpenedList = JSON.stringify(this.$store.state.app.pageOpenedList);
this.$router.go(-1);
},
openSkuList() {
@@ -310,7 +325,7 @@ export default {
item.forEach((e) => {
list.push({
settlementPrice: e.settlementPrice || 0,
purchasePrice: 0,
purchasePrice: 0,
lowestPrice: e.lowestPrice || 0,
highestPrice: e.highestPrice || 0,
stock: e.stock || 0,
@@ -363,4 +378,3 @@ h4 {
color: #999;
}
</style>

View File

@@ -2,12 +2,29 @@
<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="商品名称" prop="goodsName">
<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="活动状态" 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>
@@ -15,28 +32,59 @@
</Select>
</Form-item>
<Form-item label="活动时间">
<DatePicker v-model="selectDate" type="daterange" clearable placeholder="选择起始时间" style="width: 200px">
<DatePicker
v-model="selectDate"
type="daterange"
clearable
placeholder="选择起始时间"
style="width: 200px"
>
</DatePicker>
</Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
<Button
@click="handleSearch"
type="primary"
icon="ios-search"
class="search-btn"
>搜索</Button
>
</Form>
</Row>
<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">
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
sortable="custom"
@on-sort-change="changeSort"
>
<template slot-scope="{ row }" slot="goodsName">
<div>
<a class="mr_10" @click="linkTo(row.goodsSku.goodsId,row.skuId)">{{row.goodsName}}</a>
<a class="mr_10" @click="linkTo(row.goodsId, row.skuId)">{{
row.goodsName
}}</a>
<Poptip trigger="hover" title="扫码在手机中查看" transfer>
<div slot="content">
<vue-qr :text="wapLinkTo(row.goodsSku.goodsId,row.skuId)" :margin="0" colorDark="#000" colorLight="#fff"
:size="150"></vue-qr>
<vue-qr
:text="wapLinkTo(row.goodsId, row.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="">
<img
src="../../../assets/qrcode.svg"
style="vertical-align: middle"
class="hover-pointer"
width="20"
height="20"
alt=""
/>
</Poptip>
</div>
</template>
@@ -45,24 +93,47 @@
<div>{{ row.endTime }}</div>
</template>
<template slot-scope="{ row }" slot="quantity">
<div>{{ row.goodsSku.quantity }}</div>
<div>{{ row.stock }}</div>
</template>
<template slot-scope="{ row }" slot="action">
<Button v-if="row.promotionStatus != 'NEW'" size="small" style="margin-right: 10px"
@click="edit(row,'onlyView')">查看
<Button
v-if="row.promotionStatus != 'NEW'"
size="small"
style="margin-right: 10px"
@click="edit(row, 'onlyView')"
>查看
</Button>
<Button v-if="row.promotionStatus === 'NEW'" type="info" size="small" style="margin-right: 10px"
@click="edit(row)">编辑
<Button
v-if="row.promotionStatus === 'NEW'"
type="info"
size="small"
style="margin-right: 10px"
@click="edit(row)"
>编辑
</Button>
<Button v-if="row.promotionStatus === 'NEW' || row.promotionStatus === 'END'" type="error" size="small"
style="margin-right: 10px" @click="delAll(row)">删除
<Button
v-if="row.promotionStatus === 'NEW' || row.promotionStatus === 'END'"
type="error"
size="small"
style="margin-right: 10px"
@click="delAll(row)"
>删除
</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>
@@ -70,6 +141,7 @@
<script>
import { getKanJiaGoodsList, delKanJiaGoods } from "@/api/promotion";
import { promotionsStatusRender } from "@/utils/promotions";
import vueQr from "vue-qr";
export default {
@@ -172,32 +244,7 @@ export default {
title: "状态",
key: "promotionStatus",
render: (h, params) => {
let text = "未知",
color = "red";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "geekblue";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "green";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "red";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "red";
}
return h("div", [
h(
"Tag",
{
props: {
color: color,
},
},
text
),
]);
return promotionsStatusRender(h, params);
},
width: 100,
},
@@ -217,7 +264,7 @@ export default {
props: {},
watch: {
$route(to, from) {
if (to.fullPath == "/promotion/manager-coupon") {
if (to.fullPath == "/promotions/manager-coupon") {
this.init();
}
},
@@ -284,11 +331,11 @@ export default {
this.total = this.data.length;
this.loading = false;
},
edit(v,type) {
edit(v, type) {
let data = {
id:v.id
}
type ? data.onlyView = true : ''
id: v.id,
};
type ? (data.onlyView = true) : "";
this.$router.push({
name: "edit-kanJia-activity-goods",
query: data,

View File

@@ -1,18 +1,31 @@
<template>
<div>
<Card>
<Tabs v-model="searchForm.status">
<!-- 标签栏 -->
<TabPane v-for="(item,index) in tabs" :key="index" :name="item.status" :label="item.title">
<TabPane
v-for="(item, index) in tabs"
:key="index"
:name="item.status"
:label="item.title"
>
</TabPane>
</Tabs>
<Table :columns="liveColumns" :data="liveData"></Table>
<Row type="flex" style="margin:20px;" justify="end" class="mt_10">
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePageNumber" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]"
size="small" show-total show-elevator show-sizer></Page>
<Row type="flex" style="margin: 20px" justify="end" class="mt_10">
<Page
:current="searchForm.pageNumber"
:total="total"
:page-size="searchForm.pageSize"
@on-change="changePageNumber"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-elevator
show-sizer
></Page>
</Row>
</Card>
</div>
</template>
@@ -58,10 +71,7 @@ export default {
title: "直播开始时间",
key: "createTime",
render: (h, params) => {
return h(
"span",
this.$options.filters.unixToDate(params.row.startTime)
);
return h("span", this.$options.filters.unixToDate(params.row.startTime));
},
},
{
@@ -117,12 +127,12 @@ export default {
{
title: "直播状态",
render: (h, params) => {
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"}}, "已结束")]);
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" } }, "已结束")]);
}
},
},
@@ -227,7 +237,7 @@ export default {
*/
getLiveDetail(val) {
this.$router.push({
path: "/liveDetail",
path: "/live-detail",
query: { ...val, liveStatus: this.searchForm.status },
});
},

View File

@@ -2,34 +2,45 @@
<div class="pintuan-goods">
<Card>
<h4>活动详情</h4>
<Table style="margin: 10px 0" border
:columns="columns"
:data="data"
></Table>
<Table style="margin: 10px 0" border :columns="columns" :data="data"></Table>
<h4>商品信息</h4>
<Table
:loading="loading"
border
class="operation"
:columns="goodsColumns"
:data="goodsData"
ref="table"
sortable="custom"
>
<template slot-scope="{ row }" slot="goodsName">
<div>
<a class="mr_10" @click="linkTo(row.goodsId,row.skuId)">{{row.goodsName}}</a>
<Poptip trigger="hover" title="扫码在手机中查看" transfer>
<div slot="content">
<vue-qr :text="wapLinkTo(row.goodsId,row.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>
</div>
</template>
</Table>
<Table
:loading="loading"
border
class="operation"
:columns="goodsColumns"
:data="goodsData"
ref="table"
sortable="custom"
>
<template slot-scope="{ row }" slot="goodsName">
<div>
<a class="mr_10" @click="linkTo(row.goodsId, row.skuId)">{{
row.goodsName
}}</a>
<Poptip trigger="hover" title="扫码在手机中查看" transfer>
<div slot="content">
<vue-qr
:text="wapLinkTo(row.goodsId, row.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>
</div>
</template>
</Table>
<Row type="flex" justify="end" class="page operation">
<Page
:current="searchForm.pageNumber"
@@ -49,8 +60,13 @@
</template>
<script>
import { getPintuanGoodsList, getPintuanDetail } from "@/api/promotion.js";
import vueQr from "vue-qr";
import { promotionsStatusRender } from "@/utils/promotions";
export default {
components: {
"vue-qr": vueQr,
},
data() {
return {
loading: false, //
@@ -66,17 +82,17 @@ export default {
{
title: "活动名称",
key: "promotionName",
minWidth: 120
minWidth: 120,
},
{
title: "活动开始时间",
key: "startTime",
minWidth: 120
minWidth: 120,
},
{
title: "活动结束时间",
key: "endTime",
minWidth: 120
minWidth: 120,
},
{
title: "成团人数",
@@ -91,32 +107,7 @@ export default {
key: "promotionStatus",
minWidth: 100,
render: (h, params) => {
let text = "未知",
color = "";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "default";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "green";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "blue";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "red";
}
return h("div", [
h(
"Tag",
{
props: {
color: color,
},
},
text
),
]);
return promotionsStatusRender(h, params);
},
},
],
@@ -138,15 +129,11 @@ export default {
key: "price",
minWidth: 50,
render: (h, params) => {
return h(
"div",
this.$options.filters.unitPrice(params.row.price, "¥")
);
return h("div", this.$options.filters.unitPrice(params.row.price, "¥"));
},
},
],
goodsData: [] //
goodsData: [], //
};
},
methods: {

View File

@@ -39,9 +39,7 @@
style="width: 200px"
></DatePicker>
</Form-item>
<Button @click="handleSearch" type="primary" class="search-btn"
>搜索</Button
>
<Button @click="handleSearch" type="primary" class="search-btn">搜索</Button>
</Form>
<Table
:loading="loading"
@@ -52,19 +50,13 @@
class="mt_10"
>
<template slot-scope="{ row }" slot="action">
<Button
type="info"
size="small"
@click="view(row)"
style="margin-right: 5px"
<Button type="info" size="small" @click="view(row)" style="margin-right: 5px"
>查看</Button
>
<Button
type="error"
size="small"
:disabled="
row.promotionStatus == 'END' || row.promotionStatus == 'CLOSE'
"
:disabled="row.promotionStatus == 'END' || row.promotionStatus == 'CLOSE'"
@click="close(row)"
>关闭
</Button>
@@ -89,13 +81,14 @@
</template>
<script>
import { getPintuanList, closePintuan } from "@/api/promotion";
import { getPintuanList, updatePintuanStatus } from "@/api/promotion";
import { promotionsStatusRender } from "@/utils/promotions";
export default {
name: "pintuan",
data() {
return {
selectDate:[], //
selectDate: [], //
loading: true, //
searchForm: {
//
@@ -104,7 +97,8 @@ export default {
sort: "startTime",
order: "desc", //
},
columns: [ //
columns: [
//
{
title: "活动名称",
key: "promotionName",
@@ -116,30 +110,7 @@ export default {
key: "promotionStatus",
width: 110,
render: (h, params) => {
let text = "未知",
color = "";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "geekblue";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "blue";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "green";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "volcano";
}
return h("div", [
h(
"Tag",
{
props: { color: color },
},
text
),
]);
return promotionsStatusRender(h, params);
},
},
{
@@ -152,12 +123,12 @@ export default {
{
title: "活动开始时间",
key: "startTime",
width: 180
width: 180,
},
{
title: "活动结束时间",
key: "endTime",
width: 180
width: 180,
},
{
@@ -226,7 +197,7 @@ export default {
loading: true,
onOk: () => {
//
closePintuan(v.id).then((res) => {
updatePintuanStatus(v.id).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("操作成功");
@@ -243,7 +214,7 @@ export default {
};
</script>
<style lang="scss" scoped>
.ivu-form-item{
margin-bottom: 0 !important;
.ivu-form-item {
margin-bottom: 0 !important;
}
</style>

View File

@@ -34,14 +34,11 @@
/>
</template>
<template
slot-scope="{ row, index }"
slot="pointsGoodsCategory"
>
<template slot-scope="{ row, index }" slot="pointsGoodsCategory">
<Select
v-model="promotionGoodsList[index].pointsGoodsCategoryId"
transfer="true"
label-in-value="true"
:transfer="true"
:label-in-value="true"
@on-change="
(val) => {
changeCategory(val, index);
@@ -90,10 +87,7 @@
</FormItem>
<div>
<Button type="text" @click="closeCurrentPage">返回</Button>
<Button
type="primary"
:loading="submitLoading"
@click="handleSubmit"
<Button type="primary" :loading="submitLoading" @click="handleSubmit"
>提交</Button
>
</div>
@@ -101,10 +95,7 @@
</div>
</Form>
</Card>
<sku-select
ref="skuSelect"
@selectedGoodsData="selectedGoodsData"
></sku-select>
<sku-select ref="skuSelect" @selectedGoodsData="selectedGoodsData"></sku-select>
</div>
</template>
@@ -198,10 +189,7 @@ export default {
key: "goodsName",
minWidth: 120,
render: (h, params) => {
return h(
"div",
params.row.goodsSku.goodsName
);
return h("div", params.row.goodsSku.goodsName);
},
},
{
@@ -214,10 +202,7 @@ export default {
key: "storeName",
minWidth: 60,
render: (h, params) => {
return h(
"div",
params.row.goodsSku.storeName
);
return h("div", params.row.goodsSku.storeName);
},
},
{
@@ -236,10 +221,7 @@ export default {
key: "quantity",
minWidth: 20,
render: (h, params) => {
return h(
"div",
params.row.goodsSku.quantity
);
return h("div", params.row.goodsSku.quantity);
},
},
{
@@ -308,12 +290,8 @@ export default {
this.$refs.form.validate((valid) => {
if (valid) {
let params = this.promotionGoodsList;
const start = this.$options.filters.unixToDate(
this.form.startTime / 1000
);
const end = this.$options.filters.unixToDate(
this.form.endTime / 1000
);
const start = this.$options.filters.unixToDate(this.form.startTime / 1000);
const end = this.$options.filters.unixToDate(this.form.endTime / 1000);
if (!params || params.length == 0) {
this.$Modal.warning({ title: "提示", content: "请选择指定商品" });
@@ -339,15 +317,12 @@ export default {
//
closeCurrentPage() {
this.$store.commit("removeTag", "add-points-goods");
localStorage.pageOpenedList = JSON.stringify(
this.$store.state.app.pageOpenedList
);
localStorage.pageOpenedList = JSON.stringify(this.$store.state.app.pageOpenedList);
this.$router.go(-1);
},
//
changeCategory(val, index) {
this.promotionGoodsList[index].pointsGoodsCategoryName = val.label;
console.log(this.promotionGoodsList);
},
//
changeSelect(e) {
@@ -368,11 +343,9 @@ export default {
this.selectedGoods.forEach(function (e) {
ids.push(e.id);
});
this.promotionGoodsList = this.promotionGoodsList.filter(
(item) => {
return !ids.includes(item.id);
}
);
this.promotionGoodsList = this.promotionGoodsList.filter((item) => {
return !ids.includes(item.id);
});
},
});
},
@@ -380,12 +353,13 @@ export default {
//
this.promotionGoodsList.splice(index, 1);
},
openSkuList() { //
openSkuList() {
//
this.$refs.skuSelect.open("goods");
let data = JSON.parse(JSON.stringify(this.promotionGoodsList))
data.forEach(e => {
e.id = e.skuId
})
let data = JSON.parse(JSON.stringify(this.promotionGoodsList));
data.forEach((e) => {
e.id = e.skuId;
});
this.$refs.skuSelect.goodsData = data;
},
selectedGoodsData(item) {
@@ -395,12 +369,16 @@ export default {
const obj = {
settlementPrice: e.settlementPrice || 0,
pointsGoodsCategoryId: e.pointsGoodsCategoryId || 0,
pointsGoodsCategoryName:e.pointsGoodsCategoryName || "",
activeStock:e.activeStock || 0,
points:e.points || 0,
pointsGoodsCategoryName: e.pointsGoodsCategoryName || "",
activeStock: e.activeStock || 0,
points: e.points || 0,
skuId: e.id,
goodsSku: e.goodsSku || e
}
goodsId: e.goodsId,
originalPrice: e.price || 0,
thumbnail: e.thumbnail || "",
goodsName: e.goodsName || "",
goodsSku: e,
};
list.push(obj);
});
this.promotionGoodsList = list;
@@ -426,8 +404,7 @@ h4 {
margin-left: 10px;
color: #999;
}
.wrapper{
.wrapper {
min-height: 800px;
}
</style>

View File

@@ -2,25 +2,62 @@
<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>
<Button
@click="handleSearch"
type="primary"
icon="ios-search"
class="search-btn"
>搜索</Button
>
</Form>
</Row>
<Row class="operation padding-row">
@@ -29,38 +66,84 @@
<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>
<a class="mr_10" @click="linkTo(row.goodsId, row.skuId)">{{
row.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.goodsId, row.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="">
<img
src="../../../assets/qrcode.svg"
style="vertical-align: middle"
class="hover-pointer"
width="20"
height="20"
alt=""
/>
</Poptip>
</div>
</template>
<template slot-scope="{ row }" slot="price">
<div>{{ row.goodsSku.price | unitPrice("¥") }}</div>
<div>{{ row.originalPrice | unitPrice("¥") }}</div>
</template>
<template slot-scope="{ row }" slot="settlementPrice">
<div>{{ row.settlementPrice | unitPrice("¥") }}</div>
</template>
<template slot-scope="{ row }" slot="quantity">
<div>{{ row.goodsSku.quantity }}</div>
<div>{{ row.activeStock }}</div>
</template>
<template slot-scope="{ row }" slot="startTime">
<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
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="mt_10">
<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>
@@ -72,11 +155,13 @@ import {
editPointsGoodsStatus,
deletePointsGoodsStatus,
} from "@/api/promotion";
import vueQr from 'vue-qr'
import vueQr from "vue-qr";
import { promotionsStatusRender } from "@/utils/promotions";
export default {
name: "pointsGoods",
components: {
"vue-qr":vueQr
"vue-qr": vueQr,
},
data() {
return {
@@ -94,7 +179,8 @@ export default {
{ label: "已结束", value: "END" },
{ label: "已关闭", value: "CLOSE" },
],
columns: [ //
columns: [
//
{
title: "商品名称",
slot: "goodsName",
@@ -142,22 +228,7 @@ export default {
key: "promotionStatus",
width: 100,
render: (h, params) => {
let text = "未知",
color = "";
if (params.row.promotionStatus == "NEW") {
text = "未开始";
color = "geekblue";
} else if (params.row.promotionStatus == "START") {
text = "已开始";
color = "blue";
} else if (params.row.promotionStatus == "END") {
text = "已结束";
color = "green";
} else if (params.row.promotionStatus == "CLOSE") {
text = "已关闭";
color = "volcano";
}
return h("div", [h("Tag", { props: { color: color } }, text)]);
return promotionsStatusRender(h, params);
},
},
{
@@ -225,10 +296,15 @@ export default {
this.$router.push({ name: "edit-points-goods", query: { id: id } });
},
//
statusChanged(id, status) {
statusChanged(id, status, startTime, endTime) {
let text = "";
let params = {};
if (status == "START") {
text = "开启";
params = {
startTime: startTime,
endTime: endTime,
};
} else if (status == "CLOSE") {
text = "关闭";
}
@@ -237,9 +313,7 @@ export default {
content: "您确认要" + text + "此积分商品?",
loading: true,
onOk: () => {
editPointsGoodsStatus(id, {
promotionStatus: status,
}).then((res) => {
editPointsGoodsStatus(id, params).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success(text + "成功");
@@ -266,7 +340,7 @@ export default {
});
},
});
}
},
},
mounted() {
this.init();

View File

@@ -53,11 +53,7 @@
v-show="showAddPeriod"
@on-blur="addPeriodTime"
></InputNumber>
<Button
type="default"
@click="addPeriod"
>添加时间段</Button
>
<Button type="default" @click="addPeriod">添加时间段</Button>
</FormItem>
<FormItem label="申请规则" prop="seckillRule">
<Input
@@ -71,11 +67,9 @@
</div>
<div class="foot-btn">
<Button @click="closeCurrentPage" style="margin-right: 5px">返回</Button>
<Button
type="primary"
:loading="submitLoading"
@click="handleSubmit"
>提交</Button>
<Button type="primary" :loading="submitLoading" @click="handleSubmit"
>提交</Button
>
</div>
</div>
</Form>
@@ -104,7 +98,7 @@ export default {
promotionStatus: "NEW",
},
id: this.$route.query.id, // id
periodTime: null, //
periodTime: null, //
showAddPeriod: false, // input
submitLoading: false, //
@@ -140,11 +134,13 @@ export default {
}
});
},
addPeriod() { // input
addPeriod() {
// input
this.addPeriodTime();
this.showAddPeriod = true;
},
addPeriodTime() { //
addPeriodTime() {
//
this.showAddPeriod = false;
if (
this.periodTime !== null &&
@@ -153,7 +149,8 @@ export default {
this.form.seckillPeriod.push(this.periodTime);
}
},
removePeriodTime(event, name) { //
removePeriodTime(event, name) {
//
this.form.seckillPeriod = this.form.seckillPeriod.filter((i) => i !== name);
},
// //
@@ -175,8 +172,13 @@ export default {
delete this.form.updateTime;
delete this.form.endTime;
delete this.form.seckillApplyList;
let params = this.form;
params.startTime = this.$options.filters.unixToDate(this.form.startTime / 1000);
params.applyEndTime = this.$options.filters.unixToDate(
this.form.applyEndTime / 1000
);
//
updateSeckill(this.form).then((res) => {
updateSeckill(params).then((res) => {
this.submitLoading = false;
if (res && res.success) {
this.$Message.success("编辑成功");
@@ -202,7 +204,7 @@ h4 {
line-height: 40px;
text-align: left;
}
.ivu-form-item{
.ivu-form-item {
margin-bottom: 30px;
}
</style>

View File

@@ -2,13 +2,29 @@
<div class="seckill">
<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="活动名称" prop="promotionName">
<Input type="text" v-model="searchForm.promotionName" placeholder="请输入活动名称" clearable
style="width: 200px" />
<Input
type="text"
v-model="searchForm.promotionName"
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>
@@ -16,53 +32,107 @@
</Select>
</Form-item>
<Form-item label="活动时间">
<DatePicker v-model="selectDate" type="daterange" clearable placeholder="选择起始时间" style="width: 200px">
<DatePicker
v-model="selectDate"
type="daterange"
clearable
placeholder="选择起始时间"
style="width: 200px"
>
</DatePicker>
</Form-item>
<Button @click="handleSearch" type="primary" icon="ios-search" class="search-btn">搜索</Button>
<Button
@click="handleSearch"
type="primary"
icon="ios-search"
class="search-btn"
>搜索</Button
>
</Form>
</Row>
<Tabs value="list" class="mt_10" @on-click="clickTabPane">
<TabPane label="秒杀活动列表" name="list">
<Table :loading="loading" border :columns="columns" :data="data" ref="table" class="mt_10">
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
class="mt_10"
>
<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-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="success" 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'"
@click="manage(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>
<Button
type="error"
size="small"
v-if="row.promotionStatus == 'CLOSE'"
ghost
@click="expire(row)"
>删除</Button
>
</template>
</Table>
<Row type="flex" justify="end" class="mt_10">
<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>
<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>
</Card>
</div>
</template>
<script>
import { getSeckillList, delSeckill, closeSeckill } from "@/api/promotion";
import setupSeckill from "@/views/promotion/seckill/setupSeckill";
import { getSeckillList, delSeckill, updateSeckillStatus } from "@/api/promotion";
import setupSeckill from "@/views/promotions/seckill/seckill-setup";
import { promotionsStatusRender } from "@/utils/promotions";
export default {
name: "seckill",
components: {
@@ -105,15 +175,7 @@ export default {
key: "promotionStatus",
width: 100,
render: (h, params) => {
if (params.row.promotionStatus == "NEW") {
return h("Tag", { props: { color: "geekblue" } }, "新建");
} else if (params.row.promotionStatus == "START") {
return h("Tag", { props: { color: "green" } }, "开始");
} else if (params.row.promotionStatus == "END") {
return h("Tag", { props: { color: "volcano" } }, "结束");
} else if (params.row.promotionStatus == "CLOSE") {
return h("Tag", { props: { color: "red" } }, "结束");
}
return promotionsStatusRender(h, params);
},
},
@@ -179,7 +241,7 @@ export default {
title: "提示",
content: "您确定要下架该活动吗?",
onOk: () => {
closeSeckill(v.id).then((res) => {
updateSeckillStatus(v.id).then((res) => {
if (res.success) {
this.$Message.success("下架成功");
this.getDataList();

View File

@@ -1,15 +1,19 @@
<template>
<div class="search">
<Card>
<!-- 筛选项和操作按钮 -->
<Row class="operation">
<i-switch v-model="strict" class="selectModel" size="large" style="margin-right: 5px">
<i-switch
v-model="strict"
class="selectModel"
size="large"
style="margin-right: 5px"
>
<span slot="open">级联</span>
<span slot="close">单选</span>
</i-switch>
<Button @click="addRootMenu" >添加顶级菜单</Button>
<Button @click="addMenu" type="primary" >添加子菜单</Button>
<Button @click="addRootMenu">添加顶级菜单</Button>
<Button @click="addMenu" type="primary">添加子菜单</Button>
<Button @click="delAll">批量删除</Button>
<Dropdown @on-click="handleDropdown">
<Button>
@@ -31,9 +35,7 @@
<Alert show-icon>
当前选择编辑
<span class="select-title">{{ editTitle }}</span>
<a class="select-clear" v-if="form.id" @click="cancelEdit"
>取消选择</a
>
<a class="select-clear" v-if="form.id" @click="cancelEdit">取消选择</a>
</Alert>
<Input
v-model="searchKey"
@@ -56,12 +58,7 @@
</div>
</Col>
<Col :md="15" :lg="13" :xl="9" style="margin-left: 10px">
<Form
ref="form"
:model="form"
:label-width="110"
:rules="formValidate"
>
<Form ref="form" :model="form" :label-width="110" :rules="formValidate">
<FormItem label="类型" prop="type">
<div v-show="form.level == 0">
<Icon
@@ -81,41 +78,41 @@
</div>
</FormItem>
<FormItem label="菜单名称" prop="title">
<Input v-model="form.title" />
</FormItem>
<FormItem label="路由地址" prop="path" v-if="form.level != 0" class="block-tool">
<Tooltip placement="right" content="路由地址,英文唯一,跳转页面,路径展示用 ">
<Input v-model="form.path"/>
</Tooltip>
<Input class="menu-input" v-model="form.title" />
</FormItem>
<FormItem
label="路由名称"
prop="name"
label="路由地址"
prop="path"
v-if="form.level != 0"
class="block-tool"
>
<Tooltip placement="right" content="路由name需英文唯一跳转页面用" transfer>
<Input v-model="form.name"/>
<Tooltip
placement="right"
content="路由地址,英文唯一,跳转页面,路径展示用 "
>
<Input class="menu-input" v-model="form.path" />
</Tooltip>
</FormItem>
<FormItem label="路由名称" prop="name" class="block-tool">
<Tooltip
placement="right"
content="路由name需英文唯一跳转页面用"
transfer
>
<Input class="menu-input" v-model="form.name" />
</Tooltip>
</FormItem>
<FormItem label="文件路径" prop="frontRoute" v-if="form.level != 0">
<Input v-model="form.frontRoute"/>
<Input class="menu-input" v-model="form.frontRoute" />
</FormItem>
<FormItem label="权限url" v-if="form.level != 0" class="block-tool">
<Tooltip placement="right" content="*号模糊匹配,逗号分割" transfer>
<Input v-model="form.permission"/>
<Input class="menu-input" v-model="form.permission" />
</Tooltip>
</FormItem>
<FormItem label="排序值" prop="sortOrder">
<Tooltip
trigger="hover"
placement="right"
content="值越小越靠前,支持小数"
>
<InputNumber
:max="1000"
:min="0"
v-model="form.sortOrder"
></InputNumber>
<Tooltip trigger="hover" placement="right" content="值越小越靠前,支持小数">
<InputNumber :max="1000" :min="0" v-model="form.sortOrder"></InputNumber>
</Tooltip>
</FormItem>
<Form-item>
@@ -124,9 +121,8 @@
@click="submitEdit"
:loading="submitLoading"
type="primary"
>保存
</Button
>
>保存
</Button>
<Button @click="handleReset">重置</Button>
</Form-item>
</Form>
@@ -142,78 +138,48 @@
:width="500"
:styles="{ top: '30px' }"
>
<Form
ref="formAdd"
:model="formAdd"
:label-width="100"
:rules="formValidate"
>
<Form ref="formAdd" :model="formAdd" :label-width="100" :rules="formValidate">
<div v-if="showParent">
<FormItem label="上级节点:">{{ parentTitle }}</FormItem>
</div>
<FormItem label="类型" prop="type">
<div v-show="formAdd.level == 0">
<Icon
type="ios-navigate-outline"
size="16"
style="margin-right: 5px"
></Icon>
<Icon type="ios-navigate-outline" size="16" style="margin-right: 5px"></Icon>
<span>顶级菜单</span>
</div>
<div v-show="formAdd.level != 0">
<Icon
type="ios-list-box-outline"
size="16"
style="margin-right: 5px"
></Icon>
<Icon type="ios-list-box-outline" size="16" style="margin-right: 5px"></Icon>
<span>页面菜单</span>
</div>
</FormItem>
<FormItem
label="菜单名称"
prop="title"
>
<Input v-model="formAdd.title"/>
<FormItem label="菜单名称" prop="title">
<Input class="menu-input" v-model="formAdd.title" />
</FormItem>
<FormItem label="路由地址" prop="path" v-if="formAdd.level != 0">
<Input v-model="formAdd.path"/>
<Input v-model="formAdd.path" />
</FormItem>
<FormItem
label="路由名称"
prop="name"
class="block-tool"
>
<FormItem label="路由名称" prop="name" class="block-tool">
<Tooltip placement="right" content="路由name需英文唯一跳转页面用">
<Input v-model="formAdd.name"/>
<Input v-model="formAdd.name" />
</Tooltip>
</FormItem>
<FormItem label="文件路径" prop="frontRoute" v-if="formAdd.level != 0">
<Input v-model="formAdd.frontRoute"/>
<Input v-model="formAdd.frontRoute" />
</FormItem>
<FormItem label="权限url" v-if="formAdd.level != 0">
<Input v-model="formAdd.permission"/>
<Input v-model="formAdd.permission" />
<div class="desc">*号模糊匹配逗号分割</div>
</FormItem>
<FormItem label="排序值" prop="sortOrder">
<Tooltip
trigger="hover"
placement="right"
content="值越小越靠前,支持小数"
>
<InputNumber
:max="1000"
:min="0"
v-model="formAdd.sortOrder"
></InputNumber>
<Tooltip trigger="hover" placement="right" content="值越小越靠前,支持小数">
<InputNumber :max="1000" :min="0" v-model="formAdd.sortOrder"></InputNumber>
</Tooltip>
</FormItem>
</Form>
<div slot="footer">
<Button type="text" @click="menuModalVisible = false">取消</Button>
<Button type="primary" :loading="submitLoading" @click="submitAdd"
>提交</Button>
<Button type="primary" :loading="submitLoading" @click="submitAdd">提交</Button>
</div>
</Modal>
</div>
@@ -245,7 +211,8 @@ export default {
parentTitle: "", // 父级标题
editTitle: "", // 编辑标题
modalTitle: "", // modal标题
form: { // 表单数据
form: {
// 表单数据
id: "",
title: "",
name: "",
@@ -254,19 +221,17 @@ export default {
parentId: "",
sortOrder: 0,
level: 0,
permission: ''
permission: "",
},
formAdd: { // 添加表单
formAdd: {
// 添加表单
},
formValidate: { // 验证规则
title: [{required: true, message: "菜单名称名称不能为空", trigger: "blur"}],
name: [
{required: true, message: "路由名称不能为空", trigger: "blur"},
],
path: [{required: true, message: "路由地址不能为空", trigger: "blur"}],
frontRoute: [
{required: true, message: "文件地址不能为空", trigger: "blur"},
],
formValidate: {
// 验证规则
title: [{ required: true, message: "菜单名称名称不能为空", trigger: "blur" }],
name: [{ required: true, message: "路由名称不能为空", trigger: "blur" }],
path: [{ required: true, message: "路由地址不能为空", trigger: "blur" }],
frontRoute: [{ required: true, message: "文件地址不能为空", trigger: "blur" }],
sortOrder: [
{
required: true,
@@ -286,7 +251,8 @@ export default {
this.getAllList();
},
renderContent(h, {root, node, data}) { // 渲染树形结构前面图标
renderContent(h, { root, node, data }) {
// 渲染树形结构前面图标
let icon = "";
if (data.level == 0) {
icon = "ios-navigate";
@@ -420,7 +386,6 @@ export default {
// 选择菜单
selectTree(v) {
if (v.length > 0) {
let str = JSON.stringify(v);
let menu = JSON.parse(str);
this.form = menu[0];
@@ -434,7 +399,7 @@ export default {
search() {
if (this.searchKey) {
this.loading = true;
searchPermission({title: this.searchKey}).then((res) => {
searchPermission({ title: this.searchKey }).then((res) => {
this.loading = false;
if (res.success) {
this.data = res.result;
@@ -486,7 +451,7 @@ export default {
if (res.success) {
this.$Message.success("编辑成功");
// 标记重新获取菜单数据
this.$store.commit('setAdded', false);
this.$store.commit("setAdded", false);
util.initRouter(this);
this.init();
this.menuModalVisible = false;
@@ -506,7 +471,7 @@ export default {
if (res.success) {
this.$Message.success("添加成功");
// 标记重新获取菜单数据
this.$store.commit('setAdded', false);
this.$store.commit("setAdded", false);
util.initRouter(this);
this.init();
this.menuModalVisible = false;
@@ -535,7 +500,7 @@ export default {
parentId: this.form.id,
level: Number(this.form.level) + 1,
sortOrder: 0,
permission:'' // 权限url
permission: "", // 权限url
};
if (this.form.level == 0) {
this.formAdd.path = "/";
@@ -549,7 +514,7 @@ export default {
this.showParent = false;
this.formAdd = {
level: 0,
sortOrder: 0
sortOrder: 0,
};
this.menuModalVisible = true;
},
@@ -579,7 +544,7 @@ export default {
if (res.success) {
this.$Message.success("删除成功");
// 标记重新获取菜单数据
this.$store.commit('setAdded', false);
this.$store.commit("setAdded", false);
util.initRouter(this);
this.selectList = [];
this.selectCount = 0;
@@ -601,8 +566,11 @@ export default {
</script>
<style lang="scss" scoped>
@import "@/styles/tree-common.scss";
.desc{
.desc {
font-size: 12px;
color: #999;
}
</style>
.menu-input {
width: 500px;
}
</style>