|
@@ -216,6 +216,11 @@
|
|
|
{{ btn.label }}
|
|
{{ btn.label }}
|
|
|
</el-button>
|
|
</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div class="detail-export-wrap">
|
|
|
|
|
+ <el-button type="primary" plain size="small" :disabled="!detailDailyData.length" @click="exportDetailDailyData">
|
|
|
|
|
+ 导出数据
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 详情 Tab -->
|
|
<!-- 详情 Tab -->
|
|
@@ -241,9 +246,10 @@
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <!-- 每日数据表格 -->
|
|
|
|
|
|
|
+ <!-- 每日数据表格:时间倒序;收益、推荐量暂未接入先注释 -->
|
|
|
<el-table :data="detailDailyData" v-loading="detailLoading" stripe>
|
|
<el-table :data="detailDailyData" v-loading="detailLoading" stripe>
|
|
|
<el-table-column prop="date" label="时间" width="120" align="center" />
|
|
<el-table-column prop="date" label="时间" width="120" align="center" />
|
|
|
|
|
+ <!-- 收益与推荐量暂未接入,先隐藏
|
|
|
<el-table-column prop="income" label="收益" width="90" align="center">
|
|
<el-table-column prop="income" label="收益" width="90" align="center">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<span>{{ row.income ?? 0 }}</span>
|
|
<span>{{ row.income ?? 0 }}</span>
|
|
@@ -254,6 +260,7 @@
|
|
|
<span>{{ row.recommendationCount ?? 0 }}</span>
|
|
<span>{{ row.recommendationCount ?? 0 }}</span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
|
|
+ -->
|
|
|
<el-table-column prop="viewsCount" label="播放(阅读)量" width="130" align="center">
|
|
<el-table-column prop="viewsCount" label="播放(阅读)量" width="130" align="center">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<span>{{ row.viewsCount ?? 0 }}</span>
|
|
<span>{{ row.viewsCount ?? 0 }}</span>
|
|
@@ -345,6 +352,7 @@ import { Search, User, View, ChatDotRound, Star, TrendCharts } from '@element-pl
|
|
|
import { PLATFORMS, AVAILABLE_PLATFORM_TYPES } from '@media-manager/shared';
|
|
import { PLATFORMS, AVAILABLE_PLATFORM_TYPES } from '@media-manager/shared';
|
|
|
import type { PlatformType } from '@media-manager/shared';
|
|
import type { PlatformType } from '@media-manager/shared';
|
|
|
import { ElMessage } from 'element-plus';
|
|
import { ElMessage } from 'element-plus';
|
|
|
|
|
+import * as XLSX from 'xlsx';
|
|
|
import dayjs from 'dayjs';
|
|
import dayjs from 'dayjs';
|
|
|
import request from '@/api/request';
|
|
import request from '@/api/request';
|
|
|
import iconDefaultUrl from '@/assets/platforms/default.svg?url';
|
|
import iconDefaultUrl from '@/assets/platforms/default.svg?url';
|
|
@@ -738,6 +746,33 @@ function handleDetailQuickDate(type: string) {
|
|
|
loadAccountDetailData();
|
|
loadAccountDetailData();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 导出当前时间范围内的每日数据为 xlsx(表头与列表一致)
|
|
|
|
|
+function exportDetailDailyData() {
|
|
|
|
|
+ if (!detailDailyData.value.length) return;
|
|
|
|
|
+ const headers = ['时间', '播放(阅读)量', '评论量', '点赞量', '涨粉量'];
|
|
|
|
|
+ const rows = detailDailyData.value.map((row) => [
|
|
|
|
|
+ row.date ?? '',
|
|
|
|
|
+ row.viewsCount ?? 0,
|
|
|
|
|
+ row.commentsCount ?? 0,
|
|
|
|
|
+ row.likesCount ?? 0,
|
|
|
|
|
+ row.fansIncrease ?? 0,
|
|
|
|
|
+ ]);
|
|
|
|
|
+ const data = [headers, ...rows];
|
|
|
|
|
+ const ws = XLSX.utils.aoa_to_sheet(data);
|
|
|
|
|
+ const wb = XLSX.utils.book_new();
|
|
|
|
|
+ XLSX.utils.book_append_sheet(wb, ws, '数据详情');
|
|
|
|
|
+ const arrayBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
|
|
|
|
|
+ const blob = new Blob([arrayBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
|
|
|
|
|
+ const name = (selectedAccount.value?.nickname || '账号').replace(/[/\\?*:"|]/g, '_');
|
|
|
|
|
+ const url = URL.createObjectURL(blob);
|
|
|
|
|
+ const a = document.createElement('a');
|
|
|
|
|
+ a.href = url;
|
|
|
|
|
+ a.download = `${name}_数据详情_${detailStartDate.value}_${detailEndDate.value}.xlsx`;
|
|
|
|
|
+ a.click();
|
|
|
|
|
+ URL.revokeObjectURL(url);
|
|
|
|
|
+ ElMessage.success('导出成功');
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 加载账号详情(汇总 + 每日 + 作品)
|
|
// 加载账号详情(汇总 + 每日 + 作品)
|
|
|
async function loadAccountDetailData() {
|
|
async function loadAccountDetailData() {
|
|
|
if (!selectedAccount.value) return;
|
|
if (!selectedAccount.value) return;
|
|
@@ -762,7 +797,8 @@ async function loadAccountDetailData() {
|
|
|
fansIncrease: data.summary?.fansIncrease ?? 0,
|
|
fansIncrease: data.summary?.fansIncrease ?? 0,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- detailDailyData.value = Array.isArray(data.dailyData) ? data.dailyData : [];
|
|
|
|
|
|
|
+ const rawDaily = Array.isArray(data.dailyData) ? data.dailyData : [];
|
|
|
|
|
+ detailDailyData.value = [...rawDaily].sort((a, b) => (b.date || '').localeCompare(a.date || ''));
|
|
|
detailWorks.value = Array.isArray(data.works) ? data.works : [];
|
|
detailWorks.value = Array.isArray(data.works) ? data.works : [];
|
|
|
// 重新加载详情数据时,重置作品分页
|
|
// 重新加载详情数据时,重置作品分页
|
|
|
detailWorksPage.value = 1;
|
|
detailWorksPage.value = 1;
|
|
@@ -1068,6 +1104,10 @@ onMounted(() => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ .detail-export-wrap {
|
|
|
|
|
+ margin-left: 12px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
.work-title-cell {
|
|
.work-title-cell {
|
|
|
.work-title-text {
|
|
.work-title-text {
|
|
|
font-weight: 500;
|
|
font-weight: 500;
|