|
@@ -0,0 +1,340 @@
|
|
|
|
+<template>
|
|
|
|
+ <div>
|
|
|
|
+ <el-card>
|
|
|
|
+ <headers title="活跃用户统计" />
|
|
|
|
+ <div class="chioseBox">
|
|
|
|
+ <el-radio-group v-model="timers" size="mini" @change="changeQuick">
|
|
|
|
+ <el-radio-button label="month">本月</el-radio-button>
|
|
|
|
+ <el-radio-button label="year">本年度</el-radio-button>
|
|
|
|
+ <el-radio-button label="lastYear">去年</el-radio-button>
|
|
|
|
+ </el-radio-group>
|
|
|
|
+ <el-date-picker
|
|
|
|
+ v-model="date"
|
|
|
|
+ type="daterange"
|
|
|
|
+ style="width: 300px; padding: 0 10px"
|
|
|
|
+ range-separator="-"
|
|
|
|
+ start-placeholder="开始日期"
|
|
|
|
+ end-placeholder="结束日期"
|
|
|
|
+ value-format="yyyy-MM-dd"
|
|
|
|
+ format="yyyy-MM-dd"
|
|
|
|
+ size="mini"
|
|
|
|
+ @change="changeValue"
|
|
|
|
+ :picker-options="bigin()"
|
|
|
|
+ >
|
|
|
|
+ </el-date-picker>
|
|
|
|
+ 单位:
|
|
|
|
+ <el-radio-group v-model="timer" size="mini">
|
|
|
|
+ <el-radio-button label="day">按天</el-radio-button>
|
|
|
|
+ <el-radio-button label="month">按月</el-radio-button>
|
|
|
|
+ </el-radio-group>
|
|
|
|
+ </div>
|
|
|
|
+ <ve-line
|
|
|
|
+ style="width: 100%"
|
|
|
|
+ height="350px"
|
|
|
|
+ :data="timer == 'day' ? chartData : chartDataForMoth"
|
|
|
|
+ :data-empty="dataEmpty"
|
|
|
|
+ :extend="chartExtend"
|
|
|
|
+ :legend="legend"
|
|
|
|
+ ></ve-line>
|
|
|
|
+ </el-card>
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+<script>
|
|
|
|
+import "v-charts/lib/style.css";
|
|
|
|
+import "echarts/lib/component/dataZoom";
|
|
|
|
+import headers from "./modals/headers.vue";
|
|
|
|
+import veLine from "v-charts/lib/line.common";
|
|
|
|
+import { getNowDateAndSunday, getNowDateAndMonday } from "@/utils/date";
|
|
|
|
+export default {
|
|
|
|
+ components: {
|
|
|
|
+ headers,
|
|
|
|
+ veLine,
|
|
|
|
+ },
|
|
|
|
+ data() {
|
|
|
|
+ return {
|
|
|
|
+ timer: "", // 按天 按月
|
|
|
|
+ timers: "", // 本月 本年 去年
|
|
|
|
+ date: [],
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+ mounted() {
|
|
|
|
+ this.init();
|
|
|
|
+ },
|
|
|
|
+ computed: {
|
|
|
|
+ legend() {
|
|
|
|
+ return {
|
|
|
|
+ left: "10px",
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+ items() {
|
|
|
|
+ let obj = {};
|
|
|
|
+ // let arr = [
|
|
|
|
+ // "HOMEWORK_CREATE_RATE",
|
|
|
|
+ // "HOMEWORK_SUBMIT_RATE",
|
|
|
|
+ // "HOMEWORK_COMMENT_RATE",
|
|
|
|
+ // ];
|
|
|
|
+ // arr.forEach((str) => {
|
|
|
|
+ // if (this.data[str]) {
|
|
|
|
+ // obj[str] = this.data[str];
|
|
|
|
+ // }
|
|
|
|
+ // });
|
|
|
|
+ /**
|
|
|
|
+ * {
|
|
|
|
+ HOMEWORK_CREATE_RATE:this.data["HOMEWORK_CREATE_RATE"] || {},
|
|
|
|
+ HOMEWORK_SUBMIT_RATE: this.data["HOMEWORK_SUBMIT_RATE"] || {},
|
|
|
|
+ HOMEWORK_COMMENT_RATE: this.data["HOMEWORK_COMMENT_RATE"] || {},
|
|
|
|
+ };
|
|
|
|
+ */
|
|
|
|
+ return obj;
|
|
|
|
+ },
|
|
|
|
+ chartExtend() {
|
|
|
|
+ return {
|
|
|
|
+ series: {
|
|
|
|
+ type: "line",
|
|
|
|
+ smooth: false,
|
|
|
|
+ },
|
|
|
|
+ yAxis: {
|
|
|
|
+ //纵轴标尺固定
|
|
|
|
+ minInterval: 1,
|
|
|
|
+ type: "value",
|
|
|
|
+ scale: true,
|
|
|
|
+ min: 0,
|
|
|
|
+ max: 100,
|
|
|
|
+ axisLabel: {
|
|
|
|
+ formatter: "{value}%",
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ tooltip: {
|
|
|
|
+ axisPointer: {
|
|
|
|
+ type: "shadow",
|
|
|
|
+ shadowStyle: {
|
|
|
|
+ color: "rgba(150,150,150,0.2)",
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ formatter: (item) => {
|
|
|
|
+ return [
|
|
|
|
+ item[0].axisValueLabel,
|
|
|
|
+ ...item.map(
|
|
|
|
+ (d) => `<br/>${d.marker}${d.seriesName}: ${d.value[1]} %`
|
|
|
|
+ ),
|
|
|
|
+ ].join("");
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+ dataZoom() {
|
|
|
|
+ return [
|
|
|
|
+ {
|
|
|
|
+ grid: {
|
|
|
|
+ left: "0%",
|
|
|
|
+ },
|
|
|
|
+ type: "slider",
|
|
|
|
+ start: 40,
|
|
|
|
+ end: 100,
|
|
|
|
+ },
|
|
|
|
+ ];
|
|
|
|
+ },
|
|
|
|
+ chartData() {
|
|
|
|
+ const values = Object.values(this.items);
|
|
|
|
+ const months = {};
|
|
|
|
+ for (const item of values) {
|
|
|
|
+ for (const row of item.indexMonthData || []) {
|
|
|
|
+ const key = this.$helpers.dayjs(row.month).format("YYYY-MM-DD");
|
|
|
|
+ if (!months[key]) {
|
|
|
|
+ months[key] = {
|
|
|
|
+ 日期: key + "/" + getNowDateAndSunday(key),
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ months[key][item.title] = row.percent;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return {
|
|
|
|
+ columns: [
|
|
|
|
+ "日期",
|
|
|
|
+ ...values.map((item) => {
|
|
|
|
+ return item.title;
|
|
|
|
+ }),
|
|
|
|
+ ],
|
|
|
|
+ rows: Object.values(months),
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+ chartDataForMoth() {
|
|
|
|
+ const values = Object.values({ ...this.items, ...this.items2 });
|
|
|
|
+ const months = {};
|
|
|
|
+ for (const item of values) {
|
|
|
|
+ for (const row of item.indexMonthData || []) {
|
|
|
|
+ const key = this.$helpers.dayjs(row.month).format("YYYY-MM");
|
|
|
|
+
|
|
|
|
+ if (!months[key]) {
|
|
|
|
+ months[key] = {
|
|
|
|
+ 月份: key,
|
|
|
|
+ };
|
|
|
|
+ months[key][item.title] = row.percent;
|
|
|
|
+ } else {
|
|
|
|
+ if (months[key][item.title]) {
|
|
|
|
+ months[key][item.title] = (
|
|
|
|
+ parseFloat(months[key][item.title]) + parseFloat(row.percent)
|
|
|
|
+ ).toFixed(2);
|
|
|
|
+ } else {
|
|
|
|
+ months[key][item.title] = parseFloat(row.percent).toFixed(2);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return {
|
|
|
|
+ columns: [
|
|
|
|
+ "月份",
|
|
|
|
+ "总收入",
|
|
|
|
+ "现金收入",
|
|
|
|
+ "余额收入",
|
|
|
|
+ "财务支出",
|
|
|
|
+ "报名缴费收入",
|
|
|
|
+ "网管课收入",
|
|
|
|
+ "其他收入",
|
|
|
|
+ "乐团续费收入",
|
|
|
|
+ "VIP课收入",
|
|
|
|
+ ],
|
|
|
|
+ rows: Object.values(months),
|
|
|
|
+ loading: true,
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+ dataEmpty() {
|
|
|
|
+ return !this.chartData.rows.length;
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ methods: {
|
|
|
|
+ init() {
|
|
|
|
+ let nowTiem = this.$helpers.dayjs(new Date()).format("YYYY-MM-DD");
|
|
|
|
+ let startTime = this.$helpers
|
|
|
|
+ .dayjs(getNowDateAndMonday(nowTiem))
|
|
|
|
+ .subtract(49, "day")
|
|
|
|
+ .format("YYYY-MM-DD");
|
|
|
|
+ let endTime = getNowDateAndSunday(nowTiem);
|
|
|
|
+ this.mdate = [startTime, endTime];
|
|
|
|
+ this.FetchDetail();
|
|
|
|
+ },
|
|
|
|
+ changeValue(date) {
|
|
|
|
+ // 请求更改数据
|
|
|
|
+ this.mdate = date;
|
|
|
|
+ // this.isDayOrMoth(date)
|
|
|
|
+ this.FetchDetail();
|
|
|
|
+ },
|
|
|
|
+ async FetchDetail() {
|
|
|
|
+ this.loading = true;
|
|
|
|
+ let data = [];
|
|
|
|
+ try {
|
|
|
|
+ // const { dates, ...rest } = this.search;
|
|
|
|
+ // const res = await getIndex({
|
|
|
|
+ // ...rest,
|
|
|
|
+ // ...getTimes(this.mdate, ["startDate", "endDate"]),
|
|
|
|
+ // dataTypes:
|
|
|
|
+ // "HOMEWORK_CREATE_RATE,HOMEWORK_SUBMIT_RATE,HOMEWORK_COMMENT_RATE",
|
|
|
|
+ // });
|
|
|
|
+ // for (const item of res.data) {
|
|
|
|
+ // // 再循环一遍
|
|
|
|
+ // for (const key in this.items) {
|
|
|
|
+ // if (item.dataType == key) {
|
|
|
|
+ // data[item.dataType] = {
|
|
|
|
+ // ...item,
|
|
|
|
+ // desc: descs[item.dataType],
|
|
|
|
+ // };
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.log(error);
|
|
|
|
+ }
|
|
|
|
+ this.loading = false;
|
|
|
|
+ // this.dataInfo = data;
|
|
|
|
+ // this.$emit("resetDate", data);
|
|
|
|
+ },
|
|
|
|
+ changeQuick(val) {
|
|
|
|
+ let startDate;
|
|
|
|
+ let endDate;
|
|
|
|
+ if (val == "month") {
|
|
|
|
+ // 获取本月的第一天 获取本月的今天
|
|
|
|
+ startDate = this.$helpers
|
|
|
|
+ .dayjs(new Date())
|
|
|
|
+ .set("date", 1)
|
|
|
|
+ .format("YYYY-MM-DD");
|
|
|
|
+ this.endDate
|
|
|
|
+ ? (endDate = this.endDate)
|
|
|
|
+ : (endDate = this.$helpers
|
|
|
|
+ .dayjs(new Date())
|
|
|
|
+ .subtract(1, "day")
|
|
|
|
+ .format("YYYY-MM-DD"));
|
|
|
|
+ this.date = [startDate, endDate];
|
|
|
|
+ // this.submitDate(this.date);
|
|
|
|
+ } else if (val == "year") {
|
|
|
|
+ startDate = this.$helpers
|
|
|
|
+ .dayjs(new Date())
|
|
|
|
+ .set("month", 0)
|
|
|
|
+ .set("date", 1)
|
|
|
|
+ .format("YYYY-MM-DD");
|
|
|
|
+ this.endDate
|
|
|
|
+ ? (endDate = this.endDate)
|
|
|
|
+ : (endDate = this.$helpers
|
|
|
|
+ .dayjs(new Date())
|
|
|
|
+ .subtract(1, "day")
|
|
|
|
+ .format("YYYY-MM-DD"));
|
|
|
|
+ this.date = [startDate, endDate];
|
|
|
|
+ // this.submitDate(this.date);
|
|
|
|
+ } else if (val == "lastYear") {
|
|
|
|
+ startDate = this.$helpers
|
|
|
|
+ .dayjs(new Date())
|
|
|
|
+ .subtract(1, "year")
|
|
|
|
+ .set("month", 0)
|
|
|
|
+ .set("date", 1)
|
|
|
|
+ .format("YYYY-MM-DD");
|
|
|
|
+ endDate = this.$helpers
|
|
|
|
+ .dayjs()
|
|
|
|
+ .subtract(1, "year")
|
|
|
|
+ .endOf("year")
|
|
|
|
+ .format("YYYY-MM-DD");
|
|
|
|
+ this.date = [startDate, endDate];
|
|
|
|
+ // this.submitDate(this.date);
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ changeValue(val) {
|
|
|
|
+ this.timer = "";
|
|
|
|
+ this.date = val;
|
|
|
|
+ // this.submitDate(this.date);
|
|
|
|
+ },
|
|
|
|
+ bigin() {
|
|
|
|
+ let self = this;
|
|
|
|
+ return {
|
|
|
|
+ firstDayOfWeek: 1,
|
|
|
|
+ disabledDate(time) {
|
|
|
|
+ if (self.endDate) {
|
|
|
|
+ let endTime = self.$helpers.dayjs(self.endDate).valueOf();
|
|
|
|
+ return time.getTime() > endTime;
|
|
|
|
+ } else {
|
|
|
|
+ return time.getTime() >= Date.now() - 24 * 60 * 60 * 1000;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+</script>
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
+/deep/.el-card__body {
|
|
|
|
+ padding-top: 0 !important;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.chioseBox {
|
|
|
|
+ position: absolute;
|
|
|
|
+ right: 20px;
|
|
|
|
+ z-index: 1000;
|
|
|
|
+}
|
|
|
|
+.wrap {
|
|
|
|
+ position: relative;
|
|
|
|
+}
|
|
|
|
+.chioseBox {
|
|
|
|
+ position: absolute;
|
|
|
|
+ right: 20px;
|
|
|
|
+ z-index: 1000;
|
|
|
|
+}
|
|
|
|
+</style>
|