diff --git a/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml b/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml
index aad63eb..102a680 100644
--- a/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml
+++ b/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml
@@ -62,7 +62,9 @@
@if (Model.Items.Count == 0)
{
- | 고객 데이터가 없습니다. |
+
+
+ |
}
else
@@ -73,7 +75,7 @@
@item.Name |
@item.CompanyName |
@item.Phone |
- @item.Status |
+ |
@item.CreatedAt.ToString("yyyy-MM-dd") |
상세
@@ -86,5 +88,6 @@
-
+
+
diff --git a/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml.cs b/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml.cs
index ee3efc3..570d17e 100644
--- a/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml.cs
+++ b/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml.cs
@@ -9,18 +9,27 @@ namespace TaxBaik.Web.Pages.Admin.Customers;
public class IndexModel(ClientService clientService) : PageModel
{
public List Items { get; private set; } = [];
+ public int CurrentPage { get; private set; } = 1;
+ public int TotalPages { get; private set; } = 1;
+ public int TotalCount { get; private set; }
public string? Search { get; set; }
public string? Status { get; set; }
public int PageSize { get; set; } = 10;
- public async Task OnGetAsync(string? search, string? status, int pageSize = 10, CancellationToken ct = default)
+ public async Task OnGetAsync(string? search, string? status, int page = 1, int pageSize = 10, CancellationToken ct = default)
{
Search = search;
Status = status;
PageSize = pageSize;
+ CurrentPage = Math.Max(1, page);
- var (items, _) = await clientService.GetPagedAsync(1, pageSize, status, search, ct);
+ var (items, total) = await clientService.GetPagedAsync(CurrentPage, pageSize, status, search, ct);
Items = items.ToList();
+ TotalCount = total;
+ TotalPages = Math.Max(1, (int)Math.Ceiling(total / (double)pageSize));
}
+
+ public string BuildPageUrl(int page) =>
+ $"/admin/customers?search={Uri.EscapeDataString(Search ?? string.Empty)}&status={Uri.EscapeDataString(Status ?? string.Empty)}&page={page}&pageSize={PageSize}";
}
diff --git a/src/TaxBaik.Web/Pages/Admin/Login.cshtml b/src/TaxBaik.Web/Pages/Admin/Login.cshtml
index f0ca1bb..833c0d0 100644
--- a/src/TaxBaik.Web/Pages/Admin/Login.cshtml
+++ b/src/TaxBaik.Web/Pages/Admin/Login.cshtml
@@ -1,6 +1,7 @@
@page "/admin/login"
@model TaxBaik.Web.Pages.Admin.LoginModel
@{
+ Layout = null;
ViewData["Title"] = "관리자 로그인";
ViewData["Description"] = "관리자 로그인 페이지입니다.";
ViewData["CanonicalUrl"] = $"{Request.Scheme}://{Request.Host}/admin/login";
diff --git a/src/TaxBaik.Web/Pages/Admin/_AdminLayout.cshtml b/src/TaxBaik.Web/Pages/Admin/_AdminLayout.cshtml
new file mode 100644
index 0000000..4fb1905
--- /dev/null
+++ b/src/TaxBaik.Web/Pages/Admin/_AdminLayout.cshtml
@@ -0,0 +1,28 @@
+
+
+
+
+
+ @(ViewData["Title"] ?? "TaxBaik Admin")
+
+
+
+
+
+
+
+
+
+
+
+ @RenderBody()
+
+
+
+
+ @await RenderSectionAsync("Scripts", required: false)
+
+
+
diff --git a/src/TaxBaik.Web/Pages/Admin/_ViewStart.cshtml b/src/TaxBaik.Web/Pages/Admin/_ViewStart.cshtml
new file mode 100644
index 0000000..75aec31
--- /dev/null
+++ b/src/TaxBaik.Web/Pages/Admin/_ViewStart.cshtml
@@ -0,0 +1,4 @@
+@{
+ Layout = "_AdminLayout";
+}
+
diff --git a/src/TaxBaik.Web/Pages/Shared/_AdminSidebar.cshtml b/src/TaxBaik.Web/Pages/Shared/_AdminSidebar.cshtml
new file mode 100644
index 0000000..4684539
--- /dev/null
+++ b/src/TaxBaik.Web/Pages/Shared/_AdminSidebar.cshtml
@@ -0,0 +1,8 @@
+
+
diff --git a/src/TaxBaik.Web/Pages/Shared/_AdminTopbar.cshtml b/src/TaxBaik.Web/Pages/Shared/_AdminTopbar.cshtml
new file mode 100644
index 0000000..37269b5
--- /dev/null
+++ b/src/TaxBaik.Web/Pages/Shared/_AdminTopbar.cshtml
@@ -0,0 +1,13 @@
+
+
+
+ TaxBaik Admin
+ Razor Pages + Cookie Authentication
+
+
+ @User.Identity?.Name
+ 로그아웃
+
+
+
+
diff --git a/src/TaxBaik.Web/Pages/Shared/_EmptyState.cshtml b/src/TaxBaik.Web/Pages/Shared/_EmptyState.cshtml
new file mode 100644
index 0000000..88799b9
--- /dev/null
+++ b/src/TaxBaik.Web/Pages/Shared/_EmptyState.cshtml
@@ -0,0 +1,5 @@
+@model string
+
+ @(string.IsNullOrWhiteSpace(Model) ? "데이터가 없습니다." : Model)
+
+
diff --git a/src/TaxBaik.Web/Pages/Shared/_Pagination.cshtml b/src/TaxBaik.Web/Pages/Shared/_Pagination.cshtml
new file mode 100644
index 0000000..ba20feb
--- /dev/null
+++ b/src/TaxBaik.Web/Pages/Shared/_Pagination.cshtml
@@ -0,0 +1,15 @@
+@model dynamic
+@if (Model.TotalPages > 1)
+{
+
+}
+
diff --git a/src/TaxBaik.Web/Pages/Shared/_StatusBadge.cshtml b/src/TaxBaik.Web/Pages/Shared/_StatusBadge.cshtml
new file mode 100644
index 0000000..d749ad6
--- /dev/null
+++ b/src/TaxBaik.Web/Pages/Shared/_StatusBadge.cshtml
@@ -0,0 +1,11 @@
+@model string
+@{
+ var badgeClass = Model?.ToLowerInvariant() switch
+ {
+ "active" => "text-bg-success",
+ "inactive" => "text-bg-secondary",
+ _ => "text-bg-light"
+ };
+}
+@Model
+
|