0
0
Kaynağa Gözat

修复刷新token异常
使用基础服务日志和缓存操作

zhontai 3 yıl önce
ebeveyn
işleme
07b579a4f8

+ 2 - 0
Admin.Core.Common/Admin.Core.Common.csproj

@@ -41,6 +41,8 @@
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.12" />
 	<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.1.0" />
 	<PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.0" />
+	<PackageReference Include="NLog" Version="4.7.10" />
+	<PackageReference Include="NLog.Web.AspNetCore" Version="4.12.0" />
   </ItemGroup>
 
 </Project>

+ 11 - 14
Admin.Core.Service/Admin/Auth/AuthService.cs

@@ -15,14 +15,12 @@ namespace Admin.Core.Service.Admin.Auth
     public class AuthService : BaseService, IAuthService
     {
         private readonly AppConfig _appConfig;
-        private readonly ICache _cache;
         private readonly IPermissionRepository _permissionRepository;
         private readonly IUserRepository _userRepository;
         private readonly VerifyCodeHelper _verifyCodeHelper;
         private readonly ITenantRepository _tenantRepository;
 
         public AuthService(
-            ICache cache,
             AppConfig appConfig,
             VerifyCodeHelper verifyCodeHelper,
             IUserRepository userRepository,
@@ -30,7 +28,6 @@ namespace Admin.Core.Service.Admin.Auth
             ITenantRepository tenantRepository
         )
         {
-            _cache = cache;
             _appConfig = appConfig;
             _verifyCodeHelper = verifyCodeHelper;
             _userRepository = userRepository;
@@ -44,7 +41,7 @@ namespace Admin.Core.Service.Admin.Auth
             var guid = Guid.NewGuid().ToString("N");
             var key = string.Format(CacheKey.PassWordEncryptKey, guid);
             var encyptKey = StringHelper.GenerateRandom(8);
-            await _cache.SetAsync(key, encyptKey, TimeSpan.FromMinutes(5));
+            await Cache.SetAsync(key, encyptKey, TimeSpan.FromMinutes(5));
             var data = new { key = guid, encyptKey };
 
             return ResponseOutput.Ok(data);
@@ -58,7 +55,7 @@ namespace Admin.Core.Service.Admin.Auth
             }
 
             var key = string.Format(CacheKey.UserInfo, User.Id);
-            var output = await _cache.GetOrSetAsync(key, async () =>
+            var output = await Cache.GetOrSetAsync(key, async () =>
             {
                 var authUserInfoOutput = new AuthUserInfoOutput { };
                 //用户信息
@@ -101,13 +98,13 @@ namespace Admin.Core.Service.Admin.Auth
             //删除上次缓存的验证码
             if (lastKey.NotNull())
             {
-                await _cache.DelAsync(lastKey);
+                await Cache.DelAsync(lastKey);
             }
 
             //写入Redis
             var guid = Guid.NewGuid().ToString("N");
             var key = string.Format(CacheKey.VerifyCodeKey, guid);
-            await _cache.SetAsync(key, code, TimeSpan.FromMinutes(5));
+            await Cache.SetAsync(key, code, TimeSpan.FromMinutes(5));
 
             var data = new AuthGetVerifyCodeOutput { Key = guid, Img = img };
             return ResponseOutput.Ok(data);
@@ -120,10 +117,10 @@ namespace Admin.Core.Service.Admin.Auth
             if (_appConfig.VarifyCode.Enable)
             {
                 var verifyCodeKey = string.Format(CacheKey.VerifyCodeKey, input.VerifyCodeKey);
-                var exists = await _cache.ExistsAsync(verifyCodeKey);
+                var exists = await Cache.ExistsAsync(verifyCodeKey);
                 if (exists)
                 {
-                    var verifyCode = await _cache.GetAsync(verifyCodeKey);
+                    var verifyCode = await Cache.GetAsync(verifyCodeKey);
                     if (string.IsNullOrEmpty(verifyCode))
                     {
                         return ResponseOutput.NotOk("验证码已过期!", 1);
@@ -132,7 +129,7 @@ namespace Admin.Core.Service.Admin.Auth
                     {
                         return ResponseOutput.NotOk("验证码输入有误!", 2);
                     }
-                    await _cache.DelAsync(verifyCodeKey);
+                    await Cache.DelAsync(verifyCodeKey);
                 }
                 else
                 {
@@ -157,16 +154,16 @@ namespace Admin.Core.Service.Admin.Auth
             if (input.PasswordKey.NotNull())
             {
                 var passwordEncryptKey = string.Format(CacheKey.PassWordEncryptKey, input.PasswordKey);
-                var existsPasswordKey = await _cache.ExistsAsync(passwordEncryptKey);
+                var existsPasswordKey = await Cache.ExistsAsync(passwordEncryptKey);
                 if (existsPasswordKey)
                 {
-                    var secretKey = await _cache.GetAsync(passwordEncryptKey);
+                    var secretKey = await Cache.GetAsync(passwordEncryptKey);
                     if (secretKey.IsNull())
                     {
                         return ResponseOutput.NotOk("解密失败!", 1);
                     }
                     input.Password = DesEncrypt.Decrypt(input.Password, secretKey);
-                    await _cache.DelAsync(passwordEncryptKey);
+                    await Cache.DelAsync(passwordEncryptKey);
                 }
                 else
                 {
@@ -192,7 +189,7 @@ namespace Admin.Core.Service.Admin.Auth
             }
 
             //登录清空用户缓存
-            await _cache.DelAsync(string.Format(CacheKey.UserInfo, user.Id));
+            await Cache.DelAsync(string.Format(CacheKey.UserInfo, user.Id));
 
             return ResponseOutput.Ok(authLoginOutput);
         }

+ 3 - 8
Admin.Core.Service/Admin/Cache/CacheService.cs

@@ -11,13 +11,8 @@ namespace Admin.Core.Service.Admin.Cache
 {
     public class CacheService : BaseService, ICacheService
     {
-        private readonly ICache _cache;
-        private readonly ILogger<CacheService> _logger;
-
-        public CacheService(ICache cache, ILogger<CacheService> logger)
+        public CacheService()
         {
-            _cache = cache;
-            _logger = logger;
         }
 
         public IResponseOutput List()
@@ -42,8 +37,8 @@ namespace Admin.Core.Service.Admin.Cache
 
         public async Task<IResponseOutput> ClearAsync(string cacheKey)
         {
-            _logger.LogWarning($"{User.Id}.{User.Name}清除缓存[{cacheKey}]");
-            await _cache.DelByPatternAsync(cacheKey);
+            Logger.LogWarning($"{User.Id}.{User.Name}清除缓存[{cacheKey}]");
+            await Cache.DelByPatternAsync(cacheKey);
             return ResponseOutput.Ok();
         }
     }

+ 1 - 4
Admin.Core.Service/Admin/Permission/PermissionService.cs

@@ -17,7 +17,6 @@ namespace Admin.Core.Service.Admin.Permission
     public class PermissionService : BaseService, IPermissionService
     {
         private readonly AppConfig _appConfig;
-        private readonly ICache _cache;
         private readonly IPermissionRepository _permissionRepository;
         private readonly IRoleRepository _roleRepository;
         private readonly IRolePermissionRepository _rolePermissionRepository;
@@ -25,7 +24,6 @@ namespace Admin.Core.Service.Admin.Permission
 
         public PermissionService(
             AppConfig appConfig,
-            ICache cache,
             IPermissionRepository permissionRepository,
             IRoleRepository roleRepository,
             IRolePermissionRepository rolePermissionRepository,
@@ -33,7 +31,6 @@ namespace Admin.Core.Service.Admin.Permission
         )
         {
             _appConfig = appConfig;
-            _cache = cache;
             _permissionRepository = permissionRepository;
             _roleRepository = roleRepository;
             _rolePermissionRepository = rolePermissionRepository;
@@ -226,7 +223,7 @@ namespace Admin.Core.Service.Admin.Permission
             }
 
             //Çå³ýȨÏÞ
-            await _cache.DelByPatternAsync(CacheKey.UserPermissions);
+            await Cache.DelByPatternAsync(CacheKey.UserPermissions);
 
             return ResponseOutput.Ok();
         }

+ 4 - 7
Admin.Core.Service/Admin/User/UserService.cs

@@ -20,7 +20,6 @@ namespace Admin.Core.Service.Admin.User
     /// </summary>
     public class UserService : BaseService, IUserService
     {
-        private readonly ICache _cache;
         private readonly AppConfig _appConfig;
         private readonly IUserRepository _userRepository;
         private readonly IUserRoleRepository _userRoleRepository;
@@ -28,7 +27,6 @@ namespace Admin.Core.Service.Admin.User
         private readonly ITenantRepository _tenantRepository;
 
         public UserService(
-            ICache cache,
             AppConfig appConfig,
             IUserRepository userRepository,
             IUserRoleRepository userRoleRepository,
@@ -36,7 +34,6 @@ namespace Admin.Core.Service.Admin.User
             ITenantRepository tenantRepository
         )
         {
-            _cache = cache;
             _appConfig = appConfig;
             _userRepository = userRepository;
             _userRoleRepository = userRoleRepository;
@@ -47,10 +44,10 @@ namespace Admin.Core.Service.Admin.User
         public async Task<ResponseOutput<AuthLoginOutput>> GetLoginUserAsync(long id)
         {
             var output = new ResponseOutput<AuthLoginOutput>();
-            var entityDto = await _userRepository.GetAsync<AuthLoginOutput>(id);
+            var entityDto = await _userRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(id).ToOneAsync<AuthLoginOutput>();
             if (_appConfig.Tenant)
             {
-                var tenant = await _tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(User.TenantId).ToOneAsync(a => new { a.TenantType, a.DataIsolationType });
+                var tenant = await _tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(entityDto.TenantId).ToOneAsync(a => new { a.TenantType, a.DataIsolationType });
                 output.Data.TenantType = tenant.TenantType;
                 output.Data.DataIsolationType = tenant.DataIsolationType;
             }
@@ -84,7 +81,7 @@ namespace Admin.Core.Service.Admin.User
         public async Task<IList<UserPermissionsOutput>> GetPermissionsAsync()
         {
             var key = string.Format(CacheKey.UserPermissions, User.Id);
-            var result = await _cache.GetOrSetAsync(key, async () =>
+            var result = await Cache.GetOrSetAsync(key, async () =>
             {
                 var userPermissoins = await _rolePermissionRepository.Select
                 .InnerJoin<UserRoleEntity>((a, b) => a.RoleId == b.RoleId && b.UserId == User.Id && a.Permission.Type == PermissionType.Api)
@@ -175,7 +172,7 @@ namespace Admin.Core.Service.Admin.User
             var result = (await _userRepository.UpdateAsync(entity)) > 0;
 
             //清除用户缓存
-            await _cache.DelAsync(string.Format(CacheKey.UserInfo, input.Id));
+            await Cache.DelAsync(string.Format(CacheKey.UserInfo, input.Id));
 
             return ResponseOutput.Result(result);
         }

+ 56 - 3
Admin.Core.Service/Base/BaseService.cs

@@ -1,11 +1,64 @@
 using Admin.Core.Common.Auth;
+using Admin.Core.Common.Cache;
 using AutoMapper;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Abstractions;
+using System;
 
 namespace Admin.Core.Service
 {
-    public abstract class BaseService
+    public abstract class BaseService: IBaseService
     {
-        public IUser User { get; set; }
-        public IMapper Mapper { get; set; }
+        protected readonly object ServiceProviderLock = new object();
+        private ICache _cache;
+        private ILoggerFactory _loggerFactory;
+        private IMapper _mapper;
+        private IUser _user;
+
+        /// <summary>
+        /// 缓存
+        /// </summary>
+        public ICache Cache => LazyGetRequiredService(ref _cache);
+
+        /// <summary>
+        /// 日志工厂
+        /// </summary>
+        public ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory);
+
+        /// <summary>
+        /// 映射
+        /// </summary>
+        public IMapper Mapper => LazyGetRequiredService(ref _mapper);
+
+        public IServiceProvider ServiceProvider { get; set; }
+
+        /// <summary>
+        /// 用户信息
+        /// </summary>
+        public IUser User => LazyGetRequiredService(ref _user);
+
+        /// <summary>
+        /// 日志
+        /// </summary>
+        protected ILogger Logger => _lazyLogger.Value;
+
+        private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true);
+
+        protected TService LazyGetRequiredService<TService>(ref TService reference)
+        {
+            if (reference == null)
+            {
+                lock (ServiceProviderLock)
+                {
+                    if (reference == null)
+                    {
+                        reference = ServiceProvider.GetRequiredService<TService>();
+                    }
+                }
+            }
+
+            return reference;
+        }
     }
 }

+ 7 - 0
Admin.Core.Service/Base/IBaseService.cs

@@ -0,0 +1,7 @@
+namespace Admin.Core.Service
+{
+    public abstract class IBaseService
+    {
+        
+    }
+}

+ 25 - 0
Admin.Core/Admin.Core.Service.xml

@@ -1733,5 +1733,30 @@
             说明
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.BaseService.Cache">
+            <summary>
+            缓存
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.BaseService.LoggerFactory">
+            <summary>
+            日志工厂
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.BaseService.Mapper">
+            <summary>
+            映射
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.BaseService.User">
+            <summary>
+            用户信息
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.BaseService.Logger">
+            <summary>
+            日志
+            </summary>
+        </member>
     </members>
 </doc>

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

@@ -54,9 +54,7 @@
     <PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.7" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.7" />
-    <PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
-    <PackageReference Include="NLog" Version="4.7.10" />
-    <PackageReference Include="NLog.Web.AspNetCore" Version="4.12.0" />
+    <PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />   
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.1.4" />
   </ItemGroup>