Files
HTCloud/HT.Cloud.Web/Controllers/Api/UserController.cs
2024-11-14 09:01:55 +08:00

170 lines
6.6 KiB
C#

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
{
/// <summary>
/// 用户接口
/// </summary>
[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
/// <summary>
/// 用户登录
/// </summary>
/// <param name="request">请求对象</param>
/// <returns></returns>
[HttpPost]
public async Task<AlwaysResult> 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.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<IEventPublisher>().PublishAsync(new BaseEventSource("Log:create", logEntity, operatorModel));
// 设置刷新Token令牌
_httpContextAccessor.HttpContext.Response.Headers[GlobalContext.SystemConfig.TokenName] = apitoken;
return new AlwaysResult<string> { 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<IEventPublisher>().PublishAsync(new BaseEventSource("Log:create", logEntity));
return new AlwaysResult<string> { state = ResultType.error.ToString(), message = ex.Message, data = apitoken };
}
}
private async Task<bool> CheckIP()
{
string ip = Request.HttpContext.Connection.LocalIpAddress.MapToIPv4().ToString();
return await _filterIPService.CheckIP(ip);
}
/// <summary>
/// 用户退出登录
/// </summary>
/// <returns></returns>
[HttpPost]
[LoginFilter]
public async Task<AlwaysResult> 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<IEventPublisher>().PublishAsync(new BaseEventSource("Log:create", logEntity, _userService.currentuser));
await OperatorProvider.Provider.EmptyCurrent("api_");
return new AlwaysResult { state = ResultType.success.ToString() };
}
#endregion
#region
/// <summary>
/// 登录请求对象
/// </summary>
public class LoginRequest
{
/// <summary>
/// 用户名
/// </summary>
[Required(ErrorMessage = "用户名不能为空")]
public string userName { get; set; }
/// <summary>
/// 密码
/// </summary>
[Required(ErrorMessage = "密码不能为空")]
public string password { get; set; }
/// <summary>
/// 域名
/// </summary>
public string localurl { get; set; }
}
#endregion
}
}