Commit 08f96dec by zhangmeng

Merge branch 'dev'

* dev:
  迭代2
  xxx
  bug

# Conflicts:
#	dist/index.html
parents 41ff0d1d 29e88a1e
File deleted
<<<<<<< HEAD
<<<<<<< HEAD
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/css/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link href=/marketing/static/css/app.1d82a5a6816bc5796024ca95599baea5.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/marketing/static/js/manifest.0a85049e489e85ac5f0a.js></script><script type=text/javascript src=/marketing/static/js/vendor.ad484ea676beca0f8899.js></script><script type=text/javascript src=/marketing/static/js/app.6cd6b648b1cc6a8c6f5b.js></script></body></html>
=======
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/css/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link href=/marketing/static/css/app.50b60f2ce454775a58f1431c490672f6.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/marketing/static/js/manifest.0a85049e489e85ac5f0a.js></script><script type=text/javascript src=/marketing/static/js/vendor.3e2a22ee87104fc44e91.js></script><script type=text/javascript src=/marketing/static/js/app.8c9725cbbb69439066e5.js></script></body></html>
>>>>>>> dev
=======
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/css/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link href=/marketing/static/css/app.9f60c06f301b140b6f29573a1992aa4f.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/marketing/static/js/manifest.0a85049e489e85ac5f0a.js></script><script type=text/javascript src=/marketing/static/js/vendor.131eaee23561dd7a1016.js></script><script type=text/javascript src=/marketing/static/js/app.3e55d4c39d068c877dd6.js></script></body></html>
>>>>>>> dev
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -132,6 +132,13 @@
margin-right:8px;
display: inline-block;
}
.table__avatar--40{
width: 40px;
height: 40px;
border-radius: 4px;
margin-right:8px;
display: inline-block;
}
.fw500 {
font-weight: 500;
......
......@@ -2,7 +2,7 @@
<el-popover placement="top-start" width="400" height="180" trigger="hover" @show="getSingleInfo">
<div class="pointer" @click="linkDetail">
<div class="singelinfo">
<div class="singelinfo-img"><img width="100" height="100" :src="singleInfo.thirdImgUrl || defaultAvatar" alt=""></div>
<div class="singelinfo-img"><img width="100" height="100" :src="filterAvatar(row.imageUrl)" alt=""></div>
<div class="singelinfo-content pl10 pr10">
<span class="lheigt">{{ singleInfo.memberName }}
<img :title="singleInfo.status == 0 ? '取消关注公众号' : singleInfo.status == 1 ? '已关注公众号' : '未关注公众号'" class="fr"
......@@ -30,7 +30,7 @@
</div>
<span slot="reference">
<a :href="'/member/#/wechatmemberDetail?memberId='+ row.memberId" target="_blank">
<img class="vertical-middle table__avatar" :src="filterAvatar(row.imageUrl)" width="60" height="60" alt="" srcset="">
<img class="vertical-middle table__avatar--40" :src="filterAvatar(row.imageUrl)" width="40" height="40" alt="" srcset="">
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{row.memberName || '--'}}</p>
<p class="table-name--ellipsis fz13">{{row.cardNum || '--'}}</p>
......
......@@ -151,7 +151,7 @@
// }
this.textarea=val;
var reg = /<a\s+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
var reg = /<a[^>]+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
if(reg.exec(this.textarea)!=null){
this.cancelLink=true;
}
......@@ -176,7 +176,7 @@
},
methods: {
oldCancelLink(){
var reg = /<a\s+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g; // 判断是否有 <a href=""></a>
var reg = /<a[^>]+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g; // 判断是否有 <a href=""></a>
if(reg.exec(this.textarea)!=null){
this.cancelLink=true;
}
......@@ -274,7 +274,7 @@
this.$message.error('最多300个字符哦');
// return;
}
var reg = /<a\s+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
var reg = /<a[^>]+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
if(reg.exec(this.textarea)!=null){
this.cancelLink=true;
}else{
......
......@@ -17,7 +17,7 @@ import vueGicCard from '@gic-test/vue-gic-card'
import vueGicStore from '@gic-test/vue-gic-store'
import vueGicStoreLinkage from '@gic-test/vue-gic-store-linkage/src/lib'
import vueGicStoreGroup from '@gic-test/vue-gic-store-group'
import vueGicPeople from '@gic-test/vue-gic-people/src/lib'
import vueGicPeople from '@gic-test/vue-gic-people'
import vueGicConfirmPeople from '@gic-test/vue-gic-confirm-people/src/lib'
import vueGicImgPreview from '@gic-test/vue-gic-img-preview'
// import vueGicMarketingEvent from '@gic-test/vue-gic-marketing-event'
......
......@@ -127,7 +127,7 @@
beforeMount() {
var that = this
var host = window.location.origin;
console.log("当前host:",host)
// console.log("当前host:",host)
if (host.indexOf('localhost') != '-1') {
that.baseUrl = 'http://gicdev.demogic.com';
}else {
......@@ -137,7 +137,7 @@
methods:{
handleCurrentChangeTable(val) { // 当前格发生变化时触发
var that = this
console.log("table: ",val);
// console.log("table: ",val);
if (!val.disabled) {
that.radio = val.coupCardId;
that.currentRow = val;
......@@ -146,7 +146,7 @@
// 页码变化
cardSizeChange(val){ // 选择分页符
console.log(`每页 ${val} 条`);
// console.log(`每页 ${val} 条`);
},
// 当前页变化
......
......@@ -259,6 +259,7 @@
}
.dm-store__type__item {
display: block;
height: 34px;
line-height: 34px;
padding: 0 10px;
......
......@@ -4,7 +4,7 @@
<div class="dm-store__left">
<div class="dm-store__state">
<el-checkbox v-model="params.isAll" :true-label="1" :false-label="0" @change="handleCheckAllChange">所有门店</el-checkbox>
<span class="fz13">{{params.isAll?leftTotal:leftCheckList.length}}/{{leftTotal}}</span>
<span class="fz13">{{computedLeftCount}}/{{leftTotal}}</span>
</div>
<div class="dm-store__search">
<el-input v-model="leftValue" placeholder="请输入标签名称" prefix-icon="el-icon-search" @change="getLeftList"></el-input>
......@@ -92,12 +92,21 @@ export default {
moreLoading:false
}
},
computed:{
computedLeftCount() {
if (this.params.isAll) {
let minuend = this.leftList.length - this.leftCheckList.length;
return this.leftTotal - minuend;
} else {
return this.leftList.map(v => {
return this.leftCheckList.includes(v.tagId);
}).filter(v => v).length;
}
}
},
created() {
this.getLeftList();
this.rightParams.currentPage = 1;
this.getRightList().then(res => {
this.rightList = res;
})
this.rightSearch();
},
methods:{
// 右侧搜索
......
<template>
<el-popover class="vertical-baseline" placement="bottom-start" width="214" trigger="click">
<el-checkbox-group v-model="checkedList" @change="saveToRight">
<div class="dm-store__type__item" v-for="(v,i) in typeList" :key="i">
<label :name="v.value" class="dm-store__type__item" v-for="(v,i) in typeList" :key="i">
<el-checkbox :label="v.value">{{v.label}}</el-checkbox>
</div>
</label>
</el-checkbox-group>
<div class="el-input dm-store__reference w240" slot="reference">
<div class="el-input__inner dm-store__inputtag">
......
import qs from 'qs';
import axios from 'axios';
const host = window.location.origin;
const host = window.location.origin;
const PREFIX = '/api-marketing/'
const PLUG_PREFIX = '/api-plug/'
// 加载最小时间
const MINI_TIME = 300
// 超时时间
// 超时时间
let TIME_OUT_MAX = 20000
// 环境value
// 环境value
let _isDev = process.env.NODE_ENV === 'development'
// 请求接口host
// 请求接口host
let _apiHost = host.indexOf('localhost') !== -1 ? 'http://gicdev.demogic.com' : host
// 请求组(判断当前请求数)
// 请求组(判断当前请求数)
let _requests = []
//创建一个请求实例
const instance = axios.create({
baseURL: _apiHost,
timeout: TIME_OUT_MAX,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
baseURL: _apiHost,
timeout: TIME_OUT_MAX,
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
withCredentials: true // 允许携带cookie
})
/**
......@@ -29,8 +29,8 @@ const instance = axios.create({
* @param {请求配置} config
*/
function pushRequest(config) {
console.log(`${config.url}--begin`)
_requests.push(config)
console.log(`${config.url}--begin`)
_requests.push(config)
}
/**
......@@ -38,124 +38,130 @@ function pushRequest(config) {
* @param {请求配置} config
*/
function popRequest(config) {
console.log(`${config.url}--end`)
let _index = _requests.findIndex(r => {
return r === config
})
if (_index > -1) {
_requests.splice(_index, 1)
}
console.log(`${config.url}--end`)
let _index = _requests.findIndex(r => {
return r === config
})
if (_index > -1) {
_requests.splice(_index, 1)
}
}
/**
* 错误的处理
* @param {*} code
* @param {string} [message='请求错误']
*/
function handlerErr(code,message = '请求错误') {
switch (code) {
case 404:
message = '404,错误请求'
router.push('/404')
break;
case 401:
message = '登录失效'
break;
case 403:
message = '禁止访问'
router.push('/403')
break;
case 408:
message = '请求超时'
break;
case 500:
message = '服务器内部错误'
// router.push('/500')
break;
case 501:
message = '功能未实现'
break;
case 503:
message = '服务不可用'
break;
case 504:
message = '网关错误'
break;
}
this.$message({type:'warning',message:message})
function handlerErr(code, message = '请求错误') {
switch (code) {
case 404:
message = '404,错误请求'
router.push('/404')
break;
case 401:
message = '登录失效'
break;
case 403:
message = '禁止访问'
router.push('/403')
break;
case 408:
message = '请求超时'
break;
case 500:
message = '服务器内部错误'
// router.push('/500')
break;
case 501:
message = '功能未实现'
break;
case 503:
message = '服务不可用'
break;
case 504:
message = '网关错误'
break;
}
this.$message({ type: 'warning', message: message })
}
/**
* 请求地址,请求数据,是否静默,请求方法
*/
const requests = (url, data = {},contentTypeIsJSON = false, isSilence = false, method = 'POST') => {
let _opts = { method, url }
const _query = {}
let _timer = null
if (method.toLocaleUpperCase() === 'POST') {
if (contentTypeIsJSON) {
_opts.data = data;
_opts.headers = {'Content-Type': 'application/json'};
_opts.url += '?requestProject=marketing';
} else {
_opts.data = qs.stringify(Object.assign({requestProject:'gic-web'},data))
}
} else {
_opts.params = _query
}
return new Promise((resolve, reject) => {
let _random = { stamp: Date.now(), url: `${_apiHost + url}` }
if (!isSilence) {
_timer = setTimeout(() => {
pushRequest(_random)
}, MINI_TIME)
}
instance(_opts)
.then(res => {
clearTimeout(_timer)
popRequest(_random)
if (res.data.errorCode !== 0) {
reject(res);
handlerErr(res.data.errorCode,res.data.message);
const requests = (url, data = {}, contentTypeIsJSON = false, isSilence = false, method = 'POST') => {
let _opts = { method, url }
const _query = {}
let _timer = null
if (method.toLocaleUpperCase() === 'POST') {
if (contentTypeIsJSON) {
_opts.data = data;
_opts.headers = { 'Content-Type': 'application/json' };
_opts.url += '?requestProject=marketing';
} else {
_opts.data = qs.stringify(Object.assign({ requestProject: 'gic-web' }, data))
}
} else {
resolve(res.data)
_opts.params = _query
}
})
.catch(res => {
clearTimeout(_timer)
popRequest(_random)
if (res) {
handlerErr(res.response.status,'接口异常')
}
reject(res)
})
})
}
// 获取营销事件配置信息(类型, 最大条数)
export const getMarketingEvent = (params) => requests( PREFIX + 'get-marketing-event', params);
return new Promise((resolve, reject) => {
let _random = { stamp: Date.now(), url: `${_apiHost + url}` }
if (!isSilence) {
_timer = setTimeout(() => {
pushRequest(_random)
}, MINI_TIME)
}
instance(_opts)
.then(res => {
clearTimeout(_timer)
popRequest(_random)
if (res.data.errorCode !== 0) {
reject(res);
handlerErr(res.data.errorCode, res.data.message);
} else {
resolve(res.data)
}
})
.catch(res => {
clearTimeout(_timer)
popRequest(_random)
if (res) {
handlerErr(res.response.status, '接口异常')
}
reject(res)
})
})
}
// 获取营销事件配置信息(类型, 最大条数)
export const getMarketingEvent = (params) => requests(PREFIX + 'get-marketing-event', params);
//素材库 图文 图文分页列表
export const loadImgTextList = (params) => requests( PREFIX + 'page-marketing-wechat-image-text', params);
export const loadImgTextList = (params) => requests(PREFIX + 'page-marketing-wechat-image-text', params);
//获取卡券列表
export const getCardList = (params) => requests(PLUG_PREFIX + 'get-coupon-list', params);
//素材库--图片--图片分页列表
export const loadImgList = (params) => requests( PREFIX + 'page-marketing-wechat-image', params);
export const loadImgList = (params) => requests(PREFIX + 'page-marketing-wechat-image', params);
//素材库--图片--编辑图片名称
export const updateImgName = (params) => requests( PREFIX + 'update-marketing-wechat-image-titlename', params);
export const updateImgName = (params) => requests(PREFIX + 'update-marketing-wechat-image-titlename', params);
//素材库--图片--新建图片分组
export const addGroupService = (params) => requests( PREFIX + 'save-marketing-wechat-image-group', params);
export const addGroupService = (params) => requests(PREFIX + 'save-marketing-wechat-image-group', params);
//素材库--图片--修改图片分组
export const updateGroupName = (params) => requests( PREFIX + 'update-marketing-wechat-image-group', params);
//素材库--图片--删除图片分组
export const deleteGroupService = (params) => requests( PREFIX + 'delete-marketing-wechat-image-group', params);
// 智能营销--ECM营销引擎-- 新建/修改 --回显营销事件类型详情
export const getMarketingTypeDetails = (params) => requests( PREFIX + 'get-marketing-type-details', params);
export const getMarketingTypeDetails = (params) => requests(PREFIX + 'get-marketing-type-details', params);
// 智能营销--新增/修改营销事件类型
export const saveUpdateMarketingType = (params) => requests( PREFIX + 'save-update-marketing-type', params);
export const saveUpdateMarketingType = (params) => requests(PREFIX + 'save-update-marketing-type', params);
// 智能营销 --删除营销事件
export const deleteMarketingType = (params) => requests( PREFIX + 'delete-marketing-Type', params);
export const deleteMarketingType = (params) => requests(PREFIX + 'delete-marketing-Type', params);
//模板库--分页列表 (有效)
export const LoadTempList = (params) => requests(PREFIX + 'load-message-templateList', params);
......@@ -249,7 +249,7 @@
background: rgba(0,0,0,0.5);
text-align: center;
color: #fff;
line-height: 290px;
line-height: 90px;
cursor: pointer;
z-index:9;
}
......@@ -379,19 +379,18 @@
.dm-card__item__title {
vertical-align: middle;
margin-left: 8px;
max-width: 100px;
max-width: 200px;
font-size: 16px;
font-weight: 500;
line-height: 30px;
color: #fff;
overflow: hidden;
text-overflow: ellipsis;
}
.dm-card__item__desc{
vertical-align: middle;
margin-left: 8px;
max-width: 100px;
max-width: 200px;
font-size: 12px;
line-height: 20px;
color: #fff;
......
<template>
<div class="dm-imgText__item__wrap" >
<div v-for="(v,i) in item.itemList" :key="i">
<div class="dm-imgText__item" v-if="i === 0" @mouseover="v.maskShow = true" @mouseout="v.maskShow = false">
<div v-show="v.maskShow" class="dm-imgText__item__mask" @click="window.open(v.mediaUrl)">预览文章</div>
<div class="dm-imgText__item" v-if="i === 0" @mouseover="itemMouseover(v)" @mouseout="itemMouseout(v)">
<div class="dm-imgText__item__mask" v-if="v.maskShow" @click="preview(v)">预览文章</div>
<p class="ellipsis-l2">{{v.titleName}}</p>
<img :src="v.qcloudImageUrl || loadErrorImg" alt="" srcset="">
<p class="ellipsis fz13 gray-color">{{v.remark}}</p>
</div>
<div class="dm-imgText__item__other clearfix" v-else @mouseover="v.maskShow = true" @mouseout="v.maskShow = false">
<div v-show="v.maskShow" class="dm-imgText__item__other__mask" @click="window.open(v.mediaUrl)">预览文章</div>
<div class="dm-imgText__item__other clearfix" v-else @mouseover="itemMouseover(v)" @mouseout="itemMouseout(v)">
<div v-if="v.maskShow" class="dm-imgText__item__other__mask" @click="preview(v)">预览文章</div>
<img :src="v.qcloudImageUrl || loadErrorImg" alt="" srcset="">
<p class="ellipsis-l2">{{v.titleName}}</p>
</div>
......@@ -37,10 +37,21 @@ export default {
},
created() {
if (this.item.itemList instanceof Array) {
this.item.itemList.forEach(v => {
v.maskShow = false
this.item.itemList.forEach((v,i) => {
this.$set(this.item.itemList,i,{...v,maskShow:false})
})
}
},
methods:{
preview(item) {
window.open(item.mediaUrl);
},
itemMouseover(item) {
item.maskShow = true;
},
itemMouseout(item) {
item.maskShow = false;
}
}
}
</script>
......
......@@ -11,7 +11,7 @@
<el-button @click="refresh">刷新列表</el-button>
</div>
</div>
<el-table tooltipEffect="light" :data="tableList" :height="360" style="width: 100%" v-loading="loading" @row-click="rowClick">
<el-table tooltipEffect="light" :data="tableList" :height="360" row-class-name="cursor-pointer" style="width: 100%" v-loading="loading" @row-click="rowClick">
<el-table-column :show-overflow-tooltip="false" width="60" align="center" prop="coupCardId">
<template slot-scope="scope">
<div class="sms-record_left label-hidden">
......@@ -29,7 +29,7 @@
<el-table-column :show-overflow-tooltip="false" :width="100" align="left" prop="couponStock" label="库存"></el-table-column>
<el-table-column :show-overflow-tooltip="true" align="left" prop="subName" label="描述"></el-table-column>
</el-table>
<el-pagination v-show="tableList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="total, prev, pager, next" :total="total"></el-pagination>
<el-pagination v-show="tableList.length" class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="prev, pager, next" :total="total"></el-pagination>
<span slot="footer" class="dialog-footer">
<el-button @click="close">关 闭</el-button>
<el-button type="primary" @click="addItem">确 定</el-button>
......@@ -119,7 +119,7 @@ export default {
this.close();
},
add() {
winodw.open('/marketing/#/card/add');
window.open('/marketing/#/card/add');
},
refresh() {
this.listParams.currentPage = 1;
......
......@@ -9,7 +9,10 @@
</nav>
<article class="fr">
<div class="dm-ilib-header">
<h4>{{listParams.wechatImageGroupId?currentGroup.groupName:'所有图片'}}</h4>
<h4>{{listParams.wechatImageGroupId?currentGroup.groupName:'所有图片'}}
<i v-if="listParams.wechatImageGroupId" class="el-icon-edit" @click="editGroup"></i>
<i v-if="listParams.wechatImageGroupId" class="el-icon-delete" @click="delGroup"></i>
</h4>
<div class="dm-ilib-opt_right">
<span class="fz12 gray pr10">大小不超过2M</span>
<label class="el-button el-button--primary el-button--small" :class="{'is-disabled':upLoadDisabled}">{{upLoadDisabled?'上传中...':'上传图片'}}
......@@ -27,7 +30,7 @@
</div>
</label>
</el-checkbox-group>
<el-pagination v-show="imgList.length" background class="dm-pagination imglib-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></el-pagination>
<el-pagination v-show="imgList.length" class="dm-pagination imglib-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="prev, pager, next" :total="total"></el-pagination>
</article>
</div>
<span slot="footer" class="dialog-footer">
......@@ -38,7 +41,7 @@
</template>
<script>
import {loadImgList,addGroupService} from '../assets/api.js';
import {loadImgList,addGroupService,updateGroupName,deleteGroupService} from '../assets/api.js';
export default {
name:'lib-img',
props:{
......@@ -151,6 +154,51 @@ export default {
}
this.$emit('sendItem',this.selectedData);
this.close();
},
//删除分组
delGroup() {
this.$confirm('是否删除该分组?', '提示', {
confirmButtonText: '确定',
cancelBUttonText: '取消',
type: 'warning'
}).then(() => {
this.deleteGroupService();
}).catch(() => {
this.$tips({type: 'info',message: '已取消删除'});
});
},
async deleteGroupService() {
try {
let res = await deleteGroupService({wechatImageGroupId:this.listParams.wechatImageGroupId});
this.$tips({type: 'success',message: '删除分组成功!'});
this.listParams.wechatImageGroupId = '';
this.loadImgList();
} catch (err) {
this.$tips({type: 'error',message: '删除分组失败!'});
}
},
//编辑分组
editGroup() {
this.$prompt('', '修改分组名称', {
confirmButtonText: '确定',
cancelBUttonText: '取消',
inputPattern: /\S/,
inputPlaceholder:'请输入新名称',
inputErrorMessage: '名称不能为空',
inputValue:this.currentGroup.groupName,
}).then(({ value }) => {
this.updateGroupName(value);
}).catch(() => {
this.$tips({
type: 'info',
message: '取消修改'
});
});
},
async updateGroupName(val) {
let res = await updateGroupName({wechatImageGroupId:this.listParams.wechatImageGroupId,groupName:val});
this.$tips({type: 'success',message: '修改成功'});
this.loadImgList();
}
}
}
......@@ -178,9 +226,16 @@ export default {
line-height: 50px;
font-size: 16px;
i{
font-size: 20px;
font-size: 16px;
padding-left:10px;
cursor: pointer;
color:#909399;
&.el-icon-edit:hover{
color:#1890ff;
}
&.el-icon-delete:hover{
color:#f5222d;
}
}
}
}
......
......@@ -7,7 +7,7 @@
<el-button @click="refresh">刷新列表</el-button>
</div>
</div>
<el-table tooltipEffect="light" :data="smsTempList" style="width: 100%" v-loading="loading" @row-click="rowClick">
<el-table tooltipEffect="light" :data="smsTempList" style="width: 100%" row-class-name="cursor-pointer" v-loading="loading" @row-click="rowClick">
<el-table-column :show-overflow-tooltip="false" :width="60" align="center" prop="smsTemplateId">
<template slot-scope="scope">
<div class="label-hidden">
......@@ -27,13 +27,14 @@
</template>
</el-table-column>
</el-table>
<el-pagination v-show="smsTempList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></el-pagination>
<el-pagination v-show="smsTempList.length" class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="prev, pager, next" :total="total"></el-pagination>
<span slot="footer" class="dialog-footer">
<el-button @click="close">关 闭</el-button>
<el-button type="primary" @click="addItem">确 定</el-button>
</span>
</el-dialog>
</template>
<script>
import { LoadTempList } from '../assets/api.js';
export default {
......@@ -45,7 +46,7 @@ export default {
}
},
data(){
return {
return{
listParams:{
search:'',
currentPage:1,
......@@ -94,7 +95,7 @@ export default {
this.$emit('update:show',false);
},
add() {
winodw.open('/marketing/#/message/temp/add');
window.open('/marketing/#/message/temp/add');
},
refresh() {
this.listParams.currentPage = 1;
......
......@@ -8,20 +8,20 @@
</div>
</div>
<el-radio-group class="dm-imgtext-list" v-model="selectedData" v-loading="loading">
<el-table tooltipEffect="light" :data="textImgList" height="360" style="width: 100%" @row-click="rowClick">
<el-table tooltipEffect="light" :data="textImgList" height="360" style="width: 100%" row-class-name="cursor-pointer" @row-click="rowClick">
<el-table-column label="" align="center" width="55px">
<template slot-scope="scope" >
<div class="label-hidden"><el-radio :label="scope.row"></el-radio></div>
</template>
</el-table-column>
<el-table-column label="图片" align="left" width="120px">
<el-table-column label="图片" align="left" width="120px" class-name="table-img">
<template slot-scope="scope" >
<img width="100" height="50" :src="scope.row.itemList.length?(scope.row.itemList[0].qcloudImageUrl || ''):''" alt="">
<img width="100" height="50" class="border-radius__default" :src="scope.row.itemList.length?(scope.row.itemList[0].qcloudImageUrl || ''):''" alt="">
</template>
</el-table-column>
<el-table-column label="图文标题" align="left" min-width="100px">
<template slot-scope="scope" >
<a class="blue ellipsis-l3" :href="scope.row.itemList.length?(scope.row.itemList[0].mediaUrl || ''):''" target="_blank">{{scope.row.itemList.length?(scope.row.itemList[0].titleName || ''):''}}</a>
<a class="blue" :href="scope.row.itemList.length?(scope.row.itemList[0].mediaUrl || ''):''" target="_blank">{{scope.row.itemList.length?(scope.row.itemList[0].titleName || ''):''}}</a>
</template>
</el-table-column>
<el-table-column label="作者" prop="updateTimeStr" align="left" width="120px">
......@@ -36,7 +36,7 @@
</el-table-column>
</el-table>
</el-radio-group>
<el-pagination v-show="textImgList.length" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="total, sizes, prev, pager, next" :total="total"></el-pagination>
<el-pagination v-show="textImgList.length" class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="prev, pager, next" :total="total"></el-pagination>
<span slot="footer" class="dialog-footer">
<el-button @click="close">关 闭</el-button>
<el-button type="primary" @click="addItem">确 定</el-button>
......
......@@ -157,6 +157,7 @@
watch:{
show(val) {
this.textarea = '';
this.cancelLink = false;
this.copyObj = {};
if (val && this.item.ecmMarketingTypeRelationId) {
console.log('编辑',this.item);
......@@ -164,7 +165,7 @@
this.copyObj = JSON.parse(JSON.stringify(this.item))
// console.log(this.item)
this.textarea = this.copyObj.content;
var reg = /<a\s+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
var reg = /<a[^>]+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
if(reg.exec(this.textarea)!=null){
this.cancelLink = true;
}
......@@ -190,23 +191,23 @@
},
methods: {
oldCancelLink(){
var reg = /<a\s+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g; // 判断是否有 <a href=""></a>
var reg = /<a[^>]+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g; // 判断是否有 <a href=""></a>
if(reg.exec(this.textarea)!=null){
this.cancelLink=true;
}
},
textInput(v,e){ // 控制微信文本的文字
var textContent = this.$refs.myTextarea.innerText;
textContent = strLength.getByteVal2(e.target.innerText);
this.textNum = strLength.getZhLen(textContent);
textContent = getByteVal2(e.target.innerText);
this.textNum = getZhLen(textContent);
if(this.textNum>=300){
this.$message.error('最多300个字符哦');
}
},
toInput(value,e) { // 控制字符数量
var that = this;
that.form.text = strLength.getByteVal(e.target.value,that.inputLength);
that.inputNum = strLength.getZhLen(that.form.text);
that.form.text = getByteVal(e.target.value,that.inputLength);
that.inputNum = getZhLen(that.form.text);
},
beforeAvatarUpload(file) {
// console.log(file)
......@@ -266,8 +267,8 @@
this.textarea = this.$refs.myTextarea.innerText;
this.xcxUrlObj.textarea = this.textarea;
var textContent = strLength.getByteVal2(this.textarea);
this.textNum = strLength.getZhLen(textContent);
var textContent = getByteVal2(this.textarea);
this.textNum = getZhLen(textContent);
this.xcxUrlObj.textNum = this.textNum;
if(this.form.linkStyle==0){ // 文本链接
......@@ -281,14 +282,14 @@
this.textarea = this.$refs.myTextarea.innerHTML;
this.xcxUrlObj.textarea = this.textarea;
var textContent = strLength.getByteVal2(this.$refs.myTextarea.innerText);
this.textNum = strLength.getZhLen(textContent);
var textContent = getByteVal2(this.$refs.myTextarea.innerText);
this.textNum = getZhLen(textContent);
this.xcxUrlObj.textNum = this.textNum;
if(this.textNum>=300){
this.$message.error('最多300个字符哦');
// return;
}
var reg = /<a\s+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
var reg = /<a[^>]+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
if(reg.exec(this.textarea)!=null){
this.cancelLink=true;
}else{
......@@ -311,8 +312,8 @@
this.textarea = this.textarea + '<a href="'+this.form.url+'">'+this.form.text+'</a>';
this.xcxUrlObj.textarea = this.textarea;
var textContent = strLength.getByteVal2(this.$refs.myTextarea.innerText);
this.textNum = strLength.getZhLen(textContent);
var textContent = getByteVal2(this.$refs.myTextarea.innerText);
this.textNum = getZhLen(textContent);
this.xcxUrlObj.textNum = this.textNum;
var xcxObj = {};
......@@ -404,8 +405,8 @@
self.xcxUrlObj.textarea = self.textarea;
self.xcxUrlObj.imageMediaId = '';
var textContent = strLength.getByteVal2(self.$refs.myTextarea.innerText);
self.textNum = strLength.getZhLen(textContent);
var textContent = getByteVal2(self.$refs.myTextarea.innerText);
self.textNum = getZhLen(textContent);
self.xcxUrlObj.textNum = self.textNum;
// self.xcxUrlObj.wechatContent = null;
......@@ -435,8 +436,8 @@
self.xcxToolObj.imageMediaId = self.imageMediaId;
self.xcxToolObj.wechatContent = self.wechatContent;
var textContent = strLength.getByteVal2(self.$refs.myTextarea.innerText);
self.textNum = strLength.getZhLen(textContent);
var textContent = getByteVal2(self.$refs.myTextarea.innerText);
self.textNum = getZhLen(textContent);
self.xcxUrlObj.textNum = self.textNum;
self.xcxToolObj.comName = 'text';
}
......@@ -447,11 +448,43 @@
return;
}
this.$emit('sendItem',JSON.parse(JSON.stringify({
let sendValue = JSON.parse(JSON.stringify({
...this.xcxUrlObj,
...this.copyObj,
content:this.xcxUrlObj.textarea
})))
}));
if(sendValue.textNum > 300){
this.$tips({type:'warning',message:'最多300个字符哦'});
return;
}else{
var reg = /<(?!(a|\/a|div|\/div|br)).*?>/img ; // 只保留a 和 div 标签
var str = sendValue.content.replace(reg,"");
var str1 = str.replace(/<\/div>|&nbsp;/g,"");
var str2 = str1.replace(/<((div)).*?>/g,"<br>");
var str3 = str2.split('<br>').filter(v=>v).join('<br>');
var hrefReg = /href=['"]([^"]*)['"].*?/g
// var hrefReg = /(?<=href=\").*?(?=\")/img; // 获取a标签的href值
if(hrefReg.test(str3)){
var hrefArr = str3.match(hrefReg);
if(hrefArr.length>1){
this.$tips({type:'warning',message:'只能添加一个链接'});
return
}
var href = str3.match(hrefReg)[0];
str3 = str3.replace(/<((a)).*?>/g,'<a '+href+'">'); // 获取 <a> 并替代
}
if(str3 == '' ){
this.$tips({type:'warning',message:'请输入回复内容'});
return;
}else{
sendValue.content = str3
}
}
this.$emit('sendItem',sendValue);
this.close();
},
close() {
......@@ -514,6 +547,8 @@
font-size: 14px;
box-sizing: border-box;
line-height: 1.3;
overflow-y: auto;
height: 200px;
a{
color: #1890ff
}
......@@ -521,6 +556,11 @@
color: #1890ff
}
}
.text-num {
position: absolute;
top: 0;
right: 6px;
}
}
}
}
......
import marketingEvent from "./index.vue";
const gicMarketingEvent = {
install(Vue, options) {
Vue.component(marketingEvent.name, marketingEvent)
}
}
if (typeof window !== 'undefined' && window.Vue) {
window.Vue.use(gicMarketingEvent);
}
export default gicMarketingEvent;
\ No newline at end of file
<template>
<section class="dm-marketing">
<!-- 操作区 -->
<div class="dm-marketing__opt--wrap">
<div class="dm-marketing__opt--wrap" v-if="list.length === 0">
<span class="dm-marketing__opt--label">添加内容</span>
<i class="el-icon-plus dm-marketing__opt--icon"></i>
<opt @addItem="addItem" :options="options"></opt>
<i class="el-icon-plus dm-marketing__opt--icon" @click="optTopShow = !optTopShow"></i>
<transition name="fade">
<opt @addItem="addItem" :options="options" v-if="optTopShow"></opt>
</transition>
</div>
<!-- item组件区 -->
<div class="dm-marketing__content--wrap" v-if="list.length">
......@@ -21,10 +23,12 @@
</div>
</div>
</div>
<i class="el-icon-plus dm-marketing__opt--icon--bottom" v-if="list.length && list.length < maxEventCount" @click="optShow = !optShow"></i>
<transition name="fade">
<opt @addItem="addItem" :options="options" v-if="list.length && list.length < maxEventCount && optShow" style="margin:20px 0 0 15px;"></opt>
</transition>
<div class="dm-marketing__opt--wrap" @mouseleave="optShow = false">
<i class="el-icon-plus dm-marketing__opt--icon--bottom" v-if="list.length && list.length < maxEventCount" @mouseover="optShow = true"></i>
<transition name="fade">
<opt @addItem="addItem" :options="options" v-if="list.length && list.length < maxEventCount && optShow" style="margin:20px 0 0 15px;"></opt>
</transition>
</div>
<!-- 弹窗组件 -->
<component :is="dialogCom" @sendItem="saveToList" :item="currentItem" :show.sync="dialogShow"></component>
</section>
......@@ -64,7 +68,7 @@ const allOptions = [
{name:'话务',value:'teltask',key:7,img:require('./assets/img/teltask.svg')}
];
export default {
name:'dm-marketing',
name:'vue-gic-marketing-event',
components:{
'opt': opt,
'dm-delete': dmDelete,
......@@ -86,13 +90,17 @@ export default {
},
props:{
// 页面编码——- 1001-智能引擎; 1002-微信营销; 1003-被关注回复; 1004-关键字回复
code:{
code: {
type:String,
default:'1001'
},
ecmPlanId:{
ecmPlanId: {
type:String,
default:''
},
enabledMessageState: {
type:Number,
default:1
}
},
data() {
......@@ -103,7 +111,8 @@ export default {
options:[],
maxEventCount:0, //item最大数
currentItem:{},
optShow: false
optShow: false,
optTopShow: true
}
},
created() {
......@@ -223,6 +232,9 @@ export default {
// 保存操作
saveToList(val) {
console.log(val);
if (val.comName === 'message' && !this.enabledMessageState) {
this.$message({type:"warning",message:"'您的通讯费已欠费,请及时于计费中心充值,并联系我司客服恢复功能使用,谢谢。"})
}
let params = {
ecmPlanId:this.ecmPlanId, //从prop中取
marketingType:val.comName,
......@@ -243,6 +255,7 @@ export default {
// 2.文本
if (val.comName === 'text') {
params.title = val.content;
console.log(val)
params.text = {// ecm话务对象
content:val.content
}
......@@ -271,7 +284,7 @@ export default {
//6.卡券
if (val.comName === 'card') {
params.title = val.cardName;
params.relationId = val.coupCardId;
params.relationId = val.wechatCardId;
}
//7.短信
......
......@@ -164,7 +164,6 @@ export const voidStr = function(str,msg) {
* @param action {function} 请求关联函数,实际应用需要调用的函数
* @return {function} 返回客户调用函数
*/
export const throttle = function(delay, action){
var last = 0;
return function(){
......@@ -179,7 +178,6 @@ export const throttle = function(delay, action){
/**
* 验证是否为网址
*/
export const checkUrl = function (urlString) {
if(urlString!=""){
var reg=/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/;
......@@ -195,4 +193,12 @@ export const checkUrl = function (urlString) {
}
/**
* 将头像改为https
*/
import defaultAvatar from '../assets/img/head_default.png';
export const filterAvatar = (img) => {
return img?img.replace(/^http(s)?/,'https'):defaultAvatar;
}
......@@ -154,7 +154,7 @@ export default {
this.startDayOptions = Object.keys(dicMap).map(key => ({label:dicMap[key].dictName=='0'?'当天':'第'+dicMap[key].dictName+'天',value:parseInt(dicMap[key].dictName)}))
if(res.result.card) {
const card = res.result.card;
this.form.storeMode = card.storeMode || 0;
this.form.storeMode = card.storeMode === 0 ? 0 : 1;
this.form.coupCardId = this.isCopy?'':card.coupCardId;
this.form.cardType = card.cardType;
this.form.cardName = card.cardName || '';
......@@ -492,12 +492,13 @@ export default {
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$router.go(-1);
this.$router.push('/card/list');
}).catch(err => {
this.getCardDetail();
});
} else {
this.$router.go(-1);
this.$tips({type:'success',message:'新建卡券成功'});
this.$router.push('/card/list');
}
} else {
this.$tips({type:'error',message:res.message || '保存卡券失败'});
......
<template>
<el-form ref="form" :model="form" label-width="100px" :rules="rules" v-loading="loading" element-loading-text="拼命加载中" >
<!-- 计划内容设置 -->
<section class="dm-form__wrap">
<h3 class="dm-title__label">计划内容设置</h3>
<el-form-item label="计划名称" prop="ecmPlanName">
......@@ -22,8 +23,6 @@
<i class="el-icon-info"></i>
实时发送调用微信客服接口,不占用每个用户每月4条的群发次数
</div>
</el-form-item>
<el-form-item label="触发行为" class="width50" v-if="!form.effectType">
<el-select class="w400" v-model="form.effectAction" placeholder="选择发送状态">
......@@ -54,6 +53,7 @@
</el-select>
</el-form-item>
</section>
<!-- 有效时间 -->
<section class="dm-form__wrap">
<h3 class="dm-title__label">有效时间</h3>
<el-form-item label="有效时间" prop="endDate" :show-message="showMessage">
......@@ -70,6 +70,7 @@
</el-date-picker>
</el-form-item>
</section>
<!-- 人群筛选器 -->
<section class="dm-form__wrap">
<h3 class="dm-title__label">适用人群</h3>
<div class="mb20">
......@@ -80,8 +81,9 @@
</div>
</div>
</section>
<!-- 营销事件 -->
<section class="dm-form__wrap">
<h3 class="dm-title__label">营销回复</h3>
<h3 class="dm-title__label">营销事件</h3>
<marketing-event v-if="ecmPlanId" :ecmPlanId="ecmPlanId" :code="code" :enabledMessageState="enabledMessageState"></marketing-event>
</section>
<div class="btn-wrap_fixed" :class="{'on':asideShow}">
......@@ -94,12 +96,6 @@
<script>
import {getEcmInfo,saveEcmInfo} from '@/service/api/ecmApi.js';
import {sceneSettingList} from '@/service/api/commonApi.js';
import smsTemp from '@/components/libs/smsTemp';
import dmImgText from '@/components/libs/imgTextTemp'
import dmImgBox from '@/components/libs/imgTemp/index-box.vue'
import cardTemp from '@/components/libs/cardTemp'
import config from '@/config'
import wxText from '@/components/wxText/wxText'
import {checkMessageSendCount} from '@/service/api/messageApi.js';
import marketingEvent from './marketing-event/index.vue';
import {formateDateTimeByType} from '@/utils/index.js'
......@@ -147,8 +143,6 @@ export default {
},
isEdit:this.$route.meta.type === 'edit',
isAdd:this.$route.meta.type === 'add',
content: '',
customToolbar: [['link']],
// 人群筛选器可传参数
projectName: '', // 当前项目名
sceneValue: 'member', // 场景值
......
......@@ -52,7 +52,7 @@ export default {
},
data () {
return {
successOptions:[{value:'',label:'所有类型'},{value:0,label:'不满足'},{value:1,label:'满足'}],
successOptions:[{value:'',label:'发送条件'},{value:0,label:'不满足'},{value:1,label:'满足'}],
listParams:{
ecmPlanQuartzLogId:'',
success:'',
......
......@@ -49,7 +49,7 @@ export default {
data () {
return {
dateTime:[Date.now() - 30*24*60*60*1000,Date.now()],
successOptions:[{value:'',label:'所有状态'},{value:0,label:'成功'},{value:1,label:'失败'}],
successOptions:[{value:'',label:'所有状态'},{value:1,label:'成功'},{value:0,label:'失败'}],
listParams:{
ecmPlanId:this.$route.params.id,
ecmMarketingTypeRelationIds:'',
......
......@@ -46,120 +46,120 @@ import {loadEcmList,deleteEcm,offlineEcmPlan} from '@/service/api/ecmApi.js';
import {sceneSettingList} from '@/service/api/commonApi.js';
const marketingTypeOptions = [{value:'',label:'所有发送类型'},{value:'card',label:'卡券营销'} ,{value:'message',label:'短信营销'} ,{value:'teletext',label:'图文营销'},{value:'text',label:'文本营销'},{value:'teltask',label:'话务'},{value:'image',label:'微信图片'}];
export default {
name: 'ecm',
data () {
return {
effectTypeOption:[{value:-1,label:'所有时效'},{value:0,label:'实时'},{value:1,label:'定时'}],
onlineOptions:[{value:'',label:'所有上线状态'},{value:0,label:'待上线'},{value:1,label:'已上线'},{value:2,label:'已下线'}],
sceneSettingIdOptions:[],
marketingTypeOptions,
listParams:{
effectType:-1,
marketingType:'',
sceneSettingId:'',
onlineStatus:'',
searchName:'',
currentPage:1,
pageSize:20
},
total:0,
loading:false,
tableHeader:[
{label:'计划名称',prop:'ecmPlanName',minWidth:'120',align:'left',fixed:'left'},
{label:'时效',prop:'effectType',width:'120',align:'left',formatter(row){
return row.effectType?(`<span><i class="el-icon-time fz18 vertical-middle"></i><span class="vertical-middle"> 每天${row.effectTime}:00</span></span>`):'实时'
}},
{label:'营销方式',prop:'marketingType',minWidth:'120',align:'left'},
{label:'营销场景',prop:'sceneSettingName',width:'120',align:'left'},
{label:'营销人次',prop:'timesForPeople',width:'120',align:'left'},
{label:'上线状态',prop:'onlineStatus',width:'120',align:'left',formatter(row){
let result = '--';
switch (row.onlineStatus) {
case 0:
result = '<span class="dm-status--primary">待上线</span>';
break;
case 1:
result = '<span class="dm-status--success">已上线</span>';
break;
case 2:
result = '<span class="dm-status--info">已下线</span>';
break;
}
return result;
}},
],
tableList:[]
}
name: 'ecm',
data () {
return {
effectTypeOption:[{value:-1,label:'所有时效'},{value:0,label:'实时'},{value:1,label:'定时'}],
onlineOptions:[{value:'',label:'所有上线状态'},{value:0,label:'待上线'},{value:1,label:'已上线'},{value:2,label:'已下线'}],
sceneSettingIdOptions:[],
marketingTypeOptions,
listParams:{
effectType:-1,
marketingType:'',
sceneSettingId:'',
onlineStatus:'',
searchName:'',
currentPage:1,
pageSize:20
},
total:0,
loading:false,
tableHeader:[
{label:'计划名称',prop:'ecmPlanName',minWidth:'120',align:'left',fixed:'left'},
{label:'时效',prop:'effectType',width:'120',align:'left',formatter(row){
return row.effectType?(`<span><i class="el-icon-time fz18 vertical-middle"></i><span class="vertical-middle"> 每天${row.effectTime}:00</span></span>`):'实时'
}},
{label:'营销方式',prop:'marketingType',minWidth:'120',align:'left'},
{label:'营销场景',prop:'sceneSettingName',width:'120',align:'left'},
{label:'营销人次',prop:'timesForPeople',width:'120',align:'left'},
{label:'上线状态',prop:'onlineStatus',width:'120',align:'left',formatter(row){
let result = '--';
switch (row.onlineStatus) {
case 0:
result = '<span class="dm-status--primary">待上线</span>';
break;
case 1:
result = '<span class="dm-status--success">已上线</span>';
break;
case 2:
result = '<span class="dm-status--info">已下线</span>';
break;
}
return result;
}},
],
tableList:[]
}
},
created() {
this.loadEcmList();
this.sceneSettingList();
this.$store.commit('aside_handler',false);
this.$store.commit('mutations_breadcrumb',[{name:'营销管理',path:''},{name:'智能营销',path:'/ecm'}]);
},
methods: {
search() {
this.listParams.currentPage = 1;
this.loadEcmList();
},
created() {
handleSizeChange(val) {
this.listParams.pageSize = val;
this.loadEcmList();
this.sceneSettingList();
this.$store.commit('aside_handler',false);
this.$store.commit('mutations_breadcrumb',[{name:'营销管理',path:''},{name:'智能营销',path:'/ecm'}]);
},
methods: {
search() {
this.listParams.currentPage = 1;
this.loadEcmList();
},
handleSizeChange(val) {
this.listParams.pageSize = val;
this.loadEcmList();
},
handleCurrentChange(val) {
this.listParams.currentPage = val;
this.loadEcmList();
},
async loadEcmList() {
this.loading = true;
let res = await loadEcmList(this.listParams);
console.log(res)
this.tableList = res.result.result || [];
this.total = res.result.totalCount;
this.loading = false;
},
//编辑
editData(row){
this.$router.push('/ecm/edit/'+row.ecmPlanId)
},
// 记录
toRecord(row){
this.$router.push(`/ecm/${row.effectType ? 'batchlist' : 'currentlist'}/${row.ecmPlanId}/${row.ecmPlanName}`);
},
// 删除
async delData(row){
try {
let res = await deleteEcm({ecmPlanId:row.ecmPlanId});
if (res.errorCode === 0) {
this.$tips({type: 'success',message: '删除成功!'});
this.loadEcmList();
} else {
this.$tips({type: 'error',message: res.message || '删除失败!'});
}
} catch (err) {
this.$tips({type: 'error',message: '删除失败!'});
handleCurrentChange(val) {
this.listParams.currentPage = val;
this.loadEcmList();
},
async loadEcmList() {
this.loading = true;
let res = await loadEcmList(this.listParams);
console.log(res)
this.tableList = res.result.result || [];
this.total = res.result.totalCount;
this.loading = false;
},
//编辑
editData(row){
this.$router.push('/ecm/edit/'+row.ecmPlanId)
},
// 记录
toRecord(row){
this.$router.push(`/ecm/${row.effectType ? 'batchlist' : 'currentlist'}/${row.ecmPlanId}/${row.ecmPlanName}`);
},
// 删除
async delData(row){
try {
let res = await deleteEcm({ecmPlanId:row.ecmPlanId});
if (res.errorCode === 0) {
this.$tips({type: 'success',message: '删除成功!'});
this.loadEcmList();
} else {
this.$tips({type: 'error',message: res.message || '删除失败!'});
}
},
// 下线
async offlineEcmPlan(row){
try {
let res = await offlineEcmPlan({ecmPlanId:row.ecmPlanId});
if (res.errorCode === 0) {
this.$tips({type: 'success',message: '下线成功!'});
this.loadEcmList();
} else {
this.$tips({type: 'error',message: res.message || '下线失败!'});
}
} catch (err) {
this.$tips({type: 'error',message: '下线失败!'});
} catch (err) {
this.$tips({type: 'error',message: '删除失败!'});
}
},
// 下线
async offlineEcmPlan(row){
try {
let res = await offlineEcmPlan({ecmPlanId:row.ecmPlanId});
if (res.errorCode === 0) {
this.$tips({type: 'success',message: '下线成功!'});
this.loadEcmList();
} else {
this.$tips({type: 'error',message: res.message || '下线失败!'});
}
},
async sceneSettingList() {
let res = await sceneSettingList();
this.sceneSettingIdOptions = res.result || [];
this.sceneSettingIdOptions.unshift({sceneName:'所有营销场景',sceneSettingId:''})
} catch (err) {
this.$tips({type: 'error',message: '下线失败!'});
}
},
async sceneSettingList() {
let res = await sceneSettingList();
this.sceneSettingIdOptions = res.result || [];
this.sceneSettingIdOptions.unshift({sceneName:'所有营销场景',sceneSettingId:''})
}
}
}
</script>
......@@ -379,19 +379,18 @@
.dm-card__item__title {
vertical-align: middle;
margin-left: 8px;
max-width: 100px;
max-width: 180px;
font-size: 16px;
font-weight: 500;
line-height: 30px;
color: #fff;
overflow: hidden;
text-overflow: ellipsis;
}
.dm-card__item__desc{
vertical-align: middle;
margin-left: 8px;
max-width: 100px;
max-width: 200px;
font-size: 12px;
line-height: 20px;
color: #fff;
......
......@@ -5,7 +5,6 @@
<div class="dm-imgText__item__mask" v-if="v.maskShow" @click="preview(v)">预览文章</div>
<p class="ellipsis-l2">{{v.titleName}}</p>
<img :src="v.qcloudImageUrl || loadErrorImg" alt="" srcset="">
{{v.maskShow}}
<p class="ellipsis fz13 gray-color">{{v.remark}}</p>
</div>
<div class="dm-imgText__item__other clearfix" v-else @mouseover="itemMouseover(v)" @mouseout="itemMouseout(v)">
......
......@@ -165,7 +165,7 @@
this.copyObj = JSON.parse(JSON.stringify(this.item))
// console.log(this.item)
this.textarea = this.copyObj.content;
var reg = /<a\s+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
var reg = /<a[^>]+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
if(reg.exec(this.textarea)!=null){
this.cancelLink = true;
}
......@@ -191,7 +191,7 @@
},
methods: {
oldCancelLink(){
var reg = /<a\s+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g; // 判断是否有 <a href=""></a>
var reg = /<a[^>]+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g; // 判断是否有 <a href=""></a>
if(reg.exec(this.textarea)!=null){
this.cancelLink=true;
}
......@@ -289,7 +289,7 @@
this.$message.error('最多300个字符哦');
// return;
}
var reg = /<a\s+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
var reg = /<a[^>]+href=['"]([^"]*)['"].*?[^>]*>(.*?)<\/a>/g;
if(reg.exec(this.textarea)!=null){
this.cancelLink=true;
}else{
......
......@@ -42,7 +42,7 @@
<el-table-column min-width="140" header-align="left" align="left" prop="clerkId" label="导购信息">
<template slot-scope="scope">
<div class="ellipsis-100" >
<img class="vertical-middle table__avatar" :src="scope.row.clerkImage || defaultAvatar" width="60" height="60" />
<img class="vertical-middle table__avatar" :src="filterAvatar(scope.row.clerkImage)" width="60" height="60" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{scope.row.clerkName || '--'}}</p>
<p class="fz13 gray">{{scope.row.storeName || '--'}}</p>
......@@ -54,7 +54,7 @@
<el-table-column min-width="140" header-align="left" align="left" prop="memberId" label="会员信息">
<template slot-scope="scope">
<a class="ellipsis-100" :href="'/member/#/wechatmemberDetail?memberId='+scope.row.memberId" target="_blank">
<img class="vertical-middle table__avatar" :src="scope.row.thirdImgUrl || defaultAvatar" width="60" height="60" />
<img class="vertical-middle table__avatar" :src="filterAvatar(scope.row.thirdImgUrl)" width="60" height="60" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{scope.row.memberName || '--'}}</p>
<p class="fz13 gray">{{scope.row.cardNum || '--'}}</p>
......@@ -111,7 +111,7 @@
</template>
<script>
import {latestEvaluationList,evaluateBad,evaluationStoreExists,allocateEvaluation,changeShowStatus,exportLatestEvaluate} from '@/service/api/evaluationApi.js';
import {formateDateTimeByType} from '@/utils/index.js'
import {formateDateTimeByType,filterAvatar} from '@/utils/index.js'
import reply from './reply'
import storeGroup from '@/components/storeGroup'
export default {
......@@ -121,6 +121,7 @@ export default {
return {
storeGroupData:{},
formateDateTimeByType,
filterAvatar,
defaultAvatar:require('../../assets/img/head_default.png'),
loading:false,
dateTime:[],
......
......@@ -42,17 +42,17 @@ import {formateDateTimeByType} from '@/utils/index.js'
loading:false,
rankList:[],
rankHeader:[
{label:'中奖时间',prop:'createTime',minWidth:'170',align:'left',formatter:function(row){
{label:'中奖时间',prop:'createTime',align:'left',formatter:function(row){
return formateDateTimeByType(row.createTime,'yyyy-MM-dd-HH-mm-ss');
}},
{label:'手机号码',prop:'phoneNumber',width:'110',align:'left'},
{label:'口令',prop:'winCode',width:'110',align:'left'},
{label:'手机号码',prop:'phoneNumber',align:'left'},
{label:'口令',prop:'winCode',align:'left'},
{label:'奖品类型',prop:'prizeReferType',width:'80',align:'left',formatter:(row) => {
const prizeArr=['x','积分','卡券','礼品'];
return prizeArr[row.prizeReferType]
}},
{label:'奖品',prop:'prizeName',width:'80',align:'left'},
{label:'领取状态',prop:'getStatus',width:'80',align:'left',formatter:(row) => {
{label:'奖品',prop:'prizeName',align:'left'},
{label:'领取状态',prop:'getStatus',align:'left',formatter:(row) => {
const getStatusArr=['x','待领取','已领取','待核销','已核销','待完善信息','待发货','已发货'];
return getStatusArr[row.getStatus]
}}
......
......@@ -58,11 +58,11 @@ import {formateDateTimeByType} from '@/utils/index.js'
loading:false,
rankList:[],
rankHeader:[
{label:'手机号码',prop:'memberPhone',width:'110',align:'left'},
{label:'消耗方式',prop:'costType',width:'80',align:'left'},
{label:'消耗数值',prop:'costValue',width:'80',align:'left'},
{label:'参与次数',prop:'playTimes',width:'80',align:'left'},
{label:'最佳时间',prop:'opticalTime',width:'80',align:'left'}],
{label:'手机号码',prop:'memberPhone',align:'left'},
{label:'消耗方式',prop:'costType',align:'left'},
{label:'消耗数值',prop:'costValue',align:'left'},
{label:'参与次数',prop:'playTimes',align:'left'},
{label:'最佳时间',prop:'opticalTime',align:'left'}],
listParams:{
tabName:'rank',
gameActivityId:'',
......@@ -75,13 +75,13 @@ import {formateDateTimeByType} from '@/utils/index.js'
loading1:false,
recordList:[],
recordHeader:[
{label:'玩游戏时间',prop:'createTime',minWidth:'170',align:'left',formatter:function(row){
{label:'玩游戏时间',prop:'createTime',align:'left',formatter:function(row){
return formateDateTimeByType(row.createTime,'yyyy-MM-dd-HH-mm-ss')}},
{label:'手机号码',prop:'memberPhone',minWidth:'110',align:'left'},
{label:'消耗方式',prop:'costType',width:'80',align:'left'},
{label:'消耗数值',prop:'costValue',width:'80',align:'left'},
{label:'游戏状态',prop:'gameStatus',width:'80',align:'left'},
{label:'时间',prop:'opticalTime',width:'80',align:'left'}],
{label:'手机号码',prop:'memberPhone',align:'left'},
{label:'消耗方式',prop:'costType',align:'left'},
{label:'消耗数值',prop:'costValue',align:'left'},
{label:'游戏状态',prop:'gameStatus',align:'left'},
{label:'时间',prop:'opticalTime',align:'left'}],
listParams1:{
tabName:'attendRecord',
gameActivityId:'',
......
......@@ -11,7 +11,7 @@
</div>
<el-table tooltipEffect="light" :data="rankList" style="width:100%" v-loading="loading">
<el-table-column width="60" align="left" label="名次" prop="ranking"></el-table-column>
<el-table-column :min-width="150" align="left" label="会员信息">
<el-table-column align="left" label="会员信息">
<template slot-scope="scope">
<a :href="'/member/#/wechatmemberDetail?memberId='+scope.row.memberId" target="_blank" class="sms-table_info">
<img class="vertical-middle table__avatar" :src="scope.row.memberPhotoUrl" alt="" srcset="">
......@@ -35,7 +35,7 @@
<el-button icon="iconfont icon-icon_yunxiazai fz14" type="primary" class="fr" @click="znmRecordExcel"> 下载Excel</el-button>
</div>
<el-table tooltipEffect="light" :data="recordList" style="width:100%" v-loading="loading">
<el-table-column :min-width="150" align="left" label="会员信息">
<el-table-column align="left" label="会员信息">
<template slot-scope="scope">
<a :href="'/member/#/wechatmemberDetail?memberId='+scope.row.memberId" target="_blank" class="sms-table_info">
<img class="vertical-middle table__avatar" :src="scope.row.memberImage" alt="" srcset="">
......@@ -69,11 +69,11 @@ import {formateDateTimeByType} from '@/utils/index.js'
loading:false,
rankList:[],
rankHeader:[
{label:'手机号码',prop:'memberPhone',minWidth:'110',align:'left',formatter:(row)=>{
{label:'手机号码',prop:'memberPhone',align:'left',formatter:(row)=>{
return row.memberPhone || '--'
}},
{label:'参与次数',prop:'playTimes',width:'80',align:'left'},
{label:'游戏成绩',prop:'gameScore',width:'80',align:'left'}],
{label:'参与次数',prop:'playTimes',align:'left'},
{label:'游戏成绩',prop:'gameScore',align:'left'}],
listParams:{
tabName:'rank',
gameActivityId:this.$route.params.id,
......@@ -86,14 +86,14 @@ import {formateDateTimeByType} from '@/utils/index.js'
loading1:false,
recordList:[],
recordHeader:[
{label:'玩游戏时间',prop:'createTime',minWidth:'170',align:'left',formatter:function(row){
{label:'玩游戏时间',prop:'createTime',align:'left',formatter:function(row){
return formateDateTimeByType(row.createTime,'yyyy-MM-dd-HH-mm-ss')}},
{label:'手机号码',prop:'memberPhone',minWidth:'110',align:'left'},
{label:'游戏状态',prop:'getStatus',width:'80',align:'left',formatter:function(row){
{label:'手机号码',prop:'memberPhone',align:'left'},
{label:'游戏状态',prop:'getStatus',align:'left',formatter:function(row){
return (row.getStatus === 1 || row.getStatus === 2) ?'成功':'失败';
}},
{label:'游戏成绩',prop:'gameScore',width:'80',align:'left'},
{label:'游戏成绩',prop:'getStatus',width:'80',align:'left',formatter:function(row){
{label:'游戏成绩',prop:'gameScore',align:'left'},
{label:'游戏成绩',prop:'getStatus',align:'left',formatter:function(row){
if(row.getStatus === 1) {
return "未领取" ;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment