@page "/admin/blog" @attribute [Authorize] @inject IApiClient ApiClient @inject IJSRuntime JS 블로그 관리
Content

블로그 관리

검색 유입 콘텐츠의 발행 상태와 성과를 관리합니다.

전체 포스트: @($"{totalPosts}개") 페이지 @currentPage / @totalPages
@if (isLoading) { } else {
@foreach (var post in posts) { }
제목 발행 조회수 작성일
@post.Title @post.ViewCount @post.CreatedAt.ToString("yyyy-MM-dd")
수정
}
@code { [CascadingParameter] private Task? AuthStateTask { get; set; } private List posts = []; private bool isLoading = true; private int currentPage = 1; private int totalPages = 1; private int totalPosts = 0; private const int PageSize = 20; protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender && AuthStateTask != null) { var authState = await AuthStateTask; if (authState.User.Identity?.IsAuthenticated == true) { await LoadPosts(); StateHasChanged(); } } } private string NavTo(string url) => url; private async Task LoadPosts() { isLoading = true; try { var result = await ApiClient.GetAsync($"blog/admin?page={currentPage}&pageSize={PageSize}"); posts = result?.Data ?? []; totalPosts = result?.Total ?? 0; totalPages = Math.Max(1, (int)Math.Ceiling(totalPosts / (double)PageSize)); } catch { posts = []; totalPosts = 0; totalPages = 1; } finally { isLoading = false; } } private async Task PreviousPage() { if (currentPage > 1) { currentPage--; await LoadPosts(); } } private async Task NextPage() { if (currentPage < totalPages) { currentPage++; await LoadPosts(); } } private async Task TogglePublish(TaxBaik.Domain.Entities.BlogPost post, bool isPublished) { var previous = post.IsPublished; post.IsPublished = isPublished; var result = await ApiClient.PutAsync($"blog/{post.Id}", new { post.Title, post.Content, post.CategoryId, post.Tags, post.SeoTitle, post.SeoDescription, post.ThumbnailUrl, IsPublished = isPublished, post.AuthorId }); if (result == null) { post.IsPublished = previous; await JS.InvokeVoidAsync("alert", "발행 상태 변경에 실패했습니다."); return; } await JS.InvokeVoidAsync("alert", "발행 상태가 변경되었습니다."); } private async Task DeletePost(int postId) { await ApiClient.DeleteAsync($"blog/{postId}"); await JS.InvokeVoidAsync("alert", "포스트가 삭제되었습니다."); await LoadPosts(); } private class PagedBlogResponse { public List Data { get; set; } = []; public int Total { get; set; } } }