Blame view

src/views/dashboard/analysis/components/VisitSource.vue 2.07 KB
Vben authored
1
2
3
4
5
<template>
  <Card title="访问来源" :loading="loading">
    <div ref="chartRef" :style="{ width, height }"></div>
  </Card>
</template>
6
7
<script lang="ts" setup>
  import { Ref, ref, watch } from 'vue';
Vben authored
8
  import { Card } from 'ant-design-vue';
Vben authored
9
  import { useECharts } from '/@/hooks/web/useECharts';
10
11
12
13
14
  const props = defineProps({
    loading: Boolean,
    width: {
      type: String as PropType<string>,
      default: '100%',
Vben authored
15
    },
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    height: {
      type: String as PropType<string>,
      default: '300px',
    },
  });
  const chartRef = ref<HTMLDivElement | null>(null);
  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
  watch(
    () => props.loading,
    () => {
      if (props.loading) {
        return;
      }
      setOptions({
        tooltip: {
          trigger: 'item',
        },
        legend: {
          bottom: '1%',
          left: 'center',
        },
        series: [
          {
            color: ['#5ab1ef', '#b6a2de', '#67e0e3', '#2ec7c9'],
            name: '访问来源',
            type: 'pie',
            radius: ['40%', '70%'],
            avoidLabelOverlap: false,
            itemStyle: {
              borderRadius: 10,
              borderColor: '#fff',
              borderWidth: 2,
Vben authored
48
            },
49
50
51
            label: {
              show: false,
              position: 'center',
Vben authored
52
            },
53
54
55
56
57
            emphasis: {
              label: {
                show: true,
                fontSize: '12',
                fontWeight: 'bold',
Vben authored
58
              },
59
60
61
62
63
64
65
66
67
            },
            labelLine: {
              show: false,
            },
            data: [
              { value: 1048, name: '搜索引擎' },
              { value: 735, name: '直接访问' },
              { value: 580, name: '邮件营销' },
              { value: 484, name: '联盟广告' },
Vben authored
68
            ],
69
70
71
72
73
74
75
76
            animationType: 'scale',
            animationEasing: 'exponentialInOut',
            animationDelay: function () {
              return Math.random() * 100;
            },
          },
        ],
      });
Vben authored
77
    },
vben authored
78
    { immediate: true },
79
  );
Vben authored
80
</script>