Browse Source

follow example project

HOME 2 years ago
parent
commit
59ff3ef016

+ 1 - 3
VCommon.Ioc/InterceptionBehaviorAdapter.cs

@@ -3,7 +3,6 @@ using System.Collections.Generic;
 using System.Linq;
 using Unity.Interception.InterceptionBehaviors;
 using Unity.Interception.PolicyInjection.Pipeline;
-using VCommon.Diagnostics;
 
 namespace VCommon.Ioc
 {
@@ -24,8 +23,7 @@ namespace VCommon.Ioc
 
             _interceptor.BeforeInvoke(svcClass, svcMethod, paramDic);
 
-            IMethodReturn result;
-             result = getNext()(input, getNext);
+            var result = getNext()(input, getNext);
 
             _interceptor.AfterInvoke(svcClass, svcMethod, paramDic, result.ReturnValue, result.Exception);
 

+ 2 - 2
VCommon.VApplication/Auditing/ApplicationServiceAuditInterceptorBase.cs

@@ -64,8 +64,8 @@ namespace VCommon.VApplication.Auditing
 
             var permMgr = IocManager.Resolve<IPermissionManager>();
 
-            if ((0 == svcAuthInClass.Length || permMgr.CheckPermission(Session.GetTenantId(), Session.GetUserId(), svcAuthInClass.SelectMany(p => p.AnyPermissionsRequired).ToArray())) &&
-                (null == svcAuthInMethod || permMgr.CheckPermission(Session.GetTenantId(), Session.GetUserId(), svcAuthInMethod.AnyPermissionsRequired))) return;
+            if ((0 == svcAuthInClass.Length || permMgr.CheckPermission(Session.TenantId, Session.GetUserId(), svcAuthInClass.SelectMany(p => p.AnyPermissionsRequired).ToArray())) &&
+                (null == svcAuthInMethod || permMgr.CheckPermission(Session.TenantId, Session.GetUserId(), svcAuthInMethod.AnyPermissionsRequired))) return;
 
             var vrwFriendlyException = new VApplicationAuthException("拒绝访问:您没有权限进行此操作", AuthReason.AccessDenied);
 

+ 6 - 14
VCommon.VApplication/Authorization/IPermissionManager.cs

@@ -5,24 +5,16 @@ namespace VCommon.VApplication.Authorization
 {
     public interface IPermissionManager
     {
-        ///// <summary> 检查权限代码是否合法 </summary>
-        //bool ValidPermission(string permission);
+        /// <summary> 检查权限代码是否合法 </summary>
+        bool ValidPermission(string permission);
 
         /// <summary> 检查指定的用户是否有权限 </summary>
         bool CheckPermission(Guid? tenantId, Guid userId, params string[] hasAnyPermission);
 
-        ///// <summary> 获取当前用户权限代码集合 </summary>
-        //IReadOnlyCollection<string> GetUserPermissionCodes(Guid? tenantId, Guid userId);
-
-        ///// <summary> 获取平台端完整权限 </summary>
-        //IReadOnlyCollection<string> GetHostPermissionNode();
-
-        ///// <summary> 获取租户端完整权限</summary>
-        //IReadOnlyCollection<string> GetTenantPermissionNode(ICollection<string> licPermissions);
-
-
-        ///// <summary> 获取当前可用权限树 </summary>
-        //IReadOnlyCollection<PermissionNodeOutput> GetPermissionTreeOutput(MultiTenancySides side, ICollection<string> licPermissions);
+        /// <summary> 获取用户权限代码集合 </summary>
+        IReadOnlyCollection<string> GetUserPermissionCodes(Guid? tenantId, Guid userId);
 
+        /// <summary> 获取权限树 </summary>
+        IReadOnlyCollection<PermissionNodeOutput> GetPermissionTreeOutput(MultiTenancySides side, IReadOnlyCollection<string> licPermissions = null);
     }
 }

+ 4 - 3
VCommon.VApplication/Authorization/PermissionTree.cs

@@ -36,7 +36,7 @@ namespace VCommon.VApplication.Authorization
 
         public IReadOnlyCollection<PermissionNodeOutput> Filter(MultiTenancySides side, IReadOnlyCollection<string> licPerms)
         {
-            return FltTree(_roots, side, new HashSet<string>(licPerms));
+            return FltTree(_roots, side, licPerms == null ? null : new HashSet<string>(licPerms));
         }
 
         private static IReadOnlyCollection<PermissionNodeOutput> FltTree(IReadOnlyCollection<PermissionNode> nodesFrom, MultiTenancySides side, IReadOnlySet<string> licPerms, List<PermissionNodeOutput> output = null)
@@ -45,8 +45,9 @@ namespace VCommon.VApplication.Authorization
 
             foreach (var node in nodesFrom)
             {
-                if (!licPerms.Contains(node.Code)) continue;
-                if (node.TenancySide != side) continue;
+                if (licPerms != null) if (!licPerms.Contains(node.Code)) continue;
+
+                if (node.TenancySide != MultiTenancySides.Both && node.TenancySide != side) continue;
 
                 var copy = side == MultiTenancySides.Tenant
                     ? new PermissionNodeOutput(node.Code, node.Name, node.Description)

+ 13 - 0
VCommon.VApplication/Dto/DeleteInput.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace VCommon.VApplication.Dto
+{
+    public class DeleteInput
+    {
+        public Guid Id { get; set; }
+    }
+}

+ 7 - 2
VCommon.VApplication/Dto/EntityDto.cs

@@ -2,7 +2,12 @@
 
 namespace VCommon.VApplication.Dto
 {
-    public class EntityDto
+    public interface IEntityDto
+    {
+        Guid Id { get; set; }
+    }
+
+    public class EntityDto : IEntityDto
     {
         public virtual Guid Id { get; set; }
 
@@ -15,4 +20,4 @@ namespace VCommon.VApplication.Dto
             Id = id;
         }
     }
-}
+}

+ 13 - 1
VCommon.VApplication/Dto/IPagedResult.cs

@@ -7,4 +7,16 @@ namespace VCommon.VApplication.Dto
         int TotalRecord { get; }
         IReadOnlyList<T> Items { get; }
     }
-}
+
+    public class PagedResult<T> : IPagedResult<T>
+    {
+        public int TotalRecord { get; }
+        public IReadOnlyList<T> Items { get; }
+
+        public PagedResult(int totalRecord, IReadOnlyList<T> items)
+        {
+            TotalRecord = totalRecord;
+            Items = items;
+        }
+    }
+}

+ 9 - 1
VCommon.VApplication/EntityFrameworkCore/VAppEfRepository.cs

@@ -1,8 +1,10 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.Linq;
 using Unity;
 using VCommon.Ioc;
 using VCommon.VApplication.Authorization;
+using VCommon.VAutoMapper;
 using VCommon.VEntity;
 using VCommon.VEntityFrameworkCore;
 
@@ -30,6 +32,12 @@ namespace VCommon.VApplication.EntityFrameworkCore
 
         protected override TDbContext ResolveDbContextInstance() => IocManager.Resolve<TDbContext>();
 
+
+        public virtual TDto QueryProjection<TDto>(Guid id)
+        {
+            return QueryNoTracking(p => p.Id == id).ProjectionFirstOrDefault<TEntity, TDto>();
+        }
+
         protected override IQueryable<TEntity> ProcessFilters(IQueryable<TEntity> input)
         {
             if (_filterState[VAppEfDataFilters.MayHaveTenant] && typeof(TEntity).IsAssignableTo(typeof(IMayHaveTenant)))

+ 5 - 2
VCommon.VApplication/IVSession.cs

@@ -1,4 +1,5 @@
 using System;
+using VCommon.VApplication.Authorization;
 
 namespace VCommon.VApplication
 {
@@ -13,15 +14,17 @@ namespace VCommon.VApplication
 
         public Guid GetUserId()
         {
-            if (!UserId.HasValue) throw new VApplicationAuthException("Session.UserId is null! Probably, user is not logged in.", AuthReason.AuthRequired);
+            if (!UserId.HasValue) throw new VApplicationAuthException("UserId is null! Probably, user is not logged in.", AuthReason.AuthRequired);
             return UserId.Value;
         }
 
         public Guid GetTenantId()
         {
             if (!TenantId.HasValue)
-                throw new VApplicationAuthException("Session.TenantId is null! Possible problems: No user logged in or current logged in user in a host user (TenantId is always null for host users).", AuthReason.AuthRequired);
+                throw new VApplicationAuthException("TenantId is null! Possible problems: No user logged in or current logged in user in a host user (TenantId is always null for host users).", AuthReason.AuthRequired);
             return TenantId.Value;
         }
+
+        public MultiTenancySides Side => TenantId.HasValue ? MultiTenancySides.Tenant : MultiTenancySides.Host;
     }
 }

+ 0 - 1
VCommon.VEntity/IHaveCreationUser.cs

@@ -2,7 +2,6 @@
 
 namespace VCommon.VEntity
 {
-    //TODO: 移动到 VApplication.VEntity
     public interface IHaveCreationUserId
     {
         Guid CreationUserId { get; set; }

+ 0 - 1
VCommon.VEntity/IHaveLastModificationUserId.cs

@@ -2,7 +2,6 @@
 
 namespace VCommon.VEntity
 {
-    //TODO: 移动到 VApplication.VEntity
     public interface IHaveLastModificationUserId
     {
         Guid? LastModificationUserId { get; set; }

+ 0 - 2
VCommon.VEntity/IMayHaveTenant.cs

@@ -2,8 +2,6 @@
 
 namespace VCommon.VEntity
 {
-    //TODO: 移动到 VApplication.VEntity
-
     public interface IMayHaveTenant
     {
         Guid? TenantId { get; set; }

+ 0 - 1
VCommon.VEntity/IMustHaveTenant.cs

@@ -2,7 +2,6 @@
 
 namespace VCommon.VEntity
 {
-    //TODO: 移动到 VApplication.VEntity
     public interface IMustHaveTenant
     {
         Guid TenantId { get; set; }

+ 14 - 3
VCommon.VEntityFrameworkCore/VEfRepositoryBase.cs

@@ -32,7 +32,7 @@ namespace VCommon.VEntityFrameworkCore
 
             if (_filterState[VEfDataFilters.Passive] && typeof(TEntity).IsAssignableTo(typeof(IPassive)))
             {
-                input = input.Where(p => ((IPassive)p).IsEnable == false);
+                input = input.Where(p => ((IPassive)p).IsEnable);
             }
 
             return input;
@@ -50,6 +50,16 @@ namespace VCommon.VEntityFrameworkCore
 
         public virtual bool IsFilterEnabled(string filterName) => _filterState[filterName];
 
+
+        public virtual int Count(Expression<Func<TEntity, bool>> queryExpression = null)
+        {
+            var source = ProcessFilters(DbSet.AsNoTracking());
+
+            return queryExpression != null
+                ? source.Count(queryExpression)
+                : source.Count();
+        }
+
         public virtual IQueryable<TEntity> QueryNoTracking(Expression<Func<TEntity, bool>> queryExpression = null)
         {
             var source = ProcessFilters(DbSet.AsNoTracking());
@@ -66,6 +76,7 @@ namespace VCommon.VEntityFrameworkCore
             return null == queryExpression ? source : source.Where(queryExpression);
         }
 
+    
 
         public virtual void Delete(TEntity entity) => DbSet.Remove(entity);
 
@@ -78,9 +89,9 @@ namespace VCommon.VEntityFrameworkCore
             return null == expression ? source.Any() : source.Any(expression);
         }
 
-        public TEntity GetEntityOrDefault(Guid id) => ProcessFilters(DbSet).FirstOrDefault(p => p.Id == id);
+        public virtual TEntity GetEntityOrDefault(Guid id) => ProcessFilters(DbSet).FirstOrDefault(p => p.Id == id);
 
-        public TEntity GetEntityOrDefault(Expression<Func<TEntity, bool>> expression = null)
+        public virtual TEntity GetEntityOrDefault(Expression<Func<TEntity, bool>> expression = null)
         {
             var source = ProcessFilters(DbSet);
             return null == expression ? source.FirstOrDefault() : source.FirstOrDefault(expression);

+ 4 - 4
VCommon.VOpenApi/ApiBind.cs

@@ -69,7 +69,8 @@ namespace VCommon.VOpenApi
                 {
                     if (hasReturn)
                     {
-                        var lam = Expression.Lambda<Func<object, object, object>>(invoke, pInstance, pInput);
+                        var cvr = Expression.Convert(invoke, typeof(object));
+                        var lam = Expression.Lambda<Func<object, object, object>>(cvr, pInstance, pInput);
                         _preCompiledInvoke = lam.Compile();
                     }
                     else
@@ -87,7 +88,8 @@ namespace VCommon.VOpenApi
                 {
                     if (hasReturn)
                     {
-                        var lam = Expression.Lambda<Func<object, object>>(invoke, pInstance);
+                        var cvr = Expression.Convert(invoke, typeof(object));
+                        var lam = Expression.Lambda<Func<object, object>>(cvr, pInstance);
                         var del = lam.Compile();
                         _preCompiledInvoke = (instance, _) => del(instance);
                     }
@@ -132,8 +134,6 @@ namespace VCommon.VOpenApi
                     Logger.Error("ApiBind: Error on parsing input", new { inputJson = input, exception });
                     throw new VApiArgumentException("参数错误");
                 }
-
-                if (null == inputParam) throw new VApiArgumentException("缺少参数");
             }
 
             var inst = resolveFunc(_interfaceType);