Merge pull request 'main 文件管理功能,通过权限进行附件私有化和公开管理' (#94) from 362270511/Admin.NET.Pro:main into main

Reviewed-on: http://101.43.53.74:3000/Admin.NET/Admin.NET.Pro/pulls/94
This commit is contained in:
zuohuaijun 2024-08-14 00:58:36 +08:00
commit b1fbd40745
8 changed files with 117 additions and 27 deletions

View File

@ -12,7 +12,7 @@ namespace Admin.NET.Core;
[SugarTable(null, "系统文件表")] [SugarTable(null, "系统文件表")]
[SysTable] [SysTable]
[SugarIndex("index_{table}_F", nameof(FileName), OrderByType.Asc)] [SugarIndex("index_{table}_F", nameof(FileName), OrderByType.Asc)]
public partial class SysFile : EntityBase public partial class SysFile : EntityBaseData
{ {
/// <summary> /// <summary>
/// 提供者 /// 提供者
@ -101,4 +101,11 @@ public partial class SysFile : EntityBase
[SugarColumn(ColumnDescription = "文件类别", Length = 128)] [SugarColumn(ColumnDescription = "文件类别", Length = 128)]
[MaxLength(128)] [MaxLength(128)]
public string? FileType { get; set; } public string? FileType { get; set; }
/// <summary>
/// 是否公开
/// 如果设置true所有人都可以查看默认只有自己或有权限的人可以查看
/// </summary>
[SugarColumn(ColumnDescription = "是否公开", DefaultValue = "false")]
public bool IsPublic { get; set; } = false;
} }

View File

@ -18,6 +18,12 @@ public class FileInput : BaseIdInput
/// </summary> /// </summary>
public string FileType { get; set; } public string FileType { get; set; }
/// <summary>
/// 是否公开
/// 如果设置true所有人都可以查看默认只有自己或有权限的人可以查看
/// </summary>
public bool IsPublic { get; set; }
/// <summary> /// <summary>
/// 文件Url /// 文件Url
/// </summary> /// </summary>
@ -72,6 +78,12 @@ public class UploadFileFromBase64Input
/// 文件类型 /// 文件类型
/// </summary> /// </summary>
public string FileType { get; set; } public string FileType { get; set; }
/// <summary>
/// 是否公开
/// 如果设置true所有人都可以查看默认只有自己或有权限的人可以查看
/// </summary>
public bool IsPublic { get; set; }
} }
/// <summary> /// <summary>
@ -90,6 +102,12 @@ public class FileUploadInput
/// </summary> /// </summary>
public string FileType { get; set; } public string FileType { get; set; }
/// <summary>
/// 是否公开
/// 如果设置true所有人都可以查看默认只有自己或有权限的人可以查看
/// </summary>
public bool IsPublic { get; set; }
/// <summary> /// <summary>
/// 文件路径 /// 文件路径
/// </summary> /// </summary>
@ -168,6 +186,12 @@ public class FileOutput
/// </summary> /// </summary>
public string FileType { get; set; } public string FileType { get; set; }
/// <summary>
/// 是否公开
/// 如果设置true所有人都可以查看默认只有自己或有权限的人可以查看
/// </summary>
public bool IsPublic { get; set; }
/// <summary> /// <summary>
/// 上传人 /// 上传人
/// </summary> /// </summary>

View File

@ -44,12 +44,16 @@ public class SysFileService : IDynamicApiController, ITransient
[DisplayName("获取文件分页列表")] [DisplayName("获取文件分页列表")]
public async Task<SqlSugarPagedList<SysFile>> Page(PageFileInput input) public async Task<SqlSugarPagedList<SysFile>> Page(PageFileInput input)
{ {
return await _sysFileRep.AsQueryable() //获取所有公开附件
.WhereIF(!string.IsNullOrWhiteSpace(input.FileName), u => u.FileName.Contains(input.FileName.Trim())) var publicList = _sysFileRep.AsQueryable().ClearFilter().Where(u => u.IsPublic == true);
.WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()), //获取私有附件
u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime) var privateList = _sysFileRep.AsQueryable().Where(u => u.IsPublic == false);
.OrderBy(u => u.CreateTime, OrderByType.Desc) //合并公开和私有附件并分页
.ToPagedListAsync(input.Page, input.PageSize); return await _sysFileRep.Context.UnionAll(publicList, privateList).WhereIF(!string.IsNullOrWhiteSpace(input.FileName), u => u.FileName.Contains(input.FileName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
.OrderBy(u => u.CreateTime, OrderByType.Desc)
.ToPagedListAsync(input.Page, input.PageSize);
} }
/// <summary> /// <summary>
@ -60,7 +64,7 @@ public class SysFileService : IDynamicApiController, ITransient
[DisplayName("上传文件")] [DisplayName("上传文件")]
public async Task<SysFile> UploadFile([FromForm] FileUploadInput input) public async Task<SysFile> UploadFile([FromForm] FileUploadInput input)
{ {
return await HandleUploadFile(input.File, input.Path, fileType: input.FileType); return await HandleUploadFile(input.File, input.Path, fileType: input.FileType, isPublic: input.IsPublic);
} }
/// <summary> /// <summary>
@ -84,7 +88,7 @@ public class SysFileService : IDynamicApiController, ITransient
Headers = new HeaderDictionary(), Headers = new HeaderDictionary(),
ContentType = input.ContentType ContentType = input.ContentType
}; };
return await UploadFile(new FileUploadInput { File = formFile, Path = input.Path, FileType = input.FileType }); return await UploadFile(new FileUploadInput { File = formFile, Path = input.Path, FileType = input.FileType, IsPublic = input.IsPublic });
} }
/// <summary> /// <summary>
@ -267,7 +271,7 @@ public class SysFileService : IDynamicApiController, ITransient
var isExist = await _sysFileRep.IsAnyAsync(u => u.Id == input.Id); var isExist = await _sysFileRep.IsAnyAsync(u => u.Id == input.Id);
if (!isExist) throw Oops.Oh(ErrorCodeEnum.D8000); if (!isExist) throw Oops.Oh(ErrorCodeEnum.D8000);
await _sysFileRep.UpdateAsync(u => new SysFile() { FileName = input.FileName, FileType = input.FileType }, u => u.Id == input.Id); await _sysFileRep.UpdateAsync(u => new SysFile() { FileName = input.FileName, FileType = input.FileType, IsPublic = input.IsPublic }, u => u.Id == input.Id);
} }
/// <summary> /// <summary>
@ -289,8 +293,9 @@ public class SysFileService : IDynamicApiController, ITransient
/// <param name="savePath">路径</param> /// <param name="savePath">路径</param>
/// <param name="allowSuffix">允许格式:.jpg.png.gif.tif.bmp</param> /// <param name="allowSuffix">允许格式:.jpg.png.gif.tif.bmp</param>
/// <param name="fileType">类型</param> /// <param name="fileType">类型</param>
/// <param name="isPublic">是否公开</param>
/// <returns></returns> /// <returns></returns>
private async Task<SysFile> HandleUploadFile(IFormFile file, string savePath, string allowSuffix = "", string fileType = "") private async Task<SysFile> HandleUploadFile(IFormFile file, string savePath, string allowSuffix = "", string fileType = "", bool isPublic = false)
{ {
if (file == null) throw Oops.Oh(ErrorCodeEnum.D8000); if (file == null) throw Oops.Oh(ErrorCodeEnum.D8000);
@ -354,7 +359,8 @@ public class SysFileService : IDynamicApiController, ITransient
SizeKb = sizeKb, SizeKb = sizeKb,
FilePath = path, FilePath = path,
FileMd5 = fileMd5, FileMd5 = fileMd5,
FileType = fileType FileType = fileType,
IsPublic = isPublic,
}; };
var finalName = newFile.Id + suffix; // 文件最终名称 var finalName = newFile.Id + suffix; // 文件最终名称

View File

@ -183,11 +183,12 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
* @param {number} id Id * @param {number} id Id
* @param {string} [fileName] * @param {string} [fileName]
* @param {string} [fileType] * @param {string} [fileType]
* @param {boolean} [isPublic] true
* @param {string} [url] Url * @param {string} [url] Url
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
apiSysFileFileGet: async (id: number, fileName?: string, fileType?: string, url?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => { apiSysFileFileGet: async (id: number, fileName?: string, fileType?: string, isPublic?: boolean, url?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined // verify required parameter 'id' is not null or undefined
if (id === null || id === undefined) { if (id === null || id === undefined) {
throw new RequiredError('id','Required parameter id was null or undefined when calling apiSysFileFileGet.'); throw new RequiredError('id','Required parameter id was null or undefined when calling apiSysFileFileGet.');
@ -220,6 +221,10 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
localVarQueryParameter['FileType'] = fileType; localVarQueryParameter['FileType'] = fileType;
} }
if (isPublic !== undefined) {
localVarQueryParameter['IsPublic'] = isPublic;
}
if (url !== undefined) { if (url !== undefined) {
localVarQueryParameter['Url'] = url; localVarQueryParameter['Url'] = url;
} }
@ -557,11 +562,12 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
* @summary 🔖 * @summary 🔖
* @param {Blob} [file] * @param {Blob} [file]
* @param {string} [fileType] * @param {string} [fileType]
* @param {boolean} [isPublic]
* @param {string} [path] * @param {string} [path]
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
apiSysFileUploadFilePostForm: async (file?: Blob, fileType?: string, path?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => { apiSysFileUploadFilePostForm: async (file?: Blob, fileType?: string, isPublic?: boolean, path?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/sysFile/uploadFile`; const localVarPath = `/api/sysFile/uploadFile`;
// use dummy base URL string because the URL constructor only accepts absolute URLs. // use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, 'https://example.com'); const localVarUrlObj = new URL(localVarPath, 'https://example.com');
@ -592,6 +598,10 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
localVarFormParams.append('FileType', fileType as any); localVarFormParams.append('FileType', fileType as any);
} }
if (isPublic !== undefined) {
localVarFormParams.append('IsPublic', isPublic as any);
}
if (path !== undefined) { if (path !== undefined) {
localVarFormParams.append('Path', path as any); localVarFormParams.append('Path', path as any);
} }
@ -776,12 +786,13 @@ export const SysFileApiFp = function(configuration?: Configuration) {
* @param {number} id Id * @param {number} id Id
* @param {string} [fileName] * @param {string} [fileName]
* @param {string} [fileType] * @param {string} [fileType]
* @param {boolean} [isPublic] true
* @param {string} [url] Url * @param {string} [url] Url
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
async apiSysFileFileGet(id: number, fileName?: string, fileType?: string, url?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> { async apiSysFileFileGet(id: number, fileName?: string, fileType?: string, isPublic?: boolean, url?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> {
const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileFileGet(id, fileName, fileType, url, options); const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileFileGet(id, fileName, fileType, isPublic, url, options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url}; const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs); return axios.request(axiosRequestArgs);
@ -879,12 +890,13 @@ export const SysFileApiFp = function(configuration?: Configuration) {
* @summary 🔖 * @summary 🔖
* @param {Blob} [file] * @param {Blob} [file]
* @param {string} [fileType] * @param {string} [fileType]
* @param {boolean} [isPublic]
* @param {string} [path] * @param {string} [path]
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, path?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> { async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, isPublic?: boolean, path?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> {
const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFilePostForm(file, fileType, path, options); const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFilePostForm(file, fileType, isPublic, path, options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url}; const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs); return axios.request(axiosRequestArgs);
@ -963,12 +975,13 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
* @param {number} id Id * @param {number} id Id
* @param {string} [fileName] * @param {string} [fileName]
* @param {string} [fileType] * @param {string} [fileType]
* @param {boolean} [isPublic] true
* @param {string} [url] Url * @param {string} [url] Url
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
async apiSysFileFileGet(id: number, fileName?: string, fileType?: string, url?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> { async apiSysFileFileGet(id: number, fileName?: string, fileType?: string, isPublic?: boolean, url?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> {
return SysFileApiFp(configuration).apiSysFileFileGet(id, fileName, fileType, url, options).then((request) => request(axios, basePath)); return SysFileApiFp(configuration).apiSysFileFileGet(id, fileName, fileType, isPublic, url, options).then((request) => request(axios, basePath));
}, },
/** /**
* *
@ -1038,12 +1051,13 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
* @summary 🔖 * @summary 🔖
* @param {Blob} [file] * @param {Blob} [file]
* @param {string} [fileType] * @param {string} [fileType]
* @param {boolean} [isPublic]
* @param {string} [path] * @param {string} [path]
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, path?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> { async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, isPublic?: boolean, path?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> {
return SysFileApiFp(configuration).apiSysFileUploadFilePostForm(file, fileType, path, options).then((request) => request(axios, basePath)); return SysFileApiFp(configuration).apiSysFileUploadFilePostForm(file, fileType, isPublic, path, options).then((request) => request(axios, basePath));
}, },
/** /**
* *
@ -1114,13 +1128,14 @@ export class SysFileApi extends BaseAPI {
* @param {number} id Id * @param {number} id Id
* @param {string} [fileName] * @param {string} [fileName]
* @param {string} [fileType] * @param {string} [fileType]
* @param {boolean} [isPublic] true
* @param {string} [url] Url * @param {string} [url] Url
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
* @memberof SysFileApi * @memberof SysFileApi
*/ */
public async apiSysFileFileGet(id: number, fileName?: string, fileType?: string, url?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> { public async apiSysFileFileGet(id: number, fileName?: string, fileType?: string, isPublic?: boolean, url?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> {
return SysFileApiFp(this.configuration).apiSysFileFileGet(id, fileName, fileType, url, options).then((request) => request(this.axios, this.basePath)); return SysFileApiFp(this.configuration).apiSysFileFileGet(id, fileName, fileType, isPublic, url, options).then((request) => request(this.axios, this.basePath));
} }
/** /**
* *
@ -1196,13 +1211,14 @@ export class SysFileApi extends BaseAPI {
* @summary 🔖 * @summary 🔖
* @param {Blob} [file] * @param {Blob} [file]
* @param {string} [fileType] * @param {string} [fileType]
* @param {boolean} [isPublic]
* @param {string} [path] * @param {string} [path]
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
* @memberof SysFileApi * @memberof SysFileApi
*/ */
public async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, path?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> { public async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, isPublic?: boolean, path?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> {
return SysFileApiFp(this.configuration).apiSysFileUploadFilePostForm(file, fileType, path, options).then((request) => request(this.axios, this.basePath)); return SysFileApiFp(this.configuration).apiSysFileUploadFilePostForm(file, fileType, isPublic, path, options).then((request) => request(this.axios, this.basePath));
} }
/** /**
* *

View File

@ -44,6 +44,14 @@ export interface FileInput {
*/ */
fileType?: string | null; fileType?: string | null;
/**
* true
*
* @type {boolean}
* @memberof FileInput
*/
isPublic?: boolean;
/** /**
* Url * Url
* *

View File

@ -76,6 +76,14 @@ export interface FileOutput {
*/ */
fileType?: string | null; fileType?: string | null;
/**
* true
*
* @type {boolean}
* @memberof FileOutput
*/
isPublic?: boolean;
/** /**
* *
* *

View File

@ -24,6 +24,14 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
<el-form-item label="是否公开">
<el-radio-group v-model="state.ruleForm.isPublic">
<el-radio :value="false"></el-radio>
<el-radio :value="true"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<template #footer> <template #footer>

View File

@ -45,6 +45,10 @@
<template #row_suffix="{ row }"> <template #row_suffix="{ row }">
<el-tag round>{{ row.suffix }}</el-tag> <el-tag round>{{ row.suffix }}</el-tag>
</template> </template>
<template #row_isPublic="{ row }">
<el-tag v-if="row.isPublic === true" type="success"></el-tag>
<el-tag v-else type="danger"></el-tag>
</template>
<template #row_url="{ row }"> <template #row_url="{ row }">
<el-image <el-image
style="width: 60px; height: 60px" style="width: 60px; height: 60px"
@ -87,6 +91,12 @@
<el-option label="相关文件" value="相关文件" /> <el-option label="相关文件" value="相关文件" />
<el-option label="归档文件" value="归档文件" /> <el-option label="归档文件" value="归档文件" />
</el-select> </el-select>
是否公开
<el-radio-group v-model="state.isPublic">
<el-radio :value="false"></el-radio>
<el-radio :value="true"></el-radio>
</el-radio-group>
<el-upload ref="uploadRef" drag :auto-upload="false" :limit="1" :file-list="state.fileList" action="" :on-change="handleChange" accept=".jpg,.png,.bmp,.gif,.txt,.pdf,.xlsx,.docx"> <el-upload ref="uploadRef" drag :auto-upload="false" :limit="1" :file-list="state.fileList" action="" :on-change="handleChange" accept=".jpg,.png,.bmp,.gif,.txt,.pdf,.xlsx,.docx">
<el-icon class="el-icon--upload"> <el-icon class="el-icon--upload">
@ -166,6 +176,7 @@ const state = reactive({
pdfUrl: '', pdfUrl: '',
fileName: '', fileName: '',
fileType: '', fileType: '',
isPublic:false,
previewList: [] as string[], previewList: [] as string[],
}); });
@ -185,6 +196,7 @@ const options = useVxeTable<SysFile>(
{ field: 'url', title: '预览', minWidth: 100, slots: { default: 'row_url' } }, { field: 'url', title: '预览', minWidth: 100, slots: { default: 'row_url' } },
{ field: 'bucketName', title: '存储位置', minWidth: 180, showOverflow: 'tooltip' }, { field: 'bucketName', title: '存储位置', minWidth: 180, showOverflow: 'tooltip' },
{ field: 'id', title: '存储标识', minWidth: 120, showOverflow: 'tooltip' }, { field: 'id', title: '存储标识', minWidth: 120, showOverflow: 'tooltip' },
{ field: 'isPublic', title: '是否公开', minWidth: 140, showOverflow: 'tooltip', slots: { default: 'row_isPublic' } },
{ field: 'fileType', title: '文件类型', minWidth: 140, showOverflow: 'tooltip' }, { field: 'fileType', title: '文件类型', minWidth: 140, showOverflow: 'tooltip' },
{ field: 'relationName', title: '关联对象名称', minWidth: 150, showOverflow: 'tooltip' }, { field: 'relationName', title: '关联对象名称', minWidth: 150, showOverflow: 'tooltip' },
{ field: 'relationId', title: '关联对象ID', minWidth: 150, showOverflow: 'tooltip' }, { field: 'relationId', title: '关联对象ID', minWidth: 150, showOverflow: 'tooltip' },
@ -238,6 +250,7 @@ const resetQuery = async () => {
const showUpload = () => { const showUpload = () => {
state.fileList = []; state.fileList = [];
state.visible = true; state.visible = true;
state.isPublic=false;
}; };
// onChanne // onChanne
@ -248,7 +261,7 @@ const handleChange = (file: any, fileList: []) => {
// //
const handleUpload = async () => { const handleUpload = async () => {
if (state.fileList.length < 1) return; if (state.fileList.length < 1) return;
await getAPI(SysFileApi).apiSysFileUploadFilePostForm(state.fileList[0].raw, state.fileType, undefined); await getAPI(SysFileApi).apiSysFileUploadFilePostForm(state.fileList[0].raw, state.fileType, state.isPublic,undefined);
handleQuery(); handleQuery();
ElMessage.success('上传成功'); ElMessage.success('上传成功');
state.visible = false; state.visible = false;