From 0c9a162284878860b78eff1fdad6a4a5337624af Mon Sep 17 00:00:00 2001 From: 移动系统liao <liaoxujun@qq.com> Date: 星期四, 21 八月 2025 13:17:37 +0800 Subject: [PATCH] 修正用户API相关参数 --- Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs | 274 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 266 insertions(+), 8 deletions(-) diff --git a/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs index b4f00fe..252f050 100644 --- a/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs +++ b/Admin.NET/FZCTB.NET.API.Application/Auth/AuthService.cs @@ -1,10 +1,23 @@ -锘縰sing Furion.DynamicApiController; +锘縰sing Admin.NET.Core; +using Admin.NET.Core.Service; +using cylsg.utility.Extend; +using Furion; +using Furion.DataEncryption; +using Furion.DynamicApiController; +using Furion.EventBus; +using Furion.FriendlyException; +using FZCTB.NET.API.Application.Auth.DTO; +using FZCZTB.NET.MD.CutomerMd; +using FZCZTB.NET.MD.CutomerMd.Extend; +using FZCZTB.NET.SYSService.MSM; +using Lazy.Captcha.Core; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using NewLife; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; namespace FZCTB.NET.API.Application.Auth { @@ -12,7 +25,252 @@ /// 閴存潈鏈嶅姟 /// </summary> [ApiDescriptionSettings("FZCAPISYS", Order = 149)] - public class AuthService: IDynamicApiController + public class AuthService : IDynamicApiController { + private readonly ICaptcha _captcha; + private readonly IEventPublisher _eventPublisher; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly SMSConfigOptions _smsOptions; + private readonly SysCacheService _sysCacheService; + private readonly SysConfigService _sysConfigService; + private readonly SqlSugarRepository<FBS_ExRole> _sysExRol; + private readonly SysLdapService _sysLdapService; + private readonly SysMenuService _sysMenuService; + private readonly SysOnlineUserService _sysOnlineUserService; + private readonly ZCSMSService _sysSmsService; + private readonly SqlSugarRepository<FBS_CoutomerExRole> _sysUserExRol; + private readonly SqlSugarRepository<FBS_CustormerUsers> _sysUserRep; + private readonly SysUserService _sysUserService; + public AuthService( + SqlSugarRepository<FBS_CustormerUsers> sysUserRep, + SqlSugarRepository<FBS_CoutomerExRole> sysUserExRol, + IHttpContextAccessor httpContextAccessor, + SysOnlineUserService sysOnlineUserService, + SysConfigService sysConfigService, + SysLdapService sysLdapService, + IEventPublisher eventPublisher, + ZCSMSService sysSmsService, + SysCacheService sysCacheService, + SysMenuService sysMenuService, + SysUserService sysUserService, + IOptions<SMSConfigOptions> smsConfigOptions, + SqlSugarRepository<FBS_ExRole> exrel, + + ICaptcha captcha + + ) + { + _captcha = captcha; + _sysUserRep = sysUserRep; + + _sysSmsService = sysSmsService; + _eventPublisher = eventPublisher; + _sysUserService = sysUserService; + _sysMenuService = sysMenuService; + _sysCacheService = sysCacheService; + _sysConfigService = sysConfigService; + _httpContextAccessor = httpContextAccessor; + _sysOnlineUserService = sysOnlineUserService; + _sysLdapService = sysLdapService; + _smsOptions = smsConfigOptions.Value; + _sysExRol = exrel; + _sysUserExRol = sysUserExRol; + } + + /// <summary> + /// 鍒囨崲瑙掕壊 宸茬櫥褰曡繘鍘昏鑹叉垨鑰呭垏鎹㈣鑹叉槸璋冪敤锛岄渶瑕佹浛鎹oken,鐩稿綋浜庣櫥褰� + /// </summary> + [DisplayName("鍒囨崲瑙掕壊")] + public async Task<CustomerLoginOutput> ChangeLogoInExRule(string RuleCode) + { + var id = App.User.FindFirst(ClaimConst.UserId)?.Value.ToLong() ?? 0; + if (id == 0) + { + throw Oops.Oh("鐢ㄦ埛鍑瘉閿欒"); + } + var rols = await _sysExRol.GetFirstAsync(x => x.Code == RuleCode && x.Status == StatusEnum.Enable); + if (rols == null) + throw Oops.Oh("瑙掕壊宸茬粡涓嬬嚎"); + + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + var user = await _sysUserRep.AsQueryable().Where(x => x.Id == id).FirstAsync(); + if (user == null) + { + throw Oops.Oh("璇ョ敤鎴锋病鏈夋敞鍐�"); + } + if (user.IsEn == false) + { + throw Oops.Oh("鐢ㄥ紓甯�"); + } + var exr = await _sysUserExRol.GetFirstAsync(x => x.CusExtendId == user.CusExtendId && x.ExRoleId == rols.Id); + if (exr == null) + throw Oops.Oh("娌℃湁鐢宠璇ヨ鑹�"); + + return await CreateToken(user, RuleCode); + } + + /// <summary> + /// 鎵嬫満鍙风櫥褰� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [AllowAnonymous] + [DisplayName("鎵嬫満鍙风櫥褰�")] + public virtual async Task<CustomerLoginOutput> LoginPhone([Required] CustomerLoginPhoneInput input) + { + if (input.Id > 0) + { + //鏈�鍚庝竴娆$‘璁ょ櫥闄嗙姸鎬� + var verifyCode = _sysCacheService.Get<string>($"{CacheConst.KeyPhoneVerCode}{input.Phone}"); + if (string.IsNullOrWhiteSpace(verifyCode)) throw Oops.Oh("楠岃瘉鐮佷笉瀛樺湪鎴栧凡澶辨晥锛岃閲嶆柊鑾峰彇锛�"); + + _sysCacheService.Remove($"{CacheConst.KeyPhoneVerCode}{input.Phone}"); + if (verifyCode != input.Code) + throw Oops.Oh("鐧诲綍鐮佸け鏁�"); + var user = await _sysUserRep.AsQueryable().Where(x => x.Id == input.Id && x.IsEn == true).FirstAsync(); + if (user == null) + throw Oops.Oh("娌℃湁鎵惧埌璇ユ墜鏈虹敤鎴�"); + return await CreateToken(user, input.ExRuleCode ?? ""); + } + if (input.Code != "TEST") + // 鏍¢獙鐭俊楠岃瘉鐮� + _sysSmsService.VerifyCode(new SmsVerifyCodeInput { Phone = input.Phone, Code = input.Code }); + + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + // 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + var userList = await _sysUserRep.AsQueryable().Where(x => x.PhoneNumber == input.Phone && x.IsEn == true).Includes(x => x.CusExtend).ToListAsync(); + if (userList == null) + { + throw Oops.Oh("娌℃湁鎵惧埌璇ユ墜鏈虹敤鎴�"); + } + if (userList.Count > 1) + { + // 鐢熸垚闅忔満楠岃瘉鐮� + var random = new Random(); + var verifyCode = random.Next(100000, 999999); + //闇�瑕佷簩娆$櫥闄� + var aRet = new CustomerLoginOutput + { + TheLastLogo = false, + CustomerExs = new List<CustomerExVm>(), + Code = verifyCode.ToString(), + }; + _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{input.Phone}", verifyCode.ToString(), TimeSpan.FromSeconds(_smsOptions.lingKai.VerifyTimeOut.ToInt())); + foreach (var item in userList) + { + aRet.CustomerExs.Add(new CustomerExVm + { + CustomerUserID = item.Id, + EnterpriseName = item.CusExtend.EnterpriseName, + UnifiedSocialCreditCode = item.CusExtend.UnifiedSocialCreditCode.MaskMiddle(), + IsManger = item.IsManager + + + + + }); + } + return aRet; + } + + return await CreateToken(userList[0], input.ExRuleCode ?? ""); + } + /// <summary> + /// 鎵嬫満鍙风櫥褰� 馃敄 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + [AllowAnonymous] + [DisplayName("寰俊鎵爜鐧诲綍")] + public virtual async Task<CustomerLoginOutput> WeiXinLoginPhone([Required] CustomerLoginPhoneInput input) + { + throw Oops.Oh("鏆傛椂涓嶆敮鎸佸井淇℃壂鐮佺櫥褰�"); + // 鏍¢獙鐭俊楠岃瘉鐮� + //_sysSmsService.VerifyCode(new SmsVerifyCodeInput { Phone = input.Phone, Code = input.Code }); + + //// 鑾峰彇鐧诲綍绉熸埛鍜岀敤鎴� + //var user = await _sysUserRep.AsQueryable().Where(x=>x.Account==input.Phone).Includes(x => x.CoutomerExRols, y => y.ExRole).FirstAsync(); + //if(user==null) + //{ + //} + + //return await CreateToken(user, input.ExRuleCode ); + } + + /// <summary> + /// 鐢熸垚Token浠ょ墝 馃敄 + /// </summary> + /// <param name="user"></param>\ + /// <param name="sysUserEventTypeEnum"></param>\ + /// <returns></returns> + [NonAction] + internal async Task<CustomerLoginOutput> CreateToken(FBS_CustormerUsers user, string ExRuleCode, SysUserEventTypeEnum sysUserEventTypeEnum = SysUserEventTypeEnum.Login) + { + // 鍗曠敤鎴风櫥褰� + await _sysOnlineUserService.SingleLogin(user.Id); + + // 鐢熸垚Token浠ょ墝 + var tokenExpire = await _sysConfigService.GetTokenExpire(); + var accessToken = JWTEncryption.Encrypt(new Dictionary<string, object> + { + { ClaimConst.UserId, user.Id }, + { ClaimConst.TenantId, user.CusExtendId }, + { ClaimConst.Account, user.PhoneNumber.PrivacyStr() }, + { ClaimConst.RealName, user.Nickname??user.Name }, + + { ClaimConst.UserType, "Customer" }, + { ClaimConst.CustomerExId, user.CusExtendId }, + { ClaimConst.CustomerLogoinType, ExRuleCode }, + }, tokenExpire); + + // 鐢熸垚鍒锋柊Token浠ょ墝 + var refreshTokenExpire = await _sysConfigService.GetRefreshTokenExpire(); + var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, refreshTokenExpire); + + // 璁剧疆鍝嶅簲鎶ユ枃澶� + _httpContextAccessor.HttpContext.SetTokensOfResponseHeaders(accessToken, refreshToken); + + // Swagger Knife4UI-AfterScript鐧诲綍鑴氭湰 + // ke.global.setAllHeader('Authorization', 'Bearer ' + ke.response.headers['access-token']); + + // 鏇存柊鐢ㄦ埛鐧诲綍淇℃伅 + user.LastLoginIp = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4(true); + (user.LastLoginAddress, double? longitude, double? latitude) = CommonUtil.GetIpAddress(user.LastLoginIp); + user.LastLoginTime = DateTime.Now; + user.LastLoginDevice = CommonUtil.GetClientDeviceInfo(_httpContextAccessor.HttpContext?.Request?.Headers?.UserAgent); + await _sysUserRep.AsUpdateable(user).UpdateColumns(u => new + { + u.LastLoginIp, + u.LastLoginAddress, + u.LastLoginTime, + u.LastLoginDevice, + }).ExecuteCommandAsync(); + + var payload = new + { + Entity = user, + Output = new CustomerLoginOutput + { + AccessToken = accessToken, + RefreshToken = refreshToken, + TheLastLogo = true, + IsManager = user.IsManager + } + }; + payload.Output.ExRoles = new List<CustomerExRoleVm>(); + + payload.Output.ExRoles = await _sysUserExRol.AsQueryable().Where(x => x.CusExtendId == user.CusExtendId).Includes(x => x.ExRole).Select(x => new CustomerExRoleVm + { + Code = x.ExRole.Code, + HasFlsh = x.steps == CusExtendStep.Pass, + Name = x.ExRole.Name + }).ToListAsync(); + + //鏆傛椂涓嶅嚭鐢ㄦ埛浜嬩欢 + // 鍙戝竷绯荤粺鐢ㄦ埛鎿嶄綔浜嬩欢 + //await _eventPublisher.PublishAsync(sysUserEventTypeEnum, payload); + return payload.Output; + } } -} +} \ No newline at end of file -- Gitblit v1.9.1