Download Controllers/TagController.cs from automindy/Toolhub: direct link, hf CLI and curl.
- Browser
- Download file 7.76 kB
-
https://huggingface.co/spaces/automindy/Toolhub/resolve/main/Controllers/TagController.cs
- Command line
-
hf download hf://spaces/automindy/Toolhub/Controllers/TagController.cs
-
curl -L -o TagController.cs https://huggingface.co/spaces/automindy/Toolhub/resolve/main/Controllers/TagController.cs
7.76 kB
| using Microsoft.AspNetCore.Mvc; | |
| using Microsoft.AspNetCore.Authorization; | |
| using ToolHub.Models; | |
| namespace ToolHub.Controllers; | |
| [] | |
| 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) | |
| [] | |
| 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 = "获取标签列表失败" }); | |
| } | |
| } | |
| // 获取单个标签信息 | |
| [] | |
| 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); | |
| } | |
| } | |
| // 保存标签(添加/编辑) | |
| [] | |
| 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 }); | |
| } | |
| } | |
| // 切换标签状态 | |
| [] | |
| 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 }); | |
| } | |
| } | |
| // 删除标签 | |
| [] | |
| 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 }); | |
| } | |
| } | |
| // 获取标签列表(用于下拉选择) | |
| [] | |
| 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>()); | |
| } | |
| } | |
| // 为工具添加标签 | |
| [] | |
| 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 }); | |
| } | |
| } | |
| // 移除工具标签 | |
| [] | |
| 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 }); | |
| } | |
| } | |
| // 获取工具的标签 | |
| [] | |
| 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; } | |
| } | |