diff --git a/package.json b/package.json
index 4364ef0..505d396 100644
--- a/package.json
+++ b/package.json
@@ -58,6 +58,7 @@
"moment": "^2.30.1",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
+ "numeral": "^2.0.6",
"path-to-regexp": "8.0.0",
"qrcodejs2": "^0.0.2",
"qs": "^6.10.1",
@@ -76,7 +77,7 @@
"vuex": "3.1.0",
"wangeditor": "^4.7.11",
"webpack": "^4.47.0",
- "xlsx": "^0.18.5"
+ "xlsx": "^0.14.1"
},
"devDependencies": {
"@babel/parser": "^7.7.4",
diff --git a/src/api/circle.js b/src/api/circle.js
index f536d4b..acc713b 100644
--- a/src/api/circle.js
+++ b/src/api/circle.js
@@ -143,3 +143,13 @@ export function setNotice(data) {
data
});
}
+
+// 后台查询交易圈统计
+export function getCircleStatistics(data) {
+ debugger;
+ return request({
+ url: "/admin/group/collect/query",
+ method: "post",
+ data
+ });
+}
diff --git a/src/main.js b/src/main.js
index 001e168..d12399e 100644
--- a/src/main.js
+++ b/src/main.js
@@ -6,6 +6,7 @@ import "normalize.css/normalize.css";
import Element from "element-ui";
import Vue2Editor from "vue2-editor";
+import "@/utils/filters";
// 数据字典
import dict from "./components/Dict";
diff --git a/src/utils/export2Excel.js b/src/utils/export2Excel.js
index ba956dc..5b2a358 100644
--- a/src/utils/export2Excel.js
+++ b/src/utils/export2Excel.js
@@ -1,25 +1,30 @@
/* eslint-disable */
-require('script-loader!file-saver');
-import XLSX from 'xlsx'
+require("script-loader!file-saver");
+import * as XLSX from "xlsx";
function generateArray(table) {
var out = [];
- var rows = table.querySelectorAll('tr');
+ var rows = table.querySelectorAll("tr");
var ranges = [];
for (var R = 0; R < rows.length; ++R) {
var outRow = [];
var row = rows[R];
- var columns = row.querySelectorAll('td');
+ var columns = row.querySelectorAll("td");
for (var C = 0; C < columns.length; ++C) {
var cell = columns[C];
- var colspan = cell.getAttribute('colspan');
- var rowspan = cell.getAttribute('rowspan');
+ var colspan = cell.getAttribute("colspan");
+ var rowspan = cell.getAttribute("rowspan");
var cellValue = cell.innerText;
if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
//Skip ranges
- ranges.forEach(function (range) {
- if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
+ ranges.forEach(function(range) {
+ if (
+ R >= range.s.r &&
+ R <= range.e.r &&
+ outRow.length >= range.s.c &&
+ outRow.length <= range.e.c
+ ) {
for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
}
});
@@ -38,19 +43,18 @@ function generateArray(table) {
c: outRow.length + colspan - 1
}
});
- };
+ }
//Handle Value
outRow.push(cellValue !== "" ? cellValue : null);
//Handle Colspan
- if (colspan)
- for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
+ if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
}
out.push(outRow);
}
return [out, ranges];
-};
+}
function datenum(v, date1904) {
if (date1904) v += 1462;
@@ -85,18 +89,18 @@ function sheet_from_array_of_arrays(data, opts) {
r: R
});
- if (typeof cell.v === 'number') cell.t = 'n';
- else if (typeof cell.v === 'boolean') cell.t = 'b';
+ if (typeof cell.v === "number") cell.t = "n";
+ else if (typeof cell.v === "boolean") cell.t = "b";
else if (cell.v instanceof Date) {
- cell.t = 'n';
+ cell.t = "n";
cell.z = XLSX.SSF._table[14];
cell.v = datenum(cell.v);
- } else cell.t = 's';
+ } else cell.t = "s";
ws[cell_ref] = cell;
}
}
- if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
+ if (range.s.c < 10000000) ws["!ref"] = XLSX.utils.encode_range(range);
return ws;
}
@@ -109,7 +113,7 @@ function Workbook() {
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
- for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
+ for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
return buf;
}
@@ -127,21 +131,24 @@ export function export_table_to_excel(id) {
/* add ranges to worksheet */
// ws['!cols'] = ['apple', 'banan'];
- ws['!merges'] = ranges;
+ ws["!merges"] = ranges;
/* add worksheet to workbook */
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] = ws;
var wbout = XLSX.write(wb, {
- bookType: 'xlsx',
+ bookType: "xlsx",
bookSST: false,
- type: 'binary'
+ type: "binary"
});
- saveAs(new Blob([s2ab(wbout)], {
- type: "application/octet-stream"
- }), "test.xlsx")
+ saveAs(
+ new Blob([s2ab(wbout)], {
+ type: "application/octet-stream"
+ }),
+ "test.xlsx"
+ );
}
export function export_json_to_excel({
@@ -149,11 +156,11 @@ export function export_json_to_excel({
data,
filename,
autoWidth = true,
- bookType= 'xlsx'
+ bookType = "xlsx"
} = {}) {
/* original data */
- filename = filename || 'excel-list'
- data = [...data]
+ filename = filename || "excel-list";
+ data = [...data];
data.unshift(header);
var ws_name = "SheetJS";
var wb = new Workbook(),
@@ -161,34 +168,35 @@ export function export_json_to_excel({
if (autoWidth) {
/*设置worksheet每列的最大宽度*/
- const colWidth = data.map(row => row.map(val => {
- /*先判断是否为null/undefined*/
- if (val == null) {
- return {
- 'wch': 10
- };
- }
- /*再判断是否为中文*/
- else if (val.toString().charCodeAt(0) > 255) {
- return {
- 'wch': val.toString().length * 2
- };
- } else {
- return {
- 'wch': val.toString().length
- };
- }
- }))
+ const colWidth = data.map(row =>
+ row.map(val => {
+ /*先判断是否为null/undefined*/
+ if (val == null) {
+ return {
+ wch: 10
+ };
+ } else if (val.toString().charCodeAt(0) > 255) {
+ /*再判断是否为中文*/
+ return {
+ wch: val.toString().length * 2
+ };
+ } else {
+ return {
+ wch: val.toString().length
+ };
+ }
+ })
+ );
/*以第一行为初始值*/
let result = colWidth[0];
for (let i = 1; i < colWidth.length; i++) {
for (let j = 0; j < colWidth[i].length; j++) {
- if (result[j]['wch'] < colWidth[i][j]['wch']) {
- result[j]['wch'] = colWidth[i][j]['wch'];
+ if (result[j]["wch"] < colWidth[i][j]["wch"]) {
+ result[j]["wch"] = colWidth[i][j]["wch"];
}
}
}
- ws['!cols'] = result;
+ ws["!cols"] = result;
}
/* add worksheet to workbook */
@@ -198,9 +206,12 @@ export function export_json_to_excel({
var wbout = XLSX.write(wb, {
bookType: bookType,
bookSST: false,
- type: 'binary'
+ type: "binary"
});
- saveAs(new Blob([s2ab(wbout)], {
- type: "application/octet-stream"
- }), `${filename}.${bookType}`);
+ saveAs(
+ new Blob([s2ab(wbout)], {
+ type: "application/octet-stream"
+ }),
+ `${filename}.${bookType}`
+ );
}
diff --git a/src/utils/filters.js b/src/utils/filters.js
new file mode 100644
index 0000000..9c72dcf
--- /dev/null
+++ b/src/utils/filters.js
@@ -0,0 +1,259 @@
+import Vue from "vue";
+import numeral from "numeral";
+import dayjs from "dayjs";
+
+// 格式化和操作数字
+Vue.filter("numberFormat", (value, format) => {
+ if (value == null) return "--";
+ return numeral(value || 0).format(format);
+});
+
+// 格式时间
+Vue.filter("dateFilter", (value, format = "YYYY-MM-DD") => {
+ if (value == null) return "--";
+ return dayjs(value).format(format);
+});
+
+Vue.filter("getUserStatus", value => {
+ if (value == null) return "--";
+ switch (value) {
+ case 1:
+ return "已启用";
+ case 2:
+ return "已禁用";
+ case 3:
+ return "已冻结";
+ }
+});
+
+Vue.filter("getRiskLevel", value => {
+ if (value == null) return "--";
+ switch (value) {
+ case 1:
+ return "低风险";
+ case 2:
+ return "中低风险";
+ case 3:
+ return "中风险";
+ case 4:
+ return "中高风险";
+ case 5:
+ return "高风险";
+ }
+});
+
+Vue.filter("getProductType", value => {
+ if (value == null) return "--";
+ switch (value) {
+ case 1:
+ return "观点包";
+ case 2:
+ return "观点";
+ case 7:
+ return "投资组合";
+ case 8:
+ return "股票池";
+ case 9:
+ return "套餐";
+ case 21:
+ return "增值产品";
+ case 22:
+ return "三方-课程";
+ case 23:
+ return "EFT专区";
+ case 24:
+ return "选股工具";
+ case 25:
+ return "小飞机理财";
+ case 31:
+ return "投资课堂";
+ case 32:
+ return "课程";
+ }
+});
+
+Vue.filter("getStatus", value => {
+ if (value == null) return "--";
+ switch (value) {
+ case 1:
+ return "待提交";
+ case 2:
+ return "待一级审核";
+ case 11:
+ return "待二级审核";
+ case 12:
+ return "待三级审核";
+ case 3:
+ return "已上架";
+ case 4:
+ return "已驳回";
+ case 5:
+ return "已下架";
+ }
+});
+
+Vue.filter("getCommissionStatus", value => {
+ // if (value == null) return '--'
+ switch (value) {
+ case 0:
+ return "无信用账号";
+ case 1:
+ return "成功";
+ case -1:
+ return "失败";
+ case 2:
+ return "查询失败";
+ default:
+ return "--";
+ }
+});
+
+Vue.filter("getAuthType", value => {
+ if (value == null) return "--";
+ switch (value) {
+ case 1:
+ return "公开可见";
+ case 2:
+ return "登录手机可见";
+ case 3:
+ return "登录资金账号可见";
+ case 4:
+ return "付费可见";
+ case 5:
+ return "仅供签约客户查看";
+ }
+});
+
+Vue.filter("getPeriodType", value => {
+ if (value == null) return "--";
+ switch (value) {
+ case 0:
+ return "免费永久,单品提拥";
+ case 7:
+ return "周";
+ case 14:
+ return "月";
+ case 16:
+ return "季度";
+ case 19:
+ return "半年";
+ case 20:
+ return "年";
+ case 99:
+ return "收费永久,单篇收费";
+ case 98:
+ return "收费永久,整体提拥";
+ }
+});
+
+Vue.filter("getCustomRiskLevel", value => {
+ if (value == null) return "--";
+ switch (value) {
+ case 1:
+ return "C1保守型";
+ case 2:
+ return "C2谨慎型";
+ case 3:
+ return "C3稳健型";
+ case 4:
+ return "C4积极型";
+ case 5:
+ return "C5激进型";
+ }
+});
+
+Vue.filter("getPayType", value => {
+ if (value == null) return "--";
+ switch (value) {
+ case 1:
+ return "支付宝";
+ case 5:
+ return "微信";
+ case 13:
+ return "提佣支付";
+ case 14:
+ return "保证金";
+ }
+});
+
+Vue.filter("getOrderStatus", (value, type) => {
+ if (value == null) return "--";
+ if (type === 13) {
+ switch (value) {
+ case 70:
+ return "签约失败";
+ case 95:
+ return "解约中";
+ case 100:
+ return "已解约";
+ case 180:
+ return "新订单";
+ case 220:
+ return "已签约";
+ }
+ } else {
+ switch (value) {
+ case 220:
+ return "支付成功";
+ case 70:
+ return "支付取消";
+ case 95:
+ return "退款中";
+ case 100:
+ return "退款成功";
+ case 180:
+ return "新订单";
+ case 80:
+ return "已过期";
+ case 90:
+ return "已关闭";
+ }
+ }
+});
+
+Vue.filter("getRefundStatus", (value, type) => {
+ if (value == null) return "--";
+ let mould = "";
+ if (type === 13) {
+ mould = "解约";
+ } else {
+ mould = "退款";
+ }
+ switch (value) {
+ case 180:
+ return `申请${mould}`;
+ case 200:
+ return `${mould}审核通过`;
+ case 210:
+ return `${mould}失败`;
+ case 220:
+ return `已${mould}`;
+ }
+});
+
+Vue.filter("getChannel", value => {
+ if (value == null) return "--";
+ switch (value) {
+ case 1:
+ return "APP";
+ case 2:
+ return "小程序";
+ }
+});
+
+Vue.filter("formatPhone", phone => {
+ // console.log(phone)
+ // if(!phone) return phone
+ // if (typeof phone == 'number') {
+ // phone = phone.toString();
+ // }
+ // return phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
+ return phone;
+});
+
+Vue.filter("formatRatio", (value, unit = true, num = 2) => {
+ if (value == null || value == "--") {
+ return "";
+ }
+ return (Number(value) * 100).toFixed(num) + (unit ? "%" : "");
+});
diff --git a/src/views/circle/data/components/LineChart.vue b/src/views/circle/data/components/LineChart.vue
index e3d4faa..938f19b 100644
--- a/src/views/circle/data/components/LineChart.vue
+++ b/src/views/circle/data/components/LineChart.vue
@@ -27,7 +27,6 @@ export default {
}
},
mounted() {
- this.initChart();
this.__resizeHandler = debounce(() => {
if (this.chart) {
this.chart.resize();
@@ -44,10 +43,13 @@ export default {
this.chart = null;
},
methods: {
- initChart() {
- this.chart = echarts.init(this.$el, "macarons");
-
- this.chart.setOption(this.option);
+ drawChart() {
+ if (this.chart) {
+ this.chart.setOption(this.option, true);
+ } else {
+ this.chart = echarts.init(this.$el, "macarons");
+ this.chart.setOption(this.option);
+ }
}
}
};
diff --git a/src/views/circle/data/components/contentModule.vue b/src/views/circle/data/components/contentModule.vue
index a090cf6..dc4086a 100644
--- a/src/views/circle/data/components/contentModule.vue
+++ b/src/views/circle/data/components/contentModule.vue
@@ -1,75 +1,129 @@
总动态数 今日老师发布内容数 今日新增动态书 今日助教发布内容数 今日用户互动内容数 今日老师私聊内容数 今日助教私聊内容数 今日用户私聊内容数成员
+ 内容
100
+ {{ currentData.advisorGroupContent }}
500
+ {{ currentData.assistantGroupContent }}
+ {{ currentData.customerGroupContent }}
+ {{ currentData.advisorPrivateContent }}
+ {{ currentData.assistantPrivateContent }}
+ {{ currentData.customerPrivateContent }}
内容趋势
总成员数
-今日访问成员数
-今日新增成员数
-今日动态成员数
-今日发互动成员数
+今日发私聊成员数
+{{ item.createTime }}
@@ -54,7 +52,7 @@{{ item.content }}
-{{ item.createTime }}
{{ item.content }}
-