using Infrastructure; using Infrastructure.Attribute; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Localization; using UAParser; using DOAN.Common; using DOAN.Model; using DOAN.Model.System; using DOAN.Model.System.Dto; using DOAN.Repository; using DOAN.ServiceCore.Model.Dto; using DOAN.ServiceCore.Resources; namespace DOAN.ServiceCore.Services { /// /// 登录 /// [AppService(ServiceType = typeof(ISysLoginService), ServiceLifetime = LifeTime.Transient)] public class SysLoginService : BaseService, ISysLoginService { private readonly ISysUserService SysUserService; private readonly IHttpContextAccessor httpContextAccessor; private readonly IStringLocalizer _localizer; public SysLoginService( ISysUserService sysUserService, IHttpContextAccessor httpContextAccessor, IStringLocalizer localizer) { SysUserService = sysUserService; this.httpContextAccessor = httpContextAccessor; _localizer = localizer; } /// /// 登录验证 /// /// /// /// public SysUser Login(LoginBodyDto loginBody, SysLogininfor logininfor) { if (loginBody.Password.Length != 32) { loginBody.Password = NETCore.Encrypt.EncryptProvider.Md5(loginBody.Password); } SysUser user = SysUserService.Login(loginBody); logininfor.UserName = loginBody.Username; logininfor.Status = "1"; logininfor.LoginTime = DateTime.Now; logininfor.Ipaddr = loginBody.LoginIP; logininfor.ClientId = loginBody.ClientId; ClientInfo clientInfo = httpContextAccessor.HttpContext.GetClientInfo(); logininfor.Browser = clientInfo.ToString(); logininfor.Os = clientInfo.OS.ToString(); if (user == null || user.UserId <= 0) { logininfor.Msg = _localizer["login_pwd_error"].Value; AddLoginInfo(logininfor); throw new CustomException(ResultCode.LOGIN_ERROR, logininfor.Msg, false); } logininfor.UserId = user.UserId; if (user.Status == 1) { logininfor.Msg = _localizer["login_user_disabled"].Value;//該用戶已禁用 AddLoginInfo(logininfor); throw new CustomException(ResultCode.LOGIN_ERROR, logininfor.Msg, false); } logininfor.Status = "0"; logininfor.Msg = "登录成功"; AddLoginInfo(logininfor); SysUserService.UpdateLoginInfo(loginBody.LoginIP, user.UserId); return user; } /// /// 登录验证 /// /// /// /// /// public SysUser PhoneLogin(PhoneLoginDto loginBody, SysLogininfor logininfor, SysUser user) { logininfor.UserName = user.UserName; logininfor.Status = "1"; logininfor.LoginTime = DateTime.Now; logininfor.Ipaddr = loginBody.LoginIP; ClientInfo clientInfo = httpContextAccessor.HttpContext.GetClientInfo(); logininfor.Browser = clientInfo.ToString(); logininfor.Os = clientInfo.OS.ToString(); if (user.Status == 1) { logininfor.Msg = _localizer["login_user_disabled"].Value; AddLoginInfo(logininfor); throw new CustomException(ResultCode.LOGIN_ERROR, logininfor.Msg, false); } logininfor.Status = "0"; logininfor.Msg = "登录成功"; AddLoginInfo(logininfor); SysUserService.UpdateLoginInfo(loginBody.LoginIP, user.UserId); return user; } /// /// 查询登录日志 /// /// /// public PagedInfo GetLoginLog(SysLogininfoQueryDto logininfoDto) { var exp = Expressionable.Create(); exp.AndIF(logininfoDto.BeginTime == null, it => it.LoginTime >= DateTime.Now.ToShortDateString().ParseToDateTime()); exp.AndIF(logininfoDto.BeginTime != null, it => it.LoginTime >= logininfoDto.BeginTime && it.LoginTime <= logininfoDto.EndTime); exp.AndIF(logininfoDto.UserId != null, it => it.UserId == logininfoDto.UserId); exp.AndIF(logininfoDto.Status.IfNotEmpty(), f => f.Status == logininfoDto.Status); exp.AndIF(logininfoDto.Ipaddr.IfNotEmpty(), f => f.Ipaddr == logininfoDto.Ipaddr); exp.AndIF(logininfoDto.UserName.IfNotEmpty(), f => f.UserName.Contains(logininfoDto.UserName)); var query = Queryable().Where(exp.ToExpression()) .OrderBy(it => it.InfoId, OrderByType.Desc); return query.ToPage(logininfoDto); } /// /// 记录登录日志 /// /// /// public void AddLoginInfo(SysLogininfor sysLogininfor) { Insert(sysLogininfor); } /// /// 清空登录日志 /// public void TruncateLogininfo() { Truncate(); } /// /// 删除登录日志 /// /// /// public int DeleteLogininforByIds(long[] ids) { return Delete(ids); } public void CheckLockUser(string userName) { var lockTimeStamp = CacheService.GetLockUser(userName); var lockTime = DateTimeHelper.ToLocalTimeDateBySeconds(lockTimeStamp); var ts = lockTime - DateTime.Now; if (lockTimeStamp > 0 && ts.TotalSeconds > 0) { throw new CustomException(ResultCode.LOGIN_ERROR, $"你的账号已被锁,剩余{Math.Round(ts.TotalMinutes, 0)}分钟"); } } public List GetStatiLoginlog() { var time = DateTime.Now; //如果是查询当月那么 time就是 DateTime.Now var days = (time.AddMonths(1) - time).Days;//获取当月天数 var dayArray = Enumerable.Range(1, days).Select(it => Convert.ToDateTime(time.ToString("yyyy-MM-" + it))).ToList();//转成时间数组 var queryableLeft = Context.Reportable(dayArray) .ToQueryable(); var queryableRight = Context.Queryable(); var list = Context.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x2.LoginTime.ToString("yyyy-MM-dd") == x1.ColumnName.ToString("yyyy-MM-dd")) .GroupBy((x1, x2) => x1.ColumnName) .Where((x1, x2) => x1.ColumnName >= DateTime.Now.AddDays(-7) && x1.ColumnName <= DateTime.Now) .Select((x1, x2) => new StatiLoginLogDto() { DeRepeatNum = SqlFunc.AggregateDistinctCount(x2.Ipaddr), Num = SqlFunc.AggregateCount(x2.InfoId), Date = x1.ColumnName, }) .Mapper(it => { it.WeekName = Tools.GetWeekByDate(it.Date);//相当于ToList循环赋值 }).ToList(); return list; } } }