DataTableSlot.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: DataTableSlot.vue
  4. * @Description: 商品监控-表格插槽
  5. * @Author: Cheney
  6. */
  7. import { useCountryInfoStore } from '/@/stores/countryInfo';
  8. import { Delete, Operation } from '@element-plus/icons-vue';
  9. import PermissionButton from '/@/components/PermissionButton/index.vue';
  10. import ProductInfo from '/@/views/product-manage/product-list/component/ProductInfo.vue';
  11. import { getTagType } from '/@/utils/useTagColor';
  12. import ProgressBar from '/@/views/product-manage/product-monitor/component/ProgressBar.vue';
  13. const props = defineProps<{
  14. row: any,
  15. field: any
  16. }>();
  17. const { row, field } = props;
  18. const emit = defineEmits([ 'edit-row', 'handle-delete' ]);
  19. const countryInfoStore = useCountryInfoStore();
  20. const country = countryInfoStore.countries.find(c => c.code == row.country_code);
  21. const color = country ? country.color : '#3875F6';
  22. const statusText = row.status === 1 ? '在售' : '停售';
  23. const statusType = row.status === 1 ? 'success' : 'info';
  24. function handleEdit(row: any) {
  25. emit('edit-row', row);
  26. }
  27. function handleDelete(row: any) {
  28. emit('handle-delete', row);
  29. }
  30. </script>
  31. <template>
  32. <div class="font-medium">
  33. <div v-if="field === 'product_info'">
  34. <ProductInfo :img-width="50" :item="row.goods" />
  35. </div>
  36. <div v-else-if="field === 'country_code'">
  37. <el-tag :disable-transitions="true" :style="{ color: color, borderColor: color }" effect="plain" round>
  38. {{ country ? country.name : '--' }}
  39. </el-tag>
  40. </div>
  41. <div v-else-if="field === 'shop_name'">
  42. <el-tag :disable-transitions="true" :type=getTagType(row.shop_name)>
  43. {{ row.shop_name ?? '--' }}
  44. </el-tag>
  45. </div>
  46. <div v-else-if="field === 'tag'">
  47. <el-tag :disable-transitions="true" :type=getTagType(row.goods.tag)>
  48. {{ row.goods.tag ?? '--' }}
  49. </el-tag>
  50. </div>
  51. <div v-else-if="field === 'brand'">
  52. <el-tag :disable-transitions="true" :type=getTagType(row.goods.brand) effect="plain" round>
  53. {{ row.goods.brand ?? '--' }}
  54. </el-tag>
  55. </div>
  56. <div v-else-if="field === 'price_info'">
  57. <div v-if="row.goods.price > 0" class="font-medium">
  58. <p>现 价:{{ row.goods.currency_code + '‎' + row.goods.price }}</p>
  59. <p>折 扣:{{ row.goods.discount > 0 ? row.goods.discount + '%' : '-' }}</p>
  60. <p>优惠劵:{{ !row || row.goods.coupon <= 0 ? '-' : row.goods.currency_code + '‎' + row.goods.coupon }}</p>
  61. </div>
  62. </div>
  63. <div v-else-if="field === 'show_price'">
  64. <div class="font-medium">
  65. {{ row.goods.show_price ? row.goods.currency_code + row.goods.show_price : '--' }}
  66. </div>
  67. </div>
  68. <div v-else-if="field === 'activity_price'">
  69. <div class="font-medium">
  70. {{ row.goods.activity_price ? row.goods.currency_code + row.goods.activity_price : '--' }}
  71. </div>
  72. </div>
  73. <div v-else-if="field === 'minimum_price'">
  74. <div class="font-medium">
  75. {{ row.goods.minimum_price ? row.goods.currency_code + row.goods.minimum_price : '--' }}
  76. </div>
  77. </div>
  78. <div v-else-if="field === 'score'">
  79. <template v-if="row.goods.score !== null && row.goods.score !== undefined && row.goods.score !== ''">
  80. <el-rate
  81. v-if="row.goods.score > 0"
  82. v-model="row.goods.score"
  83. :colors="['#FF0000', '#FF9900', '#67C23A']"
  84. disabled
  85. show-score
  86. text-color="#1e293b"
  87. />
  88. <span v-else>{{ row.goods.score }}</span> <!-- 值为0时显示0 -->
  89. </template>
  90. <template v-else>
  91. <span>--</span> <!-- 无值时显示'--' -->
  92. </template>
  93. </div>
  94. <div v-else-if="field === 'all_score'">
  95. <template v-if="row.goods.all_score !== null && row.goods.all_score !== undefined && row.goods.all_score !== ''">
  96. <el-rate
  97. v-if="row.goods.all_score > 0"
  98. v-model="row.goods.all_score"
  99. :colors="['#FF0000', '#FF9900', '#67C23A']"
  100. disabled
  101. show-score
  102. text-color="#1e293b"
  103. />
  104. <span v-else>{{ row.goods.all_score }}</span>
  105. </template>
  106. <template v-else>
  107. <span>--</span>
  108. </template>
  109. </div>
  110. <div v-else-if="field === 'stars'" class="flex flex-col font-normal" style="min-width: 170px">
  111. <ProgressBar :row="row" percentage="ratings" />
  112. </div>
  113. <div v-else-if="field === 'all_stars'" class="flex flex-col font-normal" style="min-width: 170px">
  114. <ProgressBar :row="row" percentage="all_rate" />
  115. </div>
  116. <div v-else-if="field === 'status'">
  117. <el-tag :disable-transitions="true" :type=statusType>
  118. {{ statusText }}
  119. </el-tag>
  120. </div>
  121. <div v-else-if="field === 'operate'">
  122. <div class="flex justify-center gap-2">
  123. <PermissionButton circle plain type="warning" @click="handleEdit(row)">
  124. <el-icon>
  125. <Operation />
  126. </el-icon>
  127. </PermissionButton>
  128. <PermissionButton circle plain type="danger" @click="handleDelete(row)">
  129. <el-icon>
  130. <Delete />
  131. </el-icon>
  132. </PermissionButton>
  133. </div>
  134. </div>
  135. <div v-else>
  136. {{ row.goods[field] }}
  137. </div>
  138. </div>
  139. </template>
  140. <style scoped>
  141. :deep(.flex-1 .el-progress__text) {
  142. font-size: 14px !important;
  143. }
  144. </style>