网站首页 网站源码
using Dpz.Core.EnumLibrary;
using Dpz.Core.Service.RepositoryService;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Dpz.Core.Auth.Controllers;
/// <summary>
/// 密码迁移管理控制器
/// 用于管理旧版本密码到新版本加盐密码的迁移
/// </summary>
[Authorize(nameof(Permissions.System))]
public class PasswordMigrationController(
IPasswordMigrationService passwordMigrationService,
ILogger<PasswordMigrationController> logger
) : Controller
{
/// <summary>
/// 显示密码迁移管理页面
/// </summary>
[HttpGet]
[Route("password-migration")]
public async Task<IActionResult> Index()
{
try
{
var pendingCount = await passwordMigrationService.GetMigrationPendingCountAsync();
ViewBag.PendingCount = pendingCount;
return View();
}
catch (Exception ex)
{
logger.LogError(ex, "获取密码迁移信息时发生错误");
ViewBag.PendingCount = 0;
TempData["Error"] = "获取迁移信息失败,请稍后重试";
return View();
}
}
/// <summary>
/// 执行批量密码迁移(仅默认密码用户)
/// </summary>
[HttpPost]
[Route("batch-migrate-passwords")]
public async Task<IActionResult> BatchMigratePasswords()
{
try
{
logger.LogInformation("开始执行批量密码迁移操作");
var migratedCount =
await passwordMigrationService.BatchMigrateDefaultPasswordUsersAsync();
var message = $"批量密码迁移完成!成功迁移 {migratedCount} 个默认密码用户";
TempData["Message"] = message;
logger.LogInformation(
"批量密码迁移完成,成功迁移 {MigratedCount} 个用户",
migratedCount
);
return RedirectToAction("Index");
}
catch (Exception ex)
{
logger.LogError(ex, "执行批量密码迁移时发生错误");
TempData["Error"] = "迁移过程中发生错误,请查看日志获取详细信息";
return RedirectToAction("Index");
}
}
/// <summary>
/// 检查单个用户是否需要密码迁移
/// </summary>
[HttpPost]
[Route("check-user-migration")]
public async Task<IActionResult> CheckUserMigration(string userId)
{
if (string.IsNullOrWhiteSpace(userId))
{
return Json(new { success = false, message = "用户ID不能为空" });
}
try
{
var needsMigration = await passwordMigrationService.NeedsMigrationAsync(userId);
return Json(
new
{
success = true,
needsMigration,
message = needsMigration ? "该用户需要密码迁移" : "该用户已使用新版本密码",
}
);
}
catch (Exception ex)
{
logger.LogError(ex, "检查用户 {UserId} 密码迁移状态时发生错误", userId);
return Json(new { success = false, message = "检查过程中发生错误" });
}
}
/// <summary>
/// 获取迁移统计信息
/// </summary>
[HttpGet]
[Route("migration-stats")]
public async Task<IActionResult> GetMigrationStats()
{
try
{
var pendingCount = await passwordMigrationService.GetMigrationPendingCountAsync();
return Json(
new
{
success = true,
pendingCount,
message = $"当前有 {pendingCount} 个用户需要密码迁移",
}
);
}
catch (Exception ex)
{
logger.LogError(ex, "获取密码迁移统计信息时发生错误");
return Json(new { success = false, message = "获取统计信息失败" });
}
}
}
上述代码是一个 ASP.NET Core 控制器,名为 PasswordMigrationController,用于管理旧版本密码到新版本加盐密码的迁移。它包含多个方法,提供了密码迁移的相关功能。以下是对代码中各个部分的详细解释:
public class PasswordMigrationController : Controller
Controller 类,表示它是一个 MVC 控制器,负责处理 HTTP 请求并返回相应的视图或数据。public PasswordMigrationController(
IPasswordMigrationService passwordMigrationService,
ILogger<PasswordMigrationController> logger
)
IPasswordMigrationService 和 ILogger<PasswordMigrationController>。前者用于处理密码迁移的业务逻辑,后者用于记录日志。[HttpGet]
[Route("password-migration")]
public async Task<IActionResult> Index()
GetMigrationPendingCountAsync 方法获取待迁移用户的数量,并将其存储在 ViewBag.PendingCount 中。[HttpPost]
[Route("batch-migrate-passwords")]
public async Task<IActionResult> BatchMigratePasswords()
BatchMigrateDefaultPasswordUsersAsync 方法进行迁移,并记录成功迁移的用户数量。[HttpPost]
[Route("check-user-migration")]
public async Task<IActionResult> CheckUserMigration(string userId)
userId 为空,返回错误消息。NeedsMigrationAsync 方法检查用户是否需要迁移,并返回相应的 JSON 响应。[HttpGet]
[Route("migration-stats")]
public async Task<IActionResult> GetMigrationStats()
GetMigrationPendingCountAsync 方法获取待迁移用户的数量,并返回 JSON 响应。整体而言,PasswordMigrationController 提供了一个用于管理密码迁移的接口,包括显示迁移页面、批量迁移密码、检查单个用户的迁移状态以及获取迁移统计信息。它通过依赖注入的方式使用服务和日志记录,确保了代码的可维护性和可测试性。
