123 lines
3.1 KiB
Vue
123 lines
3.1 KiB
Vue
|
|
<template>
|
|||
|
|
<div v-if="['xxl', 'xl', 'md'].includes(widthType)">
|
|||
|
|
<div>
|
|||
|
|
<GIcon name="gt-plane-upload-black" />
|
|||
|
|
<span class="text-[#000] text-[16px] ml-2 font-semibold">下载使用量</span>
|
|||
|
|
</div>
|
|||
|
|
<div class="flex mt-4 items-end">
|
|||
|
|
<div class="text-[#2951E0] text-xl mr-8 font-semibold">
|
|||
|
|
{{ total }}
|
|||
|
|
</div>
|
|||
|
|
<div class="num-empty" v-if="isEmpty"></div>
|
|||
|
|
<div v-else id="download" style="width: 100%; height: 56px"></div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div v-else class="p-2 download-chart-mobile">
|
|||
|
|
<div class="mb-4">
|
|||
|
|
<span class="text-[#000] text-[16px] ml-2 font-semibold">下载使用量:</span>
|
|||
|
|
<span class="text-[#2951E0] text-[16px] font-semibold">
|
|||
|
|
{{ total }}
|
|||
|
|
</span>
|
|||
|
|
</div>
|
|||
|
|
<div v-if="isEmpty" class="num-empty"></div>
|
|||
|
|
<div v-else id="download" style="width: 100%; height: 56px"></div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
<script lang="ts" setup>
|
|||
|
|
import { onMounted, ref, nextTick } from 'vue';
|
|||
|
|
import { getRepoClone } from '@/api/repo';
|
|||
|
|
import { usePageResize } from '@/utils/hooks/usePageResize';
|
|||
|
|
import * as echarts from 'echarts';
|
|||
|
|
|
|||
|
|
const props = defineProps<{
|
|||
|
|
repoId: string;
|
|||
|
|
}>();
|
|||
|
|
|
|||
|
|
const { widthType } = usePageResize();
|
|||
|
|
const isEmpty = ref(false);
|
|||
|
|
|
|||
|
|
const initGitCode = () => {
|
|||
|
|
const myChart = echarts.init(document.getElementById('download'));
|
|||
|
|
|
|||
|
|
myChart.setOption({
|
|||
|
|
xAxis: {
|
|||
|
|
type: 'category',
|
|||
|
|
show: false,
|
|||
|
|
boundaryGap: false
|
|||
|
|
},
|
|||
|
|
yAxis: {
|
|||
|
|
type: 'value',
|
|||
|
|
show: false
|
|||
|
|
},
|
|||
|
|
tooltip: {
|
|||
|
|
trigger: 'axis',
|
|||
|
|
renderMode: 'richText',
|
|||
|
|
formatter: function(params) {
|
|||
|
|
return `${params[0].value}`;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
grid: {
|
|||
|
|
left: 0,
|
|||
|
|
bottom: 2,
|
|||
|
|
top: 0,
|
|||
|
|
right: 0,
|
|||
|
|
height: 50
|
|||
|
|
},
|
|||
|
|
series: [
|
|||
|
|
{
|
|||
|
|
data: downloadList.value,
|
|||
|
|
type: 'line',
|
|||
|
|
symbol: 'none',
|
|||
|
|
lineStyle: { color: '#2951E0' },
|
|||
|
|
areaStyle: {
|
|||
|
|
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|||
|
|
{ offset: 0, color: 'rgba(41, 81, 224, 0.24)' },
|
|||
|
|
{ offset: 1, color: 'rgba(41, 81, 224, 0.04)' }
|
|||
|
|
])
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const downloadList = ref([]);
|
|||
|
|
const total = ref(0);
|
|||
|
|
const getDownloadData = () => {
|
|||
|
|
getRepoClone(props.repoId).then((data) => {
|
|||
|
|
if (data?.data?.data) {
|
|||
|
|
total.value = data.data.data[0]?.total_dl_cnt || 0;
|
|||
|
|
data.data.data.forEach((item) => {
|
|||
|
|
downloadList.value.unshift(item.today_dl_cnt || 0);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
if (total.value === 0) {
|
|||
|
|
isEmpty.value = true;
|
|||
|
|
} else {
|
|||
|
|
// 只有一天数据,前面加个0,展示折线
|
|||
|
|
downloadList.value.length === 1 && (downloadList.value.unshift(0));
|
|||
|
|
nextTick(() => {
|
|||
|
|
initGitCode();
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
onMounted(() => {
|
|||
|
|
getDownloadData();
|
|||
|
|
});
|
|||
|
|
</script>
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.download-chart-mobile {
|
|||
|
|
border-radius: 4px;
|
|||
|
|
border: 1px solid #E3E3EE;
|
|||
|
|
background: #F1F1F8;
|
|||
|
|
}
|
|||
|
|
.num-empty {
|
|||
|
|
height: 10px;
|
|||
|
|
border-top: 2px solid #2951E0;
|
|||
|
|
width: 100%;
|
|||
|
|
background: linear-gradient(180deg, rgba(41, 81, 224, 0.12) 0%, rgba(41, 81, 224, 0.04) 100%);
|
|||
|
|
}
|
|||
|
|
</style>
|