Commit 494dd945 by 黑潮

Merge branch 'feature/11月迭代'

# Conflicts:
#	dist/index.html
#	dist/static/css/main.302768bfb2cad28345a044264c696330.css
#	dist/static/css/main.9ffb0a7638f173779b3c6fdc142a3efe.css
#	dist/static/css/main.bb46b841b46ecb8397de23d0f3630a00.css
#	dist/static/js/card.4451729cb112535eabe5.js
#	dist/static/js/card.f2e2af9187c12d0ba59f.js
#	dist/static/js/card.fcb880cae87fec6d8d8c.js
#	dist/static/js/ecm.2ffa1ed480951d46cf75.js
#	dist/static/js/ecm.8472333400fe4f177129.js
#	dist/static/js/ecm.bb1923676910b2b102ef.js
#	dist/static/js/message.4d35e4fed5ae86e40cc1.js
parents 5c636167 20214d9e
<!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/fonts/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link rel=stylesheet href=//web-1251519181.file.myqcloud.com/components/element.2.12.0.css><link href=/marketing/static/css/main.bb46b841b46ecb8397de23d0f3630a00.css rel=stylesheet></head><body><div id=app></div><script>(function() {
<!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/fonts/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link rel=stylesheet href=//web-1251519181.file.myqcloud.com/components/element.2.12.0.css><link href=/marketing/static/css/main.c18ba4d2bf0d3c4cf1cf8d9a660be7b6.css rel=stylesheet></head><body><div id=app></div><script>(function() {
var src = '/component/static/import-component.js?timestrap=' + new Date().getTime();
var host = window.location.host;
host = host.indexOf('localhost') > -1 || host.indexOf('192.168') > -1 ? 'gicdev.demogic.com' : host;
document.write('<script src="//' + host + src + '"><\/script>');
})();</script><script src=//web-1251519181.file.myqcloud.com/components/pagination.1.0.8.js></script><script src=//web-1251519181.file.myqcloud.com/components/track.1.0.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/upload-file.1.0.6.js></script><script src=//web-1251519181.file.myqcloud.com/components/steps.1.0.1.js></script><script type=text/javascript src=/marketing/static/js/manifest.9e2572413e0a3eb17f52.js></script><script type=text/javascript src=/marketing/static/js/vendor.60b9dda16393a2ab9e6a.js></script><script type=text/javascript src=/marketing/static/js/main.bdffb6195f17055d0182.js></script></body></html>
\ No newline at end of file
})();</script><script src=//web-1251519181.file.myqcloud.com/components/pagination.1.0.8.js></script><script src=//web-1251519181.file.myqcloud.com/components/track.1.0.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/upload-file.1.0.6.js></script><script src=//web-1251519181.file.myqcloud.com/components/steps.1.0.1.js></script><script type=text/javascript src=/marketing/static/js/manifest.8c6925a028bb75b76830.js></script><script type=text/javascript src=/marketing/static/js/vendor.60b9dda16393a2ab9e6a.js></script><script type=text/javascript src=/marketing/static/js/main.0f7f011d19408a7967d0.js></script></body></html>
\ No newline at end of file
@font-face {
font-family: "iconfont"; /* Project id 688955 */
src: url('iconfont.woff2?t=1634537158782') format('woff2'),
url('iconfont.woff?t=1634537158782') format('woff'),
url('iconfont.ttf?t=1634537158782') format('truetype');
src: url('iconfont.woff2?t=1637225676006') format('woff2'),
url('iconfont.woff?t=1637225676006') format('woff'),
url('iconfont.ttf?t=1637225676006') format('truetype');
}
.iconfont {
......@@ -13,6 +13,114 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-a-1_heimingdanguanli:before {
content: "\e68d";
}
.icon-weixinquguan:before {
content: "\e68c";
}
.icon-jifen1:before {
content: "\e689";
}
.icon-yingxiao:before {
content: "\e765";
}
.icon-shouqi1:before {
content: "\e6b8";
}
.icon-xiala:before {
content: "\e6b9";
}
.icon-chuzhizhanghu:before {
content: "\e682";
}
.icon-mendianbaojiadan:before {
content: "\e684";
}
.icon-weimeng:before {
content: "\e6e4";
}
.icon-weixin1:before {
content: "\e685";
}
.icon-01_kaquanguanli:before {
content: "\e686";
}
.icon-chenggong:before {
content: "\e67f";
}
.icon-shibai:before {
content: "\e681";
}
.icon-dengji-:before {
content: "\e6a3";
}
.icon-dengji-1:before {
content: "\e6a4";
}
.icon-dengji-2:before {
content: "\e6a2";
}
.icon-dengji-3:before {
content: "\e6a5";
}
.icon-dengji-4:before {
content: "\e6a6";
}
.icon-dengji-5:before {
content: "\e67a";
}
.icon-dengji-6:before {
content: "\e67b";
}
.icon-dengji-7:before {
content: "\e67c";
}
.icon-dengji-8:before {
content: "\e67d";
}
.icon-dengji-9:before {
content: "\e67e";
}
.icon-yonghuliebiao:before {
content: "\e679";
}
.icon-yichang:before {
content: "\e677";
}
.icon-SwapOutlined:before {
content: "\e672";
}
.icon-BellOutlined:before {
content: "\e673";
}
.icon-chakanxiangqing:before {
content: "\e892";
}
......@@ -229,6 +337,10 @@
content: "\e643";
}
.icon-dingdan-copy:before {
content: "\eb5a";
}
.icon-dingdan:before {
content: "\e660";
}
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -6,6 +6,195 @@
"description": "",
"glyphs": [
{
"icon_id": "22465139",
"name": "1_黑名单管理",
"font_class": "a-1_heimingdanguanli",
"unicode": "e68d",
"unicode_decimal": 59021
},
{
"icon_id": "25735940",
"name": "微信取关",
"font_class": "weixinquguan",
"unicode": "e68c",
"unicode_decimal": 59020
},
{
"icon_id": "25698898",
"name": "积分",
"font_class": "jifen1",
"unicode": "e689",
"unicode_decimal": 59017
},
{
"icon_id": "5880283",
"name": "营销",
"font_class": "yingxiao",
"unicode": "e765",
"unicode_decimal": 59237
},
{
"icon_id": "672034",
"name": "收起",
"font_class": "shouqi1",
"unicode": "e6b8",
"unicode_decimal": 59064
},
{
"icon_id": "672036",
"name": "下拉",
"font_class": "xiala",
"unicode": "e6b9",
"unicode_decimal": 59065
},
{
"icon_id": "2523534",
"name": "储值账户",
"font_class": "chuzhizhanghu",
"unicode": "e682",
"unicode_decimal": 59010
},
{
"icon_id": "4192439",
"name": "门店报价单",
"font_class": "mendianbaojiadan",
"unicode": "e684",
"unicode_decimal": 59012
},
{
"icon_id": "7722415",
"name": "微盟",
"font_class": "weimeng",
"unicode": "e6e4",
"unicode_decimal": 59108
},
{
"icon_id": "15933094",
"name": "微信",
"font_class": "weixin1",
"unicode": "e685",
"unicode_decimal": 59013
},
{
"icon_id": "18480966",
"name": "01_卡券管理",
"font_class": "01_kaquanguanli",
"unicode": "e686",
"unicode_decimal": 59014
},
{
"icon_id": "1046178",
"name": "成功",
"font_class": "chenggong",
"unicode": "e67f",
"unicode_decimal": 59007
},
{
"icon_id": "1046180",
"name": "失败",
"font_class": "shibai",
"unicode": "e681",
"unicode_decimal": 59009
},
{
"icon_id": "7128865",
"name": "等级-3",
"font_class": "dengji-",
"unicode": "e6a3",
"unicode_decimal": 59043
},
{
"icon_id": "7128866",
"name": "等级-6",
"font_class": "dengji-1",
"unicode": "e6a4",
"unicode_decimal": 59044
},
{
"icon_id": "7128868",
"name": "等级-1",
"font_class": "dengji-2",
"unicode": "e6a2",
"unicode_decimal": 59042
},
{
"icon_id": "7128870",
"name": "等级-5",
"font_class": "dengji-3",
"unicode": "e6a5",
"unicode_decimal": 59045
},
{
"icon_id": "7128874",
"name": "等级-8",
"font_class": "dengji-4",
"unicode": "e6a6",
"unicode_decimal": 59046
},
{
"icon_id": "9829436",
"name": "等级-10",
"font_class": "dengji-5",
"unicode": "e67a",
"unicode_decimal": 59002
},
{
"icon_id": "9829439",
"name": "等级-7",
"font_class": "dengji-6",
"unicode": "e67b",
"unicode_decimal": 59003
},
{
"icon_id": "9829440",
"name": "等级-9",
"font_class": "dengji-7",
"unicode": "e67c",
"unicode_decimal": 59004
},
{
"icon_id": "9829441",
"name": "等级-4",
"font_class": "dengji-8",
"unicode": "e67d",
"unicode_decimal": 59005
},
{
"icon_id": "9829444",
"name": "等级-2",
"font_class": "dengji-9",
"unicode": "e67e",
"unicode_decimal": 59006
},
{
"icon_id": "25597267",
"name": "用户列表",
"font_class": "yonghuliebiao",
"unicode": "e679",
"unicode_decimal": 59001
},
{
"icon_id": "11495063",
"name": "异常",
"font_class": "yichang",
"unicode": "e677",
"unicode_decimal": 58999
},
{
"icon_id": "20893458",
"name": "SwapOutlined",
"font_class": "SwapOutlined",
"unicode": "e672",
"unicode_decimal": 58994
},
{
"icon_id": "22596519",
"name": "BellOutlined",
"font_class": "BellOutlined",
"unicode": "e673",
"unicode_decimal": 58995
},
{
"icon_id": "9002691",
"name": "查看详情",
"font_class": "chakanxiangqing",
......@@ -384,6 +573,13 @@
"unicode_decimal": 58947
},
{
"icon_id": "25750336",
"name": "订单",
"font_class": "dingdan-copy",
"unicode": "eb5a",
"unicode_decimal": 60250
},
{
"icon_id": "10094849",
"name": "订单",
"font_class": "dingdan",
......
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.
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,o,c){for(var f,d,i,u=0,s=[];u<r.length;u++)d=r[u],t[d]&&s.push(t[d][0]),t[d]=0;for(f in o)Object.prototype.hasOwnProperty.call(o,f)&&(e[f]=o[f]);for(n&&n(r,o,c);s.length;)s.shift()();if(c)for(u=0;u<c.length;u++)i=a(a.s=c[u]);return i};var r={},t={17:0};function a(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,a){n=t[e]=[r,a]});n[2]=r;var o=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,a.nc&&c.setAttribute("nonce",a.nc),c.src=a.p+"static/js/"+({0:"card",1:"game",2:"wechat",3:"ecm",4:"message",5:"ewash",6:"scan",7:"evaluation",8:"activity",9:"cdKey",10:"recharge",11:"popup",12:"signIn",13:"msg",14:"calllog"}[e]||e)+"."+{0:"dd431d675ca0c13840a7",1:"5db342a59e1dd45f9c5a",2:"96d9332443660c785a7a",3:"9d201ef6a56813daf18b",4:"7ccf14ce757cda98560d",5:"f329f2273a464eda74ba",6:"ac29d5adeeefe7f5bd0e",7:"93bfd6b1194529e87682",8:"b48d03d4568429fd77fd",9:"fc15e74c2c19c49fb041",10:"540167ee92d78ef94f0b",11:"5c5effb7278746f90a0d",12:"5effba82ba84949cdfdb",13:"012f851d2d6f6430d9bf",14:"89c077231d00054d09d3"}[e]+".js";var f=setTimeout(d,12e4);function d(){c.onerror=c.onload=null,clearTimeout(f);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return c.onerror=c.onload=d,o.appendChild(c),r},a.m=e,a.c=r,a.d=function(e,n,r){a.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},a.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(n,"a",n),n},a.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},a.p="/marketing/",a.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,o,a){for(var f,i,d,u=0,s=[];u<r.length;u++)i=r[u],t[i]&&s.push(t[i][0]),t[i]=0;for(f in o)Object.prototype.hasOwnProperty.call(o,f)&&(e[f]=o[f]);for(n&&n(r,o,a);s.length;)s.shift()();if(a)for(u=0;u<a.length;u++)d=c(c.s=a[u]);return d};var r={},t={17:0};function c(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,c){n=t[e]=[r,c]});n[2]=r;var o=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,c.nc&&a.setAttribute("nonce",c.nc),a.src=c.p+"static/js/"+({0:"card",1:"game",2:"wechat",3:"ecm",4:"message",5:"ewash",6:"scan",7:"evaluation",8:"activity",9:"cdKey",10:"recharge",11:"popup",12:"signIn",13:"msg",14:"calllog"}[e]||e)+"."+{0:"fcb880cae87fec6d8d8c",1:"2006e9baaf234f8d6c77",2:"06863c90f1b10204c6f7",3:"8472333400fe4f177129",4:"4d35e4fed5ae86e40cc1",5:"f329f2273a464eda74ba",6:"324fbbe95fc31796d86c",7:"87d09b2c6144e701a625",8:"b48d03d4568429fd77fd",9:"fc15e74c2c19c49fb041",10:"540167ee92d78ef94f0b",11:"a75f2e6629191fa6c6d8",12:"5effba82ba84949cdfdb",13:"012f851d2d6f6430d9bf",14:"89c077231d00054d09d3"}[e]+".js";var f=setTimeout(i,12e4);function i(){a.onerror=a.onload=null,clearTimeout(f);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=i,o.appendChild(a),r},c.m=e,c.c=r,c.d=function(e,n,r){c.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},c.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(n,"a",n),n},c.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},c.p="/marketing/",c.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
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.
@font-face {
font-family: "iconfont"; /* Project id 688955 */
src: url('iconfont.woff2?t=1623822833759') format('woff2'),
url('iconfont.woff?t=1623822833759') format('woff'),
url('iconfont.ttf?t=1623822833759') format('truetype');
src: url('iconfont.woff2?t=1637225676006') format('woff2'),
url('iconfont.woff?t=1637225676006') format('woff'),
url('iconfont.ttf?t=1637225676006') format('truetype');
}
.iconfont {
......@@ -13,6 +13,174 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-a-1_heimingdanguanli:before {
content: "\e68d";
}
.icon-weixinquguan:before {
content: "\e68c";
}
.icon-jifen1:before {
content: "\e689";
}
.icon-yingxiao:before {
content: "\e765";
}
.icon-shouqi1:before {
content: "\e6b8";
}
.icon-xiala:before {
content: "\e6b9";
}
.icon-chuzhizhanghu:before {
content: "\e682";
}
.icon-mendianbaojiadan:before {
content: "\e684";
}
.icon-weimeng:before {
content: "\e6e4";
}
.icon-weixin1:before {
content: "\e685";
}
.icon-01_kaquanguanli:before {
content: "\e686";
}
.icon-chenggong:before {
content: "\e67f";
}
.icon-shibai:before {
content: "\e681";
}
.icon-dengji-:before {
content: "\e6a3";
}
.icon-dengji-1:before {
content: "\e6a4";
}
.icon-dengji-2:before {
content: "\e6a2";
}
.icon-dengji-3:before {
content: "\e6a5";
}
.icon-dengji-4:before {
content: "\e6a6";
}
.icon-dengji-5:before {
content: "\e67a";
}
.icon-dengji-6:before {
content: "\e67b";
}
.icon-dengji-7:before {
content: "\e67c";
}
.icon-dengji-8:before {
content: "\e67d";
}
.icon-dengji-9:before {
content: "\e67e";
}
.icon-yonghuliebiao:before {
content: "\e679";
}
.icon-yichang:before {
content: "\e677";
}
.icon-SwapOutlined:before {
content: "\e672";
}
.icon-BellOutlined:before {
content: "\e673";
}
.icon-chakanxiangqing:before {
content: "\e892";
}
.icon-jiaocheng:before {
content: "\e6f8";
}
.icon-caozuorizhi:before {
content: "\e675";
}
.icon-querenyuanzhengqueduigoutijiaochenggongwancheng:before {
content: "\e671";
}
.icon-umidd17:before {
content: "\e66d";
}
.icon-xuanzhong11-copy:before {
content: "\eb59";
}
.icon-xuanzhong11:before {
content: "\e690";
}
.icon-huiyuanqia:before {
content: "\e668";
}
.icon-zhifubaoxiaochengxu:before {
content: "\e669";
}
.icon-shouye:before {
content: "\e66c";
}
.icon-fuwuhao2:before {
content: "\e665";
}
.icon-xiaochengxu4:before {
content: "\e666";
}
.icon-xiaochengxu12:before {
content: "\e662";
}
.icon-zhuangtailan:before {
content: "\e663";
}
.icon-jiantou:before {
content: "\e8a3";
}
.icon-Icon-yishanchu:before {
content: "\e65a";
}
......@@ -169,6 +337,10 @@
content: "\e643";
}
.icon-dingdan-copy:before {
content: "\eb5a";
}
.icon-dingdan:before {
content: "\e660";
}
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -6,6 +6,300 @@
"description": "",
"glyphs": [
{
"icon_id": "22465139",
"name": "1_黑名单管理",
"font_class": "a-1_heimingdanguanli",
"unicode": "e68d",
"unicode_decimal": 59021
},
{
"icon_id": "25735940",
"name": "微信取关",
"font_class": "weixinquguan",
"unicode": "e68c",
"unicode_decimal": 59020
},
{
"icon_id": "25698898",
"name": "积分",
"font_class": "jifen1",
"unicode": "e689",
"unicode_decimal": 59017
},
{
"icon_id": "5880283",
"name": "营销",
"font_class": "yingxiao",
"unicode": "e765",
"unicode_decimal": 59237
},
{
"icon_id": "672034",
"name": "收起",
"font_class": "shouqi1",
"unicode": "e6b8",
"unicode_decimal": 59064
},
{
"icon_id": "672036",
"name": "下拉",
"font_class": "xiala",
"unicode": "e6b9",
"unicode_decimal": 59065
},
{
"icon_id": "2523534",
"name": "储值账户",
"font_class": "chuzhizhanghu",
"unicode": "e682",
"unicode_decimal": 59010
},
{
"icon_id": "4192439",
"name": "门店报价单",
"font_class": "mendianbaojiadan",
"unicode": "e684",
"unicode_decimal": 59012
},
{
"icon_id": "7722415",
"name": "微盟",
"font_class": "weimeng",
"unicode": "e6e4",
"unicode_decimal": 59108
},
{
"icon_id": "15933094",
"name": "微信",
"font_class": "weixin1",
"unicode": "e685",
"unicode_decimal": 59013
},
{
"icon_id": "18480966",
"name": "01_卡券管理",
"font_class": "01_kaquanguanli",
"unicode": "e686",
"unicode_decimal": 59014
},
{
"icon_id": "1046178",
"name": "成功",
"font_class": "chenggong",
"unicode": "e67f",
"unicode_decimal": 59007
},
{
"icon_id": "1046180",
"name": "失败",
"font_class": "shibai",
"unicode": "e681",
"unicode_decimal": 59009
},
{
"icon_id": "7128865",
"name": "等级-3",
"font_class": "dengji-",
"unicode": "e6a3",
"unicode_decimal": 59043
},
{
"icon_id": "7128866",
"name": "等级-6",
"font_class": "dengji-1",
"unicode": "e6a4",
"unicode_decimal": 59044
},
{
"icon_id": "7128868",
"name": "等级-1",
"font_class": "dengji-2",
"unicode": "e6a2",
"unicode_decimal": 59042
},
{
"icon_id": "7128870",
"name": "等级-5",
"font_class": "dengji-3",
"unicode": "e6a5",
"unicode_decimal": 59045
},
{
"icon_id": "7128874",
"name": "等级-8",
"font_class": "dengji-4",
"unicode": "e6a6",
"unicode_decimal": 59046
},
{
"icon_id": "9829436",
"name": "等级-10",
"font_class": "dengji-5",
"unicode": "e67a",
"unicode_decimal": 59002
},
{
"icon_id": "9829439",
"name": "等级-7",
"font_class": "dengji-6",
"unicode": "e67b",
"unicode_decimal": 59003
},
{
"icon_id": "9829440",
"name": "等级-9",
"font_class": "dengji-7",
"unicode": "e67c",
"unicode_decimal": 59004
},
{
"icon_id": "9829441",
"name": "等级-4",
"font_class": "dengji-8",
"unicode": "e67d",
"unicode_decimal": 59005
},
{
"icon_id": "9829444",
"name": "等级-2",
"font_class": "dengji-9",
"unicode": "e67e",
"unicode_decimal": 59006
},
{
"icon_id": "25597267",
"name": "用户列表",
"font_class": "yonghuliebiao",
"unicode": "e679",
"unicode_decimal": 59001
},
{
"icon_id": "11495063",
"name": "异常",
"font_class": "yichang",
"unicode": "e677",
"unicode_decimal": 58999
},
{
"icon_id": "20893458",
"name": "SwapOutlined",
"font_class": "SwapOutlined",
"unicode": "e672",
"unicode_decimal": 58994
},
{
"icon_id": "22596519",
"name": "BellOutlined",
"font_class": "BellOutlined",
"unicode": "e673",
"unicode_decimal": 58995
},
{
"icon_id": "9002691",
"name": "查看详情",
"font_class": "chakanxiangqing",
"unicode": "e892",
"unicode_decimal": 59538
},
{
"icon_id": "22607678",
"name": "教程",
"font_class": "jiaocheng",
"unicode": "e6f8",
"unicode_decimal": 59128
},
{
"icon_id": "10605659",
"name": "操作日志",
"font_class": "caozuorizhi",
"unicode": "e675",
"unicode_decimal": 58997
},
{
"icon_id": "23089611",
"name": "确认 圆 正确 对勾 提交 成功 完成 ",
"font_class": "querenyuanzhengqueduigoutijiaochenggongwancheng",
"unicode": "e671",
"unicode_decimal": 58993
},
{
"icon_id": "18516314",
"name": "支付宝",
"font_class": "umidd17",
"unicode": "e66d",
"unicode_decimal": 58989
},
{
"icon_id": "23794372",
"name": "选中",
"font_class": "xuanzhong11-copy",
"unicode": "eb59",
"unicode_decimal": 60249
},
{
"icon_id": "18683817",
"name": "选中",
"font_class": "xuanzhong11",
"unicode": "e690",
"unicode_decimal": 59024
},
{
"icon_id": "3796375",
"name": "会员卡",
"font_class": "huiyuanqia",
"unicode": "e668",
"unicode_decimal": 58984
},
{
"icon_id": "6180166",
"name": "支付宝小程序",
"font_class": "zhifubaoxiaochengxu",
"unicode": "e669",
"unicode_decimal": 58985
},
{
"icon_id": "21471056",
"name": "首 页",
"font_class": "shouye",
"unicode": "e66c",
"unicode_decimal": 58988
},
{
"icon_id": "16840237",
"name": "服务号",
"font_class": "fuwuhao2",
"unicode": "e665",
"unicode_decimal": 58981
},
{
"icon_id": "19703591",
"name": "小程序",
"font_class": "xiaochengxu4",
"unicode": "e666",
"unicode_decimal": 58982
},
{
"icon_id": "8444051",
"name": "小程序",
"font_class": "xiaochengxu12",
"unicode": "e662",
"unicode_decimal": 58978
},
{
"icon_id": "22292746",
"name": "状态栏",
"font_class": "zhuangtailan",
"unicode": "e663",
"unicode_decimal": 58979
},
{
"icon_id": "9724564",
"name": "右箭头",
"font_class": "jiantou",
"unicode": "e8a3",
"unicode_decimal": 59555
},
{
"icon_id": "22270569",
"name": "Icon-yishanchu",
"font_class": "Icon-yishanchu",
......@@ -279,6 +573,13 @@
"unicode_decimal": 58947
},
{
"icon_id": "25750336",
"name": "订单",
"font_class": "dingdan-copy",
"unicode": "eb5a",
"unicode_decimal": 60250
},
{
"icon_id": "10094849",
"name": "订单",
"font_class": "dingdan",
......
......@@ -61,6 +61,7 @@ export default {
return this.$store.state.marketing.breadcrumb;
},
layoutTips() {
console.log(this.$store.state.marketing.layoutTips);
return this.$store.state.marketing.layoutTips;
},
showDescription() {
......
......@@ -36,7 +36,8 @@ export default {
type: String,
default: 'pb22'
},
activeId: String
activeId: String,
type: Number || String
},
data() {
return {
......@@ -53,11 +54,14 @@ export default {
watch: {
activeId(val) {
this.activeSmsId = val;
},
type: {
handler: function() {
this.LoadTempList();
},
immediate: true
}
},
created() {
this.LoadTempList();
},
methods: {
rowClick(row) {
this.activeSmsId = row.gicSmsTemplateId;
......@@ -74,6 +78,7 @@ export default {
},
async LoadTempList() {
this.loading = true;
this.listParams.type = this.type;
let res = await LoadTempList(this.listParams);
this.smsTempList = res.result.result || [];
this.total = res.result.totalCount;
......
......@@ -925,6 +925,13 @@ export default {
this.threeLeveloneVisible = false;
this.goodsTreeVisible = true;
this.cardUrl = null;
} else if(e == 28) {
this.middleGoodId = e;
this.goodType = 4;
this.threeLevelVisible = false;
this.threeLeveloneVisible = true;
this.goodsTreeVisible = false;
this.cardUrl = null;
} else if (e == 'mall_customize_page') { // 自定义页面
this.middleGoodId = e;
this.goodType = 11;
......@@ -1855,6 +1862,7 @@ export default {
title: this.tagName
};
console.log(this.cardUrl);
console.log('<<<<<<1<<<<<<')
if (this.cardUrl) {
this.transData();
} else {
......
......@@ -88,6 +88,14 @@ export default {
type: 'info',
path: '/message/import-send'
}
},
{
path: 'black-list',
name: '黑名单管理',
component: () => import(/* webpackChunkName: "message" */ '../../views/message/blackList.vue'),
meta: {
path: '/message/black-list'
}
}
]
};
......@@ -32,3 +32,6 @@ export const listEntepriseWeimobCoupon = params => requests(MARKET_PREFIX + 'lis
export const compressLink = params => requests(GOODS_PREFIX + 'compress-link', params);
// 使用小程序链接生成中转页地址
export const getTransferLink = params => requests(GOODS_PREFIX + '/get-transfer-link', params);
// 获取短信签名和剩余条数
export const getSign = params => requests(MARKET_PREFIX + 'getEnterpriseSetting', params);
......@@ -77,3 +77,7 @@ export const getUseStoredFalg = params => requests(PREFIX + 'get-ecm-store-flag'
export const getXsxsFalg = params => requests(PREFIX + 'get-xsxs-open-flag', params);
export const getEcmLog = params => requests(PREFIX + 'get-ecm-operator_log', params);
export const getLinkResourceStatus = params => requests('api-admin/get-link-resource-status', params);
export const getLinkResourceStatusECM = params => requests('api-admin/get-link-resource-status-ecm', params);
......@@ -22,6 +22,9 @@ export const saveTempService = params => requests(PREFIX + 'save-update-message-
//模板库--修改--回显短信模板信息
export const LoadTempInfo = params => requests(PREFIX + 'get-message-templateInfo', params);
// 模板库-校验屏蔽词
export const checkSmsContext = params => requests(PREFIX + 'checkSmsContext', params);
//短信群发--失效
export const invalidsmsRecord = params => requests(PREFIX + 'stop-message-TimedTask', params);
......@@ -52,6 +55,15 @@ export const smsSmportPlanLogPage = params => requests(PREFIX + 'sms-import-plan
// 短信群发-保存导入短信群发
export const saveImportSmsPlan = params => requests(PREFIX + 'save-import-sms-plan', params);
// 短信群发-分页查询黑名单
export const getBlackList = params => requests(PREFIX + '/page-black-user-list', params);
// 短信群发-新增黑名单列表
export const addBlackList = params => requests(PREFIX + '/add-black-user-list', params);
// 短信群发-移除黑名单
export const removeBlackList = params => requests(PREFIX + '/remove-black-user', params);
// 短信群发-导入短信群发手机号文件
export const importSmsSendPhone = PREFIX + 'import-sms-send-phone';
......
......@@ -11,6 +11,7 @@ import xxSysp_mix from '@/mixins/selector.js'; // 商品选择器方法
import { listEntepriseWeimobShop, listEntepriseWeimobCoupon } from '@/service/api/commonApi.js';
import { getCardDetail, saveUpdateCard, copyCardDetailService, getCardManualSetting, getCategoryList, getPropertyList, getLatestReptileTime, getPropertyValueList, getWeimobCouponBindCount, getCardEffectiveMode } from '@/service/api/cardApi.js';
import dmGoodsInput from '@/components/goods-input/index.vue';
import { getLinkResourceStatus } from '@/service/api/ecmApi.js';
const initForm = {
auditingStatus: '',
cardType: 0, // 1.卡券类型: 抵金券: 0; 折扣券: 1; 兑换券: 2
......@@ -67,7 +68,9 @@ const initForm = {
bannerImageField: '015f1e5a-3b2f-42f5-b638-6a29c17e8f7e',
useJumpFlag: 0, // (0: 不跳转, 1: 跳转)
bannerJumpUrl: {},
giveRule: '1.卡券新老用户同享。\n2.用户使用卡券下单,订单取消后,卡券将自动失效'
giveRule: '1.卡券新老用户同享。\n2.用户使用卡券下单,订单取消后,卡券将自动失效',
wmCouponJson: {},
wmCouponFlag: 0
};
const sale_limit = { fee: 0, goods: '', flag: false, type: 0 }; //最低消费
const goods = { ok: '', no: '', flag: false };
......@@ -252,7 +255,8 @@ export default {
code: '015f1e5a-3b2f-42f5-b638-6a29c17e8f7e',
imgUrl: 'https://pic01-10001430.image.myqcloud.com/015f1e5a-3b2f-42f5-b638-6a29c17e8f7e'
},
showWeimobDemoSelector: false
showWeimobDemoSelector: false,
statusText: ''
};
},
watch: {
......@@ -391,6 +395,45 @@ export default {
}
},
methods: {
getLinkResourceStatus(v) {
let result = JSON.parse(v);
const params = {
id: result.id,
params: ''
};
switch (result.id) {
case 'product_category_link':
case 'mall_customize_page':
case '28':
case 28:
case '17':
case 17:
case 'coup':
case 'gift':
result.params && (params.params = JSON.stringify(result.params));
break;
case 'yueshi-intergral_mall':
params.params = '';
break;
case '35':
case 35:
params.params = result.appid;
break;
case 'GAME_LINK_DZP':
case 'GAME_LINK_GGK':
case 'GAME_LINK_PTYX':
case 'GAME_LINK_KLFL':
case 'GAME_LINK_ZNM':
params.params = result.tagid;
break;
default:
return;
}
const statusMap = { 1: '已删除', 2: '已失效' };
getLinkResourceStatus(params).then(res => {
this.statusText = statusMap[res.result] || '';
});
},
onChangeNumber(val) {
if (!val) {
this.$nextTick(() => {
......@@ -481,6 +524,8 @@ export default {
let manualGetFlagSettingRes = await getCardManualSetting(); // 获取商户卡券自动领取配置
this.couponAutoGetFlag = manualGetFlagSettingRes.result.couponAutoGetFlag || 0;
this.couponAutoGetStock = manualGetFlagSettingRes.result.couponAutoGetStock;
this.wmCouponJson = JSON.parse(manualGetFlagSettingRes.result.wmCouponJson || '{}');
this.wmCouponFlag = manualGetFlagSettingRes.result.wmCouponFlag;
let res = null;
if (this.isCopy) {
res = await copyCardDetailService({ coupCardId: this.$route.params.id });
......@@ -751,6 +796,7 @@ export default {
this.$nextTick(() => {
this.$refs.form.clearValidate();
});
!this.isCopy && card.jumpFlag == 1 && this.getLinkResourceStatus(card.jumpLink);
}
} else {
this.$tips({ type: 'error', message: '初始化数据失败' });
......@@ -1468,6 +1514,7 @@ export default {
if (!this.isInfo) {
this.form.jumpLink = val;
this.$refs.form.validateField('jumpLink');
this.statusText = '';
}
},
// ---------链接小工具 - 转赠---------
......
......@@ -211,6 +211,7 @@
<li>开启后可与其它卡券叠加或在门店活动中使用(需要单独对接)</li>
<li>修改后请注意调整卡券使用说明</li>
</ul>
<el-alert v-if="wmCouponFlag && form.cardApplyChannel.some(el => el == 'WMmicroMall') && wmCouponJson.couponOnlyFlag == 1" class="f-alert" type="warning" show-icon :closable="false" title="开启后,当此券同步至微盟侧,可在微盟侧修改调整卡券相应配置,比如修改使用规则等。注意,微盟侧修改后不会同步给达摩,请谨慎操作。"></el-alert>
</div>
</el-form-item>
<el-form-item prop="cardLimit" label="领券限制">
......@@ -301,6 +302,7 @@
<!-- 可以编辑链接 -->
<el-button @click="linkToolsVisible = true" type="text" class="ml10">{{ JSON.stringify(form.jumpLink) == '{}' ? '设置链接' : '修改链接' }}</el-button>
<span class="gray ml10">{{ form.jumpLink.name }}</span>
<span class="link-status">{{ statusText }}</span>
</template>
<div class="gray fz13">* 开启后小程序卡券详情将对应路径的跳转按钮</div>
</el-form-item>
......@@ -396,8 +398,12 @@ export default cardForm;
</script>
<style lang="scss" scoped>
.link-status {
margin-left: 20px;
color: #f5222d;
}
.f-alert {
width: 780px !important;
width: 900px !important;
/deep/ .el-alert__content {
height: 18px;
line-height: 18px;
......
......@@ -142,7 +142,16 @@ export default {
dateTimeCopy: [],
dateTime2: ['', ''],
// limit: false, // 限制筛选时间前后七天
cardStatusOptions: [{ value: '', label: '全部卡券状态' }, { value: 4, label: '待核销' }, { value: 5, label: '已核销' }, { value: 6, label: '已过期' }, { value: 7, label: '已销毁' }, { value: 8, label: '已占用' }], // eslint-disable-line
cardStatusOptions: [
{ value: '', label: '全部卡券状态' },
{ value: 4, label: '待使用' },
{ value: 5, label: '已使用' },
{ value: 6, label: '已过期' },
{ value: 7, label: '已销毁' },
{ value: 8, label: '已占用' },
{ value: 9, label: '转赠中' },
{ value: 10, label: '已转赠' }
],
recordLoading: false,
recordList: [],
listParams: {
......@@ -396,11 +405,13 @@ export default {
// 列表状态过滤器
filterCardStatus(row) {
let _content = '';
if (row.status == 4) {
if (row.status == 3) {
_content = `<div class="dm-status--warning">待领取</div>`;
} else if (row.status == 4) {
let isOverdue = Date.now() >= row.limitTime;
_content = `<div class="${isOverdue ? 'dm-status--info' : 'dm-status--primary'}">${isOverdue ? '已过期' : '待核销'}</div>`;
_content = `<div class="${isOverdue ? 'dm-status--info' : 'dm-status--primary'}">${isOverdue ? '已过期' : '待使用'}</div>`;
} else if (row.status == 5) {
_content = `<div class="dm-status--warning">已核销</div>`;
_content = `<div class="dm-status--warning">已使用</div>`;
} else if (row.status == 6) {
_content = `<div class="dm-status--info">已过期</div>`;
} else if (row.status == 7) {
......
......@@ -70,7 +70,17 @@ export default {
const that = this;
return {
formatDateTimeByType,
cardStatusList: [{ value: 0, label: '全部卡券状态' }, { value: 3, label: '待领取' }, { value: 4, label: '待核销' }, { value: 5, label: ' 已核销' }, { value: 6, label: '已过期' }, { value: 7, label: '已销毁' }, { value: 8, label: '已占用' }], // eslint-disable-line
cardStatusList: [
{ value: 0, label: '全部卡券状态' },
{ value: 3, label: '待领取' },
{ value: 4, label: '待使用' },
{ value: 5, label: '已使用' },
{ value: 6, label: '已过期' },
{ value: 7, label: '已销毁' },
{ value: 8, label: '已占用' },
{ value: 9, label: '转赠中' },
{ value: 10, label: '已转赠' }
],
loading: false,
recordList: [],
receiveTime: ['', ''], // 领取时间
......@@ -178,9 +188,9 @@ export default {
_content = `<div class="dm-status--error">待领取</div>`;
} else if (status == 4) {
let isOverdue = Date.now() >= row.limitTime;
_content = `<div class="${isOverdue ? 'dm-status--info' : 'dm-status--primary'}">${isOverdue ? '已过期' : '待核销'}</div>`;
_content = `<div class="${isOverdue ? 'dm-status--info' : 'dm-status--primary'}">${isOverdue ? '已过期' : '待使用'}</div>`;
} else if (status == 5) {
_content = `<div class="dm-status--warning">已核销</div>`;
_content = `<div class="dm-status--warning">已使用</div>`;
} else if (status == 6) {
_content = `<div class="dm-status--info">已过期</div>`;
} else if (status == 7) {
......@@ -190,7 +200,7 @@ export default {
} else if (status == 9) {
_content = `<div class="dm-status--warning">转赠中</div>`;
} else if (status == 10) {
_content = `<div class="dm-status--info">已退回</div>`;
_content = `<div class="dm-status--info">已转赠</div>`;
}
return _content;
},
......
......@@ -342,6 +342,16 @@
<div class="layout--tips mt10" style="display:inline-block" v-else>
<span class="dm-status--primary pl10"></span>
触点时效模式下,营销事件选择为“图文/文本/小程序/图片”时,将通过服务号“客服接口”进行推送,不会占用每个用户每月4条的服务号消息接收次数。但通过“客服接口”成功推送是有一定前提与限制的,详见文档<el-link href="https://www.yuque.com/exnmlu/hpbb1c/hb43wk" target="_blank" style="color:#1890ff;font-size:12px;vertical-align: top">《智能营销事件发送一览》</el-link>
<div v-if="form.effectType == 0 && form.effectAction === 'consume'">
<span class="dm-status--primary pl10" style="vertical-align:top"></span>
<div style="display:inline-block">
消费触发模式下,营销事件选择“卡券/积分”时
<br />
若订单整单退款:已赠送卡券/积分全部退回
<br />
若订单部分退款:系统判断剩余订单是否满足触发条件,若不满足,未使用卡券/积分全部退回;若仍满足,卡券/固定积分不退回,按订单金额倍数赠送的积分,会扣除退货商品所赠送的积分。
</div>
</div>
</div>
</h3>
<!-- 只有实时才是单图文 -->
......
......@@ -2,7 +2,7 @@
<div class="dm__is-delete" v-if="item.status == 0">图文-已删除</div>
<div v-else 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="itemMouseover(v)" @mouseout="itemMouseout(v)">
<div class="dm-imgText__item" v-if="i === 0" @mouseenter="itemMouseover(v)" @mouseleave="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="" />
......
......@@ -8,19 +8,23 @@
</div>
<p class="ellipsis-l2">{{ item.title }}</p>
<img :src="item.imageUrl || loadErrorImg" alt="" srcset="" />
<p class="dm-wxa__item--bottom"><img src="../assets/img/wxa-circle.svg" alt="" srcset="" /><span> 小程序</span></p>
<p class="dm-wxa__item--bottom">
<img src="../assets/img/wxa-circle.svg" alt="" srcset="" /><span> 小程序</span><span class="wxa-status">{{ statusText }}</span>
</p>
</div>
</div>
</template>
<script>
import { getLinkResourceStatusECM, getLinkResourceStatus } from '@/service/api/ecmApi.js';
export default {
name: 'item-wxa',
data() {
return {
maskShow: false,
// eslint-disable-next-line
loadErrorImg: require('../assets/img/loaderror.png')
loadErrorImg: require('../assets/img/loaderror.png'),
statusText: ''
};
},
props: {
......@@ -30,6 +34,50 @@ export default {
return {};
}
}
},
watch: {
item: {
handler() {
this.statusText = '';
},
immediate: true
}
},
mounted() {
this.getLinkResourceStatus(this.item.pagePath);
},
methods: {
getLinkResourceStatus(v) {
let params = {};
const statusMap = { 1: '已删除', 2: '已失效' };
const result = JSON.parse(v);
console.log(v);
if (result.pageType == 4 && result.type && result.type.startsWith('GAME_LINK')) {
params = {
id: result.type,
params: result.tagid
};
getLinkResourceStatus(params).then(res => {
this.statusText = statusMap[res.result] || '';
this.$emit('set-status', res.result);
});
} else {
params = {
pagePath: v
};
getLinkResourceStatusECM(params).then(res => {
this.statusText = statusMap[res.result] || '';
this.$emit('set-status', res.result);
});
}
}
}
};
</script>
<style lang="scss" scoped>
.wxa-status {
margin-left: 20px;
color: #f5222d;
}
</style>
......@@ -288,6 +288,9 @@ export default {
.then(res => {
if (res.errorCode === 0) {
this.entepriseList = res.result || [];
if (!this.isEdit && !this.readOnly && this.entepriseList.length === 1 && !this.form.qfxxEnterpriseId) {
this.form.qfxxEnterpriseId = this.entepriseList[0].wxEnterpriseId;
}
} else {
this.$message({ message: res.message, type: 'error' });
}
......
......@@ -62,7 +62,8 @@ export default {
default() {
return {};
}
}
},
resourceStatus: Number
},
data() {
return {
......@@ -158,6 +159,7 @@ export default {
if (val && this.item.ecmMarketingTypeRelationId) {
this.form = JSON.parse(JSON.stringify(this.item));
// console.log('编辑', this.item);
if (this.resourceStatus !== 0) return;
const pagePath = this.form.pagePath ? JSON.parse(this.form.pagePath) : {};
this.wechatContent.type = pagePath.type;
this.wechatContent.objId = '';
......@@ -181,6 +183,11 @@ export default {
this.threeValue = pagePath.gameType;
this.gameProps.gameType = pagePath.gameType;
this.gameProps.gameId = pagePath.tagid;
this.wechatContent.tagid = pagePath.tagid;
this.wechatContent.tagname = pagePath.tagname;
this.wechatContent.gameType = pagePath.gameType;
this.wechatContent.gameName = pagePath.gameName;
this.selectedGame = { gameId: pagePath.tagid };
});
} else {
this.$nextTick(() => {
......
......@@ -15,7 +15,7 @@
<!-- 组件 区域 -->
<div class="dm-marketing__content__item" v-for="(v, i) in list" :key="i">
<i class="dm-marketing__content--index">{{ i + 1 }}</i>
<component :is="v.comName" :item="v.item" :isSupportVar="isSupportVar"></component>
<component :is="v.comName" :item="v.item" :isSupportVar="isSupportVar" @set-status="data => (v.resourceStatus = data)"></component>
<template v-if="!readOnly">
<i class="el-icon-edit dm-marketing__opt--icon" v-if="showEdit(v) && (v.comName === 'item-teltask' || v.comName === 'item-text' || v.comName === 'item-wxa' || v.comName === 'item-integral' || v.comName === 'item-qywx' || v.comName === 'item-qfxx')" @click="editItem(v)"></i>
<i v-else-if="v.comName == 'item-qywx' || v.comName == 'item-qfxx'" class="el-icon-view dm-marketing__opt--icon" @click="editItem(v, true)"></i>
......@@ -34,7 +34,7 @@
</transition>
</div>
<!-- 弹窗组件 -->
<component :is="dialogCom" @sendItem="saveToList" :showOutCouponIcon="showOutCouponIcon" :item="currentItem" :show.sync="dialogShow" :isSupportVar="isSupportVar" :cardLimitType="cardLimitType" :integralMultiple="integralMultiple" :singleFlag="singleFlag" :read-only="readOnly || showView"></component>
<component :is="dialogCom" @sendItem="saveToList" :showOutCouponIcon="showOutCouponIcon" :item="currentItem" :show.sync="dialogShow" :isSupportVar="isSupportVar" :cardLimitType="cardLimitType" :integralMultiple="integralMultiple" :singleFlag="singleFlag" :read-only="readOnly || showView" :resource-status="resourceStatus"></component>
</section>
</template>
......@@ -165,7 +165,8 @@ export default {
maxEventCount: 0, //item最大数
currentItem: {},
optShow: false,
optTopShow: true
optTopShow: true,
resourceStatus: 0
};
},
created() {
......@@ -500,6 +501,7 @@ export default {
},
// 编辑前置
editItem(obj, showView) {
this.resourceStatus = obj.resourceStatus || 0;
this.currentItem = obj.item;
this.dialogCom = 'lib-' + obj.comName.slice(5);
this.$nextTick(_ => {
......
......@@ -3,38 +3,38 @@
<div class="middle">
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>触达人数<tip :text="tipText.touchMbrNum" /></p>
<p>{{ formatterNum(list.touchMbrNum) }}</p>
<p>计划触达人数<tip :text="tipText.touchMbrNum" /></p>
<p>{{ formatterNum(list.planMbrNum) }}</p>
</div>
</div>
<div class="item-arrow purper center_flex">
<p>领取</p>
<p>{{ formatterRate((list.getMbrNum / list.touchMbrNum) * 100) }}</p>
<p>触达</p>
<p>{{ formatterRate((list.touchMbrNum / list.planMbrNum) * 100) }}</p>
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>领取人数<tip :text="tipText.getMbrNum" /></p>
<p>{{ formatterNum(list.getMbrNum) }}</p>
<p>实际触达人数<tip :text="tipText.getMbrNum" /></p>
<p>{{ formatterNum(list.touchMbrNum) }}</p>
</div>
</div>
<div class="item-arrow purper center_flex">
<p>使用</p>
<p>{{ formatterRate((list.useMbrNum / list.getMbrNum) * 100) }}</p>
<p>转化</p>
<p>{{ formatterRate((list.convMbrNum / list.touchMbrNum) * 100) }}</p>
</div>
<div class="item-bg bg-purper center_flex min-w-214">
<div>
<p>使用人数<tip :text="tipText.useMbrNum" /></p>
<p>{{ formatterNum(list.useMbrNum) }}</p>
<p>触达顾客转化人数<tip :text="tipText.useMbrNum" /></p>
<p>{{ formatterNum(list.convMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-purper min-w-527">
<div>
<p>销售单数 <tip :text="tipText.orderCnt" /></p>
<p>{{ formatterNum(list.orderCnt) }}</p>
<p>触达顾客订单数<tip :text="tipText.orderCnt" /></p>
<p>{{ formatterNum(list.convOrderCnt) }}</p>
</div>
<div>
<p>销售单金额(元)<tip :text="tipText.salesAmt" /></p>
<p>{{ formatterNumAndFixed(list.salesAmt) }}</p>
<p>触达顾客转化收益(元)<tip :text="tipText.salesAmt" /></p>
<p>{{ formatterNumAndFixed(list.convSalesAmt) }}</p>
</div>
</div>
</div>
......@@ -48,18 +48,18 @@ export default {
components: { tip },
props: {
list: {
type: Array,
type: Object,
default: () => {}
}
},
data() {
return {
tipText: {
touchMbrNum: '当前智能营销计划发出优惠券的顾客数,如果对同一个顾客发送了超过1张优惠券,仅计算为1个人。',
getMbrNum: '当前智能营销计划发出优惠券后,领取优惠券的顾客人数。如果同一个顾客领取了超过1张优惠券,仅计算为1个人。',
useMbrNum: '"当前智能营销计划发出优惠券后,使用优惠券的顾客人数。如果同一个顾客使用了超过1张优惠券,仅计算为1个人。由于是单独从“卡券”维度统计,因此只要是使用了该计划所发送优惠券的都会计入,即使顾客使用该优惠券的订单超过了收益有效期"',
orderCnt: '"当前智能营销计划发出优惠券后,使用优惠券的订单数。如果一个订单使用了超过1张优惠券,仅计算为1个订单。由于是单独从“卡券”维度统计,因此只要是使用了该计划所发送优惠券的订单都会计入,即使该订单超过了收益有效期,也会将该订单计入销售单数。"',
salesAmt: '"当前智能营销计划发出优惠券后,使用优惠券的订单金额。如果一笔订单使用了超过1张优惠券,该金额仅计算一次。由于是单独从“卡券”维度统计,因此只要是使用了该计划所发送优惠券的订单都会计入,即使该订单超过了收益有效期,也会将该订单金额计入。"'
touchMbrNum: '计划下发卡券触达的顾客人数。如果当前计划在不同时间,通过不同区域(门店),用卡券多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
getMbrNum: '实际下发卡券触达的顾客人数。如果当前计划在不同时间,通过不同区域(门店),用卡券多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
useMbrNum: '下发卡券触达的顾客中,在收益有效期内消费的顾客人数。只要下发卡券触达后消费就会被统计,无论卡券有没有被使用。无论顾客消费了几次,会进行去重统计,仅计算为1个人。',
orderCnt: '下发卡券触达的顾客中,在收益有效期内消费的顾客订单数。只要下发卡券触达后消费就会被统计,无论卡券有没有被使用。',
salesAmt: '下发卡券触达的顾客中,在收益有效期内消费的顾客订单金额。只要下发卡券触达后消费就会被统计,无论卡券有没有被使用。'
}
};
},
......
<template>
<div class="dm-wrap card_profit">
<div class="title">
<h2>卡券收益</h2>
<span>计划中的卡券,计划中卡券触达的人群使用该卡券消费的收益,包含已过计划收益有效期的数据</span>
<h2>卡券</h2>
<span>在卡券下发后,下发顾客在营销有效期内的消费转化情况。无论顾客最终有没有使用卡券消费都会统计在内</span>
</div>
<template>
<card-profit-sum :list="list" />
<el-table :data="tableData" v-if="tableData.length > 1" style="margin:20px 0 20px" max-height="710" header-cell-class-name="card-profit-header">
<div class="title" style="margin-top:20px">
<h2 class="subtitle">卡券核销</h2>
<span>卡券核销情况统计通过当前智能营销计划投放的卡券,顾客使用该卡券消费的情况。即使消费时间已经过了收益有效期也会统计在内</span>
</div>
<el-table :data="tableData" v-if="tableData.length > 0" style="margin:20px 0 20px" max-height="710" header-cell-class-name="card-profit-header">
<el-table-column :prop="cardName" label="卡券名称" min-width="150">
<template slot-scope="scope">
<div class="name" v-if="scope.row.cardName">
<div class="top">
<span v-if="scope.row.cardName.length <= 15" :class="[scope.row.status == 0 ? 'del_card' : 'pointer']" @click="toCardDetail(scope.row)">{{ scope.row.cardName }}</span>
<span v-if="scope.row.cardName.length <= 15" :class="[scope.row.status == 0 || !('status' in scope.row) ? 'del_card' : 'pointer']" @click="toCardDetail(scope.row)">{{ scope.row.cardName }}</span>
<el-tooltip open-delay="100" placement="top-start" :content="scope.row.cardName" v-else>
<span :class="['card_name', scope.row.status == 0 ? 'del_card' : 'pointer']" @click="toCardDetail(scope.row)">{{ scope.row.cardName }}</span>
</el-tooltip>
<span class="type" v-if="scope.row.status != 0">{{ scope.row.cardType == 0 ? '抵金券' : scope.row.cardType == 1 ? '折扣券' : scope.row.cardType == 2 ? '兑换券' : '--' }}</span>
<img :src="require('@/assets/img/Icon-yishanchu.svg')" alt="" v-else style="width: 46px;height: 21px;margin-left: 6px" />
<span class="type" v-if="scope.row.status != 0 && 'status' in scope.row">{{ scope.row.cardType == 0 ? '抵金券' : scope.row.cardType == 1 ? '折扣券' : scope.row.cardType == 2 ? '兑换券' : '--' }}</span>
<img :src="require('@/assets/img/Icon-yishanchu.svg')" alt="" v-else-if="'status' in scope.row" style="width: 46px;height: 21px;margin-left: 6px" />
</div>
<p>{{ scope.row.subTitle }}</p>
</div>
......@@ -53,19 +57,18 @@ export default {
data() {
return {
tableHeader: [
{ label: '触达人数', prop: 'touchMbrNum', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterNum(row.touchMbrNum) },
{ label: '领取人数', prop: 'getMbrNum', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterNum(row.getMbrNum) },
{ label: '领取率', prop: 'drawRate', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterRate((row.getMbrNum / row.touchMbrNum) * 100) },
{ label: '使用人数', prop: 'useMbrNum', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterNum(row.useMbrNum) },
{ label: '使用率', prop: 'useRate', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterRate((row.useMbrNum / row.getMbrNum) * 100) },
{ label: '销售单数', prop: 'orderCnt', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterNum(row.orderCnt) },
{ label: '销售单金额', prop: 'salesAmt', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterNumAndFixed(row.salesAmt) }
{ label: '领取人数', prop: 'getMbrNum', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterNum(row.getMbrNum) },
{ label: '核销率', prop: 'useRate', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterRate((row.useMbrNum / row.getMbrNum) * 100) },
{ label: '核销人数', prop: 'useMbrNum', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterNum(row.useMbrNum) },
{ label: '核销订单数', prop: 'orderCnt', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterNum(row.orderCnt) },
{ label: '核销订单金额', prop: 'salesAmt', minWidth: '160', align: 'left', fixed: 'left', formatter: row => this.formatterNumAndFixed(row.salesAmt) }
]
};
},
methods: {
toCardDetail(row) {
if (row.status == 0) return;
if (row.status == 0 || !('status' in row)) return;
window.open(window.location.origin + `/marketing/#/card/edit/${row.cardId}`);
}
}
......@@ -77,11 +80,24 @@ export default {
padding: 20px !important;
margin-bottom: 10px !important;
font-family: PingFangSC-Regular, PingFang SC;
h2.subtitle {
width: 139px;
height: 25px;
background: #bad9ff;
line-height: 25px;
text-align: center;
border-radius: 2px;
margin-left: -2px;
color: #303133;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 600;
}
.title {
padding-left: 4px;
margin-bottom: 20px;
display: flex;
align-items: center;
// align-items: center;
flex-direction: column;
h2 {
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
......@@ -90,7 +106,8 @@ export default {
line-height: 22px;
}
span {
margin-left: 28px;
// margin-left: 28px;
margin-top: 20px;
font-size: 14px;
color: #909399;
}
......
<template>
<div class="dm-wrap phone-traffic">
<div class="title flex_between">
<div class="flex_between">
<!-- <img :src="require('@/assets/img/icon-phone.png')" class="img" /> -->
<h2>积分</h2>
</div>
</div>
<integral-traffic v-bind="$attrs" />
</div>
</template>
<script>
import integralTraffic from './integral-traffic.vue';
export default {
name: 'integral',
components: { integralTraffic },
inheritAttrs: false
};
</script>
<style lang="scss" scoped>
.phone-traffic {
padding: 22px 20px 30px !important;
font-family: PingFangSC-Regular, PingFang SC;
.title {
height: 32px;
margin-bottom: 10px;
line-height: 32px;
h2 {
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 700;
color: #303133;
margin-left: 2px;
}
}
.img {
transform: scale(0.5);
}
.flex_between {
display: flex;
justify-content: space-between;
align-items: center;
}
.detail {
padding: 0 10px;
background: rgba(24, 144, 255, 0.1);
border-radius: 4px;
height: 32px;
color: #1890ff;
box-sizing: border-box;
display: flex;
align-items: center;
cursor: pointer;
border: none;
&:hover {
color: #46a6ff;
}
i {
margin-right: 2px;
}
}
}
</style>
<template>
<div class="middle">
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">计划触达人数<tip :text="tipText.planMbrNum" /></p>
<p class="value">{{ formatterNum(data.planMbrNum) }}</p>
</div>
<div class="item-arrow purper">
<p>触达率</p>
<p>{{ formatterRate((data.touchMbrNum / data.planMbrNum) * 100) }}</p>
</div>
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">实际触达人数<tip :text="tipText.touchMbrNum" /></p>
<p class="value">{{ formatterNum(data.touchMbrNum) }}</p>
</div>
<div class="item-arrow green">
<p>转化率</p>
<p>{{ formatterRate((data.convMbrNum / data.touchMbrNum) * 100) }}</p>
</div>
</div>
<div class="item-bg bg-green center_flex min-w-210">
<div>
<p class="key">触达顾客转化人数<tip :text="tipText.convMbrNum" /></p>
<p class="value">{{ formatterNum(data.convMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-green min-w-433">
<div>
<p class="key">触达顾客订单数<tip :text="tipText.convOrderCnt" /></p>
<p class="value">{{ formatterNum(data.convOrderCnt) }}</p>
</div>
<div>
<p class="key">触达顾客转化收益(元)<tip :text="tipText.convSalesAmt" /></p>
<p class="value">{{ formatterNumAndFixed(data.convSalesAmt) }}</p>
</div>
</div>
</div>
</template>
<script>
import formatterNum from '@/mixins/validateNum';
import tip from '@/components/tip';
export default {
name: 'integral-traffic-sum',
components: { tip },
props: {
data: {
type: Object,
default: () => {}
}
},
data() {
return {
tipText: {
planMbrNum: '计划使用积分触达的顾客人数。如果当前计划在不同时间,通过不同区域(门店),用积分多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
touchMbrNum: '实际使用积分触达的顾客人数。如果当前计划在不同时间,通过不同区域(门店),用积分多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
convMbrNum: '使用积分触达的顾客中,在收益有效期内消费的顾客人数。无论顾客消费了几次,会进行去重统计,仅计算为1个人。',
convOrderCnt: '使用积分触达的顾客中,在收益有效期内消费的顾客订单数。',
convSalesAmt: '使用积分触达的顾客中,在收益有效期内消费的顾客订单金额。'
}
};
},
mixins: [formatterNum]
};
</script>
<style lang="scss" scoped>
.middle {
font-family: PingFangSC-Medium, PingFang SC;
height: 100px;
display: flex;
align-items: center;
justify-content: space-around;
.item-bg {
flex: 1;
height: 100%;
border-radius: 6px;
margin-right: 47px;
box-sizing: border-box;
position: relative;
&.bg-green {
background: #e3fff8;
}
&.bg-purper {
background: #f0f5ff;
}
.key {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
color: #606266;
line-height: 20px;
padding-top: 4px;
margin-bottom: 6px;
}
.value {
font-size: 24px;
font-family: DINAlternate-Bold, DINAlternate;
font-weight: bold;
color: #303133;
line-height: 28px;
}
}
.item-arrow {
width: 78px;
height: 65px;
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
padding-left: 7px;
box-sizing: border-box;
z-index: 3;
right: -77px;
&.purper {
background: url('~@/assets/img/arrow_purper.png');
background-size: 100% 100%;
}
&.green {
background: url('~@/assets/img/arrow_green.png');
background-size: 100% 100%;
}
p {
width: 47px;
font-size: 12px;
margin-top: -3px;
line-height: 20px;
color: #606266;
font-family: PingFangSC-Regular, PingFang SC;
&:nth-child(2) {
font-family: DINAlternate-Bold, DINAlternate;
font-weight: bold;
color: #303133;
}
}
}
}
.center_flex {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.min-w-173 {
min-width: 173px;
}
.min-w-210 {
min-width: 210px;
margin-right: 7px !important;
}
.min-w-433 {
min-width: 433px;
margin-right: 0 !important;
display: flex;
align-items: center;
padding: 0 50px 0 36px;
box-sizing: border-box;
div {
flex: 1;
text-align: left;
}
}
</style>
......@@ -8,7 +8,8 @@
<touch-charts :type="0" :createTime="$route.query.createTime" />
<market-list v-if="marketListData.length" :isRepeat="isRepeat" :data="marketListData" :isReference="isReference" :batchNum="batchNum" :batchTimes="batchTime" @toClue="toClue" />
</div>
<card-profit v-if="cardLeadTable.length" :list="cardLead" :tableData="cardLeadTable" />
<card-profit v-if="cardLeadTable.length" :list="findTypeIsExist(9)" :tableData="cardLeadTable" />
<integral v-if="findTypeIsExist(8)" :data="findTypeObj(optionsList, 8)" />
<batch-send v-if="findTypeIsExist(1) || findTypeIsExist(2) || findTypeIsExist(3)" :task-list="findTypeObj(optionsList, 1)" :tel-traffic-list="findTypeObj(optionsList, 2)" :msg-list="findTypeObj(optionsList, 3)" @toClue="toClue" />
<phone-traffic v-if="findTypeIsExist(4)" :data="findTypeObj(optionsList, 4)" @toClue="toClue" />
<short-msg v-if="findTypeIsExist(5)" :data="findTypeObj(optionsList, 5)" />
......@@ -23,6 +24,7 @@ import batchSend from '@/views/ecm/touch-components/batch-send/index.vue';
import phoneTraffic from '@/views/ecm/touch-components/phone-traffic/index.vue';
import shortMsg from '@/views/ecm/touch-components/short-msg/index.vue';
import wechat from '@/views/ecm/touch-components/wechat/index.vue';
import integral from '@/views/ecm/touch-components/integral/index.vue';
import { ecmTouchEffectTable, ecmPlanTouchConfig, getCardLeads, getCardLeadsList, ecmTouchTypeTableList, getTouchType } from '@/service/api/ecmApi.js';
export default {
name: 'ecm',
......@@ -35,7 +37,7 @@ export default {
isReference: false,
batchNum: 0, // 批次数量
batchTime: '', // 批次时间
cardLead: {},
// cardLead: {},
cardLeadTable: [],
touchType: {},
getTouchTypeFlag: false,
......@@ -49,7 +51,8 @@ export default {
batchSend,
phoneTraffic,
shortMsg,
wechat
wechat,
integral
},
mounted() {
this.ecmPlanId = this.$route.params.id;
......@@ -58,10 +61,18 @@ export default {
this.getOtherList();
this.getMarketList();
this.getTouchConfig();
this.getCardLeadsSum();
this.getCardLeadTable();
Promise.all([this.getCardLeadsSum(), this.getCardLeadTable()]).then(([res1, res2]) => {
this.cardLeadTable = res1.result && res2.result.length > 1 ? [{ cardName: '合计(按照订单去重)', ...res1.result }] : [];
this.cardLeadTable = this.cardLeadTable.concat(res2.result || []);
console.log(res2.result);
});
// this.getCardLeadsSum();
// this.getCardLeadTable();
this.getTouchTypeList();
},
beforeDestroy() {
this.$store.commit('mutations_layoutTips', '');
},
methods: {
toClue(type) {
let planName = this.$route.query.name;
......@@ -107,14 +118,10 @@ export default {
},
// 获取卡券收益数据
getCardLeadsSum() {
getCardLeads({ ecmPlanId: this.$route.params.id }).then(res => {
this.cardLead = res.result || {};
});
return getCardLeads({ ecmPlanId: this.$route.params.id });
},
getCardLeadTable() {
getCardLeadsList({ ecmPlanId: this.$route.params.id }).then(res => {
this.cardLeadTable = res.result || [];
});
return getCardLeadsList({ ecmPlanId: this.$route.params.id });
},
// 获取其他所有模块数据
getOtherList() {
......
......@@ -2,7 +2,7 @@
<el-dialog title="游戏链接下载" :visible.sync="show" width="600px" :before-close="close">
<div class="link-tip">
<i class="el-icon-info"></i>
使用“小程序链接”,非会员进入游戏页面将提示进行认证注册成为会员,认证成功后自动返回游戏页面,建议采用小程序链接
非会员进入游戏页面将提示进行认证注册成为会员,认证成功后自动返回游戏页面
</div>
<div class="link-title">
<i class="icon iconfont icon-xiaochengxu4" style="color:#6457AD"></i>
......
......@@ -7,18 +7,18 @@
<el-radio :label="0">不可分享</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.shareFlag === 1" label="分享图" prop="shareImg.imgUrl" class="width50" :rules="{ required: true, message: '请上传分享图片', trigger: 'blur' }">
<!-- <el-form-item v-if="form.shareFlag === 1" label="分享图" prop="shareImg.imgUrl" class="width50" :rules="{ required: true, message: '请上传分享图片', trigger: 'blur' }">
<dm-upload-avatar style="white-space: nowrap" :limit="{ maxSize: 1 }" name="H5分享图" :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> -->
<el-form-item v-if="form.shareFlag === 1" prop="shareAppImg.imgUrl" class="width50">
<dm-upload-avatar style="white-space: nowrap" :limit="{ maxSize: 1 }" name="小程序分享图" :model.sync="form.shareAppImg" fileType="fileShare" label="上传图片" tips="图片建议尺寸:320*240,格式为jpg/png。图片大小不超过1MB,点击图片可重新上传。" :disabled="isInfo"></dm-upload-avatar>
</el-form-item>
<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 v-if="form.shareFlag === 1" label="分享描述" prop="shareTextInfo" class="width50" :rules="{ required: true, message: '描述不能为空', trigger: 'blur' }">
<!-- <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>
</el-form-item> -->
</section>
</template>
......
<template>
<section class="dm-form__wrap black-list">
<div class="top">
<div class="left">
<el-input v-model="search.phone" placeholder="请输入手机号码" prefix-icon="el-icon-search" style="width: 260px" @change="getTableData" />
<el-date-picker v-model="search.time" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="getTableData"> </el-date-picker>
</div>
<div class="right">
<el-button type="primary" @click="dialogData.visible = true">添加黑名单客户</el-button>
</div>
</div>
<div class="content mt20">
<el-table :data="tableData.data" element-loading-text="拼命加载中">
<el-table-column v-for="(v, i) in tableData.tableHeader" :key="i" :prop="v.prop" :min-width="v.minWidth" :label="v.label" :formatter="v.formatter" :fixed="v.fixed" show-overflow-tooltip>
<template slot-scope="scope">
<span v-if="v.formatter" v-html="v.formatter(scope.row)"></span>
<span v-else>{{ scope.row[v.prop] || '--' }}</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="{ row }">
<el-button type="text" @click="removeBlack(row.blackId)">移出黑名单</el-button>
</template>
</el-table-column>
</el-table>
<dm-pagination background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="tableData.currentPage" :page-sizes="tableData.pageSizeList" :page-size="tableData.pageSize" layout="total, sizes, prev, pager, next" :total="tableData.total" hide-on-single-page />
</div>
<el-dialog :visible.sync="dialogData.visible" :title="dialogTitle" width="600px" @close="resetDialog">
<el-form v-if="!isExiteErrorPhone" ref="form" :model="dialogData.form" :rules="dialogData.form.rules" label-width="110px">
<el-form-item label="黑名单内容:" prop="phoneList">
<el-input type="textarea" v-model="dialogData.form.phoneList" placeholder="回车换行,一行输入一个手机号码,最多可以添加1000个号码" :rows="4" show-word-limit class="w410" resize="none" />
</el-form-item>
<el-form-item label="填写添加原因:" prop="reasonType">
<el-radio-group v-model="dialogData.form.reasonType">
<el-radio :label="0">用户向店员反馈</el-radio>
<el-radio :label="1">其他</el-radio>
</el-radio-group>
<el-input v-if="dialogData.form.reasonType" type="textarea" v-model="dialogData.form.reason" placeholder="请输入原因内容" :maxlength="200" :rows="4" show-word-limit class="w410 mt8" resize="none" />
</el-form-item>
<div class="btn_group">
<el-button @click="dialogData.visible = false">取消</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</div>
</el-form>
<div v-else>
<ul class="errorList">
<li v-for="(item, index) in dialogData.form.errorPhoneList" :key="index">{{ item }}</li>
</ul>
<div class="btn_group" style="margin: 30px 0 10px">
<span class="tips"><i class="iconfont icon-tishi"></i>异常名单将会自动过滤,请自行记录。</span>
<el-button type="primary" @click="dialogData.visible = false">确认</el-button>
</div>
</div>
</el-dialog>
</section>
</template>
<script>
import { formatDateTimeByType } from '@/utils';
import { getBlackList, addBlackList, removeBlackList } from '@/service/api/messageApi';
export default {
name: 'blackList',
created() {
this.$store.commit('mutations_breadcrumb', [
{ name: '营销管理', path: '' },
{ name: '短信营销', path: '' },
{ name: '黑名单管理', path: '' }
]); // eslint-disable-line
this.getTableHeader();
this.getTableData();
},
data() {
const validateReason = (rules, value, cb) => {
const { reasonType, reason } = this.dialogData.form;
if (reasonType) {
if (reason) cb();
else cb(new Error('请填写添加黑名单原因'));
} else cb();
};
const validateList = (rules, value, cb) => {
const res = value.trim();
if (!res) return cb(new Error('请填写内容'));
else cb();
};
return {
search: {
phone: '',
time: []
},
tableData: {
data: [],
currentPage: 1,
pageSizeList: [20, 40, 60, 80],
pageSize: 20,
tableHeader: [],
total: 0
},
dialogData: {
title: '添加黑名单用户',
visible: false,
form: {
rules: {
phoneList: { validator: validateList, trigger: 'blur' },
reasonType: { validator: validateReason, trigger: 'blur' }
},
phoneList: '',
reasonType: 0,
reason: '',
errorPhoneList: []
}
}
};
},
methods: {
// table methods
getTableHeader() {
this.tableData.tableHeader = [
{ label: '手机号', prop: 'phoneNumber' },
{ label: '黑名单原因', prop: 'reason' },
{
label: '添加时间',
prop: 'createTime',
formatter(scope) {
return `<span>${formatDateTimeByType(scope.createTime, 'yyyy-MM-dd-HH-mm-ss', true).y}<br />${formatDateTimeByType(scope.createTime, 'yyyy-MM-dd-HH-mm-ss', true).h}</span>`;
}
},
{ label: '操作人', prop: 'creatorName' }
];
},
async getTableData() {
const { currentPage, pageSize } = this.tableData;
const { phone, time } = this.search;
const para = {
currentPage,
pageSize,
phoneNumber: phone,
startTime: Array.isArray(time) && time[0] ? formatDateTimeByType(time[0], 'yyyy-MM-dd-HH-mm-ss', true).y : '',
endTime: Array.isArray(time) && time[1] ? formatDateTimeByType(time[1], 'yyyy-MM-dd-HH-mm-ss', true).y : ''
};
const result = await getBlackList(para);
this.tableData.data = result.result.result || [];
this.tableData.total = result.result.totalCount || 0;
},
handleSizeChange(val) {
this.tableData.pageSize = val;
this.tableData.currentPage = 1;
this.getTableData();
},
handleCurrentChange(val) {
this.tableData.currentPage = val;
this.getTableData();
},
// other
submit() {
this.$refs.form.validate(async value => {
if (value) {
const para = {};
const { reason, reasonType } = this.dialogData.form;
para.phoneNumber = this.validatePhoneList();
para.reasonType = reasonType;
para.reason = reasonType ? reason : '用户向店员反馈';
if (para.phoneNumber) {
await addBlackList(para);
if (!this.isExiteErrorPhone) {
this.$tips({ type: 'success', message: '添加成功' });
this.dialogData.visible = false;
} else {
this.$tips({ type: 'warning', message: '部分添加成功' });
}
this.getTableData();
} else {
this.$tips({ type: 'error', message: '添加失败,无正确的手机号' });
}
}
});
},
validatePhoneList() {
// 返回正确手机号的Array
const reg = /^1[0-9]{10}$/;
const arr = this.dialogData.form.phoneList.split('\n');
this.dialogData.form.errorPhoneList = arr.filter(el => el.trim() && !reg.test(el.trim()));
const result = arr.filter(el => reg.test(el.trim())).map(el => el.trim());
if (result.length > 1000) result.length = 1000;
return result.toString();
},
resetDialog() {
this.dialogData.form.reason = '';
this.dialogData.form.reasonType = 0;
this.dialogData.form.phoneList = '';
this.dialogData.form.errorPhoneList = [];
},
removeBlack(v) {
this.$confirm('确认将该手机号移出黑名单吗?', '提示', {
confirmButtonText: '确认',
cancelBUttonText: '取消',
type: 'warning'
})
.then(async () => {
await removeBlackList({ blackId: v });
this.$tips({ type: 'success', message: '移出成功' });
this.getTableData();
})
.catch(() => {});
}
},
computed: {
isExiteErrorPhone() {
return this.dialogData.form.errorPhoneList.length;
},
dialogTitle() {
return this.isExiteErrorPhone ? '手机号码格式异常名单' : this.dialogData.title;
}
}
};
</script>
<style scoped lang="scss">
.top {
display: flex;
justify-content: space-between;
align-items: center;
}
.w410 {
width: 410px;
}
.btn_group {
display: flex;
justify-content: flex-end;
}
.mt8 {
margin-top: 8px;
}
.errorList {
li {
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-align: center;
height: 22px;
line-height: 22px;
width: 130px;
background: #fff1f0;
border-radius: 2px;
border: 1px solid #ffa39e;
margin: 10px 10px 0 0;
padding: 0 5px;
box-sizing: border-box;
color: #f5222d;
&:nth-child(4n) {
margin-right: 0;
}
}
}
.tips {
display: inline-block;
width: 300px;
height: 32px;
line-height: 32px;
text-align: center;
background: #f7f8fa;
border-radius: 2px;
margin-right: 16px;
box-sizing: border-box;
padding: 0 12px;
i {
color: #2f54eb;
margin-right: 5px;
}
}
</style>
<style lang="scss">
.el-tooltip__popper {
max-width: 60% !important;
}
</style>
......@@ -8,7 +8,7 @@
<span class="regular-font-color">{{ formatDateTimeByType(info.sendTime, 'yyyy-MM-dd-HH-mm-ss') }}</span>
</el-col>
<el-col :span="8">
<span class="primary-font-color">发送人数:</span>
<span class="primary-font-color">计划人数:</span>
<span class="regular-font-color">{{ info.sendCount }}</span>
</el-col>
<el-col :span="8">
......@@ -39,17 +39,17 @@
</el-row>
</el-form>
<section class="dm-form__wrap">
<h3 class="dm-title__label">会员设置</h3>
<h3 class="dm-title__label">客户设置</h3>
<div class="pt10 pb20">
<span class="dm-input_label">选择会员</span>
<el-radio v-model="info.memberType" :label="0" disabled>会员筛选</el-radio>
<span class="dm-input_label">选择群发客户</span>
<el-radio v-model="info.memberType" :label="0" disabled>客户筛选</el-radio>
<el-radio v-model="info.memberType" :label="1" disabled>
指定会员
<el-tooltip class="item" effect="dark" content="指定会员下最多选择1000人" open-delay="200">
指定客户
<el-tooltip class="item" effect="dark" content="指定客户下最多选择1000人" open-delay="200">
<i class="el-icon-info ml5 minor-font-color"></i>
</el-tooltip>
</el-radio>
<el-radio v-model="info.memberType" :label="2" disabled>会员分组</el-radio>
<el-radio v-model="info.memberType" :label="2" disabled>客户分组</el-radio>
</div>
<div v-show="!info.memberType">
<vue-gic-people :projectName="projectName" :isAdd="false" :useId="useId" :hasSearchData="hasSearchData" :sceneValue="sceneValue" ref="peopleFilter" @findFilter="findFilter" @getBackData="getBackData" @editHide="editHide" @editShow="editShow" @hideBtn="hideBtn" />
......@@ -71,12 +71,12 @@
</h3>
<div class="clearfix pb22">
<!-- <el-select class="dm-select" v-model="listParams.sendStatus" placeholder="选择发送状态" @change="LoadMessageDetailList"> <el-option v-for="(v, i) in sendStatusOptions" :key="i" :label="v.label" :value="v.value"></el-option></el-select> -->
<el-input v-model="listParams.memberName" class="w200" placeholder="会员昵称/手机号/卡号" clearable @change="LoadMessageDetailList"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-input v-model="listParams.memberName" class="w200" placeholder="客户昵称/手机号/卡号" clearable @change="LoadMessageDetailList"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-select class="dm-select" v-model="listParams.sendStatus" placeholder="所有提交状态" @change="LoadMessageDetailList" clearable> <el-option v-for="(v, i) in sendStatusOptions" :key="i" :label="v.label" :value="v.value"></el-option></el-select>
<el-button icon="iconfont icon-icon_yunxiazai fz14" type="primary" class="fr" @click="exportExcel"> 下载Excel</el-button>
</div>
<el-table tooltipEffect="light" :data="messageList" style="width: 100%" v-loading="messageLoading">
<el-table-column :min-width="150" align="left" label="会员信息">
<el-table-column :min-width="150" align="left" label="客户信息">
<template slot-scope="scope">
<div class="sms-table_info">
<img class="table__avatar--40 vertical-middle" :src="filterAvatar(scope.row.thirdImgUrl)" alt="" srcset="" />
......@@ -93,11 +93,12 @@
<span v-else>{{ row[v.prop] }}</span>
</template>
</el-table-column>
<el-table-column :min-width="80" align="left" label="错误" prop="errorMsg">
<el-table-column :min-width="80" align="left" label="错误信息" prop="errorMsg">
<template slot-scope="scope">
<span v-if="scope.row.errorMsg == -1">--</span>
<span v-else-if="scope.row.backStatus == '--' && scope.row.sendStatus !== 2">--</span>
<el-button v-else type="text" @click="errorCodeShow = true">{{ scope.row.errorMsg }}</el-button>
<!-- <el-button v-else type="text" @click="errorCodeShow = true">{{ scope.row.errorMsg }}</el-button> -->
<span v-else type="text">{{ scope.row.errorMsg }}</span>
</template>
</el-table-column>
<el-table-column :min-width="120" align="left" label="上报时间" prop="backTime">
......@@ -110,10 +111,10 @@
</el-table-column>
<el-table-column :show-overflow-tooltip="false" :min-width="150" align="left" label="短信内容" prop="remark">
<template slot-scope="scope">
<el-popover :open-delay="300" class="item" trigger="hover" width="300" v-if="scope.row.remark.length > 10" :content="scope.row.remark" placement="top-start">
<el-popover :open-delay="300" class="item" trigger="hover" width="300" v-if="scope.row.remark && scope.row.remark.length > 10" :content="scope.row.remark" placement="top-start">
<span slot="reference" class="ellipsis">{{ scope.row.remark }}</span>
</el-popover>
<span v-else>{{ scope.row.remark }}</span>
<span v-else>{{ scope.row.remark || '--' }}</span>
</template>
</el-table-column>
</el-table>
......@@ -207,7 +208,7 @@ export default {
hasSearchData: '', // 当前页回显的数据(接口返回)
toggleTag: true, // 控制按钮显示的参数,仅供参考,可自行修改
getSaveData: '',
// 会员分组可传参数
// 客户分组可传参数
defaltSelected: [], // 默认穿梭窗已选入数据
headerList: ['effectiveStatus'], // 表头配置,默认全部,分组名称默认显示不可配置
projectName: 'marketing', // 当前项目名
......@@ -286,7 +287,7 @@ export default {
},
/** ----------人群筛选器的方法----------- */
//获取指定会员
//获取指定客户
getConfirmData(val) {
this.info.openIds = val;
},
......
......@@ -52,12 +52,12 @@
</h3>
<div class="clearfix pb22">
<!-- <el-select class="dm-select" v-model="listParams.sendStatus" placeholder="选择发送状态" @change="smsSmportPlanLogPage"> <el-option v-for="(v, i) in sendStatusOptions" :key="i" :label="v.label" :value="v.value"></el-option></el-select> -->
<el-input v-model="listParams.search" class="w200" placeholder="会员昵称/手机号/卡号" clearable @change="smsSmportPlanLogPage"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-input v-model="listParams.search" class="w200" placeholder="客户昵称/手机号/卡号" clearable @change="smsSmportPlanLogPage"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-select class="dm-select" v-model="listParams.sendStatus" placeholder="全部提交状态" @change="smsSmportPlanLogPage" clearable> <el-option v-for="(v, i) in sendStatusOptions" :key="i" :label="v.label" :value="v.value"></el-option></el-select>
<el-button icon="iconfont icon-icon_yunxiazai fz14" type="primary" class="fr" @click="exportExcel"> 下载Excel</el-button>
</div>
<el-table tooltipEffect="light" :data="messageList" style="width: 100%" v-loading="messageLoading">
<el-table-column min-width="150" align="left" label="会员信息">
<el-table-column min-width="150" align="left" label="客户信息">
<template slot-scope="scope">
<div class="sms-table_info">
<img class="table__avatar--40 vertical-middle" :src="filterAvatar(scope.row.thirdImgUrl)" alt="" srcset="" />
......@@ -74,11 +74,12 @@
<span v-else>{{ row[v.prop] || '--' }}</span>
</template>
</el-table-column>
<el-table-column :min-width="80" align="left" label="错误" prop="errorMsg" show-overflow-tooltip>
<el-table-column :min-width="80" align="left" label="错误信息" prop="errorMsg" show-overflow-tooltip>
<template slot-scope="scope">
<span v-if="scope.row.errorMsg == -1">--</span>
<span v-else-if="scope.row.backStatus == '--' && scope.row.sendStatus !== 2">--</span>
<el-button style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:100%" v-else type="text" @click="errorCodeShow = true">{{ scope.row.errorMsg }}</el-button>
<!-- <el-button style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:100%" v-else type="text" @click="errorCodeShow = true">{{ scope.row.errorMsg }}</el-button> -->
<span style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:100%" v-else type="text">{{ scope.row.errorMsg }}</span>
</template>
</el-table-column>
<el-table-column :min-width="100" align="left" label="上报时间" prop="backTime">
......@@ -91,10 +92,10 @@
</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">
<el-popover class="item" trigger="hover" width="300" v-if="scope.row.remark && scope.row.remark.length > 10" :content="scope.row.remark" placement="top-start">
<span slot="reference" class="ellipsis">{{ scope.row.remark }}</span>
</el-popover>
<span v-else>{{ scope.row.remark }}</span>
<span v-else>{{ scope.row.remark || '--' }}</span>
</template>
</el-table-column>
</el-table>
......
......@@ -9,6 +9,13 @@
<el-checkbox class="vertical-middle" v-if="$store.state.marketing.isShowSelf" v-model="listParams.showSelfFlag" :true-label="1" :false-label="0" label="仅看本人" border @change="refresh" />
<el-input v-model="listParams.search" class="w200" placeholder="输入模板名称/ID/内容" clearable @change="refresh"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-button class="fr" type="primary" @click="$router.push('/message/record/add')">新建群发</el-button>
<span v-if="quantity != -1" class="fr" style="color:#909399;padding:9px 30px 0 0;display:flex;align-items:center">
预估剩余条数
<span style="color:#303133;font-weight:700;margin:0 6px"> {{ quantity }} </span>
<el-tooltip content="据当前账户余额估算,仅供参考,请以实际发送条数为准。" placement="top">
<i class="iconfont icon-tishi" style="color:#909399;margin-left:6px" />
</el-tooltip>
</span>
</div>
<el-table tooltipEffect="light" :data="messageList" style="width: 100%">
<el-table-column :min-width="100" align="left" label="发送时间" prop="sendTime">
......@@ -18,7 +25,7 @@
</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 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" :render-header="onRenderHeader"></el-table-column>
<el-table-column label="状态" prop="sendStatus" align="left" width="140px">
<template slot-scope="scope">
<span v-if="scope.row.sendStatus === 5"><span class="dm-status--primary--flash"></span>执行中</span>
......@@ -45,13 +52,16 @@
</template>
<script>
import { LoadMessageList, invalidsmsRecord } from '@/service/api/messageApi.js';
import { getSign } from '@/service/api/commonApi.js';
import { formatDateTimeByType } from '@/utils/index.js';
import timeCounts from '@/components/timeCount/index.vue';
import tableMethods from '@/mixins/tableMethods.js';
import tip from '@/components/tip';
export default {
name: 'sms-record',
components: {
timeCounts
timeCounts,
tip
},
mixins: [tableMethods],
data() {
......@@ -108,7 +118,7 @@ export default {
}
},
{ label: '计划人数', prop: 'sendCount', width: '100', align: 'left' },
{ label: '送达人数', prop: 'sendSuccess', width: '100', align: 'left' },
{ label: { name: '送达人数', tipText: '提交成功的人数' }, prop: 'sendSuccess', width: '100', align: 'left' },
{ label: '计费条数', prop: 'countNum', width: '100', align: 'left' }
],
listParams: {
......@@ -122,12 +132,25 @@ export default {
showSelfFlag: ''
},
dateTime: ['', ''],
total: 0
total: 0,
quantity: 0
};
},
mounted() {
this.$store.commit(
'mutations_layoutTips',
`<div class="layout--tips">
<i class="el-icon-info"></i>送达人数、计费条数会在提交完成后5分钟更新,点击详情可查看实时数据。
</div>`
);
},
created() {
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理', path: '' }, { name: '短信营销', path: '' }, { name: '短信群发', path: '' }]); // eslint-disable-line
this.getTableList();
this.getQuantity();
},
beforeDestroy() {
this.$store.commit('mutations_layoutTips', '');
},
methods: {
formatDateTimeByType,
......@@ -169,6 +192,15 @@ export default {
if (val === v.value) result = v;
});
return result;
},
// 获取剩余条数
getQuantity() {
getSign().then(res => {
this.quantity = res.result.quantity || 0;
});
},
onRenderHeader(h, { column: { label } }) {
return h('span', [h('span', label.name || label), h(label.name && tip, { props: { text: label.tipText } })]);
}
}
};
......
......@@ -5,40 +5,39 @@
<el-option v-for="(v, i) in libTypeOptions" :key="i" :label="v.label" :value="v.value"></el-option>
</el-select>
<el-date-picker class="w250" v-model="dateTime" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" @change="search"></el-date-picker>
<el-input v-model="listParams.content" class="w200" placeholder="输入模板名称/ID/内容" clearable @change="search"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-button class="fr" type="primary" @click="addTemp">新建短信模板</el-button>
<el-input v-model="listParams.content" class="w200" placeholder="输入模板名称/内容" clearable @change="search"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<el-button class="fr" type="primary" @click="addTemp">
新建短信模板<span>{{ usedCount }}/{{ allUsableCount }}</span>
</el-button>
<span class="fr pt10 pr20">
<el-tooltip effect="dark" placement="top" content="审核失败不占用模板数,删除模板可释放占用模板数。如需更多的短信模板请联系GIC运营。">
<i class="iconfont icon-xinxixianshi pl5 gray"></i>
</el-tooltip>
<span class="gray fz13">可用模板数: {{ allUsableCount }} | 已用模板数:{{ usedCount }}</span>
<span class="gray fz13">审核未通过也占用模板数,如需更多短信模板请联系商家运营。</span>
</span>
</div>
<el-row :gutter="20">
<el-col :span="12" v-for="(v, i) in smsTempList" :key="i">
<div class="sms-lib-item border1">
<div class="sms-lib-item_top ellipsis-80" :title="`${v.title}`">模板名称:{{ v.title }}</div>
<div class="sms-lib-item_top ellipsis-80" :title="`${v.smsTitle}`">模板名称:{{ v.smsTitle }}</div>
<!-- (ID:{{ v.gicSmsTemplateId }}) -->
<div class="sms-lib-item_body">
<p class="danger-color" v-if="v.status === 2"><i class="el-icon-warning"></i> {{ v.auditResult }}</p>
<p>{{ v.content }}</p>
<p class="danger-color" v-if="v.auditStatus === 2"><i class="el-icon-warning"></i> {{ v.auditResult }}</p>
<p>{{ v.smsContent }}</p>
</div>
<div class="sms-lib-item_bottom clearfix">
<div class="fl">
<span>{{ v.addUserName }}</span>
<span>{{ v.creatorName }}</span>
<span>创建于 {{ formatDateTimeByType(v.createTime, 'yyyy-MM-dd-HH-mm-ss') }}</span>
</div>
<div class="fr">
<el-button type="text" v-if="v.status === 2" @click="$router.push('/message/temp/edit/' + v.gicSmsTemplateId)">修改</el-button>
<el-button type="text" v-if="v.auditStatus === 2" @click="$router.push('/message/temp/edit/' + v.gicSmsTemplateId)">修改</el-button>
<el-button type="text" @click="onDeleteData(v)">删除</el-button>
<!-- <dm-delete @confirm="delData(v)" tips="模板删除后,所有引用此模板的短信都会停止发送,请确认。">
<el-button type="text">删除</el-button>
</dm-delete> -->
</div>
</div>
<span class="sms-lib-item-tips_right danger-color-bg" v-if="v.status === 2">未通过</span>
<span class="sms-lib-item-tips_right warning-color-bg" v-if="v.status === 1">审核中</span>
<span class="sms-lib-item-tips_right success-color-bg" v-if="v.status === 0">已通过</span>
<span class="sms-lib-item-tips_right danger-color-bg" v-if="v.auditStatus === 2">未通过</span>
<span class="sms-lib-item-tips_right warning-color-bg" v-if="v.auditStatus === 1">审核中</span>
<span class="sms-lib-item-tips_right success-color-bg" v-if="v.auditStatus === 0">已通过</span>
</div>
</el-col>
</el-row>
......@@ -59,7 +58,11 @@ export default {
formatDateTimeByType,
loading: false,
smsTempList: [],
libTypeOptions: [{ value: '', label: '全部' }, { value: 0, label: '普通短信模板' }, { value: 1, label: '营销短信模板' }], // eslint-disable-line
libTypeOptions: [
{ value: '', label: '全部模板类型' },
{ value: 0, label: '普通短信模板' },
{ value: 1, label: '营销短信模板' }
], // eslint-disable-line
listParams: {
type: '',
content: '',
......@@ -75,7 +78,11 @@ export default {
};
},
created() {
this.$store.commit('mutations_breadcrumb', [{ name: '营销管理', path: '' }, { name: '短信营销', path: '' }, { name: '模板库', path: '' }]); // eslint-disable-line
this.$store.commit('mutations_breadcrumb', [
{ name: '营销管理', path: '' },
{ name: '短信营销', path: '' },
{ name: '模板库', path: '' }
]); // eslint-disable-line
this.LoadLibList();
},
mounted() {
......
@font-face {
font-family: "iconfont"; /* Project id 688955 */
src: url('iconfont.woff2?t=1634537158782') format('woff2'),
url('iconfont.woff?t=1634537158782') format('woff'),
url('iconfont.ttf?t=1634537158782') format('truetype');
src: url('iconfont.woff2?t=1637225676006') format('woff2'),
url('iconfont.woff?t=1637225676006') format('woff'),
url('iconfont.ttf?t=1637225676006') format('truetype');
}
.iconfont {
......@@ -13,6 +13,114 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-a-1_heimingdanguanli:before {
content: "\e68d";
}
.icon-weixinquguan:before {
content: "\e68c";
}
.icon-jifen1:before {
content: "\e689";
}
.icon-yingxiao:before {
content: "\e765";
}
.icon-shouqi1:before {
content: "\e6b8";
}
.icon-xiala:before {
content: "\e6b9";
}
.icon-chuzhizhanghu:before {
content: "\e682";
}
.icon-mendianbaojiadan:before {
content: "\e684";
}
.icon-weimeng:before {
content: "\e6e4";
}
.icon-weixin1:before {
content: "\e685";
}
.icon-01_kaquanguanli:before {
content: "\e686";
}
.icon-chenggong:before {
content: "\e67f";
}
.icon-shibai:before {
content: "\e681";
}
.icon-dengji-:before {
content: "\e6a3";
}
.icon-dengji-1:before {
content: "\e6a4";
}
.icon-dengji-2:before {
content: "\e6a2";
}
.icon-dengji-3:before {
content: "\e6a5";
}
.icon-dengji-4:before {
content: "\e6a6";
}
.icon-dengji-5:before {
content: "\e67a";
}
.icon-dengji-6:before {
content: "\e67b";
}
.icon-dengji-7:before {
content: "\e67c";
}
.icon-dengji-8:before {
content: "\e67d";
}
.icon-dengji-9:before {
content: "\e67e";
}
.icon-yonghuliebiao:before {
content: "\e679";
}
.icon-yichang:before {
content: "\e677";
}
.icon-SwapOutlined:before {
content: "\e672";
}
.icon-BellOutlined:before {
content: "\e673";
}
.icon-chakanxiangqing:before {
content: "\e892";
}
......@@ -229,6 +337,10 @@
content: "\e643";
}
.icon-dingdan-copy:before {
content: "\eb5a";
}
.icon-dingdan:before {
content: "\e660";
}
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -6,6 +6,195 @@
"description": "",
"glyphs": [
{
"icon_id": "22465139",
"name": "1_黑名单管理",
"font_class": "a-1_heimingdanguanli",
"unicode": "e68d",
"unicode_decimal": 59021
},
{
"icon_id": "25735940",
"name": "微信取关",
"font_class": "weixinquguan",
"unicode": "e68c",
"unicode_decimal": 59020
},
{
"icon_id": "25698898",
"name": "积分",
"font_class": "jifen1",
"unicode": "e689",
"unicode_decimal": 59017
},
{
"icon_id": "5880283",
"name": "营销",
"font_class": "yingxiao",
"unicode": "e765",
"unicode_decimal": 59237
},
{
"icon_id": "672034",
"name": "收起",
"font_class": "shouqi1",
"unicode": "e6b8",
"unicode_decimal": 59064
},
{
"icon_id": "672036",
"name": "下拉",
"font_class": "xiala",
"unicode": "e6b9",
"unicode_decimal": 59065
},
{
"icon_id": "2523534",
"name": "储值账户",
"font_class": "chuzhizhanghu",
"unicode": "e682",
"unicode_decimal": 59010
},
{
"icon_id": "4192439",
"name": "门店报价单",
"font_class": "mendianbaojiadan",
"unicode": "e684",
"unicode_decimal": 59012
},
{
"icon_id": "7722415",
"name": "微盟",
"font_class": "weimeng",
"unicode": "e6e4",
"unicode_decimal": 59108
},
{
"icon_id": "15933094",
"name": "微信",
"font_class": "weixin1",
"unicode": "e685",
"unicode_decimal": 59013
},
{
"icon_id": "18480966",
"name": "01_卡券管理",
"font_class": "01_kaquanguanli",
"unicode": "e686",
"unicode_decimal": 59014
},
{
"icon_id": "1046178",
"name": "成功",
"font_class": "chenggong",
"unicode": "e67f",
"unicode_decimal": 59007
},
{
"icon_id": "1046180",
"name": "失败",
"font_class": "shibai",
"unicode": "e681",
"unicode_decimal": 59009
},
{
"icon_id": "7128865",
"name": "等级-3",
"font_class": "dengji-",
"unicode": "e6a3",
"unicode_decimal": 59043
},
{
"icon_id": "7128866",
"name": "等级-6",
"font_class": "dengji-1",
"unicode": "e6a4",
"unicode_decimal": 59044
},
{
"icon_id": "7128868",
"name": "等级-1",
"font_class": "dengji-2",
"unicode": "e6a2",
"unicode_decimal": 59042
},
{
"icon_id": "7128870",
"name": "等级-5",
"font_class": "dengji-3",
"unicode": "e6a5",
"unicode_decimal": 59045
},
{
"icon_id": "7128874",
"name": "等级-8",
"font_class": "dengji-4",
"unicode": "e6a6",
"unicode_decimal": 59046
},
{
"icon_id": "9829436",
"name": "等级-10",
"font_class": "dengji-5",
"unicode": "e67a",
"unicode_decimal": 59002
},
{
"icon_id": "9829439",
"name": "等级-7",
"font_class": "dengji-6",
"unicode": "e67b",
"unicode_decimal": 59003
},
{
"icon_id": "9829440",
"name": "等级-9",
"font_class": "dengji-7",
"unicode": "e67c",
"unicode_decimal": 59004
},
{
"icon_id": "9829441",
"name": "等级-4",
"font_class": "dengji-8",
"unicode": "e67d",
"unicode_decimal": 59005
},
{
"icon_id": "9829444",
"name": "等级-2",
"font_class": "dengji-9",
"unicode": "e67e",
"unicode_decimal": 59006
},
{
"icon_id": "25597267",
"name": "用户列表",
"font_class": "yonghuliebiao",
"unicode": "e679",
"unicode_decimal": 59001
},
{
"icon_id": "11495063",
"name": "异常",
"font_class": "yichang",
"unicode": "e677",
"unicode_decimal": 58999
},
{
"icon_id": "20893458",
"name": "SwapOutlined",
"font_class": "SwapOutlined",
"unicode": "e672",
"unicode_decimal": 58994
},
{
"icon_id": "22596519",
"name": "BellOutlined",
"font_class": "BellOutlined",
"unicode": "e673",
"unicode_decimal": 58995
},
{
"icon_id": "9002691",
"name": "查看详情",
"font_class": "chakanxiangqing",
......@@ -384,6 +573,13 @@
"unicode_decimal": 58947
},
{
"icon_id": "25750336",
"name": "订单",
"font_class": "dingdan-copy",
"unicode": "eb5a",
"unicode_decimal": 60250
},
{
"icon_id": "10094849",
"name": "订单",
"font_class": "dingdan",
......
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