From 8d9c7f17ffc482513f7f599a539d0aa1849cf308 Mon Sep 17 00:00:00 2001 From: lq1405 <2769838458@qq.com> Date: Sun, 24 May 2026 15:43:31 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=B9=B6=E8=A1=A5=E5=85=85=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 拆分 ClientPage 为多个客户端子组件 - 将媒体播放器显示在当前选中文件下方 - 抽取并复用分页组件 - 为搜索结果补充分页状态和翻页控件 - 保持最近文件逻辑不变 --- .../FileLibrary/FileLibraryContracts.cs | 2 +- .../FileLibrary/FileLibraryService.cs | 2 +- FileShare-Web-VUE/src/assets/main.css | 12 + .../src/components/ClientPage.vue | 642 ++++++++---------- .../src/components/client/BreadcrumbNav.vue | 25 + .../src/components/client/BrowseToolbar.vue | 53 ++ .../src/components/client/ClientHeader.vue | 54 ++ .../components/client/ClientMediaPlayer.vue | 118 ++++ .../src/components/client/FileCard.vue | 40 ++ .../src/components/client/FileListItem.vue | 42 ++ .../src/components/client/MobilePager.vue | 19 + .../src/components/client/RootPicker.vue | 28 + .../src/components/client/RootTabs.vue | 29 + .../client/SelectedMediaPlayerHost.vue | 65 ++ .../src/components/client/ViewToggle.vue | 16 + FileShare-Web-VUE/src/utils/formatters.ts | 29 + 16 files changed, 797 insertions(+), 379 deletions(-) create mode 100644 FileShare-Web-VUE/src/components/client/BreadcrumbNav.vue create mode 100644 FileShare-Web-VUE/src/components/client/BrowseToolbar.vue create mode 100644 FileShare-Web-VUE/src/components/client/ClientHeader.vue create mode 100644 FileShare-Web-VUE/src/components/client/ClientMediaPlayer.vue create mode 100644 FileShare-Web-VUE/src/components/client/FileCard.vue create mode 100644 FileShare-Web-VUE/src/components/client/FileListItem.vue create mode 100644 FileShare-Web-VUE/src/components/client/MobilePager.vue create mode 100644 FileShare-Web-VUE/src/components/client/RootPicker.vue create mode 100644 FileShare-Web-VUE/src/components/client/RootTabs.vue create mode 100644 FileShare-Web-VUE/src/components/client/SelectedMediaPlayerHost.vue create mode 100644 FileShare-Web-VUE/src/components/client/ViewToggle.vue create mode 100644 FileShare-Web-VUE/src/utils/formatters.ts diff --git a/FileShare-Services/Services/FileLibrary/FileLibraryContracts.cs b/FileShare-Services/Services/FileLibrary/FileLibraryContracts.cs index 118ba65..e71150c 100644 --- a/FileShare-Services/Services/FileLibrary/FileLibraryContracts.cs +++ b/FileShare-Services/Services/FileLibrary/FileLibraryContracts.cs @@ -141,7 +141,7 @@ namespace FileShare_Services.Services.FileLibrary [property: JsonPropertyName("rootId")] int RootId = 0, [property: JsonPropertyName("path")] string? Path = null, [property: JsonPropertyName("page")] int Page = 1, - [property: JsonPropertyName("pageSize")] int PageSize = 48, + [property: JsonPropertyName("pageSize")] int PageSize = 10, [property: JsonPropertyName("mediaType")] string? MediaType = null, [property: JsonPropertyName("sortBy")] string? SortBy = "name", [property: JsonPropertyName("sortDirection")] string? SortDirection = "asc"); diff --git a/FileShare-Services/Services/FileLibrary/FileLibraryService.cs b/FileShare-Services/Services/FileLibrary/FileLibraryService.cs index b78ca8b..fdae511 100644 --- a/FileShare-Services/Services/FileLibrary/FileLibraryService.cs +++ b/FileShare-Services/Services/FileLibrary/FileLibraryService.cs @@ -463,7 +463,7 @@ namespace FileShare_Services.Services.FileLibrary : query.OrderByDescending(file => file.CreatedAt); return await query - .Take(Math.Clamp(count, 1, 48)) + .Take(Math.Clamp(count, 1, 10)) .Select(file => ToFileDto(file)) .ToListAsync(cancellationToken); } diff --git a/FileShare-Web-VUE/src/assets/main.css b/FileShare-Web-VUE/src/assets/main.css index da09d47..20b6218 100644 --- a/FileShare-Web-VUE/src/assets/main.css +++ b/FileShare-Web-VUE/src/assets/main.css @@ -479,6 +479,18 @@ a { margin-top: 12px; } +.player-host { + min-width: 0; +} + +.file-grid .player-host { + grid-column: 1 / -1; +} + +.player-host .player-panel { + margin-top: 0; +} + .player-title { align-items: flex-start; } diff --git a/FileShare-Web-VUE/src/components/ClientPage.vue b/FileShare-Web-VUE/src/components/ClientPage.vue index 438cbca..6b044ed 100644 --- a/FileShare-Web-VUE/src/components/ClientPage.vue +++ b/FileShare-Web-VUE/src/components/ClientPage.vue @@ -1,8 +1,24 @@ + + diff --git a/FileShare-Web-VUE/src/components/client/BrowseToolbar.vue b/FileShare-Web-VUE/src/components/client/BrowseToolbar.vue new file mode 100644 index 0000000..1da8afd --- /dev/null +++ b/FileShare-Web-VUE/src/components/client/BrowseToolbar.vue @@ -0,0 +1,53 @@ + + + diff --git a/FileShare-Web-VUE/src/components/client/ClientHeader.vue b/FileShare-Web-VUE/src/components/client/ClientHeader.vue new file mode 100644 index 0000000..fb77788 --- /dev/null +++ b/FileShare-Web-VUE/src/components/client/ClientHeader.vue @@ -0,0 +1,54 @@ + + + diff --git a/FileShare-Web-VUE/src/components/client/ClientMediaPlayer.vue b/FileShare-Web-VUE/src/components/client/ClientMediaPlayer.vue new file mode 100644 index 0000000..9d202bc --- /dev/null +++ b/FileShare-Web-VUE/src/components/client/ClientMediaPlayer.vue @@ -0,0 +1,118 @@ + + + diff --git a/FileShare-Web-VUE/src/components/client/FileCard.vue b/FileShare-Web-VUE/src/components/client/FileCard.vue new file mode 100644 index 0000000..988d13a --- /dev/null +++ b/FileShare-Web-VUE/src/components/client/FileCard.vue @@ -0,0 +1,40 @@ + + + diff --git a/FileShare-Web-VUE/src/components/client/FileListItem.vue b/FileShare-Web-VUE/src/components/client/FileListItem.vue new file mode 100644 index 0000000..01cb6a5 --- /dev/null +++ b/FileShare-Web-VUE/src/components/client/FileListItem.vue @@ -0,0 +1,42 @@ + + + diff --git a/FileShare-Web-VUE/src/components/client/MobilePager.vue b/FileShare-Web-VUE/src/components/client/MobilePager.vue new file mode 100644 index 0000000..a8947fc --- /dev/null +++ b/FileShare-Web-VUE/src/components/client/MobilePager.vue @@ -0,0 +1,19 @@ + + + diff --git a/FileShare-Web-VUE/src/components/client/RootPicker.vue b/FileShare-Web-VUE/src/components/client/RootPicker.vue new file mode 100644 index 0000000..9433ee5 --- /dev/null +++ b/FileShare-Web-VUE/src/components/client/RootPicker.vue @@ -0,0 +1,28 @@ + + + diff --git a/FileShare-Web-VUE/src/components/client/RootTabs.vue b/FileShare-Web-VUE/src/components/client/RootTabs.vue new file mode 100644 index 0000000..fb799aa --- /dev/null +++ b/FileShare-Web-VUE/src/components/client/RootTabs.vue @@ -0,0 +1,29 @@ + + + diff --git a/FileShare-Web-VUE/src/components/client/SelectedMediaPlayerHost.vue b/FileShare-Web-VUE/src/components/client/SelectedMediaPlayerHost.vue new file mode 100644 index 0000000..0008259 --- /dev/null +++ b/FileShare-Web-VUE/src/components/client/SelectedMediaPlayerHost.vue @@ -0,0 +1,65 @@ + + + diff --git a/FileShare-Web-VUE/src/components/client/ViewToggle.vue b/FileShare-Web-VUE/src/components/client/ViewToggle.vue new file mode 100644 index 0000000..48af910 --- /dev/null +++ b/FileShare-Web-VUE/src/components/client/ViewToggle.vue @@ -0,0 +1,16 @@ + + + diff --git a/FileShare-Web-VUE/src/utils/formatters.ts b/FileShare-Web-VUE/src/utils/formatters.ts new file mode 100644 index 0000000..3e978f0 --- /dev/null +++ b/FileShare-Web-VUE/src/utils/formatters.ts @@ -0,0 +1,29 @@ +import type { FileRecordDto } from '../api' + +export function formatSize(bytes: number) { + if (bytes < 1024) return `${bytes} B` + const units = ['KB', 'MB', 'GB', 'TB'] + let value = bytes / 1024 + let index = 0 + while (value >= 1024 && index < units.length - 1) { + value /= 1024 + index += 1 + } + return `${value.toFixed(value >= 10 ? 1 : 2)} ${units[index]}` +} + +export function formatDuration(seconds: number | null) { + if (!seconds) return '' + const m = Math.floor(seconds / 60) + const s = Math.floor(seconds % 60) + return `${m}:${s.toString().padStart(2, '0')}` +} + +export function formatDate(value: string | null) { + if (!value) return '' + return new Date(value).toLocaleString() +} + +export function formatCreatedTime(file: FileRecordDto) { + return file.fileCreationTimeUtc ? `创建 ${formatDate(file.fileCreationTimeUtc)}` : '' +}