Procházet zdrojové kódy

😎更新前端接口请求文件

zuohuaijun před 1 rokem
rodič
revize
9a0f762224

+ 40 - 40
Admin.NET/Admin.NET.Core/Entity/SysUserFavorites.cs → Admin.NET/Admin.NET.Core/Entity/SysUserMenu.cs

@@ -1,41 +1,41 @@
-// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
-//
-// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
-//
-// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
-
-namespace Admin.NET.Core;
-
-/// <summary>
-/// 用户菜单快捷导航表
-/// </summary>
-[SugarTable(null, "用户菜单快捷导航表")]
-[SysTable]
-public partial class SysUserFavorites : EntityBaseId
-{
-    /// <summary>
-    /// 用户Id
-    /// </summary>
-    [SugarColumn(ColumnDescription = "用户Id")]
-    public long UserId { get; set; }
-
-    /// <summary>
-    /// 用户
-    /// </summary>
-    [Newtonsoft.Json.JsonIgnore]
-    [System.Text.Json.Serialization.JsonIgnore]
-    [Navigate(NavigateType.OneToOne, nameof(UserId))]
-    public SysUser SysUser { get; set; }
-
-    /// <summary>
-    /// 菜单Id
-    /// </summary>
-    [SugarColumn(ColumnDescription = "菜单Id")]
-    public long MenuId { get; set; }
-
-    /// <summary>
-    /// 菜单
-    /// </summary>
-    [Navigate(NavigateType.OneToOne, nameof(MenuId))]
-    public SysMenu SysMenu { get; set; }
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 系统用户菜单快捷导航表
+/// </summary>
+[SugarTable(null, "系统用户菜单快捷导航表")]
+[SysTable]
+public partial class SysUserMenu : EntityBaseId
+{
+    /// <summary>
+    /// 用户Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "用户Id")]
+    public long UserId { get; set; }
+
+    /// <summary>
+    /// 用户
+    /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
+    [Navigate(NavigateType.OneToOne, nameof(UserId))]
+    public SysUser SysUser { get; set; }
+
+    /// <summary>
+    /// 菜单Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "菜单Id")]
+    public long MenuId { get; set; }
+
+    /// <summary>
+    /// 菜单
+    /// </summary>
+    [Navigate(NavigateType.OneToOne, nameof(MenuId))]
+    public SysMenu SysMenu { get; set; }
 }

+ 22 - 22
Admin.NET/Admin.NET.Core/Service/User/Dto/UserFavoritesInput.cs → Admin.NET/Admin.NET.Core/Service/User/Dto/UserMenuInput.cs

@@ -1,23 +1,23 @@
-// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
-//
-// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
-//
-// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
-
-namespace Admin.NET.Core.Service;
-
-/// <summary>
-/// 用户菜单快捷导航收藏
-/// </summary>
-public class UserFavoritesInput
-{
-    /// <summary>
-    /// 用户Id
-    /// </summary>
-    public long UserId { get; set; }
-
-    /// <summary>
-    /// 收藏菜单Id集合
-    /// </summary>
-    public List<long> MenuIdList { get; set; }
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 系统用户菜单快捷导航输入
+/// </summary>
+public class UserMenuInput
+{
+    /// <summary>
+    /// 用户Id
+    /// </summary>
+    public long UserId { get; set; }
+
+    /// <summary>
+    /// 收藏菜单Id集合
+    /// </summary>
+    public List<long> MenuIdList { get; set; }
 }

+ 86 - 83
Admin.NET/Admin.NET.Core/Service/User/SysUserFavoritesService.cs → Admin.NET/Admin.NET.Core/Service/User/SysUserMenuService.cs

@@ -1,84 +1,87 @@
-// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
-//
-// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
-//
-// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
-
-namespace Admin.NET.Core.Service;
-
-/// <summary>
-/// 用户菜单快捷导航服务 🧩
-/// </summary>
-[ApiDescriptionSettings(Order = 500)]
-public class SysUserFavoritesService : IDynamicApiController, ITransient
-{
-    private readonly SqlSugarRepository<SysUserFavorites> _sysUserFavoritesRep;
-
-    public SysUserFavoritesService(SqlSugarRepository<SysUserFavorites> sysUserFavoritesRep)
-    {
-        _sysUserFavoritesRep = sysUserFavoritesRep;
-    }
-
-    /// <summary>
-    /// 收藏菜单 🔖
-    /// </summary>
-    /// <param name="input"></param>
-    /// <returns></returns>
-    [UnitOfWork]
-    public async Task GrantUserFavorites(UserFavoritesInput input)
-    {
-        await _sysUserFavoritesRep.DeleteAsync(u => u.UserId == input.UserId);
-
-        if (input.MenuIdList == null || input.MenuIdList.Count < 1) return;
-        var menus = input.MenuIdList.Select(u => new SysUserFavorites
-        {
-            UserId = input.UserId,
-            MenuId = u
-        }).ToList();
-        await _sysUserFavoritesRep.InsertRangeAsync(menus);
-    }
-
-    /// <summary>
-    /// 取消收藏菜单 🔖
-    /// </summary>
-    /// <param name="input"></param>
-    /// <returns></returns>
-    public async Task DeleteUserFavorites(UserFavoritesInput input)
-    {
-        await _sysUserFavoritesRep.DeleteAsync(u => u.UserId == input.UserId && input.MenuIdList.Contains(u.MenuId));
-    }
-
-    /// <summary>
-    /// 根据用户Id删除收藏菜单 🔖
-    /// </summary>
-    /// <param name="userId"></param>
-    /// <returns></returns>
-    public async Task DeleteUserRoleByUserId(long userId)
-    {
-        await _sysUserFavoritesRep.DeleteAsync(u => u.UserId == userId);
-    }
-
-    /// <summary>
-    /// 根据用户Id获取收藏菜单集合 🔖
-    /// </summary>
-    /// <param name="userId"></param>
-    /// <returns></returns>
-    public async Task<List<MenuOutput>> GetUserRoleList(long userId)
-    {
-        var sysUserRoleList = await _sysUserFavoritesRep.AsQueryable()
-            .Includes(u => u.SysMenu)
-            .Where(u => u.UserId == userId).ToListAsync();
-        return sysUserRoleList.Where(u => u.SysMenu != null).Select(u => u.SysMenu).ToList().Adapt<List<MenuOutput>>();
-    }
-
-    /// <summary>
-    /// 根据用户Id获取收藏菜单Id集合 🔖
-    /// </summary>
-    /// <param name="userId"></param>
-    /// <returns></returns>
-    public async Task<List<long>> GetUserRoleIdList(long userId)
-    {
-        return await _sysUserFavoritesRep.AsQueryable()
-            .Where(u => u.UserId == userId).Select(u => u.MenuId).ToListAsync();
-    }
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 系统用户菜单快捷导航服务 🧩
+/// </summary>
+[ApiDescriptionSettings(Order = 445)]
+public class SysUserMenuService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<SysUserMenu> _sysUserMenuRep;
+
+    public SysUserMenuService(SqlSugarRepository<SysUserMenu> sysUserMenuRep)
+    {
+        _sysUserMenuRep = sysUserMenuRep;
+    }
+
+    /// <summary>
+    /// 收藏菜单 🔖
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [UnitOfWork]
+    [ApiDescriptionSettings(Name = "Add"), HttpPost]
+    public async Task AddUserMenu(UserMenuInput input)
+    {
+        await _sysUserMenuRep.DeleteAsync(u => u.UserId == input.UserId);
+
+        if (input.MenuIdList == null || input.MenuIdList.Count < 1) return;
+        var menus = input.MenuIdList.Select(u => new SysUserMenu
+        {
+            UserId = input.UserId,
+            MenuId = u
+        }).ToList();
+        await _sysUserMenuRep.InsertRangeAsync(menus);
+    }
+
+    /// <summary>
+    /// 取消收藏菜单 🔖
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "Delete"), HttpPost]
+    public async Task DeleteUserMenu(UserMenuInput input)
+    {
+        await _sysUserMenuRep.DeleteAsync(u => u.UserId == input.UserId && input.MenuIdList.Contains(u.MenuId));
+    }
+
+    /// <summary>
+    /// 根据用户Id删除收藏菜单 🔖
+    /// </summary>
+    /// <param name="userId"></param>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "DeleteUserMenuByUserId"), HttpPost]
+    public async Task DeleteUserMenuByUserId(long userId)
+    {
+        await _sysUserMenuRep.DeleteAsync(u => u.UserId == userId);
+    }
+
+    /// <summary>
+    /// 根据用户Id获取收藏菜单集合 🔖
+    /// </summary>
+    /// <param name="userId"></param>
+    /// <returns></returns>
+    public async Task<List<MenuOutput>> GetUserMenuList(long userId)
+    {
+        var sysUserMenuList = await _sysUserMenuRep.AsQueryable()
+            .Includes(u => u.SysMenu)
+            .Where(u => u.UserId == userId).ToListAsync();
+        return sysUserMenuList.Where(u => u.SysMenu != null).Select(u => u.SysMenu).ToList().Adapt<List<MenuOutput>>();
+    }
+
+    /// <summary>
+    /// 根据用户Id获取收藏菜单Id集合 🔖
+    /// </summary>
+    /// <param name="userId"></param>
+    /// <returns></returns>
+    public async Task<List<long>> GetUserMenuIdList(long userId)
+    {
+        return await _sysUserMenuRep.AsQueryable()
+            .Where(u => u.UserId == userId).Select(u => u.MenuId).ToListAsync();
+    }
 }

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

@@ -48,6 +48,7 @@ export * from './apis/sys-server-api';
 export * from './apis/sys-sms-api';
 export * from './apis/sys-tenant-api';
 export * from './apis/sys-user-api';
+export * from './apis/sys-user-menu-api';
 export * from './apis/sys-wechat-api';
 export * from './apis/sys-wechat-pay-api';
 export * from './apis/sys-wechat-user-api';

+ 76 - 5
Web/src/api-services/apis/sys-config-api.ts

@@ -1,7 +1,7 @@
 /* tslint:disable */
 /* eslint-disable */
 /**
- * 所有接口
+ * Admin.NET 通用权限开发平台
  * 让 .NET 开发更简单、更通用、更流行。整合最新技术,模块插件式开发,前后端分离,开箱即用。<br/><u><b><font color='FF0000'> 👮不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!</font></b></u>
  *
  * OpenAPI spec version: 1.0.0
@@ -11,6 +11,7 @@
  * https://github.com/swagger-api/swagger-codegen.git
  * Do not edit the class manually.
  */
+
 import globalAxios, { AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';
 import { Configuration } from '../configuration';
 // Some imports not used depending on template conditions
@@ -51,6 +52,13 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
             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;
+            }
 
             localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
 
@@ -74,7 +82,7 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
         },
         /**
          * 
-         * @summary 获取后配置
+         * @summary 获取后配置
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
@@ -91,6 +99,13 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
             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;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -128,6 +143,13 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
             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;
+            }
 
             localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
 
@@ -169,6 +191,13 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
             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;
+            }
 
             localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
 
@@ -214,6 +243,13 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
             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 (id !== undefined) {
                 localVarQueryParameter['Id'] = id;
@@ -254,6 +290,13 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
             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;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -290,6 +333,13 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
             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;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -327,6 +377,13 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
             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;
+            }
 
             localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
 
@@ -368,6 +425,13 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
             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;
+            }
 
             localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
 
@@ -408,6 +472,13 @@ export const SysConfigApiAxiosParamCreator = function (configuration?: Configura
             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;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -450,7 +521,7 @@ export const SysConfigApiFp = function(configuration?: Configuration) {
         },
         /**
          * 
-         * @summary 获取后配置
+         * @summary 获取后配置
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
@@ -591,7 +662,7 @@ export const SysConfigApiFactory = function (configuration?: Configuration, base
         },
         /**
          * 
-         * @summary 获取后配置
+         * @summary 获取后配置
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
@@ -698,7 +769,7 @@ export class SysConfigApi extends BaseAPI {
     }
     /**
      * 
-     * @summary 获取后配置
+     * @summary 获取后配置
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysConfigApi

+ 187 - 15
Web/src/api-services/apis/sys-file-api.ts

@@ -18,6 +18,7 @@ import { Configuration } from '../configuration';
 // @ts-ignore
 import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
 import { AdminResultIActionResult } from '../models';
+import { AdminResultListFileOutput } from '../models';
 import { AdminResultListSysFile } from '../models';
 import { AdminResultSqlSugarPagedListSysFile } from '../models';
 import { AdminResultString } from '../models';
@@ -25,6 +26,7 @@ import { AdminResultSysFile } from '../models';
 import { DeleteFileInput } from '../models';
 import { FileInput } from '../models';
 import { PageFileInput } from '../models';
+import { RelationQueryInput } from '../models';
 import { UploadFileFromBase64Input } from '../models';
 /**
  * SysFileApi - axios parameter creator
@@ -224,6 +226,103 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 文件预览
+         * @param {number} id 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysFilePreviewIdGet: async (id: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'id' is not null or undefined
+            if (id === null || id === undefined) {
+                throw new RequiredError('id','Required parameter id was null or undefined when calling apiSysFilePreviewIdGet.');
+            }
+            const localVarPath = `/api/sysFile/preview/{id}`
+                .replace(`{${"id"}}`, encodeURIComponent(String(id)));
+            // 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;
+            }
+
+            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 根据关联查询附件
+         * @param {RelationQueryInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysFileRelationFilesGet: async (body?: RelationQueryInput, 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;
+            }
+
+            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+
+            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};
+            const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
+            localVarRequestOptions.data =  needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
         /**
          * 
          * @summary 更新文件 🔖
@@ -376,11 +475,12 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
          * 
          * @summary 上传文件 🔖
          * @param {Blob} [file] 
+         * @param {string} [fileType] 
          * @param {string} [path] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysFileUploadFilePostForm: async (file?: Blob, path?: string, filetype?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysFileUploadFilePostForm: async (file?: Blob, fileType?: string, path?: 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');
@@ -402,17 +502,17 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
                 localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
             }
 
-            if (path !== undefined) {
-                localVarQueryParameter['path'] = path;
-            }
-
 
             if (file !== undefined) { 
-                localVarFormParams.append('file', file as any);
+                localVarFormParams.append('File', file as any);
             }
 
-            if (filetype !== undefined) { 
-                localVarFormParams.append('filetype', filetype);
+            if (fileType !== undefined) { 
+                localVarFormParams.append('FileType', fileType as any);
+            }
+
+            if (path !== undefined) { 
+                localVarFormParams.append('Path', path as any);
             }
 
             localVarHeaderParameter['Content-Type'] = 'multipart/form-data';
@@ -603,6 +703,34 @@ export const SysFileApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 文件预览
+         * @param {number} id 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysFilePreviewIdGet(id: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultIActionResult>>> {
+            const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFilePreviewIdGet(id, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+        /**
+         * 
+         * @summary 根据关联查询附件
+         * @param {RelationQueryInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysFileRelationFilesGet(body?: RelationQueryInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListFileOutput>>> {
+            const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileRelationFilesGet(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 更新文件 🔖
@@ -649,12 +777,13 @@ export const SysFileApiFp = function(configuration?: Configuration) {
          * 
          * @summary 上传文件 🔖
          * @param {Blob} [file] 
+         * @param {string} [fileType] 
          * @param {string} [path] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadFilePostForm(file?: Blob, path?: string, filetype?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> {
-            const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFilePostForm(file, path,filetype, options);
+        async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, path?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> {
+            const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFilePostForm(file, fileType, path, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -737,6 +866,26 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
         async apiSysFilePagePost(body?: PageFileInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSqlSugarPagedListSysFile>> {
             return SysFileApiFp(configuration).apiSysFilePagePost(body, options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 文件预览
+         * @param {number} id 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysFilePreviewIdGet(id: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultIActionResult>> {
+            return SysFileApiFp(configuration).apiSysFilePreviewIdGet(id, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 根据关联查询附件
+         * @param {RelationQueryInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysFileRelationFilesGet(body?: RelationQueryInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListFileOutput>> {
+            return SysFileApiFp(configuration).apiSysFileRelationFilesGet(body, options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 更新文件 🔖
@@ -771,13 +920,13 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
          * 
          * @summary 上传文件 🔖
          * @param {Blob} [file] 
+         * @param {string} [fileType] 
          * @param {string} [path] 
-         * @param {string} [filetype] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadFilePostForm(file?: Blob, path?: string,filetype?:string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> {
-            return SysFileApiFp(configuration).apiSysFileUploadFilePostForm(file, path,filetype, options).then((request) => request(axios, basePath));
+        async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, path?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> {
+            return SysFileApiFp(configuration).apiSysFileUploadFilePostForm(file, fileType, path, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -853,6 +1002,28 @@ export class SysFileApi extends BaseAPI {
     public async apiSysFilePagePost(body?: PageFileInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSqlSugarPagedListSysFile>> {
         return SysFileApiFp(this.configuration).apiSysFilePagePost(body, options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 文件预览
+     * @param {number} id 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysFileApi
+     */
+    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 {RelationQueryInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysFileApi
+     */
+    public async apiSysFileRelationFilesGet(body?: RelationQueryInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListFileOutput>> {
+        return SysFileApiFp(this.configuration).apiSysFileRelationFilesGet(body, options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 更新文件 🔖
@@ -890,13 +1061,14 @@ export class SysFileApi extends BaseAPI {
      * 
      * @summary 上传文件 🔖
      * @param {Blob} [file] 
+     * @param {string} [fileType] 
      * @param {string} [path] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysFileApi
      */
-    public async apiSysFileUploadFilePostForm(file?: Blob, path?: string, filetype?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> {
-        return SysFileApiFp(this.configuration).apiSysFileUploadFilePostForm(file, path,filetype, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, path?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> {
+        return SysFileApiFp(this.configuration).apiSysFileUploadFilePostForm(file, fileType, path, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 

+ 475 - 0
Web/src/api-services/apis/sys-user-menu-api.ts

@@ -0,0 +1,475 @@
+/* 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.
+ */
+
+import globalAxios, { AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';
+import { Configuration } from '../configuration';
+// Some imports not used depending on template conditions
+// @ts-ignore
+import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
+import { AdminResultListInt64 } from '../models';
+import { AdminResultListMenuOutput } from '../models';
+import { UserMenuInput } from '../models';
+/**
+ * SysUserMenuApi - axios parameter creator
+ * @export
+ */
+export const SysUserMenuApiAxiosParamCreator = function (configuration?: Configuration) {
+    return {
+        /**
+         * 
+         * @summary 收藏菜单 🔖
+         * @param {UserMenuInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysUserMenuAddPost: async (body?: UserMenuInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysUserMenu/add`;
+            // 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: 'POST', ...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;
+            }
+
+            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+
+            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};
+            const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
+            localVarRequestOptions.data =  needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
+        /**
+         * 
+         * @summary 取消收藏菜单 🔖
+         * @param {UserMenuInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysUserMenuDeletePost: async (body?: UserMenuInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysUserMenu/delete`;
+            // 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: 'POST', ...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;
+            }
+
+            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+
+            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};
+            const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
+            localVarRequestOptions.data =  needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
+        /**
+         * 
+         * @summary 根据用户Id删除收藏菜单 🔖
+         * @param {number} userId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysUserMenuDeleteUserMenuByUserIdUserIdPost: async (userId: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'userId' is not null or undefined
+            if (userId === null || userId === undefined) {
+                throw new RequiredError('userId','Required parameter userId was null or undefined when calling apiSysUserMenuDeleteUserMenuByUserIdUserIdPost.');
+            }
+            const localVarPath = `/api/sysUserMenu/deleteUserMenuByUserId/{userId}`
+                .replace(`{${"userId"}}`, encodeURIComponent(String(userId)));
+            // 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: 'POST', ...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;
+            }
+
+            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 根据用户Id获取收藏菜单Id集合 🔖
+         * @param {number} userId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysUserMenuUserMenuIdListUserIdGet: async (userId: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'userId' is not null or undefined
+            if (userId === null || userId === undefined) {
+                throw new RequiredError('userId','Required parameter userId was null or undefined when calling apiSysUserMenuUserMenuIdListUserIdGet.');
+            }
+            const localVarPath = `/api/sysUserMenu/userMenuIdList/{userId}`
+                .replace(`{${"userId"}}`, encodeURIComponent(String(userId)));
+            // 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;
+            }
+
+            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 根据用户Id获取收藏菜单集合 🔖
+         * @param {number} userId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysUserMenuUserMenuListUserIdGet: async (userId: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'userId' is not null or undefined
+            if (userId === null || userId === undefined) {
+                throw new RequiredError('userId','Required parameter userId was null or undefined when calling apiSysUserMenuUserMenuListUserIdGet.');
+            }
+            const localVarPath = `/api/sysUserMenu/userMenuList/{userId}`
+                .replace(`{${"userId"}}`, encodeURIComponent(String(userId)));
+            // 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;
+            }
+
+            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,
+            };
+        },
+    }
+};
+
+/**
+ * SysUserMenuApi - functional programming interface
+ * @export
+ */
+export const SysUserMenuApiFp = function(configuration?: Configuration) {
+    return {
+        /**
+         * 
+         * @summary 收藏菜单 🔖
+         * @param {UserMenuInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysUserMenuAddPost(body?: UserMenuInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await SysUserMenuApiAxiosParamCreator(configuration).apiSysUserMenuAddPost(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+        /**
+         * 
+         * @summary 取消收藏菜单 🔖
+         * @param {UserMenuInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysUserMenuDeletePost(body?: UserMenuInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await SysUserMenuApiAxiosParamCreator(configuration).apiSysUserMenuDeletePost(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+        /**
+         * 
+         * @summary 根据用户Id删除收藏菜单 🔖
+         * @param {number} userId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysUserMenuDeleteUserMenuByUserIdUserIdPost(userId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await SysUserMenuApiAxiosParamCreator(configuration).apiSysUserMenuDeleteUserMenuByUserIdUserIdPost(userId, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+        /**
+         * 
+         * @summary 根据用户Id获取收藏菜单Id集合 🔖
+         * @param {number} userId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysUserMenuUserMenuIdListUserIdGet(userId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListInt64>>> {
+            const localVarAxiosArgs = await SysUserMenuApiAxiosParamCreator(configuration).apiSysUserMenuUserMenuIdListUserIdGet(userId, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+        /**
+         * 
+         * @summary 根据用户Id获取收藏菜单集合 🔖
+         * @param {number} userId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysUserMenuUserMenuListUserIdGet(userId: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListMenuOutput>>> {
+            const localVarAxiosArgs = await SysUserMenuApiAxiosParamCreator(configuration).apiSysUserMenuUserMenuListUserIdGet(userId, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+    }
+};
+
+/**
+ * SysUserMenuApi - factory interface
+ * @export
+ */
+export const SysUserMenuApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    return {
+        /**
+         * 
+         * @summary 收藏菜单 🔖
+         * @param {UserMenuInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysUserMenuAddPost(body?: UserMenuInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return SysUserMenuApiFp(configuration).apiSysUserMenuAddPost(body, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 取消收藏菜单 🔖
+         * @param {UserMenuInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysUserMenuDeletePost(body?: UserMenuInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return SysUserMenuApiFp(configuration).apiSysUserMenuDeletePost(body, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 根据用户Id删除收藏菜单 🔖
+         * @param {number} userId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysUserMenuDeleteUserMenuByUserIdUserIdPost(userId: number, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return SysUserMenuApiFp(configuration).apiSysUserMenuDeleteUserMenuByUserIdUserIdPost(userId, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 根据用户Id获取收藏菜单Id集合 🔖
+         * @param {number} userId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysUserMenuUserMenuIdListUserIdGet(userId: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListInt64>> {
+            return SysUserMenuApiFp(configuration).apiSysUserMenuUserMenuIdListUserIdGet(userId, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 根据用户Id获取收藏菜单集合 🔖
+         * @param {number} userId 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysUserMenuUserMenuListUserIdGet(userId: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListMenuOutput>> {
+            return SysUserMenuApiFp(configuration).apiSysUserMenuUserMenuListUserIdGet(userId, options).then((request) => request(axios, basePath));
+        },
+    };
+};
+
+/**
+ * SysUserMenuApi - object-oriented interface
+ * @export
+ * @class SysUserMenuApi
+ * @extends {BaseAPI}
+ */
+export class SysUserMenuApi extends BaseAPI {
+    /**
+     * 
+     * @summary 收藏菜单 🔖
+     * @param {UserMenuInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysUserMenuApi
+     */
+    public async apiSysUserMenuAddPost(body?: UserMenuInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return SysUserMenuApiFp(this.configuration).apiSysUserMenuAddPost(body, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary 取消收藏菜单 🔖
+     * @param {UserMenuInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysUserMenuApi
+     */
+    public async apiSysUserMenuDeletePost(body?: UserMenuInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return SysUserMenuApiFp(this.configuration).apiSysUserMenuDeletePost(body, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary 根据用户Id删除收藏菜单 🔖
+     * @param {number} userId 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysUserMenuApi
+     */
+    public async apiSysUserMenuDeleteUserMenuByUserIdUserIdPost(userId: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return SysUserMenuApiFp(this.configuration).apiSysUserMenuDeleteUserMenuByUserIdUserIdPost(userId, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary 根据用户Id获取收藏菜单Id集合 🔖
+     * @param {number} userId 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysUserMenuApi
+     */
+    public async apiSysUserMenuUserMenuIdListUserIdGet(userId: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListInt64>> {
+        return SysUserMenuApiFp(this.configuration).apiSysUserMenuUserMenuIdListUserIdGet(userId, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary 根据用户Id获取收藏菜单集合 🔖
+     * @param {number} userId 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysUserMenuApi
+     */
+    public async apiSysUserMenuUserMenuListUserIdGet(userId: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListMenuOutput>> {
+        return SysUserMenuApiFp(this.configuration).apiSysUserMenuUserMenuListUserIdGet(userId, options).then((request) => request(this.axios, this.basePath));
+    }
+}

+ 11 - 3
Web/src/api-services/models/add-code-gen-input.ts

@@ -124,6 +124,14 @@ export interface AddCodeGenInput {
      */
     menuApplication?: string | null;
 
+    /**
+     * 菜单父级
+     *
+     * @type {number}
+     * @memberof AddCodeGenInput
+     */
+    menuPid?: number | null;
+
     /**
      * 支持打印类型
      *
@@ -181,10 +189,10 @@ export interface AddCodeGenInput {
     generateType: string;
 
     /**
-     * 菜单父级
+     * 是否生成菜单
      *
-     * @type {number}
+     * @type {boolean}
      * @memberof AddCodeGenInput
      */
-    menuPid: number;
+    generateMenu: boolean;
 }

+ 71 - 0
Web/src/api-services/models/admin-result-list-file-output.ts

@@ -0,0 +1,71 @@
+/* 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.
+ */
+
+import { FileOutput } from './file-output';
+ /**
+ * 全局返回结果
+ *
+ * @export
+ * @interface AdminResultListFileOutput
+ */
+export interface AdminResultListFileOutput {
+
+    /**
+     * 状态码
+     *
+     * @type {number}
+     * @memberof AdminResultListFileOutput
+     */
+    code?: number;
+
+    /**
+     * 类型success、warning、error
+     *
+     * @type {string}
+     * @memberof AdminResultListFileOutput
+     */
+    type?: string | null;
+
+    /**
+     * 错误信息
+     *
+     * @type {string}
+     * @memberof AdminResultListFileOutput
+     */
+    message?: string | null;
+
+    /**
+     * 数据
+     *
+     * @type {Array<FileOutput>}
+     * @memberof AdminResultListFileOutput
+     */
+    result?: Array<FileOutput> | null;
+
+    /**
+     * 附加数据
+     *
+     * @type {any}
+     * @memberof AdminResultListFileOutput
+     */
+    extras?: any | null;
+
+    /**
+     * 时间
+     *
+     * @type {Date}
+     * @memberof AdminResultListFileOutput
+     */
+    time?: Date;
+}

+ 9 - 1
Web/src/api-services/models/code-gen-input.ts

@@ -164,13 +164,21 @@ export interface CodeGenInput {
      */
     menuApplication?: string | null;
 
+    /**
+     * 是否生成菜单
+     *
+     * @type {boolean}
+     * @memberof CodeGenInput
+     */
+    generateMenu?: boolean;
+
     /**
      * 菜单父级
      *
      * @type {number}
      * @memberof CodeGenInput
      */
-    menuPid?: number;
+    menuPid?: number | null;
 
     /**
      * 支持打印类型

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

@@ -35,6 +35,7 @@ export interface FileInput {
      * @memberof FileInput
      */
     fileName?: string | null;
+
     /**
      * 文件类型
      *

+ 118 - 0
Web/src/api-services/models/file-output.ts

@@ -0,0 +1,118 @@
+/* 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 FileOutput
+ */
+export interface FileOutput {
+
+    /**
+     * Id
+     *
+     * @type {number}
+     * @memberof FileOutput
+     */
+    id?: number;
+
+    /**
+     * 名称
+     *
+     * @type {string}
+     * @memberof FileOutput
+     */
+    name?: string | null;
+
+    /**
+     * URL
+     *
+     * @type {string}
+     * @memberof FileOutput
+     */
+    url?: string | null;
+
+    /**
+     * 大小
+     *
+     * @type {string}
+     * @memberof FileOutput
+     */
+    sizeKb?: string | null;
+
+    /**
+     * 后缀
+     *
+     * @type {string}
+     * @memberof FileOutput
+     */
+    suffix?: string | null;
+
+    /**
+     * 路径
+     *
+     * @type {string}
+     * @memberof FileOutput
+     */
+    filePath?: string | null;
+
+    /**
+     * 文件类别
+     *
+     * @type {string}
+     * @memberof FileOutput
+     */
+    fileType?: string | null;
+
+    /**
+     * 上传人
+     *
+     * @type {string}
+     * @memberof FileOutput
+     */
+    createUserName?: string | null;
+
+    /**
+     * 上传时间
+     *
+     * @type {Date}
+     * @memberof FileOutput
+     */
+    createTime?: Date | null;
+
+    /**
+     * 关联对象名称
+     *
+     * @type {string}
+     * @memberof FileOutput
+     */
+    relationName?: string | null;
+
+    /**
+     * 关联对象Id
+     *
+     * @type {number}
+     * @memberof FileOutput
+     */
+    relationId?: number | null;
+
+    /**
+     * 所属Id
+     *
+     * @type {number}
+     * @memberof FileOutput
+     */
+    belongId?: number | null;
+}

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

@@ -34,6 +34,7 @@ export * from './admin-result-list-db-column-output';
 export * from './admin-result-list-db-table-info';
 export * from './admin-result-list-enum-entity';
 export * from './admin-result-list-enum-type-output';
+export * from './admin-result-list-file-output';
 export * from './admin-result-list-int64';
 export * from './admin-result-list-menu-output';
 export * from './admin-result-list-role-output';
@@ -170,6 +171,7 @@ export * from './export-proc-input';
 export * from './field-attributes';
 export * from './field-info';
 export * from './file-input';
+export * from './file-output';
 export * from './gen-auth-url-input';
 export * from './gender-enum';
 export * from './generate-signature-input';
@@ -234,6 +236,7 @@ export * from './parameter-info';
 export * from './platform-type-enum';
 export * from './property-attributes';
 export * from './property-info';
+export * from './relation-query-input';
 export * from './reset-pwd-user-input';
 export * from './role-input';
 export * from './role-menu-input';
@@ -345,6 +348,7 @@ export * from './update-tenant-input';
 export * from './update-user-input';
 export * from './upload-file-from-base64-input';
 export * from './user-input';
+export * from './user-menu-input';
 export * from './user-output';
 export * from './user-role-input';
 export * from './visual-column';

+ 54 - 0
Web/src/api-services/models/relation-query-input.ts

@@ -0,0 +1,54 @@
+/* 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 RelationQueryInput
+ */
+export interface RelationQueryInput {
+
+    /**
+     * 关联对象名称
+     *
+     * @type {string}
+     * @memberof RelationQueryInput
+     */
+    relationName?: string | null;
+
+    /**
+     * 关联对象Id
+     *
+     * @type {number}
+     * @memberof RelationQueryInput
+     */
+    relationId?: number | null;
+
+    /**
+     * 文件,多个以\",\"分割
+     *
+     * @type {string}
+     * @memberof RelationQueryInput
+     */
+    fileTypes?: string | null;
+
+    /**
+     * 所属Id
+     *
+     * @type {number}
+     * @memberof RelationQueryInput
+     */
+    belongId?: number | null;
+}

+ 9 - 1
Web/src/api-services/models/sys-code-gen.ts

@@ -164,13 +164,21 @@ export interface SysCodeGen {
      */
     busName?: string | null;
 
+    /**
+     * 是否生成菜单
+     *
+     * @type {boolean}
+     * @memberof SysCodeGen
+     */
+    generateMenu?: boolean;
+
     /**
      * 菜单编码
      *
      * @type {number}
      * @memberof SysCodeGen
      */
-    menuPid?: number;
+    menuPid?: number | null;
 
     /**
      * 支持打印类型

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

@@ -21,8 +21,26 @@
 export interface SysFileUploadFileBody {
 
     /**
+     * 文件
+     *
      * @type {Blob}
      * @memberof SysFileUploadFileBody
      */
     file: Blob;
+
+    /**
+     * 文件类型
+     *
+     * @type {string}
+     * @memberof SysFileUploadFileBody
+     */
+    fileType?: string;
+
+    /**
+     * 文件路径
+     *
+     * @type {string}
+     * @memberof SysFileUploadFileBody
+     */
+    path?: string;
 }

+ 32 - 0
Web/src/api-services/models/sys-file.ts

@@ -155,4 +155,36 @@ export interface SysFile {
      * @memberof SysFile
      */
     fileMd5?: string | null;
+
+    /**
+     * 关联对象名称(如子对象)
+     *
+     * @type {string}
+     * @memberof SysFile
+     */
+    relationName?: string | null;
+
+    /**
+     * 关联对象Id
+     *
+     * @type {number}
+     * @memberof SysFile
+     */
+    relationId?: number | null;
+
+    /**
+     * 所属Id(如主对象)
+     *
+     * @type {number}
+     * @memberof SysFile
+     */
+    belongId?: number | null;
+
+    /**
+     * 文件类别
+     *
+     * @type {string}
+     * @memberof SysFile
+     */
+    fileType?: string | null;
 }

+ 9 - 1
Web/src/api-services/models/update-code-gen-input.ts

@@ -164,13 +164,21 @@ export interface UpdateCodeGenInput {
      */
     menuApplication?: string | null;
 
+    /**
+     * 是否生成菜单
+     *
+     * @type {boolean}
+     * @memberof UpdateCodeGenInput
+     */
+    generateMenu?: boolean;
+
     /**
      * 菜单父级
      *
      * @type {number}
      * @memberof UpdateCodeGenInput
      */
-    menuPid?: number;
+    menuPid?: number | null;
 
     /**
      * 支持打印类型

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

@@ -51,4 +51,12 @@ export interface UploadFileFromBase64Input {
      * @memberof UploadFileFromBase64Input
      */
     path?: string | null;
+
+    /**
+     * 文件类型
+     *
+     * @type {string}
+     * @memberof UploadFileFromBase64Input
+     */
+    fileType?: string | null;
 }

+ 38 - 0
Web/src/api-services/models/user-menu-input.ts

@@ -0,0 +1,38 @@
+/* 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 UserMenuInput
+ */
+export interface UserMenuInput {
+
+    /**
+     * 用户Id
+     *
+     * @type {number}
+     * @memberof UserMenuInput
+     */
+    userId?: number;
+
+    /**
+     * 收藏菜单Id集合
+     *
+     * @type {Array<number>}
+     * @memberof UserMenuInput
+     */
+    menuIdList?: Array<number> | null;
+}

+ 1 - 1
Web/src/api-services/models/wechat-user-input.ts

@@ -74,5 +74,5 @@ export interface WechatUserInput {
      * @type {string}
      * @memberof WechatUserInput
      */
-    phoneNumber?: string | null;
+    mobile?: string | null;
 }

+ 8 - 15
Web/src/views/home/widgets/components/myapp.vue

@@ -56,30 +56,24 @@ export default {
 </script>
 
 <script setup lang="ts" name="myapp">
-import draggable from 'vuedraggable';
 import { reactive, onMounted, ref } from 'vue';
-import { Local } from '/@/utils/storage';
-import { useRequestOldRoutes } from '/@/stores/requestOldRoutes';
-import { MenuOutput } from '/@/api-services/models';
 import { ElMessage } from 'element-plus';
+import { useRequestOldRoutes } from '/@/stores/requestOldRoutes';
 import { storeToRefs } from 'pinia';
+import draggable from 'vuedraggable';
 import { useUserInfo } from '/@/stores/userInfo';
+
 import { getAPI } from '/@/utils/axios-utils';
-import { SysUserFavoritesApi } from '/@/api-services/api';
-import { useRouter } from 'vue-router';
+import { SysUserMenuApi } from '/@/api-services/api';
+import { MenuOutput } from '/@/api-services/models';
 
 const mods = ref<MenuOutput[]>([]); // 所有应用
 const myMods = ref<MenuOutput[]>([]); // 我的常用
 const myModsName = ref<Array<string | null | undefined>>([]); // 我的常用
 const filterMods = ref<MenuOutput[]>([]); // 过滤我的常用后的应用
 const modsDrawer = ref<boolean>(false);
-const myFavoriteMods = ref<Array<number | null | undefined>>([]); // 我的常用
-
-const navScrollbar = ref();
 
-const router = useRouter();
 const { userInfos } = storeToRefs(useUserInfo());
-
 const state = reactive({
 	navError: '',
 	navData: [],
@@ -92,7 +86,7 @@ onMounted(() => {
 // 请求已收藏菜单列表
 const getFavoriteMenuList = async () => {
 	try {
-		const res = await getAPI(SysUserFavoritesApi).apiSysUserFavoritesUserRoleListUserIdGet(userInfos.value.id);
+		const res = await getAPI(SysUserMenuApi).apiSysUserMenuUserMenuListUserIdGet(userInfos.value.id);
 		return res.data.result || [];
 	} catch (error) {
 		return [];
@@ -134,10 +128,9 @@ const filterMenu = (map: MenuOutput[]) => {
 
 // 保存我的常用
 const saveMods = async () => {
-	const myFavoriteMods = myMods.value.map((v: MenuOutput) => v.id);
-
+	const myFavoriteMods = myMods.value.map((v: MenuOutput) => v.id) as any;
 	const param = { userId: userInfos.value.id, menuIdList: myFavoriteMods };
-	await getAPI(SysUserFavoritesApi).apiSysUserFavoritesGrantUserFavoritesPost(param);
+	await getAPI(SysUserMenuApi).apiSysUserMenuAddPost(param);
 	ElMessage.success('设置常用成功');
 	modsDrawer.value = false;
 };