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;
//}