feat: 初始化后台管理模块与基础业务框架

1.  新增依赖注入生命周期标记接口、基础仓储与管理员仓储实现
2.  新增管理员认证与用户服务接口,补充认证相关DTO
3.  重构实体审计字段命名,统一Created/UpdatedAt规范
4.  新增大量业务实体类与API版本枚举配置
5.  集成Autofac依赖注入、JWT自动刷新与跨域配置
6.  替换原有微信小程序与旧认证服务为后台管理系统架构
7.  完善Swagger文档配置与项目基础部署配置
This commit is contained in:
glz
2026-06-01 17:59:23 +08:00
parent ab53492cc4
commit 831f8ba7f5
51 changed files with 2417 additions and 596 deletions

View File

@ -0,0 +1,205 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using QYZH.InteractiveMagazine.IService;
using QYZH.InteractiveMagazine.IService.Dto;
using QYZH.InteractiveMagazine.Models.Common;
using QYZH.InteractiveMagazine.Models.Dto;
using QYZH.InteractiveMagazine.Models.Enum;
namespace QYZH.InteractiveMagazine.WebApi.Controllers;
[Route("api/[controller]")]
[ApiController]
public class AdminController : BaseController
{
private readonly IAdminAuthService _adminAuthService;
private readonly IAdminUserService _adminUserService;
private readonly ILogger<AdminController> _logger;
public AdminController(IAdminAuthService adminAuthService, IAdminUserService adminUserService, ILogger<AdminController> logger)
{
_adminAuthService = adminAuthService;
_adminUserService = adminUserService;
_logger = logger;
}
[AllowAnonymous]
[HttpPost("login")]
public async Task<BaseResponse<AdminLoginOutput>> LoginAsync([FromBody] AdminLoginInput input)
{
var result = await _adminAuthService.LoginAsync(input);
return Success(result);
}
[HttpPost("logout")]
public async Task<BaseResponse<object>> LogoutAsync()
{
var userId = GetCurrentUserId();
if (userId == null)
{
return Fail("未获取到用户信息", 401);
}
await _adminAuthService.LogoutAsync(userId.Value);
return Success(new object(), "登出成功");
}
[HttpGet("info")]
public async Task<BaseResponse<AdminUserInfoOutput>> GetAdminInfoAsync()
{
var userId = GetCurrentUserId();
if (userId == null)
{
return BaseResponse<AdminUserInfoOutput>.Fail("未获取到用户信息", 401);
}
var result = await _adminAuthService.GetAdminInfoAsync(userId.Value);
return Success(result);
}
[HttpPost("changePassword")]
public async Task<BaseResponse<object>> ChangePasswordAsync([FromBody] ChangePasswordInput input)
{
var userId = GetCurrentUserId();
if (userId == null)
{
return Fail("未获取到用户信息", 401);
}
await _adminAuthService.ChangePasswordAsync(userId.Value, input.OldPassword, input.NewPassword);
return Success(new object(), "密码修改成功");
}
/// <summary>
/// 创建管理员
/// </summary>
/// <param name="input">管理员输入</param>
/// <returns>创建的管理员信息</returns>
[HttpPost("users")]
public async Task<BaseResponse<AdminUserOutput>> CreateUserAsync([FromBody] AdminUserInput input)
{
try
{
var result = await _adminUserService.CreateAsync(input);
return Success(result, "创建管理员成功");
}
catch (BusinessException ex)
{
_logger.LogWarning(ex, "创建管理员业务异常: {Message}", ex.Message);
return BaseResponse<AdminUserOutput>.Fail(ex.Message, ex.Code);
}
catch (Exception ex)
{
_logger.LogError(ex, "创建管理员系统异常,参数:{Input}", input);
return BaseResponse<AdminUserOutput>.Fail("创建管理员失败,请稍后重试", 500);
}
}
/// <summary>
/// 更新管理员
/// </summary>
/// <param name="id">管理员ID</param>
/// <param name="input">管理员输入</param>
/// <returns>更新后的管理员信息</returns>
[HttpPut("users/{id}")]
public async Task<BaseResponse<AdminUserOutput>> UpdateUserAsync(long id, [FromBody] AdminUserInput input)
{
try
{
var result = await _adminUserService.UpdateAsync(id, input);
return Success(result, "更新管理员成功");
}
catch (BusinessException ex)
{
_logger.LogWarning(ex, "更新管理员业务异常: {Message}", ex.Message);
return BaseResponse<AdminUserOutput>.Fail(ex.Message, ex.Code);
}
catch (Exception ex)
{
_logger.LogError(ex, "更新管理员系统异常ID{Id},参数:{Input}", id, input);
return BaseResponse<AdminUserOutput>.Fail("更新管理员失败,请稍后重试", 500);
}
}
/// <summary>
/// 删除管理员
/// </summary>
/// <param name="id">管理员ID</param>
/// <returns>操作结果</returns>
[HttpDelete("users/{id}")]
public async Task<BaseResponse<object>> DeleteUserAsync(long id)
{
try
{
await _adminUserService.DeleteAsync(id);
return Success(new object(), "删除管理员成功");
}
catch (BusinessException ex)
{
_logger.LogWarning(ex, "删除管理员业务异常: {Message}", ex.Message);
return BaseResponse<object>.Fail(ex.Message, ex.Code);
}
catch (Exception ex)
{
_logger.LogError(ex, "删除管理员系统异常ID{Id}", id);
return BaseResponse<object>.Fail("删除管理员失败,请稍后重试", 500);
}
}
/// <summary>
/// 根据ID获取管理员
/// </summary>
/// <param name="id">管理员ID</param>
/// <returns>管理员信息</returns>
[HttpGet("users/{id}")]
public async Task<BaseResponse<AdminUserOutput>> GetUserByIdAsync(long id)
{
try
{
var result = await _adminUserService.GetByIdAsync(id);
return Success(result);
}
catch (BusinessException ex)
{
_logger.LogWarning(ex, "获取管理员业务异常: {Message}", ex.Message);
return BaseResponse<AdminUserOutput>.Fail(ex.Message, ex.Code);
}
catch (Exception ex)
{
_logger.LogError(ex, "获取管理员系统异常ID{Id}", id);
return BaseResponse<AdminUserOutput>.Fail("获取管理员信息失败,请稍后重试", 500);
}
}
/// <summary>
/// 分页查询管理员列表
/// </summary>
/// <param name="input">查询条件</param>
/// <returns>分页结果</returns>
[HttpPost("users/list")]
public async Task<BaseResponse<PageListModel<AdminUserOutput>>> GetUsersListAsync([FromBody] AdminUserQueryInput input)
{
try
{
var result = await _adminUserService.GetListAsync(input);
return Success(result);
}
catch (BusinessException ex)
{
_logger.LogWarning(ex, "查询管理员列表业务异常: {Message}", ex.Message);
return BaseResponse<PageListModel<AdminUserOutput>>.Fail(ex.Message, ex.Code);
}
catch (Exception ex)
{
_logger.LogError(ex, "查询管理员列表系统异常,参数:{Input}", input);
return BaseResponse<PageListModel<AdminUserOutput>>.Fail("查询管理员列表失败,请稍后重试", 500);
}
}
}
public class ChangePasswordInput
{
public string OldPassword { get; set; } = string.Empty;
public string NewPassword { get; set; } = string.Empty;
}

View File

@ -1,61 +0,0 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using QYZH.InteractiveMagazine.IService;
using QYZH.InteractiveMagazine.IService.Dto;
using QYZH.InteractiveMagazine.Models.Dto;
namespace QYZH.InteractiveMagazine.WebApi.Controllers;
/// <summary>
/// 认证控制器
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class AuthController : BaseController
{
private readonly IAuthService _authService;
public AuthController(IAuthService authService)
{
_authService = authService;
}
/// <summary>
/// 用户登录
/// </summary>
/// <param name="input">登录信息</param>
/// <returns>登录结果</returns>
[AllowAnonymous]
[HttpPost("login")]
public async Task<BaseResponse<LoginOutput>> LoginAsync([FromBody] LoginInput input)
{
var result = await _authService.LoginAsync(input.Account, input.Password);
return Success(result);
}
/// <summary>
/// 用户注册
/// </summary>
/// <param name="input">注册信息</param>
/// <returns>是否成功</returns>
[AllowAnonymous]
[HttpPost("register")]
public async Task<BaseResponse<bool>> RegisterAsync([FromBody] RegisterInput input)
{
var result = await _authService.RegisterAsync(input);
return Success(result, "注册成功");
}
/// <summary>
/// 刷新令牌
/// </summary>
/// <param name="refreshToken">刷新令牌</param>
/// <returns>新的登录结果</returns>
[AllowAnonymous]
[HttpPost("refreshToken")]
public async Task<BaseResponse<LoginOutput>> RefreshTokenAsync([FromQuery] string refreshToken)
{
var result = await _authService.RefreshTokenAsync(refreshToken);
return Success(result);
}
}

View File

@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Mvc;
using QYZH.InteractiveMagazine.Models.Dto;
using QYZH.InteractiveMagazine.Models.Enum;
namespace QYZH.InteractiveMagazine.WebApi.Controllers;
@ -8,6 +9,7 @@ namespace QYZH.InteractiveMagazine.WebApi.Controllers;
/// </summary>
[ApiController]
[Route("api/[controller]")]
[ApiExplorerSettings(GroupName = nameof(ApiVersionEnum.Platform))]
public abstract class BaseController : ControllerBase
{
/// <summary>

View File

@ -1,35 +0,0 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using QYZH.InteractiveMagazine.IService;
using QYZH.InteractiveMagazine.IService.Dto;
using QYZH.InteractiveMagazine.Models.Dto;
namespace QYZH.InteractiveMagazine.WebApi.Controllers;
/// <summary>
/// 微信小程序控制器
/// </summary>
[Route("api/[controller]")]
[ApiController]
[AllowAnonymous]
public class WeChatController : BaseController
{
private readonly IWeChatMiniProgramService _weChatService;
public WeChatController(IWeChatMiniProgramService weChatService)
{
_weChatService = weChatService;
}
/// <summary>
/// 微信登录
/// </summary>
/// <param name="code">微信登录凭证</param>
/// <returns>微信登录结果</returns>
[HttpPost("login")]
public async Task<BaseResponse<WeChatLoginOutput>> WeChatLoginAsync([FromQuery] string code)
{
var result = await _weChatService.WeChatLoginAsync(code);
return Success(result);
}
}