Explorar el Código

😁众多细节功能调整

zuohuaijun hace 3 años
padre
commit
74900d3e58
Se han modificado 40 ficheros con 888 adiciones y 176 borrados
  1. 8 8
      Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
  2. 71 21
      Admin.NET/Admin.NET.Core/Admin.NET.Core.xml
  3. 2 2
      Admin.NET/Admin.NET.Core/Const/ClaimConst.cs
  4. 2 2
      Admin.NET/Admin.NET.Core/Entity/EntityBase.cs
  5. 9 2
      Admin.NET/Admin.NET.Core/Entity/SysWechatUser.cs
  6. 19 0
      Admin.NET/Admin.NET.Core/Enum/LoginModeEnum.cs
  7. 0 19
      Admin.NET/Admin.NET.Core/Enum/RunModeEnum.cs
  8. 0 16
      Admin.NET/Admin.NET.Core/Enum/WechatReturnCodeEnum.cs
  9. 4 4
      Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs
  10. 1 0
      Admin.NET/Admin.NET.Core/Service/APIJSON/APIJSONService.cs
  11. 7 7
      Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs
  12. 1 1
      Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs
  13. 4 12
      Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs
  14. 5 3
      Admin.NET/Admin.NET.Core/Service/User/UserManager.cs
  15. 2 2
      Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatInput.cs
  16. 1 1
      Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatUserInput.cs
  17. 37 0
      Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenInput.cs
  18. 11 0
      Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenOutput.cs
  19. 9 9
      Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs
  20. 1 1
      Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatUserService.cs
  21. 110 0
      Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs
  22. 1 1
      Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs
  23. 1 1
      Admin.NET/Admin.NET.Core/Util/CodeGenUtil.cs
  24. 4 0
      Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs
  25. 10 10
      Admin.NET/Admin.NET.Web.Core/Startup.cs
  26. 11 1
      Admin.NET/Admin.NET.Web.Entry/Program.cs
  27. 12 0
      Admin.NET/Admin.NET.Web.Entry/web.config
  28. 12 0
      Admin.NET/Admin.NET.sln
  29. 1 0
      Web/src/api-services/api.ts
  30. 6 7
      Web/src/api-services/apis/sys-dict-data-api.ts
  31. 25 26
      Web/src/api-services/apis/sys-wechat-api.ts
  32. 13 13
      Web/src/api-services/apis/sys-wechat-user-api.ts
  33. 305 0
      Web/src/api-services/apis/sys-wx-open-api.ts
  34. 57 0
      Web/src/api-services/models/admin-result-wx-open-id-output.ts
  35. 57 0
      Web/src/api-services/models/admin-result-wx-phone-output.ts
  36. 5 1
      Web/src/api-services/models/index.ts
  37. 7 1
      Web/src/api-services/models/sys-wechat-user.ts
  38. 26 0
      Web/src/api-services/models/wx-open-id-login-input.ts
  39. 5 5
      Web/src/api-services/models/wx-open-id-output.ts
  40. 26 0
      Web/src/api-services/models/wx-phone-output.ts

+ 8 - 8
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -18,23 +18,23 @@
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.3.0" />
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
     <PackageReference Include="DotNetCore.Compile.Environment" Version="3.2.0" />
-    <PackageReference Include="DotNetCore.Natasha.CSharp" Version="5.0.2" />
+    <PackageReference Include="DotNetCore.Natasha.CSharp" Version="5.1.0" />
     <PackageReference Include="FluentEmail.Smtp" Version="3.0.2" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.7.2" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.7.2" />
-    <PackageReference Include="Furion.Pure" Version="4.8.7" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.7.5" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.7.5" />
+    <PackageReference Include="Furion.Pure" Version="4.8.7.5" />
     <PackageReference Include="IPTools.China" Version="1.6.0" />
-    <PackageReference Include="Lazy.Captcha.Core" Version="2.0.1" />
+    <PackageReference Include="Lazy.Captcha.Core" Version="2.0.2" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.4.2" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.4.2" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.14" />
     <PackageReference Include="NEST" Version="7.17.5" />
     <PackageReference Include="NewLife.Redis" Version="5.2.2023.301" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.9" />
-    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.24.0" />
+    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.25.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.15.2" />
-    <PackageReference Include="SqlSugarCore" Version="5.1.3.52" />
-    <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.25" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.58" />
+    <PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.1" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
   </ItemGroup>

+ 71 - 21
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -167,9 +167,9 @@
             微信OpenId
             </summary>
         </member>
-        <member name="F:Admin.NET.Core.ClaimConst.RunMode">
+        <member name="F:Admin.NET.Core.ClaimConst.LoginMode">
             <summary>
-            运行模式(账号和三方授权)
+            登录模式PC、APP
             </summary>
         </member>
         <member name="T:Admin.NET.Core.CommonConst">
@@ -1989,7 +1989,7 @@
         </member>
         <member name="P:Admin.NET.Core.SysWechatUser.SessionKey">
             <summary>
-            缓存key
+            会话密钥
             </summary>
         </member>
         <member name="P:Admin.NET.Core.SysWechatUser.UnionId">
@@ -2052,6 +2052,11 @@
             过期时间
             </summary>
         </member>
+        <member name="P:Admin.NET.Core.SysWechatUser.Scope">
+            <summary>
+            用户授权的作用域,使用逗号分隔
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.AccountTypeEnum">
             <summary>
             账号类型枚举
@@ -2797,6 +2802,21 @@
             其他
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.LoginModeEnum">
+            <summary>
+            登录模式枚举
+            </summary>
+        </member>
+        <member name="F:Admin.NET.Core.LoginModeEnum.PC">
+            <summary>
+            PC模式
+            </summary>
+        </member>
+        <member name="F:Admin.NET.Core.LoginModeEnum.APP">
+            <summary>
+            APP
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.LoginTypeEnum">
             <summary>
             登录类型枚举
@@ -2982,21 +3002,6 @@
             DELETE
             </summary>
         </member>
-        <member name="T:Admin.NET.Core.RunModeEnum">
-            <summary>
-            运行模式枚举
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.RunModeEnum.Account">
-            <summary>
-            账号模式
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.RunModeEnum.OpenID">
-            <summary>
-            三方授权
-            </summary>
-        </member>
         <member name="T:Admin.NET.Core.StatusEnum">
             <summary>
             通用状态枚举
@@ -4076,6 +4081,7 @@
             统一入口
             </summary>
             <param name="jobject"></param>
+            <remarks>参数:{"[]":{"SYS_LOG_OP":{}}}</remarks>
             <returns></returns>
         </member>
         <member name="T:Admin.NET.Core.Service.FuncList">
@@ -7173,11 +7179,31 @@
             昵称
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.Service.WechatUserInput.Mobile">
+        <member name="P:Admin.NET.Core.Service.WechatUserInput.PhoneNumber">
             <summary>
             手机号码
             </summary>
         </member>
+        <member name="P:Admin.NET.Core.Service.JsCode2SessionInput.JsCode">
+            <summary>
+            JsCode
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.WxPhoneInput.Code">
+            <summary>
+            Code
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.WxOpenIdLoginInput.OpenId">
+            <summary>
+            OpenId
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.WxPhoneLoginInput.PhoneNumber">
+            <summary>
+            电话号码
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.Service.SysWechatPayService">
             <summary>
             微信支付服务
@@ -7239,13 +7265,13 @@
         </member>
         <member name="M:Admin.NET.Core.Service.SysWechatService.SnsOAuth2(Admin.NET.Core.Service.WechatOAuth2Input)">
             <summary>
-            授权登录(Code换取OpenId)
+            获取微信用户OpenId
             </summary>
             <param name="input"></param>
         </member>
         <member name="M:Admin.NET.Core.Service.SysWechatService.OpenIdLogin(Admin.NET.Core.Service.WechatUserLogin)">
             <summary>
-            微信用户登录
+            微信用户登录OpenId
             </summary>
             <param name="input"></param>
             <returns></returns>
@@ -7289,6 +7315,30 @@
             <param name="input"></param>
             <returns></returns>
         </member>
+        <member name="T:Admin.NET.Core.Service.SysWxOpenService">
+            <summary>
+            微信小程序服务
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysWxOpenService.GetWxOpenId(Admin.NET.Core.Service.JsCode2SessionInput)">
+            <summary>
+            获取微信用户OpenId
+            </summary>
+            <param name="input"></param>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysWxOpenService.GetWxPhone(Admin.NET.Core.Service.WxPhoneInput)">
+            <summary>
+            获取微信用户电话号码
+            </summary>
+            <param name="input"></param>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysWxOpenService.WxOpenIdLogin(Admin.NET.Core.Service.WxOpenIdLoginInput)">
+            <summary>
+            微信小程序登录OpenId
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
         <member name="T:Admin.NET.Core.Service.WechatApiHttpClient">
             <summary>
             微信API客户端

+ 2 - 2
Admin.NET/Admin.NET.Core/Const/ClaimConst.cs

@@ -51,7 +51,7 @@ public class ClaimConst
     public const string OpenId = "OpenId";
 
     /// <summary>
-    /// 运行模式(账号和三方授权)
+    /// 登录模式PC、APP
     /// </summary>
-    public const string RunMode = "RunMode";
+    public const string LoginMode = "LoginMode";
 }

+ 2 - 2
Admin.NET/Admin.NET.Core/Entity/EntityBase.cs

@@ -68,7 +68,7 @@ public abstract class EntityTenant : EntityBase, ITenantIdFilter
     /// <summary>
     /// 租户Id
     /// </summary>
-    [SugarColumn(ColumnDescription = "租户Id")]
+    [SugarColumn(ColumnDescription = "租户Id", IsOnlyIgnoreUpdate = true)]
     public virtual long? TenantId { get; set; }
 }
 
@@ -80,6 +80,6 @@ public abstract class EntityTenantId : EntityBaseId, ITenantIdFilter
     /// <summary>
     /// 租户Id
     /// </summary>
-    [SugarColumn(ColumnDescription = "租户Id")]
+    [SugarColumn(ColumnDescription = "租户Id", IsOnlyIgnoreUpdate = true)]
     public virtual long? TenantId { get; set; }
 }

+ 9 - 2
Admin.NET/Admin.NET.Core/Entity/SysWechatUser.cs

@@ -34,9 +34,9 @@ public class SysWechatUser : EntityBase
     public virtual string OpenId { get; set; }
 
     /// <summary>
-    /// 缓存key
+    /// 会话密钥
     /// </summary>
-    [SugarColumn(ColumnDescription = "缓存key", Length = 256)]
+    [SugarColumn(ColumnDescription = "会话密钥", Length = 256)]
     [MaxLength(256)]
     public string? SessionKey { get; set; }
 
@@ -119,4 +119,11 @@ public class SysWechatUser : EntityBase
     /// </summary>
     [SugarColumn(ColumnDescription = "ExpiresIn")]
     public int? ExpiresIn { get; set; }
+
+    /// <summary>
+    /// 用户授权的作用域,使用逗号分隔
+    /// </summary>
+    [SugarColumn(ColumnDescription = "授权作用域", Length = 64)]
+    [MaxLength(64)]
+    public string? Scope { get; set; }
 }

+ 19 - 0
Admin.NET/Admin.NET.Core/Enum/LoginModeEnum.cs

@@ -0,0 +1,19 @@
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 登录模式枚举
+/// </summary>
+public enum LoginModeEnum
+{
+    /// <summary>
+    /// PC模式
+    /// </summary>
+    [Description("PC模式")]
+    PC = 1,
+
+    /// <summary>
+    /// APP
+    /// </summary>
+    [Description("APP")]
+    APP = 2
+}

+ 0 - 19
Admin.NET/Admin.NET.Core/Enum/RunModeEnum.cs

@@ -1,19 +0,0 @@
-namespace Admin.NET.Core;
-
-/// <summary>
-/// 运行模式枚举
-/// </summary>
-public enum RunModeEnum
-{
-    /// <summary>
-    /// 账号模式
-    /// </summary>
-    [Description("账号模式")]
-    Account = 1,
-
-    /// <summary>
-    /// 三方授权
-    /// </summary>
-    [Description("三方授权")]
-    OpenID = 2
-}

+ 0 - 16
Admin.NET/Admin.NET.Core/Enum/WeChatReturnCodeEnum.cs → Admin.NET/Admin.NET.Core/Enum/WechatReturnCodeEnum.cs

@@ -19,13 +19,11 @@ public enum WechatReturnCodeEnum
     发送消息失败_48小时内用户未互动 = 10706, // 0x000029D2
     POST参数非法 = 20002, // 0x00004E22
     获取access_token时AppSecret错误或者access_token无效 = 40001, // 0x00009C41
-
     /// <summary>
     /// <para>公众号:不合法的凭证类型</para>
     /// <para>小程序:暂无生成权限</para>
     /// </summary>
     不合法的凭证类型 = 40002, // 0x00009C42
-
     不合法的OpenID = 40003, // 0x00009C43
     不合法的媒体文件类型 = 40004, // 0x00009C44
     不合法的文件类型 = 40005, // 0x00009C45
@@ -36,13 +34,11 @@ public enum WechatReturnCodeEnum
     不合法的语音文件大小 = 40010, // 0x00009C4A
     不合法的视频文件大小 = 40011, // 0x00009C4B
     不合法的缩略图文件大小 = 40012, // 0x00009C4C
-
     /// <summary>
     /// <para>微信:不合法的APPID</para>
     /// <para>小程序:生成权限被封禁</para>
     /// </summary>
     不合法的APPID = 40013, // 0x00009C4D
-
     不合法的access_token = 40014, // 0x00009C4E
     不合法的菜单类型 = 40015, // 0x00009C4F
     不合法的按钮个数1 = 40016, // 0x00009C50
@@ -69,13 +65,11 @@ public enum WechatReturnCodeEnum
     不合法的URL长度 = 40039, // 0x00009C67
     不合法的分组id = 40050, // 0x00009C72
     分组名字不合法 = 40051, // 0x00009C73
-
     /// <summary>
     /// <para>公众号:输入参数有误</para>
     /// <para>小程序:参数expire_time填写错误</para>
     /// </summary>
     输入参数有误 = 40097, // 0x00009CA1
-
     appsecret不正确 = 40125, // 0x00009CBD
     调用接口的IP地址不在白名单中 = 40164, // 0x00009CE4
     参数path填写错误 = 40165, // 0x00009CE5
@@ -101,10 +95,8 @@ public enum WechatReturnCodeEnum
     需要HTTPS请求 = 43003, // 0x0000A7FB
     需要接收者关注 = 43004, // 0x0000A7FC
     需要好友关系 = 43005, // 0x0000A7FD
-
     /// <summary>[小程序订阅消息]用户拒绝接受消息,如果用户之前曾经订阅过,则表示用户取消了订阅关系</summary>
     用户拒绝接受消息 = 43101, // 0x0000A85D
-
     没有权限 = 43104, // 0x0000A860
     多媒体文件为空 = 44001, // 0x0000ABE1
     POST的数据包为空 = 44002, // 0x0000ABE2
@@ -132,10 +124,8 @@ public enum WechatReturnCodeEnum
     不存在的菜单版本 = 46002, // 0x0000B3B2
     不存在的菜单数据 = 46003, // 0x0000B3B3
     解析JSON_XML内容错误 = 47001, // 0x0000B799
-
     /// <summary>[小程序订阅消息]模板参数不准确,可能为空或者不满足规则,errmsg会提示具体是哪个字段出错</summary>
     模板参数不准确 = 47003, // 0x0000B79B
-
     api功能未授权 = 48001, // 0x0000BB81
     用户未授权该api = 50001, // 0x0000C351
     名称格式不合法 = 53010, // 0x0000CF12
@@ -153,20 +143,16 @@ public enum WechatReturnCodeEnum
     参数错误invalid_parameter = 61451, // 0x0000F00B
     无效客服账号invalid_kf_account = 61452, // 0x0000F00C
     客服帐号已存在kf_account_exsited = 61453, // 0x0000F00D
-
     /// <summary>
     /// 客服帐号名长度超过限制(仅允许10个英文字符,不包括@及@后的公众号的微信号)(invalid kf_acount length)
     /// </summary>
     客服帐号名长度超过限制 = 61454, // 0x0000F00E
-
     /// <summary>
     /// 客服帐号名包含非法字符(仅允许英文+数字)(illegal character in kf_account)
     /// </summary>
     客服帐号名包含非法字符 = 61455, // 0x0000F00F
-
     /// <summary>客服帐号个数超过限制(10个客服账号)(kf_account count exceeded)</summary>
     客服帐号个数超过限制 = 61456, // 0x0000F010
-
     无效头像文件类型invalid_file_type = 61457, // 0x0000F011
     日期格式错误 = 61500, // 0x0000F03C
     日期范围错误 = 61501, // 0x0000F03D
@@ -222,12 +208,10 @@ public enum WechatReturnCodeEnum
     不存在第三方的已经提交的代码 = 86001, // 0x00014FF1
     小程序还未设置昵称_头像_简介_请先设置完后再重新提交 = 86002, // 0x00014FF2
     无效微信号 = 86004, // 0x00014FF4
-
     /// <summary>
     /// 小程序为“签名错误”。对应公众号: 87009, “errmsg” : “reply is not exists” //该回复不存在
     /// </summary>
     签名错误 = 87009, // 0x000153E1
-
     现网已经在灰度发布_不能进行版本回退 = 87011, // 0x000153E3
     该版本不能回退_可能的原因_1_无上一个线上版用于回退_2_此版本为已回退版本_不能回退_3_此版本为回退功能上线之前的版本_不能回退 = 87012, // 0x000153E4
     内容含有违法违规内容 = 87014, // 0x000153E6

+ 4 - 4
Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs

@@ -52,7 +52,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter
                 ControllerName = loggingMonitor.controllerName,
                 ActionName = loggingMonitor.actionTypeName,
                 DisplayTitle = loggingMonitor.displayTitle,
-                Status = loggingMonitor.returnInformation.httpStatusCode,
+                Status = loggingMonitor.returnInformation?.httpStatusCode,
                 RemoteIp = remoteIPv4,
                 Location = ipLocation,
                 Longitude = longitude,
@@ -74,7 +74,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter
                 ControllerName = loggingMonitor.controllerName,
                 ActionName = loggingMonitor.actionTypeName,
                 DisplayTitle = loggingMonitor.displayTitle,
-                Status = loggingMonitor.returnInformation.httpStatusCode,
+                Status = loggingMonitor.returnInformation?.httpStatusCode,
                 RemoteIp = remoteIPv4,
                 Location = ipLocation,
                 Longitude = longitude,
@@ -88,11 +88,11 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter
                 HttpMethod = loggingMonitor.httpMethod,
                 RequestUrl = loggingMonitor.requestUrl,
                 RequestParam = (loggingMonitor.parameters == null || loggingMonitor.parameters.Count == 0) ? null : JSON.Serialize(loggingMonitor.parameters[0].value),
-                ReturnResult = JSON.Serialize(loggingMonitor.returnInformation),
+                ReturnResult = loggingMonitor.returnInformation == null ? null : JSON.Serialize(loggingMonitor.returnInformation),
                 EventId = logMsg.EventId.Id,
                 ThreadId = logMsg.ThreadId,
                 TraceId = logMsg.TraceId,
-                Exception = (loggingMonitor.exception == null) ? null : JSON.Serialize(loggingMonitor.exception),
+                Exception = loggingMonitor.exception == null ? null : JSON.Serialize(loggingMonitor.exception),
                 Message = logMsg.Message,
                 CreateUserId = string.IsNullOrWhiteSpace(userId) ? 0 : long.Parse(userId),
                 TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : long.Parse(tenantId)

+ 1 - 0
Admin.NET/Admin.NET.Core/Service/APIJSON/APIJSONService.cs

@@ -25,6 +25,7 @@ public class APIJSONService : IDynamicApiController, ITransient
     /// 统一入口
     /// </summary>
     /// <param name="jobject"></param>
+    /// <remarks>参数:{"[]":{"SYS_LOG_OP":{}}}</remarks>
     /// <returns></returns>
     public JObject Post([FromBody] JObject jobject)
     {

+ 7 - 7
Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs

@@ -72,7 +72,7 @@ public class SysAuthService : IDynamicApiController, ITransient
 
         // 租户是否被禁用
         var tenant = await _sysUserRep.ChangeRepository<SqlSugarRepository<SysTenant>>().GetFirstAsync(u => u.Id == user.TenantId);
-        if (tenant.Status == StatusEnum.Disable)
+        if (tenant?.Status == StatusEnum.Disable)
             throw Oops.Oh(ErrorCodeEnum.Z1003);
 
         // 密码是否正确
@@ -93,12 +93,12 @@ public class SysAuthService : IDynamicApiController, ITransient
         // 生成Token令牌
         var accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
         {
-            {ClaimConst.UserId, user.Id},
-            {ClaimConst.TenantId, user.TenantId},
-            {ClaimConst.Account, user.Account},
-            {ClaimConst.RealName, user.RealName},
-            {ClaimConst.AccountType, user.AccountType },
-            {ClaimConst.OrgId, user.OrgId},
+            { ClaimConst.UserId, user.Id },
+            { ClaimConst.TenantId, user.TenantId },
+            { ClaimConst.Account, user.Account },
+            { ClaimConst.RealName, user.RealName },
+            { ClaimConst.AccountType, user.AccountType },
+            { ClaimConst.OrgId, user.OrgId },
         });
 
         // 生成刷新Token令牌

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs

@@ -21,7 +21,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
     [DisplayName("获取代码生成配置列表")]
     public async Task<List<CodeGenConfig>> GetList([FromQuery] CodeGenConfig input)
     {
-		var whetherCommon = YesNoEnum.Y.ToString();
+        var whetherCommon = YesNoEnum.Y.ToString();
         return await _db.Queryable<SysCodeGenConfig>()
             .Where(u => u.CodeGenId == input.CodeGenId && u.WhetherCommon != whetherCommon)
             .Select<CodeGenConfig>().ToListAsync();

+ 4 - 12
Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs

@@ -141,16 +141,12 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// <param name="code"></param>
     /// <returns></returns>
     [DisplayName("根据字典类型编码获取字典值集合")]
-    public async Task<dynamic> GetDataList(string code)
+    public async Task<List<SysDictData>> GetDataList(string code)
     {
         return await _sysDictDataRep.Context.Queryable<SysDictType>()
             .LeftJoin<SysDictData>((a, b) => a.Id == b.DictTypeId)
             .Where((a, b) => a.Code == code && a.Status == StatusEnum.Enable && b.Status == StatusEnum.Enable)
-            .Select((a, b) => new
-            {
-                Label = b.Value,
-                Value = b.Code
-            }).ToListAsync();
+            .Select((a, b) => b).ToListAsync();
     }
 
     /// <summary>
@@ -159,17 +155,13 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [DisplayName("根据查询条件获取字典值集合")]
-    public async Task<dynamic> GetDataList([FromQuery] QueryDictDataInput input)
+    public async Task<List<SysDictData>> GetDataList([FromQuery] QueryDictDataInput input)
     {
         return await _sysDictDataRep.Context.Queryable<SysDictType>()
             .LeftJoin<SysDictData>((a, b) => a.Id == b.DictTypeId)
             .Where((a, b) => a.Code == input.Code)
             .WhereIF(input.Status.HasValue, (a, b) => b.Status == (StatusEnum)input.Status.Value)
-            .Select((a, b) => new
-            {
-                Label = b.Value,
-                Value = b.Code
-            }).ToListAsync();
+            .Select((a, b) => b).ToListAsync();
     }
 
     /// <summary>

+ 5 - 3
Admin.NET/Admin.NET.Core/Service/User/UserManager.cs

@@ -1,4 +1,6 @@
-namespace Admin.NET.Core;
+using System;
+
+namespace Admin.NET.Core;
 
 /// <summary>
 /// 当前登录用户
@@ -17,8 +19,8 @@ public class UserManager : IScoped
     {
         get
         {
-            var tId = _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.TenantId);
-            return tId == null ? _tenantId : long.Parse(tId.Value);
+            var tId = _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.TenantId)?.Value;
+            return string.IsNullOrWhiteSpace(tId) ? _tenantId : long.Parse(tId);
         }
         set => _tenantId = value;
     }

+ 2 - 2
Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatInput.cs

@@ -18,7 +18,7 @@ public class WechatOAuth2Input
     /// <summary>
     /// Code
     /// </summary>
-    [Required(ErrorMessage = "Code不能为空"), MinLength(10, ErrorMessage = "Code串长度不对")]
+    [Required(ErrorMessage = "Code不能为空"), MinLength(10, ErrorMessage = "Code错误")]
     public string Code { get; set; }
 }
 
@@ -27,7 +27,7 @@ public class WechatUserLogin
     /// <summary>
     /// OpenId
     /// </summary>
-    [Required(ErrorMessage = "微信标识不能为空"), MinLength(10, ErrorMessage = "微信标识长度不对")]
+    [Required(ErrorMessage = "微信标识不能为空"), MinLength(10, ErrorMessage = "微信标识长错误")]
     public string OpenId { get; set; }
 }
 

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatUserInput.cs

@@ -10,7 +10,7 @@ public class WechatUserInput : BasePageInput
     /// <summary>
     /// 手机号码
     /// </summary>
-    public string Mobile { get; set; }
+    public string PhoneNumber { get; set; }
 }
 
 public class DeleteWechatUserInput : BaseIdInput

+ 37 - 0
Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenInput.cs

@@ -0,0 +1,37 @@
+namespace Admin.NET.Core.Service;
+
+public class JsCode2SessionInput
+{
+    /// <summary>
+    /// JsCode
+    /// </summary>
+    [Required(ErrorMessage = "JsCode不能为空"), MinLength(10, ErrorMessage = "JsCode错误")]
+    public string JsCode { get; set; }
+}
+
+public class WxPhoneInput : WxOpenIdLoginInput
+{
+    /// <summary>
+    /// Code
+    /// </summary>
+    [Required(ErrorMessage = "Code不能为空"), MinLength(10, ErrorMessage = "Code错误")]
+    public string Code { get; set; }
+}
+
+public class WxOpenIdLoginInput
+{
+    /// <summary>
+    /// OpenId
+    /// </summary>
+    [Required(ErrorMessage = "微信标识不能为空"), MinLength(10, ErrorMessage = "微信标识错误")]
+    public string OpenId { get; set; }
+}
+
+public class WxPhoneLoginInput
+{
+    /// <summary>
+    /// 电话号码
+    /// </summary>
+    [DataValidation(ValidationTypes.PhoneNumber, ErrorMessage = "电话号码错误")]
+    public string PhoneNumber { get; set; }
+}

+ 11 - 0
Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenOutput.cs

@@ -0,0 +1,11 @@
+namespace Admin.NET.Core.Service;
+
+public class WxOpenIdOutput
+{
+    public string OpenId { get; set; }
+}
+
+public class WxPhoneOutput
+{
+    public string PhoneNumber { get; set; }
+}

+ 9 - 9
Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs

@@ -25,16 +25,16 @@ public class SysWechatService : IDynamicApiController, ITransient
     [DisplayName("生成网页授权Url")]
     public string GenAuthUrl(GenAuthUrlInput input)
     {
-        return _wechatApiClient.GenerateParameterizedUrlForConnectOAuth2Authorize(input.RedirectUrl, input.Scope);
+        return _wechatApiClient.GenerateParameterizedUrlForConnectOAuth2Authorize(input.RedirectUrl, input.Scope, null);
     }
 
     /// <summary>
-    /// 授权登录(Code换取OpenId)
+    /// 获取微信用户OpenId
     /// </summary>
     /// <param name="input"></param>
     [AllowAnonymous]
-    [DisplayName("授权登录(Code换取OpenId)")]
-    public async Task<string> SnsOAuth2([Required] WechatOAuth2Input input)
+    [DisplayName("获取微信用户OpenId")]
+    public async Task<string> SnsOAuth2([FromQuery] WechatOAuth2Input input)
     {
         var reqOAuth2 = new SnsOAuth2AccessTokenRequest()
         {
@@ -42,7 +42,7 @@ public class SysWechatService : IDynamicApiController, ITransient
         };
         var resOAuth2 = await _wechatApiClient.ExecuteSnsOAuth2AccessTokenAsync(reqOAuth2);
         if (resOAuth2.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
-            throw Oops.Oh(resOAuth2.ErrorMessage + resOAuth2.ErrorCode);
+            throw Oops.Oh(resOAuth2.ErrorMessage + " " + resOAuth2.ErrorCode);
 
         var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == resOAuth2.OpenId);
         if (wxUser == null)
@@ -69,17 +69,17 @@ public class SysWechatService : IDynamicApiController, ITransient
     }
 
     /// <summary>
-    /// 微信用户登录
+    /// 微信用户登录OpenId
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
     [AllowAnonymous]
-    [DisplayName("微信用户登录")]
+    [DisplayName("微信用户登录OpenId")]
     public async Task<dynamic> OpenIdLogin(WechatUserLogin input)
     {
         var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId);
         if (wxUser == null)
-            throw Oops.Oh("微信登录");
+            throw Oops.Oh("微信用户登录OpenId错误");
         return new
         {
             wxUser.Avatar,
@@ -88,7 +88,7 @@ public class SysWechatService : IDynamicApiController, ITransient
                 { ClaimConst.UserId, wxUser.Id },
                 { ClaimConst.OpenId, wxUser.OpenId },
                 { ClaimConst.NickName, wxUser.NickName },
-                { ClaimConst.RunMode, RunModeEnum.OpenID },
+                { ClaimConst.LoginMode, LoginModeEnum.APP },
             })
         };
     }

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

@@ -23,7 +23,7 @@ public class SysWechatUserService : IDynamicApiController, ITransient
     {
         return await _sysWechatUserRep.AsQueryable()
             .WhereIF(!string.IsNullOrWhiteSpace(input.NickName), u => u.NickName.Contains(input.NickName))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.Mobile), u => u.Mobile.Contains(input.Mobile))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.PhoneNumber), u => u.Mobile.Contains(input.PhoneNumber))
             .OrderBy(u => u.Id, OrderByType.Desc)
             .ToPagedListAsync(input.Page, input.PageSize);
     }

+ 110 - 0
Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs

@@ -0,0 +1,110 @@
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 微信小程序服务
+/// </summary>
+[ApiDescriptionSettings(Order = 250)]
+public class SysWxOpenService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<SysWechatUser> _sysWechatUserRep;
+    private readonly WechatApiClient _wechatApiClient;
+
+    public SysWxOpenService(SqlSugarRepository<SysWechatUser> sysWechatUserRep,
+        WechatApiHttpClient wechatApiHttpClient)
+    {
+        _sysWechatUserRep = sysWechatUserRep;
+        _wechatApiClient = wechatApiHttpClient.CreateWxOpenClient();
+    }
+
+    /// <summary>
+    /// 获取微信用户OpenId
+    /// </summary>
+    /// <param name="input"></param>
+    [AllowAnonymous]
+    [DisplayName("获取微信用户OpenId")]
+    public async Task<WxOpenIdOutput> GetWxOpenId([FromQuery] JsCode2SessionInput input)
+    {
+        var reqJsCode2Session = new SnsJsCode2SessionRequest()
+        {
+            JsCode = input.JsCode,
+        };
+        var resCode2Session = await _wechatApiClient.ExecuteSnsJsCode2SessionAsync(reqJsCode2Session);
+        if (resCode2Session.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+            throw Oops.Oh(resCode2Session.ErrorMessage + " " + resCode2Session.ErrorCode);
+
+        var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == resCode2Session.OpenId);
+        if (wxUser == null)
+        {
+            wxUser = new SysWechatUser
+            {
+                OpenId = resCode2Session.OpenId,
+                UnionId = resCode2Session.UnionId,
+                SessionKey = resCode2Session.SessionKey,
+                PlatformType = PlatformTypeEnum.微信小程序
+            };
+            wxUser = await _sysWechatUserRep.AsInsertable(wxUser).ExecuteReturnEntityAsync();
+        }
+        else
+        {
+            await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync();
+        }
+
+        return new WxOpenIdOutput
+        {
+            OpenId = resCode2Session.OpenId
+        };
+    }
+
+    /// <summary>
+    /// 获取微信用户电话号码
+    /// </summary>
+    /// <param name="input"></param>
+    [AllowAnonymous]
+    [DisplayName("获取微信用户电话号码")]
+    public async Task<WxPhoneOutput> GetWxPhone([FromQuery] WxPhoneInput input)
+    {
+        var reqCgibinToken = new CgibinTokenRequest();
+        var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken);
+        if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+            throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode);
+
+        var reqUserPhoneNumber = new WxaBusinessGetUserPhoneNumberRequest()
+        {
+            Code = input.Code,
+            AccessToken = resCgibinToken.AccessToken,
+        };
+        var resUserPhoneNumber = await _wechatApiClient.ExecuteWxaBusinessGetUserPhoneNumberAsync(reqUserPhoneNumber);
+        if (resUserPhoneNumber.ErrorCode != (int)WechatReturnCodeEnum.请求成功)
+            throw Oops.Oh(resUserPhoneNumber.ErrorMessage + " " + resUserPhoneNumber.ErrorCode);
+
+        return new WxPhoneOutput
+        {
+            PhoneNumber = resUserPhoneNumber.PhoneInfo?.PhoneNumber
+        };
+    }
+
+    /// <summary>
+    /// 微信小程序登录OpenId
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [AllowAnonymous]
+    [DisplayName("微信小程序登录OpenId")]
+    public async Task<dynamic> WxOpenIdLogin(WxOpenIdLoginInput input)
+    {
+        var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId);
+        if (wxUser == null)
+            throw Oops.Oh("微信小程序登录失败");
+        return new
+        {
+            wxUser.Avatar,
+            accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
+            {
+                { ClaimConst.UserId, wxUser.Id },
+                { ClaimConst.OpenId, wxUser.OpenId },
+                { ClaimConst.RealName, wxUser.NickName },
+                { ClaimConst.LoginMode, LoginModeEnum.APP },
+            })
+        };
+    }
+}

+ 1 - 1
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -55,7 +55,7 @@ public static class SqlSugarSetup
                 if (config.EnableUnderLine && !column.IsIgnore && !column.DbColumnName.Contains('_'))
                     column.DbColumnName = UtilMethods.ToUnderLine(column.DbColumnName); // 驼峰转下划线
 
-                if (config.DbType == SqlSugar.DbType.Oracle) ///修复默认的SqlSugar.CodeFirst.InitTables方法C#类型转Oracle数据库类型时long、bool类型没有位数精度的bug
+                if (config.DbType == SqlSugar.DbType.Oracle)
                 {
                     if (type.PropertyType == typeof(long) || type.PropertyType == typeof(long?))
                         column.DataType = "number(18)";

+ 1 - 1
Admin.NET/Admin.NET.Core/Util/CodeGenUtil.cs

@@ -231,7 +231,7 @@ public static class CodeGenUtil
             "int" => "int",
             "smallint" => "Int16",
             //"tinyint" => "byte",
-            "tinyint" => "bool",    // MYSQL  
+            "tinyint" => "bool",    // MYSQL
             "bigint" or "integer" => "long",
             "bit" => "bool",
             "money" or "smallmoney" or "numeric" or "decimal" => "decimal",

+ 4 - 0
Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs

@@ -47,6 +47,10 @@ namespace Admin.NET.Web.Core
         /// <returns></returns>
         private static async Task<bool> CheckAuthorzieAsync(DefaultHttpContext httpContext)
         {
+            // 登录模式判断PC、APP
+            if (App.User.FindFirst(ClaimConst.LoginMode)?.Value == ((int)LoginModeEnum.APP).ToString())
+                return true;
+
             // 排除超管
             if (App.User.FindFirst(ClaimConst.AccountType)?.Value == ((int)AccountTypeEnum.SuperAdmin).ToString())
                 return true;

+ 10 - 10
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -71,14 +71,14 @@ public class Startup : AppStartup
                 })
                 .AddInjectWithUnifyResult<AdminResultProvider>();
 
-        // 第三方授权登录
-        services.AddAuthentication()
-                .AddWeixin(options =>
-                {
-                    var opt = App.GetOptions<OAuthOptions>();
-                    options.ClientId = opt.Weixin.ClientId;
-                    options.ClientSecret = opt.Weixin.ClientSecret;
-                });
+        //// 第三方授权登录
+        //services.AddAuthentication()
+        //        .AddWeixin(options =>
+        //        {
+        //            var opt = App.GetOptions<OAuthOptions>();
+        //            options.ClientId = opt.Weixin.ClientId;
+        //            options.ClientSecret = opt.Weixin.ClientSecret;
+        //        });
 
         // ElasticSearch
         services.AddElasticSearch();
@@ -208,8 +208,8 @@ public class Startup : AppStartup
         // 配置多语言
         app.UseAppLocalization();
 
-        // 启用HTTPS
-        app.UseHttpsRedirection();
+        //// 启用HTTPS
+        //app.UseHttpsRedirection();
 
         app.UseStaticFiles();
 

+ 11 - 1
Admin.NET/Admin.NET.Web.Entry/Program.cs

@@ -1,13 +1,23 @@
+using Microsoft.Extensions.Options;
+
 Serve.Run(RunOptions.Default.AddWebComponent<WebComponent>());
 
 public class WebComponent : IWebComponent
 {
     public void Load(WebApplicationBuilder builder, ComponentContext componentContext)
     {
-        // 日志过滤
+        // 设置日志过滤
         builder.Logging.AddFilter((provider, category, logLevel) =>
         {
             return !new[] { "Microsoft.Hosting", "Microsoft.AspNetCore" }.Any(u => category.StartsWith(u)) && logLevel >= LogLevel.Information;
         });
+
+        // 设置接口超时时间和上传大小
+        builder.Configuration.Get<WebHostBuilder>().ConfigureKestrel(u =>
+        {
+            //u.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(30);
+            //u.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(30);
+            u.Limits.MaxRequestBodySize = null;
+        });
     }
 }

+ 12 - 0
Admin.NET/Admin.NET.Web.Entry/web.config

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+
+	<system.webServer>
+		<security>
+			<requestFiltering>
+				<requestLimits maxAllowedContentLength="1073741824" />
+			</requestFiltering>
+		</security>
+	</system.webServer>
+
+</configuration>

+ 12 - 0
Admin.NET/Admin.NET.sln

@@ -16,6 +16,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
 		.editorconfig = .editorconfig
 	EndProjectSection
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Daming.WanrenDC.App", "..\..\项目列表\万人调查\backend\Daming.WanrenDC.App\Daming.WanrenDC.App.csproj", "{A936557C-CC25-4FBC-8795-16FF99EF5C28}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Daming.Hotel.App", "..\..\项目列表\酒店管理\Daming.Hotel.App\Daming.Hotel.App.csproj", "{A39DF2EA-D650-4055-8A5F-2C253A282636}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -38,6 +42,14 @@ Global
 		{11EA630B-4600-4236-A117-CE6C6CD67586}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{11EA630B-4600-4236-A117-CE6C6CD67586}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{11EA630B-4600-4236-A117-CE6C6CD67586}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A936557C-CC25-4FBC-8795-16FF99EF5C28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A936557C-CC25-4FBC-8795-16FF99EF5C28}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A936557C-CC25-4FBC-8795-16FF99EF5C28}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A936557C-CC25-4FBC-8795-16FF99EF5C28}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A39DF2EA-D650-4055-8A5F-2C253A282636}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A39DF2EA-D650-4055-8A5F-2C253A282636}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A39DF2EA-D650-4055-8A5F-2C253A282636}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A39DF2EA-D650-4055-8A5F-2C253A282636}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

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

@@ -39,4 +39,5 @@ export * from './apis/sys-user-api';
 export * from './apis/sys-wechat-api';
 export * from './apis/sys-wechat-pay-api';
 export * from './apis/sys-wechat-user-api';
+export * from './apis/sys-wx-open-api';
 

+ 6 - 7
Web/src/api-services/apis/sys-dict-data-api.ts

@@ -18,7 +18,6 @@ import { Configuration } from '../configuration';
 import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
 import { AddDictDataInput } from '../models';
 import { AdminResultListSysDictData } from '../models';
-import { AdminResultObject } from '../models';
 import { AdminResultSqlSugarPagedListSysDictData } from '../models';
 import { AdminResultSysDictData } from '../models';
 import { DeleteDictDataInput } from '../models';
@@ -488,7 +487,7 @@ export const SysDictDataApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysDictDataDataListCodeGet(code: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
+        async apiSysDictDataDataListCodeGet(code: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListSysDictData>>> {
             const localVarAxiosArgs = await SysDictDataApiAxiosParamCreator(configuration).apiSysDictDataDataListCodeGet(code, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@@ -503,7 +502,7 @@ export const SysDictDataApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysDictDataDataListGet(code: string, status?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
+        async apiSysDictDataDataListGet(code: string, status?: number, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListSysDictData>>> {
             const localVarAxiosArgs = await SysDictDataApiAxiosParamCreator(configuration).apiSysDictDataDataListGet(code, status, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@@ -628,7 +627,7 @@ export const SysDictDataApiFactory = function (configuration?: Configuration, ba
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysDictDataDataListCodeGet(code: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
+        async apiSysDictDataDataListCodeGet(code: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListSysDictData>> {
             return SysDictDataApiFp(configuration).apiSysDictDataDataListCodeGet(code, options).then((request) => request(axios, basePath));
         },
         /**
@@ -639,7 +638,7 @@ export const SysDictDataApiFactory = function (configuration?: Configuration, ba
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysDictDataDataListGet(code: string, status?: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
+        async apiSysDictDataDataListGet(code: string, status?: number, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListSysDictData>> {
             return SysDictDataApiFp(configuration).apiSysDictDataDataListGet(code, status, options).then((request) => request(axios, basePath));
         },
         /**
@@ -739,7 +738,7 @@ export class SysDictDataApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysDictDataApi
      */
-    public async apiSysDictDataDataListCodeGet(code: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
+    public async apiSysDictDataDataListCodeGet(code: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListSysDictData>> {
         return SysDictDataApiFp(this.configuration).apiSysDictDataDataListCodeGet(code, options).then((request) => request(this.axios, this.basePath));
     }
     /**
@@ -751,7 +750,7 @@ export class SysDictDataApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysDictDataApi
      */
-    public async apiSysDictDataDataListGet(code: string, status?: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
+    public async apiSysDictDataDataListGet(code: string, status?: number, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListSysDictData>> {
         return SysDictDataApiFp(this.configuration).apiSysDictDataDataListGet(code, status, options).then((request) => request(this.axios, this.basePath));
     }
     /**

+ 25 - 26
Web/src/api-services/apis/sys-wechat-api.ts

@@ -20,7 +20,6 @@ import { AdminResultObject } from '../models';
 import { AdminResultString } from '../models';
 import { GenAuthUrlInput } from '../models';
 import { SignatureInput } from '../models';
-import { WechatOAuth2Input } from '../models';
 import { WechatUserLogin } from '../models';
 /**
  * SysWechatApi - axios parameter creator
@@ -112,7 +111,7 @@ export const SysWechatApiAxiosParamCreator = function (configuration?: Configura
         },
         /**
          * 
-         * @summary 微信用户登录
+         * @summary 微信用户登录OpenId
          * @param {WechatUserLogin} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
@@ -153,15 +152,15 @@ export const SysWechatApiAxiosParamCreator = function (configuration?: Configura
         },
         /**
          * 
-         * @summary 授权登录(Code换取OpenId)
-         * @param {WechatOAuth2Input} body 
+         * @summary 获取微信用户OpenId
+         * @param {string} code Code
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysWechatSnsOAuth2Post: async (body: WechatOAuth2Input, 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 apiSysWechatSnsOAuth2Post.');
+        apiSysWechatSnsOAuth2Post: async (code: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'code' is not null or undefined
+            if (code === null || code === undefined) {
+                throw new RequiredError('code','Required parameter code was null or undefined when calling apiSysWechatSnsOAuth2Post.');
             }
             const localVarPath = `/api/sysWechat/snsOAuth2`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
@@ -176,7 +175,9 @@ export const SysWechatApiAxiosParamCreator = function (configuration?: Configura
 
             // authentication Bearer required
 
-            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+            if (code !== undefined) {
+                localVarQueryParameter['Code'] = code;
+            }
 
             const query = new URLSearchParams(localVarUrlObj.search);
             for (const key in localVarQueryParameter) {
@@ -188,8 +189,6 @@ export const SysWechatApiAxiosParamCreator = 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,
@@ -235,7 +234,7 @@ export const SysWechatApiFp = function(configuration?: Configuration) {
         },
         /**
          * 
-         * @summary 微信用户登录
+         * @summary 微信用户登录OpenId
          * @param {WechatUserLogin} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
@@ -249,13 +248,13 @@ export const SysWechatApiFp = function(configuration?: Configuration) {
         },
         /**
          * 
-         * @summary 授权登录(Code换取OpenId)
-         * @param {WechatOAuth2Input} body 
+         * @summary 获取微信用户OpenId
+         * @param {string} code Code
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysWechatSnsOAuth2Post(body: WechatOAuth2Input, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultString>>> {
-            const localVarAxiosArgs = await SysWechatApiAxiosParamCreator(configuration).apiSysWechatSnsOAuth2Post(body, options);
+        async apiSysWechatSnsOAuth2Post(code: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultString>>> {
+            const localVarAxiosArgs = await SysWechatApiAxiosParamCreator(configuration).apiSysWechatSnsOAuth2Post(code, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -292,7 +291,7 @@ export const SysWechatApiFactory = function (configuration?: Configuration, base
         },
         /**
          * 
-         * @summary 微信用户登录
+         * @summary 微信用户登录OpenId
          * @param {WechatUserLogin} [body] 
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
@@ -302,13 +301,13 @@ export const SysWechatApiFactory = function (configuration?: Configuration, base
         },
         /**
          * 
-         * @summary 授权登录(Code换取OpenId)
-         * @param {WechatOAuth2Input} body 
+         * @summary 获取微信用户OpenId
+         * @param {string} code Code
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysWechatSnsOAuth2Post(body: WechatOAuth2Input, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultString>> {
-            return SysWechatApiFp(configuration).apiSysWechatSnsOAuth2Post(body, options).then((request) => request(axios, basePath));
+        async apiSysWechatSnsOAuth2Post(code: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultString>> {
+            return SysWechatApiFp(configuration).apiSysWechatSnsOAuth2Post(code, options).then((request) => request(axios, basePath));
         },
     };
 };
@@ -344,7 +343,7 @@ export class SysWechatApi extends BaseAPI {
     }
     /**
      * 
-     * @summary 微信用户登录
+     * @summary 微信用户登录OpenId
      * @param {WechatUserLogin} [body] 
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
@@ -355,13 +354,13 @@ export class SysWechatApi extends BaseAPI {
     }
     /**
      * 
-     * @summary 授权登录(Code换取OpenId)
-     * @param {WechatOAuth2Input} body 
+     * @summary 获取微信用户OpenId
+     * @param {string} code Code
      * @param {*} [options] Override http request option.
      * @throws {RequiredError}
      * @memberof SysWechatApi
      */
-    public async apiSysWechatSnsOAuth2Post(body: WechatOAuth2Input, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultString>> {
-        return SysWechatApiFp(this.configuration).apiSysWechatSnsOAuth2Post(body, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysWechatSnsOAuth2Post(code: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultString>> {
+        return SysWechatApiFp(this.configuration).apiSysWechatSnsOAuth2Post(code, options).then((request) => request(this.axios, this.basePath));
     }
 }

+ 13 - 13
Web/src/api-services/apis/sys-wechat-user-api.ts

@@ -111,7 +111,7 @@ export const SysWechatUserApiAxiosParamCreator = function (configuration?: Confi
          * 
          * @summary 获取微信用户列表
          * @param {string} [nickName] 昵称
-         * @param {string} [mobile] 手机号码
+         * @param {string} [phoneNumber] 手机号码
          * @param {number} [page] 当前页码
          * @param {number} [pageSize] 页码容量
          * @param {string} [field] 排序字段
@@ -120,7 +120,7 @@ export const SysWechatUserApiAxiosParamCreator = function (configuration?: Confi
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        apiSysWechatUserPageGet: async (nickName?: string, mobile?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+        apiSysWechatUserPageGet: async (nickName?: string, phoneNumber?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
             const localVarPath = `/api/sysWechatUser/page`;
             // use dummy base URL string because the URL constructor only accepts absolute URLs.
             const localVarUrlObj = new URL(localVarPath, 'https://example.com');
@@ -138,8 +138,8 @@ export const SysWechatUserApiAxiosParamCreator = function (configuration?: Confi
                 localVarQueryParameter['NickName'] = nickName;
             }
 
-            if (mobile !== undefined) {
-                localVarQueryParameter['Mobile'] = mobile;
+            if (phoneNumber !== undefined) {
+                localVarQueryParameter['PhoneNumber'] = phoneNumber;
             }
 
             if (page !== undefined) {
@@ -260,7 +260,7 @@ export const SysWechatUserApiFp = function(configuration?: Configuration) {
          * 
          * @summary 获取微信用户列表
          * @param {string} [nickName] 昵称
-         * @param {string} [mobile] 手机号码
+         * @param {string} [phoneNumber] 手机号码
          * @param {number} [page] 当前页码
          * @param {number} [pageSize] 页码容量
          * @param {string} [field] 排序字段
@@ -269,8 +269,8 @@ export const SysWechatUserApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysWechatUserPageGet(nickName?: string, mobile?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSqlSugarPagedListSysWechatUser>>> {
-            const localVarAxiosArgs = await SysWechatUserApiAxiosParamCreator(configuration).apiSysWechatUserPageGet(nickName, mobile, page, pageSize, field, order, descStr, options);
+        async apiSysWechatUserPageGet(nickName?: string, phoneNumber?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSqlSugarPagedListSysWechatUser>>> {
+            const localVarAxiosArgs = await SysWechatUserApiAxiosParamCreator(configuration).apiSysWechatUserPageGet(nickName, phoneNumber, page, pageSize, field, order, descStr, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
                 return axios.request(axiosRequestArgs);
@@ -323,7 +323,7 @@ export const SysWechatUserApiFactory = function (configuration?: Configuration,
          * 
          * @summary 获取微信用户列表
          * @param {string} [nickName] 昵称
-         * @param {string} [mobile] 手机号码
+         * @param {string} [phoneNumber] 手机号码
          * @param {number} [page] 当前页码
          * @param {number} [pageSize] 页码容量
          * @param {string} [field] 排序字段
@@ -332,8 +332,8 @@ export const SysWechatUserApiFactory = function (configuration?: Configuration,
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysWechatUserPageGet(nickName?: string, mobile?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSqlSugarPagedListSysWechatUser>> {
-            return SysWechatUserApiFp(configuration).apiSysWechatUserPageGet(nickName, mobile, page, pageSize, field, order, descStr, options).then((request) => request(axios, basePath));
+        async apiSysWechatUserPageGet(nickName?: string, phoneNumber?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSqlSugarPagedListSysWechatUser>> {
+            return SysWechatUserApiFp(configuration).apiSysWechatUserPageGet(nickName, phoneNumber, page, pageSize, field, order, descStr, options).then((request) => request(axios, basePath));
         },
         /**
          * 
@@ -381,7 +381,7 @@ export class SysWechatUserApi extends BaseAPI {
      * 
      * @summary 获取微信用户列表
      * @param {string} [nickName] 昵称
-     * @param {string} [mobile] 手机号码
+     * @param {string} [phoneNumber] 手机号码
      * @param {number} [page] 当前页码
      * @param {number} [pageSize] 页码容量
      * @param {string} [field] 排序字段
@@ -391,8 +391,8 @@ export class SysWechatUserApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysWechatUserApi
      */
-    public async apiSysWechatUserPageGet(nickName?: string, mobile?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSqlSugarPagedListSysWechatUser>> {
-        return SysWechatUserApiFp(this.configuration).apiSysWechatUserPageGet(nickName, mobile, page, pageSize, field, order, descStr, options).then((request) => request(this.axios, this.basePath));
+    public async apiSysWechatUserPageGet(nickName?: string, phoneNumber?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSqlSugarPagedListSysWechatUser>> {
+        return SysWechatUserApiFp(this.configuration).apiSysWechatUserPageGet(nickName, phoneNumber, page, pageSize, field, order, descStr, options).then((request) => request(this.axios, this.basePath));
     }
     /**
      * 

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

@@ -0,0 +1,305 @@
+/* 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 { AdminResultObject } from '../models';
+import { AdminResultWxOpenIdOutput } from '../models';
+import { AdminResultWxPhoneOutput } from '../models';
+import { WxOpenIdLoginInput } from '../models';
+/**
+ * SysWxOpenApi - axios parameter creator
+ * @export
+ */
+export const SysWxOpenApiAxiosParamCreator = function (configuration?: Configuration) {
+    return {
+        /**
+         * 
+         * @summary 获取微信用户OpenId
+         * @param {string} jsCode JsCode
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysWxOpenWxOpenIdGet: async (jsCode: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'jsCode' is not null or undefined
+            if (jsCode === null || jsCode === undefined) {
+                throw new RequiredError('jsCode','Required parameter jsCode was null or undefined when calling apiSysWxOpenWxOpenIdGet.');
+            }
+            const localVarPath = `/api/sysWxOpen/wxOpenId`;
+            // 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
+
+            if (jsCode !== undefined) {
+                localVarQueryParameter['JsCode'] = jsCode;
+            }
+
+            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
+         * @param {WxOpenIdLoginInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysWxOpenWxOpenIdLoginPost: async (body?: WxOpenIdLoginInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysWxOpen/wxOpenIdLogin`;
+            // 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
+
+            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
+            localVarRequestOptions.data =  needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
+        /**
+         * 
+         * @summary 获取微信用户电话号码
+         * @param {string} code Code
+         * @param {string} openId OpenId
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysWxOpenWxPhoneGet: async (code: string, openId: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'code' is not null or undefined
+            if (code === null || code === undefined) {
+                throw new RequiredError('code','Required parameter code was null or undefined when calling apiSysWxOpenWxPhoneGet.');
+            }
+            // verify required parameter 'openId' is not null or undefined
+            if (openId === null || openId === undefined) {
+                throw new RequiredError('openId','Required parameter openId was null or undefined when calling apiSysWxOpenWxPhoneGet.');
+            }
+            const localVarPath = `/api/sysWxOpen/wxPhone`;
+            // 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
+
+            if (code !== undefined) {
+                localVarQueryParameter['Code'] = code;
+            }
+
+            if (openId !== undefined) {
+                localVarQueryParameter['OpenId'] = openId;
+            }
+
+            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,
+            };
+        },
+    }
+};
+
+/**
+ * SysWxOpenApi - functional programming interface
+ * @export
+ */
+export const SysWxOpenApiFp = function(configuration?: Configuration) {
+    return {
+        /**
+         * 
+         * @summary 获取微信用户OpenId
+         * @param {string} jsCode JsCode
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWxOpenWxOpenIdGet(jsCode: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultWxOpenIdOutput>>> {
+            const localVarAxiosArgs = await SysWxOpenApiAxiosParamCreator(configuration).apiSysWxOpenWxOpenIdGet(jsCode, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+        /**
+         * 
+         * @summary 微信小程序登录OpenId
+         * @param {WxOpenIdLoginInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWxOpenWxOpenIdLoginPost(body?: WxOpenIdLoginInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultObject>>> {
+            const localVarAxiosArgs = await SysWxOpenApiAxiosParamCreator(configuration).apiSysWxOpenWxOpenIdLoginPost(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+        /**
+         * 
+         * @summary 获取微信用户电话号码
+         * @param {string} code Code
+         * @param {string} openId OpenId
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWxOpenWxPhoneGet(code: string, openId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultWxPhoneOutput>>> {
+            const localVarAxiosArgs = await SysWxOpenApiAxiosParamCreator(configuration).apiSysWxOpenWxPhoneGet(code, openId, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+    }
+};
+
+/**
+ * SysWxOpenApi - factory interface
+ * @export
+ */
+export const SysWxOpenApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    return {
+        /**
+         * 
+         * @summary 获取微信用户OpenId
+         * @param {string} jsCode JsCode
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWxOpenWxOpenIdGet(jsCode: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultWxOpenIdOutput>> {
+            return SysWxOpenApiFp(configuration).apiSysWxOpenWxOpenIdGet(jsCode, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 微信小程序登录OpenId
+         * @param {WxOpenIdLoginInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWxOpenWxOpenIdLoginPost(body?: WxOpenIdLoginInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultObject>> {
+            return SysWxOpenApiFp(configuration).apiSysWxOpenWxOpenIdLoginPost(body, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 获取微信用户电话号码
+         * @param {string} code Code
+         * @param {string} openId OpenId
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysWxOpenWxPhoneGet(code: string, openId: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultWxPhoneOutput>> {
+            return SysWxOpenApiFp(configuration).apiSysWxOpenWxPhoneGet(code, openId, options).then((request) => request(axios, basePath));
+        },
+    };
+};
+
+/**
+ * SysWxOpenApi - object-oriented interface
+ * @export
+ * @class SysWxOpenApi
+ * @extends {BaseAPI}
+ */
+export class SysWxOpenApi extends BaseAPI {
+    /**
+     * 
+     * @summary 获取微信用户OpenId
+     * @param {string} jsCode JsCode
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysWxOpenApi
+     */
+    public async apiSysWxOpenWxOpenIdGet(jsCode: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultWxOpenIdOutput>> {
+        return SysWxOpenApiFp(this.configuration).apiSysWxOpenWxOpenIdGet(jsCode, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary 微信小程序登录OpenId
+     * @param {WxOpenIdLoginInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysWxOpenApi
+     */
+    public async apiSysWxOpenWxOpenIdLoginPost(body?: WxOpenIdLoginInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultObject>> {
+        return SysWxOpenApiFp(this.configuration).apiSysWxOpenWxOpenIdLoginPost(body, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary 获取微信用户电话号码
+     * @param {string} code Code
+     * @param {string} openId OpenId
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysWxOpenApi
+     */
+    public async apiSysWxOpenWxPhoneGet(code: string, openId: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultWxPhoneOutput>> {
+        return SysWxOpenApiFp(this.configuration).apiSysWxOpenWxPhoneGet(code, openId, options).then((request) => request(this.axios, this.basePath));
+    }
+}

+ 57 - 0
Web/src/api-services/models/admin-result-wx-open-id-output.ts

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

+ 57 - 0
Web/src/api-services/models/admin-result-wx-phone-output.ts

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

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

@@ -72,6 +72,8 @@ export * from './admin-result-sys-dict-type';
 export * from './admin-result-sys-user';
 export * from './admin-result-sys-wechat-pay';
 export * from './admin-result-wechat-pay-output';
+export * from './admin-result-wx-open-id-output';
+export * from './admin-result-wx-phone-output';
 export * from './card-type-enum';
 export * from './change-pwd-input';
 export * from './cluster-status';
@@ -208,9 +210,11 @@ export * from './update-tenant-input';
 export * from './update-user-input';
 export * from './user-input';
 export * from './user-role-input';
-export * from './wechat-oauth2-input';
 export * from './wechat-pay-output';
 export * from './wechat-pay-para-input';
 export * from './wechat-pay-transaction-input';
 export * from './wechat-user-login';
+export * from './wx-open-id-login-input';
+export * from './wx-open-id-output';
+export * from './wx-phone-output';
 export * from './yes-no-enum';

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

@@ -80,7 +80,7 @@ export interface SysWechatUser {
      */
     openId: string;
     /**
-     * 缓存key
+     * 会话密钥
      * @type {string}
      * @memberof SysWechatUser
      */
@@ -157,4 +157,10 @@ export interface SysWechatUser {
      * @memberof SysWechatUser
      */
     expiresIn?: number | null;
+    /**
+     * 用户授权的作用域,使用逗号分隔
+     * @type {string}
+     * @memberof SysWechatUser
+     */
+    scope?: string | null;
 }

+ 26 - 0
Web/src/api-services/models/wx-open-id-login-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 WxOpenIdLoginInput
+ */
+export interface WxOpenIdLoginInput {
+    /**
+     * OpenId
+     * @type {string}
+     * @memberof WxOpenIdLoginInput
+     */
+    openId: string;
+}

+ 5 - 5
Web/src/api-services/models/wechat-oauth2-input.ts → Web/src/api-services/models/wx-open-id-output.ts

@@ -14,13 +14,13 @@
 /**
  * 
  * @export
- * @interface WechatOAuth2Input
+ * @interface WxOpenIdOutput
  */
-export interface WechatOAuth2Input {
+export interface WxOpenIdOutput {
     /**
-     * Code
+     * 
      * @type {string}
-     * @memberof WechatOAuth2Input
+     * @memberof WxOpenIdOutput
      */
-    code: string;
+    openId?: string | null;
 }

+ 26 - 0
Web/src/api-services/models/wx-phone-output.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 WxPhoneOutput
+ */
+export interface WxPhoneOutput {
+    /**
+     * 
+     * @type {string}
+     * @memberof WxPhoneOutput
+     */
+    phoneNumber?: string | null;
+}