refactor admin UX and stabilize shell
TaxBaik CI/CD / build-and-deploy (push) Failing after 2m20s

This commit is contained in:
2026-07-09 00:03:33 +09:00
parent a2f94e2b5e
commit 89fa51efe2
91 changed files with 1633 additions and 1030 deletions
+22 -11
View File
@@ -3,16 +3,27 @@
@{
ViewData["Title"] = "관리자 로그인";
ViewData["Description"] = "관리자 로그인 페이지입니다.";
ViewData["CanonicalUrl"] = $"{Request.Scheme}://{Request.Host}/taxbaik/admin/login";
ViewData["CanonicalUrl"] = $"{Request.Scheme}://{Request.Host}/admin/login";
}
<section class="container py-5" style="max-width: 560px;">
<div class="card shadow-sm border-0">
<section class="admin-login-shell">
<div class="admin-login-hero">
<p class="admin-login-kicker">TaxBaik Admin</p>
<h1>관리자 로그인</h1>
<p>로그인 후 대시보드, 문의 처리, 콘텐츠 운영 화면으로 바로 이동합니다.</p>
</div>
<div class="card shadow-sm border-0 admin-login-card">
<div class="card-body p-4 p-md-5">
<div class="mb-4">
<p class="text-uppercase text-muted small mb-1">TaxBaik Admin</p>
<h1 class="h3 fw-bold mb-2">관리자 로그인</h1>
<p class="text-muted mb-0">로그인 후 대시보드와 관리자 기능을 이용할 수 있습니다.</p>
<div class="admin-login-summary mb-4">
<div>
<p class="text-uppercase text-muted small mb-1">현재 화면</p>
<strong>로그인</strong>
</div>
<div>
<p class="text-uppercase text-muted small mb-1">진입 후</p>
<strong>대시보드 자동 이동</strong>
</div>
</div>
@if (!string.IsNullOrWhiteSpace(Model.ErrorMessage))
@@ -20,7 +31,7 @@
<div class="alert alert-danger" role="alert">@Model.ErrorMessage</div>
}
<form id="admin-login-form" method="post" class="vstack gap-3">
<form id="admin-login-form" method="post" class="vstack gap-3 admin-login-form">
@Html.AntiForgeryToken()
<input type="hidden" id="ReturnUrl" name="ReturnUrl" value="@Model.ReturnUrl" />
@@ -37,7 +48,7 @@
</div>
<div class="form-check">
<input class="form-check-input" id="RememberMe" name="RememberMe" type="checkbox" value="true" checked="@(Model.RememberMe ? "checked" : null)" />
<input class="form-check-input" id="RememberMe" name="RememberMe" type="checkbox" value="true" checked="@(Model.RememberMe)" />
<label class="form-check-label" for="RememberMe">로그인 상태 유지</label>
</div>
@@ -46,8 +57,8 @@
</button>
</form>
<p class="text-muted small mt-4 mb-0">
이 페이지는 서버 렌더링 기반입니다. 로그인 성공 후 관리자 웹앱으로 이동합니다.
<p class="admin-login-footnote">
이 페이지는 서버 렌더링 기반이며, 로그인 성공 후 관리자 웹앱으로 이동합니다.
</p>
</div>
</div>
+1 -4
View File
@@ -91,11 +91,8 @@ public class LoginModel(AuthService authService) : PageModel
if (string.Equals(absolute.Host, "www.taxbaik.com", StringComparison.OrdinalIgnoreCase) ||
string.Equals(absolute.Host, "taxbaik.com", StringComparison.OrdinalIgnoreCase))
{
// PathAndQuery에서 /taxbaik 프리픽스 제거 (Nginx가 처리)
var path = absolute.PathAndQuery;
return path.StartsWith("/taxbaik/", StringComparison.OrdinalIgnoreCase)
? path.Substring("/taxbaik".Length) // "/taxbaik/admin" → "/admin"
: path;
return path;
}
}
+3 -3
View File
@@ -8,7 +8,7 @@
rssContent.AppendLine("<rss version=\"2.0\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\">");
rssContent.AppendLine(" <channel>");
rssContent.AppendLine(" <title>백원숙 세무회계 - 블로그</title>");
rssContent.AppendLine(" <link>https://www.taxbaik.com/taxbaik</link>");
rssContent.AppendLine(" <link>https://www.taxbaik.com</link>");
rssContent.AppendLine(" <description>세무사 백원숙의 세금, 부동산, 가족자산 전문 블로그</description>");
rssContent.AppendLine(" <language>ko-kr</language>");
rssContent.AppendLine($" <lastBuildDate>{Model.LastBuildDate}</lastBuildDate>");
@@ -18,8 +18,8 @@
{
rssContent.AppendLine(" <item>");
rssContent.AppendLine($" <title>{System.Net.WebUtility.HtmlEncode(post.Title)}</title>");
rssContent.AppendLine($" <link>https://www.taxbaik.com/taxbaik/blog/{post.Slug}</link>");
rssContent.AppendLine($" <guid isPermaLink=\"true\">https://www.taxbaik.com/taxbaik/blog/{post.Slug}</guid>");
rssContent.AppendLine($" <link>https://www.taxbaik.com/blog/{post.Slug}</link>");
rssContent.AppendLine($" <guid isPermaLink=\"true\">https://www.taxbaik.com/blog/{post.Slug}</guid>");
rssContent.AppendLine($" <pubDate>{post.PublishedAt?.ToString("R")}</pubDate>");
var desc = post.Content?.Substring(0, Math.Min(200, post.Content?.Length ?? 0)) ?? "";
rssContent.AppendLine($" <description>{System.Net.WebUtility.HtmlEncode(desc)}</description>");
+1 -1
View File
@@ -3,7 +3,7 @@
@{
ViewData["Title"] = "고객 포털 로그인";
ViewData["Description"] = "고객 포털 로그인 페이지입니다.";
ViewData["CanonicalUrl"] = $"{Request.Scheme}://{Request.Host}/taxbaik/portal/login";
ViewData["CanonicalUrl"] = $"{Request.Scheme}://{Request.Host}/portal/login";
}
<section class="container py-5" style="max-width: 560px;">
+1 -1
View File
@@ -52,5 +52,5 @@ public class LoginModel : PageModel
public IActionResult OnPostKakao() => Challenge(BuildProps("kakao"), PortalOAuthDefaults.KakaoScheme);
private static AuthenticationProperties BuildProps(string provider) =>
new() { RedirectUri = $"/taxbaik/portal/external-callback?provider={provider}" };
new() { RedirectUri = $"/portal/external-callback?provider={provider}" };
}
+1 -1
View File
@@ -3,7 +3,7 @@
@{
ViewData["Title"] = "고객 포털 회원가입";
ViewData["Description"] = "고객 포털 회원가입 페이지입니다.";
ViewData["CanonicalUrl"] = $"{Request.Scheme}://{Request.Host}/taxbaik/portal/register";
ViewData["CanonicalUrl"] = $"{Request.Scheme}://{Request.Host}/portal/register";
}
<section class="container py-5" style="max-width: 640px;">
+3 -3
View File
@@ -8,7 +8,7 @@
rssContent.AppendLine("<rss version=\"2.0\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\">");
rssContent.AppendLine(" <channel>");
rssContent.AppendLine(" <title>백원숙 세무회계 - 블로그</title>");
rssContent.AppendLine(" <link>https://www.taxbaik.com/taxbaik</link>");
rssContent.AppendLine(" <link>https://www.taxbaik.com</link>");
rssContent.AppendLine(" <description>세무사 백원숙의 세금, 부동산, 가족자산 전문 블로그</description>");
rssContent.AppendLine(" <language>ko-kr</language>");
rssContent.AppendLine($" <lastBuildDate>{Model.LastBuildDate}</lastBuildDate>");
@@ -18,8 +18,8 @@
{
rssContent.AppendLine(" <item>");
rssContent.AppendLine($" <title>{System.Net.WebUtility.HtmlEncode(post.Title)}</title>");
rssContent.AppendLine($" <link>https://www.taxbaik.com/taxbaik/blog/{post.Slug}</link>");
rssContent.AppendLine($" <guid isPermaLink=\"true\">https://www.taxbaik.com/taxbaik/blog/{post.Slug}</guid>");
rssContent.AppendLine($" <link>https://www.taxbaik.com/blog/{post.Slug}</link>");
rssContent.AppendLine($" <guid isPermaLink=\"true\">https://www.taxbaik.com/blog/{post.Slug}</guid>");
rssContent.AppendLine($" <pubDate>{post.PublishedAt?.ToString("R")}</pubDate>");
var desc = post.Content?.Substring(0, Math.Min(200, post.Content?.Length ?? 0)) ?? "";
rssContent.AppendLine($" <description>{System.Net.WebUtility.HtmlEncode(desc)}</description>");
+1 -1
View File
@@ -16,7 +16,7 @@ public class SitemapModel : PageModel
public async Task OnGetAsync()
{
var baseUrl = "https://www.taxbaik.com/taxbaik";
var baseUrl = "https://www.taxbaik.com";
// 정적 페이지 (항상 포함)
Urls.AddRange(new[]
+5 -6
View File
@@ -11,14 +11,14 @@
<meta property="og:type" content="website" />
<meta property="og:title" content="@(ViewData["Title"] ?? "백원숙 세무회계 - 세무사 전문 상담")" />
<meta property="og:description" content="@(ViewData["Description"] ?? "백원숙 세무회계 - 사업자 기장, 부동산 양도세·증여세, 종합소득세 전문 상담. 맞춤형 세무 절세 컨설팅 제공.")" />
<meta property="og:image" content="@(ViewData["OgImage"] ?? "https://www.taxbaik.com/taxbaik/images/og-image.jpg")" />
<meta property="og:url" content="@(ViewData["OgUrl"] ?? "https://www.taxbaik.com/taxbaik/")" />
<meta property="og:image" content="@(ViewData["OgImage"] ?? "https://www.taxbaik.com/images/og-image.jpg")" />
<meta property="og:url" content="@(ViewData["OgUrl"] ?? "https://www.taxbaik.com/")" />
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="@(ViewData["Title"] ?? "백원숙 세무회계 - 세무사 전문 상담")" />
<meta property="twitter:description" content="@(ViewData["Description"] ?? "백원숙 세무회계 - 사업자 기장, 부동산 양도세·증여세, 종합소득세 전문 상담. 맞춤형 세무 절세 컨설팅 제공.")" />
<meta property="twitter:image" content="@(ViewData["OgImage"] ?? "https://www.taxbaik.com/taxbaik/images/og-image.jpg")" />
<meta property="twitter:image" content="@(ViewData["OgImage"] ?? "https://www.taxbaik.com/images/og-image.jpg")" />
<!-- 검색엔진 등록용 소유권 인증 메타 태그 (발급받으신 토큰이 있으면 아래 content에 넣어 주시면 됩니다) -->
<!-- <meta name="naver-site-verification" content="네이버_서치어드바이저_토큰_입력" /> -->
@@ -27,7 +27,6 @@
<meta name="robots" content="index, follow" />
<meta name="theme-color" content="#C89D6E" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="alternate icon" href="/favicon.ico" />
<!-- RSS Feed -->
<link rel="alternate" type="application/rss+xml" title="백원숙 세무회계 블로그" href="/rss.xml" />
@@ -36,7 +35,7 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=Noto+Sans+KR:wght@400;500;700&family=Outfit:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
<link rel="canonical" href="@(ViewData["CanonicalUrl"] ?? "https://www.taxbaik.com/taxbaik/")" />
<link rel="canonical" href="@(ViewData["CanonicalUrl"] ?? "https://www.taxbaik.com/")" />
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
@@ -47,7 +46,7 @@
"@@type": "ProfessionalService",
"name": "백원숙 세무회계",
"description": "사업자 기장, 부동산 양도세·증여세, 종합소득세 전문 상담 세무사",
"url": "https://www.taxbaik.com/taxbaik/",
"url": "https://www.taxbaik.com/",
"telephone": "010-4122-8268",
"email": "taxbaik5668@gmail.com",
"address": {