using AcdiuTools.Models; using AcdiuTools.Services; using Microsoft.AspNetCore.Mvc; using System.ComponentModel.DataAnnotations; using System.Diagnostics; using System.Security.Claims; namespace AcdiuTools.Controllers { public class HomeController(IThemeService themeService) : BaseController(themeService) { private readonly IThemeService _themeService = themeService; [Route("")] public IActionResult Index() { return View(); } [Route("privacy")] public IActionResult Privacy() { return View(); } [Route("err")] [Route("error")] [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } /// /// API 端点:用于前端 AJAX 调用以切换主题 /// [HttpPost] public async Task SetTheme([FromBody] ThemeRequest model) { // 获取用户 ID string? claimUserId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? User.FindFirst("sub")?.Value; string userId; if (!string.IsNullOrEmpty(claimUserId)) { // 已登录用户 userId = claimUserId; } else { // 匿名用户:尝试使用 Session ID // 注意:访问 HttpContext.Session 会触发 Session 创建/加载 try { userId = HttpContext.Session.Id; } catch (InvalidOperationException) { // 如果 Session 未配置(防御性编程),回退到匿名标识 userId = "anonymous_" + HttpContext.Connection.RemoteIpAddress?.ToString()?.Replace(".", "_") ?? "unknown"; } } await _themeService.SaveUserThemeAsync(userId, model.Theme); return Json(new { success = true, theme = model.Theme }); } } /// /// 主题请求模型 /// public class ThemeRequest { /// /// 主题名称 /// 修复 CS8618: 使用 required 修饰符,确保反序列化时必须存在该字段 /// [Required] public required string Theme { get; set; } } }