using Jaina; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; using HT.Cloud.Code; using HT.Cloud.Domain.SystemOrganize; using HT.Cloud.Domain.SystemSecurity; using HT.Cloud.Service.Event; using HT.Cloud.Service.SystemOrganize; using HT.Cloud.Service.SystemSecurity; namespace HT.Cloud.Web { /// /// 用户接口 /// [Route("api/[controller]/[action]")] [ApiExplorerSettings(GroupName = "Default")] [ApiController] public class UserController : ControllerBase { //自动注入服务 public FilterIPService _filterIPService { get; set; } public UserService _userService { get; set; } public LogService _logService { get; set; } public SystemSetService _setService { get; set; } public IHttpContextAccessor _httpContextAccessor { get; set; } #region 提交数据 /// /// 用户登录 /// /// 请求对象 /// [HttpPost] public async Task Login([FromBody] LoginRequest request) { var apitoken = Utils.GuId(); if (!string.IsNullOrEmpty(OperatorProvider.Provider.GetToken())) { apitoken = OperatorProvider.Provider.GetToken(); } LogEntity logEntity = new LogEntity(); logEntity.F_ModuleName = "用户Api"; logEntity.F_Type = DbLogType.Login.ToString(); try { if (!await CheckIP()) { throw new Exception("IP受限"); } UserEntity userEntity = await _userService.CheckLogin(request.userName, Md5.md5(request.password, 32), request.localurl); OperatorModel operatorModel = new OperatorModel(); operatorModel.UserId = userEntity.F_Id; operatorModel.UserCode = userEntity.F_Account; operatorModel.UserName = userEntity.F_RealName; operatorModel.CompanyId = userEntity.F_CompanyId; operatorModel.OrganizeId = userEntity.F_OrganizeId; operatorModel.RoleId = userEntity.F_RoleId; operatorModel.LoginIPAddress = WebHelper.Ip; if (GlobalContext.SystemConfig.LocalLAN != false) { operatorModel.LoginIPAddressName = "本地局域网"; } else { operatorModel.LoginIPAddressName = WebHelper.GetIpLocation(operatorModel.LoginIPAddress); } operatorModel.LoginTime = DateTime.Now; operatorModel.DdUserId = userEntity.F_DingTalkUserId; operatorModel.WxOpenId = userEntity.F_WxOpenId; operatorModel.IsAdmin = userEntity.F_IsAdmin.Value; operatorModel.IsBoss = userEntity.F_IsBoss.Value; operatorModel.IsLeaderInDepts = userEntity.F_IsLeaderInDepts.Value; operatorModel.IsSenior = userEntity.F_IsSenior.Value; SystemSetEntity setEntity = await _setService.GetForm(userEntity.F_CompanyId); operatorModel.DbNumber = setEntity.F_DbNumber; if (operatorModel.IsAdmin && operatorModel.DbNumber == GlobalContext.SystemConfig.MainDbNumber) { operatorModel.IsSuperAdmin = true; } else { operatorModel.IsSuperAdmin = false; } await OperatorProvider.Provider.AddLoginUser(operatorModel, apitoken, "api_"); logEntity.F_Account = userEntity.F_Account; logEntity.F_NickName = userEntity.F_RealName; logEntity.F_Result = true; logEntity.F_Description = "登录成功"; await GlobalContext.GetService().PublishAsync(new BaseEventSource("Log:create", logEntity, operatorModel)); // 设置刷新Token令牌 _httpContextAccessor.HttpContext.Response.Headers[GlobalContext.SystemConfig.TokenName] = apitoken; return new AlwaysResult { state = ResultType.success.ToString(), message = "登录成功。", data = apitoken }; } catch (Exception ex) { logEntity.F_Account = request.userName; logEntity.F_NickName = request.userName; logEntity.F_Result = false; logEntity.F_Description = "登录失败," + ex.Message; await GlobalContext.GetService().PublishAsync(new BaseEventSource("Log:create", logEntity)); return new AlwaysResult { state = ResultType.error.ToString(), message = ex.Message, data = apitoken }; } } private async Task CheckIP() { string ip = Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString(); return await _filterIPService.CheckIP(ip); } /// /// 用户退出登录 /// /// [HttpPost] [LoginFilter] public async Task LoginOff() { var logEntity = new LogEntity { F_ModuleName = "用户Api", F_Type = DbLogType.Exit.ToString(), F_Account = _userService.currentuser.UserCode, F_NickName = _userService.currentuser.UserName, F_Result = true, F_Description = "安全退出系统", }; await GlobalContext.GetService().PublishAsync(new BaseEventSource("Log:create", logEntity, _userService.currentuser)); await OperatorProvider.Provider.EmptyCurrent("api_"); return new AlwaysResult { state = ResultType.success.ToString() }; } #endregion 提交数据 #region 请求对象 /// /// 登录请求对象 /// public class LoginRequest { /// /// 用户名 /// [Required(ErrorMessage = "用户名不能为空")] public string userName { get; set; } /// /// 密码 /// [Required(ErrorMessage = "密码不能为空")] public string password { get; set; } /// /// 域名 /// public string localurl { get; set; } } #endregion 请求对象 } }