增加反链计算按钮
This commit is contained in:
+14
@@ -61,3 +61,17 @@ export async function setWorkers(n) {
|
|||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function fetchBacklink() {
|
||||||
|
const { data } = await axios.get(`${BASE}/admin/backlink`, {
|
||||||
|
timeout: 10000,
|
||||||
|
})
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function triggerBacklink() {
|
||||||
|
const { data } = await axios.post(`${BASE}/admin/backlink`, null, {
|
||||||
|
timeout: 10000,
|
||||||
|
})
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+83
-2
@@ -1,6 +1,6 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onMounted, onUnmounted } from 'vue'
|
import { ref, onMounted, onUnmounted } from 'vue'
|
||||||
import { fetchStats, flushIndex, fetchWorkers, setWorkers } from '../api.js'
|
import { fetchStats, flushIndex, fetchWorkers, setWorkers, fetchBacklink, triggerBacklink } from '../api.js'
|
||||||
|
|
||||||
const stats = ref(null)
|
const stats = ref(null)
|
||||||
const loading = ref(true)
|
const loading = ref(true)
|
||||||
@@ -14,11 +14,16 @@ const activeWorkers = ref(0) // 实际运行中的 goroutine 数
|
|||||||
const workersInput = ref(0)
|
const workersInput = ref(0)
|
||||||
const workersSaving = ref(false)
|
const workersSaving = ref(false)
|
||||||
|
|
||||||
|
// Backlink 相关状态
|
||||||
|
const backlinkStatus = ref(null) // { running, next_run, last_run?, last_error? }
|
||||||
|
const backlinkTriggering = ref(false)
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await Promise.all([loadStats(), loadWorkers()])
|
await Promise.all([loadStats(), loadWorkers(), loadBacklink()])
|
||||||
refreshInterval = setInterval(() => {
|
refreshInterval = setInterval(() => {
|
||||||
loadStats()
|
loadStats()
|
||||||
loadWorkers()
|
loadWorkers()
|
||||||
|
loadBacklink()
|
||||||
}, 5000)
|
}, 5000)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -69,6 +74,51 @@ async function saveWorkers() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function loadBacklink() {
|
||||||
|
try {
|
||||||
|
backlinkStatus.value = await fetchBacklink()
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Failed to load backlink status:', e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function doTriggerBacklink() {
|
||||||
|
backlinkTriggering.value = true
|
||||||
|
try {
|
||||||
|
await triggerBacklink()
|
||||||
|
// 立即刷新状态,显示 running=true
|
||||||
|
backlinkStatus.value = await fetchBacklink()
|
||||||
|
error.value = null
|
||||||
|
} catch (e) {
|
||||||
|
error.value = '触发反链计算失败: ' + e.message
|
||||||
|
} finally {
|
||||||
|
backlinkTriggering.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatBacklinkTime(isoStr) {
|
||||||
|
if (!isoStr) return '--'
|
||||||
|
const d = new Date(isoStr)
|
||||||
|
const now = new Date()
|
||||||
|
const diffMs = d - now
|
||||||
|
const diffMin = Math.floor(diffMs / 60000)
|
||||||
|
const diffH = Math.floor(diffMin / 60)
|
||||||
|
const diffD = Math.floor(diffH / 24)
|
||||||
|
const time = d.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })
|
||||||
|
const date = d.toLocaleDateString('zh-CN', { month: 'short', day: 'numeric' })
|
||||||
|
|
||||||
|
if (diffD > 0) return `${date} ${time} (${diffD}天后)`
|
||||||
|
if (diffH > 0) return `${date} ${time} (${diffH}小时后)`
|
||||||
|
if (diffMin > 0) return `${time} (${diffMin}分钟后)`
|
||||||
|
return `${time} (即将执行)`
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatBacklinkLastRun(isoStr) {
|
||||||
|
if (!isoStr) return '从未执行'
|
||||||
|
const d = new Date(isoStr)
|
||||||
|
return d.toLocaleString('zh-CN', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })
|
||||||
|
}
|
||||||
|
|
||||||
async function doFlush() {
|
async function doFlush() {
|
||||||
flushing.value = true
|
flushing.value = true
|
||||||
try {
|
try {
|
||||||
@@ -189,6 +239,37 @@ function langColor(lang) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Backlink Control -->
|
||||||
|
<div v-if="backlinkStatus" class="bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5 mb-6 md:mb-8">
|
||||||
|
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-4">
|
||||||
|
<div class="flex-1">
|
||||||
|
<h2 class="text-sm font-semibold text-gray-300 uppercase tracking-wider mb-3">反链计算(PageRank)</h2>
|
||||||
|
<div class="grid grid-cols-1 sm:grid-cols-2 gap-3">
|
||||||
|
<div>
|
||||||
|
<div class="text-xs text-gray-500 mb-0.5">下次自动执行</div>
|
||||||
|
<div class="text-lg font-bold" :class="backlinkStatus.running ? 'text-yellow-400' : 'text-white'">
|
||||||
|
{{ backlinkStatus.running ? '计算中...' : formatBacklinkTime(backlinkStatus.next_run) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div class="text-xs text-gray-500 mb-0.5">上次完成</div>
|
||||||
|
<div class="text-lg font-bold text-white">{{ formatBacklinkLastRun(backlinkStatus.last_run) }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="backlinkStatus.last_error" class="mt-2 text-xs text-red-400 truncate" :title="backlinkStatus.last_error">
|
||||||
|
上次错误:{{ backlinkStatus.last_error }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
class="h-9 px-4 bg-blue-700 hover:bg-blue-600 disabled:bg-gray-700 disabled:text-gray-500 text-white text-sm font-medium rounded-lg transition-colors cursor-pointer whitespace-nowrap"
|
||||||
|
:disabled="backlinkTriggering || backlinkStatus.running"
|
||||||
|
@click="doTriggerBacklink"
|
||||||
|
>
|
||||||
|
{{ backlinkTriggering ? '已触发...' : backlinkStatus.running ? '计算中...' : '立即执行' }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-5">
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-5">
|
||||||
<!-- Domain Distribution -->
|
<!-- Domain Distribution -->
|
||||||
<div class="bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5">
|
<div class="bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5">
|
||||||
|
|||||||
Reference in New Issue
Block a user