Toolhub / Controllers /TagController.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 TagController : Controller
{
private readonly IFreeSql _freeSql;
public TagController(IFreeSql freeSql)
{
_freeSql = freeSql;
}
// 标签管理页面
public async Task<IActionResult> Index(int page = 1)
{
var pageSize = 20;
var tags = await _freeSql.Select<Tag>()
.IncludeMany(t => t.ToolTags)
.Where(t => t.IsActive)
.OrderBy(t => t.Name)
.Page(page, pageSize)
.ToListAsync();
// 获取总数用于分页
var totalCount = (int)await _freeSql.Select<Tag>()
.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<IActionResult> GetTags(int page = 1)
{
try
{
var pageSize = 20;
var tags = await _freeSql.Select<Tag>()
.IncludeMany(t => t.ToolTags)
.Where(t => t.IsActive)
.OrderBy(t => t.Name)
.Page(page, pageSize)
.ToListAsync();
var totalCount = (int)await _freeSql.Select<Tag>()
.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<IActionResult> Get(int id)
{
try
{
var tag = await _freeSql.Select<Tag>()
.Where(t => t.Id == id)
.FirstAsync();
if (tag == null)
return NotFound();
return Json(tag);
}
catch
{
return StatusCode(500);
}
}
// 保存标签(添加/编辑)
[HttpPost]
public async Task<IActionResult> 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<Tag>()
.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<IActionResult> ToggleStatus([FromBody] ToggleTagStatusRequest request)
{
try
{
await _freeSql.Update<Tag>()
.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<IActionResult> Delete([FromBody] DeleteTagRequest request)
{
try
{
// 检查是否有工具使用此标签
var toolTagCount = await _freeSql.Select<ToolTag>().Where(tt => tt.TagId == request.Id).CountAsync();
if (toolTagCount > 0)
{
return Json(new { success = false, message = "该标签下还有工具,无法删除" });
}
await _freeSql.Delete<Tag>().Where(t => t.Id == request.Id).ExecuteAffrowsAsync();
return Json(new { success = true });
}
catch
{
return Json(new { success = false });
}
}
// 获取标签列表(用于下拉选择)
[HttpGet]
public async Task<IActionResult> GetList()
{
try
{
var tags = await _freeSql.Select<Tag>()
.Where(t => t.IsActive)
.OrderBy(t => t.Name)
.ToListAsync();
return Json(tags);
}
catch
{
return Json(new List<Tag>());
}
}
// 为工具添加标签
[HttpPost]
public async Task<IActionResult> AddToolTag([FromBody] AddToolTagRequest request)
{
try
{
// 检查是否已存在
var existing = await _freeSql.Select<ToolTag>()
.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<IActionResult> RemoveToolTag([FromBody] RemoveToolTagRequest request)
{
try
{
await _freeSql.Delete<ToolTag>()
.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<IActionResult> GetToolTags(int toolId)
{
try
{
var toolTags = await _freeSql.Select<ToolTag>()
.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<Tag>());
}
}
}
// 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; }
}