using OASystem.Infrastructure.Repositories.Login;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using OASystem.Domain.Dtos.UserDto;
using OASystem.API.OAMethodLib;
using Serilog.Parsing;
using OASystem.Domain.Dtos.System;
using System.Drawing.Drawing2D;
using System.Collections;
namespace OASystem.API.Controllers
{
///
/// 鉴权相关
///
[Route("api/")]
public class AuthController : ControllerBase
{
private readonly IMapper _mapper;
private readonly IConfiguration _config;
private readonly LoginRepository _loginRep;
private readonly MessageRepository _message;
private readonly SystemMenuPermissionRepository _SystemMenuPermissionRepository;
public AuthController(IConfiguration config, LoginRepository loginRep, IMapper mapper,MessageRepository message,
SystemMenuPermissionRepository systemMenuPermissionRepository)
{
_config = config;
_loginRep = loginRep;
_mapper = mapper;
_message = message;
_SystemMenuPermissionRepository = systemMenuPermissionRepository;
}
///
/// 用户登录
///
///
///
[Route("login")]
[HttpPost]
[ProducesResponseType(typeof(LoginView), StatusCodes.Status200OK)]
public async Task LoginAsync(LoginDto dto)
{
#region 校验用户信息
var userData = _loginRep.Login(dto).Result;
if (userData.Code != 0)
{
if (userData.Code != 0) { return Ok(JsonView(false, userData.Msg)); }
return Ok(JsonView(false, "暂无该员工信息!"));
}
#endregion
Result authData = null;
if (userData.Data != null)
{
var uid = (userData.Data as UserLoginInfoView).UserId;
authData = _SystemMenuPermissionRepository.QueryMenuLoad(uid, dto.PortType);
}
var view = new LoginView
{
UserInfo = userData == null ? null : userData.Data,
AuthData = authData == null ? null : authData.Data,
};
DateTime createZebraTime = DateTime.Now;
string authorId = dto.Number + "Token";
string authorToken = await RedisRepository.RedisFactory.CreateRedisRepository().StringGetAsync(authorId);//string 取
if (authorToken != null)
{
#region 解析出过期时间
var jwtHandler = new JwtSecurityTokenHandler();
JwtSecurityToken securityToken = jwtHandler.ReadJwtToken(authorToken);
DateTime expDt = (securityToken.Payload[JwtRegisteredClaimNames.Exp] ?? 0).GetInt().GetTimeSpmpToDate();
#endregion
if (expDt >= createZebraTime) //超时重新获取token
{
authorToken = GeneralMethod.GetToken(_config, dto.Number, createZebraTime);
}
view.Expires = expDt;
view.Token = authorToken;
}
else
{
view.Expires = createZebraTime.AddMinutes(30);
view.Token = GeneralMethod.GetToken(_config, dto.Number, createZebraTime);
TimeSpan ts = view.Expires.AddMinutes(-1) - createZebraTime; //设置redis 过期时间 比 jwt 时间 快一分钟
await RedisRepository.RedisFactory.CreateRedisRepository().StringSetAsync(authorId, view.Token, ts);//string 存
}
#region 测试添加系统消息
//await _message.AddMsg(new MessageDto()
//{
// Type = 1,
// IssuerId = 208,
// Title = "测试添加消息标题",
// Content = "消息体测试",
// ReleaseTime = DateTime.Now,
// UIdList = new List {
// 5,
// 208,
// 219
// }
//});
#endregion
return Ok(JsonView(view));
}
///
/// 申请注册
///
///
///
[Authorize]
[HttpPost]
[Route("register")]
public async Task Register(RegisterDto dto)
{
var userData = _loginRep.Register(_loginRep, dto);
if (userData.Result.Code != 0)
{
if (userData.Result.Code != 0) { return Ok(JsonView(false, userData.Result.Msg)); }
return Ok(JsonView(false, "注册失败!"));
}
return Ok(new { Code = 0, Msg = userData.Result.Msg });
}
///
/// 修改密码
///
///
///
[Authorize]
[HttpPost]
[Route("UpdPassword")]
public async Task UpdateUserPassword(UpdateDto dto)
{
Result result = new Result();
Sys_Users sys_Users = _mapper.Map(dto);
var _UpdateState = await _loginRep.UpdateAsync(s => s.Id == dto.UserId, ss => sys_Users);
if (_UpdateState)
{
result.Code = 0;
result.Msg = "申请成功!人事主管审核后且信息部经理分配了登录账号,可登录OA!";
}
else
{
result.Code = -2;
result.Msg = "用户修改失败!";
}
return Ok(JsonView(result));
}
///
/// 测试auth
///
///
///
[OASystemAuthentication]
[HttpPost("TestToken")]
[ProducesResponseType(typeof(LoginView), StatusCodes.Status200OK)]
public async Task TestToken(LoginDto dto)
{
string authorId = dto.Number + "Token";
// 从Redis里面取数据
//string userToken = _redis.StringGet(authorId);
string userToken = "";
var view = new LoginView
{
Token = authorId + ":" + userToken
};
return Ok(JsonView(view));
}
}
}