CircleRanking.vue 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <template>
  2. <view class="circle-ranking" v-if="circleName">
  3. <view class="cr-header">
  4. <text class="cr-title">🏅 {{ circleName }}</text>
  5. </view>
  6. <view class="cr-list">
  7. <view class="cr-item" v-for="(item, idx) in rankings" :key="idx">
  8. <text class="cr-rank">{{ rankIcon(idx) }}</text>
  9. <view class="cr-info">
  10. <text class="cr-family">家庭 {{ idx + 1 }}</text>
  11. <text class="cr-members">{{ item.memberCount || 0 }} 位成员</text>
  12. </view>
  13. <text class="cr-score">{{ item.totalScore || 0 }} 分</text>
  14. </view>
  15. </view>
  16. </view>
  17. <view v-else-if="!circleName && !loading" class="cr-empty">
  18. <text class="cr-empty-text">暂无健康圈数据</text>
  19. </view>
  20. </template>
  21. <script>
  22. export default {
  23. props: {
  24. circleName: { type: String, default: '' },
  25. rankings: { type: Array, default: function() { return [] } },
  26. loading: { type: Boolean, default: false }
  27. },
  28. methods: {
  29. rankIcon: function(idx) {
  30. var medals = ['🥇', '🥈', '🥉']
  31. return medals[idx] || '#' + (idx + 1)
  32. }
  33. }
  34. }
  35. </script>
  36. <style scoped>
  37. .circle-ranking {
  38. background: #fff;
  39. border-radius: 20rpx;
  40. margin: 0 20rpx 20rpx 20rpx;
  41. padding: 24rpx;
  42. box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.06);
  43. }
  44. .cr-header {
  45. display: flex;
  46. justify-content: space-between;
  47. align-items: center;
  48. margin-bottom: 16rpx;
  49. }
  50. .cr-title {
  51. font-size: 30rpx;
  52. font-weight: 700;
  53. color: #1E293B;
  54. }
  55. .cr-item {
  56. display: flex;
  57. align-items: center;
  58. gap: 12rpx;
  59. padding: 12rpx 0;
  60. border-bottom: 1rpx solid #F1F5F9;
  61. }
  62. .cr-item:last-child { border-bottom: none; }
  63. .cr-rank { font-size: 32rpx; width: 48rpx; text-align: center; }
  64. .cr-info { flex: 1; min-width: 0; }
  65. .cr-family { font-size: 26rpx; font-weight: 600; color: #334155; display: block; }
  66. .cr-members { font-size: 20rpx; color: #94A3B8; margin-top: 2rpx; display: block; }
  67. .cr-score { font-size: 30rpx; font-weight: 700; color: #6366F1; }
  68. .cr-empty {
  69. padding: 60rpx 20rpx;
  70. display: flex;
  71. justify-content: center;
  72. }
  73. .cr-empty-text { font-size: 26rpx; color: #94A3B8; }
  74. </style>