campus-errand/server/Endpoints/BannerEndpoints.cs
18631081161 2d0c71721d
All checks were successful
continuous-integration/drone/push Build is passing
改bug
2026-03-29 21:13:50 +08:00

148 lines
5.3 KiB
C#

using CampusErrand.Data;
using CampusErrand.Models;
using CampusErrand.Models.Dtos;
using CampusErrand.Helpers;
using Microsoft.EntityFrameworkCore;
namespace CampusErrand.Endpoints;
public static class BannerEndpoints
{
public static void MapBannerEndpoints(this WebApplication app)
{
// 前端获取 Banner 列表(仅启用+按排序权重排列)
app.MapGet("/api/banners", async (AppDbContext db) =>
{
var banners = await db.Banners
.Where(b => b.IsEnabled)
.OrderBy(b => b.SortOrder)
.Select(b => new BannerResponse
{
Id = b.Id,
ImageUrl = b.ImageUrl,
LinkType = b.LinkType.ToString(),
LinkUrl = b.LinkUrl,
SortOrder = b.SortOrder,
IsEnabled = b.IsEnabled,
CreatedAt = b.CreatedAt
})
.ToListAsync();
return Results.Ok(banners);
});
// 管理端获取全部 Banner 列表
app.MapGet("/api/admin/banners", async (AppDbContext db) =>
{
var banners = await db.Banners
.OrderBy(b => b.SortOrder)
.Select(b => new BannerResponse
{
Id = b.Id,
ImageUrl = b.ImageUrl,
LinkType = b.LinkType.ToString(),
LinkUrl = b.LinkUrl,
SortOrder = b.SortOrder,
IsEnabled = b.IsEnabled,
CreatedAt = b.CreatedAt
})
.ToListAsync();
return Results.Ok(banners);
}).RequireAuthorization("AdminOnly");
// 创建 Banner
app.MapPost("/api/admin/banners", async (BannerRequest request, AppDbContext db) =>
{
// 校验
var errors = BusinessHelpers.ValidateBannerRequest(request);
if (errors.Count > 0)
{
return Results.BadRequest(new { code = 400, message = "校验失败", errors });
}
if (!Enum.TryParse<LinkType>(request.LinkType, true, out var linkType) || !Enum.IsDefined(linkType))
{
return Results.BadRequest(new { code = 400, message = "校验失败", errors = new[] { new { field = "linkType", message = "链接类型不合法" } } });
}
var banner = new Banner
{
ImageUrl = request.ImageUrl,
LinkType = linkType,
LinkUrl = request.LinkUrl,
SortOrder = request.SortOrder,
IsEnabled = request.IsEnabled,
CreatedAt = DateTime.UtcNow
};
db.Banners.Add(banner);
await db.SaveChangesAsync();
return Results.Created($"/api/admin/banners/{banner.Id}", new BannerResponse
{
Id = banner.Id,
ImageUrl = banner.ImageUrl,
LinkType = banner.LinkType.ToString(),
LinkUrl = banner.LinkUrl,
SortOrder = banner.SortOrder,
IsEnabled = banner.IsEnabled,
CreatedAt = banner.CreatedAt
});
}).RequireAuthorization("AdminOnly");
// 更新 Banner
app.MapPut("/api/admin/banners/{id}", async (int id, BannerRequest request, AppDbContext db) =>
{
var banner = await db.Banners.FindAsync(id);
if (banner == null)
{
return Results.NotFound(new { code = 404, message = "Banner 不存在" });
}
var errors = BusinessHelpers.ValidateBannerRequest(request);
if (errors.Count > 0)
{
return Results.BadRequest(new { code = 400, message = "校验失败", errors });
}
if (!Enum.TryParse<LinkType>(request.LinkType, true, out var linkType) || !Enum.IsDefined(linkType))
{
return Results.BadRequest(new { code = 400, message = "校验失败", errors = new[] { new { field = "linkType", message = "链接类型不合法" } } });
}
banner.ImageUrl = request.ImageUrl;
banner.LinkType = linkType;
banner.LinkUrl = request.LinkUrl;
banner.SortOrder = request.SortOrder;
banner.IsEnabled = request.IsEnabled;
await db.SaveChangesAsync();
return Results.Ok(new BannerResponse
{
Id = banner.Id,
ImageUrl = banner.ImageUrl,
LinkType = banner.LinkType.ToString(),
LinkUrl = banner.LinkUrl,
SortOrder = banner.SortOrder,
IsEnabled = banner.IsEnabled,
CreatedAt = banner.CreatedAt
});
}).RequireAuthorization("AdminOnly");
// 删除 Banner
app.MapDelete("/api/admin/banners/{id}", async (int id, AppDbContext db) =>
{
var banner = await db.Banners.FindAsync(id);
if (banner == null)
{
return Results.NotFound(new { code = 404, message = "Banner 不存在" });
}
db.Banners.Remove(banner);
await db.SaveChangesAsync();
return Results.NoContent();
}).RequireAuthorization("AdminOnly");
}
}