using Hei.Captcha;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Yi.Framework.Common.Const;
using Yi.Framework.Common.Enum;
using Yi.Framework.Common.Helper;
using Yi.Framework.Common.Models;
using Yi.Framework.Core;
using Yi.Framework.DTOModel;
using Yi.Framework.Interface;
using Yi.Framework.Model.Models;
using Yi.Framework.Repository;
using Yi.Framework.WebCore;
using Yi.Framework.WebCore.AttributeExtend;
using Yi.Framework.WebCore.AuthorizationPolicy;
namespace Yi.Framework.ApiMicroservice.Controllers
{
///
/// 账户管理
///
[ApiController]
[Authorize]
[Route("api/[controller]/[action]")]
public class AccountController : ControllerBase
{
private IUserService _iUserService;
private JwtInvoker _jwtInvoker;
private ILogger _logger;
private SecurityCodeHelper _securityCode;
private IRepository _repository;
private CacheInvoker _cacheDb;
public AccountController(ILogger logger, IUserService iUserService, JwtInvoker jwtInvoker, SecurityCodeHelper securityCode,CacheInvoker cacheInvoker)
{
_iUserService = iUserService;
_jwtInvoker = jwtInvoker;
_logger = logger;
_securityCode = securityCode;
_repository = iUserService._repository;
_cacheDb = cacheInvoker;
}
///
/// 重置管理员CC的密码
///
///
[HttpGet]
[AllowAnonymous]
public async Task RestCC()
{
var user = await _iUserService._repository.GetFirstAsync(u => u.UserName == "cc");
user.Password = "123456";
user.BuildPassword();
await _iUserService._repository.UpdateIgnoreNullAsync(user);
return Result.Success();
}
///
/// 没啥说,登录
///
///
///
[AllowAnonymous]
[HttpPost]
public async Task Login(LoginDto loginDto)
{
//跳过,需要redis缓存获取uuid与code的关系,进行比较即可
//先效验验证码和UUID
//登录还需要进行登录日志的落库
var loginInfo = HttpContext.GetLoginLogInfo();
loginInfo.LoginUser = loginDto.UserName;
loginInfo.LogMsg = "登录成功!";
var loginLogRepository = _repository.ChangeRepository>();
UserEntity user = new();
if (await _iUserService.Login(loginDto.UserName, loginDto.Password, o => user = o))
{
var userRoleMenu = await _iUserService.GetUserAllInfo(user.Id);
await loginLogRepository.InsertReturnSnowflakeIdAsync(loginInfo);
return Result.Success(loginInfo.LogMsg).SetData(new { token = _jwtInvoker.GetAccessToken(userRoleMenu.User, userRoleMenu.Menus) });
}
loginInfo.LogMsg = "登录失败!用户名或者密码错误!";
await loginLogRepository.InsertReturnSnowflakeIdAsync(loginInfo);
return Result.Error(loginInfo.LogMsg);
}
///
/// 没啥说,注册
///
///
///
[AllowAnonymous]
[HttpPost]
public async Task Register(RegisterDto registerDto)
{
UserEntity user = new();
if (await _iUserService.Register(WebCore.Mapper.MapperHelper.Map(registerDto), o => user = o))
{
return Result.Success("注册成功!").SetData(user);
}
return Result.SuccessError("注册失败!用户名已存在!");
}
///
/// 没啥说,登出
///
///
[HttpPost]
[AllowAnonymous]
public Result Logout()
{
return Result.Success("安全登出成功!");
}
///
/// 通过已登录的用户获取用户信息
///
///
[HttpGet]
public async Task GetUserAllInfo()
{
//通过鉴权jwt获取到用户的id
var userId = HttpContext.GetUserIdInfo();
var data = await _iUserService.GetUserAllInfo(userId);
//系统用户数据被重置,老前端访问重新授权
if (data is null)
{
return Result.UnAuthorize();
}
data.Menus.Clear();
return Result.Success().SetData(data);
}
///
/// 获取当前登录用户的前端路由
///
///
[HttpGet]
public async Task GetRouterInfo()
{
var userId = HttpContext.GetUserIdInfo();
var data = await _iUserService.GetUserAllInfo(userId);
var menus = data.Menus.ToList();
//为超级管理员直接给全部路由
if (SystemConst.Admin.Equals(data.User.UserName))
{
menus = await _iUserService._repository.ChangeRepository>().GetListAsync();
}
//将后端菜单转换成前端路由,组件级别需要过滤
List routers = MenuEntity.RouterBuild(menus);
return Result.Success().SetData(routers);
}
/////
///// 更新已登录用户的用户信息
/////
/////
/////
//[HttpPut]
//public async Task UpdateUserByHttp(UserEntity user)
//{
// //当然,密码是不能给他修改的
// user.Password = null;
// user.Salt = null;
// //修改需要赋值上主键哦
// user.Id = HttpContext.GetUserIdInfo();
// return Result.Success().SetStatus(await _iUserService._repository.UpdateIgnoreNullAsync(user));
//}
///
/// 自己更新密码
///
///
///
[HttpPut]
public async Task UpdatePassword(UpdatePasswordDto dto)
{
long userId = HttpContext.GetUserIdInfo();
if (await _iUserService.UpdatePassword(dto, userId))
{
return Result.Success();
}
return Result.Error("更新失败!");
}
///
/// 验证码
///
///
[AllowAnonymous]
[HttpGet]
public Result CaptchaImage()
{
var uuid = Guid.NewGuid();
var code = _securityCode.GetRandomEnDigitalText(4);
//将uuid与code,Redis缓存中心化保存起来,登录根据uuid比对即可
//10分钟过期
_cacheDb.Set($"Yi:Captcha:{uuid}",code,new TimeSpan(0,10,0));
var imgbyte = _securityCode.GetEnDigitalCodeByte(code);
return Result.Success().SetData(new { uuid = uuid, img = imgbyte });
}
}
}