From 83905116755cc0d85916c4690aa58f058f73a58e Mon Sep 17 00:00:00 2001 From: jianzhichu Date: Thu, 22 Jan 2026 23:24:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B2=E7=BA=BF=E5=9B=BE=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=BC=B9=E7=AA=97=E6=98=BE=E7=A4=BA30=E5=A4=A9?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controllers/VideoController.cs | 6 +- Program.cs | 2 +- Properties/PublishProfiles/docker.pubxml.user | 2 +- app/src/pages/cok/CookieTable.vue | 4 +- app/src/pages/workplace/statics.vue | 233 ++++++++++++++---- app/src/store/coreapi.ts | 4 +- service/DouyinVideoService.cs | 6 +- 7 files changed, 199 insertions(+), 58 deletions(-) diff --git a/Controllers/VideoController.cs b/Controllers/VideoController.cs index 1299211..48ccc13 100644 --- a/Controllers/VideoController.cs +++ b/Controllers/VideoController.cs @@ -499,12 +499,12 @@ namespace dy.net.Controllers /// 获取7天视频同步趋势数据(曲线图) /// /// 7天图表数据列表 - [HttpGet("chart")] - public async Task Chart() + [HttpGet("chart/{day}")] + public async Task Chart([FromRoute]int day=7) { try { - var chartData = await douyinVideoService.GetChartData(); + var chartData = await douyinVideoService.GetChartData(day); return ApiResult.Success(chartData); } catch (Exception ex) diff --git a/Program.cs b/Program.cs index a89357b..31db37b 100644 --- a/Program.cs +++ b/Program.cs @@ -220,7 +220,7 @@ namespace dy.net //commonService.UpdateAllCookieSyncedToZero(); // 初始化配置 var config = commonService.InitConfig(); - //if (!isDevelopment) + if (!isDevelopment) { // 启动定时任务 var quartzJobService = services.GetRequiredService(); diff --git a/Properties/PublishProfiles/docker.pubxml.user b/Properties/PublishProfiles/docker.pubxml.user index dc66915..a8f1ed9 100644 --- a/Properties/PublishProfiles/docker.pubxml.user +++ b/Properties/PublishProfiles/docker.pubxml.user @@ -3,7 +3,7 @@ <_PublishTargetUrl>E:\code\dysync\bin\Release\net6.0\publish\ - True|2026-01-22T13:32:21.7284081Z||;True|2026-01-22T21:20:26.5985955+08:00||;False|2026-01-22T21:20:21.1372539+08:00||;True|2026-01-22T21:11:18.3771739+08:00||;True|2026-01-22T20:58:55.9862778+08:00||;True|2026-01-22T20:51:48.6699461+08:00||;False|2026-01-22T20:51:42.2079210+08:00||;True|2026-01-22T20:50:34.7280114+08:00||;True|2026-01-22T20:50:11.1588492+08:00||;True|2026-01-22T16:11:14.0626037+08:00||;True|2026-01-22T15:53:16.6377347+08:00||;True|2026-01-22T15:45:34.0935091+08:00||;True|2026-01-22T12:44:28.1577014+08:00||;True|2026-01-22T12:40:45.7449335+08:00||;True|2026-01-22T12:39:07.0683214+08:00||;True|2026-01-22T09:55:49.7086190+08:00||;True|2026-01-22T01:37:53.6972395+08:00||;True|2026-01-22T01:34:14.2142463+08:00||;True|2026-01-22T01:32:50.9228911+08:00||;True|2026-01-22T01:29:43.8871986+08:00||;True|2026-01-22T01:29:40.7838709+08:00||;True|2026-01-22T01:27:34.4763970+08:00||;True|2026-01-22T01:26:55.0117367+08:00||;True|2026-01-22T01:23:19.4789587+08:00||;True|2026-01-19T10:19:44.8997385+08:00||;True|2026-01-19T10:11:10.2305307+08:00||;True|2026-01-17T00:52:08.8180346+08:00||;False|2026-01-17T00:52:03.1829000+08:00||;True|2026-01-17T00:45:04.0498090+08:00||;True|2026-01-16T21:00:57.7239379+08:00||;True|2026-01-16T21:00:03.3912989+08:00||;True|2026-01-16T20:56:08.5505592+08:00||;True|2026-01-16T20:46:32.3067302+08:00||;True|2026-01-15T22:18:57.9835738+08:00||;True|2026-01-15T22:07:25.4753938+08:00||;True|2026-01-15T22:07:14.8243754+08:00||;True|2026-01-15T21:40:13.2613927+08:00||;True|2026-01-15T20:57:56.6291682+08:00||;True|2026-01-15T20:57:47.1363536+08:00||;True|2026-01-15T20:08:44.4710883+08:00||;True|2026-01-15T20:04:51.8284314+08:00||;False|2026-01-15T20:04:45.3258155+08:00||;True|2026-01-15T19:59:11.7907672+08:00||;True|2026-01-15T01:10:48.9066941+08:00||;True|2026-01-15T01:03:23.6216975+08:00||;True|2026-01-15T01:03:16.3364591+08:00||;False|2026-01-15T01:03:10.5654436+08:00||;True|2026-01-15T00:49:21.6559622+08:00||;True|2026-01-15T00:10:42.7288439+08:00||;True|2026-01-15T00:06:28.4241682+08:00||;True|2026-01-13T22:34:15.2372411+08:00||;True|2026-01-13T22:26:46.4522947+08:00||;True|2026-01-13T22:15:56.9735179+08:00||;True|2026-01-13T22:15:51.8250677+08:00||;False|2026-01-13T22:15:46.6608690+08:00||;True|2026-01-13T22:03:06.4683237+08:00||;False|2026-01-13T22:03:01.2036027+08:00||;True|2026-01-13T21:36:05.8776209+08:00||;True|2026-01-13T21:33:02.0766289+08:00||;False|2026-01-13T21:32:57.1976141+08:00||;True|2026-01-13T19:14:35.2519439+08:00||;True|2026-01-13T15:07:50.0836745+08:00||;False|2026-01-13T15:06:35.5929685+08:00||;True|2026-01-13T10:21:41.6012776+08:00||;True|2026-01-13T09:57:25.4788847+08:00||;True|2026-01-13T09:53:14.4900360+08:00||;True|2026-01-13T09:23:53.6465295+08:00||;True|2026-01-12T22:04:14.5886955+08:00||;False|2026-01-12T22:04:08.2008101+08:00||;True|2026-01-12T21:53:46.9947176+08:00||;True|2026-01-12T21:11:15.8358024+08:00||;True|2026-01-12T21:09:51.8663228+08:00||;True|2026-01-11T21:25:07.5052845+08:00||;False|2026-01-11T21:24:27.5744557+08:00||;True|2026-01-11T19:59:15.4734611+08:00||;False|2026-01-11T19:59:04.9543339+08:00||;True|2026-01-11T18:51:30.6649269+08:00||;True|2026-01-08T21:07:57.5094466+08:00||;True|2026-01-08T14:51:18.2266231+08:00||;True|2026-01-08T14:31:55.1137120+08:00||;True|2026-01-08T00:16:24.4451490+08:00||;True|2026-01-08T00:14:20.7430793+08:00||;True|2026-01-08T00:07:46.7228194+08:00||;True|2026-01-07T23:52:13.3290082+08:00||;True|2026-01-07T23:49:28.4838650+08:00||;True|2026-01-07T23:47:45.1936189+08:00||;True|2026-01-07T23:35:09.7818611+08:00||;True|2026-01-07T23:20:43.7462863+08:00||;True|2026-01-07T23:04:39.5140429+08:00||;False|2026-01-07T23:04:36.5367611+08:00||;True|2026-01-07T22:53:14.6013449+08:00||;True|2026-01-07T22:49:59.9549006+08:00||;True|2026-01-07T22:36:40.0254856+08:00||;False|2026-01-07T22:36:28.8275903+08:00||;True|2026-01-07T21:59:51.4355171+08:00||;True|2026-01-03T21:38:51.4307034+08:00||;True|2026-01-02T19:09:16.9668906+08:00||;False|2026-01-02T19:09:11.7496369+08:00||;True|2026-01-02T15:42:08.2215697+08:00||;True|2026-01-02T09:46:56.1654861+08:00||; + True|2026-01-22T15:18:32.0400436Z||;True|2026-01-22T22:29:29.5746209+08:00||;True|2026-01-22T21:32:21.7284081+08:00||;True|2026-01-22T21:20:26.5985955+08:00||;False|2026-01-22T21:20:21.1372539+08:00||;True|2026-01-22T21:11:18.3771739+08:00||;True|2026-01-22T20:58:55.9862778+08:00||;True|2026-01-22T20:51:48.6699461+08:00||;False|2026-01-22T20:51:42.2079210+08:00||;True|2026-01-22T20:50:34.7280114+08:00||;True|2026-01-22T20:50:11.1588492+08:00||;True|2026-01-22T16:11:14.0626037+08:00||;True|2026-01-22T15:53:16.6377347+08:00||;True|2026-01-22T15:45:34.0935091+08:00||;True|2026-01-22T12:44:28.1577014+08:00||;True|2026-01-22T12:40:45.7449335+08:00||;True|2026-01-22T12:39:07.0683214+08:00||;True|2026-01-22T09:55:49.7086190+08:00||;True|2026-01-22T01:37:53.6972395+08:00||;True|2026-01-22T01:34:14.2142463+08:00||;True|2026-01-22T01:32:50.9228911+08:00||;True|2026-01-22T01:29:43.8871986+08:00||;True|2026-01-22T01:29:40.7838709+08:00||;True|2026-01-22T01:27:34.4763970+08:00||;True|2026-01-22T01:26:55.0117367+08:00||;True|2026-01-22T01:23:19.4789587+08:00||;True|2026-01-19T10:19:44.8997385+08:00||;True|2026-01-19T10:11:10.2305307+08:00||;True|2026-01-17T00:52:08.8180346+08:00||;False|2026-01-17T00:52:03.1829000+08:00||;True|2026-01-17T00:45:04.0498090+08:00||;True|2026-01-16T21:00:57.7239379+08:00||;True|2026-01-16T21:00:03.3912989+08:00||;True|2026-01-16T20:56:08.5505592+08:00||;True|2026-01-16T20:46:32.3067302+08:00||;True|2026-01-15T22:18:57.9835738+08:00||;True|2026-01-15T22:07:25.4753938+08:00||;True|2026-01-15T22:07:14.8243754+08:00||;True|2026-01-15T21:40:13.2613927+08:00||;True|2026-01-15T20:57:56.6291682+08:00||;True|2026-01-15T20:57:47.1363536+08:00||;True|2026-01-15T20:08:44.4710883+08:00||;True|2026-01-15T20:04:51.8284314+08:00||;False|2026-01-15T20:04:45.3258155+08:00||;True|2026-01-15T19:59:11.7907672+08:00||;True|2026-01-15T01:10:48.9066941+08:00||;True|2026-01-15T01:03:23.6216975+08:00||;True|2026-01-15T01:03:16.3364591+08:00||;False|2026-01-15T01:03:10.5654436+08:00||;True|2026-01-15T00:49:21.6559622+08:00||;True|2026-01-15T00:10:42.7288439+08:00||;True|2026-01-15T00:06:28.4241682+08:00||;True|2026-01-13T22:34:15.2372411+08:00||;True|2026-01-13T22:26:46.4522947+08:00||;True|2026-01-13T22:15:56.9735179+08:00||;True|2026-01-13T22:15:51.8250677+08:00||;False|2026-01-13T22:15:46.6608690+08:00||;True|2026-01-13T22:03:06.4683237+08:00||;False|2026-01-13T22:03:01.2036027+08:00||;True|2026-01-13T21:36:05.8776209+08:00||;True|2026-01-13T21:33:02.0766289+08:00||;False|2026-01-13T21:32:57.1976141+08:00||;True|2026-01-13T19:14:35.2519439+08:00||;True|2026-01-13T15:07:50.0836745+08:00||;False|2026-01-13T15:06:35.5929685+08:00||;True|2026-01-13T10:21:41.6012776+08:00||;True|2026-01-13T09:57:25.4788847+08:00||;True|2026-01-13T09:53:14.4900360+08:00||;True|2026-01-13T09:23:53.6465295+08:00||;True|2026-01-12T22:04:14.5886955+08:00||;False|2026-01-12T22:04:08.2008101+08:00||;True|2026-01-12T21:53:46.9947176+08:00||;True|2026-01-12T21:11:15.8358024+08:00||;True|2026-01-12T21:09:51.8663228+08:00||;True|2026-01-11T21:25:07.5052845+08:00||;False|2026-01-11T21:24:27.5744557+08:00||;True|2026-01-11T19:59:15.4734611+08:00||;False|2026-01-11T19:59:04.9543339+08:00||;True|2026-01-11T18:51:30.6649269+08:00||;True|2026-01-08T21:07:57.5094466+08:00||;True|2026-01-08T14:51:18.2266231+08:00||;True|2026-01-08T14:31:55.1137120+08:00||;True|2026-01-08T00:16:24.4451490+08:00||;True|2026-01-08T00:14:20.7430793+08:00||;True|2026-01-08T00:07:46.7228194+08:00||;True|2026-01-07T23:52:13.3290082+08:00||;True|2026-01-07T23:49:28.4838650+08:00||;True|2026-01-07T23:47:45.1936189+08:00||;True|2026-01-07T23:35:09.7818611+08:00||;True|2026-01-07T23:20:43.7462863+08:00||;True|2026-01-07T23:04:39.5140429+08:00||;False|2026-01-07T23:04:36.5367611+08:00||;True|2026-01-07T22:53:14.6013449+08:00||;True|2026-01-07T22:49:59.9549006+08:00||;True|2026-01-07T22:36:40.0254856+08:00||;False|2026-01-07T22:36:28.8275903+08:00||;True|2026-01-07T21:59:51.4355171+08:00||;True|2026-01-03T21:38:51.4307034+08:00||;True|2026-01-02T19:09:16.9668906+08:00||;False|2026-01-02T19:09:11.7496369+08:00||; \ No newline at end of file diff --git a/app/src/pages/cok/CookieTable.vue b/app/src/pages/cok/CookieTable.vue index 50b9b32..a3f9f90 100644 --- a/app/src/pages/cok/CookieTable.vue +++ b/app/src/pages/cok/CookieTable.vue @@ -567,7 +567,7 @@ const saveDrawerData = () => { - +
@@ -586,7 +586,7 @@ const saveDrawerData = () => { - +
diff --git a/app/src/pages/workplace/statics.vue b/app/src/pages/workplace/statics.vue index 0f2c2ea..ff1adf0 100644 --- a/app/src/pages/workplace/statics.vue +++ b/app/src/pages/workplace/statics.vue @@ -96,9 +96,11 @@
-
+ + +
@@ -160,6 +162,12 @@
+ + + +
+
+ @@ -169,10 +177,11 @@ 下 - confine: false, // 关闭容器限制 + trigger: 'axis', + zlevel: 100, + appendToBody: true, + confine: false, axisPointer: { type: 'cross' }, - // 可选:自定义样式,确保清晰 backgroundColor: 'rgba(0,0,0,0.6)', textStyle: { fontSize: 12, color: '#fff' }, padding: [8, 12], - // 可选:给 tooltip 加自定义类名,方便单独控制样式 className: 'custom-chart-tooltip', }, legend: { @@ -322,7 +327,7 @@ const initChart = () => { }, axisLabel: { color: document.documentElement.classList.contains('dark-mode') ? '#b0b0c3' : '#666', - fontSize: 11, // 7天日期挤,微调字号 + fontSize: 11, }, }, ], @@ -354,8 +359,8 @@ const initChart = () => { symbolSize: 4, emphasis: { focus: 'series', - symbolSize: 6, // hover时数据点放大 - } as any, // 增加类型断言解决报错 + symbolSize: 6, + } as any, data: data.map((item) => item.favorite), }, { @@ -420,8 +425,17 @@ const initChart = () => { }, ], }; +}; +// 原有方法:初始化普通图表 +const initChart = () => { + if (!chartRef.value) return; + if (chartInstance) chartInstance.dispose(); + + chartInstance = echarts.init(chartRef.value); + const option = getChartOption(syncData.value); chartInstance.setOption(option); + const resizeHandler = () => chartInstance?.resize(); window.addEventListener('resize', resizeHandler); onUnmounted(() => { @@ -430,12 +444,100 @@ const initChart = () => { chartInstance = null; }); }; +// 新增:打开全屏图表窗口 +const openFullChart = () => { + showFullChartModal.value = true; +}; +// 新增:初始化全屏图表 +// 重写 initFullChart 函数(增加更多日志和容错) +const initFullChart = async () => { + console.log('进入initFullChart函数'); + await nextTick(); // 等待模态窗口DOM渲染完成 + + // 增加日志排查 + console.log('fullChartRef是否存在:', !!fullChartRef.value); + console.log('syncData是否有数据:', syncData.value.length); + + if (!fullChartRef.value) { + console.error('全屏图表容器不存在'); + return; + } + + if (syncData.value.length === 0) { + console.error('同步数据为空'); + return; + } + + console.log('开始初始化全屏图表'); + // 销毁已有实例 + if (fullChartInstance) { + fullChartInstance.dispose(); + fullChartInstance = null; + } + + try { + // 初始化全屏图表 + fullChartInstance = echarts.init(fullChartRef.value); + const option = getChartOption(syncData.value); + // 调整全屏图表的网格和字号,优化显示效果 + option.grid = { + left: '4%', + right: '4%', + bottom: '5%', + top: '8%', + containLabel: true, + }; + if (option.xAxis && Array.isArray(option.xAxis) && option.xAxis[0]) { + option.xAxis[0].axisLabel = { + ...option.xAxis[0].axisLabel, + fontSize: 12, + }; + } + if (option.yAxis && Array.isArray(option.yAxis) && option.yAxis[0]) { + option.yAxis[0].axisLabel = { + ...option.yAxis[0].axisLabel, + fontSize: 12, + }; + } + + fullChartInstance.setOption(option); + fullChartInstance.resize(); // 强制调整大小 + console.log('全屏图表初始化成功'); + } catch (error) { + console.error('全屏图表初始化失败:', error); + } +}; + +// 新增:处理全屏图表窗口大小变化 +const handleFullChartResize = () => { + fullChartInstance?.resize(); +}; + +// 新增:销毁全屏图表实例 +const destroyFullChart = () => { + fullChartInstance?.dispose(); + fullChartInstance = null; +}; // 监听暗黑模式切换 +// watch( +// () => document.documentElement.classList.contains('dark-mode'), +// () => initChart(), +// { immediate: true } +// ); + +// 在脚本中添加(放在onMounted之前) watch( - () => document.documentElement.classList.contains('dark-mode'), - () => initChart(), - { immediate: true } + () => showFullChartModal.value, + async (isOpen) => { + if (isOpen) { + console.log('弹窗已打开,准备初始化全屏图表'); + getFullSyncData(); + } else { + destroyFullChart(); // 弹窗关闭时销毁图表 + } + }, + { immediate: false } ); // 加载数据 - 调用7天方法 @@ -444,6 +546,10 @@ onMounted(() => { loadDashboardData(); }); +// 新增:窗口关闭时销毁全屏图表 +onUnmounted(() => { + destroyFullChart(); +}); const changeTab = (e: string) => { currentTab.value = e; tabCount.value = e === 'author' ? totalAuthors.value : categoryTotal.value; @@ -529,11 +635,13 @@ const handleDeleteItem = (item: Author) => { height: 100%; display: flex; flex-direction: column; + position: relative; /* 新增:为全屏按钮提供定位容器 */ } .chart-container { flex: 1; width: 100%; min-height: 220px; + padding-right: 40px; /* 新增:给右侧留出按钮空间,避免覆盖 */ } .stat-header { display: flex; @@ -542,12 +650,6 @@ const handleDeleteItem = (item: Author) => { margin-bottom: 8px; width: 100%; } -.total-videos-item, -.total-space-item { - display: flex; - flex-direction: column; - gap: 4px; -} .stat-subitems { display: grid; grid-template-columns: repeat(2, 1fr); @@ -965,4 +1067,41 @@ html.dark-mode .category-stats { html.dark-mode .author-progress { background: rgba(255, 255, 255, 0.1); } + +/* 新增:全屏按钮样式 */ +.fullscreen-btn { + position: absolute; + top: 5px; + right: 5px; + z-index: 10; /* 确保在图表上方显示 */ + width: 32px; + height: 32px; + border-radius: 8px; + background-color: #ffffff; + color: #666; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + transition: all 0.2s ease; +} + +.fullscreen-btn:hover { + background-color: #f5f5f5; + color: #2196f3; + border-color: #2196f3; +} + +/* 暗黑模式下的全屏按钮样式 */ +html.dark-mode .fullscreen-btn { + background-color: rgba(40, 40, 65, 0.8); + border-color: rgba(255, 255, 255, 0.1); + color: #b0b0c3; +} + +html.dark-mode .fullscreen-btn:hover { + background-color: rgba(60, 60, 85, 0.8); + color: #42a5f5; + border-color: #42a5f5; +} \ No newline at end of file diff --git a/app/src/store/coreapi.ts b/app/src/store/coreapi.ts index 7c6cbe3..c6d20fb 100644 --- a/app/src/store/coreapi.ts +++ b/app/src/store/coreapi.ts @@ -104,8 +104,8 @@ export const useApiStore = defineStore('coreapi', () => { }); } //视频曲线 - async function VideoChart() { - return http.request>('/api/video/chart', 'get').then(r => { + async function VideoChart(day: number) { + return http.request>(`/api/video/chart/${day}`, 'get').then(r => { return r; }).finally(() => { diff --git a/service/DouyinVideoService.cs b/service/DouyinVideoService.cs index 4882823..2acaf4f 100644 --- a/service/DouyinVideoService.cs +++ b/service/DouyinVideoService.cs @@ -382,9 +382,11 @@ namespace dy.net.service /// /// /// - public async Task> GetChartData() + public async Task> GetChartData(int day=7) { - var list = await _dyCollectVideoRepository.GetListAsync(x => x.SyncTime > DateTime.Now.AddDays(-7)); + + var date = DateTime.Now.AddDays(-day); + var list = await _dyCollectVideoRepository.GetListAsync(x => x.SyncTime > date); var resultData = list.GroupBy(x => x.SyncTime.ToString("yyyyMMdd")).Select(g => new VideoChartItemDto {