refactor: modularize frontend flows

This commit is contained in:
Lan
2026-06-03 02:01:57 +08:00
parent 9300607f96
commit a11e7900b4
85 changed files with 4654 additions and 4363 deletions
+10
View File
@@ -0,0 +1,10 @@
export interface ApiResponse<T = unknown> {
code: number
message?: string
detail?: T
}
export interface ApiErrorPayload {
detail?: string
message?: string
}
+5
View File
@@ -0,0 +1,5 @@
export interface AdminUser {
id: string
username: string
token: string
}
+55
View File
@@ -0,0 +1,55 @@
export interface SystemConfig {
name: string
description?: string
maxFileSize: number
allowedFileTypes: string[]
expireDays: number
notify_title?: string
notify_content?: string
}
export interface ThemeChoice {
key: string
name: string
author: string
version: string
}
export interface ConfigState {
name: string
description: string
file_storage: string
themesChoices: ThemeChoice[]
expireStyle: string[]
admin_token: string
robotsText: string
keywords: string
notify_title: string
notify_content: string
openUpload: number
uploadSize: number
storage_path: string
uploadMinute: number
max_save_seconds: number
opacity: number
enableChunk: number
s3_access_key_id: string
background: string
showAdminAddr: number
page_explain: string
s3_secret_access_key: string
aws_session_token: string
s3_signature_version: string
s3_region_name: string
s3_bucket_name: string
s3_endpoint_url: string
s3_hostname: string
uploadCount: number
errorMinute: number
errorCount: number
s3_proxy: number
themesSelect: string
webdav_url: string
webdav_username: string
webdav_password: string
}
+54
View File
@@ -0,0 +1,54 @@
export interface DashboardData {
totalFiles: number
storageUsed: number
yesterdayCount: number
todayCount: number
yesterdaySize: number
todaySize: number
sysUptime: number | null
activeCount: number
expiredCount: number
textCount: number
fileCount: number
chunkedCount: number
usedCount: number
storageBackend: string
uploadSizeLimit: number
openUpload: number
enableChunk: number
maxSaveSeconds: number
topSuffixes: DashboardSuffixStat[]
recentFiles: DashboardRecentFile[]
}
export interface DashboardSuffixStat {
suffix: string
count: number
}
export interface DashboardRecentFile {
id: number
code: string
name: string
suffix: string
size: number
text: boolean
expiredAt: string | null
expiredCount: number
usedCount: number
createdAt: string | null
isExpired: boolean
}
export interface DashboardViewData extends DashboardData {
hasExtendedStats: boolean
storageUsedText: string
yesterdaySizeText: string
todaySizeText: string
uploadSizeLimitText: string
sysUptimeText: string
activeRatio: number
textRatio: number
fileRatio: number
todaySizeRatio: number
}
+107
View File
@@ -0,0 +1,107 @@
export interface FileInfo {
id: string
name: string
size: number
type: string
uploadTime: string
downloadCount: number
expireTime?: string
}
export interface FileListItem {
id: number
code: string
prefix: string
suffix: string
size: number
text?: string
description?: string
expired_at: string
expired_count: number | null
created_at: string
}
export interface AdminFileViewItem extends FileListItem {
displaySize: string
displayExpiredAt: string
canPreviewText: boolean
}
export interface FileEditForm {
id: number | null
code: string
prefix: string
suffix: string
expired_at: string
expired_count: number | null
}
export interface FileListResponse {
data: FileListItem[]
total: number
page: number
size: number
}
export interface FileUploadResponse {
code: string
name: string
}
export interface TextSendResponse {
code: string
}
export interface ShareSelectResponse {
code: string
name: string
text: string
size: number
}
export interface ReceivedFileRecord {
id: number
code: string
filename: string
size: string
downloadUrl: string | null
content: string | null
date: string
}
export interface SentFileRecord {
id: number
filename: string
date: string
size: string
expiration: string
retrieveCode: string
}
export interface UploadProgress {
loaded: number
total: number
percentage: number
}
export interface ChunkUploadInitRequest {
file_name: string
file_size: number
chunk_size: number
file_hash: string
}
export interface ChunkUploadInitResponse {
code?: string
name?: string
upload_id?: string
existed?: boolean
uploaded_chunks?: number[]
}
export interface ChunkUploadCompleteRequest {
expire_value: number
expire_style: string
}
export type ChunkUploadResponse = null
+7 -243
View File
@@ -1,243 +1,7 @@
// 通用类型定义
export interface ApiResponse<T = unknown> {
code: number
message?: string
detail?: T
}
// 文件相关类型
export interface FileInfo {
id: string
name: string
size: number
type: string
uploadTime: string
downloadCount: number
expireTime?: string
}
// 文件管理相关类型
export interface FileListItem {
id: number
code: string
prefix: string
suffix: string
size: number
text?: string
description?: string
expired_at: string
expired_count: number | null
created_at: string
}
export interface FileEditForm {
id: number | null
code: string
prefix: string
suffix: string
expired_at: string
expired_count: number | null
}
export interface FileListResponse {
data: FileListItem[]
total: number
page: number
size: number
}
// 文件上传响应类型
export interface FileUploadResponse {
code: number
name: string
}
// 文本发送响应类型
export interface TextSendResponse {
code: number
}
export interface UploadProgress {
loaded: number
total: number
percentage: number
}
// 系统配置类型
export interface SystemConfig {
name: string
description?: string
maxFileSize: number
allowedFileTypes: string[]
expireDays: number
notify_title?: string
notify_content?: string
}
// 主题选择项类型
export interface ThemeChoice {
key: string
name: string
author: string
version: string
}
// 完整的系统配置状态类型
export interface ConfigState {
name: string
description: string
file_storage: string
themesChoices: ThemeChoice[]
expireStyle: string[]
admin_token: string
robotsText: string
keywords: string
notify_title: string
notify_content: string
openUpload: number
uploadSize: number
storage_path: string
uploadMinute: number
max_save_seconds: number
opacity: number
enableChunk: number
s3_access_key_id: string
background: string
showAdminAddr: number
page_explain: string
s3_secret_access_key: string
aws_session_token: string
s3_signature_version: string
s3_region_name: string
s3_bucket_name: string
s3_endpoint_url: string
s3_hostname: string
uploadCount: number
errorMinute: number
errorCount: number
s3_proxy: number
themesSelect: string
webdav_url: string
webdav_username: string
webdav_password: string
}
// 系统配置API响应类型
export interface ConfigResponse {
code: number
message?: string
detail?: ConfigState
}
// 用户相关类型
export interface AdminUser {
id: string
username: string
token: string
}
// Dashboard 数据类型
export interface DashboardData {
totalFiles: number
storageUsed: number | string
yesterdayCount: number
todayCount: number
yesterdaySize: number | string
todaySize: number | string
sysUptime: number | string
}
// 主题相关类型
export type ThemeMode = 'light' | 'dark' | 'system'
// 发送类型
export type SendType = 'file' | 'text'
// 警告类型
export type AlertType = 'success' | 'error' | 'warning' | 'info'
export interface Alert {
id: number
message: string
type: AlertType
progress: number
duration: number
startTime: number
}
// 文件上传状态
export type UploadStatus = 'idle' | 'uploading' | 'success' | 'error'
// 路由相关类型
export interface RouteConfig {
path: string
name: string
component: () => Promise<{ default: object }>
meta?: {
requiresAuth?: boolean
title?: string
}
}
// ==================== 预签名上传相关类型 ====================
// 预签名上传模式
export type PresignUploadMode = 'direct' | 'proxy'
// 预签名上传状态
export type PresignUploadStatus =
| 'idle'
| 'initializing'
| 'uploading'
| 'confirming'
| 'success'
| 'error'
// 过期类型
export type ExpireStyle = 'day' | 'hour' | 'minute' | 'forever' | 'count'
// 初始化上传请求
export interface PresignInitRequest {
file_name: string
file_size: number
expire_value?: number
expire_style?: ExpireStyle
}
// 初始化上传响应
export interface PresignInitResponse {
upload_id: string
upload_url: string
mode: PresignUploadMode
expires_in: number
}
// 确认上传请求
export interface PresignConfirmRequest {
expire_value?: number
expire_style?: ExpireStyle
}
// 上传结果
export interface PresignUploadResult {
code: string
name: string
}
// 上传状态查询响应
export interface PresignStatusResponse {
upload_id: string
file_name: string
file_size: number
mode: PresignUploadMode
created_at: string
expires_at: string
is_expired: boolean
}
// 上传配置选项
export interface PresignUploadOptions {
expireValue?: number
expireStyle?: ExpireStyle
onProgress?: (progress: UploadProgress) => void
}
export * from './api'
export * from './auth'
export * from './config'
export * from './dashboard'
export * from './file'
export * from './presign-upload'
export * from './ui'
+53
View File
@@ -0,0 +1,53 @@
import type { UploadProgress } from './file'
export type PresignUploadMode = 'direct' | 'proxy'
export type PresignUploadStatus =
| 'idle'
| 'initializing'
| 'uploading'
| 'confirming'
| 'success'
| 'error'
export type ExpireStyle = 'day' | 'hour' | 'minute' | 'forever' | 'count'
export interface PresignInitRequest {
file_name: string
file_size: number
expire_value?: number
expire_style?: ExpireStyle
}
export interface PresignInitResponse {
upload_id: string
upload_url: string
mode: PresignUploadMode
expires_in: number
}
export interface PresignConfirmRequest {
expire_value?: number
expire_style?: ExpireStyle
}
export interface PresignUploadResult {
code: string
name: string
}
export interface PresignStatusResponse {
upload_id: string
file_name: string
file_size: number
mode: PresignUploadMode
created_at: string
expires_at: string
is_expired: boolean
}
export interface PresignUploadOptions {
expireValue?: number
expireStyle?: ExpireStyle
onProgress?: (progress: UploadProgress) => void
}
+26
View File
@@ -0,0 +1,26 @@
export type ThemeMode = 'light' | 'dark' | 'system'
export type SendType = 'file' | 'text'
export type AlertType = 'success' | 'error' | 'warning' | 'info'
export interface Alert {
id: number
message: string
type: AlertType
progress: number
duration: number
startTime: number
}
export type UploadStatus = 'idle' | 'uploading' | 'success' | 'error'
export interface RouteConfig {
path: string
name: string
component: () => Promise<{ default: object }>
meta?: {
requiresAuth?: boolean
title?: string
}
}