|
@@ -0,0 +1,349 @@
|
|
|
+<template>
|
|
|
+ <div class="layout-padding">
|
|
|
+ <div class="ascribe">
|
|
|
+ <el-row :gutter="12" style="padding: 0 12px 12px; row-gap: 12px;">
|
|
|
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
|
|
+ <el-card shadow="none" style="padding: 10px 14px;">
|
|
|
+ <div class="top-info">
|
|
|
+ <div class="title">卸载归因<el-tooltip class="box-item" effect="light" content="" placement="right-start">
|
|
|
+ <svg style="margin: 0 0 0 8px; vertical-align: baseline;" width="14" height="14" viewBox="0 0 14 14"
|
|
|
+ fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
|
+ <path
|
|
|
+ d="M7 14C8.93298 14 10.683 13.2165 11.9497 11.9497C13.2165 10.683 14 8.93298 14 7C14 5.06702 13.2165 3.31702 11.9497 2.05025C10.683 0.783503 8.93298 0 7 0C5.06702 0 3.31702 0.783503 2.05025 2.05025C0.783503 3.31702 0 5.06702 0 7C0 8.93298 0.783503 10.683 2.05025 11.9497C3.31702 13.2165 5.06702 14 7 14Z"
|
|
|
+ fill="#1B4D88" fill-opacity="0.4" />
|
|
|
+ <path
|
|
|
+ d="M4 4.702C4 4.40333 4.02333 4.09533 4.07 3.778C4.126 3.46067 4.21933 3.17133 4.35 2.91C4.49 2.64867 4.67667 2.434 4.91 2.266C5.14333 2.08867 5.45133 2 5.834 2H7.794C8.102 2 8.37267 2.06533 8.606 2.196C8.84867 2.31733 9.04467 2.476 9.194 2.672C9.35267 2.868 9.474 3.092 9.558 3.344C9.65133 3.596 9.70733 3.848 9.726 4.1C9.754 4.352 9.74467 4.59467 9.698 4.828C9.66067 5.06133 9.59533 5.26667 9.502 5.444L7.934 8.314V9.574H6.324V8.146L7.808 5.556C7.892 5.416 7.948 5.234 7.976 5.01C8.01333 4.786 8.01333 4.57133 7.976 4.366C7.948 4.15133 7.878 3.96933 7.766 3.82C7.66333 3.67067 7.514 3.596 7.318 3.596H6.408C6.24933 3.596 6.11867 3.624 6.016 3.68C5.91333 3.72667 5.82933 3.80133 5.764 3.904C5.708 3.99733 5.67067 4.114 5.652 4.254C5.63333 4.38467 5.624 4.534 5.624 4.702H4ZM7.976 12.15H6.324V10.512H7.976V12.15Z"
|
|
|
+ fill="white" />
|
|
|
+ </svg>
|
|
|
+ <template #content>
|
|
|
+ <div style="width: 300px;">
|
|
|
+ 卸载归因解读卸载设备在您应用中的最后活跃行为。
|
|
|
+ 本模块功能展示周期内的卸载设备,在卸载前的最后7天(含当天)在您的应用中浏览次数TOP10的页面;展示应用在全网设备中的卸载量,及是否在当前周期内新安装了您关注行业的头部竞品。同时基于行业提供各周期的应用安装卸载比,辅助您判断行业的规模趋势。
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-tooltip>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="data-source-status">数据源状态:Demo数据</div>
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="12" style="padding: 0 12px 12px; row-gap: 12px;">
|
|
|
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
|
|
+ <el-card shadow="none">
|
|
|
+ <div class="trend-container">
|
|
|
+ <div class="title">卸载设备全量预测</div>
|
|
|
+ <div class="tabs">
|
|
|
+ <div class="tabs-item" :class="{ active: activeTab === 'churnTrend' }"
|
|
|
+ @click="handleTabClick('churnTrend')">
|
|
|
+ 卸载流失设备(预测)
|
|
|
+ <el-tooltip effect="light" content="" placement="right-start">
|
|
|
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"
|
|
|
+ xmlns="http://www.w3.org/2000/svg">
|
|
|
+ <path
|
|
|
+ d="M7 14C8.93298 14 10.683 13.2165 11.9497 11.9497C13.2165 10.683 14 8.93298 14 7C14 5.06702 13.2165 3.31702 11.9497 2.05025C10.683 0.783503 8.93298 0 7 0C5.06702 0 3.31702 0.783503 2.05025 2.05025C0.783503 3.31702 0 5.06702 0 7C0 8.93298 0.783503 10.683 2.05025 11.9497C3.31702 13.2165 5.06702 14 7 14Z"
|
|
|
+ fill="#1B4D88" fill-opacity="0.4" />
|
|
|
+ <path fill-rule="evenodd" clip-rule="evenodd"
|
|
|
+ d="M6.99957 1.94434C7.5365 1.94434 7.97179 2.37962 7.97179 2.91656C7.97179 3.4535 7.5365 3.88878 6.99957 3.88878C6.46263 3.88878 6.02734 3.4535 6.02734 2.91656C6.02734 2.37962 6.46263 1.94434 6.99957 1.94434Z"
|
|
|
+ fill="white" />
|
|
|
+ <path
|
|
|
+ d="M6.99957 1.94434C7.5365 1.94434 7.97179 2.37962 7.97179 2.91656C7.97179 3.4535 7.5365 3.88878 6.99957 3.88878C6.46263 3.88878 6.02734 3.4535 6.02734 2.91656C6.02734 2.37962 6.46263 1.94434 6.99957 1.94434ZM6.99957 2.33322C6.6774 2.33322 6.41623 2.5944 6.41623 2.91656C6.41623 3.23872 6.6774 3.49989 6.99957 3.49989C7.32173 3.49989 7.5829 3.23872 7.5829 2.91656C7.5829 2.5944 7.32173 2.33322 6.99957 2.33322Z"
|
|
|
+ fill="white" />
|
|
|
+ <path d="M7.19477 10.8888V5.44434H6.80588H6.41699" fill="white" />
|
|
|
+ <path
|
|
|
+ d="M6.41645 10.8892V6.22255C5.98689 6.22255 5.63867 5.87432 5.63867 5.44477C5.63867 5.01522 5.98689 4.66699 6.41645 4.66699H7.19423L7.27398 4.67079C7.66608 4.71071 7.97201 5.04213 7.97201 5.44477V10.8892C7.97201 11.3188 7.70354 11.3452 7.27398 11.3452C6.84443 11.3452 6.41645 11.3188 6.41645 10.8892Z"
|
|
|
+ fill="white" />
|
|
|
+ <path
|
|
|
+ d="M8.55566 10C8.98522 10 9.33344 10.3482 9.33344 10.7778C9.33344 11.2073 8.98522 11.5556 8.55566 11.5556H5.83344C5.40389 11.5556 5.05566 11.2073 5.05566 10.7778C5.05566 10.3482 5.40389 10 5.83344 10H8.55566Z"
|
|
|
+ fill="white" />
|
|
|
+ </svg>
|
|
|
+ <template #content>
|
|
|
+ <div style="width: 300px;">
|
|
|
+ 由算法根据您的全量活跃设备预测得出,不受版本覆盖率影响。
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-tooltip>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ <div class="tabs-item" :class="{ active: activeTab === 'recallTrend' }"
|
|
|
+ @click="handleTabClick('recallTrend')">卸载召回设备(预测)
|
|
|
+ <el-tooltip effect="light" content="" placement="right-start">
|
|
|
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"
|
|
|
+ xmlns="http://www.w3.org/2000/svg">
|
|
|
+ <path
|
|
|
+ d="M7 14C8.93298 14 10.683 13.2165 11.9497 11.9497C13.2165 10.683 14 8.93298 14 7C14 5.06702 13.2165 3.31702 11.9497 2.05025C10.683 0.783503 8.93298 0 7 0C5.06702 0 3.31702 0.783503 2.05025 2.05025C0.783503 3.31702 0 5.06702 0 7C0 8.93298 0.783503 10.683 2.05025 11.9497C3.31702 13.2165 5.06702 14 7 14Z"
|
|
|
+ fill="#1B4D88" fill-opacity="0.4" />
|
|
|
+ <path fill-rule="evenodd" clip-rule="evenodd"
|
|
|
+ d="M6.99957 1.94434C7.5365 1.94434 7.97179 2.37962 7.97179 2.91656C7.97179 3.4535 7.5365 3.88878 6.99957 3.88878C6.46263 3.88878 6.02734 3.4535 6.02734 2.91656C6.02734 2.37962 6.46263 1.94434 6.99957 1.94434Z"
|
|
|
+ fill="white" />
|
|
|
+ <path
|
|
|
+ d="M6.99957 1.94434C7.5365 1.94434 7.97179 2.37962 7.97179 2.91656C7.97179 3.4535 7.5365 3.88878 6.99957 3.88878C6.46263 3.88878 6.02734 3.4535 6.02734 2.91656C6.02734 2.37962 6.46263 1.94434 6.99957 1.94434ZM6.99957 2.33322C6.6774 2.33322 6.41623 2.5944 6.41623 2.91656C6.41623 3.23872 6.6774 3.49989 6.99957 3.49989C7.32173 3.49989 7.5829 3.23872 7.5829 2.91656C7.5829 2.5944 7.32173 2.33322 6.99957 2.33322Z"
|
|
|
+ fill="white" />
|
|
|
+ <path d="M7.19477 10.8888V5.44434H6.80588H6.41699" fill="white" />
|
|
|
+ <path
|
|
|
+ d="M6.41645 10.8892V6.22255C5.98689 6.22255 5.63867 5.87432 5.63867 5.44477C5.63867 5.01522 5.98689 4.66699 6.41645 4.66699H7.19423L7.27398 4.67079C7.66608 4.71071 7.97201 5.04213 7.97201 5.44477V10.8892C7.97201 11.3188 7.70354 11.3452 7.27398 11.3452C6.84443 11.3452 6.41645 11.3188 6.41645 10.8892Z"
|
|
|
+ fill="white" />
|
|
|
+ <path
|
|
|
+ d="M8.55566 10C8.98522 10 9.33344 10.3482 9.33344 10.7778C9.33344 11.2073 8.98522 11.5556 8.55566 11.5556H5.83344C5.40389 11.5556 5.05566 11.2073 5.05566 10.7778C5.05566 10.3482 5.40389 10 5.83344 10H8.55566Z"
|
|
|
+ fill="white" />
|
|
|
+ </svg>
|
|
|
+ <template #content>
|
|
|
+ <div style="width: 300px;">
|
|
|
+ 由卸载流失设备(预测)推测得出,预测为卸载的设备在当前周期下重新安装,即为卸载召回设备(预测)
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-tooltip>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 折线图 -->
|
|
|
+ <div class="chart-container">
|
|
|
+ <LineChart :data="currentChartData" :color="'#167af0'" height="270px"
|
|
|
+ :smooth="false" :area-style="true" :title="activeTab === 'churnTrend' ? '卸载流失设备' : '卸载召回设备'" :showLegend="true" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="12" style="padding: 0 12px 12px; row-gap: 12px;">
|
|
|
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
|
|
+ <el-card shadow="none">
|
|
|
+ <div class="trend-container">
|
|
|
+ <div class="title">安装卸载比</div>
|
|
|
+ <!-- 折线图 -->
|
|
|
+ <div class="chart-container">
|
|
|
+ <LineChart :data="data" :color="'#167af0'" height="270px" :showLegend="true"
|
|
|
+ :smooth="false" :area-style="true" :isMultiSeries="true" :seriesNames="['当前应用', '移动视频行业TOP5', '医疗服务行业TOP5']" />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-divider style="margin: 30px 0; background: rgba(230, 230, 230, 1);"/>
|
|
|
+
|
|
|
+ <!-- 表格 -->
|
|
|
+ <ExportToCSV :hidePage="true" :data="formatData" :columns="columns" :fileName="''" :hide-table="false" :tableStyle="{minWidth: '1476px'}" />
|
|
|
+ </div>
|
|
|
+ </el-card>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" name="churnAscribe" setup>
|
|
|
+import LineChart from '/@/views/count/components/LineChart.vue'
|
|
|
+import ExportToCSV from '/@/views/count/components/ExportToCSV.vue';
|
|
|
+import { ref, computed } from 'vue'
|
|
|
+
|
|
|
+// 流失趋势数据
|
|
|
+const churnTrendData = ref([
|
|
|
+ { date: '2025-01-01', value: 25 },
|
|
|
+ { date: '2025-01-02', value: 32 },
|
|
|
+ { date: '2025-01-03', value: 28 },
|
|
|
+ { date: '2025-01-04', value: 45 },
|
|
|
+ { date: '2025-01-05', value: 38 },
|
|
|
+ { date: '2025-01-06', value: 42 },
|
|
|
+ { date: '2025-01-07', value: 35 },
|
|
|
+ { date: '2025-01-08', value: 48 },
|
|
|
+ { date: '2025-01-09', value: 52 },
|
|
|
+ { date: '2025-01-10', value: 39 },
|
|
|
+ { date: '2025-01-11', value: 44 },
|
|
|
+ { date: '2025-01-12', value: 37 },
|
|
|
+ { date: '2025-01-13', value: 41 },
|
|
|
+ { date: '2025-01-14', value: 46 }
|
|
|
+])
|
|
|
+
|
|
|
+// 召回趋势数据
|
|
|
+const recallTrendData = ref([
|
|
|
+ { date: '2025-01-01', value: 15 },
|
|
|
+ { date: '2025-01-02', value: 22 },
|
|
|
+ { date: '2025-01-03', value: 18 },
|
|
|
+ { date: '2025-01-04', value: 35 },
|
|
|
+ { date: '2025-01-05', value: 28 },
|
|
|
+ { date: '2025-01-06', value: 32 },
|
|
|
+ { date: '2025-01-07', value: 25 },
|
|
|
+ { date: '2025-01-08', value: 38 },
|
|
|
+ { date: '2025-01-09', value: 42 },
|
|
|
+ { date: '2025-01-10', value: 29 },
|
|
|
+ { date: '2025-01-11', value: 34 },
|
|
|
+ { date: '2025-01-12', value: 27 },
|
|
|
+ { date: '2025-01-13', value: 31 },
|
|
|
+ { date: '2025-01-14', value: 36 }
|
|
|
+])
|
|
|
+
|
|
|
+const activeTab = ref('churnTrend')
|
|
|
+
|
|
|
+// 计算当前图表数据
|
|
|
+const currentChartData = computed(() => {
|
|
|
+ return activeTab.value === 'churnTrend' ? churnTrendData.value : recallTrendData.value
|
|
|
+})
|
|
|
+
|
|
|
+const handleTabClick = (tab: string) => {
|
|
|
+ activeTab.value = tab
|
|
|
+}
|
|
|
+
|
|
|
+const data = ref([
|
|
|
+ { date: '2025-01-01', values: [{ value: 1, seriesName: '当前应用' }, { value: 2, seriesName: '移动视频行业TOP5' }, { value: 5, seriesName: '医疗服务行业TOP5' }] },
|
|
|
+ { date: '2025-01-02', values: [{ value: 11, seriesName: '当前应用' }, { value: 4, seriesName: '移动视频行业TOP5' }, { value: 3, seriesName: '医疗服务行业TOP5' }] },
|
|
|
+ { date: '2025-01-03', values: [{ value: 2, seriesName: '当前应用' }, { value: 2, seriesName: '移动视频行业TOP5' }, { value: 3, seriesName: '医疗服务行业TOP5' }] },
|
|
|
+ { date: '2025-01-04', values: [{ value: 11, seriesName: '当前应用' }, { value: 5, seriesName: '移动视频行业TOP5' }, { value: 9, seriesName: '医疗服务行业TOP5' }] }
|
|
|
+])
|
|
|
+
|
|
|
+const columns = ref([
|
|
|
+ {prop: 'date', label: '日期'},
|
|
|
+ {prop: 'app1', label: '当前应用'},
|
|
|
+ {prop: 'app2', label: '移动视频行业TOP5'},
|
|
|
+ {prop: 'app3', label: '医疗服务行业TOP5'},
|
|
|
+])
|
|
|
+
|
|
|
+const formatData = computed(() => {
|
|
|
+ return data.value.map((item: any) => ({
|
|
|
+ date: item.date,
|
|
|
+ app1: item.values[0].value,
|
|
|
+ app2: item.values[1].value,
|
|
|
+ app3: item.values[2].value
|
|
|
+ }))
|
|
|
+})
|
|
|
+</script>
|
|
|
+<style scoped lang="scss">
|
|
|
+@import '/@/views/count/styles/common.scss';
|
|
|
+
|
|
|
+svg {
|
|
|
+ vertical-align: middle;
|
|
|
+ margin: 0 0 0 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.ascribe {
|
|
|
+ font-family: Source Han Sans SC;
|
|
|
+ color: rgba(18, 18, 18, 1);
|
|
|
+
|
|
|
+ .top-info {
|
|
|
+ color: rgba(18, 18, 18, 1);
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ padding: 0;
|
|
|
+ margin: -2.5px 0;
|
|
|
+
|
|
|
+ .title {
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 500;
|
|
|
+ line-height: 20px;
|
|
|
+ padding: 4px 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .data-source-status {
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 14px;
|
|
|
+ line-height: 20px;
|
|
|
+ color: rgba(18, 18, 18, 1);
|
|
|
+ padding: 4px 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .trend-container {
|
|
|
+ padding: 10px 14px;
|
|
|
+
|
|
|
+ .title {
|
|
|
+ line-height: 19px;
|
|
|
+ font-weight: 500;
|
|
|
+ font-size: 16px;
|
|
|
+ padding-left: 12px;
|
|
|
+ position: relative;
|
|
|
+ margin-bottom: 53px;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: 50%;
|
|
|
+ transform: translateY(-50%);
|
|
|
+ width: 4px;
|
|
|
+ height: 14px;
|
|
|
+ background: rgba(22, 122, 240, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .tabs {
|
|
|
+ display: flex;
|
|
|
+ width: 100%;
|
|
|
+ max-width: 1476px;
|
|
|
+ margin: 0 auto 0;
|
|
|
+
|
|
|
+ .tabs-item {
|
|
|
+ padding: 0 12px;
|
|
|
+ height: 32px;
|
|
|
+ line-height: 30px;
|
|
|
+ border: 1px solid rgba(22, 122, 240, 1);
|
|
|
+ text-align: center;
|
|
|
+ color: rgba(22, 122, 240, 1);
|
|
|
+ cursor: pointer;
|
|
|
+
|
|
|
+ &.active {
|
|
|
+ background: rgba(22, 122, 240, 1);
|
|
|
+ color: #ffffff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .chart-container {
|
|
|
+ // margin: 20px 85px 0;
|
|
|
+ width: 100%;
|
|
|
+ max-width: 1476px;
|
|
|
+ margin: 20px auto 0;
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ .echarts-name {
|
|
|
+ display: inline-block;
|
|
|
+ margin: 28px auto 0;
|
|
|
+ padding-left: 16px;
|
|
|
+ font-weight: 400;
|
|
|
+ font-size: 14px;
|
|
|
+ line-height: 20px;
|
|
|
+ color: rgba(18, 18, 18, 1);
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: 50%;
|
|
|
+ transform: translateY(-50%);
|
|
|
+ width: 8px;
|
|
|
+ height: 8px;
|
|
|
+ background: rgba(22, 122, 240, 1);
|
|
|
+ border-radius: 50%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .table-container {
|
|
|
+ // padding: 0 85px;
|
|
|
+ width: 100%;
|
|
|
+ max-width: 1476px;
|
|
|
+ margin: 0 auto;
|
|
|
+
|
|
|
+ .btn-toggle-table {
|
|
|
+ font-weight: 500;
|
|
|
+ font-size: 14px;
|
|
|
+ line-height: 20px;
|
|
|
+ color: rgba(22, 122, 240, 1);
|
|
|
+ margin-bottom: 20px;
|
|
|
+ cursor: pointer;
|
|
|
+
|
|
|
+ svg {
|
|
|
+ transition: transform 0.3s ease-in-out;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.hide-table svg {
|
|
|
+ transform: rotate(-180deg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .table-container {
|
|
|
+ margin-top: 20px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|