From 621e436eb026a2ad128225f367a6c7fd74a15c87 Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Wed, 1 Jul 2026 13:37:01 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=B7=A6=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=99=A8+=E5=8F=B3URL=E5=8D=A1=E7=89=87+?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E7=BB=93=E6=9E=9C=E9=80=89=E6=8B=A9=EF=BC=8C?= =?UTF-8?q?=E4=B8=89=E5=90=88=E4=B8=80=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/views/AccessResultCheck.vue | 416 +++++++++++----------------- 1 file changed, 166 insertions(+), 250 deletions(-) diff --git a/web/src/views/AccessResultCheck.vue b/web/src/views/AccessResultCheck.vue index ff1ac24..fa5a9ca 100644 --- a/web/src/views/AccessResultCheck.vue +++ b/web/src/views/AccessResultCheck.vue @@ -1,141 +1,110 @@ @@ -147,37 +116,27 @@ import { Loading } from '@element-plus/icons-vue' const route = useRoute() const siteId = route.params.siteId -const loading = ref(false) -const parseLoading = ref(false) -const selectedConfigId = ref(null) -const selectedConfig = ref(null) -const configVisible = ref(false) -watch(configVisible, (v) => { if (v) loadScript() }) -const scriptContent = ref('') -const scriptLoading = ref(false) -const saving = ref(false) -const approving = ref(false) -const rejecting = ref(false) - -const allConfigVersions = ref([]) -const allResults = ref([]) -const pageParsed = ref({}) -const expandedSet = reactive(new Set()) -const reparsingUrls = reactive(new Set()) -const rawVisible = ref(false), rawLoading = ref(false), rawUrl = ref(''), rawContent = ref('') +const loading = ref(false), parseLoading = ref(false) +const selectedConfigId = ref(null), selectedConfig = ref(null) +const scriptContent = ref(''), saving = ref(false), approving = ref(false), rejecting = ref(false) +const allConfigVersions = ref([]), allResults = ref([]) +const pageParsed = ref({}), reparsingUrls = reactive(new Set()) +const rawVisible = ref(false), rawLoading = ref(false), rawContent = ref('') const totalResults = computed(() => allResults.value.length) -// 始终从 allResults 按 URL 分组 const pages = computed(() => { - const map = new Map() + const map = new LinkedHashMap() for (const r of allResults.value) { const key = r.url || '(无URL)' if (!map.has(key)) { - map.set(key, { url: key, accessResultId: r.id, statusCode: r.statusCode, responseTimeMs: r.responseTimeMs, - createdAt: r.createdAt, totalCount: 0, parsed: null }) + map.set(key, { url: key, activeId: r.id, accessResultId: r.id, + statusCode: r.statusCode, responseTimeMs: r.responseTimeMs, + createdAt: r.createdAt, totalCount: 0, historyIds: [], parsed: null }) } - map.get(key).totalCount++ + const p = map.get(key) + p.totalCount++ + p.historyIds.push({ id: r.id, time: (r.createdAt||'').substring(5,16) }) } for (const [url, parsed] of Object.entries(pageParsed.value)) { if (map.has(url)) map.get(url).parsed = parsed @@ -185,35 +144,41 @@ const pages = computed(() => { return Array.from(map.values()) }) -// 全局解析摘要 const parseSummary = computed(() => { let matched = 0, unmatched = 0 for (const p of pages.value) { - if (p.parsed) { - if (p.parsed.matched) matched++ - else unmatched++ - } + if (p.parsed) { if (p.parsed.matched) matched++; else unmatched++ } } return { matched, unmatched, hasParsed: matched + unmatched > 0 } }) -// 加载配置版本 const loadConfigs = async () => { try { - const [ar, pr] = await Promise.allSettled([ - api.configs.bySite(siteId), api.adminConfigs.pendingBySite(siteId) - ]) - const approved = ar.status==='fulfilled' ? (ar.value.data||[]) : [] - const pending = pr.status==='fulfilled' ? (pr.value.data||[]) : [] - allConfigVersions.value = [...pending, ...approved] + const [ar, pr] = await Promise.allSettled([api.configs.bySite(siteId), api.adminConfigs.pendingBySite(siteId)]) + allConfigVersions.value = [...(pr.status==='fulfilled'?pr.value.data||[]:[]), ...(ar.status==='fulfilled'?ar.value.data||[]:[])] if (allConfigVersions.value.length) selectedConfigId.value = allConfigVersions.value[0].id } catch {} } -const onConfigChange = async () => { +const onConfigChange = () => { const cfg = allConfigVersions.value.find(v => v.id===selectedConfigId.value) - if (!cfg) return - selectedConfig.value = cfg + if (cfg) selectedConfig.value = cfg +} + +const loadScript = async () => { + if (!selectedConfig.value) return + try { const r = await api.adminConfigs.getScript(selectedConfig.value.id); scriptContent.value = r.data?.script||'' } + catch { scriptContent.value = '' } +} + +watch(selectedConfig, (v) => { if (v) loadScript() }) + +const saveScript = async () => { + if (!selectedConfig.value) return + saving.value = true + try { await api.adminConfigs.updateScript(selectedConfig.value.id, scriptContent.value); ElMessage.success('已保存') } + catch(e) { ElMessage.error(e.response?.data?.message||'保存失败') } + finally { saving.value = false } } const doBatchParse = async () => { @@ -222,46 +187,56 @@ const doBatchParse = async () => { try { const r = await api.adapter.parseBatch(selectedConfigId.value, siteId) const map = {} - for (const p of (r.data?.pages || [])) { - if (p.parsed) map[p.url] = p.parsed - } + for (const p of (r.data?.pages||[])) { if (p.parsed) map[p.url] = p.parsed } pageParsed.value = map - } catch { /* 非关键 */ } + } catch {} finally { parseLoading.value = false } } +const reparseUrl = async (page) => { + if (!selectedConfigId.value) return + reparsingUrls.add(page.url) + try { + const r = await api.adapter.parse(selectedConfigId.value, page.activeId) + if (r.data) { + const np = { ...pageParsed.value }; np[page.url] = r.data; pageParsed.value = np + } + } catch {} + finally { reparsingUrls.delete(page.url) } +} + +const parseHistory = async (page, newId) => { + page.accessResultId = newId + await reparseUrl(page) +} + const refresh = async () => { loading.value = true - try { - const r = await api.accessResults.bySite(siteId) - allResults.value = r.data||[] - if (selectedConfigId.value) await doBatchParse() - } catch { ElMessage.error('获取访问结果失败') } + try { allResults.value = (await api.accessResults.bySite(siteId)).data||[] } + catch { ElMessage.error('获取访问结果失败') } finally { loading.value = false } } -// 编辑 -const loadScript = async () => { - if (!selectedConfig.value) return - scriptLoading.value = true - try { const r = await api.adminConfigs.getScript(selectedConfig.value.id); scriptContent.value = r.data?.script || '' } - catch { scriptContent.value = '' } - finally { scriptLoading.value = false } +const viewRaw = async (page) => { + rawVisible.value = true; rawLoading.value = true; rawContent.value = '' + try { rawContent.value = (await api.accessResults.get(page.activeId)).data?.content || '(空)' } + catch { rawContent.value = '加载失败' } + finally { rawLoading.value = false } } -const saveScript = async () => { - saving.value = true - try { - await api.adminConfigs.updateScript(selectedConfig.value.id, scriptContent.value) - configVisible.value = false - ElMessage.success('脚本已保存') - } catch(e) { ElMessage.error(e.response?.data?.message||'保存失败') } - finally { saving.value = false } + +const deleteResult = async (page) => { + if (!page.accessResultId) return + try { await api.accessResults.delete(page.accessResultId); ElMessage.success('已删除'); refresh() } + catch { ElMessage.error('删除失败') } } + const approveConfig = async () => { - try { await ElMessageBox.confirm('确认审批?版本号将自动+1','审批配置',{confirmButtonText:'确认'}) } catch{return} + if (!selectedConfig.value) return + const label = selectedConfig.value.status==='pending' ? '确认审批?版本号将自动+1' : '确认发布脚本?版本号将+1' + try { await ElMessageBox.confirm(label,'确认',{confirmButtonText:'确认'}) } catch{return} approving.value = true - try { await api.adminConfigs.approve(selectedConfig.value.id); ElMessage.success('已审批'); loadConfigs() } - catch(e) { ElMessage.error(e.response?.data?.message||'审批失败') } + try { await api.adminConfigs.approve(selectedConfig.value.id); ElMessage.success('已发布'); loadConfigs() } + catch(e) { ElMessage.error(e.response?.data?.message||'失败') } finally { approving.value = false } } @@ -269,81 +244,22 @@ const rejectConfig = async () => { try { await ElMessageBox.confirm('确认拒绝?','拒绝配置',{confirmButtonText:'确认',type:'warning'}) } catch{return} rejecting.value = true try { await api.adminConfigs.reject(selectedConfig.value.id,''); ElMessage.success('已拒绝'); loadConfigs() } - catch(e) { ElMessage.error(e.response?.data?.message||'拒绝失败') } + catch(e) { ElMessage.error(e.response?.data?.message||'失败') } finally { rejecting.value = false } } -const toggleView = (page) => { - if (expandedSet.has(page.url)) expandedSet.delete(page.url) - else expandedSet.add(page.url) -} - -const reparseUrl = async (page) => { - if (!selectedConfigId.value || !page.accessResultId) return - reparsingUrls.add(page.url) - try { - const r = await api.adapter.parse(selectedConfigId.value, page.accessResultId) - const parsed = r.data - if (parsed) { - const newParsed = { ...pageParsed.value } - newParsed[page.url] = parsed - pageParsed.value = newParsed - } - ElMessage.success('已重新解析') - } catch { ElMessage.error('解析失败') } - finally { reparsingUrls.delete(page.url) } -} - -const viewRaw = async (page) => { - rawUrl.value = page.url - rawVisible.value = true - rawLoading.value = true - rawContent.value = '' - try { - const r = await api.accessResults.get(page.accessResultId) - rawContent.value = r.data?.content || '(空)' - } catch { rawContent.value = '加载失败' } - finally { rawLoading.value = false } -} - -const deleteResult = async (page) => { - try { - await api.accessResults.delete(page.accessResultId) - ElMessage.success('已删除') - refresh() - } catch { ElMessage.error('删除失败') } -} - -const statusTag = (code) => { - if (code>=200&&code<300) return 'success' - if (code>=300&&code<400) return 'warning' - return 'danger' -} +const statusTag = (c) => c>=200&&c<300?'success':c>=300&&c<400?'warning':'danger' onMounted(async () => { await refresh() await loadConfigs() if (selectedConfigId.value) { - const cfg = allConfigVersions.value.find(v => v.id===selectedConfigId.value) - if (cfg) selectedConfig.value = cfg + selectedConfig.value = allConfigVersions.value.find(v=>v.id===selectedConfigId.value) } })