平台数据详情页(/analytics/platform-detail/:platform)用于展示指定平台在指定时间范围内的详细统计数据,包括汇总统计、每日汇总数据和账号详细数据。
文件位置: client/src/views/Analytics/PlatformDetail/index.vue
请求接口: GET /api/work-day-statistics/platform-detail
请求参数:
platform: 平台类型(必填,如:douyin、xiaohongshu、baijiahao、weixin_video)startDate: 开始日期(必填,格式:YYYY-MM-DD)endDate: 结束日期(必填,格式:YYYY-MM-DD)请求示例:
const data = await request.get('/api/work-day-statistics/platform-detail', {
params: {
platform: 'douyin',
startDate: '2026-01-27',
endDate: '2026-01-27',
},
});
文件位置:
server/src/routes/workDayStatistics.tsserver/src/services/WorkDayStatisticsService.ts处理流程:
获取平台账号列表
userId 和 platform 查询该平台下的所有账号计算每日汇总数据
计算账号详细数据
计算汇总统计
totalAccounts: 账号总数viewsCount: 总播放量增量commentsCount: 总评论量增量likesCount: 总点赞量增量fansIncrease: 总涨粉量{
success: true,
data: {
summary: {
totalAccounts: number; // 账号总数
totalIncome: number; // 总收益(目前为 0)
viewsCount: number; // 总播放量增量
commentsCount: number; // 总评论量增量
likesCount: number; // 总点赞量增量
fansIncrease: number; // 总涨粉量
recommendationCount: number | null; // 推荐量(部分平台支持)
};
dailyData: Array<{
date: string; // 日期(YYYY-MM-DD)
income: number; // 收益(目前为 0)
recommendationCount: number | null; // 推荐量
viewsCount: number; // 播放量增量
commentsCount: number; // 评论量增量
likesCount: number; // 点赞量增量
fansIncrease: number; // 涨粉量
}>;
accounts: Array<{
id: number; // 账号ID
nickname: string; // 账号昵称
username: string; // 账号用户名
avatarUrl: string | null; // 头像URL
platform: string; // 平台类型
income: number | null; // 收益(目前为 null)
recommendationCount: number | null; // 推荐量
viewsCount: number | null; // 播放量增量(可能为 null)
commentsCount: number; // 评论量增量
likesCount: number; // 点赞量增量
fansIncrease: number; // 涨粉量
updateTime: string; // 更新时间(MM-DD HH:mm)
}>;
}
}
文件位置: client/src/views/Analytics/PlatformDetail/index.vue
数据解包:
request 拦截器会自动解包响应,将 { success: true, data: {...} } 转换为 {...}数据赋值:
// 更新汇总数据
if (data.summary) {
summaryData.value = {
totalAccounts: data.summary.totalAccounts ?? 0,
viewsCount: data.summary.viewsCount ?? 0,
commentsCount: data.summary.commentsCount ?? 0,
likesCount: data.summary.likesCount ?? 0,
fansIncrease: data.summary.fansIncrease ?? 0,
};
}
// 更新每日数据
dailyData.value = Array.isArray(data.dailyData) ? data.dailyData : [];
// 更新账号列表
accountList.value = Array.isArray(data.accounts) ? data.accounts : [];
展示区域:
汇总统计卡片(第 57-93 行)
每日汇总数据表格(第 95-113 行)
账号详细数据表格(第 115-163 行)
数据来源: work_day_statistics 表
计算方式:
SQL 逻辑:
-- 获取指定日期的最新累计数据
SELECT
COALESCE(SUM(wds.play_count), 0) AS views,
COALESCE(SUM(wds.like_count), 0) AS likes,
COALESCE(SUM(wds.comment_count), 0) AS comments
FROM work_day_statistics wds
INNER JOIN (
SELECT wds2.work_id, MAX(wds2.record_date) AS record_date
FROM work_day_statistics wds2
WHERE wds2.work_id IN (...)
AND wds2.record_date <= ?
GROUP BY wds2.work_id
) latest
ON latest.work_id = wds.work_id AND latest.record_date = wds.record_date
数据来源: user_day_statistics 表
计算方式:
查询逻辑:
// 获取当日粉丝数
const dayUserStat = await userDayStatisticsRepository
.createQueryBuilder('uds')
.where('uds.account_id = :accountId', { accountId })
.andWhere('DATE(uds.record_date) = :d', { d: dateStr })
.getOne();
// 如果没有记录,获取最近一条
const recentUserStat = await userDayStatisticsRepository
.createQueryBuilder('uds')
.where('uds.account_id = :accountId', { accountId })
.andWhere('DATE(uds.record_date) <= :d', { d: dateStr })
.orderBy('uds.record_date', 'DESC')
.getOne();
可能原因:
platformstartDate 和 endDate 格式是否正确调试方法:
原因:
处理:
可能原因:
检查方法:
数据来源:
更新时间:
updateTime 字段显示该账号在时间范围内的最新更新时间问题: 数据不显示
原因:
|| 运算符,导致 0 值被误判为 falsydata.summary 存在但某些字段为 0 时,会使用默认值而不是实际值修复:
?? 运算符(空值合并运算符)修改文件:
client/src/views/Analytics/PlatformDetail/index.vue (第 324-340 行)