index.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <template>
  2. <a-card :bordered="false">
  3. <s-table
  4. ref="table"
  5. :columns="columns"
  6. :data="loadData"
  7. :alert="options.alert.show"
  8. bordered
  9. :row-key="(record) => record.reportId"
  10. :tool-config="toolConfig"
  11. :row-selection="options.rowSelection"
  12. >
  13. <template #operator class="table-operator">
  14. <a-space>
  15. <a-button type="primary" @click="formRef.onOpen()" v-if="hasPerm('forumReportInfoAdd')">
  16. <template #icon><plus-outlined /></template>
  17. 新增
  18. </a-button>
  19. <xn-batch-delete
  20. v-if="hasPerm('forumReportInfoBatchDelete')"
  21. :selectedRowKeys="selectedRowKeys"
  22. @batchDelete="deleteBatchForumReportInfo"
  23. />
  24. </a-space>
  25. </template>
  26. <template #bodyCell="{ column, record }">
  27. <template v-if="column.dataIndex === 'action'">
  28. <a-space>
  29. <a @click="formRef.onOpen(record)" v-if="hasPerm('forumReportInfoEdit')">编辑</a>
  30. <a-divider type="vertical" v-if="hasPerm(['forumReportInfoEdit', 'forumReportInfoDelete'], 'and')" />
  31. <a-popconfirm title="确定要删除吗?" @confirm="deleteForumReportInfo(record)">
  32. <a-button type="link" danger size="small" v-if="hasPerm('forumReportInfoDelete')">删除</a-button>
  33. </a-popconfirm>
  34. <a-divider type="vertical" v-if="hasPerm(['forumReportInfoDelete', 'forumReportInfoAudit'], 'and')" />
  35. <a @click="showModal(record)" v-if="hasPerm('forumReportInfoAudit')">审核</a>
  36. </a-space>
  37. </template>
  38. <template v-if="column.dataIndex === 'reportReasonType'">
  39. <div v-if="record.reportReasonType == 0">垃圾广告</div>
  40. <div v-if="record.reportReasonType == 1">色情内容</div>
  41. <div v-if="record.reportReasonType == 2">人身攻击</div>
  42. <div v-if="record.reportReasonType == 3">政治敏感</div>
  43. <div v-if="record.reportReasonType == 4">其他</div>
  44. </template>
  45. <template v-if="column.dataIndex === 'reportStatus'">
  46. <div v-if="record.reportStatus == 0">待处理</div>
  47. <div v-if="record.reportStatus == 1">已关闭帖子</div>
  48. <div v-if="record.reportStatus == 2">已驳回</div>
  49. </template>
  50. <template v-if="column.dataIndex === 'postType'">
  51. <div v-if="record.postType == 0">普通帖子</div>
  52. <div v-if="record.postType == 1">技术支持</div>
  53. <div v-if="record.postType == 2">内容纠错</div>
  54. </template>
  55. <template v-if="column.dataIndex === 'postStatus'">
  56. <div v-if="record.postStatus == 0">正常</div>
  57. <div v-if="record.postStatus == 1">关闭</div>
  58. </template>
  59. <template v-if="column.dataIndex === 'evidenceScreenshot'">
  60. <a-image
  61. :width="50"
  62. :height="50"
  63. :src="sysConfig.FILE_URL + record.evidenceScreenshot"
  64. fallback="data:image/png;base64,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"
  65. />
  66. </template>
  67. <template v-if="column.dataIndex === 'postTitle'">
  68. <a @click="jumpDetail(record)">{{ record.postTitle }}</a>
  69. </template>
  70. </template>
  71. </s-table>
  72. </a-card>
  73. <Form ref="formRef" @successful="table.refresh(true)" />
  74. <a-modal v-model:visible="openAudit" title="审核" @ok="auditFun">
  75. <a-select v-model:value="reportStatus" placeholder="请选择" style="width: 100%" :options="statusType"></a-select>
  76. </a-modal>
  77. </template>
  78. <script setup name="reportinfo">
  79. import Form from './form.vue'
  80. import forumReportInfoApi from '@/api/forum/forumReportInfoApi'
  81. import forumApi from '@/api/forum/forumApi'
  82. import { message } from 'ant-design-vue'
  83. import sysConfig from '@/config/index'
  84. import { useRoute, useRouter } from 'vue-router'
  85. const router = useRouter()
  86. const table = ref()
  87. const formRef = ref()
  88. const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false }
  89. const columns = [
  90. {
  91. title: '帖子标题',
  92. dataIndex: 'postTitle'
  93. },
  94. {
  95. title: '帖子类型',
  96. dataIndex: 'postType'
  97. },
  98. {
  99. title: '帖子状态',
  100. dataIndex: 'postStatus'
  101. },
  102. {
  103. title: '举报人',
  104. dataIndex: 'userNickname'
  105. },
  106. {
  107. title: '举报原因类型',
  108. dataIndex: 'reportReasonType'
  109. },
  110. {
  111. title: '举报信息描述',
  112. dataIndex: 'reportDetail'
  113. },
  114. {
  115. title: '证据图片',
  116. dataIndex: 'evidenceScreenshot'
  117. },
  118. {
  119. title: '举报处理状态',
  120. dataIndex: 'reportStatus'
  121. }
  122. ]
  123. // 操作栏通过权限判断是否显示
  124. if (hasPerm(['forumReportInfoEdit', 'forumReportInfoDelete'])) {
  125. columns.push({
  126. title: '操作',
  127. dataIndex: 'action',
  128. align: 'center',
  129. width: '200px'
  130. })
  131. }
  132. const selectedRowKeys = ref([])
  133. // 列表选择配置
  134. const options = {
  135. // columns数字类型字段加入 needTotal: true 可以勾选自动算账
  136. alert: {
  137. show: true,
  138. clear: () => {
  139. selectedRowKeys.value = ref([])
  140. }
  141. },
  142. rowSelection: {
  143. onChange: (selectedRowKey, selectedRows) => {
  144. selectedRowKeys.value = selectedRowKey
  145. }
  146. }
  147. }
  148. const loadData = (parameter) => {
  149. return forumReportInfoApi.forumReportInfoPage(parameter).then((data) => {
  150. return data
  151. })
  152. }
  153. // 重置
  154. const reset = () => {
  155. searchFormRef.value.resetFields()
  156. table.value.refresh(true)
  157. }
  158. // 删除
  159. const deleteForumReportInfo = (record) => {
  160. let params = [
  161. {
  162. reportId: record.reportId
  163. }
  164. ]
  165. forumReportInfoApi.forumReportInfoDelete(params).then(() => {
  166. table.value.refresh(true)
  167. })
  168. }
  169. // 批量删除
  170. const deleteBatchForumReportInfo = (params) => {
  171. params = params.map((r) => {
  172. return {
  173. reportId: r.id
  174. }
  175. })
  176. forumReportInfoApi.forumReportInfoDelete(params).then(() => {
  177. table.value.clearRefreshSelected()
  178. })
  179. }
  180. //状态
  181. const statusType = ref([
  182. {
  183. label: '关闭帖子',
  184. value: 1
  185. },
  186. {
  187. label: '驳回举报',
  188. value: 2
  189. }
  190. ])
  191. const reportStatus = ref()
  192. const itemData = ref({})
  193. const openAudit = ref(false)
  194. const showModal = (event) => {
  195. itemData.value = event
  196. openAudit.value = true
  197. }
  198. const auditFun = (event) => {
  199. if (!reportStatus.value) {
  200. message.warning('请选择处理方式')
  201. return
  202. }
  203. forumApi
  204. .reportinfoAudit({
  205. reportId: itemData.value.reportId,
  206. reportStatus: reportStatus.value
  207. })
  208. .then((data) => {
  209. openAudit.value = false
  210. table.value.refresh(true)
  211. })
  212. }
  213. const jumpDetail = (event) => {
  214. router.push({
  215. path: '/forum/detail',
  216. query: {
  217. postId: event.postId,
  218. }
  219. })
  220. }
  221. </script>