points-mall.html 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <!-- 顶部标题栏 -->
  2. <div class="header">
  3. <div class="back-btn" (click)="goBack()"><i class="fas fa-arrow-left"></i></div>
  4. <div class="header-title">积分商城</div>
  5. </div>
  6. <div class="container">
  7. <!-- 积分余额显示区 -->
  8. <div class="points-header">
  9. <div class="points-balance">{{userPoints}}</div>
  10. <div class="points-label">我的积分</div>
  11. <div class="points-actions">
  12. <div class="points-action-btn" (click)="showPointsRules()">积分规则</div>
  13. <div class="points-action-btn" (click)="showPointsHistory()">积分记录</div>
  14. </div>
  15. </div>
  16. <!-- 活动专区轮播 -->
  17. <div class="section">
  18. <div class="section-title">
  19. <span>活动专区</span>
  20. <span style="font-size: 14px; color: #6c757d;">限时优惠</span>
  21. </div>
  22. <div class="carousel">
  23. <div class="carousel-inner" #carouselInner>
  24. <div class="carousel-item" *ngFor="let activity of activities; let i = index" [class.active]="i === currentActivityIndex">
  25. <div class="carousel-tag">{{activity.tag}}</div>
  26. <div class="carousel-title">{{activity.title}}</div>
  27. <div class="carousel-desc">{{activity.description}}</div>
  28. <div class="carousel-time">{{activity.time}}</div>
  29. </div>
  30. </div>
  31. <div class="carousel-indicators">
  32. <div
  33. *ngFor="let activity of activities; let i = index"
  34. class="carousel-indicator"
  35. [class.active]="i === currentActivityIndex"
  36. (click)="setActiveActivity(i)"></div>
  37. </div>
  38. </div>
  39. <!-- 商品分类导航 -->
  40. <div class="section-title">商品分类</div>
  41. <div class="category-nav">
  42. <div
  43. *ngFor="let category of categories"
  44. class="category-item"
  45. [class.active]="category.active"
  46. (click)="selectCategory(category)">
  47. <div class="category-icon"><i [class]="category.icon"></i></div>
  48. <div class="category-name">{{category.name}}</div>
  49. </div>
  50. </div>
  51. <!-- 商品列表 -->
  52. <div class="section-title">热门商品</div>
  53. <div class="products-grid">
  54. <div
  55. *ngFor="let product of filteredProducts"
  56. class="product-card"
  57. (click)="showProductDetail(product)">
  58. <div class="product-image">
  59. <img *ngIf="product.image" [src]="product.image" [alt]="product.name" class="product-img">
  60. <i *ngIf="!product.image" [class]="product.icon + ' fa-2x'"></i>
  61. <div class="product-tag" *ngIf="product.tag">{{product.tag}}</div>
  62. </div>
  63. <div class="product-info">
  64. <div class="product-name">{{product.name}}</div>
  65. <div class="product-price">
  66. <div class="price-info">
  67. <div class="points-price">{{product.pointsPrice}}积分</div>
  68. <div class="cash-price">市场价: ¥{{product.marketPrice}}</div>
  69. </div>
  70. <button
  71. class="exchange-btn"
  72. [disabled]="userPoints < product.pointsPrice"
  73. (click)="exchangeProduct(product, $event)">兑换</button>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. <!-- 积分任务中心 -->
  81. <div class="container">
  82. <div class="section tasks-section">
  83. <div class="section-title">
  84. <span>积分任务</span>
  85. <span style="font-size: 14px; color: #6c757d;">赚取更多积分</span>
  86. </div>
  87. <div class="task-list">
  88. <div
  89. *ngFor="let task of tasks"
  90. class="task-item">
  91. <div class="task-info">
  92. <div class="task-icon"><i [class]="task.icon"></i></div>
  93. <div class="task-details">
  94. <div class="task-name">{{task.name}}</div>
  95. <div class="task-desc">{{task.description}}</div>
  96. <div class="task-progress" *ngIf="task.progress">{{task.progress}}</div>
  97. </div>
  98. </div>
  99. <div class="task-reward">+{{task.reward}}积分</div>
  100. <button
  101. class="task-btn"
  102. [class.completed]="task.completed"
  103. (click)="doTask(task)">
  104. {{task.completed ? '已完成' : task.buttonText}}
  105. </button>
  106. </div>
  107. </div>
  108. </div>
  109. </div>
  110. <!-- 商品详情模态框 -->
  111. <div class="modal" [style.display]="showProductModal ? 'flex' : 'none'" (click)="closeProductModal()">
  112. <div class="modal-content" (click)="$event.stopPropagation()" *ngIf="selectedProduct">
  113. <div class="modal-title">{{selectedProduct.name}}</div>
  114. <div class="product-detail-image">
  115. <img *ngIf="selectedProduct.image" [src]="selectedProduct.image" [alt]="selectedProduct.name" class="product-detail-img">
  116. <i *ngIf="!selectedProduct.image" [class]="selectedProduct.icon + ' fa-4x'"></i>
  117. </div>
  118. <div class="product-detail-info">
  119. <div class="detail-price">
  120. <span class="points-price">{{selectedProduct.pointsPrice}}积分</span>
  121. <span class="cash-price">市场价: ¥{{selectedProduct.marketPrice}}</span>
  122. </div>
  123. <div class="product-description">{{selectedProduct.description}}</div>
  124. </div>
  125. <div class="modal-buttons">
  126. <button class="modal-btn cancel" (click)="closeProductModal()">取消</button>
  127. <button
  128. class="modal-btn confirm"
  129. [disabled]="userPoints < selectedProduct.pointsPrice"
  130. (click)="confirmExchange()">确认兑换</button>
  131. </div>
  132. </div>
  133. </div>
  134. <!-- 签到模态框 -->
  135. <div class="modal" [style.display]="showCheckinModal ? 'flex' : 'none'" (click)="closeCheckinModal()">
  136. <div class="modal-content" (click)="$event.stopPropagation()">
  137. <div class="modal-title">每日签到</div>
  138. <div class="checkin-calendar">
  139. <div
  140. *ngFor="let day of checkinDays"
  141. class="checkin-day"
  142. [class.checked]="day.checked"
  143. [class.today]="day.isToday">
  144. {{day.day}}
  145. </div>
  146. </div>
  147. <div style="text-align: center; margin: 15px 0;">
  148. <div style="color: #2e7d32; font-weight: 600;">签到成功!</div>
  149. <div style="color: #ff9800; font-size: 18px; margin-top: 5px;">+{{dailyCheckinReward}}积分</div>
  150. </div>
  151. <div class="modal-buttons">
  152. <button class="modal-btn confirm" (click)="closeCheckinModal()">确定</button>
  153. </div>
  154. </div>
  155. </div>
  156. <!-- 底部导航栏 -->
  157. <app-bottom-nav [activeTab]="'mall'"></app-bottom-nav>