|
|
@@ -0,0 +1,173 @@
|
|
|
+import axios from 'axios';
|
|
|
+import type { MinioUploadPolicy, OSSUploadPolicy } from '@d8d-appcontainer/types';
|
|
|
+import type {
|
|
|
+ FileLibrary, FileCategory
|
|
|
+} from '../../share/types.ts';
|
|
|
+
|
|
|
+interface FileUploadPolicyResponse {
|
|
|
+ message: string;
|
|
|
+ data: MinioUploadPolicy | OSSUploadPolicy;
|
|
|
+}
|
|
|
+
|
|
|
+interface FileListResponse {
|
|
|
+ message: string;
|
|
|
+ data: {
|
|
|
+ list: FileLibrary[];
|
|
|
+ pagination: {
|
|
|
+ current: number;
|
|
|
+ pageSize: number;
|
|
|
+ total: number;
|
|
|
+ };
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+interface FileSaveResponse {
|
|
|
+ message: string;
|
|
|
+ data: FileLibrary;
|
|
|
+}
|
|
|
+
|
|
|
+interface FileInfoResponse {
|
|
|
+ message: string;
|
|
|
+ data: FileLibrary;
|
|
|
+}
|
|
|
+
|
|
|
+interface FileDeleteResponse {
|
|
|
+ message: string;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+interface FileCategoryListResponse {
|
|
|
+ data: FileCategory[];
|
|
|
+ total: number;
|
|
|
+ page: number;
|
|
|
+ pageSize: number;
|
|
|
+}
|
|
|
+
|
|
|
+interface FileCategoryCreateResponse {
|
|
|
+ message: string;
|
|
|
+ data: FileCategory;
|
|
|
+}
|
|
|
+
|
|
|
+interface FileCategoryUpdateResponse {
|
|
|
+ message: string;
|
|
|
+ data: FileCategory;
|
|
|
+}
|
|
|
+
|
|
|
+interface FileCategoryDeleteResponse {
|
|
|
+ message: string;
|
|
|
+}
|
|
|
+
|
|
|
+// 文件管理API
|
|
|
+export const FileAPI = {
|
|
|
+ // 获取文件上传策略
|
|
|
+ getUploadPolicy: async (filename: string, prefix: string = 'uploads/', maxSize: number = 10 * 1024 * 1024): Promise<FileUploadPolicyResponse> => {
|
|
|
+ try {
|
|
|
+ const response = await axios.get('/upload/policy', {
|
|
|
+ params: { filename, prefix, maxSize }
|
|
|
+ });
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 保存文件信息
|
|
|
+ saveFileInfo: async (fileData: Partial<FileLibrary>): Promise<FileSaveResponse> => {
|
|
|
+ try {
|
|
|
+ const response = await axios.post('/upload/save', fileData);
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 获取文件列表
|
|
|
+ getFileList: async (params?: {
|
|
|
+ page?: number,
|
|
|
+ pageSize?: number,
|
|
|
+ category_id?: number,
|
|
|
+ fileType?: string,
|
|
|
+ keyword?: string
|
|
|
+ }): Promise<FileListResponse> => {
|
|
|
+ try {
|
|
|
+ const response = await axios.get('/upload/list', { params });
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 获取单个文件信息
|
|
|
+ getFileInfo: async (id: number): Promise<FileInfoResponse> => {
|
|
|
+ try {
|
|
|
+ const response = await axios.get(`/upload/${id}`);
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 更新文件下载计数
|
|
|
+ updateDownloadCount: async (id: number): Promise<FileDeleteResponse> => {
|
|
|
+ try {
|
|
|
+ const response = await axios.post(`/upload/${id}/download`);
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 删除文件
|
|
|
+ deleteFile: async (id: number): Promise<FileDeleteResponse> => {
|
|
|
+ try {
|
|
|
+ const response = await axios.delete(`/upload/${id}`);
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 获取文件分类列表
|
|
|
+ getCategories: async (params?: {
|
|
|
+ page?: number,
|
|
|
+ pageSize?: number,
|
|
|
+ search?: string
|
|
|
+ }): Promise<FileCategoryListResponse> => {
|
|
|
+ try {
|
|
|
+ const response = await axios.get('/file-categories', { params });
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 创建文件分类
|
|
|
+ createCategory: async (data: Partial<FileCategory>): Promise<FileCategoryCreateResponse> => {
|
|
|
+ try {
|
|
|
+ const response = await axios.post('/file-categories', data);
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 更新文件分类
|
|
|
+ updateCategory: async (id: number, data: Partial<FileCategory>): Promise<FileCategoryUpdateResponse> => {
|
|
|
+ try {
|
|
|
+ const response = await axios.put(`/file-categories/${id}`, data);
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 删除文件分类
|
|
|
+ deleteCategory: async (id: number): Promise<FileCategoryDeleteResponse> => {
|
|
|
+ try {
|
|
|
+ const response = await axios.delete(`/file-categories/${id}`);
|
|
|
+ return response.data;
|
|
|
+ } catch (error) {
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|