// Admin.NET 项目的版æƒã€å•†æ ‡ã€ä¸“利和其他相关æƒåˆ©å‡å—ç›¸åº”æ³•å¾‹æ³•è§„çš„ä¿æŠ¤ã€‚ä½¿ç”¨æœ¬é¡¹ç›®åº”éµå®ˆç›¸å…³æ³•律法规和许å¯è¯çš„è¦æ±‚。 // // 本项目主è¦éµå¾ª MIT 许å¯è¯å’Œ Apache 许å¯è¯ï¼ˆç‰ˆæœ¬ 2.0)进行分å‘和使用。许å¯è¯ä½äºŽæºä»£ç æ ‘æ ¹ç›®å½•ä¸çš„ LICENSE-MIT å’Œ LICENSE-APACHE 文件。 // // ä¸å¾—利用本项目从事å±å®³å›½å®¶å®‰å…¨ã€æ‰°ä¹±ç¤¾ä¼šç§©åºã€ä¾µçŠ¯ä»–äººåˆæ³•æƒç›Šç‰æ³•å¾‹æ³•è§„ç¦æ¢çš„æ´»åЍï¼ä»»ä½•基于本项目二次开å‘è€Œäº§ç”Ÿçš„ä¸€åˆ‡æ³•å¾‹çº çº·å’Œè´£ä»»ï¼Œæˆ‘ä»¬ä¸æ‰¿æ‹…ä»»ä½•è´£ä»»ï¼ namespace Admin.NET.Core; public static class SqlSugarFilter { /// <summary> /// 缓å˜å…¨å±€æŸ¥è¯¢è¿‡æ»¤å™¨ï¼ˆå†…å˜ç¼“å˜ï¼‰ /// </summary> private static readonly ICache _cache = Cache.Default; /// <summary> /// åˆ é™¤ç”¨æˆ·æœºæž„ç¼“å˜ /// </summary> /// <param name="userId"></param> /// <param name="dbConfigId"></param> public static void DeleteUserOrgCache(long userId, string dbConfigId) { var sysCacheService = App.GetRequiredService<SysCacheService>(); // åˆ é™¤ç”¨æˆ·æœºæž„é›†åˆç¼“å˜ sysCacheService.Remove($"{CacheConst.KeyUserOrg}{userId}"); // åˆ é™¤æœ€å¤§æ•°æ®æƒé™ç¼“å˜ sysCacheService.Remove($"{CacheConst.KeyRoleMaxDataScope}{userId}"); // åˆ é™¤ç”¨æˆ·æœºæž„ï¼ˆæ•°æ®èŒƒå›´ï¼‰ç¼“å˜â€”—过滤器 _cache.Remove($"db:{dbConfigId}:orgList:{userId}"); } /// <summary> /// é…置用户机构集åˆè¿‡æ»¤å™¨ /// </summary> public static void SetOrgEntityFilter(SqlSugarScopeProvider db) { // 若仅本人数æ®ï¼Œåˆ™ç›´æŽ¥è¿”回 var maxDataScope = SetDataScopeFilter(db); if (maxDataScope == 0 || maxDataScope == (int)DataScopeEnum.Self) return; var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value; if (string.IsNullOrWhiteSpace(userId)) return; // é…置用户机构集åˆç¼“å˜ var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:orgList:{userId}"; var orgFilter = _cache.Get<ConcurrentDictionary<Type, LambdaExpression>>(cacheKey); if (orgFilter == null) { // 获å–用户最大数æ®èŒƒå›´ï¼Œå¦‚果是全部数æ®ï¼Œåˆ™è·³è¿‡ if (maxDataScope == (int)DataScopeEnum.All) return; // 获å–用户所属机构,ä¿è¯åŒä¸€ä½œç”¨åŸŸ var orgIds = new List<long>(); Scoped.Create((factory, scope) => { var services = scope.ServiceProvider; orgIds = services.GetRequiredService<SysOrgService>().GetUserOrgIdList().GetAwaiter().GetResult(); }); if (orgIds == null || orgIds.Count == 0) return; // 获å–业务实体数æ®è¡¨ var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsSubclassOf(typeof(EntityBaseData))); if (!entityTypes.Any()) return; orgFilter = new ConcurrentDictionary<Type, LambdaExpression>(); foreach (var entityType in entityTypes) { // 排除éžå½“剿•°æ®åº“实体 var tAtt = entityType.GetCustomAttribute<TenantAttribute>(); if ((tAtt != null && db.CurrentConnectionConfig.ConfigId.ToString() != tAtt.configId.ToString())) continue; //var lambda = DynamicExpressionParser.ParseLambda(new[] { // Expression.Parameter(entityType, "u") }, typeof(bool), $"@0.Contains(u.{nameof(EntityBaseData.CreateOrgId)}??{default(long)})", orgIds); var lambda = entityType.GetConditionExpression<OwnerOrgAttribute>(orgIds); db.QueryFilter.AddTableFilter(entityType, lambda); orgFilter.TryAdd(entityType, lambda); } _cache.Add(cacheKey, orgFilter); } else { foreach (var filter in orgFilter) db.QueryFilter.AddTableFilter(filter.Key, filter.Value); } } /// <summary> /// é…置用户仅本人数æ®è¿‡æ»¤å™¨ /// </summary> private static int SetDataScopeFilter(SqlSugarScopeProvider db) { var maxDataScope = (int)DataScopeEnum.All; var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value; if (string.IsNullOrWhiteSpace(userId)) return maxDataScope; // 获å–用户最大数æ®èŒƒå›´---ä»…æœ¬äººæ•°æ® maxDataScope = App.GetRequiredService<SysCacheService>().Get<int>(CacheConst.KeyRoleMaxDataScope + userId); // 若为0则获å–用户机构组织集åˆå»ºç«‹ç¼“å˜ if (maxDataScope == 0) { // 获å–用户所属机构,ä¿è¯åŒä¸€ä½œç”¨åŸŸ Scoped.Create((factory, scope) => { var services = scope.ServiceProvider; services.GetRequiredService<SysOrgService>().GetUserOrgIdList().GetAwaiter().GetResult(); maxDataScope = services.GetRequiredService<SysCacheService>().Get<int>(CacheConst.KeyRoleMaxDataScope + userId); }); } if (maxDataScope != (int)DataScopeEnum.Self) return maxDataScope; // é…置用户数æ®èŒƒå›´ç¼“å˜ var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:dataScope:{userId}"; var dataScopeFilter = _cache.Get<ConcurrentDictionary<Type, LambdaExpression>>(cacheKey); if (dataScopeFilter == null) { // 获å–业务实体数æ®è¡¨ var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsSubclassOf(typeof(EntityBaseData))); if (!entityTypes.Any()) return maxDataScope; dataScopeFilter = new ConcurrentDictionary<Type, LambdaExpression>(); foreach (var entityType in entityTypes) { // 排除éžå½“剿•°æ®åº“实体 var tAtt = entityType.GetCustomAttribute<TenantAttribute>(); if ((tAtt != null && db.CurrentConnectionConfig.ConfigId.ToString() != tAtt.configId.ToString())) continue; //var lambda = DynamicExpressionParser.ParseLambda(new[] { // Expression.Parameter(entityType, "u") }, typeof(bool), $"u.{nameof(EntityBaseData.CreateUserId)}=@0", userId); var lambda = entityType.GetConditionExpression<OwnerUserAttribute>(new List<long> { long.Parse(userId) }); db.QueryFilter.AddTableFilter(entityType, lambda); dataScopeFilter.TryAdd(entityType, lambda); } _cache.Add(cacheKey, dataScopeFilter); } else { foreach (var filter in dataScopeFilter) db.QueryFilter.AddTableFilter(filter.Key, filter.Value); } return maxDataScope; } /// <summary> /// é…置自定义过滤器 /// </summary> public static void SetCustomEntityFilter(SqlSugarScopeProvider db) { // é…ç½®è‡ªå®šä¹‰ç¼“å˜ var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value; var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:custom:{userId}"; var tableFilterItemList = _cache.Get<List<TableFilterItem<object>>>(cacheKey); if (tableFilterItemList == null) { // 获å–自定义实体过滤器 var entityFilterTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.GetInterfaces().Any(i => i.HasImplementedRawGeneric(typeof(IEntityFilter)))); if (!entityFilterTypes.Any()) return; var tableFilterItems = new List<TableFilterItem<object>>(); foreach (var entityFilter in entityFilterTypes) { var instance = Activator.CreateInstance(entityFilter); var entityFilterMethod = entityFilter.GetMethod("AddEntityFilter"); var entityFilters = ((IList)entityFilterMethod?.Invoke(instance, null))?.Cast<object>(); if (entityFilters == null) continue; foreach (var u in entityFilters) { var tableFilterItem = (TableFilterItem<object>)u; var entityType = tableFilterItem.GetType().GetProperty("type", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(tableFilterItem, null) as Type; // 排除éžå½“剿•°æ®åº“实体 var tAtt = entityType.GetCustomAttribute<TenantAttribute>(); if ((tAtt != null && db.CurrentConnectionConfig.ConfigId.ToString() != tAtt.configId.ToString()) || (tAtt == null && db.CurrentConnectionConfig.ConfigId.ToString() != SqlSugarConst.MainConfigId)) continue; tableFilterItems.Add(tableFilterItem); db.QueryFilter.Add(tableFilterItem); } } _cache.Add(cacheKey, tableFilterItems); } else { tableFilterItemList.ForEach(u => { db.QueryFilter.Add(u); }); } } } /// <summary> /// è‡ªå®šä¹‰å®žä½“è¿‡æ»¤å™¨æŽ¥å£ /// </summary> public interface IEntityFilter { /// <summary> /// 实体过滤器 /// </summary> /// <returns></returns> IEnumerable<TableFilterItem<object>> AddEntityFilter(); } ///// <summary> ///// 自定义业务实体过滤器示例 ///// </summary> //public class TestEntityFilter : IEntityFilter //{ // public IEnumerable<TableFilterItem<object>> AddEntityFilter() // { // // æž„é€ è‡ªå®šä¹‰æ¡ä»¶çš„过滤器 // Expression<Func<SysUser, bool>> dynamicExpression = u => u.Remark.Contains("xxx"); // var tableFilterItem = new TableFilterItem<object>(typeof(SysUser), dynamicExpression); // return new[] // { // tableFilterItem // }; // } //}