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