lq1405 8d9c7f17ff 重构客户端页面并补充前端分页
- 拆分 ClientPage 为多个客户端子组件
- 将媒体播放器显示在当前选中文件下方
- 抽取并复用分页组件
- 为搜索结果补充分页状态和翻页控件
- 保持最近文件逻辑不变
2026-05-24 15:43:31 +08:00

170 lines
5.5 KiB
C#

using System.Text.Json.Serialization;
namespace FileShare_Services.Services.FileLibrary
{
/// <summary>
/// 添加文件库根目录的请求。
/// </summary>
public sealed record AddLibraryRootRequest(
[property: JsonPropertyName("path")]
string? Path,
[property: JsonPropertyName("displayName")]
string? DisplayName = null,
[property: JsonPropertyName("scanIntervalMinutes")]
int? ScanIntervalMinutes = null);
/// <summary>
/// 更新文件库根目录启用状态的请求。
/// </summary>
public sealed record UpdateLibraryRootRequest(
[property: JsonPropertyName("id")] int Id,
[property: JsonPropertyName("isEnabled")] bool IsEnabled);
/// <summary>
/// 触发文件库根目录立即扫描的请求。
/// </summary>
public sealed record ScanLibraryRootRequest(
[property: JsonPropertyName("id")] int Id);
/// <summary>
/// 删除文件库根目录的请求。
/// </summary>
public sealed record DeleteLibraryRootRequest(
[property: JsonPropertyName("id")] int Id);
/// <summary>
/// 查询服务器子目录的请求。
/// </summary>
public sealed record DirectoryQueryRequest(
[property: JsonPropertyName("path")] string? Path);
/// <summary>
/// 根据 ID 查询文件的请求。
/// </summary>
public sealed record FileQueryRequest(
[property: JsonPropertyName("id")] int Id);
/// <summary>
/// 获取最近文件的请求。
/// </summary>
public sealed record RecentFilesRequest(
[property: JsonPropertyName("type")] string Type = "added",
[property: JsonPropertyName("count")] int Count = 12);
/// <summary>
/// 标记文件已播放的请求。
/// </summary>
public sealed record MarkFilePlayedRequest(
[property: JsonPropertyName("id")] int Id);
/// <summary>
/// 保存文件播放进度的请求。
/// </summary>
public sealed record SaveFileProgressRequest(
[property: JsonPropertyName("id")] int Id,
[property: JsonPropertyName("position")] double? Position);
/// <summary>
/// 分页搜索已扫描文件的请求。
/// </summary>
public sealed record SearchFilesRequest(
[property: JsonPropertyName("page")] int Page = 1,
[property: JsonPropertyName("pageSize")] int PageSize = 24,
[property: JsonPropertyName("mediaType")] string? MediaType = null,
[property: JsonPropertyName("keyword")] string? Keyword = null,
[property: JsonPropertyName("rootId")] int RootId = 0,
[property: JsonPropertyName("sortBy")] string? SortBy = null,
[property: JsonPropertyName("sortDirection")] string? SortDirection = null);
/// <summary>
/// 磁盘驱动器信息。
/// </summary>
public sealed record DriveDto(
string Name,
string DisplayName,
string RootDirectory,
string DriveType,
long? TotalSize,
long? AvailableFreeSpace,
bool IsReady);
/// <summary>
/// 服务器子目录信息。
/// </summary>
public sealed record DirectoryDto(
string Name,
string FullPath);
/// <summary>
/// 文件库根目录信息,包含扫描状态与文件数量。
/// </summary>
public sealed record LibraryRootDto(
int Id,
string Path,
string DisplayName,
bool IsEnabled,
bool IsAvailable,
int ScanIntervalMinutes,
DateTime? LastScanStartedAt,
DateTime? LastScanCompletedAt,
string? LastScanError,
int FileCount);
/// <summary>
/// 已扫描文件的记录信息,包含媒体类型与流式访问 URL。
/// </summary>
public sealed record FileRecordDto(
int Id,
int LibraryRootId,
string FileName,
string RelativePath,
string Extension,
long SizeBytes,
DateTime LastWriteTimeUtc,
DateTime? FileCreationTimeUtc,
string MediaType,
string ContentType,
string StreamUrl,
string? TextUrl,
bool BrowserPlayable,
string? ThumbnailUrl = null,
double? VideoDuration = null,
DateTime? LastPlayedAt = null,
double? PlaybackPosition = null);
/// <summary>
/// 浏览文件库目录结构的请求。
/// </summary>
public sealed record BrowseDirectoryRequest(
[property: JsonPropertyName("rootId")] int RootId = 0,
[property: JsonPropertyName("path")] string? Path = null,
[property: JsonPropertyName("page")] int Page = 1,
[property: JsonPropertyName("pageSize")] int PageSize = 10,
[property: JsonPropertyName("mediaType")] string? MediaType = null,
[property: JsonPropertyName("sortBy")] string? SortBy = "name",
[property: JsonPropertyName("sortDirection")] string? SortDirection = "asc");
/// <summary>
/// 浏览文件库目录的响应,包含当前路径、子目录列表和文件列表。
/// </summary>
public sealed record BrowseDirectoryResponse(
string CurrentPath,
List<string> Subdirectories,
List<FileRecordDto> Files,
int Total,
int Page,
int PageSize,
int TotalPages);
/// <summary>
/// 文本文件预览内容,支持截断标记。
/// </summary>
public sealed record TextPreviewDto(
int Id,
string FileName,
string Content,
bool Truncated);
}