@page "/admin/blog" @attribute [Authorize] @inject IApiClient ApiClient @inject ISnackbar Snackbar 블로그 관리
📝 블로그 관리 새 포스트
@($"전체 포스트 {totalPosts}개") 페이지 @currentPage / @totalPages 수정 삭제 이전 다음 @code { 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 OnInitializedAsync() { await LoadPosts(); } 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; } isLoading = false; } private async Task PreviousPage() { if (currentPage <= 1) return; currentPage--; await LoadPosts(); } private async Task NextPage() { if (currentPage >= totalPages) return; 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; Snackbar.Add("발행 상태 변경에 실패했습니다.", Severity.Error); return; } Snackbar.Add("발행 상태가 변경되었습니다.", Severity.Success); } private async Task DeletePost(int postId) { await ApiClient.DeleteAsync($"blog/{postId}"); Snackbar.Add("포스트가 삭제되었습니다.", Severity.Success); await LoadPosts(); } private class PagedBlogResponse { public List Data { get; set; } = []; public int Total { get; set; } } }