Ver código fonte

优化租户登录

zhontai 2 anos atrás
pai
commit
de6e821e9e
45 arquivos alterados com 342 adições e 151 exclusões
  1. 5 5
      src/hosts/ZhonTai.Host/InitData/Admin/ad_api.json
  2. 6 3
      src/hosts/ZhonTai.Host/InitData/Admin/ad_user.json
  3. 6 3
      src/hosts/ZhonTai.Host/InitData/Admin/ad_user.tenant.json
  4. 5 0
      src/platform/ZhonTai.Admin/Core/Auth/ClaimAttributes.cs
  5. 16 0
      src/platform/ZhonTai.Admin/Core/Auth/IUser.cs
  6. 9 2
      src/platform/ZhonTai.Admin/Core/Auth/PermissionHandler.cs
  7. 39 0
      src/platform/ZhonTai.Admin/Core/Auth/User.cs
  8. 38 8
      src/platform/ZhonTai.Admin/Core/Db/Transaction/UnitOfWorkManagerCloud.cs
  9. 0 1
      src/platform/ZhonTai.Admin/Core/HostApp.cs
  10. 1 6
      src/platform/ZhonTai.Admin/Core/Repositories/RepositoryBase.cs
  11. 1 1
      src/platform/ZhonTai.Admin/Domain/Document/DocumentEntity.cs
  12. 1 1
      src/platform/ZhonTai.Admin/Domain/Document/DocumentType.cs
  13. 1 1
      src/platform/ZhonTai.Admin/Domain/Permission/PermissionEntity.cs
  14. 1 1
      src/platform/ZhonTai.Admin/Domain/Permission/PermissionType.cs
  15. 1 1
      src/platform/ZhonTai.Admin/Domain/Role/RoleEntity.cs
  16. 1 1
      src/platform/ZhonTai.Admin/Domain/Role/RoleType.cs
  17. 1 1
      src/platform/ZhonTai.Admin/Domain/Staff/Input/StaffAddInput.cs
  18. 1 1
      src/platform/ZhonTai.Admin/Domain/Staff/Sex.cs
  19. 1 4
      src/platform/ZhonTai.Admin/Domain/Staff/StaffEntity.cs
  20. 2 2
      src/platform/ZhonTai.Admin/Domain/User/UserEntity.cs
  21. 1 1
      src/platform/ZhonTai.Admin/Domain/User/UserStatus.cs
  22. 1 1
      src/platform/ZhonTai.Admin/Domain/User/UserType.cs
  23. 32 21
      src/platform/ZhonTai.Admin/Services/Auth/AuthService.cs
  24. 1 1
      src/platform/ZhonTai.Admin/Services/Auth/Dto/AuthGetUserInfoOutput.cs
  25. 6 0
      src/platform/ZhonTai.Admin/Services/Auth/Dto/AuthLoginOutput.cs
  26. 1 1
      src/platform/ZhonTai.Admin/Services/Document/DocumentService.cs
  27. 1 1
      src/platform/ZhonTai.Admin/Services/Document/Dto/DocumentAddGroupInput.cs
  28. 1 1
      src/platform/ZhonTai.Admin/Services/Document/Dto/DocumentAddMenuInput.cs
  29. 1 1
      src/platform/ZhonTai.Admin/Services/Document/Dto/DocumentListOutput.cs
  30. 1 1
      src/platform/ZhonTai.Admin/Services/Permission/Dto/PermissionAddApiInput.cs
  31. 1 1
      src/platform/ZhonTai.Admin/Services/Permission/Dto/PermissionAddDotInput.cs
  32. 1 1
      src/platform/ZhonTai.Admin/Services/Permission/Dto/PermissionAddGroupInput.cs
  33. 1 1
      src/platform/ZhonTai.Admin/Services/Permission/Dto/PermissionAddMenuInput.cs
  34. 1 1
      src/platform/ZhonTai.Admin/Services/Permission/Dto/PermissionListOutput.cs
  35. 1 1
      src/platform/ZhonTai.Admin/Services/Permission/PermissionService.cs
  36. 1 1
      src/platform/ZhonTai.Admin/Services/Tenant/TenantService.cs
  37. 1 1
      src/platform/ZhonTai.Admin/Services/User/Dto/StaffAddInput.cs
  38. 1 1
      src/platform/ZhonTai.Admin/Services/User/Dto/UserAddInput.cs
  39. 1 1
      src/platform/ZhonTai.Admin/Services/User/Dto/UserUpdateInput.cs
  40. 5 5
      src/platform/ZhonTai.Admin/ZhonTai.Admin.csproj
  41. 100 35
      src/platform/ZhonTai.Admin/ZhonTai.Admin.xml
  42. 8 2
      src/platform/ZhonTai.ApiUI/ApiUIOptions.cs
  43. 11 0
      src/platform/ZhonTai.ApiUI/ApiUIOptionsExtensions.cs
  44. 27 21
      src/platform/ZhonTai.Common/Extensions/UtilConvertExtension.cs
  45. 0 8
      src/platform/ZhonTai.Common/ZhonTai.Common.xml

+ 5 - 5
src/hosts/ZhonTai.Host/InitData/Admin/ad_api.json

@@ -1198,7 +1198,7 @@
         "id": 174219034734667,
         "parentId": 174219034701893,
         "label": "查询员工列表",
-        "path": "/api/admin/staff/getpage",
+        "path": "/api/admin/staff/get-page",
         "httpMethods": "post",
         "description": "",
         "enabled": true,
@@ -1228,7 +1228,7 @@
         "id": 174219034734670,
         "parentId": 174219034701893,
         "label": "删除员工",
-        "path": "/api/admin/staff/softdelete",
+        "path": "/api/admin/staff/soft-delete",
         "httpMethods": "delete",
         "description": "",
         "enabled": true,
@@ -1238,7 +1238,7 @@
         "id": 174219034734671,
         "parentId": 174219034701893,
         "label": "批量删除员工",
-        "path": "/api/admin/staff/batchsoftdelete",
+        "path": "/api/admin/staff/batch-soft-delete",
         "httpMethods": "put",
         "description": "",
         "enabled": true,
@@ -1287,7 +1287,7 @@
         "id": 174219034738758,
         "parentId": 174219034718277,
         "label": "删除组织架构",
-        "path": "/api/admin/org/softdelete",
+        "path": "/api/admin/org/soft-delete",
         "httpMethods": "delete",
         "description": "",
         "enabled": true,
@@ -1297,7 +1297,7 @@
         "id": 188049296683077,
         "parentId": 174219034718277,
         "label": "查询组织架构列表",
-        "path": "/api/admin/org/getlist",
+        "path": "/api/admin/org/get-list",
         "httpMethods": "get",
         "description": "",
         "enabled": true,

+ 6 - 3
src/hosts/ZhonTai.Host/InitData/Admin/ad_user.json

@@ -5,13 +5,15 @@
     "password": "96E79218965EB72C92A549DD5A330112",
     "name": "管理员",
     "mobile": "13122223333",
-    "mainOrgId": 189097691009093
+    "mainOrgId": 189097691009093,
+    "type":  100
   },
   {
     "id": 162083448746053,
     "userName": "18988889999",
     "password": "96E79218965EB72C92A549DD5A330112",
-    "name": "租户"
+    "name": "租户",
+    "type": 10
   },
   {
     "id": 162605614280773,
@@ -19,6 +21,7 @@
     "password": "96E79218965EB72C92A549DD5A330112",
     "name": "员工",
     "mobile": "13155556666",
-    "mainOrgId": 189097750675525
+    "mainOrgId": 189097750675525,
+    "type": 1
   }
 ]

+ 6 - 3
src/hosts/ZhonTai.Host/InitData/Admin/ad_user.tenant.json

@@ -6,14 +6,16 @@
     "password": "96E79218965EB72C92A549DD5A330112",
     "name": "管理员",
     "mobile": "13122223333",
-    "mainOrgId": 189097691009093
+    "mainOrgId": 189097691009093,
+    "type": 100
   },
   {
     "id": 162083448746053,
     "tenantId": 162083448455237,
     "userName": "18988889999",
     "password": "96E79218965EB72C92A549DD5A330112",
-    "name": "租户"
+    "name": "租户",
+    "type": 10
   },
   {
     "id": 162605614280773,
@@ -22,6 +24,7 @@
     "password": "96E79218965EB72C92A549DD5A330112",
     "name": "员工",
     "mobile": "13155556666",
-    "mainOrgId": 189097750675525
+    "mainOrgId": 189097750675525,
+    "type": 1
   }
 ]

+ 5 - 0
src/platform/ZhonTai.Admin/Core/Auth/ClaimAttributes.cs

@@ -25,6 +25,11 @@ public static class ClaimAttributes
     /// </summary>
     public const string RefreshExpires = "re";
 
+    /// <summary>
+    /// 用户类型
+    /// </summary>
+    public const string UserType = "ut";
+
     /// <summary>
     /// 租户Id
     /// </summary>

+ 16 - 0
src/platform/ZhonTai.Admin/Core/Auth/IUser.cs

@@ -1,5 +1,6 @@
 
 using ZhonTai.Admin.Core.Entities;
+using ZhonTai.Admin.Domain.User;
 
 namespace ZhonTai.Admin.Core.Auth;
 
@@ -23,6 +24,21 @@ public interface IUser
     /// </summary>
     string Name { get; }
 
+    /// <summary>
+    /// 用户类型
+    /// </summary>
+    UserType Type { get; }
+
+    /// <summary>
+    /// 平台管理员
+    /// </summary>
+    bool PlatformAdmin { get; }
+
+    /// <summary>
+    /// 租户管理员
+    /// </summary>
+    bool TenantAdmin { get; }
+
     /// <summary>
     /// 租户Id
     /// </summary>

+ 9 - 2
src/platform/ZhonTai.Admin/Core/Auth/PermissionHandler.cs

@@ -10,10 +10,12 @@ namespace ZhonTai.Admin.Core.Auth
     public class PermissionHandler : IPermissionHandler
     {
         private readonly IUserService _userService;
+        private readonly IUser _user;
 
-        public PermissionHandler(IUserService userService)
+        public PermissionHandler(IUserService userService, IUser user)
         {
             _userService = userService;
+            _user = user;
         }
 
         /// <summary>
@@ -24,6 +26,11 @@ namespace ZhonTai.Admin.Core.Auth
         /// <returns></returns>
         public async Task<bool> ValidateAsync(string api, string httpMethod)
         {
+            if (_user.PlatformAdmin)
+            {
+                return true;
+            }
+
             var permissions = await _userService.GetPermissionsAsync();
 
             var valid = permissions.Any(m =>
@@ -31,7 +38,7 @@ namespace ZhonTai.Admin.Core.Auth
                 && m.HttpMethods.NotNull() && m.HttpMethods.Split(',').Any(n => n.NotNull() && n.EqualsIgnoreCase(httpMethod))
             );
 
-            return true;
+            return valid;
         }
     }
 }

+ 39 - 0
src/platform/ZhonTai.Admin/Core/Auth/User.cs

@@ -2,6 +2,7 @@
 using System;
 using ZhonTai.Common.Extensions;
 using ZhonTai.Admin.Core.Entities;
+using ZhonTai.Admin.Domain.User;
 
 namespace ZhonTai.Admin.Core.Auth;
 
@@ -85,6 +86,44 @@ public class User : IUser
         }
     }
 
+    /// <summary>
+    /// 用户类型
+    /// </summary>
+    public virtual UserType Type
+    {
+        get
+        {
+            var userType = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.UserType);
+            if (userType != null && userType.Value.NotNull())
+            {
+                return (UserType)Enum.Parse(typeof(UserType), userType.Value, true);
+            }
+            return UserType.User;
+        }
+    }
+
+    /// <summary>
+    /// 平台管理员
+    /// </summary>
+    public virtual bool PlatformAdmin
+    {
+        get
+        {
+            return Type == UserType.PlatformAdmin;
+        }
+    }
+
+    /// <summary>
+    /// 租户管理员
+    /// </summary>
+    public virtual bool TenantAdmin
+    {
+        get
+        {
+            return Type == UserType.TenantAdmin;
+        }
+    }
+
     /// <summary>
     /// 租户类型
     /// </summary>

+ 38 - 8
src/platform/ZhonTai.Admin/Core/Db/Transaction/UnitOfWorkManagerCloud.cs

@@ -1,29 +1,59 @@
 using FreeSql;
+using System;
 using System.Collections.Generic;
 using System.Data;
+using ZhonTai.Admin.Core.Auth;
+using ZhonTai.Admin.Core.Configs;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Core.Entities;
 
 namespace ZhonTai.Admin.Core.Db.Transaction;
 
 public class UnitOfWorkManagerCloud
 {
-    readonly Dictionary<string, UnitOfWorkManager> m_managers = new Dictionary<string, UnitOfWorkManager>();
-    readonly FreeSqlCloud m_cloud;
-    public UnitOfWorkManagerCloud(FreeSqlCloud cloud)
+    readonly Dictionary<string, UnitOfWorkManager> _managers = new Dictionary<string, UnitOfWorkManager>();
+    readonly FreeSqlCloud _cloud;
+    readonly IUser _user;
+    readonly AppConfig _appConfig;
+    readonly IServiceProvider _serviceProvider;
+    public UnitOfWorkManagerCloud(
+        FreeSqlCloud cloud, 
+        IUser user, 
+        AppConfig appConfig, 
+        IServiceProvider serviceProvider)
     {
-        m_cloud = cloud;
+        _cloud = cloud;
+        _user = user;
+        _appConfig = appConfig;
+        _serviceProvider = serviceProvider;
     }
 
     public UnitOfWorkManager GetUnitOfWorkManager(string dbKey)
     {
-        if (m_managers.TryGetValue(dbKey, out var uowm) == false)
-            m_managers.Add(dbKey, uowm = new UnitOfWorkManager(m_cloud.Use(dbKey)));
+        if (dbKey.IsNull())
+        {
+            if (_appConfig.Tenant && _user.DataIsolationType == DataIsolationType.OwnDb && _user.TenantId.HasValue)
+            {
+                dbKey = DbKeys.TenantDbKey + _user.TenantId;
+                _cloud.GetCurrentDb(_serviceProvider);
+            }
+            else
+            {
+                dbKey = DbKeys.AdminDbKey;
+            }
+        }
+        if (_managers.TryGetValue(dbKey, out var uowm) == false)
+        {
+            _managers.Add(dbKey, uowm = new UnitOfWorkManager(_cloud.Use(dbKey)));
+        }
+            
         return uowm;
     }
 
     public void Dispose()
     {
-        foreach (var uowm in m_managers.Values) uowm.Dispose();
-        m_managers.Clear();
+        foreach (var uowm in _managers.Values) uowm.Dispose();
+        _managers.Clear();
     }
 
     public IUnitOfWork Begin(string dbKey, Propagation propagation = Propagation.Required, IsolationLevel? isolationLevel = null)

+ 0 - 1
src/platform/ZhonTai.Admin/Core/HostApp.cs

@@ -48,7 +48,6 @@ using ZhonTai.Admin.Core.Startup;
 using ZhonTai.Admin.Core.Conventions;
 using FreeSql;
 using ZhonTai.Admin.Core.Db.Transaction;
-using Autofac.Core;
 
 namespace ZhonTai.Admin.Core;
 

+ 1 - 6
src/platform/ZhonTai.Admin/Core/Repositories/RepositoryBase.cs

@@ -19,11 +19,6 @@ namespace ZhonTai.Admin.Core.Repositories
             uowManger?.Binding(this);
         }
 
-        //public RepositoryBase(IFreeSql freeSql) : base(freeSql, null, null)
-        //{
-        //}
-        //public RepositoryBase(IFreeSql fsql, Expression<Func<TEntity, bool>> filter, Func<string, string> asTable = null) : base(fsql, filter, asTable) { }
-
         public virtual Task<TDto> GetAsync<TDto>(TKey id)
         {
             return Select.WhereDynamic(id).ToOneAsync<TDto>();
@@ -118,7 +113,7 @@ namespace ZhonTai.Admin.Core.Repositories
 
     public class RepositoryBase<TEntity> : RepositoryBase<TEntity, long>, IRepositoryBase<TEntity> where TEntity : class
     {
-        public RepositoryBase(UnitOfWorkManagerCloud uowm) : this(DbKeys.AdminDbKey, uowm) { }
+        public RepositoryBase(UnitOfWorkManagerCloud uowm) : this("", uowm) { }
         public RepositoryBase(string db, UnitOfWorkManagerCloud uowm) : this(uowm.GetUnitOfWorkManager(db)) { }
         RepositoryBase(UnitOfWorkManager uowm) : base(uowm.Orm)
         {

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/Document/DocumentEntity.cs

@@ -31,7 +31,7 @@ public partial class DocumentEntity : EntityFull, ITenant
     /// 类型
     /// </summary>
     [Column(MapType = typeof(int), CanUpdate = false)]
-    public DocumentTypeEnum Type { get; set; }
+    public DocumentType Type { get; set; }
 
     /// <summary>
     /// 命名

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/Document/DocumentTypeEnum.cs → src/platform/ZhonTai.Admin/Domain/Document/DocumentType.cs

@@ -3,7 +3,7 @@
 /// <summary>
 /// 文档类型
 /// </summary>
-public enum DocumentTypeEnum
+public enum DocumentType
 {
     /// <summary>
     /// 分组

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/Permission/PermissionEntity.cs

@@ -35,7 +35,7 @@ public partial class PermissionEntity : EntityFull
     /// 权限类型
     /// </summary>
     [Column(MapType = typeof(int), CanUpdate = false)]
-    public PermissionTypeEnum Type { get; set; }
+    public PermissionType Type { get; set; }
 
     /// <summary>
     /// 视图

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/Permission/PermissionTypeEnum.cs → src/platform/ZhonTai.Admin/Domain/Permission/PermissionType.cs

@@ -3,7 +3,7 @@
 /// <summary>
 /// 权限类型
 /// </summary>
-public enum PermissionTypeEnum
+public enum PermissionType
 {
     /// <summary>
     /// 分组

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/Role/RoleEntity.cs

@@ -47,7 +47,7 @@ public partial class RoleEntity : EntityFull, ITenant
     /// 角色类型
     /// </summary>
     [Column(MapType = typeof(int))]
-    public RoleTypeEnum Type { get; set; }
+    public RoleType Type { get; set; }
 
     /// <summary>
     /// 说明

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/Role/RoleTypeEnum.cs → src/platform/ZhonTai.Admin/Domain/Role/RoleType.cs

@@ -3,7 +3,7 @@
 /// <summary>
 /// 角色类型
 /// </summary>
-public enum RoleTypeEnum
+public enum RoleType
 {
     /// <summary>
     /// 自定义

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/Staff/Input/StaffAddInput.cs

@@ -18,7 +18,7 @@ public class StaffAddInput
     /// <summary>
     /// 性别
     /// </summary>
-    public SexEnum? Sex { get; set; }
+    public Sex? Sex { get; set; }
 
     /// <summary>
     /// 主属部门Id

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/Staff/SexEnum.cs → src/platform/ZhonTai.Admin/Domain/Staff/Sex.cs

@@ -3,7 +3,7 @@
 /// <summary>
 /// 性别
 /// </summary>
-public enum SexEnum
+public enum Sex
 {
     /// <summary>
     /// 未知

+ 1 - 4
src/platform/ZhonTai.Admin/Domain/Staff/StaffEntity.cs

@@ -1,8 +1,6 @@
 using ZhonTai.Admin.Core.Entities;
 using FreeSql.DataAnnotations;
 using System;
-using System.Collections.Generic;
-using ZhonTai.Admin.Domain.Org;
 
 namespace ZhonTai.Admin.Domain.Staff;
 
@@ -33,14 +31,13 @@ public partial class StaffEntity : EntityFull, ITenant
     /// 性别
     /// </summary>
     [Column(MapType = typeof(int))]
-    public SexEnum? Sex { get; set; }
+    public Sex? Sex { get; set; }
 
     /// <summary>
     /// 入职时间
     /// </summary>
     public DateTime? EntryTime { get; set; }
 
-
     /// <summary>
     /// 个人简介
     /// </summary>

+ 2 - 2
src/platform/ZhonTai.Admin/Domain/User/UserEntity.cs

@@ -85,13 +85,13 @@ public partial class UserEntity : EntityFull, ITenant
     /// 用户状态
     /// </summary>
     [Column(MapType = typeof(int))]
-    public UserStatusEnum Status { get; set; }
+    public UserStatus Status { get; set; }
 
     /// <summary>
     /// 用户类型
     /// </summary>
     [Column(MapType = typeof(int))]
-    public UserTypeEnum Type { get; set; } = UserTypeEnum.User;
+    public UserType Type { get; set; } = UserType.User;
 
     /// <summary>
     /// 角色列表

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/User/UserStatusEnum.cs → src/platform/ZhonTai.Admin/Domain/User/UserStatus.cs

@@ -3,7 +3,7 @@
 /// <summary>
 /// 用户状态
 /// </summary>
-public enum UserStatusEnum
+public enum UserStatus
 {
     /// <summary>
     /// 正常

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/User/UserTypeEnum.cs → src/platform/ZhonTai.Admin/Domain/User/UserType.cs

@@ -3,7 +3,7 @@
 /// <summary>
 /// 用户类型
 /// </summary>
-public enum UserTypeEnum
+public enum UserType
 {
     /// <summary>
     /// 用户

+ 32 - 21
src/platform/ZhonTai.Admin/Services/Auth/AuthService.cs

@@ -77,12 +77,13 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
 
         var token = LazyGetRequiredService<IUserToken>().Create(new[]
         {
-            new Claim(ClaimAttributes.UserId, user.Id.ToString()),
+            new Claim(ClaimAttributes.UserId, user.Id.ToString(), ClaimValueTypes.Integer64),
             new Claim(ClaimAttributes.UserName, user.UserName),
             new Claim(ClaimAttributes.Name, user.Name),
-            new Claim(ClaimAttributes.TenantId, user.TenantId.ToString()),
-            new Claim(ClaimAttributes.TenantType, user.TenantType.ToString()),
-            new Claim(ClaimAttributes.DataIsolationType, user.DataIsolationType.ToString())
+            new Claim(ClaimAttributes.UserType, user.Type.ToInt().ToString(), ClaimValueTypes.Integer32),
+            new Claim(ClaimAttributes.TenantId, user.TenantId.ToString(), ClaimValueTypes.Integer64),
+            new Claim(ClaimAttributes.TenantType, user.TenantType.ToInt().ToString(), ClaimValueTypes.Integer32),
+            new Claim(ClaimAttributes.DataIsolationType, user.DataIsolationType.ToInt().ToString(), ClaimValueTypes.Integer32)
         });
 
         return token;
@@ -116,31 +117,41 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
     {
         if (!(User?.Id > 0))
         {
-            return ResultOutput.NotOk("未登录");
+            return ResultOutput.NotOk("未登录");
         }
 
-        var authUserInfoOutput = new AuthUserInfoOutput
+        var permissionSelect = _permissionRepository.Select
+            .Where(a => new[] { PermissionType.Group, PermissionType.Menu }.Contains(a.Type))
+            .WhereIf(!User.PlatformAdmin, a =>
+                _permissionRepository.Orm.Select<RolePermissionEntity>()
+                .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == User.Id)
+                .Where(b => b.PermissionId == a.Id)
+                .Any()
+            );
+
+        if (!User.PlatformAdmin)
+        {
+            permissionSelect = permissionSelect.AsTreeCte(up: true);
+        }
+
+        var menuList = await permissionSelect
+            .OrderBy(a => new { a.ParentId, a.Sort })
+            .ToListAsync(a => new AuthUserMenuDto { ViewPath = a.View.Path });
+        
+        menuList = menuList.DistinctBy(a => a.Id).ToList();
+
+        var authGetUserInfoOutput = new AuthGetUserInfoOutput
         {
             //用户信息
             User = await _userRepository.GetAsync<AuthUserProfileDto>(User.Id),
 
             //用户菜单
-            Menus = await _permissionRepository.Select
-            .Where(a => new[] { PermissionTypeEnum.Group, PermissionTypeEnum.Menu }.Contains(a.Type))
-            .WhereIf(false, a =>
-                _permissionRepository.Orm.Select<RolePermissionEntity>()
-                .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == User.Id)
-                .Where(b => b.PermissionId == a.Id)
-                .Any()
-            )
-            .OrderBy(a => a.ParentId)
-            .OrderBy(a => a.Sort)
-            .ToListAsync(a => new AuthUserMenuDto { ViewPath = a.View.Path }),
+            Menus = menuList,
 
             //用户权限点
             Permissions = await _permissionRepository.Select
-            .Where(a => a.Type == PermissionTypeEnum.Dot)
-            .WhereIf(false, a =>
+            .Where(a => a.Type == PermissionType.Dot)
+            .WhereIf(!User.PlatformAdmin, a =>
                 _permissionRepository.Orm.Select<RolePermissionEntity>()
                 .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == User.Id)
                 .Where(b => b.PermissionId == a.Id)
@@ -149,7 +160,7 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
             .ToListAsync(a => a.Code)
         };
 
-        return ResultOutput.Ok(authUserInfoOutput);
+        return ResultOutput.Ok(authGetUserInfoOutput);
     }
 
     /// <summary>
@@ -214,7 +225,7 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
             return ResultOutput.NotOk("用户名或密码错误");
         }
 
-        if(user.Status== UserStatusEnum.Disabled)
+        if(user.Status== UserStatus.Disabled)
         {
             return ResultOutput.NotOk("禁止登录,请联系管理员");
         }

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Auth/Dto/AuthUserInfoOutput.cs → src/platform/ZhonTai.Admin/Services/Auth/Dto/AuthGetUserInfoOutput.cs

@@ -2,7 +2,7 @@
 
 namespace ZhonTai.Admin.Services.Auth.Dto;
 
-public class AuthUserInfoOutput
+public class AuthGetUserInfoOutput
 {
     /// <summary>
     /// 用户个人信息

+ 6 - 0
src/platform/ZhonTai.Admin/Services/Auth/Dto/AuthLoginOutput.cs

@@ -1,4 +1,5 @@
 using ZhonTai.Admin.Core.Entities;
+using ZhonTai.Admin.Domain.User;
 
 namespace ZhonTai.Admin.Services.Auth.Dto;
 
@@ -19,6 +20,11 @@ public class AuthLoginOutput
     /// </summary>
     public string Name { get; set; }
 
+    /// <summary>
+    /// 用户类型
+    /// </summary>
+    public UserType Type { get; set; }
+
     /// <summary>
     /// 租户Id
     /// </summary>

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Document/DocumentService.cs

@@ -266,7 +266,7 @@ public class DocumentService : BaseService, IDocumentService, IDynamicApi
             .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type, a.Opened });
 
         var menus = documents
-            .Where(a => (new[] { DocumentTypeEnum.Group, DocumentTypeEnum.Markdown }).Contains(a.Type))
+            .Where(a => (new[] { DocumentType.Group, DocumentType.Markdown }).Contains(a.Type))
             .Select(a => new
             {
                 a.Id,

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Document/Dto/DocumentAddGroupInput.cs

@@ -12,7 +12,7 @@ public class DocumentAddGroupInput
     /// <summary>
     /// 类型
     /// </summary>
-    public DocumentTypeEnum Type { get; set; }
+    public DocumentType Type { get; set; }
 
     /// <summary>
     /// 名称

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Document/Dto/DocumentAddMenuInput.cs

@@ -12,7 +12,7 @@ public class DocumentAddMenuInput
     /// <summary>
     /// 类型
     /// </summary>
-    public DocumentTypeEnum Type { get; set; }
+    public DocumentType Type { get; set; }
 
     /// <summary>
     /// 命名

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Document/Dto/DocumentListOutput.cs

@@ -22,7 +22,7 @@ public class DocumentListOutput
     /// <summary>
     /// 类型
     /// </summary>
-    public DocumentTypeEnum Type { get; set; }
+    public DocumentType Type { get; set; }
 
     /// <summary>
     /// 命名

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Permission/Dto/PermissionAddApiInput.cs

@@ -7,7 +7,7 @@ public class PermissionAddApiInput
     /// <summary>
     /// 权限类型
     /// </summary>
-    public PermissionTypeEnum Type { get; set; }
+    public PermissionType Type { get; set; }
 
     /// <summary>
     /// 父级节点

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Permission/Dto/PermissionAddDotInput.cs

@@ -7,7 +7,7 @@ public class PermissionAddDotInput
     /// <summary>
     /// 权限类型
     /// </summary>
-    public PermissionTypeEnum Type { get; set; } = PermissionTypeEnum.Dot;
+    public PermissionType Type { get; set; } = PermissionType.Dot;
 
     /// <summary>
     /// 父级节点

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Permission/Dto/PermissionAddGroupInput.cs

@@ -7,7 +7,7 @@ public class PermissionAddGroupInput
     /// <summary>
     /// 权限类型
     /// </summary>
-    public PermissionTypeEnum Type { get; set; }
+    public PermissionType Type { get; set; }
 
     /// <summary>
     /// 父级节点

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Permission/Dto/PermissionAddMenuInput.cs

@@ -7,7 +7,7 @@ public class PermissionAddMenuInput
     /// <summary>
     /// 权限类型
     /// </summary>
-    public PermissionTypeEnum Type { get; set; }
+    public PermissionType Type { get; set; }
 
     /// <summary>
     /// 父级节点

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Permission/Dto/PermissionListOutput.cs

@@ -22,7 +22,7 @@ public class PermissionListOutput
     /// <summary>
     /// 权限类型
     /// </summary>
-    public PermissionTypeEnum Type { get; set; }
+    public PermissionType Type { get; set; }
 
     /// <summary>
     /// 访问地址

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Permission/PermissionService.cs

@@ -181,7 +181,7 @@ public class PermissionService : BaseService, IPermissionService, IDynamicApi
                 a.Id,
                 a.ParentId,
                 a.Label,
-                Row = a.Type == PermissionTypeEnum.Menu
+                Row = a.Type == PermissionType.Menu
             });
 
         return ResultOutput.Ok(menus);

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Tenant/TenantService.cs

@@ -135,7 +135,7 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
             Name = input.RealName,
             Mobile = input.Phone,
             Email = input.Email,
-            Status = UserStatusEnum.Enabled
+            Status = UserStatus.Enabled
         };
         await _userRepository.InsertAsync(user);
 

+ 1 - 1
src/platform/ZhonTai.Admin/Services/User/Dto/StaffAddInput.cs

@@ -21,7 +21,7 @@ public class StaffAddInput
     /// <summary>
     /// 性别
     /// </summary>
-    public SexEnum? Sex { get; set; }
+    public Sex? Sex { get; set; }
 
     /// <summary>
     /// 入职时间

+ 1 - 1
src/platform/ZhonTai.Admin/Services/User/Dto/UserAddInput.cs

@@ -58,7 +58,7 @@ public class UserAddInput
     /// <summary>
     /// 状态
     /// </summary>
-    public UserStatusEnum Status { get; set; }
+    public UserStatus Status { get; set; }
 
     /// <summary>
     /// 员工

+ 1 - 1
src/platform/ZhonTai.Admin/Services/User/Dto/UserUpdateInput.cs

@@ -63,7 +63,7 @@ public partial class UserUpdateInput
     /// <summary>
     /// 状态
     /// </summary>
-    public UserStatusEnum Status { get; set; }
+    public UserStatus Status { get; set; }
 
     /// <summary>
     /// 员工信息

+ 5 - 5
src/platform/ZhonTai.Admin/ZhonTai.Admin.csproj

@@ -37,11 +37,11 @@
 	</ItemGroup>
 
 	<ItemGroup Condition="'$(Configuration)'=='Debug'">
-		<PackageReference Include="FreeSql.Provider.MySql" Version="3.2.665" />
-		<PackageReference Include="FreeSql.Provider.SqlServer" Version="3.2.665" />
-		<PackageReference Include="FreeSql.Provider.PostgreSQL" Version="3.2.665" />
-		<PackageReference Include="FreeSql.Provider.Oracle" Version="3.2.665" />
-		<PackageReference Include="FreeSql.Provider.Sqlite" Version="3.2.665" />
+		<PackageReference Include="FreeSql.Provider.MySql" Version="3.2.680" />
+		<PackageReference Include="FreeSql.Provider.SqlServer" Version="3.2.680" />
+		<PackageReference Include="FreeSql.Provider.PostgreSQL" Version="3.2.680" />
+		<PackageReference Include="FreeSql.Provider.Oracle" Version="3.2.680" />
+		<PackageReference Include="FreeSql.Provider.Sqlite" Version="3.2.680" />
 		<PackageReference Include="FreeSql.Provider.MySqlConnector" Version="3.2.680" />
 	</ItemGroup>
 

+ 100 - 35
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -79,6 +79,11 @@
             刷新有效期
             </summary>
         </member>
+        <member name="F:ZhonTai.Admin.Core.Auth.ClaimAttributes.UserType">
+            <summary>
+            用户类型
+            </summary>
+        </member>
         <member name="F:ZhonTai.Admin.Core.Auth.ClaimAttributes.TenantId">
             <summary>
             租户Id
@@ -127,6 +132,21 @@
             姓名
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Core.Auth.IUser.Type">
+            <summary>
+            用户类型
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Auth.IUser.PlatformAdmin">
+            <summary>
+            平台管理员
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Auth.IUser.TenantAdmin">
+            <summary>
+            租户管理员
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Core.Auth.IUser.TenantId">
             <summary>
             租户Id
@@ -185,6 +205,21 @@
             租户Id
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Core.Auth.User.Type">
+            <summary>
+            用户类型
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Auth.User.PlatformAdmin">
+            <summary>
+            平台管理员
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Auth.User.TenantAdmin">
+            <summary>
+            租户管理员
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Core.Auth.User.TenantType">
             <summary>
             租户类型
@@ -1759,17 +1794,17 @@
             描述
             </summary>
         </member>
-        <member name="T:ZhonTai.Admin.Domain.Document.DocumentTypeEnum">
+        <member name="T:ZhonTai.Admin.Domain.Document.DocumentType">
             <summary>
             文档类型
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Document.DocumentTypeEnum.Group">
+        <member name="F:ZhonTai.Admin.Domain.Document.DocumentType.Group">
             <summary>
             分组
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Document.DocumentTypeEnum.Markdown">
+        <member name="F:ZhonTai.Admin.Domain.Document.DocumentType.Markdown">
             <summary>
             Markdown文档
             </summary>
@@ -2024,22 +2059,22 @@
             描述
             </summary>
         </member>
-        <member name="T:ZhonTai.Admin.Domain.Permission.PermissionTypeEnum">
+        <member name="T:ZhonTai.Admin.Domain.Permission.PermissionType">
             <summary>
             权限类型
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Permission.PermissionTypeEnum.Group">
+        <member name="F:ZhonTai.Admin.Domain.Permission.PermissionType.Group">
             <summary>
             分组
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Permission.PermissionTypeEnum.Menu">
+        <member name="F:ZhonTai.Admin.Domain.Permission.PermissionType.Menu">
             <summary>
             菜单
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Permission.PermissionTypeEnum.Dot">
+        <member name="F:ZhonTai.Admin.Domain.Permission.PermissionType.Dot">
             <summary>
             权限点
             </summary>
@@ -2134,22 +2169,22 @@
             排序
             </summary>
         </member>
-        <member name="T:ZhonTai.Admin.Domain.Role.RoleTypeEnum">
+        <member name="T:ZhonTai.Admin.Domain.Role.RoleType">
             <summary>
             角色类型
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Role.RoleTypeEnum.Custom">
+        <member name="F:ZhonTai.Admin.Domain.Role.RoleType.Custom">
             <summary>
             自定义
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Role.RoleTypeEnum.Default">
+        <member name="F:ZhonTai.Admin.Domain.Role.RoleType.Default">
             <summary>
             默认
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Role.RoleTypeEnum.MainAdmin">
+        <member name="F:ZhonTai.Admin.Domain.Role.RoleType.MainAdmin">
             <summary>
             主管理员
             </summary>
@@ -2259,22 +2294,22 @@
             手机号
             </summary>
         </member>
-        <member name="T:ZhonTai.Admin.Domain.Staff.SexEnum">
+        <member name="T:ZhonTai.Admin.Domain.Staff.Sex">
             <summary>
             性别
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Staff.SexEnum.Unknown">
+        <member name="F:ZhonTai.Admin.Domain.Staff.Sex.Unknown">
             <summary>
             未知
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Staff.SexEnum.Male">
+        <member name="F:ZhonTai.Admin.Domain.Staff.Sex.Male">
             <summary>
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.Staff.SexEnum.Female">
+        <member name="F:ZhonTai.Admin.Domain.Staff.Sex.Female">
             <summary>
             </summary>
@@ -2529,6 +2564,11 @@
             用户状态
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Domain.User.UserEntity.Type">
+            <summary>
+            用户类型
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Domain.User.UserEntity.Roles">
             <summary>
             角色列表
@@ -2539,31 +2579,51 @@
             员工
             </summary>
         </member>
-        <member name="T:ZhonTai.Admin.Domain.User.UserStatusEnum">
+        <member name="T:ZhonTai.Admin.Domain.User.UserStatus">
             <summary>
             用户状态
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.User.UserStatusEnum.Enabled">
+        <member name="F:ZhonTai.Admin.Domain.User.UserStatus.Enabled">
             <summary>
             正常
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.User.UserStatusEnum.Disabled">
+        <member name="F:ZhonTai.Admin.Domain.User.UserStatus.Disabled">
             <summary>
             禁用
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.User.UserStatusEnum.WaitChangePasssword">
+        <member name="F:ZhonTai.Admin.Domain.User.UserStatus.WaitChangePasssword">
             <summary>
             待修改密码
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Domain.User.UserStatusEnum.WaitActive">
+        <member name="F:ZhonTai.Admin.Domain.User.UserStatus.WaitActive">
             <summary>
             待激活
             </summary>
         </member>
+        <member name="T:ZhonTai.Admin.Domain.User.UserType">
+            <summary>
+            用户类型
+            </summary>
+        </member>
+        <member name="F:ZhonTai.Admin.Domain.User.UserType.User">
+            <summary>
+            用户
+            </summary>
+        </member>
+        <member name="F:ZhonTai.Admin.Domain.User.UserType.TenantAdmin">
+            <summary>
+            租户管理员
+            </summary>
+        </member>
+        <member name="F:ZhonTai.Admin.Domain.User.UserType.PlatformAdmin">
+            <summary>
+            平台管理员
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Domain.User.StaffAddInput">
             <summary>
             员工添加
@@ -2908,6 +2968,21 @@
             </summary>
             <returns></returns>
         </member>
+        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthGetUserInfoOutput.User">
+            <summary>
+            用户个人信息
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthGetUserInfoOutput.Menus">
+            <summary>
+            用户菜单
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthGetUserInfoOutput.Permissions">
+            <summary>
+            用户权限点
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthGetVerifyCodeOutput.Key">
             <summary>
             缓存键
@@ -2958,6 +3033,11 @@
             姓名
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthLoginOutput.Type">
+            <summary>
+            用户类型
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthLoginOutput.TenantId">
             <summary>
             租户Id
@@ -2973,21 +3053,6 @@
             数据隔离
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthUserInfoOutput.User">
-            <summary>
-            用户个人信息
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthUserInfoOutput.Menus">
-            <summary>
-            用户菜单
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthUserInfoOutput.Permissions">
-            <summary>
-            用户权限点
-            </summary>
-        </member>
         <member name="P:ZhonTai.Admin.Services.Auth.Dto.AuthUserMenuDto.Id">
             <summary>
             权限Id

+ 8 - 2
src/platform/ZhonTai.ApiUI/ApiUIOptions.cs

@@ -179,6 +179,11 @@ namespace ZhonTai.ApiUI
 
     public class OAuthConfigObject
     {
+        /// <summary>
+        /// Default username for OAuth2 password flow.
+        /// </summary>
+        public string Username { get; set; } = null;
+
         /// <summary>
         /// Default clientId
         /// </summary>
@@ -187,6 +192,7 @@ namespace ZhonTai.ApiUI
         /// <summary>
         /// Default clientSecret
         /// </summary>
+        /// <remarks>Setting this exposes the client secrets in inline javascript in the swagger-ui generated html.</remarks>
         public string ClientSecret { get; set; } = null;
 
         /// <summary>
@@ -234,7 +240,7 @@ namespace ZhonTai.ApiUI
         /// MUST be a valid Javascript function.
         /// Function to intercept remote definition, "Try it out", and OAuth 2.0 requests.
         /// Accepts one argument requestInterceptor(request) and must return the modified request, or a Promise that resolves to the modified request.
-        /// Ex: "req => { req.headers['MyCustomHeader'] = 'CustomValue'; return req; }"
+        /// Ex: "function (req) { req.headers['MyCustomHeader'] = 'CustomValue'; return req; }"
         /// </summary>
         public string RequestInterceptorFunction { get; set; }
 
@@ -242,7 +248,7 @@ namespace ZhonTai.ApiUI
         /// MUST be a valid Javascript function.
         /// Function to intercept remote definition, "Try it out", and OAuth 2.0 responses.
         /// Accepts one argument responseInterceptor(response) and must return the modified response, or a Promise that resolves to the modified response.
-        /// Ex: "res => { console.log(res); return res; }"
+        /// Ex: "function (res) { console.log(res); return res; }"
         /// </summary>
         public string ResponseInterceptorFunction { get; set; }
     }

+ 11 - 0
src/platform/ZhonTai.ApiUI/ApiUIOptionsExtensions.cs

@@ -220,11 +220,22 @@ namespace ZhonTai.ApiUI
             options.OAuthConfigObject.ClientId = value;
         }
 
+        /// <summary>
+        /// Default userName
+        /// </summary>
+        /// <param name="options"></param>
+        /// <param name="value"></param>
+        public static void OAuthUsername(this ApiUIOptions options, string value)
+        {
+            options.OAuthConfigObject.Username = value;
+        }
+
         /// <summary>
         /// Default clientSecret
         /// </summary>
         /// <param name="options"></param>
         /// <param name="value"></param>
+        /// <remarks>Setting this exposes the client secrets in inline javascript in the swagger-ui generated html.</remarks>
         public static void OAuthClientSecret(this ApiUIOptions options, string value)
         {
             options.OAuthConfigObject.ClientSecret = value;

+ 27 - 21
src/platform/ZhonTai.Common/Extensions/UtilConvertExtension.cs

@@ -8,25 +8,24 @@ namespace ZhonTai.Common.Extensions;
 /// </summary>
 public static class UtilConvertExtension
 {
-    public static int ToInt(this object thisValue)
+    public static int ToInt(this object s, bool round = false)
     {
-        int reval = 0;
-        if (thisValue == null) return 0;
-        if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval))
-        {
-            return reval;
-        }
-        return reval;
-    }
+        if (s == null || s == DBNull.Value)
+            return 0;
 
-    public static int ToInt(this object thisValue, int errorValue)
-    {
-        int reval;
-        if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval))
+        if (s is bool b)
+            return b ? 1 : 0;
+
+        if (int.TryParse(s.ToString(), out int result))
+            return result;
+
+        if (s.GetType().IsEnum)
         {
-            return reval;
+            return (int)s;
         }
-        return errorValue;
+
+        var f = s.ToFloat();
+        return round ? Convert.ToInt32(f) : (int)f;
     }
 
     public static long ToLong(this object s)
@@ -70,12 +69,19 @@ public static class UtilConvertExtension
         return errorValue;
     }
 
-    /// <summary>
-    /// 转换成Double/Single
-    /// </summary>
-    /// <param name="s"></param>
-    /// <param name="digits">小数位数</param>
-    /// <returns></returns>
+    public static float ToFloat(this object s, int? digits = null)
+    {
+        if (s == null || s == DBNull.Value)
+            return 0f;
+
+        float.TryParse(s.ToString(), out float result);
+
+        if (digits == null)
+            return result;
+
+        return (float)Math.Round(result, digits.Value);
+    }
+
     public static double ToDouble(this object s, int? digits = null)
     {
         if (s == null || s == DBNull.Value)

+ 0 - 8
src/platform/ZhonTai.Common/ZhonTai.Common.xml

@@ -83,14 +83,6 @@
             数据类型转换
             </summary>
         </member>
-        <member name="M:ZhonTai.Common.Extensions.UtilConvertExtension.ToDouble(System.Object,System.Nullable{System.Int32})">
-            <summary>
-            转换成Double/Single
-            </summary>
-            <param name="s"></param>
-            <param name="digits">小数位数</param>
-            <returns></returns>
-        </member>
         <member name="M:ZhonTai.Common.Extensions.UtilConvertExtension.ToHex(System.Byte[],System.Boolean)">
             <summary>
             转换为16进制