|
@@ -52,7 +52,7 @@
|
|
|
<el-table-column prop="createdAt" label="举报时间" width="170" />
|
|
<el-table-column prop="createdAt" label="举报时间" width="170" />
|
|
|
<el-table-column label="操作" width="220" fixed="right">
|
|
<el-table-column label="操作" width="220" fixed="right">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
- <el-button size="small" type="primary" link @click="openDynamic(row.dynamicId)">查看动态</el-button>
|
|
|
|
|
|
|
+ <el-button size="small" type="primary" link @click="openDynamic(row)">查看动态</el-button>
|
|
|
<el-button size="small" type="warning" link @click="openHandle(row)">处理举报</el-button>
|
|
<el-button size="small" type="warning" link @click="openHandle(row)">处理举报</el-button>
|
|
|
<el-divider direction="vertical" />
|
|
<el-divider direction="vertical" />
|
|
|
<el-button size="small" type="danger" link @click="openModerate(row, 3)">删除</el-button>
|
|
<el-button size="small" type="danger" link @click="openModerate(row, 3)">删除</el-button>
|
|
@@ -133,7 +133,7 @@
|
|
|
import { ref, reactive, onMounted } from 'vue'
|
|
import { ref, reactive, onMounted } from 'vue'
|
|
|
import { ElMessage } from 'element-plus'
|
|
import { ElMessage } from 'element-plus'
|
|
|
import request from '@/utils/request'
|
|
import request from '@/utils/request'
|
|
|
-import { API_ENDPOINTS } from '@/config/api'
|
|
|
|
|
|
|
+import { API_ENDPOINTS, API_BASE_URL } from '@/config/api'
|
|
|
|
|
|
|
|
const loading = ref(false)
|
|
const loading = ref(false)
|
|
|
const currentPage = ref(1)
|
|
const currentPage = ref(1)
|
|
@@ -154,8 +154,12 @@ const statusType = (s) => ({0:'danger',1:'warning',2:'success',3:'info'}[s] || '
|
|
|
const typeText = (t) => ({ spam:'垃圾广告', porn:'色情低俗', violence:'暴力违法', attack:'人身攻击', fake:'虚假信息', plagiarism:'抄袭侵权', other:'其他' }[t] || t || '其他')
|
|
const typeText = (t) => ({ spam:'垃圾广告', porn:'色情低俗', violence:'暴力违法', attack:'人身攻击', fake:'虚假信息', plagiarism:'抄袭侵权', other:'其他' }[t] || t || '其他')
|
|
|
const typeTagType = (t) => ({ spam:'warning', porn:'danger', violence:'danger', attack:'danger', fake:'warning', plagiarism:'warning', other:'info' }[t] || 'info')
|
|
const typeTagType = (t) => ({ spam:'warning', porn:'danger', violence:'danger', attack:'danger', fake:'warning', plagiarism:'warning', other:'info' }[t] || 'info')
|
|
|
|
|
|
|
|
-const BASE = import.meta.env.DEV ? 'http://localhost:8083' : ''
|
|
|
|
|
-const formatMedia = (u) => (u && !u.startsWith('http') ? `${BASE}${u}` : u)
|
|
|
|
|
|
|
+const BASE = import.meta.env.DEV ? 'http://localhost:8083' : API_BASE_URL || ''
|
|
|
|
|
+const formatMedia = (u) => {
|
|
|
|
|
+ if (!u) return ''
|
|
|
|
|
+ const url = String(u).trim()
|
|
|
|
|
+ return /^https?:\/\//i.test(url) ? url : `${BASE}${url}`
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
// 从后端临时塞入的 handleResult 前缀里解析昵称(@nick:李娜 ...)
|
|
// 从后端临时塞入的 handleResult 前缀里解析昵称(@nick:李娜 ...)
|
|
|
const extractNick = (row) => {
|
|
const extractNick = (row) => {
|
|
@@ -196,27 +200,48 @@ const loadList = async () => {
|
|
|
|
|
|
|
|
// 动态详情
|
|
// 动态详情
|
|
|
const dynamicDialog = reactive({ visible: false, loading: false, data: null, medias: [] })
|
|
const dynamicDialog = reactive({ visible: false, loading: false, data: null, medias: [] })
|
|
|
-const openDynamic = async (dynamicId) => {
|
|
|
|
|
|
|
+const parseMediaUrls = (raw) => {
|
|
|
|
|
+ if (!raw) return []
|
|
|
|
|
+ try {
|
|
|
|
|
+ const value = typeof raw === 'string' ? raw.trim() : raw
|
|
|
|
|
+ if (typeof value === 'string' && value.startsWith('[')) {
|
|
|
|
|
+ return JSON.parse(value)
|
|
|
|
|
+ }
|
|
|
|
|
+ if (typeof value === 'string') {
|
|
|
|
|
+ return value.split(',').map((s) => s.trim().replace(/^['"]|['"]$/g, '')).filter(Boolean)
|
|
|
|
|
+ }
|
|
|
|
|
+ return Array.isArray(value) ? value : []
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ return []
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+const openDynamic = async (row) => {
|
|
|
|
|
+ const dynamicId = row?.dynamicId
|
|
|
|
|
+ if (!dynamicId) {
|
|
|
|
|
+ dynamicDialog.data = { content: '未获取到动态ID' }
|
|
|
|
|
+ dynamicDialog.medias = parseScreens(row?.screenshots)
|
|
|
|
|
+ dynamicDialog.visible = true
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
dynamicDialog.visible = true
|
|
dynamicDialog.visible = true
|
|
|
dynamicDialog.loading = true
|
|
dynamicDialog.loading = true
|
|
|
dynamicDialog.data = null
|
|
dynamicDialog.data = null
|
|
|
dynamicDialog.medias = []
|
|
dynamicDialog.medias = []
|
|
|
try {
|
|
try {
|
|
|
const res = await request.get(`${API_ENDPOINTS.DYNAMIC_DETAIL}/${dynamicId}`)
|
|
const res = await request.get(`${API_ENDPOINTS.DYNAMIC_DETAIL}/${dynamicId}`)
|
|
|
- if (res.code === 200) {
|
|
|
|
|
|
|
+ if (res.code === 200 && res.data) {
|
|
|
dynamicDialog.data = res.data
|
|
dynamicDialog.data = res.data
|
|
|
- const raw = res.data?.mediaUrls
|
|
|
|
|
- if (raw) {
|
|
|
|
|
- if (typeof raw === 'string' && raw.trim().startsWith('[')) {
|
|
|
|
|
- dynamicDialog.medias = JSON.parse(raw)
|
|
|
|
|
- } else if (typeof raw === 'string') {
|
|
|
|
|
- dynamicDialog.medias = raw.split(',').map(s=>s.trim()).filter(Boolean)
|
|
|
|
|
- } else if (Array.isArray(raw)) {
|
|
|
|
|
- dynamicDialog.medias = raw
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ const medias = parseMediaUrls(res.data?.mediaUrls)
|
|
|
|
|
+ dynamicDialog.medias = medias.length ? medias : parseScreens(row?.screenshots)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ dynamicDialog.data = { content: res.msg || '动态不存在或已被删除' }
|
|
|
|
|
+ dynamicDialog.medias = parseScreens(row?.screenshots)
|
|
|
}
|
|
}
|
|
|
- } catch (e) { console.error('获取动态详情失败', e) }
|
|
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('获取动态详情失败', e)
|
|
|
|
|
+ dynamicDialog.data = { content: e?.message ? `加载失败:${e.message}` : '加载失败' }
|
|
|
|
|
+ dynamicDialog.medias = parseScreens(row?.screenshots)
|
|
|
|
|
+ }
|
|
|
finally { dynamicDialog.loading = false }
|
|
finally { dynamicDialog.loading = false }
|
|
|
}
|
|
}
|
|
|
|
|
|