index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <template>
  2. <ContentWrap>
  3. <!-- 搜索工作栏 -->
  4. <el-form
  5. class="-mb-15px"
  6. :model="queryParams"
  7. ref="queryFormRef"
  8. :inline="true"
  9. label-width="68px"
  10. >
  11. <el-form-item label="公众号" prop="accountId">
  12. <WxAccountSelect @change="onAccountChanged" />
  13. </el-form-item>
  14. <el-form-item>
  15. <el-button
  16. type="success"
  17. plain
  18. @click="handleSync"
  19. :loading="syncLoading"
  20. v-hasPermi="['mp:message-template:sync']"
  21. :disabled="queryParams.accountId === -1"
  22. >
  23. <Icon icon="ep:refresh" class="mr-5px" /> 同步
  24. </el-button>
  25. </el-form-item>
  26. </el-form>
  27. </ContentWrap>
  28. <!-- 列表 -->
  29. <ContentWrap>
  30. <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
  31. <el-table-column label="公众号模板 ID" align="center" prop="templateId" width="200px" />
  32. <el-table-column label="标题" align="center" prop="title" width="150px" />
  33. <el-table-column label="模板内容" align="center" prop="content" />
  34. <el-table-column label="模板示例" align="center" prop="example" width="200px" />
  35. <el-table-column label="一级行业" align="center" prop="primaryIndustry" width="120px" />
  36. <el-table-column label="二级行业" align="center" prop="deputyIndustry" width="120px" />
  37. <el-table-column
  38. label="创建时间"
  39. align="center"
  40. prop="createTime"
  41. :formatter="dateFormatter"
  42. width="180px"
  43. />
  44. <el-table-column label="操作" align="center" width="160">
  45. <template #default="scope">
  46. <el-button
  47. link
  48. type="primary"
  49. @click="handleSend(scope.row)"
  50. v-hasPermi="['mp:message-template:send']"
  51. >
  52. 发送
  53. </el-button>
  54. <el-button
  55. link
  56. type="danger"
  57. @click="handleDelete(scope.row.id)"
  58. v-hasPermi="['mp:message-template:delete']"
  59. >
  60. 删除
  61. </el-button>
  62. </template>
  63. </el-table-column>
  64. </el-table>
  65. </ContentWrap>
  66. <!-- 表单弹窗:发送消息 -->
  67. <MessageTemplateSendForm ref="sendFormRef" />
  68. </template>
  69. <script setup lang="ts">
  70. import { dateFormatter } from '@/utils/formatTime'
  71. import { MessageTemplateApi, MsgTemplateVO } from '@/api/mp/messageTemplate'
  72. import MessageTemplateSendForm from './MessageTemplateSendForm.vue'
  73. import WxAccountSelect from '@/views/mp/components/wx-account-select'
  74. /** 公众号消息模板列表 */
  75. defineOptions({ name: 'MpMessageTemplate' })
  76. const message = useMessage() // 消息弹窗
  77. const { t } = useI18n() // 国际化
  78. const loading = ref(true) // 列表的加载中
  79. const list = ref<MsgTemplateVO[]>([]) // 列表的数据
  80. const queryParams = reactive({
  81. accountId: -1
  82. })
  83. const queryFormRef = ref() // 搜索的表单
  84. const syncLoading = ref(false) // 同步模板的加载中
  85. /** 公众号选择变化 */
  86. const onAccountChanged = (accountId: number) => {
  87. queryParams.accountId = accountId
  88. getList()
  89. }
  90. /** 查询列表 */
  91. const getList = async () => {
  92. loading.value = true
  93. try {
  94. const data = await MessageTemplateApi.getMessageTemplateList(queryParams)
  95. if (data) {
  96. list.value = data
  97. }
  98. } finally {
  99. loading.value = false
  100. }
  101. }
  102. /** 同步操作 */
  103. const handleSync = async () => {
  104. try {
  105. await message.confirm('是否确认同步消息模板?')
  106. syncLoading.value = true
  107. await MessageTemplateApi.syncMessageTemplate(queryParams.accountId)
  108. message.success('同步消息模板成功')
  109. await getList()
  110. } finally {
  111. syncLoading.value = false
  112. }
  113. }
  114. /** 发送消息操作 */
  115. const sendFormRef = ref()
  116. const handleSend = (row: MsgTemplateVO) => {
  117. sendFormRef.value.open(row)
  118. }
  119. /** 删除按钮操作 */
  120. const handleDelete = async (id: number) => {
  121. try {
  122. // 删除的二次确认
  123. await message.delConfirm()
  124. // 发起删除
  125. await MessageTemplateApi.deleteMessageTemplate(id)
  126. message.success(t('common.delSuccess'))
  127. // 刷新列表
  128. await getList()
  129. } catch {}
  130. }
  131. </script>