|
|
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); |
|
|
} |
|
|
|
|
|
|
|
|
[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>()); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
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; } |
|
|
} |
|
|
|