秒杀,全折扣秒杀
This commit is contained in:
parent
3608823914
commit
f558b80a61
|
@ -199,6 +199,36 @@ const marketingRouter =
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
path: 'allDiscount',
|
||||
name: 'allDiscount',
|
||||
meta: {
|
||||
title: '全折扣秒杀',
|
||||
noCache: true
|
||||
},
|
||||
redirect: 'noRedirect',
|
||||
component: () => import('@/views/marketing/allDiscount/index'),
|
||||
children: [
|
||||
{
|
||||
path: 'seckillConfig',
|
||||
name: 'SeckillConfig',
|
||||
meta: {
|
||||
title: '全折扣秒杀配置',
|
||||
noCache: true
|
||||
},
|
||||
component: () => import('@/views/marketing/allDiscount/seckillConfig/index')
|
||||
},
|
||||
{
|
||||
path: 'list',
|
||||
name: 'SpikeList',
|
||||
meta: {
|
||||
title: '全折扣秒杀列表',
|
||||
noCache: true
|
||||
},
|
||||
component: () => import('@/views/marketing/allDiscount/seckillGoods/index.vue')
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
path: 'presell',
|
||||
name: 'preSell',
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
<template>
|
||||
<router-view />
|
||||
</template>
|
|
@ -0,0 +1,201 @@
|
|||
<template>
|
||||
<div class="divBox">
|
||||
<div class="selCard">
|
||||
<el-form size="small" label-width="85px" :inline="true">
|
||||
<el-form-item label="是否显示:">
|
||||
<el-select
|
||||
v-model="tableFrom.status"
|
||||
placeholder="请选择"
|
||||
class="selWidth"
|
||||
clearable
|
||||
@change="getList"
|
||||
>
|
||||
<el-option label="显示" :value="1" />
|
||||
<el-option label="不显示" :value="0" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<el-card class="mt14">
|
||||
<div class="mb14">
|
||||
<el-button size="small" type="primary" @click="addSpike">添加配置</el-button>
|
||||
</div>
|
||||
<el-table
|
||||
v-loading="listLoading"
|
||||
:data="tableData.data"
|
||||
size="small"
|
||||
highlight-current-row
|
||||
>
|
||||
<el-table-column prop="seckill_time_id" label="编号" min-width="100" />
|
||||
<el-table-column prop="title" label="名称" min-width="120" />
|
||||
<el-table-column label="开始时间(整数小时)" min-width="120">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ scope.row.start_time }} :00</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="结束时间(整点)" min-width="120">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ scope.row.end_time }} :00</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="图片" min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<div class="demo-image__preview">
|
||||
<el-image
|
||||
style="width: 36px; height: 36px"
|
||||
:src="scope.row.pic"
|
||||
:preview-src-list="[scope.row.pic]"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="是否可用" min-width="120">
|
||||
<template slot-scope="scope">
|
||||
<el-switch
|
||||
v-model="scope.row.status"
|
||||
:active-value="1"
|
||||
:inactive-value="0"
|
||||
active-text="启用"
|
||||
inactive-text="禁用"
|
||||
@click.native="onchangeIsShow(scope.row)"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" min-width="90" fixed="right">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
type="text"
|
||||
size="small"
|
||||
class="mr10"
|
||||
@click="handleEdit(scope.row.seckill_time_id)"
|
||||
>编辑</el-button>
|
||||
<el-button type="text" size="small" @click="handleDelete(scope.row.seckill_time_id,scope.$index)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="block">
|
||||
<el-pagination
|
||||
background
|
||||
:page-size="tableFrom.limit"
|
||||
:current-page="tableFrom.page"
|
||||
layout="total, prev, pager, next, jumper"
|
||||
:total="tableData.total"
|
||||
@size-change="handleSizeChange"
|
||||
@current-change="pageChange"
|
||||
/>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import {
|
||||
spikeConfigLstApi,
|
||||
spikeConfigDeleteApi,
|
||||
spikeConfigurationApi,
|
||||
spikeConfigUpdateApi,
|
||||
spikeConfigStatusApi
|
||||
} from '@/api/marketing'
|
||||
import { roterPre } from '@/settings'
|
||||
export default {
|
||||
name: 'CouponList',
|
||||
data() {
|
||||
return {
|
||||
Loading: false,
|
||||
dialogVisible: false,
|
||||
roterPre: roterPre,
|
||||
listLoading: true,
|
||||
tableData: {
|
||||
data: [],
|
||||
total: 0
|
||||
},
|
||||
tableFrom: {
|
||||
page: 1,
|
||||
limit: 20,
|
||||
status: ""
|
||||
},
|
||||
tableFromIssue: {
|
||||
page: 1,
|
||||
limit: 10,
|
||||
coupon_id: 0
|
||||
},
|
||||
issueData: {
|
||||
data: [],
|
||||
total: 0
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getList()
|
||||
},
|
||||
methods: {
|
||||
// 添加秒杀配置
|
||||
addSpike() {
|
||||
this.$modalForm(spikeConfigurationApi().then()).then(() =>
|
||||
this.getList()
|
||||
)
|
||||
},
|
||||
// 编辑
|
||||
handleEdit(id) {
|
||||
this.$modalForm(spikeConfigUpdateApi(id).then()).then(() =>
|
||||
this.getList()
|
||||
)
|
||||
},
|
||||
// 删除
|
||||
handleDelete(id, idx) {
|
||||
this.$modalSure().then(() => {
|
||||
spikeConfigDeleteApi(id)
|
||||
.then(({ message }) => {
|
||||
this.$message.success(message)
|
||||
this.tableData.data.splice(idx, 1)
|
||||
})
|
||||
.catch(({ message }) => {
|
||||
this.$message.error(message)
|
||||
})
|
||||
})
|
||||
},
|
||||
handleClose() {
|
||||
this.dialogVisible = false
|
||||
},
|
||||
// 列表
|
||||
getList() {
|
||||
this.listLoading = true
|
||||
console.log(this.tableFrom)
|
||||
spikeConfigLstApi(this.tableFrom)
|
||||
.then((res) => {
|
||||
this.tableData.data = res.data.list
|
||||
this.tableData.total = res.data.count
|
||||
this.listLoading = false
|
||||
})
|
||||
.catch((res) => {
|
||||
this.listLoading = false
|
||||
this.$message.error(res.message)
|
||||
})
|
||||
},
|
||||
pageChange(page) {
|
||||
this.tableFrom.page = page
|
||||
this.getList()
|
||||
},
|
||||
handleSizeChange(val) {
|
||||
this.tableFrom.limit = val
|
||||
this.getList()
|
||||
},
|
||||
// 修改状态
|
||||
onchangeIsShow(row) {
|
||||
spikeConfigStatusApi(row.seckill_time_id, row.status )
|
||||
.then(({ message }) => {
|
||||
this.$message.success(message)
|
||||
this.getList()
|
||||
})
|
||||
.catch(({ message }) => {
|
||||
this.$message.error(message)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
@import '@/styles/form.scss';
|
||||
</style>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,358 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
v-if="dialogVisible"
|
||||
title="商品审核"
|
||||
:visible.sync="dialogVisible"
|
||||
width="900px"
|
||||
:before-close="handleClose"
|
||||
class="projectInfo"
|
||||
>
|
||||
<el-tabs v-if="projectData && isShow" v-model="activeNames" v-loading="loading">
|
||||
<el-tab-pane label="商品信息" name="first">
|
||||
<div class="acea-row">
|
||||
<span class="sp100">商品名称:{{ projectData.store_name }}</span>
|
||||
<span class="sp">平台分类:{{ projectData.storeCategory?projectData.storeCategory.cate_name:'' }}</span>
|
||||
<span class="sp">品牌:{{ projectData.brand?projectData.brand.brand_name:'' }}</span>
|
||||
<span class="sp">商品关键字:{{ projectData.keyword }}</span>
|
||||
<span class="sp">商品单位:{{ projectData.unit_name }}</span>
|
||||
<span class="sp">运费模板:{{ projectData.temp?projectData.temp.name:'' }}</span>
|
||||
<span class="sp100">运费说明:{{ projectData.temp?projectData.temp.info:'' }}</span>
|
||||
<span class="sp100">
|
||||
商品分类:
|
||||
<template v-if="projectData.merCateId">
|
||||
<span v-for="(item, index) in projectData.merCateId" :key="index" class="mr10">{{ item.category?item.category.cate_name:'' }}</span>
|
||||
</template>
|
||||
<span v-else>-</span>
|
||||
</span>
|
||||
<span class="sp100">商品简介:{{ projectData.store_info }}</span>
|
||||
<span class="sp100">
|
||||
商品封面图:
|
||||
<div class="demo-image__preview">
|
||||
<el-image
|
||||
style="width: 60px; height: 60px"
|
||||
:src="projectData.image"
|
||||
:preview-src-list="[projectData.image]"
|
||||
/>
|
||||
</div>
|
||||
</span>
|
||||
<span class="sp100">商品轮播图:
|
||||
<div
|
||||
v-for="(item,index) in projectData.slider_image"
|
||||
:key="index"
|
||||
class="pictrue"
|
||||
>
|
||||
<el-image
|
||||
style="width: 60px; height: 60px"
|
||||
:src="item"
|
||||
:preview-src-list="[item]"
|
||||
/>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="商品详情" name="second">
|
||||
<span class="sp100">商品详情:</span>
|
||||
<div class="contentPic" v-html="projectData.content" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="其他设置" name="third">
|
||||
<span class="sp100">商品排序:{{ projectData.sort }}</span>
|
||||
<span v-if="projectData.guarantee && projectData.guarantee.templateValue.length" class="third mb20">
|
||||
<span>服务保障:</span>
|
||||
<span v-for="(item,index) in projectData.guarantee.templateValue" :key="index">
|
||||
<span v-if="item.value">{{index+1}}. {{item.value.guarantee_name}};</span>
|
||||
</span>
|
||||
</span>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="商品规格" name="fourth">
|
||||
<span class="sp">商品规格:{{ projectData.spec_type === 0 ? '单规格' : '多规格' }}</span>
|
||||
<!-- <span class="sp">佣金设置:{{ projectData.extension_type === 0 ? '默认设置' : '单独设置' }}</span> -->
|
||||
<span class="sp100">
|
||||
<span class="mb15" style="display: block">商品规格:</span>
|
||||
<template v-if="projectData.spec_type === 0">
|
||||
<el-table :data="OneattrValue" border class="tabNumWidth" size="mini">
|
||||
<el-table-column align="center" label="图片" min-width="80">
|
||||
<template slot-scope="scope">
|
||||
<div class="demo-image__preview">
|
||||
<el-image
|
||||
style="width: 60px; height: 60px"
|
||||
:src="scope.row.image"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column v-for="(item,iii) in attrValue" :key="iii" :label="formThead[iii].title" align="center" min-width="90">
|
||||
<template slot-scope="scope">
|
||||
<span class="priceBox" v-text="scope.row[iii]" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <template v-if="projectData.extension_type === 1">
|
||||
<el-table-column align="center" label="一级返佣(元)" min-width="90">
|
||||
<template slot-scope="scope">
|
||||
<span class="priceBox" v-text="scope.row.extension_one" />
|
||||
<el-input v-model="scope.row.extension_one" type="number" :min="0" class="priceBox" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="二级返佣(元)" min-width="90">
|
||||
<template slot-scope="scope">
|
||||
<span class="priceBox" v-text="scope.row.extension_two" />
|
||||
<el-input v-model="scope.row.extension_two" type="number" :min="0" class="priceBox" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template> -->
|
||||
</el-table>
|
||||
</template>
|
||||
<template v-if="projectData.spec_type === 1">
|
||||
<el-table :data="ManyAttrValue" border class="tabNumWidth" size="mini">
|
||||
<el-table-column align="center" label="图片" min-width="80">
|
||||
<template slot-scope="scope">
|
||||
<div class="upLoadPicBox">
|
||||
<div class="pictrue tabPic"><img :src="scope.row.image"></div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column v-for="(item,iii) in attrValue" :key="iii" :label="formThead[iii].title" align="center" min-width="90">
|
||||
<template slot-scope="scope">
|
||||
<span class="priceBox">{{ scope.row[iii] }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <template v-if="projectData.extension_type === 1">
|
||||
<el-table-column align="center" label="一级返佣(元)" min-width="90">
|
||||
<template slot-scope="scope">
|
||||
<span class="priceBox">{{ scope.row.extension_one }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="二级返佣(元)" min-width="90">
|
||||
<template slot-scope="scope">
|
||||
<span class="priceBox">{{ scope.row.extension_two }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template> -->
|
||||
</el-table>
|
||||
</template>
|
||||
</span>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
<el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="80px" class="demo-ruleForm">
|
||||
<el-form-item label="审核状态" prop="status">
|
||||
<el-radio-group v-model="ruleForm.status">
|
||||
<el-radio :label="1">通过</el-radio>
|
||||
<el-radio :label="-1">拒绝</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="ruleForm.status===-1" label="原因" prop="refusal">
|
||||
<el-input v-model="ruleForm.refusal" type="textarea" placeholder="请输入原因" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="onSubmit">提交</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import { seckillProductDetailApi, seckillProductStatusApi } from '@/api/product'
|
||||
const defaultObj = {
|
||||
image: '',
|
||||
slider_image: [],
|
||||
store_name: '',
|
||||
store_info: '',
|
||||
keyword: '',
|
||||
brand_id: '', // 品牌id
|
||||
cate_id: '', // 平台分类id
|
||||
mer_cate_id: [], // 商户分类id
|
||||
unit_name: '',
|
||||
sort: 0,
|
||||
is_show: 0,
|
||||
is_benefit: 0,
|
||||
is_new: 0,
|
||||
is_good: 0,
|
||||
temp_id: '',
|
||||
attrValue: [{
|
||||
image: '',
|
||||
price: null,
|
||||
cost: null,
|
||||
ot_price: null,
|
||||
stock: null,
|
||||
bar_code: '',
|
||||
weight: null,
|
||||
volume: null
|
||||
}],
|
||||
attr: [],
|
||||
selectRule: '',
|
||||
extension_type: 0,
|
||||
content: '',
|
||||
spec_type: 0
|
||||
}
|
||||
const objTitle = {
|
||||
price: {
|
||||
title: '售价'
|
||||
},
|
||||
cost: {
|
||||
title: '成本价'
|
||||
},
|
||||
ot_price: {
|
||||
title: '市场价'
|
||||
},
|
||||
stock: {
|
||||
title: '库存'
|
||||
},
|
||||
bar_code: {
|
||||
title: '商品编号'
|
||||
},
|
||||
weight: {
|
||||
title: '重量(KG)'
|
||||
},
|
||||
volume: {
|
||||
title: '体积(m³)'
|
||||
}
|
||||
}
|
||||
const proOptions = [{ name: '热门榜单', value: 'is_hot' }, { name: '特惠专区', value: 'is_benefit' }, { name: '精品推荐', value: 'is_best' }, { name: '首发新品', value: 'is_new' }]
|
||||
export default {
|
||||
name: 'Info',
|
||||
props: {
|
||||
isShow: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
ids: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
rules: {
|
||||
status: [
|
||||
{ required: true, message: '请选择审核状态', trigger: 'change' }
|
||||
],
|
||||
refusal: [
|
||||
{ required: true, message: '请填写拒绝原因', trigger: 'blur' }
|
||||
]
|
||||
},
|
||||
proId: 0,
|
||||
ruleForm: {
|
||||
refusal: '',
|
||||
status: 1,
|
||||
id: ''
|
||||
},
|
||||
formThead: Object.assign({}, objTitle),
|
||||
manyTabDate: {},
|
||||
manyTabTit: {},
|
||||
loading: false,
|
||||
dialogVisible: false,
|
||||
activeNames: 'first',
|
||||
projectData: {},
|
||||
recommend: proOptions,
|
||||
OneattrValue: [Object.assign({}, defaultObj.attrValue[0])], // 单规格
|
||||
ManyAttrValue: [Object.assign({}, defaultObj.attrValue[0])] // 多规格
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
attrValue() {
|
||||
const obj = Object.assign({}, defaultObj.attrValue[0])
|
||||
delete obj.image
|
||||
return obj
|
||||
},
|
||||
oneFormBatch() {
|
||||
const obj = [Object.assign({}, defaultObj.attrValue[0])]
|
||||
delete obj[0].bar_code
|
||||
return obj
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onSubmit() {
|
||||
this.isShow ? this.ruleForm.id = this.proId : this.ruleForm.id = this.ids
|
||||
seckillProductStatusApi(this.ruleForm).then(res => {
|
||||
this.$message.success(res.message)
|
||||
this.dialogVisible = false
|
||||
this.activeNames = 'first'
|
||||
this.$emit('subSuccess')
|
||||
}).catch(res => {
|
||||
this.listLoading = false
|
||||
this.$message.error(res.message)
|
||||
})
|
||||
},
|
||||
handleClose() {
|
||||
this.dialogVisible = false
|
||||
this.activeNames = 'first'
|
||||
},
|
||||
getInfo(id) {
|
||||
this.proId = id
|
||||
this.loading = true
|
||||
seckillProductDetailApi(id).then(res => {
|
||||
this.projectData = res.data
|
||||
if (this.projectData.spec_type === 0) {
|
||||
this.OneattrValue = res.data.attrValue
|
||||
} else {
|
||||
this.ManyAttrValue = res.data.attrValue
|
||||
}
|
||||
const tmp = {}
|
||||
const tmpTab = {}
|
||||
this.projectData.attr.forEach((o, i) => {
|
||||
tmp['value' + i] = { title: o.value }
|
||||
tmpTab['value' + i] = ''
|
||||
})
|
||||
this.manyTabDate = tmpTab
|
||||
this.formThead = Object.assign({}, this.formThead, tmp)
|
||||
|
||||
this.loading = false
|
||||
}).catch(res => {
|
||||
this.$message.error(res.message)
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.projectInfo ::v-deep .el-tabs__content{
|
||||
padding-left: 10px !important;
|
||||
}
|
||||
.projectInfo ::v-deep .el-dialog__body{
|
||||
padding-top: 0 !important;
|
||||
}
|
||||
.tabPic{
|
||||
width: 40px !important;
|
||||
height: 40px !important;
|
||||
img{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.sp {
|
||||
display: block;
|
||||
width: 33%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.sp100 {
|
||||
width: 100%;
|
||||
margin-bottom: 15px;
|
||||
display: inline-block;
|
||||
}
|
||||
.third{
|
||||
width: 100%;
|
||||
display: flex;
|
||||
}
|
||||
.pictrue {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
border: 1px dotted rgba(0, 0, 0, 0.1);
|
||||
margin-right: 10px;
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.demo-image__preview{
|
||||
display: inline-block;
|
||||
}
|
||||
.contentPic{
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue