1
0
Prechádzať zdrojové kódy

新增数据权限过滤器

zhontai 2 rokov pred
rodič
commit
ce430ea6d6
23 zmenil súbory, kde vykonal 293 pridanie a 138 odobranie
  1. 19 16
      src/hosts/ZhonTai.Host/InitData/Admin/ad_role.json
  2. 21 18
      src/hosts/ZhonTai.Host/InitData/Admin/ad_role.tenant.json
  3. 3 2
      src/platform/ZhonTai.Admin/Core/Auth/IUser.cs
  4. 30 13
      src/platform/ZhonTai.Admin/Core/Auth/User.cs
  5. 4 10
      src/platform/ZhonTai.Admin/Core/Consts/CacheKeys.cs
  6. 3 9
      src/platform/ZhonTai.Admin/Core/Consts/FilterNames.cs
  7. 9 7
      src/platform/ZhonTai.Admin/Core/Db/DBServiceCollectionExtensions.cs
  8. 1 0
      src/platform/ZhonTai.Admin/Core/Db/DbHelper.cs
  9. 3 6
      src/platform/ZhonTai.Admin/Core/Db/FreeSqlCloudExtesions.cs
  10. 7 2
      src/platform/ZhonTai.Admin/Core/Entities/IData.cs
  11. 0 1
      src/platform/ZhonTai.Admin/Core/Repositories/RepositoryBase.cs
  12. 22 0
      src/platform/ZhonTai.Admin/Domain/User/Dto/CurrentUserDto.cs
  13. 4 1
      src/platform/ZhonTai.Admin/Domain/User/IUserRepository.cs
  14. 8 2
      src/platform/ZhonTai.Admin/Domain/User/UserEntity.cs
  15. 87 2
      src/platform/ZhonTai.Admin/Repositories/User/UserRepository.cs
  16. 2 2
      src/platform/ZhonTai.Admin/Services/Auth/AuthService.cs
  17. 3 3
      src/platform/ZhonTai.Admin/Services/Permission/PermissionService.cs
  18. 1 0
      src/platform/ZhonTai.Admin/Services/User/IUserService.cs
  19. 5 5
      src/platform/ZhonTai.Admin/Services/User/UserService.cs
  20. 9 9
      src/platform/ZhonTai.Admin/ZhonTai.Admin.csproj
  21. 49 28
      src/platform/ZhonTai.Admin/ZhonTai.Admin.xml
  22. 2 1
      src/tests/ZhonTai.Tests/BaseControllerTest.cs
  23. 1 1
      src/tests/ZhonTai.Tests/Services/ApiServiceTest.cs

+ 19 - 16
src/hosts/ZhonTai.Host/InitData/Admin/ad_role.json

@@ -1,38 +1,41 @@
 [
+  {
+    "id": 336557474730053,
+    "name": "系统默认",
+    "sort": 1
+  },
   {
     "id": 161223412080709,
     "parentId": 336557474730053,
     "name": "主管理员",
     "code": "main-admin",
+    "dataScope": 1,
     "description": ""
   },
-  {
-    "id": 162605510979653,
-    "parentId": 336557578817605,
-    "name": "普通员工",
-    "code": "emp",
-    "description": ""
-  },
-  {
-    "id": 336557474730053,
-    "name": "系统默认",
-    "sort": 1
-  },
   {
     "id": 336557508276293,
     "name": "职务",
     "sort": 2
   },
+  {
+    "id": 340428577087557,
+    "parentId": 336557508276293,
+    "name": "IT",
+    "code": "it",
+    "dataScope": 1,
+    "description": ""
+  },
   {
     "id": 336557578817605,
     "name": "岗位",
     "sort": 3
   },
   {
-    "id": 340428577087557,
-    "parentId": 336557508276293,
-    "name": "IT",
-    "code": "it",
+    "id": 162605510979653,
+    "parentId": 336557578817605,
+    "name": "普通员工",
+    "code": "emp",
+    "dataScope": 1,
     "description": ""
   }
 ]

+ 21 - 18
src/hosts/ZhonTai.Host/InitData/Admin/ad_role.tenant.json

@@ -1,32 +1,34 @@
 [
+  {
+    "id": 336557474730053,
+    "tenantId": 161223412138053,
+    "name": "系统默认",
+    "sort": 1
+  },
   {
     "id": 161223412080709,
     "tenantId": 161223412138053,
     "parentId": 336557474730053,
     "name": "主管理员",
     "code": "main-admin",
+    "dataScope": 1,
     "description": ""
   },
-  {
-    "id": 162605510979653,
-    "tenantId": 161223412138053,
-    "parentId": 336557578817605,
-    "name": "普通员工",
-    "code": "emp",
-    "description": ""
-  },
-  {
-    "id": 336557474730053,
-    "tenantId": 161223412138053,
-    "name": "系统默认",
-    "sort": 1
-  },
   {
     "id": 336557508276293,
     "tenantId": 161223412138053,
     "name": "职务",
     "sort": 2
   },
+  {
+    "id": 340428577087557,
+    "tenantId": 161223412138053,
+    "parentId": 336557508276293,
+    "name": "IT",
+    "code": "it",
+    "dataScope": 1,
+    "description": ""
+  },
   {
     "id": 336557578817605,
     "tenantId": 161223412138053,
@@ -34,11 +36,12 @@
     "sort": 3
   },
   {
-    "id": 340428577087557,
+    "id": 162605510979653,
     "tenantId": 161223412138053,
-    "parentId": 336557508276293,
-    "name": "IT",
-    "code": "it",
+    "parentId": 336557578817605,
+    "name": "普通员工",
+    "code": "emp",
+    "dataScope": 1,
     "description": ""
   }
 ]

+ 3 - 2
src/platform/ZhonTai.Admin/Core/Auth/IUser.cs

@@ -1,6 +1,8 @@
 
 using ZhonTai.Admin.Core.Entities;
+using ZhonTai.Admin.Domain.Role;
 using ZhonTai.Admin.Domain.User;
+using ZhonTai.Admin.Domain.User.Dto;
 
 namespace ZhonTai.Admin.Core.Auth;
 
@@ -59,9 +61,8 @@ public interface IUser
     /// </summary>
     string DbKey { get; }
 
-
     /// <summary>
     /// 当前用户
     /// </summary>
-    UserEntity CurrentUser { get; }
+    CurrentUserDto CurrentUser { get; }
 }

+ 30 - 13
src/platform/ZhonTai.Admin/Core/Auth/User.cs

@@ -4,7 +4,10 @@ using ZhonTai.Common.Extensions;
 using ZhonTai.Admin.Core.Entities;
 using ZhonTai.Admin.Domain.User;
 using Microsoft.Extensions.DependencyInjection;
-using ZhonTai.Admin.Core.Repositories;
+using ZhonTai.Admin.Domain.User.Dto;
+using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Tools.Cache;
+using ZhonTai.Admin.Services.User;
 
 namespace ZhonTai.Admin.Core.Auth;
 
@@ -88,18 +91,6 @@ public class User : IUser
         }
     }
 
-    /// <summary>
-    /// 当前用户
-    /// </summary>
-    public virtual UserEntity CurrentUser
-    {
-        get
-        {
-            var userRepsitory = _accessor?.HttpContext?.RequestServices.GetRequiredService<IUserRepository>();
-            return userRepsitory.Get(Id);
-        }
-    }
-
     /// <summary>
     /// 用户类型
     /// </summary>
@@ -181,4 +172,30 @@ public class User : IUser
             return "";
         }
     }
+
+    /// <summary>
+    /// 当前用户
+    /// </summary>
+    public virtual CurrentUserDto CurrentUser
+    {
+        get
+        {
+            var userRepository = _accessor?.HttpContext?.RequestServices.GetRequiredService<IUserRepository>();
+            if(userRepository == null)
+            {
+                return null;
+            }
+            else
+            {
+                return userRepository.GetCurrentUserAsync().Result;
+            }
+            
+            //var cache = _accessor?.HttpContext?.RequestServices.GetRequiredService<ICacheTool>();
+            //var key = CacheKeys.UserInfo + Id;
+            //return cache.GetOrSetAsync(key, async () =>
+            //{
+            //    return await userRepsitory.GetCurrentUserAsync();
+            //}).Result;
+        }
+    }
 }

+ 4 - 10
src/platform/ZhonTai.Admin/Core/Consts/CacheKeys.cs

@@ -13,29 +13,23 @@ public static partial class CacheKeys
     /// 验证码 admin:captcha:guid
     /// </summary>
     [Description("验证码")]
-    public const string Captcha = "admin:captcha:{0}";
+    public const string Captcha = "admin:captcha";
 
     /// <summary>
     /// 密码加密 admin:password:encrypt:guid
     /// </summary>
     [Description("密码加密")]
-    public const string PassWordEncrypt = "admin:password:encrypt:{0}";
+    public const string PassWordEncrypt = "admin:password:encrypt";
 
     /// <summary>
     /// 用户权限 admin:user:permissions:用户主键
     /// </summary>
     [Description("用户权限")]
-    public const string UserPermissions = "admin:user:permissions:{0}";
+    public const string UserPermissions = "admin:user:permissions";
 
     /// <summary>
     /// 用户信息 admin:user:info:用户主键
     /// </summary>
     [Description("用户信息")]
-    public const string UserInfo = "admin:user:info:{0}";
-
-    /// <summary>
-    /// 租户信息 admin:tenant:info:租户主键
-    /// </summary>
-    [Description("租户信息")]
-    public const string TenantInfo = "admin:tenant:info:{0}";
+    public const string UserInfo = "admin:user:info";
 }

+ 3 - 9
src/platform/ZhonTai.Admin/Core/Consts/FilterNames.cs

@@ -20,14 +20,8 @@ public static partial class FilterNames
     public const string Tenant = "Tenant";
 
     /// <summary>
-    /// 本人
+    /// 数据权限
     /// </summary>
-    [Description("本人")]
-    public const string Self = "Self";
-
-    /// <summary>
-    /// 部门
-    /// </summary>
-    [Description("部门")]
-    public const string Org = "Org";
+    [Description("数据权限")]
+    public const string Data = "Data";
 }

+ 9 - 7
src/platform/ZhonTai.Admin/Core/Db/DBServiceCollectionExtensions.cs

@@ -3,7 +3,6 @@ using Microsoft.Extensions.Hosting;
 using System;
 using StackExchange.Profiling;
 using FreeSql;
-using FreeSql.Internal.CommonProvider;
 using ZhonTai.Common.Helpers;
 using ZhonTai.Admin.Core.Configs;
 using ZhonTai.Admin.Core.Entities;
@@ -13,6 +12,8 @@ using ZhonTai.Admin.Core.Consts;
 using System.Linq;
 using System.Collections.Concurrent;
 using System.Reflection;
+using ZhonTai.Admin.Domain.User;
+using ZhonTai.Admin.Domain.Role;
 
 namespace ZhonTai.Admin.Core.Db;
 
@@ -73,7 +74,7 @@ public static class DBServiceCollectionExtensions
             var user = services.BuildServiceProvider().GetService<IUser>();
 
             //软删除过滤器
-            fsql.GlobalFilter.Apply<IDelete>(FilterNames.Delete, a => a.IsDeleted == false);
+            fsql.GlobalFilter.ApplyOnly<IDelete>(FilterNames.Delete, a => a.IsDeleted == false);
 
             //配置实体
             DbHelper.ConfigEntity(fsql, appConfig);
@@ -91,8 +92,7 @@ public static class DBServiceCollectionExtensions
             #region 审计数据
 
             //计算服务器时间
-            var selectProvider = fsql.Select<object>() as Select0Provider;
-            var serverTime = fsql.Select<object>().WithSql($"select {selectProvider._commonUtils.NowUtc} a").First(a => Convert.ToDateTime("a"));
+            var serverTime = fsql.Ado.QuerySingle(() => DateTime.UtcNow);
             var timeOffset = DateTime.UtcNow.Subtract(serverTime);
             DbHelper.TimeOffset = timeOffset;
             fsql.Aop.AuditValue += (s, e) =>
@@ -142,11 +142,13 @@ public static class DBServiceCollectionExtensions
             //租户过滤器
             if (appConfig.Tenant)
             {
-                fsql.GlobalFilter.Apply<ITenant>(FilterNames.Tenant, a => a.TenantId == user.TenantId);
+                fsql.GlobalFilter.ApplyOnly<ITenant>(FilterNames.Tenant, a => a.TenantId == user.TenantId);
             }
 
-            //部门过滤器
-            //fsql.GlobalFilter.Apply<IOrg>(FilterNames.Org, a => a.CreatedOrgId);
+            //数据权限过滤器
+            //fsql.GlobalFilter.ApplyOnlyIf<IData>(FilterNames.Data,
+            //    () => user.Type == UserType.DefaultUser && user.CurrentUser?.DataScope != DataScope.All,
+            //    a => a.OwnerId == user.Id || user.CurrentUser.OrgIds.Contains(a.CreatedOrgId.Value));
 
             return fsql;
         });

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

@@ -154,6 +154,7 @@ public class DbHelper
         {
             switch (e.Property.Name)
             {
+                case "OwnerId":
                 case "CreatedUserId":
                     if (e.Value == null || (long)e.Value == default || (long?)e.Value == default)
                     {

+ 3 - 6
src/platform/ZhonTai.Admin/Core/Db/FreeSqlCloudExtesions.cs

@@ -2,14 +2,12 @@
 using System;
 using StackExchange.Profiling;
 using FreeSql;
-using FreeSql.Internal.CommonProvider;
 using ZhonTai.Admin.Core.Auth;
 using ZhonTai.Admin.Core.Configs;
 using ZhonTai.Admin.Core.Dto;
 using ZhonTai.Admin.Core.Entities;
 using ZhonTai.Admin.Domain.Tenant;
 using ZhonTai.Admin.Core.Consts;
-using ZhonTai.Admin.Core.Db.Transaction;
 
 namespace ZhonTai.Admin.Core.Db;
 
@@ -44,7 +42,7 @@ public static class FreeSqlCloudExtesions
         #endregion 监听所有命令
 
         var fsql = freeSqlBuilder.Build();
-        fsql.GlobalFilter.Apply<IDelete>(FilterNames.Delete, a => a.IsDeleted == false);
+        fsql.GlobalFilter.ApplyOnly<IDelete>(FilterNames.Delete, a => a.IsDeleted == false);
 
         //配置实体
         DbHelper.ConfigEntity(fsql, appConfig);
@@ -76,8 +74,7 @@ public static class FreeSqlCloudExtesions
         #region 审计数据
 
         //计算服务器时间
-        var selectProvider = fsql.Select<object>() as Select0Provider;
-        var serverTime = fsql.Select<object>().WithSql($"select {selectProvider._commonUtils.NowUtc} a").First(a=> Convert.ToDateTime("a"));
+        var serverTime = fsql.Ado.QuerySingle(() => DateTime.UtcNow);
         var timeOffset = DateTime.UtcNow.Subtract(serverTime);
         fsql.Aop.AuditValue += (s, e) =>
         {
@@ -88,7 +85,7 @@ public static class FreeSqlCloudExtesions
 
         if (appConfig.Tenant)
         {
-            fsql.GlobalFilter.Apply<ITenant>(FilterNames.Tenant, a => a.TenantId == user.TenantId);
+            fsql.GlobalFilter.ApplyOnly<ITenant>(FilterNames.Tenant, a => a.TenantId == user.TenantId);
         }
 
         return fsql;

+ 7 - 2
src/platform/ZhonTai.Admin/Core/Entities/IOrg.cs → src/platform/ZhonTai.Admin/Core/Entities/IData.cs

@@ -1,10 +1,15 @@
 namespace ZhonTai.Admin.Core.Entities;
 
 /// <summary>
-/// 部门接口
+/// 数据权限接口
 /// </summary>
-public interface IOrg
+public interface IData
 {
+    /// <summary>
+    /// 拥有者Id
+    /// </summary>
+    long? OwnerId { get; set; }
+
     /// <summary>
     /// 创建者部门Id
     /// </summary>

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

@@ -3,7 +3,6 @@ using System;
 using System.Linq.Expressions;
 using System.Threading.Tasks;
 using ZhonTai.Admin.Core.Auth;
-using ZhonTai.Admin.Core.Consts;
 using ZhonTai.Admin.Core.Db.Transaction;
 
 namespace ZhonTai.Admin.Core.Repositories

+ 22 - 0
src/platform/ZhonTai.Admin/Domain/User/Dto/CurrentUserDto.cs

@@ -0,0 +1,22 @@
+using System.Collections.Generic;
+using ZhonTai.Admin.Domain.Role;
+
+namespace ZhonTai.Admin.Domain.User.Dto;
+
+public class CurrentUserDto
+{
+    /// <summary>
+    /// 部门Id
+    /// </summary>
+    public long OrgId { get; set; }
+
+    /// <summary>
+    /// 部门列表
+    /// </summary>
+    public List<long> OrgIds { get; set; }
+
+    /// <summary>
+    /// 数据范围
+    /// </summary>
+    public DataScope DataScope { get; set; } = DataScope.Self;
+}

+ 4 - 1
src/platform/ZhonTai.Admin/Domain/User/IUserRepository.cs

@@ -1,7 +1,10 @@
-using ZhonTai.Admin.Core.Repositories;
+using System.Threading.Tasks;
+using ZhonTai.Admin.Core.Repositories;
+using ZhonTai.Admin.Domain.User.Dto;
 
 namespace ZhonTai.Admin.Domain.User;
 
 public interface IUserRepository : IRepositoryBase<UserEntity>
 {
+    Task<CurrentUserDto> GetCurrentUserAsync();
 }

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

@@ -15,10 +15,16 @@ namespace ZhonTai.Admin.Domain.User;
 /// </summary>
 [Table(Name = "ad_user")]
 [Index("idx_{tablename}_01", nameof(UserName) + "," + nameof(TenantId), true)]
-public partial class UserEntity : EntityBase, ITenant, IOrg
+public partial class UserEntity : EntityBase, ITenant, IData
 {
     /// <summary>
-    /// 创建者Id
+    /// 拥有者Id
+    /// </summary>
+    [Column(Position = -23)]
+    public long? OwnerId { get; set; }
+
+    /// <summary>
+    /// 创建者部门Id
     /// </summary>
     [Column(Position = -23, CanUpdate = false)]
     public long? CreatedOrgId { get; set; }

+ 87 - 2
src/platform/ZhonTai.Admin/Repositories/User/UserRepository.cs

@@ -1,12 +1,97 @@
-using ZhonTai.Admin.Core.Db.Transaction;
+using Microsoft.AspNetCore.Mvc;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using ZhonTai.Admin.Core.Db.Transaction;
 using ZhonTai.Admin.Core.Repositories;
+using ZhonTai.Admin.Domain;
+using ZhonTai.Admin.Domain.Org;
+using ZhonTai.Admin.Domain.Role;
 using ZhonTai.Admin.Domain.User;
+using ZhonTai.Admin.Domain.User.Dto;
 
 namespace ZhonTai.Admin.Repositories;
 
 public class UserRepository : RepositoryBase<UserEntity>, IUserRepository
 {
-    public UserRepository(UnitOfWorkManagerCloud muowm) : base(muowm)
+    private readonly IOrgRepository _orgRepository;
+    private readonly IRepositoryBase<RoleOrgEntity> _roleOrgRepository;
+    public UserRepository(
+        UnitOfWorkManagerCloud muowm, 
+        IOrgRepository orgRepository, 
+        IRepositoryBase<RoleOrgEntity> roleOrgRepository
+    ) : base(muowm)
     {
+        _orgRepository = orgRepository;
+        _roleOrgRepository = roleOrgRepository;
+    }
+
+    /// <summary>
+    /// 获得当前登录用户
+    /// </summary>
+    /// <returns></returns>
+    [NonAction]
+    public async Task<CurrentUserDto> GetCurrentUserAsync()
+    {
+        var user = await Select
+        .IncludeMany(a => a.Roles.Select(b => new RoleEntity
+        {
+            Id = b.Id,
+            DataScope = b.DataScope
+        }))
+        .WhereDynamic(User.Id)
+        .ToOneAsync(a => new
+        {
+            a.OrgId,
+            a.Roles
+        });
+
+        //数据范围
+        DataScope dataScope = DataScope.Self;
+        var customRoleIds = new List<long>();
+        user.Roles?.ToList().ForEach(role =>
+        {
+            if (role.DataScope == DataScope.Custom)
+            {
+                customRoleIds.Add(role.Id);
+            }
+            else if (role.DataScope <= dataScope)
+            {
+                dataScope = role.DataScope;
+            }
+        });
+
+        //部门列表
+        var orgIds = new List<long>();
+        if (dataScope != DataScope.All)
+        {
+            //本部门
+            if (dataScope == DataScope.Dept)
+            {
+                orgIds.Add(user.OrgId);
+            }
+            //本部门和下级部门
+            else if (dataScope == DataScope.DeptWithChild)
+            {
+                orgIds = await _orgRepository
+                .Where(a => a.Id == user.OrgId)
+                .AsTreeCte()
+                .ToListAsync(a => a.Id);
+            }
+
+            //指定部门
+            if (customRoleIds.Count > 0)
+            {
+                var customRoleOrgIds = await _roleOrgRepository.Select.Where(a => customRoleIds.Contains(a.RoleId)).ToListAsync(a => a.OrgId);
+                orgIds = orgIds.Concat(customRoleOrgIds).ToList();
+            }
+        }
+
+        return new CurrentUserDto
+        {
+            OrgId = user.OrgId,
+            OrgIds = orgIds.Distinct().ToList(),
+            DataScope = dataScope
+        };
     }
 }

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

@@ -104,7 +104,7 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
     {
         //写入Redis
         var guid = Guid.NewGuid().ToString("N");
-        var key = string.Format(CacheKeys.PassWordEncrypt, guid);
+        var key = CacheKeys.PassWordEncrypt + guid;
         var encyptKey = StringHelper.GenerateRandom(8);
         await Cache.SetAsync(key, encyptKey, TimeSpan.FromMinutes(5));
         var data = new { key = guid, encyptKey };
@@ -224,7 +224,7 @@ public class AuthService : BaseService, IAuthService, IDynamicApi
 
         if (input.PasswordKey.NotNull())
         {
-            var passwordEncryptKey = string.Format(CacheKeys.PassWordEncrypt, input.PasswordKey);
+            var passwordEncryptKey = CacheKeys.PassWordEncrypt + input.PasswordKey;
             var existsPasswordKey = await Cache.ExistsAsync(passwordEncryptKey);
             if (existsPasswordKey)
             {

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

@@ -72,7 +72,7 @@ public class PermissionService : BaseService, IPermissionService, IDynamicApi
         ).ToListAsync(a => a.UserId);
         foreach (var userId in userIds)
         {
-            await Cache.DelAsync(string.Format(CacheKeys.UserPermissions, userId));
+            await Cache.DelAsync(CacheKeys.UserPermissions + userId);
         }
     }
 
@@ -466,7 +466,7 @@ public class PermissionService : BaseService, IPermissionService, IDynamicApi
         var userIds = await _userRoleRepository.Select.Where(a => a.RoleId == input.RoleId).ToListAsync(a => a.UserId);
         foreach (var userId in userIds)
         {
-            await Cache.DelAsync(string.Format(CacheKeys.UserPermissions, userId));
+            await Cache.DelAsync(CacheKeys.UserPermissions + userId);
         }
 
         return ResultOutput.Ok();
@@ -518,7 +518,7 @@ public class PermissionService : BaseService, IPermissionService, IDynamicApi
         {
             foreach (var userId in userIds)
             {
-                await Cache.DelAsync(string.Format(CacheKeys.UserPermissions, userId));
+                await Cache.DelAsync(CacheKeys.UserPermissions + userId);
             }
         }
 

+ 1 - 0
src/platform/ZhonTai.Admin/Services/User/IUserService.cs

@@ -1,6 +1,7 @@
 using System.Collections.Generic;
 using System.Threading.Tasks;
 using ZhonTai.Admin.Core.Dto;
+using ZhonTai.Admin.Domain.User.Dto;
 using ZhonTai.Admin.Services.Auth.Dto;
 using ZhonTai.Admin.Services.User.Dto;
 

+ 5 - 5
src/platform/ZhonTai.Admin/Services/User/UserService.cs

@@ -28,6 +28,7 @@ using ZhonTai.Admin.Domain.Org;
 using System.Data;
 using ZhonTai.Admin.Domain.TenantPermission;
 using FreeSql;
+using ZhonTai.Admin.Domain.User.Dto;
 
 namespace ZhonTai.Admin.Services.User;
 
@@ -39,10 +40,12 @@ public class UserService : BaseService, IUserService, IDynamicApi
 {
     private AppConfig _appConfig => LazyGetRequiredService<AppConfig>();
     private IUserRepository _userRepository => LazyGetRequiredService<IUserRepository>();
-    private IRepositoryBase<UserRoleEntity> _userRoleRepository => LazyGetRequiredService<IRepositoryBase<UserRoleEntity>>();
+    private IOrgRepository _orgRepository => LazyGetRequiredService<IOrgRepository>();
     private ITenantRepository _tenantRepository => LazyGetRequiredService<ITenantRepository>();
     private IApiRepository _apiRepository => LazyGetRequiredService<IApiRepository>();
     private IStaffRepository _staffRepository => LazyGetRequiredService<IStaffRepository>();
+    private IRepositoryBase<UserRoleEntity> _userRoleRepository => LazyGetRequiredService<IRepositoryBase<UserRoleEntity>>();
+    private IRepositoryBase<RoleOrgEntity> _roleOrgRepository => LazyGetRequiredService<IRepositoryBase<RoleOrgEntity>>();
     private IRepositoryBase<UserOrgEntity> _userOrgRepository => LazyGetRequiredService<IRepositoryBase<UserOrgEntity>>();
 
     public UserService()
@@ -155,7 +158,7 @@ public class UserService : BaseService, IUserService, IDynamicApi
     /// <returns></returns>
     public async Task<IList<UserPermissionsOutput>> GetPermissionsAsync()
     {
-        var key = string.Format(CacheKeys.UserPermissions, User.Id);
+        var key = CacheKeys.UserPermissions + User.Id;
         var result = await Cache.GetOrSetAsync(key, async () =>
         {
             if (User.TenantAdmin)
@@ -334,9 +337,6 @@ public class UserService : BaseService, IUserService, IDynamicApi
         entity = Mapper.Map(input, entity);
         await _userRepository.UpdateAsync(entity);
 
-        //清除用户缓存
-        await Cache.DelAsync(string.Format(CacheKeys.UserInfo, input.Id));
-
         return ResultOutput.Ok();
     }
 

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

@@ -16,14 +16,14 @@
 		<PackageReference Include="CSRedisCore" Version="3.8.669" />
 		<PackageReference Include="Caching.CSRedis" Version="3.8.669" />
 		<PackageReference Include="FluentValidation.AspNetCore" Version="11.2.2" />
-		<PackageReference Include="FreeSql" Version="3.2.680" />
+		<PackageReference Include="FreeSql" Version="3.2.681" />
 		<PackageReference Include="FreeSql.Cloud" Version="1.6.3" />
-		<PackageReference Include="FreeSql.Repository" Version="3.2.680" />
+		<PackageReference Include="FreeSql.Repository" Version="3.2.681" />
 		<PackageReference Include="FreeScheduler" Version="1.0.9" />
 		<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
 		<PackageReference Include="Mapster" Version="7.3.0" />
 		<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="6.0.0" />
-		<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.9" />
+		<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.10" />
 		<PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.2.22" />
 		<PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.2.22" />
 		<PackageReference Include="NLog" Version="5.0.4" />
@@ -37,12 +37,12 @@
 	</ItemGroup>
 
 	<ItemGroup Condition="'$(Configuration)'=='Debug'">
-		<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" />
+		<PackageReference Include="FreeSql.Provider.MySql" Version="3.2.681" />
+		<PackageReference Include="FreeSql.Provider.SqlServer" Version="3.2.681" />
+		<PackageReference Include="FreeSql.Provider.PostgreSQL" Version="3.2.681" />
+		<PackageReference Include="FreeSql.Provider.Oracle" Version="3.2.681" />
+		<PackageReference Include="FreeSql.Provider.Sqlite" Version="3.2.681" />
+		<PackageReference Include="FreeSql.Provider.MySqlConnector" Version="3.2.681" />
 	</ItemGroup>
 
 	<ItemGroup>

+ 49 - 28
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -215,11 +215,6 @@
             租户Id
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Core.Auth.User.CurrentUser">
-            <summary>
-            当前用户
-            </summary>
-        </member>
         <member name="P:ZhonTai.Admin.Core.Auth.User.Type">
             <summary>
             用户类型
@@ -250,6 +245,11 @@
             数据库注册键
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Core.Auth.User.CurrentUser">
+            <summary>
+            当前用户
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Core.BaseController">
             <summary>
             基础控制器
@@ -700,11 +700,6 @@
             用户信息 admin:user:info:用户主键
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Core.Consts.CacheKeys.TenantInfo">
-            <summary>
-            租户信息 admin:tenant:info:租户主键
-            </summary>
-        </member>
         <member name="T:ZhonTai.Admin.Core.Consts.DbKeys">
             <summary>
             数据库键名
@@ -740,14 +735,9 @@
             租户
             </summary>
         </member>
-        <member name="F:ZhonTai.Admin.Core.Consts.FilterNames.Self">
-            <summary>
-            本人
-            </summary>
-        </member>
-        <member name="F:ZhonTai.Admin.Core.Consts.FilterNames.Org">
+        <member name="F:ZhonTai.Admin.Core.Consts.FilterNames.Data">
             <summary>
-            部门
+            数据权限
             </summary>
         </member>
         <member name="T:ZhonTai.Admin.Core.Conventions.ApiGroupConvention">
@@ -1245,6 +1235,21 @@
             版本
             </summary>
         </member>
+        <member name="T:ZhonTai.Admin.Core.Entities.IData">
+            <summary>
+            数据权限接口
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Entities.IData.OwnerId">
+            <summary>
+            拥有者Id
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Entities.IData.CreatedOrgId">
+            <summary>
+            创建者部门Id
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Core.Entities.IDelete">
             <summary>
             删除接口
@@ -1297,16 +1302,6 @@
             修改时间
             </summary>
         </member>
-        <member name="T:ZhonTai.Admin.Core.Entities.IOrg">
-            <summary>
-            部门接口
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Core.Entities.IOrg.CreatedOrgId">
-            <summary>
-            创建者部门Id
-            </summary>
-        </member>
         <member name="T:ZhonTai.Admin.Core.Entities.ITenant">
             <summary>
             租户接口
@@ -2679,14 +2674,34 @@
             角色Id
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Domain.User.Dto.CurrentUserDto.OrgId">
+            <summary>
+            部门Id
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.User.Dto.CurrentUserDto.OrgIds">
+            <summary>
+            部门列表
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.User.Dto.CurrentUserDto.DataScope">
+            <summary>
+            数据范围
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Domain.User.UserEntity">
             <summary>
             用户
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Domain.User.UserEntity.OwnerId">
+            <summary>
+            拥有者Id
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Domain.User.UserEntity.CreatedOrgId">
             <summary>
-            创建者Id
+            创建者部门Id
             </summary>
         </member>
         <member name="P:ZhonTai.Admin.Domain.User.UserEntity.TenantId">
@@ -2919,6 +2934,12 @@
             任务名称名称
             </summary>
         </member>
+        <member name="M:ZhonTai.Admin.Repositories.UserRepository.GetCurrentUserAsync">
+            <summary>
+            获得当前登录用户
+            </summary>
+            <returns></returns>
+        </member>
         <member name="T:ZhonTai.Admin.Services.Api.ApiService">
             <summary>
             接口服务

+ 2 - 1
src/tests/ZhonTai.Tests/BaseControllerTest.cs

@@ -15,6 +15,7 @@ using ZhonTai.Admin.Services.Auth.Dto;
 using ZhonTai.Admin.Core.Enums;
 using System.Collections.Generic;
 using ZhonTai.Admin.Core.Consts;
+using RTools_NTS.Util;
 
 namespace ZhonTai.Tests;
 
@@ -169,7 +170,7 @@ public class BaseControllerTest : BaseTest
             if (_appConfig.VarifyCode.Enable)
             {
                 var res = await _captcha.GetAsync(CacheKeys.Captcha);
-                var captchaKey = string.Format(CacheKeys.Captcha, res.Token);
+                var captchaKey = CacheKeys.Captcha + res.Token;
                 var captchaData = await _cache.GetAsync(captchaKey);
                 input.Captcha = new CaptchaInput { CaptchaKey = CacheKeys.Captcha, Token = res.Token, Data = JsonConvert.SerializeObject(new { X = captchaData }) };
             }

+ 1 - 1
src/tests/ZhonTai.Tests/Services/ApiServiceTest.cs

@@ -20,7 +20,7 @@ public class ApiServiceTest : BaseTest
     [Fact]
     public async void SlideJigsawTest()
     {
-        var data = await _captchaTool.GetAsync("admin:captcha:{0}");
+        var data = await _captchaTool.GetAsync("admin:captcha");
     }
 
     [Fact]