From a5cbfa84a563a77502de8b003391723b627a65da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?kaizheng=28=E9=83=91=E5=87=AF=29?= Date: Sat, 15 Feb 2025 20:10:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9C=88=E5=AD=90=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- src/api/circle.js | 10 + src/main.js | 1 + src/utils/export2Excel.js | 115 +++---- src/utils/filters.js | 259 +++++++++++++++ .../circle/data/components/LineChart.vue | 12 +- .../circle/data/components/contentModule.vue | 294 +++++++++++++++--- .../circle/data/components/memberModule.vue | 280 +++++++++++++---- .../circle/data/components/studentList.vue | 118 ++++--- .../circle/detail/components/newsList.vue | 32 +- .../detail/components/userLnteractList.vue | 32 +- .../circle/detail/mixins/webSocketConnect.js | 7 +- src/views/circle/list/index.vue | 7 +- 13 files changed, 928 insertions(+), 242 deletions(-) create mode 100644 src/utils/filters.js 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 @@ diff --git a/src/views/circle/data/components/memberModule.vue b/src/views/circle/data/components/memberModule.vue index 4edd7a6..2fd52cc 100644 --- a/src/views/circle/data/components/memberModule.vue +++ b/src/views/circle/data/components/memberModule.vue @@ -4,80 +4,121 @@
成员趋势
- - + + - + :value="item.id" + /> - + - + v-if="timeType === 2" + v-model="time" + type="year" + placeholder="选择年" + value-format="yyyy-MM-dd HH:mm:ss" + style="width: 100px" + /> + + + 搜索 - 导出 + 导出
- + @@ -151,6 +326,7 @@ export default { padding: 0; font-size: 24px; line-height: 40px; + height: 40px; } } } diff --git a/src/views/circle/data/components/studentList.vue b/src/views/circle/data/components/studentList.vue index 68bb340..a84e144 100644 --- a/src/views/circle/data/components/studentList.vue +++ b/src/views/circle/data/components/studentList.vue @@ -1,57 +1,59 @@ - + diff --git a/src/views/circle/detail/components/newsList.vue b/src/views/circle/detail/components/newsList.vue index a16f349..4503a08 100644 --- a/src/views/circle/detail/components/newsList.vue +++ b/src/views/circle/detail/components/newsList.vue @@ -11,9 +11,9 @@ - - + > + +
@@ -21,32 +21,30 @@ - 1/4 - 已读 + >{{ item.userType === 1 ? "老师" : "助教" }} +
+ {{ item.readCount }}{{ item.totalCount }} + 已读 +
{{ - item.isRecommend === 1 ? "取消精选" : "设为精选" - }} + >{{ + item.isRecommend === 1 ? "取消精选" : "设为精选" + }} 引用 + >引用 通过审核 + >通过审核

{{ item.createTime }}

@@ -54,7 +52,7 @@

{{ item.content }}

- +
@@ -177,7 +175,7 @@ export default { this.loading = false; }); if (ret && ret.code === 0) { - let retList = ret.data.list; + const retList = ret.data.list; this.list = this.list.concat(ret.data.list); retList.forEach(msg => { this.msgIdsObj[msg.id] = msg; diff --git a/src/views/circle/detail/components/userLnteractList.vue b/src/views/circle/detail/components/userLnteractList.vue index a68309c..b7979c5 100644 --- a/src/views/circle/detail/components/userLnteractList.vue +++ b/src/views/circle/detail/components/userLnteractList.vue @@ -13,7 +13,7 @@ >
  • - +
    @@ -21,30 +21,32 @@ - 1/4 - 已读 + >{{ item.userType === 1 ? "老师" : "助教" }} +
    + {{ item.readCount }}{{ item.totalCount }} + 已读 +

    {{ item.createTime }}

    - 引用 + 引用 通过审核 + >通过审核
    - 私聊 + 私聊 {{ item.isForbidden === 1 ? "取消禁言" : "禁言" @@ -54,7 +56,7 @@

    {{ item.content }}

    - +
  • @@ -156,7 +158,7 @@ export default { this.loading = false; }); if (ret && ret.code === 0) { - let retList = ret.data.list; + const retList = ret.data.list; this.list = this.list.concat(retList); retList.forEach(msg => { this.msgIdsObj[msg.id] = msg; diff --git a/src/views/circle/detail/mixins/webSocketConnect.js b/src/views/circle/detail/mixins/webSocketConnect.js index 82158a7..04f4936 100644 --- a/src/views/circle/detail/mixins/webSocketConnect.js +++ b/src/views/circle/detail/mixins/webSocketConnect.js @@ -6,6 +6,9 @@ export default { stompClient: null }; }, + beforeDestroy() { + this.stompClient && this.stompClient.deactivate(); + }, methods: { async getConnectConfig(id) { const res = await rLiveWsConfig({ id, type: 9 }); @@ -19,8 +22,8 @@ export default { process.env.NODE_ENV === "development" ? "ws://8.138.144.54:8080/tgim/chat" : `${location.protocol === "http:" ? "ws://" : "wss://"}${ - location.host - }/tgim/chat`; + location.host + }/tgim/chat`; // 后端群组消息 const groupChatTopic = `/admin/group/topic/${id}`; // 私聊消息 diff --git a/src/views/circle/list/index.vue b/src/views/circle/list/index.vue index 7051fce..4937c09 100644 --- a/src/views/circle/list/index.vue +++ b/src/views/circle/list/index.vue @@ -91,8 +91,13 @@ v-if="tougu || yunyin || zhujiao || yinxiao" type="text" size="mini" - @click="addTag(scope.row, 1)" + @click="addTag(scope.row, 0)" >查看 + 数据