Merge branch 'dev_add_auth_1029' of http://192.168.5.200:8081/ql/apismnagaer_backend into dev_add_auth_1029

This commit is contained in:
南浔 2024-11-05 00:29:03 +08:00
commit ba4157ef1a
4 changed files with 94 additions and 6 deletions

View File

@ -19,6 +19,10 @@ namespace Apimanager_backend.Controllers
{ {
this.userService = userService; this.userService = userService;
} }
/// <summary>
/// 获取用户个人信息
/// </summary>
/// <returns></returns>
[HttpGet] [HttpGet]
[Authorize(Roles = "User")] [Authorize(Roles = "User")]
public async Task<ActionResult<ResponseBase<UserInfoDto>>> UserInfo() public async Task<ActionResult<ResponseBase<UserInfoDto>>> UserInfo()
@ -32,5 +36,43 @@ namespace Apimanager_backend.Controllers
); );
return Ok(res); return Ok(res);
} }
/// <summary>
/// 重置用户密码
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
public async Task<ActionResult<ResponseBase<object?>>> Resetpassword([FromBody]ResetPasswordDto dto)
{
try
{
await userService.ResetPasswordAsync(dto.Email, dto.Code, dto.NewPassword);
var res = new ResponseBase<object?>(
code:1000,
message:"Success",
data: null
);
return Ok(res);
}catch(BaseException e)
{
var res = new ResponseBase<object?>(
code:e.code,
message:e.message,
data:null
);
return StatusCode(400,res);
}
}
[HttpPost]
public async Task<ActionResult<ResponseBase<object?>>> SendResetEmail([FromQuery]string email)
{
await userService.SendResetPasswordEmailAsync(email);
var res = new ResponseBase<object?>(
code: 1000,
message: "Success",
data: null
);
return Ok(res);
}
} }
} }

View File

@ -0,0 +1,9 @@
namespace Apimanager_backend.Dtos
{
public class ResetPasswordDto
{
public string Email { get; set; }
public string NewPassword { get; set; }
public string Code { get; set; }
}
}

View File

@ -20,7 +20,7 @@ namespace Apimanager_backend.Services
/// <param name="token">重置密码的令牌</param> /// <param name="token">重置密码的令牌</param>
/// <param name="newPassword">新的密码</param> /// <param name="newPassword">新的密码</param>
/// <returns>异步操作</returns> /// <returns>异步操作</returns>
Task ResetPasswordAsync(string email, string token, string newPassword); Task ResetPasswordAsync(string email, string code, string newPassword);
/// <summary> /// <summary>
/// 获取用户信息。 /// 获取用户信息。

View File

@ -3,9 +3,12 @@ using Apimanager_backend.Data;
using Apimanager_backend.Dtos; using Apimanager_backend.Dtos;
using Apimanager_backend.Exceptions; using Apimanager_backend.Exceptions;
using Apimanager_backend.Models; using Apimanager_backend.Models;
using Apimanager_backend.Tools;
using AutoMapper; using AutoMapper;
using Microsoft.AspNetCore.Connections.Features; using Microsoft.AspNetCore.Connections.Features;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using StackExchange.Redis;
using System.ComponentModel; using System.ComponentModel;
namespace Apimanager_backend.Services namespace Apimanager_backend.Services
@ -14,10 +17,17 @@ namespace Apimanager_backend.Services
{ {
private readonly ApiContext apiContext; private readonly ApiContext apiContext;
private readonly IMapper mapper; private readonly IMapper mapper;
public UserService(ApiContext apiContext,IMapper automapper) private readonly ILogger<IUserService> logger;
private readonly IConnectionMultiplexer redis;
private readonly IEmailService emailService;
private readonly int DbSet = 2;
public UserService(ApiContext apiContext,IMapper automapper,ILogger<IUserService> logger,IConnectionMultiplexer redis,IEmailService emailService)
{ {
this.apiContext = apiContext; this.apiContext = apiContext;
this.mapper = automapper; this.mapper = automapper;
this.logger = logger;
this.redis = redis;
this.emailService = emailService;
} }
public async Task<UserInfoDto> GetUserAsync(int userId) public async Task<UserInfoDto> GetUserAsync(int userId)
{ {
@ -40,14 +50,41 @@ namespace Apimanager_backend.Services
return await apiContext.Users.AnyAsync(x => x.Username == username); return await apiContext.Users.AnyAsync(x => x.Username == username);
} }
public Task ResetPasswordAsync(string email, string token, string newPassword) public async Task ResetPasswordAsync(string email, string code, string newPassword)
{ {
throw new NotImplementedException(); //校验验证码
var db = redis.GetDatabase(DbSet);
var value = await db.StringGetAsync(email);
if (!value.HasValue || value.ToString() != code)
{
throw new BaseException(5005, "验证码错误");
}
//验证成功,开始重置流程
var user = await apiContext.Users.FirstOrDefaultAsync(x => x.Email == email);
if(user == null)
{
throw new BaseException(2004, "用户不存在");
}
//修改密码
user.PassHash = newPassword;
apiContext.Users.Update(user);
await apiContext.SaveChangesAsync();
} }
public Task SendResetPasswordEmailAsync(string email) public async Task SendResetPasswordEmailAsync(string email)
{ {
throw new NotImplementedException(); var randomCode = RandomCodeHelper.GetRandomCodeStr();
//记录到redis
var db = redis.GetDatabase(DbSet);
bool redisSuccess = await db.StringSetAsync(email,randomCode,TimeSpan.FromHours(1));
if (!redisSuccess)
{
throw new BaseException(1005, "Redis Str Set Error");
}
string subject = "重置验证码";
string body = $"您的重置验证码为:{randomCode}<br>有效期60分钟";
//发送邮件
await emailService.SendEmailAsync(email,subject,body);
} }