活动池功能

feature_0521
yuankai 6 years ago
parent 72ed974353
commit 06eacf09e7

15143
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -33,11 +33,15 @@ import {
Page,
Upload,
Spin,
Tooltip
Tooltip,
Step,
Steps,
Tag
} from "view-design";
import 'view-design/dist/styles/iview.css';
Vue.component('Button', Button);
Vue.component('Tag', Tag);
Vue.component('Table', Table);
Vue.component('Card', Card);
Vue.component('Form', Form);
@ -75,3 +79,5 @@ Vue.component('Page', Page);
Vue.component('Spin', Spin);
Vue.component('Upload', Upload);
Vue.component('Tooltip', Tooltip);
Vue.component('Step', Step);
Vue.component('Steps', Steps);

@ -1,13 +1,128 @@
<template>
<div>活动管理</div>
<div class="activityManager">
<Row>
<i-col class="activityListClass" v-for="(item, index) in activityList" :key="index" span="7" offset="1">
<Card>
<div class="operateAndThemeItem">
<div class="ThemeItem">
<img class="img" :src="item.img">
<div class="tipItem">
<span>{{item.name}}</span>
<span>{{item.description}}</span>
</div>
</div>
<div class="operateItem">
<div @click="disPlayUseTable">使</div>
<div @click="dispalyAddActivity(item.id)"></div>
</div>
</div>
</Card>
</i-col>
</Row>
<Row>
<i-col span="7" offset="1">
<div @click="dispalyAddActivity('')" class="addactivity">
<span>+</span>
<span>添加活动</span>
</div>
</i-col>
</Row>
<useTable @dispalyuseModal="dispalyuseModal" :useModal="useModal"></useTable>
<addActivity @dispalyAddActivityModal="dispalyAddActivityModal" :addActivityModal="addActivityModal" :id="id"></addActivity>
</div>
</template>
<script>
import Img from '../../assets/logo.png'
import useTable from './useTable'
import addActivity from './addActivity'
import ActivityManager from "../../services/ActivityManager/ActivityManager";
export default {
name: "ActivityManager"
name: "ActivityManager",
components: {
useTable,
addActivity
},
inject: ['setMenuName'],
data() {
return {
useModal: false,
addActivityModal: false,
activityList: [],
id: ''
}
},
mounted() {
this.setMenuName("活动管理", "活动池")
this.getActivityTable()
},
methods: {
getActivityTable() {
let that = this
ActivityManager.getActivityList({}, function (data) {
that.activityList = data.data.results
})
},
disPlayUseTable() {
this.useModal = true
},
dispalyAddActivity(val) {
this.addActivityModal = true
this.id = val.toString()
},
dispalyuseModal(displayModalFlag, isCancle) {
this.useModal = displayModalFlag
if(isCancle === true) {
this.getActivityTable()
}
},
dispalyAddActivityModal(displayModalFlag, isCancle) {
this.addActivityModal = displayModalFlag
if(isCancle === true) {
this.getActivityTable()
}
}
}
}
</script>
<style scoped>
.operateAndThemeItem {
display: flex;
justify-content: space-between;
}
.img {
width: 200px;
height: 200px;
}
.operateItem {
display: flex;
flex-direction: column;
justify-content: space-between;
color: #6ac1d1;
width: 20%;
text-align: right;
cursor: pointer;
}
.ThemeItem {
display: flex;
justify-content: flex-start;
width: 80%;
}
.tipItem {
display: flex;
flex-direction: column;
justify-content: space-between;
margin-left: 50px;
}
.activityListClass {
margin-bottom: 50px;
}
.addactivity{
height: 300px;
border: 1px dashed;
text-align: center;
line-height: 300px;
}
</style>

@ -0,0 +1,220 @@
<template>
<Modal v-model="dispalyModal" width="1000" :mask-closable="false" @on-cancel="cancel">
<p slot="header" style="color:#f60;text-align:left">
<span>配置活动</span>
</p>
<div>基本配置</div>
<Form ref="formValidate" :model="formValidate" :rules="ruleValidate" :label-width="80">
<Row>
<i-col style="text-align: left;" span="8">
<FormItem label="" prop="uploadImg">
<!-- <Upload
type="select"
:on-success="uploadImgSuccess"
:show-upload-list="false"
:before-upload="handleBeforeUpload"
action="//jsonplaceholder.typicode.com/posts/">
<div style="padding: 20px 0;">
<Icon type="ios-cloud-upload" size="52" style="color: #3399ff"></Icon>
<p>上传活动图片</p>
</div>
</Upload> -->
<Upload
ref='upload'
:show-upload-list="false"
:on-success="uploadImgSuccess"
:format="['jpg','jpeg','png']"
:max-size="2048"
:before-upload="handleBeforeUpload"
multiple
type="drag"
action=""
style="display: inline-block;">
<div style="width: 200px;height:200px;line-height: 200px;">
<span>请上传图片</span>
</div>
</Upload>
</FormItem>
</i-col>
<i-col span="15" offset="1">
<FormItem label="活动名称" prop="activityName">
<i-input type="text" v-model="formValidate.activityName" placeholder="请输入活动名称"></i-input>
</FormItem>
<Form-item label="活动描述" prop="activityDsc">
<i-input v-model="formValidate.activityDsc" type="textarea" :autosize="{minRows: 3}" placeholder="请输入活动描述"></i-input>
</Form-item>
<FormItem label="APPID" prop="appId">
<i-input type="text" v-model="formValidate.appId" placeholder="请输入appid"></i-input>
</FormItem>
<FormItem label="URI" prop="uri">
<i-input type="text" v-model="formValidate.uri" placeholder="请输入URI"></i-input>
</FormItem>
</i-col>
</Row>
</Form>
<div class="topic">活动类型</div>
<Row class="inputItem" v-for="(item, index) in inputActivityList" :key="index">
<i-col :span="2">
类型{{index+1}}
</i-col>
<i-col :span="20">
<i-input class="inputClass" type="text" v-model="item.value1" placeholder=""></i-input>
<i-input class="inputClass" type="text" style="margin-left: 20px" v-model="item.value2" placeholder=""></i-input>
<Button style="margin-left: 20px" type="error" @click="delActivityInput(index)"></Button>
</i-col>
</Row>
<Button style="margin-top: 10px" type="primary" @click="addActivityInput">+</Button>
<div style="text-align: center;" slot="footer">
<Button type="primary" size="large" shape="circle" :loading="modal_loading" @click="next"></Button>
</div>
</Modal>
</template>
<script>
import ActivityManager from "../../services/ActivityManager/ActivityManager";
export default {
name: "addActivity",
data() {
return {
dispalyModal: false,
currentStep: 0,
modal_loading: false,
inputActivityList: [],
imageName: '212',
formValidate: {
activityName: '',
activityDsc: '',
appId: '',
uri: ''
},
ruleValidate: {
activityName: [
{ required: true, message: '活动名称不能为空', trigger: 'blur' }
],
activityDsc: [
{ required: true, message: '活动描述不能为空', trigger: 'blur' }
],
appId: [
{ required: true, message: 'appId不能为空', trigger: 'blur' }
],
uri: [
{ required: true, message: 'URI不能为空', trigger: 'blur' }
],
// uploadImg: [
// { required: true, message: '', trigger: 'blur' }
// ]
}
}
},
props: {
addActivityModal: Boolean,
id: String
},
watch: {
addActivityModal(val) {
this.dispalyModal = val
if(val === true && this.id) {
this.getActivityData()
}
},
},
mounted() {
},
methods: {
addActivityInput() {
this.inputActivityList.push({
value1: '',
value2: ''
})
},
delActivityInput(index) {
this.inputActivityList.splice(index,1)
},
cancel() {
this.inputActivityList = []
this.formValidate.appId = ''
this.formValidate.activityDsc = ''
this.formValidate.activityName = ''
this.formValidate.uri = ''
this.dispalyModal = false
this.$emit("dispalyAddActivityModal", false, false)
},
getActivityData() {
let that = this
let data = {
id: that.id
}
ActivityManager.getActivityInfo(data, function (data) {
that.inputActivityList = []
that.formValidate.appId = data.data.results.appId
that.formValidate.activityDsc = data.data.results.description
that.formValidate.activityName = data.data.results.name
that.formValidate.uri = data.data.results.uri
data.data.results.params.forEach(item => {
that.inputActivityList.push({
value1: item.name,
value2: item.description
})
})
})
},
uploadImgSuccess(res, file) {
debugger
this.imageName = file.name
},
handleBeforeUpload(res, file) {
let data = new FormData()
data.append('file', res.name)
ActivityManager.uploadImg(data, function (data) {
})
},
next() {
let that = this
this.$refs["formValidate"].validate((valid) => {
if (valid) {
let param = []
that.inputActivityList.forEach(element => {
param.push({
defaultVal: element.value1,
description: that.formValidate.activityDsc,
key: element.value2,
name: 1,
type: 2,
id: that.id
})
})
// param = JSON.stringify(param)
let data = {
appId: that.formValidate.appId,
image: that.imageName,
name: that.formValidate.activityName,
uri: that.formValidate.uri,
params: param,
isGetActivityInfo: true,
description: that.formValidate.activityDsc,
id: that.id
}
ActivityManager.addOreditActivity(data, function (data) {
console.log(data)
that.addActivityModal = false
that.$emit("dispalyAddActivityModal", false, true)
})
} else {
that.$Message.error('表单验证失败!');
}
})
}
}
}
</script>
<style scoped>
.inputClass{
width: 1000px;
}
.inputItem{
margin-top: 40px;
}
.topic{
margin-top: 100px;
}
</style>

@ -0,0 +1,98 @@
<template>
<div style="padding: 0 40px;">
<Form ref="formValidate" :model="formValidate" :label-width="80">
<Row>
<i-col span="15" offset="2">
<FormItem label="活动名称" prop="activityName">
<div>{{formValidate.activityName}}</div>
</FormItem>
<Form-item label="活动时间" prop="activityDate">
<div>{{formValidate.activityDate}}</div>
</Form-item>
<FormItem label="活动类型" prop="activityStyle">
<div>{{formValidate.activityStyle}}</div>
</FormItem>
<FormItem label="活动范围" prop="activityRange">
<div>
<span>{{formValidate.activityRange}}</span>
<span class="mr10">{{formValidate.activityCompanyNum}}家店铺</span>
<Button class="mr10" type="primary" @click="isDisplay">{{operate}}</Button>
</div>
<div v-if="displayActivityShopFlag==true" class="activityShopClass">
<div class="mr10" v-for="(item, index) in formValidate.activityShop" :key="index">
<Tag class="tagClass" color="blue">{{item.name}}</Tag>
</div>
</div>
</FormItem>
</i-col>
</Row>
</Form>
</div>
</template>
<script>
export default {
name: "useActivityStepFoure",
data() {
return {
formValidate: {
activityName: '红包活动',
activityDate: "2020/05/20-2020/0522",
activityStyle: '5元红包',
activityRange: '上海分公司',
activityCompanyNum: '35',
activityShop: [{
name: '店铺1'
},{
name: '店铺1'
},{
name: '店铺1'
},{
name: '店铺1'
},{
name: '店铺1'
},{
name: '店铺1'
},{
name: '店铺1'
},{
name: '店铺1'
},{
name: '店铺1'
}]
},
operate: '收起',
displayActivityShopFlag: false
}
},
mounted() {
},
methods: {
isDisplay() {
if(this.operate === '展开') {
this.operate = '收起'
this.displayActivityShopFlag = false
} else {
this.operate = '展开'
this.displayActivityShopFlag = true
}
}
}
}
</script>
<style scoped>
.activityShopClass {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.mr10 {
margin-left: 40px;
}
.tagClass {
width: 360px;
text-align: center;
}
</style>

@ -0,0 +1,75 @@
<template>
<div>
<Form ref="formValidate" :model="formValidate" :rules="ruleValidate" :label-width="80">
<Row>
<i-col span="15" offset="2">
<FormItem label="活动名称" prop="activityName">
<div>{{formValidate.activityName}}</div>
</FormItem>
<div class="dateClass">
<Form-item label="活动时间" prop="activityStartDate">
<Date-picker :value="formValidate.activityStartDate" format="yyyy-MM-dd" placeholder="请选择开始日期" style="width: 200px"></Date-picker>
</Form-item>
<div class="text"></div>
<Form-item label="" prop="activityEndDate">
<Date-picker :value="formValidate.activityEndDate" format="yyyy-MM-dd" placeholder="请选择结束日期" style="width: 200px"></Date-picker>
</Form-item>
</div>
<FormItem label="活动类型" prop="activityStyle">
<div v-for="(item, index) in formValidate.activityStyle" :key="index">
<i-input disabled type="text" v-model="item.tips" placeholder=""></i-input>
</div>
</FormItem>
</i-col>
</Row>
</Form>
</div>
</template>
<script>
export default {
name: "useActivityStepOne",
data() {
return {
formValidate: {
activityName: '红吧',
activityStartDate: '',
activityEndDate: '',
activityStyle: [{
tips: '11',
},{
tips: '11',
}],
},
ruleValidate: {
activityName: [
{ required: true, message: '活动名称不能为空', trigger: 'blur' }
],
activityStartDate: [
{ required: true, message: '开始时间不能为空', trigger: 'blur' }
],
activityEndDate: [
{ required: true, message: '结束时间不能为空', trigger: 'blur' }
],
activityStyle: [
{ required: true, message: '', trigger: 'blur' }
],
}
}
},
mounted() {
},
methods: {
}
}
</script>
<style scoped>
.dateClass {
display: flex;
justify-content: space-around;
}
.text {
position: relative;
left: 100px;
}
</style>

@ -0,0 +1,89 @@
<template>
<div style="padding: 0 40px;">
<div class="selectClass">
<Radio v-model="allSelect"></Radio>
<i-input icon="search" placeholder="请输入店铺名称或编码" style="width: 250px"></i-input>
</div>
<div class="companyTable">
<div class="companyListClass">
<div :class="isSelect[index] == true ? 'tagColorClass' : ''" class="tagClass" @click="selectTag(item,index)" v-for="(item, index) in companyList" :key="index" >{{item.name}}</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "useActivityStepThree",
data() {
return {
allSelect: false,
companyList: [{
name: '111'
},{
name: '111'
},{
name: '111'
},{
name: '111'
},{
name: '111'
},{
name: '111'
},{
name: '111'
}],
isSelect:[],
selectValue: []
}
},
mounted() {
this.companyList.forEach(element => {
this.isSelect.push('')
this.selectValue.push('')
});
},
methods: {
selectTag(value,index) {
this.isSelect.splice(index,1,!this.isSelect[index])
if(this.isSelect[index] === true) {
this.selectValue.splice(index, 1, value.id)
} else if(this.isSelect[index] === false) {
this.selectValue.splice(index, 1, '')
}
}
}
}
</script>
<style scoped>
.selectClass {
display: flex;
justify-content: space-between;
}
.companyTable {
width: 3150px;
height: 1000px;
border: 1px solid;
margin-top: 40px;
padding: 40px;
overflow:scroll;
}
.companyListClass {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.tagClass {
width: 31%;
margin-bottom: 30px;
height: 120px;
line-height: 120px;
border: 1px solid #e3e8ee!important;
color: #657180!important;
background: #fff;
padding: 0 12px;
}
.tagColorClass {
background: #6ac1d1;
}
</style>

@ -0,0 +1,79 @@
<template>
<div style="padding: 0 40px;">
<div class="selectClass">
<Radio v-model="allSelect"></Radio>
<i-input icon="search" placeholder="请输入零售公司名称或编码" style="width: 250px"></i-input>
</div>
<div class="companyTable">
<div class="companyListClass">
<div :class="companyColorIndex == index ? 'tagColorClass' : ''" class="tagClass" @click="selectTag(index)" v-for="(item, index) in companyList" :key="index" >{{item.name}}</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "useActivityStepTwo",
data() {
return {
allSelect: false,
companyList: [{
name: '111'
},{
name: '111'
},{
name: '111'
},{
name: '111'
},{
name: '111'
},{
name: '111'
},{
name: '111'
}],
companyColorIndex: -1
}
},
mounted() {
},
methods: {
selectTag(val) {
this.companyColorIndex = val
}
}
}
</script>
<style scoped>
.selectClass {
display: flex;
justify-content: space-between;
}
.companyTable {
width: 3150px;
height: 1000px;
border: 1px solid;
margin-top: 40px;
padding: 40px;
overflow:scroll;
}
.companyListClass {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.tagClass {
width: 31%;
margin-bottom: 30px;
height: 120px;
line-height: 120px;
border: 1px solid #e3e8ee!important;
color: #657180!important;
background: #fff;
padding: 0 12px;
}
.tagColorClass {
background: #6ac1d1;
}
</style>

@ -0,0 +1,68 @@
<template>
<Modal v-model="useModal" @on-cancel="cancel" width="1000">
<Steps style="padding: 40px;" :current="currentStep">
<Step title="基本信息" content=""></Step>
<Step title="选择零售公司" content=""></Step>
<Step title="选择店铺" content=""></Step>
<Step title="确认信息" content=""></Step>
</Steps>
<useActivityStepOne v-if="currentStep==0"></useActivityStepOne>
<useActivityStepTwo v-if="currentStep==1"></useActivityStepTwo>
<useActivityStepThree v-if="currentStep==2"></useActivityStepThree>
<useActivityStepFoure v-if="currentStep==3"></useActivityStepFoure>
<div slot="footer">
<Button v-if="currentStep!==0" type="primary" shape="circle" :loading="modal_loading" @click="back"></Button>
<Button v-if="currentStep!==3" type="primary" shape="circle" :loading="modal_loading" @click="next"></Button>
<Button v-if="currentStep==3" type="primary" shape="circle" :loading="modal_loading" @click="finish"></Button>
</div>
</Modal>
</template>
<script>
import useActivityStepOne from './useActivityStepOne'
import useActivityStepTwo from './useActivityStepTwo'
import useActivityStepThree from './useActivityStepThree'
import useActivityStepFoure from './useActivityStepFoure'
export default {
name: "useTable",
components: {
useActivityStepOne,
useActivityStepTwo,
useActivityStepThree,
useActivityStepFoure
},
data() {
return {
currentStep: 0,
modal_loading: false,
}
},
props: {
useModal: Boolean
},
watch: {
useModal(val) {
this.useModal = val
}
},
mounted() {
console.log(this.useModal)
},
methods: {
cancel() {
this.$emit("dispalyuseModal", false, false)
},
next() {
this.currentStep = this.currentStep + 1
},
back() {
this.currentStep = this.currentStep - 1
},
finish() {
}
}
}
</script>
<style scoped>
</style>

@ -0,0 +1,45 @@
/**
* 登录 server层
* @author yuankai
* @date 2020/05/19
*/
import http from '../CommonHttp'
/**
* 活动池列表
* @param params 参数
* @param call 成功的回调
* @returns {Promise<any>} 返回Promise对象
*/
export function getActivityList(params, call) {
return http.get('/activity/schedule/list/all', params).then(call)
}
/**
* 新增或修改活动池
*/
export function addOreditActivity(params, call) {
return http.post('/activity/schedule/save',params).then(call)
}
/**
* 获取活动池详情
*/
export function getActivityInfo(params, call) {
return http.get('/activity/schedule/detail',params).then(call)
}
/**
* 上传图片
*/
export function uploadImg(params, call) {
return http.post('/upload',params).then(call)
}
export default {
getActivityList,
addOreditActivity,
getActivityInfo,
uploadImg
}

@ -26,11 +26,16 @@ axios.interceptors.request.use((config) => {
//在发送请求之前做某件事
if(config.method === 'post'){
if(config.data.isGetActivityInfo === true) {
config.headers['Content-Type'] = 'application/json;charset=UTF-8;';
} else if (Object.prototype.toString.call(config.data) === '[object FormData]') {
config.headers['Content-Type'] = 'multipart/form-data';
} else {
config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
var str = qs.stringify(config.data);
config.data = str;
}
}
return config;
},(error) =>{
// console.log('错误的传参')

@ -30,7 +30,8 @@ module.exports = {
/* 使用代理 后台接口路径 */
// proxy: 'http://192.168.1.123:8312/'
// proxy: 'http://192.168.31.177:8312/'
proxy: 'http://localhost:8312/'
// proxy: 'http://localhost:8312/'
proxy: 'http://111.231.218.44:8080/'
// proxy: 'http://jdxdev.vipgz4.idcfengye.com/'
},
chainWebpack: config => {

Loading…
Cancel
Save