using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Ropin.Inspection.Api.Common; using Ropin.Inspection.Api.Common.Options; using Ropin.Inspection.Api.Common.Token; using Ropin.Inspection.Api.Wx; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using Ropin.Inspection.Model; using Ropin.Inspection.Service.Interface; using Ropin.Inspection.Model.ViewModel; using Ropin.Inspection.Model.SearchModel; using System.Net.Http.Headers; using Ropin.Inspection.Common.Helper; using Microsoft.AspNetCore.Http; using Ropin.Inspection.Service; using Ropin.Core.Extensions; using Ropin.Inspection.Service.SYS.Interface; using Ropin.Inspection.Model.ViewModel.SYS; using UAParser; using IPTools.Core; using Microsoft.Extensions.Caching.Memory; using Ropin.Core.Common; using Ropin.Core.Extensions.Redis; namespace Ropin.Inspection.Api.Controllers { public class AccountController : BaseController { private readonly WXOptions _options; private readonly ITsysUserService _userService; private readonly ITokenHelper _tokenHelper = null; private readonly IHttpClientFactory _httpClientFactory; private readonly ITmtnPushMsgToService _tmtnPushMsgToService; private readonly IPushMsgService _pushMsgService; private readonly ITsysRoleHandServices _roleHandServices; private readonly IsysLoginService _sysLoginService; private readonly RabbitMQModel _rabbitMQ; public AccountController(IOptionsMonitor rabbitMQ, IOptionsMonitor options, IPushMsgService pushMsgService, ITmtnPushMsgToService tmtnPushMsgToService, IHttpClientFactory httpClientFactory, ITsysUserService userService, ITokenHelper tokenHelper, ITsysRoleHandServices roleHandServices, IsysLoginService sysLoginService, IRedisBasketRepository redisService) { _options = options.Get("WXOptions"); _rabbitMQ = rabbitMQ.Get("RabbitMQModel"); _userService = userService; _tokenHelper = tokenHelper; _httpClientFactory = httpClientFactory; _tmtnPushMsgToService = tmtnPushMsgToService; _pushMsgService = pushMsgService; _roleHandServices = roleHandServices; _sysLoginService = sysLoginService; RedisLimitUserLogin._redisConnection = redisService; } /// /// 微信 /// /// [HttpGet("GetWX/{loginCode}")] [AllowAnonymous] public async Task GetWX(string loginCode) { if (string.IsNullOrEmpty(loginCode)) { return new ApiResult(ReturnCode.ArgsError, "loginCode空值"); } Code2Session session = null; string url = string.Format(_options.Code2Session, _options.AppId, _options.Secret, loginCode); //using (var client = _httpClientFactory.CreateClient()) //{ // using var res = client.GetAsync(url); // if (res.Result.StatusCode == System.Net.HttpStatusCode.OK) // { // var str = res.Result.Content.ReadAsStringAsync().Result; // session = JsonConvert.DeserializeObject(str); // } //} using (var client = _httpClientFactory.CreateClient()) { var requestt = new HttpRequestMessage(HttpMethod.Get, url); requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = await client.SendAsync(requestt); if (response.IsSuccessStatusCode) { var strReturn = await response.Content.ReadAsStringAsync(); session = JsonConvert.DeserializeObject(strReturn); } Console.WriteLine(response); } if (session == null) { return new ApiResult(ReturnCode.LoginError, "session空值"); } if (string.IsNullOrEmpty(session.Openid)) { return new ApiResult(ReturnCode.LoginError, "Openid空值"); } //session.Openid = "ox1D95f2CfZQVkIqYTsNgrwBpKD8"; //小程序返回的Openid验证 TsysUserSearchModel userSearchModel = new TsysUserSearchModel { WxOpenId = session.Openid }; TsysUserViewModel user = _userService.GetUser(userSearchModel); if (null == user) { LoginReturnInfo ReInfo = new LoginReturnInfo { ReturnCode = 101, OpenId = session.Openid }; //return new ApiResult(session.Openid, ReturnCode.PasswordLogin); return new ApiResult(ReInfo, ReturnCode.Success); } TsysUserDetailViewModel user2 = await _userService.GetUserDetailByAsync(new LoginModel { Mobile = user.C_Mobile, Password = user.C_Password }); var token = _tokenHelper.CreateToken(user2); if (null == token) { return new ApiResult(ReturnCode.TokenError, "获取Token异常"); } LoginReturnInfo Info; //if (user.C_Password == "e10adc3949ba59abbe56e057f20f883e") // Info = new LoginReturnInfo { ReturnCode = 102, ReturnToken = token,OpenId = session.Openid }; //else Info = new LoginReturnInfo { ReturnCode = 100, ReturnToken = token, OpenId = session.Openid }; // 获取用户的IP地址 string ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString(); // 获取浏览器信息 string userAgent = Request.Headers["User-Agent"].ToString(); var clientAgent = Parser.GetDefault().Parse(userAgent); var browser = $"{clientAgent.UA.Family} {clientAgent.UA.Major}.{clientAgent.UA.Minor} / {clientAgent.Device.Family}"; var os = $"{clientAgent.OS.Family} {clientAgent.OS.Major} {clientAgent.OS.Minor}"; (string ipLocation, double? longitude, double? latitude) = GetIpAddress(ipAddress); sysLoginViewModel sysLogin = new sysLoginViewModel(); sysLogin.C_IP = ipAddress; sysLogin.C_UserName = user.C_Name; sysLogin.C_AccountNumber = user.C_Mobile; sysLogin.C_Type = "SYS_PRIV_MODULE_002"; sysLogin.C_Address = ipLocation; sysLogin.C_Browser = browser; sysLogin.C_OS = os; sysLogin.C_Role = user.UserRole.ToString(); sysLogin.C_LicenseCode = user.C_LicenseCode; sysLogin.C_CreateBy = user.C_UserID.ToString(); sysLogin.D_CreateOn = DateTime.Now; sysLogin.C_Status = "1"; sysLogin.C_OperationInfo = "登录成功!"; await _sysLoginService.CreateOneAsync(sysLogin); return new ApiResult(Info, ReturnCode.Success); } /// /// 登录 /// /// /// [HttpPost("Login")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] public async Task Login(LoginModel viewModel) { try { var IsUser = await _userService.IsExistByMobileAsync(viewModel.Mobile); if (!IsUser) { return new ApiResult(ReturnCode.LoginError, "账户不存在!"); } var isLock = await RedisLimitUserLogin.IsForbidden(viewModel.Mobile); if (isLock) { return new ApiResult(ReturnCode.LoginError, $"账户已锁定,请{RedisLimitUserLogin.LockTime}分钟后在试"); } // 获取用户的IP地址 string ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString(); // 获取浏览器信息 string userAgent = Request.Headers["User-Agent"].ToString(); var client = Parser.GetDefault().Parse(userAgent); var browser = $"{client.UA.Family} {client.UA.Major}.{client.UA.Minor} / {client.Device.Family}"; var os = $"{client.OS.Family} {client.OS.Major} {client.OS.Minor}"; (string ipLocation, double? longitude, double? latitude) = GetIpAddress(ipAddress); sysLoginViewModel sysLogin = new sysLoginViewModel(); sysLogin.C_IP = ipAddress; sysLogin.C_Address = ipLocation; sysLogin.C_Browser = browser; sysLogin.C_OS = os; sysLogin.C_AccountNumber = viewModel.Mobile; sysLogin.C_Type = viewModel.PrivModule; sysLogin.D_CreateOn = DateTime.Now; #region 测试 //new WeChatHelper(_httpClientFactory).PushMessageToUser(); #endregion var user = await _userService.GetUserDetailByAsync(viewModel); if (null == user) { int loseNumber=await RedisLimitUserLogin.SetFailCounter(viewModel.Mobile); var userMode = await _userService.GetByMobileAsync(viewModel.Mobile); sysLogin.C_UserName = userMode?.C_Name; sysLogin.C_Role = userMode?.UserRole.ToString(); sysLogin.C_LicenseCode = userMode?.C_LicenseCode; sysLogin.C_CreateBy = userMode?.C_UserID.ToString(); sysLogin.C_Status = "0"; string msg = $"账号或密码不正确,输入错误{loseNumber} 次!"; if (loseNumber== RedisLimitUserLogin.MaxAttempts) { msg = $"错误{loseNumber}次,{RedisLimitUserLogin.LockTime}分钟后再许可登录!"; } sysLogin.C_OperationInfo = msg; await _sysLoginService.CreateOneAsync(sysLogin); return new ApiResult(ReturnCode.LoginError, msg); } RedisLimitUserLogin.UnLock(viewModel.Mobile); if (user.RoleTypePrivS==null|| user.RoleTypePrivS.Count()==0) { return new ApiResult(ReturnCode.LoginPriv, "没有权限"); } if (!string.IsNullOrEmpty(viewModel.OpenId)) { await _userService.UpdateUserOpenIdAsync(user.C_UserID, viewModel.OpenId); } Guid roleId= Guid.Parse(user.RoleIds); var roleHand = await _roleHandServices.GetRoleHandListAsync(roleId); user.RoleHandList = roleHand; var token = _tokenHelper.CreateToken(user); sysLogin.C_UserName = user.C_Name; sysLogin.C_Role = user.RoleIds; sysLogin.C_LicenseCode = user.C_LicenseCode; sysLogin.C_CreateBy = user.C_UserID.ToString(); if (null == token) { sysLogin.C_Status = "0"; sysLogin.C_OperationInfo = "登录失败!"; await _sysLoginService.CreateOneAsync(sysLogin); return new ApiResult(ReturnCode.TokenError, "获取Token异常"); } sysLogin.C_Status = "1"; sysLogin.C_OperationInfo = "登录成功!"; await _sysLoginService.CreateOneAsync(sysLogin); return new ApiResult(token, ReturnCode.Success); } catch (Exception ex) { return new ApiResult(ReturnCode.GeneralError, ex.Message); } } /// /// 登出 /// /// [HttpPost("LogOut")] public async Task LogOutByAsync() { try { // 获取用户的IP地址 string ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString(); // 获取浏览器信息 string userAgent = Request.Headers["User-Agent"].ToString(); var client = Parser.GetDefault().Parse(userAgent); var browser = $"{client.UA.Family} {client.UA.Major}.{client.UA.Minor} / {client.Device.Family}"; var os = $"{client.OS.Family} {client.OS.Major} {client.OS.Minor}"; (string ipLocation, double? longitude, double? latitude) = GetIpAddress(ipAddress); sysLoginViewModel sysLogin = new sysLoginViewModel(); sysLogin.C_IP = ipAddress; sysLogin.C_Type = ""; sysLogin.C_Address = ipLocation; sysLogin.C_Browser = browser; sysLogin.C_OS = os; sysLogin.C_Status = "1"; sysLogin.C_OperationInfo = "退出系统!"; await _sysLoginService.CreateOneAsync(sysLogin); await _userService.LogOutByAsync(); return new ApiResult(ReturnCode.Success); } catch (Exception ex) { return new ApiResult(ReturnCode.GeneralError, ex.Message); } } /// /// 测试推送消息,通过Token(可行) /// /// [HttpPost("PushMessageByTokenAsync/{userWechatId}/{msg}/{token}")] [AllowAnonymous] public ApiResult PushMessageByTokenAsync(string userWechatId, string msg, string token) { try { //var content = new //{ // thing2 = new { value = "niu" ?? "" }, // time4 = new { value = DateTime.Now.ToString("yyyy-MM-dd hh:mm") }, // thing5 = new { value = "异常" ?? "" }, // thing6 = new { value = "大门损坏" ?? "" }, // thing9 = new { value = msg ?? "" } //}; var content = new { character_string1 = new { value = "123456" ?? "" }, thing2 = new { value = "niu" ?? "" }, thing16 = new { value = "大门损坏" ?? "" }, time5 = new { value = DateTime.Now.ToString("yyyy-MM-dd hh:mm") }, thing6 = new { value = "msg" ?? "" } }; new WeChatHelper(_httpClientFactory).SubMessageToUser(userWechatId,token,null, content); return new ApiResult(ReturnCode.Success); } catch (Exception ex) { return new ApiResult(ReturnCode.GeneralError, ex.Message); } } /// /// 测试推送消息,通过Wechat(可行) /// /// /// /// [HttpPost("PushMessageByWechatIdAsync/{userWechatId}/{msg}")] [AllowAnonymous] public ApiResult PushMessageByWechatIdAsync(string userWechatId, string msg) { try { //var content = new //{ // character_string1 = new { value = "123456" ?? "" }, // thing2 = new { value = "niu" ?? "" }, // thing16 = new { value = "大门损坏" ?? "" }, // time5 = new { value = DateTime.Now.ToString("yyyy-MM-dd hh:mm") }, // thing6 = new { value = msg ?? "" } //}; var content = new { character_string1 = new { value = "123456" ?? "" }, time2 = new { value = DateTime.Now.ToString("yyyy-MM-dd hh:mm") }, short_thing3 = new { value = "告警类型" ?? "" } }; string templateId = WXConstModel.WatchHealthAlarm_TemplateId; new WeChatHelper(_httpClientFactory).PushMessageToUser(new List() { userWechatId }, content,templateId); return new ApiResult(ReturnCode.Success); } catch (Exception ex) { return new ApiResult(ReturnCode.GeneralError, ex.Message); } } /// /// 测试推送消息,通过devId(可行) /// /// /// /// [HttpPost("PushMessageByDevIdAsync/{msg}/{devId}")] [AllowAnonymous] [HttpIdempotent(WaitMillisecond = 20000)] public async Task PushMessageByDevIdAsync(string msg, string devId) { try { //_tmtnPushMsgToService.PushAlarmMsgAsync(new TpushMsgModel //{ // C_DevStoreCode = devId, // C_MsgTypeCode = "MSG_TYPE_001", // Msg = msg, // Subject = "压力表维修通知" //}); await _pushMsgService.PushAlarmMsgAsync(new TpushMsgModel { C_DevStoreCode = devId, C_MsgTypeCode = "MSG_TYPE_023", Msg = msg, Subject = "测试推送消息", DevNumber = "boxId:", DevName = "sadf", }); return new ApiResult(ReturnCode.Success); } catch (Exception ex) { return new ApiResult(ReturnCode.GeneralError, ex.Message); } } /// /// 测试发送邮件 /// /// /// [HttpPost("EmailTest/{email}")] [AllowAnonymous] public async Task EmailTest(string email) { string msg = "

设备编号:20250226

" + "

设备名称:设备DevName

" + "

消息内容:测试Email发送消息

" ; var bols = EmailHelper.SendEmail(email, "测试发送邮件", "测试", msg); if (bols) { return new ApiResult(ReturnCode.Success); } else { return new ApiResult(ReturnCode.GeneralError); } } /// /// 多次提交 /// /// /// [HttpPost("OrderAsync/{orderNo}")] [HttpIdempotent(WaitMillisecond = 10000, CacheMillisecond = 3000)] [AllowAnonymous] public async Task OrderAsync(string orderNo) { //TODO //return Content("你好"); return await Task.FromResult(Ok(new { TotalCount = 10, TotalPages = 2, Orders = orderNo })) ; } /// /// 公共推送 /// /// /// [HttpPost("PublicPushMessage")] [AllowAnonymous] public async Task PublicPushMessage(TpushMsgModel pushMsg) { if (pushMsg == null || string.IsNullOrEmpty(pushMsg.C_MsgTypeCode) || string.IsNullOrEmpty(pushMsg.C_DevStoreCode)) { return new ApiResult(ReturnCode.ArgsError); } try { _rabbitMQ.QueueName = "rab.video.record.mqtt"; //消息队列名称 bool result= await _pushMsgService.PushAlarmMsgAsync(pushMsg,pushMsg.Subject, _rabbitMQ); if (result) { return new ApiResult(ReturnCode.Success); } else { return new ApiResult(ReturnCode.GeneralError); } } catch (Exception ex) { return new ApiResult(ReturnCode.GeneralError, ex.Message); } } /// /// 解析IP地址 /// /// /// [NonAction] internal static (string ipLocation, double? longitude, double? latitude) GetIpAddress(string ip) { try { var ipInfo = IpTool.Search(ip); var addressList = new List() { ipInfo.Country, ipInfo.Province, ipInfo.City, ipInfo.NetworkOperator }; return (string.Join("|", addressList.Where(it => it != "0").ToList()), ipInfo.Longitude, ipInfo.Latitude); // 去掉0并用|连接 } catch(Exception ex) { // 不做处理 } return ("未知", 0, 0); } } }