using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using ToolHub.Models; namespace ToolHub.Controllers; [Authorize(Roles = "Admin")] public class TagController : Controller { private readonly IFreeSql _freeSql; public TagController(IFreeSql freeSql) { _freeSql = freeSql; } // 标签管理页面 public async Task Index(int page = 1) { var pageSize = 20; var tags = await _freeSql.Select() .IncludeMany(t => t.ToolTags) .Where(t => t.IsActive) .OrderBy(t => t.Name) .Page(page, pageSize) .ToListAsync(); // 获取总数用于分页 var totalCount = (int)await _freeSql.Select() .Where(t => t.IsActive) .CountAsync(); var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); ViewBag.CurrentPage = page; ViewBag.TotalCount = totalCount; ViewBag.TotalPages = totalPages; ViewBag.PageSize = pageSize; return View(tags); } // 获取分页标签列表(AJAX) [HttpGet] public async Task GetTags(int page = 1) { try { var pageSize = 20; var tags = await _freeSql.Select() .IncludeMany(t => t.ToolTags) .Where(t => t.IsActive) .OrderBy(t => t.Name) .Page(page, pageSize) .ToListAsync(); var totalCount = (int)await _freeSql.Select() .Where(t => t.IsActive) .CountAsync(); var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); return Json(new { tags = tags, pagination = new { currentPage = page, totalPages = totalPages, totalCount = totalCount, pageSize = pageSize, hasNext = page < totalPages, hasPrev = page > 1 } }); } catch { return Json(new { success = false, message = "获取标签列表失败" }); } } // 获取单个标签信息 [HttpGet] public async Task Get(int id) { try { var tag = await _freeSql.Select() .Where(t => t.Id == id) .FirstAsync(); if (tag == null) return NotFound(); return Json(tag); } catch { return StatusCode(500); } } // 保存标签(添加/编辑) [HttpPost] public async Task Save([FromBody] TagDto tagDto) { try { if (tagDto.Id == 0) { // 添加新标签 var tag = new Tag { Name = tagDto.Name, Color = tagDto.Color, IsActive = true }; await _freeSql.Insert(tag).ExecuteAffrowsAsync(); } else { // 更新标签 await _freeSql.Update() .Where(t => t.Id == tagDto.Id) .Set(t => t.Name, tagDto.Name) .Set(t => t.Color, tagDto.Color) .ExecuteAffrowsAsync(); } return Json(new { success = true }); } catch { return Json(new { success = false }); } } // 切换标签状态 [HttpPost] public async Task ToggleStatus([FromBody] ToggleTagStatusRequest request) { try { await _freeSql.Update() .Where(t => t.Id == request.Id) .Set(t => t.IsActive, request.IsActive) .ExecuteAffrowsAsync(); return Json(new { success = true }); } catch { return Json(new { success = false }); } } // 删除标签 [HttpPost] public async Task Delete([FromBody] DeleteTagRequest request) { try { // 检查是否有工具使用此标签 var toolTagCount = await _freeSql.Select().Where(tt => tt.TagId == request.Id).CountAsync(); if (toolTagCount > 0) { return Json(new { success = false, message = "该标签下还有工具,无法删除" }); } await _freeSql.Delete().Where(t => t.Id == request.Id).ExecuteAffrowsAsync(); return Json(new { success = true }); } catch { return Json(new { success = false }); } } // 获取标签列表(用于下拉选择) [HttpGet] public async Task GetList() { try { var tags = await _freeSql.Select() .Where(t => t.IsActive) .OrderBy(t => t.Name) .ToListAsync(); return Json(tags); } catch { return Json(new List()); } } // 为工具添加标签 [HttpPost] public async Task AddToolTag([FromBody] AddToolTagRequest request) { try { // 检查是否已存在 var existing = await _freeSql.Select() .Where(tt => tt.ToolId == request.ToolId && tt.TagId == request.TagId) .FirstAsync(); if (existing != null) { return Json(new { success = false, message = "该工具已添加此标签" }); } var toolTag = new ToolTag { ToolId = request.ToolId, TagId = request.TagId }; await _freeSql.Insert(toolTag).ExecuteAffrowsAsync(); return Json(new { success = true }); } catch { return Json(new { success = false }); } } // 移除工具标签 [HttpPost] public async Task RemoveToolTag([FromBody] RemoveToolTagRequest request) { try { await _freeSql.Delete() .Where(tt => tt.ToolId == request.ToolId && tt.TagId == request.TagId) .ExecuteAffrowsAsync(); return Json(new { success = true }); } catch { return Json(new { success = false }); } } // 获取工具的标签 [HttpGet] public async Task GetToolTags(int toolId) { try { var toolTags = await _freeSql.Select() .Include(tt => tt.Tag) .Where(tt => tt.ToolId == toolId) .ToListAsync(); var tags = toolTags.Select(tt => tt.Tag).ToList(); return Json(tags); } catch { return Json(new List()); } } } // DTOs public class TagDto { public int Id { get; set; } public string Name { get; set; } = string.Empty; public string? Color { get; set; } } public class ToggleTagStatusRequest { public int Id { get; set; } public bool IsActive { get; set; } } public class DeleteTagRequest { public int Id { get; set; } } public class AddToolTagRequest { public int ToolId { get; set; } public int TagId { get; set; } } public class RemoveToolTagRequest { public int ToolId { get; set; } public int TagId { get; set; } }