Uat_Study
he 2023-04-28 14:43:02 +08:00
commit 38629114b6
8 changed files with 121 additions and 37 deletions

View File

@ -8,6 +8,9 @@ using Panda.DynamicWebApi.Attributes;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Microsoft.Extensions.Caching.Memory; 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 namespace IRaCIS.Application.Services
{ {
@ -613,6 +616,37 @@ namespace IRaCIS.Application.Services
[NonDynamicMethod] [NonDynamicMethod]
public async Task<IResponseOutput<LoginReturnDTO>> Login(string userName, string password) public async Task<IResponseOutput<LoginReturnDTO>> Login(string userName, string password)
{ {
const string cachePrefix = "login-failures:";
const int maxFailures = 3;
const int lockoutMinutes = 1;
// 生成缓存键
string cacheKey = $"{cachePrefix}{userName}";
// 从缓存中获取登录失败次数
int? failCount = _cache.Get<int?>(cacheKey);
if (failCount == null)
{
failCount = 0;
}
//每次登录 都重置缓存时间
_cache.Set(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes));
if (failCount >= maxFailures)
{
throw new BusinessValidationFailedException($"密码连续错误3次,当前账号已被限制登录,请等待 {lockoutMinutes} 分钟后再试。");
}
var userLoginReturnModel = new LoginReturnDTO(); var userLoginReturnModel = new LoginReturnDTO();
@ -620,21 +654,32 @@ namespace IRaCIS.Application.Services
if (loginUser == null) if (loginUser == null)
{ {
//此处下面 代码 为了支持医生也能登录 而且前端不加选择到底是管理用户 还是医生用户 奇怪的需求 无法理解
var loginDoctor = await _doctorRepository.Where(u => u.Phone == userName && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); #region 屏蔽代码,现在没用到
////此处下面 代码 为了支持医生也能登录 而且前端不加选择到底是管理用户 还是医生用户 奇怪的需求 无法理解
if (loginDoctor == null) //var loginDoctor = await _doctorRepository.Where(u => u.Phone == userName && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
{
return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO());
} //if (loginDoctor == null)
//{
userLoginReturnModel.BasicInfo = loginDoctor; // return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO());
//}
//userLoginReturnModel.BasicInfo = loginDoctor;
//登录 清除缓存 //登录 清除缓存
_cache.Remove(userLoginReturnModel.BasicInfo.Id.ToString()); //_cache.Remove(userLoginReturnModel.BasicInfo.Id.ToString());
return ResponseOutput.Ok(userLoginReturnModel); //return ResponseOutput.Ok(userLoginReturnModel);
#endregion
//错误次数累加
failCount++;
_cache.Set(cacheKey, failCount, TimeSpan.FromMinutes(lockoutMinutes));
return ResponseOutput.NotOk(_localizer["User_CheckNameOrPw"], new LoginReturnDTO());
} }
@ -644,6 +689,12 @@ namespace IRaCIS.Application.Services
return ResponseOutput.NotOk(_localizer["User_Disabled"], new LoginReturnDTO()); return ResponseOutput.NotOk(_localizer["User_Disabled"], new LoginReturnDTO());
} }
//登录成功 清除缓存
_cache.Set(cacheKey, 0, TimeSpan.FromMinutes(lockoutMinutes));
userLoginReturnModel.BasicInfo = loginUser; userLoginReturnModel.BasicInfo = loginUser;
// 登录 清除缓存 // 登录 清除缓存
@ -652,5 +703,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;
//}
} }
} }

View File

@ -125,7 +125,8 @@ namespace IRaCIS.Core.Application.Service
Id = subjectCriteriaEvaluation.Id, Id = subjectCriteriaEvaluation.Id,
TrialReadingCriterionId = inQuery.TrialReadingCriterionId, 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, IsJoinEvaluation = subjectCriteriaEvaluation.IsJoinEvaluation,

View File

@ -640,7 +640,7 @@ namespace IRaCIS.Core.Application
AdditionalAssessment additional = new AdditionalAssessment(); AdditionalAssessment additional = new AdditionalAssessment();
var addTypeList = additional.GetSystemDefeaultAdditionalAssessmentList(updateItem.CriterionType, updateItem.AdditionalAssessmentType); 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) foreach (var addType in addTypeList)
{ {

View File

@ -121,10 +121,6 @@ namespace IRaCIS.Core.Domain.Models
public Subject Subject { get; set; } public Subject Subject { get; set; }
[JsonIgnore]
public SubjectCriteriaEvaluationVisitFilter SubjectCriteriaEvaluationVisitFilter { get; set;}
[JsonIgnore] [JsonIgnore]
public List<TaskMedicalReview> TaskMedicalReviewList { get; set; } public List<TaskMedicalReview> TaskMedicalReviewList { get; set; }

View File

@ -24,6 +24,9 @@ namespace IRaCIS.Core.Domain.Models
[ForeignKey("TrialReadingCriterionId")] [ForeignKey("TrialReadingCriterionId")]
public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; } public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; }
[JsonIgnore]
public List<SubjectCriteriaEvaluationVisitFilter> SubjectCriteriaEvaluationVisitFilterList { get; set; }
/// <summary> /// <summary>
/// SubjectId /// SubjectId
/// </summary> /// </summary>
@ -67,8 +70,7 @@ namespace IRaCIS.Core.Domain.Models
public DateTime UpdateTime { get; set; } public DateTime UpdateTime { get; set; }
[JsonIgnore]
public List<SubjectCriteriaEvaluationVisitFilter> SubjectCriteriaEvaluationVisitFilterList { get; set; }

View File

@ -18,12 +18,14 @@ namespace IRaCIS.Core.Domain.Models
public class SubjectCriteriaEvaluationVisitFilter : Entity, IAuditUpdate, IAuditAdd public class SubjectCriteriaEvaluationVisitFilter : Entity, IAuditUpdate, IAuditAdd
{ {
[JsonIgnore] //[JsonIgnore]
public List<VisitTask> SubjectCriterionTaskList { get; set; } //public List<VisitTask> SubjectCriterionTaskList { get; set; }
[JsonIgnore] [JsonIgnore]
[ForeignKey("TrialReadingCriterionId")] [ForeignKey("TrialReadingCriterionId")]
public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; } public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; }
[JsonIgnore] [JsonIgnore]
public SubjectCriteriaEvaluation SubjectCriteriaEvaluation { get; set; } public SubjectCriteriaEvaluation SubjectCriteriaEvaluation { get; set; }

View File

@ -12,6 +12,8 @@ namespace IRaCIS.Core.Domain.Models
[Table("Subject")] [Table("Subject")]
public class Subject : Entity, IAuditAdd, IAuditUpdate, ISoftDelete public class Subject : Entity, IAuditAdd, IAuditUpdate, ISoftDelete
{ {
[JsonIgnore] [JsonIgnore]
public List<SubjectVisit> SubjectVisitList { get; set; } = new List<SubjectVisit>(); public List<SubjectVisit> SubjectVisitList { get; set; } = new List<SubjectVisit>();
[JsonIgnore] [JsonIgnore]

View File

@ -36,18 +36,18 @@ namespace IRaCIS.Core.Infra.EFCore.EntityConfigration
} }
} }
public class SubjectCriteriaEvaluationVisitFilterConfigration : IEntityTypeConfiguration<SubjectCriteriaEvaluationVisitFilter> //public class SubjectCriteriaEvaluationVisitFilterConfigration : IEntityTypeConfiguration<SubjectCriteriaEvaluationVisitFilter>
{ //{
public void Configure(EntityTypeBuilder<SubjectCriteriaEvaluationVisitFilter> builder) // public void Configure(EntityTypeBuilder<SubjectCriteriaEvaluationVisitFilter> builder)
{ // {
builder // builder
.HasMany(s => s.SubjectCriterionTaskList) // .HasMany(s => s.SubjectCriterionTaskList)
.WithOne(c => c.SubjectCriteriaEvaluationVisitFilter) // .WithOne(c => c.SubjectCriteriaEvaluationVisitFilter)
.HasForeignKey(s => new { s.SubjectId, s.TrialReadingCriterionId }) // .HasForeignKey(s => new { s.SubjectId, s.TrialReadingCriterionId })
.HasPrincipalKey(c => new { c.SubjectId, c.TrialReadingCriterionId }); // .HasPrincipalKey(c => new { c.SubjectId, c.TrialReadingCriterionId });
} // }
} //}
} }