MessageTable.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <template>
  2. <div>
  3. <el-table v-loading="props.loading" :data="props.list">
  4. <el-table-column
  5. label="发送时间"
  6. align="center"
  7. prop="createTime"
  8. width="180"
  9. :formatter="dateFormatter"
  10. />
  11. <el-table-column label="消息类型" align="center" prop="type" width="80" />
  12. <el-table-column label="发送方" align="center" prop="sendFrom" width="80">
  13. <template #default="scope">
  14. <el-tag v-if="scope.row.sendFrom === 1" type="success">粉丝</el-tag>
  15. <el-tag v-else type="info">公众号</el-tag>
  16. </template>
  17. </el-table-column>
  18. <el-table-column label="用户标识" align="center" prop="openid" width="300" />
  19. <el-table-column label="内容" prop="content">
  20. <template #default="scope">
  21. <!-- 【事件】区域 -->
  22. <div v-if="scope.row.type === MsgType.Event && scope.row.event === 'subscribe'">
  23. <el-tag type="success">关注</el-tag>
  24. </div>
  25. <div v-else-if="scope.row.type === MsgType.Event && scope.row.event === 'unsubscribe'">
  26. <el-tag type="danger">取消关注</el-tag>
  27. </div>
  28. <div v-else-if="scope.row.type === MsgType.Event && scope.row.event === 'CLICK'">
  29. <el-tag>点击菜单</el-tag>
  30. 【{{ scope.row.eventKey }}】
  31. </div>
  32. <div v-else-if="scope.row.type === MsgType.Event && scope.row.event === 'VIEW'">
  33. <el-tag>点击菜单链接</el-tag>
  34. 【{{ scope.row.eventKey }}】
  35. </div>
  36. <div
  37. v-else-if="scope.row.type === MsgType.Event && scope.row.event === 'scancode_waitmsg'"
  38. >
  39. <el-tag>扫码结果</el-tag>
  40. 【{{ scope.row.eventKey }}】
  41. </div>
  42. <div v-else-if="scope.row.type === MsgType.Event && scope.row.event === 'scancode_push'">
  43. <el-tag>扫码结果</el-tag>
  44. 【{{ scope.row.eventKey }}】
  45. </div>
  46. <div v-else-if="scope.row.type === MsgType.Event && scope.row.event === 'pic_sysphoto'">
  47. <el-tag>系统拍照发图</el-tag>
  48. </div>
  49. <div
  50. v-else-if="scope.row.type === MsgType.Event && scope.row.event === 'pic_photo_or_album'"
  51. >
  52. <el-tag>拍照或者相册</el-tag>
  53. </div>
  54. <div v-else-if="scope.row.type === MsgType.Event && scope.row.event === 'pic_weixin'">
  55. <el-tag>微信相册</el-tag>
  56. </div>
  57. <div
  58. v-else-if="scope.row.type === MsgType.Event && scope.row.event === 'location_select'"
  59. >
  60. <el-tag>选择地理位置</el-tag>
  61. </div>
  62. <div v-else-if="scope.row.type === MsgType.Event">
  63. <el-tag type="danger">未知事件类型</el-tag>
  64. </div>
  65. <!-- 【消息】区域 -->
  66. <div v-else-if="scope.row.type === MsgType.Text">{{ scope.row.content }}</div>
  67. <div v-else-if="scope.row.type === MsgType.Voice">
  68. <wx-voice-player :url="scope.row.mediaUrl" :content="scope.row.recognition" />
  69. </div>
  70. <div v-else-if="scope.row.type === MsgType.Image">
  71. <a target="_blank" :href="scope.row.mediaUrl">
  72. <img :src="scope.row.mediaUrl" style="width: 100px" />
  73. </a>
  74. </div>
  75. <div v-else-if="scope.row.type === MsgType.Video || scope.row.type === 'shortvideo'">
  76. <wx-video-player :url="scope.row.mediaUrl" style="margin-top: 10px" />
  77. </div>
  78. <div v-else-if="scope.row.type === MsgType.Link">
  79. <el-tag>链接</el-tag>
  80. <a :href="scope.row.url" target="_blank">{{ scope.row.title }}</a>
  81. </div>
  82. <div v-else-if="scope.row.type === MsgType.Location">
  83. <WxLocation
  84. :label="scope.row.label"
  85. :location-y="scope.row.locationY"
  86. :location-x="scope.row.locationX"
  87. />
  88. </div>
  89. <div v-else-if="scope.row.type === MsgType.Music">
  90. <WxMusic
  91. :title="scope.row.title"
  92. :description="scope.row.description"
  93. :thumb-media-url="scope.row.thumbMediaUrl"
  94. :music-url="scope.row.musicUrl"
  95. :hq-music-url="scope.row.hqMusicUrl"
  96. />
  97. </div>
  98. <div v-else-if="scope.row.type === MsgType.News">
  99. <WxNews :articles="scope.row.articles" />
  100. </div>
  101. <div v-else>
  102. <el-tag type="danger">未知消息类型</el-tag>
  103. </div>
  104. </template>
  105. </el-table-column>
  106. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  107. <template #default="scope">
  108. <el-button
  109. link
  110. type="primary"
  111. @click="emit('send', scope.row.userId)"
  112. v-hasPermi="['mp:message:send']"
  113. >
  114. 消息
  115. </el-button>
  116. </template>
  117. </el-table-column>
  118. </el-table>
  119. <!-- 分页组件 -->
  120. </div>
  121. </template>
  122. <script setup lang="ts">
  123. import WxVideoPlayer from '@/views/mp/components/wx-video-play/main.vue'
  124. import WxVoicePlayer from '@/views/mp/components/wx-voice-play/main.vue'
  125. import WxLocation from '@/views/mp/components/wx-location/main.vue'
  126. import WxMusic from '@/views/mp/components/wx-music/main.vue'
  127. import WxNews from '@/views/mp/components/wx-news/main.vue'
  128. import { dateFormatter } from '@/utils/formatTime'
  129. import { MsgType } from '@/views/mp/components/wx-msg/types'
  130. const props = defineProps({
  131. list: {
  132. type: Array,
  133. required: true
  134. },
  135. loading: {
  136. type: Boolean,
  137. required: true
  138. }
  139. })
  140. const emit = defineEmits<{ (e: 'send', v: number) }>()
  141. </script>