Merge branch 'dev' into 'master'
Merge branch 'dev_add_auth_1029' into 'master' See merge request ql/apismnagaer_backend!9
This commit is contained in:
commit
ef8b9994d6
@ -9,6 +9,8 @@ namespace Apimanager_backend.Config
|
||||
public MyAutomapper()
|
||||
{
|
||||
CreateMap<User,UserInfoDto>();
|
||||
CreateMap<CreateUserDto, User>()
|
||||
.ForMember(dest => dest.PassHash, opt => opt.MapFrom(src => src.Password));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
47
Apimanager_backend/Controllers/AdminController.cs
Normal file
47
Apimanager_backend/Controllers/AdminController.cs
Normal file
@ -0,0 +1,47 @@
|
||||
using Apimanager_backend.Dtos;
|
||||
using Apimanager_backend.Services;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Apimanager_backend.Controllers
|
||||
{
|
||||
[Route("api/[controller]/[action]")]
|
||||
[ApiController]
|
||||
public class AdminController : ControllerBase
|
||||
{
|
||||
private readonly IAdminService adminService;
|
||||
private readonly IUserService userService;
|
||||
public AdminController(IAdminService service,IUserService userService)
|
||||
{
|
||||
this.adminService = service;
|
||||
this.userService = userService;
|
||||
}
|
||||
#region 获取用户列表
|
||||
[HttpGet]
|
||||
[Authorize("Admin")]
|
||||
public async Task<ActionResult<ResponseBase<List<UserInfoDto>>>> UserList(int pageIndex,int pageSize,bool desc)
|
||||
{
|
||||
var users = await adminService.GetUsersAsync(pageIndex,pageSize,desc);
|
||||
var res = new ResponseBase<List<UserInfoDto>>(
|
||||
code:1000,
|
||||
message:"Success",
|
||||
data:users
|
||||
);
|
||||
return Ok(res);
|
||||
}
|
||||
#endregion
|
||||
[HttpGet]
|
||||
[Authorize("Admin")]
|
||||
public async Task<ActionResult<ResponseBase<UserInfoDto?>>> UserInfo(int userId)
|
||||
{
|
||||
var userInfo = await userService.GetUserAsync(userId);
|
||||
var res = new ResponseBase<UserInfoDto?>(
|
||||
code: 1000,
|
||||
message: "Success",
|
||||
data: userInfo
|
||||
);
|
||||
return Ok(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -154,7 +154,19 @@ namespace Apimanager_backend.Controllers
|
||||
);
|
||||
return Ok(res);
|
||||
}
|
||||
|
||||
|
||||
|
||||
[HttpDelete]
|
||||
[Authorize(Roles = "User")]
|
||||
public async Task<ActionResult<ResponseBase<object?>>> Logout()
|
||||
{
|
||||
var userId = User.Claims.First(x => x.ValueType == "userId").Value;
|
||||
await refreshTokenService.DeleterRefreshTokenAsync(userId);
|
||||
var res = new ResponseBase<object?>(
|
||||
code:1000,
|
||||
message:"Success",
|
||||
data: null
|
||||
);
|
||||
return Ok(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,5 +74,18 @@ namespace Apimanager_backend.Controllers
|
||||
);
|
||||
return Ok(res);
|
||||
}
|
||||
[HttpPost]
|
||||
[Authorize(Roles = "User")]
|
||||
public async Task<ActionResult<ResponseBase<UserInfoDto?>>> Update([FromBody]UpdateUserDto dto)
|
||||
{
|
||||
var userId = User.Claims.First(x => x.ValueType == "userId").Value;
|
||||
var userInfo = await userService.UpdateUserAsync(int.Parse(userId),dto);
|
||||
var res = new ResponseBase<object?>(
|
||||
code:1000,
|
||||
message:"Success",
|
||||
data:userInfo
|
||||
);
|
||||
return Ok(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
8
Apimanager_backend/Dtos/AdminUpdateUserDto.cs
Normal file
8
Apimanager_backend/Dtos/AdminUpdateUserDto.cs
Normal file
@ -0,0 +1,8 @@
|
||||
namespace Apimanager_backend.Dtos
|
||||
{
|
||||
public class AdminUpdateUserDto
|
||||
{
|
||||
public string Password { get; set; }
|
||||
public decimal Balance { get; set; }
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,16 @@
|
||||
namespace Apimanager_backend.Dtos
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Apimanager_backend.Dtos
|
||||
{
|
||||
public class CreateUserDto
|
||||
{
|
||||
[Required(ErrorMessage = "用户名必填")]
|
||||
[MaxLength(20,ErrorMessage = "用户名最大长度20字符")]
|
||||
public string Username { get; set; }
|
||||
[Required(ErrorMessage = "密码必填")]
|
||||
public string Password { get; set; }
|
||||
[EmailAddress(ErrorMessage = "邮箱格式错误")]
|
||||
public string Email { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Apimanager_backend.Dtos
|
||||
{
|
||||
public class UpdateUserDto
|
||||
{
|
||||
public int? userId { get; set; }
|
||||
public string? password { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -35,16 +35,16 @@ namespace Apimanager_backend.Models
|
||||
/// <summary>
|
||||
/// 是否禁用
|
||||
/// </summary>
|
||||
public bool IsBan { get; set; } // boolean
|
||||
public bool IsBan { get; set; } = false; // boolean
|
||||
/// <summary>
|
||||
/// 是否删除
|
||||
/// </summary>
|
||||
public bool IsDelete { get; set; } // boolean
|
||||
public bool IsDelete { get; set; } = false; // boolean
|
||||
|
||||
/// <summary>
|
||||
/// 余额
|
||||
/// </summary>
|
||||
public decimal Balance { get; set; } // Decimal(10)
|
||||
public decimal Balance { get; set; } = 0; // Decimal(10)
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间,默认当前时间
|
||||
|
||||
112
Apimanager_backend/Services/AdminService.cs
Normal file
112
Apimanager_backend/Services/AdminService.cs
Normal file
@ -0,0 +1,112 @@
|
||||
using Apimanager_backend.Data;
|
||||
using Apimanager_backend.Dtos;
|
||||
using Apimanager_backend.Exceptions;
|
||||
using Apimanager_backend.Models;
|
||||
using AutoMapper;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace Apimanager_backend.Services
|
||||
{
|
||||
public class AdminService : IAdminService
|
||||
{
|
||||
private readonly ApiContext context;
|
||||
private readonly IMapper mapper;
|
||||
private readonly ILogger<IAdminService> logger;
|
||||
public AdminService(ApiContext context, IMapper mapper, ILogger<IAdminService> logger)
|
||||
{
|
||||
this.context = context;
|
||||
this.mapper = mapper;
|
||||
this.logger = logger;
|
||||
}
|
||||
#region 禁用用户
|
||||
public async Task BanUserAsync(int userId)
|
||||
{
|
||||
var user = await context.Users.FirstOrDefaultAsync(x => x.Id == userId);
|
||||
if (user == null)
|
||||
{
|
||||
throw new BaseException(2004,"用户不存在");
|
||||
}
|
||||
user.IsBan = true;
|
||||
context.Users.Update(user);
|
||||
await context.SaveChangesAsync();
|
||||
}
|
||||
#endregion
|
||||
#region 新建用户
|
||||
public async Task<UserInfoDto> CreateUserAsync(CreateUserDto dto)
|
||||
{
|
||||
//添加用户
|
||||
var user = mapper.Map<User>(dto);
|
||||
context.Users.Add(user);
|
||||
await context.SaveChangesAsync();
|
||||
//添加默认角色
|
||||
UserRole userRole = new UserRole
|
||||
{
|
||||
UserId = user.Id,
|
||||
Role = "User"
|
||||
};
|
||||
|
||||
context.UserRoles.Add(userRole);
|
||||
await context.SaveChangesAsync();
|
||||
return mapper.Map<UserInfoDto>(user);
|
||||
}
|
||||
#endregion
|
||||
#region 删除用户
|
||||
public async Task DeleteUserAsync(int userId)
|
||||
{
|
||||
var user = await context.Users.FirstOrDefaultAsync(x => x.Id == userId);
|
||||
if (user == null)
|
||||
{
|
||||
throw new BaseException(2004, "用户不存在");
|
||||
}
|
||||
user.IsDelete = true;
|
||||
context.Users.Update(user);
|
||||
await context.SaveChangesAsync();
|
||||
}
|
||||
#endregion
|
||||
#region 获取用户列表
|
||||
public async Task<List<UserInfoDto>> GetUsersAsync(int page, int pageSize, bool desc)
|
||||
{
|
||||
var query = context.Users.Where(x => true)
|
||||
.OrderBy(x => x.Id);
|
||||
//倒序
|
||||
if (desc)
|
||||
{
|
||||
query = query.OrderByDescending(x => x.Id);
|
||||
}
|
||||
//分页
|
||||
var users = await query.Skip((page - 1) * pageSize)
|
||||
.Take(pageSize).ToListAsync();
|
||||
return mapper.Map<List<UserInfoDto>>(users);
|
||||
}
|
||||
#endregion
|
||||
#region 禁用用户
|
||||
public async Task UnbanUserAsync(int userId)
|
||||
{
|
||||
var user = await context.Users.FirstOrDefaultAsync(x => x.Id == userId);
|
||||
if (user == null)
|
||||
{
|
||||
throw new BaseException(2004, "用户不存在");
|
||||
}
|
||||
user.IsBan = false;
|
||||
context.Users.Update(user);
|
||||
await context.SaveChangesAsync();
|
||||
}
|
||||
#endregion
|
||||
#region 更新用户信息
|
||||
public async Task<UserInfoDto> UpdateUserAsync(int userId,AdminUpdateUserDto dto)
|
||||
{
|
||||
var user = await context.Users.FirstOrDefaultAsync(x => x.Id == userId);
|
||||
if(user == null)
|
||||
{
|
||||
throw new BaseException(2004,"用户不存在");
|
||||
}
|
||||
user.PassHash = dto.Password;
|
||||
user.Balance = dto.Balance;
|
||||
context.Users.Update(user);
|
||||
await context.SaveChangesAsync();
|
||||
return mapper.Map<UserInfoDto>(user);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@ -25,6 +25,7 @@ namespace Apimanager_backend.Services
|
||||
this.redis = redis;
|
||||
this.emailService = emailService;
|
||||
}
|
||||
#region 用户登录
|
||||
public async Task<UserInfoDto> LoginAsync(string username, string password)
|
||||
{
|
||||
//查找用户
|
||||
@ -46,7 +47,8 @@ namespace Apimanager_backend.Services
|
||||
|
||||
return mapper.Map<UserInfoDto>(user);
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region 用户注册
|
||||
public async Task<UserInfoDto> RegisterAsync(RegisterRequestDto dto)
|
||||
{
|
||||
var db = redis.GetDatabase(DbIndex);
|
||||
@ -84,7 +86,8 @@ namespace Apimanager_backend.Services
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region 发送注册验证码
|
||||
public async Task SendRegisterCodeAsync(string email)
|
||||
{
|
||||
//生成随机码
|
||||
@ -101,5 +104,6 @@ namespace Apimanager_backend.Services
|
||||
//发送邮件
|
||||
await emailService.SendEmailAsync(email,subject,body);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@ -36,5 +36,10 @@ namespace Apimanager_backend.Services
|
||||
/// <param name="userId">用户ID</param>
|
||||
/// <returns>异步操作</returns>
|
||||
Task DeleteUserAsync(int userId);
|
||||
/// <summary>
|
||||
/// 修改用户信息
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task<UserInfoDto> UpdateUserAsync(int userId,AdminUpdateUserDto dto);
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
/// <summary>
|
||||
/// 更新刷新令牌有效期
|
||||
/// </summary>
|
||||
/// <param name="refreshToken">刷新令牌</param>
|
||||
/// <param name="userId">用户id</param>
|
||||
/// <returns>是否成功</returns>
|
||||
Task UpdateRefreshTokenAsync(string userId);
|
||||
}
|
||||
|
||||
@ -34,7 +34,7 @@ namespace Apimanager_backend.Services
|
||||
/// </summary>
|
||||
/// <param name="user">包含更新信息的 <see cref="UpdateUserDto"/></param>
|
||||
/// <returns>更新后的 <see cref="UserInfoDto"/></returns>
|
||||
Task<UserInfoDto> UpdateUserAsync(UpdateUserDto user);
|
||||
Task<UserInfoDto> UpdateUserAsync(int userId,UpdateUserDto user);
|
||||
/// <summary>
|
||||
/// 检测用户名是否被使用
|
||||
/// </summary>
|
||||
|
||||
@ -13,7 +13,7 @@ namespace Apimanager_backend.Services
|
||||
this.redis = redis;
|
||||
this.configuration = configuration;
|
||||
}
|
||||
|
||||
#region 创建刷新令牌
|
||||
public async Task<string> CreateRefereshTokenAsync(string userId)
|
||||
{
|
||||
var refreshToken = Guid.NewGuid().ToString();
|
||||
@ -28,7 +28,8 @@ namespace Apimanager_backend.Services
|
||||
}
|
||||
return refreshToken;
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region 删除刷新令牌
|
||||
public async Task DeleterRefreshTokenAsync(string userId)
|
||||
{
|
||||
var db = redis.GetDatabase(DbIndex);
|
||||
@ -38,7 +39,8 @@ namespace Apimanager_backend.Services
|
||||
throw new BaseException(1006, "Service unavailable");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region 刷新令牌有效期
|
||||
public async Task UpdateRefreshTokenAsync(string userId)
|
||||
{
|
||||
var db = redis.GetDatabase(DbIndex);
|
||||
@ -53,7 +55,8 @@ namespace Apimanager_backend.Services
|
||||
//刷新过期时间
|
||||
await db.KeyExpireAsync(userId,TimeSpan.FromDays(expiryDays));
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region 验证令牌
|
||||
public async Task<bool> ValidateRefreshTokenAsync(string userId,string refreshToken)
|
||||
{
|
||||
var db = redis.GetDatabase(DbIndex);
|
||||
@ -70,5 +73,6 @@ namespace Apimanager_backend.Services
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@ -88,9 +88,9 @@ namespace Apimanager_backend.Services
|
||||
}
|
||||
#endregion
|
||||
|
||||
public async Task<UserInfoDto> UpdateUserAsync(UpdateUserDto dto)
|
||||
public async Task<UserInfoDto> UpdateUserAsync(int userId,UpdateUserDto dto)
|
||||
{
|
||||
var user = await apiContext.Users.FirstOrDefaultAsync(x => x.Id == dto.userId);
|
||||
var user = await apiContext.Users.FirstOrDefaultAsync(x => x.Id == userId);
|
||||
if (user == null)
|
||||
{
|
||||
throw new BaseException(2004, "用户不存在");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user