|
|
@@ -1,50 +1,154 @@
|
|
|
<template>
|
|
|
<widget-card :bodyStyle="bodyStyle" ref="container">
|
|
|
+ <div slot="header" class="clearfix">
|
|
|
+ <span>会员新增趋势</span>
|
|
|
+ <el-radio-group v-model="radio1" size="mini" @change="getStart">
|
|
|
+ <el-radio-button label="MONTH">按月显示</el-radio-button>
|
|
|
+ <el-radio-button label="DATE">按天显示</el-radio-button>=
|
|
|
+ </el-radio-group>
|
|
|
+ </div>
|
|
|
<canvas ref="chart" class="chart"></canvas>
|
|
|
</widget-card>
|
|
|
</template>
|
|
|
<script>
|
|
|
- import WidgetCard from './WidgetCard'
|
|
|
- import VueCharts from 'vue-chartjs'
|
|
|
+import WidgetCard from "./WidgetCard";
|
|
|
+import VueCharts from "vue-chartjs";
|
|
|
+import { format } from "date-fns";
|
|
|
|
|
|
- export default {
|
|
|
- data() {
|
|
|
- return {
|
|
|
- myChart: null,
|
|
|
- bodyStyle: {
|
|
|
- display: 'flex',
|
|
|
- alignItems: 'center'
|
|
|
- }
|
|
|
+export default {
|
|
|
+ props: ["value"],
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ myChart: null,
|
|
|
+ bodyStyle: {
|
|
|
+ display: "flex",
|
|
|
+ alignItems: "center"
|
|
|
+ },
|
|
|
+ radio1: "MONTH",
|
|
|
+ dataMap: new Map(),
|
|
|
+ labels: [],
|
|
|
+ colorMap: new Map([
|
|
|
+ [
|
|
|
+ "线上会员",
|
|
|
+ {
|
|
|
+ mainColor: "#E4B100",
|
|
|
+ startColor: "rgba(228,177,0,0.7)",
|
|
|
+ stopColor: "rgba(228,177,0,0)"
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ [
|
|
|
+ "线下会员",
|
|
|
+ {
|
|
|
+ mainColor: "#20a0ff",
|
|
|
+ startColor: "rgba(32,160,255,0.7)",
|
|
|
+ stopColor: "rgba(32,160,255,0)"
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ ])
|
|
|
+ };
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.$refs.chart.width = this.$refs.container.$el.offsetWidth - 20;
|
|
|
+ this.$refs.chart.height = this.$refs.container.$el.offsetHeight - 90;
|
|
|
+ this.getStart();
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ labelFormat(value) {
|
|
|
+ if (this.radio1 === "MONTH") {
|
|
|
+ return value + "月";
|
|
|
+ } else {
|
|
|
+ return format(new Date(value), "MM-dd");
|
|
|
}
|
|
|
},
|
|
|
- mounted() {
|
|
|
- this.$refs.chart.width = this.$refs.container.$el.offsetWidth - 20;
|
|
|
- this.$refs.chart.height = this.$refs.container.$el.offsetHeight - 20;
|
|
|
- var gradient = this.$refs.chart.getContext('2d').createLinearGradient(0, 0, 0, 200);
|
|
|
+ getStart() {
|
|
|
+ this.getLineInfo().then(() => {
|
|
|
+ this.drawChart();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ getLineInfo() {
|
|
|
+ return this.$http
|
|
|
+ .get("/summary/getVipSummary", {
|
|
|
+ type: this.radio1,
|
|
|
+ isShare: true
|
|
|
+ })
|
|
|
+ .then(res => {
|
|
|
+ let map = new Map();
|
|
|
+ Object.keys(res).forEach(item => {
|
|
|
+ map.set(this.labelFormat(item), res[item]);
|
|
|
+ });
|
|
|
+ let list = Array.from(map);
|
|
|
+ list.sort((a, b) => {
|
|
|
+ return a[0].localeCompare(b[0]);
|
|
|
+ });
|
|
|
+ map = new Map(list);
|
|
|
+ this.labels = Array.from(map.keys());
|
|
|
+ this.dataMap.set("线上会员", Array.from(map.values()));
|
|
|
|
|
|
- gradient.addColorStop(0, 'rgba(32,160,255,0.7)');
|
|
|
- gradient.addColorStop(1, 'rgba(32,160,255,0)');
|
|
|
- this.myChart = new Chart(this.$refs.chart.getContext('2d'), {
|
|
|
- type: 'line',
|
|
|
+ return this.$http.get("/summary/getVipSummary", {
|
|
|
+ type: this.radio1,
|
|
|
+ isShare: false
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .then(res => {
|
|
|
+ let map = new Map();
|
|
|
+ Object.keys(res).forEach(item => {
|
|
|
+ map.set(this.labelFormat(item), res[item]);
|
|
|
+ });
|
|
|
+ let list = Array.from(map);
|
|
|
+ list.sort((a, b) => {
|
|
|
+ return a[0].localeCompare(b[0]);
|
|
|
+ });
|
|
|
+ map = new Map(list);
|
|
|
+ this.labels = Array.from(map.keys());
|
|
|
+ this.dataMap.set("线下会员", Array.from(map.values()));
|
|
|
+ });
|
|
|
+ },
|
|
|
+ drawChart() {
|
|
|
+ let datasets = [];
|
|
|
+ this.dataMap.forEach((value, key) => {
|
|
|
+ let color = this.colorMap.get(key);
|
|
|
+ let data = Array.from(value.values());
|
|
|
+ let gradient = this.$refs.chart
|
|
|
+ .getContext("2d")
|
|
|
+ .createLinearGradient(0, 0, 0, 500);
|
|
|
+
|
|
|
+ gradient.addColorStop(0, color.startColor);
|
|
|
+ gradient.addColorStop(1, color.stopColor);
|
|
|
+ datasets.push({
|
|
|
+ label: key,
|
|
|
+ backgroundColor: gradient,
|
|
|
+ borderColor: color.mainColor,
|
|
|
+ borderWidth: "1px",
|
|
|
+ data: data
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ if (this.myChart) {
|
|
|
+ this.myChart.destroy();
|
|
|
+ }
|
|
|
+
|
|
|
+ this.myChart = new Chart(this.$refs.chart.getContext("2d"), {
|
|
|
+ type: "line",
|
|
|
data: {
|
|
|
- labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
|
|
|
- datasets: [
|
|
|
- {
|
|
|
- label: 'Data One',
|
|
|
- backgroundColor: gradient,
|
|
|
- borderColor: '#20a0ff',
|
|
|
- borderWidth: '1px',
|
|
|
- data: [40, 39, 10, 40, 39, 80, 40]
|
|
|
- }
|
|
|
- ]
|
|
|
+ labels: this.labels,
|
|
|
+ datasets: datasets
|
|
|
},
|
|
|
- options: {responsive: true, maintainAspectRatio: false}
|
|
|
+ options: { responsive: true, maintainAspectRatio: false }
|
|
|
});
|
|
|
- },
|
|
|
- components: {
|
|
|
- WidgetCard
|
|
|
}
|
|
|
+ },
|
|
|
+ components: {
|
|
|
+ WidgetCard
|
|
|
}
|
|
|
+};
|
|
|
</script>
|
|
|
<style lang="less" scoped>
|
|
|
+.clearfix {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ height: 20px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding: 0 !important;
|
|
|
+}
|
|
|
</style>
|