From 5b8b256b358b364d90024a08f028c457d1953cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=87=E5=B3=B0?= Date: Fri, 10 Apr 2026 13:14:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=85=88=E7=88=AC=E5=8F=96=E7=9A=84?= =?UTF-8?q?=E9=98=9F=E5=88=97=E7=AB=8B=E5=8D=B3=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crawler/crawler.go | 106 ++++++++++++++++++ dist/assets/index-B024bVSr.css | 2 - .../{index-BtgFYOR8.js => index-ClaCiNQl.js} | 2 +- dist/assets/index-Dr22_wUg.css | 2 + dist/index.html | 4 +- main.go | 1 + search/server.go | 37 ++++++ sese-engine-ui | 2 +- 8 files changed, 150 insertions(+), 6 deletions(-) delete mode 100644 dist/assets/index-B024bVSr.css rename dist/assets/{index-BtgFYOR8.js => index-ClaCiNQl.js} (84%) create mode 100644 dist/assets/index-Dr22_wUg.css diff --git a/crawler/crawler.go b/crawler/crawler.go index f30312a..8d8e136 100644 --- a/crawler/crawler.go +++ b/crawler/crawler.go @@ -43,6 +43,12 @@ const ( circuitCooldownSeconds = 30 // 熔断持续时间(秒) ) +// Priority Worker 配置 +const ( + priorityMaxWorkers = 50 // Priority 独立 goroutine 上限(突破主 workers) + priorityQueueSize = 100 // Priority 任务队列缓冲大小 +) + // Crawler 编排整个 BFS 爬取流程。 type Crawler struct { fetcher *Fetcher // HTTP 抓取器(含 robots.txt 和限流) @@ -62,6 +68,16 @@ type Crawler struct { // 运行时活跃线程计数(atomic,每轮 epoch 自动归零前重新开始计数) activeWorkers int64 + + // ---- Priority Worker(独立 goroutine,不受主 workers 限制)---- + priorityCh chan string // Priority URL 任务队列 + prioritySem chan struct{} // Priority 信号量(上限 priorityMaxWorkers) + priorityWg sync.WaitGroup // 等待所有 Priority goroutine 结束 + priorityMu sync.RWMutex // 保护 priorityStats + priorityStats struct { + pending int64 // 待处理的 Priority URL 数量(入队但未开始) + active int64 // 正在处理的 Priority URL 数量 + } } // 全局活跃线程计数器(跨包可读,无需持有 Crawler 引用) @@ -78,6 +94,21 @@ func GlobalActiveWorkers() int64 { return atomic.LoadInt64(&globalActiveWorkers) } +// 全局 Priority Status 快照(跨 Crawler 实例共享,用于外部监控) +var globalPriorityStatus struct { + pending int64 + active int64 +} + +// GlobalPriorityStatus 返回当前全局 Priority Worker 状态。 +func GlobalPriorityStatus() map[string]interface{} { + return map[string]interface{}{ + "pending": atomic.LoadInt64(&globalPriorityStatus.pending), + "active": atomic.LoadInt64(&globalPriorityStatus.active), + "max_workers": priorityMaxWorkers, + } +} + // New 创建一个 Crawler 实例。 // prosperMap 由 info 模块加载,传入域名繁荣值用于调度优先级计算。 func New(db *storage.DB, a *analyzer.Analyzer, prosperMap map[string]float64) *Crawler { @@ -87,7 +118,11 @@ func New(db *storage.DB, a *analyzer.Analyzer, prosperMap map[string]float64) *C analyzer: a, prosperMap: prosperMap, visited: make(map[string]bool), + priorityCh: make(chan string, priorityQueueSize), + prioritySem: make(chan struct{}, priorityMaxWorkers), } + // 启动 Priority Worker(独立 goroutine,不受主 workers 限制) + go c.runPriorityWorker() // 启动时从 gate bucket 预热已爬取的 URL 集合(程序重启后不会重复爬取) c.warmVisited() return c @@ -155,6 +190,77 @@ func (c *Crawler) markVisited(url string) { c.visitedMu.Unlock() } +// ---- Priority Worker(突破 workers 上限,立即爬取高优先级 URL)---- + +// runPriorityWorker 独立处理高优先级 URL,不受主 workers 限制。 +// 当用户插入 Priority URL 时,立即触发爬取(不等待 epoch 调度)。 +func (c *Crawler) runPriorityWorker() { + for url := range c.priorityCh { + c.prioritySem <- struct{}{} // 获取令牌(阻塞直到有空闲槽位) + c.priorityMu.Lock() + c.priorityStats.active++ + c.priorityStats.pending-- + c.priorityMu.Unlock() + atomic.AddInt64(&globalPriorityStatus.pending, -1) + atomic.AddInt64(&globalPriorityStatus.active, 1) + + c.priorityWg.Add(1) + go func(rawURL string) { + defer c.priorityWg.Done() + defer func() { <-c.prioritySem }() // 释放令牌 + defer func() { + c.priorityMu.Lock() + c.priorityStats.active-- + c.priorityMu.Unlock() + atomic.AddInt64(&globalPriorityStatus.active, -1) + }() + + // 关键:强制移除 visited 标记(即使未过期也要重新爬取) + c.visitedMu.Lock() + delete(c.visited, rawURL) + c.visitedMu.Unlock() + + log.Printf("[crawler] priority crawl started: %s", rawURL) + + // 直接调用 visitURL,绕过队列调度 + hrefs := c.visitURL(rawURL) + + // 收集的子链接正常进入 BFS 队列(由调用方处理,这里只负责爬取本身) + log.Printf("[crawler] priority crawl done: %s (%d child links)", rawURL, len(hrefs)) + + // 清理已访问的 priority URL(防止重复爬取) + _ = c.db.RemovePriorityURL(rawURL) + }(url) + } +} + +// TriggerPriorityCrawl 立即触发高优先级爬取(突破 workers 上限)。 +// 适合用户手动插入 URL 时立即响应。 +func (c *Crawler) TriggerPriorityCrawl(url string) { + select { + case c.priorityCh <- url: + c.priorityMu.Lock() + c.priorityStats.pending++ + c.priorityMu.Unlock() + atomic.AddInt64(&globalPriorityStatus.pending, 1) + log.Printf("[crawler] priority crawl triggered: %s", url) + default: + // 队列满了,降级到正常处理 + log.Printf("[crawler] priority queue full, deferring to normal: %s", url) + } +} + +// GetPriorityStatus 返回 Priority Worker 的实时状态。 +func (c *Crawler) GetPriorityStatus() map[string]interface{} { + c.priorityMu.RLock() + defer c.priorityMu.RUnlock() + return map[string]interface{}{ + "pending": c.priorityStats.pending, + "active": c.priorityStats.active, + "max_workers": priorityMaxWorkers, + } +} + // isVisited 检查 URL 是否已访问(线程安全)。 func (c *Crawler) isVisited(url string) bool { c.visitedMu.RLock() diff --git a/dist/assets/index-B024bVSr.css b/dist/assets/index-B024bVSr.css deleted file mode 100644 index 4b15321..0000000 --- a/dist/assets/index-B024bVSr.css +++ /dev/null @@ -1,2 +0,0 @@ -/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-400:oklch(75% .183 55.934);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-900:oklch(39.3% .095 152.535);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-900:oklch(38.1% .176 304.987);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-900:oklch(40.8% .153 2.432);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.top-1\/2{top:50%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.left-3{left:calc(var(--spacing) * 3)}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-0{margin-left:calc(var(--spacing) * 0)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-9{height:calc(var(--spacing) * 9)}.h-16{height:calc(var(--spacing) * 16)}.h-48{height:calc(var(--spacing) * 48)}.h-full{height:100%}.h-screen{height:100vh}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.\[appearance\:textfield\]{appearance:textfield}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-800>:not(:last-child)){border-color:var(--color-gray-800)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-400{border-color:var(--color-blue-400)}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-800\/50{border-color:#1e293980}@supports (color:color-mix(in lab, red, red)){.border-gray-800\/50{border-color:color-mix(in oklab, var(--color-gray-800) 50%, transparent)}}.border-red-800{border-color:var(--color-red-800)}.border-t-transparent{border-top-color:#0000}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-blue-900{background-color:var(--color-blue-900)}.bg-blue-900\/60{background-color:#1c398e99}@supports (color:color-mix(in lab, red, red)){.bg-blue-900\/60{background-color:color-mix(in oklab, var(--color-blue-900) 60%, transparent)}}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab, red, red)){.bg-gray-900\/50{background-color:color-mix(in oklab, var(--color-gray-900) 50%, transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-green-900\/60{background-color:#0d542b99}@supports (color:color-mix(in lab, red, red)){.bg-green-900\/60{background-color:color-mix(in oklab, var(--color-green-900) 60%, transparent)}}.bg-pink-900\/60{background-color:#86104399}@supports (color:color-mix(in lab, red, red)){.bg-pink-900\/60{background-color:color-mix(in oklab, var(--color-pink-900) 60%, transparent)}}.bg-purple-900{background-color:var(--color-purple-900)}.bg-purple-900\/60{background-color:#59168b99}@supports (color:color-mix(in lab, red, red)){.bg-purple-900\/60{background-color:color-mix(in oklab, var(--color-purple-900) 60%, transparent)}}.bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab, red, red)){.bg-red-900\/30{background-color:color-mix(in oklab, var(--color-red-900) 30%, transparent)}}.bg-red-900\/60{background-color:#82181a99}@supports (color:color-mix(in lab, red, red)){.bg-red-900\/60{background-color:color-mix(in oklab, var(--color-red-900) 60%, transparent)}}.bg-yellow-900\/60{background-color:#733e0a99}@supports (color:color-mix(in lab, red, red)){.bg-yellow-900\/60{background-color:color-mix(in oklab, var(--color-yellow-900) 60%, transparent)}}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-20{padding-right:calc(var(--spacing) * 20)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-orange-400{color:var(--color-orange-400)}.text-pink-300{color:var(--color-pink-300)}.text-purple-300{color:var(--color-purple-300)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-white{color:var(--color-white)}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.placeholder-gray-600::placeholder{color:var(--color-gray-600)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-500{--tw-duration:.5s;transition-duration:.5s}@media (hover:hover){.group-hover\:text-blue-300:is(:where(.group):hover *){color:var(--color-blue-300)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-gray-800\/40:hover{background-color:#1e293966}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-800\/40:hover{background-color:color-mix(in oklab, var(--color-gray-800) 40%, transparent)}}.hover\:bg-gray-800\/50:hover{background-color:#1e293980}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab, var(--color-gray-800) 50%, transparent)}}.hover\:bg-gray-900:hover{background-color:var(--color-gray-900)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-white:hover{color:var(--color-white)}.hover\:opacity-80:hover{opacity:.8}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:bg-gray-700:disabled{background-color:var(--color-gray-700)}.disabled\:text-gray-500:disabled{color:var(--color-gray-500)}@media (width>=40rem){.sm\:ml-auto{margin-left:auto}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-4{gap:calc(var(--spacing) * 4)}}@media (width>=48rem){.md\:right-3{right:calc(var(--spacing) * 3)}.md\:mb-3{margin-bottom:calc(var(--spacing) * 3)}.md\:mb-4{margin-bottom:calc(var(--spacing) * 4)}.md\:mb-5{margin-bottom:calc(var(--spacing) * 5)}.md\:mb-6{margin-bottom:calc(var(--spacing) * 6)}.md\:mb-8{margin-bottom:calc(var(--spacing) * 8)}.md\:ml-auto{margin-left:auto}.md\:flex{display:flex}.md\:hidden{display:none}.md\:table{display:table}.md\:h-5{height:calc(var(--spacing) * 5)}.md\:w-10{width:calc(var(--spacing) * 10)}.md\:w-14{width:calc(var(--spacing) * 14)}.md\:w-16{width:calc(var(--spacing) * 16)}.md\:w-36{width:calc(var(--spacing) * 36)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-5{gap:calc(var(--spacing) * 5)}:where(.md\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}.md\:rounded-2xl{border-radius:var(--radius-2xl)}.md\:rounded-xl{border-radius:var(--radius-xl)}.md\:p-5{padding:calc(var(--spacing) * 5)}.md\:p-6{padding:calc(var(--spacing) * 6)}.md\:p-8{padding:calc(var(--spacing) * 8)}.md\:px-4{padding-inline:calc(var(--spacing) * 4)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:px-8{padding-inline:calc(var(--spacing) * 8)}.md\:py-2{padding-block:calc(var(--spacing) * 2)}.md\:py-4{padding-block:calc(var(--spacing) * 4)}.md\:py-6{padding-block:calc(var(--spacing) * 6)}.md\:pr-14{padding-right:calc(var(--spacing) * 14)}.md\:pb-0{padding-bottom:calc(var(--spacing) * 0)}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/dist/assets/index-BtgFYOR8.js b/dist/assets/index-ClaCiNQl.js similarity index 84% rename from dist/assets/index-BtgFYOR8.js rename to dist/assets/index-ClaCiNQl.js index f381345..6eb4bf5 100644 --- a/dist/assets/index-BtgFYOR8.js +++ b/dist/assets/index-ClaCiNQl.js @@ -3,4 +3,4 @@ var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],en `)}getSetCookie(){return this.get(`set-cookie`)||[]}get[Symbol.toStringTag](){return`AxiosHeaders`}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){let n=new this(e);return t.forEach(e=>n.set(e)),n}static accessor(e){let t=(this[rc]=this[rc]={accessors:{}}).accessors,n=this.prototype;function r(e){let r=ic(e);t[r]||(uc(n,e),t[r]=!0)}return Y.isArray(e)?e.forEach(r):r(e),this}};Q.accessor([`Content-Type`,`Content-Length`,`Accept`,`Accept-Encoding`,`User-Agent`,`Authorization`]),Y.reduceDescriptors(Q.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}}),Y.freezeMethods(Q);function dc(e,t){let n=this||ec,r=t||n,i=Q.from(r.headers),a=r.data;return Y.forEach(e,function(e){a=e.call(n,a,i.normalize(),t?t.status:void 0)}),i.normalize(),a}function fc(e){return!!(e&&e.__CANCEL__)}var pc=class extends X{constructor(e,t,n){super(e??`canceled`,X.ERR_CANCELED,t,n),this.name=`CanceledError`,this.__CANCEL__=!0}};function mc(e,t,n){let r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new X(`Request failed with status code `+n.status,[X.ERR_BAD_REQUEST,X.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function hc(e){let t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||``}function gc(e,t){e||=10;let n=Array(e),r=Array(e),i=0,a=0,o;return t=t===void 0?1e3:t,function(s){let c=Date.now(),l=r[a];o||=c,n[i]=s,r[i]=c;let u=a,d=0;for(;u!==i;)d+=n[u++],u%=e;if(i=(i+1)%e,i===a&&(a=(a+1)%e),c-o{n=r,i=null,a&&=(clearTimeout(a),null),e(...t)};return[(...e)=>{let t=Date.now(),s=t-n;s>=r?o(e,t):(i=e,a||=setTimeout(()=>{a=null,o(i)},r-s))},()=>i&&o(i)]}var vc=(e,t,n=3)=>{let r=0,i=gc(50,250);return _c(n=>{let a=n.loaded,o=n.lengthComputable?n.total:void 0,s=a-r,c=i(s),l=a<=o;r=a,e({loaded:a,total:o,progress:o?a/o:void 0,bytes:s,rate:c||void 0,estimated:c&&o&&l?(o-a)/c:void 0,event:n,lengthComputable:o!=null,[t?`download`:`upload`]:!0})},n)},yc=(e,t)=>{let n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},bc=e=>(...t)=>Y.asap(()=>e(...t)),xc=Z.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,Z.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(Z.origin),Z.navigator&&/(msie|trident)/i.test(Z.navigator.userAgent)):()=>!0,Sc=Z.hasStandardBrowserEnv?{write(e,t,n,r,i,a,o){if(typeof document>`u`)return;let s=[`${e}=${encodeURIComponent(t)}`];Y.isNumber(n)&&s.push(`expires=${new Date(n).toUTCString()}`),Y.isString(r)&&s.push(`path=${r}`),Y.isString(i)&&s.push(`domain=${i}`),a===!0&&s.push(`secure`),Y.isString(o)&&s.push(`SameSite=${o}`),document.cookie=s.join(`; `)},read(e){if(typeof document>`u`)return null;let t=document.cookie.match(RegExp(`(?:^|; )`+e+`=([^;]*)`));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,``,Date.now()-864e5,`/`)}}:{write(){},read(){return null},remove(){}};function Cc(e){return typeof e==`string`?/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e):!1}function wc(e,t){return t?e.replace(/\/?\/$/,``)+`/`+t.replace(/^\/+/,``):e}function Tc(e,t,n){let r=!Cc(t);return e&&(r||n==0)?wc(e,t):t}var Ec=e=>e instanceof Q?{...e}:e;function Dc(e,t){t||={};let n={};function r(e,t,n,r){return Y.isPlainObject(e)&&Y.isPlainObject(t)?Y.merge.call({caseless:r},e,t):Y.isPlainObject(t)?Y.merge({},t):Y.isArray(t)?t.slice():t}function i(e,t,n,i){if(!Y.isUndefined(t))return r(e,t,n,i);if(!Y.isUndefined(e))return r(void 0,e,n,i)}function a(e,t){if(!Y.isUndefined(t))return r(void 0,t)}function o(e,t){if(!Y.isUndefined(t))return r(void 0,t);if(!Y.isUndefined(e))return r(void 0,e)}function s(n,i,a){if(a in t)return r(n,i);if(a in e)return r(void 0,n)}let c={url:a,method:a,data:a,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:s,headers:(e,t,n)=>i(Ec(e),Ec(t),n,!0)};return Y.forEach(Object.keys({...e,...t}),function(r){if(r===`__proto__`||r===`constructor`||r===`prototype`)return;let a=Y.hasOwnProp(c,r)?c[r]:i,o=a(e[r],t[r],r);Y.isUndefined(o)&&a!==s||(n[r]=o)}),n}var Oc=e=>{let t=Dc({},e),{data:n,withXSRFToken:r,xsrfHeaderName:i,xsrfCookieName:a,headers:o,auth:s}=t;if(t.headers=o=Q.from(o),t.url=zs(Tc(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),s&&o.set(`Authorization`,`Basic `+btoa((s.username||``)+`:`+(s.password?unescape(encodeURIComponent(s.password)):``))),Y.isFormData(n)){if(Z.hasStandardBrowserEnv||Z.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if(Y.isFunction(n.getHeaders)){let e=n.getHeaders(),t=[`content-type`,`content-length`];Object.entries(e).forEach(([e,n])=>{t.includes(e.toLowerCase())&&o.set(e,n)})}}if(Z.hasStandardBrowserEnv&&(r&&Y.isFunction(r)&&(r=r(t)),r||r!==!1&&xc(t.url))){let e=i&&a&&Sc.read(a);e&&o.set(i,e)}return t},kc=typeof XMLHttpRequest<`u`&&function(e){return new Promise(function(t,n){let r=Oc(e),i=r.data,a=Q.from(r.headers).normalize(),{responseType:o,onUploadProgress:s,onDownloadProgress:c}=r,l,u,d,f,p;function m(){f&&f(),p&&p(),r.cancelToken&&r.cancelToken.unsubscribe(l),r.signal&&r.signal.removeEventListener(`abort`,l)}let h=new XMLHttpRequest;h.open(r.method.toUpperCase(),r.url,!0),h.timeout=r.timeout;function g(){if(!h)return;let r=Q.from(`getAllResponseHeaders`in h&&h.getAllResponseHeaders());mc(function(e){t(e),m()},function(e){n(e),m()},{data:!o||o===`text`||o===`json`?h.responseText:h.response,status:h.status,statusText:h.statusText,headers:r,config:e,request:h}),h=null}`onloadend`in h?h.onloadend=g:h.onreadystatechange=function(){!h||h.readyState!==4||h.status===0&&!(h.responseURL&&h.responseURL.indexOf(`file:`)===0)||setTimeout(g)},h.onabort=function(){h&&=(n(new X(`Request aborted`,X.ECONNABORTED,e,h)),null)},h.onerror=function(t){let r=new X(t&&t.message?t.message:`Network Error`,X.ERR_NETWORK,e,h);r.event=t||null,n(r),h=null},h.ontimeout=function(){let t=r.timeout?`timeout of `+r.timeout+`ms exceeded`:`timeout exceeded`,i=r.transitional||Vs;r.timeoutErrorMessage&&(t=r.timeoutErrorMessage),n(new X(t,i.clarifyTimeoutError?X.ETIMEDOUT:X.ECONNABORTED,e,h)),h=null},i===void 0&&a.setContentType(null),`setRequestHeader`in h&&Y.forEach(a.toJSON(),function(e,t){h.setRequestHeader(t,e)}),Y.isUndefined(r.withCredentials)||(h.withCredentials=!!r.withCredentials),o&&o!==`json`&&(h.responseType=r.responseType),c&&([d,p]=vc(c,!0),h.addEventListener(`progress`,d)),s&&h.upload&&([u,f]=vc(s),h.upload.addEventListener(`progress`,u),h.upload.addEventListener(`loadend`,f)),(r.cancelToken||r.signal)&&(l=t=>{h&&=(n(!t||t.type?new pc(null,e,h):t),h.abort(),null)},r.cancelToken&&r.cancelToken.subscribe(l),r.signal&&(r.signal.aborted?l():r.signal.addEventListener(`abort`,l)));let _=hc(r.url);if(_&&Z.protocols.indexOf(_)===-1){n(new X(`Unsupported protocol `+_+`:`,X.ERR_BAD_REQUEST,e));return}h.send(i||null)})},Ac=(e,t)=>{let{length:n}=e=e?e.filter(Boolean):[];if(t||n){let n=new AbortController,r,i=function(e){if(!r){r=!0,o();let t=e instanceof Error?e:this.reason;n.abort(t instanceof X?t:new pc(t instanceof Error?t.message:t))}},a=t&&setTimeout(()=>{a=null,i(new X(`timeout of ${t}ms exceeded`,X.ETIMEDOUT))},t),o=()=>{e&&=(a&&clearTimeout(a),a=null,e.forEach(e=>{e.unsubscribe?e.unsubscribe(i):e.removeEventListener(`abort`,i)}),null)};e.forEach(e=>e.addEventListener(`abort`,i));let{signal:s}=n;return s.unsubscribe=()=>Y.asap(o),s}},jc=function*(e,t){let n=e.byteLength;if(!t||n{let i=Mc(e,t),a=0,o,s=e=>{o||(o=!0,r&&r(e))};return new ReadableStream({async pull(e){try{let{done:t,value:r}=await i.next();if(t){s(),e.close();return}let o=r.byteLength;n&&n(a+=o),e.enqueue(new Uint8Array(r))}catch(e){throw s(e),e}},cancel(e){return s(e),i.return()}},{highWaterMark:2})},Fc=64*1024,{isFunction:Ic}=Y,Lc=(({Request:e,Response:t})=>({Request:e,Response:t}))(Y.global),{ReadableStream:Rc,TextEncoder:zc}=Y.global,Bc=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Vc=e=>{e=Y.merge.call({skipUndefined:!0},Lc,e);let{fetch:t,Request:n,Response:r}=e,i=t?Ic(t):typeof fetch==`function`,a=Ic(n),o=Ic(r);if(!i)return!1;let s=i&&Ic(Rc),c=i&&(typeof zc==`function`?(e=>t=>e.encode(t))(new zc):async e=>new Uint8Array(await new n(e).arrayBuffer())),l=a&&s&&Bc(()=>{let e=!1,t=new Rc,r=new n(Z.origin,{body:t,method:`POST`,get duplex(){return e=!0,`half`}}).headers.has(`Content-Type`);return t.cancel(),e&&!r}),u=o&&s&&Bc(()=>Y.isReadableStream(new r(``).body)),d={stream:u&&(e=>e.body)};i&&[`text`,`arrayBuffer`,`blob`,`formData`,`stream`].forEach(e=>{!d[e]&&(d[e]=(t,n)=>{let r=t&&t[e];if(r)return r.call(t);throw new X(`Response type '${e}' is not supported`,X.ERR_NOT_SUPPORT,n)})});let f=async e=>{if(e==null)return 0;if(Y.isBlob(e))return e.size;if(Y.isSpecCompliantForm(e))return(await new n(Z.origin,{method:`POST`,body:e}).arrayBuffer()).byteLength;if(Y.isArrayBufferView(e)||Y.isArrayBuffer(e))return e.byteLength;if(Y.isURLSearchParams(e)&&(e+=``),Y.isString(e))return(await c(e)).byteLength},p=async(e,t)=>Y.toFiniteNumber(e.getContentLength())??f(t);return async e=>{let{url:i,method:o,data:s,signal:c,cancelToken:f,timeout:m,onDownloadProgress:h,onUploadProgress:g,responseType:_,headers:v,withCredentials:y=`same-origin`,fetchOptions:b}=Oc(e),x=t||fetch;_=_?(_+``).toLowerCase():`text`;let S=Ac([c,f&&f.toAbortSignal()],m),C=null,w=S&&S.unsubscribe&&(()=>{S.unsubscribe()}),ee;try{if(g&&l&&o!==`get`&&o!==`head`&&(ee=await p(v,s))!==0){let e=new n(i,{method:`POST`,body:s,duplex:`half`}),t;if(Y.isFormData(s)&&(t=e.headers.get(`content-type`))&&v.setContentType(t),e.body){let[t,n]=yc(ee,vc(bc(g)));s=Pc(e.body,Fc,t,n)}}Y.isString(y)||(y=y?`include`:`omit`);let t=a&&`credentials`in n.prototype,c={...b,signal:S,method:o.toUpperCase(),headers:v.normalize().toJSON(),body:s,duplex:`half`,credentials:t?y:void 0};C=a&&new n(i,c);let f=await(a?x(C,b):x(i,c)),m=u&&(_===`stream`||_===`response`);if(u&&(h||m&&w)){let e={};[`status`,`statusText`,`headers`].forEach(t=>{e[t]=f[t]});let t=Y.toFiniteNumber(f.headers.get(`content-length`)),[n,i]=h&&yc(t,vc(bc(h),!0))||[];f=new r(Pc(f.body,Fc,n,()=>{i&&i(),w&&w()}),e)}_||=`text`;let te=await d[Y.findKey(d,_)||`text`](f,e);return!m&&w&&w(),await new Promise((t,n)=>{mc(t,n,{data:te,headers:Q.from(f.headers),status:f.status,statusText:f.statusText,config:e,request:C})})}catch(t){throw w&&w(),t&&t.name===`TypeError`&&/Load failed|fetch/i.test(t.message)?Object.assign(new X(`Network Error`,X.ERR_NETWORK,e,C,t&&t.response),{cause:t.cause||t}):X.from(t,t&&t.code,e,C,t&&t.response)}}},Hc=new Map,Uc=e=>{let t=e&&e.env||{},{fetch:n,Request:r,Response:i}=t,a=[r,i,n],o=a.length,s,c,l=Hc;for(;o--;)s=a[o],c=l.get(s),c===void 0&&l.set(s,c=o?new Map:Vc(t)),l=c;return c};Uc();var Wc={http:null,xhr:kc,fetch:{get:Uc}};Y.forEach(Wc,(e,t)=>{if(e){try{Object.defineProperty(e,`name`,{value:t})}catch{}Object.defineProperty(e,`adapterName`,{value:t})}});var Gc=e=>`- ${e}`,Kc=e=>Y.isFunction(e)||e===null||e===!1;function qc(e,t){e=Y.isArray(e)?e:[e];let{length:n}=e,r,i,a={};for(let o=0;o`adapter ${e} `+(t===!1?`is not supported by the environment`:`is not available in the build`));throw new X(`There is no suitable adapter to dispatch the request `+(n?e.length>1?`since : `+e.map(Gc).join(` `):` `+Gc(e[0]):`as no adapter specified`),`ERR_NOT_SUPPORT`)}return i}var Jc={getAdapter:qc,adapters:Wc};function Yc(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new pc(null,e)}function Xc(e){return Yc(e),e.headers=Q.from(e.headers),e.data=dc.call(e,e.transformRequest),[`post`,`put`,`patch`].indexOf(e.method)!==-1&&e.headers.setContentType(`application/x-www-form-urlencoded`,!1),Jc.getAdapter(e.adapter||ec.adapter,e)(e).then(function(t){return Yc(e),t.data=dc.call(e,e.transformResponse,t),t.headers=Q.from(t.headers),t},function(t){return fc(t)||(Yc(e),t&&t.response&&(t.response.data=dc.call(e,e.transformResponse,t.response),t.response.headers=Q.from(t.response.headers))),Promise.reject(t)})}var Zc=`1.14.0`,Qc={};[`object`,`boolean`,`number`,`function`,`string`,`symbol`].forEach((e,t)=>{Qc[e]=function(n){return typeof n===e||`a`+(t<1?`n `:` `)+e}});var $c={};Qc.transitional=function(e,t,n){function r(e,t){return`[Axios v`+Zc+`] Transitional option '`+e+`'`+t+(n?`. `+n:``)}return(n,i,a)=>{if(e===!1)throw new X(r(i,` has been removed`+(t?` in `+t:``)),X.ERR_DEPRECATED);return t&&!$c[i]&&($c[i]=!0,console.warn(r(i,` has been deprecated since v`+t+` and will be removed in the near future`))),e?e(n,i,a):!0}},Qc.spelling=function(e){return(t,n)=>(console.warn(`${n} is likely a misspelling of ${e}`),!0)};function el(e,t,n){if(typeof e!=`object`)throw new X(`options must be an object`,X.ERR_BAD_OPTION_VALUE);let r=Object.keys(e),i=r.length;for(;i-- >0;){let a=r[i],o=t[a];if(o){let t=e[a],n=t===void 0||o(t,a,e);if(n!==!0)throw new X(`option `+a+` must be `+n,X.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new X(`Unknown option `+a,X.ERR_BAD_OPTION)}}var tl={assertOptions:el,validators:Qc},nl=tl.validators,rl=class{constructor(e){this.defaults=e||{},this.interceptors={request:new Bs,response:new Bs}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=Error();let n=t.stack?t.stack.replace(/^.+\n/,``):``;try{e.stack?n&&!String(e.stack).endsWith(n.replace(/^.+\n.+\n/,``))&&(e.stack+=` -`+n):e.stack=n}catch{}}throw e}}_request(e,t){typeof e==`string`?(t||={},t.url=e):t=e||{},t=Dc(this.defaults,t);let{transitional:n,paramsSerializer:r,headers:i}=t;n!==void 0&&tl.assertOptions(n,{silentJSONParsing:nl.transitional(nl.boolean),forcedJSONParsing:nl.transitional(nl.boolean),clarifyTimeoutError:nl.transitional(nl.boolean),legacyInterceptorReqResOrdering:nl.transitional(nl.boolean)},!1),r!=null&&(Y.isFunction(r)?t.paramsSerializer={serialize:r}:tl.assertOptions(r,{encode:nl.function,serialize:nl.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls===void 0?t.allowAbsoluteUrls=!0:t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls),tl.assertOptions(t,{baseUrl:nl.spelling(`baseURL`),withXsrfToken:nl.spelling(`withXSRFToken`)},!0),t.method=(t.method||this.defaults.method||`get`).toLowerCase();let a=i&&Y.merge(i.common,i[t.method]);i&&Y.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`,`common`],e=>{delete i[e]}),t.headers=Q.concat(a,i);let o=[],s=!0;this.interceptors.request.forEach(function(e){if(typeof e.runWhen==`function`&&e.runWhen(t)===!1)return;s&&=e.synchronous;let n=t.transitional||Vs;n&&n.legacyInterceptorReqResOrdering?o.unshift(e.fulfilled,e.rejected):o.push(e.fulfilled,e.rejected)});let c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,u=0,d;if(!s){let e=[Xc.bind(this),void 0];for(e.unshift(...o),e.push(...c),d=e.length,l=Promise.resolve(t);u{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t,r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,i){n.reason||(n.reason=new pc(e,r,i),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let t;return{token:new e(function(e){t=e}),cancel:t}}};function al(e){return function(t){return e.apply(null,t)}}function ol(e){return Y.isObject(e)&&e.isAxiosError===!0}var sl={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(sl).forEach(([e,t])=>{sl[t]=e});function cl(e){let t=new rl(e),n=yo(rl.prototype.request,t);return Y.extend(n,rl.prototype,t,{allOwnKeys:!0}),Y.extend(n,t,null,{allOwnKeys:!0}),n.create=function(t){return cl(Dc(e,t))},n}var $=cl(ec);$.Axios=rl,$.CanceledError=pc,$.CancelToken=il,$.isCancel=fc,$.VERSION=Zc,$.toFormData=Ps,$.AxiosError=X,$.Cancel=$.CanceledError,$.all=function(e){return Promise.all(e)},$.spread=al,$.isAxiosError=ol,$.mergeConfig=Dc,$.AxiosHeaders=Q,$.formToJSON=e=>Qs(Y.isHTMLForm(e)?new FormData(e):e),$.getAdapter=Jc.getAdapter,$.HttpStatusCode=sl,$.default=$;var ll=``;async function ul(e=50){let{data:t}=await $.get(`${ll}/admin/recent`,{params:{limit:e},timeout:15e3});return t}async function dl(){let{data:e}=await $.get(`${ll}/admin/stats`,{timeout:15e3});return e}async function fl(){let{data:e}=await $.get(`${ll}/admin/priority`,{timeout:15e3});return e}async function pl(e){let{data:t}=await $.post(`${ll}/admin/priority`,{url:e},{timeout:15e3});return t}async function ml(e){let{data:t}=await $.delete(`${ll}/admin/priority`,{params:{url:e},timeout:15e3});return t}async function hl(){let{data:e}=await $.post(`${ll}/admin/flush`,null,{timeout:6e4});return e}async function gl(){let{data:e}=await $.get(`${ll}/admin/workers`,{timeout:1e4});return e}async function _l(e){let{data:t}=await $.post(`${ll}/admin/workers`,{workers:e},{timeout:1e4});return t}async function vl(){let{data:e}=await $.get(`${ll}/admin/backlink`,{timeout:1e4});return e}async function yl(){let{data:e}=await $.post(`${ll}/admin/backlink`,null,{timeout:1e4});return e}var bl={class:`p-4 md:p-8`},xl={key:0,class:`flex items-center justify-center h-48`},Sl={key:1,class:`bg-red-900/30 border border-red-800 rounded-lg p-4 text-red-300`},Cl={class:`grid grid-cols-2 md:grid-cols-5 gap-3 md:gap-5 mb-6 md:mb-8`},wl={class:`bg-gray-900 border border-gray-800 rounded-xl p-5`},Tl={class:`text-3xl font-bold text-white`},El={class:`bg-gray-900 border border-gray-800 rounded-xl p-5`},Dl={class:`text-3xl font-bold text-white`},Ol={class:`bg-gray-900 border border-gray-800 rounded-xl p-5`},kl={class:`text-3xl font-bold text-white`},Al={class:`bg-gray-900 border border-gray-800 rounded-xl p-5`},jl={class:`bg-gray-900 border border-gray-800 rounded-xl p-5 flex flex-col justify-between`},Ml=[`disabled`],Nl={class:`bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5 mb-6 md:mb-8`},Pl={class:`flex flex-col md:flex-row md:items-center md:justify-between gap-4`},Fl={class:`flex items-baseline gap-4`},Il={class:`text-3xl font-bold text-white`},Ll={class:`flex items-center gap-2`},Rl=[`disabled`],zl=[`disabled`],Bl=[`disabled`],Vl={key:0,class:`bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5 mb-6 md:mb-8`},Hl={class:`flex flex-col md:flex-row md:items-center md:justify-between gap-4`},Ul={class:`flex-1`},Wl={class:`grid grid-cols-1 sm:grid-cols-2 gap-3`},Gl={class:`text-lg font-bold text-white`},Kl=[`title`],ql=[`disabled`],Jl={class:`grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-5`},Yl={class:`bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5`},Xl={class:`space-y-2`},Zl=[`title`],Ql={class:`flex-1 bg-gray-800 rounded-full h-4 md:h-5 overflow-hidden`},$l={class:`w-12 md:w-16 text-xs text-gray-500 text-right shrink-0`},eu={class:`bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5`},tu={class:`space-y-2`},nu={class:`w-8 md:w-10 text-xs text-gray-400 shrink-0 font-mono`},ru={class:`flex-1 bg-gray-800 rounded-full h-4 md:h-5 overflow-hidden`},iu={class:`w-12 md:w-16 text-xs text-gray-500 text-right shrink-0`},au={__name:`Dashboard`,setup(e){let t=F(null),n=F(!0),r=F(!1),i=F(null),a=null,o=F(0),s=F(0),c=F(0),l=F(!1),u=F(null),d=F(!1);ir(async()=>{await Promise.all([f(),p(),h()]),a=setInterval(()=>{f(),p(),h()},5e3)}),cr(()=>{a&&clearInterval(a)});async function f(){try{t.value=await dl(),i.value=null}catch(e){i.value=`无法加载统计数据,可能人服务器未启动或端口不对`,console.error(e)}finally{n.value=!1}}async function p(){try{let e=await gl();o.value=e.configured,s.value=e.active,c.value=e.configured}catch(e){console.error(`Failed to load workers:`,e)}}async function m(){let e=parseInt(c.value,10);if(isNaN(e)||e<1||e>500){i.value=`线程数必须在 1~500 之间`;return}l.value=!0;try{await _l(e),o.value=e,i.value=null}catch(e){i.value=`修改线程数失败: `+e.message}finally{l.value=!1}}async function h(){try{u.value=await vl()}catch(e){console.error(`Failed to load backlink status:`,e)}}async function g(){d.value=!0;try{await yl(),u.value=await vl(),i.value=null}catch(e){i.value=`触发反链计算失败: `+e.message}finally{d.value=!1}}function _(e){if(!e)return`--`;let t=new Date(e),n=t-new Date,r=Math.floor(n/6e4),i=Math.floor(r/60),a=Math.floor(i/24),o=t.toLocaleTimeString(`zh-CN`,{hour:`2-digit`,minute:`2-digit`}),s=t.toLocaleDateString(`zh-CN`,{month:`short`,day:`numeric`});return a>0?`${s} ${o} (${a}天后)`:i>0?`${s} ${o} (${i}小时后)`:r>0?`${o} (${r}分钟后)`:`${o} (即将执行)`}function v(e){return e?new Date(e).toLocaleString(`zh-CN`,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}):`从未执行`}async function y(){r.value=!0;try{await hl(),t.value=await dl()}catch(e){i.value=`刷盘失败: `+e.message}finally{r.value=!1}}function b(e){return!e&&e!==0?`0`:Number(e).toLocaleString()}function x(e){return e?Object.entries(e).sort((e,t)=>t[1]-e[1]).slice(0,10):[]}function S(e){let t={zh:`#e53e3e`,en:`#3182ce`,ja:`#e53e3e`,ko:`#3182ce`,fr:`#38a169`,de:`#d69e2e`,es:`#38a169`,ru:`#805ad5`,other:`#718096`};return t[e]||t.other}return(e,a)=>(U(),W(`div`,bl,[a[18]||=G(`h1`,{class:`text-xl md:text-2xl font-semibold text-white mb-6 md:mb-8`},`概览`,-1),n.value?(U(),W(`div`,xl,[...a[3]||=[G(`div`,{class:`text-gray-400 animate-pulse`},`加载中...`,-1)]])):i.value?(U(),W(`div`,Sl,O(i.value),1)):t.value?(U(),W(V,{key:2},[G(`div`,Cl,[G(`div`,wl,[a[4]||=G(`div`,{class:`text-sm text-gray-500 mb-2`},`已爬取 URL`,-1),G(`div`,Tl,O(b(t.value.total_urls)),1)]),G(`div`,El,[a[5]||=G(`div`,{class:`text-sm text-gray-500 mb-2`},`总词数`,-1),G(`div`,Dl,O(b(t.value.total_words)),1)]),G(`div`,Ol,[a[6]||=G(`div`,{class:`text-sm text-gray-500 mb-2`},`域名数量`,-1),G(`div`,kl,O(b(t.value.total_domains)),1)]),G(`div`,Al,[a[7]||=G(`div`,{class:`text-sm text-gray-500 mb-2`},`待重爬`,-1),G(`div`,{class:D([`text-3xl font-bold`,t.value.recrawl_eligible>0?`text-orange-400`:`text-green-400`])},O(b(t.value.recrawl_eligible)),3)]),G(`div`,jl,[G(`div`,null,[a[8]||=G(`div`,{class:`text-sm text-gray-500 mb-2`},`待刷盘`,-1),G(`div`,{class:D([`text-3xl font-bold`,t.value.pending>0?`text-yellow-400`:`text-green-400`])},O(b(t.value.pending)),3)]),G(`button`,{class:`mt-3 w-full bg-blue-700 hover:bg-blue-600 disabled:bg-gray-700 disabled:text-gray-500 text-white text-sm font-medium py-1.5 px-3 rounded transition-colors cursor-pointer`,disabled:r.value||!t.value.pending,onClick:y},O(r.value?`刷盘中...`:`立即刷盘`),9,Ml)])]),G(`div`,Nl,[G(`div`,Pl,[G(`div`,null,[a[12]||=G(`h2`,{class:`text-sm font-semibold text-gray-300 uppercase tracking-wider mb-2`},`爬虫线程数`,-1),G(`div`,Fl,[G(`div`,null,[a[9]||=G(`div`,{class:`text-xs text-gray-500 mb-0.5`},`实际运行`,-1),G(`div`,{class:D([`text-3xl font-bold`,s.value>0?`text-green-400`:`text-gray-500`])},O(s.value),3)]),a[11]||=G(`div`,{class:`text-gray-700 text-xl`},`/`,-1),G(`div`,null,[a[10]||=G(`div`,{class:`text-xs text-gray-500 mb-0.5`},`设定上限`,-1),G(`div`,Il,O(o.value),1)])])]),G(`div`,Ll,[G(`button`,{class:`w-9 h-9 flex items-center justify-center rounded-lg bg-gray-800 hover:bg-gray-700 text-gray-300 hover:text-white text-lg font-bold transition-colors cursor-pointer`,onClick:a[0]||=e=>c.value=Math.max(1,c.value-1),disabled:l.value},`−`,8,Rl),An(G(`input`,{type:`number`,"onUpdate:modelValue":a[1]||=e=>c.value=e,min:`1`,max:`500`,class:`w-20 h-9 text-center bg-gray-800 border border-gray-700 rounded-lg text-white text-sm focus:outline-none focus:border-blue-500 transition-colors [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none`,onKeyup:fo(m,[`enter`])},null,544),[[oo,c.value,void 0,{number:!0}]]),G(`button`,{class:`w-9 h-9 flex items-center justify-center rounded-lg bg-gray-800 hover:bg-gray-700 text-gray-300 hover:text-white text-lg font-bold transition-colors cursor-pointer`,onClick:a[2]||=e=>c.value=Math.min(500,c.value+1),disabled:l.value},`+`,8,zl),G(`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`,disabled:l.value||c.value===o.value,onClick:m},O(l.value?`保存中...`:`应用`),9,Bl)])])]),u.value?(U(),W(`div`,Vl,[G(`div`,Hl,[G(`div`,Ul,[a[15]||=G(`h2`,{class:`text-sm font-semibold text-gray-300 uppercase tracking-wider mb-3`},`反链计算(PageRank)`,-1),G(`div`,Wl,[G(`div`,null,[a[13]||=G(`div`,{class:`text-xs text-gray-500 mb-0.5`},`下次自动执行`,-1),G(`div`,{class:D([`text-lg font-bold`,u.value.running?`text-yellow-400`:`text-white`])},O(u.value.running?`计算中...`:_(u.value.next_run)),3)]),G(`div`,null,[a[14]||=G(`div`,{class:`text-xs text-gray-500 mb-0.5`},`上次完成`,-1),G(`div`,Gl,O(v(u.value.last_run)),1)])]),u.value.last_error?(U(),W(`div`,{key:0,class:`mt-2 text-xs text-red-400 truncate`,title:u.value.last_error},` 上次错误:`+O(u.value.last_error),9,Kl)):K(``,!0)]),G(`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:d.value||u.value.running,onClick:g},O(d.value?`已触发...`:u.value.running?`计算中...`:`立即执行`),9,ql)])])):K(``,!0),G(`div`,Jl,[G(`div`,Yl,[a[16]||=G(`h2`,{class:`text-sm font-semibold text-gray-300 mb-3 md:mb-4 uppercase tracking-wider`},`域名分布 Top 10`,-1),G(`div`,Xl,[(U(!0),W(V,null,R(x(t.value.domains),([e,n])=>(U(),W(`div`,{key:e,class:`flex items-center gap-2 md:gap-3`},[G(`div`,{class:`w-24 md:w-36 text-xs text-gray-400 truncate shrink-0`,title:e},O(e),9,Zl),G(`div`,Ql,[G(`div`,{class:`h-full bg-blue-600 rounded-full transition-all duration-500`,style:me({width:`${n/t.value.domains[Object.keys(t.value.domains)[0]]*100}%`})},null,4)]),G(`div`,$l,O(b(n)),1)]))),128))])]),G(`div`,eu,[a[17]||=G(`h2`,{class:`text-sm font-semibold text-gray-300 mb-3 md:mb-4 uppercase tracking-wider`},`语种分布`,-1),G(`div`,tu,[(U(!0),W(V,null,R(Object.entries(t.value.languages||{}).sort((e,t)=>t[1]-e[1]),([e,n])=>(U(),W(`div`,{key:e,class:`flex items-center gap-2 md:gap-3`},[G(`div`,nu,O(e),1),G(`div`,ru,[G(`div`,{class:`h-full rounded-full transition-all duration-500`,style:me({width:`${n/t.value.total_urls*100}%`,backgroundColor:S(e)})},null,4)]),G(`div`,iu,O(b(n)),1)]))),128))])])])],64)):K(``,!0)]))}},ou={class:`p-4 md:p-8`},su={class:`flex flex-col md:flex-row md:items-center justify-between mb-4 md:mb-6 gap-3`},cu={class:`text-sm text-gray-500`},lu={class:`flex items-center gap-2 md:gap-3`},uu=[`value`],du={class:`flex flex-col sm:flex-row items-stretch sm:items-center gap-3 mb-4 md:mb-5`},fu={class:`relative flex-1 max-w-full sm:max-w-sm`},pu={key:0,class:`flex items-center justify-center h-48`},mu={key:1,class:`bg-red-900/30 border border-red-800 rounded-lg p-4 text-red-300`},hu={key:2,class:`bg-gray-900 border border-gray-800 rounded-xl overflow-hidden`},gu={class:`hidden md:table w-full text-sm`},_u={class:`px-5 py-3.5`},vu=[`href`],yu={class:`font-medium text-gray-200 group-hover:text-white line-clamp-2`},bu={class:`text-xs text-gray-600 mt-0.5 break-all line-clamp-1`},xu={key:0,class:`text-xs text-gray-500 mt-1 line-clamp-1`},Su={class:`px-5 py-3.5`},Cu={class:`text-gray-400 text-xs font-mono`},wu={class:`px-5 py-3.5`},Tu={key:1,class:`text-xs text-gray-600`},Eu={class:`px-5 py-3.5 text-gray-500 text-xs tabular-nums`},Du={class:`px-5 py-3.5 text-gray-500 text-xs`},Ou={key:0},ku={class:`md:hidden divide-y divide-gray-800`},Au=[`href`],ju={class:`font-medium text-gray-200 text-sm line-clamp-2 mb-1`},Mu={class:`text-xs text-gray-500 break-all line-clamp-1 mb-2`},Nu={class:`flex items-center gap-2 text-xs`},Pu={class:`text-gray-400 font-mono`},Fu={class:`text-gray-600 ml-auto`},Iu={key:0,class:`p-8 text-center text-gray-600`},Lu={key:3,class:`mt-3 text-xs text-gray-600 text-right pb-4 md:pb-0`},Ru={__name:`RecentCrawls`,setup(e){let t=F([]),n=F(0),r=F(!0),i=F(null),a=F(``),o=F(``),s=[20,50,100,200],c=F(50);ir(async()=>{await l()});async function l(){r.value=!0,i.value=null;try{let e=await ul(c.value);t.value=e.items||[],n.value=e.total||0}catch(e){i.value=`无法加载数据,可能人服务器未启动`,console.error(e)}finally{r.value=!1}}async function u(e){c.value=e,await l()}let d=ha(()=>{let e=t.value;if(a.value){let t=a.value.toLowerCase();e=e.filter(e=>e.title?.toLowerCase().includes(t)||e.url?.toLowerCase().includes(t)||e.domain?.toLowerCase().includes(t))}return o.value&&(e=e.filter(e=>Object.keys(e.language||{}).includes(o.value))),e});function f(e){return e?new Date(e*1e3).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}):`-`}function p(e){return{zh:{label:`中文`,cls:`bg-red-900/60 text-red-300`},en:{label:`EN`,cls:`bg-blue-900/60 text-blue-300`},ja:{label:`日`,cls:`bg-pink-900/60 text-pink-300`},ko:{label:`한`,cls:`bg-blue-900/60 text-blue-300`},fr:{label:`FR`,cls:`bg-green-900/60 text-green-300`},de:{label:`DE`,cls:`bg-yellow-900/60 text-yellow-300`},es:{label:`ES`,cls:`bg-green-900/60 text-green-300`},ru:{label:`RU`,cls:`bg-purple-900/60 text-purple-300`}}[e]||{label:e,cls:`bg-gray-800 text-gray-400`}}function m(e){return e?Object.entries(e).sort((e,t)=>t[1]-e[1])[0]:null}return(e,t)=>(U(),W(`div`,ou,[G(`div`,su,[G(`div`,null,[t[4]||=G(`h1`,{class:`text-xl md:text-2xl font-semibold text-white mb-1`},`最近爬取`,-1),G(`p`,cu,`共 `+O(n.value.toLocaleString())+` 条记录`,1)]),G(`div`,lu,[An(G(`select`,{"onUpdate:modelValue":t[0]||=e=>c.value=e,onChange:t[1]||=e=>u(c.value),class:`bg-gray-900 border border-gray-700 text-gray-300 text-sm rounded-lg px-3 py-2 focus:border-blue-500 focus:outline-none`},[(U(),W(V,null,R(s,e=>G(`option`,{key:e,value:e},`显示 `+O(e)+` 条`,9,uu)),64))],544),[[so,c.value]]),G(`button`,{onClick:l,class:`bg-blue-600 hover:bg-blue-700 text-white text-sm px-4 py-2 rounded-lg transition-colors`},` 刷新 `)])]),G(`div`,du,[G(`div`,fu,[An(G(`input`,{"onUpdate:modelValue":t[2]||=e=>a.value=e,type:`text`,placeholder:`搜索标题、URL、域名...`,class:`w-full bg-gray-900 border border-gray-700 text-gray-200 text-sm rounded-lg pl-10 pr-4 py-2 focus:border-blue-500 focus:outline-none placeholder-gray-600`},null,512),[[oo,a.value]]),t[5]||=G(`span`,{class:`absolute left-3 top-1/2 -translate-y-1/2 text-gray-500`},`🔍`,-1)]),An(G(`select`,{"onUpdate:modelValue":t[3]||=e=>o.value=e,class:`bg-gray-900 border border-gray-700 text-gray-300 text-sm rounded-lg px-3 py-2 focus:border-blue-500 focus:outline-none`},[...t[6]||=[Ui(``,9)]],512),[[so,o.value]])]),r.value?(U(),W(`div`,pu,[...t[7]||=[G(`div`,{class:`text-gray-400 animate-pulse`},`加载中...`,-1)]])):i.value?(U(),W(`div`,mu,O(i.value),1)):(U(),W(`div`,hu,[G(`table`,gu,[t[9]||=G(`thead`,null,[G(`tr`,{class:`border-b border-gray-800`},[G(`th`,{class:`text-left px-5 py-3 text-gray-500 font-medium text-xs uppercase tracking-wider`},`标题`),G(`th`,{class:`text-left px-5 py-3 text-gray-500 font-medium text-xs uppercase tracking-wider w-28`},`域名`),G(`th`,{class:`text-left px-5 py-3 text-gray-500 font-medium text-xs uppercase tracking-wider w-16`},`语种`),G(`th`,{class:`text-left px-5 py-3 text-gray-500 font-medium text-xs uppercase tracking-wider w-20`},`字数`),G(`th`,{class:`text-left px-5 py-3 text-gray-500 font-medium text-xs uppercase tracking-wider w-48`},`爬取时间`)])],-1),G(`tbody`,null,[(U(!0),W(V,null,R(d.value,e=>(U(),W(`tr`,{key:e.url,class:`border-b border-gray-800/50 hover:bg-gray-800/40 transition-colors group`},[G(`td`,_u,[G(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,class:`block hover:opacity-80 transition-opacity`},[G(`div`,yu,O(e.title||`(无标题)`),1),G(`div`,bu,O(e.url),1)],8,vu),e.description?(U(),W(`div`,xu,O(e.description),1)):K(``,!0)]),G(`td`,Su,[G(`span`,Cu,O(e.domain),1)]),G(`td`,wu,[m(e.language)?(U(),W(`span`,{key:0,class:D([`text-xs px-1.5 py-0.5 rounded font-medium`,p(m(e.language)[0]).cls])},O(p(m(e.language)[0]).label)+` `+O((m(e.language)[1]*100).toFixed(0))+`% `,3)):(U(),W(`span`,Tu,`-`))]),G(`td`,Eu,O(e.word_count.toLocaleString()),1),G(`td`,Du,O(f(e.crawled_at)),1)]))),128)),d.value.length?K(``,!0):(U(),W(`tr`,Ou,[...t[8]||=[G(`td`,{colspan:`5`,class:`px-5 py-12 text-center text-gray-600`},` 没有找到匹配的记录 `,-1)]]))])]),G(`div`,ku,[(U(!0),W(V,null,R(d.value,e=>(U(),W(`a`,{key:e.url,href:e.url,target:`_blank`,rel:`noopener noreferrer`,class:`block p-4 hover:bg-gray-800/40 transition-colors`},[G(`div`,ju,O(e.title||`(无标题)`),1),G(`div`,Mu,O(e.url),1),G(`div`,Nu,[G(`span`,Pu,O(e.domain),1),m(e.language)?(U(),W(`span`,{key:0,class:D([`px-1.5 py-0.5 rounded font-medium`,p(m(e.language)[0]).cls])},O(p(m(e.language)[0]).label),3)):K(``,!0),G(`span`,Fu,O(f(e.crawled_at)),1)])],8,Au))),128)),d.value.length?K(``,!0):(U(),W(`div`,Iu,` 没有找到匹配的记录 `))])])),!r.value&&!i.value&&d.value.length?(U(),W(`div`,Lu,` 筛选后 `+O(d.value.length)+` 条 / 共 `+O(n.value.toLocaleString())+` 条 `,1)):K(``,!0)]))}},zu={class:`p-4 md:p-8`},Bu={class:`bg-gray-900 rounded-xl p-4 md:p-6 mb-4 md:mb-6 border border-gray-800`},Vu={class:`flex flex-col sm:flex-row gap-3`},Hu=[`disabled`],Uu=[`disabled`],Wu={key:0,class:`mt-3 text-sm text-red-400`},Gu={key:1,class:`mt-3 text-sm text-green-400`},Ku={class:`bg-gray-900 rounded-xl border border-gray-800`},qu={class:`px-4 md:px-6 py-3 md:py-4 border-b border-gray-800 flex items-center justify-between`},Ju={class:`text-xs text-gray-500`},Yu={key:0,class:`p-8 text-center text-gray-500 text-sm`},Xu={key:1,class:`p-8 text-center text-red-400 text-sm`},Zu={key:2,class:`p-8 text-center text-gray-500 text-sm`},Qu={key:3,class:`hidden md:table w-full text-sm`},$u={class:`divide-y divide-gray-800`},ed={class:`px-6 py-3`},td={class:`text-gray-300 break-all`},nd={class:`px-6 py-3`},rd={key:0,class:`inline-block px-2 py-0.5 text-xs rounded bg-purple-900 text-purple-300`},id={key:1,class:`inline-block px-2 py-0.5 text-xs rounded bg-blue-900 text-blue-300`},ad={class:`px-6 py-3 text-gray-500`},od={class:`px-6 py-3`},sd=[`onClick`],cd={class:`md:hidden divide-y divide-gray-800`},ld={class:`flex-1 min-w-0`},ud={class:`text-gray-300 text-sm break-all mb-1`},dd={class:`flex items-center gap-2`},fd={key:0,class:`inline-block px-2 py-0.5 text-xs rounded bg-purple-900 text-purple-300`},pd={key:1,class:`inline-block px-2 py-0.5 text-xs rounded bg-blue-900 text-blue-300`},md={class:`text-xs text-gray-500`},hd=[`onClick`],gd={__name:`PriorityCrawl`,setup(e){let t=F([]),n=F(!0),r=F(null),i=F(!1),a=F(null),o=F(!1),s=F(``);async function c(){n.value=!0,r.value=null;try{t.value=(await fl()).items||[]}catch(e){r.value=`加载失败,请检查人服务器是否启动`,console.error(e)}finally{n.value=!1}}async function l(){let e=s.value.trim();if(e){i.value=!0,a.value=null,o.value=!1;try{await pl(e),s.value=``,o.value=!0,setTimeout(()=>{o.value=!1},3e3),await c()}catch(e){a.value=e?.response?.data?.error||`添加失败`}finally{i.value=!1}}}async function u(e){try{await ml(e),await c()}catch(e){r.value=`删除失败`,console.error(e)}}function d(e){return e?new Date(e*1e3).toLocaleString(`zh-CN`,{month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`}):`-`}return ir(c),(e,c)=>(U(),W(`div`,zu,[c[3]||=G(`h1`,{class:`text-xl md:text-2xl font-semibold text-white mb-2`},`插入爬取`,-1),c[4]||=G(`p`,{class:`text-sm text-gray-500 mb-6 md:mb-8`},` 添加 URL 或域名,下一轮爬取时会优先抓取。纯域名会自动补全为 https://www.域名/。 `,-1),G(`div`,Bu,[G(`div`,Vu,[An(G(`input`,{"onUpdate:modelValue":c[0]||=e=>s.value=e,onKeyup:fo(l,[`enter`]),type:`text`,placeholder:`输入 URL 或域名,例如 https://example.com 或 example.com`,class:`flex-1 bg-gray-800 border border-gray-700 rounded-lg px-4 py-2.5 text-gray-100 placeholder-gray-500 focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500 text-sm`,disabled:i.value},null,40,Hu),[[oo,s.value]]),G(`button`,{onClick:l,disabled:i.value||!s.value.trim(),class:`px-6 py-2.5 bg-blue-600 hover:bg-blue-500 disabled:bg-gray-700 disabled:text-gray-500 text-white text-sm font-medium rounded-lg transition-colors cursor-pointer whitespace-nowrap`},O(i.value?`添加中...`:`插入队列`),9,Uu)]),a.value?(U(),W(`div`,Wu,O(a.value),1)):K(``,!0),o.value?(U(),W(`div`,Gu,` 已添加到优先队列,将在下一轮爬取时优先抓取 `)):K(``,!0)]),G(`div`,Ku,[G(`div`,qu,[c[1]||=G(`span`,{class:`text-sm font-medium text-gray-300`},`待爬取队列`,-1),G(`span`,Ju,O(t.value.length)+` 条`,1)]),n.value?(U(),W(`div`,Yu,` 加载中... `)):r.value?(U(),W(`div`,Xu,O(r.value),1)):t.value.length===0?(U(),W(`div`,Zu,` 暂无待爬取的优先 URL `)):(U(),W(`table`,Qu,[c[2]||=G(`thead`,null,[G(`tr`,{class:`text-left text-gray-500 text-xs border-b border-gray-800`},[G(`th`,{class:`px-6 py-3 font-medium`},`URL`),G(`th`,{class:`px-6 py-3 font-medium w-28`},`类型`),G(`th`,{class:`px-6 py-3 font-medium w-40`},`添加时间`),G(`th`,{class:`px-6 py-3 font-medium w-16`},`操作`)])],-1),G(`tbody`,$u,[(U(!0),W(V,null,R(t.value,e=>(U(),W(`tr`,{key:e.url,class:`hover:bg-gray-800/50`},[G(`td`,ed,[G(`span`,td,O(e.url),1)]),G(`td`,nd,[e.domain?(U(),W(`span`,rd,`域名`)):(U(),W(`span`,id,`URL`))]),G(`td`,ad,O(d(e.added_at)),1),G(`td`,od,[G(`button`,{onClick:t=>u(e.url),class:`text-red-400 hover:text-red-300 text-xs cursor-pointer`},` 删除 `,8,sd)])]))),128))])])),G(`div`,cd,[(U(!0),W(V,null,R(t.value,e=>(U(),W(`div`,{key:e.url,class:`p-4 hover:bg-gray-800/50 flex items-center justify-between gap-3`},[G(`div`,ld,[G(`div`,ud,O(e.url),1),G(`div`,dd,[e.domain?(U(),W(`span`,fd,`域名`)):(U(),W(`span`,pd,`URL`)),G(`span`,md,O(d(e.added_at)),1)])]),G(`button`,{onClick:t=>u(e.url),class:`text-red-400 hover:text-red-300 text-xs cursor-pointer shrink-0 px-2 py-1`},` 删除 `,8,hd)]))),128))])])]))}},_d={class:`flex flex-col h-full`},vd={class:`bg-gray-950 border-b border-gray-800 px-4 md:px-8 py-4 md:py-6`},yd={class:`max-w-3xl mx-auto`},bd={class:`relative`},xd={class:`flex-1 overflow-y-auto px-8 py-6`},Sd={class:`max-w-3xl mx-auto`},Cd={key:0,class:`flex items-center gap-3 text-gray-400 py-8`},wd={key:1,class:`bg-red-900/30 border border-red-800 rounded-lg p-4 text-red-300`},Td={key:2,class:`py-16 text-center text-gray-600`},Ed={key:3,class:`py-16 text-center text-gray-600`},Dd={key:4,class:`flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-4 mb-4 md:mb-5 text-sm text-gray-500`},Od={class:`flex items-center gap-2`},kd={class:`text-gray-300`},Ad={class:`flex flex-wrap gap-2 sm:ml-auto`},jd={class:`text-gray-300`},Md={key:5,class:`space-y-2 md:space-y-1`},Nd=[`onClick`],Pd={class:`flex items-start gap-2 md:gap-3 mb-2`},Fd={class:`flex-1 min-w-0`},Id={class:`text-blue-400 group-hover:text-blue-300 text-base md:text-lg leading-snug`},Ld={class:`text-xs text-gray-600 mt-0.5 truncate`},Rd={class:`flex flex-col items-end gap-1 shrink-0`},zd={class:`text-xs text-gray-600`},Bd={class:`w-12 md:w-14 bg-gray-800 rounded-full h-1.5 overflow-hidden`},Vd={class:`text-gray-400 text-sm leading-relaxed mb-2 md:mb-3`},Hd={class:`flex flex-wrap items-center gap-2 md:gap-3 text-xs`},Ud={class:`flex flex-wrap gap-1.5`},Wd=[`title`],Gd={class:`text-blue-400`},Kd={class:`text-gray-600 ml-1`},qd={key:0,class:`text-gray-600`},Jd={class:`text-gray-700 ml-0 md:ml-auto`},Yd={class:`text-xs text-gray-700 mt-1 truncate`},Xd={key:6,class:`mt-6 text-center`},Zd=``,Qd=10,$d={__name:`SearchView`,setup(e){let t=F(``),n=F([]),r=F(0),i=F({}),a=F(!1),o=F(null),s=F(0),c=null;async function l(e,t=!1){if(!e.trim()){n.value=[],r.value=0,i.value={};return}t||(s.value=0),a.value=!0,o.value=null;try{let a=encodeURIComponent(e),o=s.value*Qd,c=await fetch(`${Zd}/search?qh=${a}&slice=${o}:${o+Qd}`);if(!c.ok)throw Error(`HTTP ${c.status}`);let l=await c.json();t?n.value=[...n.value,...l.results||[]]:n.value=l.results||[],r.value=l.total||0,i.value=l.counts||{}}catch(e){o.value=`搜索失败,可能是人服务器未启动`,console.error(e)}finally{a.value=!1}}function u(){clearTimeout(c),c=setTimeout(()=>l(t.value),400)}function d(e){e.key===`Enter`&&(clearTimeout(c),l(t.value))}function f(e,t=120){return e?e.length>t?e.slice(0,t)+`…`:e:``}function p(e){return e?e.toLocaleString():`0`}function m(e){return Math.min(100,Math.round(e*100))}function h(e){return{zh:`中文`,en:`EN`,ja:`JA`,ko:`KO`,fr:`FR`,de:`DE`,es:`ES`,ru:`RU`}[e]||e?.toUpperCase()}function g(e){try{return new URL(e).hostname}catch{return e}}function _(e){window.open(e,`_blank`)}return(e,c)=>(U(),W(`div`,_d,[G(`div`,vd,[G(`div`,yd,[G(`div`,bd,[An(G(`input`,{"onUpdate:modelValue":c[0]||=e=>t.value=e,onInput:u,onKeydown:d,type:`text`,placeholder:`输入关键词搜索,或用 site:example.com 限定域名`,class:`w-full bg-gray-900 border border-gray-700 rounded-xl md:rounded-2xl px-4 md:px-6 py-3 md:py-4 pr-20 md:pr-14 text-white text-base md:text-lg placeholder-gray-600 focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500 transition`},null,544),[[oo,t.value]]),G(`button`,{onClick:c[1]||=e=>l(t.value),class:`absolute right-2 md:right-3 top-1/2 -translate-y-1/2 bg-blue-600 hover:bg-blue-500 text-white rounded-lg md:rounded-xl px-3 md:px-4 py-1.5 md:py-2 text-sm font-medium transition`},` 搜索 `)])])]),G(`div`,xd,[G(`div`,Sd,[a.value?(U(),W(`div`,Cd,[...c[3]||=[G(`div`,{class:`w-5 h-5 border-2 border-blue-400 border-t-transparent rounded-full animate-spin`},null,-1),G(`span`,null,`搜索中...`,-1)]])):o.value?(U(),W(`div`,wd,O(o.value),1)):t.value.trim()?n.value.length===0&&!a.value?(U(),W(`div`,Ed,` 未找到相关结果 `)):n.value.length>0?(U(),W(`div`,Dd,[G(`div`,Od,[G(`span`,null,[c[4]||=Hi(`找到约 `,-1),G(`strong`,kd,O(p(r.value)),1),c[5]||=Hi(` 条结果`,-1)]),c[6]||=G(`span`,{class:`text-gray-700`},`|`,-1),G(`span`,null,O(n.value.length)+` 条已加载`,1)]),G(`div`,Ad,[(U(!0),W(V,null,R(i.value,(e,t)=>(U(),W(`span`,{key:t,class:`inline-flex items-center gap-1 bg-gray-800 rounded px-2 py-0.5 text-xs text-gray-400`},[G(`span`,jd,O(t),1),G(`span`,null,O(p(e)),1)]))),128))])])):K(``,!0):(U(),W(`div`,Td,` 输入关键词开始搜索 `)),n.value.length>0?(U(),W(`div`,Md,[(U(!0),W(V,null,R(n.value,(e,t)=>(U(),W(`div`,{key:t,onClick:t=>_(e.url),class:`group block bg-gray-900/50 hover:bg-gray-900 border border-gray-800 hover:border-gray-700 rounded-xl p-4 md:p-5 cursor-pointer transition`},[G(`div`,Pd,[G(`div`,Fd,[G(`div`,Id,O(e.snippet?.title||g(e.url)),1),G(`div`,Ld,O(g(e.url)),1)]),G(`div`,Rd,[G(`div`,zd,O(m(e.score))+`%`,1),G(`div`,Bd,[G(`div`,{class:`h-full bg-blue-500 rounded-full`,style:me({width:m(e.score)+`%`})},null,4)])])]),G(`p`,Vd,O(f(e.snippet?.description||e.snippet?.text)),1),G(`div`,Hd,[G(`div`,Ud,[(U(!0),W(V,null,R(e.relevance,(e,t)=>(U(),W(`span`,{key:t,class:`inline-flex items-center bg-gray-800 rounded px-1.5 py-0.5`,title:`${t}: ${(e*100).toFixed(1)}%`},[G(`span`,Gd,O(t),1),G(`span`,Kd,O((e*100).toFixed(0))+`%`,1)],8,Wd))),128))]),e.snippet?.language?(U(),W(`span`,qd,O(h(e.snippet.language)),1)):K(``,!0),G(`span`,Jd,O(p(e.domain_count))+` 个结果`,1)]),G(`div`,Yd,O(e.url),1)],8,Nd))),128))])):K(``,!0),n.value.length>0&&n.value.length{s.value++,l(t.value,!0)},class:`bg-gray-800 hover:bg-gray-700 text-gray-300 rounded-xl px-6 py-2.5 text-sm transition`},` 加载更多 (`+O(n.value.length)+`/`+O(p(r.value))+`) `,1)])):K(``,!0)])])]))}},ef={class:`flex h-screen bg-gray-950 text-gray-100 font-sans`},tf={class:`hidden md:flex w-56 bg-gray-900 border-r border-gray-800 flex-col shrink-0`},nf={class:`flex-1 py-4 px-3 space-y-1`},rf=[`onClick`],af={class:`flex-1 overflow-y-auto pb-16 md:pb-0`},of={class:`md:hidden fixed bottom-0 left-0 right-0 bg-gray-900 border-t border-gray-800 flex justify-around items-center h-16 z-50`},sf=[`onClick`],cf={class:`text-lg`},lf={class:`text-[10px]`};go({__name:`App`,setup(e){let t=F(`dashboard`),n=[{id:`dashboard`,label:`概览`,icon:`📊`},{id:`recent`,label:`最近`,icon:`🕷️`},{id:`search`,label:`搜索`,icon:`🔍`},{id:`priority`,label:`插入`,icon:`🚀`}];return(e,r)=>(U(),W(`div`,ef,[G(`aside`,tf,[r[0]||=G(`div`,{class:`px-5 py-5 border-b border-gray-800`},[G(`div`,{class:`text-lg font-semibold text-white tracking-tight`},`SESE Admin`),G(`div`,{class:`text-xs text-gray-500 mt-0.5`},`爬取内容监控`)],-1),G(`nav`,nf,[(U(),W(V,null,R(n,e=>G(`button`,{key:e.id,onClick:n=>t.value=e.id,class:D([`w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors`,t.value===e.id?`bg-blue-600 text-white`:`text-gray-400 hover:text-white hover:bg-gray-800`])},[G(`span`,null,O(e.icon),1),Hi(` `+O(e.label),1)],10,rf)),64))]),r[1]||=G(`div`,{class:`px-5 py-4 border-t border-gray-800`},[G(`div`,{class:`text-xs text-gray-600`},`sese-engine v1.0`)],-1)]),G(`main`,af,[t.value===`dashboard`?(U(),Ni(au,{key:0})):t.value===`recent`?(U(),Ni(Ru,{key:1})):t.value===`search`?(U(),Ni($d,{key:2})):t.value===`priority`?(U(),Ni(gd,{key:3})):K(``,!0)]),G(`nav`,of,[(U(),W(V,null,R(n,e=>G(`button`,{key:e.id,onClick:n=>t.value=e.id,class:D([`flex flex-col items-center justify-center gap-0.5 flex-1 h-full transition-colors`,t.value===e.id?`text-blue-400`:`text-gray-500`])},[G(`span`,cf,O(e.icon),1),G(`span`,lf,O(e.label),1)],10,sf)),64))])]))}}).mount(`#app`); \ No newline at end of file +`+n):e.stack=n}catch{}}throw e}}_request(e,t){typeof e==`string`?(t||={},t.url=e):t=e||{},t=Dc(this.defaults,t);let{transitional:n,paramsSerializer:r,headers:i}=t;n!==void 0&&tl.assertOptions(n,{silentJSONParsing:nl.transitional(nl.boolean),forcedJSONParsing:nl.transitional(nl.boolean),clarifyTimeoutError:nl.transitional(nl.boolean),legacyInterceptorReqResOrdering:nl.transitional(nl.boolean)},!1),r!=null&&(Y.isFunction(r)?t.paramsSerializer={serialize:r}:tl.assertOptions(r,{encode:nl.function,serialize:nl.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls===void 0?t.allowAbsoluteUrls=!0:t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls),tl.assertOptions(t,{baseUrl:nl.spelling(`baseURL`),withXsrfToken:nl.spelling(`withXSRFToken`)},!0),t.method=(t.method||this.defaults.method||`get`).toLowerCase();let a=i&&Y.merge(i.common,i[t.method]);i&&Y.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`,`common`],e=>{delete i[e]}),t.headers=Q.concat(a,i);let o=[],s=!0;this.interceptors.request.forEach(function(e){if(typeof e.runWhen==`function`&&e.runWhen(t)===!1)return;s&&=e.synchronous;let n=t.transitional||Vs;n&&n.legacyInterceptorReqResOrdering?o.unshift(e.fulfilled,e.rejected):o.push(e.fulfilled,e.rejected)});let c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,u=0,d;if(!s){let e=[Xc.bind(this),void 0];for(e.unshift(...o),e.push(...c),d=e.length,l=Promise.resolve(t);u{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t,r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,i){n.reason||(n.reason=new pc(e,r,i),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let t;return{token:new e(function(e){t=e}),cancel:t}}};function al(e){return function(t){return e.apply(null,t)}}function ol(e){return Y.isObject(e)&&e.isAxiosError===!0}var sl={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(sl).forEach(([e,t])=>{sl[t]=e});function cl(e){let t=new rl(e),n=yo(rl.prototype.request,t);return Y.extend(n,rl.prototype,t,{allOwnKeys:!0}),Y.extend(n,t,null,{allOwnKeys:!0}),n.create=function(t){return cl(Dc(e,t))},n}var $=cl(ec);$.Axios=rl,$.CanceledError=pc,$.CancelToken=il,$.isCancel=fc,$.VERSION=Zc,$.toFormData=Ps,$.AxiosError=X,$.Cancel=$.CanceledError,$.all=function(e){return Promise.all(e)},$.spread=al,$.isAxiosError=ol,$.mergeConfig=Dc,$.AxiosHeaders=Q,$.formToJSON=e=>Qs(Y.isHTMLForm(e)?new FormData(e):e),$.getAdapter=Jc.getAdapter,$.HttpStatusCode=sl,$.default=$;var ll=``;async function ul(e=50){let{data:t}=await $.get(`${ll}/admin/recent`,{params:{limit:e},timeout:15e3});return t}async function dl(){let{data:e}=await $.get(`${ll}/admin/stats`,{timeout:15e3});return e}async function fl(){let{data:e}=await $.get(`${ll}/admin/priority`,{timeout:15e3});return e}async function pl(e){let{data:t}=await $.post(`${ll}/admin/priority`,{url:e},{timeout:15e3});return t}async function ml(e){let{data:t}=await $.delete(`${ll}/admin/priority`,{params:{url:e},timeout:15e3});return t}async function hl(){let{data:e}=await $.post(`${ll}/admin/flush`,null,{timeout:6e4});return e}async function gl(){let{data:e}=await $.get(`${ll}/admin/workers`,{timeout:1e4});return e}async function _l(e){let{data:t}=await $.post(`${ll}/admin/workers`,{workers:e},{timeout:1e4});return t}async function vl(){let{data:e}=await $.get(`${ll}/admin/backlink`,{timeout:1e4});return e}async function yl(){let{data:e}=await $.post(`${ll}/admin/backlink`,null,{timeout:1e4});return e}async function bl(){let{data:e}=await $.get(`${ll}/admin/priority/status`,{timeout:1e4});return e}var xl={class:`p-4 md:p-8`},Sl={key:0,class:`flex items-center justify-center h-48`},Cl={key:1,class:`bg-red-900/30 border border-red-800 rounded-lg p-4 text-red-300`},wl={class:`grid grid-cols-2 md:grid-cols-5 gap-3 md:gap-5 mb-6 md:mb-8`},Tl={class:`bg-gray-900 border border-gray-800 rounded-xl p-5`},El={class:`text-3xl font-bold text-white`},Dl={class:`bg-gray-900 border border-gray-800 rounded-xl p-5`},Ol={class:`text-3xl font-bold text-white`},kl={class:`bg-gray-900 border border-gray-800 rounded-xl p-5`},Al={class:`text-3xl font-bold text-white`},jl={class:`bg-gray-900 border border-gray-800 rounded-xl p-5`},Ml={class:`bg-gray-900 border border-gray-800 rounded-xl p-5 flex flex-col justify-between`},Nl=[`disabled`],Pl={class:`bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5 mb-6 md:mb-8`},Fl={class:`flex flex-col md:flex-row md:items-center md:justify-between gap-4`},Il={class:`flex items-baseline gap-4`},Ll={class:`text-3xl font-bold text-white`},Rl={key:0,class:`ml-2`},zl={class:`text-3xl font-bold text-orange-400`},Bl={key:0,class:`flex items-center gap-6 text-sm`},Vl={class:`text-center`},Hl={class:`text-center`},Ul={class:`text-center`},Wl={class:`text-2xl font-bold text-gray-400`},Gl={class:`flex items-center gap-2`},Kl=[`disabled`],ql=[`disabled`],Jl=[`disabled`],Yl={key:0,class:`bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5 mb-6 md:mb-8`},Xl={class:`flex flex-col md:flex-row md:items-center md:justify-between gap-4`},Zl={class:`flex-1`},Ql={class:`grid grid-cols-1 sm:grid-cols-2 gap-3`},$l={class:`text-lg font-bold text-white`},eu=[`title`],tu=[`disabled`],nu={class:`grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-5`},ru={class:`bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5`},iu={class:`space-y-2`},au=[`title`],ou={class:`flex-1 bg-gray-800 rounded-full h-4 md:h-5 overflow-hidden`},su={class:`w-12 md:w-16 text-xs text-gray-500 text-right shrink-0`},cu={class:`bg-gray-900 border border-gray-800 rounded-xl p-4 md:p-5`},lu={class:`space-y-2`},uu={class:`w-8 md:w-10 text-xs text-gray-400 shrink-0 font-mono`},du={class:`flex-1 bg-gray-800 rounded-full h-4 md:h-5 overflow-hidden`},fu={class:`w-12 md:w-16 text-xs text-gray-500 text-right shrink-0`},pu={__name:`Dashboard`,setup(e){let t=F(null),n=F(!0),r=F(!1),i=F(null),a=null,o=F(0),s=F(0),c=F(0),l=F(!1),u=F(null);ir(async()=>{await Promise.all([d(),f(),m(),h()]),a=setInterval(()=>{d(),f(),m(),h()},5e3)}),cr(()=>{a&&clearInterval(a)});async function d(){try{t.value=await dl(),i.value=null}catch(e){i.value=`无法加载统计数据,可能人服务器未启动或端口不对`,console.error(e)}finally{n.value=!1}}async function f(){try{let e=await gl();o.value=e.configured,s.value=e.active,c.value=e.configured}catch(e){console.error(`Failed to load workers:`,e)}}async function p(){let e=parseInt(c.value,10);if(isNaN(e)||e<1||e>500){i.value=`线程数必须在 1~500 之间`;return}l.value=!0;try{await _l(e),o.value=e,i.value=null}catch(e){i.value=`修改线程数失败: `+e.message}finally{l.value=!1}}async function m(){try{backlinkStatus.value=await vl()}catch(e){console.error(`Failed to load backlink status:`,e)}}async function h(){try{u.value=await bl()}catch(e){console.error(`Failed to load priority status:`,e)}}async function g(){backlinkTriggering.value=!0;try{await yl(),backlinkStatus.value=await vl(),i.value=null}catch(e){i.value=`触发反链计算失败: `+e.message}finally{backlinkTriggering.value=!1}}function _(e){if(!e)return`--`;let t=new Date(e),n=t-new Date,r=Math.floor(n/6e4),i=Math.floor(r/60),a=Math.floor(i/24),o=t.toLocaleTimeString(`zh-CN`,{hour:`2-digit`,minute:`2-digit`}),s=t.toLocaleDateString(`zh-CN`,{month:`short`,day:`numeric`});return a>0?`${s} ${o} (${a}天后)`:i>0?`${s} ${o} (${i}小时后)`:r>0?`${o} (${r}分钟后)`:`${o} (即将执行)`}function v(e){return e?new Date(e).toLocaleString(`zh-CN`,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}):`从未执行`}async function y(){r.value=!0;try{await hl(),t.value=await dl()}catch(e){i.value=`刷盘失败: `+e.message}finally{r.value=!1}}function b(e){return!e&&e!==0?`0`:Number(e).toLocaleString()}function x(e){return e?Object.entries(e).sort((e,t)=>t[1]-e[1]).slice(0,10):[]}function S(e){let t={zh:`#e53e3e`,en:`#3182ce`,ja:`#e53e3e`,ko:`#3182ce`,fr:`#38a169`,de:`#d69e2e`,es:`#38a169`,ru:`#805ad5`,other:`#718096`};return t[e]||t.other}return(e,a)=>(U(),W(`div`,xl,[a[22]||=G(`h1`,{class:`text-xl md:text-2xl font-semibold text-white mb-6 md:mb-8`},`概览`,-1),n.value?(U(),W(`div`,Sl,[...a[3]||=[G(`div`,{class:`text-gray-400 animate-pulse`},`加载中...`,-1)]])):i.value?(U(),W(`div`,Cl,O(i.value),1)):t.value?(U(),W(V,{key:2},[G(`div`,wl,[G(`div`,Tl,[a[4]||=G(`div`,{class:`text-sm text-gray-500 mb-2`},`已爬取 URL`,-1),G(`div`,El,O(b(t.value.total_urls)),1)]),G(`div`,Dl,[a[5]||=G(`div`,{class:`text-sm text-gray-500 mb-2`},`总词数`,-1),G(`div`,Ol,O(b(t.value.total_words)),1)]),G(`div`,kl,[a[6]||=G(`div`,{class:`text-sm text-gray-500 mb-2`},`域名数量`,-1),G(`div`,Al,O(b(t.value.total_domains)),1)]),G(`div`,jl,[a[7]||=G(`div`,{class:`text-sm text-gray-500 mb-2`},`待重爬`,-1),G(`div`,{class:D([`text-3xl font-bold`,t.value.recrawl_eligible>0?`text-orange-400`:`text-green-400`])},O(b(t.value.recrawl_eligible)),3)]),G(`div`,Ml,[G(`div`,null,[a[8]||=G(`div`,{class:`text-sm text-gray-500 mb-2`},`待刷盘`,-1),G(`div`,{class:D([`text-3xl font-bold`,t.value.pending>0?`text-yellow-400`:`text-green-400`])},O(b(t.value.pending)),3)]),G(`button`,{class:`mt-3 w-full bg-blue-700 hover:bg-blue-600 disabled:bg-gray-700 disabled:text-gray-500 text-white text-sm font-medium py-1.5 px-3 rounded transition-colors cursor-pointer`,disabled:r.value||!t.value.pending,onClick:y},O(r.value?`刷盘中...`:`立即刷盘`),9,Nl)])]),G(`div`,Pl,[G(`div`,Fl,[G(`div`,null,[a[13]||=G(`h2`,{class:`text-sm font-semibold text-gray-300 uppercase tracking-wider mb-2`},`爬虫线程`,-1),G(`div`,Il,[G(`div`,null,[a[9]||=G(`div`,{class:`text-xs text-gray-500 mb-0.5`},`实际运行`,-1),G(`div`,{class:D([`text-3xl font-bold`,s.value>0?`text-green-400`:`text-gray-500`])},O(s.value),3)]),a[12]||=G(`div`,{class:`text-gray-700 text-xl`},`/`,-1),G(`div`,null,[a[10]||=G(`div`,{class:`text-xs text-gray-500 mb-0.5`},`设定上限`,-1),G(`div`,Ll,O(o.value),1)]),u.value&&u.value.active>0?(U(),W(`div`,Rl,[a[11]||=G(`div`,{class:`text-xs text-orange-400 mb-0.5`},`优先线程`,-1),G(`div`,zl,`+`+O(u.value.active),1)])):K(``,!0)])]),u.value?(U(),W(`div`,Bl,[G(`div`,Vl,[a[14]||=G(`div`,{class:`text-xs text-gray-500 mb-1`},`待处理队列`,-1),G(`div`,{class:D([`text-2xl font-bold`,u.value.pending>0?`text-yellow-400`:`text-gray-500`])},O(u.value.pending),3)]),G(`div`,Hl,[a[15]||=G(`div`,{class:`text-xs text-gray-500 mb-1`},`正在爬取`,-1),G(`div`,{class:D([`text-2xl font-bold`,u.value.active>0?`text-orange-400`:`text-gray-500`])},O(u.value.active),3)]),G(`div`,Ul,[a[16]||=G(`div`,{class:`text-xs text-gray-500 mb-1`},`上限`,-1),G(`div`,Wl,O(u.value.max_workers),1)])])):K(``,!0),G(`div`,Gl,[G(`button`,{class:`w-9 h-9 flex items-center justify-center rounded-lg bg-gray-800 hover:bg-gray-700 text-gray-300 hover:text-white text-lg font-bold transition-colors cursor-pointer`,onClick:a[0]||=e=>c.value=Math.max(1,c.value-1),disabled:l.value},`−`,8,Kl),An(G(`input`,{type:`number`,"onUpdate:modelValue":a[1]||=e=>c.value=e,min:`1`,max:`500`,class:`w-20 h-9 text-center bg-gray-800 border border-gray-700 rounded-lg text-white text-sm focus:outline-none focus:border-blue-500 transition-colors [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none`,onKeyup:fo(p,[`enter`])},null,544),[[oo,c.value,void 0,{number:!0}]]),G(`button`,{class:`w-9 h-9 flex items-center justify-center rounded-lg bg-gray-800 hover:bg-gray-700 text-gray-300 hover:text-white text-lg font-bold transition-colors cursor-pointer`,onClick:a[2]||=e=>c.value=Math.min(500,c.value+1),disabled:l.value},`+`,8,ql),G(`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`,disabled:l.value||c.value===o.value,onClick:p},O(l.value?`保存中...`:`应用`),9,Jl)])])]),e.backlinkStatus?(U(),W(`div`,Yl,[G(`div`,Xl,[G(`div`,Zl,[a[19]||=G(`h2`,{class:`text-sm font-semibold text-gray-300 uppercase tracking-wider mb-3`},`反链计算(PageRank)`,-1),G(`div`,Ql,[G(`div`,null,[a[17]||=G(`div`,{class:`text-xs text-gray-500 mb-0.5`},`下次自动执行`,-1),G(`div`,{class:D([`text-lg font-bold`,e.backlinkStatus.running?`text-yellow-400`:`text-white`])},O(e.backlinkStatus.running?`计算中...`:_(e.backlinkStatus.next_run)),3)]),G(`div`,null,[a[18]||=G(`div`,{class:`text-xs text-gray-500 mb-0.5`},`上次完成`,-1),G(`div`,$l,O(v(e.backlinkStatus.last_run)),1)])]),e.backlinkStatus.last_error?(U(),W(`div`,{key:0,class:`mt-2 text-xs text-red-400 truncate`,title:e.backlinkStatus.last_error},` 上次错误:`+O(e.backlinkStatus.last_error),9,eu)):K(``,!0)]),G(`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:e.backlinkTriggering||e.backlinkStatus.running,onClick:g},O(e.backlinkTriggering?`已触发...`:e.backlinkStatus.running?`计算中...`:`立即执行`),9,tu)])])):K(``,!0),G(`div`,nu,[G(`div`,ru,[a[20]||=G(`h2`,{class:`text-sm font-semibold text-gray-300 mb-3 md:mb-4 uppercase tracking-wider`},`域名分布 Top 10`,-1),G(`div`,iu,[(U(!0),W(V,null,R(x(t.value.domains),([e,n])=>(U(),W(`div`,{key:e,class:`flex items-center gap-2 md:gap-3`},[G(`div`,{class:`w-24 md:w-36 text-xs text-gray-400 truncate shrink-0`,title:e},O(e),9,au),G(`div`,ou,[G(`div`,{class:`h-full bg-blue-600 rounded-full transition-all duration-500`,style:me({width:`${n/t.value.domains[Object.keys(t.value.domains)[0]]*100}%`})},null,4)]),G(`div`,su,O(b(n)),1)]))),128))])]),G(`div`,cu,[a[21]||=G(`h2`,{class:`text-sm font-semibold text-gray-300 mb-3 md:mb-4 uppercase tracking-wider`},`语种分布`,-1),G(`div`,lu,[(U(!0),W(V,null,R(Object.entries(t.value.languages||{}).sort((e,t)=>t[1]-e[1]),([e,n])=>(U(),W(`div`,{key:e,class:`flex items-center gap-2 md:gap-3`},[G(`div`,uu,O(e),1),G(`div`,du,[G(`div`,{class:`h-full rounded-full transition-all duration-500`,style:me({width:`${n/t.value.total_urls*100}%`,backgroundColor:S(e)})},null,4)]),G(`div`,fu,O(b(n)),1)]))),128))])])])],64)):K(``,!0)]))}},mu={class:`p-4 md:p-8`},hu={class:`flex flex-col md:flex-row md:items-center justify-between mb-4 md:mb-6 gap-3`},gu={class:`text-sm text-gray-500`},_u={class:`flex items-center gap-2 md:gap-3`},vu=[`value`],yu={class:`flex flex-col sm:flex-row items-stretch sm:items-center gap-3 mb-4 md:mb-5`},bu={class:`relative flex-1 max-w-full sm:max-w-sm`},xu={key:0,class:`flex items-center justify-center h-48`},Su={key:1,class:`bg-red-900/30 border border-red-800 rounded-lg p-4 text-red-300`},Cu={key:2,class:`bg-gray-900 border border-gray-800 rounded-xl overflow-hidden`},wu={class:`hidden md:table w-full text-sm`},Tu={class:`px-5 py-3.5`},Eu=[`href`],Du={class:`font-medium text-gray-200 group-hover:text-white line-clamp-2`},Ou={class:`text-xs text-gray-600 mt-0.5 break-all line-clamp-1`},ku={key:0,class:`text-xs text-gray-500 mt-1 line-clamp-1`},Au={class:`px-5 py-3.5`},ju={class:`text-gray-400 text-xs font-mono`},Mu={class:`px-5 py-3.5`},Nu={key:1,class:`text-xs text-gray-600`},Pu={class:`px-5 py-3.5 text-gray-500 text-xs tabular-nums`},Fu={class:`px-5 py-3.5 text-gray-500 text-xs`},Iu={key:0},Lu={class:`md:hidden divide-y divide-gray-800`},Ru=[`href`],zu={class:`font-medium text-gray-200 text-sm line-clamp-2 mb-1`},Bu={class:`text-xs text-gray-500 break-all line-clamp-1 mb-2`},Vu={class:`flex items-center gap-2 text-xs`},Hu={class:`text-gray-400 font-mono`},Uu={class:`text-gray-600 ml-auto`},Wu={key:0,class:`p-8 text-center text-gray-600`},Gu={key:3,class:`mt-3 text-xs text-gray-600 text-right pb-4 md:pb-0`},Ku={__name:`RecentCrawls`,setup(e){let t=F([]),n=F(0),r=F(!0),i=F(null),a=F(``),o=F(``),s=[20,50,100,200],c=F(50);ir(async()=>{await l()});async function l(){r.value=!0,i.value=null;try{let e=await ul(c.value);t.value=e.items||[],n.value=e.total||0}catch(e){i.value=`无法加载数据,可能人服务器未启动`,console.error(e)}finally{r.value=!1}}async function u(e){c.value=e,await l()}let d=ha(()=>{let e=t.value;if(a.value){let t=a.value.toLowerCase();e=e.filter(e=>e.title?.toLowerCase().includes(t)||e.url?.toLowerCase().includes(t)||e.domain?.toLowerCase().includes(t))}return o.value&&(e=e.filter(e=>Object.keys(e.language||{}).includes(o.value))),e});function f(e){return e?new Date(e*1e3).toLocaleString(`zh-CN`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}):`-`}function p(e){return{zh:{label:`中文`,cls:`bg-red-900/60 text-red-300`},en:{label:`EN`,cls:`bg-blue-900/60 text-blue-300`},ja:{label:`日`,cls:`bg-pink-900/60 text-pink-300`},ko:{label:`한`,cls:`bg-blue-900/60 text-blue-300`},fr:{label:`FR`,cls:`bg-green-900/60 text-green-300`},de:{label:`DE`,cls:`bg-yellow-900/60 text-yellow-300`},es:{label:`ES`,cls:`bg-green-900/60 text-green-300`},ru:{label:`RU`,cls:`bg-purple-900/60 text-purple-300`}}[e]||{label:e,cls:`bg-gray-800 text-gray-400`}}function m(e){return e?Object.entries(e).sort((e,t)=>t[1]-e[1])[0]:null}return(e,t)=>(U(),W(`div`,mu,[G(`div`,hu,[G(`div`,null,[t[4]||=G(`h1`,{class:`text-xl md:text-2xl font-semibold text-white mb-1`},`最近爬取`,-1),G(`p`,gu,`共 `+O(n.value.toLocaleString())+` 条记录`,1)]),G(`div`,_u,[An(G(`select`,{"onUpdate:modelValue":t[0]||=e=>c.value=e,onChange:t[1]||=e=>u(c.value),class:`bg-gray-900 border border-gray-700 text-gray-300 text-sm rounded-lg px-3 py-2 focus:border-blue-500 focus:outline-none`},[(U(),W(V,null,R(s,e=>G(`option`,{key:e,value:e},`显示 `+O(e)+` 条`,9,vu)),64))],544),[[so,c.value]]),G(`button`,{onClick:l,class:`bg-blue-600 hover:bg-blue-700 text-white text-sm px-4 py-2 rounded-lg transition-colors`},` 刷新 `)])]),G(`div`,yu,[G(`div`,bu,[An(G(`input`,{"onUpdate:modelValue":t[2]||=e=>a.value=e,type:`text`,placeholder:`搜索标题、URL、域名...`,class:`w-full bg-gray-900 border border-gray-700 text-gray-200 text-sm rounded-lg pl-10 pr-4 py-2 focus:border-blue-500 focus:outline-none placeholder-gray-600`},null,512),[[oo,a.value]]),t[5]||=G(`span`,{class:`absolute left-3 top-1/2 -translate-y-1/2 text-gray-500`},`🔍`,-1)]),An(G(`select`,{"onUpdate:modelValue":t[3]||=e=>o.value=e,class:`bg-gray-900 border border-gray-700 text-gray-300 text-sm rounded-lg px-3 py-2 focus:border-blue-500 focus:outline-none`},[...t[6]||=[Ui(``,9)]],512),[[so,o.value]])]),r.value?(U(),W(`div`,xu,[...t[7]||=[G(`div`,{class:`text-gray-400 animate-pulse`},`加载中...`,-1)]])):i.value?(U(),W(`div`,Su,O(i.value),1)):(U(),W(`div`,Cu,[G(`table`,wu,[t[9]||=G(`thead`,null,[G(`tr`,{class:`border-b border-gray-800`},[G(`th`,{class:`text-left px-5 py-3 text-gray-500 font-medium text-xs uppercase tracking-wider`},`标题`),G(`th`,{class:`text-left px-5 py-3 text-gray-500 font-medium text-xs uppercase tracking-wider w-28`},`域名`),G(`th`,{class:`text-left px-5 py-3 text-gray-500 font-medium text-xs uppercase tracking-wider w-16`},`语种`),G(`th`,{class:`text-left px-5 py-3 text-gray-500 font-medium text-xs uppercase tracking-wider w-20`},`字数`),G(`th`,{class:`text-left px-5 py-3 text-gray-500 font-medium text-xs uppercase tracking-wider w-48`},`爬取时间`)])],-1),G(`tbody`,null,[(U(!0),W(V,null,R(d.value,e=>(U(),W(`tr`,{key:e.url,class:`border-b border-gray-800/50 hover:bg-gray-800/40 transition-colors group`},[G(`td`,Tu,[G(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,class:`block hover:opacity-80 transition-opacity`},[G(`div`,Du,O(e.title||`(无标题)`),1),G(`div`,Ou,O(e.url),1)],8,Eu),e.description?(U(),W(`div`,ku,O(e.description),1)):K(``,!0)]),G(`td`,Au,[G(`span`,ju,O(e.domain),1)]),G(`td`,Mu,[m(e.language)?(U(),W(`span`,{key:0,class:D([`text-xs px-1.5 py-0.5 rounded font-medium`,p(m(e.language)[0]).cls])},O(p(m(e.language)[0]).label)+` `+O((m(e.language)[1]*100).toFixed(0))+`% `,3)):(U(),W(`span`,Nu,`-`))]),G(`td`,Pu,O(e.word_count.toLocaleString()),1),G(`td`,Fu,O(f(e.crawled_at)),1)]))),128)),d.value.length?K(``,!0):(U(),W(`tr`,Iu,[...t[8]||=[G(`td`,{colspan:`5`,class:`px-5 py-12 text-center text-gray-600`},` 没有找到匹配的记录 `,-1)]]))])]),G(`div`,Lu,[(U(!0),W(V,null,R(d.value,e=>(U(),W(`a`,{key:e.url,href:e.url,target:`_blank`,rel:`noopener noreferrer`,class:`block p-4 hover:bg-gray-800/40 transition-colors`},[G(`div`,zu,O(e.title||`(无标题)`),1),G(`div`,Bu,O(e.url),1),G(`div`,Vu,[G(`span`,Hu,O(e.domain),1),m(e.language)?(U(),W(`span`,{key:0,class:D([`px-1.5 py-0.5 rounded font-medium`,p(m(e.language)[0]).cls])},O(p(m(e.language)[0]).label),3)):K(``,!0),G(`span`,Uu,O(f(e.crawled_at)),1)])],8,Ru))),128)),d.value.length?K(``,!0):(U(),W(`div`,Wu,` 没有找到匹配的记录 `))])])),!r.value&&!i.value&&d.value.length?(U(),W(`div`,Gu,` 筛选后 `+O(d.value.length)+` 条 / 共 `+O(n.value.toLocaleString())+` 条 `,1)):K(``,!0)]))}},qu={class:`p-4 md:p-8`},Ju={class:`bg-gray-900 rounded-xl p-4 md:p-6 mb-4 md:mb-6 border border-gray-800`},Yu={class:`flex flex-col sm:flex-row gap-3`},Xu=[`disabled`],Zu=[`disabled`],Qu={key:0,class:`mt-3 text-sm text-red-400`},$u={key:1,class:`mt-3 text-sm text-green-400`},ed={class:`bg-gray-900 rounded-xl border border-gray-800`},td={class:`px-4 md:px-6 py-3 md:py-4 border-b border-gray-800 flex items-center justify-between`},nd={class:`text-xs text-gray-500`},rd={key:0,class:`p-8 text-center text-gray-500 text-sm`},id={key:1,class:`p-8 text-center text-red-400 text-sm`},ad={key:2,class:`p-8 text-center text-gray-500 text-sm`},od={key:3,class:`hidden md:table w-full text-sm`},sd={class:`divide-y divide-gray-800`},cd={class:`px-6 py-3`},ld={class:`text-gray-300 break-all`},ud={class:`px-6 py-3`},dd={key:0,class:`inline-block px-2 py-0.5 text-xs rounded bg-purple-900 text-purple-300`},fd={key:1,class:`inline-block px-2 py-0.5 text-xs rounded bg-blue-900 text-blue-300`},pd={class:`px-6 py-3 text-gray-500`},md={class:`px-6 py-3`},hd=[`onClick`],gd={class:`md:hidden divide-y divide-gray-800`},_d={class:`flex-1 min-w-0`},vd={class:`text-gray-300 text-sm break-all mb-1`},yd={class:`flex items-center gap-2`},bd={key:0,class:`inline-block px-2 py-0.5 text-xs rounded bg-purple-900 text-purple-300`},xd={key:1,class:`inline-block px-2 py-0.5 text-xs rounded bg-blue-900 text-blue-300`},Sd={class:`text-xs text-gray-500`},Cd=[`onClick`],wd={__name:`PriorityCrawl`,setup(e){let t=F([]),n=F(!0),r=F(null),i=F(!1),a=F(null),o=F(!1),s=F(``);async function c(){n.value=!0,r.value=null;try{t.value=(await fl()).items||[]}catch(e){r.value=`加载失败,请检查人服务器是否启动`,console.error(e)}finally{n.value=!1}}async function l(){let e=s.value.trim();if(e){i.value=!0,a.value=null,o.value=!1;try{await pl(e),s.value=``,o.value=!0,setTimeout(()=>{o.value=!1},3e3),await c()}catch(e){a.value=e?.response?.data?.error||`添加失败`}finally{i.value=!1}}}async function u(e){try{await ml(e),await c()}catch(e){r.value=`删除失败`,console.error(e)}}function d(e){return e?new Date(e*1e3).toLocaleString(`zh-CN`,{month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`}):`-`}return ir(c),(e,c)=>(U(),W(`div`,qu,[c[3]||=G(`h1`,{class:`text-xl md:text-2xl font-semibold text-white mb-2`},`插入爬取`,-1),c[4]||=G(`p`,{class:`text-sm text-gray-500 mb-6 md:mb-8`},` 添加 URL 或域名,下一轮爬取时会优先抓取。纯域名会自动补全为 https://www.域名/。 `,-1),G(`div`,Ju,[G(`div`,Yu,[An(G(`input`,{"onUpdate:modelValue":c[0]||=e=>s.value=e,onKeyup:fo(l,[`enter`]),type:`text`,placeholder:`输入 URL 或域名,例如 https://example.com 或 example.com`,class:`flex-1 bg-gray-800 border border-gray-700 rounded-lg px-4 py-2.5 text-gray-100 placeholder-gray-500 focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500 text-sm`,disabled:i.value},null,40,Xu),[[oo,s.value]]),G(`button`,{onClick:l,disabled:i.value||!s.value.trim(),class:`px-6 py-2.5 bg-blue-600 hover:bg-blue-500 disabled:bg-gray-700 disabled:text-gray-500 text-white text-sm font-medium rounded-lg transition-colors cursor-pointer whitespace-nowrap`},O(i.value?`添加中...`:`插入队列`),9,Zu)]),a.value?(U(),W(`div`,Qu,O(a.value),1)):K(``,!0),o.value?(U(),W(`div`,$u,` 已添加到优先队列,将在下一轮爬取时优先抓取 `)):K(``,!0)]),G(`div`,ed,[G(`div`,td,[c[1]||=G(`span`,{class:`text-sm font-medium text-gray-300`},`待爬取队列`,-1),G(`span`,nd,O(t.value.length)+` 条`,1)]),n.value?(U(),W(`div`,rd,` 加载中... `)):r.value?(U(),W(`div`,id,O(r.value),1)):t.value.length===0?(U(),W(`div`,ad,` 暂无待爬取的优先 URL `)):(U(),W(`table`,od,[c[2]||=G(`thead`,null,[G(`tr`,{class:`text-left text-gray-500 text-xs border-b border-gray-800`},[G(`th`,{class:`px-6 py-3 font-medium`},`URL`),G(`th`,{class:`px-6 py-3 font-medium w-28`},`类型`),G(`th`,{class:`px-6 py-3 font-medium w-40`},`添加时间`),G(`th`,{class:`px-6 py-3 font-medium w-16`},`操作`)])],-1),G(`tbody`,sd,[(U(!0),W(V,null,R(t.value,e=>(U(),W(`tr`,{key:e.url,class:`hover:bg-gray-800/50`},[G(`td`,cd,[G(`span`,ld,O(e.url),1)]),G(`td`,ud,[e.domain?(U(),W(`span`,dd,`域名`)):(U(),W(`span`,fd,`URL`))]),G(`td`,pd,O(d(e.added_at)),1),G(`td`,md,[G(`button`,{onClick:t=>u(e.url),class:`text-red-400 hover:text-red-300 text-xs cursor-pointer`},` 删除 `,8,hd)])]))),128))])])),G(`div`,gd,[(U(!0),W(V,null,R(t.value,e=>(U(),W(`div`,{key:e.url,class:`p-4 hover:bg-gray-800/50 flex items-center justify-between gap-3`},[G(`div`,_d,[G(`div`,vd,O(e.url),1),G(`div`,yd,[e.domain?(U(),W(`span`,bd,`域名`)):(U(),W(`span`,xd,`URL`)),G(`span`,Sd,O(d(e.added_at)),1)])]),G(`button`,{onClick:t=>u(e.url),class:`text-red-400 hover:text-red-300 text-xs cursor-pointer shrink-0 px-2 py-1`},` 删除 `,8,Cd)]))),128))])])]))}},Td={class:`flex flex-col h-full`},Ed={class:`bg-gray-950 border-b border-gray-800 px-4 md:px-8 py-4 md:py-6`},Dd={class:`max-w-3xl mx-auto`},Od={class:`relative`},kd={class:`flex-1 overflow-y-auto px-8 py-6`},Ad={class:`max-w-3xl mx-auto`},jd={key:0,class:`flex items-center gap-3 text-gray-400 py-8`},Md={key:1,class:`bg-red-900/30 border border-red-800 rounded-lg p-4 text-red-300`},Nd={key:2,class:`py-16 text-center text-gray-600`},Pd={key:3,class:`py-16 text-center text-gray-600`},Fd={key:4,class:`flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-4 mb-4 md:mb-5 text-sm text-gray-500`},Id={class:`flex items-center gap-2`},Ld={class:`text-gray-300`},Rd={class:`flex flex-wrap gap-2 sm:ml-auto`},zd={class:`text-gray-300`},Bd={key:5,class:`space-y-2 md:space-y-1`},Vd=[`onClick`],Hd={class:`flex items-start gap-2 md:gap-3 mb-2`},Ud={class:`flex-1 min-w-0`},Wd={class:`text-blue-400 group-hover:text-blue-300 text-base md:text-lg leading-snug`},Gd={class:`text-xs text-gray-600 mt-0.5 truncate`},Kd={class:`flex flex-col items-end gap-1 shrink-0`},qd={class:`text-xs text-gray-600`},Jd={class:`w-12 md:w-14 bg-gray-800 rounded-full h-1.5 overflow-hidden`},Yd={class:`text-gray-400 text-sm leading-relaxed mb-2 md:mb-3`},Xd={class:`flex flex-wrap items-center gap-2 md:gap-3 text-xs`},Zd={class:`flex flex-wrap gap-1.5`},Qd=[`title`],$d={class:`text-blue-400`},ef={class:`text-gray-600 ml-1`},tf={key:0,class:`text-gray-600`},nf={class:`text-gray-700 ml-0 md:ml-auto`},rf={class:`text-xs text-gray-700 mt-1 truncate`},af={key:6,class:`mt-6 text-center`},of=``,sf=10,cf={__name:`SearchView`,setup(e){let t=F(``),n=F([]),r=F(0),i=F({}),a=F(!1),o=F(null),s=F(0),c=null;async function l(e,t=!1){if(!e.trim()){n.value=[],r.value=0,i.value={};return}t||(s.value=0),a.value=!0,o.value=null;try{let a=encodeURIComponent(e),o=s.value*sf,c=await fetch(`${of}/search?qh=${a}&slice=${o}:${o+sf}`);if(!c.ok)throw Error(`HTTP ${c.status}`);let l=await c.json();t?n.value=[...n.value,...l.results||[]]:n.value=l.results||[],r.value=l.total||0,i.value=l.counts||{}}catch(e){o.value=`搜索失败,可能是人服务器未启动`,console.error(e)}finally{a.value=!1}}function u(){clearTimeout(c),c=setTimeout(()=>l(t.value),400)}function d(e){e.key===`Enter`&&(clearTimeout(c),l(t.value))}function f(e,t=120){return e?e.length>t?e.slice(0,t)+`…`:e:``}function p(e){return e?e.toLocaleString():`0`}function m(e){return Math.min(100,Math.round(e*100))}function h(e){return{zh:`中文`,en:`EN`,ja:`JA`,ko:`KO`,fr:`FR`,de:`DE`,es:`ES`,ru:`RU`}[e]||e?.toUpperCase()}function g(e){try{return new URL(e).hostname}catch{return e}}function _(e){window.open(e,`_blank`)}return(e,c)=>(U(),W(`div`,Td,[G(`div`,Ed,[G(`div`,Dd,[G(`div`,Od,[An(G(`input`,{"onUpdate:modelValue":c[0]||=e=>t.value=e,onInput:u,onKeydown:d,type:`text`,placeholder:`输入关键词搜索,或用 site:example.com 限定域名`,class:`w-full bg-gray-900 border border-gray-700 rounded-xl md:rounded-2xl px-4 md:px-6 py-3 md:py-4 pr-20 md:pr-14 text-white text-base md:text-lg placeholder-gray-600 focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500 transition`},null,544),[[oo,t.value]]),G(`button`,{onClick:c[1]||=e=>l(t.value),class:`absolute right-2 md:right-3 top-1/2 -translate-y-1/2 bg-blue-600 hover:bg-blue-500 text-white rounded-lg md:rounded-xl px-3 md:px-4 py-1.5 md:py-2 text-sm font-medium transition`},` 搜索 `)])])]),G(`div`,kd,[G(`div`,Ad,[a.value?(U(),W(`div`,jd,[...c[3]||=[G(`div`,{class:`w-5 h-5 border-2 border-blue-400 border-t-transparent rounded-full animate-spin`},null,-1),G(`span`,null,`搜索中...`,-1)]])):o.value?(U(),W(`div`,Md,O(o.value),1)):t.value.trim()?n.value.length===0&&!a.value?(U(),W(`div`,Pd,` 未找到相关结果 `)):n.value.length>0?(U(),W(`div`,Fd,[G(`div`,Id,[G(`span`,null,[c[4]||=Hi(`找到约 `,-1),G(`strong`,Ld,O(p(r.value)),1),c[5]||=Hi(` 条结果`,-1)]),c[6]||=G(`span`,{class:`text-gray-700`},`|`,-1),G(`span`,null,O(n.value.length)+` 条已加载`,1)]),G(`div`,Rd,[(U(!0),W(V,null,R(i.value,(e,t)=>(U(),W(`span`,{key:t,class:`inline-flex items-center gap-1 bg-gray-800 rounded px-2 py-0.5 text-xs text-gray-400`},[G(`span`,zd,O(t),1),G(`span`,null,O(p(e)),1)]))),128))])])):K(``,!0):(U(),W(`div`,Nd,` 输入关键词开始搜索 `)),n.value.length>0?(U(),W(`div`,Bd,[(U(!0),W(V,null,R(n.value,(e,t)=>(U(),W(`div`,{key:t,onClick:t=>_(e.url),class:`group block bg-gray-900/50 hover:bg-gray-900 border border-gray-800 hover:border-gray-700 rounded-xl p-4 md:p-5 cursor-pointer transition`},[G(`div`,Hd,[G(`div`,Ud,[G(`div`,Wd,O(e.snippet?.title||g(e.url)),1),G(`div`,Gd,O(g(e.url)),1)]),G(`div`,Kd,[G(`div`,qd,O(m(e.score))+`%`,1),G(`div`,Jd,[G(`div`,{class:`h-full bg-blue-500 rounded-full`,style:me({width:m(e.score)+`%`})},null,4)])])]),G(`p`,Yd,O(f(e.snippet?.description||e.snippet?.text)),1),G(`div`,Xd,[G(`div`,Zd,[(U(!0),W(V,null,R(e.relevance,(e,t)=>(U(),W(`span`,{key:t,class:`inline-flex items-center bg-gray-800 rounded px-1.5 py-0.5`,title:`${t}: ${(e*100).toFixed(1)}%`},[G(`span`,$d,O(t),1),G(`span`,ef,O((e*100).toFixed(0))+`%`,1)],8,Qd))),128))]),e.snippet?.language?(U(),W(`span`,tf,O(h(e.snippet.language)),1)):K(``,!0),G(`span`,nf,O(p(e.domain_count))+` 个结果`,1)]),G(`div`,rf,O(e.url),1)],8,Vd))),128))])):K(``,!0),n.value.length>0&&n.value.length{s.value++,l(t.value,!0)},class:`bg-gray-800 hover:bg-gray-700 text-gray-300 rounded-xl px-6 py-2.5 text-sm transition`},` 加载更多 (`+O(n.value.length)+`/`+O(p(r.value))+`) `,1)])):K(``,!0)])])]))}},lf={class:`flex h-screen bg-gray-950 text-gray-100 font-sans`},uf={class:`hidden md:flex w-56 bg-gray-900 border-r border-gray-800 flex-col shrink-0`},df={class:`flex-1 py-4 px-3 space-y-1`},ff=[`onClick`],pf={class:`flex-1 overflow-y-auto pb-16 md:pb-0`},mf={class:`md:hidden fixed bottom-0 left-0 right-0 bg-gray-900 border-t border-gray-800 flex justify-around items-center h-16 z-50`},hf=[`onClick`],gf={class:`text-lg`},_f={class:`text-[10px]`};go({__name:`App`,setup(e){let t=F(`dashboard`),n=[{id:`dashboard`,label:`概览`,icon:`📊`},{id:`recent`,label:`最近`,icon:`🕷️`},{id:`search`,label:`搜索`,icon:`🔍`},{id:`priority`,label:`插入`,icon:`🚀`}];return(e,r)=>(U(),W(`div`,lf,[G(`aside`,uf,[r[0]||=G(`div`,{class:`px-5 py-5 border-b border-gray-800`},[G(`div`,{class:`text-lg font-semibold text-white tracking-tight`},`SESE Admin`),G(`div`,{class:`text-xs text-gray-500 mt-0.5`},`爬取内容监控`)],-1),G(`nav`,df,[(U(),W(V,null,R(n,e=>G(`button`,{key:e.id,onClick:n=>t.value=e.id,class:D([`w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors`,t.value===e.id?`bg-blue-600 text-white`:`text-gray-400 hover:text-white hover:bg-gray-800`])},[G(`span`,null,O(e.icon),1),Hi(` `+O(e.label),1)],10,ff)),64))]),r[1]||=G(`div`,{class:`px-5 py-4 border-t border-gray-800`},[G(`div`,{class:`text-xs text-gray-600`},`sese-engine v1.0`)],-1)]),G(`main`,pf,[t.value===`dashboard`?(U(),Ni(pu,{key:0})):t.value===`recent`?(U(),Ni(Ku,{key:1})):t.value===`search`?(U(),Ni(cf,{key:2})):t.value===`priority`?(U(),Ni(wd,{key:3})):K(``,!0)]),G(`nav`,mf,[(U(),W(V,null,R(n,e=>G(`button`,{key:e.id,onClick:n=>t.value=e.id,class:D([`flex flex-col items-center justify-center gap-0.5 flex-1 h-full transition-colors`,t.value===e.id?`text-blue-400`:`text-gray-500`])},[G(`span`,gf,O(e.icon),1),G(`span`,_f,O(e.label),1)],10,hf)),64))])]))}}).mount(`#app`); \ No newline at end of file diff --git a/dist/assets/index-Dr22_wUg.css b/dist/assets/index-Dr22_wUg.css new file mode 100644 index 0000000..bb5fcfb --- /dev/null +++ b/dist/assets/index-Dr22_wUg.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-400:oklch(75% .183 55.934);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-900:oklch(39.3% .095 152.535);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-900:oklch(38.1% .176 304.987);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-900:oklch(40.8% .153 2.432);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.top-1\/2{top:50%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.left-3{left:calc(var(--spacing) * 3)}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-0{margin-left:calc(var(--spacing) * 0)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-9{height:calc(var(--spacing) * 9)}.h-16{height:calc(var(--spacing) * 16)}.h-48{height:calc(var(--spacing) * 48)}.h-full{height:100%}.h-screen{height:100vh}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.\[appearance\:textfield\]{appearance:textfield}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-800>:not(:last-child)){border-color:var(--color-gray-800)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-400{border-color:var(--color-blue-400)}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-800\/50{border-color:#1e293980}@supports (color:color-mix(in lab, red, red)){.border-gray-800\/50{border-color:color-mix(in oklab, var(--color-gray-800) 50%, transparent)}}.border-red-800{border-color:var(--color-red-800)}.border-t-transparent{border-top-color:#0000}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-blue-900{background-color:var(--color-blue-900)}.bg-blue-900\/60{background-color:#1c398e99}@supports (color:color-mix(in lab, red, red)){.bg-blue-900\/60{background-color:color-mix(in oklab, var(--color-blue-900) 60%, transparent)}}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab, red, red)){.bg-gray-900\/50{background-color:color-mix(in oklab, var(--color-gray-900) 50%, transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-green-900\/60{background-color:#0d542b99}@supports (color:color-mix(in lab, red, red)){.bg-green-900\/60{background-color:color-mix(in oklab, var(--color-green-900) 60%, transparent)}}.bg-pink-900\/60{background-color:#86104399}@supports (color:color-mix(in lab, red, red)){.bg-pink-900\/60{background-color:color-mix(in oklab, var(--color-pink-900) 60%, transparent)}}.bg-purple-900{background-color:var(--color-purple-900)}.bg-purple-900\/60{background-color:#59168b99}@supports (color:color-mix(in lab, red, red)){.bg-purple-900\/60{background-color:color-mix(in oklab, var(--color-purple-900) 60%, transparent)}}.bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab, red, red)){.bg-red-900\/30{background-color:color-mix(in oklab, var(--color-red-900) 30%, transparent)}}.bg-red-900\/60{background-color:#82181a99}@supports (color:color-mix(in lab, red, red)){.bg-red-900\/60{background-color:color-mix(in oklab, var(--color-red-900) 60%, transparent)}}.bg-yellow-900\/60{background-color:#733e0a99}@supports (color:color-mix(in lab, red, red)){.bg-yellow-900\/60{background-color:color-mix(in oklab, var(--color-yellow-900) 60%, transparent)}}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-20{padding-right:calc(var(--spacing) * 20)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-orange-400{color:var(--color-orange-400)}.text-pink-300{color:var(--color-pink-300)}.text-purple-300{color:var(--color-purple-300)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-white{color:var(--color-white)}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.placeholder-gray-600::placeholder{color:var(--color-gray-600)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-500{--tw-duration:.5s;transition-duration:.5s}@media (hover:hover){.group-hover\:text-blue-300:is(:where(.group):hover *){color:var(--color-blue-300)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-gray-800\/40:hover{background-color:#1e293966}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-800\/40:hover{background-color:color-mix(in oklab, var(--color-gray-800) 40%, transparent)}}.hover\:bg-gray-800\/50:hover{background-color:#1e293980}@supports (color:color-mix(in lab, red, red)){.hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab, var(--color-gray-800) 50%, transparent)}}.hover\:bg-gray-900:hover{background-color:var(--color-gray-900)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-white:hover{color:var(--color-white)}.hover\:opacity-80:hover{opacity:.8}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:bg-gray-700:disabled{background-color:var(--color-gray-700)}.disabled\:text-gray-500:disabled{color:var(--color-gray-500)}@media (width>=40rem){.sm\:ml-auto{margin-left:auto}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-4{gap:calc(var(--spacing) * 4)}}@media (width>=48rem){.md\:right-3{right:calc(var(--spacing) * 3)}.md\:mb-3{margin-bottom:calc(var(--spacing) * 3)}.md\:mb-4{margin-bottom:calc(var(--spacing) * 4)}.md\:mb-5{margin-bottom:calc(var(--spacing) * 5)}.md\:mb-6{margin-bottom:calc(var(--spacing) * 6)}.md\:mb-8{margin-bottom:calc(var(--spacing) * 8)}.md\:ml-auto{margin-left:auto}.md\:flex{display:flex}.md\:hidden{display:none}.md\:table{display:table}.md\:h-5{height:calc(var(--spacing) * 5)}.md\:w-10{width:calc(var(--spacing) * 10)}.md\:w-14{width:calc(var(--spacing) * 14)}.md\:w-16{width:calc(var(--spacing) * 16)}.md\:w-36{width:calc(var(--spacing) * 36)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:gap-5{gap:calc(var(--spacing) * 5)}:where(.md\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}.md\:rounded-2xl{border-radius:var(--radius-2xl)}.md\:rounded-xl{border-radius:var(--radius-xl)}.md\:p-5{padding:calc(var(--spacing) * 5)}.md\:p-6{padding:calc(var(--spacing) * 6)}.md\:p-8{padding:calc(var(--spacing) * 8)}.md\:px-4{padding-inline:calc(var(--spacing) * 4)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:px-8{padding-inline:calc(var(--spacing) * 8)}.md\:py-2{padding-block:calc(var(--spacing) * 2)}.md\:py-4{padding-block:calc(var(--spacing) * 4)}.md\:py-6{padding-block:calc(var(--spacing) * 6)}.md\:pr-14{padding-right:calc(var(--spacing) * 14)}.md\:pb-0{padding-bottom:calc(var(--spacing) * 0)}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/dist/index.html b/dist/index.html index 40d5774..c787826 100644 --- a/dist/index.html +++ b/dist/index.html @@ -5,8 +5,8 @@ SESE 爬取管理 - - + +
diff --git a/main.go b/main.go index ac3cfc9..bb6c7db 100644 --- a/main.go +++ b/main.go @@ -175,6 +175,7 @@ func main() { // 从 info 服务获取繁荣表快照,用于调度优先级决策 prosperMap := infoSvc.ProsperMap() crawl := crawler.New(db, anal, prosperMap) + searchSrv.SetCrawler(crawl) // 注入爬虫用于 Priority URL 立即触发 go crawl.Run(*entryURL, config.MaxEpoch()) log.Println("all modules started — press Ctrl-C to stop") diff --git a/search/server.go b/search/server.go index 5194e3d..bbbf2c7 100644 --- a/search/server.go +++ b/search/server.go @@ -61,6 +61,11 @@ type Server struct { Status() map[string]interface{} RunNow() error } + + // crawler 爬虫实例(用于 Priority URL 添加时立即触发爬取) + crawler interface { + TriggerPriorityCrawl(url string) + } } // New 创建一个 search Server(内嵌收获服务,统一在同一端口)。 @@ -89,6 +94,13 @@ func (s *Server) SetBacklinkRunner(r interface { s.backlinkRunner = r } +// SetCrawler 注入爬虫实例(用于 Priority URL 添加时立即触发爬取)。 +func (s *Server) SetCrawler(c interface { + TriggerPriorityCrawl(url string) +}) { + s.crawler = c +} + // runPeriodicFlush 每隔 FlushIntervalSeconds 秒触发一次刷盘。 func (s *Server) runPeriodicFlush() { ticker := time.NewTicker(time.Duration(config.FlushIntervalSeconds()) * time.Second) @@ -113,6 +125,7 @@ func (s *Server) Handler() http.Handler { mux.HandleFunc("/admin/recent", s.handleAdminRecent) mux.HandleFunc("/admin/stats", s.handleAdminStats) mux.HandleFunc("/admin/priority", s.handleAdminPriority) + mux.HandleFunc("/admin/priority/status", s.handleAdminPriorityStatus) mux.HandleFunc("/admin/flush", s.handleAdminFlush) mux.HandleFunc("/admin/pending", s.handleAdminPending) mux.HandleFunc("/admin/workers", s.handleAdminWorkers) @@ -513,6 +526,12 @@ func (s *Server) handleAdminPriority(w http.ResponseWriter, r *http.Request) { http.Error(w, `{"error":"`+err.Error()+`"}`, 500) return } + + // 关键:立即触发 priority crawl(突破 workers 上限) + if s.crawler != nil { + s.crawler.TriggerPriorityCrawl(entry.URL) + } + json.NewEncoder(w).Encode(map[string]string{"status": "added", "url": entry.URL}) case http.MethodDelete: @@ -533,6 +552,24 @@ func (s *Server) handleAdminPriority(w http.ResponseWriter, r *http.Request) { } } +// handleAdminPriorityStatus 返回 Priority Worker 的实时状态。 +// GET: 返回 pending(待处理)、active(正在处理)、max_workers(独立上限) +func (s *Server) handleAdminPriorityStatus(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + if r.Method != http.MethodGet && r.Method != http.MethodOptions { + http.Error(w, `{"error":"method not allowed"}`, 405) + return + } + if r.Method == http.MethodOptions { + w.WriteHeader(204) + return + } + + json.NewEncoder(w).Encode(crawler.GlobalPriorityStatus()) +} + // handleAdminFlush 强制刷盘。 func (s *Server) handleAdminFlush(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") diff --git a/sese-engine-ui b/sese-engine-ui index 60e897f..2407ce0 160000 --- a/sese-engine-ui +++ b/sese-engine-ui @@ -1 +1 @@ -Subproject commit 60e897f110866903ab30d74eb16d8e61214aea47 +Subproject commit 2407ce0d05a81ac781968dd8f5fb7159ca361324