ReviewCenter.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <template>
  2. <div class="review-center">
  3. <!-- 概览统计卡片 -->
  4. <el-row :gutter="16" class="summary-row">
  5. <el-col v-for="card in summaryCards" :key="card.key" :span="4">
  6. <el-card :class="['summary-card', { active: activeTab === card.key }]" shadow="hover" @click.native="activeTab = card.key">
  7. <div class="summary-inner">
  8. <span class="summary-icon">{{ card.icon }}</span>
  9. <span class="summary-count">{{ card.count }}</span>
  10. <span class="summary-label">{{ card.label }}</span>
  11. </div>
  12. </el-card>
  13. </el-col>
  14. </el-row>
  15. <!-- 详情 Tab -->
  16. <el-card class="detail-card">
  17. <el-tabs v-model="activeTab" @tab-click="onTabClick">
  18. <el-tab-pane label="文章审核" name="article">
  19. <article-audit ref="article" />
  20. </el-tab-pane>
  21. <el-tab-pane label="商品审核" name="product">
  22. <product-audit ref="product" />
  23. </el-tab-pane>
  24. <el-tab-pane label="规划师审核" name="guide">
  25. <guide-audit ref="guide" />
  26. </el-tab-pane>
  27. <el-tab-pane label="营养师审核" name="nutritionist">
  28. <nutritionist-audit ref="nutritionist" />
  29. </el-tab-pane>
  30. <el-tab-pane label="服务商审核" name="vendor">
  31. <vendor-audit ref="vendor" />
  32. </el-tab-pane>
  33. <el-tab-pane label="管家审核" name="butler">
  34. <butler-audit ref="butler" />
  35. </el-tab-pane>
  36. <el-tab-pane label="任务模板审核" name="package">
  37. <package-audit ref="package" />
  38. </el-tab-pane>
  39. <el-tab-pane label="活动审核" name="activity">
  40. <activity-audit ref="activity" />
  41. </el-tab-pane>
  42. <el-tab-pane label="活动报名审核" name="activityRegistration">
  43. <activity-registration-audit ref="activityRegistration" />
  44. </el-tab-pane>
  45. <el-tab-pane label="提现审核" name="withdraw">
  46. <withdraw-audit ref="withdraw" />
  47. </el-tab-pane>
  48. <el-tab-pane label="更换上级审核" name="hierarchy">
  49. <hierarchy-audit ref="hierarchy" />
  50. </el-tab-pane>
  51. </el-tabs>
  52. </el-card>
  53. </div>
  54. </template>
  55. <script>
  56. import request from '@/utils/request'
  57. import ArticleAudit from './review/ArticleAudit.vue'
  58. import ProductAudit from './review/ProductAudit.vue'
  59. import GuideAudit from './review/GuideAudit.vue'
  60. import VendorAudit from './review/VendorAudit.vue'
  61. import ButlerAudit from './review/ButlerAudit.vue'
  62. import PackageAudit from './review/PackageAudit.vue'
  63. import ActivityAudit from './review/ActivityAudit.vue'
  64. import ActivityRegistrationAudit from './review/ActivityRegistrationAudit.vue'
  65. import WithdrawAudit from './review/WithdrawAudit.vue'
  66. import HierarchyAudit from './review/HierarchyAudit.vue'
  67. import NutritionistAudit from './review/NutritionistAudit.vue'
  68. export default {
  69. name: 'ReviewCenter',
  70. components: {
  71. ArticleAudit, ProductAudit, GuideAudit, VendorAudit, ButlerAudit,
  72. PackageAudit, ActivityAudit, ActivityRegistrationAudit, WithdrawAudit, HierarchyAudit,
  73. NutritionistAudit
  74. },
  75. data() {
  76. return {
  77. activeTab: 'article',
  78. summaryData: {},
  79. summaryCards: [
  80. { key: 'article', label: '文章审核', icon: '📄', count: 0 },
  81. { key: 'product', label: '商品审核', icon: '📦', count: 0 },
  82. { key: 'guide', label: '规划师审核', icon: '👤', count: 0 },
  83. { key: 'vendor', label: '服务商审核', icon: '🏪', count: 0 },
  84. { key: 'butler', label: '管家审核', icon: '🤵', count: 0 },
  85. { key: 'package', label: '任务模板审核', icon: '📋', count: 0 },
  86. { key: 'activity', label: '活动审核', icon: '🎯', count: 0 },
  87. { key: 'activityRegistration', label: '报名审核', icon: '📝', count: 0 },
  88. { key: 'withdraw', label: '提现审核', icon: '💰', count: 0 },
  89. { key: 'hierarchy', label: '更换上级', icon: '🔗', count: 0 },
  90. { key: 'nutritionist', label: '营养师审核', icon: '🥗', count: 0 },
  91. ]
  92. }
  93. },
  94. created() {
  95. if (this.$route.query.tab && this.summaryCards.some(c => c.key === this.$route.query.tab)) {
  96. this.activeTab = this.$route.query.tab
  97. }
  98. this.loadSummary()
  99. },
  100. methods: {
  101. async loadSummary() {
  102. try {
  103. const res = await request({ url: '/api/admin/review-center/summary', method: 'post', data: {} })
  104. if (res.code === 200 && res.data) {
  105. this.summaryData = res.data
  106. this.summaryCards.forEach(c => {
  107. const keyMap = {
  108. article: 'articlePending', product: 'productPending', guide: 'guidePending',
  109. vendor: 'vendorPending', butler: 'butlerPending', package: 'packagePending',
  110. nutritionist: 'nutritionistPending',
  111. activity: 'activityPending', activityRegistration: 'activityRegistrationPending',
  112. withdraw: 'withdrawPending', hierarchy: 'hierarchyChangePending'
  113. }
  114. c.count = res.data[keyMap[c.key]] || 0
  115. })
  116. }
  117. } catch (e) {
  118. console.error('加载审核概览失败', e)
  119. }
  120. },
  121. onTabClick(tab) {
  122. var ref = tab.name
  123. if (this.$refs[ref] && this.$refs[ref].loadData) {
  124. this.$refs[ref].loadData()
  125. }
  126. }
  127. }
  128. }
  129. </script>
  130. <style scoped>
  131. .review-center { padding: 16px; }
  132. .summary-row { margin-bottom: 16px; }
  133. .summary-card { cursor: pointer; text-align: center; }
  134. .summary-card.active { border-color: #409EFF; }
  135. .summary-inner { display: flex; flex-direction: column; align-items: center; gap: 4px; }
  136. .summary-icon { font-size: 28px; }
  137. .summary-count { font-size: 24px; font-weight: bold; color: #409EFF; }
  138. .summary-label { font-size: 12px; color: #666; }
  139. .detail-card { min-height: 400px; }
  140. </style>