using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using ToolHub.Models; namespace ToolHub.Controllers; [Authorize(Roles = "Admin")] public class CategoryController : Controller { private readonly IFreeSql _freeSql; public CategoryController(IFreeSql freeSql) { _freeSql = freeSql; } // 类别管理页面 public async Task Index(int page = 1) { var pageSize = 20; var categories = await _freeSql.Select() .IncludeMany(c => c.Tools) .Where(c => c.IsActive) .OrderBy(c => c.SortOrder) .Page(page, pageSize) .ToListAsync(); // 获取总数用于分页 var totalCount = (int)await _freeSql.Select() .Where(c => c.IsActive) .CountAsync(); var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); ViewBag.CurrentPage = page; ViewBag.TotalCount = totalCount; ViewBag.TotalPages = totalPages; ViewBag.PageSize = pageSize; return View(categories); } // 获取分页分类列表(AJAX) [HttpGet] public async Task GetCategories(int page = 1) { try { var pageSize = 20; var categories = await _freeSql.Select() .IncludeMany(c => c.Tools) .Where(c => c.IsActive) .OrderBy(c => c.SortOrder) .Page(page, pageSize) .ToListAsync(); var totalCount = (int)await _freeSql.Select() .Where(c => c.IsActive) .CountAsync(); var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); return Json(new { categories = categories, pagination = new { currentPage = page, totalPages = totalPages, totalCount = totalCount, pageSize = pageSize, hasNext = page < totalPages, hasPrev = page > 1 } }); } catch { return Json(new { success = false, message = "获取分类列表失败" }); } } // 保存类别(添加/编辑) [HttpPost] public async Task Save([FromBody] CategoryDto categoryDto) { try { if (categoryDto.Id == 0) { // 添加新分类 var category = new Category { Name = categoryDto.Name, Description = categoryDto.Description, Icon = categoryDto.Icon, Color = categoryDto.Color, SortOrder = categoryDto.SortOrder, IsActive = true }; await _freeSql.Insert(category).ExecuteAffrowsAsync(); } else { // 更新分类 await _freeSql.Update() .Where(c => c.Id == categoryDto.Id) .Set(c => c.Name, categoryDto.Name) .Set(c => c.Description, categoryDto.Description) .Set(c => c.Icon, categoryDto.Icon) .Set(c => c.Color, categoryDto.Color) .Set(c => c.SortOrder, categoryDto.SortOrder) .Set(c => c.UpdatedAt, DateTime.Now) .ExecuteAffrowsAsync(); } return Json(new { success = true }); } catch { return Json(new { success = false }); } } // 切换类别状态 [HttpPost] public async Task ToggleStatus([FromBody] ToggleCategoryStatusRequest request) { try { await _freeSql.Update() .Where(c => c.Id == request.Id) .Set(c => c.IsActive, request.IsActive) .Set(c => c.UpdatedAt, DateTime.Now) .ExecuteAffrowsAsync(); return Json(new { success = true }); } catch { return Json(new { success = false }); } } // 删除类别 [HttpPost] public async Task Delete([FromBody] DeleteCategoryRequest request) { try { // 检查是否有工具使用此分类 var toolCount = await _freeSql.Select().Where(t => t.CategoryId == request.Id).CountAsync(); if (toolCount > 0) { return Json(new { success = false, message = "该分类下还有工具,无法删除" }); } await _freeSql.Delete().Where(c => c.Id == request.Id).ExecuteAffrowsAsync(); return Json(new { success = true }); } catch { return Json(new { success = false }); } } // 获取类别列表(用于下拉选择) [HttpGet] public async Task GetList() { try { var categories = await _freeSql.Select() .Where(c => c.IsActive) .OrderBy(c => c.SortOrder) .ToListAsync(); return Json(categories); } catch { return Json(new List()); } } } // DTOs public class CategoryDto { public int Id { get; set; } public string Name { get; set; } = string.Empty; public string? Description { get; set; } public string? Icon { get; set; } public string? Color { get; set; } public int SortOrder { get; set; } } public class ToggleCategoryStatusRequest { public int Id { get; set; } public bool IsActive { get; set; } } public class DeleteCategoryRequest { public int Id { get; set; } }