Toolhub / Controllers /CategoryController.cs
unifare
Initial commit: ToolHub ASP.NET Core app
5fc700d
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<IActionResult> Index(int page = 1)
{
var pageSize = 20;
var categories = await _freeSql.Select<Category>()
.IncludeMany(c => c.Tools)
.Where(c => c.IsActive)
.OrderBy(c => c.SortOrder)
.Page(page, pageSize)
.ToListAsync();
// 获取总数用于分页
var totalCount = (int)await _freeSql.Select<Category>()
.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<IActionResult> GetCategories(int page = 1)
{
try
{
var pageSize = 20;
var categories = await _freeSql.Select<Category>()
.IncludeMany(c => c.Tools)
.Where(c => c.IsActive)
.OrderBy(c => c.SortOrder)
.Page(page, pageSize)
.ToListAsync();
var totalCount = (int)await _freeSql.Select<Category>()
.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<IActionResult> 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<Category>()
.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<IActionResult> ToggleStatus([FromBody] ToggleCategoryStatusRequest request)
{
try
{
await _freeSql.Update<Category>()
.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<IActionResult> Delete([FromBody] DeleteCategoryRequest request)
{
try
{
// 检查是否有工具使用此分类
var toolCount = await _freeSql.Select<Tool>().Where(t => t.CategoryId == request.Id).CountAsync();
if (toolCount > 0)
{
return Json(new { success = false, message = "该分类下还有工具,无法删除" });
}
await _freeSql.Delete<Category>().Where(c => c.Id == request.Id).ExecuteAffrowsAsync();
return Json(new { success = true });
}
catch
{
return Json(new { success = false });
}
}
// 获取类别列表(用于下拉选择)
[HttpGet]
public async Task<IActionResult> GetList()
{
try
{
var categories = await _freeSql.Select<Category>()
.Where(c => c.IsActive)
.OrderBy(c => c.SortOrder)
.ToListAsync();
return Json(categories);
}
catch
{
return Json(new List<Category>());
}
}
}
// 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; }
}