From 9901eb83ad2a063434cb59635612b0e374de2b37 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 28 Apr 2023 09:43:53 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E9=99=84=E5=8A=A0=E8=AF=84=E4=BC=B0?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=BF=BD=E7=95=A5=E8=BF=87=E6=BB=A4=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/TrialSiteUser/TrialConfigService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index 6d583a687..630ce5576 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -640,7 +640,7 @@ namespace IRaCIS.Core.Application AdditionalAssessment additional = new AdditionalAssessment(); var addTypeList = additional.GetSystemDefeaultAdditionalAssessmentList(updateItem.CriterionType, updateItem.AdditionalAssessmentType); - if(! await _readingQuestionTrialRepository.AnyAsync(t => t.ReadingQuestionCriterionTrialId == updateItem.TrialReadingCriterionId && t.IsAdditional==true)) + if(!await _readingQuestionTrialRepository.AsQueryable().IgnoreQueryFilters().AnyAsync(t => t.ReadingQuestionCriterionTrialId == updateItem.TrialReadingCriterionId && t.IsAdditional==true)) { foreach (var addType in addTypeList) { From bca9993e68e06fdd94247aa170b118d61804223f Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 28 Apr 2023 13:45:08 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 14 +++ .../Service/Management/UserService.cs | 94 +++++++++++++++++-- .../SubjectCriteriaEvaluationVisitFilter.cs | 4 +- .../TrialSiteConfigration.cs | 22 ++--- 4 files changed, 111 insertions(+), 23 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 9d5f6a754..0baba4a08 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -1492,6 +1492,13 @@ + + + 获取新病灶评估 + + + + @@ -1501,6 +1508,13 @@ + + + 获取新病灶评估 + + + + 删除病灶获取起始病灶序号 diff --git a/IRaCIS.Core.Application/Service/Management/UserService.cs b/IRaCIS.Core.Application/Service/Management/UserService.cs index 94fb79e87..10a01e0cb 100644 --- a/IRaCIS.Core.Application/Service/Management/UserService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserService.cs @@ -8,6 +8,9 @@ using Panda.DynamicWebApi.Attributes; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; using Microsoft.Extensions.Caching.Memory; +using IRaCIS.Core.Infra.Common.Cache; +using Microsoft.Identity.Client; +using static IRaCIS.Core.Domain.Share.StaticData; namespace IRaCIS.Application.Services { @@ -613,6 +616,38 @@ namespace IRaCIS.Application.Services [NonDynamicMethod] public async Task> Login(string userName, string password) { + + //const string cachePrefix = "login-failures:"; + //const int maxFailures = 3; + //const int lockoutMinutes = 3; + + //// 生成缓存键 + //string cacheKey = $"{cachePrefix}{userName}"; + + //// 从缓存中获取登录失败次数 + //int? failCount = _cache.Get(cacheKey); + + + //if (failCount != null) + //{ + + // _cache.Set(cacheKey + ":locked", true, TimeSpan.FromMinutes(lockoutMinutes)); + + // if (failCount >= maxFailures) + // { + // throw new BusinessValidationFailedException($"账号已被锁定,请等待 {lockoutMinutes} 分钟后再试。"); + // } + + //} + + //if (failCount >= maxFailures) + //{ + // // 如果登录失败次数达到了 3 次,则锁定用户 + // _cache.Set(cacheKey + ":locked", true, TimeSpan.FromMinutes(lockoutMinutes)); + //} + + + var userLoginReturnModel = new LoginReturnDTO(); @@ -620,21 +655,30 @@ namespace IRaCIS.Application.Services if (loginUser == null) { - //此处下面 代码 为了支持医生也能登录 而且前端不加选择到底是管理用户 还是医生用户 奇怪的需求 无法理解 - var loginDoctor = await _doctorRepository.Where(u => u.Phone == userName && u.Password == password).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); + #region 屏蔽代码,现在没用到 + ////此处下面 代码 为了支持医生也能登录 而且前端不加选择到底是管理用户 还是医生用户 奇怪的需求 无法理解 - if (loginDoctor == null) - { - return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO()); + //var loginDoctor = await _doctorRepository.Where(u => u.Phone == userName && u.Password == password).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); - } + //if (loginDoctor == null) + //{ + // return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO()); + //} + //userLoginReturnModel.BasicInfo = loginDoctor; + + //登录 清除缓存 + //_cache.Remove(userLoginReturnModel.BasicInfo.Id.ToString()); + //return ResponseOutput.Ok(userLoginReturnModel); + + #endregion + + + + + return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO()); - userLoginReturnModel.BasicInfo = loginDoctor; - // 登录 清除缓存 - _cache.Remove(userLoginReturnModel.BasicInfo.Id.ToString()); - return ResponseOutput.Ok(userLoginReturnModel); } @@ -652,5 +696,35 @@ namespace IRaCIS.Application.Services } + + + + //private bool loginIsLocked(string userName) + //{ + + // //if (failCount == null) + // //{ + // // failCount = 0; + // //} + // //else + // //{ + // // failCount++; + // //} + + // //// 更新缓存中的登录失败次数 + // //_cache.Set(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes)); + + // //if (failCount >= maxFailures) + // //{ + // // // 如果登录失败次数达到了 3 次,则锁定用户 + // // _cache.Set(cacheKey + ":locked", true, TimeSpan.FromMinutes(lockoutMinutes)); + // //} + + + + + // //return isLocked; + //} + } } diff --git a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs index baeef00f4..b3cf7171b 100644 --- a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs +++ b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs @@ -18,9 +18,9 @@ namespace IRaCIS.Core.Domain.Models public class SubjectCriteriaEvaluationVisitFilter : Entity, IAuditUpdate, IAuditAdd { - [JsonIgnore] + //[JsonIgnore] - public List SubjectCriterionTaskList { get; set; } + //public List SubjectCriterionTaskList { get; set; } [JsonIgnore] [ForeignKey("TrialReadingCriterionId")] public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; } diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs index 2bfb1dbca..1306cbbf3 100644 --- a/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/TrialSiteConfigration.cs @@ -36,18 +36,18 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration } } - public class SubjectCriteriaEvaluationVisitFilterConfigration : IEntityTypeConfiguration - { + //public class SubjectCriteriaEvaluationVisitFilterConfigration : IEntityTypeConfiguration + //{ - public void Configure(EntityTypeBuilder builder) - { - builder - .HasMany(s => s.SubjectCriterionTaskList) - .WithOne(c => c.SubjectCriteriaEvaluationVisitFilter) - .HasForeignKey(s => new { s.SubjectId, s.TrialReadingCriterionId }) - .HasPrincipalKey(c => new { c.SubjectId, c.TrialReadingCriterionId }); + // public void Configure(EntityTypeBuilder builder) + // { + // builder + // .HasMany(s => s.SubjectCriterionTaskList) + // .WithOne(c => c.SubjectCriteriaEvaluationVisitFilter) + // .HasForeignKey(s => new { s.SubjectId, s.TrialReadingCriterionId }) + // .HasPrincipalKey(c => new { c.SubjectId, c.TrialReadingCriterionId }); - } - } + // } + //} } From 2eecca60f0264c378256d20856f824bb4a0dc3c9 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 28 Apr 2023 14:09:12 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=8F=82=E4=B8=8E=E8=AF=84=E4=BC=B0bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdditionalEvaluate/SubjectCriteriaEvaluationService.cs | 3 ++- IRaCIS.Core.Domain/Allocation/VisitTask.cs | 4 ---- .../Reading/AdditionalEvaluate/SubjectCriteriaEvaluation.cs | 6 ++++-- .../SubjectCriteriaEvaluationVisitFilter.cs | 2 ++ IRaCIS.Core.Domain/Visit/Subject.cs | 2 ++ 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs index 5338cedf1..e7e9a8882 100644 --- a/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs +++ b/IRaCIS.Core.Application/Service/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationService.cs @@ -125,7 +125,8 @@ namespace IRaCIS.Core.Application.Service Id = subjectCriteriaEvaluation.Id, TrialReadingCriterionId = inQuery.TrialReadingCriterionId, - IsImageFiltering = subjectCriteriaEvaluation.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.ImageFilterState == ImageFilterState.None), + IsImageFiltering = subject.SubjectCriteriaEvaluationVisitFilterList.Any(t => t.TrialReadingCriterionId== inQuery.TrialReadingCriterionId + && t.ImageFilterState == ImageFilterState.None), IsJoinEvaluation = subjectCriteriaEvaluation.IsJoinEvaluation, diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index 5e070eb5b..1f4ebc15f 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -121,10 +121,6 @@ namespace IRaCIS.Core.Domain.Models public Subject Subject { get; set; } - [JsonIgnore] - - public SubjectCriteriaEvaluationVisitFilter SubjectCriteriaEvaluationVisitFilter { get; set;} - [JsonIgnore] public List TaskMedicalReviewList { get; set; } diff --git a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluation.cs b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluation.cs index 1a6fcafca..e7432ddcb 100644 --- a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluation.cs +++ b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluation.cs @@ -24,6 +24,9 @@ namespace IRaCIS.Core.Domain.Models [ForeignKey("TrialReadingCriterionId")] public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; } + [JsonIgnore] + public List SubjectCriteriaEvaluationVisitFilterList { get; set; } + /// /// SubjectId /// @@ -67,8 +70,7 @@ namespace IRaCIS.Core.Domain.Models public DateTime UpdateTime { get; set; } - [JsonIgnore] - public List SubjectCriteriaEvaluationVisitFilterList { get; set; } + diff --git a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs index b3cf7171b..91f03106c 100644 --- a/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs +++ b/IRaCIS.Core.Domain/Reading/AdditionalEvaluate/SubjectCriteriaEvaluationVisitFilter.cs @@ -24,6 +24,8 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] [ForeignKey("TrialReadingCriterionId")] public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; } + + [JsonIgnore] public SubjectCriteriaEvaluation SubjectCriteriaEvaluation { get; set; } diff --git a/IRaCIS.Core.Domain/Visit/Subject.cs b/IRaCIS.Core.Domain/Visit/Subject.cs index 66a00fed3..0ad19bb43 100644 --- a/IRaCIS.Core.Domain/Visit/Subject.cs +++ b/IRaCIS.Core.Domain/Visit/Subject.cs @@ -12,6 +12,8 @@ namespace IRaCIS.Core.Domain.Models [Table("Subject")] public class Subject : Entity, IAuditAdd, IAuditUpdate, ISoftDelete { + + [JsonIgnore] public List SubjectVisitList { get; set; } = new List(); [JsonIgnore] From 5f119d6f0e8e306e0d28a3ce2141b51da09ed5da Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 28 Apr 2023 14:33:39 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=99=90=E5=88=B6?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Management/UserService.cs | 67 ++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Management/UserService.cs b/IRaCIS.Core.Application/Service/Management/UserService.cs index 10a01e0cb..fef36d73e 100644 --- a/IRaCIS.Core.Application/Service/Management/UserService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserService.cs @@ -85,7 +85,7 @@ namespace IRaCIS.Application.Services if (oldPwd != null && oldPwd == newPwd) { - //---新密码与旧密码相同。 + //---新密码与旧密码相同。 throw new BusinessValidationFailedException(_localizer["User_NewOldPwdSame"]); } @@ -94,13 +94,13 @@ namespace IRaCIS.Application.Services if (oldPwd != null && dbUser.Password != oldPwd) { - //---旧密码验证失败。 + //---旧密码验证失败。 throw new BusinessValidationFailedException(_localizer["User_OldPwdInvalid"]); } if (dbUser.Password == newPwd) { - //---新密码与旧密码相同。 + //---新密码与旧密码相同。 throw new BusinessValidationFailedException(_localizer["User_NewOldPwdSame"]); } @@ -159,7 +159,7 @@ namespace IRaCIS.Application.Services //检查验证码是否失效 if (verificationRecord.ExpirationTime < DateTime.Now) { - //---验证码已经过期。 + //---验证码已经过期。 return ResponseOutput.NotOk(_localizer["User_VerificationCodeExpired"]); } @@ -361,7 +361,7 @@ namespace IRaCIS.Application.Services if (verificationRecord.ExpirationTime < DateTime.Now) { - //---验证码已经过期。 + //---验证码已经过期。 throw new BusinessValidationFailedException(_localizer["User_VerificationCodeExpired"]); } else //验证码正确 并且 没有超时 @@ -465,7 +465,7 @@ namespace IRaCIS.Application.Services public async Task> GetUserList(UserListQueryDTO param) { var userQueryable = _userRepository.Where(x => x.UserTypeEnum != UserTypeEnum.SuperAdmin) - .WhereIf(!string.IsNullOrWhiteSpace(param.UserName), t => t.UserName.Contains(param.UserName) ) + .WhereIf(!string.IsNullOrWhiteSpace(param.UserName), t => t.UserName.Contains(param.UserName)) .WhereIf(!string.IsNullOrWhiteSpace(param.RealName), t => t.FullName.Contains(param.RealName)) .WhereIf(!string.IsNullOrWhiteSpace(param.Phone), t => t.Phone.Contains(param.Phone)) .WhereIf(!string.IsNullOrWhiteSpace(param.OrganizationName), t => t.OrganizationName.Contains(param.OrganizationName)) @@ -617,34 +617,33 @@ namespace IRaCIS.Application.Services public async Task> Login(string userName, string password) { - //const string cachePrefix = "login-failures:"; - //const int maxFailures = 3; - //const int lockoutMinutes = 3; + const string cachePrefix = "login-failures:"; + const int maxFailures = 3; + const int lockoutMinutes = 1; - //// 生成缓存键 - //string cacheKey = $"{cachePrefix}{userName}"; + // 生成缓存键 + string cacheKey = $"{cachePrefix}{userName}"; - //// 从缓存中获取登录失败次数 - //int? failCount = _cache.Get(cacheKey); + // 从缓存中获取登录失败次数 + int? failCount = _cache.Get(cacheKey); - //if (failCount != null) - //{ + if (failCount == null) + { + failCount = 0; + } + + //每次登录 都重置缓存时间 + _cache.Set(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes)); + + + + if (failCount >= maxFailures) + { + throw new BusinessValidationFailedException($"密码连续错误3次,当前账号已被限制登录,请等待 {lockoutMinutes} 分钟后再试。"); + } - // _cache.Set(cacheKey + ":locked", true, TimeSpan.FromMinutes(lockoutMinutes)); - // if (failCount >= maxFailures) - // { - // throw new BusinessValidationFailedException($"账号已被锁定,请等待 {lockoutMinutes} 分钟后再试。"); - // } - - //} - - //if (failCount >= maxFailures) - //{ - // // 如果登录失败次数达到了 3 次,则锁定用户 - // _cache.Set(cacheKey + ":locked", true, TimeSpan.FromMinutes(lockoutMinutes)); - //} @@ -674,7 +673,9 @@ namespace IRaCIS.Application.Services #endregion - + //错误次数累加 + failCount++; + _cache.Set(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes)); return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO()); @@ -688,6 +689,12 @@ namespace IRaCIS.Application.Services return ResponseOutput.NotOk(_localizer["User_Disabled"], new LoginReturnDTO()); } + + //登录成功 清除缓存 + _cache.Set(cacheKey, 0, TimeSpan.FromMinutes(lockoutMinutes)); + + + userLoginReturnModel.BasicInfo = loginUser; // 登录 清除缓存 @@ -721,7 +728,7 @@ namespace IRaCIS.Application.Services // //} - + // //return isLocked; //}