فهرست منبع

Merge branch 'next' of https://gitee.com/zuohuaijun/Admin.NET into next

SirHQ 3 سال پیش
والد
کامیت
297ecb7086
34فایلهای تغییر یافته به همراه1024 افزوده شده و 430 حذف شده
  1. 3 3
      Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
  2. 82 39
      Admin.NET/Admin.NET.Core/Admin.NET.Core.xml
  3. 7 7
      Admin.NET/Admin.NET.Core/Entity/WeChatUser.cs
  4. 2 2
      Admin.NET/Admin.NET.Core/Enum/PlatformTypeEnum.cs
  5. 6 1
      Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs
  6. 18 0
      Admin.NET/Admin.NET.Core/Service/WeChat/Dto/WeChatUserInput.cs
  7. 1 1
      Admin.NET/Admin.NET.Core/Service/WeChat/WeChatService.cs
  8. 64 0
      Admin.NET/Admin.NET.Core/Service/WeChat/WeChatUserService.cs
  9. 1 0
      Web/src/api-services/api.ts
  10. 408 0
      Web/src/api-services/apis/we-chat-user-api.ts
  11. 57 0
      Web/src/api-services/models/admin-result-sql-sugar-paged-list-we-chat-user.ts
  12. 26 0
      Web/src/api-services/models/delete-we-chat-user-input.ts
  13. 4 1
      Web/src/api-services/models/index.ts
  14. 2 2
      Web/src/api-services/models/platform-type-enum.ts
  15. 63 0
      Web/src/api-services/models/sql-sugar-paged-list-we-chat-user.ts
  16. 5 5
      Web/src/api-services/models/we-chat-user.ts
  17. 1 1
      Web/src/views/system/codeGen/component/editCodeGenDialog.vue
  18. 1 1
      Web/src/views/system/config/index.vue
  19. 1 1
      Web/src/views/system/dict/component/dictDataDialog.vue
  20. 2 2
      Web/src/views/system/dict/index.vue
  21. 1 1
      Web/src/views/system/file/index.vue
  22. 1 19
      Web/src/views/system/job/component/editJobDetail.vue
  23. 1 1
      Web/src/views/system/menu/index.vue
  24. 1 1
      Web/src/views/system/notice/index.vue
  25. 2 2
      Web/src/views/system/org/index.vue
  26. 1 1
      Web/src/views/system/pos/index.vue
  27. 2 2
      Web/src/views/system/region/index.vue
  28. 2 2
      Web/src/views/system/role/index.vue
  29. 3 3
      Web/src/views/system/tenant/index.vue
  30. 0 130
      Web/src/views/system/timer/component/editTimer.vue
  31. 0 200
      Web/src/views/system/timer/index.vue
  32. 2 2
      Web/src/views/system/user/index.vue
  33. 88 0
      Web/src/views/system/weChatUser/component/editWeChatUser.vue
  34. 166 0
      Web/src/views/system/weChatUser/index.vue

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

@@ -16,9 +16,9 @@
     <PackageReference Include="AngleSharp" Version="0.17.1" />
     <PackageReference Include="AspNetCoreRateLimit" Version="4.0.2" />
     <PackageReference Include="DotNetCore.Natasha.CSharp" Version="5.0.2" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.1.7" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.1.7" />
-    <PackageReference Include="Furion.Pure" Version="4.8.1.7" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.2" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.2" />
+    <PackageReference Include="Furion.Pure" Version="4.8.2" />
     <PackageReference Include="Lazy.Captcha.Core" Version="1.1.6" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.0" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.0" />

+ 82 - 39
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -1964,17 +1964,17 @@
         </member>
         <member name="P:Admin.NET.Core.WeChatUser.UserId">
             <summary>
-            关联系统用户Id
+            系统用户Id
             </summary>
         </member>
         <member name="P:Admin.NET.Core.WeChatUser.SysUser">
             <summary>
-            关联系统用户
+            系统用户
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.WeChatUser.Type">
+        <member name="P:Admin.NET.Core.WeChatUser.PlatformType">
             <summary>
-            第三方登录类型
+            平台类型
             </summary>
         </member>
         <member name="P:Admin.NET.Core.WeChatUser.OpenId">
@@ -2872,6 +2872,41 @@
             已读
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.PlatformTypeEnum">
+            <summary>
+            平台类型枚举
+            </summary>
+        </member>
+        <member name="F:Admin.NET.Core.PlatformTypeEnum.微信公众号">
+            <summary>
+            微信公众号
+            </summary>
+        </member>
+        <member name="F:Admin.NET.Core.PlatformTypeEnum.微信小程序">
+            <summary>
+            微信小程序
+            </summary>
+        </member>
+        <member name="F:Admin.NET.Core.PlatformTypeEnum.支付宝小程序">
+            <summary>
+            支付宝小程序
+            </summary>
+        </member>
+        <member name="F:Admin.NET.Core.PlatformTypeEnum.微信APP快捷登陆">
+            <summary>
+            微信APP快捷登陆
+            </summary>
+        </member>
+        <member name="F:Admin.NET.Core.PlatformTypeEnum.QQ在APP中快捷登陆">
+            <summary>
+            QQ在APP中快捷登陆
+            </summary>
+        </member>
+        <member name="F:Admin.NET.Core.PlatformTypeEnum.头条系小程序">
+            <summary>
+            头条系小程序
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.RequestTypeEnum">
             <summary>
             HTTP请求类型
@@ -2994,41 +3029,6 @@
             小程序为“签名错误”。对应公众号: 87009, “errmsg” : “reply is not exists” //该回复不存在
             </summary>
         </member>
-        <member name="T:Admin.NET.Core.WeChatUserTypeEnum">
-            <summary>
-            微信用户类型枚举
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.WeChatUserTypeEnum.微信公众号">
-            <summary>
-            微信公众号
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.WeChatUserTypeEnum.微信小程序">
-            <summary>
-            微信小程序
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.WeChatUserTypeEnum.支付宝小程序">
-            <summary>
-            支付宝小程序
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.WeChatUserTypeEnum.微信APP快捷登陆">
-            <summary>
-            微信APP快捷登陆
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.WeChatUserTypeEnum.QQ在APP中快捷登陆">
-            <summary>
-            QQ在APP中快捷登陆
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.WeChatUserTypeEnum.头条系小程序">
-            <summary>
-            头条系小程序
-            </summary>
-        </member>
         <member name="T:Admin.NET.Core.YesNoEnum">
             <summary>
             是否枚举
@@ -6881,6 +6881,16 @@
             优惠标记
             </summary>
         </member>
+        <member name="P:Admin.NET.Core.Service.WeChatUserInput.NickName">
+            <summary>
+            昵称
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.WeChatUserInput.Mobile">
+            <summary>
+            手机号码
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.Service.WeChatApiHttpClient">
             <summary>
             微信API客户端
@@ -6976,6 +6986,39 @@
             </summary>
             <returns></returns>
         </member>
+        <member name="T:Admin.NET.Core.Service.WeChatUserService">
+            <summary>
+            微信账号服务
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.Service.WeChatUserService.GetWeChatUserPage(Admin.NET.Core.Service.WeChatUserInput)">
+            <summary>
+            获取微信用户列表
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.WeChatUserService.AddWeChatUser(Admin.NET.Core.WeChatUser)">
+            <summary>
+            增加微信用户
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.WeChatUserService.UpdateWeChatUser(Admin.NET.Core.WeChatUser)">
+            <summary>
+            更新微信用户
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.WeChatUserService.DeleteWeChatUser(Admin.NET.Core.Service.DeleteWeChatUserInput)">
+            <summary>
+            删除微信用户
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
         <member name="P:Admin.NET.Core.MessageInput.UserId">
             <summary>
             用户ID

+ 7 - 7
Admin.NET/Admin.NET.Core/Entity/WeChatUser.cs

@@ -7,23 +7,23 @@
 public class WeChatUser : EntityBase
 {
     /// <summary>
-    /// 关联系统用户Id
+    /// 系统用户Id
     /// </summary>
-    [SugarColumn(ColumnDescription = "关联系统用户Id")]
+    [SugarColumn(ColumnDescription = "系统用户Id")]
     public long UserId { get; set; }
 
     /// <summary>
-    /// 关联系统用户
+    /// 系统用户
     /// </summary>
     [SugarColumn(IsIgnore = true)]
     [Navigate(NavigateType.OneToOne, nameof(UserId))]
     public SysUser SysUser { get; set; }
 
     /// <summary>
-    /// 第三方登录类型
+    /// 平台类型
     /// </summary>
-    [SugarColumn(ColumnDescription = "第三方登录类型")]
-    public WeChatUserTypeEnum Type { get; set; } = WeChatUserTypeEnum.微信公众号;
+    [SugarColumn(ColumnDescription = "平台类型")]
+    public PlatformTypeEnum PlatformType { get; set; } = PlatformTypeEnum.微信公众号;
 
     /// <summary>
     /// OpenId
@@ -117,5 +117,5 @@ public class WeChatUser : EntityBase
     /// 过期时间
     /// </summary>
     [SugarColumn(ColumnDescription = "ExpiresIn")]
-    public int ExpiresIn { get; set; }
+    public int? ExpiresIn { get; set; }
 }

+ 2 - 2
Admin.NET/Admin.NET.Core/Enum/WeChatUserTypeEnum.cs → Admin.NET/Admin.NET.Core/Enum/PlatformTypeEnum.cs

@@ -1,9 +1,9 @@
 namespace Admin.NET.Core;
 
 /// <summary>
-/// 微信用户类型枚举
+/// 平台类型枚举
 /// </summary>
-public enum WeChatUserTypeEnum
+public enum PlatformTypeEnum
 {
     /// <summary>
     /// 微信公众号

+ 6 - 1
Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs

@@ -32,7 +32,7 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             new SysMenu{ Id=252885263005219, Pid=252885263005210, Title="修改密码", Permission="sysUser:changePwd", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
             new SysMenu{ Id=252885263005220, Pid=252885263005210, Title="强制下线", Permission="sysUser:forceOffline", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
 
-            new SysMenu{ Id=252885263005230, Pid=252885263005200, Title="角色管理", Path="/system/role", Name="sysRole", Component="/system/role/index", Icon="ele-UserFilled", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=110 },
+            new SysMenu{ Id=252885263005230, Pid=252885263005200, Title="角色管理", Path="/system/role", Name="sysRole", Component="/system/role/index", Icon="ele-Help", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=110 },
             new SysMenu{ Id=252885263005231, Pid=252885263005230, Title="查询", Permission="sysRole:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
             new SysMenu{ Id=252885263005232, Pid=252885263005230, Title="编辑", Permission="sysRole:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
             new SysMenu{ Id=252885263005233, Pid=252885263005230, Title="增加", Permission="sysRole:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
@@ -65,6 +65,11 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             new SysMenu{ Id=252885263005274, Pid=252885263005270, Title="删除", Permission="sysNotice:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
             new SysMenu{ Id=252885263005275, Pid=252885263005270, Title="发布", Permission="sysNotice:public", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
             new SysMenu{ Id=252885263005276, Pid=252885263005270, Title="撤回", Permission="sysNotice:cancel", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
+               
+            new SysMenu{ Id=252885263005280, Pid=252885263005200, Title="微信账号", Path="/system/weChatUser", Name="weChatUser", Component="/system/weChatUser/index",Icon="ele-ChatDotRound", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=170 },
+            new SysMenu{ Id=252885263005281, Pid=252885263005280, Title="查询", Permission="weChatUser:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
+            new SysMenu{ Id=252885263005282, Pid=252885263005280, Title="编辑", Permission="weChatUser:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
+            new SysMenu{ Id=252885263005283, Pid=252885263005280, Title="删除", Permission="weChatUser:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=100 },
 
             new SysMenu{ Id=252885263005300, Pid=0, Title="平台管理", Path="/platform", Name="platform", Component="Layout", Redirect="/platform/tenant", Icon="ele-Menu", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Order=200 },
 

+ 18 - 0
Admin.NET/Admin.NET.Core/Service/WeChat/Dto/WeChatUserInput.cs

@@ -0,0 +1,18 @@
+namespace Admin.NET.Core.Service;
+
+public class WeChatUserInput : BasePageInput
+{
+    /// <summary>
+    /// 昵称
+    /// </summary>
+    public string NickName { get; set; }
+
+    /// <summary>
+    /// 手机号码
+    /// </summary>
+    public string Mobile { get; set; }
+}
+
+public class DeleteWeChatUserInput : BaseIdInput
+{
+}

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/WeChat/WeChatService.cs

@@ -3,7 +3,7 @@
 /// <summary>
 /// 微信公众号服务
 /// </summary>
-[ApiDescriptionSettings(Order = 100)]
+[ApiDescriptionSettings(Order = 101)]
 public class WeChatService : IDynamicApiController, ITransient
 {
     private readonly SqlSugarRepository<WeChatUser> _weChatUserRep;

+ 64 - 0
Admin.NET/Admin.NET.Core/Service/WeChat/WeChatUserService.cs

@@ -0,0 +1,64 @@
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 微信账号服务
+/// </summary>
+[ApiDescriptionSettings(Order = 100)]
+public class WeChatUserService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<WeChatUser> _weChatUserRep;
+
+    public WeChatUserService(SqlSugarRepository<WeChatUser> weChatUserRep)
+    {
+        _weChatUserRep = weChatUserRep;
+    }
+
+    /// <summary>
+    /// 获取微信用户列表
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpGet("/weChatUser/page")]
+    public async Task<SqlSugarPagedList<WeChatUser>> GetWeChatUserPage([FromQuery] WeChatUserInput input)
+    {
+        return await _weChatUserRep.AsQueryable()
+            .WhereIF(!string.IsNullOrWhiteSpace(input.NickName), u => u.NickName.Contains(input.NickName))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Mobile), u => u.Mobile.Contains(input.Mobile))
+            .OrderBy(u => u.Id, OrderByType.Desc)
+            .ToPagedListAsync(input.Page, input.PageSize);
+    }
+
+    /// <summary>
+    /// 增加微信用户
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost("/weChatUser/add")]
+    public async Task AddWeChatUser(WeChatUser input)
+    {
+        await _weChatUserRep.InsertAsync(input.Adapt<WeChatUser>());
+    }
+
+    /// <summary>
+    /// 更新微信用户
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost("/weChatUser/update")]
+    public async Task UpdateWeChatUser(WeChatUser input)
+    {
+        var weChatUser = input.Adapt<WeChatUser>();
+        await _weChatUserRep.AsUpdateable(weChatUser).IgnoreColumns(true).ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 删除微信用户
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost("/weChatUser/delete")]
+    public async Task DeleteWeChatUser(DeleteWeChatUserInput input)
+    {
+        await _weChatUserRep.DeleteAsync(u => u.Id == input.Id);
+    }
+}

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

@@ -38,4 +38,5 @@ export * from './apis/sys-tenant-api';
 export * from './apis/sys-user-api';
 export * from './apis/we-chat-api';
 export * from './apis/we-chat-pay-api';
+export * from './apis/we-chat-user-api';
 

+ 408 - 0
Web/src/api-services/apis/we-chat-user-api.ts

@@ -0,0 +1,408 @@
+/* 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 { AdminResultSqlSugarPagedListWeChatUser } from '../models';
+import { DeleteWeChatUserInput } from '../models';
+import { WeChatUser } from '../models';
+/**
+ * WeChatUserApi - axios parameter creator
+ * @export
+ */
+export const WeChatUserApiAxiosParamCreator = function (configuration?: Configuration) {
+    return {
+        /**
+         * 
+         * @summary 增加微信用户
+         * @param {WeChatUser} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        weChatUserAddPost: async (body?: WeChatUser, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/weChatUser/add`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+
+            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 {DeleteWeChatUserInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        weChatUserDeletePost: async (body?: DeleteWeChatUserInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/weChatUser/delete`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+
+            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} [nickName] 昵称
+         * @param {string} [mobile] 手机号码
+         * @param {number} [page] 当前页码
+         * @param {number} [pageSize] 页码容量
+         * @param {string} [field] 排序字段
+         * @param {string} [order] 排序方向
+         * @param {string} [descStr] 降序排序
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        weChatUserPageGet: async (nickName?: string, mobile?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/weChatUser/page`;
+            // 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 (nickName !== undefined) {
+                localVarQueryParameter['NickName'] = nickName;
+            }
+
+            if (mobile !== undefined) {
+                localVarQueryParameter['Mobile'] = mobile;
+            }
+
+            if (page !== undefined) {
+                localVarQueryParameter['Page'] = page;
+            }
+
+            if (pageSize !== undefined) {
+                localVarQueryParameter['PageSize'] = pageSize;
+            }
+
+            if (field !== undefined) {
+                localVarQueryParameter['Field'] = field;
+            }
+
+            if (order !== undefined) {
+                localVarQueryParameter['Order'] = order;
+            }
+
+            if (descStr !== undefined) {
+                localVarQueryParameter['DescStr'] = descStr;
+            }
+
+            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 {WeChatUser} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        weChatUserUpdatePost: async (body?: WeChatUser, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/weChatUser/update`;
+            // 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,
+            };
+        },
+    }
+};
+
+/**
+ * WeChatUserApi - functional programming interface
+ * @export
+ */
+export const WeChatUserApiFp = function(configuration?: Configuration) {
+    return {
+        /**
+         * 
+         * @summary 增加微信用户
+         * @param {WeChatUser} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async weChatUserAddPost(body?: WeChatUser, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await WeChatUserApiAxiosParamCreator(configuration).weChatUserAddPost(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 {DeleteWeChatUserInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async weChatUserDeletePost(body?: DeleteWeChatUserInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await WeChatUserApiAxiosParamCreator(configuration).weChatUserDeletePost(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} [nickName] 昵称
+         * @param {string} [mobile] 手机号码
+         * @param {number} [page] 当前页码
+         * @param {number} [pageSize] 页码容量
+         * @param {string} [field] 排序字段
+         * @param {string} [order] 排序方向
+         * @param {string} [descStr] 降序排序
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async weChatUserPageGet(nickName?: string, mobile?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSqlSugarPagedListWeChatUser>>> {
+            const localVarAxiosArgs = await WeChatUserApiAxiosParamCreator(configuration).weChatUserPageGet(nickName, mobile, 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);
+            };
+        },
+        /**
+         * 
+         * @summary 更新微信用户
+         * @param {WeChatUser} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async weChatUserUpdatePost(body?: WeChatUser, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
+            const localVarAxiosArgs = await WeChatUserApiAxiosParamCreator(configuration).weChatUserUpdatePost(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
+    }
+};
+
+/**
+ * WeChatUserApi - factory interface
+ * @export
+ */
+export const WeChatUserApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
+    return {
+        /**
+         * 
+         * @summary 增加微信用户
+         * @param {WeChatUser} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async weChatUserAddPost(body?: WeChatUser, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return WeChatUserApiFp(configuration).weChatUserAddPost(body, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 删除微信用户
+         * @param {DeleteWeChatUserInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async weChatUserDeletePost(body?: DeleteWeChatUserInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return WeChatUserApiFp(configuration).weChatUserDeletePost(body, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 获取微信用户列表
+         * @param {string} [nickName] 昵称
+         * @param {string} [mobile] 手机号码
+         * @param {number} [page] 当前页码
+         * @param {number} [pageSize] 页码容量
+         * @param {string} [field] 排序字段
+         * @param {string} [order] 排序方向
+         * @param {string} [descStr] 降序排序
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async weChatUserPageGet(nickName?: string, mobile?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSqlSugarPagedListWeChatUser>> {
+            return WeChatUserApiFp(configuration).weChatUserPageGet(nickName, mobile, page, pageSize, field, order, descStr, options).then((request) => request(axios, basePath));
+        },
+        /**
+         * 
+         * @summary 更新微信用户
+         * @param {WeChatUser} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async weChatUserUpdatePost(body?: WeChatUser, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
+            return WeChatUserApiFp(configuration).weChatUserUpdatePost(body, options).then((request) => request(axios, basePath));
+        },
+    };
+};
+
+/**
+ * WeChatUserApi - object-oriented interface
+ * @export
+ * @class WeChatUserApi
+ * @extends {BaseAPI}
+ */
+export class WeChatUserApi extends BaseAPI {
+    /**
+     * 
+     * @summary 增加微信用户
+     * @param {WeChatUser} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof WeChatUserApi
+     */
+    public async weChatUserAddPost(body?: WeChatUser, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return WeChatUserApiFp(this.configuration).weChatUserAddPost(body, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary 删除微信用户
+     * @param {DeleteWeChatUserInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof WeChatUserApi
+     */
+    public async weChatUserDeletePost(body?: DeleteWeChatUserInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return WeChatUserApiFp(this.configuration).weChatUserDeletePost(body, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary 获取微信用户列表
+     * @param {string} [nickName] 昵称
+     * @param {string} [mobile] 手机号码
+     * @param {number} [page] 当前页码
+     * @param {number} [pageSize] 页码容量
+     * @param {string} [field] 排序字段
+     * @param {string} [order] 排序方向
+     * @param {string} [descStr] 降序排序
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof WeChatUserApi
+     */
+    public async weChatUserPageGet(nickName?: string, mobile?: string, page?: number, pageSize?: number, field?: string, order?: string, descStr?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSqlSugarPagedListWeChatUser>> {
+        return WeChatUserApiFp(this.configuration).weChatUserPageGet(nickName, mobile, page, pageSize, field, order, descStr, options).then((request) => request(this.axios, this.basePath));
+    }
+    /**
+     * 
+     * @summary 更新微信用户
+     * @param {WeChatUser} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof WeChatUserApi
+     */
+    public async weChatUserUpdatePost(body?: WeChatUser, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
+        return WeChatUserApiFp(this.configuration).weChatUserUpdatePost(body, options).then((request) => request(this.axios, this.basePath));
+    }
+}

+ 57 - 0
Web/src/api-services/models/admin-result-sql-sugar-paged-list-we-chat-user.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 { SqlSugarPagedListWeChatUser } from './sql-sugar-paged-list-we-chat-user';
+/**
+ * 全局返回结果
+ * @export
+ * @interface AdminResultSqlSugarPagedListWeChatUser
+ */
+export interface AdminResultSqlSugarPagedListWeChatUser {
+    /**
+     * 状态码
+     * @type {number}
+     * @memberof AdminResultSqlSugarPagedListWeChatUser
+     */
+    code?: number;
+    /**
+     * 类型success、warning、error
+     * @type {string}
+     * @memberof AdminResultSqlSugarPagedListWeChatUser
+     */
+    type?: string | null;
+    /**
+     * 错误信息
+     * @type {string}
+     * @memberof AdminResultSqlSugarPagedListWeChatUser
+     */
+    message?: string | null;
+    /**
+     * 
+     * @type {SqlSugarPagedListWeChatUser}
+     * @memberof AdminResultSqlSugarPagedListWeChatUser
+     */
+    result?: SqlSugarPagedListWeChatUser;
+    /**
+     * 附加数据
+     * @type {any}
+     * @memberof AdminResultSqlSugarPagedListWeChatUser
+     */
+    extras?: any | null;
+    /**
+     * 时间
+     * @type {Date}
+     * @memberof AdminResultSqlSugarPagedListWeChatUser
+     */
+    time?: Date;
+}

+ 26 - 0
Web/src/api-services/models/delete-we-chat-user-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 DeleteWeChatUserInput
+ */
+export interface DeleteWeChatUserInput {
+    /**
+     * 主键Id
+     * @type {number}
+     * @memberof DeleteWeChatUserInput
+     */
+    id: number;
+}

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

@@ -62,6 +62,7 @@ export * from './admin-result-sql-sugar-paged-list-sys-region';
 export * from './admin-result-sql-sugar-paged-list-sys-role';
 export * from './admin-result-sql-sugar-paged-list-sys-user';
 export * from './admin-result-sql-sugar-paged-list-tenant-output';
+export * from './admin-result-sql-sugar-paged-list-we-chat-user';
 export * from './admin-result-string';
 export * from './admin-result-sys-code-gen';
 export * from './admin-result-sys-code-gen-config';
@@ -104,6 +105,7 @@ export * from './delete-region-input';
 export * from './delete-role-input';
 export * from './delete-tenant-input';
 export * from './delete-user-input';
+export * from './delete-we-chat-user-input';
 export * from './dict-data-input';
 export * from './dict-type-input';
 export * from './file-input';
@@ -126,6 +128,7 @@ export * from './notice-input';
 export * from './notice-status-enum';
 export * from './notice-type-enum';
 export * from './notice-user-status-enum';
+export * from './platform-type-enum';
 export * from './reset-pwd-user-input';
 export * from './role-input';
 export * from './role-menu-input';
@@ -149,6 +152,7 @@ export * from './sql-sugar-paged-list-sys-region';
 export * from './sql-sugar-paged-list-sys-role';
 export * from './sql-sugar-paged-list-sys-user';
 export * from './sql-sugar-paged-list-tenant-output';
+export * from './sql-sugar-paged-list-we-chat-user';
 export * from './status-enum';
 export * from './swagger-submit-url-body';
 export * from './sys-code-gen';
@@ -211,5 +215,4 @@ export * from './we-chat-pay-para-input';
 export * from './we-chat-pay-transaction-input';
 export * from './we-chat-user';
 export * from './we-chat-user-login';
-export * from './we-chat-user-type-enum';
 export * from './yes-no-enum';

+ 2 - 2
Web/src/api-services/models/we-chat-user-type-enum.ts → Web/src/api-services/models/platform-type-enum.ts

@@ -12,11 +12,11 @@
  * 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;支付宝小程序 支付宝小程序 = 3<br />&nbsp;微信APP快捷登陆 微信APP快捷登陆 = 4<br />&nbsp;QQ在APP中快捷登陆 QQ在APP中快捷登陆 = 5<br />&nbsp;头条系小程序 头条系小程序 = 6<br />
  * @export
  * @enum {string}
  */
-export enum WeChatUserTypeEnum {
+export enum PlatformTypeEnum {
     NUMBER_1 = 1,
     NUMBER_2 = 2,
     NUMBER_3 = 3,

+ 63 - 0
Web/src/api-services/models/sql-sugar-paged-list-we-chat-user.ts

@@ -0,0 +1,63 @@
+/* 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 { WeChatUser } from './we-chat-user';
+/**
+ * 分页泛型集合
+ * @export
+ * @interface SqlSugarPagedListWeChatUser
+ */
+export interface SqlSugarPagedListWeChatUser {
+    /**
+     * 页码
+     * @type {number}
+     * @memberof SqlSugarPagedListWeChatUser
+     */
+    page?: number;
+    /**
+     * 页容量
+     * @type {number}
+     * @memberof SqlSugarPagedListWeChatUser
+     */
+    pageSize?: number;
+    /**
+     * 总条数
+     * @type {number}
+     * @memberof SqlSugarPagedListWeChatUser
+     */
+    total?: number;
+    /**
+     * 总页数
+     * @type {number}
+     * @memberof SqlSugarPagedListWeChatUser
+     */
+    totalPages?: number;
+    /**
+     * 当前页集合
+     * @type {Array<WeChatUser>}
+     * @memberof SqlSugarPagedListWeChatUser
+     */
+    items?: Array<WeChatUser> | null;
+    /**
+     * 是否有上一页
+     * @type {boolean}
+     * @memberof SqlSugarPagedListWeChatUser
+     */
+    hasPrevPage?: boolean;
+    /**
+     * 是否有下一页
+     * @type {boolean}
+     * @memberof SqlSugarPagedListWeChatUser
+     */
+    hasNextPage?: boolean;
+}

+ 5 - 5
Web/src/api-services/models/we-chat-user.ts

@@ -11,8 +11,8 @@
  * https://github.com/swagger-api/swagger-codegen.git
  * Do not edit the class manually.
  */
+import { PlatformTypeEnum } from './platform-type-enum';
 import { SysUser } from './sys-user';
-import { WeChatUserTypeEnum } from './we-chat-user-type-enum';
 /**
  * 微信用户表
  * @export
@@ -56,7 +56,7 @@ export interface WeChatUser {
      */
     isDelete?: boolean;
     /**
-     * 关联系统用户Id
+     * 系统用户Id
      * @type {number}
      * @memberof WeChatUser
      */
@@ -69,10 +69,10 @@ export interface WeChatUser {
     sysUser?: SysUser;
     /**
      * 
-     * @type {WeChatUserTypeEnum}
+     * @type {PlatformTypeEnum}
      * @memberof WeChatUser
      */
-    type?: WeChatUserTypeEnum;
+    platformType?: PlatformTypeEnum;
     /**
      * OpenId
      * @type {string}
@@ -156,5 +156,5 @@ export interface WeChatUser {
      * @type {number}
      * @memberof WeChatUser
      */
-    expiresIn?: number;
+    expiresIn?: number | null;
 }

+ 1 - 1
Web/src/views/system/codeGen/component/editCodeGenDialog.vue

@@ -199,9 +199,9 @@ export default defineComponent({
 			closeDialog,
 			cancel,
 			submit,
-			...toRefs(state),
 			isOrNotSelect,
 			DbChanged,
+			...toRefs(state),
 		};
 	},
 });

+ 1 - 1
Web/src/views/system/config/index.vue

@@ -147,9 +147,9 @@ export default defineComponent({
 			handleQuery();
 		};
 		return {
+			editConfigRef,
 			handleQuery,
 			resetQuery,
-			editConfigRef,
 			openAddConfig,
 			openEditConfig,
 			delConfig,

+ 1 - 1
Web/src/views/system/dict/component/dictDataDialog.vue

@@ -155,10 +155,10 @@ export default defineComponent({
 			handleQuery();
 		};
 		return {
+			editDictDataRef,
 			openDialog,
 			handleQuery,
 			resetQuery,
-			editDictDataRef,
 			openAddDictData,
 			openEditDictData,
 			delDictData,

+ 2 - 2
Web/src/views/system/dict/index.vue

@@ -149,10 +149,10 @@ export default defineComponent({
 			handleQuery();
 		};
 		return {
-			handleQuery,
-			resetQuery,
 			editDictTypeRef,
 			dictDataDialogRef,
+			handleQuery,
+			resetQuery,
 			openAddDictType,
 			openEditDictType,
 			openDictDataDialog,

+ 1 - 1
Web/src/views/system/file/index.vue

@@ -233,9 +233,9 @@ export default defineComponent({
 			},
 		];
 		return {
+			uploadRef,
 			handleQuery,
 			resetQuery,
-			uploadRef,
 			openUploadDialog,
 			handleChange,
 			uploadFile,

+ 1 - 19
Web/src/views/system/job/component/editJobDetail.vue

@@ -50,7 +50,7 @@
 						</el-row>
 					</el-form>
 				</el-tab-pane>
-				<el-tab-pane label="作业代码">
+				<el-tab-pane label="脚本代码">
 					<div ref="monacoEditorRef" style="width: 100%; height: 500px"></div>
 				</el-tab-pane>
 			</el-tabs>
@@ -94,23 +94,6 @@ export default defineComponent({
 		// 初始化monacoEditor对象
 		var monacoEditor: any = null;
 		const initMonacoEditor = () => {
-			// self.MonacoEnvironment = {
-			// 	getWorkerUrl: function (moduleId, label) {
-			// 		if (label === 'json') {
-			// 			return './json.worker.bundle.js';
-			// 		}
-			// 		if (label === 'css') {
-			// 			return './css.worker.bundle.js';
-			// 		}
-			// 		if (label === 'html') {
-			// 			return './html.worker.bundle.js';
-			// 		}
-			// 		if (label === 'typescript' || label === 'javascript') {
-			// 			return './ts.worker.bundle.js';
-			// 		}
-			// 		return './editor.worker.bundle.js';
-			// 	},
-			// };
 			monacoEditor = monaco.editor.create(monacoEditorRef.value, {
 				theme: 'vs-dark', // 主题 vs vs-dark hc-black
 				value: JobScriptCode, // 默认显示的值
@@ -143,7 +126,6 @@ export default defineComponent({
 
 			// 延迟拿值防止取不到
 			setTimeout(() => {
-				console.log(monacoEditor)
 				if (monacoEditor == null) initMonacoEditor();
 				else monacoEditor.setValue(row.id == undefined ? JobScriptCode : state.ruleForm.scriptCode);
 			}, 1);

+ 1 - 1
Web/src/views/system/menu/index.vue

@@ -131,9 +131,9 @@ export default defineComponent({
 				.catch(() => {});
 		};
 		return {
+			editMenuRef,
 			handleQuery,
 			resetQuery,
-			editMenuRef,
 			openAddMenu,
 			openEditMenu,
 			delMenu,

+ 1 - 1
Web/src/views/system/notice/index.vue

@@ -169,9 +169,9 @@ export default defineComponent({
 			handleQuery();
 		};
 		return {
+			editNoticeRef,
 			handleQuery,
 			resetQuery,
-			editNoticeRef,
 			openAddNotice,
 			openEditNotice,
 			delNotice,

+ 2 - 2
Web/src/views/system/org/index.vue

@@ -139,10 +139,10 @@ export default defineComponent({
 			handleQuery();
 		};
 		return {
-			handleQuery,
-			resetQuery,
 			editOrgRef,
 			orgTreeRef,
+			handleQuery,
+			resetQuery,
 			openAddOrg,
 			openEditOrg,
 			delOrg,

+ 1 - 1
Web/src/views/system/pos/index.vue

@@ -115,9 +115,9 @@ export default defineComponent({
 				.catch(() => {});
 		};
 		return {
+			editPosRef,
 			handleQuery,
 			resetQuery,
-			editPosRef,
 			openAddPos,
 			openEditPos,
 			delPos,

+ 2 - 2
Web/src/views/system/region/index.vue

@@ -175,10 +175,10 @@ export default defineComponent({
 			handleQuery();
 		};
 		return {
-			handleQuery,
-			resetQuery,
 			editRegionRef,
 			regionTreeRef,
+			handleQuery,
+			resetQuery,
 			openAddRegion,
 			openEditRegion,
 			delRegion,

+ 2 - 2
Web/src/views/system/role/index.vue

@@ -166,10 +166,10 @@ export default defineComponent({
 			handleQuery();
 		};
 		return {
-			handleQuery,
-			resetQuery,
 			editRoleRef,
 			grantDataRef,
+			handleQuery,
+			resetQuery,
 			openAddRole,
 			openEditRole,
 			openGrantData,

+ 3 - 3
Web/src/views/system/tenant/index.vue

@@ -172,7 +172,7 @@ export default defineComponent({
 				type: 'warning',
 			})
 				.then(async () => {
-					await getAPI(SysTenantApi).sysTenantResetPwdPost({ id: row.id });
+					await getAPI(SysTenantApi).sysTenantResetPwdPost({ userId: row.userId });
 					ElMessage.success('密码重置成功:123456');
 				})
 				.catch(() => {});
@@ -215,10 +215,10 @@ export default defineComponent({
 				.catch(() => {});
 		};
 		return {
-			handleQuery,
-			resetQuery,
 			editTenantRef,
 			grantMenuRef,
+			handleQuery,
+			resetQuery,
 			openAddTenant,
 			openEditTenant,
 			openGrantMenu,

+ 0 - 130
Web/src/views/system/timer/component/editTimer.vue

@@ -1,130 +0,0 @@
-<!-- <template>
-	<div class="sys-timer-container">
-		<el-dialog v-model="isShowDialog" draggable width="769px">
-			<template #header>
-				<div style="color: #fff">
-					<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit /> </el-icon>
-					<span> {{ title }} </span>
-				</div>
-			</template>
-			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="100px">
-				<el-row :gutter="35">
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="任务名称" prop="timerName" :rules="[{ required: true, message: '任务名称不能为空', trigger: 'blur' }]">
-							<el-input v-model="ruleForm.timerName" placeholder="任务名称" clearable />
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="请求地址" prop="requestUrl" :rules="[{ required: true, message: '请求地址不能为空', trigger: 'blur' }]">
-							<el-input v-model="ruleForm.requestUrl" placeholder="请求地址" clearable />
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="请求类型" prop="requestType" :rules="[{ required: true, message: '请求类型不能为空', trigger: 'blur' }]">
-							<el-radio-group v-model="ruleForm.requestType">
-								<el-radio :label="0">RUN</el-radio>
-								<el-radio :label="1">GET</el-radio>
-								<el-radio :label="2">POST</el-radio>
-								<el-radio :label="3">PUT</el-radio>
-								<el-radio :label="4">DELETE</el-radio>
-							</el-radio-group>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="请求参数" prop="requestPara">
-							<el-input v-model="ruleForm.requestPara" placeholder="所属分类" clearable type="textarea" />
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-						<el-form-item label="任务类型" prop="timerType" :rules="[{ required: true, message: '任务类型不能为空', trigger: 'blur' }]">
-							<el-select v-model="ruleForm.timerType" placeholder="岗位状态" style="width: 100%">
-								<el-option label="间隔模式" :value="0" />
-								<el-option label="Cron模式" :value="1" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-						<el-form-item label="执行间隔" prop="interval" v-if="ruleForm.timerType == 0">
-							<el-input v-model="ruleForm.interval" placeholder="执行间隔" clearable />
-						</el-form-item>
-						<el-form-item label="Cron表达式" prop="cron" v-else>
-							<el-input v-model="ruleForm.cron" placeholder="Cron表达式" clearable />
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
-						<el-form-item label="备注">
-							<el-input v-model="ruleForm.remark" placeholder="请输入备注内容" clearable type="textarea" />
-						</el-form-item>
-					</el-col>
-				</el-row>
-			</el-form>
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button @click="cancel" size="default">取 消</el-button>
-					<el-button type="primary" @click="submit" size="default">确 定</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, defineComponent, ref } from 'vue';
-import mittBus from '/@/utils/mitt';
-
-import { getAPI } from '/@/utils/axios-utils';
-import { SysTimerApi } from '/@/api-services/api';
-import { UpdateTimerInput } from '/@/api-services/models';
-
-export default defineComponent({
-	name: 'sysEditTimer',
-	components: {},
-	props: {
-		title: {
-			type: String,
-			default: '',
-		},
-	},
-	setup() {
-		const ruleFormRef = ref();
-		const state = reactive({
-			isShowDialog: false,
-			ruleForm: {} as UpdateTimerInput,
-		});
-		// 打开弹窗
-		const openDialog = (row: any) => {
-			state.ruleForm = JSON.parse(JSON.stringify(row));
-			state.isShowDialog = true;
-		};
-		// 关闭弹窗
-		const closeDialog = () => {
-			mittBus.emit('submitRefresh');
-			state.isShowDialog = false;
-		};
-		// 取消
-		const cancel = () => {
-			state.isShowDialog = false;
-		};
-		// 提交
-		const submit = () => {
-			ruleFormRef.value.validate(async (valid: boolean) => {
-				if (!valid) return;
-				if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
-					await getAPI(SysTimerApi).sysTimerUpdatePost(state.ruleForm);
-				} else {
-					await getAPI(SysTimerApi).sysTimerAddPost(state.ruleForm);
-				}
-				closeDialog();
-			});
-		};
-		return {
-			ruleFormRef,
-			openDialog,
-			closeDialog,
-			cancel,
-			submit,
-			...toRefs(state),
-		};
-	},
-});
-</script> -->

+ 0 - 200
Web/src/views/system/timer/index.vue

@@ -1,200 +0,0 @@
-<!-- <template>
-	<div class="sys-timer-container">
-		<el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
-			<el-form :model="queryParams" ref="queryForm" :inline="true">
-				<el-form-item label="任务名称" prop="timerName">
-					<el-input placeholder="任务名称" clearable @keyup.enter="handleQuery" v-model="queryParams.timerName" />
-				</el-form-item>
-				<el-form-item>
-					<el-button icon="ele-Refresh" @click="resetQuery"> 重置 </el-button>
-					<el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'sysTimer:page'"> 查询 </el-button>
-					<el-button icon="ele-Plus" @click="openAddTimer" v-auth="'sysTimer:add'"> 新增 </el-button>
-				</el-form-item>
-			</el-form>
-		</el-card>
-
-		<el-card shadow="hover" style="margin-top: 8px">
-			<el-table :data="timerData" style="width: 100%" v-loading="loading" border>
-				<el-table-column type="index" label="序号" width="55" align="center" />
-				<el-table-column prop="timerName" label="任务名称" width="160" show-overflow-tooltip />
-				<el-table-column prop="requestUrl" label="请求地址" width="120" show-overflow-tooltip />
-				<el-table-column prop="requestType" label="请求类型" width="100" align="center" show-overflow-tooltip>
-					<template #default="scope">
-						<el-tag type="info" v-if="scope.row.requestType == 0"> {{ 'RUN' }} </el-tag>
-						<el-tag type="info" v-else-if="scope.row.requestType == 1"> {{ 'GET' }} </el-tag>
-						<el-tag type="info" v-else-if="scope.row.requestType == 2"> {{ 'POST' }} </el-tag>
-						<el-tag type="info" v-else-if="scope.row.requestType == 3"> {{ 'PUT' }} </el-tag>
-						<el-tag type="info" v-else-if="scope.row.requestType == 4"> {{ 'DELETE' }} </el-tag>
-					</template>
-				</el-table-column>
-				<el-table-column prop="timerType" label="任务类型" width="100" align="center" show-overflow-tooltip>
-					<template #default="scope">
-						{{ scope.row.timerType == 0 ? scope.row.interval : scope.row.cron }}
-					</template>
-				</el-table-column>
-				<el-table-column prop="executeType" label="执行类型" width="100" align="center" show-overflow-tooltip>
-					<template #default="scope">
-						{{ scope.row.executeType == 0 ? '并行' : '串行' }}
-					</template>
-				</el-table-column>
-				<el-table-column prop="doOnce" label="执行一次" width="100" align="center" show-overflow-tooltip>
-					<template #default="scope">
-						{{ scope.row.doOnce ? '是' : '否' }}
-					</template>
-				</el-table-column>
-				<el-table-column prop="startNow" label="立即执行" width="100" align="center" show-overflow-tooltip>
-					<template #default="scope">
-						{{ scope.row.startNow ? '是' : '否' }}
-					</template>
-				</el-table-column>
-				<el-table-column prop="status" label="任务状态" width="100" align="center" show-overflow-tooltip>
-					<template #default="scope">
-						<el-tag type="success" v-if="scope.row.status == 0"> {{ '运行中' }} </el-tag>
-						<el-tag type="danger" v-else-if="scope.row.status == 1"> {{ '已停止' }} </el-tag>
-						<el-tag type="danger" v-else-if="scope.row.status == 2"> {{ '已失败' }} </el-tag>
-						<el-tag type="danger" v-else-if="scope.row.status == 3"> {{ '已删除' }} </el-tag>
-					</template>
-				</el-table-column>
-				<el-table-column prop="status" label="启动停止" width="100" align="center" show-overflow-tooltip>
-					<template #default="scope">
-						<el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1" size="small" @change="changeStatus(scope.row)" v-auth="'sysTimer:setStatus'" />
-					</template>
-				</el-table-column>
-				<el-table-column prop="tally" label="执行次数" width="100" align="center" show-overflow-tooltip />
-				<el-table-column prop="createTime" label="修改时间" width="100" align="center" show-overflow-tooltip />
-				<el-table-column prop="remark" label="备注" show-overflow-tooltip />
-				<el-table-column label="操作" width="140" fixed="right" align="center" show-overflow-tooltip>
-					<template #default="scope">
-						<el-button icon="ele-Edit" size="small" text type="primary" @click="openEditTimer(scope.row)" v-auth="'sysTimer:update'"> 编辑 </el-button>
-						<el-button icon="ele-Delete" size="small" text type="danger" @click="delTimer(scope.row)" v-auth="'sysTimer:delete'"> 删除 </el-button>
-					</template>
-				</el-table-column>
-			</el-table>
-			<el-pagination
-				v-model:currentPage="tableParams.page"
-				v-model:page-size="tableParams.pageSize"
-				:total="tableParams.total"
-				:page-sizes="[10, 20, 50, 100]"
-				small
-				background
-				@size-change="handleSizeChange"
-				@current-change="handleCurrentChange"
-				layout="total, sizes, prev, pager, next, jumper"
-			/>
-		</el-card>
-		<EditTimer ref="editTimerRef" :title="editTimerTitle" />
-	</div>
-</template>
-
-<script lang="ts">
-import { toRefs, reactive, onMounted, ref, defineComponent, onUnmounted, onActivated, onDeactivated } from 'vue';
-import { ElMessageBox, ElMessage } from 'element-plus';
-import mittBus from '/@/utils/mitt';
-import EditTimer from '/@/views/system/timer/component/editTimer.vue';
-
-import { getAPI } from '/@/utils/axios-utils';
-import { SysTimerApi, TimerOutput } from '/@/api-services';
-
-export default defineComponent({
-	name: 'sysTimer',
-	components: { EditTimer },
-	setup() {
-		const editTimerRef = ref();
-		const state = reactive({
-			loading: false,
-			timerData: [] as Array<TimerOutput>,
-			queryParams: {
-				timerName: undefined,
-			},
-			tableParams: {
-				page: 1,
-				pageSize: 10,
-				total: 0 as any,
-			},
-			editTimerTitle: '',
-			timer: null as any,
-		});
-		onMounted(async () => {
-			handleQuery();
-
-			mittBus.on('submitRefresh', () => {
-				handleQuery();
-			});
-		});
-		onUnmounted(() => {
-			mittBus.off('submitRefresh');
-		});
-		// 查询操作
-		const handleQuery = async () => {
-			state.loading = true;
-			var res = await getAPI(SysTimerApi).sysTimerPageGet(state.queryParams.timerName, state.tableParams.page, state.tableParams.pageSize);
-			state.timerData = res.data.result?.items ?? [];
-			state.tableParams.total = res.data.result?.total;
-			state.loading = false;
-		};
-		// 重置操作
-		const resetQuery = () => {
-			state.queryParams.timerName = undefined;
-			handleQuery();
-		};
-		// 打开新增页面
-		const openAddTimer = () => {
-			state.editTimerTitle = '添加任务';
-			editTimerRef.value.openDialog({});
-		};
-		// 打开编辑页面
-		const openEditTimer = (row: any) => {
-			state.editTimerTitle = '编辑任务';
-			editTimerRef.value.openDialog(row);
-		};
-		// 删除
-		const delTimer = (row: any) => {
-			ElMessageBox.confirm(`确定删除任务:【${row.timerName}】?`, '提示', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(async () => {
-					await getAPI(SysTimerApi).sysTimerDeletePost({ id: row.id });
-					handleQuery();
-					ElMessage.success('删除成功');
-				})
-				.catch(() => {});
-		};
-		// 改变页面容量
-		const handleSizeChange = (val: number) => {
-			state.tableParams.pageSize = val;
-			handleQuery();
-		};
-		// 改变页码序号
-		const handleCurrentChange = (val: number) => {
-			state.tableParams.page = val;
-			handleQuery();
-		};
-		// 修改状态
-		const changeStatus = async (row: any) => {
-			await getAPI(SysTimerApi).sysTimerSetStatusPost({ timerName: row.timerName, status: row.status });
-		};
-		onActivated(() => {
-			state.timer = setInterval(() => {
-				handleQuery();
-			}, 10000);
-		});
-		onDeactivated(() => {
-			clearInterval(state.timer);
-		});
-		return {
-			handleQuery,
-			resetQuery,
-			editTimerRef,
-			openAddTimer,
-			openEditTimer,
-			delTimer,
-			handleSizeChange,
-			handleCurrentChange,
-			changeStatus,
-			...toRefs(state),
-		};
-	},
-});
-</script> -->

+ 2 - 2
Web/src/views/system/user/index.vue

@@ -230,10 +230,10 @@ export default defineComponent({
 			handleQuery();
 		};
 		return {
-			handleQuery,
-			resetQuery,
 			orgTreeRef,
 			editUserRef,
+			handleQuery,
+			resetQuery,
 			openAddUser,
 			openEditUser,
 			delUser,

+ 88 - 0
Web/src/views/system/weChatUser/component/editWeChatUser.vue

@@ -0,0 +1,88 @@
+<template>
+	<div class="weChatUser-container">
+		<el-dialog v-model="isShowDialog" draggable width="600px">
+			<template #header>
+				<div style="color: #fff">
+					<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit /> </el-icon>
+					<span> {{ title }} </span>
+				</div>
+			</template>
+			<el-form :model="ruleForm" ref="ruleFormRef" size="default" label-width="80px">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="昵称" prop="nickName" :rules="[{ required: true, message: '昵称不能为空', trigger: 'blur' }]">
+							<el-input v-model="ruleForm.nickName" placeholder="昵称" clearable />
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="cancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="submit" size="default">确 定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, ref } from 'vue';
+import mittBus from '/@/utils/mitt';
+
+import { getAPI } from '/@/utils/axios-utils';
+import { WeChatUserApi } from '/@/api-services/api';
+import { WeChatUser } from '/@/api-services/models';
+
+export default defineComponent({
+	name: 'sysEditWeChatUser',
+	components: {},
+	props: {
+		title: {
+			type: String,
+			default: '',
+		},
+	},
+	setup() {
+		const ruleFormRef = ref();
+		const state = reactive({
+			isShowDialog: false,
+			ruleForm: {} as WeChatUser,
+		});
+		// 打开弹窗
+		const openDialog = (row: any) => {
+			state.ruleForm = JSON.parse(JSON.stringify(row));
+			state.isShowDialog = true;
+		};
+		// 关闭弹窗
+		const closeDialog = () => {
+			mittBus.emit('submitRefresh');
+			state.isShowDialog = false;
+		};
+		// 取消
+		const cancel = () => {
+			state.isShowDialog = false;
+		};
+		// 提交
+		const submit = () => {
+			ruleFormRef.value.validate(async (valid: boolean) => {
+				if (!valid) return;
+				if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
+					await getAPI(WeChatUserApi).weChatUserUpdatePost(state.ruleForm);
+				} else {
+					await getAPI(WeChatUserApi).weChatUserAddPost(state.ruleForm);
+				}
+				closeDialog();
+			});
+		};
+		return {
+			ruleFormRef,
+			openDialog,
+			closeDialog,
+			cancel,
+			submit,
+			...toRefs(state),
+		};
+	},
+});
+</script>

+ 166 - 0
Web/src/views/system/weChatUser/index.vue

@@ -0,0 +1,166 @@
+<template>
+	<div class="weChatUser-container">
+		<el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+			<el-form :model="queryParams" ref="queryForm" :inline="true">
+				<el-form-item label="微信昵称" prop="nickName">
+					<el-input placeholder="微信昵称" clearable @keyup.enter="handleQuery" v-model="queryParams.nickName" />
+				</el-form-item>
+				<el-form-item label="手机号码" prop="mobile">
+					<el-input placeholder="手机号码" clearable @keyup.enter="handleQuery" v-model="queryParams.mobile" />
+				</el-form-item>
+				<el-form-item>
+					<el-button icon="ele-Refresh" @click="resetQuery"> 重置 </el-button>
+					<el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'weChatUser:page'"> 查询 </el-button>
+				</el-form-item>
+			</el-form>
+		</el-card>
+
+		<el-card shadow="hover" style="margin-top: 8px">
+			<el-table :data="weChatUserData" style="width: 100%" v-loading="loading" border>
+				<el-table-column type="index" label="序号" width="55" align="center" />
+				<el-table-column prop="openId" label="OpenId" show-overflow-tooltip />
+				<el-table-column prop="unionId" label="UnionId" show-overflow-tooltip />
+				<el-table-column prop="platformType" label="平台类型" width="110" align="center" show-overflow-tooltip>
+					<template #default="scope">
+						<el-tag v-if="scope.row.platformType === 1"> 微信公众号 </el-tag>
+						<el-tag v-if="scope.row.platformType === 2"> 微信小程序 </el-tag>
+						<el-tag v-if="scope.row.platformType === 3"> 支付宝小程序 </el-tag>
+						<el-tag v-if="scope.row.platformType === 4"> 微信APP快捷登陆 </el-tag>
+						<el-tag v-if="scope.row.platformType === 5"> QQ在APP中快捷登陆 </el-tag>
+						<el-tag v-if="scope.row.platformType === 6"> 头条系小程序 </el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column prop="nickName" label="昵称" show-overflow-tooltip />
+				<el-table-column prop="avatar" label="头像" width="70" align="center">
+					<template #default="scope">
+						<el-avatar :src="scope.row.avatar" :size="32" />
+					</template>
+				</el-table-column>
+				<el-table-column prop="mobile" label="手机号码" show-overflow-tooltip />
+				<el-table-column prop="sex" label="性别" width="60" align="center" show-overflow-tooltip>
+					<template #default="scope">
+						<el-tag v-if="scope.row.sex === 0"> 男 </el-tag>
+						<el-tag type="danger" v-else> 女 </el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column prop="city" label="城市" show-overflow-tooltip />
+				<el-table-column prop="province" label="省" show-overflow-tooltip />
+				<el-table-column prop="country" label="国家" show-overflow-tooltip />
+				<el-table-column label="操作" width="140" fixed="right" align="center" show-overflow-tooltip>
+					<template #default="scope">
+						<el-button icon="ele-Edit" size="small" text type="primary" @click="openEditWeChatUser(scope.row)" v-auth="'weChatUser:update'"> 编辑 </el-button>
+						<el-button icon="ele-Delete" size="small" text type="danger" @click="delWeChatUser(scope.row)" v-auth="'weChatUser:delete'"> 删除 </el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<el-pagination
+				v-model:currentPage="tableParams.page"
+				v-model:page-size="tableParams.pageSize"
+				:total="tableParams.total"
+				:page-sizes="[10, 20, 50, 100]"
+				small
+				background
+				@size-change="handleSizeChange"
+				@current-change="handleCurrentChange"
+				layout="total, sizes, prev, pager, next, jumper"
+			/>
+		</el-card>
+		<EditWeChatUser ref="editWeChatUserRef" :title="editWeChatUserTitle" />
+	</div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, defineComponent, onUnmounted, ref } from 'vue';
+import { ElMessageBox, ElMessage } from 'element-plus';
+import mittBus from '/@/utils/mitt';
+import EditWeChatUser from '/@/views/system/weChatUser/component/editWeChatUser.vue';
+
+import { getAPI } from '/@/utils/axios-utils';
+import { WeChatUserApi } from '/@/api-services/api';
+import { WeChatUser } from '/@/api-services/models';
+
+export default defineComponent({
+	name: 'weChatUser',
+	components: { EditWeChatUser },
+	setup() {
+		const editWeChatUserRef = ref();
+		const state = reactive({
+			loading: false,
+			weChatUserData: [] as Array<WeChatUser>,
+			queryParams: {
+				nickName: undefined,
+				mobile: undefined,
+			},
+			tableParams: {
+				page: 1,
+				pageSize: 10,
+				total: 0 as any,
+			},
+			editWeChatUserTitle: '',
+		});
+		onMounted(async () => {
+			handleQuery();
+
+			mittBus.on('submitRefresh', () => {
+				handleQuery();
+			});
+		});
+		onUnmounted(() => {
+			mittBus.off('submitRefresh');
+		});
+		// 查询操作
+		const handleQuery = async () => {
+			state.loading = true;
+			var res = await getAPI(WeChatUserApi).weChatUserPageGet(state.queryParams.nickName, state.queryParams.mobile, state.tableParams.page, state.tableParams.pageSize);
+			state.weChatUserData = res.data.result?.items ?? [];
+			state.tableParams.total = res.data.result?.total;
+			state.loading = false;
+		};
+		// 重置操作
+		const resetQuery = () => {
+			state.queryParams.nickName = undefined;
+			state.queryParams.mobile = undefined;
+			handleQuery();
+		};
+		// 打开编辑页面
+		const openEditWeChatUser = (row: any) => {
+			state.editWeChatUserTitle = '编辑微信账号';
+			editWeChatUserRef.value.openDialog(row);
+		};
+		// 删除
+		const delWeChatUser = (row: any) => {
+			ElMessageBox.confirm(`确定删除微信账号:【${row.nickName}】?`, '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning',
+			})
+				.then(async () => {
+					await getAPI(WeChatUserApi).weChatUserDeletePost({ id: row.id });
+					handleQuery();
+					ElMessage.success('删除成功');
+				})
+				.catch(() => {});
+		};
+		// 改变页面容量
+		const handleSizeChange = (val: number) => {
+			state.tableParams.pageSize = val;
+			handleQuery();
+		};
+		// 改变页码序号
+		const handleCurrentChange = (val: number) => {
+			state.tableParams.page = val;
+			handleQuery();
+		};
+		return {
+			editWeChatUserRef,
+			handleQuery,
+			resetQuery,
+			openEditWeChatUser,
+			delWeChatUser,
+			handleSizeChange,
+			handleCurrentChange,
+			...toRefs(state),
+		};
+	},
+});
+</script>