View.cshtml 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. @page "{id:int}"
  2. @model Admin.Pages.Forum.Posts.List.ViewModel
  3. @{
  4. ViewData["Title"] = "게시글 상세";
  5. }
  6. <link rel="stylesheet" href="~/lib/ckeditor/browser/ckeditor5-content.css" asp-append-version="true" />
  7. <div class="container">
  8. <h3 class="mb-3">@ViewData["Title"]</h3>
  9. <hr />
  10. <partial name="_StatusMessage" />
  11. <div class="border rounded">
  12. <!-- ID -->
  13. <div class="row g-0 border-bottom">
  14. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">ID</div>
  15. <div class="col-12 col-md-10 p-2">@Model.ID</div>
  16. </div>
  17. <!-- 게시판 -->
  18. <div class="row g-0 border-bottom">
  19. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">게시판</div>
  20. <div class="col-12 col-md-10 p-2">@Model.BoardName</div>
  21. </div>
  22. <!-- 말머리 -->
  23. <div class="row g-0 border-bottom">
  24. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">@(Model.IsQnA ? "문의 유형" : "말머리")</div>
  25. <div class="col-12 col-md-10 p-2">
  26. @if (Model.BoardPrefixName is not null)
  27. {
  28. <span class="fw-bold" style="color: @(Model.BoardPrefixColor ?? "green")">[@Model.BoardPrefixName]</span>
  29. }
  30. else
  31. {
  32. <text>-</text>
  33. }
  34. </div>
  35. </div>
  36. <!-- 제목 -->
  37. <div class="row g-0 border-bottom">
  38. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">제목</div>
  39. <div class="col-12 col-md-10 p-2">@Model.Subject</div>
  40. </div>
  41. <!-- 작성자 -->
  42. <div class="row g-0 border-bottom">
  43. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">작성자</div>
  44. <div class="col-12 col-md-10 p-2">@(Model.Name ?? Model.SID ?? "-")</div>
  45. </div>
  46. <!-- 내용 -->
  47. <div class="row g-0 border-bottom">
  48. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">내용</div>
  49. <div class="col-12 col-md-10 p-2">
  50. <div class="ck-content border rounded p-3" style="min-height: 100px;">@Html.Raw(Model.Content)</div>
  51. </div>
  52. </div>
  53. <!-- 대표 이미지 -->
  54. <div class="row g-0 border-bottom">
  55. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">대표 이미지</div>
  56. <div class="col-12 col-md-10 p-2">
  57. @if (!string.IsNullOrWhiteSpace(Model.Thumbnail))
  58. {
  59. <img src="@Model.Thumbnail" class="img-fluid img-thumbnail" style="max-width: 300px;" alt="대표 이미지" />
  60. }
  61. else
  62. {
  63. <text>-</text>
  64. }
  65. </div>
  66. </div>
  67. <!-- 태그 -->
  68. <div class="row g-0 border-bottom">
  69. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">태그</div>
  70. <div class="col-12 col-md-10 p-2">
  71. @if (Model.Tags.Count > 0)
  72. {
  73. foreach (var tag in Model.Tags)
  74. {
  75. <span class="badge bg-secondary me-1">@tag.Name</span>
  76. }
  77. }
  78. else
  79. {
  80. <text>-</text>
  81. }
  82. </div>
  83. </div>
  84. <!-- 첨부파일 -->
  85. <div class="row g-0 border-bottom">
  86. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">첨부파일</div>
  87. <div class="col-12 col-md-10 p-2">
  88. @if (Model.Files.Count > 0)
  89. {
  90. <ul class="list-unstyled mb-0">
  91. @foreach (var file in Model.Files)
  92. {
  93. <li class="mb-1">
  94. <a href="@file.Url" target="_blank">@file.FileName</a>
  95. @if (file.Size.HasValue)
  96. {
  97. <small class="text-muted">(@(file.Size.Value > 1048576 ? $"{file.Size.Value / 1048576.0:F1}MB" : $"{file.Size.Value / 1024.0:F1}KB"))</small>
  98. }
  99. <small class="text-muted">다운로드: @file.Downloads</small>
  100. </li>
  101. }
  102. </ul>
  103. }
  104. else
  105. {
  106. <text>-</text>
  107. }
  108. </div>
  109. </div>
  110. <!-- 이미지 -->
  111. <div class="row g-0 border-bottom">
  112. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">이미지</div>
  113. <div class="col-12 col-md-10 p-2">
  114. @if (Model.Images.Count > 0)
  115. {
  116. foreach (var img in Model.Images)
  117. {
  118. <a href="@img.Url" target="_blank">
  119. <img src="@img.Url" class="img-thumbnail me-1 mb-1" style="max-width: 120px; max-height: 120px;" alt="@img.FileName" />
  120. </a>
  121. }
  122. }
  123. else
  124. {
  125. <text>-</text>
  126. }
  127. </div>
  128. </div>
  129. <!-- 상태 -->
  130. <div class="row g-0 border-bottom">
  131. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">상태</div>
  132. <div class="col-12 col-md-10 p-2">
  133. @if (Model.IsNotice)
  134. {
  135. <span class="badge bg-warning text-dark me-1">공지</span>
  136. }
  137. @if (Model.IsSecret)
  138. {
  139. <span class="badge bg-dark me-1">비밀</span>
  140. }
  141. @if (Model.IsAnonymous)
  142. {
  143. <span class="badge bg-info me-1">익명</span>
  144. }
  145. @if (Model.IsSpeaker)
  146. {
  147. <span class="badge bg-primary me-1">스피커</span>
  148. }
  149. @if (Model.IsDeleted)
  150. {
  151. <span class="badge bg-danger me-1">삭제됨</span>
  152. }
  153. @if (!Model.IsNotice && !Model.IsSecret && !Model.IsAnonymous && !Model.IsSpeaker && !Model.IsDeleted)
  154. {
  155. <text>일반</text>
  156. }
  157. </div>
  158. </div>
  159. <!-- 조회 -->
  160. <div class="row g-0 border-bottom">
  161. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">조회 / 공감 / 비공감</div>
  162. <div class="col-12 col-md-10 p-2">@Model.Views / @Model.Likes / @Model.Dislikes</div>
  163. </div>
  164. <!-- 댓글 -->
  165. <div class="row g-0 border-bottom">
  166. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">댓글</div>
  167. <div class="col-12 col-md-10 p-2">@Model.CommentCount</div>
  168. </div>
  169. <!-- 수정일 -->
  170. <div class="row g-0 border-bottom">
  171. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">수정일</div>
  172. <div class="col-12 col-md-10 p-2">@(Model.UpdatedAt ?? "-")</div>
  173. </div>
  174. <!-- 등록일 (마지막 라인: border-bottom 제거) -->
  175. <div class="row g-0">
  176. <div class="col-12 col-md-2 bg-body-tertiary fw-semibold p-2">등록일</div>
  177. <div class="col-12 col-md-10 p-2">@Model.CreatedAt</div>
  178. </div>
  179. </div>
  180. <div class="d-grid gap-2 text-center d-md-block mt-3">
  181. <a href="/Forum/Posts/List/Edit/@(Model.ID)@(Model.QueryString)" class="btn btn-info text-white">수정</a>
  182. <a href="@(string.IsNullOrWhiteSpace(Model.ReturnUrl) ? "/Forum/Posts/List" : Model.ReturnUrl)" class="btn btn-secondary">목록</a>
  183. </div>
  184. <br />
  185. </div>