case-detail.component.html 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <!-- 加载状态 -->
  2. @if (isLoading) {
  3. <div class="loading-container">
  4. <div class="loading-spinner">
  5. <div class="spinner"></div>
  6. <p>正在加载案例详情...</p>
  7. </div>
  8. </div>
  9. }
  10. <!-- 案例详情内容 -->
  11. @if (case && !isLoading) {
  12. <div class="case-detail-page">
  13. <!-- 页面头部 -->
  14. <div class="page-header">
  15. <div class="header-left">
  16. <button class="back-btn" (click)="goBack()">
  17. <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor">
  18. <path d="m15 18-6-6 6-6"/>
  19. </svg>
  20. 返回案例库
  21. </button>
  22. <div class="breadcrumb">
  23. <span>案例库</span>
  24. <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor">
  25. <path d="m9 18 6-6-6-6"/>
  26. </svg>
  27. <span>{{ case.name }}</span>
  28. </div>
  29. </div>
  30. <div class="header-actions">
  31. <button
  32. class="action-btn favorite-btn"
  33. [class.active]="case.isFavorite"
  34. (click)="toggleFavorite()"
  35. >
  36. <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
  37. <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"></path>
  38. </svg>
  39. {{ case.isFavorite ? '已收藏' : '收藏' }}
  40. </button>
  41. <button class="action-btn share-btn" (click)="shareCase()">
  42. <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor">
  43. <circle cx="18" cy="5" r="3"></circle>
  44. <circle cx="6" cy="12" r="3"></circle>
  45. <circle cx="18" cy="19" r="3"></circle>
  46. <line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line>
  47. <line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line>
  48. </svg>
  49. 分享案例
  50. </button>
  51. </div>
  52. </div>
  53. <!-- 主要内容区域 -->
  54. <div class="main-content">
  55. <!-- 左侧:案例图片和基本信息 -->
  56. <div class="left-section">
  57. <!-- 封面图片 -->
  58. <div class="cover-image">
  59. <img [src]="coverImageOf(case)" [alt]="case.name" class="cover-img" onerror="this.src='/assets/presets/家装图片.jpg'">
  60. <div class="image-overlay">
  61. <div class="case-badges">
  62. <span class="badge project-type">{{ case.projectType }}</span>
  63. <span class="badge space-type">{{ case.spaceType }}</span>
  64. <span class="badge rendering-level">{{ case.renderingLevel }}</span>
  65. </div>
  66. </div>
  67. </div>
  68. <!-- 基本信息 -->
  69. <div class="basic-info">
  70. <h1 class="case-name">{{ case.name }}</h1>
  71. <div class="meta-grid">
  72. <div class="meta-item">
  73. <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor">
  74. <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path>
  75. <circle cx="12" cy="7" r="4"></circle>
  76. </svg>
  77. <div class="meta-content">
  78. <span class="meta-label">设计师</span>
  79. <span class="meta-value">{{ case.designer }}</span>
  80. @if (isInternalUser) {
  81. <span class="team-badge">{{ case.team }}</span>
  82. }
  83. </div>
  84. </div>
  85. <div class="meta-item">
  86. <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor">
  87. <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
  88. <line x1="3" y1="9" x2="21" y2="9"></line>
  89. </svg>
  90. <div class="meta-content">
  91. <span class="meta-label">面积</span>
  92. <span class="meta-value">{{ case.area }}㎡</span>
  93. </div>
  94. </div>
  95. <div class="meta-item">
  96. <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor">
  97. <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path>
  98. <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path>
  99. </svg>
  100. <div class="meta-content">
  101. <span class="meta-label">浏览量</span>
  102. <span class="meta-value">{{ case.viewCount }}</span>
  103. </div>
  104. </div>
  105. <div class="meta-item">
  106. <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor">
  107. <path d="M8 2v4"></path>
  108. <path d="M16 2v4"></path>
  109. <rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect>
  110. <line x1="3" y1="10" x2="21" y2="10"></line>
  111. </svg>
  112. <div class="meta-content">
  113. <span class="meta-label">创建时间</span>
  114. <span class="meta-value">{{ getFormattedDate(case.createdAt) }}</span>
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. </div>
  120. <!-- 右侧:详细信息 -->
  121. <div class="right-section">
  122. <!-- 风格标签 -->
  123. <div class="info-section">
  124. <h3 class="section-title">设计风格</h3>
  125. <div class="style-tags">
  126. @for (tag of case.styleTags; track $index) {
  127. <span class="style-tag">{{ tag }}</span>
  128. }
  129. </div>
  130. </div>
  131. <!-- 客户评价 -->
  132. @if (case.customerReview) {
  133. <div class="info-section">
  134. <h3 class="section-title">客户评价</h3>
  135. <div class="review-content">
  136. <div class="quote-icon">"</div>
  137. <p class="review-text">{{ case.customerReview }}</p>
  138. </div>
  139. </div>
  140. }
  141. <!-- 统计信息 -->
  142. <div class="info-section">
  143. <h3 class="section-title">案例统计</h3>
  144. <div class="stats-grid">
  145. <div class="stat-item">
  146. <div class="stat-icon">
  147. <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor">
  148. <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path>
  149. <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path>
  150. </svg>
  151. </div>
  152. <div class="stat-content">
  153. <span class="stat-value">{{ case.viewCount }}</span>
  154. <span class="stat-label">浏览次数</span>
  155. </div>
  156. </div>
  157. <div class="stat-item">
  158. <div class="stat-icon">
  159. <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
  160. <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"></path>
  161. </svg>
  162. </div>
  163. <div class="stat-content">
  164. <span class="stat-value">{{ case.favoriteCount }}</span>
  165. <span class="stat-label">收藏次数</span>
  166. </div>
  167. </div>
  168. <div class="stat-item">
  169. <div class="stat-icon">
  170. <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor">
  171. <circle cx="18" cy="5" r="3"></circle>
  172. <circle cx="6" cy="12" r="3"></circle>
  173. <circle cx="18" cy="19" r="3"></circle>
  174. <line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line>
  175. <line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line>
  176. </svg>
  177. </div>
  178. <div class="stat-content">
  179. <span class="stat-value">{{ case.shareCount }}</span>
  180. <span class="stat-label">分享次数</span>
  181. </div>
  182. </div>
  183. </div>
  184. </div>
  185. <!-- 设计师内部信息 -->
  186. @if (isInternalUser) {
  187. <div class="info-section internal-section">
  188. <h3 class="section-title">内部信息</h3>
  189. <div class="internal-grid">
  190. <div class="internal-item">
  191. <span class="internal-label">案例等级</span>
  192. <span class="internal-badge" [class.excellent]="case.isExcellent">
  193. {{ case.isExcellent ? '优秀案例' : '普通案例' }}
  194. </span>
  195. </div>
  196. <div class="internal-item">
  197. <span class="internal-label">所属团队</span>
  198. <span class="internal-value">{{ case.team }}</span>
  199. </div>
  200. <div class="internal-item">
  201. <span class="internal-label">案例ID</span>
  202. <span class="internal-value">{{ case.id }}</span>
  203. </div>
  204. </div>
  205. </div>
  206. }
  207. </div>
  208. </div>
  209. </div>
  210. }
  211. <!-- 案例不存在 -->
  212. @if (!case && !isLoading) {
  213. <div class="error-container">
  214. <div class="error-content">
  215. <svg width="64" height="64" viewBox="0 0 24 24" fill="none" stroke="currentColor">
  216. <circle cx="12" cy="12" r="10"></circle>
  217. <line x1="12" y1="8" x2="12" y2="12"></line>
  218. <line x1="12" y1="16" x2="12.01" y2="16"></line>
  219. </svg>
  220. <h3>案例不存在</h3>
  221. <p>抱歉,您访问的案例不存在或已被删除</p>
  222. <button class="btn btn-primary" (click)="goBack()">返回案例库</button>
  223. </div>
  224. </div>
  225. }