|
|
@@ -1,11 +1,194 @@
|
|
|
<template>
|
|
|
- <div>stat</div>
|
|
|
+ <div>
|
|
|
+ <van-notice-bar
|
|
|
+ text="请及时完善您的信息,便于精准统计!"
|
|
|
+ :color="$theme.prim"
|
|
|
+ v-if="!(userInfo && userInfo.realName)"
|
|
|
+ >
|
|
|
+ <van-button size="mini" slot="right-icon" :color="$theme.prim" @click="$router.push({ name: 'profile' })">
|
|
|
+ 去完善
|
|
|
+ </van-button>
|
|
|
+ </van-notice-bar>
|
|
|
+ <div class="stat-title">概况统计</div>
|
|
|
+ <van-tabs type="card" class="stat-tabs" v-model="tab1">
|
|
|
+ <van-tab title="今日"></van-tab>
|
|
|
+ <van-tab title="昨日"></van-tab>
|
|
|
+ <van-tab title="近7日"></van-tab>
|
|
|
+ <van-tab title="近30日"></van-tab>
|
|
|
+ </van-tabs>
|
|
|
+ <div class="stat">
|
|
|
+ <div class="col">
|
|
|
+ <div class="value">{{ stat1.visitNum }}</div>
|
|
|
+ <div class="label">打开次数</div>
|
|
|
+ </div>
|
|
|
+ <div class="col">
|
|
|
+ <div class="value">{{ stat1.orderNum }}</div>
|
|
|
+ <div class="label">成交笔数</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="stat-title">趋势统计</div>
|
|
|
+ <van-tabs type="card" class="stat-tabs" v-model="tab2">
|
|
|
+ <van-tab title="近7日"></van-tab>
|
|
|
+ <van-tab title="近30日"></van-tab>
|
|
|
+ </van-tabs>
|
|
|
+ <div style="padding: 0 16px; margin-top: 15px">
|
|
|
+ <chart
|
|
|
+ :data="chartData"
|
|
|
+ :options="{ responsive: true, maintainAspectRatio: false }"
|
|
|
+ v-if="chartData"
|
|
|
+ ></chart>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
<script>
|
|
|
+import { mapState } from 'vuex';
|
|
|
+import { format, parse, addDays, startOfWeek, startOfMonth, endOfWeek, endOfMonth, startOfDay } from 'date-fns';
|
|
|
+import chart from '../components/chart';
|
|
|
export default {
|
|
|
+ components: { chart },
|
|
|
data() {
|
|
|
- return {};
|
|
|
+ return {
|
|
|
+ tab1: 0,
|
|
|
+ tab2: 0,
|
|
|
+ visitNum: 0,
|
|
|
+ orderNum: 0,
|
|
|
+ stat1: { visitNum: 0, orderNum: 0 },
|
|
|
+ stat2: {},
|
|
|
+ chartData: null
|
|
|
+ };
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapState(['userInfo'])
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.getData1();
|
|
|
+ this.getData2();
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ getData1() {
|
|
|
+ let start, end;
|
|
|
+ switch (this.tab1) {
|
|
|
+ case 0:
|
|
|
+ start = end = format(new Date(), 'yyyy-MM-dd');
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ start = end = format(addDays(new Date(), -1), 'yyyy-MM-dd');
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ end = format(new Date(), 'yyyy-MM-dd');
|
|
|
+ start = format(addDays(new Date(), -6), 'yyyy-MM-dd');
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ end = format(new Date(), 'yyyy-MM-dd');
|
|
|
+ start = format(addDays(new Date(), -29), 'yyyy-MM-dd');
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ this.$http
|
|
|
+ .get('/visitStat/stat1', {
|
|
|
+ start,
|
|
|
+ end
|
|
|
+ })
|
|
|
+ .then(res => {
|
|
|
+ this.stat1 = res;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ getData2() {
|
|
|
+ let start, end;
|
|
|
+ switch (this.tab2) {
|
|
|
+ case 0:
|
|
|
+ end = format(addDays(new Date(), -1), 'yyyy-MM-dd');
|
|
|
+ start = format(addDays(new Date(), -7), 'yyyy-MM-dd');
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ end = format(addDays(new Date(), -1), 'yyyy-MM-dd');
|
|
|
+ start = format(addDays(new Date(), -30), 'yyyy-MM-dd');
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ this.$http
|
|
|
+ .get('/visitStat/stat2', {
|
|
|
+ start,
|
|
|
+ end
|
|
|
+ })
|
|
|
+ .then(res => {
|
|
|
+ this.stat2 = res;
|
|
|
+
|
|
|
+ // this.chartData = {
|
|
|
+ // labels: res.labels,
|
|
|
+ // datasets: [
|
|
|
+ // {
|
|
|
+ // label: '访问',
|
|
|
+ // backgroundColor: gradient,
|
|
|
+ // borderColor: '#20a0ff',
|
|
|
+ // borderWidth: '1px',
|
|
|
+ // data: res.visitNum
|
|
|
+ // }
|
|
|
+ // ]
|
|
|
+ // };
|
|
|
+ this.chartData = {
|
|
|
+ labels: res.labels,
|
|
|
+ datasets: [
|
|
|
+ {
|
|
|
+ label: '访问',
|
|
|
+ backgroundColor: 'rgba(255, 99, 132, 0.5)',
|
|
|
+ borderColor: 'rgb(255, 99, 132)',
|
|
|
+ borderWidth: 2,
|
|
|
+ fill: false,
|
|
|
+ data: res.visitNum
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '订单',
|
|
|
+ backgroundColor: 'rgb(54, 162, 235, 0.5)',
|
|
|
+ borderColor: 'rgb(54, 162, 235)',
|
|
|
+ borderWidth: 2,
|
|
|
+ fill: false,
|
|
|
+ data: res.orderNum
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ };
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ tab1() {
|
|
|
+ this.getData1();
|
|
|
+ },
|
|
|
+ tab2() {
|
|
|
+ this.chartData = null;
|
|
|
+ this.getData2();
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
</script>
|
|
|
-<style lang="less" scoped></style>
|
|
|
+<style lang="less" scoped>
|
|
|
+.stat-tabs {
|
|
|
+ margin-top: 15px;
|
|
|
+}
|
|
|
+.stat-title {
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-top: 10px;
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+
|
|
|
+.stat {
|
|
|
+ margin-top: 10px;
|
|
|
+ .flex();
|
|
|
+ .col {
|
|
|
+ .flex-col();
|
|
|
+ flex-basis: 0;
|
|
|
+ flex-grow: 1;
|
|
|
+ align-items: center;
|
|
|
+ .value {
|
|
|
+ color: @text1;
|
|
|
+ font-size: 15px;
|
|
|
+ font-weight: bold;
|
|
|
+ line-height: 26px;
|
|
|
+ }
|
|
|
+ .label {
|
|
|
+ color: @text3;
|
|
|
+ font-size: 13px;
|
|
|
+ line-height: 20px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|