初始化

This commit is contained in:
2026-07-03 15:58:29 +08:00
parent 3a942c882e
commit dc90e889e1
77 changed files with 12912 additions and 0 deletions

185
web/src/api/file.ts Normal file
View File

@@ -0,0 +1,185 @@
/**
* 文件管理相关 API
*/
import request from './request'
/** 文件信息 */
export interface FileInfo {
id: number
name: string
extension: string
folder_id: number
size: number
mime_type: string
is_favorite: number
download_count: number
created_at: string
updated_at: string
}
/** 文件夹信息 */
export interface FolderInfo {
id: number
name: string
parent_id: number
path: string
created_at: string
updated_at: string
}
/** 文件列表响应 */
export interface FileListResult {
folders: FolderInfo[]
files: FileInfo[]
}
/** 分享信息 */
export interface ShareInfo {
id: number
share_code: string
share_url: string
has_password: boolean
expire_at: string | null
max_download: number
download_count: number
created_at: string
}
/**
* 上传文件
* @param file 文件对象
* @param folderId 目标文件夹ID, 0=根目录
*/
export function uploadFile(file: File, folderId: number = 0) {
const formData = new FormData()
formData.append('file', file)
return request.post<any, { data: FileInfo }>(`/file/upload?folder_id=${folderId}`, formData, {
headers: { 'Content-Type': 'multipart/form-data' },
})
}
/**
* 获取文件夹内容(文件+子文件夹)
*/
export function getFolderChildren(folderId: number | string) {
return request.get<any, { data: FileListResult }>(`/folder/${folderId}/children`)
}
/**
* 创建文件夹
*/
export function createFolder(name: string, parentId: number = 0) {
return request.post('/folder', { name, parent_id: parentId })
}
/**
* 重命名文件
*/
export function renameFile(fileId: number, newName: string) {
return request.put(`/file/${fileId}/rename`, { new_name: newName })
}
/**
* 重命名文件夹
*/
export function renameFolder(folderId: number, newName: string) {
return request.put(`/folder/${folderId}/rename`, { new_name: newName })
}
/**
* 删除文件(移入回收站)
*/
export function deleteFile(fileId: number) {
return request.delete(`/file/${fileId}`)
}
/**
* 删除文件夹(移入回收站)
*/
export function deleteFolder(folderId: number) {
return request.delete(`/folder/${folderId}`)
}
/**
* 移动文件
*/
export function moveFile(fileId: number, targetFolderId: number) {
return request.post(`/file/${fileId}/move`, { target_folder_id: targetFolderId })
}
/**
* 搜索文件
*/
export function searchFiles(keyword: string) {
return request.get<any, { data: FileInfo[] }>('/file/search', { params: { keyword } })
}
/**
* 获取回收站列表
*/
export function getTrash() {
return request.get<any, { data: FileInfo[] }>('/file/trash')
}
/**
* 恢复文件
*/
export function restoreFile(fileId: number) {
return request.post(`/file/${fileId}/restore`)
}
/**
* 永久删除文件
*/
export function permanentDeleteFile(fileId: number) {
return request.delete(`/file/${fileId}/permanent`)
}
/**
* 获取文件下载链接
*/
export function getDownloadUrl(fileId: number): string {
return `/api/file/${fileId}/download`
}
/**
* 创建分享
*/
export function createShare(fileId: number, password?: string, expireHours?: number, maxDownload?: number, allowPreview?: number, allowDownload?: number) {
return request.post<any, { data: ShareInfo }>('/share', {
file_id: fileId,
password,
expire_hours: expireHours,
max_download: maxDownload,
allow_preview: allowPreview,
allow_download: allowDownload,
})
}
/**
* 获取我的分享列表
*/
export function getMyShares() {
return request.get<any, { data: ShareInfo[] }>('/share')
}
/**
* 取消分享
*/
export function cancelShare(shareId: number) {
return request.delete(`/share/${shareId}`)
}
/**
* 获取分享信息(公开)
*/
export function getShareInfo(code: string) {
return request.get(`/s/${code}`)
}
/**
* 验证分享密码
*/
export function verifySharePassword(code: string, password: string) {
return request.post(`/s/${code}/verify`, { password })
}