小说小程序前端代码仓库(小程序)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
4.6 KiB

  1. <template>
  2. <view class="sign-record-popup" :class="{'dark-mode': isDarkMode}">
  3. <uv-popup ref="popup" mode="center" :closeOnClickOverlay="true" :customStyle="popupStyle">
  4. <view class="content theme-transition">
  5. <view class="popup-header">
  6. <view class="popup-title theme-transition">签到记录</view>
  7. <view class="close-btn" @click="close">
  8. <uv-icon name="close" :color="isDarkMode ? '#ccc' : '#666'" size="32rpx"></uv-icon>
  9. </view>
  10. </view>
  11. <view class="record-list">
  12. <scroll-view scroll-y class="record-scroll">
  13. <view class="record-item" v-for="(record, index) in recordList" :key="index">
  14. <view class="record-left">
  15. <view class="record-date">{{ formatDate(record.createTime) }}</view>
  16. <view class="record-task">{{ record.taskName || '每日签到' }}</view>
  17. </view>
  18. <view class="record-right">
  19. <text class="record-reward">+{{ record.num || 1 }}推荐票</text>
  20. <text class="record-status success">已签到</text>
  21. </view>
  22. </view>
  23. <view class="no-record" v-if="recordList.length === 0 && !loading">暂无签到记录</view>
  24. <view class="loading" v-if="loading">加载中...</view>
  25. </scroll-view>
  26. </view>
  27. </view>
  28. </uv-popup>
  29. </view>
  30. </template>
  31. <script>
  32. import themeMixin from '@/mixins/themeMode.js'
  33. export default {
  34. name: 'signRecordPopup',
  35. mixins: [themeMixin],
  36. data() {
  37. return {
  38. recordList: [],
  39. loading: false,
  40. pageNo: 1,
  41. pageSize: 20
  42. }
  43. },
  44. computed: {
  45. popupStyle() {
  46. return {
  47. 'background': this.isDarkMode ? '#232323' : '#fff',
  48. 'border-radius': '24rpx',
  49. 'width': '600rpx',
  50. 'max-height': '700rpx'
  51. }
  52. }
  53. },
  54. methods: {
  55. // 打开弹窗
  56. open() {
  57. this.$refs.popup.open();
  58. this.getRecordList();
  59. },
  60. // 关闭弹窗
  61. close() {
  62. this.$refs.popup.close();
  63. },
  64. // 获取签到记录列表
  65. getRecordList() {
  66. this.loading = true;
  67. this.$fetch('getSignTaskRecordPage', {
  68. pageNo: this.pageNo,
  69. pageSize: this.pageSize
  70. }).then(res => {
  71. this.recordList = res.records || [];
  72. this.loading = false;
  73. }).catch(err => {
  74. console.error('获取签到记录失败:', err);
  75. this.loading = false;
  76. });
  77. },
  78. // 格式化日期
  79. formatDate(dateString) {
  80. if (!dateString) return '';
  81. const date = new Date(dateString);
  82. const month = (date.getMonth() + 1).toString().padStart(2, '0');
  83. const day = date.getDate().toString().padStart(2, '0');
  84. return `${month}-${day}`;
  85. }
  86. }
  87. }
  88. </script>
  89. <style lang="scss" scoped>
  90. .sign-record-popup {
  91. .content {
  92. padding: 0;
  93. .popup-header {
  94. display: flex;
  95. justify-content: space-between;
  96. align-items: center;
  97. padding: 32rpx 32rpx 24rpx;
  98. border-bottom: 1rpx solid #f5f5f5;
  99. .popup-title {
  100. font-size: 32rpx;
  101. font-weight: bold;
  102. color: #222;
  103. }
  104. .close-btn {
  105. width: 48rpx;
  106. height: 48rpx;
  107. display: flex;
  108. align-items: center;
  109. justify-content: center;
  110. }
  111. }
  112. .record-list {
  113. .record-scroll {
  114. max-height: 560rpx;
  115. .record-item {
  116. display: flex;
  117. justify-content: space-between;
  118. align-items: center;
  119. padding: 32rpx;
  120. border-bottom: 1rpx solid #f8f8f8;
  121. .record-left {
  122. display: flex;
  123. flex-direction: column;
  124. align-items: flex-start;
  125. .record-date {
  126. font-size: 28rpx;
  127. color: #333;
  128. font-weight: 500;
  129. margin-bottom: 8rpx;
  130. }
  131. .record-task {
  132. font-size: 24rpx;
  133. color: #999;
  134. }
  135. }
  136. .record-right {
  137. display: flex;
  138. flex-direction: column;
  139. align-items: flex-end;
  140. .record-reward {
  141. font-size: 26rpx;
  142. color: #ff6b35;
  143. margin-bottom: 4rpx;
  144. font-weight: 500;
  145. }
  146. .record-status {
  147. font-size: 22rpx;
  148. &.success {
  149. color: #4caf50;
  150. }
  151. }
  152. }
  153. }
  154. .no-record, .loading {
  155. text-align: center;
  156. padding: 80rpx 32rpx;
  157. color: #999;
  158. font-size: 26rpx;
  159. }
  160. }
  161. }
  162. }
  163. &.dark-mode {
  164. .content {
  165. .popup-header {
  166. border-bottom-color: #333;
  167. .popup-title {
  168. color: #eee;
  169. }
  170. }
  171. .record-list {
  172. .record-scroll {
  173. .record-item {
  174. border-bottom-color: #333;
  175. .record-left {
  176. .record-date {
  177. color: #ccc;
  178. }
  179. .record-task {
  180. color: #888;
  181. }
  182. }
  183. }
  184. .no-record, .loading {
  185. color: #666;
  186. }
  187. }
  188. }
  189. }
  190. }
  191. }
  192. </style>