Эх сурвалжийг харах

😁增加阿里云短信服务

zuohuaijun 2 жил өмнө
parent
commit
b6adc8a92a
39 өөрчлөгдсөн 1415 нэмэгдсэн , 238 устгасан
  1. 3 0
      Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj
  2. 12 0
      Admin.NET/Admin.NET.Application/Configuration/SMS.json
  3. 1 0
      Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
  4. 4 1
      Admin.NET/Admin.NET.Core/Const/CacheConst.cs
  5. 1 0
      Admin.NET/Admin.NET.Core/GlobalUsings.cs
  6. 44 0
      Admin.NET/Admin.NET.Core/Option/SMSOptions.cs
  7. 18 0
      Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs
  8. 45 24
      Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs
  9. 3 3
      Admin.NET/Admin.NET.Core/Service/OAuth/SysOAuthService.cs
  10. 89 0
      Admin.NET/Admin.NET.Core/Service/Sms/SysSmsService.cs
  11. 0 1
      Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs
  12. 1 1
      Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs
  13. 2 0
      Web/src/api-services/api.ts
  14. 217 130
      Web/src/api-services/apis/sys-auth-api.ts
  15. 87 3
      Web/src/api-services/apis/sys-cache-api.ts
  16. 30 14
      Web/src/api-services/apis/sys-code-gen-config-api.ts
  17. 236 0
      Web/src/api-services/apis/sys-oauth-api.ts
  18. 137 0
      Web/src/api-services/apis/sys-sms-api.ts
  19. 4 3
      Web/src/api-services/apis/sys-user-api.ts
  20. 243 0
      Web/src/api-services/apis/sys-wechat-api.ts
  21. 34 34
      Web/src/api-services/apis/sys-wx-open-api.ts
  22. 1 1
      Web/src/api-services/models/add-subscribe-message-template-input.ts
  23. 6 0
      Web/src/api-services/models/code-gen-config.ts
  24. 5 0
      Web/src/api-services/models/db-type.ts
  25. 26 0
      Web/src/api-services/models/delete-message-template-input.ts
  26. 1 1
      Web/src/api-services/models/gen-auth-url-input.ts
  27. 3 0
      Web/src/api-services/models/index.ts
  28. 32 0
      Web/src/api-services/models/login-phone-input.ts
  29. 44 0
      Web/src/api-services/models/message-template-send-input.ts
  30. 2 3
      Web/src/api-services/models/platform-type-enum.ts
  31. 2 2
      Web/src/api-services/models/send-subscribe-message-input.ts
  32. 1 1
      Web/src/api-services/models/signature-input.ts
  33. 6 0
      Web/src/api-services/models/sys-code-gen-config.ts
  34. 7 1
      Web/src/api-services/models/sys-file.ts
  35. 6 6
      Web/src/api-services/models/sys-region.ts
  36. 1 1
      Web/src/api-services/models/wechat-user-login.ts
  37. 1 1
      Web/src/api-services/models/wx-open-id-login-input.ts
  38. 3 1
      Web/src/views/login/component/account.vue
  39. 57 6
      Web/src/views/login/component/mobile.vue

+ 3 - 0
Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj

@@ -57,6 +57,9 @@
     <None Update="Configuration\JWT.json">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Update="Configuration\SMS.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Update="Configuration\OAuth.json">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>

+ 12 - 0
Admin.NET/Admin.NET.Application/Configuration/SMS.json

@@ -0,0 +1,12 @@
+{
+  "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
+
+  "SMS": {
+    "Aliyun": {
+      "AccessKeyId": "LTAI5t8q8PMXkonqpVNtN7aZ",
+      "AccessKeySecret": "giAHi3RRL1UbEu6Ai6aBX40D06XFtO",
+      "SignName": "AdminNET平台", // 短信签名
+      "TemplateCode": "" // 短信模板
+    }
+  }
+}

+ 1 - 0
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -15,6 +15,7 @@
   </ItemGroup>
 
   <ItemGroup>
+    <PackageReference Include="AlibabaCloud.SDK.Dysmsapi20170525" Version="2.0.24" />
     <PackageReference Include="AngleSharp" Version="1.0.4" />
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.4.0" />
     <PackageReference Include="AspNet.Security.OAuth.Gitee" Version="6.0.15" />

+ 4 - 1
Admin.NET/Admin.NET.Core/Const/CacheConst.cs

@@ -45,10 +45,13 @@ public class CacheConst
     public const string KeyUserOnline = "sys_user_online:";
 
     /// <summary>
-    /// 验证码缓存
+    /// 图形验证码缓存
     /// </summary>
     public const string KeyVerCode = "sys_verCode:";
 
+    // 手机验证码缓存
+    public const string KeyPhoneVerCode = "sys_phoneVerCode:";
+
     /// <summary>
     /// 租户缓存
     /// </summary>

+ 1 - 0
Admin.NET/Admin.NET.Core/GlobalUsings.cs

@@ -9,6 +9,7 @@
 
 global using Admin.NET.Core.Service;
 global using Furion;
+global using Furion.ClayObject;
 global using Furion.ConfigurableOptions;
 global using Furion.DatabaseAccessor;
 global using Furion.DataEncryption;

+ 44 - 0
Admin.NET/Admin.NET.Core/Option/SMSOptions.cs

@@ -0,0 +1,44 @@
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 短信配置选项
+/// </summary>
+public sealed class SMSOptions : IConfigurableOptions
+{
+    /// <summary>
+    /// Aliyun
+    /// </summary>
+    public SMSSettings Aliyun { get; set; }
+}
+
+public sealed class SMSSettings
+{
+    /// <summary>
+    /// AccessKey ID
+    /// </summary>
+    public string AccessKeyId { get; set; }
+
+    /// <summary>
+    /// AccessKey Secret
+    /// </summary>
+    public string AccessKeySecret { get; set; }
+
+    /// <summary>
+    /// 短信签名
+    /// </summary>
+    public string SignName { get; set; }
+
+    /// <summary>
+    /// 短信模板
+    /// </summary>
+    public string TemplateCode { get; set; }
+}

+ 18 - 0
Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs

@@ -37,4 +37,22 @@ public class LoginInput
     /// 验证码
     /// </summary>
     public string Code { get; set; }
+}
+
+public class LoginPhoneInput
+{
+    /// <summary>
+    /// 手机号码
+    /// </summary>
+    /// <example>admin</example>
+    [Required(ErrorMessage = "手机号码不能为空")]
+    [DataValidation(ValidationTypes.PhoneNumber, ErrorMessage = "手机号码不正确")]
+    public string Phone { get; set; }
+
+    /// <summary>
+    /// 验证码
+    /// </summary>
+    /// <example>123456</example>
+    [Required(ErrorMessage = "验证码不能为空"), MinLength(4, ErrorMessage = "验证码不能少于4个字符")]
+    public string Code { get; set; }
 }

+ 45 - 24
Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs

@@ -47,13 +47,13 @@ public class SysAuthService : IDynamicApiController, ITransient
     }
 
     /// <summary>
-    /// 登录系统
+    /// 账号密码登录
     /// </summary>
     /// <param name="input"></param>
     /// <remarks>用户名/密码:superadmin/123456</remarks>
     /// <returns></returns>
     [AllowAnonymous]
-    [DisplayName("登录系统")]
+    [DisplayName("账号密码登录")]
     public async Task<LoginOutput> Login([Required] LoginInput input)
     {
         //// 可以根据域名获取具体租户
@@ -92,27 +92,29 @@ public class SysAuthService : IDynamicApiController, ITransient
                 throw Oops.Oh(ErrorCodeEnum.D1000);
         }
 
-        // 单用户登录
-        await _sysOnlineUserService.SignleLogin(user.Id);
-
-        // 生成Token令牌
-        var accessToken = await CreateToken(user);
-
-        // 生成刷新Token令牌
-        var refreshTokenExpire = await _sysConfigService.GetRefreshTokenExpire();
-        var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, refreshTokenExpire);
+        return await CreateToken(user);
+    }
 
-        // 设置响应报文头
-        _httpContextAccessor.HttpContext.SetTokensOfResponseHeaders(accessToken, refreshToken);
+    /// <summary>
+    /// 手机号登录
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [DisplayName("手机号登录")]
+    public async Task<LoginOutput> LoginPhone([Required] LoginPhoneInput input)
+    {
+        var verifyCode = _sysCacheService.Get<string>($"{CacheConst.KeyPhoneVerCode}{input.Phone}");
+        if (string.IsNullOrWhiteSpace(verifyCode))
+            throw Oops.Oh("验证码不存在或已失效,请重新获取!");
+        if (verifyCode != input.Code)
+            throw Oops.Oh("验证码错误!");
 
-        // Swagger Knife4UI-AfterScript登录脚本
-        // ke.global.setAllHeader('Authorization', 'Bearer ' + ke.response.headers['access-token']);
+        // 账号是否存在
+        var user = await _sysUserRep.AsQueryable().Includes(t => t.SysOrg).Filter(null, true).FirstAsync(u => u.Phone.Equals(input.Phone));
+        _ = user ?? throw Oops.Oh(ErrorCodeEnum.D0009);
 
-        return new LoginOutput
-        {
-            AccessToken = accessToken,
-            RefreshToken = refreshToken
-        };
+        return await CreateToken(user);
     }
 
     /// <summary>
@@ -121,11 +123,14 @@ public class SysAuthService : IDynamicApiController, ITransient
     /// <param name="user"></param>
     /// <returns></returns>
     [NonAction]
-    public async Task<string> CreateToken(SysUser user)
+    public async Task<LoginOutput> CreateToken(SysUser user)
     {
-        var tokenExpire = await _sysConfigService.GetTokenExpire();
+        // 单用户登录
+        await _sysOnlineUserService.SignleLogin(user.Id);
 
-        return JWTEncryption.Encrypt(new Dictionary<string, object>
+        // 生成Token令牌
+        var tokenExpire = await _sysConfigService.GetTokenExpire();
+        var accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
         {
             { ClaimConst.UserId, user.Id },
             { ClaimConst.TenantId, user.TenantId },
@@ -136,13 +141,29 @@ public class SysAuthService : IDynamicApiController, ITransient
             { ClaimConst.OrgName, user.SysOrg?.Name },
             { ClaimConst.OrgType, user.SysOrg?.OrgType },
         }, tokenExpire);
+
+        // 生成刷新Token令牌
+        var refreshTokenExpire = await _sysConfigService.GetRefreshTokenExpire();
+        var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, refreshTokenExpire);
+
+        // 设置响应报文头
+        _httpContextAccessor.HttpContext.SetTokensOfResponseHeaders(accessToken, refreshToken);
+
+        // Swagger Knife4UI-AfterScript登录脚本
+        // ke.global.setAllHeader('Authorization', 'Bearer ' + ke.response.headers['access-token']);
+
+        return new LoginOutput
+        {
+            AccessToken = accessToken,
+            RefreshToken = refreshToken
+        };
     }
 
     /// <summary>
     /// 获取登录账号
     /// </summary>
     /// <returns></returns>
-    [DisplayName("登录系统")]
+    [DisplayName("获取登录账号")]
     public async Task<LoginUserOutput> GetUserInfo()
     {
         var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);

+ 3 - 3
Admin.NET/Admin.NET.Core/Service/OAuth/SysOAuthService.cs

@@ -16,7 +16,7 @@ namespace Admin.NET.Core.Service;
 /// 系统OAuth服务
 /// </summary>
 [AllowAnonymous]
-[ApiDescriptionSettings(Order = 100)]
+[ApiDescriptionSettings(Order = 495)]
 public class SysOAuthService : IDynamicApiController, ITransient
 {
     private readonly IHttpContextAccessor _httpContextAccessor;
@@ -113,8 +113,8 @@ public class SysOAuthService : IDynamicApiController, ITransient
         }
 
         // 构建Token令牌
-        var accessToken = await App.GetRequiredService<SysAuthService>().CreateToken(wechatUser.SysUser);
+        var token = await App.GetRequiredService<SysAuthService>().CreateToken(wechatUser.SysUser);
 
-        return new RedirectResult($"{redirectUrl}/#/login?token={accessToken}");
+        return new RedirectResult($"{redirectUrl}/#/login?token={token.AccessToken}");
     }
 }

+ 89 - 0
Admin.NET/Admin.NET.Core/Service/Sms/SysSmsService.cs

@@ -0,0 +1,89 @@
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+using AlibabaCloud.SDK.Dysmsapi20170525.Models;
+
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 系统短信服务
+/// </summary>
+[AllowAnonymous]
+[ApiDescriptionSettings(Order = 150)]
+public class SysSmsService : IDynamicApiController, ITransient
+{
+    private readonly SMSOptions _smsOptions;
+    private readonly SysCacheService _sysCacheService;
+
+    public SysSmsService(IOptions<SMSOptions> smsOptions,
+        SysCacheService sysCacheService)
+    {
+        _smsOptions = smsOptions.Value;
+        _sysCacheService = sysCacheService;
+    }
+
+    /// <summary>
+    /// 发送短信
+    /// </summary>
+    /// <param name="phoneNumber"></param>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [DisplayName("发送短信")]
+    public async Task SendSms([Required] string phoneNumber)
+    {
+        if (!phoneNumber.TryValidate(ValidationTypes.PhoneNumber).IsValid)
+            throw Oops.Oh("请正确填写手机号码");
+
+        // 生成随机验证码
+        var random = new Random();
+        var verifyCode = random.Next(100000, 999999);
+
+        var templateParam = Clay.Object(new
+        {
+            code = verifyCode
+        });
+
+        var client = CreateClient();
+        var sendSmsRequest = new SendSmsRequest
+        {
+            PhoneNumbers = phoneNumber, // 待发送手机号, 多个以逗号分隔
+            SignName = _smsOptions.Aliyun.SignName, // 短信签名
+            TemplateCode = _smsOptions.Aliyun.TemplateCode, // 短信模板
+            TemplateParam = templateParam.ToString(), // 模板中的变量替换JSON串
+            OutId = YitIdHelper.NextId().ToString()
+        };
+        var sendSmsResponse = client.SendSms(sendSmsRequest);
+        if (sendSmsResponse.Body.Code == "OK" && sendSmsResponse.Body.Message == "OK")
+        {
+            // var bizId = sendSmsResponse.Body.BizId;
+            _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(60));
+        }
+        else
+        {
+            throw Oops.Oh($"短信发送失败:{sendSmsResponse.Body.Code}-{sendSmsResponse.Body.Message}");
+        }
+
+        await Task.CompletedTask;
+    }
+
+    /// <summary>
+    /// 阿里云短信配置
+    /// </summary>
+    /// <returns></returns>
+    private AlibabaCloud.SDK.Dysmsapi20170525.Client CreateClient()
+    {
+        var config = new AlibabaCloud.OpenApiClient.Models.Config
+        {
+            AccessKeyId = _smsOptions.Aliyun.AccessKeyId,
+            AccessKeySecret = _smsOptions.Aliyun.AccessKeySecret,
+            Endpoint = "dysmsapi.aliyuncs.com"
+        };
+        return new AlibabaCloud.SDK.Dysmsapi20170525.Client(config);
+    }
+}

+ 0 - 1
Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs

@@ -12,7 +12,6 @@ namespace Admin.NET.Core.Service;
 /// <summary>
 /// 微信API客户端
 /// </summary>
-[ApiDescriptionSettings(false)]
 public partial class WechatApiHttpClient : ISingleton
 {
     public readonly WechatOptions _wechatOptions;

+ 1 - 1
Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs

@@ -10,7 +10,6 @@
 using Admin.NET.Core;
 using AspNetCoreRateLimit;
 using Furion;
-using Lazy.Captcha.Core;
 using Microsoft.Extensions.DependencyInjection;
 
 namespace Admin.NET.Web.Core;
@@ -38,6 +37,7 @@ public static class ProjectOptions
         services.AddConfigurableOptions<EmailOptions>();
         services.AddConfigurableOptions<OAuthOptions>();
         services.AddConfigurableOptions<CryptogramOptions>();
+        services.AddConfigurableOptions<SMSOptions>();
         //services.AddConfigurableOptions<IpRateLimitingOptions>();
         //services.AddConfigurableOptions<IpRateLimitPoliciesOptions>();
         //services.AddConfigurableOptions<ClientRateLimitingOptions>();

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

@@ -30,6 +30,7 @@ export * from './apis/sys-log-vis-api';
 export * from './apis/sys-menu-api';
 export * from './apis/sys-message-api';
 export * from './apis/sys-notice-api';
+export * from './apis/sys-oauth-api';
 export * from './apis/sys-online-user-api';
 export * from './apis/sys-org-api';
 export * from './apis/sys-plugin-api';
@@ -38,6 +39,7 @@ export * from './apis/sys-print-api';
 export * from './apis/sys-region-api';
 export * from './apis/sys-role-api';
 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-wechat-api';

+ 217 - 130
Web/src/api-services/apis/sys-auth-api.ts

@@ -21,6 +21,7 @@ import { AdminResultLoginUserOutput } from '../models';
 import { AdminResultObject } from '../models';
 import { AdminResultString } from '../models';
 import { LoginInput } from '../models';
+import { LoginPhoneInput } from '../models';
 /**
  * SysAuthApi - axios parameter creator
  * @export
@@ -29,19 +30,19 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
     return {
         /**
          * 
-         * @summary Swagger登录检查
+         * @summary 获取验证码
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSwaggerCheckUrlPost: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            const localVarPath = `/api/swagger/checkUrl`;
+        apiSysAuthCaptchaGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysAuth/captcha`;
             // 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 localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
@@ -72,24 +73,21 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
         },
         /**
          * 
-         * @summary Swagger登录提交
-         * @param {string} [userName] 
-         * @param {string} [password] 
+         * @summary 获取登录配置
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSwaggerSubmitUrlPostForm: async (userName?: string, password?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            const localVarPath = `/api/swagger/submitUrl`;
+        apiSysAuthLoginConfigGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysAuth/loginConfig`;
             // 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 localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
-            const localVarFormParams = new FormData();
 
             // authentication Bearer required
             // http bearer authentication required
@@ -100,16 +98,56 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
                 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};
 
-            if (userName !== undefined) { 
-                localVarFormParams.append('UserName', userName as any);
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
+        /**
+         * 
+         * @summary 手机号登录
+         * @param {LoginPhoneInput} body 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysAuthLoginPhonePost: async (body: LoginPhoneInput, 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 apiSysAuthLoginPhonePost.');
+            }
+            const localVarPath = `/api/sysAuth/loginPhone`;
+            // 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;
 
-            if (password !== undefined) { 
-                localVarFormParams.append('Password', password 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'] = 'multipart/form-data';
+            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
                 query.set(key, localVarQueryParameter[key]);
@@ -120,7 +158,8 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             localVarUrlObj.search = (new URLSearchParams(query)).toString();
             let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
             localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
-            localVarRequestOptions.data = localVarFormParams;
+            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,
@@ -128,20 +167,25 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             };
         },
         /**
-         * 
-         * @summary 获取验证码
+         * 用户名/密码:superadmin/123456
+         * @summary 账号密码登录
+         * @param {LoginInput} body 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysAuthCaptchaGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            const localVarPath = `/api/sysAuth/captcha`;
+        apiSysAuthLoginPost: async (body: LoginInput, 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 apiSysAuthLoginPost.');
+            }
+            const localVarPath = `/api/sysAuth/login`;
             // 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 localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
@@ -154,6 +198,8 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
                 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]);
@@ -164,6 +210,8 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             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,
@@ -172,19 +220,19 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
         },
         /**
          * 
-         * @summary 获取登录配置
+         * @summary 退出系统
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysAuthLoginConfigGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            const localVarPath = `/api/sysAuth/loginConfig`;
+        apiSysAuthLogoutPost: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysAuth/logout`;
             // 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 localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
@@ -214,25 +262,21 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             };
         },
         /**
-         * 用户名/密码:superadmin/123456
-         * @summary 登录系统
-         * @param {LoginInput} body 
+         * 
+         * @summary 获取刷新Token
+         * @param {string} [accessToken] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysAuthLoginPost: async (body: LoginInput, 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 apiSysAuthLoginPost.');
-            }
-            const localVarPath = `/api/sysAuth/login`;
+        apiSysAuthRefreshTokenGet: async (accessToken?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysAuth/refreshToken`;
             // 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 localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
@@ -245,7 +289,9 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
                 localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
             }
 
-            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+            if (accessToken !== undefined) {
+                localVarQueryParameter['accessToken'] = accessToken;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -257,8 +303,6 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             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,
@@ -267,19 +311,19 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
         },
         /**
          * 
-         * @summary 退出系统
+         * @summary 获取登录账号
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysAuthLogoutPost: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            const localVarPath = `/api/sysAuth/logout`;
+        apiSysAuthUserInfoGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysAuth/userInfo`;
             // 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 localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
@@ -310,18 +354,12 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
         },
         /**
          * 
-         * @summary 获取刷新Token
-         * @param {string} accessToken 
+         * @summary 获取水印配置
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysAuthRefreshTokenAccessTokenGet: async (accessToken: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            // verify required parameter 'accessToken' is not null or undefined
-            if (accessToken === null || accessToken === undefined) {
-                throw new RequiredError('accessToken','Required parameter accessToken was null or undefined when calling apiSysAuthRefreshTokenAccessTokenGet.');
-            }
-            const localVarPath = `/api/sysAuth/refreshToken/{accessToken}`
-                .replace(`{${"accessToken"}}`, encodeURIComponent(String(accessToken)));
+        apiSysAuthWatermarkConfigGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysAuth/watermarkConfig`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
             let baseOptions;
@@ -359,19 +397,19 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
         },
         /**
          * 
-         * @summary 获取登录账号
+         * @summary Swagger登录检查
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysAuthUserInfoGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            const localVarPath = `/api/sysAuth/userInfo`;
+        swaggerCheckUrlPost: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/swagger/checkUrl`;
             // 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 localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
@@ -402,21 +440,24 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
         },
         /**
          * 
-         * @summary 获取水印配置
+         * @summary Swagger登录提交
+         * @param {string} [userName] 
+         * @param {string} [password] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysAuthWatermarkConfigGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            const localVarPath = `/api/sysAuth/watermarkConfig`;
+        swaggerSubmitUrlPostForm: async (userName?: string, password?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/swagger/submitUrl`;
             // 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 localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
+            const localVarFormParams = new FormData();
 
             // authentication Bearer required
             // http bearer authentication required
@@ -427,6 +468,16 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
                 localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
             }
 
+
+            if (userName !== undefined) { 
+                localVarFormParams.append('UserName', userName as any);
+            }
+
+            if (password !== undefined) { 
+                localVarFormParams.append('Password', password as any);
+            }
+
+            localVarHeaderParameter['Content-Type'] = 'multipart/form-data';
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
                 query.set(key, localVarQueryParameter[key]);
@@ -437,6 +488,7 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
             localVarUrlObj.search = (new URLSearchParams(query)).toString();
             let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
             localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            localVarRequestOptions.data = localVarFormParams;
 
             return {
                 url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
@@ -454,27 +506,12 @@ export const SysAuthApiFp = function(configuration?: Configuration) {
     return {
         /**
          * 
-         * @summary Swagger登录检查
-         * @param {*} [options] Override http request option.
-         * @throws {RequiredError}
-         */
-        async apiSwaggerCheckUrlPost(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<number>>> {
-            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSwaggerCheckUrlPost(options);
-            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
-                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
-                return axios.request(axiosRequestArgs);
-            };
-        },
-        /**
-         * 
-         * @summary Swagger登录提交
-         * @param {string} [userName] 
-         * @param {string} [password] 
+         * @summary 获取验证码
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSwaggerSubmitUrlPostForm(userName?: string, password?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<number>>> {
-            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSwaggerSubmitUrlPostForm(userName, password, options);
+        async apiSysAuthCaptchaGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
+            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthCaptchaGet(options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -482,12 +519,12 @@ export const SysAuthApiFp = function(configuration?: Configuration) {
         },
         /**
          * 
-         * @summary 获取验证码
+         * @summary 获取登录配置
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysAuthCaptchaGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
-            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthCaptchaGet(options);
+        async apiSysAuthLoginConfigGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
+            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthLoginConfigGet(options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -495,12 +532,13 @@ export const SysAuthApiFp = function(configuration?: Configuration) {
         },
         /**
          * 
-         * @summary 获取登录配置
+         * @summary 手机号登录
+         * @param {LoginPhoneInput} body 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysAuthLoginConfigGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
-            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthLoginConfigGet(options);
+        async apiSysAuthLoginPhonePost(body: LoginPhoneInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultLoginOutput>>> {
+            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthLoginPhonePost(body, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -508,7 +546,7 @@ export const SysAuthApiFp = function(configuration?: Configuration) {
         },
         /**
          * 用户名/密码:superadmin/123456
-         * @summary 登录系统
+         * @summary 账号密码登录
          * @param {LoginInput} body 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
@@ -536,12 +574,12 @@ export const SysAuthApiFp = function(configuration?: Configuration) {
         /**
          * 
          * @summary 获取刷新Token
-         * @param {string} accessToken 
+         * @param {string} [accessToken] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysAuthRefreshTokenAccessTokenGet(accessToken: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultString>>> {
-            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthRefreshTokenAccessTokenGet(accessToken, options);
+        async apiSysAuthRefreshTokenGet(accessToken?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultString>>> {
+            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthRefreshTokenGet(accessToken, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -573,23 +611,18 @@ export const SysAuthApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
-    }
-};
-
-/**
- * SysAuthApi - factory interface
- * @export
- */
-export const SysAuthApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
-    return {
         /**
          * 
          * @summary Swagger登录检查
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSwaggerCheckUrlPost(options?: AxiosRequestConfig): Promise<AxiosResponse<number>> {
-            return SysAuthApiFp(configuration).apiSwaggerCheckUrlPost(options).then((request) => request(axios, basePath));
+        async swaggerCheckUrlPost(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<number>>> {
+            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).swaggerCheckUrlPost(options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
         },
         /**
          * 
@@ -599,9 +632,22 @@ export const SysAuthApiFactory = function (configuration?: Configuration, basePa
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSwaggerSubmitUrlPostForm(userName?: string, password?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<number>> {
-            return SysAuthApiFp(configuration).apiSwaggerSubmitUrlPostForm(userName, password, options).then((request) => request(axios, basePath));
+        async swaggerSubmitUrlPostForm(userName?: string, password?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<number>>> {
+            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).swaggerSubmitUrlPostForm(userName, password, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
         },
+    }
+};
+
+/**
+ * SysAuthApi - factory interface
+ * @export
+ */
+export const SysAuthApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    return {
         /**
          * 
          * @summary 获取验证码
@@ -620,9 +666,19 @@ export const SysAuthApiFactory = function (configuration?: Configuration, basePa
         async apiSysAuthLoginConfigGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
             return SysAuthApiFp(configuration).apiSysAuthLoginConfigGet(options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 手机号登录
+         * @param {LoginPhoneInput} body 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysAuthLoginPhonePost(body: LoginPhoneInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultLoginOutput>> {
+            return SysAuthApiFp(configuration).apiSysAuthLoginPhonePost(body, options).then((request) => request(axios, basePath));
+        },
         /**
          * 用户名/密码:superadmin/123456
-         * @summary 登录系统
+         * @summary 账号密码登录
          * @param {LoginInput} body 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
@@ -642,12 +698,12 @@ export const SysAuthApiFactory = function (configuration?: Configuration, basePa
         /**
          * 
          * @summary 获取刷新Token
-         * @param {string} accessToken 
+         * @param {string} [accessToken] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysAuthRefreshTokenAccessTokenGet(accessToken: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultString>> {
-            return SysAuthApiFp(configuration).apiSysAuthRefreshTokenAccessTokenGet(accessToken, options).then((request) => request(axios, basePath));
+        async apiSysAuthRefreshTokenGet(accessToken?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultString>> {
+            return SysAuthApiFp(configuration).apiSysAuthRefreshTokenGet(accessToken, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -667,6 +723,26 @@ export const SysAuthApiFactory = function (configuration?: Configuration, basePa
         async apiSysAuthWatermarkConfigGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
             return SysAuthApiFp(configuration).apiSysAuthWatermarkConfigGet(options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary Swagger登录检查
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async swaggerCheckUrlPost(options?: AxiosRequestConfig): Promise<AxiosResponse<number>> {
+            return SysAuthApiFp(configuration).swaggerCheckUrlPost(options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary Swagger登录提交
+         * @param {string} [userName] 
+         * @param {string} [password] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async swaggerSubmitUrlPostForm(userName?: string, password?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<number>> {
+            return SysAuthApiFp(configuration).swaggerSubmitUrlPostForm(userName, password, options).then((request) => request(axios, basePath));
+        },
     };
 };
 
@@ -679,49 +755,38 @@ export const SysAuthApiFactory = function (configuration?: Configuration, basePa
 export class SysAuthApi extends BaseAPI {
     /**
      * 
-     * @summary Swagger登录检查
-     * @param {*} [options] Override http request option.
-     * @throws {RequiredError}
-     * @memberof SysAuthApi
-     */
-    public async apiSwaggerCheckUrlPost(options?: AxiosRequestConfig) : Promise<AxiosResponse<number>> {
-        return SysAuthApiFp(this.configuration).apiSwaggerCheckUrlPost(options).then((request) => request(this.axios, this.basePath));
-    }
-    /**
-     * 
-     * @summary Swagger登录提交
-     * @param {string} [userName] 
-     * @param {string} [password] 
+     * @summary 获取验证码
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysAuthApi
      */
-    public async apiSwaggerSubmitUrlPostForm(userName?: string, password?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<number>> {
-        return SysAuthApiFp(this.configuration).apiSwaggerSubmitUrlPostForm(userName, password, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysAuthCaptchaGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
+        return SysAuthApiFp(this.configuration).apiSysAuthCaptchaGet(options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 
-     * @summary 获取验证码
+     * @summary 获取登录配置
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysAuthApi
      */
-    public async apiSysAuthCaptchaGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
-        return SysAuthApiFp(this.configuration).apiSysAuthCaptchaGet(options).then((request) => request(this.axios, this.basePath));
+    public async apiSysAuthLoginConfigGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
+        return SysAuthApiFp(this.configuration).apiSysAuthLoginConfigGet(options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 
-     * @summary 获取登录配置
+     * @summary 手机号登录
+     * @param {LoginPhoneInput} body 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysAuthApi
      */
-    public async apiSysAuthLoginConfigGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
-        return SysAuthApiFp(this.configuration).apiSysAuthLoginConfigGet(options).then((request) => request(this.axios, this.basePath));
+    public async apiSysAuthLoginPhonePost(body: LoginPhoneInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultLoginOutput>> {
+        return SysAuthApiFp(this.configuration).apiSysAuthLoginPhonePost(body, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 用户名/密码:superadmin/123456
-     * @summary 登录系统
+     * @summary 账号密码登录
      * @param {LoginInput} body 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
@@ -743,13 +808,13 @@ export class SysAuthApi extends BaseAPI {
     /**
      * 
      * @summary 获取刷新Token
-     * @param {string} accessToken 
+     * @param {string} [accessToken] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysAuthApi
      */
-    public async apiSysAuthRefreshTokenAccessTokenGet(accessToken: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultString>> {
-        return SysAuthApiFp(this.configuration).apiSysAuthRefreshTokenAccessTokenGet(accessToken, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysAuthRefreshTokenGet(accessToken?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultString>> {
+        return SysAuthApiFp(this.configuration).apiSysAuthRefreshTokenGet(accessToken, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 
@@ -771,4 +836,26 @@ export class SysAuthApi extends BaseAPI {
     public async apiSysAuthWatermarkConfigGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
         return SysAuthApiFp(this.configuration).apiSysAuthWatermarkConfigGet(options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary Swagger登录检查
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysAuthApi
+     */
+    public async swaggerCheckUrlPost(options?: AxiosRequestConfig) : Promise<AxiosResponse<number>> {
+        return SysAuthApiFp(this.configuration).swaggerCheckUrlPost(options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary Swagger登录提交
+     * @param {string} [userName] 
+     * @param {string} [password] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysAuthApi
+     */
+    public async swaggerSubmitUrlPostForm(userName?: string, password?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<number>> {
+        return SysAuthApiFp(this.configuration).swaggerSubmitUrlPostForm(userName, password, options).then((request) => request(this.axios, this.basePath));
+    }
 }

+ 87 - 3
Web/src/api-services/apis/sys-cache-api.ts

@@ -166,6 +166,55 @@ export const SysCacheApiAxiosParamCreator = function (configuration?: Configurat
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 根据键名前缀获取键名集合
+         * @param {string} prefixKey 键名前缀
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysCacheKeysByPrefixKeyPrefixKeyGet: async (prefixKey: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'prefixKey' is not null or undefined
+            if (prefixKey === null || prefixKey === undefined) {
+                throw new RequiredError('prefixKey','Required parameter prefixKey was null or undefined when calling apiSysCacheKeysByPrefixKeyPrefixKeyGet.');
+            }
+            const localVarPath = `/api/sysCache/keysByPrefixKey/{prefixKey}`
+                .replace(`{${"prefixKey"}}`, encodeURIComponent(String(prefixKey)));
+            // 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 获取缓存值
@@ -245,7 +294,7 @@ export const SysCacheApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysCacheDeleteKeyPost(key: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+        async apiSysCacheDeleteKeyPost(key: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultInt32>>> {
             const localVarAxiosArgs = await SysCacheApiAxiosParamCreator(configuration).apiSysCacheDeleteKeyPost(key, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@@ -265,6 +314,20 @@ export const SysCacheApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 根据键名前缀获取键名集合
+         * @param {string} prefixKey 键名前缀
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysCacheKeysByPrefixKeyPrefixKeyGet(prefixKey: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListString>>> {
+            const localVarAxiosArgs = await SysCacheApiAxiosParamCreator(configuration).apiSysCacheKeysByPrefixKeyPrefixKeyGet(prefixKey, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 获取缓存值
@@ -305,7 +368,7 @@ export const SysCacheApiFactory = function (configuration?: Configuration, baseP
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysCacheDeleteKeyPost(key: string, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+        async apiSysCacheDeleteKeyPost(key: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultInt32>> {
             return SysCacheApiFp(configuration).apiSysCacheDeleteKeyPost(key, options).then((request) => request(axios, basePath));
         },
         /**
@@ -317,6 +380,16 @@ export const SysCacheApiFactory = function (configuration?: Configuration, baseP
         async apiSysCacheKeyListGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListString>> {
             return SysCacheApiFp(configuration).apiSysCacheKeyListGet(options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 根据键名前缀获取键名集合
+         * @param {string} prefixKey 键名前缀
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysCacheKeysByPrefixKeyPrefixKeyGet(prefixKey: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListString>> {
+            return SysCacheApiFp(configuration).apiSysCacheKeysByPrefixKeyPrefixKeyGet(prefixKey, options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 获取缓存值
@@ -356,7 +429,7 @@ export class SysCacheApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysCacheApi
      */
-    public async apiSysCacheDeleteKeyPost(key: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+    public async apiSysCacheDeleteKeyPost(key: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultInt32>> {
         return SysCacheApiFp(this.configuration).apiSysCacheDeleteKeyPost(key, options).then((request) => request(this.axios, this.basePath));
     }
     /**
@@ -369,6 +442,17 @@ export class SysCacheApi extends BaseAPI {
     public async apiSysCacheKeyListGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListString>> {
         return SysCacheApiFp(this.configuration).apiSysCacheKeyListGet(options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 根据键名前缀获取键名集合
+     * @param {string} prefixKey 键名前缀
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysCacheApi
+     */
+    public async apiSysCacheKeysByPrefixKeyPrefixKeyGet(prefixKey: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListString>> {
+        return SysCacheApiFp(this.configuration).apiSysCacheKeysByPrefixKeyPrefixKeyGet(prefixKey, options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 获取缓存值

+ 30 - 14
Web/src/api-services/apis/sys-code-gen-config-api.ts

@@ -55,10 +55,11 @@ export const SysCodeGenConfigApiAxiosParamCreator = function (configuration?: Co
          * @param {string} [displayColumn] 显示文本字段
          * @param {string} [valueColumn] 选中值字段
          * @param {string} [pidColumn] 父级字段
+         * @param {number} [orderNo] 排序
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysCodeGenConfigDetailGet: async (id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysCodeGenConfigDetailGet: async (id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/api/sysCodeGenConfig/detail`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
@@ -187,6 +188,10 @@ export const SysCodeGenConfigApiAxiosParamCreator = function (configuration?: Co
                 localVarQueryParameter['PidColumn'] = pidColumn;
             }
 
+            if (orderNo !== undefined) {
+                localVarQueryParameter['OrderNo'] = orderNo;
+            }
+
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
                 query.set(key, localVarQueryParameter[key]);
@@ -233,10 +238,11 @@ export const SysCodeGenConfigApiAxiosParamCreator = function (configuration?: Co
          * @param {string} [displayColumn] 显示文本字段
          * @param {string} [valueColumn] 选中值字段
          * @param {string} [pidColumn] 父级字段
+         * @param {number} [orderNo] 排序
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysCodeGenConfigListGet: async (id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysCodeGenConfigListGet: async (id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/api/sysCodeGenConfig/list`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
@@ -365,6 +371,10 @@ export const SysCodeGenConfigApiAxiosParamCreator = function (configuration?: Co
                 localVarQueryParameter['PidColumn'] = pidColumn;
             }
 
+            if (orderNo !== undefined) {
+                localVarQueryParameter['OrderNo'] = orderNo;
+            }
+
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
                 query.set(key, localVarQueryParameter[key]);
@@ -468,11 +478,12 @@ export const SysCodeGenConfigApiFp = function(configuration?: Configuration) {
          * @param {string} [displayColumn] 显示文本字段
          * @param {string} [valueColumn] 选中值字段
          * @param {string} [pidColumn] 父级字段
+         * @param {number} [orderNo] 排序
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysCodeGenConfig>>> {
-            const localVarAxiosArgs = await SysCodeGenConfigApiAxiosParamCreator(configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, options);
+        async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysCodeGenConfig>>> {
+            const localVarAxiosArgs = await SysCodeGenConfigApiAxiosParamCreator(configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -508,11 +519,12 @@ export const SysCodeGenConfigApiFp = function(configuration?: Configuration) {
          * @param {string} [displayColumn] 显示文本字段
          * @param {string} [valueColumn] 选中值字段
          * @param {string} [pidColumn] 父级字段
+         * @param {number} [orderNo] 排序
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListCodeGenConfig>>> {
-            const localVarAxiosArgs = await SysCodeGenConfigApiAxiosParamCreator(configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, options);
+        async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListCodeGenConfig>>> {
+            const localVarAxiosArgs = await SysCodeGenConfigApiAxiosParamCreator(configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -571,11 +583,12 @@ export const SysCodeGenConfigApiFactory = function (configuration?: Configuratio
          * @param {string} [displayColumn] 显示文本字段
          * @param {string} [valueColumn] 选中值字段
          * @param {string} [pidColumn] 父级字段
+         * @param {number} [orderNo] 排序
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysCodeGenConfig>> {
-            return SysCodeGenConfigApiFp(configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, options).then((request) => request(axios, basePath));
+        async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysCodeGenConfig>> {
+            return SysCodeGenConfigApiFp(configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -607,11 +620,12 @@ export const SysCodeGenConfigApiFactory = function (configuration?: Configuratio
          * @param {string} [displayColumn] 显示文本字段
          * @param {string} [valueColumn] 选中值字段
          * @param {string} [pidColumn] 父级字段
+         * @param {number} [orderNo] 排序
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListCodeGenConfig>> {
-            return SysCodeGenConfigApiFp(configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, options).then((request) => request(axios, basePath));
+        async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListCodeGenConfig>> {
+            return SysCodeGenConfigApiFp(configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -663,12 +677,13 @@ export class SysCodeGenConfigApi extends BaseAPI {
      * @param {string} [displayColumn] 显示文本字段
      * @param {string} [valueColumn] 选中值字段
      * @param {string} [pidColumn] 父级字段
+     * @param {number} [orderNo] 排序
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysCodeGenConfigApi
      */
-    public async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysCodeGenConfig>> {
-        return SysCodeGenConfigApiFp(this.configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysCodeGenConfigDetailGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysCodeGenConfig>> {
+        return SysCodeGenConfigApiFp(this.configuration).apiSysCodeGenConfigDetailGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 
@@ -700,12 +715,13 @@ export class SysCodeGenConfigApi extends BaseAPI {
      * @param {string} [displayColumn] 显示文本字段
      * @param {string} [valueColumn] 选中值字段
      * @param {string} [pidColumn] 父级字段
+     * @param {number} [orderNo] 排序
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysCodeGenConfigApi
      */
-    public async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListCodeGenConfig>> {
-        return SysCodeGenConfigApiFp(this.configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysCodeGenConfigListGet(id?: number, codeGenId?: number, columnName?: string, lowerColumnName?: string, columnComment?: string, netType?: string, effectType?: string, fkEntityName?: string, fkTableName?: string, lowerFkEntityName?: string, fkColumnName?: string, lowerFkColumnName?: string, fkColumnNetType?: string, dictTypeCode?: string, whetherRetract?: string, whetherRequired?: string, queryWhether?: string, queryType?: string, whetherTable?: string, whetherAddUpdate?: string, columnKey?: string, dataType?: string, whetherCommon?: string, tableNickName?: string, displayColumn?: string, valueColumn?: string, pidColumn?: string, orderNo?: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListCodeGenConfig>> {
+        return SysCodeGenConfigApiFp(this.configuration).apiSysCodeGenConfigListGet(id, codeGenId, columnName, lowerColumnName, columnComment, netType, effectType, fkEntityName, fkTableName, lowerFkEntityName, fkColumnName, lowerFkColumnName, fkColumnNetType, dictTypeCode, whetherRetract, whetherRequired, queryWhether, queryType, whetherTable, whetherAddUpdate, columnKey, dataType, whetherCommon, tableNickName, displayColumn, valueColumn, pidColumn, orderNo, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 

+ 236 - 0
Web/src/api-services/apis/sys-oauth-api.ts

@@ -0,0 +1,236 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * 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 { AdminResultIActionResult } from '../models';
+/**
+ * SysOAuthApi - axios parameter creator
+ * @export
+ */
+export const SysOAuthApiAxiosParamCreator = function (configuration?: Configuration) {
+    return {
+        /**
+         * 
+         * @summary 授权回调
+         * @param {string} [provider] 
+         * @param {string} [redirectUrl] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysOAuthSignInCallbackGet: async (provider?: string, redirectUrl?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysOAuth/signInCallback`;
+            // 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 (provider !== undefined) {
+                localVarQueryParameter['provider'] = provider;
+            }
+
+            if (redirectUrl !== undefined) {
+                localVarQueryParameter['redirectUrl'] = redirectUrl;
+            }
+
+            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 {string} [provider] 
+         * @param {string} [redirectUrl] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysOAuthSignInGet: async (provider?: string, redirectUrl?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysOAuth/signIn`;
+            // 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 (provider !== undefined) {
+                localVarQueryParameter['provider'] = provider;
+            }
+
+            if (redirectUrl !== undefined) {
+                localVarQueryParameter['redirectUrl'] = redirectUrl;
+            }
+
+            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,
+            };
+        },
+    }
+};
+
+/**
+ * SysOAuthApi - functional programming interface
+ * @export
+ */
+export const SysOAuthApiFp = function(configuration?: Configuration) {
+    return {
+        /**
+         * 
+         * @summary 授权回调
+         * @param {string} [provider] 
+         * @param {string} [redirectUrl] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysOAuthSignInCallbackGet(provider?: string, redirectUrl?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultIActionResult>>> {
+            const localVarAxiosArgs = await SysOAuthApiAxiosParamCreator(configuration).apiSysOAuthSignInCallbackGet(provider, redirectUrl, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+        /**
+         * 
+         * @summary 第三方登录
+         * @param {string} [provider] 
+         * @param {string} [redirectUrl] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysOAuthSignInGet(provider?: string, redirectUrl?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultIActionResult>>> {
+            const localVarAxiosArgs = await SysOAuthApiAxiosParamCreator(configuration).apiSysOAuthSignInGet(provider, redirectUrl, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+    }
+};
+
+/**
+ * SysOAuthApi - factory interface
+ * @export
+ */
+export const SysOAuthApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    return {
+        /**
+         * 
+         * @summary 授权回调
+         * @param {string} [provider] 
+         * @param {string} [redirectUrl] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysOAuthSignInCallbackGet(provider?: string, redirectUrl?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultIActionResult>> {
+            return SysOAuthApiFp(configuration).apiSysOAuthSignInCallbackGet(provider, redirectUrl, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 第三方登录
+         * @param {string} [provider] 
+         * @param {string} [redirectUrl] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysOAuthSignInGet(provider?: string, redirectUrl?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultIActionResult>> {
+            return SysOAuthApiFp(configuration).apiSysOAuthSignInGet(provider, redirectUrl, options).then((request) => request(axios, basePath));
+        },
+    };
+};
+
+/**
+ * SysOAuthApi - object-oriented interface
+ * @export
+ * @class SysOAuthApi
+ * @extends {BaseAPI}
+ */
+export class SysOAuthApi extends BaseAPI {
+    /**
+     * 
+     * @summary 授权回调
+     * @param {string} [provider] 
+     * @param {string} [redirectUrl] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysOAuthApi
+     */
+    public async apiSysOAuthSignInCallbackGet(provider?: string, redirectUrl?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultIActionResult>> {
+        return SysOAuthApiFp(this.configuration).apiSysOAuthSignInCallbackGet(provider, redirectUrl, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary 第三方登录
+     * @param {string} [provider] 
+     * @param {string} [redirectUrl] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysOAuthApi
+     */
+    public async apiSysOAuthSignInGet(provider?: string, redirectUrl?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultIActionResult>> {
+        return SysOAuthApiFp(this.configuration).apiSysOAuthSignInGet(provider, redirectUrl, options).then((request) => request(this.axios, this.basePath));
+    }
+}

+ 137 - 0
Web/src/api-services/apis/sys-sms-api.ts

@@ -0,0 +1,137 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * 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';
+/**
+ * SysSmsApi - axios parameter creator
+ * @export
+ */
+export const SysSmsApiAxiosParamCreator = function (configuration?: Configuration) {
+    return {
+        /**
+         * 
+         * @summary 发送短信
+         * @param {string} phoneNumber 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysSmsSendSmsPhoneNumberPost: async (phoneNumber: 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.');
+            }
+            const localVarPath = `/api/sysSms/sendSms/{phoneNumber}`
+                .replace(`{${"phoneNumber"}}`, encodeURIComponent(String(phoneNumber)));
+            // 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,
+            };
+        },
+    }
+};
+
+/**
+ * SysSmsApi - functional programming interface
+ * @export
+ */
+export const SysSmsApiFp = function(configuration?: Configuration) {
+    return {
+        /**
+         * 
+         * @summary 发送短信
+         * @param {string} phoneNumber 
+         * @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);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+    }
+};
+
+/**
+ * SysSmsApi - factory interface
+ * @export
+ */
+export const SysSmsApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    return {
+        /**
+         * 
+         * @summary 发送短信
+         * @param {string} phoneNumber 
+         * @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));
+        },
+    };
+};
+
+/**
+ * SysSmsApi - object-oriented interface
+ * @export
+ * @class SysSmsApi
+ * @extends {BaseAPI}
+ */
+export class SysSmsApi extends BaseAPI {
+    /**
+     * 
+     * @summary 发送短信
+     * @param {string} phoneNumber 
+     * @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));
+    }
+}

+ 4 - 3
Web/src/api-services/apis/sys-user-api.ts

@@ -18,6 +18,7 @@ import { Configuration } from '../configuration';
 import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
 import { AddUserInput } from '../models';
 import { AdminResultInt32 } from '../models';
+import { AdminResultInt64 } from '../models';
 import { AdminResultListInt64 } from '../models';
 import { AdminResultListSysUserExtOrg } from '../models';
 import { AdminResultSqlSugarPagedListSysUser } from '../models';
@@ -626,7 +627,7 @@ export const SysUserApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysUserAddPost(body?: AddUserInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+        async apiSysUserAddPost(body?: AddUserInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultInt64>>> {
             const localVarAxiosArgs = await SysUserApiAxiosParamCreator(configuration).apiSysUserAddPost(body, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@@ -802,7 +803,7 @@ export const SysUserApiFactory = function (configuration?: Configuration, basePa
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysUserAddPost(body?: AddUserInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+        async apiSysUserAddPost(body?: AddUserInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultInt64>> {
             return SysUserApiFp(configuration).apiSysUserAddPost(body, options).then((request) => request(axios, basePath));
         },
         /**
@@ -932,7 +933,7 @@ export class SysUserApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysUserApi
      */
-    public async apiSysUserAddPost(body?: AddUserInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+    public async apiSysUserAddPost(body?: AddUserInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultInt64>> {
         return SysUserApiFp(this.configuration).apiSysUserAddPost(body, options).then((request) => request(this.axios, this.basePath));
     }
     /**

+ 243 - 0
Web/src/api-services/apis/sys-wechat-api.ts

@@ -18,7 +18,9 @@ import { Configuration } from '../configuration';
 import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
 import { AdminResultObject } from '../models';
 import { AdminResultString } from '../models';
+import { DeleteMessageTemplateInput } from '../models';
 import { GenAuthUrlInput } from '../models';
+import { MessageTemplateSendInput } from '../models';
 import { SignatureInput } from '../models';
 import { WechatUserLogin } from '../models';
 /**
@@ -27,6 +29,54 @@ import { WechatUserLogin } from '../models';
  */
 export const SysWechatApiAxiosParamCreator = function (configuration?: Configuration) {
     return {
+        /**
+         * 
+         * @summary 删除模板
+         * @param {DeleteMessageTemplateInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysWechatDeleteMessageTemplatePost: async (body?: DeleteMessageTemplateInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysWechat/deleteMessageTemplate`;
+            // 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 生成网页授权Url
@@ -123,6 +173,49 @@ export const SysWechatApiAxiosParamCreator = function (configuration?: Configura
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 获取模板列表
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysWechatMessageTemplateListGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysWechat/messageTemplateList`;
+            // 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 微信用户登录OpenId
@@ -171,6 +264,54 @@ export const SysWechatApiAxiosParamCreator = function (configuration?: Configura
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 发送模板消息
+         * @param {MessageTemplateSendInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysWechatSendTemplateMessagePost: async (body?: MessageTemplateSendInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysWechat/sendTemplateMessage`;
+            // 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 获取微信用户OpenId
@@ -232,6 +373,20 @@ export const SysWechatApiAxiosParamCreator = function (configuration?: Configura
  */
 export const SysWechatApiFp = function(configuration?: Configuration) {
     return {
+        /**
+         * 
+         * @summary 删除模板
+         * @param {DeleteMessageTemplateInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWechatDeleteMessageTemplatePost(body?: DeleteMessageTemplateInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
+            const localVarAxiosArgs = await SysWechatApiAxiosParamCreator(configuration).apiSysWechatDeleteMessageTemplatePost(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 生成网页授权Url
@@ -260,6 +415,19 @@ export const SysWechatApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 获取模板列表
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWechatMessageTemplateListGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
+            const localVarAxiosArgs = await SysWechatApiAxiosParamCreator(configuration).apiSysWechatMessageTemplateListGet(options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 微信用户登录OpenId
@@ -274,6 +442,20 @@ export const SysWechatApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 发送模板消息
+         * @param {MessageTemplateSendInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWechatSendTemplateMessagePost(body?: MessageTemplateSendInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
+            const localVarAxiosArgs = await SysWechatApiAxiosParamCreator(configuration).apiSysWechatSendTemplateMessagePost(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 获取微信用户OpenId
@@ -297,6 +479,16 @@ export const SysWechatApiFp = function(configuration?: Configuration) {
  */
 export const SysWechatApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
     return {
+        /**
+         * 
+         * @summary 删除模板
+         * @param {DeleteMessageTemplateInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWechatDeleteMessageTemplatePost(body?: DeleteMessageTemplateInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
+            return SysWechatApiFp(configuration).apiSysWechatDeleteMessageTemplatePost(body, options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 生成网页授权Url
@@ -317,6 +509,15 @@ export const SysWechatApiFactory = function (configuration?: Configuration, base
         async apiSysWechatGenConfigParaPost(body?: SignatureInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
             return SysWechatApiFp(configuration).apiSysWechatGenConfigParaPost(body, options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 获取模板列表
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWechatMessageTemplateListGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
+            return SysWechatApiFp(configuration).apiSysWechatMessageTemplateListGet(options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 微信用户登录OpenId
@@ -327,6 +528,16 @@ export const SysWechatApiFactory = function (configuration?: Configuration, base
         async apiSysWechatOpenIdLoginPost(body?: WechatUserLogin, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
             return SysWechatApiFp(configuration).apiSysWechatOpenIdLoginPost(body, options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 发送模板消息
+         * @param {MessageTemplateSendInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWechatSendTemplateMessagePost(body?: MessageTemplateSendInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
+            return SysWechatApiFp(configuration).apiSysWechatSendTemplateMessagePost(body, options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 获取微信用户OpenId
@@ -347,6 +558,17 @@ export const SysWechatApiFactory = function (configuration?: Configuration, base
  * @extends {BaseAPI}
  */
 export class SysWechatApi extends BaseAPI {
+    /**
+     * 
+     * @summary 删除模板
+     * @param {DeleteMessageTemplateInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysWechatApi
+     */
+    public async apiSysWechatDeleteMessageTemplatePost(body?: DeleteMessageTemplateInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
+        return SysWechatApiFp(this.configuration).apiSysWechatDeleteMessageTemplatePost(body, options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 生成网页授权Url
@@ -369,6 +591,16 @@ export class SysWechatApi extends BaseAPI {
     public async apiSysWechatGenConfigParaPost(body?: SignatureInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
         return SysWechatApiFp(this.configuration).apiSysWechatGenConfigParaPost(body, options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 获取模板列表
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysWechatApi
+     */
+    public async apiSysWechatMessageTemplateListGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
+        return SysWechatApiFp(this.configuration).apiSysWechatMessageTemplateListGet(options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 微信用户登录OpenId
@@ -380,6 +612,17 @@ export class SysWechatApi extends BaseAPI {
     public async apiSysWechatOpenIdLoginPost(body?: WechatUserLogin, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
         return SysWechatApiFp(this.configuration).apiSysWechatOpenIdLoginPost(body, options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 发送模板消息
+     * @param {MessageTemplateSendInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysWechatApi
+     */
+    public async apiSysWechatSendTemplateMessagePost(body?: MessageTemplateSendInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
+        return SysWechatApiFp(this.configuration).apiSysWechatSendTemplateMessagePost(body, options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 获取微信用户OpenId

+ 34 - 34
Web/src/api-services/apis/sys-wx-open-api.ts

@@ -78,20 +78,19 @@ export const SysWxOpenApiAxiosParamCreator = function (configuration?: Configura
         },
         /**
          * 
-         * @summary 发送订阅消息
-         * @param {SendSubscribeMessageInput} [body] 
+         * @summary 获取订阅消息模板列表
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysWxOpenSendSubscribeMessagePost: async (body?: SendSubscribeMessageInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            const localVarPath = `/api/sysWxOpen/sendSubscribeMessage`;
+        apiSysWxOpenMessageTemplateListGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysWxOpen/messageTemplateList`;
             // 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 localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
@@ -104,8 +103,6 @@ export const SysWxOpenApiAxiosParamCreator = function (configuration?: Configura
                 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]);
@@ -116,8 +113,6 @@ export const SysWxOpenApiAxiosParamCreator = function (configuration?: Configura
             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,
@@ -126,19 +121,20 @@ export const SysWxOpenApiAxiosParamCreator = function (configuration?: Configura
         },
         /**
          * 
-         * @summary 获取订阅消息模板列表
+         * @summary 发送订阅消息
+         * @param {SendSubscribeMessageInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysWxOpenSubscribeMessageTemplateListGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
-            const localVarPath = `/api/sysWxOpen/subscribeMessageTemplateList`;
+        apiSysWxOpenSendSubscribeMessagePost: async (body?: SendSubscribeMessageInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysWxOpen/sendSubscribeMessage`;
             // 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 localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
             const localVarHeaderParameter = {} as any;
             const localVarQueryParameter = {} as any;
 
@@ -151,6 +147,8 @@ export const SysWxOpenApiAxiosParamCreator = function (configuration?: Configura
                 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]);
@@ -161,6 +159,8 @@ export const SysWxOpenApiAxiosParamCreator = function (configuration?: Configura
             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,
@@ -353,13 +353,12 @@ export const SysWxOpenApiFp = function(configuration?: Configuration) {
         },
         /**
          * 
-         * @summary 发送订阅消息
-         * @param {SendSubscribeMessageInput} [body] 
+         * @summary 获取订阅消息模板列表
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysWxOpenSendSubscribeMessagePost(body?: SendSubscribeMessageInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
-            const localVarAxiosArgs = await SysWxOpenApiAxiosParamCreator(configuration).apiSysWxOpenSendSubscribeMessagePost(body, options);
+        async apiSysWxOpenMessageTemplateListGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
+            const localVarAxiosArgs = await SysWxOpenApiAxiosParamCreator(configuration).apiSysWxOpenMessageTemplateListGet(options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -367,12 +366,13 @@ export const SysWxOpenApiFp = function(configuration?: Configuration) {
         },
         /**
          * 
-         * @summary 获取订阅消息模板列表
+         * @summary 发送订阅消息
+         * @param {SendSubscribeMessageInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysWxOpenSubscribeMessageTemplateListGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
-            const localVarAxiosArgs = await SysWxOpenApiAxiosParamCreator(configuration).apiSysWxOpenSubscribeMessageTemplateListGet(options);
+        async apiSysWxOpenSendSubscribeMessagePost(body?: SendSubscribeMessageInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
+            const localVarAxiosArgs = await SysWxOpenApiAxiosParamCreator(configuration).apiSysWxOpenSendSubscribeMessagePost(body, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -442,22 +442,22 @@ export const SysWxOpenApiFactory = function (configuration?: Configuration, base
         },
         /**
          * 
-         * @summary 发送订阅消息
-         * @param {SendSubscribeMessageInput} [body] 
+         * @summary 获取订阅消息模板列表
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysWxOpenSendSubscribeMessagePost(body?: SendSubscribeMessageInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
-            return SysWxOpenApiFp(configuration).apiSysWxOpenSendSubscribeMessagePost(body, options).then((request) => request(axios, basePath));
+        async apiSysWxOpenMessageTemplateListGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
+            return SysWxOpenApiFp(configuration).apiSysWxOpenMessageTemplateListGet(options).then((request) => request(axios, basePath));
         },
         /**
          * 
-         * @summary 获取订阅消息模板列表
+         * @summary 发送订阅消息
+         * @param {SendSubscribeMessageInput} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysWxOpenSubscribeMessageTemplateListGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
-            return SysWxOpenApiFp(configuration).apiSysWxOpenSubscribeMessageTemplateListGet(options).then((request) => request(axios, basePath));
+        async apiSysWxOpenSendSubscribeMessagePost(body?: SendSubscribeMessageInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
+            return SysWxOpenApiFp(configuration).apiSysWxOpenSendSubscribeMessagePost(body, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -513,24 +513,24 @@ export class SysWxOpenApi extends BaseAPI {
     }
     /**
      * 
-     * @summary 发送订阅消息
-     * @param {SendSubscribeMessageInput} [body] 
+     * @summary 获取订阅消息模板列表
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysWxOpenApi
      */
-    public async apiSysWxOpenSendSubscribeMessagePost(body?: SendSubscribeMessageInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
-        return SysWxOpenApiFp(this.configuration).apiSysWxOpenSendSubscribeMessagePost(body, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysWxOpenMessageTemplateListGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
+        return SysWxOpenApiFp(this.configuration).apiSysWxOpenMessageTemplateListGet(options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 
-     * @summary 获取订阅消息模板列表
+     * @summary 发送订阅消息
+     * @param {SendSubscribeMessageInput} [body] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysWxOpenApi
      */
-    public async apiSysWxOpenSubscribeMessageTemplateListGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
-        return SysWxOpenApiFp(this.configuration).apiSysWxOpenSubscribeMessageTemplateListGet(options).then((request) => request(this.axios, this.basePath));
+    public async apiSysWxOpenSendSubscribeMessagePost(body?: SendSubscribeMessageInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
+        return SysWxOpenApiFp(this.configuration).apiSysWxOpenSendSubscribeMessagePost(body, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 

+ 1 - 1
Web/src/api-services/models/add-subscribe-message-template-input.ts

@@ -12,7 +12,7 @@
  * Do not edit the class manually.
  */
 /**
- * 
+ * 增加订阅消息模板
  * @export
  * @interface AddSubscribeMessageTemplateInput
  */

+ 6 - 0
Web/src/api-services/models/code-gen-config.ts

@@ -179,4 +179,10 @@ export interface CodeGenConfig {
      * @memberof CodeGenConfig
      */
     pidColumn?: string | null;
+    /**
+     * 排序
+     * @type {number}
+     * @memberof CodeGenConfig
+     */
+    orderNo?: number;
 }

+ 5 - 0
Web/src/api-services/models/db-type.ts

@@ -33,6 +33,11 @@ export enum DbType {
     NUMBER_13 = 13,
     NUMBER_14 = 14,
     NUMBER_15 = 15,
+    NUMBER_16 = 16,
+    NUMBER_17 = 17,
+    NUMBER_18 = 18,
+    NUMBER_19 = 19,
+    NUMBER_20 = 20,
     NUMBER_900 = 900
 }
 

+ 26 - 0
Web/src/api-services/models/delete-message-template-input.ts

@@ -0,0 +1,26 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * 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 DeleteMessageTemplateInput
+ */
+export interface DeleteMessageTemplateInput {
+    /**
+     * 订阅模板Id
+     * @type {string}
+     * @memberof DeleteMessageTemplateInput
+     */
+    templateId: string;
+}

+ 1 - 1
Web/src/api-services/models/gen-auth-url-input.ts

@@ -12,7 +12,7 @@
  * Do not edit the class manually.
  */
 /**
- * 
+ * 生成网页授权Url
  * @export
  * @interface GenAuthUrlInput
  */

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

@@ -110,6 +110,7 @@ export * from './delete-file-input';
 export * from './delete-job-detail-input';
 export * from './delete-job-trigger-input';
 export * from './delete-menu-input';
+export * from './delete-message-template-input';
 export * from './delete-notice-input';
 export * from './delete-org-input';
 export * from './delete-plugin-input';
@@ -138,10 +139,12 @@ export * from './log-input';
 export * from './log-level';
 export * from './login-input';
 export * from './login-output';
+export * from './login-phone-input';
 export * from './login-user-output';
 export * from './menu-output';
 export * from './menu-type-enum';
 export * from './message-input';
+export * from './message-template-send-input';
 export * from './message-type-enum';
 export * from './notice-input';
 export * from './notice-status-enum';

+ 32 - 0
Web/src/api-services/models/login-phone-input.ts

@@ -0,0 +1,32 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * 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 LoginPhoneInput
+ */
+export interface LoginPhoneInput {
+    /**
+     * 手机号码
+     * @type {string}
+     * @memberof LoginPhoneInput
+     */
+    phone: string;
+    /**
+     * 验证码
+     * @type {string}
+     * @memberof LoginPhoneInput
+     */
+    code: string;
+}

+ 44 - 0
Web/src/api-services/models/message-template-send-input.ts

@@ -0,0 +1,44 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * 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 MessageTemplateSendInput
+ */
+export interface MessageTemplateSendInput {
+    /**
+     * 订阅模板Id
+     * @type {string}
+     * @memberof MessageTemplateSendInput
+     */
+    templateId: string;
+    /**
+     * 接收者的OpenId
+     * @type {string}
+     * @memberof MessageTemplateSendInput
+     */
+    toUserOpenId: string;
+    /**
+     * 模板跳转链接
+     * @type {string}
+     * @memberof MessageTemplateSendInput
+     */
+    url?: string | null;
+    /**
+     * 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)
+     * @type {string}
+     * @memberof MessageTemplateSendInput
+     */
+    miniProgramPagePath?: string | null;
+}

+ 2 - 3
Web/src/api-services/models/platform-type-enum.ts

@@ -12,7 +12,7 @@
  * Do not edit the class manually.
  */
 /**
- * 平台类型枚举<br />&nbsp;微信公众号 微信公众号 = 1<br />&nbsp;微信小程序 微信小程序 = 2<br />&nbsp;支付宝小程序 支付宝小程序 = 3<br />&nbsp;微信APP快捷登陆 微信APP快捷登陆 = 4<br />&nbsp;QQ在APP中快捷登陆 QQ在APP中快捷登陆 = 5<br />&nbsp;头条系小程序 头条系小程序 = 6<br />
+ * 平台类型枚举<br />&nbsp;微信公众号 微信公众号 = 1<br />&nbsp;微信小程序 微信小程序 = 2<br />&nbsp;QQ QQ = 3<br />&nbsp;支付宝 Alipay = 4<br />&nbsp;Gitee Gitee = 5<br />
  * @export
  * @enum {string}
  */
@@ -21,7 +21,6 @@ export enum PlatformTypeEnum {
     NUMBER_2 = 2,
     NUMBER_3 = 3,
     NUMBER_4 = 4,
-    NUMBER_5 = 5,
-    NUMBER_6 = 6
+    NUMBER_5 = 5
 }
 

+ 2 - 2
Web/src/api-services/models/send-subscribe-message-input.ts

@@ -13,7 +13,7 @@
  */
 import { DataItem } from './data-item';
 /**
- * 
+ * 发送订阅消息
  * @export
  * @interface SendSubscribeMessageInput
  */
@@ -31,7 +31,7 @@ export interface SendSubscribeMessageInput {
      */
     toUserOpenId: string;
     /**
-     * 模板内容,格式形如 { \"key1\": { \"value\": any }, \"key2\": { \"value\": any } }的object
+     * 模板内容,格式形如 { \"key1\": { \"value\": any }, \"key2\": { \"value\": any } }
      * @type {{ [key: string]: DataItem; }}
      * @memberof SendSubscribeMessageInput
      */

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

@@ -12,7 +12,7 @@
  * Do not edit the class manually.
  */
 /**
- * 
+ * 获取配置签名
  * @export
  * @interface SignatureInput
  */

+ 6 - 0
Web/src/api-services/models/sys-code-gen-config.ts

@@ -185,4 +185,10 @@ export interface SysCodeGenConfig {
      * @memberof SysCodeGenConfig
      */
     pidColumn?: string | null;
+    /**
+     * 排序
+     * @type {number}
+     * @memberof SysCodeGenConfig
+     */
+    orderNo?: number;
 }

+ 7 - 1
Web/src/api-services/models/sys-file.ts

@@ -66,7 +66,7 @@ export interface SysFile {
      */
     bucketName?: string | null;
     /**
-     * 文件名称(上传时名称
+     * 文件名称(源文件名
      * @type {string}
      * @memberof SysFile
      */
@@ -101,4 +101,10 @@ export interface SysFile {
      * @memberof SysFile
      */
     url?: string | null;
+    /**
+     * 文件MD5
+     * @type {string}
+     * @memberof SysFile
+     */
+    fileMd5?: string | null;
 }

+ 6 - 6
Web/src/api-services/models/sys-region.ts

@@ -24,18 +24,18 @@ export interface SysRegion {
      * @memberof SysRegion
      */
     id?: number;
-    /**
-     * 父Id
-     * @type {number}
-     * @memberof SysRegion
-     */
-    pid?: number;
     /**
      * 名称
      * @type {string}
      * @memberof SysRegion
      */
     name: string;
+    /**
+     * 父Id
+     * @type {number}
+     * @memberof SysRegion
+     */
+    pid?: number;
     /**
      * 简称
      * @type {string}

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

@@ -12,7 +12,7 @@
  * Do not edit the class manually.
  */
 /**
- * 
+ * 微信用户登录
  * @export
  * @interface WechatUserLogin
  */

+ 1 - 1
Web/src/api-services/models/wx-open-id-login-input.ts

@@ -12,7 +12,7 @@
  * Do not edit the class manually.
  */
 /**
- * 
+ * 微信小程序登录
  * @export
  * @interface WxOpenIdLoginInput
  */

+ 3 - 1
Web/src/views/login/component/account.vue

@@ -94,7 +94,6 @@ const route = useRoute();
 const router = useRouter();
 
 const ruleFormRef = ref();
-
 const accountRef = ref<InputInstance>();
 const passwordRef = ref<InputInstance>();
 const codeRef = ref<InputInstance>();
@@ -240,6 +239,9 @@ const handleSignIn = () => {
 // const weixinSignIn = () => {
 // 	window.open('http://localhost:5005/api/sysoauth/signin?provider=Gitee&redirectUrl=http://localhost:8888');
 // };
+
+// 导出对象
+defineExpose({ saveTokenAndInitRoutes });
 </script>
 
 <style lang="scss" scoped>

+ 57 - 6
Web/src/views/login/component/mobile.vue

@@ -1,7 +1,7 @@
 <template>
 	<el-form size="large" class="login-content-form">
 		<el-form-item class="login-animation1">
-			<el-input text :placeholder="$t('message.mobile.placeholder1')" v-model="state.ruleForm.userName" clearable autocomplete="off">
+			<el-input text :placeholder="$t('message.mobile.placeholder1')" v-model="state.ruleForm.phone" clearable autocomplete="off">
 				<template #prefix>
 					<i class="iconfont icon-dianhua el-input__icon"></i>
 				</template>
@@ -9,7 +9,7 @@
 		</el-form-item>
 		<el-form-item class="login-animation2">
 			<el-col :span="15">
-				<el-input text maxlength="4" :placeholder="$t('message.mobile.placeholder2')" v-model="state.ruleForm.code" clearable autocomplete="off">
+				<el-input text maxlength="6" :placeholder="$t('message.mobile.placeholder2')" v-model="state.ruleForm.code" clearable autocomplete="off">
 					<template #prefix>
 						<el-icon class="el-input__icon"><ele-Position /></el-icon>
 					</template>
@@ -17,11 +17,13 @@
 			</el-col>
 			<el-col :span="1"></el-col>
 			<el-col :span="8">
-				<el-button v-waves class="login-content-code">{{ $t('message.mobile.codeText') }}</el-button>
+				<el-button v-waves class="login-content-code" :loading="state.loading" :disabled="state.disabled" @click="getSmsCode">
+					{{ state.btnText }}
+				</el-button>
 			</el-col>
 		</el-form-item>
 		<el-form-item class="login-animation3">
-			<el-button round type="primary" v-waves class="login-content-submit">
+			<el-button round type="primary" v-waves class="login-content-submit" @click="onSignIn">
 				<span>{{ $t('message.mobile.btnText') }}</span>
 			</el-button>
 		</el-form-item>
@@ -31,14 +33,63 @@
 
 <script setup lang="ts" name="loginMobile">
 import { reactive } from 'vue';
+import { ElMessage } from 'element-plus';
+import { verifyPhone } from '/@/utils/toolsValidate';
+
+import { getAPI } from '/@/utils/axios-utils';
+import { SysSmsApi, SysAuthApi } from '/@/api-services/api';
 
-// 定义变量内容
 const state = reactive({
 	ruleForm: {
-		userName: '',
+		phone: '',
 		code: '',
 	},
+	btnText: '获取验证码',
+	loading: false,
+	disabled: false,
+	timer: null as any,
 });
+
+// 获取短信验证码
+const getSmsCode = async () => {
+	state.ruleForm.code = '';
+	if (!verifyPhone(state.ruleForm.phone)) {
+		ElMessage.error('请正确输入手机号码!');
+		return;
+	}
+
+	await getAPI(SysSmsApi).apiSysSmsSendSmsPhoneNumberPost(state.ruleForm.phone);
+
+	// 倒计时期间禁止点击
+	state.disabled = true;
+
+	// 清除定时器
+	state.timer && clearInterval(state.timer);
+
+	// 开启定时器
+	var duration = 60;
+	state.timer = setInterval(() => {
+		duration--;
+		state.btnText = `${duration} 秒后重新获取`;
+		if (duration <= 0) {
+			state.btnText = '获取验证码';
+			state.disabled = false; // 恢复按钮可以点击
+			clearInterval(state.timer); // 清除掉定时器
+		}
+	}, 1000);
+};
+
+// 登录
+const onSignIn = async () => {
+	var res = await getAPI(SysAuthApi).apiSysAuthLoginPhonePost(state.ruleForm);
+	if (res.data.result?.accessToken == undefined) {
+		ElMessage.error('登录失败,请检查账号!');
+		return;
+	}
+
+	// // 系统登录
+	// await accountRef.value?.saveTokenAndInitRoutes(res.data.result?.accessToken);
+};
 </script>
 
 <style scoped lang="scss">