|
@@ -583,16 +583,19 @@ function handleQuickDate(type: string) {
|
|
|
endDate.value = today.subtract(2, 'day').format('YYYY-MM-DD');
|
|
endDate.value = today.subtract(2, 'day').format('YYYY-MM-DD');
|
|
|
break;
|
|
break;
|
|
|
case 'last3days':
|
|
case 'last3days':
|
|
|
- startDate.value = today.subtract(3, 'day').format('YYYY-MM-DD');
|
|
|
|
|
- endDate.value = today.subtract(1, 'day').format('YYYY-MM-DD');
|
|
|
|
|
|
|
+ // 含今天,共 3 天:今天/昨天/前天
|
|
|
|
|
+ startDate.value = today.subtract(2, 'day').format('YYYY-MM-DD');
|
|
|
|
|
+ endDate.value = today.format('YYYY-MM-DD');
|
|
|
break;
|
|
break;
|
|
|
case 'last7days':
|
|
case 'last7days':
|
|
|
- startDate.value = today.subtract(7, 'day').format('YYYY-MM-DD');
|
|
|
|
|
- endDate.value = today.subtract(1, 'day').format('YYYY-MM-DD');
|
|
|
|
|
|
|
+ // 含今天,共 7 天
|
|
|
|
|
+ startDate.value = today.subtract(6, 'day').format('YYYY-MM-DD');
|
|
|
|
|
+ endDate.value = today.format('YYYY-MM-DD');
|
|
|
break;
|
|
break;
|
|
|
case 'lastMonth':
|
|
case 'lastMonth':
|
|
|
- startDate.value = today.subtract(30, 'day').format('YYYY-MM-DD');
|
|
|
|
|
- endDate.value = today.subtract(1, 'day').format('YYYY-MM-DD');
|
|
|
|
|
|
|
+ // 含今天,共 30 天
|
|
|
|
|
+ startDate.value = today.subtract(29, 'day').format('YYYY-MM-DD');
|
|
|
|
|
+ endDate.value = today.format('YYYY-MM-DD');
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -730,16 +733,19 @@ function handleDetailQuickDate(type: string) {
|
|
|
detailEndDate.value = today.subtract(2, 'day').format('YYYY-MM-DD');
|
|
detailEndDate.value = today.subtract(2, 'day').format('YYYY-MM-DD');
|
|
|
break;
|
|
break;
|
|
|
case 'last3days':
|
|
case 'last3days':
|
|
|
- detailStartDate.value = today.subtract(3, 'day').format('YYYY-MM-DD');
|
|
|
|
|
- detailEndDate.value = today.subtract(1, 'day').format('YYYY-MM-DD');
|
|
|
|
|
|
|
+ // 含今天,共 3 天:今天/昨天/前天
|
|
|
|
|
+ detailStartDate.value = today.subtract(2, 'day').format('YYYY-MM-DD');
|
|
|
|
|
+ detailEndDate.value = today.format('YYYY-MM-DD');
|
|
|
break;
|
|
break;
|
|
|
case 'last7days':
|
|
case 'last7days':
|
|
|
- detailStartDate.value = today.subtract(7, 'day').format('YYYY-MM-DD');
|
|
|
|
|
- detailEndDate.value = today.subtract(1, 'day').format('YYYY-MM-DD');
|
|
|
|
|
|
|
+ // 含今天,共 7 天
|
|
|
|
|
+ detailStartDate.value = today.subtract(6, 'day').format('YYYY-MM-DD');
|
|
|
|
|
+ detailEndDate.value = today.format('YYYY-MM-DD');
|
|
|
break;
|
|
break;
|
|
|
case 'lastMonth':
|
|
case 'lastMonth':
|
|
|
- detailStartDate.value = today.subtract(30, 'day').format('YYYY-MM-DD');
|
|
|
|
|
- detailEndDate.value = today.subtract(1, 'day').format('YYYY-MM-DD');
|
|
|
|
|
|
|
+ // 含今天,共 30 天
|
|
|
|
|
+ detailStartDate.value = today.subtract(29, 'day').format('YYYY-MM-DD');
|
|
|
|
|
+ detailEndDate.value = today.format('YYYY-MM-DD');
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -843,9 +849,41 @@ function updateAccountChart(trendData: { dates: string[]; fans: number[]; views:
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// 导出数据
|
|
|
|
|
-function handleExport() {
|
|
|
|
|
- ElMessage.info('导出功能开发中');
|
|
|
|
|
|
|
+// 导出数据(客户端生成 xlsx,无需后端支持)
|
|
|
|
|
+async function handleExport() {
|
|
|
|
|
+ if (!filteredAccounts.value.length) {
|
|
|
|
|
+ ElMessage.warning('暂无数据可导出');
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ try {
|
|
|
|
|
+ const headers = ['账号', '平台', '播放(阅读)量', '评论量', '点赞量', '涨粉量', '更新时间', '状态'];
|
|
|
|
|
+ const rows = filteredAccounts.value.map((row) => [
|
|
|
|
|
+ row.nickname || row.username || '',
|
|
|
|
|
+ getPlatformName(row.platform),
|
|
|
|
|
+ row.viewsCount ?? 0,
|
|
|
|
|
+ row.commentsCount ?? 0,
|
|
|
|
|
+ row.likesCount ?? 0,
|
|
|
|
|
+ row.fansIncrease ?? 0,
|
|
|
|
|
+ formatTime(row.updateTime),
|
|
|
|
|
+ row.status === 'active' ? '正常' : '异常',
|
|
|
|
|
+ ]);
|
|
|
|
|
+ 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 url = URL.createObjectURL(blob);
|
|
|
|
|
+ const a = document.createElement('a');
|
|
|
|
|
+ a.href = url;
|
|
|
|
|
+ a.download = `账号数据_${dayjs().format('YYYYMMDD_HHmmss')}.xlsx`;
|
|
|
|
|
+ a.click();
|
|
|
|
|
+ URL.revokeObjectURL(url);
|
|
|
|
|
+ ElMessage.success('导出成功');
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('导出失败:', error);
|
|
|
|
|
+ ElMessage.error('导出失败,请稍后重试');
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 监听抽屉关闭
|
|
// 监听抽屉关闭
|