index.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <view class="container">
  3. <view class="page-header">
  4. <text class="page-title">互动提醒</text>
  5. <text class="page-sub" v-if="reminders.length > 0">{{ reminders.length }} 个连接该联系了</text>
  6. </view>
  7. <view class="reminder-list" v-if="reminders.length > 0">
  8. <view class="reminder-item" v-for="(r, idx) in reminders" :key="idx">
  9. <view class="reminder-info">
  10. <text class="reminder-name">{{ r.name }}</text>
  11. <text class="reminder-tag">{{ r.connectionType }}</text>
  12. <text class="reminder-days">已 {{ r.daysSinceLast }} 天未互动(建议每 {{ r.suggestIntervalMonth }} 个月)</text>
  13. </view>
  14. <view class="reminder-actions">
  15. <text class="btn-contact" @tap="onContact(r)">去联系</text>
  16. <text class="btn-later" @tap="onLater(r)">稍后</text>
  17. </view>
  18. </view>
  19. </view>
  20. <view class="empty" v-else>
  21. <text class="empty-icon">🎉</text>
  22. <text class="empty-text">所有连接都在维护中</text>
  23. </view>
  24. </view>
  25. </template>
  26. <script>
  27. import { getPearlReminders, addPearlInteraction } from '../../utils/api.js'
  28. export default {
  29. data() {
  30. return {
  31. reminders: []
  32. }
  33. },
  34. onShow() {
  35. this.loadReminders()
  36. },
  37. methods: {
  38. async loadReminders() {
  39. try {
  40. var res = await getPearlReminders()
  41. if (res.code === 200 && res.data) {
  42. this.reminders = res.data
  43. }
  44. } catch (e) {
  45. uni.showToast({ title: '加载失败', icon: 'none' })
  46. }
  47. },
  48. onContact(r) {
  49. var self = this
  50. uni.showActionSheet({
  51. itemList: ['电话', '微信', '见面', '其他'],
  52. success: function(res) {
  53. var types = ['PHONE', 'WECHAT', 'MEETING', 'OTHER']
  54. addPearlInteraction({
  55. itemId: r.resourceItemId,
  56. interactionType: types[res.tapIndex],
  57. content: ''
  58. }).then(function(resp) {
  59. if (resp.code === 200) {
  60. uni.showToast({ title: '已记录', icon: 'success' })
  61. self.loadReminders()
  62. } else {
  63. uni.showToast({ title: resp.message || '记录失败', icon: 'none' })
  64. }
  65. })
  66. }
  67. })
  68. },
  69. onLater(r) {
  70. // 暂不支持 DISMISS,直接刷新
  71. this.loadReminders()
  72. }
  73. }
  74. }
  75. </script>
  76. <style scoped>
  77. .container {
  78. min-height: 100vh;
  79. background: #f5f5f5;
  80. padding: 24rpx;
  81. }
  82. .page-header {
  83. padding: 20rpx 0 30rpx;
  84. }
  85. .page-title {
  86. font-size: 36rpx;
  87. font-weight: bold;
  88. color: #333;
  89. }
  90. .page-sub {
  91. font-size: 26rpx;
  92. color: #999;
  93. margin-top: 8rpx;
  94. display: block;
  95. }
  96. .reminder-list {
  97. display: flex;
  98. flex-direction: column;
  99. gap: 20rpx;
  100. }
  101. .reminder-item {
  102. background: #fff;
  103. border-radius: 16rpx;
  104. padding: 24rpx;
  105. display: flex;
  106. justify-content: space-between;
  107. align-items: center;
  108. }
  109. .reminder-info {
  110. flex: 1;
  111. }
  112. .reminder-name {
  113. font-size: 30rpx;
  114. font-weight: 600;
  115. color: #333;
  116. display: block;
  117. }
  118. .reminder-tag {
  119. font-size: 22rpx;
  120. color: #F97316;
  121. background: #FFF7ED;
  122. border-radius: 6rpx;
  123. padding: 4rpx 12rpx;
  124. margin-top: 8rpx;
  125. display: inline-block;
  126. }
  127. .reminder-days {
  128. font-size: 24rpx;
  129. color: #999;
  130. display: block;
  131. margin-top: 8rpx;
  132. }
  133. .reminder-actions {
  134. display: flex;
  135. gap: 16rpx;
  136. }
  137. .btn-contact {
  138. background: #F97316;
  139. color: #fff;
  140. border-radius: 999rpx;
  141. padding: 12rpx 28rpx;
  142. font-size: 26rpx;
  143. }
  144. .btn-later {
  145. border: 2rpx solid #e0e0e0;
  146. color: #666;
  147. border-radius: 999rpx;
  148. padding: 12rpx 28rpx;
  149. font-size: 26rpx;
  150. }
  151. .empty {
  152. display: flex;
  153. flex-direction: column;
  154. align-items: center;
  155. padding-top: 200rpx;
  156. }
  157. .empty-icon {
  158. font-size: 80rpx;
  159. }
  160. .empty-text {
  161. font-size: 28rpx;
  162. color: #999;
  163. margin-top: 20rpx;
  164. }
  165. </style>