From c8175d10903e3dc752ec7bd34238b94471e50622 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=81=B0=E7=81=B0?= Date: Fri, 21 Oct 2022 14:26:00 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BF=AE=E5=A4=8D=E3=80=91=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=97=A5=E5=8E=86=E7=AD=BE=E5=88=B0=E8=BF=9E=E7=BB=AD?= =?UTF-8?q?=E7=AD=BE=E5=88=B0=E7=9A=84=E7=BB=9F=E8=AE=A1=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E5=A2=9E=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AD=BE=E5=88=B0redis=E9=94=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CoreCmsUserCheckInDetailsServices.cs | 32 ++++++++- .../Controllers/CheckInController.cs | 67 ++++++++++++------- 2 files changed, 74 insertions(+), 25 deletions(-) diff --git a/CoreCms.Net.Services/CheckIn/CoreCmsUserCheckInDetailsServices.cs b/CoreCms.Net.Services/CheckIn/CoreCmsUserCheckInDetailsServices.cs index eaa7c6c2..3d5886c8 100644 --- a/CoreCms.Net.Services/CheckIn/CoreCmsUserCheckInDetailsServices.cs +++ b/CoreCms.Net.Services/CheckIn/CoreCmsUserCheckInDetailsServices.cs @@ -67,15 +67,45 @@ namespace CoreCms.Net.Services var jm = new AdminUiCallBack(); try { + var dt = DateTime.Now; + var dtStr = dt.ToString("yyyy-MM-dd"); + var checkDataStr = entity.checkInData.ToString("yyyy-MM-dd"); + if (dtStr != checkDataStr) + { + jm.msg = "签到日期不符,签到提交日期非今日"; + return jm; + } var id = await _dal.InsertAsync(entity); var userCheckIn = await _userCheckInServices.QueryByClauseAsync(p => p.userId == entity.userId); if (userCheckIn != null) { - userCheckIn.continuousCheckInCount += 1; + //累计签到 userCheckIn.cumulativeCheckInCount += 1; + //判断是否是连续签到 + //判断是否是连续签到逻辑是:获取用户最后一次的签到记录,检查查询到的签到记录的checkInData是不是昨天的checkInData,是的话就是连续签到,continuousCheckInCount++,不是的话就是断签了,continuousCheckInCount设置成1重新开始就行了。 + var lastCheck = await _dal.QueryByClauseAsync(p => p.id < id, true); + if (lastCheck == null) + { + userCheckIn.continuousCheckInCount = 1; + } + else + { + var yesterdayDataStr = dt.AddDays(-1).ToString("yyyy-MM-dd"); + var lastCheckDataStr = lastCheck.checkInData.ToString("yyyy-MM-dd"); + if (yesterdayDataStr == lastCheckDataStr) + { + //累加 + userCheckIn.continuousCheckInCount += 1; + } + else + { + //重置 + userCheckIn.continuousCheckInCount = 1; + } + } await _userCheckInServices.UpdateAsync(userCheckIn); } else diff --git a/CoreCms.Net.Web.WebApi/Controllers/CheckInController.cs b/CoreCms.Net.Web.WebApi/Controllers/CheckInController.cs index a65fd650..2ad9ac60 100644 --- a/CoreCms.Net.Web.WebApi/Controllers/CheckInController.cs +++ b/CoreCms.Net.Web.WebApi/Controllers/CheckInController.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using CoreCms.Net.Auth.HttpContextUser; +using CoreCms.Net.Caching.AutoMate.RedisCache; +using CoreCms.Net.Configuration; using CoreCms.Net.IRepository; using CoreCms.Net.IServices; using CoreCms.Net.Model.Entities; @@ -22,17 +25,17 @@ namespace CoreCms.Net.Web.WebApi.Controllers { private readonly ICoreCmsUserCheckInDetailsServices _userCheckInDetailsServices; private readonly IHttpContextUser _user; + private readonly IRedisOperationRepository _redisOperationRepository; - //简单的异步锁 - private readonly AsyncLock _mutex = new AsyncLock(); /// /// 构造函数 /// - public CheckInController(IHttpContextUser user, ICoreCmsUserCheckInDetailsServices userCheckInDetailsServices) + public CheckInController(IHttpContextUser user, ICoreCmsUserCheckInDetailsServices userCheckInDetailsServices, IRedisOperationRepository redisOperationRepository) { _user = user; _userCheckInDetailsServices = userCheckInDetailsServices; + _redisOperationRepository = redisOperationRepository; } @@ -44,27 +47,48 @@ namespace CoreCms.Net.Web.WebApi.Controllers [Authorize] public async Task DoUserCheckIn([FromBody] FMDoUserCheckIn entity) { - using (await _mutex.LockAsync()) + var jm = new WebApiCallBack(); + + var lockKey = "LOCK_DoUserCheckIn:user_" + _user.ID; + var lockHolder = Guid.NewGuid().ToString("N"); //锁持有者 + var redisUserLock = await _redisOperationRepository.LockTakeAsync(lockKey, lockHolder, TimeSpan.FromSeconds(5)); + if (redisUserLock) { - var jm = new WebApiCallBack(); - var isHave = await _userCheckInDetailsServices.ExistsAsync(p => p.userId == _user.ID && p.checkInData == entity.date); - if (isHave) + try { - jm.msg = "今日您已签到"; + var isHave = await _userCheckInDetailsServices.ExistsAsync(p => p.userId == _user.ID && p.checkInData == entity.date); + if (isHave) + { + jm.msg = "今日您已签到"; + return jm; + } + var detail = new CoreCmsUserCheckInDetails + { + userId = _user.ID, + checkInData = entity.date, + createTime = DateTime.Now + }; + var callBack = await _userCheckInDetailsServices.DoCheckIn(detail); + jm.status = callBack.code == 0; + jm.msg = callBack.msg; + jm.data = callBack.data; return jm; } - var detail = new CoreCmsUserCheckInDetails + catch (Exception e) { - userId = _user.ID, - checkInData = entity.date, - createTime = DateTime.Now - }; - var callBack = await _userCheckInDetailsServices.DoCheckIn(detail); - jm.status = callBack.code == 0; - jm.msg = callBack.msg; - jm.data = callBack.data; - return jm; + jm.msg = "数据处理异常"; + jm.otherData = e; + } + finally + { + await _redisOperationRepository.LockReleaseAsync(lockKey, lockHolder); + } } + else + { + jm.msg = "当前请求太频繁_请稍后再试"; + } + return jm; } /// @@ -101,12 +125,7 @@ namespace CoreCms.Net.Web.WebApi.Controllers var list = await _userCheckInDetailsServices.QueryListByClauseAsync(p => p.userId == _user.ID && p.checkInData > min && p.checkInData < max); - var stringArr = new List(); - foreach (var item in list) - { - var stringStr = item.checkInData.ToString("yyyy-MM-dd"); - stringArr.Add(stringStr); - } + var stringArr = list.Select(item => item.checkInData.ToString("yyyy-MM-dd")).ToList(); jm.status = true; jm.data = stringArr;