From e3addc1a79107dd74df227e76f9532c2eb1b56d7 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Thu, 9 Jul 2026 14:06:14 +0900 Subject: [PATCH] Implement admin CRUD for announcements inquiries and faqs --- .../Pages/Admin/Announcements/Create.cshtml | 56 +++++++++++++++++ .../Admin/Announcements/Create.cshtml.cs | 26 ++++++++ .../Pages/Admin/Announcements/Edit.cshtml | 60 +++++++++++++++++++ .../Pages/Admin/Announcements/Edit.cshtml.cs | 54 +++++++++++++++++ .../Pages/Admin/Announcements/Index.cshtml | 22 +++++-- .../Pages/Admin/Faqs/Create.cshtml | 47 +++++++++++++++ .../Pages/Admin/Faqs/Create.cshtml.cs | 32 ++++++++++ .../Pages/Admin/Faqs/Detail.cshtml | 43 +++++++++++++ .../Pages/Admin/Faqs/Detail.cshtml.cs | 20 +++++++ src/TaxBaik.Web/Pages/Admin/Faqs/Edit.cshtml | 51 ++++++++++++++++ .../Pages/Admin/Faqs/Edit.cshtml.cs | 54 +++++++++++++++++ src/TaxBaik.Web/Pages/Admin/Faqs/Index.cshtml | 14 +++-- .../Pages/Admin/Inquiries/Create.cshtml | 45 +++++++++++++- .../Pages/Admin/Inquiries/Create.cshtml.cs | 43 ++++++++++++- .../Pages/Admin/Inquiries/Detail.cshtml | 49 ++++++++++++++- .../Pages/Admin/Inquiries/Detail.cshtml.cs | 19 +++++- .../Pages/Admin/Inquiries/Edit.cshtml | 49 ++++++++++++++- .../Pages/Admin/Inquiries/Edit.cshtml.cs | 55 ++++++++++++++++- .../Pages/Admin/Inquiries/Index.cshtml | 11 +++- 19 files changed, 727 insertions(+), 23 deletions(-) create mode 100644 src/TaxBaik.Web/Pages/Admin/Announcements/Create.cshtml create mode 100644 src/TaxBaik.Web/Pages/Admin/Announcements/Create.cshtml.cs create mode 100644 src/TaxBaik.Web/Pages/Admin/Announcements/Edit.cshtml create mode 100644 src/TaxBaik.Web/Pages/Admin/Announcements/Edit.cshtml.cs create mode 100644 src/TaxBaik.Web/Pages/Admin/Faqs/Create.cshtml create mode 100644 src/TaxBaik.Web/Pages/Admin/Faqs/Create.cshtml.cs create mode 100644 src/TaxBaik.Web/Pages/Admin/Faqs/Detail.cshtml create mode 100644 src/TaxBaik.Web/Pages/Admin/Faqs/Detail.cshtml.cs create mode 100644 src/TaxBaik.Web/Pages/Admin/Faqs/Edit.cshtml create mode 100644 src/TaxBaik.Web/Pages/Admin/Faqs/Edit.cshtml.cs diff --git a/src/TaxBaik.Web/Pages/Admin/Announcements/Create.cshtml b/src/TaxBaik.Web/Pages/Admin/Announcements/Create.cshtml new file mode 100644 index 0000000..42aa3ad --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/Announcements/Create.cshtml @@ -0,0 +1,56 @@ +@page +@model TaxBaik.Web.Pages.Admin.Announcements.CreateModel +@{ ViewData["Title"] = "공지사항 작성"; } + +
+ + +
+
+ +
+
+ + + +
+
+ + +
+
+ + + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ +
+
diff --git a/src/TaxBaik.Web/Pages/Admin/Announcements/Create.cshtml.cs b/src/TaxBaik.Web/Pages/Admin/Announcements/Create.cshtml.cs new file mode 100644 index 0000000..296335b --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/Announcements/Create.cshtml.cs @@ -0,0 +1,26 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.DTOs; +using TaxBaik.Application.Services; +using TaxBaik.Web.Services; + +namespace TaxBaik.Web.Pages.Admin.Announcements; + +[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] +public class CreateModel(AnnouncementService announcementService) : PageModel +{ + [BindProperty] + public AnnouncementDto Input { get; set; } = new(); + + public IActionResult OnGet() => Page(); + + public async Task OnPostAsync(CancellationToken ct) + { + if (!ModelState.IsValid) + return Page(); + + await announcementService.CreateAsync(Input, ct); + return RedirectToPage("/Admin/Announcements/Index"); + } +} diff --git a/src/TaxBaik.Web/Pages/Admin/Announcements/Edit.cshtml b/src/TaxBaik.Web/Pages/Admin/Announcements/Edit.cshtml new file mode 100644 index 0000000..cf607f9 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/Announcements/Edit.cshtml @@ -0,0 +1,60 @@ +@page "{id:int}" +@model TaxBaik.Web.Pages.Admin.Announcements.EditModel +@{ ViewData["Title"] = "공지사항 수정"; } + +
+ + +
+
+ + +
+
+ + + +
+
+ + +
+
+ + + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+ +
+
diff --git a/src/TaxBaik.Web/Pages/Admin/Announcements/Edit.cshtml.cs b/src/TaxBaik.Web/Pages/Admin/Announcements/Edit.cshtml.cs new file mode 100644 index 0000000..2603a1b --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/Announcements/Edit.cshtml.cs @@ -0,0 +1,54 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.DTOs; +using TaxBaik.Application.Services; +using TaxBaik.Web.Services; + +namespace TaxBaik.Web.Pages.Admin.Announcements; + +[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] +public class EditModel(AnnouncementService announcementService) : PageModel +{ + [BindProperty(SupportsGet = true)] + public int Id { get; set; } + + [BindProperty] + public AnnouncementDto Input { get; set; } = new(); + + public async Task OnGetAsync(CancellationToken ct) + { + var item = await announcementService.GetByIdAsync(Id, ct); + if (item is null) + return NotFound(); + + Input = new AnnouncementDto + { + Id = item.Id, + Title = item.Title, + Content = item.Content, + DisplayType = item.DisplayType, + IsActive = item.IsActive, + StartsAt = item.StartsAt, + EndsAt = item.EndsAt, + SortOrder = item.SortOrder + }; + + return Page(); + } + + public async Task OnPostAsync(CancellationToken ct) + { + if (!ModelState.IsValid) + return Page(); + + await announcementService.UpdateAsync(Input, ct); + return RedirectToPage("/Admin/Announcements/Index"); + } + + public async Task OnPostDeleteAsync(CancellationToken ct) + { + await announcementService.DeleteAsync(Id, ct); + return RedirectToPage("/Admin/Announcements/Index"); + } +} diff --git a/src/TaxBaik.Web/Pages/Admin/Announcements/Index.cshtml b/src/TaxBaik.Web/Pages/Admin/Announcements/Index.cshtml index 9508aa1..a143b79 100644 --- a/src/TaxBaik.Web/Pages/Admin/Announcements/Index.cshtml +++ b/src/TaxBaik.Web/Pages/Admin/Announcements/Index.cshtml @@ -3,27 +3,39 @@ @{ ViewData["Title"] = "공지사항"; }
- +
- +
- + + + + + + + @if (Model.Items.Count == 0) { - + } else { foreach (var item in Model.Items) { - + + } } diff --git a/src/TaxBaik.Web/Pages/Admin/Faqs/Create.cshtml b/src/TaxBaik.Web/Pages/Admin/Faqs/Create.cshtml new file mode 100644 index 0000000..0574732 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/Faqs/Create.cshtml @@ -0,0 +1,47 @@ +@page +@model TaxBaik.Web.Pages.Admin.Faqs.CreateModel +@{ ViewData["Title"] = "FAQ 작성"; } + +
+ + +
+
+ +
+
+ + +
+
+ + + + @foreach (var category in Model.Categories) + { + + } + +
+
+ + +
+
+ + +
+
+ +
+
+
+ + +
diff --git a/src/TaxBaik.Web/Pages/Admin/Faqs/Create.cshtml.cs b/src/TaxBaik.Web/Pages/Admin/Faqs/Create.cshtml.cs new file mode 100644 index 0000000..5e93466 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/Faqs/Create.cshtml.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Domain.Entities; +using TaxBaik.Application.Services; +using TaxBaik.Web.Services; + +namespace TaxBaik.Web.Pages.Admin.Faqs; + +[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] +public class CreateModel(FaqService faqService) : PageModel +{ + [BindProperty] + public Faq Input { get; set; } = new(); + + public IReadOnlyList Categories => FaqService.Categories; + + public IActionResult OnGet() + { + Input.IsActive = true; + return Page(); + } + + public async Task OnPostAsync(CancellationToken ct) + { + if (!ModelState.IsValid) + return Page(); + + await faqService.CreateAsync(Input, ct); + return RedirectToPage("/Admin/Faqs/Index"); + } +} diff --git a/src/TaxBaik.Web/Pages/Admin/Faqs/Detail.cshtml b/src/TaxBaik.Web/Pages/Admin/Faqs/Detail.cshtml new file mode 100644 index 0000000..f8fe014 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/Faqs/Detail.cshtml @@ -0,0 +1,43 @@ +@page "{id:int}" +@model TaxBaik.Web.Pages.Admin.Faqs.DetailModel +@{ ViewData["Title"] = "FAQ 상세"; } + +
+ + + @if (Model.Item is null) + { + + } + else + { +
+
+
+
+
+
질문
+
@Model.Item.Question
+
답변
+
@Model.Item.Answer
+
카테고리
+
@Model.Item.Category
+
활성
+
+
정렬
+
@Model.Item.SortOrder
+
+
+
+
+
+
+
+ 수정 + 목록 +
+
+
+
+ } +
diff --git a/src/TaxBaik.Web/Pages/Admin/Faqs/Detail.cshtml.cs b/src/TaxBaik.Web/Pages/Admin/Faqs/Detail.cshtml.cs new file mode 100644 index 0000000..7a15853 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/Faqs/Detail.cshtml.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.Services; +using TaxBaik.Domain.Entities; +using TaxBaik.Web.Services; + +namespace TaxBaik.Web.Pages.Admin.Faqs; + +[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] +public class DetailModel(FaqService faqService) : PageModel +{ + public Faq? Item { get; private set; } + + public async Task OnGetAsync(int id, CancellationToken ct) + { + Item = await faqService.GetByIdAsync(id, ct); + return Page(); + } +} diff --git a/src/TaxBaik.Web/Pages/Admin/Faqs/Edit.cshtml b/src/TaxBaik.Web/Pages/Admin/Faqs/Edit.cshtml new file mode 100644 index 0000000..b446abe --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/Faqs/Edit.cshtml @@ -0,0 +1,51 @@ +@page "{id:int}" +@model TaxBaik.Web.Pages.Admin.Faqs.EditModel +@{ ViewData["Title"] = "FAQ 수정"; } + +
+ + +
+
+ + +
+
+ + +
+
+ + + + @foreach (var category in Model.Categories) + { + + } + +
+
+ + +
+
+ + +
+
+ +
+
+
+ + +
diff --git a/src/TaxBaik.Web/Pages/Admin/Faqs/Edit.cshtml.cs b/src/TaxBaik.Web/Pages/Admin/Faqs/Edit.cshtml.cs new file mode 100644 index 0000000..9862e46 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/Faqs/Edit.cshtml.cs @@ -0,0 +1,54 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Domain.Entities; +using TaxBaik.Application.Services; +using TaxBaik.Web.Services; + +namespace TaxBaik.Web.Pages.Admin.Faqs; + +[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] +public class EditModel(FaqService faqService) : PageModel +{ + [BindProperty(SupportsGet = true)] + public int Id { get; set; } + + [BindProperty] + public Faq Input { get; set; } = new(); + + public IReadOnlyList Categories => FaqService.Categories; + + public async Task OnGetAsync(CancellationToken ct) + { + var faq = await faqService.GetByIdAsync(Id, ct); + if (faq is null) + return NotFound(); + + Input = new Faq + { + Id = faq.Id, + Question = faq.Question, + Answer = faq.Answer, + Category = faq.Category, + SortOrder = faq.SortOrder, + IsActive = faq.IsActive + }; + + return Page(); + } + + public async Task OnPostAsync(CancellationToken ct) + { + if (!ModelState.IsValid) + return Page(); + + await faqService.UpdateAsync(Input, ct); + return RedirectToPage("/Admin/Faqs/Index"); + } + + public async Task OnPostDeleteAsync(CancellationToken ct) + { + await faqService.DeleteAsync(Id, ct); + return RedirectToPage("/Admin/Faqs/Index"); + } +} diff --git a/src/TaxBaik.Web/Pages/Admin/Faqs/Index.cshtml b/src/TaxBaik.Web/Pages/Admin/Faqs/Index.cshtml index 7ec12c2..5960656 100644 --- a/src/TaxBaik.Web/Pages/Admin/Faqs/Index.cshtml +++ b/src/TaxBaik.Web/Pages/Admin/Faqs/Index.cshtml @@ -3,17 +3,17 @@ @{ ViewData["Title"] = "FAQ"; }
- +
-
제목유형활성정렬
제목유형활성정렬작업
@item.Title@item.Title @item.DisplayType @item.SortOrder +
+ 상세 + 수정 +
+
+
- + @if (Model.Items.Count == 0) { - + } else { @@ -24,6 +24,12 @@ + } } diff --git a/src/TaxBaik.Web/Pages/Admin/Inquiries/Create.cshtml b/src/TaxBaik.Web/Pages/Admin/Inquiries/Create.cshtml index 981fcd5..db61dd2 100644 --- a/src/TaxBaik.Web/Pages/Admin/Inquiries/Create.cshtml +++ b/src/TaxBaik.Web/Pages/Admin/Inquiries/Create.cshtml @@ -1,4 +1,47 @@ @page @model TaxBaik.Web.Pages.Admin.Inquiries.CreateModel @{ ViewData["Title"] = "문의 등록"; } -

문의 등록

+ +
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
diff --git a/src/TaxBaik.Web/Pages/Admin/Inquiries/Create.cshtml.cs b/src/TaxBaik.Web/Pages/Admin/Inquiries/Create.cshtml.cs index 09b0a10..73841f2 100644 --- a/src/TaxBaik.Web/Pages/Admin/Inquiries/Create.cshtml.cs +++ b/src/TaxBaik.Web/Pages/Admin/Inquiries/Create.cshtml.cs @@ -1,7 +1,44 @@ using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.DTOs; +using TaxBaik.Application.Services; using TaxBaik.Web.Services; -namespace TaxBaik.Web.Pages.Admin.Inquiries; -[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] -public class CreateModel : PageModel { } +namespace TaxBaik.Web.Pages.Admin.Inquiries; + +[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] +public class CreateModel(InquiryService inquiryService) : PageModel +{ + [BindProperty] + public UpdateInquiryDto Input { get; set; } = new(); + + public IActionResult OnGet() + { + Input.Status = "new"; + return Page(); + } + + public async Task OnPostAsync(CancellationToken ct) + { + if (!ModelState.IsValid) + return Page(); + + var inquiryId = await inquiryService.SubmitAsync( + Input.Name, + Input.Phone, + string.IsNullOrWhiteSpace(Input.ServiceType) ? "기타" : Input.ServiceType, + Input.Message, + Input.Email, + suppressNotification: true, + ct: ct); + + if (!string.IsNullOrWhiteSpace(Input.Status)) + await inquiryService.UpdateStatusAsync(inquiryId, Input.Status, changedBy: User.Identity?.Name, ct: ct); + + if (!string.IsNullOrWhiteSpace(Input.AdminMemo)) + await inquiryService.UpdateAdminMemoAsync(inquiryId, Input.AdminMemo, ct); + + return RedirectToPage("/Admin/Inquiries/Index"); + } +} diff --git a/src/TaxBaik.Web/Pages/Admin/Inquiries/Detail.cshtml b/src/TaxBaik.Web/Pages/Admin/Inquiries/Detail.cshtml index 309c6c2..db95c4f 100644 --- a/src/TaxBaik.Web/Pages/Admin/Inquiries/Detail.cshtml +++ b/src/TaxBaik.Web/Pages/Admin/Inquiries/Detail.cshtml @@ -1,4 +1,51 @@ @page "{id:int}" @model TaxBaik.Web.Pages.Admin.Inquiries.DetailModel @{ ViewData["Title"] = "문의 상세"; } -

문의 상세

+ +
+ + + @if (Model.Inquiry is null) + { + + } + else + { +
+
+
+
+
+
이름
+
@Model.Inquiry.Name
+
전화
+
@Model.Inquiry.Phone
+
이메일
+
@Model.Inquiry.Email
+
서비스
+
@Model.Inquiry.ServiceType
+
상태
+
+
메시지
+
@Model.Inquiry.Message
+
관리 메모
+
@Model.Inquiry.AdminMemo
+
등록일
+
@Model.Inquiry.CreatedAt.ToString("yyyy-MM-dd HH:mm")
+
수정일
+
@Model.Inquiry.UpdatedAt?.ToString("yyyy-MM-dd HH:mm")
+
+
+
+
+
+
+
+ 수정 + 목록 +
+
+
+
+ } +
diff --git a/src/TaxBaik.Web/Pages/Admin/Inquiries/Detail.cshtml.cs b/src/TaxBaik.Web/Pages/Admin/Inquiries/Detail.cshtml.cs index d6a3840..fc49cf8 100644 --- a/src/TaxBaik.Web/Pages/Admin/Inquiries/Detail.cshtml.cs +++ b/src/TaxBaik.Web/Pages/Admin/Inquiries/Detail.cshtml.cs @@ -1,7 +1,20 @@ using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.Services; +using TaxBaik.Domain.Entities; using TaxBaik.Web.Services; -namespace TaxBaik.Web.Pages.Admin.Inquiries; -[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] -public class DetailModel : PageModel { } +namespace TaxBaik.Web.Pages.Admin.Inquiries; + +[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] +public class DetailModel(InquiryService inquiryService) : PageModel +{ + public Inquiry? Inquiry { get; private set; } + + public async Task OnGetAsync(int id, CancellationToken ct) + { + Inquiry = await inquiryService.GetByIdAsync(id, ct); + return Page(); + } +} diff --git a/src/TaxBaik.Web/Pages/Admin/Inquiries/Edit.cshtml b/src/TaxBaik.Web/Pages/Admin/Inquiries/Edit.cshtml index 0eee5b9..4cce5fc 100644 --- a/src/TaxBaik.Web/Pages/Admin/Inquiries/Edit.cshtml +++ b/src/TaxBaik.Web/Pages/Admin/Inquiries/Edit.cshtml @@ -1,4 +1,51 @@ @page "{id:int}" @model TaxBaik.Web.Pages.Admin.Inquiries.EditModel @{ ViewData["Title"] = "문의 수정"; } -

문의 수정

+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
diff --git a/src/TaxBaik.Web/Pages/Admin/Inquiries/Edit.cshtml.cs b/src/TaxBaik.Web/Pages/Admin/Inquiries/Edit.cshtml.cs index fcb6724..a637c65 100644 --- a/src/TaxBaik.Web/Pages/Admin/Inquiries/Edit.cshtml.cs +++ b/src/TaxBaik.Web/Pages/Admin/Inquiries/Edit.cshtml.cs @@ -1,7 +1,56 @@ using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using TaxBaik.Application.DTOs; +using TaxBaik.Application.Services; using TaxBaik.Web.Services; -namespace TaxBaik.Web.Pages.Admin.Inquiries; -[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] -public class EditModel : PageModel { } +namespace TaxBaik.Web.Pages.Admin.Inquiries; + +[Authorize(AuthenticationSchemes = AdminAuthDefaults.Scheme)] +public class EditModel(InquiryService inquiryService) : PageModel +{ + [BindProperty(SupportsGet = true)] + public int Id { get; set; } + + [BindProperty] + public UpdateInquiryDto Input { get; set; } = new(); + + public async Task OnGetAsync(CancellationToken ct) + { + var inquiry = await inquiryService.GetByIdAsync(Id, ct); + if (inquiry is null) + return NotFound(); + + Input = new UpdateInquiryDto + { + Name = inquiry.Name, + Phone = inquiry.Phone, + Email = inquiry.Email, + ServiceType = inquiry.ServiceType, + Message = inquiry.Message, + Status = inquiry.Status, + AdminMemo = inquiry.AdminMemo + }; + + return Page(); + } + + public async Task OnPostAsync(CancellationToken ct) + { + if (!ModelState.IsValid) + return Page(); + + var updated = await inquiryService.UpdateAsync(Id, Input, ct); + if (updated is null) + return NotFound(); + + return RedirectToPage("/Admin/Inquiries/Detail", new { id = Id }); + } + + public async Task OnPostDeleteAsync(CancellationToken ct) + { + await inquiryService.DeleteAsync(Id, ct); + return RedirectToPage("/Admin/Inquiries/Index"); + } +} diff --git a/src/TaxBaik.Web/Pages/Admin/Inquiries/Index.cshtml b/src/TaxBaik.Web/Pages/Admin/Inquiries/Index.cshtml index 929ebaa..f662e8b 100644 --- a/src/TaxBaik.Web/Pages/Admin/Inquiries/Index.cshtml +++ b/src/TaxBaik.Web/Pages/Admin/Inquiries/Index.cshtml @@ -19,7 +19,7 @@
-
질문카테고리활성정렬
질문카테고리활성정렬작업
@item.Category @item.SortOrder +
+ 상세 + 수정 +
+
+
@@ -27,12 +27,13 @@ + @if (Model.Items.Count == 0) { - + } else { @@ -44,6 +45,12 @@ + } }
이름서비스 상태 등록일작업
@item.ServiceType @item.CreatedAt.ToString("yyyy-MM-dd") +
+ 상세 + 수정 +
+