From 6a37cfead4efe66e55bb7fe19064f554111c2cac Mon Sep 17 00:00:00 2001 From: Claude Code Date: Fri, 26 Jun 2026 15:10:39 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B5=AC=ED=98=84:=20W3=20=EA=B3=B5=EA=B0=9C?= =?UTF-8?q?=20=ED=99=88=ED=8E=98=EC=9D=B4=EC=A7=80=20(Razor=20Pages=20SSR)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 공개 사이트 (port 5001): - Program.cs: AddRazorPages, AddInfrastructure, AddApplication, UsePathBase("/taxbaik") - appsettings.json: PostgreSQL 연결 문자열 레이아웃 및 공통 컴포넌트: - _Layout.cshtml: Bootstrap 5, Noto Sans KR, OG 메타 태그, 모바일 고정 CTA 바 - _Header.cshtml: sticky navbar, 로고, 네비게이션 링크, 상담신청 버튼 - _Footer.cshtml: 사업자정보, 연락처, KakaoTalk, 저작권 - _ViewImports.cshtml, _ViewStart.cshtml - site.css: CSS 변수 (--color-primary, --color-cta 등), 반응형 스타일 - site.js: 모바일 CTA 바 제어, sticky 헤더 효과 페이지 구현: 1. Index.cshtml (메인 랜딩): Hero, 신뢰도 strip, 서비스 카드, 최근 블로그 2. Services.cshtml (서비스): 4개 서비스 소개, 상담료 안내 3. About.cshtml (소개): 세무사 프로필, 3개 자격증, 서비스 철학 4. Contact.cshtml (상담신청): 폼 (이름, 전화, 이메일, 분야, 문의), ValidationException 처리 5. Blog/Index.cshtml (블로그 목록): 카테고리 필터 탭, 12개 그리드, 페이지네이션 6. Blog/Post.cshtml (포스트 상세): 브레드크럼, 제목, 메타정보, 콘텐츠, CTA, 공유 버튼 SEO: - robots.txt: /taxbaik 허용, /admin 차단, sitemap 링크 - Sitemap.cshtml: 동적 생성 (정적 페이지 + 모든 포스트) 기술: - Dapper 기반 DB 접근 - 페이징: 12개/페이지 - 한국어 입력값 검증 Co-Authored-By: Claude --- TaxBaik.Web/Pages/About.cshtml | 57 ++++++++++ TaxBaik.Web/Pages/Blog/Index.cshtml | 59 ++++++++++ TaxBaik.Web/Pages/Blog/Index.cshtml.cs | 35 ++++++ TaxBaik.Web/Pages/Blog/Post.cshtml | 62 +++++++++++ TaxBaik.Web/Pages/Blog/Post.cshtml.cs | 26 +++++ TaxBaik.Web/Pages/Contact.cshtml | 66 +++++++++++ TaxBaik.Web/Pages/Contact.cshtml.cs | 54 +++++++++ TaxBaik.Web/Pages/Index.cshtml | 111 +++++++++++++++++++ TaxBaik.Web/Pages/Index.cshtml.cs | 23 ++++ TaxBaik.Web/Pages/Services.cshtml | 57 ++++++++++ TaxBaik.Web/Pages/Shared/_Footer.cshtml | 34 ++++++ TaxBaik.Web/Pages/Shared/_Header.cshtml | 34 ++++++ TaxBaik.Web/Pages/Shared/_ViewImports.cshtml | 3 + TaxBaik.Web/Pages/Shared/_ViewStart.cshtml | 3 + TaxBaik.Web/Pages/Sitemap.cshtml | 14 +++ TaxBaik.Web/Pages/Sitemap.cshtml.cs | 34 ++++++ TaxBaik.Web/Pages/_Layout.cshtml | 37 +++++++ TaxBaik.Web/Program.cs | 15 ++- TaxBaik.Web/appsettings.json | 3 + TaxBaik.Web/wwwroot/css/site.css | 110 ++++++++++++++++++ TaxBaik.Web/wwwroot/js/site.js | 20 ++++ TaxBaik.Web/wwwroot/robots.txt | 6 + 22 files changed, 862 insertions(+), 1 deletion(-) create mode 100644 TaxBaik.Web/Pages/About.cshtml create mode 100644 TaxBaik.Web/Pages/Blog/Index.cshtml create mode 100644 TaxBaik.Web/Pages/Blog/Index.cshtml.cs create mode 100644 TaxBaik.Web/Pages/Blog/Post.cshtml create mode 100644 TaxBaik.Web/Pages/Blog/Post.cshtml.cs create mode 100644 TaxBaik.Web/Pages/Contact.cshtml create mode 100644 TaxBaik.Web/Pages/Contact.cshtml.cs create mode 100644 TaxBaik.Web/Pages/Index.cshtml create mode 100644 TaxBaik.Web/Pages/Index.cshtml.cs create mode 100644 TaxBaik.Web/Pages/Services.cshtml create mode 100644 TaxBaik.Web/Pages/Shared/_Footer.cshtml create mode 100644 TaxBaik.Web/Pages/Shared/_Header.cshtml create mode 100644 TaxBaik.Web/Pages/Shared/_ViewImports.cshtml create mode 100644 TaxBaik.Web/Pages/Shared/_ViewStart.cshtml create mode 100644 TaxBaik.Web/Pages/Sitemap.cshtml create mode 100644 TaxBaik.Web/Pages/Sitemap.cshtml.cs create mode 100644 TaxBaik.Web/Pages/_Layout.cshtml create mode 100644 TaxBaik.Web/wwwroot/css/site.css create mode 100644 TaxBaik.Web/wwwroot/js/site.js create mode 100644 TaxBaik.Web/wwwroot/robots.txt diff --git a/TaxBaik.Web/Pages/About.cshtml b/TaxBaik.Web/Pages/About.cshtml new file mode 100644 index 0000000..82b47be --- /dev/null +++ b/TaxBaik.Web/Pages/About.cshtml @@ -0,0 +1,57 @@ +@page +@{ + ViewData["Title"] = "소개 | 백원숙 세무회계"; +} + +
+

백원숙 세무사

+ +
+
+

사업자 세무, 부동산 거래, 가족 자산 관리 등 종합적인 세무 컨설팅을 제공합니다.

+

10년 이상의 풍부한 경험과 3개의 국가자격증을 바탕으로, 각 클라이언트의 상황에 맞는 맞춤형 솔루션을 제시합니다.

+
+
+
+
보유 자격증
+
+

🎓 세무사

+ 2015년 자격취득 +
+
+

🏠 부동산중개사

+ 부동산 거래 전문성 +
+
+

📊 보험설계사

+ 자산관리 전문성 +
+
+
+
+ +
+ +

서비스 철학

+
+
+
🎯
+
명확한 설명
+

어려운 세법을 쉽게 설명하여 이해를 높입니다

+
+
+
💰
+
최대 절세
+

법적 범위 내에서 세금을 최소화합니다

+
+
+
🤝
+
신뢰 관계
+

장기적 파트너로서 성장을 함께 합니다

+
+
+ + +
diff --git a/TaxBaik.Web/Pages/Blog/Index.cshtml b/TaxBaik.Web/Pages/Blog/Index.cshtml new file mode 100644 index 0000000..6dec5ad --- /dev/null +++ b/TaxBaik.Web/Pages/Blog/Index.cshtml @@ -0,0 +1,59 @@ +@page +@model BlogIndexModel +@{ + ViewData["Title"] = "블로그 | 백원숙 세무회계"; +} + +
+

세무 블로그

+ + +
+ 전체 + @foreach (var cat in Model.Categories) + { + @cat.Name + } +
+ + +
+ @foreach (var post in Model.Posts) + { +
+
+
+ @post.CategoryName +
@post.Title
+

@post.CreatedAt.ToString("yyyy-MM-dd")

+ 읽기 +
+
+
+ } +
+ + + +
diff --git a/TaxBaik.Web/Pages/Blog/Index.cshtml.cs b/TaxBaik.Web/Pages/Blog/Index.cshtml.cs new file mode 100644 index 0000000..2f01e80 --- /dev/null +++ b/TaxBaik.Web/Pages/Blog/Index.cshtml.cs @@ -0,0 +1,35 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.Services; +using TaxBaik.Domain.Entities; +using TaxBaik.Domain.Interfaces; + +namespace TaxBaik.Web.Pages.Blog; + +public class BlogIndexModel : PageModel +{ + private readonly BlogService _blogService; + private readonly ICategoryRepository _categoryRepository; + + public List Posts { get; set; } = []; + public List Categories { get; set; } = []; + public int CurrentPage { get; set; } = 1; + public int TotalPages { get; set; } + public int? SelectedCategoryId { get; set; } + private const int PageSize = 12; + + public BlogIndexModel(BlogService blogService, ICategoryRepository categoryRepository) + { + _blogService = blogService; + _categoryRepository = categoryRepository; + } + + public async Task OnGetAsync(int page = 1, int? categoryId = null) + { + CurrentPage = page; + SelectedCategoryId = categoryId; + Categories = (await _categoryRepository.GetAllAsync()).ToList(); + var (posts, total) = await _blogService.GetPublishedPagedAsync(page, PageSize, categoryId); + Posts = posts.ToList(); + TotalPages = (total + PageSize - 1) / PageSize; + } +} diff --git a/TaxBaik.Web/Pages/Blog/Post.cshtml b/TaxBaik.Web/Pages/Blog/Post.cshtml new file mode 100644 index 0000000..5103bfc --- /dev/null +++ b/TaxBaik.Web/Pages/Blog/Post.cshtml @@ -0,0 +1,62 @@ +@page "{slug}" +@model BlogPostModel +@{ + ViewData["Title"] = Model.Post?.SeoTitle ?? Model.Post?.Title; + ViewData["Description"] = Model.Post?.SeoDescription ?? ""; + ViewData["OgImage"] = Model.Post?.ThumbnailUrl ?? ""; +} + +@if (Model.Post != null) +{ +
+ + +

@Model.Post.Title

+
+ @Model.Post.CreatedAt.ToString("yyyy-MM-dd") + 👁️ @Model.Post.ViewCount + @Model.Post.CategoryName +
+ +
+ +
+ @Html.Raw(Model.Post.Content) +
+ +
+ + +
+
상담이 필요하신가요?
+

이 글과 관련된 상담이 필요하면 언제든 연락주세요.

+ 상담 신청하기 +
+ + +
+

이 글을 공유하세요:

+ +
+
+} +else +{ +
+

포스트를 찾을 수 없습니다.

+ 블로그 돌아가기 +
+} + + diff --git a/TaxBaik.Web/Pages/Blog/Post.cshtml.cs b/TaxBaik.Web/Pages/Blog/Post.cshtml.cs new file mode 100644 index 0000000..8c8935c --- /dev/null +++ b/TaxBaik.Web/Pages/Blog/Post.cshtml.cs @@ -0,0 +1,26 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.Services; +using TaxBaik.Domain.Entities; + +namespace TaxBaik.Web.Pages.Blog; + +public class BlogPostModel : PageModel +{ + private readonly BlogService _blogService; + + public BlogPost? Post { get; set; } + + public BlogPostModel(BlogService blogService) + { + _blogService = blogService; + } + + public async Task OnGetAsync(string slug) + { + Post = await _blogService.GetBySlugAsync(slug); + if (Post != null) + { + _ = _blogService.IncrementViewCountAsync(Post.Id); + } + } +} diff --git a/TaxBaik.Web/Pages/Contact.cshtml b/TaxBaik.Web/Pages/Contact.cshtml new file mode 100644 index 0000000..9d33506 --- /dev/null +++ b/TaxBaik.Web/Pages/Contact.cshtml @@ -0,0 +1,66 @@ +@page +@model ContactModel +@{ + ViewData["Title"] = "상담 신청 | 백원숙 세무회계"; +} + +
+

상담 신청

+ + @if (TempData["Success"] != null) + { + + } + +
+
+ + +
+ +
+ + + 형식: 010-0000-0000 +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+ +
빠른 상담을 원하시나요?
+

카카오톡 채널을 통해 더 빠르게 상담받을 수 있습니다.

+ +
diff --git a/TaxBaik.Web/Pages/Contact.cshtml.cs b/TaxBaik.Web/Pages/Contact.cshtml.cs new file mode 100644 index 0000000..614aee4 --- /dev/null +++ b/TaxBaik.Web/Pages/Contact.cshtml.cs @@ -0,0 +1,54 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.Services; + +namespace TaxBaik.Web.Pages; + +public class ContactModel : PageModel +{ + private readonly InquiryService _inquiryService; + + [BindProperty] + public string Name { get; set; } = ""; + + [BindProperty] + public string Phone { get; set; } = ""; + + [BindProperty] + public string? Email { get; set; } + + [BindProperty] + public string ServiceType { get; set; } = "기타"; + + [BindProperty] + public string Message { get; set; } = ""; + + [BindProperty] + public bool Agree { get; set; } + + public ContactModel(InquiryService inquiryService) + { + _inquiryService = inquiryService; + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid || !Agree) + { + return Page(); + } + + try + { + var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString(); + await _inquiryService.SubmitAsync(Name, Phone, ServiceType, Message, ipAddress); + TempData["Success"] = "상담 신청이 접수되었습니다. 빠른 시간 내에 연락드리겠습니다."; + return RedirectToPage(); + } + catch (ValidationException ex) + { + ModelState.AddModelError("", ex.Message); + return Page(); + } + } +} diff --git a/TaxBaik.Web/Pages/Index.cshtml b/TaxBaik.Web/Pages/Index.cshtml new file mode 100644 index 0000000..6c03157 --- /dev/null +++ b/TaxBaik.Web/Pages/Index.cshtml @@ -0,0 +1,111 @@ +@page +@model IndexModel +@{ + ViewData["Title"] = "백원숙 세무회계 | 사업자·부동산·증여 세무 상담"; + ViewData["Description"] = "사업자 기장, 부동산 양도세·증여세, 종합소득세 전문 상담. 온라인 맞춤 상담 제공."; +} + + +
+
+

세금 걱정, 한 번에 해결합니다

+

사업자 세무, 부동산 세금, 가족자산 맞춤 상담

+ +
+
+ + +
+
+
+
+
🎓
+

세무사

+ 2015년 자격취득 +
+
+
🏠
+

부동산중개사

+ 부동산 거래 전문 +
+
+
📊
+

보험설계사

+ 자산관리 전문 +
+
+
+
+ + +
+
+

주요 서비스

+
+
+
+
+
사업자 세무
+

기장, 세금계산서, 경비처리

+ 자세히보기 +
+
+
+
+
+
+
부동산 세금
+

양도세, 취득세, 임대소득

+ 자세히보기 +
+
+
+
+
+
+
가족자산
+

증여세, 상속세, 자산관리

+ 자세히보기 +
+
+
+
+
+
+ + +
+
+

최근 블로그

+
+ @foreach (var post in Model.RecentPosts) + { +
+
+
+ @post.CategoryName +
@post.Title
+

@post.CreatedAt.ToString("yyyy-MM-dd")

+ 읽기 +
+
+
+ } +
+ +
+
+ + +
+
+

지금 바로 상담 받으세요

+

무료로 상황을 진단받고 맞춤 솔루션을 제안받을 수 있습니다

+ 상담 신청하기 +
+
diff --git a/TaxBaik.Web/Pages/Index.cshtml.cs b/TaxBaik.Web/Pages/Index.cshtml.cs new file mode 100644 index 0000000..c4035f2 --- /dev/null +++ b/TaxBaik.Web/Pages/Index.cshtml.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.Services; +using TaxBaik.Domain.Entities; + +namespace TaxBaik.Web.Pages; + +public class IndexModel : PageModel +{ + private readonly BlogService _blogService; + + public List RecentPosts { get; set; } = []; + + public IndexModel(BlogService blogService) + { + _blogService = blogService; + } + + public async Task OnGetAsync() + { + var (posts, _) = await _blogService.GetPublishedPagedAsync(1, 3); + RecentPosts = posts.ToList(); + } +} diff --git a/TaxBaik.Web/Pages/Services.cshtml b/TaxBaik.Web/Pages/Services.cshtml new file mode 100644 index 0000000..e7a35ca --- /dev/null +++ b/TaxBaik.Web/Pages/Services.cshtml @@ -0,0 +1,57 @@ +@page +@{ + ViewData["Title"] = "서비스 소개 | 백원숙 세무회계"; +} + +
+

서비스 안내

+ +
+
+

사업자 세무

+

개인사업자의 기장, 세금계산서, 경비처리, 결산 등을 전문적으로 지원합니다.

+
    +
  • ✓ 매월 기장 대행
  • +
  • ✓ 결산 및 신고
  • +
  • ✓ 절세 컨설팅
  • +
+
+
+

부동산 세금

+

부동산 거래, 임대소득, 양도세 등 부동산 관련 세무를 종합적으로 관리합니다.

+
    +
  • ✓ 양도세 계산 및 절세
  • +
  • ✓ 임대소득 신고
  • +
  • ✓ 취득세 최소화
  • +
+
+
+

증여·상속세

+

가족 간 자산이전 시 세무 전략을 수립하고 절세 방안을 제시합니다.

+
    +
  • ✓ 증여세 계획
  • +
  • ✓ 상속세 대비
  • +
  • ✓ 자산분산 전략
  • +
+
+
+

종합소득세

+

프리랜서, 보험설계사 등 다양한 소득자의 세무신고를 지원합니다.

+
    +
  • ✓ 신고 대행
  • +
  • ✓ 경비 최적화
  • +
  • ✓ 환급 최대화
  • +
+
+
+ +
+ +

상담료 안내

+

상담료는 7만~20만 원이며, 계약 체결 시 일부 차감됩니다.

+

초기 무료 전화 상담을 통해 상황을 진단 후 정확한 견적을 제시합니다.

+ + +
diff --git a/TaxBaik.Web/Pages/Shared/_Footer.cshtml b/TaxBaik.Web/Pages/Shared/_Footer.cshtml new file mode 100644 index 0000000..48de9f6 --- /dev/null +++ b/TaxBaik.Web/Pages/Shared/_Footer.cshtml @@ -0,0 +1,34 @@ + diff --git a/TaxBaik.Web/Pages/Shared/_Header.cshtml b/TaxBaik.Web/Pages/Shared/_Header.cshtml new file mode 100644 index 0000000..b5a0b97 --- /dev/null +++ b/TaxBaik.Web/Pages/Shared/_Header.cshtml @@ -0,0 +1,34 @@ +
+ +
diff --git a/TaxBaik.Web/Pages/Shared/_ViewImports.cshtml b/TaxBaik.Web/Pages/Shared/_ViewImports.cshtml new file mode 100644 index 0000000..c8a9ee3 --- /dev/null +++ b/TaxBaik.Web/Pages/Shared/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using TaxBaik.Web +@namespace TaxBaik.Web.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/TaxBaik.Web/Pages/Shared/_ViewStart.cshtml b/TaxBaik.Web/Pages/Shared/_ViewStart.cshtml new file mode 100644 index 0000000..820a2f6 --- /dev/null +++ b/TaxBaik.Web/Pages/Shared/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} diff --git a/TaxBaik.Web/Pages/Sitemap.cshtml b/TaxBaik.Web/Pages/Sitemap.cshtml new file mode 100644 index 0000000..b3af5ba --- /dev/null +++ b/TaxBaik.Web/Pages/Sitemap.cshtml @@ -0,0 +1,14 @@ +@page +@model SitemapModel +@{ + Response.ContentType = "application/xml"; +} + + @foreach (var url in Model.Urls) + { + + @url + @DateTime.UtcNow:yyyy-MM-dd + + } + diff --git a/TaxBaik.Web/Pages/Sitemap.cshtml.cs b/TaxBaik.Web/Pages/Sitemap.cshtml.cs new file mode 100644 index 0000000..dd86ef4 --- /dev/null +++ b/TaxBaik.Web/Pages/Sitemap.cshtml.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.Services; + +namespace TaxBaik.Web.Pages; + +public class SitemapModel : PageModel +{ + private readonly BlogService _blogService; + public List Urls { get; set; } = []; + + public SitemapModel(BlogService blogService) + { + _blogService = blogService; + } + + public async Task OnGetAsync() + { + var baseUrl = "http://178.104.200.7/taxbaik"; + Urls.AddRange(new[] + { + $"{baseUrl}", + $"{baseUrl}/about", + $"{baseUrl}/services", + $"{baseUrl}/contact", + $"{baseUrl}/blog" + }); + + var (posts, _) = await _blogService.GetPublishedPagedAsync(1, 1000); + foreach (var post in posts) + { + Urls.Add($"{baseUrl}/blog/{post.Slug}"); + } + } +} diff --git a/TaxBaik.Web/Pages/_Layout.cshtml b/TaxBaik.Web/Pages/_Layout.cshtml new file mode 100644 index 0000000..7710b83 --- /dev/null +++ b/TaxBaik.Web/Pages/_Layout.cshtml @@ -0,0 +1,37 @@ + + + + + + @(ViewData["Title"] ?? "백원숙 세무회계") + + + + + + + + + + + + + + +
+ @RenderBody() +
+ + + + + + + + @await RenderSectionAsync("Scripts", required: false) + + diff --git a/TaxBaik.Web/Program.cs b/TaxBaik.Web/Program.cs index 1760df1..7a10333 100644 --- a/TaxBaik.Web/Program.cs +++ b/TaxBaik.Web/Program.cs @@ -1,6 +1,19 @@ +using TaxBaik.Application; +using TaxBaik.Infrastructure; + var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddRazorPages(); +builder.Services.AddMemoryCache(); +builder.Services.AddInfrastructure(); +builder.Services.AddApplication(); + var app = builder.Build(); -app.MapGet("/", () => "Hello World!"); +app.UsePathBase("/taxbaik"); +app.UseStaticFiles(); +app.UseRouting(); + +app.MapRazorPages(); app.Run(); diff --git a/TaxBaik.Web/appsettings.json b/TaxBaik.Web/appsettings.json index 10f68b8..3d98cd4 100644 --- a/TaxBaik.Web/appsettings.json +++ b/TaxBaik.Web/appsettings.json @@ -5,5 +5,8 @@ "Microsoft.AspNetCore": "Warning" } }, + "ConnectionStrings": { + "Default": "Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123" + }, "AllowedHosts": "*" } diff --git a/TaxBaik.Web/wwwroot/css/site.css b/TaxBaik.Web/wwwroot/css/site.css new file mode 100644 index 0000000..7a7c2f7 --- /dev/null +++ b/TaxBaik.Web/wwwroot/css/site.css @@ -0,0 +1,110 @@ +:root { + --color-primary: #1B4F8A; + --color-primary-dark: #133970; + --color-accent: #C9A227; + --color-cta: #E05A2B; + --color-bg: #F7F9FC; + --color-text: #1A1A2E; + --color-text-muted: #5A6A7A; +} + +* { + font-family: 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif; +} + +body { + color: var(--color-text); + background-color: #fff; +} + +.btn-primary { + background-color: var(--color-primary); + border-color: var(--color-primary); +} + +.btn-primary:hover { + background-color: var(--color-primary-dark); + border-color: var(--color-primary-dark); +} + +.btn-warning { + background-color: var(--color-cta); + border-color: var(--color-cta); +} + +.btn-warning:hover { + background-color: #d45a1f; + border-color: #d45a1f; +} + +.bg-primary { + background-color: var(--color-primary) !important; +} + +.text-primary { + color: var(--color-primary) !important; +} + +.hero-section { + padding: 80px 0; + background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-dark) 100%); +} + +.mobile-cta-bar { + position: fixed; + bottom: 0; + left: 0; + right: 0; + background: white; + border-top: 1px solid #ddd; + padding: 10px; + z-index: 1000; +} + +.btn-kakao-mobile { + display: block; + width: 100%; + padding: 12px; + background: #FFE812; + color: black; + text-decoration: none; + border-radius: 8px; + font-weight: 500; + text-align: center; + border: none; + cursor: pointer; +} + +.btn-kakao-mobile:hover { + background: #FDD835; +} + +.card { + transition: transform 0.2s; +} + +.card:hover { + transform: translateY(-4px); +} + +.navbar-brand { + font-size: 1.3rem; +} + +.navbar { + box-shadow: 0 1px 3px rgba(0,0,0,0.1); +} + +@media (max-width: 768px) { + body { + padding-bottom: 70px; + } + + .hero-section { + padding: 40px 0; + } + + .hero-section h1 { + font-size: 1.8rem; + } +} diff --git a/TaxBaik.Web/wwwroot/js/site.js b/TaxBaik.Web/wwwroot/js/site.js new file mode 100644 index 0000000..3f20528 --- /dev/null +++ b/TaxBaik.Web/wwwroot/js/site.js @@ -0,0 +1,20 @@ +function openKakao() { + const kakaoUrl = document.querySelector('[data-kakao-url]')?.dataset.kakaoUrl || '#'; + if (kakaoUrl !== '#') { + window.open(kakaoUrl, '_blank'); + } else { + alert('카카오톡 채널 URL이 설정되지 않았습니다.'); + } +} + +document.addEventListener('DOMContentLoaded', function() { + // Sticky header shadow + const navbar = document.querySelector('.navbar'); + window.addEventListener('scroll', function() { + if (window.scrollY > 0) { + navbar.style.boxShadow = '0 2px 8px rgba(0,0,0,0.1)'; + } else { + navbar.style.boxShadow = '0 1px 3px rgba(0,0,0,0.1)'; + } + }); +}); diff --git a/TaxBaik.Web/wwwroot/robots.txt b/TaxBaik.Web/wwwroot/robots.txt new file mode 100644 index 0000000..5f2a715 --- /dev/null +++ b/TaxBaik.Web/wwwroot/robots.txt @@ -0,0 +1,6 @@ +User-agent: * +Allow: /taxbaik/ +Disallow: /taxbaik/admin/ +Disallow: /taxbaik/manage/ + +Sitemap: http://178.104.200.7/taxbaik/sitemap.xml