Commit 41435f70 by chenxin

Merge branch 'dev' into 'master'

Dev

See merge request !12
parents e761abc4 fc70f1aa
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
'use strict';
const path = require('path');
const utils = require('./utils');
const config = require('../config');
const vueLoaderConfig = require('./vue-loader.conf');
function resolve (dir) {
return path.join(__dirname, '..', dir)
function resolve(dir) {
return path.join(__dirname, '..', dir);
}
const createLintingRule = () => ({
test: /\.(js|vue)$/,
loader: "eslint-loader",
enforce: "pre",
include: [resolve("src"), resolve("test")],
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
// fix: true,
formatter: require("eslint-friendly-formatter"),
formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay
}
});
module.exports = {
context: path.resolve(__dirname, '../'),
entry: ['babel-polyfill','./src/main.js'],
entry: ['babel-polyfill', './src/main.js'],
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
vue$: 'vue/dist/vue.esm.js',
'@': resolve('src')
}
},
module: {
......@@ -82,9 +80,9 @@ module.exports = {
]
},
externals: {
'vue': 'Vue',
vue: 'Vue',
'vue-router': 'VueRouter',
'vuex': 'Vuex',
vuex: 'Vuex'
// 'axios': 'axios'
},
node: {
......@@ -99,4 +97,4 @@ module.exports = {
tls: 'empty',
child_process: 'empty'
}
}
};
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
'use strict';
const utils = require('./utils');
const webpack = require('webpack');
const config = require('../config');
const merge = require('webpack-merge');
const path = require('path');
const baseWebpackConfig = require('./webpack.base.conf');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');
const portfinder = require('portfinder');
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const HOST = process.env.HOST;
const PORT = process.env.PORT && Number(process.env.PORT);
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
......@@ -24,9 +24,7 @@ const devWebpackConfig = merge(baseWebpackConfig, {
devServer: {
clientLogLevel: 'warning',
historyApiFallback: {
rewrites: [
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
],
rewrites: [{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }]
},
hot: true,
contentBase: false, // since we use CopyWebpackPlugin.
......@@ -34,14 +32,12 @@ const devWebpackConfig = merge(baseWebpackConfig, {
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
overlay: config.dev.errorOverlay ? { warnings: false, errors: true } : false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
poll: config.dev.poll
}
},
plugins: [
......@@ -66,30 +62,30 @@ const devWebpackConfig = merge(baseWebpackConfig, {
}
])
]
})
});
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.basePort = process.env.PORT || config.dev.port;
portfinder.getPort((err, port) => {
if (err) {
reject(err)
reject(err);
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
process.env.PORT = port;
// add port to devServer config
devWebpackConfig.devServer.port = port
devWebpackConfig.devServer.port = port;
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
devWebpackConfig.plugins.push(
new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`]
},
onErrors: config.dev.notifyOnErrors ? utils.createNotifierCallback() : undefined
})
);
resolve(devWebpackConfig)
resolve(devWebpackConfig);
}
})
})
});
});
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
'use strict';
const merge = require('webpack-merge');
const prodEnv = require('./prod.env');
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})
});
'use strict'
'use strict';
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
const path = require('path');
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
// '/dmApi/':{
// target:'http://gicdev.demogic.com/',
// changeOrigin:true,
// pathRewrite:{
// '^/dmApi':''
// }
// }
'/dmApi/': {
target: 'http://192.168.1.154:86',
changeOrigin: true,
pathRewrite: {
'^/dmApi': ''
}
}
},
// Various Dev Server settings
......@@ -44,9 +43,6 @@ module.exports = {
// https://webpack.js.org/configuration/devtool/#development
// devtool: 'cheap-module-eval-source-map',
devtool: 'eval-source-map',
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
// https://vue-loader.vuejs.org/en/options.html#cachebusting
......@@ -85,4 +81,4 @@ module.exports = {
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
}
}
};
<!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/main.22b50c33249d8975f3e29fa7f34e6ea8.css rel=stylesheet></head><body><div id=app></div><script src=//web-1251519181.file.myqcloud.com/lib/vue/2.5.2/vue.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vue-router/3.0.2/vue-router.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/elementUI/index.2.5.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.07.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/card.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/store.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/member-group.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-card.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/confirm-people.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/people.2.0.15.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/input.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/delete.2.0.00.js></script><script type=text/javascript src=/marketing/static/js/manifest.0a85049e489e85ac5f0a.js></script><script type=text/javascript src=/marketing/static/js/vendor.bd99622c6e1180650eeb.js></script><script type=text/javascript src=/marketing/static/js/main.99fe9fad14d35beb5c4f.js></script></body></html>
\ No newline at end of file
<!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/main.cee807a216db44f74fb1bf579ec3649e.css rel=stylesheet></head><body><div id=app></div><script src=//web-1251519181.file.myqcloud.com/lib/vue/2.5.2/vue.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vue-router/3.0.2/vue-router.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/elementUI/index.2.5.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.20.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/card.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/store.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/member-group.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/store-card.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/confirm-people.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/people.2.0.15.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.04.js></script><script src=//web-1251519181.file.myqcloud.com/components/input.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/delete.2.0.00.js></script><script type=text/javascript src=/marketing/static/js/manifest.0a85049e489e85ac5f0a.js></script><script type=text/javascript src=/marketing/static/js/vendor.41e915fffb6fa2b1b49e.js></script><script type=text/javascript src=/marketing/static/js/main.97c66de94eb68e421fca.js></script></body></html>
\ No newline at end of file
......@@ -15,23 +15,591 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-arrowdown:before { content: "\e613"; }
.icon-tupian:before {
content: "\e6d2";
}
.icon-guaguaqia:before {
content: "\e6e0";
}
.icon-tupian2:before {
content: "\e654";
}
.icon-video:before {
content: "\e620";
}
.icon-dazhuanpan:before {
content: "\e602";
}
.icon-tupian1:before {
content: "\e6ff";
}
.icon-17:before {
content: "\e613";
}
.icon-shuangxianghujiao:before {
content: "\e617";
}
.icon-qiaquanyingxiao:before {
content: "\e614";
}
.icon-jia:before {
content: "\e652";
}
.icon-erweima:before {
content: "\e6bc";
}
.icon-lianjie:before {
content: "\e627";
}
.icon-fenzu:before {
content: "\e6d6";
}
.icon-mobanku:before {
content: "\e659";
}
.icon-yuyinxiaoxi:before {
content: "\e65d";
}
.icon-tijianyi:before {
content: "\e7b1";
}
.icon-tiaoxingma101:before {
content: "\e6f7";
}
.icon-shangchuan:before {
content: "\e667";
}
.icon-wxcard-copy:before {
content: "\e603";
}
.icon-wsc:before {
content: "\e60b";
}
.icon-chuzhi:before {
content: "\e60a";
}
.icon-jihua:before {
content: "\e607";
}
.icon-duanxin:before {
content: "\e61d";
}
.icon-qiaquan:before {
content: "\e60d";
}
.icon-duanxinyingxiao:before {
content: "\e615";
}
.icon-pintu:before {
content: "\e683";
}
.icon-shipin:before {
content: "\e63a";
}
.icon-liebiao:before {
content: "\e62f";
}
.icon-duanxin1:before {
content: "\e623";
}
.icon-youxi1:before {
content: "\e62d";
}
.icon-mendian1:before {
content: "\e82a";
}
.icon-hexiao:before {
content: "\e606";
}
.icon-weixinyingxiao:before {
content: "\e653";
}
.icon-fenxi:before {
content: "\e608";
}
.icon-shoujiyanzhengma:before {
content: "\e619";
}
.icon-shanchu:before {
content: "\e605";
}
.icon-next-:before {
content: "\e611";
}
.icon-xiaofei:before {
content: "\e609";
}
.icon-icon-QRcode:before {
content: "\e6fd";
}
.icon-qiaquanbao:before {
content: "\e604";
}
.icon-paixu_up-copy:before {
content: "\e600";
}
.icon-xinxiguanli:before {
content: "\e610";
}
.icon-huiyuanguanli:before {
content: "\e60c";
}
.icon-moshiqiehuan:before {
content: "\e616";
}
.icon-tonghuajilu:before {
content: "\e69b";
}
.icon-jilu:before {
content: "\e756";
}
.icon-xuanze:before {
content: "\e6d8";
}
.icon-duankailianjie:before {
content: "\e674";
}
.icon-xiaofei1:before {
content: "\e6e3";
}
.icon-xiaochengxu:before {
content: "\e61a";
}
.icon-fengefu:before {
content: "\e61f";
}
.icon-zhankai:before {
content: "\e742";
}
.icon-shouqi:before {
content: "\e743";
}
.icon-hudong:before {
content: "\e60e";
}
.icon-yuyin:before {
content: "\e650";
}
.icon-bianji:before {
content: "\e618";
}
.icon-wenzi:before {
content: "\e65b";
}
.icon-zhinengyinqing:before {
content: "\e734";
}
.icon-tuozhuai:before {
content: "\ea17";
}
.icon-xiaochengxu11:before {
content: "\e61b";
}
.icon-zhuzuoquan:before {
content: "\e60f";
}
.icon-tiaoxingma:before {
content: "\ea30";
}
.icon-weixin-:before {
content: "\e6ab";
}
.icon-huiyuanpengyou:before {
content: "\e6ad";
}
.icon-dianshangtupian:before {
content: "\e6ae";
}
.icon-jifen:before {
content: "\e6b0";
}
.icon-renzhengxinxi:before {
content: "\e6b2";
}
.icon-huiyuantequan-:before {
content: "\e6b3";
}
.icon-huiyuanjiazhifenlei:before {
content: "\e6b4";
}
.icon-sucaiku:before {
content: "\e6b5";
}
.icon-qiapian-:before {
content: "\e6b6";
}
.icon-qiaquan-:before {
content: "\e6ba";
}
.icon-wodeqiaquan-:before {
content: "\e6bb";
}
.icon-mima:before {
content: "\e6be";
}
.icon-moban:before {
content: "\e6bf";
}
.icon-fenxi-:before {
content: "\e6c0";
}
.icon-qiandao-:before {
content: "\e6c1";
}
.icon-qiandaopx:before {
content: "\e6c2";
}
.icon-pingjiaguanli:before {
content: "\e6c3";
}
.icon-shu:before {
content: "\e6c4";
}
.icon-pintu1:before {
content: "\e6c7";
}
.icon-mendian:before {
content: "\e6c8";
}
.icon-shanghuxinxi:before {
content: "\e6c9";
}
.icon-huafei:before {
content: "\e6ca";
}
.icon-icon_huiyuanguanli:before {
content: "\e6cb";
}
.icon-erjicaidan-jiesuanguanli:before {
content: "\e6cc";
}
.icon-xinyongqiajiesuanfuwu:before {
content: "\e6cd";
}
.icon-laowujiesuan:before {
content: "\e6ce";
}
.icon-huifu:before {
content: "\e6cf";
}
.icon-zidingyicaidan-:before {
content: "\e6d0";
}
.icon-zujian-lunbo:before {
content: "\e6d1";
}
.icon-cg-yuanshengguanggao:before {
content: "\e6d3";
}
.icon-youxi:before {
content: "\e6d4";
}
.icon-icon_zidingyiyemianshezhi:before {
content: "\e6d5";
}
.icon-daohang-:before {
content: "\e6d7";
}
.icon-huiyuan-:before {
content: "\e6d9";
}
.icon-shequ-zhutifenxiang:before {
content: "\e6da";
}
.icon-icon_yunxiazai:before {
content: "\e6e8";
}
.icon-Icon_addPhotoB:before {
content: "\e68a";
}
.icon-mobanxiaoxiku:before {
content: "\e6e9";
}
.icon-mobanxiaoxiqunfa:before {
content: "\e6ea";
}
.icon-yd-icon-upload2:before {
content: "\e6ec";
}
.icon-tubiaoweikong:before {
content: "\e7ae";
}
.icon-shaixuan-shi:before {
content: "\e687";
}
.icon-CSV:before {
content: "\e601";
}
.icon-huiyuanzaixiangoutong:before {
content: "\e708";
}
.icon-shiwufenpeijizhi:before {
content: "\e709";
}
.icon-guige:before { content: "\e9fa"; }
.icon-oa_nofind:before {
content: "\e612";
}
.icon-selected:before {
content: "\e6bd";
}
.icon-saomiao:before {
content: "\e65e";
}
.icon-icon02:before {
content: "\e622";
}
.icon-shipin1:before {
content: "\e625";
}
.icon-xiaochengxu1:before {
content: "\e61c";
}
.icon-gengduo:before {
content: "\e624";
}
.icon-xiazairizhi:before {
content: "\e621";
}
.icon-jifenmingxibiao:before {
content: "\e746";
}
.icon-jifenjiesuanguishu:before {
content: "\e747";
}
.icon-jifenchengbenpeizhi:before {
content: "\e748";
}
.icon-tuwenyangshi:before {
content: "\e61e";
}
.icon-dongjie:before {
content: "\e749";
}
.icon-yemianshezhi:before {
content: "\e74e";
}
.icon-leimupinleifenleileibie--1:before { content: "\e600"; }
.icon-xinxixianshi:before {
content: "\e74f";
}
.icon-zhankai:before { content: "\e742"; }
.icon-dianhua:before {
content: "\e655";
}
.icon-shouqi:before { content: "\e743"; }
.icon-xuanzewenjianshangchuan:before {
content: "\e62a";
}
.icon-dingdan-:before { content: "\e67e"; }
.icon-qiaquanhexiao:before {
content: "\e76e";
}
.icon-shuxingguanli:before { content: "\e65d"; }
.icon-shougongbiaoqian:before {
content: "\e782";
}
.icon-zhuzuoquan:before { content: "\e60f"; }
.icon-pingtaibiaoqianku:before {
content: "\e789";
}
.icon-shougongbiaoqianku:before {
content: "\e78a";
}
.icon-pinpai-:before { content: "\e6de"; }
.icon-wodebiaoqianku:before {
content: "\e78b";
}
.icon-icon_yunxiazai fz14:before { content: "\e6e8"; }
.icon-guijijiansuo:before {
content: "\e78c";
}
.icon-xiaofei2:before {
content: "\e78d";
}
.icon-jibenxinxi:before {
content: "\e78e";
}
.icon-yingxiaohuodongguanli:before {
content: "\e78f";
}
.icon-xinxixianshi1:before {
content: "\e791";
}
.icon-xinxixianshi2:before {
content: "\e792";
}
.icon-zhankai-:before {
content: "\e793";
}
.icon-zhongzhi:before {
content: "\e794";
}
.icon-xuanze-:before {
content: "\e7a2";
}
.icon-chakan:before {
content: "\e7a4";
}
.icon-shenhe:before {
content: "\e7a5";
}
.icon-daishenhe:before {
content: "\e7a6";
}
.icon-daishenhe1:before {
content: "\e7a8";
}
.icon-gengduo1:before {
content: "\e639";
}
.icon-yongjinjiesuanmingxi:before {
content: "\e7d9";
}
.icon-yongjinjiesuanguize:before {
content: "\e7da";
}
.icon-luyinzhong:before {
content: "\e6b7";
}
.icon-guanbi:before {
content: "\e626";
}
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.
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.
......@@ -19,7 +19,7 @@
<script src="//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js"></script>
<script src="//web-1251519181.file.myqcloud.com/lib/elementUI/index.2.5.4.js"></script>
<!-- 组件引用cdn -->
<script src="//web-1251519181.file.myqcloud.com/components/header2.0.20.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/header.2.0.20.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/card.2.0.02.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/store.2.0.01.js"></script>
......@@ -28,7 +28,7 @@
<script src="//web-1251519181.file.myqcloud.com/components/store-card.2.0.00.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/confirm-people.2.0.01.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/people.2.0.15.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/export-excel.2.0.02.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/export-excel.2.0.04.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/input.2.0.00.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/delete.2.0.00.js"></script>
</body>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -106,6 +106,9 @@ a:hover {
.pr20{
padding-right: 20px!important;
}
.pr30{
padding-right: 30px!important;
}
.ml30{
margin-left: 30px!important;
......@@ -116,12 +119,18 @@ a:hover {
.ml100{
margin-left: 100px!important;
}
.mt20{
margin-top: 20px!important;
.mt5{
margin-top: 5px!important;
}
.mt10{
margin-top: 10px!important;
}
.mt20{
margin-top: 20px!important;
}
.mt30{
margin-top: 30px!important;
}
.ml5{
margin-left: 5px!important;
}
......@@ -215,6 +224,9 @@ a:hover {
cursor: no-drop;
}
.red {
color:$danger-color;
}
.blue{
color:$primary-color;
// cursor: pointer;
......@@ -280,6 +292,9 @@ a:hover {
.line-height2{
line-height:2;
}
.line-height1_5{
line-height:1.5;
}
.line-height1{
line-height:1;
}
......@@ -438,6 +453,8 @@ img::after {
font-weight: bold;
}
.flex{
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.border-radius__default{
......
......@@ -172,3 +172,22 @@
background-color: #ebeef5;
z-index: 4;
}
// 只读遮罩 - 无颜色
.el-view-mask {
position: relative;
&:before{
position: absolute;
z-index: 1000;
width: 100%;
height: 100%;
left: 0;
top: 0;
content:'';
}
}
// 表格 \n 换行
// .el-table .cell {
// white-space: pre-line;
// }
\ No newline at end of file
......@@ -26,14 +26,15 @@
<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">
<el-table-column label="作者" prop="authorName" align="left">
<template slot-scope="scope">
<p>{{ scope.row.itemList.length ? scope.row.itemList[0].authorName || '--' : '' }}</p>
</template>
</el-table-column>
<el-table-column label="修改时间" prop="updateTimeStr" align="left">
<template slot-scope="scope">
{{ scope.row.updateTimeStr }}
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.updateTime, 'yyyy-MM-dd-HH-mm', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.updateTime, 'yyyy-MM-dd-HH-mm', true).h }}</p>
</template>
</el-table-column>
<el-table-column label="操作" align="left" v-if="auto">
......@@ -112,8 +113,8 @@ export default {
this.textImgList = res.result.result || [];
this.total = res.result.totalCount;
this.textImgList.map(v => {
v.createTimeStr = formatDateTimeByType(v.createTime, 'yyyy-MM-dd-HH-mm');
v.updateTimeStr = formatDateTimeByType(v.updateTime, 'yyyy-MM-dd-HH-mm');
v.createTimeStr = v.createTime;
// v.updateTimeStr = v.updateTime;
if (this.activeId === v.imageTextWechatId) {
this.selectedData = v;
}
......@@ -158,7 +159,8 @@ export default {
handleCurrentChange(val) {
this.listParams.currentPage = val;
this.loadImgTextList();
}
},
formatDateTimeByType
}
};
</script>
......
......@@ -58,7 +58,18 @@ export default {
type: String,
default: '/api-marketing/upload-game-image'
},
labelStyle: Object
labelStyle: Object,
// 限制图片大小
limit: {
type: Object,
default() {
return {
type: false,
width: 100,
height: 100
};
}
}
},
data() {
return {
......
......@@ -7,7 +7,7 @@
<a @click="addLink" class="iconfont icon-lianjie" title="添加链接"></a>
<a @click="removeLink" class="iconfont icon-duankailianjie" title="取消链接"></a>
<el-popover placement="top" trigger="hover" width="680" v-if="isSupportVar">
<p>1.支持插入会员信息变量,如下表所示,{数字}为可插入变量,注意变量值长度,一面超过300字文本上限。</p>
<p>1.支持插入会员信息变量,如下表所示,{数字}为可插入变量,注意变量值长度,以免超过300字文本上限。</p>
<p>2.支持插入H5链接;支持插入小程序链接。</p>
<p>3.支持换行;不支持富文本格式。</p>
<p>会员信息变量表:</p>
......
export default {
// eslint-disable-next-line
api: process.env['NODE_ENV'] === 'development' ? 'http://gicdev.demogic.com/' : window.location.protocol + '//' + window.location.host + '/' || ''
// http://gicdev.demogic.com/
// http://192.168.1.154:86/
};
......@@ -4,46 +4,94 @@
import axios from 'axios';
import config from '@/config';
const maxSize = 2 * 1024 * 1024; //5M
axios.defaults.withCredentials = true;
function verificationPicFile(file, l_width, l_height) {
return new Promise((resolve, reject) => {
const filePath = file.value;
if (filePath) {
//读取图片数据
const filePic = file.files[0];
let reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
//加载图片获取图片真实宽度和高度
var image = new Image();
image.onload = function() {
var width = image.width;
var height = image.height;
if (width === l_width && height === l_height) {
resolve();
} else {
file.value = '';
reject(new Error(`上传图片尺寸应为${l_width}*${l_height}`));
}
};
image.src = data;
};
reader.readAsDataURL(filePic);
} else {
reject();
}
});
}
export default {
inserted: function(el, binding) {
el.addEventListener('change', function() {
binding.value.loading = true;
if (el.files[0].size > maxSize) {
binding.value.$tips({ type: 'warning', message: '上传图片不能大于2M' });
const size = binding.value.limit && binding.value.limit.maxSize ? binding.value.limit.maxSize : 2; // 默认最大2M限制
if (el.files[0].size > size * 1024 * 1024) {
binding.value.$tips({ type: 'warning', message: `上传图片不能大于${size}M` });
binding.value.loading = false;
return;
}
binding.value.disabled = true;
let formData = new FormData();
formData.append(binding.value.fileType, el.files[0]);
formData.append('requestProject', 'gic-web');
axios
.post(config.api + binding.value.url, formData)
.then(res => {
console.log(res);
binding.value.loading = false;
el.value = '';
if (res.data.errorCode === 0) {
if (binding.value.url === '/api-plug/upload-img') {
(binding.value.model.code = res.data.result[0].imageFiledCode), (binding.value.model.imgUrl = res.data.result[0].qcloudImageUrl);
// 启用限制图片宽高大小
if (binding.value.limit && binding.value.limit.type) {
const { width, height } = binding.value.limit;
verificationPicFile(el, width, height)
.then(res => {
upload();
})
.catch(err => {
binding.value.$tips({ type: 'warning', message: err.message });
binding.value.loading = false;
});
} else {
upload();
}
function upload() {
binding.value.disabled = true;
let formData = new FormData();
formData.append(binding.value.fileType, el.files[0]);
formData.append('requestProject', 'gic-web');
axios
.post(config.api + binding.value.url, formData)
.then(res => {
binding.value.loading = false;
el.value = '';
if (res.data.errorCode === 0) {
if (binding.value.url === '/api-plug/upload-img') {
(binding.value.model.code = res.data.result[0].imageFiledCode), (binding.value.model.imgUrl = res.data.result[0].qcloudImageUrl);
} else {
(binding.value.model.code = res.data.result.imageFiledCode), (binding.value.model.imgUrl = res.data.result.qcloudImageUrl);
binding.value.model.mediaId = res.data.result.imageMediaId;
binding.value.model.wxImg = res.data.result.wxImg || res.data.result.imageUrl || '';
}
binding.value.$tips({ type: 'success', message: '上传成功' });
} else {
(binding.value.model.code = res.data.result.imageFiledCode), (binding.value.model.imgUrl = res.data.result.qcloudImageUrl);
binding.value.model.mediaId = res.data.result.imageMediaId;
binding.value.model.wxImg = res.data.result.wxImg || res.data.result.imageUrl || '';
binding.value.$tips({ type: 'error', message: res.data.message || '上传失败' });
}
binding.value.$tips({ type: 'success', message: '上传成功' });
} else {
binding.value.$tips({ type: 'error', message: res.data.message || '上传失败' });
}
binding.value.disabled = false;
})
.catch(error => {
binding.value.loading = false;
binding.value.disabled = false;
binding.value.$tips({ type: 'error', message: error.msg || '上传失败' });
});
binding.value.disabled = false;
})
.catch(error => {
binding.value.loading = false;
binding.value.disabled = false;
binding.value.$tips({ type: 'error', message: error.msg || '上传失败' });
});
}
});
}
};
......@@ -5,10 +5,10 @@ import store from './store';
import { axios } from './service/api/index';
import directives from './directives';
Vue.config.productionTip = false;
// Vue.config.devtools = true;
Vue.prototype.axios = axios;
Vue.prototype.axios.withCredentials = true;
Object.keys(directives).map(item => Vue.directive(item, directives[item]));
window.$bus = new Vue();
let flag = false;
Vue.prototype.$tips = function({ message = '提示', type = 'success' }) {
......
import calllog from '../../views/calllog';
import index from '../../views/calllog/index';
import calllog from '../../views/calllog/calllog';
import record from '../../views/calllog/record';
export default {
path: 'calllog',
name: '通话记录',
component: calllog
component: index,
meta: {},
redirect: 'calllog/index',
children: [
{
path: 'index',
name: '通话记录',
component: calllog,
meta: {}
},
{
path: 'record',
name: '录音存储设置',
component: record,
meta: {}
}
]
};
//智能营销
import ecm from '../../views/ecm';
import ecmList from '../../views/ecm/list';
import ecmForm from '../../views/ecm/form';
import ecmForm from '../../views/ecm/form.vue';
import batchList from '../../views/ecm/batch-list';
import currentList from '../../views/ecm/current-list';
......
import { requests } from './index';
const PREFIX = 'api-marketing/';
//智能营销--ECM营销引擎分页列表
//智能营销--通话记录
export const callLogList = params => requests(PREFIX + 'call-log', params);
export const saveCallSetting = params => requests(PREFIX + 'save-call-setting', params); // 录音设置保存
export const getCallSetting = params => requests(PREFIX + 'get-call-setting', params); // 录音配置
......@@ -141,3 +141,6 @@ export const getGameSystemMusic = params => requests(PREFIX + 'get-game-system-m
//游戏营销--拼图游戏下载模板
export const downloadPtyxSkinPsd = config.api + PREFIX + 'download-tempskin-psd?requestProject=marketing';
// 游戏营销--大转盘/刮刮卡下载psd
export const downloadWheelSkinPsd = config.api + PREFIX + 'download_wheel_skin_psd?requestProject=marketing';
......@@ -27,6 +27,9 @@ export const voiceData = params => requests(PREFIX + 'voice-data', params);
//计费中心--双向呼叫消费详情
export const callData = params => requests(PREFIX + 'call-data', params);
//计费中心--通话录音消费详情
export const recordData = params => requests(PREFIX + 'call-record-data', params);
//计费中心--点击充值后--第一步:获取余额, 各项服务单价
export const rechargeStep0 = params => requests(PREFIX + 'recharge-step-1', params);
......
......@@ -32,24 +32,31 @@ export const fillZero = num => {
* @param {*时间} date
* @param {*转换的格式} type
*/
export const formatDateTimeByType = (date, type = 'yyyy-MM-dd-HH-mm-ss') => {
export const formatDateTimeByType = (date, type = 'yyyy-MM-dd-HH-mm-ss', newline = false) => {
if (!date) {
return '';
return newline ? { y: '', h: '' } : '';
}
if (typeof date === 'number') {
if (typeof date === 'number' || typeof date === 'string') {
date = new Date(date);
}
if (typeof date === 'string') {
return date;
} else {
let year = type.indexOf('yyyy') >= 0 ? fillZero(date.getFullYear()) : '';
let month = type.indexOf('MM') >= 0 ? '-' + fillZero(date.getMonth() + 1) : '';
let day = type.indexOf('dd') >= 0 ? '-' + fillZero(date.getDate()) + '' : '';
let hours = type.indexOf('HH') >= 0 ? ' ' + fillZero(date.getHours()) : '';
let min = type.indexOf('mm') >= 0 ? ':' + fillZero(date.getMinutes()) : '';
let sec = type.indexOf('ss') >= 0 ? ':' + fillZero(date.getSeconds()) : '';
// console.log(year+month+day+hours+min+sec);
return year + month + day + hours + min + sec;
try {
if (typeof date === 'string') {
return newline ? { y: date, h: '' } : date;
} else {
let year = type.indexOf('yyyy') >= 0 ? fillZero(date.getFullYear()) : '';
let month = type.indexOf('MM') >= 0 ? '-' + fillZero(date.getMonth() + 1) : '';
let day = type.indexOf('dd') >= 0 ? '-' + fillZero(date.getDate()) + '' : '';
let hours = type.indexOf('HH') >= 0 ? ' ' + fillZero(date.getHours()) : '';
let min = type.indexOf('mm') >= 0 ? ':' + fillZero(date.getMinutes()) : '';
let sec = type.indexOf('ss') >= 0 ? ':' + fillZero(date.getSeconds()) : '';
// console.log(year+month+day+hours+min+sec);
if (newline) {
return { y: year + month + day, h: hours + min + sec };
}
return year + month + day + hours + min + sec;
}
} catch (e) {
return newline ? { y: date, h: '' } : date;
}
};
......
......@@ -105,3 +105,26 @@ export default {
return regTest.test(v);
}
};
/*
* 判断字符串是否为null,undefined,空
*/
export const isEmpty = function(v) {
return v === null || v === undefined || v === '';
};
/**
* 判断小数点后有几位小数
* -- 正整数返回0
* */
export const numOfDecimal = function(v) {
if (isEmpty(v) || isNaN(v)) {
return -1;
}
const decimal = v.toString().split('.');
if (decimal.length === 1) {
return 0;
} else {
return decimal[1].length;
}
};
<template>
<section class="dm-wrap">
<el-alert type="info" :closable="false" show-icon class="mb20">
<p slot="title" class="fz14 mb15 info-color line-height1_5">通话录音默认存储3天,如需更长的期限,请在录音设置中开启。</p>
</el-alert>
<div class="pb22 clearfix">
<el-date-picker v-model="dateTime" :picker-options="pickerOptions" class="w250" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="getTableList"></el-date-picker>
<el-select class="dm-select" clearable="" v-model="listParams.callStatus" placeholder="选择通话状态" @change="getTableList">
<el-option v-for="(v, i) in callStatusOption" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-select class="dm-select" clearable v-model="listParams.telTaskType" placeholder="选择类型" @change="getTableList">
<el-option v-for="(v, i) in telTaskTypeOption" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-input v-model="listParams.phoneNumber" class="w200" placeholder="输入号码查询" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-button type="primary" class="fr" @click="$router.push('/calllog/record')">录音设置</el-button>
</div>
<el-table tooltipEffect="light" :data="tableList" style="width:100%" v-loading="loading">
<el-table-column align="left" width="120" prop="callBeginTime" label="呼叫时间">
<template slot-scope="scope">
{{ formatDateTimeByType(scope.row.callBeginTime, 'yyyy-MM-dd-HH-mm-ss', true).y }} <br />
{{ formatDateTimeByType(scope.row.callBeginTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}
</template>
</el-table-column>
<el-table-column align="left" min-width="150" prop="clerkName" label="主叫">
<template slot-scope="scope">
<img class="vertical-middle table__avatar--40" :src="scope.row.clerkImage || defaultAvatar" width="60" height="60" alt="" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{ scope.row.clerkName || '--' }}</p>
<p class="fz13 gray">{{ scope.row.storeGroupName || '--' }}</p>
</div>
</template>
</el-table-column>
<el-table-column align="left" min-width="150" prop="memberId" label="被叫(会员)">
<template slot-scope="scope">
<img class="vertical-middle table__avatar--40" :src="filterAvatar(scope.row.photoUrl)" width="60" height="60" alt="" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{ scope.row.name || '--' }}</p>
<p class="fz13 gray">{{ scope.row.phoneNumber || '--' }}</p>
</div>
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="status" label="通话状态">
<template slot-scope="scope">
{{ scope.row.callStatus === 1 ? '未接通' : scope.row.callStatus === 2 ? '接通' : '成功' }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="status" label="类型">
<template slot-scope="scope">
{{ scope.row.telTaskType !== 1 ? scope.row.ecmName : '不良评价回访' }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="callTime" label="通话时长(秒)">
<template slot-scope="scope">
{{ scope.row.callTime }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="callFee" label="录音">
<template slot-scope="scope">
<span v-if="scope.row.showStatus !== 1">{{ scope.row.description }}</span>
<a v-else :href="scope.row.showRecordUrl" target="_blank" :title="scope.row.description"><i class="iconfont icon-xinxixianshi2 pr5"></i>{{ scope.row.description }}</a>
</template>
</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, sizes, prev, pager, next" :total="total"></el-pagination>
</section>
</template>
<script>
import { callLogList } from '@/service/api/calllogApi.js';
import tableMethods from '@/mixins/tableMethods.js';
import { formatDateTimeByType } from '@/utils/index.js';
import filterAvatar from '@/mixins/filterAvater.js';
export default {
name: 'call-log',
mixins: [filterAvatar, tableMethods],
data() {
const that = this;
return {
formatDateTimeByType,
dateTime: [Date.now() - 30 * 24 * 60 * 60 * 1000, Date.now()],
callStatusOption: [{ value: '', label: '全部' }, { value: 1, label: '未接通' }, { value: 2, label: '接通' }],
telTaskTypeOption: [{ value: '', label: '全部' }, { value: 1, label: '不良评价回访' }, { value: 2, label: 'ECM话务任务' }],
listParams: { marketingType: '', sceneSettingId: '', phoneNumber: '', currentPage: 1, pageSize: 20, callStatus: '', telTaskType: '', memberId: '', storeId: '', referId: '' },
total: 0,
loading: false,
tableList: [],
pickerOptions: {
onPick({ maxDate, minDate }) {
if (new Date(maxDate).getTime() - new Date(minDate).getTime() > 90 * 24 * 60 * 60 * 1000) {
that.$tips({ type: 'warning', message: '时间范围不能大于90天' });
that.$nextTick(_ => {
that.dateTime = ['', ''];
});
}
},
disabledDate(time) {
return time.getTime() > Date.now();
}
}
};
},
created() {
this.$store.commit('aside_handler', false);
this.$store.commit('mutations_breadcrumb', [{ name: '会员管理', path: '' }, { name: '通话记录', path: '' }]);
this.getTableList();
},
methods: {
//列表请求
async getTableList() {
if (this.dateTime) {
this.listParams.beginTime = formatDateTimeByType(this.dateTime[0], 'yyyy-MM-dd');
this.listParams.endTime = formatDateTimeByType(this.dateTime[1], 'yyyy-MM-dd');
} else {
this.listParams.beginTime = '';
this.listParams.endTime = '';
}
this.loading = true;
try {
let res = await callLogList(this.listParams);
if (res.errorCode === 0) {
this.tableList = res.result.result || [];
this.total = res.result.totalCount;
}
} catch (err) {
this.$tips({ type: 'error', message: '请求列表出错' });
}
this.loading = false;
}
}
};
</script>
<template>
<section class="dm-wrap">
<div class="pb22 clearfix">
<el-date-picker v-model="dateTime" :picker-options="pickerOptions" class="w250" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="getTableList"></el-date-picker>
<el-select class="dm-select" clearable="" v-model="listParams.callStatus" placeholder="选择通话状态" @change="getTableList">
<el-option v-for="(v, i) in callStatusOption" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-select class="dm-select" clearable v-model="listParams.telTaskType" placeholder="选择类型" @change="getTableList">
<el-option v-for="(v, i) in telTaskTypeOption" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-input v-model="listParams.phoneNumber" class="w200" placeholder="输入号码查询" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
</div>
<el-table tooltipEffect="light" :data="tableList" style="width:100%" v-loading="loading">
<el-table-column align="left" width="160" prop="callBeginTime" label="呼叫时间">
<template slot-scope="scope">
{{ formatDateTimeByType(scope.row.callBeginTime, 'yyyy-MM-dd-HH-mm-ss') }}
</template>
</el-table-column>
<el-table-column align="left" min-width="150" prop="clerkName" label="主叫">
<template slot-scope="scope">
<img class="vertical-middle table__avatar--40" :src="scope.row.clerkImage || defaultAvatar" width="60" height="60" alt="" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{ scope.row.clerkName || '--' }}</p>
<p class="fz13 gray">{{ scope.row.storeGroupName || '--' }}</p>
</div>
</template>
</el-table-column>
<el-table-column align="left" min-width="150" prop="memberId" label="被叫(会员)">
<template slot-scope="scope">
<img class="vertical-middle table__avatar--40" :src="filterAvatar(scope.row.photoUrl)" width="60" height="60" alt="" />
<div class="inline-block vertical-middle">
<p class="table-name--ellipsis">{{ scope.row.name || '--' }}</p>
<p class="fz13 gray">{{ scope.row.phoneNumber || '--' }}</p>
</div>
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="status" label="通话状态">
<template slot-scope="scope">
{{ scope.row.callStatus === 1 ? '未接通' : scope.row.callStatus === 2 ? '接通' : '成功' }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="status" label="类型">
<template slot-scope="scope">
{{ scope.row.telTaskType !== 1 ? scope.row.ecmName : '不良评价回访' }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="callTime" label="通话时长(秒)">
<template slot-scope="scope">
{{ scope.row.callTime }}
</template>
</el-table-column>
<el-table-column align="left" width="150" prop="callFee" label="录音">
<template slot-scope="scope">
<a v-if="scope.row.recordUrl && scope.row.callStatus == 2" :href="scope.row.recordUrl" target="_blank" title="通话录音">通话录音</a>
</template>
</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, sizes, prev, pager, next" :total="total"></el-pagination>
</section>
<div>
<router-view />
</div>
</template>
<script>
import { callLogList } from '@/service/api/calllogApi.js';
import tableMethods from '@/mixins/tableMethods.js';
import { formatDateTimeByType } from '@/utils/index.js';
import filterAvatar from '@/mixins/filterAvater.js';
export default {
name: 'call-log',
mixins: [filterAvatar, tableMethods],
data() {
const that = this;
return {
formatDateTimeByType,
dateTime: [Date.now() - 30 * 24 * 60 * 60 * 1000, Date.now()],
callStatusOption: [{ value: '', label: '全部' }, { value: 1, label: '未接通' }, { value: 2, label: '接通' }],
telTaskTypeOption: [{ value: '', label: '全部' }, { value: 1, label: '不良评价回访' }, { value: 2, label: 'ECM话务任务' }],
listParams: { marketingType: '', sceneSettingId: '', phoneNumber: '', currentPage: 1, pageSize: 20, callStatus: '', telTaskType: '', memberId: '', storeId: '', referId: '' },
total: 0,
loading: false,
tableList: [],
pickerOptions: {
onPick({ maxDate, minDate }) {
if (new Date(maxDate).getTime() - new Date(minDate).getTime() > 90 * 24 * 60 * 60 * 1000) {
that.$tips({ type: 'warning', message: '时间范围不能大于90天' });
that.$nextTick(_ => {
that.dateTime = ['', ''];
});
}
},
disabledDate(time) {
return time.getTime() > Date.now();
}
}
};
},
created() {
this.$store.commit('aside_handler', false);
this.$store.commit('mutations_breadcrumb', [{ name: '会员管理', path: '' }, { name: '通话记录', path: '' }]);
this.getTableList();
},
methods: {
//列表请求
async getTableList() {
if (this.dateTime) {
this.listParams.beginTime = formatDateTimeByType(this.dateTime[0], 'yyyy-MM-dd');
this.listParams.endTime = formatDateTimeByType(this.dateTime[1], 'yyyy-MM-dd');
} else {
this.listParams.beginTime = '';
this.listParams.endTime = '';
}
this.loading = true;
try {
let res = await callLogList(this.listParams);
if (res.errorCode === 0) {
this.tableList = res.result.result || [];
this.total = res.result.totalCount;
}
} catch (err) {
this.$tips({ type: 'error', message: '请求列表出错' });
}
this.loading = false;
}
}
name: 'calllog'
// created() {}
};
</script>
<template>
<section class="dm-wrap" v-loading="loading" element-loading-text="数据保存中">
<el-alert type="info" :closable="false" show-icon>
<p slot="title" class="fz14 info-color line-height1_5">使用通话录音存储功能需开启通话录音存储服务,未开启则录音不作额外保存。开启后,仅支持保存从开启当天起的录音数据。选择不同保存时长收费标准不同,当前收费标准如下:1、三个月 {{ allUnitFee.storageThreeFee }}元/分钟 2、六个月 {{ allUnitFee.storageSixFee }}元/分钟 3、十二个月 {{ allUnitFee.storageTwelveFee }}元/分钟</p>
</el-alert>
<section class="mt20">
<div class="mb20">
<span class="dm-input_label mr10">开启录音服务</span>
<el-switch v-model="openFlag"></el-switch>
</div>
<div v-show="openFlag">
<span class="dm-input_label mr10">录音保存时长</span>
<el-radio-group v-model="storageType">
<el-radio :label="0">三个月</el-radio>
<el-radio :label="1">六个月</el-radio>
<el-radio :label="2">十二个月</el-radio>
</el-radio-group>
</div>
<div class="mt30"><el-button type="primary" class="save" @click="submit">保存</el-button></div>
</section>
</section>
</template>
<script>
import { saveCallSetting, getCallSetting } from '@/service/api/calllogApi.js';
export default {
name: 'record',
data() {
return {
openFlag: false,
storageType: 0,
loading: false,
// 录音收费
allUnitFee: {
storageThreeFee: 0,
storageSixFee: 0,
storageTwelveFee: 0
}
};
},
methods: {
submit() {
this.loading = true;
const { openFlag, storageType } = this;
saveCallSetting({ openFlag: Number(openFlag), storageType }).then(res => {
this.loading = false;
this.$tips({ type: 'success', message: res.result });
});
}
},
created() {
this.$store.commit('aside_handler', false);
this.$store.commit('mutations_breadcrumb', [{ name: '会员管理', path: '' }, { name: '通话记录', path: '/calllog/index' }, { name: '录音存储设置', path: '' }]);
getCallSetting().then(res => {
const { callSetting, unitFee } = res.result;
if (callSetting) {
this.openFlag = !!callSetting.openFlag;
this.storageType = callSetting.storageType;
}
Object.keys(unitFee).map(v => {
this.allUnitFee[v] = Number(unitFee[v]).toFixed(2) || '0.00';
});
});
}
};
</script>
<style scoped>
.save {
margin-left: 98px;
}
</style>
......@@ -8,7 +8,8 @@
<el-table tooltipEffect="light" :data="tableList" style="width: 100%" v-loading="loading">
<el-table-column :show-overflow-tooltip="true" width="160" align="left" prop="createTime" label="操作时间">
<template slot-scope="scope">
<p>{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm') }}</p>
<p>{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm', true).y }}</p>
<p>{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm', true).h }}</p>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" width="160" align="left" prop="orderNumber" label="订单流水号">
......
......@@ -19,7 +19,8 @@
<el-table tooltipEffect="light" :data="recordList" style="width: 100%" v-loading="recordLoading" @sort-change="sortList">
<el-table-column width="135" align="left" prop="receiveTime" label="领取时间" fixed="left">
<template slot-scope="scope">
{{ formatDateTimeByType(scope.row.receiveTime, 'yyyy-MM-dd-HH-mm') }}
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.receiveTime, 'yyyy-MM-dd-HH-mm', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.receiveTime, 'yyyy-MM-dd-HH-mm', true).h }}</p>
</template>
</el-table-column>
<el-table-column width="80" align="left" prop="cardTypeExcel" label="卡券类型"> </el-table-column>
......@@ -30,7 +31,8 @@
<el-table-column min-width="100" align="left" prop="attentionStatus" label="关注状态"> </el-table-column>
<el-table-column width="135" align="left" prop="transferDate" label="关注时间">
<template slot-scope="scope">
{{ scope.row.transferDate ? formatDateTimeByType(scope.row.transferDate, 'yyyy-MM-dd-HH-mm') : '--' }}
<p style="color:#606266;">{{ scope.row.transferDate ? formatDateTimeByType(scope.row.transferDate, 'yyyy-MM-dd-HH-mm', true).y : '--' }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.transferDate, 'yyyy-MM-dd-HH-mm', true).h }}</p>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" min-width="140" header-align="left" align="left" :key="Math.random()" prop="clerkId" label="会员信息">
......
......@@ -15,12 +15,14 @@
<el-table tooltipEffect="light" :data="recordList" style="width: 100%" v-loading="recordLoading" @sort-change="sortList">
<el-table-column width="135" align="left" prop="receiveTime" label="领取时间" fixed="left" sortable="custom">
<template slot-scope="scope">
{{ formatDateTimeByType(scope.row.receiveTime, 'yyyy-MM-dd-HH-mm') }}
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.receiveTime, 'yyyy-MM-dd-HH-mm', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.receiveTime, 'yyyy-MM-dd-HH-mm', true).h }}</p>
</template>
</el-table-column>
<el-table-column width="135" align="left" prop="writeOffTime" label="核销时间" fixed="left" sortable="custom">
<template slot-scope="scope">
{{ scope.row.useTime ? formatDateTimeByType(scope.row.useTime, 'yyyy-MM-dd-HH-mm') : '--' }}
<p style="color:#606266;">{{ scope.row.useTime ? formatDateTimeByType(scope.row.useTime, 'yyyy-MM-dd-HH-mm', true).y : '--' }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.useTime, 'yyyy-MM-dd-HH-mm', true).h }}</p>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" min-width="140" header-align="left" align="left" :key="Math.random()" prop="clerkId" label="会员信息">
......
......@@ -6,7 +6,8 @@
<el-table tooltipEffect="light" :data="recordList" style="width: 100%" row-key="putonTime" v-loading="loading">
<el-table-column width="160" align="left" prop="putonTime" label="投放时间" fixed="left">
<template slot-scope="scope">
{{ formatDateTimeByType(scope.row.putonTime, 'yyyy-MM-dd-HH-mm') }}
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.putonTime, 'yyyy-MM-dd-HH-mm', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.putonTime, 'yyyy-MM-dd-HH-mm', true).h }}</p>
</template>
</el-table-column>
<el-table-column width="150" align="left" prop="cardName" label="卡券名称">
......
......@@ -74,6 +74,8 @@ export default {
return row.errCode === '0' ? '满足' : '不满足';
}
},
{ label: '主门店', prop: 'mainStoreName', minWidth: '120', align: 'left' },
{ label: '专属导购', prop: 'mainClerkName', minWidth: '120', align: 'left' },
{ label: '备注', prop: 'errMsg', minWidth: '120', align: 'left' }
],
tableList: [],
......
......@@ -15,6 +15,12 @@
<span v-else>{{ scope.row[v.prop] }}</span>
</template>
</el-table-column>
<el-table-column label="批次时间" align="left" width="120" prop="execTime">
<template slot-scope="scope">
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.execTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.execTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</template>
</el-table-column>
<el-table-column label="操作" align="left" width="220" fixed="right">
<template slot-scope="scope">
<el-button type="text" @click="toDialog(scope.row)">批次人数</el-button>
......@@ -52,16 +58,18 @@ export default {
total: 0,
loading: false,
tableHeader: [
{
label: '批次时间',
prop: 'execTime',
minWidth: '120',
align: 'left',
fixed: 'left',
formatter(row) {
return formatDateTimeByType(row.execTime, 'yyyy-MM-dd-HH-mm');
}
},
// {
// label: '批次时间',
// prop: 'execTime',
// minWidth: '120',
// align: 'left',
// fixed: 'left',
// formatter(row) {
// const date = formatDateTimeByType(row.execTime, 'yyyy-MM-dd-HH-mm', true);
// return date.y + '\n' + date.h;
// // return formatDateTimeByType(row.execTime, 'yyyy-MM-dd-HH-mm');
// }
// },
{
label: '营销方式',
prop: 'marketingType',
......@@ -108,6 +116,7 @@ export default {
this.$store.commit('mutations_layoutTips', '');
},
methods: {
formatDateTimeByType,
search() {
this.listParams.currentPage = 1;
this.ecmBatchSendInfos();
......
......@@ -19,6 +19,12 @@
<span v-else>{{ scope.row[v.prop] }}</span>
</template>
</el-table-column>
<el-table-column label="发送时间" align="left" width="120" prop="createTime">
<template slot-scope="scope">
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</template>
</el-table-column>
</el-table>
</div>
<div class="dm-wrap">
......@@ -95,17 +101,20 @@ export default {
tableList: [],
tableHeader: [
{ label: '回复信息', prop: 'title', minWidth: '120', align: 'left' },
{
label: '发送时间',
prop: 'createTime',
minWidth: '120',
align: 'left',
formatter(row) {
return formatDateTimeByType(row.createTime, 'yyyy-MM-dd-HH-mm');
}
},
// {
// label: '发送时间',
// prop: 'createTime',
// minWidth: '120',
// align: 'left',
// formatter(row) {
// const date = formatDateTimeByType(row.createTime, 'yyyy-MM-dd-HH-mm', true);
// return date.y + '\n' + date.h;
// }
// },
{ label: '会员信息', prop: 'marketingType', minWidth: '120', align: 'left', component: 'member-info' },
{ label: '手机号码', prop: 'phoneNumber', minWidth: '120', align: 'left' },
{ label: '主门店', prop: 'mainStoreName', minWidth: '120', align: 'left' },
{ label: '专属导购', prop: 'mainClerkName', minWidth: '120', align: 'left' },
{
label: '状态',
prop: 'errCode',
......@@ -135,6 +144,7 @@ export default {
this.$store.commit('mutations_layoutTips', '');
},
methods: {
formatDateTimeByType,
handleSelectionChange(val) {
let list = val
.map(v => v.ecmMarketingTypeRelationId)
......
......@@ -13,7 +13,8 @@
<el-table tooltipEffect="light" :data="tableList" style="width: 100%" v-loading="loading" element-loading-text="拼命加载中">
<el-table-column :show-overflow-tooltip="true" width="160" align="left" :key="Math.random()" prop="createTime" label="评价时间">
<template slot-scope="scope">
<p>{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm') }}</p>
<p style="color:#606266">{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm', true).y }}</p>
<p style="color:#606266">{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm', true).h }}</p>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" min-width="200" align="left" :key="Math.random()" prop="storeName" label="门店">
......
<template>
<section class="dm-form__wrap">
<!-- TODO: 1接口没有这个参数 -->
<h3 class="dm-title__label">分享设置</h3>
<el-form-item label="分享到朋友圈" class="width50 is-required">
<el-radio-group v-model="shareGroup">
<el-form-item label="分享设置" class="width50 is-required">
<el-radio-group v-model="form.shareFlag">
<el-radio :label="1">可分享</el-radio>
<el-radio :label="2">不可分享</el-radio>
<el-radio :label="0">不可分享</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="分享给朋友" class="width50 is-required">
<el-radio-group v-model="shareFriend">
<el-radio :label="1">可分享</el-radio>
<el-radio :label="2">不可分享</el-radio>
</el-radio-group>
<el-form-item v-if="form.shareFlag === 1" label="分享图" prop="shareImg.imgUrl" class="width50" :rules="{ required: true, message: '请上传分享图片', trigger: 'blur' }">
<dm-upload-avatar :limit="{ maxSize: 1 }" :model.sync="form.shareImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:200*200,格式为jpg/png/gif。图片大小不超过1MB,点击图片可重新上传。" :disabled="isInfo"></dm-upload-avatar>
</el-form-item>
<el-form-item label="分享图" class="width50 is-required">
<dm-upload-avatar :model.sync="shareImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:高度200px*200px" :disabled="isInfo"></dm-upload-avatar>
<el-form-item v-if="form.shareFlag === 1" label="分享标题" prop="shareTitle" class="width50" :rules="{ required: true, message: '标题不能为空', trigger: 'blur' }">
<dm-input v-model="form.shareTitle" class="w400" placeholder="请输入分享标题" :disabled="isInfo" :maxlength="20"></dm-input>
</el-form-item>
<el-form-item label="分享标题" prop="shareTitle" class="width50">
<dm-input v-model="shareTitle" class="w400" placeholder="请输入分享标题" :disabled="isInfo" :maxlength="20"></dm-input>
</el-form-item>
<el-form-item label="分享描述" prop="shareTextInfo" class="width50">
<dm-input type="textarea" class="w400" :rows="4" v-model="shareTextInfo" placeholder="请输入分享描述" :disabled="isInfo" :maxlength="50"></dm-input>
<el-form-item v-if="form.shareFlag === 1" label="分享描述" prop="shareTextInfo" class="width50" :rules="{ required: true, message: '描述不能为空', trigger: 'blur' }">
<dm-input type="textarea" class="w400" :rows="4" v-model="form.shareTextInfo" placeholder="请输入分享描述" :disabled="isInfo" :maxlength="50"></dm-input>
</el-form-item>
</section>
</template>
<script>
import dmUploadAvatar from '@/components/upload/avatar';
export default {
props: {
shareGroup: {
type: Number,
default: 1
},
shareFriend: {
type: Number,
default: 1
},
shareImg: {
form: {
type: Object,
default() {
return {
imgUrl: '',
code: ''
shareFlag: 1,
shareTitle: '',
shareTextInfo: '',
shareImg: {
code: '',
imgUrl: '', // eslint-disable-line
wxImg: ''
}
};
}
},
shareTitle: {
type: String,
default: ''
},
shareTextInfo: {
type: String,
default: ''
ruleShareChange: {
type: Function
},
isInfo: {
type: Boolean,
default: false
}
},
watch: {
childData: {
handler(val) {},
deep: true
}
// watch: {},
components: {
dmUploadAvatar
}
};
</script>
<template>
<section class="dm-form__wrap clearfix">
<h3 class="dm-title__label">
参与门槛
<i class="iconfont icon-xinxixianshi pl5 gray"></i>
<span class="gray fz13">满足参与门槛会员才可以参与游戏</span>
</h3>
<el-form-item label="参与门槛" prop="memberType">
<el-radio v-model="form.memberType" :label="0">所有用户</el-radio>
<el-radio v-model="form.memberType" :label="1">会员筛选</el-radio>
<el-radio v-model="form.memberType" :label="2">会员分组</el-radio>
</el-form-item>
<div class="">
<!-- 会员筛选 -->
<el-form-item label="选择会员" v-if="form.memberType === 1" class="calc1">
<vue-gic-people :projectName="projectName" :isAdd="isAdd" :triggerReset="true" :useId="thresholdData.useId" :hasSearchData="thresholdData.hasSearchData" :sceneValue="sceneValue" ref="peopleFilter" @findFilter="findFilter" @getBackData="getBackData" @editHide="editHide" @editShow="editShow" @hideBtn="hideBtn" />
<div class="gic-people--button" v-show="toggleTag">
<el-button size="small" type="primary" @click="getData">确 定</el-button>
<el-button size="small" @click="cancelFilter">取 消</el-button>
</div>
</el-form-item>
<!-- 会员分组 -->
<vue-gic-member-group class="calc2" v-if="form.memberType === 2" :defaltSelected="thresholdData.defaltSelected" :height="400" :projectName="projectName" :headerList="headerList" @handleDataTransferred="handleDataTransferred" @handleDataLeft="handleDataLeft"></vue-gic-member-group>
</div>
<div class="width60 fl">
<el-form-item label="提示图片" prop="tipsImg">
<dm-upload-avatar :limit="{ maxSize: 1 }" :model.sync="form.tipsImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:200*200,格式为jpg/png/gif。图片大小不超过1MB,点击图片可重新上传。" :disabled="isInfo"></dm-upload-avatar>
</el-form-item>
<el-form-item label="提示文字" prop="tipTitle">
<dm-input v-model="form.tipTitle" type="textarea" placeholder="最多输入60个字" :maxlength="60" class="w400" :rows="6"></dm-input>
</el-form-item>
</div>
<div class="width40 fr">
<div class="game-tips__preview">
<div class="game-tips__preview__inner">
<p class="game-tips__preview--title">你还未满足参与游戏条件!</p>
<img class="game-tips__preview--img" :src="form.tipsImg.imgUrl || defaultImg" alt="" />
<p class="game-tips__preview--desc">{{ form.tipTitle }}</p>
</div>
</div>
</div>
</section>
</template>
<script>
import dmUploadAvatar from '@/components/upload/avatar';
// 参与门槛组件
export default {
name: 'threshold',
props: {
thresholdData: {
type: Object,
default() {
return {
searchParams: '', // 会员筛选
hasSearchData: '', // 反显数据保存
getSaveData: '', // 会员筛选回显保存的数据
useId: '', // 会员筛选filter
memberGroupIds: '', // 会员分组
defaltSelected: [] // 会员分组默认穿梭窗已选入数据
};
}
},
form: {
type: Object
},
isAdd: {
type: Boolean,
default: true
}
},
data() {
return {
// 会员分组可传参数
projectName: 'marketing', // 默认是memberTag
headerList: ['isRealTime', 'latestUpdateTime', 'updateType', 'effectiveStatus', 'effectiveDate'],
effectiveStatus: 1, // 不传: 所有状态 1: 有效 0: 失效
// 人群筛选器可传参数
// memberGroupIds: '', // 传入数据 放入
sceneValue: 'member', // 场景值
toggleTag: false, // 控制按钮显示的参数,仅供参考,可自行修改
saveTag: false
};
},
components: {
dmUploadAvatar
},
methods: {
/**---------人群筛选器的方法-------------*/
getData() {
this.$refs.peopleFilter.confirmSet();
},
// 子组件触发父组件事件,返回过滤条件数据
findFilter(value) {
this.thresholdData.searchParams = value;
},
// 取消
cancelFilter() {
this.$refs.peopleFilter.cancelSet();
},
// 获取需要回显的数据, 供保存时候使用
getBackData(val) {
this.thresholdData.getSaveData = val === 'remove' ? '' : val; // 回显数据写在父组件对象中
},
// 显示编辑,保存按钮隐藏,确认按钮显示 (子组件会调用)
editShow() {
this.toggleTag = true;
this.saveTag = false;
},
// 显示保存按钮,隐藏确认按钮显示 (子组件会调用)
editHide() {
this.toggleTag = false;
this.saveTag = true;
},
// 隐藏保存按钮和确认按钮 (子组件会调用)
hideBtn() {
this.toggleTag = false;
this.saveTag = false;
},
/**---------会员分组的方法-------------*/
handleDataTransferred(data) {
// 会员分组 情况下 memberSearchDTO 传数组字符串
if (this.form.memberType === 2) {
this.thresholdData.memberGroupIds = data
.map(v => v.memberTagGroupId)
.filter(v => v)
.join(',');
}
},
handleDataLeft(selectedData, selectionToRemove) {
// 删除右侧
this.thresholdData.memberGroupIds = selectedData
.map(v => v.memberTagGroupId)
.filter(v => v)
.join(',');
}
}
};
</script>
<style scoped>
.calc1 {
width: calc(60% + 330px);
}
.calc2 {
width: calc(60% + 330px + 30px);
}
</style>
......@@ -93,7 +93,8 @@ export default {
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.gameStartTime ? date.y + '<br/>' + date.h : '';
}
},
{
......@@ -103,7 +104,8 @@ export default {
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.gameEndTime ? date.y + '<br/>' + date.h : '';
}
},
{ label: '参与人数', prop: 'userCount', width: '80', align: 'left' },
......
......@@ -12,7 +12,8 @@
<el-table tooltipEffect="light" :data="recordList" style="width:100%" v-loading="loading">
<el-table-column :min-width="150" align="left" label="中奖时间">
<template slot-scope="scope">
{{ formatDateTimeByType(scope.row.winDate, 'yyyy-MM-dd-HH-mm-ss') }}
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.winDate, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.winDate, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</template>
</el-table-column>
<el-table-column :min-width="150" align="left" label="会员信息">
......
......@@ -92,7 +92,8 @@ export default {
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.gameStartTime ? date.y + '<br/>' + date.h : '';
}
},
{
......@@ -102,7 +103,8 @@ export default {
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.gameEndTime ? date.y + '<br/>' + date.h : '';
}
},
{ label: '参与人数', prop: 'userCount', width: '80', align: 'left' },
......
......@@ -12,7 +12,8 @@
<el-table tooltipEffect="light" :data="recordList" style="width:100%" v-loading="loading">
<el-table-column :min-width="150" align="left" label="中奖时间">
<template slot-scope="scope">
{{ formatDateTimeByType(scope.row.winDate, 'yyyy-MM-dd-HH-mm-ss') }}
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.winDate, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.winDate, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</template>
</el-table-column>
<el-table-column :min-width="150" align="left" label="会员信息">
......
......@@ -53,11 +53,11 @@ export default {
},
total: 0,
tableHeader: [
{ label: '游戏名称', prop: 'gameName', width: '120', align: 'left', fixed: 'left' },
{ label: '游戏名称', prop: 'gameName', width: '180', align: 'left', fixed: 'left' },
{
label: '游戏状态',
prop: 'activityStatus',
width: '80',
width: '180',
align: 'left',
formatter: function(row) {
if (row.activityStatus === 1) {
......@@ -72,21 +72,23 @@ export default {
{
label: '开始时间',
prop: 'gameStartTime',
minWidth: '170',
minWidth: '100',
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.gameStartTime ? date.y + '<br/>' + date.h : '';
}
},
{
label: '结束时间',
prop: 'gameEndTime',
minWidth: '170',
minWidth: '100',
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.gameEndTime ? date.y + '<br/>' + date.h : '';
}
},
{ label: '参与人数', prop: 'cyrs', width: '80', align: 'left' },
......
......@@ -60,6 +60,12 @@ export default {
dmUploadAvatar
},
methods: {
clear() {
this.form.prizeImage = { imgUrl: '', code: '' };
this.form.proGiftId = '';
this.form.giftStock = '';
this.form.proGiftName = '';
},
close(formName) {
this.$emit('update:show', false);
// this.$nextTick(_ => {
......@@ -68,7 +74,6 @@ export default {
},
//保存奖品
saveGift(formName) {
console.log(this.form.prizeImage);
if (!this.form.prizeImage.code) {
this.$tips({ type: 'warning', message: '礼品图片未上传' });
return;
......@@ -83,7 +88,7 @@ export default {
proGiftId: this.form.proGiftId
};
saveGift(params).then(res => {
console.log(this.form);
// console.log(this.form);
if (res.errorCode === 0) {
this.$tips({ type: 'success', message: '保存成功' });
this.form.proGiftId = res.result.proGiftId;
......
......@@ -22,6 +22,12 @@
</a>
</template>
</el-table-column>
<el-table-column :min-width="100" align="left" label="中奖时间" prop="createTime">
<template slot-scope="scope">
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</template>
</el-table-column>
<el-table-column v-for="(v, i) in rankHeader" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter"></el-table-column>
</el-table>
<el-pagination v-show="rankList.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>
......@@ -45,14 +51,15 @@ export default {
loading: false,
rankList: [],
rankHeader: [
{
label: '中奖时间',
prop: 'createTime',
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.createTime, 'yyyy-MM-dd-HH-mm-ss');
}
},
// {
// label: '中奖时间',
// prop: 'createTime',
// align: 'left',
// formatter: function(row) {
// const date = formatDateTimeByType(row.createTime, 'yyyy-MM-dd-HH-mm-ss', true);
// return date.y + '\n' + date.h;
// }
// },
{ label: '手机号码', prop: 'phoneNumber', align: 'left' },
{ label: '口令', prop: 'winCode', align: 'left' },
{
......@@ -95,6 +102,7 @@ export default {
};
},
methods: {
formatDateTimeByType,
async klflReportList() {
this.loading = true;
if (!this.date) {
......
......@@ -28,12 +28,12 @@
<el-button @click="close">关 闭</el-button>
<el-button type="primary" @click="submit('form')">保 存</el-button>
</span>
<prize-set :info.sync="prizeSetInfo" :show.sync="prizeSetShow"></prize-set>
<prize-set ref="gift" :info.sync="prizeSetInfo" :show.sync="prizeSetShow"></prize-set>
<calculate :show.sync="calculateShow" :prizeId="dataId" :prizeReferId="form.prizeReferType === 2 ? cardObj.coupCardId : form.proGiftId" :prizeReferType="form.prizeReferType" :totalCount="parseInt(form.prizeCount)" @countRefresh="countRefresh"></calculate>
</el-dialog>
</template>
<script>
import { klflStrategy, klflStrategySave } from '@/service/api/gameApi.js';
import { klflStrategy, klflStrategySave, saveGift } from '@/service/api/gameApi.js';
import { resetParams } from '@/utils/index.js';
import calculate from '@/components/calculate';
import prizeSet from './prizeSet';
......@@ -193,6 +193,7 @@ export default {
}
},
close() {
this.$refs.gift.clear();
this.$emit('update:show', false);
},
submit(formName) {
......@@ -216,17 +217,34 @@ export default {
crowdFilter: this.form.crowdFilter,
searchJson: this.getSaveData
};
klflStrategySave(data).then(res => {
this.$tips({ type: 'success', message: '操作成功' });
this.$emit('update:show', false);
this.$emit('refesh');
});
// 新增且prizeReferType=3(礼品)时,在提交之前把奖品数量update给礼品
if (this.form.gamePrizeStrategyId === undefined && this.form.prizeReferType === 3) {
saveGift({
giftName: this.prizeSetInfo.proGiftName,
mainPicUrl: this.prizeSetInfo.prizeImage.imgUrl || '',
mainPicFieldCode: this.prizeSetInfo.prizeImage.code || '',
proGiftId: this.prizeSetInfo.proGiftId,
giftStock: this.form.prizeStock
}).then(() => {
this.handleKlflStrategySave(data);
});
} else {
this.handleKlflStrategySave(data);
}
} else {
this.$tips({ type: 'warning', message: '表单填写不完整' });
return false;
}
});
},
handleKlflStrategySave(data) {
klflStrategySave(data).then(res => {
this.$refs.gift.clear();
this.$tips({ type: 'success', message: '操作成功' });
this.$emit('update:show', false);
this.$emit('refesh');
});
},
/** ----------人群筛选器的方法----------- */
//获取指定会员
getData() {
......
......@@ -74,7 +74,8 @@ export default {
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.gameStartTime ? date.y + '<br/>' + date.h : '';
}
},
{
......@@ -84,7 +85,8 @@ export default {
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.gameEndTime ? date.y + '<br/>' + date.h : '';
}
},
{ label: '参与人数', prop: 'cyrs', width: '80', align: 'left' },
......
......@@ -26,6 +26,7 @@
<template v-for="(v, i) in skin.entry">
<skin-upload :key="i" :obj.sync="v" levelOne="entry" :levelTwo="i" @skinUpload="skinUpload" @skinReset="skinReset"></skin-upload>
</template>
<p class="rule" :class="skinType === 2 ? 'orange' : 'white'">活动规则>></p>
</div>
</div>
</div>
......@@ -472,5 +473,19 @@ export default {
}
}
}
.rule {
cursor: default;
position: absolute;
bottom: 10%;
z-index: 999;
width: 100%;
text-align: center;
}
.white {
color: rgba(255, 255, 255, 0.8);
}
.orange {
color: rgba(240, 88, 50, 0.6);
}
}
</style>
......@@ -42,6 +42,12 @@
</a>
</template>
</el-table-column>
<el-table-column :min-width="100" align="left" label="玩游戏时间" prop="createTime">
<template slot-scope="scope">
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</template>
</el-table-column>
<el-table-column v-for="(v, i) in recordHeader" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter"></el-table-column>
</el-table>
<el-pagination v-show="recordList.length" background class="dm-pagination" @size-change="handleSizeChange1" @current-change="handleCurrentChange1" :current-page="listParams1.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams1.pageSize" layout="total, sizes, prev, pager, next" :total="total1"></el-pagination>
......@@ -75,14 +81,15 @@ export default {
loading1: false,
recordList: [],
recordHeader: [
{
label: '玩游戏时间',
prop: 'createTime',
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.createTime, 'yyyy-MM-dd-HH-mm-ss');
}
},
// {
// label: '玩游戏时间',
// prop: 'createTime',
// align: 'left',
// formatter: function(row) {
// const date = formatDateTimeByType(row.createTime, 'yyyy-MM-dd-HH-mm-ss', true);
// return date.y + '\n' + date.h;
// }
// },
{ label: '手机号码', prop: 'memberPhone', align: 'left' },
{ label: '消耗方式', prop: 'costType', align: 'left' },
{ label: '消耗数值', prop: 'costValue', align: 'left' },
......@@ -112,6 +119,7 @@ export default {
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理', path: '' }, { name: '游戏营销', path: '/game' }, { name: '拼图游戏', path: '/game/ptyx' }, { name: '拼图游戏统计', path: '' }]);
},
methods: {
formatDateTimeByType,
async ptyxCalcTitle() {
let res = await ptyxCalcTitle({ gameActivityId: this.$route.params.id });
if (res.errorCode === 0) {
......
......@@ -45,11 +45,11 @@ export default {
listParams: { gameStatus: -1, searchParam: '', currentPage: 1, pageSize: 20 },
total: 0,
tableHeader: [
{ label: '游戏名称', prop: 'gameName', width: '120', align: 'left', fixed: 'left', tooltip: true },
{ label: '游戏名称', prop: 'gameName', width: '150', align: 'left', fixed: 'left', tooltip: true },
{
label: '游戏状态',
prop: 'activityStatus',
width: '80',
width: '100',
align: 'left',
formatter: function(row) {
if (row.activityStatus === 1) {
......@@ -64,21 +64,23 @@ export default {
{
label: '开始时间',
prop: 'gameStartTime',
minWidth: '170',
minWidth: '100',
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.gameStartTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.gameStartTime ? date.y + '<br/>' + date.h : '';
}
},
{
label: '结束时间',
prop: 'gameEndTime',
minWidth: '170',
minWidth: '100',
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.gameEndTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.gameEndTime ? date.y + '<br/>' + date.h : '';
}
},
{ label: '参与人数', prop: 'cyrs', width: '80', align: 'left' },
......
......@@ -45,6 +45,12 @@
</a>
</template>
</el-table-column>
<el-table-column :min-width="100" align="left" label="玩游戏时间" prop="createTime">
<template slot-scope="scope">
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.createTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</template>
</el-table-column>
<el-table-column v-for="(v, i) in recordHeader" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter"></el-table-column>
</el-table>
<el-pagination v-show="recordList.length" background class="dm-pagination" @size-change="handleSizeChange1" @current-change="handleCurrentChange1" :current-page="listParams1.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams1.pageSize" layout="total, sizes, prev, pager, next" :total="total1"></el-pagination>
......@@ -94,14 +100,15 @@ export default {
loading1: false,
recordList: [],
recordHeader: [
{
label: '玩游戏时间',
prop: 'createTime',
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.createTime, 'yyyy-MM-dd-HH-mm-ss');
}
},
// {
// label: '玩游戏时间',
// prop: 'createTime',
// align: 'left',
// formatter: function(row) {
// const date = formatDateTimeByType(row.createTime, 'yyyy-MM-dd-HH-mm-ss', true);
// return date.y + '\n' + date.h;
// }
// },
{ label: '手机号码', prop: 'memberPhone', align: 'left' },
{
label: '游戏状态',
......@@ -144,6 +151,7 @@ export default {
};
},
methods: {
formatDateTimeByType,
//排名列表
async znmReportList() {
this.loading = true;
......
......@@ -77,6 +77,12 @@
<el-button v-else type="text" @click="errorCodeShow = true">{{ scope.row.errorMsg }}</el-button>
</template>
</el-table-column>
<el-table-column :min-width="100" align="left" label="上报时间" prop="backTime">
<template slot-scope="scope">
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.backTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.backTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="false" :min-width="150" align="left" label="短信内容" prop="remark">
<template slot-scope="scope">
<el-popover class="item" trigger="hover" width="300" v-if="scope.row.remark.length > 10" :content="scope.row.remark" placement="top-start">
......@@ -112,7 +118,7 @@ export default {
messageHeader: [
{ label: '手机号码', prop: 'telephone', width: '120', align: 'left' },
{
label: '回执状态',
label: '发送状态',
prop: 'sendStatus',
width: '80',
align: 'left',
......@@ -121,24 +127,26 @@ export default {
}
},
{
label: '上报时间',
prop: 'backTime',
minWidth: '100',
tooltip: true,
align: 'left',
formatter: function(row) {
return formatDateTimeByType(row.backTime, 'yyyy-MM-dd-HH-mm-ss');
}
},
{
label: '发送状态',
label: '回执状态',
prop: 'backStatus',
width: '80',
align: 'left',
formatter: function(row) {
return row.backStatus === 0 ? '接收失败' : row.backStatus ? '接收成功' : '--';
// eslint-disable-next-line
return row.backStatus === 0 && row.backTime === null ? '--' : (row.backStatus ? '接收成功' : '接收失败')
}
}
// {
// label: '上报时间',
// prop: 'backTime',
// minWidth: '100',
// tooltip: true,
// align: 'left',
// formatter: function(row) {
// const date = formatDateTimeByType(row.backTime, 'yyyy-MM-dd-HH-mm-ss', true);
// return row.backTime ? date.y + '\n' + date.h : '';
// }
// },
],
listParams: {
sendStatus: '',
......@@ -220,7 +228,6 @@ export default {
// window.location = downLoadUrl;
// });
// },
// TODO
exportExcel() {
this.dialogVisible = true;
this.excelUrl = exportSmsExcel;
......
......@@ -12,6 +12,12 @@
<el-button class="fr" type="primary" @click="$router.push('/message/record/add')">新建群发</el-button>
</div>
<el-table tooltipEffect="light" :data="messageList" style="width: 100%" row-key="sendTime" v-loading="recordLoading">
<el-table-column :min-width="100" align="left" label="发送时间" prop="sendTime">
<template slot-scope="scope">
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.sendTime, 'yyyy-MM-dd-HH-mm-ss', true).y }}</p>
<p style="color:#606266;">{{ formatDateTimeByType(scope.row.sendTime, 'yyyy-MM-dd-HH-mm-ss', true).h }}</p>
</template>
</el-table-column>
<el-table-column v-for="(v, i) in recordHeader" :show-overflow-tooltip="v.tooltip" :width="v.width" :min-width="v.minWidth" :align="v.align" :key="i" :prop="v.prop" :label="v.label" :formatter="v.formatter" :fixed="v.fixed"></el-table-column>
<el-table-column label="状态" prop="sendStatus" align="left" width="140px">
<template slot-scope="scope">
......@@ -51,16 +57,17 @@ export default {
recordLoading: false,
messageList: [],
recordHeader: [
{
label: '发送时间',
prop: 'sendTime',
minWidth: '160',
align: 'left',
fixed: 'left',
formatter(row) {
return formatDateTimeByType(row.sendTime, 'yyyy-MM-dd-HH-mm-ss');
}
},
// {
// label: '发送时间',
// prop: 'sendTime',
// minWidth: '160',
// align: 'left',
// fixed: 'left',
// formatter(row) {
// const date = formatDateTimeByType(row.sendTime, 'yyyy-MM-dd-HH-mm-ss', true);
// return date.y + '\n' + date.h;
// }
// },
{
label: '模板名称',
prop: 'templateName',
......@@ -120,6 +127,7 @@ export default {
this.sceneSettingList();
},
methods: {
formatDateTimeByType,
async getTableList() {
try {
this.recordLoading = true;
......
......@@ -75,7 +75,8 @@ export default {
align: 'left',
sortable: 'custom',
formatter: function(row) {
return formatDateTimeByType(row.updateTime, 'yyyy-MM-dd-HH-mm-ss');
const date = formatDateTimeByType(row.updateTime, 'yyyy-MM-dd-HH-mm-ss', true);
return row.updateTime ? date.y + '<br/>' + date.h : '';
}
}
],
......
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.
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