Просмотр исходного кода

😎1、禁止文件上传时前端指定路径 2、更新前端请求文件

zuohuaijun 10 месяцев назад
Родитель
Сommit
892e24dec0

+ 13 - 20
Admin.NET/Admin.NET.Core/Entity/SysFile.cs

@@ -77,35 +77,28 @@ public partial class SysFile : EntityBaseTenantOrg
     public string? FileMd5 { get; set; }
 
     /// <summary>
-    /// 关联对象名称(如子对象)
+    /// 文件类别
     /// </summary>
-    [SugarColumn(ColumnDescription = "关联对象名称", Length = 128)]
+    [SugarColumn(ColumnDescription = "文件类别", Length = 128)]
     [MaxLength(128)]
-    public string? RelationName { get; set; }
+    public virtual string? FileType { get; set; }
 
     /// <summary>
-    /// 关联对象Id
+    /// 文件别名
     /// </summary>
-    [SugarColumn(ColumnDescription = "关联对象Id")]
-    public long? RelationId { get; set; }
-
-    /// <summary>
-    /// 所属Id(如主对象)
-    /// </summary>
-    [SugarColumn(ColumnDescription = "所属Id")]
-    public long? BelongId { get; set; }
-
-    /// <summary>
-    /// 文件类别
-    /// </summary>
-    [SugarColumn(ColumnDescription = "文件类别", Length = 128)]
+    [SugarColumn(ColumnDescription = "文件别名", Length = 128)]
     [MaxLength(128)]
-    public string? FileType { get; set; }
+    public string? FileAlias { get; set; }
 
     /// <summary>
     /// 是否公开
-    /// 若为true则所有人都可以查看,默认只有自己或有权限的可以查看
     /// </summary>
     [SugarColumn(ColumnDescription = "是否公开")]
-    public bool IsPublic { get; set; } = false;
+    public virtual bool IsPublic { get; set; } = false;
+
+    /// <summary>
+    /// 业务数据Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "业务数据Id")]
+    public long? DataId { get; set; }
 }

+ 6 - 0
Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs

@@ -589,6 +589,12 @@ public enum ErrorCodeEnum
     [ErrorCodeItemMetadata("文件已存在")]
     D8004,
 
+    /// <summary>
+    /// 无效的文件名
+    /// </summary>
+    [ErrorCodeItemMetadata("无效的文件名")]
+    D8005,
+
     /// <summary>
     /// 已存在同名或同编码参数配置
     /// </summary>

+ 0 - 23
Admin.NET/Admin.NET.Core/Service/File/Dto/FileInput.cs

@@ -37,14 +37,6 @@ public class PageFileInput : BasePageInput
     public DateTime? EndTime { get; set; }
 }
 
-public class FileInput : BaseIdInput
-{
-}
-
-public class DeleteFileInput : BaseIdInput
-{
-}
-
 /// <summary>
 /// 上传文件
 /// </summary>
@@ -66,16 +58,6 @@ public class UploadFileInput
     /// </summary>
     public bool IsPublic { get; set; } = false;
 
-    /// <summary>
-    /// 文件路径
-    /// </summary>
-    public string Path { get; set; }
-
-    /// <summary>
-    /// 文件保存路径
-    /// </summary>
-    public string SavePath { get; set; }
-
     /// <summary>
     /// 允许格式:.jpeg.jpg.png.bmp.gif.tif
     /// </summary>
@@ -101,11 +83,6 @@ public class UploadFileFromBase64Input
     /// 文件类型( "image/jpeg",)
     /// </summary>
     public string ContentType { get; set; }
-
-    /// <summary>
-    /// 保存路径
-    /// </summary>
-    public string Path { get; set; }
 }
 
 /// <summary>

+ 41 - 38
Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs

@@ -5,6 +5,8 @@
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
 using Aliyun.OSS.Util;
+using Furion.AspNetCore;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
 
 namespace Admin.NET.Core.Service;
 
@@ -167,7 +169,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete"), HttpPost]
     [DisplayName("删除文件")]
-    public async Task DeleteFile(DeleteFileInput input)
+    public async Task DeleteFile(BaseIdInput input)
     {
         var file = await _sysFileRep.GetByIdAsync(input.Id) ?? throw Oops.Oh($"文件不存在");
         await _sysFileRep.DeleteAsync(file);
@@ -207,7 +209,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="ids"></param>
     /// <returns></returns>
     [DisplayName("根据文件Id集合获取文件")]
-    public async Task<List<SysFile>> GetFileByIds([FromQuery] List<long> ids)
+    public async Task<List<SysFile>> GetFileByIds([FromQuery][FlexibleArray<long>] List<long> ids)
     {
         return await _sysFileRep.AsQueryable().Where(u => ids.Contains(u.Id)).ToListAsync();
     }
@@ -231,11 +233,14 @@ public class SysFileService : IDynamicApiController, ITransient
     /// 上传文件 🔖
     /// </summary>
     /// <param name="input"></param>
+    /// <param name="targetPath">存储目标路径</param>
     /// <returns></returns>
     [DisplayName("上传文件")]
-    public async Task<SysFile> UploadFile([FromForm] UploadFileInput input)
+    public async Task<SysFile> UploadFile([FromForm] UploadFileInput input, [BindNever] string targetPath = "")
     {
-        if (input.File == null) throw Oops.Oh(ErrorCodeEnum.D8000);
+        if (input.File == null || input.File.Length <= 0) throw Oops.Oh(ErrorCodeEnum.D8000);
+
+        if (input.File.FileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) throw Oops.Oh(ErrorCodeEnum.D8005);
 
         // 判断是否重复上传的文件
         var sizeKb = input.File.Length / 1024; // 大小KB
@@ -277,7 +282,7 @@ public class SysFileService : IDynamicApiController, ITransient
         //if (!VerifyFileExtensionName.IsSameType(file.OpenReadStream(), suffix)) throw Oops.Oh(ErrorCodeEnum.D8001);
 
         // 文件存储位置
-        var path = string.IsNullOrWhiteSpace(input.SavePath) ? _uploadOptions.Path : input.SavePath;
+        var path = string.IsNullOrWhiteSpace(targetPath) ? _uploadOptions.Path : targetPath;
         path = path.ParseToDateTimeForRep();
 
         var newFile = input.Adapt<SysFile>();
@@ -304,7 +309,7 @@ public class SysFileService : IDynamicApiController, ITransient
     [DisplayName("上传头像")]
     public async Task<SysFile> UploadAvatar([Required] IFormFile file)
     {
-        var sysFile = await UploadFile(new UploadFileInput { File = file, AllowSuffix = _imageType, SavePath = "upload/avatar" });
+        var sysFile = await UploadFile(new UploadFileInput { File = file, AllowSuffix = _imageType }, "upload/avatar");
 
         var sysUserRep = _sysFileRep.ChangeRepository<SqlSugarRepository<SysUser>>();
         var user = await sysUserRep.GetByIdAsync(_userManager.UserId);
@@ -313,7 +318,7 @@ public class SysFileService : IDynamicApiController, ITransient
         if (!string.IsNullOrWhiteSpace(user.Avatar))
         {
             var fileId = Path.GetFileNameWithoutExtension(user.Avatar);
-            await DeleteFile(new DeleteFileInput { Id = long.Parse(fileId) });
+            await DeleteFile(new BaseIdInput { Id = long.Parse(fileId) });
         }
 
         return sysFile;
@@ -327,7 +332,7 @@ public class SysFileService : IDynamicApiController, ITransient
     [DisplayName("上传电子签名")]
     public async Task<SysFile> UploadSignature([Required] IFormFile file)
     {
-        var sysFile = await UploadFile(new UploadFileInput { File = file, AllowSuffix = _imageType, SavePath = "upload/signature" });
+        var sysFile = await UploadFile(new UploadFileInput { File = file, AllowSuffix = _imageType }, "upload/signature");
 
         var sysUserRep = _sysFileRep.ChangeRepository<SqlSugarRepository<SysUser>>();
         var user = await sysUserRep.GetByIdAsync(_userManager.UserId);
@@ -335,51 +340,49 @@ public class SysFileService : IDynamicApiController, ITransient
         if (!string.IsNullOrWhiteSpace(user.Signature) && user.Signature.EndsWith(".png"))
         {
             var fileId = Path.GetFileNameWithoutExtension(user.Signature);
-            await DeleteFile(new DeleteFileInput { Id = long.Parse(fileId) });
+            await DeleteFile(new BaseIdInput { Id = long.Parse(fileId) });
         }
         await sysUserRep.UpdateAsync(u => new SysUser() { Signature = sysFile.Url }, u => u.Id == user.Id);
         return sysFile;
     }
 
+    #region 统一实体与文件关联时,业务应用实体只需要定义一个SysFile集合导航属性,业务增加和更新、删除分别调用即可
+
     /// <summary>
-    /// 修改附件关联对象 🔖
+    /// 更新文件的业务数据Id
     /// </summary>
-    /// <param name="ids"></param>
-    /// <param name="relationName"></param>
-    /// <param name="relationId"></param>
-    /// <param name="belongId"></param>
+    /// <param name="dataId"></param>
+    /// <param name="sysFiles"></param>
     /// <returns></returns>
     [NonAction]
-    public async Task<int> UpdateRelation(List<long> ids, string relationName, long relationId, long belongId = 0)
+    public async Task UpdateFileByDataId(long dataId, List<SysFile> sysFiles)
     {
-        if (ids == null || ids.Count == 0)
-            return 0;
-        return await _sysFileRep.AsUpdateable()
-            .SetColumns(u => u.RelationName == relationName)
-            .SetColumns(u => u.RelationId == relationId)
-            .SetColumns(u => u.BelongId == belongId)
-            .Where(u => ids.Contains(u.Id))
-            .ExecuteCommandAsync();
+        var newFileIds = sysFiles.Select(u => u.Id).ToList();
+
+        // 求文件Id差集并删除(无效文件)
+        var tmpFiles = await _sysFileRep.GetListAsync(u => u.DataId == dataId);
+        var tmpFileIds = tmpFiles.Select(u => u.Id).ToList();
+        var deleteFileIds = tmpFileIds.Except(newFileIds);
+        foreach (var fileId in deleteFileIds)
+            await DeleteFile(new BaseIdInput() { Id = fileId });
+
+        await _sysFileRep.UpdateAsync(u => new SysFile() { DataId = dataId }, u => newFileIds.Contains(u.Id));
     }
 
     /// <summary>
-    /// 根据关联查询附件 🔖
+    /// 删除业务数据对应的文件
     /// </summary>
-    /// <param name="input"></param>
+    /// <param name="dataId"></param>
     /// <returns></returns>
-    /// <exception cref="ArgumentNullException"></exception>
-    [DisplayName("根据关联查询附件")]
-    public async Task<List<SysFile>> GetRelationFiles([FromQuery] RelationQueryInput input)
+    [NonAction]
+    public async Task DeteleFileByDataId(long dataId)
     {
-        return await _sysFileRep.AsQueryable()
-            .WhereIF(input.RelationId is > 0, u => u.RelationId == input.RelationId)
-            .WhereIF(input.BelongId is > 0, u => u.BelongId == input.BelongId.Value)
-            .WhereIF(!string.IsNullOrWhiteSpace(input.RelationName), u => u.RelationName == input.RelationName)
-            .WhereIF(!string.IsNullOrWhiteSpace(input.FileTypes), u => input.GetFileTypeBS().Contains(u.FileType))
-            .Select(u => new SysFile
-            {
-                Url = SqlFunc.MergeString("/api/sysFile/Preview/", u.Id.ToString()),
-            }, true)
-           .ToListAsync();
+        // 删除冗余无效的物理文件
+        var tmpFiles = await _sysFileRep.GetListAsync(u => u.DataId == dataId);
+        foreach (var file in tmpFiles)
+            await _customFileProvider.DeleteFileAsync(file);
+        await _sysFileRep.AsDeleteable().Where(u => u.DataId == dataId).ExecuteCommandAsync();
     }
+
+    #endregion 统一实体与文件关联时,业务应用实体只需要定义一个SysFile集合导航属性,业务增加和更新、删除分别调用即可
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs

@@ -149,7 +149,7 @@ public class SysWxOpenService : IDynamicApiController, ITransient
         if (wxUser == null)
             throw Oops.Oh("未找到用户上传失败");
 
-        var res = await _sysFileService.UploadFile(new UploadFileInput { File = input.File, FileType = input.FileType, Path = input.Path });
+        var res = await _sysFileService.UploadFile(new UploadFileInput { File = input.File, FileType = input.FileType }, "upload/wechatAvatar");
         wxUser.Avatar = res.Url;
         await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync();
 

+ 1 - 1
Admin.NET/Admin.NET.Core/Utils/CommonUtil.cs

@@ -284,7 +284,7 @@ public static class CommonUtil
         var res = await importer.Import<T>(filePath);
 
         // 删除文件
-        _ = SysFileService.DeleteFile(new DeleteFileInput { Id = newFile.Id });
+        _ = SysFileService.DeleteFile(new BaseIdInput { Id = newFile.Id });
 
         if (res == null)
             throw Oops.Oh("导入数据为空");

+ 16 - 139
Web/src/api-services/apis/sys-file-api.ts

@@ -23,7 +23,7 @@ import { AdminResultListTreeNode } from '../models';
 import { AdminResultSqlSugarPagedListSysFile } from '../models';
 import { AdminResultString } from '../models';
 import { AdminResultSysFile } from '../models';
-import { DeleteFileInput } from '../models';
+import { BaseIdInput } from '../models';
 import { PageFileInput } from '../models';
 import { SysFile } from '../models';
 import { UploadFileFromBase64Input } from '../models';
@@ -36,11 +36,11 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
         /**
          * 
          * @summary 删除文件 🔖
-         * @param {DeleteFileInput} [body] 
+         * @param {BaseIdInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysFileDeletePost: async (body?: DeleteFileInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysFileDeletePost: async (body?: BaseIdInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/api/sysFile/delete`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
@@ -413,69 +413,6 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
                 options: localVarRequestOptions,
             };
         },
-        /**
-         * 
-         * @summary 根据关联查询附件 🔖
-         * @param {string} [relationName] 关联对象名称
-         * @param {number} [relationId] 关联对象Id
-         * @param {string} [fileTypes] 文件类型:多个以\&quot;,\&quot;分割
-         * @param {number} [belongId] 所属Id
-         * @param {*} [options] Override http request option.
-         * @throws {RequiredError}
-         */
-        apiSysFileRelationFilesGet: async (relationName?: string, relationId?: number, fileTypes?: string, belongId?: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            const localVarPath = `/api/sysFile/relationFiles`;
-            // use dummy base URL string because the URL constructor only accepts absolute URLs.
-            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
-            let baseOptions;
-            if (configuration) {
-                baseOptions = configuration.baseOptions;
-            }
-            const localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
-            const localVarHeaderParameter = {} as any;
-            const localVarQueryParameter = {} as any;
-
-            // authentication Bearer required
-            // http bearer authentication required
-            if (configuration && configuration.accessToken) {
-                const accessToken = typeof configuration.accessToken === 'function'
-                    ? await configuration.accessToken()
-                    : await configuration.accessToken;
-                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
-            }
-
-            if (relationName !== undefined) {
-                localVarQueryParameter['RelationName'] = relationName;
-            }
-
-            if (relationId !== undefined) {
-                localVarQueryParameter['RelationId'] = relationId;
-            }
-
-            if (fileTypes !== undefined) {
-                localVarQueryParameter['FileTypes'] = fileTypes;
-            }
-
-            if (belongId !== undefined) {
-                localVarQueryParameter['BelongId'] = belongId;
-            }
-
-            const query = new URLSearchParams(localVarUrlObj.search);
-            for (const key in localVarQueryParameter) {
-                query.set(key, localVarQueryParameter[key]);
-            }
-            for (const key in options.params) {
-                query.set(key, options.params[key]);
-            }
-            localVarUrlObj.search = (new URLSearchParams(query)).toString();
-            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
-            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
-
-            return {
-                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
-                options: localVarRequestOptions,
-            };
-        },
         /**
          * 
          * @summary 更新文件 🔖
@@ -630,13 +567,11 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
          * @param {Blob} [file] 
          * @param {string} [fileType] 
          * @param {boolean} [isPublic] 
-         * @param {string} [path] 
-         * @param {string} [savePath] 
          * @param {string} [allowSuffix] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysFileUploadFilePostForm: async (file?: Blob, fileType?: string, isPublic?: boolean, path?: string, savePath?: string, allowSuffix?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysFileUploadFilePostForm: async (file?: Blob, fileType?: string, isPublic?: boolean, allowSuffix?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/api/sysFile/uploadFile`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
@@ -671,14 +606,6 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
                 localVarFormParams.append('IsPublic', isPublic as any);
             }
 
-            if (path !== undefined) { 
-                localVarFormParams.append('Path', path as any);
-            }
-
-            if (savePath !== undefined) { 
-                localVarFormParams.append('SavePath', savePath as any);
-            }
-
             if (allowSuffix !== undefined) { 
                 localVarFormParams.append('AllowSuffix', allowSuffix as any);
             }
@@ -818,11 +745,11 @@ export const SysFileApiFp = function(configuration?: Configuration) {
         /**
          * 
          * @summary 删除文件 🔖
-         * @param {DeleteFileInput} [body] 
+         * @param {BaseIdInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileDeletePost(body?: DeleteFileInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+        async apiSysFileDeletePost(body?: BaseIdInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
             const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileDeletePost(body, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@@ -926,23 +853,6 @@ export const SysFileApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
-        /**
-         * 
-         * @summary 根据关联查询附件 🔖
-         * @param {string} [relationName] 关联对象名称
-         * @param {number} [relationId] 关联对象Id
-         * @param {string} [fileTypes] 文件类型:多个以\&quot;,\&quot;分割
-         * @param {number} [belongId] 所属Id
-         * @param {*} [options] Override http request option.
-         * @throws {RequiredError}
-         */
-        async apiSysFileRelationFilesGet(relationName?: string, relationId?: number, fileTypes?: string, belongId?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListSysFile>>> {
-            const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileRelationFilesGet(relationName, relationId, fileTypes, belongId, options);
-            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
-                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
-                return axios.request(axiosRequestArgs);
-            };
-        },
         /**
          * 
          * @summary 更新文件 🔖
@@ -991,14 +901,12 @@ export const SysFileApiFp = function(configuration?: Configuration) {
          * @param {Blob} [file] 
          * @param {string} [fileType] 
          * @param {boolean} [isPublic] 
-         * @param {string} [path] 
-         * @param {string} [savePath] 
          * @param {string} [allowSuffix] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, isPublic?: boolean, path?: string, savePath?: string, allowSuffix?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> {
-            const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFilePostForm(file, fileType, isPublic, path, savePath, allowSuffix, options);
+        async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, isPublic?: boolean, allowSuffix?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> {
+            const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFilePostForm(file, fileType, isPublic, allowSuffix, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -1044,11 +952,11 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
         /**
          * 
          * @summary 删除文件 🔖
-         * @param {DeleteFileInput} [body] 
+         * @param {BaseIdInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileDeletePost(body?: DeleteFileInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+        async apiSysFileDeletePost(body?: BaseIdInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
             return SysFileApiFp(configuration).apiSysFileDeletePost(body, options).then((request) => request(axios, basePath));
         },
         /**
@@ -1120,19 +1028,6 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
         async apiSysFilePreviewIdGet(id: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultIActionResult>> {
             return SysFileApiFp(configuration).apiSysFilePreviewIdGet(id, options).then((request) => request(axios, basePath));
         },
-        /**
-         * 
-         * @summary 根据关联查询附件 🔖
-         * @param {string} [relationName] 关联对象名称
-         * @param {number} [relationId] 关联对象Id
-         * @param {string} [fileTypes] 文件类型:多个以\&quot;,\&quot;分割
-         * @param {number} [belongId] 所属Id
-         * @param {*} [options] Override http request option.
-         * @throws {RequiredError}
-         */
-        async apiSysFileRelationFilesGet(relationName?: string, relationId?: number, fileTypes?: string, belongId?: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListSysFile>> {
-            return SysFileApiFp(configuration).apiSysFileRelationFilesGet(relationName, relationId, fileTypes, belongId, options).then((request) => request(axios, basePath));
-        },
         /**
          * 
          * @summary 更新文件 🔖
@@ -1169,14 +1064,12 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
          * @param {Blob} [file] 
          * @param {string} [fileType] 
          * @param {boolean} [isPublic] 
-         * @param {string} [path] 
-         * @param {string} [savePath] 
          * @param {string} [allowSuffix] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, isPublic?: boolean, path?: string, savePath?: string, allowSuffix?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> {
-            return SysFileApiFp(configuration).apiSysFileUploadFilePostForm(file, fileType, isPublic, path, savePath, allowSuffix, options).then((request) => request(axios, basePath));
+        async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, isPublic?: boolean, allowSuffix?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> {
+            return SysFileApiFp(configuration).apiSysFileUploadFilePostForm(file, fileType, isPublic, allowSuffix, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -1211,12 +1104,12 @@ export class SysFileApi extends BaseAPI {
     /**
      * 
      * @summary 删除文件 🔖
-     * @param {DeleteFileInput} [body] 
+     * @param {BaseIdInput} [body] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysFileApi
      */
-    public async apiSysFileDeletePost(body?: DeleteFileInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+    public async apiSysFileDeletePost(body?: BaseIdInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
         return SysFileApiFp(this.configuration).apiSysFileDeletePost(body, options).then((request) => request(this.axios, this.basePath));
     }
     /**
@@ -1295,20 +1188,6 @@ export class SysFileApi extends BaseAPI {
     public async apiSysFilePreviewIdGet(id: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultIActionResult>> {
         return SysFileApiFp(this.configuration).apiSysFilePreviewIdGet(id, options).then((request) => request(this.axios, this.basePath));
     }
-    /**
-     * 
-     * @summary 根据关联查询附件 🔖
-     * @param {string} [relationName] 关联对象名称
-     * @param {number} [relationId] 关联对象Id
-     * @param {string} [fileTypes] 文件类型:多个以\&quot;,\&quot;分割
-     * @param {number} [belongId] 所属Id
-     * @param {*} [options] Override http request option.
-     * @throws {RequiredError}
-     * @memberof SysFileApi
-     */
-    public async apiSysFileRelationFilesGet(relationName?: string, relationId?: number, fileTypes?: string, belongId?: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListSysFile>> {
-        return SysFileApiFp(this.configuration).apiSysFileRelationFilesGet(relationName, relationId, fileTypes, belongId, options).then((request) => request(this.axios, this.basePath));
-    }
     /**
      * 
      * @summary 更新文件 🔖
@@ -1348,15 +1227,13 @@ export class SysFileApi extends BaseAPI {
      * @param {Blob} [file] 
      * @param {string} [fileType] 
      * @param {boolean} [isPublic] 
-     * @param {string} [path] 
-     * @param {string} [savePath] 
      * @param {string} [allowSuffix] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysFileApi
      */
-    public async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, isPublic?: boolean, path?: string, savePath?: string, allowSuffix?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> {
-        return SysFileApiFp(this.configuration).apiSysFileUploadFilePostForm(file, fileType, isPublic, path, savePath, allowSuffix, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, isPublic?: boolean, allowSuffix?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> {
+        return SysFileApiFp(this.configuration).apiSysFileUploadFilePostForm(file, fileType, isPublic, allowSuffix, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 

+ 89 - 53
Web/src/api-services/apis/sys-sms-api.ts

@@ -28,17 +28,23 @@ export const SysSmsApiAxiosParamCreator = function (configuration?: Configuratio
         /**
          * 
          * @summary 阿里云发送短信 📨
-         * @param {string} phoneNumber 
+         * @param {string} phoneNumber 手机号
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysSmsAliyunSendSmsPhoneNumberPost: async (phoneNumber: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysSmsAliyunSendSmsPhoneNumberTemplateIdPost: async (phoneNumber: string, templateId: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'phoneNumber' is not null or undefined
             if (phoneNumber === null || phoneNumber === undefined) {
-                throw new RequiredError('phoneNumber','Required parameter phoneNumber was null or undefined when calling apiSysSmsAliyunSendSmsPhoneNumberPost.');
+                throw new RequiredError('phoneNumber','Required parameter phoneNumber was null or undefined when calling apiSysSmsAliyunSendSmsPhoneNumberTemplateIdPost.');
+            }
+            // verify required parameter 'templateId' is not null or undefined
+            if (templateId === null || templateId === undefined) {
+                throw new RequiredError('templateId','Required parameter templateId was null or undefined when calling apiSysSmsAliyunSendSmsPhoneNumberTemplateIdPost.');
             }
-            const localVarPath = `/api/sysSms/aliyunSendSms/{phoneNumber}`
-                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)));
+            const localVarPath = `/api/sysSms/aliyunSendSms/{phoneNumber}/{templateId}`
+                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)))
+                .replace(`{${"templateId"}}`, encodeURIComponent(String(templateId)));
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
             let baseOptions;
@@ -77,22 +83,28 @@ export const SysSmsApiAxiosParamCreator = function (configuration?: Configuratio
         /**
          * 
          * @summary 发送短信模板
-         * @param {any} body 
-         * @param {string} phoneNumber 
+         * @param {any} body 短信内容
+         * @param {string} phoneNumber 手机号
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysSmsAliyunSendSmsTemplatePhoneNumberPost: async (body: any, phoneNumber: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysSmsAliyunSendSmsTemplatePhoneNumberTemplateIdPost: async (body: any, phoneNumber: string, templateId: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'body' is not null or undefined
             if (body === null || body === undefined) {
-                throw new RequiredError('body','Required parameter body was null or undefined when calling apiSysSmsAliyunSendSmsTemplatePhoneNumberPost.');
+                throw new RequiredError('body','Required parameter body was null or undefined when calling apiSysSmsAliyunSendSmsTemplatePhoneNumberTemplateIdPost.');
             }
             // verify required parameter 'phoneNumber' is not null or undefined
             if (phoneNumber === null || phoneNumber === undefined) {
-                throw new RequiredError('phoneNumber','Required parameter phoneNumber was null or undefined when calling apiSysSmsAliyunSendSmsTemplatePhoneNumberPost.');
+                throw new RequiredError('phoneNumber','Required parameter phoneNumber was null or undefined when calling apiSysSmsAliyunSendSmsTemplatePhoneNumberTemplateIdPost.');
             }
-            const localVarPath = `/api/sysSms/aliyunSendSmsTemplate/{phoneNumber}`
-                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)));
+            // verify required parameter 'templateId' is not null or undefined
+            if (templateId === null || templateId === undefined) {
+                throw new RequiredError('templateId','Required parameter templateId was null or undefined when calling apiSysSmsAliyunSendSmsTemplatePhoneNumberTemplateIdPost.');
+            }
+            const localVarPath = `/api/sysSms/aliyunSendSmsTemplate/{phoneNumber}/{templateId}`
+                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)))
+                .replace(`{${"templateId"}}`, encodeURIComponent(String(templateId)));
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
             let baseOptions;
@@ -136,16 +148,22 @@ export const SysSmsApiAxiosParamCreator = function (configuration?: Configuratio
          * 
          * @summary 发送短信 📨
          * @param {string} phoneNumber 
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysSmsSendSmsPhoneNumberPost: async (phoneNumber: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysSmsSendSmsPhoneNumberTemplateIdPost: async (phoneNumber: string, templateId: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'phoneNumber' is not null or undefined
             if (phoneNumber === null || phoneNumber === undefined) {
-                throw new RequiredError('phoneNumber','Required parameter phoneNumber was null or undefined when calling apiSysSmsSendSmsPhoneNumberPost.');
+                throw new RequiredError('phoneNumber','Required parameter phoneNumber was null or undefined when calling apiSysSmsSendSmsPhoneNumberTemplateIdPost.');
+            }
+            // verify required parameter 'templateId' is not null or undefined
+            if (templateId === null || templateId === undefined) {
+                throw new RequiredError('templateId','Required parameter templateId was null or undefined when calling apiSysSmsSendSmsPhoneNumberTemplateIdPost.');
             }
-            const localVarPath = `/api/sysSms/sendSms/{phoneNumber}`
-                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)));
+            const localVarPath = `/api/sysSms/sendSms/{phoneNumber}/{templateId}`
+                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)))
+                .replace(`{${"templateId"}}`, encodeURIComponent(String(templateId)));
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
             let baseOptions;
@@ -185,16 +203,22 @@ export const SysSmsApiAxiosParamCreator = function (configuration?: Configuratio
          * 
          * @summary 腾讯云发送短信 📨
          * @param {string} phoneNumber 
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysSmsTencentSendSmsPhoneNumberPost: async (phoneNumber: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysSmsTencentSendSmsPhoneNumberTemplateIdPost: async (phoneNumber: string, templateId: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             // verify required parameter 'phoneNumber' is not null or undefined
             if (phoneNumber === null || phoneNumber === undefined) {
-                throw new RequiredError('phoneNumber','Required parameter phoneNumber was null or undefined when calling apiSysSmsTencentSendSmsPhoneNumberPost.');
+                throw new RequiredError('phoneNumber','Required parameter phoneNumber was null or undefined when calling apiSysSmsTencentSendSmsPhoneNumberTemplateIdPost.');
+            }
+            // verify required parameter 'templateId' is not null or undefined
+            if (templateId === null || templateId === undefined) {
+                throw new RequiredError('templateId','Required parameter templateId was null or undefined when calling apiSysSmsTencentSendSmsPhoneNumberTemplateIdPost.');
             }
-            const localVarPath = `/api/sysSms/tencentSendSms/{phoneNumber}`
-                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)));
+            const localVarPath = `/api/sysSms/tencentSendSms/{phoneNumber}/{templateId}`
+                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)))
+                .replace(`{${"templateId"}}`, encodeURIComponent(String(templateId)));
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
             let baseOptions;
@@ -290,12 +314,13 @@ export const SysSmsApiFp = function(configuration?: Configuration) {
         /**
          * 
          * @summary 阿里云发送短信 📨
-         * @param {string} phoneNumber 
+         * @param {string} phoneNumber 手机号
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
-            const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber, options);
+        async apiSysSmsAliyunSendSmsPhoneNumberTemplateIdPost(phoneNumber: string, templateId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsAliyunSendSmsPhoneNumberTemplateIdPost(phoneNumber, templateId, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -304,13 +329,14 @@ export const SysSmsApiFp = function(configuration?: Configuration) {
         /**
          * 
          * @summary 发送短信模板
-         * @param {any} body 
-         * @param {string} phoneNumber 
+         * @param {any} body 短信内容
+         * @param {string} phoneNumber 手机号
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysSmsAliyunSendSmsTemplatePhoneNumberPost(body: any, phoneNumber: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
-            const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsAliyunSendSmsTemplatePhoneNumberPost(body, phoneNumber, options);
+        async apiSysSmsAliyunSendSmsTemplatePhoneNumberTemplateIdPost(body: any, phoneNumber: string, templateId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsAliyunSendSmsTemplatePhoneNumberTemplateIdPost(body, phoneNumber, templateId, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -320,11 +346,12 @@ export const SysSmsApiFp = function(configuration?: Configuration) {
          * 
          * @summary 发送短信 📨
          * @param {string} phoneNumber 
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysSmsSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
-            const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsSendSmsPhoneNumberPost(phoneNumber, options);
+        async apiSysSmsSendSmsPhoneNumberTemplateIdPost(phoneNumber: string, templateId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsSendSmsPhoneNumberTemplateIdPost(phoneNumber, templateId, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -334,11 +361,12 @@ export const SysSmsApiFp = function(configuration?: Configuration) {
          * 
          * @summary 腾讯云发送短信 📨
          * @param {string} phoneNumber 
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
-            const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber, options);
+        async apiSysSmsTencentSendSmsPhoneNumberTemplateIdPost(phoneNumber: string, templateId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await SysSmsApiAxiosParamCreator(configuration).apiSysSmsTencentSendSmsPhoneNumberTemplateIdPost(phoneNumber, templateId, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -370,43 +398,47 @@ export const SysSmsApiFactory = function (configuration?: Configuration, basePat
         /**
          * 
          * @summary 阿里云发送短信 📨
-         * @param {string} phoneNumber 
+         * @param {string} phoneNumber 手机号
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
-            return SysSmsApiFp(configuration).apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(axios, basePath));
+        async apiSysSmsAliyunSendSmsPhoneNumberTemplateIdPost(phoneNumber: string, templateId: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return SysSmsApiFp(configuration).apiSysSmsAliyunSendSmsPhoneNumberTemplateIdPost(phoneNumber, templateId, options).then((request) => request(axios, basePath));
         },
         /**
          * 
          * @summary 发送短信模板
-         * @param {any} body 
-         * @param {string} phoneNumber 
+         * @param {any} body 短信内容
+         * @param {string} phoneNumber 手机号
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysSmsAliyunSendSmsTemplatePhoneNumberPost(body: any, phoneNumber: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
-            return SysSmsApiFp(configuration).apiSysSmsAliyunSendSmsTemplatePhoneNumberPost(body, phoneNumber, options).then((request) => request(axios, basePath));
+        async apiSysSmsAliyunSendSmsTemplatePhoneNumberTemplateIdPost(body: any, phoneNumber: string, templateId: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return SysSmsApiFp(configuration).apiSysSmsAliyunSendSmsTemplatePhoneNumberTemplateIdPost(body, phoneNumber, templateId, options).then((request) => request(axios, basePath));
         },
         /**
          * 
          * @summary 发送短信 📨
          * @param {string} phoneNumber 
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysSmsSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
-            return SysSmsApiFp(configuration).apiSysSmsSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(axios, basePath));
+        async apiSysSmsSendSmsPhoneNumberTemplateIdPost(phoneNumber: string, templateId: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return SysSmsApiFp(configuration).apiSysSmsSendSmsPhoneNumberTemplateIdPost(phoneNumber, templateId, options).then((request) => request(axios, basePath));
         },
         /**
          * 
          * @summary 腾讯云发送短信 📨
          * @param {string} phoneNumber 
+         * @param {string} templateId 短信模板id
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
-            return SysSmsApiFp(configuration).apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(axios, basePath));
+        async apiSysSmsTencentSendSmsPhoneNumberTemplateIdPost(phoneNumber: string, templateId: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return SysSmsApiFp(configuration).apiSysSmsTencentSendSmsPhoneNumberTemplateIdPost(phoneNumber, templateId, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -431,47 +463,51 @@ export class SysSmsApi extends BaseAPI {
     /**
      * 
      * @summary 阿里云发送短信 📨
-     * @param {string} phoneNumber 
+     * @param {string} phoneNumber 手机号
+     * @param {string} templateId 短信模板id
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysSmsApi
      */
-    public async apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
-        return SysSmsApiFp(this.configuration).apiSysSmsAliyunSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysSmsAliyunSendSmsPhoneNumberTemplateIdPost(phoneNumber: string, templateId: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return SysSmsApiFp(this.configuration).apiSysSmsAliyunSendSmsPhoneNumberTemplateIdPost(phoneNumber, templateId, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 
      * @summary 发送短信模板
-     * @param {any} body 
-     * @param {string} phoneNumber 
+     * @param {any} body 短信内容
+     * @param {string} phoneNumber 手机号
+     * @param {string} templateId 短信模板id
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysSmsApi
      */
-    public async apiSysSmsAliyunSendSmsTemplatePhoneNumberPost(body: any, phoneNumber: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
-        return SysSmsApiFp(this.configuration).apiSysSmsAliyunSendSmsTemplatePhoneNumberPost(body, phoneNumber, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysSmsAliyunSendSmsTemplatePhoneNumberTemplateIdPost(body: any, phoneNumber: string, templateId: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return SysSmsApiFp(this.configuration).apiSysSmsAliyunSendSmsTemplatePhoneNumberTemplateIdPost(body, phoneNumber, templateId, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 
      * @summary 发送短信 📨
      * @param {string} phoneNumber 
+     * @param {string} templateId 短信模板id
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysSmsApi
      */
-    public async apiSysSmsSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
-        return SysSmsApiFp(this.configuration).apiSysSmsSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysSmsSendSmsPhoneNumberTemplateIdPost(phoneNumber: string, templateId: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return SysSmsApiFp(this.configuration).apiSysSmsSendSmsPhoneNumberTemplateIdPost(phoneNumber, templateId, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 
      * @summary 腾讯云发送短信 📨
      * @param {string} phoneNumber 
+     * @param {string} templateId 短信模板id
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysSmsApi
      */
-    public async apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
-        return SysSmsApiFp(this.configuration).apiSysSmsTencentSendSmsPhoneNumberPost(phoneNumber, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysSmsTencentSendSmsPhoneNumberTemplateIdPost(phoneNumber: string, templateId: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return SysSmsApiFp(this.configuration).apiSysSmsTencentSendSmsPhoneNumberTemplateIdPost(phoneNumber, templateId, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 

+ 0 - 30
Web/src/api-services/models/delete-file-input.ts

@@ -1,30 +0,0 @@
-/* tslint:disable */
-/* eslint-disable */
-/**
- * Admin.NET 通用权限开发平台
- * 让 .NET 开发更简单、更通用、更流行。整合最新技术,模块插件式开发,前后端分离,开箱即用。<br/><u><b><font color='FF0000'> 👮不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!</font></b></u>
- *
- * OpenAPI spec version: 1.0.0
- * 
- *
- * NOTE: This class is auto generated by the swagger code generator program.
- * https://github.com/swagger-api/swagger-codegen.git
- * Do not edit the class manually.
- */
-
- /**
- * 
- *
- * @export
- * @interface DeleteFileInput
- */
-export interface DeleteFileInput {
-
-    /**
-     * 主键Id
-     *
-     * @type {number}
-     * @memberof DeleteFileInput
-     */
-    id: number;
-}

+ 0 - 1
Web/src/api-services/models/index.ts

@@ -171,7 +171,6 @@ export * from './delete-db-column-input';
 export * from './delete-db-table-input';
 export * from './delete-dict-data-input';
 export * from './delete-dict-type-input';
-export * from './delete-file-input';
 export * from './delete-job-detail-input';
 export * from './delete-job-trigger-input';
 export * from './delete-menu-input';

+ 8 - 0
Web/src/api-services/models/login-user-output.ts

@@ -170,4 +170,12 @@ export interface LoginUserOutput {
      * @memberof LoginUserOutput
      */
     tenantId?: number | null;
+
+    /**
+     * 当前切换到的租户Id
+     *
+     * @type {number}
+     * @memberof LoginUserOutput
+     */
+    currentTenantId?: number | null;
 }

+ 0 - 16
Web/src/api-services/models/sys-file-upload-file-body.ts

@@ -44,22 +44,6 @@ export interface SysFileUploadFileBody {
      */
     isPublic?: boolean;
 
-    /**
-     * 文件路径
-     *
-     * @type {string}
-     * @memberof SysFileUploadFileBody
-     */
-    path?: string;
-
-    /**
-     * 文件保存路径
-     *
-     * @type {string}
-     * @memberof SysFileUploadFileBody
-     */
-    savePath?: string;
-
     /**
      * 允许格式:.jpeg.jpg.png.bmp.gif.tif
      *

+ 11 - 19
Web/src/api-services/models/sys-file.ts

@@ -165,42 +165,34 @@ export interface SysFile {
     fileMd5?: string | null;
 
     /**
-     * 关联对象名称(如子对象)
+     * 文件类别
      *
      * @type {string}
      * @memberof SysFile
      */
-    relationName?: string | null;
-
-    /**
-     * 关联对象Id
-     *
-     * @type {number}
-     * @memberof SysFile
-     */
-    relationId?: number | null;
+    fileType?: string | null;
 
     /**
-     * 所属Id(如主对象)
+     * 文件别名
      *
-     * @type {number}
+     * @type {string}
      * @memberof SysFile
      */
-    belongId?: number | null;
+    fileAlias?: string | null;
 
     /**
-     * 文件类别
+     * 是否公开
      *
-     * @type {string}
+     * @type {boolean}
      * @memberof SysFile
      */
-    fileType?: string | null;
+    isPublic?: boolean;
 
     /**
-     * 是否公开  若为true则所有人都可以查看,默认只有自己或有权限的可以查看
+     * 业务数据Id
      *
-     * @type {boolean}
+     * @type {number}
      * @memberof SysFile
      */
-    isPublic?: boolean;
+    dataId?: number | null;
 }

+ 0 - 8
Web/src/api-services/models/upload-file-from-base64-input.ts

@@ -43,12 +43,4 @@ export interface UploadFileFromBase64Input {
      * @memberof UploadFileFromBase64Input
      */
     contentType?: string | null;
-
-    /**
-     * 保存路径
-     *
-     * @type {string}
-     * @memberof UploadFileFromBase64Input
-     */
-    path?: string | null;
 }