From 0e0cad1271a3bf188a7bad9000f48ce87e72ce89 Mon Sep 17 00:00:00 2001 From: admin <362324317@qq.com> Date: Sun, 17 May 2026 17:10:39 +0800 Subject: [PATCH] =?UTF-8?q?v0.3.20:=20=E6=AF=8F=E6=97=A5=E6=B1=87=E6=8A=A5?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=20=E2=80=94=20=E6=AF=8F=E5=A4=A98=E7=82=B9?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=94=B6=E9=9B=86=E5=89=8D=E4=B8=80=E6=97=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=B9=B6=E6=8E=A8=E9=80=81=E6=B1=87=E6=80=BB?= =?UTF-8?q?=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增: - src/services/daily-report.service.ts (核心服务: 数据收集/报告生成/格式化/调度器) - API: GET/PUT daily-report/config, GET daily-report/preview, POST daily-report/test, GET daily-report/last-run - 前端: 侧边栏"📊 每日汇报"菜单 + SystemConfig.vue 配置面板(时间/内容开关/预览/测试发送) - main.ts: 每60秒检查调度, 08:00-08:04 窗口内运行 报告内容: 搜索统计/转存统计(成功率)/各网盘容量和活跃状态/用户数 --- VERSION | 2 +- source_clean/VERSION | 2 +- ...BvLIjTGZ.js => AdminDashboard-CkHQl97R.js} | 2 +- .../dist-vite/assets/AdminLayout-DHRMhPUk.js | 1 - .../dist-vite/assets/AdminLayout-K9Kq5pc4.css | 1 + .../dist-vite/assets/AdminLayout-e6gnzMQk.css | 1 - .../dist-vite/assets/AdminLayout-qvvQgX9o.js | 1 + .../dist-vite/assets/AdminLogin-BFh47H6c.js} | 2 +- ...leanup-CwLcANun.js => Cleanup-BkDauFCX.js} | 2 +- ...dge-OZZzB6Zg.js => CloudBadge-CbpZHKLy.js} | 2 +- ...ig-BADbnuPV.js => CloudConfig-3znuBWUR.js} | 2 +- ...ePage--KOSYv1j.js => HomePage-CdqgUFQt.js} | 2 +- ...l-DdE8ZRMU.js => ResultDetail-BLqifyVI.js} | 2 +- ...ds-DLmXAM3V.js => SaveRecords-B5cCMWaP.js} | 2 +- ...t-DLXOMefi.js => SearchResult-EeENDml7.js} | 2 +- .../dist-vite/assets/SystemConfig-BbG7uBv0.js | 16 + .../dist-vite/assets/SystemConfig-C3is0eeI.js | 16 - .../assets/SystemConfig-C8bSCuHg.css | 1 + .../assets/SystemConfig-DFR5iJEB.css | 1 - .../{index-D279dJND.js => index-D_srC3bj.js} | 4 +- .../frontend-src/dist-vite/index.html | 2 +- .../src/pages/admin/AdminLayout.vue | 2 + .../src/pages/admin/SystemConfig.vue | 134 +++++++ ...BvLIjTGZ.js => AdminDashboard-CkHQl97R.js} | 2 +- .../frontend/assets/AdminLayout-DHRMhPUk.js | 1 - .../frontend/assets/AdminLayout-K9Kq5pc4.css | 1 + .../frontend/assets/AdminLayout-e6gnzMQk.css | 1 - .../frontend/assets/AdminLayout-qvvQgX9o.js | 1 + .../assets/AdminLogin-BFh47H6c.js} | 2 +- ...leanup-CwLcANun.js => Cleanup-BkDauFCX.js} | 2 +- ...dge-OZZzB6Zg.js => CloudBadge-CbpZHKLy.js} | 2 +- ...ig-BADbnuPV.js => CloudConfig-3znuBWUR.js} | 2 +- ...ePage--KOSYv1j.js => HomePage-CdqgUFQt.js} | 2 +- ...l-DdE8ZRMU.js => ResultDetail-BLqifyVI.js} | 2 +- ...ds-DLmXAM3V.js => SaveRecords-B5cCMWaP.js} | 2 +- ...t-DLXOMefi.js => SearchResult-EeENDml7.js} | 2 +- .../frontend/assets/SystemConfig-BbG7uBv0.js | 16 + .../frontend/assets/SystemConfig-C3is0eeI.js | 16 - .../frontend/assets/SystemConfig-C8bSCuHg.css | 1 + .../frontend/assets/SystemConfig-DFR5iJEB.css | 1 - .../{index-D279dJND.js => index-D_srC3bj.js} | 4 +- source_clean/frontend/index.html | 2 +- source_clean/src/main.ts | 17 + source_clean/src/routes/admin.routes.ts | 66 ++++ .../src/services/daily-report.service.ts | 339 ++++++++++++++++++ 45 files changed, 622 insertions(+), 64 deletions(-) rename source_clean/frontend-src/dist-vite/assets/{AdminDashboard-BvLIjTGZ.js => AdminDashboard-CkHQl97R.js} (99%) delete mode 100644 source_clean/frontend-src/dist-vite/assets/AdminLayout-DHRMhPUk.js create mode 100644 source_clean/frontend-src/dist-vite/assets/AdminLayout-K9Kq5pc4.css delete mode 100644 source_clean/frontend-src/dist-vite/assets/AdminLayout-e6gnzMQk.css create mode 100644 source_clean/frontend-src/dist-vite/assets/AdminLayout-qvvQgX9o.js rename source_clean/{frontend/assets/AdminLogin-DxE2POP4.js => frontend-src/dist-vite/assets/AdminLogin-BFh47H6c.js} (94%) rename source_clean/frontend-src/dist-vite/assets/{Cleanup-CwLcANun.js => Cleanup-BkDauFCX.js} (99%) rename source_clean/frontend-src/dist-vite/assets/{CloudBadge-OZZzB6Zg.js => CloudBadge-CbpZHKLy.js} (78%) rename source_clean/frontend-src/dist-vite/assets/{CloudConfig-BADbnuPV.js => CloudConfig-3znuBWUR.js} (99%) rename source_clean/frontend-src/dist-vite/assets/{HomePage--KOSYv1j.js => HomePage-CdqgUFQt.js} (98%) rename source_clean/frontend-src/dist-vite/assets/{ResultDetail-DdE8ZRMU.js => ResultDetail-BLqifyVI.js} (98%) rename source_clean/frontend-src/dist-vite/assets/{SaveRecords-DLmXAM3V.js => SaveRecords-B5cCMWaP.js} (99%) rename source_clean/frontend-src/dist-vite/assets/{SearchResult-DLXOMefi.js => SearchResult-EeENDml7.js} (99%) create mode 100644 source_clean/frontend-src/dist-vite/assets/SystemConfig-BbG7uBv0.js delete mode 100644 source_clean/frontend-src/dist-vite/assets/SystemConfig-C3is0eeI.js create mode 100644 source_clean/frontend-src/dist-vite/assets/SystemConfig-C8bSCuHg.css delete mode 100644 source_clean/frontend-src/dist-vite/assets/SystemConfig-DFR5iJEB.css rename source_clean/frontend-src/dist-vite/assets/{index-D279dJND.js => index-D_srC3bj.js} (99%) rename source_clean/frontend/assets/{AdminDashboard-BvLIjTGZ.js => AdminDashboard-CkHQl97R.js} (99%) delete mode 100644 source_clean/frontend/assets/AdminLayout-DHRMhPUk.js create mode 100644 source_clean/frontend/assets/AdminLayout-K9Kq5pc4.css delete mode 100644 source_clean/frontend/assets/AdminLayout-e6gnzMQk.css create mode 100644 source_clean/frontend/assets/AdminLayout-qvvQgX9o.js rename source_clean/{frontend-src/dist-vite/assets/AdminLogin-DxE2POP4.js => frontend/assets/AdminLogin-BFh47H6c.js} (94%) rename source_clean/frontend/assets/{Cleanup-CwLcANun.js => Cleanup-BkDauFCX.js} (99%) rename source_clean/frontend/assets/{CloudBadge-OZZzB6Zg.js => CloudBadge-CbpZHKLy.js} (78%) rename source_clean/frontend/assets/{CloudConfig-BADbnuPV.js => CloudConfig-3znuBWUR.js} (99%) rename source_clean/frontend/assets/{HomePage--KOSYv1j.js => HomePage-CdqgUFQt.js} (98%) rename source_clean/frontend/assets/{ResultDetail-DdE8ZRMU.js => ResultDetail-BLqifyVI.js} (98%) rename source_clean/frontend/assets/{SaveRecords-DLmXAM3V.js => SaveRecords-B5cCMWaP.js} (99%) rename source_clean/frontend/assets/{SearchResult-DLXOMefi.js => SearchResult-EeENDml7.js} (99%) create mode 100644 source_clean/frontend/assets/SystemConfig-BbG7uBv0.js delete mode 100644 source_clean/frontend/assets/SystemConfig-C3is0eeI.js create mode 100644 source_clean/frontend/assets/SystemConfig-C8bSCuHg.css delete mode 100644 source_clean/frontend/assets/SystemConfig-DFR5iJEB.css rename source_clean/frontend/assets/{index-D279dJND.js => index-D_srC3bj.js} (99%) create mode 100644 source_clean/src/services/daily-report.service.ts diff --git a/VERSION b/VERSION index 8355eaf..f9a4b5f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.3.18 +0.3.20 diff --git a/source_clean/VERSION b/source_clean/VERSION index 8355eaf..f9a4b5f 100644 --- a/source_clean/VERSION +++ b/source_clean/VERSION @@ -1 +1 @@ -0.3.18 +0.3.20 diff --git a/source_clean/frontend-src/dist-vite/assets/AdminDashboard-BvLIjTGZ.js b/source_clean/frontend-src/dist-vite/assets/AdminDashboard-CkHQl97R.js similarity index 99% rename from source_clean/frontend-src/dist-vite/assets/AdminDashboard-BvLIjTGZ.js rename to source_clean/frontend-src/dist-vite/assets/AdminDashboard-CkHQl97R.js index 56f4039..9f3cd2c 100644 --- a/source_clean/frontend-src/dist-vite/assets/AdminDashboard-BvLIjTGZ.js +++ b/source_clean/frontend-src/dist-vite/assets/AdminDashboard-CkHQl97R.js @@ -1,4 +1,4 @@ -import{x as qu,m as $_,h as Ce,B as Hg,d as q_,o as K_,a as Tt,c as Nt,K as ml,L as _l,b as Q,F as Vr,r as Gr,f as $t,w as qt,e as Oe,v as Ka,j as Hr,i as Q_,t as wt,n as Nc,y as Ei,l as zc,p as J_,E as j_,u as t1}from"./index-D279dJND.js";import{a as e1,h as r1,c as i1,i as n1,j as a1,t as o1,_ as s1}from"./_plugin-vue_export-helper-1Z-znrfZ.js";import l1 from"./CloudConfig-BADbnuPV.js";import u1 from"./SystemConfig-C3is0eeI.js";import f1 from"./SaveRecords-DLmXAM3V.js";import"./index-Bn7NwETH.js";import"./CloudBadge-OZZzB6Zg.js";/*! ***************************************************************************** +import{x as qu,m as $_,h as Ce,B as Hg,d as q_,o as K_,a as Tt,c as Nt,K as ml,L as _l,b as Q,F as Vr,r as Gr,f as $t,w as qt,e as Oe,v as Ka,j as Hr,i as Q_,t as wt,n as Nc,y as Ei,l as zc,p as J_,E as j_,u as t1}from"./index-D_srC3bj.js";import{a as e1,h as r1,c as i1,i as n1,j as a1,t as o1,_ as s1}from"./_plugin-vue_export-helper-1Z-znrfZ.js";import l1 from"./CloudConfig-3znuBWUR.js";import u1 from"./SystemConfig-BbG7uBv0.js";import f1 from"./SaveRecords-B5cCMWaP.js";import"./index-Bn7NwETH.js";import"./CloudBadge-CbpZHKLy.js";/*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any diff --git a/source_clean/frontend-src/dist-vite/assets/AdminLayout-DHRMhPUk.js b/source_clean/frontend-src/dist-vite/assets/AdminLayout-DHRMhPUk.js deleted file mode 100644 index f014134..0000000 --- a/source_clean/frontend-src/dist-vite/assets/AdminLayout-DHRMhPUk.js +++ /dev/null @@ -1 +0,0 @@ -import{d as B,o as N,a as V,c as I,b as n,t as c,f as e,w as t,h as g,v as y,j as i,k as r,C as M,l,D as T,G as j,H as q,I as z,J as A,u as D,z as H}from"./index-D279dJND.js";import{a as L,_ as R}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const E={class:"admin-layout"},G={class:"admin-sidebar"},J={class:"sidebar-brand"},W={class:"sidebar-brand-text"},F={class:"sidebar-version"},K={class:"admin-content"},O={class:"content-header"},P={class:"content-breadcrumb"},Q={class:"breadcrumb-current"},U={class:"content-actions"},X={class:"content-body"},Y=B({__name:"AdminLayout",setup(Z){const d=D(),f=H(),m=g(""),_=g(""),b={dashboard:"仪表盘","cloud-configs-toggle":"网盘设置及授权","cloud-configs-cleanup":"存储清理","sys-site":"网站设置","sys-services":"外部服务 & 缓存","sys-strategy":"性能配置","sys-password":"修改管理员密码","sys-notify":"消息推送","save-records":"转存日志"},p=y(()=>{const o=f.name;return o==="admin-cloud-configs"?"cloud-configs-toggle":o==="admin-cleanup"?"cloud-configs-cleanup":o==="admin-system"?f.query.section||"sys-site":o==="admin-save-records"?"save-records":"dashboard"}),x=y(()=>b[p.value]||"仪表盘");function w(o){o==="dashboard"?d.push("/admin/dashboard"):o==="cloud-configs-toggle"?d.push("/admin/cloud-configs"):o==="cloud-configs-cleanup"?d.push("/admin/cleanup"):o.startsWith("sys-")?d.push({path:"/admin/system",query:{section:o}}):o==="save-records"?d.push("/admin/save-records"):o==="logout"&&(localStorage.removeItem("admin_token"),d.push("/admin/login"))}function h(){d.push("/")}return N(async()=>{try{const o=await L();m.value=o.site_name||""}catch{}try{const s=await(await fetch("/health")).json();_.value=s.version}catch{}}),(o,s)=>{const u=i("el-icon"),a=i("el-menu-item"),v=i("el-sub-menu"),C=i("el-menu"),k=i("el-button"),S=i("router-view");return V(),I("div",E,[n("aside",G,[n("div",J,[s[1]||(s[1]=n("div",{class:"sidebar-logo"},"☁️",-1)),n("div",W,[n("h2",null,c(m.value||"CloudSearch"),1),s[0]||(s[0]=n("p",null,"管理控制台",-1))])]),e(C,{"default-active":p.value,class:"sidebar-menu",onSelect:w},{default:t(()=>[e(a,{index:"dashboard"},{default:t(()=>[e(u,null,{default:t(()=>[e(r(M))]),_:1}),s[2]||(s[2]=n("span",null,"仪表盘",-1))]),_:1}),e(v,{index:"cloud-configs"},{title:t(()=>[e(u,null,{default:t(()=>[e(r(T))]),_:1}),s[3]||(s[3]=n("span",null,"网盘管理",-1))]),default:t(()=>[e(a,{index:"cloud-configs-toggle"},{default:t(()=>[...s[4]||(s[4]=[l("📋 设置及授权",-1)])]),_:1}),e(a,{index:"cloud-configs-cleanup"},{default:t(()=>[...s[5]||(s[5]=[l("🧹 存储清理",-1)])]),_:1})]),_:1}),e(v,{index:"system"},{title:t(()=>[e(u,null,{default:t(()=>[e(r(j))]),_:1}),s[6]||(s[6]=n("span",null,"系统设置",-1))]),default:t(()=>[e(a,{index:"sys-site"},{default:t(()=>[...s[7]||(s[7]=[l("🌐 网站设置",-1)])]),_:1}),e(a,{index:"sys-services"},{default:t(()=>[...s[8]||(s[8]=[l("🔗 外部服务 & 缓存",-1)])]),_:1}),e(a,{index:"sys-strategy"},{default:t(()=>[...s[9]||(s[9]=[l("⚡ 性能配置",-1)])]),_:1}),e(a,{index:"sys-password"},{default:t(()=>[...s[10]||(s[10]=[l("🔑 修改密码",-1)])]),_:1}),e(a,{index:"sys-notify"},{default:t(()=>[...s[11]||(s[11]=[l("📬 消息推送",-1)])]),_:1})]),_:1}),e(a,{index:"save-records"},{default:t(()=>[e(u,null,{default:t(()=>[e(r(q))]),_:1}),s[12]||(s[12]=n("span",null,"转存日志",-1))]),_:1}),s[14]||(s[14]=n("div",{class:"sidebar-spacer"},null,-1)),n("div",F,"v"+c(_.value),1),e(a,{index:"logout"},{default:t(()=>[e(u,null,{default:t(()=>[e(r(z))]),_:1}),s[13]||(s[13]=n("span",null,"退出登录",-1))]),_:1})]),_:1},8,["default-active"])]),n("div",K,[n("header",O,[n("div",P,[n("span",Q,c(x.value),1)]),n("div",U,[e(k,{text:"",size:"small",onClick:h},{default:t(()=>[e(u,null,{default:t(()=>[e(r(A))]),_:1}),s[15]||(s[15]=l(" 返回前台 ",-1))]),_:1})])]),n("main",X,[e(S)])])])}}}),es=R(Y,[["__scopeId","data-v-29c9acc0"]]);export{es as default}; diff --git a/source_clean/frontend-src/dist-vite/assets/AdminLayout-K9Kq5pc4.css b/source_clean/frontend-src/dist-vite/assets/AdminLayout-K9Kq5pc4.css new file mode 100644 index 0000000..bfde3ca --- /dev/null +++ b/source_clean/frontend-src/dist-vite/assets/AdminLayout-K9Kq5pc4.css @@ -0,0 +1 @@ +.admin-layout[data-v-469751e8]{display:flex;height:100vh;background:var(--bg-page)}.admin-sidebar[data-v-469751e8]{width:var(--sidebar-w);flex-shrink:0;display:flex;flex-direction:column;background:linear-gradient(180deg,#111827,#1e293b);position:relative;z-index:10}.sidebar-brand[data-v-469751e8]{display:flex;align-items:center;gap:10px;padding:20px 20px 16px;border-bottom:1px solid rgba(255,255,255,.06)}.sidebar-logo[data-v-469751e8]{font-size:28px;line-height:1;flex-shrink:0}.sidebar-brand-text h2[data-v-469751e8]{font-size:16px;font-weight:700;margin:0;color:#fff;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar-brand-text p[data-v-469751e8]{font-size:11px;margin:2px 0 0;color:#ffffff73;letter-spacing:1px}.sidebar-menu[data-v-469751e8]{flex:1;display:flex;flex-direction:column;background:transparent!important;border-right:none!important;padding:4px 0}.sidebar-menu[data-v-469751e8] .el-menu-item,.sidebar-menu[data-v-469751e8] .el-sub-menu__title{color:#ffffffa6;height:44px;line-height:44px;transition:all .2s ease;margin:0 6px;border-radius:var(--radius-sm)}.sidebar-menu[data-v-469751e8] .el-menu-item:hover,.sidebar-menu[data-v-469751e8] .el-sub-menu__title:hover{background:#ffffff14;color:#ffffffe6}.sidebar-menu[data-v-469751e8] .el-menu-item.is-active{color:#fff;background:linear-gradient(90deg,#409eff40,#6366f126);font-weight:500}.sidebar-menu[data-v-469751e8] .el-menu-item:after{display:none}.sidebar-menu[data-v-469751e8] .el-sub-menu .el-menu{background:#0003!important}.sidebar-menu[data-v-469751e8] .el-sub-menu .el-menu .el-menu-item{padding-left:52px!important;font-size:13px;height:38px;line-height:38px}.sidebar-menu[data-v-469751e8] .el-icon{font-size:16px}.sidebar-spacer[data-v-469751e8]{flex:1}.sidebar-version[data-v-469751e8]{text-align:center;font-size:11px;color:#ffffff40;padding:8px 0;letter-spacing:.5px}.admin-content[data-v-469751e8]{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.content-header[data-v-469751e8]{display:flex;align-items:center;justify-content:space-between;padding:16px 28px;background:var(--bg-card);border-bottom:1px solid var(--border-light);flex-shrink:0}.content-breadcrumb[data-v-469751e8]{display:flex;align-items:center;gap:8px}.breadcrumb-current[data-v-469751e8]{font-size:18px;font-weight:700;color:var(--text)}.content-actions[data-v-469751e8] .el-button{color:var(--text-secondary);gap:4px}.content-body[data-v-469751e8]{flex:1;overflow-y:auto;padding:24px 28px}.content-body[data-v-469751e8] .save-bar{position:fixed;bottom:32px;right:32px;z-index:100;background:var(--bg-card);padding:12px 16px;border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:0 4px 16px #0000001f;display:flex;gap:10px;transition:box-shadow .2s,transform .2s}.content-body[data-v-469751e8] .save-bar:hover{box-shadow:0 6px 24px #0000002e;transform:translateY(-2px)} diff --git a/source_clean/frontend-src/dist-vite/assets/AdminLayout-e6gnzMQk.css b/source_clean/frontend-src/dist-vite/assets/AdminLayout-e6gnzMQk.css deleted file mode 100644 index 70729d5..0000000 --- a/source_clean/frontend-src/dist-vite/assets/AdminLayout-e6gnzMQk.css +++ /dev/null @@ -1 +0,0 @@ -.admin-layout[data-v-29c9acc0]{display:flex;height:100vh;background:var(--bg-page)}.admin-sidebar[data-v-29c9acc0]{width:var(--sidebar-w);flex-shrink:0;display:flex;flex-direction:column;background:linear-gradient(180deg,#111827,#1e293b);position:relative;z-index:10}.sidebar-brand[data-v-29c9acc0]{display:flex;align-items:center;gap:10px;padding:20px 20px 16px;border-bottom:1px solid rgba(255,255,255,.06)}.sidebar-logo[data-v-29c9acc0]{font-size:28px;line-height:1;flex-shrink:0}.sidebar-brand-text h2[data-v-29c9acc0]{font-size:16px;font-weight:700;margin:0;color:#fff;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar-brand-text p[data-v-29c9acc0]{font-size:11px;margin:2px 0 0;color:#ffffff73;letter-spacing:1px}.sidebar-menu[data-v-29c9acc0]{flex:1;display:flex;flex-direction:column;background:transparent!important;border-right:none!important;padding:4px 0}.sidebar-menu[data-v-29c9acc0] .el-menu-item,.sidebar-menu[data-v-29c9acc0] .el-sub-menu__title{color:#ffffffa6;height:44px;line-height:44px;transition:all .2s ease;margin:0 6px;border-radius:var(--radius-sm)}.sidebar-menu[data-v-29c9acc0] .el-menu-item:hover,.sidebar-menu[data-v-29c9acc0] .el-sub-menu__title:hover{background:#ffffff14;color:#ffffffe6}.sidebar-menu[data-v-29c9acc0] .el-menu-item.is-active{color:#fff;background:linear-gradient(90deg,#409eff40,#6366f126);font-weight:500}.sidebar-menu[data-v-29c9acc0] .el-menu-item:after{display:none}.sidebar-menu[data-v-29c9acc0] .el-sub-menu .el-menu{background:#0003!important}.sidebar-menu[data-v-29c9acc0] .el-sub-menu .el-menu .el-menu-item{padding-left:52px!important;font-size:13px;height:38px;line-height:38px}.sidebar-menu[data-v-29c9acc0] .el-icon{font-size:16px}.sidebar-spacer[data-v-29c9acc0]{flex:1}.sidebar-version[data-v-29c9acc0]{text-align:center;font-size:11px;color:#ffffff40;padding:8px 0;letter-spacing:.5px}.admin-content[data-v-29c9acc0]{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.content-header[data-v-29c9acc0]{display:flex;align-items:center;justify-content:space-between;padding:16px 28px;background:var(--bg-card);border-bottom:1px solid var(--border-light);flex-shrink:0}.content-breadcrumb[data-v-29c9acc0]{display:flex;align-items:center;gap:8px}.breadcrumb-current[data-v-29c9acc0]{font-size:18px;font-weight:700;color:var(--text)}.content-actions[data-v-29c9acc0] .el-button{color:var(--text-secondary);gap:4px}.content-body[data-v-29c9acc0]{flex:1;overflow-y:auto;padding:24px 28px}.content-body[data-v-29c9acc0] .save-bar{position:fixed;bottom:32px;right:32px;z-index:100;background:var(--bg-card);padding:12px 16px;border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:0 4px 16px #0000001f;display:flex;gap:10px;transition:box-shadow .2s,transform .2s}.content-body[data-v-29c9acc0] .save-bar:hover{box-shadow:0 6px 24px #0000002e;transform:translateY(-2px)} diff --git a/source_clean/frontend-src/dist-vite/assets/AdminLayout-qvvQgX9o.js b/source_clean/frontend-src/dist-vite/assets/AdminLayout-qvvQgX9o.js new file mode 100644 index 0000000..14de1b8 --- /dev/null +++ b/source_clean/frontend-src/dist-vite/assets/AdminLayout-qvvQgX9o.js @@ -0,0 +1 @@ +import{d as B,o as N,a as V,c as I,b as n,t as c,f as e,w as t,h as g,v as y,j as u,k as r,C as M,l,D as T,G as j,H as q,I as z,J as A,u as D,z as H}from"./index-D_srC3bj.js";import{a as L,_ as R}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const E={class:"admin-layout"},G={class:"admin-sidebar"},J={class:"sidebar-brand"},W={class:"sidebar-brand-text"},F={class:"sidebar-version"},K={class:"admin-content"},O={class:"content-header"},P={class:"content-breadcrumb"},Q={class:"breadcrumb-current"},U={class:"content-actions"},X={class:"content-body"},Y=B({__name:"AdminLayout",setup(Z){const d=D(),f=H(),m=g(""),_=g(""),b={dashboard:"仪表盘","cloud-configs-toggle":"网盘设置及授权","cloud-configs-cleanup":"存储清理","sys-site":"网站设置","sys-services":"外部服务 & 缓存","sys-strategy":"性能配置","sys-password":"修改管理员密码","sys-notify":"消息推送","sys-daily-report":"每日汇报","save-records":"转存日志"},p=y(()=>{const o=f.name;return o==="admin-cloud-configs"?"cloud-configs-toggle":o==="admin-cleanup"?"cloud-configs-cleanup":o==="admin-system"?f.query.section||"sys-site":o==="admin-save-records"?"save-records":"dashboard"}),x=y(()=>b[p.value]||"仪表盘");function w(o){o==="dashboard"?d.push("/admin/dashboard"):o==="cloud-configs-toggle"?d.push("/admin/cloud-configs"):o==="cloud-configs-cleanup"?d.push("/admin/cleanup"):o.startsWith("sys-")?d.push({path:"/admin/system",query:{section:o}}):o==="save-records"?d.push("/admin/save-records"):o==="logout"&&(localStorage.removeItem("admin_token"),d.push("/admin/login"))}function h(){d.push("/")}return N(async()=>{try{const o=await L();m.value=o.site_name||""}catch{}try{const s=await(await fetch("/health")).json();_.value=s.version}catch{}}),(o,s)=>{const i=u("el-icon"),a=u("el-menu-item"),v=u("el-sub-menu"),C=u("el-menu"),k=u("el-button"),S=u("router-view");return V(),I("div",E,[n("aside",G,[n("div",J,[s[1]||(s[1]=n("div",{class:"sidebar-logo"},"☁️",-1)),n("div",W,[n("h2",null,c(m.value||"CloudSearch"),1),s[0]||(s[0]=n("p",null,"管理控制台",-1))])]),e(C,{"default-active":p.value,class:"sidebar-menu",onSelect:w},{default:t(()=>[e(a,{index:"dashboard"},{default:t(()=>[e(i,null,{default:t(()=>[e(r(M))]),_:1}),s[2]||(s[2]=n("span",null,"仪表盘",-1))]),_:1}),e(v,{index:"cloud-configs"},{title:t(()=>[e(i,null,{default:t(()=>[e(r(T))]),_:1}),s[3]||(s[3]=n("span",null,"网盘管理",-1))]),default:t(()=>[e(a,{index:"cloud-configs-toggle"},{default:t(()=>[...s[4]||(s[4]=[l("📋 设置及授权",-1)])]),_:1}),e(a,{index:"cloud-configs-cleanup"},{default:t(()=>[...s[5]||(s[5]=[l("🧹 存储清理",-1)])]),_:1})]),_:1}),e(v,{index:"system"},{title:t(()=>[e(i,null,{default:t(()=>[e(r(j))]),_:1}),s[6]||(s[6]=n("span",null,"系统设置",-1))]),default:t(()=>[e(a,{index:"sys-site"},{default:t(()=>[...s[7]||(s[7]=[l("🌐 网站设置",-1)])]),_:1}),e(a,{index:"sys-services"},{default:t(()=>[...s[8]||(s[8]=[l("🔗 外部服务 & 缓存",-1)])]),_:1}),e(a,{index:"sys-strategy"},{default:t(()=>[...s[9]||(s[9]=[l("⚡ 性能配置",-1)])]),_:1}),e(a,{index:"sys-password"},{default:t(()=>[...s[10]||(s[10]=[l("🔑 修改密码",-1)])]),_:1}),e(a,{index:"sys-notify"},{default:t(()=>[...s[11]||(s[11]=[l("📬 消息推送",-1)])]),_:1}),e(a,{index:"sys-daily-report"},{default:t(()=>[...s[12]||(s[12]=[l("📊 每日汇报",-1)])]),_:1})]),_:1}),e(a,{index:"save-records"},{default:t(()=>[e(i,null,{default:t(()=>[e(r(q))]),_:1}),s[13]||(s[13]=n("span",null,"转存日志",-1))]),_:1}),s[15]||(s[15]=n("div",{class:"sidebar-spacer"},null,-1)),n("div",F,"v"+c(_.value),1),e(a,{index:"logout"},{default:t(()=>[e(i,null,{default:t(()=>[e(r(z))]),_:1}),s[14]||(s[14]=n("span",null,"退出登录",-1))]),_:1})]),_:1},8,["default-active"])]),n("div",K,[n("header",O,[n("div",P,[n("span",Q,c(x.value),1)]),n("div",U,[e(k,{text:"",size:"small",onClick:h},{default:t(()=>[e(i,null,{default:t(()=>[e(r(A))]),_:1}),s[16]||(s[16]=l(" 返回前台 ",-1))]),_:1})])]),n("main",X,[e(S)])])])}}}),es=R(Y,[["__scopeId","data-v-469751e8"]]);export{es as default}; diff --git a/source_clean/frontend/assets/AdminLogin-DxE2POP4.js b/source_clean/frontend-src/dist-vite/assets/AdminLogin-BFh47H6c.js similarity index 94% rename from source_clean/frontend/assets/AdminLogin-DxE2POP4.js rename to source_clean/frontend-src/dist-vite/assets/AdminLogin-BFh47H6c.js index b64c5cd..be11eae 100644 --- a/source_clean/frontend/assets/AdminLogin-DxE2POP4.js +++ b/source_clean/frontend-src/dist-vite/assets/AdminLogin-BFh47H6c.js @@ -1 +1 @@ -import{d as k,o as C,a as w,c as y,b as a,t as m,f as t,w as i,g as x,e as L,h as d,j as p,l as N,i as S,E as B}from"./index-D279dJND.js";import{a as E,d as M,_ as U}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const j={class:"admin-login-page"},q={class:"login-card"},A={class:"login-brand"},I={class:"login-title"},K={key:0,class:"error-msg"},R={class:"login-footer"},z=k({__name:"AdminLogin",setup(D){const f=d(),u=d(!1),c=d(""),g=d(""),v=d("");E().then(l=>{l.site_name&&(g.value=l.site_name)}).catch(()=>{});const s=S({username:"",password:""}),b={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]};async function h(){var e,r,n;if(await((e=f.value)==null?void 0:e.validate().catch(()=>!1))){u.value=!0,c.value="";try{const o=await M(s.username,s.password);localStorage.setItem("admin_token",o.token),B.success("登录成功"),window.location.href="/admin"}catch(o){c.value=((n=(r=o==null?void 0:o.response)==null?void 0:r.data)==null?void 0:n.message)||(o==null?void 0:o.message)||"登录失败"}finally{u.value=!1}}}return C(async()=>{try{const e=await(await fetch("/health")).json();v.value=e.version||""}catch{}}),(l,e)=>{const r=p("el-input"),n=p("el-form-item"),o=p("el-button"),V=p("el-form");return w(),y("div",j,[e[4]||(e[4]=a("div",{class:"login-bg-pattern"},null,-1)),a("div",q,[a("div",A,[e[2]||(e[2]=a("div",{class:"login-logo"},"☁️",-1)),a("h1",I,m(g.value||"CloudSearch"),1),e[3]||(e[3]=a("p",{class:"login-subtitle"},"管理后台",-1))]),t(V,{ref_key:"formRef",ref:f,model:s,rules:b,"label-width":"0",size:"large",onKeyup:x(h,["enter"])},{default:i(()=>[t(n,{prop:"username"},{default:i(()=>[t(r,{modelValue:s.username,"onUpdate:modelValue":e[0]||(e[0]=_=>s.username=_),placeholder:"用户名","prefix-icon":"User"},null,8,["modelValue"])]),_:1}),t(n,{prop:"password"},{default:i(()=>[t(r,{modelValue:s.password,"onUpdate:modelValue":e[1]||(e[1]=_=>s.password=_),type:"password",placeholder:"密码","prefix-icon":"Lock","show-password":""},null,8,["modelValue"])]),_:1}),t(n,null,{default:i(()=>[t(o,{type:"primary",loading:u.value,class:"login-btn",onClick:h},{default:i(()=>[N(m(u.value?"登录中...":"登 录"),1)]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"]),c.value?(w(),y("p",K,m(c.value),1)):L("",!0),a("p",R,"CloudSearch v"+m(v.value),1)])])}}}),G=U(z,[["__scopeId","data-v-bd0b6672"]]);export{G as default}; +import{d as k,o as C,a as w,c as y,b as a,t as m,f as t,w as i,g as x,e as L,h as d,j as p,l as N,i as S,E as B}from"./index-D_srC3bj.js";import{a as E,d as M,_ as U}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const j={class:"admin-login-page"},q={class:"login-card"},A={class:"login-brand"},I={class:"login-title"},K={key:0,class:"error-msg"},R={class:"login-footer"},z=k({__name:"AdminLogin",setup(D){const f=d(),u=d(!1),c=d(""),g=d(""),v=d("");E().then(l=>{l.site_name&&(g.value=l.site_name)}).catch(()=>{});const s=S({username:"",password:""}),b={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]};async function h(){var e,r,n;if(await((e=f.value)==null?void 0:e.validate().catch(()=>!1))){u.value=!0,c.value="";try{const o=await M(s.username,s.password);localStorage.setItem("admin_token",o.token),B.success("登录成功"),window.location.href="/admin"}catch(o){c.value=((n=(r=o==null?void 0:o.response)==null?void 0:r.data)==null?void 0:n.message)||(o==null?void 0:o.message)||"登录失败"}finally{u.value=!1}}}return C(async()=>{try{const e=await(await fetch("/health")).json();v.value=e.version||""}catch{}}),(l,e)=>{const r=p("el-input"),n=p("el-form-item"),o=p("el-button"),V=p("el-form");return w(),y("div",j,[e[4]||(e[4]=a("div",{class:"login-bg-pattern"},null,-1)),a("div",q,[a("div",A,[e[2]||(e[2]=a("div",{class:"login-logo"},"☁️",-1)),a("h1",I,m(g.value||"CloudSearch"),1),e[3]||(e[3]=a("p",{class:"login-subtitle"},"管理后台",-1))]),t(V,{ref_key:"formRef",ref:f,model:s,rules:b,"label-width":"0",size:"large",onKeyup:x(h,["enter"])},{default:i(()=>[t(n,{prop:"username"},{default:i(()=>[t(r,{modelValue:s.username,"onUpdate:modelValue":e[0]||(e[0]=_=>s.username=_),placeholder:"用户名","prefix-icon":"User"},null,8,["modelValue"])]),_:1}),t(n,{prop:"password"},{default:i(()=>[t(r,{modelValue:s.password,"onUpdate:modelValue":e[1]||(e[1]=_=>s.password=_),type:"password",placeholder:"密码","prefix-icon":"Lock","show-password":""},null,8,["modelValue"])]),_:1}),t(n,null,{default:i(()=>[t(o,{type:"primary",loading:u.value,class:"login-btn",onClick:h},{default:i(()=>[N(m(u.value?"登录中...":"登 录"),1)]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"]),c.value?(w(),y("p",K,m(c.value),1)):L("",!0),a("p",R,"CloudSearch v"+m(v.value),1)])])}}}),G=U(z,[["__scopeId","data-v-bd0b6672"]]);export{G as default}; diff --git a/source_clean/frontend-src/dist-vite/assets/Cleanup-CwLcANun.js b/source_clean/frontend-src/dist-vite/assets/Cleanup-BkDauFCX.js similarity index 99% rename from source_clean/frontend-src/dist-vite/assets/Cleanup-CwLcANun.js rename to source_clean/frontend-src/dist-vite/assets/Cleanup-BkDauFCX.js index 34744fd..2c5d2e7 100644 --- a/source_clean/frontend-src/dist-vite/assets/Cleanup-CwLcANun.js +++ b/source_clean/frontend-src/dist-vite/assets/Cleanup-BkDauFCX.js @@ -1 +1 @@ -import{d as X,o as Y,a as _,c as f,f as a,w as u,j as p,i as Z,b as t,F as ee,r as le,y as N,l as m,t as v,e as g,g as ae,h as y,v as r,E as d}from"./index-D279dJND.js";import{k as te,p as se,r as ne,v as oe,_ as ue}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const ie={class:"cleanup-section"},re={class:"cleanup-grid"},pe={class:"cleanup-group"},de={style:{display:"flex","align-items":"center",gap:"10px","flex-wrap":"wrap"}},ce={style:{display:"flex","align-items":"center",gap:"10px"}},_e={style:{width:"100%"}},me={key:0,style:{display:"flex",gap:"6px","flex-wrap":"wrap","margin-bottom":"6px"}},fe={style:{display:"flex",gap:"6px"}},ve={class:"cleanup-group"},ge={style:{display:"flex","align-items":"center",gap:"8px"}},ye={style:{display:"flex","align-items":"center",gap:"8px"}},he={style:{display:"flex","align-items":"center",gap:"8px"}},be={style:{display:"flex","align-items":"center",gap:"8px"}},xe={class:"cleanup-group"},we={class:"cleanup-group"},Ve={class:"cleanup-actions"},Ce={class:"cleanup-actions-buttons"},Se={key:0,class:"cleanup-info"},ke={key:0,style:{"margin-left":"12px"}},ze=X({__name:"Cleanup",setup(Ne){const s=Z({}),h=y(!1),b=y(!1),z=y(!1),D=r(()=>String(s.cleanup_last_run||"")),T=r(()=>{const l=String(s.cleanup_last_stats||"");if(!l)return"";try{const e=JSON.parse(l),n=[];return e.filesTrashed>0&&n.push(`移入回收站 ${e.filesTrashed} 个文件夹`),e.logsDeleted>0&&n.push(`删除 ${e.logsDeleted} 条日志`),e.trashEmptied&&n.push("已清空回收站"),e.errors>0&&n.push(`⚠️ ${e.errors} 个错误`),n.join(" / ")||"无操作"}catch{return""}}),U=r({get:()=>String(s.cleanup_enabled)==="true",set:l=>{s.cleanup_enabled=l?"true":"false"}}),E=r({get:()=>String(s.cleanup_empty_trash)!=="false",set:l=>{s.cleanup_empty_trash=l?"true":"false"}}),R=r({get:()=>Number(s.cleanup_file_retention_days??7),set:l=>{s.cleanup_file_retention_days=l}}),B=r({get:()=>Number(s.cleanup_log_retention_days??30),set:l=>{s.cleanup_log_retention_days=l}}),x=r({get:()=>String(s.cleanup_space_threshold_enabled)==="true",set:l=>{s.cleanup_space_threshold_enabled=l?"true":"false"}}),M=r({get:()=>Number(s.cleanup_space_threshold_percent??90),set:l=>{s.cleanup_space_threshold_percent=l}}),W=r({get:()=>Number(s.cleanup_space_threshold_delete_percent??10),set:l=>{s.cleanup_space_threshold_delete_percent=l}}),$=r({get:()=>String(s.save_reuse_enabled)!=="false",set:l=>{s.save_reuse_enabled=l?"true":"false"}}),c=y([]),w=y("");function L(){try{const l=String(s.cleanup_whitelist_dirs||"[]");c.value=JSON.parse(l)}catch{c.value=[]}}function F(){const l=w.value.trim();if(l){if(c.value.includes(l)){d.warning("该目录已在白名单中");return}c.value.push(l),w.value=""}}function P(l){c.value.splice(l,1)}const I=r({get:()=>Number(s.cleanup_verify_interval??30),set:l=>{s.cleanup_verify_interval=l}}),J=r({get:()=>Number(s.storage_refresh_interval??180),set:l=>{s.storage_refresh_interval=l}});async function O(){try{const l=await te();for(const e of l)s[e.key]=e.value;L()}catch(l){console.error("加载清理配置失败",l)}}async function A(){var l,e;z.value=!0;try{const i=["cleanup_enabled","cleanup_file_retention_days","cleanup_log_retention_days","cleanup_empty_trash","cleanup_space_threshold_enabled","cleanup_space_threshold_percent","cleanup_space_threshold_delete_percent","save_reuse_enabled","cleanup_verify_interval","storage_refresh_interval"].map(V=>({key:V,value:String(s[V]??"")}));i.push({key:"cleanup_whitelist_dirs",value:JSON.stringify(c.value)}),await se(i),d.success("清理配置已保存")}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"保存失败")}finally{z.value=!1}}async function q(){var l,e;h.value=!0;try{const n=await ne();n.success?d.success(n.message):d.warning(n.message),await O()}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"清理失败")}finally{h.value=!1}}async function G(){var l,e;b.value=!0;try{const n=await oe();n.success?d.success(n.message):d.warning(n.message)}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"清空回收站失败")}finally{b.value=!1}}return Y(()=>{O()}),(l,e)=>{const n=p("el-switch"),i=p("el-form-item"),V=p("el-tag"),H=p("el-input"),C=p("el-button"),S=p("el-form"),k=p("el-input-number"),j=p("el-slider"),Q=p("el-card");return _(),f("div",ie,[a(Q,{class:"config-card"},{header:u(()=>[...e[11]||(e[11]=[t("span",null,"🧹 存储清理",-1)])]),default:u(()=>[t("div",re,[t("div",pe,[e[15]||(e[15]=t("div",{class:"cleanup-group-label"},"⏱ 基础清理策略",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"自动清理"},{default:u(()=>[t("div",de,[a(n,{modelValue:U.value,"onUpdate:modelValue":e[0]||(e[0]=o=>U.value=o),size:"small"},null,8,["modelValue"]),e[12]||(e[12]=t("span",{class:"cleanup-hint"},"每天自动检查一次,删除过期日志、移入回收站文件",-1))])]),_:1}),a(i,{label:"清空回收站"},{default:u(()=>[t("div",ce,[a(n,{modelValue:E.value,"onUpdate:modelValue":e[1]||(e[1]=o=>E.value=o),size:"small"},null,8,["modelValue"]),e[13]||(e[13]=t("span",{class:"cleanup-hint"},"清理时一并清空各网盘回收站",-1))])]),_:1}),a(i,{label:"白名单目录"},{default:u(()=>[t("div",_e,[c.value.length?(_(),f("div",me,[(_(!0),f(ee,null,le(c.value,(o,K)=>(_(),N(V,{key:K,closable:"",size:"small",onClose:De=>P(K)},{default:u(()=>[m(v(o),1)]),_:2},1032,["onClose"]))),128))])):g("",!0),t("div",fe,[a(H,{modelValue:w.value,"onUpdate:modelValue":e[2]||(e[2]=o=>w.value=o),placeholder:"输入目录名",size:"small",style:{width:"160px"},onKeyup:ae(F,["enter"])},null,8,["modelValue"]),a(C,{type:"primary",size:"small",onClick:F},{default:u(()=>[...e[14]||(e[14]=[m("添加",-1)])]),_:1})])])]),_:1})]),_:1})]),t("div",ve,[e[20]||(e[20]=t("div",{class:"cleanup-group-label"},"📦 保留设置",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"文件保留"},{default:u(()=>[t("div",ge,[a(k,{modelValue:R.value,"onUpdate:modelValue":e[3]||(e[3]=o=>R.value=o),min:1,max:365,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[16]||(e[16]=t("span",null,"天",-1))])]),_:1}),a(i,{label:"日志保留"},{default:u(()=>[t("div",ye,[a(k,{modelValue:B.value,"onUpdate:modelValue":e[4]||(e[4]=o=>B.value=o),min:1,max:365,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[17]||(e[17]=t("span",null,"天",-1))])]),_:1}),a(i,{label:"Cookie检测"},{default:u(()=>[t("div",he,[a(k,{modelValue:I.value,"onUpdate:modelValue":e[5]||(e[5]=o=>I.value=o),min:5,max:1440,step:5,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[18]||(e[18]=t("span",null,"分钟",-1))])]),_:1}),a(i,{label:"空间校准"},{default:u(()=>[t("div",be,[a(k,{modelValue:J.value,"onUpdate:modelValue":e[6]||(e[6]=o=>J.value=o),min:5,max:1440,step:5,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[19]||(e[19]=t("span",null,"分钟",-1))])]),_:1})]),_:1})]),t("div",xe,[e[22]||(e[22]=t("div",{class:"cleanup-group-label"},"📊 空间阈值自动清理",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"启用"},{default:u(()=>[a(n,{modelValue:x.value,"onUpdate:modelValue":e[7]||(e[7]=o=>x.value=o),size:"small"},null,8,["modelValue"]),e[21]||(e[21]=t("span",{class:"cleanup-hint",style:{"margin-left":"8px"}},"已用空间超过阈值时,按比例删除最旧的转存文件",-1))]),_:1}),x.value?(_(),N(i,{key:0,label:"使用阈值"},{default:u(()=>[a(j,{modelValue:M.value,"onUpdate:modelValue":e[8]||(e[8]=o=>M.value=o),min:50,max:99,style:{width:"140px"},"show-input":"",size:"small"},null,8,["modelValue"])]),_:1})):g("",!0),x.value?(_(),N(i,{key:1,label:"删除比例"},{default:u(()=>[a(j,{modelValue:W.value,"onUpdate:modelValue":e[9]||(e[9]=o=>W.value=o),min:5,max:50,step:5,style:{width:"140px"},"show-input":"",size:"small"},null,8,["modelValue"])]),_:1})):g("",!0)]),_:1})]),t("div",we,[e[24]||(e[24]=t("div",{class:"cleanup-group-label"},"🔗 分享链接复用",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"复用"},{default:u(()=>[a(n,{modelValue:$.value,"onUpdate:modelValue":e[10]||(e[10]=o=>$.value=o),size:"small"},null,8,["modelValue"]),e[23]||(e[23]=t("span",{class:"cleanup-hint",style:{"margin-left":"8px"}},"相同原始链接不再重复转存,复用已有分享链接(会自动验证原链接有效性;60秒内重复请求直接返回已有链接)",-1))]),_:1})]),_:1})])]),t("div",Ve,[t("div",Ce,[a(C,{type:"primary",loading:z.value,onClick:A},{default:u(()=>[...e[25]||(e[25]=[m("💾 保存清理配置",-1)])]),_:1},8,["loading"]),a(C,{type:"danger",loading:h.value,onClick:q},{default:u(()=>[m(v(h.value?"清理中...":"🗑️ 立即清理"),1)]),_:1},8,["loading"]),a(C,{type:"warning",loading:b.value,onClick:G},{default:u(()=>[m(v(b.value?"清空中...":"🧹 清空回收站"),1)]),_:1},8,["loading"])]),D.value?(_(),f("div",Se,[m(" ⏰ 上次清理:"+v(D.value)+" ",1),T.value?(_(),f("span",ke,"📊 "+v(T.value),1)):g("",!0)])):g("",!0)])]),_:1})])}}}),Ee=ue(ze,[["__scopeId","data-v-dfd5abc7"]]);export{Ee as default}; +import{d as X,o as Y,a as _,c as f,f as a,w as u,j as p,i as Z,b as t,F as ee,r as le,y as N,l as m,t as v,e as g,g as ae,h as y,v as r,E as d}from"./index-D_srC3bj.js";import{k as te,p as se,r as ne,v as oe,_ as ue}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const ie={class:"cleanup-section"},re={class:"cleanup-grid"},pe={class:"cleanup-group"},de={style:{display:"flex","align-items":"center",gap:"10px","flex-wrap":"wrap"}},ce={style:{display:"flex","align-items":"center",gap:"10px"}},_e={style:{width:"100%"}},me={key:0,style:{display:"flex",gap:"6px","flex-wrap":"wrap","margin-bottom":"6px"}},fe={style:{display:"flex",gap:"6px"}},ve={class:"cleanup-group"},ge={style:{display:"flex","align-items":"center",gap:"8px"}},ye={style:{display:"flex","align-items":"center",gap:"8px"}},he={style:{display:"flex","align-items":"center",gap:"8px"}},be={style:{display:"flex","align-items":"center",gap:"8px"}},xe={class:"cleanup-group"},we={class:"cleanup-group"},Ve={class:"cleanup-actions"},Ce={class:"cleanup-actions-buttons"},Se={key:0,class:"cleanup-info"},ke={key:0,style:{"margin-left":"12px"}},ze=X({__name:"Cleanup",setup(Ne){const s=Z({}),h=y(!1),b=y(!1),z=y(!1),D=r(()=>String(s.cleanup_last_run||"")),T=r(()=>{const l=String(s.cleanup_last_stats||"");if(!l)return"";try{const e=JSON.parse(l),n=[];return e.filesTrashed>0&&n.push(`移入回收站 ${e.filesTrashed} 个文件夹`),e.logsDeleted>0&&n.push(`删除 ${e.logsDeleted} 条日志`),e.trashEmptied&&n.push("已清空回收站"),e.errors>0&&n.push(`⚠️ ${e.errors} 个错误`),n.join(" / ")||"无操作"}catch{return""}}),U=r({get:()=>String(s.cleanup_enabled)==="true",set:l=>{s.cleanup_enabled=l?"true":"false"}}),E=r({get:()=>String(s.cleanup_empty_trash)!=="false",set:l=>{s.cleanup_empty_trash=l?"true":"false"}}),R=r({get:()=>Number(s.cleanup_file_retention_days??7),set:l=>{s.cleanup_file_retention_days=l}}),B=r({get:()=>Number(s.cleanup_log_retention_days??30),set:l=>{s.cleanup_log_retention_days=l}}),x=r({get:()=>String(s.cleanup_space_threshold_enabled)==="true",set:l=>{s.cleanup_space_threshold_enabled=l?"true":"false"}}),M=r({get:()=>Number(s.cleanup_space_threshold_percent??90),set:l=>{s.cleanup_space_threshold_percent=l}}),W=r({get:()=>Number(s.cleanup_space_threshold_delete_percent??10),set:l=>{s.cleanup_space_threshold_delete_percent=l}}),$=r({get:()=>String(s.save_reuse_enabled)!=="false",set:l=>{s.save_reuse_enabled=l?"true":"false"}}),c=y([]),w=y("");function L(){try{const l=String(s.cleanup_whitelist_dirs||"[]");c.value=JSON.parse(l)}catch{c.value=[]}}function F(){const l=w.value.trim();if(l){if(c.value.includes(l)){d.warning("该目录已在白名单中");return}c.value.push(l),w.value=""}}function P(l){c.value.splice(l,1)}const I=r({get:()=>Number(s.cleanup_verify_interval??30),set:l=>{s.cleanup_verify_interval=l}}),J=r({get:()=>Number(s.storage_refresh_interval??180),set:l=>{s.storage_refresh_interval=l}});async function O(){try{const l=await te();for(const e of l)s[e.key]=e.value;L()}catch(l){console.error("加载清理配置失败",l)}}async function A(){var l,e;z.value=!0;try{const i=["cleanup_enabled","cleanup_file_retention_days","cleanup_log_retention_days","cleanup_empty_trash","cleanup_space_threshold_enabled","cleanup_space_threshold_percent","cleanup_space_threshold_delete_percent","save_reuse_enabled","cleanup_verify_interval","storage_refresh_interval"].map(V=>({key:V,value:String(s[V]??"")}));i.push({key:"cleanup_whitelist_dirs",value:JSON.stringify(c.value)}),await se(i),d.success("清理配置已保存")}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"保存失败")}finally{z.value=!1}}async function q(){var l,e;h.value=!0;try{const n=await ne();n.success?d.success(n.message):d.warning(n.message),await O()}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"清理失败")}finally{h.value=!1}}async function G(){var l,e;b.value=!0;try{const n=await oe();n.success?d.success(n.message):d.warning(n.message)}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"清空回收站失败")}finally{b.value=!1}}return Y(()=>{O()}),(l,e)=>{const n=p("el-switch"),i=p("el-form-item"),V=p("el-tag"),H=p("el-input"),C=p("el-button"),S=p("el-form"),k=p("el-input-number"),j=p("el-slider"),Q=p("el-card");return _(),f("div",ie,[a(Q,{class:"config-card"},{header:u(()=>[...e[11]||(e[11]=[t("span",null,"🧹 存储清理",-1)])]),default:u(()=>[t("div",re,[t("div",pe,[e[15]||(e[15]=t("div",{class:"cleanup-group-label"},"⏱ 基础清理策略",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"自动清理"},{default:u(()=>[t("div",de,[a(n,{modelValue:U.value,"onUpdate:modelValue":e[0]||(e[0]=o=>U.value=o),size:"small"},null,8,["modelValue"]),e[12]||(e[12]=t("span",{class:"cleanup-hint"},"每天自动检查一次,删除过期日志、移入回收站文件",-1))])]),_:1}),a(i,{label:"清空回收站"},{default:u(()=>[t("div",ce,[a(n,{modelValue:E.value,"onUpdate:modelValue":e[1]||(e[1]=o=>E.value=o),size:"small"},null,8,["modelValue"]),e[13]||(e[13]=t("span",{class:"cleanup-hint"},"清理时一并清空各网盘回收站",-1))])]),_:1}),a(i,{label:"白名单目录"},{default:u(()=>[t("div",_e,[c.value.length?(_(),f("div",me,[(_(!0),f(ee,null,le(c.value,(o,K)=>(_(),N(V,{key:K,closable:"",size:"small",onClose:De=>P(K)},{default:u(()=>[m(v(o),1)]),_:2},1032,["onClose"]))),128))])):g("",!0),t("div",fe,[a(H,{modelValue:w.value,"onUpdate:modelValue":e[2]||(e[2]=o=>w.value=o),placeholder:"输入目录名",size:"small",style:{width:"160px"},onKeyup:ae(F,["enter"])},null,8,["modelValue"]),a(C,{type:"primary",size:"small",onClick:F},{default:u(()=>[...e[14]||(e[14]=[m("添加",-1)])]),_:1})])])]),_:1})]),_:1})]),t("div",ve,[e[20]||(e[20]=t("div",{class:"cleanup-group-label"},"📦 保留设置",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"文件保留"},{default:u(()=>[t("div",ge,[a(k,{modelValue:R.value,"onUpdate:modelValue":e[3]||(e[3]=o=>R.value=o),min:1,max:365,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[16]||(e[16]=t("span",null,"天",-1))])]),_:1}),a(i,{label:"日志保留"},{default:u(()=>[t("div",ye,[a(k,{modelValue:B.value,"onUpdate:modelValue":e[4]||(e[4]=o=>B.value=o),min:1,max:365,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[17]||(e[17]=t("span",null,"天",-1))])]),_:1}),a(i,{label:"Cookie检测"},{default:u(()=>[t("div",he,[a(k,{modelValue:I.value,"onUpdate:modelValue":e[5]||(e[5]=o=>I.value=o),min:5,max:1440,step:5,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[18]||(e[18]=t("span",null,"分钟",-1))])]),_:1}),a(i,{label:"空间校准"},{default:u(()=>[t("div",be,[a(k,{modelValue:J.value,"onUpdate:modelValue":e[6]||(e[6]=o=>J.value=o),min:5,max:1440,step:5,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[19]||(e[19]=t("span",null,"分钟",-1))])]),_:1})]),_:1})]),t("div",xe,[e[22]||(e[22]=t("div",{class:"cleanup-group-label"},"📊 空间阈值自动清理",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"启用"},{default:u(()=>[a(n,{modelValue:x.value,"onUpdate:modelValue":e[7]||(e[7]=o=>x.value=o),size:"small"},null,8,["modelValue"]),e[21]||(e[21]=t("span",{class:"cleanup-hint",style:{"margin-left":"8px"}},"已用空间超过阈值时,按比例删除最旧的转存文件",-1))]),_:1}),x.value?(_(),N(i,{key:0,label:"使用阈值"},{default:u(()=>[a(j,{modelValue:M.value,"onUpdate:modelValue":e[8]||(e[8]=o=>M.value=o),min:50,max:99,style:{width:"140px"},"show-input":"",size:"small"},null,8,["modelValue"])]),_:1})):g("",!0),x.value?(_(),N(i,{key:1,label:"删除比例"},{default:u(()=>[a(j,{modelValue:W.value,"onUpdate:modelValue":e[9]||(e[9]=o=>W.value=o),min:5,max:50,step:5,style:{width:"140px"},"show-input":"",size:"small"},null,8,["modelValue"])]),_:1})):g("",!0)]),_:1})]),t("div",we,[e[24]||(e[24]=t("div",{class:"cleanup-group-label"},"🔗 分享链接复用",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"复用"},{default:u(()=>[a(n,{modelValue:$.value,"onUpdate:modelValue":e[10]||(e[10]=o=>$.value=o),size:"small"},null,8,["modelValue"]),e[23]||(e[23]=t("span",{class:"cleanup-hint",style:{"margin-left":"8px"}},"相同原始链接不再重复转存,复用已有分享链接(会自动验证原链接有效性;60秒内重复请求直接返回已有链接)",-1))]),_:1})]),_:1})])]),t("div",Ve,[t("div",Ce,[a(C,{type:"primary",loading:z.value,onClick:A},{default:u(()=>[...e[25]||(e[25]=[m("💾 保存清理配置",-1)])]),_:1},8,["loading"]),a(C,{type:"danger",loading:h.value,onClick:q},{default:u(()=>[m(v(h.value?"清理中...":"🗑️ 立即清理"),1)]),_:1},8,["loading"]),a(C,{type:"warning",loading:b.value,onClick:G},{default:u(()=>[m(v(b.value?"清空中...":"🧹 清空回收站"),1)]),_:1},8,["loading"])]),D.value?(_(),f("div",Se,[m(" ⏰ 上次清理:"+v(D.value)+" ",1),T.value?(_(),f("span",ke,"📊 "+v(T.value),1)):g("",!0)])):g("",!0)])]),_:1})])}}}),Ee=ue(ze,[["__scopeId","data-v-dfd5abc7"]]);export{Ee as default}; diff --git a/source_clean/frontend-src/dist-vite/assets/CloudBadge-OZZzB6Zg.js b/source_clean/frontend-src/dist-vite/assets/CloudBadge-CbpZHKLy.js similarity index 78% rename from source_clean/frontend-src/dist-vite/assets/CloudBadge-OZZzB6Zg.js rename to source_clean/frontend-src/dist-vite/assets/CloudBadge-CbpZHKLy.js index 165c35f..556a21a 100644 --- a/source_clean/frontend-src/dist-vite/assets/CloudBadge-OZZzB6Zg.js +++ b/source_clean/frontend-src/dist-vite/assets/CloudBadge-CbpZHKLy.js @@ -1 +1 @@ -import{C as s,b as a,a as n}from"./index-Bn7NwETH.js";import{d as l,a as t,c,p as d,k as o,e as r,l as u,t as m}from"./index-D279dJND.js";import{_}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const p=["src"],i=l({__name:"CloudBadge",props:{cloud_type:{},showIcon:{type:Boolean}},setup(e){return(C,y)=>(t(),c("span",{class:"cloud-badge",style:d({background:o(s)[e.cloud_type]})},[e.showIcon&&o(a)[e.cloud_type]?(t(),c("img",{key:0,src:o(a)[e.cloud_type],class:"badge-icon"},null,8,p)):r("",!0),u(" "+m(o(n)[e.cloud_type]),1)],4))}}),L=_(i,[["__scopeId","data-v-9106805f"]]);export{L as C}; +import{C as s,b as a,a as n}from"./index-Bn7NwETH.js";import{d as l,a as t,c,p as d,k as o,e as r,l as u,t as m}from"./index-D_srC3bj.js";import{_}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const p=["src"],i=l({__name:"CloudBadge",props:{cloud_type:{},showIcon:{type:Boolean}},setup(e){return(C,y)=>(t(),c("span",{class:"cloud-badge",style:d({background:o(s)[e.cloud_type]})},[e.showIcon&&o(a)[e.cloud_type]?(t(),c("img",{key:0,src:o(a)[e.cloud_type],class:"badge-icon"},null,8,p)):r("",!0),u(" "+m(o(n)[e.cloud_type]),1)],4))}}),L=_(i,[["__scopeId","data-v-9106805f"]]);export{L as C}; diff --git a/source_clean/frontend-src/dist-vite/assets/CloudConfig-BADbnuPV.js b/source_clean/frontend-src/dist-vite/assets/CloudConfig-3znuBWUR.js similarity index 99% rename from source_clean/frontend-src/dist-vite/assets/CloudConfig-BADbnuPV.js rename to source_clean/frontend-src/dist-vite/assets/CloudConfig-3znuBWUR.js index e3eeb94..d85e47e 100644 --- a/source_clean/frontend-src/dist-vite/assets/CloudConfig-BADbnuPV.js +++ b/source_clean/frontend-src/dist-vite/assets/CloudConfig-3znuBWUR.js @@ -1,4 +1,4 @@ -import{d as ke,o as L,m as ve,E as _,a as c,c as k,f as n,w as a,b as r,h as C,j as p,i as be,F as R,r as K,t as v,y as g,l as d,e as A,k as Ce,M as he,p as xe,n as H,K as Be,L as Te,v as h}from"./index-D279dJND.js";import{a as x}from"./index-Bn7NwETH.js";import{c as we,k as Fe,h as Ne,l as G,t as Ve,u as P,m as ze,n as Se,o as $e,_ as Ue}from"./_plugin-vue_export-helper-1Z-znrfZ.js";import{C as De}from"./CloudBadge-OZZzB6Zg.js";const Ie={class:"cloud-config"},Me={class:"cloud-toggle-grid"},Oe=["src"],qe={class:"cloud-label"},Ee={class:"toolbar"},Le={key:0,class:"nickname-text"},Re={key:0,class:"promotion-text"},Ke={key:0,class:"uid-cell"},Ae={key:0,class:"verifying"},He={key:0,class:"storage-cell"},Ge={class:"storage-bar-wrap"},Pe={class:"storage-text"},je={class:"storage-used"},Je={class:"storage-total"},Qe={class:"storage-free"},We={key:0,class:"save-count"},Xe={style:{"line-height":"1.6"}},Ye={class:"cookie-tips-header"},Ze={class:"cookie-tips-title"},et=["innerHTML"],tt=ke({__name:"CloudConfig",setup(ot){const z=C([]),D=C(),F=C([]),B=C(!1),T=C(!1),b=C(null),l=be({cloud_type:"",nickname:"",promotion_account:"",is_transfer_enabled:!1,cookie:"",_verifying:!1,_storageUsed:"",_storageTotal:""}),j=h(()=>({cloud_type:[{required:!0,message:"请选择网盘类型",trigger:"change"}],nickname:[{required:!1,message:"请填写昵称(区分多个同类型网盘)",trigger:"blur"}],promotion_account:[{required:!0,message:"请填写推广平台及账号",trigger:"blur"}]})),J=h(()=>Object.entries(x)),Q=h(()=>{if(!l.cloud_type)return"请先选择网盘类型";const t=l.cloud_type;return t==="quark"||t==="baidu"?`请输入 ${x[t]||t} 的完整 Cookie`:b.value?"留空则保持原有":"输入完整 Cookie"}),W=h(()=>x[l.cloud_type]||l.cloud_type||""),X=h(()=>{const t=l.cloud_type;return t?{quark:`
  • 在电脑上打开 pan.quark.cn 并登录你的夸克账号
  • +import{d as ke,o as L,m as ve,E as _,a as c,c as k,f as n,w as a,b as r,h as C,j as p,i as be,F as R,r as K,t as v,y as g,l as d,e as A,k as Ce,M as he,p as xe,n as H,K as Be,L as Te,v as h}from"./index-D_srC3bj.js";import{a as x}from"./index-Bn7NwETH.js";import{c as we,k as Fe,h as Ne,l as G,t as Ve,u as P,m as ze,n as Se,o as $e,_ as Ue}from"./_plugin-vue_export-helper-1Z-znrfZ.js";import{C as De}from"./CloudBadge-CbpZHKLy.js";const Ie={class:"cloud-config"},Me={class:"cloud-toggle-grid"},Oe=["src"],qe={class:"cloud-label"},Ee={class:"toolbar"},Le={key:0,class:"nickname-text"},Re={key:0,class:"promotion-text"},Ke={key:0,class:"uid-cell"},Ae={key:0,class:"verifying"},He={key:0,class:"storage-cell"},Ge={class:"storage-bar-wrap"},Pe={class:"storage-text"},je={class:"storage-used"},Je={class:"storage-total"},Qe={class:"storage-free"},We={key:0,class:"save-count"},Xe={style:{"line-height":"1.6"}},Ye={class:"cookie-tips-header"},Ze={class:"cookie-tips-title"},et=["innerHTML"],tt=ke({__name:"CloudConfig",setup(ot){const z=C([]),D=C(),F=C([]),B=C(!1),T=C(!1),b=C(null),l=be({cloud_type:"",nickname:"",promotion_account:"",is_transfer_enabled:!1,cookie:"",_verifying:!1,_storageUsed:"",_storageTotal:""}),j=h(()=>({cloud_type:[{required:!0,message:"请选择网盘类型",trigger:"change"}],nickname:[{required:!1,message:"请填写昵称(区分多个同类型网盘)",trigger:"blur"}],promotion_account:[{required:!0,message:"请填写推广平台及账号",trigger:"blur"}]})),J=h(()=>Object.entries(x)),Q=h(()=>{if(!l.cloud_type)return"请先选择网盘类型";const t=l.cloud_type;return t==="quark"||t==="baidu"?`请输入 ${x[t]||t} 的完整 Cookie`:b.value?"留空则保持原有":"输入完整 Cookie"}),W=h(()=>x[l.cloud_type]||l.cloud_type||""),X=h(()=>{const t=l.cloud_type;return t?{quark:`
  • 在电脑上打开 pan.quark.cn 并登录你的夸克账号
  • F12 打开开发者工具 → 切换到 网络 (Network) 选项卡
  • 刷新页面,在请求列表中点击任意一个请求(如 account/info
  • 在右侧 请求头 (Request Headers) 中找到 Cookie 字段
  • diff --git a/source_clean/frontend-src/dist-vite/assets/HomePage--KOSYv1j.js b/source_clean/frontend-src/dist-vite/assets/HomePage-CdqgUFQt.js similarity index 98% rename from source_clean/frontend-src/dist-vite/assets/HomePage--KOSYv1j.js rename to source_clean/frontend-src/dist-vite/assets/HomePage-CdqgUFQt.js index c672733..54bd7fc 100644 --- a/source_clean/frontend-src/dist-vite/assets/HomePage--KOSYv1j.js +++ b/source_clean/frontend-src/dist-vite/assets/HomePage-CdqgUFQt.js @@ -1 +1 @@ -import{d as K,o as G,a as n,c as a,b as o,F as w,t as c,e as h,f as v,w as f,g as Q,r as z,h as l,i as B,j as x,u as W,k as Y,s as J,l as D,n as I}from"./index-D279dJND.js";import{g as X,a as Z,_ as ee}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const te={class:"home-page"},se={class:"hero-section"},oe=["src","alt"],ne={key:1,class:"logo-text"},ae={class:"search-box"},ie={key:1,class:"quote-section"},ce={class:"quote-text"},le={class:"quote-author"},re={class:"content-section"},ue={key:0,class:"rankings-grid"},de={class:"panel-header"},_e={class:"panel-title"},he={class:"panel-tabs"},ve=["onClick"],pe=["onClick"],ge={class:"panel-body"},fe=["onClick"],me={class:"rank-name"},ye={class:"rank-cnt"},ke=["onClick"],Ce={class:"panel-footer"},be={key:0},we={key:1},xe={key:2},Ie={key:3},qe={class:"footer-time"},Ae={key:0,class:"site-footer"},Se={class:"footer-inner"},Ne={class:"footer-actions"},R=8,Te=K({__name:"HomePage",setup(Ve){const q=W(),m=l(""),u=l([]),d=B({}),_=B({}),p=l(""),y=l(""),k=l(""),A=l(!1),g=l(""),C=l(""),S=l(""),F={movie:"🎬",western_movie:"🎥",western_tv:"🌍",donghua:"🐉",global_anime:"🌐",tv:"📺",niche:"💎",hotsite:"🏆"};function L(e){return F[e]||"📋"}function j(e){const t=[];if(e.rating&&t.push(`⭐${e.rating}`),e.searchCount>0){const i=e.searchCount;i>=1e8?t.push(`${(i/1e8).toFixed(1)}亿`):i>=1e4?t.push(`${(i/1e4).toFixed(0)}万`):t.push(String(i))}return t.join(" ")||""}function N(e){return(_[e.category]||"hot")==="hot"?e.hot||[]:e.newest||[]}function E(e){const t=N(e);return d[e.category]?t:t.slice(0,R)}function H(e){return N(e).length>R&&!d[e.category]}function M(e){d[e]=!0}function T(e,t){_[e]=t,d[e]=!1}function O(){window.open("/disclaimer/","_blank")}G(async()=>{try{const t=await(await fetch("https://v1.hitokoto.cn/")).json();g.value=t.hitokoto||"",C.value=t.from_who||t.from||""}catch{g.value="学而时习之,不亦说乎。",C.value="孔子"}try{const[e,t]=await Promise.all([X(),Z()]);e.fetchedAt?(S.value=e.fetchedAt,u.value=e.categories||[]):u.value=Array.isArray(e)?e:[];for(const i of u.value)_[i.category]="hot",d[i.category]=!1;t.site_logo&&(p.value=t.site_logo),t.site_name&&(y.value=t.site_name),t.site_disclaimer&&(k.value=t.site_disclaimer),A.value=!0}catch(e){console.error("加载首页数据失败",e)}});function V(){const e=m.value.trim();e&&q.push("/search?q="+encodeURIComponent(e))}function P(e){q.push("/search?q="+encodeURIComponent(e))}return(e,t)=>{const i=x("el-icon"),U=x("el-input"),$=x("el-button");return n(),a("div",te,[o("div",se,[A.value?(n(),a(w,{key:0},[p.value?(n(),a("img",{key:0,src:p.value,alt:y.value||"CloudSearch",class:"logo-img",onError:t[0]||(t[0]=s=>{s.target.style.display="none",p.value=""})},null,40,oe)):(n(),a("div",ne,c(y.value||"CloudSearch"),1))],64)):h("",!0),o("div",ae,[v(U,{modelValue:m.value,"onUpdate:modelValue":t[1]||(t[1]=s=>m.value=s),placeholder:"搜索网盘资源,或粘贴视频/网盘链接...",size:"large",clearable:"",onKeyup:Q(V,["enter"])},{prefix:f(()=>[v(i,null,{default:f(()=>[v(Y(J))]),_:1})]),_:1},8,["modelValue"]),v($,{type:"primary",size:"large",onClick:V,class:"search-btn"},{default:f(()=>[...t[2]||(t[2]=[D(" 搜 索 ",-1)])]),_:1})]),g.value?(n(),a("div",ie,[o("span",ce,"「 "+c(g.value)+" 」",1),o("span",le,"---"+c(C.value),1)])):h("",!0)]),o("div",re,[u.value.length>0?(n(),a("div",ue,[(n(!0),a(w,null,z(u.value,s=>(n(),a("div",{key:s.category,class:"rank-panel"},[o("div",de,[o("span",_e,c(L(s.category))+" "+c(s.label),1),o("div",he,[o("span",{class:I(["panel-tab",{active:_[s.category]==="hot"}]),onClick:r=>T(s.category,"hot")},"热榜",10,ve),o("span",{class:I(["panel-tab",{active:_[s.category]==="newest"}]),onClick:r=>T(s.category,"newest")},"最新",10,pe)])]),o("div",ge,[(n(!0),a(w,null,z(E(s),(r,b)=>(n(),a("div",{key:s.category+"-"+b,class:"rank-item",onClick:$e=>P(r.keyword)},[o("span",{class:I(["rank-idx",{"top-three":b<3}])},c(b+1),3),o("span",me,c(r.keyword),1),o("span",ye,c(j(r)),1)],8,fe))),128)),H(s)?(n(),a("div",{key:0,class:"rank-expand",onClick:r=>M(s.category)}," 展开全部 ▼ ",8,ke)):h("",!0)]),o("div",Ce,[s.category==="hotsite"?(n(),a("span",be,"基于本站搜索数据")):s.category==="donghua"||s.category==="global_anime"?(n(),a("span",we,"数据来源:Bilibili")):s.category==="movie"||s.category==="tv"?(n(),a("span",xe,"数据来源:百度")):(n(),a("span",Ie,"数据来源:TMDB")),o("span",qe,c(S.value),1)])]))),128))])):h("",!0)]),k.value?(n(),a("div",Ae,[o("div",Se,c(k.value),1),o("div",Ne,[v($,{class:"footer-disclaimer-btn",size:"small",onClick:O},{default:f(()=>[...t[3]||(t[3]=[D("📜 免责声明",-1)])]),_:1})])])):h("",!0)])}}}),De=ee(Te,[["__scopeId","data-v-1f536d99"]]);export{De as default}; +import{d as K,o as G,a as n,c as a,b as o,F as w,t as c,e as h,f as v,w as f,g as Q,r as z,h as l,i as B,j as x,u as W,k as Y,s as J,l as D,n as I}from"./index-D_srC3bj.js";import{g as X,a as Z,_ as ee}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const te={class:"home-page"},se={class:"hero-section"},oe=["src","alt"],ne={key:1,class:"logo-text"},ae={class:"search-box"},ie={key:1,class:"quote-section"},ce={class:"quote-text"},le={class:"quote-author"},re={class:"content-section"},ue={key:0,class:"rankings-grid"},de={class:"panel-header"},_e={class:"panel-title"},he={class:"panel-tabs"},ve=["onClick"],pe=["onClick"],ge={class:"panel-body"},fe=["onClick"],me={class:"rank-name"},ye={class:"rank-cnt"},ke=["onClick"],Ce={class:"panel-footer"},be={key:0},we={key:1},xe={key:2},Ie={key:3},qe={class:"footer-time"},Ae={key:0,class:"site-footer"},Se={class:"footer-inner"},Ne={class:"footer-actions"},R=8,Te=K({__name:"HomePage",setup(Ve){const q=W(),m=l(""),u=l([]),d=B({}),_=B({}),p=l(""),y=l(""),k=l(""),A=l(!1),g=l(""),C=l(""),S=l(""),F={movie:"🎬",western_movie:"🎥",western_tv:"🌍",donghua:"🐉",global_anime:"🌐",tv:"📺",niche:"💎",hotsite:"🏆"};function L(e){return F[e]||"📋"}function j(e){const t=[];if(e.rating&&t.push(`⭐${e.rating}`),e.searchCount>0){const i=e.searchCount;i>=1e8?t.push(`${(i/1e8).toFixed(1)}亿`):i>=1e4?t.push(`${(i/1e4).toFixed(0)}万`):t.push(String(i))}return t.join(" ")||""}function N(e){return(_[e.category]||"hot")==="hot"?e.hot||[]:e.newest||[]}function E(e){const t=N(e);return d[e.category]?t:t.slice(0,R)}function H(e){return N(e).length>R&&!d[e.category]}function M(e){d[e]=!0}function T(e,t){_[e]=t,d[e]=!1}function O(){window.open("/disclaimer/","_blank")}G(async()=>{try{const t=await(await fetch("https://v1.hitokoto.cn/")).json();g.value=t.hitokoto||"",C.value=t.from_who||t.from||""}catch{g.value="学而时习之,不亦说乎。",C.value="孔子"}try{const[e,t]=await Promise.all([X(),Z()]);e.fetchedAt?(S.value=e.fetchedAt,u.value=e.categories||[]):u.value=Array.isArray(e)?e:[];for(const i of u.value)_[i.category]="hot",d[i.category]=!1;t.site_logo&&(p.value=t.site_logo),t.site_name&&(y.value=t.site_name),t.site_disclaimer&&(k.value=t.site_disclaimer),A.value=!0}catch(e){console.error("加载首页数据失败",e)}});function V(){const e=m.value.trim();e&&q.push("/search?q="+encodeURIComponent(e))}function P(e){q.push("/search?q="+encodeURIComponent(e))}return(e,t)=>{const i=x("el-icon"),U=x("el-input"),$=x("el-button");return n(),a("div",te,[o("div",se,[A.value?(n(),a(w,{key:0},[p.value?(n(),a("img",{key:0,src:p.value,alt:y.value||"CloudSearch",class:"logo-img",onError:t[0]||(t[0]=s=>{s.target.style.display="none",p.value=""})},null,40,oe)):(n(),a("div",ne,c(y.value||"CloudSearch"),1))],64)):h("",!0),o("div",ae,[v(U,{modelValue:m.value,"onUpdate:modelValue":t[1]||(t[1]=s=>m.value=s),placeholder:"搜索网盘资源,或粘贴视频/网盘链接...",size:"large",clearable:"",onKeyup:Q(V,["enter"])},{prefix:f(()=>[v(i,null,{default:f(()=>[v(Y(J))]),_:1})]),_:1},8,["modelValue"]),v($,{type:"primary",size:"large",onClick:V,class:"search-btn"},{default:f(()=>[...t[2]||(t[2]=[D(" 搜 索 ",-1)])]),_:1})]),g.value?(n(),a("div",ie,[o("span",ce,"「 "+c(g.value)+" 」",1),o("span",le,"---"+c(C.value),1)])):h("",!0)]),o("div",re,[u.value.length>0?(n(),a("div",ue,[(n(!0),a(w,null,z(u.value,s=>(n(),a("div",{key:s.category,class:"rank-panel"},[o("div",de,[o("span",_e,c(L(s.category))+" "+c(s.label),1),o("div",he,[o("span",{class:I(["panel-tab",{active:_[s.category]==="hot"}]),onClick:r=>T(s.category,"hot")},"热榜",10,ve),o("span",{class:I(["panel-tab",{active:_[s.category]==="newest"}]),onClick:r=>T(s.category,"newest")},"最新",10,pe)])]),o("div",ge,[(n(!0),a(w,null,z(E(s),(r,b)=>(n(),a("div",{key:s.category+"-"+b,class:"rank-item",onClick:$e=>P(r.keyword)},[o("span",{class:I(["rank-idx",{"top-three":b<3}])},c(b+1),3),o("span",me,c(r.keyword),1),o("span",ye,c(j(r)),1)],8,fe))),128)),H(s)?(n(),a("div",{key:0,class:"rank-expand",onClick:r=>M(s.category)}," 展开全部 ▼ ",8,ke)):h("",!0)]),o("div",Ce,[s.category==="hotsite"?(n(),a("span",be,"基于本站搜索数据")):s.category==="donghua"||s.category==="global_anime"?(n(),a("span",we,"数据来源:Bilibili")):s.category==="movie"||s.category==="tv"?(n(),a("span",xe,"数据来源:百度")):(n(),a("span",Ie,"数据来源:TMDB")),o("span",qe,c(S.value),1)])]))),128))])):h("",!0)]),k.value?(n(),a("div",Ae,[o("div",Se,c(k.value),1),o("div",Ne,[v($,{class:"footer-disclaimer-btn",size:"small",onClick:O},{default:f(()=>[...t[3]||(t[3]=[D("📜 免责声明",-1)])]),_:1})])])):h("",!0)])}}}),De=ee(Te,[["__scopeId","data-v-1f536d99"]]);export{De as default}; diff --git a/source_clean/frontend-src/dist-vite/assets/ResultDetail-DdE8ZRMU.js b/source_clean/frontend-src/dist-vite/assets/ResultDetail-BLqifyVI.js similarity index 98% rename from source_clean/frontend-src/dist-vite/assets/ResultDetail-DdE8ZRMU.js rename to source_clean/frontend-src/dist-vite/assets/ResultDetail-BLqifyVI.js index 02b0772..93bd87e 100644 --- a/source_clean/frontend-src/dist-vite/assets/ResultDetail-DdE8ZRMU.js +++ b/source_clean/frontend-src/dist-vite/assets/ResultDetail-BLqifyVI.js @@ -1 +1 @@ -import{d as U,h as i,o as N,a,c,f as o,w as n,F as j,r as H,y as w,k as G,j as f,b as l,t as r,e as g,z as J,l as p,E as D}from"./index-D279dJND.js";import{C as K}from"./CloudBadge-OZZzB6Zg.js";import{a as Q}from"./index-Bn7NwETH.js";import{h as W,_ as T,q as X,f as Y,e as Z}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const ee={class:"cloud-select"},le=U({__name:"CloudSelect",props:{modelValue:{}},emits:["select","update:modelValue"],setup(R,{emit:E}){const V=R,t=E,s=i(V.modelValue),C=i([]);N(async()=>{try{C.value=await W()}catch(v){console.error("获取网盘配置失败",v)}});function m(v){t("select",v),t("update:modelValue",v)}return(v,y)=>{const b=f("el-option"),h=f("el-select");return a(),c("div",ee,[o(h,{modelValue:s.value,"onUpdate:modelValue":y[0]||(y[0]=_=>s.value=_),placeholder:"选择目标网盘",onChange:m},{default:n(()=>[(a(!0),c(j,null,H(C.value,_=>(a(),w(b,{key:_.cloud_type,label:_.nickname||G(Q)[_.cloud_type],value:_.cloud_type},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])}}}),te=T(le,[["__scopeId","data-v-098423df"]]),se={class:"result-detail-page"},ae={class:"detail-container"},oe={key:0,class:"loading-state"},ne={key:1,class:"detail-card"},ie={class:"detail-header"},ue={class:"detail-cover"},de=["src","alt"],re={class:"detail-info"},ce={class:"detail-meta"},ve={key:0,class:"detail-desc"},_e={class:"detail-actions"},pe={key:2,class:"detail-card"},fe={class:"detail-video"},me={class:"video-preview"},ye=["src","alt"],ge={class:"video-info"},he={key:0,class:"video-author"},ke={class:"video-platform"},Ve={key:1,class:"detail-desc"},Ce={class:"detail-actions"},we={key:0,class:"video-player-wrapper"},be=["src"],Se={class:"save-dialog-content"},xe={class:"save-file-name"},De={class:"result-dialog-content"},Ee={class:"share-link-box"},Le={class:"share-link-row"},Re=U({__name:"ResultDetail",setup(R){const E=J(),V=i(!1),t=i(null),s=i(null),C=i(!1),m=i(!1),v=i(!1),y=i(""),b=i(!1),h=i(!1),_=i(null),S=i("");N(async()=>{const u=E.params.id;if(u){V.value=!0;try{const e=await X(u);e.intent==="SEARCH"&&e.results.length>0?t.value=e.results[0]:e.intent==="VIDEO_PARSE"&&e.results.length>0&&(s.value=e.results[0])}catch(e){console.error("获取详情失败",e)}finally{V.value=!1}}});function B(){b.value=!!s.value,m.value=!0}function $(){C.value=!0}function A(u){y.value=u}async function I(){if(!y.value){D.warning("请选择目标网盘");return}v.value=!0;try{let u;if(b.value&&s.value)u=await Y({video_url:s.value.video_url,title:s.value.title,target_cloud:y.value});else if(t.value)u=await Z({type:"search",source:t.value,target_cloud:y.value});else return;_.value=u,S.value=u.share_url,m.value=!1,h.value=!0}catch(u){console.error("保存失败",u),D.error("保存失败")}finally{v.value=!1}}async function q(){try{await navigator.clipboard.writeText(S.value),D.success("链接已复制到剪贴板")}catch{D.warning("复制失败,请手动复制")}}return(u,e)=>{const F=f("el-skeleton"),L=f("el-tag"),k=f("el-button"),M=f("el-empty"),z=f("el-dialog"),O=f("el-alert"),P=f("el-input");return a(),c("div",se,[l("div",ae,[V.value?(a(),c("div",oe,[o(F,{rows:6,animated:""})])):t.value?(a(),c("div",ne,[l("div",ie,[l("div",ue,[l("img",{src:t.value.cover,alt:t.value.title},null,8,de),o(K,{cloud_type:t.value.cloud_type},null,8,["cloud_type"])]),l("div",re,[l("h1",null,r(t.value.title),1),l("div",ce,[t.value.file_size?(a(),w(L,{key:0},{default:n(()=>[p("📦 "+r(t.value.file_size),1)]),_:1})):g("",!0),t.value.update_time?(a(),w(L,{key:1},{default:n(()=>[p("🕐 "+r(t.value.update_time),1)]),_:1})):g("",!0),t.value.source?(a(),w(L,{key:2},{default:n(()=>[p("📂 "+r(t.value.source),1)]),_:1})):g("",!0)]),t.value.description?(a(),c("p",ve,r(t.value.description),1)):g("",!0)])]),l("div",_e,[o(k,{type:"primary",size:"large",onClick:B},{default:n(()=>[...e[5]||(e[5]=[p(" 📥 保存到网盘 ",-1)])]),_:1})])])):s.value?(a(),c("div",pe,[l("div",fe,[l("div",me,[l("img",{src:s.value.cover,alt:s.value.title},null,8,ye),l("div",{class:"play-overlay",onClick:$},[...e[6]||(e[6]=[l("div",{class:"play-btn"},"▶ 播放",-1)])])]),l("div",ge,[l("h1",null,r(s.value.title),1),s.value.author?(a(),c("p",he,"👤 "+r(s.value.author),1)):g("",!0),l("p",ke,"📺 "+r(s.value.platform),1),s.value.description?(a(),c("p",Ve,r(s.value.description),1)):g("",!0)])]),l("div",Ce,[o(k,{type:"primary",size:"large",onClick:B},{default:n(()=>[...e[7]||(e[7]=[p(" 📥 保存到云盘 ",-1)])]),_:1})]),C.value?(a(),c("div",we,[l("video",{src:s.value.video_url,controls:"",autoplay:"",class:"video-player"},null,8,be)])):g("",!0)])):(a(),w(M,{key:3,description:"未找到该资源"}))]),o(z,{modelValue:m.value,"onUpdate:modelValue":e[1]||(e[1]=d=>m.value=d),title:"保存到网盘",width:"420px"},{footer:n(()=>[o(k,{onClick:e[0]||(e[0]=d=>m.value=!1)},{default:n(()=>[...e[8]||(e[8]=[p("取消",-1)])]),_:1}),o(k,{type:"primary",loading:v.value,onClick:I},{default:n(()=>[...e[9]||(e[9]=[p("确认保存",-1)])]),_:1},8,["loading"])]),default:n(()=>{var d,x;return[l("div",Se,[l("p",xe,"📄 "+r(((d=t.value)==null?void 0:d.title)||((x=s.value)==null?void 0:x.title)),1),o(te,{onSelect:A})])]}),_:1},8,["modelValue"]),o(z,{modelValue:h.value,"onUpdate:modelValue":e[4]||(e[4]=d=>h.value=d),title:"保存成功",width:"420px"},{footer:n(()=>[o(k,{type:"primary",onClick:e[3]||(e[3]=d=>h.value=!1)},{default:n(()=>[...e[12]||(e[12]=[p("关闭",-1)])]),_:1})]),default:n(()=>{var d;return[l("div",De,[o(O,{type:"success",title:((d=_.value)==null?void 0:d.message)||"保存成功","show-icon":"",closable:!1},null,8,["title"]),l("div",Ee,[e[11]||(e[11]=l("p",{class:"share-label"},"分享链接:",-1)),l("div",Le,[o(P,{modelValue:S.value,"onUpdate:modelValue":e[2]||(e[2]=x=>S.value=x),readonly:""},null,8,["modelValue"]),o(k,{onClick:q},{default:n(()=>[...e[10]||(e[10]=[p("复制",-1)])]),_:1})])])])]}),_:1},8,["modelValue"])])}}}),Te=T(Re,[["__scopeId","data-v-755e2105"]]);export{Te as default}; +import{d as U,h as i,o as N,a,c,f as o,w as n,F as j,r as H,y as w,k as G,j as f,b as l,t as r,e as g,z as J,l as p,E as D}from"./index-D_srC3bj.js";import{C as K}from"./CloudBadge-CbpZHKLy.js";import{a as Q}from"./index-Bn7NwETH.js";import{h as W,_ as T,q as X,f as Y,e as Z}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const ee={class:"cloud-select"},le=U({__name:"CloudSelect",props:{modelValue:{}},emits:["select","update:modelValue"],setup(R,{emit:E}){const V=R,t=E,s=i(V.modelValue),C=i([]);N(async()=>{try{C.value=await W()}catch(v){console.error("获取网盘配置失败",v)}});function m(v){t("select",v),t("update:modelValue",v)}return(v,y)=>{const b=f("el-option"),h=f("el-select");return a(),c("div",ee,[o(h,{modelValue:s.value,"onUpdate:modelValue":y[0]||(y[0]=_=>s.value=_),placeholder:"选择目标网盘",onChange:m},{default:n(()=>[(a(!0),c(j,null,H(C.value,_=>(a(),w(b,{key:_.cloud_type,label:_.nickname||G(Q)[_.cloud_type],value:_.cloud_type},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])}}}),te=T(le,[["__scopeId","data-v-098423df"]]),se={class:"result-detail-page"},ae={class:"detail-container"},oe={key:0,class:"loading-state"},ne={key:1,class:"detail-card"},ie={class:"detail-header"},ue={class:"detail-cover"},de=["src","alt"],re={class:"detail-info"},ce={class:"detail-meta"},ve={key:0,class:"detail-desc"},_e={class:"detail-actions"},pe={key:2,class:"detail-card"},fe={class:"detail-video"},me={class:"video-preview"},ye=["src","alt"],ge={class:"video-info"},he={key:0,class:"video-author"},ke={class:"video-platform"},Ve={key:1,class:"detail-desc"},Ce={class:"detail-actions"},we={key:0,class:"video-player-wrapper"},be=["src"],Se={class:"save-dialog-content"},xe={class:"save-file-name"},De={class:"result-dialog-content"},Ee={class:"share-link-box"},Le={class:"share-link-row"},Re=U({__name:"ResultDetail",setup(R){const E=J(),V=i(!1),t=i(null),s=i(null),C=i(!1),m=i(!1),v=i(!1),y=i(""),b=i(!1),h=i(!1),_=i(null),S=i("");N(async()=>{const u=E.params.id;if(u){V.value=!0;try{const e=await X(u);e.intent==="SEARCH"&&e.results.length>0?t.value=e.results[0]:e.intent==="VIDEO_PARSE"&&e.results.length>0&&(s.value=e.results[0])}catch(e){console.error("获取详情失败",e)}finally{V.value=!1}}});function B(){b.value=!!s.value,m.value=!0}function $(){C.value=!0}function A(u){y.value=u}async function I(){if(!y.value){D.warning("请选择目标网盘");return}v.value=!0;try{let u;if(b.value&&s.value)u=await Y({video_url:s.value.video_url,title:s.value.title,target_cloud:y.value});else if(t.value)u=await Z({type:"search",source:t.value,target_cloud:y.value});else return;_.value=u,S.value=u.share_url,m.value=!1,h.value=!0}catch(u){console.error("保存失败",u),D.error("保存失败")}finally{v.value=!1}}async function q(){try{await navigator.clipboard.writeText(S.value),D.success("链接已复制到剪贴板")}catch{D.warning("复制失败,请手动复制")}}return(u,e)=>{const F=f("el-skeleton"),L=f("el-tag"),k=f("el-button"),M=f("el-empty"),z=f("el-dialog"),O=f("el-alert"),P=f("el-input");return a(),c("div",se,[l("div",ae,[V.value?(a(),c("div",oe,[o(F,{rows:6,animated:""})])):t.value?(a(),c("div",ne,[l("div",ie,[l("div",ue,[l("img",{src:t.value.cover,alt:t.value.title},null,8,de),o(K,{cloud_type:t.value.cloud_type},null,8,["cloud_type"])]),l("div",re,[l("h1",null,r(t.value.title),1),l("div",ce,[t.value.file_size?(a(),w(L,{key:0},{default:n(()=>[p("📦 "+r(t.value.file_size),1)]),_:1})):g("",!0),t.value.update_time?(a(),w(L,{key:1},{default:n(()=>[p("🕐 "+r(t.value.update_time),1)]),_:1})):g("",!0),t.value.source?(a(),w(L,{key:2},{default:n(()=>[p("📂 "+r(t.value.source),1)]),_:1})):g("",!0)]),t.value.description?(a(),c("p",ve,r(t.value.description),1)):g("",!0)])]),l("div",_e,[o(k,{type:"primary",size:"large",onClick:B},{default:n(()=>[...e[5]||(e[5]=[p(" 📥 保存到网盘 ",-1)])]),_:1})])])):s.value?(a(),c("div",pe,[l("div",fe,[l("div",me,[l("img",{src:s.value.cover,alt:s.value.title},null,8,ye),l("div",{class:"play-overlay",onClick:$},[...e[6]||(e[6]=[l("div",{class:"play-btn"},"▶ 播放",-1)])])]),l("div",ge,[l("h1",null,r(s.value.title),1),s.value.author?(a(),c("p",he,"👤 "+r(s.value.author),1)):g("",!0),l("p",ke,"📺 "+r(s.value.platform),1),s.value.description?(a(),c("p",Ve,r(s.value.description),1)):g("",!0)])]),l("div",Ce,[o(k,{type:"primary",size:"large",onClick:B},{default:n(()=>[...e[7]||(e[7]=[p(" 📥 保存到云盘 ",-1)])]),_:1})]),C.value?(a(),c("div",we,[l("video",{src:s.value.video_url,controls:"",autoplay:"",class:"video-player"},null,8,be)])):g("",!0)])):(a(),w(M,{key:3,description:"未找到该资源"}))]),o(z,{modelValue:m.value,"onUpdate:modelValue":e[1]||(e[1]=d=>m.value=d),title:"保存到网盘",width:"420px"},{footer:n(()=>[o(k,{onClick:e[0]||(e[0]=d=>m.value=!1)},{default:n(()=>[...e[8]||(e[8]=[p("取消",-1)])]),_:1}),o(k,{type:"primary",loading:v.value,onClick:I},{default:n(()=>[...e[9]||(e[9]=[p("确认保存",-1)])]),_:1},8,["loading"])]),default:n(()=>{var d,x;return[l("div",Se,[l("p",xe,"📄 "+r(((d=t.value)==null?void 0:d.title)||((x=s.value)==null?void 0:x.title)),1),o(te,{onSelect:A})])]}),_:1},8,["modelValue"]),o(z,{modelValue:h.value,"onUpdate:modelValue":e[4]||(e[4]=d=>h.value=d),title:"保存成功",width:"420px"},{footer:n(()=>[o(k,{type:"primary",onClick:e[3]||(e[3]=d=>h.value=!1)},{default:n(()=>[...e[12]||(e[12]=[p("关闭",-1)])]),_:1})]),default:n(()=>{var d;return[l("div",De,[o(O,{type:"success",title:((d=_.value)==null?void 0:d.message)||"保存成功","show-icon":"",closable:!1},null,8,["title"]),l("div",Ee,[e[11]||(e[11]=l("p",{class:"share-label"},"分享链接:",-1)),l("div",Le,[o(P,{modelValue:S.value,"onUpdate:modelValue":e[2]||(e[2]=x=>S.value=x),readonly:""},null,8,["modelValue"]),o(k,{onClick:q},{default:n(()=>[...e[10]||(e[10]=[p("复制",-1)])]),_:1})])])])]}),_:1},8,["modelValue"])])}}}),Te=T(Re,[["__scopeId","data-v-755e2105"]]);export{Te as default}; diff --git a/source_clean/frontend-src/dist-vite/assets/SaveRecords-DLmXAM3V.js b/source_clean/frontend-src/dist-vite/assets/SaveRecords-B5cCMWaP.js similarity index 99% rename from source_clean/frontend-src/dist-vite/assets/SaveRecords-DLmXAM3V.js rename to source_clean/frontend-src/dist-vite/assets/SaveRecords-B5cCMWaP.js index 59d3f81..955dc90 100644 --- a/source_clean/frontend-src/dist-vite/assets/SaveRecords-DLmXAM3V.js +++ b/source_clean/frontend-src/dist-vite/assets/SaveRecords-B5cCMWaP.js @@ -1 +1 @@ -import{d as Ce,o as xe,a as u,c as r,b as a,f as l,w as d,F as Z,r as q,g as De,t as n,l as g,e as _,h as p,j as m,y as ee,n as M,k as R,s as Se,K as we,O as ze,P as Ne,E as te,Q as Te}from"./index-D279dJND.js";import{c as Be,j as $e,_ as Me}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const Fe={class:"save-records"},Ve={class:"toolbar"},Ee={class:"toolbar-row"},He={class:"filter-group"},je={style:{display:"inline-flex",alignItems:"center",gap:"6px"}},Ie=["src"],Le={class:"time-btns"},Ye=["onClick"],Ae={class:"toolbar-actions"},Ge={class:"record-count"},Ke={key:0,class:"save-summary"},Re={class:"summary-item summary-all"},Ue={class:"summary-item summary-success"},Pe={class:"summary-item summary-reused"},Je={class:"summary-item summary-failed"},Oe={key:0,class:"summary-item summary-rate"},Qe={class:"el-table-wrap"},Xe={class:"expand-detail"},We={class:"detail-row"},Ze={class:"detail-cell",style:{flex:"2"}},qe=["href"],et={key:0,class:"detail-cell"},tt={class:"detail-code"},at={key:1,class:"detail-cell"},st={key:2,class:"detail-cell"},lt={key:3,class:"detail-cell"},nt={class:"detail-row"},ot={key:0,class:"detail-cell"},it={key:1,class:"detail-cell"},dt={class:"detail-code"},ut={key:2,class:"detail-cell"},rt={class:"detail-code"},ct={class:"detail-row"},_t={key:0,class:"detail-cell",style:{flex:"2"}},pt=["href"],gt={key:1,class:"detail-cell"},ft={class:"detail-cell"},mt={key:0,class:"detail-row"},vt={class:"detail-cell"},ht={class:"detail-code"},yt={key:0,class:"detail-cell"},bt={class:"detail-code"},kt={class:"detail-cell"},Ct={class:"detail-code"},xt={key:1,class:"detail-row"},Dt={class:"detail-cell detail-full"},St={class:"detail-error"},wt={key:2,class:"detail-row"},zt={class:"detail-cell detail-full"},Nt={class:"detail-error"},Tt=["title"],Bt=["src"],$t=["title"],Mt={key:0,class:"loc-badge"},Ft={key:1,class:"no-data"},Vt=["title"],Et={key:1,class:"err-msg"},Ht={key:2,class:"reuse-msg"},jt={key:3,class:"no-data"},It={class:"action-cell"},Lt={key:1,class:"pagination-wrap"},Yt={class:"pagination-info"},At='',Gt=Ce({__name:"SaveRecords",setup(Kt){const U=p([]),k=p(0),C=p(1),x=p(20),F=p(!1),S=p(""),w=p(""),z=p(""),V=p("today"),E=p(""),H=p(""),N=p(null),j=p([]),v=p(null),ae=[{key:"today",label:"今日"},{key:"week",label:"本周"},{key:"month",label:"本月"},{key:"lastMonth",label:"上月"}],I=p({});async function se(){try{const s=await Be(),e={};for(const o of s.types)e[o.type]={label:o.label,icon:o.icon};I.value=e}catch{}}function L(s){var e;return((e=I.value[s])==null?void 0:e.label)||s}function P(s){var e;return((e=I.value[s])==null?void 0:e.icon)||At}function le(s){const e=new Set;s.forEach(i=>{i.source_type&&e.add(i.source_type)});const o=new Set(j.value);e.forEach(i=>{o.has(i)||j.value.push(i)})}function Y(s){const e=s.getFullYear(),o=String(s.getMonth()+1).padStart(2,"0"),i=String(s.getDate()).padStart(2,"0");return`${e}-${o}-${i}`}function J(s){if(!s)return"-";let e=s;/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(e)&&(e=e.replace(" ","T")+"+08:00");const o=new Date(e);if(isNaN(o.getTime()))return s;const i=c=>String(c).padStart(2,"0");return`${o.getFullYear()}-${i(o.getMonth()+1)}-${i(o.getDate())} ${i(o.getHours())}:${i(o.getMinutes())}:${i(o.getSeconds())}`}function O(s){return s?s<1e3?`${s}ms`:`${(s/1e3).toFixed(1)}s`:"-"}function Q(s){return s?s>3e4?"dur-slow":s>1e4?"dur-warn":"dur-fast":""}function ne(s){return s.length>50?s.slice(0,50)+"…":s}function oe(s){return s==="success"?"转存成功":s==="reused"?"♻️ 复用已有分享链接":"转存失败"}function ie(s){return s==="success"?"status-ok":s==="reused"?"status-reuse":"status-fail"}function de(s){return s==="success"?"✓":s==="reused"?"♻️":"✗"}const ue={Anhui:"安徽",Beijing:"北京",Chongqing:"重庆",Fujian:"福建",Gansu:"甘肃",Guangdong:"广东",Guangxi:"广西",Guizhou:"贵州",Hainan:"海南",Hebei:"河北",Henan:"河南",Heilongjiang:"黑龙江",Hubei:"湖北",Hunan:"湖南","Inner Mongolia":"内蒙古",Jiangsu:"江苏",Jiangxi:"江西",Jilin:"吉林",Liaoning:"辽宁",Ningxia:"宁夏",Qinghai:"青海",Shaanxi:"陕西",Shandong:"山东",Shanghai:"上海",Shanxi:"山西",Sichuan:"四川",Tianjin:"天津",Tibet:"西藏",Xinjiang:"新疆",Yunnan:"云南",Zhejiang:"浙江","Hong Kong":"香港",Macau:"澳门",Taiwan:"台湾",Changsha:"长沙",Hefei:"合肥",Fuzhou:"福州",Lanzhou:"兰州",Guangzhou:"广州",Nanning:"南宁",Guiyang:"贵阳",Haikou:"海口",Shijiazhuang:"石家庄",Zhengzhou:"郑州",Harbin:"哈尔滨",Wuhan:"武汉",Nanjing:"南京",Nanchang:"南昌",Changchun:"长春",Shenyang:"沈阳",Yinchuan:"银川",Xining:"西宁","Xi'an":"西安",Jinan:"济南",Taiyuan:"太原",Chengdu:"成都",Shenzhen:"深圳",Hangzhou:"杭州",Suzhou:"苏州",Wuxi:"无锡",Ningbo:"宁波",Dongguan:"东莞",Foshan:"佛山",Zhuhai:"珠海",Qingdao:"青岛",Dalian:"大连",Xiamen:"厦门",Kunming:"昆明",Lhasa:"拉萨",Urumqi:"乌鲁木齐",Linyi:"临沂",Wenzhou:"温州",Quanzhou:"泉州"},re={"China Telecom":"中国电信","China Mobile":"中国移动","China Unicom":"中国联通",Chinanet:"中国电信",ChinaNet:"中国电信",CMNET:"中国移动","CNC Group":"中国联通",unicom:"中国联通",telecom:"中国电信",mobile:"中国移动","China Education and Research Network":"教育网",CERNET:"教育网","China Networks":"中国网络",China163:"中国电信","CHINANET BACKBONE":"中国电信","Tencent Cloud":"腾讯云","Alibaba Cloud":"阿里云",Aliyun:"阿里云","Huawei Cloud":"华为云",Baidu:"百度","Beijing Baidu":"百度"};function X(s){return s.replace(/^(中国|China)\s*/i,"").split(/\s+/).filter(Boolean).map(i=>ue[i]||re[i]||i).join(" ")}function ce({row:s}){return s.status==="failed"?"row-failed":""}async function _e(s){try{await navigator.clipboard.writeText(s),te.success("已复制到剪贴板")}catch{const e=document.createElement("textarea");e.value=s,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),te.success("已复制到剪贴板")}}function pe(s){window.open(s,"_blank")}function ge(s,e){}function T(s){V.value=s,N.value=null;const e=new Date,o=e.getFullYear(),i=e.getMonth();let c,f;switch(s){case"today":c=new Date(o,i,e.getDate()),f=c;break;case"week":{const D=e.getDay();c=new Date(o,i,e.getDate()+(D===0?-6:1-D)),f=e;break}case"month":c=new Date(o,i,1),f=e;break;case"lastMonth":c=new Date(o,i-1,1),f=new Date(o,i,0);break;default:c=new Date(o,i,e.getDate()),f=c}E.value=Y(c);const A=new Date(f.getFullYear(),f.getMonth(),f.getDate()+1);H.value=Y(A),y(1)}function fe(s){if(s&&s.length===2){V.value="",E.value=s[0];const e=new Date(s[1]);e.setDate(e.getDate()+1),H.value=Y(e),y(1)}else T("today")}function me(){S.value="",w.value="",z.value="",N.value=null,T("today")}async function y(s=1){F.value=!0;try{C.value=s;const e=S.value||void 0,o=w.value||void 0,i=z.value||void 0,c=await $e(s,x.value,E.value,H.value,e,o,i);U.value=c.records,k.value=c.total,v.value=c.summary||null,le(c.records)}catch(e){console.error("加载转存记录失败",e)}finally{F.value=!1}}return xe(()=>{T("today"),se()}),(s,e)=>{const o=m("el-option"),i=m("el-select"),c=m("el-date-picker"),f=m("el-icon"),A=m("el-input"),D=m("el-button"),W=m("el-tag"),h=m("el-table-column"),B=m("el-tooltip"),ve=m("el-table"),he=m("el-card"),ye=m("el-pagination"),be=Te("loading");return u(),r("div",Fe,[a("div",Ve,[a("div",Ee,[a("div",He,[l(i,{modelValue:S.value,"onUpdate:modelValue":e[0]||(e[0]=t=>S.value=t),placeholder:"状态",clearable:"",style:{width:"100px"},onChange:e[1]||(e[1]=t=>y(1))},{default:d(()=>[l(o,{label:"全部状态",value:""}),l(o,{label:"✓ 成功",value:"success"}),l(o,{label:"♻️ 复用",value:"reused"}),l(o,{label:"✗ 失败",value:"failed"})]),_:1},8,["modelValue"]),l(i,{modelValue:w.value,"onUpdate:modelValue":e[2]||(e[2]=t=>w.value=t),placeholder:"网盘",clearable:"",style:{width:"100px"},onChange:e[3]||(e[3]=t=>y(1))},{default:d(()=>[l(o,{label:"全部网盘",value:""}),(u(!0),r(Z,null,q(j.value,t=>(u(),ee(o,{key:t,label:L(t),value:t},{default:d(()=>[a("span",je,[a("img",{src:P(t),style:{width:"16px",height:"16px"}},null,8,Ie),g(" "+n(L(t)),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue"]),a("div",Le,[(u(),r(Z,null,q(ae,t=>a("button",{key:t.key,class:M(["time-btn",{active:V.value===t.key}]),onClick:b=>T(t.key)},n(t.label),11,Ye)),64))]),l(c,{modelValue:N.value,"onUpdate:modelValue":e[4]||(e[4]=t=>N.value=t),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期","value-format":"YYYY-MM-DD",style:{width:"220px"},onChange:fe},null,8,["modelValue"]),l(A,{modelValue:z.value,"onUpdate:modelValue":e[5]||(e[5]=t=>z.value=t),placeholder:"搜索资源名称…",clearable:"",style:{width:"180px"},onClear:e[6]||(e[6]=t=>y(1)),onKeyup:e[7]||(e[7]=De(t=>y(1),["enter"]))},{prefix:d(()=>[l(f,null,{default:d(()=>[l(R(Se))]),_:1})]),_:1},8,["modelValue"])]),a("div",Ae,[l(D,{size:"small",onClick:me},{default:d(()=>[...e[11]||(e[11]=[g("重置筛选",-1)])]),_:1}),a("span",Ge,"共 "+n(k.value)+" 条",1)])])]),v.value?(u(),r("div",Ke,[a("span",Re,[e[12]||(e[12]=g("📊 共 ",-1)),a("strong",null,n(v.value.total),1),e[13]||(e[13]=g(" 条",-1))]),e[18]||(e[18]=a("span",{class:"summary-divider"},"|",-1)),a("span",Ue,[e[14]||(e[14]=g("✅ 成功 ",-1)),a("strong",null,n(v.value.success),1)]),a("span",Pe,[e[15]||(e[15]=g("♻️ 复用 ",-1)),a("strong",null,n(v.value.reused),1)]),a("span",Je,[e[16]||(e[16]=g("❌ 失败 ",-1)),a("strong",null,n(v.value.failed),1)]),v.value.total>0?(u(),r("span",Oe,[e[17]||(e[17]=g(" 成功率 ",-1)),a("strong",null,n(((v.value.success+v.value.reused)/v.value.total*100).toFixed(1))+"%",1)])):_("",!0)])):_("",!0),l(he,{shadow:"never",class:"save-table-card"},{header:d(()=>[...e[19]||(e[19]=[a("span",null,"📋 转存日志列表",-1)])]),default:d(()=>[a("div",Qe,[we((u(),ee(ve,{data:U.value,stripe:"",style:{width:"100%"},"empty-text":"暂无转存记录",onExpandChange:ge,"row-class-name":ce},{default:d(()=>[l(h,{type:"expand",width:"36"},{default:d(({row:t})=>[a("div",Xe,[a("div",We,[a("div",Ze,[e[20]||(e[20]=a("span",{class:"detail-label"},"原始链接",-1)),a("a",{href:t.source_url,target:"_blank",class:"detail-link"},n(t.source_url),9,qe)]),t.file_size?(u(),r("div",et,[e[21]||(e[21]=a("span",{class:"detail-label"},"文件大小",-1)),a("code",tt,n(t.file_size?function(b){if(b==null||b==="")return"-";var G=typeof b=="string"?parseInt(b,10):b;if(!G||G<=0)return"-";for(var ke=["B","KB","MB","GB","TB"],$=0,K=G;K>=1024&&$<4;)K/=1024,$++;return K.toFixed($===0?0:2)+" "+ke[$]}(t.file_size):"-"),1)])):_("",!0),t.status!=="reused"&&(t.folder_count>0||t.file_count>0)?(u(),r("div",at,[e[23]||(e[23]=a("span",{class:"detail-label"},"文件夹",-1)),a("span",null,[a("strong",null,n(t.folder_count||0),1),e[22]||(e[22]=g(" 个",-1))])])):_("",!0),t.status!=="reused"&&(t.folder_count>0||t.file_count>0)?(u(),r("div",st,[e[25]||(e[25]=a("span",{class:"detail-label"},"文件",-1)),a("span",null,[a("strong",null,n(t.file_count||0),1),e[24]||(e[24]=g(" 个",-1))])])):_("",!0),t.status==="reused"?(u(),r("div",lt,[...e[26]||(e[26]=[a("span",{class:"detail-label"},"复用方式",-1),a("span",{class:"reuse-msg"},"♻️ 直接使用已有分享链接,无需实际转存",-1)])])):_("",!0)]),a("div",nt,[t.config_nickname?(u(),r("div",ot,[e[27]||(e[27]=a("span",{class:"detail-label"},"使用账号",-1)),l(W,{size:"small",type:"success",effect:"plain"},{default:d(()=>[g(n(t.config_nickname),1)]),_:2},1024)])):_("",!0),t.original_folder_name?(u(),r("div",it,[e[28]||(e[28]=a("span",{class:"detail-label"},"原始文件夹名",-1)),a("code",dt,n(t.original_folder_name),1)])):_("",!0),t.folder_name?(u(),r("div",ut,[e[29]||(e[29]=a("span",{class:"detail-label"},"转存文件夹",-1)),a("code",rt,n(t.folder_name),1)])):_("",!0)]),a("div",ct,[t.share_url?(u(),r("div",_t,[e[30]||(e[30]=a("span",{class:"detail-label"},"分享链接",-1)),a("a",{href:t.share_url,target:"_blank",class:"detail-link"},n(t.share_url),9,pt)])):_("",!0),t.share_pwd?(u(),r("div",gt,[e[31]||(e[31]=a("span",{class:"detail-label"},"分享密码",-1)),l(W,{size:"small",type:"warning"},{default:d(()=>[g(n(t.share_pwd),1)]),_:2},1024)])):_("",!0),a("div",ft,[e[32]||(e[32]=a("span",{class:"detail-label"},"耗时",-1)),a("span",{class:M(["detail-duration",Q(t.duration_ms)])},n(O(t.duration_ms)),3)])]),t.ip_address?(u(),r("div",mt,[a("div",vt,[e[33]||(e[33]=a("span",{class:"detail-label"},"IP 地址",-1)),a("code",ht,n(t.ip_address),1)]),t.ip_location?(u(),r("div",yt,[e[34]||(e[34]=a("span",{class:"detail-label"},"归属地",-1)),a("code",bt,n(X(t.ip_location)),1)])):_("",!0),a("div",kt,[e[35]||(e[35]=a("span",{class:"detail-label"},"时间",-1)),a("code",Ct,n(J(t.created_at)),1)])])):_("",!0),t.status==="failed"&&t.error_message?(u(),r("div",xt,[a("div",Dt,[e[36]||(e[36]=a("span",{class:"detail-label"},"错误信息",-1)),a("pre",St,n(t.error_message.includes(" | ")?t.error_message.split(" | ")[1]:t.error_message.split(" | ")[0]),1)])])):_("",!0),t.status==="failed"&&t.error_message&&t.error_message.includes(" | ")?(u(),r("div",wt,[a("div",zt,[e[37]||(e[37]=a("span",{class:"detail-label"},"友好提示",-1)),a("pre",Nt,n(t.error_message.split(" | ")[0]),1)])])):_("",!0)])]),_:1}),l(h,{label:"序号",width:"68",align:"center"},{default:d(({$index:t})=>[g(n((C.value-1)*x.value+t+1),1)]),_:1}),l(h,{label:"时间",width:"140"},{default:d(({row:t})=>[a("span",{title:t.created_at},n(J(t.created_at)),9,Tt)]),_:1}),l(h,{label:"网盘",width:"70",align:"center"},{default:d(({row:t})=>[l(B,{content:L(t.source_type),placement:"top"},{default:d(()=>[a("img",{src:P(t.source_type),style:{width:"22px",height:"22px",cursor:"default"}},null,8,Bt)]),_:2},1032,["content"])]),_:1}),l(h,{label:"状态",width:"72",align:"center"},{default:d(({row:t})=>[l(B,{content:oe(t.status),placement:"top"},{default:d(()=>[a("span",{class:M(["status-badge",ie(t.status)])},n(de(t.status)),3)]),_:2},1032,["content"])]),_:1}),l(h,{label:"资源名称","min-width":"160","show-overflow-tooltip":""},{default:d(({row:t})=>[a("span",{title:t.source_title||""},n(t.source_title||"-"),9,$t)]),_:1}),l(h,{label:"耗时",width:"85",align:"center"},{default:d(({row:t})=>[a("span",{class:M(["duration",Q(t.duration_ms)])},n(O(t.duration_ms)),3)]),_:1}),l(h,{label:"归属地","min-width":"130","show-overflow-tooltip":""},{default:d(({row:t})=>[t.ip_location?(u(),r("span",Mt,n(X(t.ip_location)),1)):(u(),r("span",Ft,"-"))]),_:1}),l(h,{label:"备注","min-width":"200","show-overflow-tooltip":""},{default:d(({row:t})=>[t.status==="failed"&&t.error_message?(u(),r("span",{key:0,class:"err-msg",title:t.error_message},n(ne(t.error_message)),9,Vt)):t.status==="failed"?(u(),r("span",Et,"失败")):t.status==="reused"?(u(),r("span",Ht,"♻️ 复用已有链接")):(u(),r("span",jt,"-"))]),_:1}),l(h,{label:"操作",width:"80",fixed:"right",align:"center"},{default:d(({row:t})=>[a("div",It,[l(B,{content:"复制分享链接",placement:"top"},{default:d(()=>[l(D,{size:"small",circle:"",text:"",disabled:!t.share_url,onClick:b=>_e(t.share_url)},{default:d(()=>[l(f,null,{default:d(()=>[l(R(ze))]),_:1})]),_:1},8,["disabled","onClick"])]),_:2},1024),l(B,{content:"打开分享链接",placement:"top"},{default:d(()=>[l(D,{size:"small",circle:"",text:"",disabled:!t.share_url,onClick:b=>pe(t.share_url)},{default:d(()=>[l(f,null,{default:d(()=>[l(R(Ne))]),_:1})]),_:1},8,["disabled","onClick"])]),_:2},1024)])]),_:1})]),_:1},8,["data"])),[[be,F.value]])])]),_:1}),k.value>0?(u(),r("div",Lt,[a("div",Yt," 第 "+n((C.value-1)*x.value+1)+"-"+n(Math.min(C.value*x.value,k.value))+" 条,共 "+n(k.value)+" 条 ",1),l(ye,{"current-page":C.value,"onUpdate:currentPage":e[8]||(e[8]=t=>C.value=t),"page-size":x.value,"onUpdate:pageSize":e[9]||(e[9]=t=>x.value=t),total:k.value,"page-sizes":[15,20,30,50,100],layout:"sizes, prev, pager, next, jumper",onCurrentChange:y,onSizeChange:e[10]||(e[10]=t=>y(1))},null,8,["current-page","page-size","total"])])):_("",!0)])}}}),Pt=Me(Gt,[["__scopeId","data-v-ccd92f86"]]);export{Pt as default}; +import{d as Ce,o as xe,a as u,c as r,b as a,f as l,w as d,F as Z,r as q,g as De,t as n,l as g,e as _,h as p,j as m,y as ee,n as M,k as R,s as Se,K as we,O as ze,P as Ne,E as te,Q as Te}from"./index-D_srC3bj.js";import{c as Be,j as $e,_ as Me}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const Fe={class:"save-records"},Ve={class:"toolbar"},Ee={class:"toolbar-row"},He={class:"filter-group"},je={style:{display:"inline-flex",alignItems:"center",gap:"6px"}},Ie=["src"],Le={class:"time-btns"},Ye=["onClick"],Ae={class:"toolbar-actions"},Ge={class:"record-count"},Ke={key:0,class:"save-summary"},Re={class:"summary-item summary-all"},Ue={class:"summary-item summary-success"},Pe={class:"summary-item summary-reused"},Je={class:"summary-item summary-failed"},Oe={key:0,class:"summary-item summary-rate"},Qe={class:"el-table-wrap"},Xe={class:"expand-detail"},We={class:"detail-row"},Ze={class:"detail-cell",style:{flex:"2"}},qe=["href"],et={key:0,class:"detail-cell"},tt={class:"detail-code"},at={key:1,class:"detail-cell"},st={key:2,class:"detail-cell"},lt={key:3,class:"detail-cell"},nt={class:"detail-row"},ot={key:0,class:"detail-cell"},it={key:1,class:"detail-cell"},dt={class:"detail-code"},ut={key:2,class:"detail-cell"},rt={class:"detail-code"},ct={class:"detail-row"},_t={key:0,class:"detail-cell",style:{flex:"2"}},pt=["href"],gt={key:1,class:"detail-cell"},ft={class:"detail-cell"},mt={key:0,class:"detail-row"},vt={class:"detail-cell"},ht={class:"detail-code"},yt={key:0,class:"detail-cell"},bt={class:"detail-code"},kt={class:"detail-cell"},Ct={class:"detail-code"},xt={key:1,class:"detail-row"},Dt={class:"detail-cell detail-full"},St={class:"detail-error"},wt={key:2,class:"detail-row"},zt={class:"detail-cell detail-full"},Nt={class:"detail-error"},Tt=["title"],Bt=["src"],$t=["title"],Mt={key:0,class:"loc-badge"},Ft={key:1,class:"no-data"},Vt=["title"],Et={key:1,class:"err-msg"},Ht={key:2,class:"reuse-msg"},jt={key:3,class:"no-data"},It={class:"action-cell"},Lt={key:1,class:"pagination-wrap"},Yt={class:"pagination-info"},At='',Gt=Ce({__name:"SaveRecords",setup(Kt){const U=p([]),k=p(0),C=p(1),x=p(20),F=p(!1),S=p(""),w=p(""),z=p(""),V=p("today"),E=p(""),H=p(""),N=p(null),j=p([]),v=p(null),ae=[{key:"today",label:"今日"},{key:"week",label:"本周"},{key:"month",label:"本月"},{key:"lastMonth",label:"上月"}],I=p({});async function se(){try{const s=await Be(),e={};for(const o of s.types)e[o.type]={label:o.label,icon:o.icon};I.value=e}catch{}}function L(s){var e;return((e=I.value[s])==null?void 0:e.label)||s}function P(s){var e;return((e=I.value[s])==null?void 0:e.icon)||At}function le(s){const e=new Set;s.forEach(i=>{i.source_type&&e.add(i.source_type)});const o=new Set(j.value);e.forEach(i=>{o.has(i)||j.value.push(i)})}function Y(s){const e=s.getFullYear(),o=String(s.getMonth()+1).padStart(2,"0"),i=String(s.getDate()).padStart(2,"0");return`${e}-${o}-${i}`}function J(s){if(!s)return"-";let e=s;/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(e)&&(e=e.replace(" ","T")+"+08:00");const o=new Date(e);if(isNaN(o.getTime()))return s;const i=c=>String(c).padStart(2,"0");return`${o.getFullYear()}-${i(o.getMonth()+1)}-${i(o.getDate())} ${i(o.getHours())}:${i(o.getMinutes())}:${i(o.getSeconds())}`}function O(s){return s?s<1e3?`${s}ms`:`${(s/1e3).toFixed(1)}s`:"-"}function Q(s){return s?s>3e4?"dur-slow":s>1e4?"dur-warn":"dur-fast":""}function ne(s){return s.length>50?s.slice(0,50)+"…":s}function oe(s){return s==="success"?"转存成功":s==="reused"?"♻️ 复用已有分享链接":"转存失败"}function ie(s){return s==="success"?"status-ok":s==="reused"?"status-reuse":"status-fail"}function de(s){return s==="success"?"✓":s==="reused"?"♻️":"✗"}const ue={Anhui:"安徽",Beijing:"北京",Chongqing:"重庆",Fujian:"福建",Gansu:"甘肃",Guangdong:"广东",Guangxi:"广西",Guizhou:"贵州",Hainan:"海南",Hebei:"河北",Henan:"河南",Heilongjiang:"黑龙江",Hubei:"湖北",Hunan:"湖南","Inner Mongolia":"内蒙古",Jiangsu:"江苏",Jiangxi:"江西",Jilin:"吉林",Liaoning:"辽宁",Ningxia:"宁夏",Qinghai:"青海",Shaanxi:"陕西",Shandong:"山东",Shanghai:"上海",Shanxi:"山西",Sichuan:"四川",Tianjin:"天津",Tibet:"西藏",Xinjiang:"新疆",Yunnan:"云南",Zhejiang:"浙江","Hong Kong":"香港",Macau:"澳门",Taiwan:"台湾",Changsha:"长沙",Hefei:"合肥",Fuzhou:"福州",Lanzhou:"兰州",Guangzhou:"广州",Nanning:"南宁",Guiyang:"贵阳",Haikou:"海口",Shijiazhuang:"石家庄",Zhengzhou:"郑州",Harbin:"哈尔滨",Wuhan:"武汉",Nanjing:"南京",Nanchang:"南昌",Changchun:"长春",Shenyang:"沈阳",Yinchuan:"银川",Xining:"西宁","Xi'an":"西安",Jinan:"济南",Taiyuan:"太原",Chengdu:"成都",Shenzhen:"深圳",Hangzhou:"杭州",Suzhou:"苏州",Wuxi:"无锡",Ningbo:"宁波",Dongguan:"东莞",Foshan:"佛山",Zhuhai:"珠海",Qingdao:"青岛",Dalian:"大连",Xiamen:"厦门",Kunming:"昆明",Lhasa:"拉萨",Urumqi:"乌鲁木齐",Linyi:"临沂",Wenzhou:"温州",Quanzhou:"泉州"},re={"China Telecom":"中国电信","China Mobile":"中国移动","China Unicom":"中国联通",Chinanet:"中国电信",ChinaNet:"中国电信",CMNET:"中国移动","CNC Group":"中国联通",unicom:"中国联通",telecom:"中国电信",mobile:"中国移动","China Education and Research Network":"教育网",CERNET:"教育网","China Networks":"中国网络",China163:"中国电信","CHINANET BACKBONE":"中国电信","Tencent Cloud":"腾讯云","Alibaba Cloud":"阿里云",Aliyun:"阿里云","Huawei Cloud":"华为云",Baidu:"百度","Beijing Baidu":"百度"};function X(s){return s.replace(/^(中国|China)\s*/i,"").split(/\s+/).filter(Boolean).map(i=>ue[i]||re[i]||i).join(" ")}function ce({row:s}){return s.status==="failed"?"row-failed":""}async function _e(s){try{await navigator.clipboard.writeText(s),te.success("已复制到剪贴板")}catch{const e=document.createElement("textarea");e.value=s,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),te.success("已复制到剪贴板")}}function pe(s){window.open(s,"_blank")}function ge(s,e){}function T(s){V.value=s,N.value=null;const e=new Date,o=e.getFullYear(),i=e.getMonth();let c,f;switch(s){case"today":c=new Date(o,i,e.getDate()),f=c;break;case"week":{const D=e.getDay();c=new Date(o,i,e.getDate()+(D===0?-6:1-D)),f=e;break}case"month":c=new Date(o,i,1),f=e;break;case"lastMonth":c=new Date(o,i-1,1),f=new Date(o,i,0);break;default:c=new Date(o,i,e.getDate()),f=c}E.value=Y(c);const A=new Date(f.getFullYear(),f.getMonth(),f.getDate()+1);H.value=Y(A),y(1)}function fe(s){if(s&&s.length===2){V.value="",E.value=s[0];const e=new Date(s[1]);e.setDate(e.getDate()+1),H.value=Y(e),y(1)}else T("today")}function me(){S.value="",w.value="",z.value="",N.value=null,T("today")}async function y(s=1){F.value=!0;try{C.value=s;const e=S.value||void 0,o=w.value||void 0,i=z.value||void 0,c=await $e(s,x.value,E.value,H.value,e,o,i);U.value=c.records,k.value=c.total,v.value=c.summary||null,le(c.records)}catch(e){console.error("加载转存记录失败",e)}finally{F.value=!1}}return xe(()=>{T("today"),se()}),(s,e)=>{const o=m("el-option"),i=m("el-select"),c=m("el-date-picker"),f=m("el-icon"),A=m("el-input"),D=m("el-button"),W=m("el-tag"),h=m("el-table-column"),B=m("el-tooltip"),ve=m("el-table"),he=m("el-card"),ye=m("el-pagination"),be=Te("loading");return u(),r("div",Fe,[a("div",Ve,[a("div",Ee,[a("div",He,[l(i,{modelValue:S.value,"onUpdate:modelValue":e[0]||(e[0]=t=>S.value=t),placeholder:"状态",clearable:"",style:{width:"100px"},onChange:e[1]||(e[1]=t=>y(1))},{default:d(()=>[l(o,{label:"全部状态",value:""}),l(o,{label:"✓ 成功",value:"success"}),l(o,{label:"♻️ 复用",value:"reused"}),l(o,{label:"✗ 失败",value:"failed"})]),_:1},8,["modelValue"]),l(i,{modelValue:w.value,"onUpdate:modelValue":e[2]||(e[2]=t=>w.value=t),placeholder:"网盘",clearable:"",style:{width:"100px"},onChange:e[3]||(e[3]=t=>y(1))},{default:d(()=>[l(o,{label:"全部网盘",value:""}),(u(!0),r(Z,null,q(j.value,t=>(u(),ee(o,{key:t,label:L(t),value:t},{default:d(()=>[a("span",je,[a("img",{src:P(t),style:{width:"16px",height:"16px"}},null,8,Ie),g(" "+n(L(t)),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue"]),a("div",Le,[(u(),r(Z,null,q(ae,t=>a("button",{key:t.key,class:M(["time-btn",{active:V.value===t.key}]),onClick:b=>T(t.key)},n(t.label),11,Ye)),64))]),l(c,{modelValue:N.value,"onUpdate:modelValue":e[4]||(e[4]=t=>N.value=t),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期","value-format":"YYYY-MM-DD",style:{width:"220px"},onChange:fe},null,8,["modelValue"]),l(A,{modelValue:z.value,"onUpdate:modelValue":e[5]||(e[5]=t=>z.value=t),placeholder:"搜索资源名称…",clearable:"",style:{width:"180px"},onClear:e[6]||(e[6]=t=>y(1)),onKeyup:e[7]||(e[7]=De(t=>y(1),["enter"]))},{prefix:d(()=>[l(f,null,{default:d(()=>[l(R(Se))]),_:1})]),_:1},8,["modelValue"])]),a("div",Ae,[l(D,{size:"small",onClick:me},{default:d(()=>[...e[11]||(e[11]=[g("重置筛选",-1)])]),_:1}),a("span",Ge,"共 "+n(k.value)+" 条",1)])])]),v.value?(u(),r("div",Ke,[a("span",Re,[e[12]||(e[12]=g("📊 共 ",-1)),a("strong",null,n(v.value.total),1),e[13]||(e[13]=g(" 条",-1))]),e[18]||(e[18]=a("span",{class:"summary-divider"},"|",-1)),a("span",Ue,[e[14]||(e[14]=g("✅ 成功 ",-1)),a("strong",null,n(v.value.success),1)]),a("span",Pe,[e[15]||(e[15]=g("♻️ 复用 ",-1)),a("strong",null,n(v.value.reused),1)]),a("span",Je,[e[16]||(e[16]=g("❌ 失败 ",-1)),a("strong",null,n(v.value.failed),1)]),v.value.total>0?(u(),r("span",Oe,[e[17]||(e[17]=g(" 成功率 ",-1)),a("strong",null,n(((v.value.success+v.value.reused)/v.value.total*100).toFixed(1))+"%",1)])):_("",!0)])):_("",!0),l(he,{shadow:"never",class:"save-table-card"},{header:d(()=>[...e[19]||(e[19]=[a("span",null,"📋 转存日志列表",-1)])]),default:d(()=>[a("div",Qe,[we((u(),ee(ve,{data:U.value,stripe:"",style:{width:"100%"},"empty-text":"暂无转存记录",onExpandChange:ge,"row-class-name":ce},{default:d(()=>[l(h,{type:"expand",width:"36"},{default:d(({row:t})=>[a("div",Xe,[a("div",We,[a("div",Ze,[e[20]||(e[20]=a("span",{class:"detail-label"},"原始链接",-1)),a("a",{href:t.source_url,target:"_blank",class:"detail-link"},n(t.source_url),9,qe)]),t.file_size?(u(),r("div",et,[e[21]||(e[21]=a("span",{class:"detail-label"},"文件大小",-1)),a("code",tt,n(t.file_size?function(b){if(b==null||b==="")return"-";var G=typeof b=="string"?parseInt(b,10):b;if(!G||G<=0)return"-";for(var ke=["B","KB","MB","GB","TB"],$=0,K=G;K>=1024&&$<4;)K/=1024,$++;return K.toFixed($===0?0:2)+" "+ke[$]}(t.file_size):"-"),1)])):_("",!0),t.status!=="reused"&&(t.folder_count>0||t.file_count>0)?(u(),r("div",at,[e[23]||(e[23]=a("span",{class:"detail-label"},"文件夹",-1)),a("span",null,[a("strong",null,n(t.folder_count||0),1),e[22]||(e[22]=g(" 个",-1))])])):_("",!0),t.status!=="reused"&&(t.folder_count>0||t.file_count>0)?(u(),r("div",st,[e[25]||(e[25]=a("span",{class:"detail-label"},"文件",-1)),a("span",null,[a("strong",null,n(t.file_count||0),1),e[24]||(e[24]=g(" 个",-1))])])):_("",!0),t.status==="reused"?(u(),r("div",lt,[...e[26]||(e[26]=[a("span",{class:"detail-label"},"复用方式",-1),a("span",{class:"reuse-msg"},"♻️ 直接使用已有分享链接,无需实际转存",-1)])])):_("",!0)]),a("div",nt,[t.config_nickname?(u(),r("div",ot,[e[27]||(e[27]=a("span",{class:"detail-label"},"使用账号",-1)),l(W,{size:"small",type:"success",effect:"plain"},{default:d(()=>[g(n(t.config_nickname),1)]),_:2},1024)])):_("",!0),t.original_folder_name?(u(),r("div",it,[e[28]||(e[28]=a("span",{class:"detail-label"},"原始文件夹名",-1)),a("code",dt,n(t.original_folder_name),1)])):_("",!0),t.folder_name?(u(),r("div",ut,[e[29]||(e[29]=a("span",{class:"detail-label"},"转存文件夹",-1)),a("code",rt,n(t.folder_name),1)])):_("",!0)]),a("div",ct,[t.share_url?(u(),r("div",_t,[e[30]||(e[30]=a("span",{class:"detail-label"},"分享链接",-1)),a("a",{href:t.share_url,target:"_blank",class:"detail-link"},n(t.share_url),9,pt)])):_("",!0),t.share_pwd?(u(),r("div",gt,[e[31]||(e[31]=a("span",{class:"detail-label"},"分享密码",-1)),l(W,{size:"small",type:"warning"},{default:d(()=>[g(n(t.share_pwd),1)]),_:2},1024)])):_("",!0),a("div",ft,[e[32]||(e[32]=a("span",{class:"detail-label"},"耗时",-1)),a("span",{class:M(["detail-duration",Q(t.duration_ms)])},n(O(t.duration_ms)),3)])]),t.ip_address?(u(),r("div",mt,[a("div",vt,[e[33]||(e[33]=a("span",{class:"detail-label"},"IP 地址",-1)),a("code",ht,n(t.ip_address),1)]),t.ip_location?(u(),r("div",yt,[e[34]||(e[34]=a("span",{class:"detail-label"},"归属地",-1)),a("code",bt,n(X(t.ip_location)),1)])):_("",!0),a("div",kt,[e[35]||(e[35]=a("span",{class:"detail-label"},"时间",-1)),a("code",Ct,n(J(t.created_at)),1)])])):_("",!0),t.status==="failed"&&t.error_message?(u(),r("div",xt,[a("div",Dt,[e[36]||(e[36]=a("span",{class:"detail-label"},"错误信息",-1)),a("pre",St,n(t.error_message.includes(" | ")?t.error_message.split(" | ")[1]:t.error_message.split(" | ")[0]),1)])])):_("",!0),t.status==="failed"&&t.error_message&&t.error_message.includes(" | ")?(u(),r("div",wt,[a("div",zt,[e[37]||(e[37]=a("span",{class:"detail-label"},"友好提示",-1)),a("pre",Nt,n(t.error_message.split(" | ")[0]),1)])])):_("",!0)])]),_:1}),l(h,{label:"序号",width:"68",align:"center"},{default:d(({$index:t})=>[g(n((C.value-1)*x.value+t+1),1)]),_:1}),l(h,{label:"时间",width:"140"},{default:d(({row:t})=>[a("span",{title:t.created_at},n(J(t.created_at)),9,Tt)]),_:1}),l(h,{label:"网盘",width:"70",align:"center"},{default:d(({row:t})=>[l(B,{content:L(t.source_type),placement:"top"},{default:d(()=>[a("img",{src:P(t.source_type),style:{width:"22px",height:"22px",cursor:"default"}},null,8,Bt)]),_:2},1032,["content"])]),_:1}),l(h,{label:"状态",width:"72",align:"center"},{default:d(({row:t})=>[l(B,{content:oe(t.status),placement:"top"},{default:d(()=>[a("span",{class:M(["status-badge",ie(t.status)])},n(de(t.status)),3)]),_:2},1032,["content"])]),_:1}),l(h,{label:"资源名称","min-width":"160","show-overflow-tooltip":""},{default:d(({row:t})=>[a("span",{title:t.source_title||""},n(t.source_title||"-"),9,$t)]),_:1}),l(h,{label:"耗时",width:"85",align:"center"},{default:d(({row:t})=>[a("span",{class:M(["duration",Q(t.duration_ms)])},n(O(t.duration_ms)),3)]),_:1}),l(h,{label:"归属地","min-width":"130","show-overflow-tooltip":""},{default:d(({row:t})=>[t.ip_location?(u(),r("span",Mt,n(X(t.ip_location)),1)):(u(),r("span",Ft,"-"))]),_:1}),l(h,{label:"备注","min-width":"200","show-overflow-tooltip":""},{default:d(({row:t})=>[t.status==="failed"&&t.error_message?(u(),r("span",{key:0,class:"err-msg",title:t.error_message},n(ne(t.error_message)),9,Vt)):t.status==="failed"?(u(),r("span",Et,"失败")):t.status==="reused"?(u(),r("span",Ht,"♻️ 复用已有链接")):(u(),r("span",jt,"-"))]),_:1}),l(h,{label:"操作",width:"80",fixed:"right",align:"center"},{default:d(({row:t})=>[a("div",It,[l(B,{content:"复制分享链接",placement:"top"},{default:d(()=>[l(D,{size:"small",circle:"",text:"",disabled:!t.share_url,onClick:b=>_e(t.share_url)},{default:d(()=>[l(f,null,{default:d(()=>[l(R(ze))]),_:1})]),_:1},8,["disabled","onClick"])]),_:2},1024),l(B,{content:"打开分享链接",placement:"top"},{default:d(()=>[l(D,{size:"small",circle:"",text:"",disabled:!t.share_url,onClick:b=>pe(t.share_url)},{default:d(()=>[l(f,null,{default:d(()=>[l(R(Ne))]),_:1})]),_:1},8,["disabled","onClick"])]),_:2},1024)])]),_:1})]),_:1},8,["data"])),[[be,F.value]])])]),_:1}),k.value>0?(u(),r("div",Lt,[a("div",Yt," 第 "+n((C.value-1)*x.value+1)+"-"+n(Math.min(C.value*x.value,k.value))+" 条,共 "+n(k.value)+" 条 ",1),l(ye,{"current-page":C.value,"onUpdate:currentPage":e[8]||(e[8]=t=>C.value=t),"page-size":x.value,"onUpdate:pageSize":e[9]||(e[9]=t=>x.value=t),total:k.value,"page-sizes":[15,20,30,50,100],layout:"sizes, prev, pager, next, jumper",onCurrentChange:y,onSizeChange:e[10]||(e[10]=t=>y(1))},null,8,["current-page","page-size","total"])])):_("",!0)])}}}),Pt=Me(Gt,[["__scopeId","data-v-ccd92f86"]]);export{Pt as default}; diff --git a/source_clean/frontend-src/dist-vite/assets/SearchResult-DLXOMefi.js b/source_clean/frontend-src/dist-vite/assets/SearchResult-EeENDml7.js similarity index 99% rename from source_clean/frontend-src/dist-vite/assets/SearchResult-DLXOMefi.js rename to source_clean/frontend-src/dist-vite/assets/SearchResult-EeENDml7.js index dd0075f..42bb1ec 100644 --- a/source_clean/frontend-src/dist-vite/assets/SearchResult-DLXOMefi.js +++ b/source_clean/frontend-src/dist-vite/assets/SearchResult-EeENDml7.js @@ -1,4 +1,4 @@ -import{d as ht,o as nn,m as qn,a as d,c as f,n as we,b as g,p as ut,t as m,k as Oe,e as R,F as $,r as oe,q as Gt,h as E,v as J,x as Qt,f as z,w as K,g as Xt,y as Me,l as G,z as Hn,j as le,s as Kn,A as On,i as xn,E as Re,u as Jn,B as Wn}from"./index-D279dJND.js";import{C as sn,a as Ae,b as on}from"./index-Bn7NwETH.js";import{_ as vt,b as Yn,s as jn,c as Gn,d as Qn,q as Xn,e as Zn,f as $n}from"./_plugin-vue_export-helper-1Z-znrfZ.js";var Ne={},es=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then},an={},se={};let pt;const ts=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];se.getSymbolSize=function(t){if(!t)throw new Error('"version" cannot be null or undefined');if(t<1||t>40)throw new Error('"version" should be in range from 1 to 40');return t*4+17};se.getSymbolTotalCodewords=function(t){return ts[t]};se.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t};se.setToSJISFunction=function(t){if(typeof t!="function")throw new Error('"toSJISFunc" is not a valid function.');pt=t};se.isKanjiModeEnabled=function(){return typeof pt<"u"};se.toSJIS=function(t){return pt(t)};var We={};(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(a){if(typeof a!="string")throw new Error("Param is not a string");switch(a.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+a)}}e.isValid=function(s){return s&&typeof s.bit<"u"&&s.bit>=0&&s.bit<4},e.from=function(s,n){if(e.isValid(s))return s;try{return t(s)}catch{return n}}})(We);function ln(){this.buffer=[],this.length=0}ln.prototype={get:function(e){const t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)===1},put:function(e,t){for(let a=0;a>>t-a-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(e){const t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}};var ns=ln;function Le(e){if(!e||e<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}Le.prototype.set=function(e,t,a,s){const n=e*this.size+t;this.data[n]=a,s&&(this.reservedBit[n]=!0)};Le.prototype.get=function(e,t){return this.data[e*this.size+t]};Le.prototype.xor=function(e,t,a){this.data[e*this.size+t]^=a};Le.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]};var ss=Le,rn={};(function(e){const t=se.getSymbolSize;e.getRowColCoords=function(s){if(s===1)return[];const n=Math.floor(s/7)+2,o=t(s),r=o===145?26:Math.ceil((o-13)/(2*n-2))*2,i=[o-7];for(let u=1;u=0&&n<=7},e.from=function(n){return e.isValid(n)?parseInt(n,10):void 0},e.getPenaltyN1=function(n){const o=n.size;let r=0,i=0,u=0,v=null,h=null;for(let D=0;D=5&&(r+=t.N1+(i-5)),v=y,i=1),y=n.get(T,D),y===h?u++:(u>=5&&(r+=t.N1+(u-5)),h=y,u=1)}i>=5&&(r+=t.N1+(i-5)),u>=5&&(r+=t.N1+(u-5))}return r},e.getPenaltyN2=function(n){const o=n.size;let r=0;for(let i=0;i=10&&(i===1488||i===93)&&r++,u=u<<1&2047|n.get(h,v),h>=10&&(u===1488||u===93)&&r++}return r*t.N3},e.getPenaltyN4=function(n){let o=0;const r=n.data.length;for(let u=0;u=0;){const r=o[0];for(let u=0;u0){const o=new Uint8Array(this.degree);return o.set(s,n),o}return s};var as=mt,gn={},ve={},yt={};yt.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40};var re={};const hn="[0-9]+",ls="[A-Z $%*+\\-./:]+";let Pe="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";Pe=Pe.replace(/u/g,"\\u");const rs="(?:(?![A-Z0-9 $%*+\\-./:]|"+Pe+`)(?:.|[\r +import{d as ht,o as nn,m as qn,a as d,c as f,n as we,b as g,p as ut,t as m,k as Oe,e as R,F as $,r as oe,q as Gt,h as E,v as J,x as Qt,f as z,w as K,g as Xt,y as Me,l as G,z as Hn,j as le,s as Kn,A as On,i as xn,E as Re,u as Jn,B as Wn}from"./index-D_srC3bj.js";import{C as sn,a as Ae,b as on}from"./index-Bn7NwETH.js";import{_ as vt,b as Yn,s as jn,c as Gn,d as Qn,q as Xn,e as Zn,f as $n}from"./_plugin-vue_export-helper-1Z-znrfZ.js";var Ne={},es=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then},an={},se={};let pt;const ts=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];se.getSymbolSize=function(t){if(!t)throw new Error('"version" cannot be null or undefined');if(t<1||t>40)throw new Error('"version" should be in range from 1 to 40');return t*4+17};se.getSymbolTotalCodewords=function(t){return ts[t]};se.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t};se.setToSJISFunction=function(t){if(typeof t!="function")throw new Error('"toSJISFunc" is not a valid function.');pt=t};se.isKanjiModeEnabled=function(){return typeof pt<"u"};se.toSJIS=function(t){return pt(t)};var We={};(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(a){if(typeof a!="string")throw new Error("Param is not a string");switch(a.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+a)}}e.isValid=function(s){return s&&typeof s.bit<"u"&&s.bit>=0&&s.bit<4},e.from=function(s,n){if(e.isValid(s))return s;try{return t(s)}catch{return n}}})(We);function ln(){this.buffer=[],this.length=0}ln.prototype={get:function(e){const t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)===1},put:function(e,t){for(let a=0;a>>t-a-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(e){const t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}};var ns=ln;function Le(e){if(!e||e<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}Le.prototype.set=function(e,t,a,s){const n=e*this.size+t;this.data[n]=a,s&&(this.reservedBit[n]=!0)};Le.prototype.get=function(e,t){return this.data[e*this.size+t]};Le.prototype.xor=function(e,t,a){this.data[e*this.size+t]^=a};Le.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]};var ss=Le,rn={};(function(e){const t=se.getSymbolSize;e.getRowColCoords=function(s){if(s===1)return[];const n=Math.floor(s/7)+2,o=t(s),r=o===145?26:Math.ceil((o-13)/(2*n-2))*2,i=[o-7];for(let u=1;u=0&&n<=7},e.from=function(n){return e.isValid(n)?parseInt(n,10):void 0},e.getPenaltyN1=function(n){const o=n.size;let r=0,i=0,u=0,v=null,h=null;for(let D=0;D=5&&(r+=t.N1+(i-5)),v=y,i=1),y=n.get(T,D),y===h?u++:(u>=5&&(r+=t.N1+(u-5)),h=y,u=1)}i>=5&&(r+=t.N1+(i-5)),u>=5&&(r+=t.N1+(u-5))}return r},e.getPenaltyN2=function(n){const o=n.size;let r=0;for(let i=0;i=10&&(i===1488||i===93)&&r++,u=u<<1&2047|n.get(h,v),h>=10&&(u===1488||u===93)&&r++}return r*t.N3},e.getPenaltyN4=function(n){let o=0;const r=n.data.length;for(let u=0;u=0;){const r=o[0];for(let u=0;u0){const o=new Uint8Array(this.degree);return o.set(s,n),o}return s};var as=mt,gn={},ve={},yt={};yt.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40};var re={};const hn="[0-9]+",ls="[A-Z $%*+\\-./:]+";let Pe="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";Pe=Pe.replace(/u/g,"\\u");const rs="(?:(?![A-Z0-9 $%*+\\-./:]|"+Pe+`)(?:.|[\r ]))+`;re.KANJI=new RegExp(Pe,"g");re.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g");re.BYTE=new RegExp(rs,"g");re.NUMERIC=new RegExp(hn,"g");re.ALPHANUMERIC=new RegExp(ls,"g");const is=new RegExp("^"+Pe+"$"),us=new RegExp("^"+hn+"$"),cs=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");re.testKanji=function(t){return is.test(t)};re.testNumeric=function(t){return us.test(t)};re.testAlphanumeric=function(t){return cs.test(t)};(function(e){const t=yt,a=re;e.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},e.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},e.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(o,r){if(!o.ccBits)throw new Error("Invalid mode: "+o);if(!t.isValid(r))throw new Error("Invalid version: "+r);return r>=1&&r<10?o.ccBits[0]:r<27?o.ccBits[1]:o.ccBits[2]},e.getBestModeForData=function(o){return a.testNumeric(o)?e.NUMERIC:a.testAlphanumeric(o)?e.ALPHANUMERIC:a.testKanji(o)?e.KANJI:e.BYTE},e.toString=function(o){if(o&&o.id)return o.id;throw new Error("Invalid mode")},e.isValid=function(o){return o&&o.bit&&o.ccBits};function s(n){if(typeof n!="string")throw new Error("Param is not a string");switch(n.toLowerCase()){case"numeric":return e.NUMERIC;case"alphanumeric":return e.ALPHANUMERIC;case"kanji":return e.KANJI;case"byte":return e.BYTE;default:throw new Error("Unknown mode: "+n)}}e.from=function(o,r){if(e.isValid(o))return o;try{return s(o)}catch{return r}}})(ve);(function(e){const t=se,a=Ye,s=We,n=ve,o=yt,r=7973,i=t.getBCHDigit(r);function u(T,y,M){for(let I=1;I<=40;I++)if(y<=e.getCapacity(I,M,T))return I}function v(T,y){return n.getCharCountIndicator(T,y)+4}function h(T,y){let M=0;return T.forEach(function(I){const F=v(I.mode,y);M+=F+I.getBitsLength()}),M}function D(T,y){for(let M=1;M<=40;M++)if(h(T,M)<=e.getCapacity(M,y,n.MIXED))return M}e.from=function(y,M){return o.isValid(y)?parseInt(y,10):M},e.getCapacity=function(y,M,I){if(!o.isValid(y))throw new Error("Invalid QR Code version");typeof I>"u"&&(I=n.BYTE);const F=t.getSymbolTotalCodewords(y),_=a.getTotalCodewordsCount(y,M),C=(F-_)*8;if(I===n.MIXED)return C;const w=C-v(I,y);switch(I){case n.NUMERIC:return Math.floor(w/10*3);case n.ALPHANUMERIC:return Math.floor(w/11*2);case n.KANJI:return Math.floor(w/13);case n.BYTE:default:return Math.floor(w/8)}},e.getBestVersionForData=function(y,M){let I;const F=s.from(M,s.M);if(Array.isArray(y)){if(y.length>1)return D(y,F);if(y.length===0)return 1;I=y[0]}else I=y;return u(I.mode,I.getLength(),F)},e.getEncodedBits=function(y){if(!o.isValid(y)||y<7)throw new Error("Invalid QR Code version");let M=y<<12;for(;t.getBCHDigit(M)-i>=0;)M^=r<=0;)n^=pn<0&&(s=this.data.substr(a),n=parseInt(s,10),t.put(n,o*3+1))};var gs=ke;const hs=ve,st=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function be(e){this.mode=hs.ALPHANUMERIC,this.data=e}be.getBitsLength=function(t){return 11*Math.floor(t/2)+6*(t%2)};be.prototype.getLength=function(){return this.data.length};be.prototype.getBitsLength=function(){return be.getBitsLength(this.data.length)};be.prototype.write=function(t){let a;for(a=0;a+2<=this.data.length;a+=2){let s=st.indexOf(this.data[a])*45;s+=st.indexOf(this.data[a+1]),t.put(s,11)}this.data.length%2&&t.put(st.indexOf(this.data[a]),6)};var vs=be;const ps=ve;function Ce(e){this.mode=ps.BYTE,typeof e=="string"?this.data=new TextEncoder().encode(e):this.data=new Uint8Array(e)}Ce.getBitsLength=function(t){return t*8};Ce.prototype.getLength=function(){return this.data.length};Ce.prototype.getBitsLength=function(){return Ce.getBitsLength(this.data.length)};Ce.prototype.write=function(e){for(let t=0,a=this.data.length;t=33088&&a<=40956)a-=33088;else if(a>=57408&&a<=60351)a-=49472;else throw new Error("Invalid SJIS character: "+this.data[t]+` Make sure your charset is UTF-8`);a=(a>>>8&255)*192+(a&255),e.put(a,13)}};var ws=Ee,yn={exports:{}};(function(e){var t={single_source_shortest_paths:function(a,s,n){var o={},r={};r[s]=0;var i=t.PriorityQueue.make();i.push(s,0);for(var u,v,h,D,T,y,M,I,F;!i.empty();){u=i.pop(),v=u.value,D=u.cost,T=a[v]||{};for(h in T)T.hasOwnProperty(h)&&(y=T[h],M=D+y,I=r[h],F=typeof r[h]>"u",(F||I>M)&&(r[h]=M,i.push(h,M),o[h]=v))}if(typeof n<"u"&&typeof r[n]>"u"){var _=["Could not find a path from ",s," to ",n,"."].join("");throw new Error(_)}return o},extract_shortest_path_from_predecessor_list:function(a,s){for(var n=[],o=s;o;)n.push(o),a[o],o=a[o];return n.reverse(),n},find_path:function(a,s,n){var o=t.single_source_shortest_paths(a,s,n);return t.extract_shortest_path_from_predecessor_list(o,n)},PriorityQueue:{make:function(a){var s=t.PriorityQueue,n={},o;a=a||{};for(o in s)s.hasOwnProperty(o)&&(n[o]=s[o]);return n.queue=[],n.sorter=a.sorter||s.default_sorter,n},default_sorter:function(a,s){return a.cost-s.cost},push:function(a,s){var n={value:a,cost:s};this.queue.push(n),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};e.exports=t})(yn);var ks=yn.exports;(function(e){const t=ve,a=gs,s=vs,n=ms,o=ws,r=re,i=se,u=ks;function v(_){return unescape(encodeURIComponent(_)).length}function h(_,C,w){const k=[];let L;for(;(L=_.exec(w))!==null;)k.push({data:L[0],index:L.index,mode:C,length:L[0].length});return k}function D(_){const C=h(r.NUMERIC,t.NUMERIC,_),w=h(r.ALPHANUMERIC,t.ALPHANUMERIC,_);let k,L;return i.isKanjiModeEnabled()?(k=h(r.BYTE,t.BYTE,_),L=h(r.KANJI,t.KANJI,_)):(k=h(r.BYTE_KANJI,t.BYTE,_),L=[]),C.concat(w,k,L).sort(function(V,b){return V.index-b.index}).map(function(V){return{data:V.data,mode:V.mode,length:V.length}})}function T(_,C){switch(C){case t.NUMERIC:return a.getBitsLength(_);case t.ALPHANUMERIC:return s.getBitsLength(_);case t.KANJI:return o.getBitsLength(_);case t.BYTE:return n.getBitsLength(_)}}function y(_){return _.reduce(function(C,w){const k=C.length-1>=0?C[C.length-1]:null;return k&&k.mode===w.mode?(C[C.length-1].data+=w.data,C):(C.push(w),C)},[])}function M(_){const C=[];for(let w=0;w<_.length;w++){const k=_[w];switch(k.mode){case t.NUMERIC:C.push([k,{data:k.data,mode:t.ALPHANUMERIC,length:k.length},{data:k.data,mode:t.BYTE,length:k.length}]);break;case t.ALPHANUMERIC:C.push([k,{data:k.data,mode:t.BYTE,length:k.length}]);break;case t.KANJI:C.push([k,{data:k.data,mode:t.BYTE,length:v(k.data)}]);break;case t.BYTE:C.push([{data:k.data,mode:t.BYTE,length:v(k.data)}])}}return C}function I(_,C){const w={},k={start:{}};let L=["start"];for(let B=0;B<_.length;B++){const V=_[B],b=[];for(let P=0;P=0&&i<=6&&(u===0||u===6)||u>=0&&u<=6&&(i===0||i===6)||i>=2&&i<=4&&u>=2&&u<=4?e.set(o+i,r+u,!0,!0):e.set(o+i,r+u,!1,!0))}}function As(e){const t=e.size;for(let a=8;a>i&1)===1,e.set(n,o,r,!0),e.set(o,n,r,!0)}function lt(e,t,a){const s=e.size,n=Bs.getEncodedBits(t,a);let o,r;for(o=0;o<15;o++)r=(n>>o&1)===1,o<6?e.set(o,8,r,!0):o<8?e.set(o+1,8,r,!0):e.set(s-15+o,8,r,!0),o<8?e.set(8,s-o-1,r,!0):o<9?e.set(8,15-o-1+1,r,!0):e.set(8,15-o-1,r,!0);e.set(s-8,8,1,!0)}function Ns(e,t){const a=e.size;let s=-1,n=a-1,o=7,r=0;for(let i=a-1;i>0;i-=2)for(i===6&&i--;;){for(let u=0;u<2;u++)if(!e.isReserved(n,i-u)){let v=!1;r>>o&1)===1),e.set(n,i-u,v),o--,o===-1&&(r++,o=7)}if(n+=s,n<0||a<=n){n-=s,s=-s;break}}}function Ls(e,t,a){const s=new bs;a.forEach(function(u){s.put(u.mode.bit,4),s.put(u.getLength(),Ms.getCharCountIndicator(u.mode,e)),u.write(s)});const n=Ge.getSymbolTotalCodewords(e),o=ft.getTotalCodewordsCount(e,t),r=(n-o)*8;for(s.getLengthInBits()+4<=r&&s.put(0,4);s.getLengthInBits()%8!==0;)s.putBit(0);const i=(r-s.getLengthInBits())/8;for(let u=0;uMe.section||He.query.section||""),xe=y(),pe=y([]),d=J({}),$=y([]),Y=y(""),E=y([]),Q=y(""),L=y([]),X=y(""),N=y([]),Z=y(""),ee=y(""),F=y([]),fe=y(!1),ce=y(!1),R=J({db_size:"-",save_records:0,search_stats:0,cloud_configs:0,content_cache:0,redis_status:"未连接"}),ke=y(!0),te=y(!1),se=y(!1),ae=y(!1),oe=y(!1),ne=y(!1),ie=y(!1),P=y(null),Ve=y(!0),de=y(!1),me=H({get:()=>String(d.search_proxy_enabled)==="true",set:t=>{d.search_proxy_enabled=t?"true":"false"}}),he=H({get:()=>String(d.pansou_web_enabled)==="true",set:t=>{d.pansou_web_enabled=t?"true":"false"}}),Se=H({get:()=>String(d.search_all_channels)==="true",set:t=>{d.search_all_channels=t?"true":"false"}}),Ce=H({get:()=>String(d.auto_update_enabled)==="true",set:t=>{d.auto_update_enabled=t?"true":"false"}}),h=J({enabled:!0,time:"08:00",includeSearch:!0,includeSaves:!0,includeStorage:!0,includeUsers:!0}),ve=y(!1),ye=y(!1),Ue=y(""),ge=y(!1),Pe=y("");async function Je(){try{const t=await fetch("/api/admin/daily-report/config",{headers:{Authorization:`Bearer ${localStorage.getItem("admin_token")}`}});if(t.ok){const e=await t.json();Object.assign(h,e)}}catch{}}async function Ye(){try{const t=await fetch("/api/admin/daily-report/last-run",{headers:{Authorization:`Bearer ${localStorage.getItem("admin_token")}`}});if(t.ok){const e=await t.json();e.date&&(Pe.value=`${e.date} ${new Date(e.sentAt).toLocaleTimeString("zh-CN")}`)}}catch{}}async function Qe(){try{await fetch("/api/admin/daily-report/config",{method:"PUT",headers:{"Content-Type":"application/json",Authorization:`Bearer ${localStorage.getItem("admin_token")}`},body:JSON.stringify({...h})})}catch{}}async function Xe(){ve.value=!0;try{const t=await fetch("/api/admin/daily-report/preview",{headers:{Authorization:`Bearer ${localStorage.getItem("admin_token")}`}});if(t.ok){const e=await t.json();Ue.value=e.content,ge.value=!0}}finally{ve.value=!1}}async function Ze(){ye.value=!0;try{(await fetch("/api/admin/daily-report/test",{method:"POST",headers:{Authorization:`Bearer ${localStorage.getItem("admin_token")}`}})).ok?u.success("测试报告已发送到全局通知通道"):u.error("发送失败")}catch{u.error("发送失败")}finally{ye.value=!1}}const ze=y([]),D=y({}),_e=y(!1),Te=y([]);async function el(){try{const t=await fetch("/api/admin/cloud-configs",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}});if(!t.ok)return;const e=await t.json(),a=Array.isArray(e)?[...new Set(e.map(n=>n.promotion_account||"").filter(Boolean))]:[];Te.value=a}catch{}}const m=J({id:null,account:"",channels:[],events:{on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}),ll=H(()=>{var e;const t={};for(const[a,n]of Object.entries(D.value))(e=v.channels[a])!=null&&e._enabled&&(t[a]=n);return t}),v=J({channels:{},events:{on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}});function tl(t){var e,a,n,x;if(t){m.id=t.id,m.account=t.account;const p=t.notify_config||{};m.channels=Object.keys(p.channels||{}),m.events={on_save_success:((e=p.events)==null?void 0:e.on_save_success)!==!1,on_save_fail:((a=p.events)==null?void 0:a.on_save_fail)!==!1,on_cookie_expire:((n=p.events)==null?void 0:n.on_cookie_expire)!==!1,on_cleanup:((x=p.events)==null?void 0:x.on_cleanup)===!0}}else m.id=null,m.account="",m.channels=[],m.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}function sl(){m.id=null,m.account="",m.channels=[],m.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}function re(t,e){return((t.notify_config||{}).events||{})[e]===!0}async function al(){if(!m.account){u.warning("请填写推广账号");return}_e.value=!0;try{const t={account:m.account,notify_config:{channels:{},events:m.events}},e={};for(const n of m.channels)e[n]={};t.notify_config.channels=e,m.id?await fetch("/api/admin/push-users/"+m.id,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")},body:JSON.stringify(t)}):await fetch("/api/admin/push-users",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")},body:JSON.stringify(t)});const a=!!m.id;m.id=null,m.account="",m.channels=[],m.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1},u.success(a?"推送用户已更新":"推送用户已添加"),await be()}catch(t){u.error(t.message||"保存失败")}finally{_e.value=!1}}async function be(){try{const t=await fetch("/api/admin/push-users",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}});t.ok&&(ze.value=await t.json())}catch(t){console.error("Failed to load push users",t)}}async function ol(){try{D.value=await Xl()}catch(t){console.error("Failed to load providers",t)}}async function nl(t){try{await fetch("/api/admin/push-users/"+t.id,{method:"DELETE",headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}}),u.success("已删除"),await be()}catch(e){u.error(e.message||"删除失败")}}function Ie(t){var a;return((a=t.notify_config)==null?void 0:a.channels)||{}}function il(t){var e;return((e=D.value[t])==null?void 0:e.label)||t}function dl(t){return Object.keys(Ie(t)).length>0}function rl(){const t={};for(const[e,a]of Object.entries(D.value)){t[e]={_enabled:!1,_testing:!1};for(const n of a.params||[])t[e][n.key]=n.default||""}v.channels=t,v.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}async function ul(){try{const a=(await(await fetch("/api/admin/system-configs",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}})).json()).find(n=>n.key==="global_notify_config");if(a&&a.value)try{const n=JSON.parse(a.value),x=n.channels||{};for(const[p,S]of Object.entries(x))if(v.channels[p]){v.channels[p]._enabled=!0;for(const[T,w]of Object.entries(S))v.channels[p][T]=w}n.events&&(v.events.on_save_success=n.events.on_save_success!==!1,v.events.on_save_fail=n.events.on_save_fail!==!1,v.events.on_cookie_expire=n.events.on_cookie_expire!==!1,v.events.on_cleanup=n.events.on_cleanup===!0)}catch{}}catch{}}async function pl(t){const e=v.channels[t];if(!(!e||!e._enabled)){e._testing=!0;try{const a=await et(t);a.success?u.success(a.message):u.error(a.message)}catch(a){u.error(a.message||"测试失败")}finally{e._testing=!1}}}const z=J({oldPassword:"",newPassword:"",confirmPassword:""}),fl={oldPassword:[{required:!0,message:"请输入原密码",trigger:"blur"}],newPassword:[{required:!0,message:"请输入新密码",trigger:"blur"},{min:6,message:"新密码至少需要6个字符",trigger:"blur"}],confirmPassword:[{required:!0,message:"请确认新密码",trigger:"blur"},{validator:(t,e,a)=>{e!==z.newPassword?a(new Error("两次输入的密码不一致")):a()},trigger:"blur"}]};Wl(async()=>{try{pe.value=await Yl();for(const p of pe.value)d[p.key]=p.value;const t=String(d.title_filter_rules||"");$.value=t.split(` +`).filter(p=>p.trim());const e=String(d.link_invalid_keywords||"");E.value=e.split(` +`).filter(p=>p.trim());const a=String(d.quark_ad_keywords||"");L.value=a.split(` +`).filter(p=>p.trim());const n=String(d.quark_warning_folder_names||"");N.value=n.split(` +`).filter(p=>p.trim());const x=String(d.quark_sus_extensions||"");F.value=x.split(` +`).filter(p=>p.trim())}catch{u.error("加载系统配置失败")}try{const t=await Ql();Object.assign(R,t)}catch{R.db_size="无法读取"}finally{ke.value=!1}we(),await ol(),rl(),await ul(),be(),Je(),Ye(),el()}),Kl(D,()=>{for(const[t,e]of Object.entries(D.value))if(!v.channels[t]){v.channels[t]={_enabled:!1,_testing:!1};for(const a of e.params||[])v.channels[t][a.key]=a.default||""}});async function cl(){var e,a;const t=String(d.redis_url||"redis://redis:6379");te.value=!0;try{const n=await lt(t);n.ok?u.success(`✅ Redis 连接成功 — ${n.info}`):u.error(`❌ Redis 连接失败 — ${n.info}`)}catch(n){u.error(((a=(e=n.response)==null?void 0:e.data)==null?void 0:a.error)||"测试请求失败")}finally{te.value=!1}}async function we(){Ve.value=!0;try{const t=localStorage.getItem("admin_token"),e={};t&&(e.Authorization="Bearer "+t);const a=await fetch("/api/admin/pansou-info",{headers:e});if(!a.ok)throw new Error("HTTP "+a.status);const n=await a.json();P.value=n}catch{P.value={status:"disconnected",version:"-",channelCount:0,pluginCount:0,diskCount:0}}finally{Ve.value=!1}}async function ml(){de.value=!0;try{const t=localStorage.getItem("admin_token"),e={"Content-Type":"application/json"};t&&(e.Authorization="Bearer "+t);const n=await(await fetch("/api/admin/update-pansou",{method:"POST",headers:e})).json();n.ok?(u.success("✅ PanSou 已更新并重启"),setTimeout(()=>we(),3e3)):u.error("❌ 更新失败 — "+(n.error||"未知错误"))}catch(t){u.error(t.message||"更新请求失败")}finally{de.value=!1}}async function vl(){var t,e;se.value=!0;try{const a=await le({type:"pansou",url:String(d.pansou_url||"")});a.ok?(we(),u.success(`✅ PanSou 连接成功 — ${a.info}`)):u.error(`❌ PanSou 连接失败 — ${a.info}`)}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{se.value=!1}}async function yl(){var t,e;ae.value=!0;try{const a=await le({type:"video_parser",url:String(d.video_parser_url||"")});a.ok?u.success(`✅ 视频解析服务连接成功 — ${a.info}`):u.error(`❌ 视频解析服务连接失败 — ${a.info}`)}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{ae.value=!1}}async function gl(){var t,e;oe.value=!0;try{const a=await le({type:"tmdb",token:String(d.tmdb_api_token||"")});a.ok?u.success(`✅ TMDB 令牌有效 — ${a.info}`):u.error(`❌ TMDB 连接失败 — ${a.info}`)}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{oe.value=!1}}async function _l(){var t,e;ne.value=!0;try{const a=await le({type:"proxy",url:String(d.search_proxy_url||"")});a.ok?u.success(`✅ 搜索代理可用 — ${a.info}`):u.error(`❌ 搜索代理不可用 — ${a.info}`)}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{ne.value=!1}}async function bl(){var t,e;ie.value=!0;try{const a=String(d.ip_geo_api_url||"");if(!a){u.warning("请先输入 IP 归属地查询 API 地址");return}const n=await le({type:"ip_geo",url:a});n.ok?u.success("✅ IP 归属地接口可用 — "+n.info):u.error("❌ IP 归属地接口不可用 — "+n.info)}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{ie.value=!1}}function wl(){const t=Y.value.trim();if(!t)return;const e=t.split(` +`).map(n=>n.trim()).filter(n=>n);let a=0;for(const n of e)$.value.includes(n)||($.value.push(n),a++);Y.value="",je(),a>0?u.success(`已添加 ${a} 条规则`):u.info("所有规则已存在")}function xl(t){$.value.splice(t,1),je()}function kl(t){return t.startsWith("#")?"info":t.startsWith("/")&&(t.endsWith("/")||t.endsWith("/g")||t.endsWith("/i")||t.endsWith("/gi"))?"warning":""}function je(){d.title_filter_rules=$.value.join(` +`)}function Vl(){const t=Q.value.trim();if(!t)return;const e=t.split(` +`).map(n=>n.trim()).filter(n=>n);let a=0;for(const n of e)E.value.includes(n)||(E.value.push(n),a++);Q.value="",Ae(),a>0?u.success(`已添加 ${a} 个关键词`):u.info("所有关键词已存在")}function hl(t){E.value.splice(t,1),Ae()}function Ae(){d.link_invalid_keywords=E.value.join(` +`)}function Sl(){const t=X.value.trim();if(!t)return;const e=t.split(` +`).map(n=>n.trim()).filter(n=>n);let a=0;for(const n of e)L.value.includes(n)||(L.value.push(n),a++);X.value="",Oe(),a>0?u.success():u.info("所有关键词已存在")}function Cl(t){L.value.splice(t,1),Oe()}function Oe(){d.quark_ad_keywords=L.value.join(` +`)}function Ul(){const t=Z.value.trim();if(!t)return;const e=t.split(` +`).map(n=>n.trim()).filter(n=>n);let a=0;for(const n of e)N.value.includes(n)||(N.value.push(n),a++);Z.value="",Re(),a>0?u.success():u.info("所有文件夹名已存在")}function Pl(t){N.value.splice(t,1),Re()}function Re(){d.quark_warning_folder_names=N.value.join(` +`)}function zl(){const t=ee.value.trim();if(!t)return;const e=t.split(` +`).map(n=>n.trim().toLowerCase().replace(/^\./,"")).filter(n=>n);let a=0;for(const n of e)F.value.includes(n)||(F.value.push(n),a++);ee.value="",Be(),a>0?u.success("已添加 ${added} 个后缀"):u.info("所有后缀已存在")}function Tl(t){F.value.splice(t,1),Be()}function Be(){d.quark_sus_extensions=F.value.join(` +`)}async function Il(){var t,e;fe.value=!0;try{const a={};for(const[x,p]of Object.entries(v.channels))if(p._enabled){const S={};for(const[T,w]of Object.entries(p))!T.startsWith("_")&&w!==""&&(S[T]=String(w));Object.keys(S).length>0&&(a[x]=S)}const n=pe.value.map(x=>({key:x.key,value:String(d[x.key]??x.value)}));await Qe(),n.push({key:"global_notify_config",value:JSON.stringify({channels:a,events:v.events})}),await Zl(n),u.success("配置已保存")}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"保存失败")}finally{fe.value=!1}}async function jl(){var e,a,n;if(await((e=xe.value)==null?void 0:e.validate().catch(()=>!1))){ce.value=!0;try{const x=await tt(z.oldPassword,z.newPassword);x.success?(u.success("✅ 密码修改成功,下次登录请使用新密码"),z.oldPassword="",z.newPassword="",z.confirmPassword=""):u.error(x.message)}catch(x){u.error(((n=(a=x.response)==null?void 0:a.data)==null?void 0:n.error)||"密码修改失败")}finally{ce.value=!1}}}const $e=y();function Al(){var t;(t=$e.value)==null||t.click()}async function Ol(t){var n,x,p;const e=t.target,a=(n=e.files)==null?void 0:n[0];if(a){if(!a.type.startsWith("image/")){u.error("仅支持图片文件(JPEG/PNG/WebP)"),e.value="";return}if(a.size>2*1024*1024){u.error("图片大小不能超过 2MB"),e.value="";return}try{const S=await st(a);S.success?(d.site_logo=S.url,u.success("✅ LOGO 已上传并生效")):u.error(S.message)}catch(S){u.error(((p=(x=S.response)==null?void 0:x.data)==null?void 0:p.error)||"上传失败")}e.value=""}}async function Rl(){try{d.site_logo="",await at("site_logo",""),u.success("已移除 LOGO")}catch{u.error("移除失败")}}return(t,e)=>{const a=k("el-input"),n=k("el-form-item"),x=k("el-icon"),p=k("el-button"),S=k("el-form"),T=k("el-card"),w=k("el-switch"),B=k("el-divider"),Ee=k("el-radio"),Bl=k("el-radio-group"),M=k("el-input-number"),I=k("el-tag"),$l=k("el-collapse-item"),El=k("el-collapse"),Le=k("el-option"),Ne=k("el-select"),G=k("el-table-column"),Ll=k("el-popconfirm"),Nl=k("el-table"),Fl=k("el-time-picker"),Dl=k("el-dialog");return f(),g("div",nt,[W(s(T,{id:"section-sys-site"},{header:i(()=>[...e[47]||(e[47]=[l("span",null,"🌐 网站设置",-1)])]),default:i(()=>[s(S,{"label-width":"180px","label-position":"left"},{default:i(()=>[s(n,{label:"网站名称"},{default:i(()=>[s(a,{modelValue:d.site_name,"onUpdate:modelValue":e[0]||(e[0]=o=>d.site_name=o),placeholder:"CloudSearch",style:{"max-width":"300px"}},null,8,["modelValue"]),e[48]||(e[48]=l("div",{class:"form-tip"},"显示在网站标题和页脚",-1))]),_:1}),s(n,{label:"网站 LOGO"},{default:i(()=>[l("div",it,[l("div",dt,[s(p,{type:"primary",onClick:Al},{icon:i(()=>[s(x,null,{default:i(()=>[s(We(ql))]),_:1})]),default:i(()=>[e[49]||(e[49]=r(" 选择LOGO图片并上传 ",-1))]),_:1}),l("input",{ref_key:"logoInputRef",ref:$e,type:"file",accept:".jpg,.jpeg,.png,.webp",hidden:"",onChange:Ol},null,544),e[50]||(e[50]=l("div",{class:"form-tip",style:{"margin-left":"12px"}},[r(" 推荐 "),l("strong",null,"320×60"),r(" 或宽比例(如 4:1),JPEG/PNG/WebP,最大 2MB。"),l("br"),r(" LOGO 同时也作为搜索结果无封面图时的兜底图使用。 ")],-1))]),d.site_logo?(f(),g("div",rt,[l("img",{src:String(d.site_logo),alt:"LOGO预览",onError:e[1]||(e[1]=o=>o.target.style.display="none")},null,40,ut),s(p,{size:"small",type:"danger",plain:"",onClick:Rl},{default:i(()=>[...e[51]||(e[51]=[r("移除",-1)])]),_:1})])):q("",!0)])]),_:1}),s(n,{label:"底部免责声明"},{default:i(()=>[s(a,{modelValue:d.site_disclaimer,"onUpdate:modelValue":e[2]||(e[2]=o=>d.site_disclaimer=o),type:"textarea",rows:4,placeholder:"输入免责声明内容"},null,8,["modelValue"]),e[52]||(e[52]=l("div",{class:"form-tip"},"显示在网站底部,留空则不显示",-1))]),_:1}),s(n,{label:"滚动通知文字"},{default:i(()=>[s(a,{modelValue:d.site_marquee,"onUpdate:modelValue":e[3]||(e[3]=o=>d.site_marquee=o),placeholder:"📢 欢迎使用CloudSearch",style:{"max-width":"500px"}},null,8,["modelValue"]),e[53]||(e[53]=l("div",{class:"form-tip"},"搜索栏下方滚动的通知条(从右往左滚动),留空则不显示",-1))]),_:1}),s(n,{label:"系统时区"},{default:i(()=>[s(a,{modelValue:d.timezone,"onUpdate:modelValue":e[4]||(e[4]=o=>d.timezone=o),placeholder:"Asia/Shanghai",style:{"max-width":"300px"}},null,8,["modelValue"]),e[54]||(e[54]=l("div",{class:"form-tip"},"例如 Asia/Shanghai、America/New_York、UTC,修改后保存配置即可生效",-1))]),_:1})]),_:1})]),_:1},512),[[K,!U.value||U.value==="sys-site"]]),W(s(T,{id:"section-sys-services"},{header:i(()=>[...e[55]||(e[55]=[l("span",null,"🔗 外部服务 & 缓存",-1)])]),default:i(()=>[s(S,{"label-width":"180px","label-position":"left"},{default:i(()=>{var o,c,_,j,Fe,De;return[s(n,{label:"PanSou 搜索引擎地址"},{default:i(()=>{var C,Ge;return[l("div",pt,[s(a,{modelValue:d.pansou_url,"onUpdate:modelValue":e[5]||(e[5]=ue=>d.pansou_url=ue),placeholder:"http://pansou:8888",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",loading:se.value,onClick:vl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(se.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"]),s(p,{type:"warning",loading:de.value,onClick:ml,size:"default",style:{width:"130px"},disabled:!((C=P.value)!=null&&C.hasUpdate)},{default:i(()=>{var ue;return[r(b(de.value?"更新中...":(ue=P.value)!=null&&ue.hasUpdate?"🔄 有新版本":"无更新"),1)]}),_:1},8,["loading","disabled"]),(Ge=P.value)!=null&&Ge.latestVersion?(f(),g("span",ft,b(P.value.latestVersion),1)):q("",!0)]),e[56]||(e[56]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"盘搜搜索引擎的地址",-1))]}),_:1}),l("div",ct,[l("div",mt,[l("div",{class:Ke(["db-stat-value",((o=P.value)==null?void 0:o.status)==="connected"?"text-success":"text-warning"])},b(((c=P.value)==null?void 0:c.status)==="connected"?"已连接":P.value?"未连接":"-"),3),e[57]||(e[57]=l("div",{class:"db-stat-label"},"PanSou 状态",-1))]),l("div",vt,[l("div",yt,b(((_=P.value)==null?void 0:_.channelCount)??"-"),1),e[58]||(e[58]=l("div",{class:"db-stat-label"},"频道数量",-1))]),l("div",gt,[l("div",_t,b(((j=P.value)==null?void 0:j.pluginCount)??"-"),1),e[59]||(e[59]=l("div",{class:"db-stat-label"},"插件数量",-1))]),l("div",bt,[l("div",wt,b(((Fe=P.value)==null?void 0:Fe.diskCount)??"-"),1),e[60]||(e[60]=l("div",{class:"db-stat-label"},"网盘数量",-1))]),l("div",xt,[l("div",kt,b(((De=P.value)==null?void 0:De.version)||"-"),1),e[61]||(e[61]=l("div",{class:"db-stat-label"},"版本",-1))])]),s(n,{label:"PanSou Web 端访问"},{default:i(()=>[s(w,{modelValue:he.value,"onUpdate:modelValue":e[6]||(e[6]=C=>he.value=C),"active-text":"启用","inactive-text":"关闭"},null,8,["modelValue"]),e[62]||(e[62]=l("div",{class:"form-tip",style:{"margin-left":"12px"}},[r(" 开启后可通过 "),l("code",null,"/pansou/"),r(" 路径访问 PanSou 搜索引擎管理界面 ")],-1))]),_:1}),s(n,{label:"启用代理"},{default:i(()=>[s(w,{modelValue:me.value,"onUpdate:modelValue":e[7]||(e[7]=C=>me.value=C),"active-text":"启用","inactive-text":"关闭"},null,8,["modelValue"]),e[63]||(e[63]=l("div",{class:"form-tip",style:{"margin-left":"8px"}}," 仅 PanSou 需要此配置,开启后搜索请求将经过代理转发 ",-1))]),_:1}),me.value?(f(),V(n,{key:0,label:"代理地址",style:{"margin-top":"-12px"}},{default:i(()=>[l("div",Vt,[s(a,{modelValue:d.search_proxy_url,"onUpdate:modelValue":e[8]||(e[8]=C=>d.search_proxy_url=C),placeholder:"http://127.0.0.1:7890",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",loading:ne.value,onClick:_l,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(ne.value?"测试中...":"测试代理"),1)]),_:1},8,["loading"])]),e[64]||(e[64]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"HTTP 或 SOCKS5 协议地址",-1))]),_:1})):q("",!0),s(n,{label:"视频解析服务地址"},{default:i(()=>[l("div",ht,[s(a,{modelValue:d.video_parser_url,"onUpdate:modelValue":e[9]||(e[9]=C=>d.video_parser_url=C),placeholder:"http://video-parser:3001",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",loading:ae.value,onClick:yl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(ae.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"])]),e[65]||(e[65]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"视频链接解析服务地址",-1))]),_:1}),s(n,{label:"TMDB 读取令牌"},{default:i(()=>[l("div",St,[s(a,{modelValue:d.tmdb_api_token,"onUpdate:modelValue":e[10]||(e[10]=C=>d.tmdb_api_token=C),type:"password","show-password":"",placeholder:"输入 TMDB API 读取令牌(Bearer Token)",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",loading:oe.value,onClick:gl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(oe.value?"测试中...":"验证令牌"),1)]),_:1},8,["loading"])]),e[66]||(e[66]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" 用于搜索 TMDB 获取评分、导演、演员等完整内容信息。 "),l("a",{href:"https://www.themoviedb.org/settings/api",target:"_blank",rel:"noopener",style:{color:"var(--primary-color)"}},"获取令牌 →")],-1))]),_:1}),s(n,{label:"IP 归属地查询"},{default:i(()=>[l("div",Ct,[s(a,{modelValue:d.ip_geo_api_url,"onUpdate:modelValue":e[11]||(e[11]=C=>d.ip_geo_api_url=C),placeholder:"https://cn.apihz.cn/api/ip/chaapi.php?id=xxx&key=***&ip={ip}&td=0",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",loading:ie.value,onClick:bl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(ie.value?"测试中...":"验证接口"),1)]),_:1},8,["loading"])]),e[67]||(e[67]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" IP 归属地查询 API 地址,"),l("code",null,"{ip}"),r(" 会被替换为实际 IP。 ")],-1)),e[68]||(e[68]=l("div",{style:{color:"var(--el-color-warning)","font-size":"13px","margin-top":"2px",width:"100%"}}," ⚠ 当前仅支持 接口盒子(apihz.cn) 格式 ",-1))]),_:1}),s(B,{"content-position":"left"},{default:i(()=>[...e[69]||(e[69]=[r("Redis 缓存",-1)])]),_:1}),s(n,{label:"Redis 连接地址"},{default:i(()=>[l("div",Ut,[s(a,{modelValue:d.redis_url,"onUpdate:modelValue":e[12]||(e[12]=C=>d.redis_url=C),placeholder:"redis://:***@172.17.0.1:6379",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",size:"default",loading:te.value,onClick:cl,style:{width:"100px"}},{default:i(()=>[r(b(te.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"])]),e[70]||(e[70]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" Redis 用于缓存搜索验证结果,提升响应速度。"),l("br"),l("strong",null,"带密码格式:"),l("code",null,"redis://:你的密码@地址:6379"),l("br"),r(" 修改后保存配置即可生效,无需重启。"),l("strong",null,"切换 Redis 只会清空缓存,不影响任何重要数据。")],-1))]),_:1})]}),_:1}),ke.value?(f(),g("div",Pt,[s(x,{class:"is-loading",size:20},{default:i(()=>[s(We(Ml))]),_:1}),e[71]||(e[71]=l("span",{style:{"margin-left":"8px",color:"#909399"}},"加载中...",-1))])):(f(),g("div",zt,[l("div",Tt,[l("div",{class:Ke(["db-stat-value",R.redis_status==="已连接"?"text-success":"text-warning"])},b(R.redis_status),3),e[72]||(e[72]=l("div",{class:"db-stat-label"},"Redis 状态",-1))]),l("div",It,[l("div",jt,b(R.db_size),1),e[73]||(e[73]=l("div",{class:"db-stat-label"},"数据库大小",-1))]),l("div",At,[l("div",Ot,b(R.save_records),1),e[74]||(e[74]=l("div",{class:"db-stat-label"},"转存记录",-1))]),l("div",Rt,[l("div",Bt,b(R.search_stats),1),e[75]||(e[75]=l("div",{class:"db-stat-label"},"搜索记录",-1))]),l("div",$t,[l("div",Et,b(R.cloud_configs),1),e[76]||(e[76]=l("div",{class:"db-stat-label"},"网盘配置",-1))]),l("div",Lt,[l("div",Nt,b(R.content_cache),1),e[77]||(e[77]=l("div",{class:"db-stat-label"},"内容缓存",-1))])]))]),_:1},512),[[K,!U.value||U.value==="sys-services"]]),W(s(T,{id:"section-sys-strategy"},{header:i(()=>[...e[78]||(e[78]=[l("span",null,"🔧 性能配置",-1)])]),default:i(()=>[l("div",Ft,[s(B,{"content-position":"left"},{default:i(()=>[...e[79]||(e[79]=[r("搜索结果返回方式",-1)])]),_:1}),l("div",Dt,[l("div",Gt,[e[80]||(e[80]=l("span",{class:"field-label"},"开启资源链接有效性监测",-1)),s(w,{modelValue:d.link_validation_enabled,"onUpdate:modelValue":e[13]||(e[13]=o=>d.link_validation_enabled=o),"active-value":"true","inactive-value":"false","active-text":"开启","inactive-text":"关闭"},null,8,["modelValue"])]),e[81]||(e[81]=l("div",{class:"field-desc"},"开启后搜索时会自动检测链接是否有效,过滤失效链接。关闭则直接返回所有结果(更快)",-1))]),l("div",Wt,[l("div",Kt,[e[84]||(e[84]=l("span",{class:"field-label"},"搜索结果方式",-1)),s(Bl,{modelValue:d.search_strategy,"onUpdate:modelValue":e[14]||(e[14]=o=>d.search_strategy=o)},{default:i(()=>[s(Ee,{value:"wait_all"},{default:i(()=>[...e[82]||(e[82]=[r("等待全部结果后展示",-1)])]),_:1}),s(Ee,{value:"stream_channel"},{default:i(()=>[...e[83]||(e[83]=[r("频道结果逐步展示",-1)])]),_:1})]),_:1},8,["modelValue"])]),e[85]||(e[85]=l("div",{class:"field-desc"},"逐步展示会分频道并发请求并优先展示先返回的频道;该模式下频道顺序按返回先后,不按配置顺序。",-1))]),s(B,{"content-position":"left"},{default:i(()=>[...e[86]||(e[86]=[r("搜索策略",-1)])]),_:1}),l("div",qt,[l("div",Mt,[l("div",Ht,[e[87]||(e[87]=l("span",{class:"field-label"},"使用所有频道参与搜索",-1)),s(w,{modelValue:Se.value,"onUpdate:modelValue":e[15]||(e[15]=o=>Se.value=o),"active-text":"开启","inactive-text":"关闭"},null,8,["modelValue"])]),e[88]||(e[88]=l("div",{class:"field-desc"},"包含未启用频道,命中更广但请求压力更高。",-1))]),l("div",Jt,[l("div",Yt,[e[89]||(e[89]=l("span",{class:"field-label"},"每类网盘有效结果数",-1)),s(M,{modelValue:d.search_result_limit,"onUpdate:modelValue":e[16]||(e[16]=o=>d.search_result_limit=o),min:1,max:100},null,8,["modelValue"])]),e[90]||(e[90]=l("div",{class:"field-desc"},"每个网盘类型最多展示的有效链接数量",-1))]),l("div",Qt,[l("div",Xt,[e[91]||(e[91]=l("span",{class:"field-label"},"验证并发数",-1)),s(M,{modelValue:d.validation_concurrency,"onUpdate:modelValue":e[17]||(e[17]=o=>d.validation_concurrency=o),min:1,max:50},null,8,["modelValue"])]),e[92]||(e[92]=l("div",{class:"field-desc"},"同时验证的链接数量",-1))]),l("div",Zt,[l("div",es,[e[93]||(e[93]=l("span",{class:"field-label"},"有效链接缓存 (s)",-1)),s(M,{modelValue:d.validation_cache_ttl_valid,"onUpdate:modelValue":e[18]||(e[18]=o=>d.validation_cache_ttl_valid=o),min:60,max:86400,step:60},null,8,["modelValue"])]),e[94]||(e[94]=l("div",{class:"field-desc"},"有效验证结果的缓存时间",-1))]),l("div",ls,[l("div",ts,[e[95]||(e[95]=l("span",{class:"field-label"},"无效链接缓存 (s)",-1)),s(M,{modelValue:d.validation_cache_ttl_invalid,"onUpdate:modelValue":e[19]||(e[19]=o=>d.validation_cache_ttl_invalid=o),min:60,max:86400,step:60},null,8,["modelValue"])]),e[96]||(e[96]=l("div",{class:"field-desc"},"无效验证结果的缓存时间",-1))]),l("div",ss,[l("div",as,[e[97]||(e[97]=l("span",{class:"field-label"},"验证超时 (ms)",-1)),s(M,{modelValue:d.validation_timeout,"onUpdate:modelValue":e[20]||(e[20]=o=>d.validation_timeout=o),min:1e3,max:3e4,step:500},null,8,["modelValue"])]),e[98]||(e[98]=l("div",{class:"field-desc"},"单个链接验证超时毫秒数",-1))])]),s(B,{"content-position":"left"},{default:i(()=>[...e[99]||(e[99]=[r("链接检测配置",-1)])]),_:1}),l("div",os,[e[101]||(e[101]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"搜索标题过滤规则")],-1)),l("div",ns,[s(a,{modelValue:Y.value,"onUpdate:modelValue":e[21]||(e[21]=o=>Y.value=o),type:"textarea",rows:1,placeholder:"每行一条规则,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),s(p,{type:"primary",onClick:wl,disabled:!Y.value.trim()},{default:i(()=>[...e[100]||(e[100]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),$.value.length>0?(f(),g("div",is,[(f(!0),g(A,null,O($.value,(o,c)=>(f(),V(I,{key:c,closable:"",type:kl(o),"disable-transitions":!1,onClose:_=>xl(c)},{default:i(()=>[r(b(o),1)]),_:2},1032,["type","onClose"]))),128))])):(f(),g("div",ds,"暂无过滤规则")),e[102]||(e[102]=l("div",{class:"filter-rule-help"},[l("div",{class:"help-title"},"📖 规则说明"),l("div",{class:"help-row"},[l("code",null,"# 注释内容"),r(" — "),l("code",null,"#"),r(" 后必须跟"),l("strong",null,"空格"),r("才会被识别为注释,单纯的 "),l("code",null,"#动漫"),r(" 会被当作要移除的文本")]),l("div",{class:"help-row"},[l("code",null,"/正则表达式/标志"),r(" — 正则匹配,匹配到的内容会被删除。如 "),l("code",null,"/^\\\\d+[、,.\\\\s]/"),r(" 去掉开头的序号")]),l("div",{class:"help-row"},[l("code",null,"纯文本"),r(" — 直接写要移除的文字(支持 emoji),凡是标题中含有的都会被删除")])],-1))]),l("div",rs,[e[104]||(e[104]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"失效关键词")],-1)),l("div",us,[s(a,{modelValue:Q.value,"onUpdate:modelValue":e[22]||(e[22]=o=>Q.value=o),type:"textarea",rows:1,placeholder:"每行一个关键词,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),s(p,{type:"danger",onClick:Vl,disabled:!Q.value.trim()},{default:i(()=>[...e[103]||(e[103]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[105]||(e[105]=l("div",{class:"field-desc"},"自定义失效关键词,PanSou 检测 summary 或 HTML 页面内容包含即判为失效。",-1)),E.value.length>0?(f(),g("div",ps,[(f(!0),g(A,null,O(E.value,(o,c)=>(f(),V(I,{key:c,closable:"",type:"danger","disable-transitions":!1,onClose:_=>hl(c)},{default:i(()=>[r(b(o),1)]),_:2},1032,["onClose"]))),128))])):(f(),g("div",fs,"暂无失效关键词,所有链接将默认判为有效"))]),s(B,{"content-position":"left"},{default:i(()=>[...e[106]||(e[106]=[r("夸克网盘转存清理",-1)])]),_:1}),l("div",cs,[e[108]||(e[108]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"广告关键词")],-1)),l("div",ms,[s(a,{modelValue:X.value,"onUpdate:modelValue":e[23]||(e[23]=o=>X.value=o),type:"textarea",rows:1,placeholder:"每行一个关键词,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),s(p,{type:"danger",onClick:Sl,disabled:!X.value.trim()},{default:i(()=>[...e[107]||(e[107]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[109]||(e[109]=l("div",{class:"field-desc"},"夸克转存完成后自动删除文件名/文件夹名含这些关键词的内容(防广告病毒)",-1)),L.value.length>0?(f(),g("div",vs,[(f(!0),g(A,null,O(L.value,(o,c)=>(f(),V(I,{key:c,closable:"",type:"warning","disable-transitions":!1,onClose:_=>Cl(c)},{default:i(()=>[r(b(o),1)]),_:2},1032,["onClose"]))),128))])):(f(),g("div",ys,"暂未配置广告关键词,不会进行广告清理"))]),l("div",gs,[e[111]||(e[111]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"警示文件夹名")],-1)),l("div",_s,[s(a,{modelValue:Z.value,"onUpdate:modelValue":e[24]||(e[24]=o=>Z.value=o),type:"textarea",rows:1,placeholder:"每行一个文件夹名,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),s(p,{type:"primary",onClick:Ul,disabled:!Z.value.trim()},{default:i(()=>[...e[110]||(e[110]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[112]||(e[112]=l("div",{class:"field-desc"},"夸克转存完成后在网盘根目录自动创建这些警示文件夹(自动加上 ⚠️ 前缀)",-1)),N.value.length>0?(f(),g("div",bs,[(f(!0),g(A,null,O(N.value,(o,c)=>(f(),V(I,{key:c,closable:"",type:"info","disable-transitions":!1,onClose:_=>Pl(c)},{default:i(()=>[r(b(o),1)]),_:2},1032,["onClose"]))),128))])):(f(),g("div",ws,"暂未配置警示文件夹"))]),l("div",xs,[e[114]||(e[114]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"可疑文件后缀")],-1)),l("div",ks,[s(a,{modelValue:ee.value,"onUpdate:modelValue":e[25]||(e[25]=o=>ee.value=o),type:"textarea",rows:1,placeholder:"每行一个后缀,不要带点号,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),s(p,{type:"danger",onClick:zl,disabled:!ee.value.trim()},{default:i(()=>[...e[113]||(e[113]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[115]||(e[115]=l("div",{class:"field-desc"},"夸克转存完成后自动删除后缀匹配的文件(防病毒,如 bat、exe、scr 等)",-1)),F.value.length>0?(f(),g("div",Vs,[(f(!0),g(A,null,O(F.value,(o,c)=>(f(),V(I,{key:c,closable:"",type:"danger","disable-transitions":!1,onClose:_=>Tl(c)},{default:i(()=>[r("."+b(o),1)]),_:2},1032,["onClose"]))),128))])):(f(),g("div",hs,"暂无配置,使用默认列表:bat、exe、vbs、scr、cmd、com、pif、js、jar、msi、reg、inf、ps1"))])])]),_:1},512),[[K,!U.value||U.value==="sys-strategy"]]),W(s(T,{id:"section-sys-password"},{header:i(()=>[...e[116]||(e[116]=[l("span",null,"🔑 修改管理员密码",-1)])]),default:i(()=>[s(S,{ref_key:"passwordFormRef",ref:xe,model:z,rules:fl,"label-width":"120px","label-position":"left"},{default:i(()=>[s(n,{label:"原密码",prop:"oldPassword"},{default:i(()=>[s(a,{modelValue:z.oldPassword,"onUpdate:modelValue":e[26]||(e[26]=o=>z.oldPassword=o),type:"password","show-password":"",placeholder:"输入原密码",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),s(n,{label:"新密码",prop:"newPassword"},{default:i(()=>[s(a,{modelValue:z.newPassword,"onUpdate:modelValue":e[27]||(e[27]=o=>z.newPassword=o),type:"password","show-password":"",placeholder:"输入新密码(至少6位)",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),s(n,{label:"确认新密码",prop:"confirmPassword"},{default:i(()=>[s(a,{modelValue:z.confirmPassword,"onUpdate:modelValue":e[28]||(e[28]=o=>z.confirmPassword=o),type:"password","show-password":"",placeholder:"再次输入新密码",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),s(n,null,{default:i(()=>[s(p,{type:"primary",loading:ce.value,onClick:jl},{default:i(()=>[...e[117]||(e[117]=[r("修改密码",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),_:1},512),[[K,!U.value||U.value==="sys-password"]]),W(s(T,{id:"section-sys-notify"},{header:i(()=>[...e[118]||(e[118]=[l("div",{style:{display:"flex","align-items":"center","justify-content":"space-between"}},[l("span",null,"📬 消息推送")],-1)])]),default:i(()=>[s(El,{"model-value":["global"]},{default:i(()=>[s($l,{title:"全局推送(管理员兜底)",name:"global"},{default:i(()=>[l("div",Ss,[s(S,{"label-width":"140px","label-position":"left"},{default:i(()=>[l("div",Cs,[(f(!0),g(A,null,O(D.value,(o,c)=>(f(),g("div",{key:c,style:{border:"1px solid var(--el-border-color-light)","border-radius":"6px",padding:"8px 12px"}},[l("div",Us,[s(w,{modelValue:v.channels[c]._enabled,"onUpdate:modelValue":_=>v.channels[c]._enabled=_,size:"small"},null,8,["modelValue","onUpdate:modelValue"]),l("strong",null,b(o.label),1),v.channels[c]._enabled?(f(),V(p,{key:0,size:"small",text:"",type:"primary",onClick:_=>pl(c),loading:v.channels[c]._testing},{default:i(()=>[...e[119]||(e[119]=[r("测试",-1)])]),_:1},8,["onClick","loading"])):q("",!0)]),v.channels[c]._enabled?(f(),g("div",Ps,[(f(!0),g(A,null,O(o.params,_=>(f(),V(n,{key:_.key,label:_.label,style:{"margin-bottom":"6px"}},{default:i(()=>[_.type==="password"?(f(),V(a,{key:0,modelValue:v.channels[c][_.key],"onUpdate:modelValue":j=>v.channels[c][_.key]=j,type:"password","show-password":"",placeholder:_.placeholder||"",style:{"max-width":"360px"}},null,8,["modelValue","onUpdate:modelValue","placeholder"])):_.type==="switch"?(f(),V(w,{key:1,modelValue:v.channels[c][_.key],"onUpdate:modelValue":j=>v.channels[c][_.key]=j},null,8,["modelValue","onUpdate:modelValue"])):_.type==="number"?(f(),V(M,{key:2,modelValue:v.channels[c][_.key],"onUpdate:modelValue":j=>v.channels[c][_.key]=j,min:1,max:10,style:{"max-width":"160px"}},null,8,["modelValue","onUpdate:modelValue"])):(f(),V(a,{key:3,modelValue:v.channels[c][_.key],"onUpdate:modelValue":j=>v.channels[c][_.key]=j,placeholder:_.placeholder||"",style:{"max-width":"360px"}},null,8,["modelValue","onUpdate:modelValue","placeholder"]))]),_:2},1032,["label"]))),128))])):q("",!0)]))),128))]),s(B,{"content-position":"left"},{default:i(()=>[...e[120]||(e[120]=[r("全局事件开关",-1)])]),_:1}),l("div",zs,[s(w,{modelValue:v.events.on_save_success,"onUpdate:modelValue":e[29]||(e[29]=o=>v.events.on_save_success=o),"active-text":"转存成功"},null,8,["modelValue"]),s(w,{modelValue:v.events.on_save_fail,"onUpdate:modelValue":e[30]||(e[30]=o=>v.events.on_save_fail=o),"active-text":"转存失败"},null,8,["modelValue"]),s(w,{modelValue:v.events.on_cookie_expire,"onUpdate:modelValue":e[31]||(e[31]=o=>v.events.on_cookie_expire=o),"active-text":"Cookie过期"},null,8,["modelValue"]),s(w,{modelValue:v.events.on_cleanup,"onUpdate:modelValue":e[32]||(e[32]=o=>v.events.on_cleanup=o),"active-text":"清理完成"},null,8,["modelValue"])]),e[121]||(e[121]=l("div",{class:"form-tip",style:{"margin-top":"8px"}},"全局推送作为兜底通道。设置了推送用户的网盘配置走用户推送,未设置的走全局推送。",-1))]),_:1})])]),_:1})]),_:1}),e[131]||(e[131]=r()),s(B,{"content-position":"left"},{default:i(()=>[...e[122]||(e[122]=[r("添加推送用户",-1)])]),_:1}),l("div",Ts,[l("div",Is,[s(Ne,{modelValue:m.account,"onUpdate:modelValue":e[33]||(e[33]=o=>m.account=o),filterable:"","allow-create":"",clearable:"",placeholder:"选择推广账户",style:{width:"200px"}},{default:i(()=>[(f(!0),g(A,null,O(Te.value,o=>(f(),V(Le,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),s(Ne,{modelValue:m.channels,"onUpdate:modelValue":e[34]||(e[34]=o=>m.channels=o),multiple:"","collapse-tags":"","collapse-tags-tooltip":"",placeholder:"选择您所需的消息频道",style:{width:"260px"}},{default:i(()=>[(f(!0),g(A,null,O(ll.value,(o,c)=>(f(),V(Le,{key:c,label:o.label,value:c},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),s(w,{modelValue:m.events.on_save_success,"onUpdate:modelValue":e[35]||(e[35]=o=>m.events.on_save_success=o),"active-text":"转存成功"},null,8,["modelValue"]),s(w,{modelValue:m.events.on_save_fail,"onUpdate:modelValue":e[36]||(e[36]=o=>m.events.on_save_fail=o),"active-text":"转存失败"},null,8,["modelValue"]),s(w,{modelValue:m.events.on_cookie_expire,"onUpdate:modelValue":e[37]||(e[37]=o=>m.events.on_cookie_expire=o),"active-text":"Cookie过期"},null,8,["modelValue"]),s(w,{modelValue:m.events.on_cleanup,"onUpdate:modelValue":e[38]||(e[38]=o=>m.events.on_cleanup=o),"active-text":"清理完成"},null,8,["modelValue"]),s(p,{type:"primary",size:"small",loading:_e.value,onClick:al},{default:i(()=>[r(b(m.id?"更新":"确认添加"),1)]),_:1},8,["loading"]),m.id?(f(),V(p,{key:0,size:"small",onClick:sl},{default:i(()=>[...e[123]||(e[123]=[r("取消编辑",-1)])]),_:1})):q("",!0)])]),s(B,{"content-position":"left"},{default:i(()=>[...e[124]||(e[124]=[r("推送用户列表",-1)])]),_:1}),s(Nl,{data:ze.value,stripe:"",style:{width:"100%"},"empty-text":"暂无推送用户"},{default:i(()=>[s(G,{prop:"account",label:"推广账号","min-width":"140"}),s(G,{label:"转存成功",width:"90",align:"center"},{default:i(({row:o})=>[re(o,"on_save_success")?(f(),V(I,{key:0,type:"success",size:"small"},{default:i(()=>[...e[125]||(e[125]=[r("✔",-1)])]),_:1})):(f(),g("span",js,"—"))]),_:1}),s(G,{label:"转存失败",width:"90",align:"center"},{default:i(({row:o})=>[re(o,"on_save_fail")?(f(),V(I,{key:0,type:"success",size:"small"},{default:i(()=>[...e[126]||(e[126]=[r("✔",-1)])]),_:1})):(f(),g("span",As,"—"))]),_:1}),s(G,{label:"Cookie过期",width:"90",align:"center"},{default:i(({row:o})=>[re(o,"on_cookie_expire")?(f(),V(I,{key:0,type:"success",size:"small"},{default:i(()=>[...e[127]||(e[127]=[r("✔",-1)])]),_:1})):(f(),g("span",Os,"—"))]),_:1}),s(G,{label:"清理完成",width:"90",align:"center"},{default:i(({row:o})=>[re(o,"on_cleanup")?(f(),V(I,{key:0,type:"success",size:"small"},{default:i(()=>[...e[128]||(e[128]=[r("✔",-1)])]),_:1})):(f(),g("span",Rs,"—"))]),_:1}),s(G,{label:"已启用的通道","min-width":"220"},{default:i(({row:o})=>[(f(!0),g(A,null,O(Ie(o),(c,_)=>(f(),V(I,{key:_,size:"small",style:{"margin-right":"4px","margin-bottom":"2px"}},{default:i(()=>[r(b(il(_)),1)]),_:2},1024))),128)),dl(o)?q("",!0):(f(),g("span",Bs,"走全局推送"))]),_:1}),s(G,{label:"操作",width:"180",fixed:"right"},{default:i(({row:o})=>[s(p,{text:"",type:"primary",size:"small",onClick:c=>tl(o)},{default:i(()=>[...e[129]||(e[129]=[r("编辑",-1)])]),_:1},8,["onClick"]),s(Ll,{title:"确定删除该推送用户?",onConfirm:c=>nl(o)},{reference:i(()=>[s(p,{text:"",type:"danger",size:"small"},{default:i(()=>[...e[130]||(e[130]=[r("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:1})]),_:1},8,["data"])]),_:1},512),[[K,!U.value||U.value==="sys-notify"]]),W(s(T,{id:"section-sys-daily-report"},{header:i(()=>[l("div",$s,[e[134]||(e[134]=l("span",null,"📊 每日汇报",-1)),l("div",null,[s(p,{size:"small",loading:ve.value,onClick:Xe},{default:i(()=>[...e[132]||(e[132]=[r("📋 预览",-1)])]),_:1},8,["loading"]),s(p,{size:"small",type:"primary",loading:ye.value,onClick:Ze},{default:i(()=>[...e[133]||(e[133]=[r("▶ 发送测试",-1)])]),_:1},8,["loading"])])])]),default:i(()=>[s(S,{"label-width":"140px","label-position":"left"},{default:i(()=>[s(n,{label:"启用每日汇报"},{default:i(()=>[s(w,{modelValue:h.enabled,"onUpdate:modelValue":e[39]||(e[39]=o=>h.enabled=o),"active-text":"每天8点自动发送"},null,8,["modelValue"])]),_:1}),s(n,{label:"发送时间"},{default:i(()=>[s(Fl,{modelValue:h.time,"onUpdate:modelValue":e[40]||(e[40]=o=>h.time=o),format:"HH:mm","value-format":"HH:mm",placeholder:"选择时间",disabled:!h.enabled},null,8,["modelValue","disabled"]),e[135]||(e[135]=l("div",{class:"form-tip"},"默认每天 08:00 发送前一天的汇总报告",-1))]),_:1}),s(n,{label:"报告内容"},{default:i(()=>[l("div",Es,[s(w,{modelValue:h.includeSearch,"onUpdate:modelValue":e[41]||(e[41]=o=>h.includeSearch=o),"active-text":"搜索统计",disabled:!h.enabled},null,8,["modelValue","disabled"]),s(w,{modelValue:h.includeSaves,"onUpdate:modelValue":e[42]||(e[42]=o=>h.includeSaves=o),"active-text":"转存统计",disabled:!h.enabled},null,8,["modelValue","disabled"]),s(w,{modelValue:h.includeStorage,"onUpdate:modelValue":e[43]||(e[43]=o=>h.includeStorage=o),"active-text":"网盘容量",disabled:!h.enabled},null,8,["modelValue","disabled"]),s(w,{modelValue:h.includeUsers,"onUpdate:modelValue":e[44]||(e[44]=o=>h.includeUsers=o),"active-text":"用户数",disabled:!h.enabled},null,8,["modelValue","disabled"])])]),_:1}),s(n,{label:"上次发送"},{default:i(()=>[l("span",null,b(Pe.value||"从未发送"),1)]),_:1})]),_:1}),s(Dl,{modelValue:ge.value,"onUpdate:modelValue":e[45]||(e[45]=o=>ge.value=o),title:"📊 每日汇报预览",width:"600px"},{default:i(()=>[l("div",Ls,b(Ue.value),1)]),_:1},8,["modelValue"])]),_:1},512),[[K,!U.value||U.value==="sys-daily-report"]]),W(s(T,{id:"section-sys-maintenance"},{header:i(()=>[...e[136]||(e[136]=[l("span",null,"🔄 系统维护",-1)])]),default:i(()=>[e[141]||(e[141]=r()),s(S,{"label-width":"180px","label-position":"left"},{default:i(()=>[s(n,{label:"自动更新镜像"},{default:i(()=>[s(w,{modelValue:Ce.value,"onUpdate:modelValue":e[46]||(e[46]=o=>Ce.value=o),"active-text":"启用","inactive-text":"禁用"},null,8,["modelValue"]),e[137]||(e[137]=r()),e[138]||(e[138]=l("div",{class:"form-tip"},"启用后 CloudSearch 将自动检测并更新到最新镜像版本",-1)),e[139]||(e[139]=r()),e[140]||(e[140]=l("div",{class:"form-tip",style:{color:"var(--(--el-color-warning,#e6a23c))"}}," 当前需手动在服务器执行:docker-compose -f /opt/CloudSearch/docker-compose.yml pull && docker-compose -f /opt/CloudSearch/docker-compose.yml up -d ",-1))]),_:1})]),_:1})]),_:1},512),[[K,!U.value||U.value==="sys-maintenance"]]),l("div",Ns,[s(p,{type:"primary",size:"large",loading:fe.value,onClick:Il},{default:i(()=>[...e[142]||(e[142]=[r(" 保存配置 ",-1)])]),_:1},8,["loading"])])])}}}),Ws=ot(Fs,[["__scopeId","data-v-6cdc2b1a"]]);export{Ws as default}; diff --git a/source_clean/frontend-src/dist-vite/assets/SystemConfig-C3is0eeI.js b/source_clean/frontend-src/dist-vite/assets/SystemConfig-C3is0eeI.js deleted file mode 100644 index 04fd1e4..0000000 --- a/source_clean/frontend-src/dist-vite/assets/SystemConfig-C3is0eeI.js +++ /dev/null @@ -1,16 +0,0 @@ -import{d as Tl,o as Il,E as u,x as Ol,a as p,c as y,K as q,L as M,f as a,w as i,b as l,v as D,h as g,i as Z,j as V,l as r,k as Re,N as jl,e as W,t as b,n as $e,y as k,M as Al,F as O,r as j,z as Bl,u as El}from"./index-D279dJND.js";import{k as Ll,w as Rl,x as $l,p as Nl,y as Fl,z as Gl,A as ee,B as Wl,C as Kl,D as ql,_ as Ml}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const Dl={class:"system-config"},Jl={class:"fallback-upload-wrap"},Hl={class:"fallback-upload-row"},Yl={key:0,class:"fallback-preview"},Ql=["src"],Xl={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},Zl={key:0,style:{"font-size":"11px",color:"#e6a23c","white-space":"nowrap"}},et={class:"pansou-status-grid"},lt={class:"db-stat-item"},tt={class:"db-stat-item"},st={class:"db-stat-value"},at={class:"db-stat-item"},ot={class:"db-stat-value"},nt={class:"db-stat-item"},it={class:"db-stat-value"},dt={class:"db-stat-item"},rt={class:"db-stat-value"},ut={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},pt={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},ft={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},ct={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},vt={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},mt={key:0,style:{"text-align":"center",padding:"16px"}},yt={key:1,class:"db-status-grid"},_t={class:"db-stat-item"},gt={class:"db-stat-item"},bt={class:"db-stat-value"},wt={class:"db-stat-item"},xt={class:"db-stat-value"},kt={class:"db-stat-item"},Vt={class:"db-stat-value"},ht={class:"db-stat-item"},Ct={class:"db-stat-value"},Pt={class:"db-stat-item"},St={class:"db-stat-value"},Ut={class:"strategy-section"},zt={class:"field-block"},Tt={class:"field-label-row"},It={class:"field-block"},Ot={class:"field-label-row"},jt={class:"strategy-grid"},At={class:"grid-cell"},Bt={class:"field-label-row"},Et={class:"grid-cell"},Lt={class:"field-label-row"},Rt={class:"grid-cell"},$t={class:"field-label-row"},Nt={class:"grid-cell"},Ft={class:"field-label-row"},Gt={class:"grid-cell"},Wt={class:"field-label-row"},Kt={class:"grid-cell"},qt={class:"field-label-row"},Mt={class:"field-block"},Dt={style:{display:"flex",gap:"8px","align-items":"stretch"}},Jt={key:0,class:"tag-list"},Ht={key:1,class:"tag-empty"},Yt={class:"field-block"},Qt={style:{display:"flex",gap:"8px","align-items":"stretch"}},Xt={key:0,class:"tag-list"},Zt={key:1,class:"tag-empty"},es={class:"field-block"},ls={style:{display:"flex",gap:"8px","align-items":"stretch"}},ts={key:0,class:"tag-list"},ss={key:1,class:"tag-empty"},as={class:"field-block"},os={style:{display:"flex",gap:"8px","align-items":"stretch"}},ns={key:0,class:"tag-list"},is={key:1,class:"tag-empty"},ds={class:"field-block"},rs={style:{display:"flex",gap:"8px","align-items":"stretch"}},us={key:0,class:"tag-list"},ps={key:1,class:"tag-empty"},fs={class:"strategy-section"},cs={style:{display:"grid","grid-template-columns":"repeat(2,1fr)",gap:"8px"}},vs={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"6px"}},ms={key:0},ys={style:{display:"flex","flex-wrap":"wrap",gap:"16px"}},_s={style:{border:"1px solid var(--el-border-color-light)","border-radius":"6px",padding:"12px 16px","margin-bottom":"16px"}},gs={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},bs={key:1,style:{color:"#ccc"}},ws={key:1,style:{color:"#ccc"}},xs={key:1,style:{color:"#ccc"}},ks={key:1,style:{color:"#ccc"}},Vs={key:0,style:{color:"#909399","font-size":"12px"}},hs={class:"save-bar"},Cs=Tl({__name:"SystemConfig",props:{section:{}},setup(Ne){const Fe=Ne,Ge=Bl();El();const U=D(()=>Fe.section||Ge.query.section||""),_e=g(),ue=g([]),d=Z({}),E=g([]),J=g(""),L=g([]),H=g(""),R=g([]),Y=g(""),$=g([]),Q=g(""),X=g(""),N=g([]),pe=g(!1),fe=g(!1),A=Z({db_size:"-",save_records:0,search_stats:0,cloud_configs:0,content_cache:0,redis_status:"未连接"}),ge=g(!0),le=g(!1),te=g(!1),se=g(!1),ae=g(!1),oe=g(!1),ne=g(!1),P=g(null),be=g(!0),ie=g(!1),ce=D({get:()=>String(d.search_proxy_enabled)==="true",set:t=>{d.search_proxy_enabled=t?"true":"false"}}),we=D({get:()=>String(d.pansou_web_enabled)==="true",set:t=>{d.pansou_web_enabled=t?"true":"false"}}),xe=D({get:()=>String(d.search_all_channels)==="true",set:t=>{d.search_all_channels=t?"true":"false"}}),ke=D({get:()=>String(d.auto_update_enabled)==="true",set:t=>{d.auto_update_enabled=t?"true":"false"}}),Ve=g([]),F=g({}),ve=g(!1),he=g([]);async function We(){try{const t=await fetch("/api/admin/cloud-configs",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}});if(!t.ok)return;const e=await t.json(),s=Array.isArray(e)?[...new Set(e.map(o=>o.promotion_account||"").filter(Boolean))]:[];he.value=s}catch{}}const v=Z({id:null,account:"",channels:[],events:{on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}),Ke=D(()=>{var e;const t={};for(const[s,o]of Object.entries(F.value))(e=m.channels[s])!=null&&e._enabled&&(t[s]=o);return t}),m=Z({channels:{},events:{on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}});function qe(t){var e,s,o,w;if(t){v.id=t.id,v.account=t.account;const f=t.notify_config||{};v.channels=Object.keys(f.channels||{}),v.events={on_save_success:((e=f.events)==null?void 0:e.on_save_success)!==!1,on_save_fail:((s=f.events)==null?void 0:s.on_save_fail)!==!1,on_cookie_expire:((o=f.events)==null?void 0:o.on_cookie_expire)!==!1,on_cleanup:((w=f.events)==null?void 0:w.on_cleanup)===!0}}else v.id=null,v.account="",v.channels=[],v.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}function Me(){v.id=null,v.account="",v.channels=[],v.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}function de(t,e){return((t.notify_config||{}).events||{})[e]===!0}async function De(){if(!v.account){u.warning("请填写推广账号");return}ve.value=!0;try{const t={account:v.account,notify_config:{channels:{},events:v.events}},e={};for(const o of v.channels)e[o]={};t.notify_config.channels=e,v.id?await fetch("/api/admin/push-users/"+v.id,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")},body:JSON.stringify(t)}):await fetch("/api/admin/push-users",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")},body:JSON.stringify(t)});const s=!!v.id;v.id=null,v.account="",v.channels=[],v.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1},u.success(s?"推送用户已更新":"推送用户已添加"),await me()}catch(t){u.error(t.message||"保存失败")}finally{ve.value=!1}}async function me(){try{const t=await fetch("/api/admin/push-users",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}});t.ok&&(Ve.value=await t.json())}catch(t){console.error("Failed to load push users",t)}}async function Je(){try{F.value=await $l()}catch(t){console.error("Failed to load providers",t)}}async function He(t){try{await fetch("/api/admin/push-users/"+t.id,{method:"DELETE",headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}}),u.success("已删除"),await me()}catch(e){u.error(e.message||"删除失败")}}function Ce(t){var s;return((s=t.notify_config)==null?void 0:s.channels)||{}}function Ye(t){var e;return((e=F.value[t])==null?void 0:e.label)||t}function Qe(t){return Object.keys(Ce(t)).length>0}function Xe(){const t={};for(const[e,s]of Object.entries(F.value)){t[e]={_enabled:!1,_testing:!1};for(const o of s.params||[])t[e][o.key]=o.default||""}m.channels=t,m.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}async function Ze(){try{const s=(await(await fetch("/api/admin/system-configs",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}})).json()).find(o=>o.key==="global_notify_config");if(s&&s.value)try{const o=JSON.parse(s.value),w=o.channels||{};for(const[f,h]of Object.entries(w))if(m.channels[f]){m.channels[f]._enabled=!0;for(const[z,x]of Object.entries(h))m.channels[f][z]=x}o.events&&(m.events.on_save_success=o.events.on_save_success!==!1,m.events.on_save_fail=o.events.on_save_fail!==!1,m.events.on_cookie_expire=o.events.on_cookie_expire!==!1,m.events.on_cleanup=o.events.on_cleanup===!0)}catch{}}catch{}}async function el(t){const e=m.channels[t];if(!(!e||!e._enabled)){e._testing=!0;try{const s=await Fl(t);s.success?u.success(s.message):u.error(s.message)}catch(s){u.error(s.message||"测试失败")}finally{e._testing=!1}}}const S=Z({oldPassword:"",newPassword:"",confirmPassword:""}),ll={oldPassword:[{required:!0,message:"请输入原密码",trigger:"blur"}],newPassword:[{required:!0,message:"请输入新密码",trigger:"blur"},{min:6,message:"新密码至少需要6个字符",trigger:"blur"}],confirmPassword:[{required:!0,message:"请确认新密码",trigger:"blur"},{validator:(t,e,s)=>{e!==S.newPassword?s(new Error("两次输入的密码不一致")):s()},trigger:"blur"}]};Il(async()=>{try{ue.value=await Ll();for(const f of ue.value)d[f.key]=f.value;const t=String(d.title_filter_rules||"");E.value=t.split(` -`).filter(f=>f.trim());const e=String(d.link_invalid_keywords||"");L.value=e.split(` -`).filter(f=>f.trim());const s=String(d.quark_ad_keywords||"");R.value=s.split(` -`).filter(f=>f.trim());const o=String(d.quark_warning_folder_names||"");$.value=o.split(` -`).filter(f=>f.trim());const w=String(d.quark_sus_extensions||"");N.value=w.split(` -`).filter(f=>f.trim())}catch{u.error("加载系统配置失败")}try{const t=await Rl();Object.assign(A,t)}catch{A.db_size="无法读取"}finally{ge.value=!1}ye(),await Je(),Xe(),await Ze(),me(),We()}),Ol(F,()=>{for(const[t,e]of Object.entries(F.value))if(!m.channels[t]){m.channels[t]={_enabled:!1,_testing:!1};for(const s of e.params||[])m.channels[t][s.key]=s.default||""}});async function tl(){var e,s;const t=String(d.redis_url||"redis://redis:6379");le.value=!0;try{const o=await Gl(t);o.ok?u.success(`✅ Redis 连接成功 — ${o.info}`):u.error(`❌ Redis 连接失败 — ${o.info}`)}catch(o){u.error(((s=(e=o.response)==null?void 0:e.data)==null?void 0:s.error)||"测试请求失败")}finally{le.value=!1}}async function ye(){be.value=!0;try{const t=localStorage.getItem("admin_token"),e={};t&&(e.Authorization="Bearer "+t);const s=await fetch("/api/admin/pansou-info",{headers:e});if(!s.ok)throw new Error("HTTP "+s.status);const o=await s.json();P.value=o}catch{P.value={status:"disconnected",version:"-",channelCount:0,pluginCount:0,diskCount:0}}finally{be.value=!1}}async function sl(){ie.value=!0;try{const t=localStorage.getItem("admin_token"),e={"Content-Type":"application/json"};t&&(e.Authorization="Bearer "+t);const o=await(await fetch("/api/admin/update-pansou",{method:"POST",headers:e})).json();o.ok?(u.success("✅ PanSou 已更新并重启"),setTimeout(()=>ye(),3e3)):u.error("❌ 更新失败 — "+(o.error||"未知错误"))}catch(t){u.error(t.message||"更新请求失败")}finally{ie.value=!1}}async function al(){var t,e;te.value=!0;try{const s=await ee({type:"pansou",url:String(d.pansou_url||"")});s.ok?(ye(),u.success(`✅ PanSou 连接成功 — ${s.info}`)):u.error(`❌ PanSou 连接失败 — ${s.info}`)}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{te.value=!1}}async function ol(){var t,e;se.value=!0;try{const s=await ee({type:"video_parser",url:String(d.video_parser_url||"")});s.ok?u.success(`✅ 视频解析服务连接成功 — ${s.info}`):u.error(`❌ 视频解析服务连接失败 — ${s.info}`)}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{se.value=!1}}async function nl(){var t,e;ae.value=!0;try{const s=await ee({type:"tmdb",token:String(d.tmdb_api_token||"")});s.ok?u.success(`✅ TMDB 令牌有效 — ${s.info}`):u.error(`❌ TMDB 连接失败 — ${s.info}`)}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{ae.value=!1}}async function il(){var t,e;oe.value=!0;try{const s=await ee({type:"proxy",url:String(d.search_proxy_url||"")});s.ok?u.success(`✅ 搜索代理可用 — ${s.info}`):u.error(`❌ 搜索代理不可用 — ${s.info}`)}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{oe.value=!1}}async function dl(){var t,e;ne.value=!0;try{const s=String(d.ip_geo_api_url||"");if(!s){u.warning("请先输入 IP 归属地查询 API 地址");return}const o=await ee({type:"ip_geo",url:s});o.ok?u.success("✅ IP 归属地接口可用 — "+o.info):u.error("❌ IP 归属地接口不可用 — "+o.info)}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{ne.value=!1}}function rl(){const t=J.value.trim();if(!t)return;const e=t.split(` -`).map(o=>o.trim()).filter(o=>o);let s=0;for(const o of e)E.value.includes(o)||(E.value.push(o),s++);J.value="",Pe(),s>0?u.success(`已添加 ${s} 条规则`):u.info("所有规则已存在")}function ul(t){E.value.splice(t,1),Pe()}function pl(t){return t.startsWith("#")?"info":t.startsWith("/")&&(t.endsWith("/")||t.endsWith("/g")||t.endsWith("/i")||t.endsWith("/gi"))?"warning":""}function Pe(){d.title_filter_rules=E.value.join(` -`)}function fl(){const t=H.value.trim();if(!t)return;const e=t.split(` -`).map(o=>o.trim()).filter(o=>o);let s=0;for(const o of e)L.value.includes(o)||(L.value.push(o),s++);H.value="",Se(),s>0?u.success(`已添加 ${s} 个关键词`):u.info("所有关键词已存在")}function cl(t){L.value.splice(t,1),Se()}function Se(){d.link_invalid_keywords=L.value.join(` -`)}function vl(){const t=Y.value.trim();if(!t)return;const e=t.split(` -`).map(o=>o.trim()).filter(o=>o);let s=0;for(const o of e)R.value.includes(o)||(R.value.push(o),s++);Y.value="",Ue(),s>0?u.success():u.info("所有关键词已存在")}function ml(t){R.value.splice(t,1),Ue()}function Ue(){d.quark_ad_keywords=R.value.join(` -`)}function yl(){const t=Q.value.trim();if(!t)return;const e=t.split(` -`).map(o=>o.trim()).filter(o=>o);let s=0;for(const o of e)$.value.includes(o)||($.value.push(o),s++);Q.value="",ze(),s>0?u.success():u.info("所有文件夹名已存在")}function _l(t){$.value.splice(t,1),ze()}function ze(){d.quark_warning_folder_names=$.value.join(` -`)}function gl(){const t=X.value.trim();if(!t)return;const e=t.split(` -`).map(o=>o.trim().toLowerCase().replace(/^\./,"")).filter(o=>o);let s=0;for(const o of e)N.value.includes(o)||(N.value.push(o),s++);X.value="",Te(),s>0?u.success("已添加 ${added} 个后缀"):u.info("所有后缀已存在")}function bl(t){N.value.splice(t,1),Te()}function Te(){d.quark_sus_extensions=N.value.join(` -`)}async function wl(){var t,e;pe.value=!0;try{const s={};for(const[w,f]of Object.entries(m.channels))if(f._enabled){const h={};for(const[z,x]of Object.entries(f))!z.startsWith("_")&&x!==""&&(h[z]=String(x));Object.keys(h).length>0&&(s[w]=h)}const o=ue.value.map(w=>({key:w.key,value:String(d[w.key]??w.value)}));o.push({key:"global_notify_config",value:JSON.stringify({channels:s,events:m.events})}),await Nl(o),u.success("配置已保存")}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"保存失败")}finally{pe.value=!1}}async function xl(){var e,s,o;if(await((e=_e.value)==null?void 0:e.validate().catch(()=>!1))){fe.value=!0;try{const w=await Wl(S.oldPassword,S.newPassword);w.success?(u.success("✅ 密码修改成功,下次登录请使用新密码"),S.oldPassword="",S.newPassword="",S.confirmPassword=""):u.error(w.message)}catch(w){u.error(((o=(s=w.response)==null?void 0:s.data)==null?void 0:o.error)||"密码修改失败")}finally{fe.value=!1}}}const Ie=g();function kl(){var t;(t=Ie.value)==null||t.click()}async function Vl(t){var o,w,f;const e=t.target,s=(o=e.files)==null?void 0:o[0];if(s){if(!s.type.startsWith("image/")){u.error("仅支持图片文件(JPEG/PNG/WebP)"),e.value="";return}if(s.size>2*1024*1024){u.error("图片大小不能超过 2MB"),e.value="";return}try{const h=await Kl(s);h.success?(d.site_logo=h.url,u.success("✅ LOGO 已上传并生效")):u.error(h.message)}catch(h){u.error(((f=(w=h.response)==null?void 0:w.data)==null?void 0:f.error)||"上传失败")}e.value=""}}async function hl(){try{d.site_logo="",await ql("site_logo",""),u.success("已移除 LOGO")}catch{u.error("移除失败")}}return(t,e)=>{const s=V("el-input"),o=V("el-form-item"),w=V("el-icon"),f=V("el-button"),h=V("el-form"),z=V("el-card"),x=V("el-switch"),B=V("el-divider"),Oe=V("el-radio"),Cl=V("el-radio-group"),K=V("el-input-number"),T=V("el-tag"),Pl=V("el-collapse-item"),Sl=V("el-collapse"),je=V("el-option"),Ae=V("el-select"),G=V("el-table-column"),Ul=V("el-popconfirm"),zl=V("el-table");return p(),y("div",Dl,[q(a(z,{id:"section-sys-site"},{header:i(()=>[...e[40]||(e[40]=[l("span",null,"🌐 网站设置",-1)])]),default:i(()=>[a(h,{"label-width":"180px","label-position":"left"},{default:i(()=>[a(o,{label:"网站名称"},{default:i(()=>[a(s,{modelValue:d.site_name,"onUpdate:modelValue":e[0]||(e[0]=n=>d.site_name=n),placeholder:"CloudSearch",style:{"max-width":"300px"}},null,8,["modelValue"]),e[41]||(e[41]=l("div",{class:"form-tip"},"显示在网站标题和页脚",-1))]),_:1}),a(o,{label:"网站 LOGO"},{default:i(()=>[l("div",Jl,[l("div",Hl,[a(f,{type:"primary",onClick:kl},{icon:i(()=>[a(w,null,{default:i(()=>[a(Re(jl))]),_:1})]),default:i(()=>[e[42]||(e[42]=r(" 选择LOGO图片并上传 ",-1))]),_:1}),l("input",{ref_key:"logoInputRef",ref:Ie,type:"file",accept:".jpg,.jpeg,.png,.webp",hidden:"",onChange:Vl},null,544),e[43]||(e[43]=l("div",{class:"form-tip",style:{"margin-left":"12px"}},[r(" 推荐 "),l("strong",null,"320×60"),r(" 或宽比例(如 4:1),JPEG/PNG/WebP,最大 2MB。"),l("br"),r(" LOGO 同时也作为搜索结果无封面图时的兜底图使用。 ")],-1))]),d.site_logo?(p(),y("div",Yl,[l("img",{src:String(d.site_logo),alt:"LOGO预览",onError:e[1]||(e[1]=n=>n.target.style.display="none")},null,40,Ql),a(f,{size:"small",type:"danger",plain:"",onClick:hl},{default:i(()=>[...e[44]||(e[44]=[r("移除",-1)])]),_:1})])):W("",!0)])]),_:1}),a(o,{label:"底部免责声明"},{default:i(()=>[a(s,{modelValue:d.site_disclaimer,"onUpdate:modelValue":e[2]||(e[2]=n=>d.site_disclaimer=n),type:"textarea",rows:4,placeholder:"输入免责声明内容"},null,8,["modelValue"]),e[45]||(e[45]=l("div",{class:"form-tip"},"显示在网站底部,留空则不显示",-1))]),_:1}),a(o,{label:"滚动通知文字"},{default:i(()=>[a(s,{modelValue:d.site_marquee,"onUpdate:modelValue":e[3]||(e[3]=n=>d.site_marquee=n),placeholder:"📢 欢迎使用CloudSearch",style:{"max-width":"500px"}},null,8,["modelValue"]),e[46]||(e[46]=l("div",{class:"form-tip"},"搜索栏下方滚动的通知条(从右往左滚动),留空则不显示",-1))]),_:1}),a(o,{label:"系统时区"},{default:i(()=>[a(s,{modelValue:d.timezone,"onUpdate:modelValue":e[4]||(e[4]=n=>d.timezone=n),placeholder:"Asia/Shanghai",style:{"max-width":"300px"}},null,8,["modelValue"]),e[47]||(e[47]=l("div",{class:"form-tip"},"例如 Asia/Shanghai、America/New_York、UTC,修改后保存配置即可生效",-1))]),_:1})]),_:1})]),_:1},512),[[M,!U.value||U.value==="sys-site"]]),q(a(z,{id:"section-sys-services"},{header:i(()=>[...e[48]||(e[48]=[l("span",null,"🔗 外部服务 & 缓存",-1)])]),default:i(()=>[a(h,{"label-width":"180px","label-position":"left"},{default:i(()=>{var n,c,_,I,Be,Ee;return[a(o,{label:"PanSou 搜索引擎地址"},{default:i(()=>{var C,Le;return[l("div",Xl,[a(s,{modelValue:d.pansou_url,"onUpdate:modelValue":e[5]||(e[5]=re=>d.pansou_url=re),placeholder:"http://pansou:8888",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",loading:te.value,onClick:al,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(te.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"]),a(f,{type:"warning",loading:ie.value,onClick:sl,size:"default",style:{width:"130px"},disabled:!((C=P.value)!=null&&C.hasUpdate)},{default:i(()=>{var re;return[r(b(ie.value?"更新中...":(re=P.value)!=null&&re.hasUpdate?"🔄 有新版本":"无更新"),1)]}),_:1},8,["loading","disabled"]),(Le=P.value)!=null&&Le.latestVersion?(p(),y("span",Zl,b(P.value.latestVersion),1)):W("",!0)]),e[49]||(e[49]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"盘搜搜索引擎的地址",-1))]}),_:1}),l("div",et,[l("div",lt,[l("div",{class:$e(["db-stat-value",((n=P.value)==null?void 0:n.status)==="connected"?"text-success":"text-warning"])},b(((c=P.value)==null?void 0:c.status)==="connected"?"已连接":P.value?"未连接":"-"),3),e[50]||(e[50]=l("div",{class:"db-stat-label"},"PanSou 状态",-1))]),l("div",tt,[l("div",st,b(((_=P.value)==null?void 0:_.channelCount)??"-"),1),e[51]||(e[51]=l("div",{class:"db-stat-label"},"频道数量",-1))]),l("div",at,[l("div",ot,b(((I=P.value)==null?void 0:I.pluginCount)??"-"),1),e[52]||(e[52]=l("div",{class:"db-stat-label"},"插件数量",-1))]),l("div",nt,[l("div",it,b(((Be=P.value)==null?void 0:Be.diskCount)??"-"),1),e[53]||(e[53]=l("div",{class:"db-stat-label"},"网盘数量",-1))]),l("div",dt,[l("div",rt,b(((Ee=P.value)==null?void 0:Ee.version)||"-"),1),e[54]||(e[54]=l("div",{class:"db-stat-label"},"版本",-1))])]),a(o,{label:"PanSou Web 端访问"},{default:i(()=>[a(x,{modelValue:we.value,"onUpdate:modelValue":e[6]||(e[6]=C=>we.value=C),"active-text":"启用","inactive-text":"关闭"},null,8,["modelValue"]),e[55]||(e[55]=l("div",{class:"form-tip",style:{"margin-left":"12px"}},[r(" 开启后可通过 "),l("code",null,"/pansou/"),r(" 路径访问 PanSou 搜索引擎管理界面 ")],-1))]),_:1}),a(o,{label:"启用代理"},{default:i(()=>[a(x,{modelValue:ce.value,"onUpdate:modelValue":e[7]||(e[7]=C=>ce.value=C),"active-text":"启用","inactive-text":"关闭"},null,8,["modelValue"]),e[56]||(e[56]=l("div",{class:"form-tip",style:{"margin-left":"8px"}}," 仅 PanSou 需要此配置,开启后搜索请求将经过代理转发 ",-1))]),_:1}),ce.value?(p(),k(o,{key:0,label:"代理地址",style:{"margin-top":"-12px"}},{default:i(()=>[l("div",ut,[a(s,{modelValue:d.search_proxy_url,"onUpdate:modelValue":e[8]||(e[8]=C=>d.search_proxy_url=C),placeholder:"http://127.0.0.1:7890",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",loading:oe.value,onClick:il,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(oe.value?"测试中...":"测试代理"),1)]),_:1},8,["loading"])]),e[57]||(e[57]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"HTTP 或 SOCKS5 协议地址",-1))]),_:1})):W("",!0),a(o,{label:"视频解析服务地址"},{default:i(()=>[l("div",pt,[a(s,{modelValue:d.video_parser_url,"onUpdate:modelValue":e[9]||(e[9]=C=>d.video_parser_url=C),placeholder:"http://video-parser:3001",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",loading:se.value,onClick:ol,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(se.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"])]),e[58]||(e[58]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"视频链接解析服务地址",-1))]),_:1}),a(o,{label:"TMDB 读取令牌"},{default:i(()=>[l("div",ft,[a(s,{modelValue:d.tmdb_api_token,"onUpdate:modelValue":e[10]||(e[10]=C=>d.tmdb_api_token=C),type:"password","show-password":"",placeholder:"输入 TMDB API 读取令牌(Bearer Token)",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",loading:ae.value,onClick:nl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(ae.value?"测试中...":"验证令牌"),1)]),_:1},8,["loading"])]),e[59]||(e[59]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" 用于搜索 TMDB 获取评分、导演、演员等完整内容信息。 "),l("a",{href:"https://www.themoviedb.org/settings/api",target:"_blank",rel:"noopener",style:{color:"var(--primary-color)"}},"获取令牌 →")],-1))]),_:1}),a(o,{label:"IP 归属地查询"},{default:i(()=>[l("div",ct,[a(s,{modelValue:d.ip_geo_api_url,"onUpdate:modelValue":e[11]||(e[11]=C=>d.ip_geo_api_url=C),placeholder:"https://cn.apihz.cn/api/ip/chaapi.php?id=xxx&key=***&ip={ip}&td=0",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",loading:ne.value,onClick:dl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(ne.value?"测试中...":"验证接口"),1)]),_:1},8,["loading"])]),e[60]||(e[60]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" IP 归属地查询 API 地址,"),l("code",null,"{ip}"),r(" 会被替换为实际 IP。 ")],-1)),e[61]||(e[61]=l("div",{style:{color:"var(--el-color-warning)","font-size":"13px","margin-top":"2px",width:"100%"}}," ⚠ 当前仅支持 接口盒子(apihz.cn) 格式 ",-1))]),_:1}),a(B,{"content-position":"left"},{default:i(()=>[...e[62]||(e[62]=[r("Redis 缓存",-1)])]),_:1}),a(o,{label:"Redis 连接地址"},{default:i(()=>[l("div",vt,[a(s,{modelValue:d.redis_url,"onUpdate:modelValue":e[12]||(e[12]=C=>d.redis_url=C),placeholder:"redis://:***@172.17.0.1:6379",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",size:"default",loading:le.value,onClick:tl,style:{width:"100px"}},{default:i(()=>[r(b(le.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"])]),e[63]||(e[63]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" Redis 用于缓存搜索验证结果,提升响应速度。"),l("br"),l("strong",null,"带密码格式:"),l("code",null,"redis://:你的密码@地址:6379"),l("br"),r(" 修改后保存配置即可生效,无需重启。"),l("strong",null,"切换 Redis 只会清空缓存,不影响任何重要数据。")],-1))]),_:1})]}),_:1}),ge.value?(p(),y("div",mt,[a(w,{class:"is-loading",size:20},{default:i(()=>[a(Re(Al))]),_:1}),e[64]||(e[64]=l("span",{style:{"margin-left":"8px",color:"#909399"}},"加载中...",-1))])):(p(),y("div",yt,[l("div",_t,[l("div",{class:$e(["db-stat-value",A.redis_status==="已连接"?"text-success":"text-warning"])},b(A.redis_status),3),e[65]||(e[65]=l("div",{class:"db-stat-label"},"Redis 状态",-1))]),l("div",gt,[l("div",bt,b(A.db_size),1),e[66]||(e[66]=l("div",{class:"db-stat-label"},"数据库大小",-1))]),l("div",wt,[l("div",xt,b(A.save_records),1),e[67]||(e[67]=l("div",{class:"db-stat-label"},"转存记录",-1))]),l("div",kt,[l("div",Vt,b(A.search_stats),1),e[68]||(e[68]=l("div",{class:"db-stat-label"},"搜索记录",-1))]),l("div",ht,[l("div",Ct,b(A.cloud_configs),1),e[69]||(e[69]=l("div",{class:"db-stat-label"},"网盘配置",-1))]),l("div",Pt,[l("div",St,b(A.content_cache),1),e[70]||(e[70]=l("div",{class:"db-stat-label"},"内容缓存",-1))])]))]),_:1},512),[[M,!U.value||U.value==="sys-services"]]),q(a(z,{id:"section-sys-strategy"},{header:i(()=>[...e[71]||(e[71]=[l("span",null,"🔧 性能配置",-1)])]),default:i(()=>[l("div",Ut,[a(B,{"content-position":"left"},{default:i(()=>[...e[72]||(e[72]=[r("搜索结果返回方式",-1)])]),_:1}),l("div",zt,[l("div",Tt,[e[73]||(e[73]=l("span",{class:"field-label"},"开启资源链接有效性监测",-1)),a(x,{modelValue:d.link_validation_enabled,"onUpdate:modelValue":e[13]||(e[13]=n=>d.link_validation_enabled=n),"active-value":"true","inactive-value":"false","active-text":"开启","inactive-text":"关闭"},null,8,["modelValue"])]),e[74]||(e[74]=l("div",{class:"field-desc"},"开启后搜索时会自动检测链接是否有效,过滤失效链接。关闭则直接返回所有结果(更快)",-1))]),l("div",It,[l("div",Ot,[e[77]||(e[77]=l("span",{class:"field-label"},"搜索结果方式",-1)),a(Cl,{modelValue:d.search_strategy,"onUpdate:modelValue":e[14]||(e[14]=n=>d.search_strategy=n)},{default:i(()=>[a(Oe,{value:"wait_all"},{default:i(()=>[...e[75]||(e[75]=[r("等待全部结果后展示",-1)])]),_:1}),a(Oe,{value:"stream_channel"},{default:i(()=>[...e[76]||(e[76]=[r("频道结果逐步展示",-1)])]),_:1})]),_:1},8,["modelValue"])]),e[78]||(e[78]=l("div",{class:"field-desc"},"逐步展示会分频道并发请求并优先展示先返回的频道;该模式下频道顺序按返回先后,不按配置顺序。",-1))]),a(B,{"content-position":"left"},{default:i(()=>[...e[79]||(e[79]=[r("搜索策略",-1)])]),_:1}),l("div",jt,[l("div",At,[l("div",Bt,[e[80]||(e[80]=l("span",{class:"field-label"},"使用所有频道参与搜索",-1)),a(x,{modelValue:xe.value,"onUpdate:modelValue":e[15]||(e[15]=n=>xe.value=n),"active-text":"开启","inactive-text":"关闭"},null,8,["modelValue"])]),e[81]||(e[81]=l("div",{class:"field-desc"},"包含未启用频道,命中更广但请求压力更高。",-1))]),l("div",Et,[l("div",Lt,[e[82]||(e[82]=l("span",{class:"field-label"},"每类网盘有效结果数",-1)),a(K,{modelValue:d.search_result_limit,"onUpdate:modelValue":e[16]||(e[16]=n=>d.search_result_limit=n),min:1,max:100},null,8,["modelValue"])]),e[83]||(e[83]=l("div",{class:"field-desc"},"每个网盘类型最多展示的有效链接数量",-1))]),l("div",Rt,[l("div",$t,[e[84]||(e[84]=l("span",{class:"field-label"},"验证并发数",-1)),a(K,{modelValue:d.validation_concurrency,"onUpdate:modelValue":e[17]||(e[17]=n=>d.validation_concurrency=n),min:1,max:50},null,8,["modelValue"])]),e[85]||(e[85]=l("div",{class:"field-desc"},"同时验证的链接数量",-1))]),l("div",Nt,[l("div",Ft,[e[86]||(e[86]=l("span",{class:"field-label"},"有效链接缓存 (s)",-1)),a(K,{modelValue:d.validation_cache_ttl_valid,"onUpdate:modelValue":e[18]||(e[18]=n=>d.validation_cache_ttl_valid=n),min:60,max:86400,step:60},null,8,["modelValue"])]),e[87]||(e[87]=l("div",{class:"field-desc"},"有效验证结果的缓存时间",-1))]),l("div",Gt,[l("div",Wt,[e[88]||(e[88]=l("span",{class:"field-label"},"无效链接缓存 (s)",-1)),a(K,{modelValue:d.validation_cache_ttl_invalid,"onUpdate:modelValue":e[19]||(e[19]=n=>d.validation_cache_ttl_invalid=n),min:60,max:86400,step:60},null,8,["modelValue"])]),e[89]||(e[89]=l("div",{class:"field-desc"},"无效验证结果的缓存时间",-1))]),l("div",Kt,[l("div",qt,[e[90]||(e[90]=l("span",{class:"field-label"},"验证超时 (ms)",-1)),a(K,{modelValue:d.validation_timeout,"onUpdate:modelValue":e[20]||(e[20]=n=>d.validation_timeout=n),min:1e3,max:3e4,step:500},null,8,["modelValue"])]),e[91]||(e[91]=l("div",{class:"field-desc"},"单个链接验证超时毫秒数",-1))])]),a(B,{"content-position":"left"},{default:i(()=>[...e[92]||(e[92]=[r("链接检测配置",-1)])]),_:1}),l("div",Mt,[e[94]||(e[94]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"搜索标题过滤规则")],-1)),l("div",Dt,[a(s,{modelValue:J.value,"onUpdate:modelValue":e[21]||(e[21]=n=>J.value=n),type:"textarea",rows:1,placeholder:"每行一条规则,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),a(f,{type:"primary",onClick:rl,disabled:!J.value.trim()},{default:i(()=>[...e[93]||(e[93]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),E.value.length>0?(p(),y("div",Jt,[(p(!0),y(O,null,j(E.value,(n,c)=>(p(),k(T,{key:c,closable:"",type:pl(n),"disable-transitions":!1,onClose:_=>ul(c)},{default:i(()=>[r(b(n),1)]),_:2},1032,["type","onClose"]))),128))])):(p(),y("div",Ht,"暂无过滤规则")),e[95]||(e[95]=l("div",{class:"filter-rule-help"},[l("div",{class:"help-title"},"📖 规则说明"),l("div",{class:"help-row"},[l("code",null,"# 注释内容"),r(" — "),l("code",null,"#"),r(" 后必须跟"),l("strong",null,"空格"),r("才会被识别为注释,单纯的 "),l("code",null,"#动漫"),r(" 会被当作要移除的文本")]),l("div",{class:"help-row"},[l("code",null,"/正则表达式/标志"),r(" — 正则匹配,匹配到的内容会被删除。如 "),l("code",null,"/^\\\\d+[、,.\\\\s]/"),r(" 去掉开头的序号")]),l("div",{class:"help-row"},[l("code",null,"纯文本"),r(" — 直接写要移除的文字(支持 emoji),凡是标题中含有的都会被删除")])],-1))]),l("div",Yt,[e[97]||(e[97]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"失效关键词")],-1)),l("div",Qt,[a(s,{modelValue:H.value,"onUpdate:modelValue":e[22]||(e[22]=n=>H.value=n),type:"textarea",rows:1,placeholder:"每行一个关键词,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),a(f,{type:"danger",onClick:fl,disabled:!H.value.trim()},{default:i(()=>[...e[96]||(e[96]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[98]||(e[98]=l("div",{class:"field-desc"},"自定义失效关键词,PanSou 检测 summary 或 HTML 页面内容包含即判为失效。",-1)),L.value.length>0?(p(),y("div",Xt,[(p(!0),y(O,null,j(L.value,(n,c)=>(p(),k(T,{key:c,closable:"",type:"danger","disable-transitions":!1,onClose:_=>cl(c)},{default:i(()=>[r(b(n),1)]),_:2},1032,["onClose"]))),128))])):(p(),y("div",Zt,"暂无失效关键词,所有链接将默认判为有效"))]),a(B,{"content-position":"left"},{default:i(()=>[...e[99]||(e[99]=[r("夸克网盘转存清理",-1)])]),_:1}),l("div",es,[e[101]||(e[101]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"广告关键词")],-1)),l("div",ls,[a(s,{modelValue:Y.value,"onUpdate:modelValue":e[23]||(e[23]=n=>Y.value=n),type:"textarea",rows:1,placeholder:"每行一个关键词,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),a(f,{type:"danger",onClick:vl,disabled:!Y.value.trim()},{default:i(()=>[...e[100]||(e[100]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[102]||(e[102]=l("div",{class:"field-desc"},"夸克转存完成后自动删除文件名/文件夹名含这些关键词的内容(防广告病毒)",-1)),R.value.length>0?(p(),y("div",ts,[(p(!0),y(O,null,j(R.value,(n,c)=>(p(),k(T,{key:c,closable:"",type:"warning","disable-transitions":!1,onClose:_=>ml(c)},{default:i(()=>[r(b(n),1)]),_:2},1032,["onClose"]))),128))])):(p(),y("div",ss,"暂未配置广告关键词,不会进行广告清理"))]),l("div",as,[e[104]||(e[104]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"警示文件夹名")],-1)),l("div",os,[a(s,{modelValue:Q.value,"onUpdate:modelValue":e[24]||(e[24]=n=>Q.value=n),type:"textarea",rows:1,placeholder:"每行一个文件夹名,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),a(f,{type:"primary",onClick:yl,disabled:!Q.value.trim()},{default:i(()=>[...e[103]||(e[103]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[105]||(e[105]=l("div",{class:"field-desc"},"夸克转存完成后在网盘根目录自动创建这些警示文件夹(自动加上 ⚠️ 前缀)",-1)),$.value.length>0?(p(),y("div",ns,[(p(!0),y(O,null,j($.value,(n,c)=>(p(),k(T,{key:c,closable:"",type:"info","disable-transitions":!1,onClose:_=>_l(c)},{default:i(()=>[r(b(n),1)]),_:2},1032,["onClose"]))),128))])):(p(),y("div",is,"暂未配置警示文件夹"))]),l("div",ds,[e[107]||(e[107]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"可疑文件后缀")],-1)),l("div",rs,[a(s,{modelValue:X.value,"onUpdate:modelValue":e[25]||(e[25]=n=>X.value=n),type:"textarea",rows:1,placeholder:"每行一个后缀,不要带点号,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),a(f,{type:"danger",onClick:gl,disabled:!X.value.trim()},{default:i(()=>[...e[106]||(e[106]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[108]||(e[108]=l("div",{class:"field-desc"},"夸克转存完成后自动删除后缀匹配的文件(防病毒,如 bat、exe、scr 等)",-1)),N.value.length>0?(p(),y("div",us,[(p(!0),y(O,null,j(N.value,(n,c)=>(p(),k(T,{key:c,closable:"",type:"danger","disable-transitions":!1,onClose:_=>bl(c)},{default:i(()=>[r("."+b(n),1)]),_:2},1032,["onClose"]))),128))])):(p(),y("div",ps,"暂无配置,使用默认列表:bat、exe、vbs、scr、cmd、com、pif、js、jar、msi、reg、inf、ps1"))])])]),_:1},512),[[M,!U.value||U.value==="sys-strategy"]]),q(a(z,{id:"section-sys-password"},{header:i(()=>[...e[109]||(e[109]=[l("span",null,"🔑 修改管理员密码",-1)])]),default:i(()=>[a(h,{ref_key:"passwordFormRef",ref:_e,model:S,rules:ll,"label-width":"120px","label-position":"left"},{default:i(()=>[a(o,{label:"原密码",prop:"oldPassword"},{default:i(()=>[a(s,{modelValue:S.oldPassword,"onUpdate:modelValue":e[26]||(e[26]=n=>S.oldPassword=n),type:"password","show-password":"",placeholder:"输入原密码",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),a(o,{label:"新密码",prop:"newPassword"},{default:i(()=>[a(s,{modelValue:S.newPassword,"onUpdate:modelValue":e[27]||(e[27]=n=>S.newPassword=n),type:"password","show-password":"",placeholder:"输入新密码(至少6位)",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),a(o,{label:"确认新密码",prop:"confirmPassword"},{default:i(()=>[a(s,{modelValue:S.confirmPassword,"onUpdate:modelValue":e[28]||(e[28]=n=>S.confirmPassword=n),type:"password","show-password":"",placeholder:"再次输入新密码",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),a(o,null,{default:i(()=>[a(f,{type:"primary",loading:fe.value,onClick:xl},{default:i(()=>[...e[110]||(e[110]=[r("修改密码",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),_:1},512),[[M,!U.value||U.value==="sys-password"]]),q(a(z,{id:"section-sys-notify"},{header:i(()=>[...e[111]||(e[111]=[l("div",{style:{display:"flex","align-items":"center","justify-content":"space-between"}},[l("span",null,"📬 消息推送")],-1)])]),default:i(()=>[a(Sl,{"model-value":["global"]},{default:i(()=>[a(Pl,{title:"全局推送(管理员兜底)",name:"global"},{default:i(()=>[l("div",fs,[a(h,{"label-width":"140px","label-position":"left"},{default:i(()=>[l("div",cs,[(p(!0),y(O,null,j(F.value,(n,c)=>(p(),y("div",{key:c,style:{border:"1px solid var(--el-border-color-light)","border-radius":"6px",padding:"8px 12px"}},[l("div",vs,[a(x,{modelValue:m.channels[c]._enabled,"onUpdate:modelValue":_=>m.channels[c]._enabled=_,size:"small"},null,8,["modelValue","onUpdate:modelValue"]),l("strong",null,b(n.label),1),m.channels[c]._enabled?(p(),k(f,{key:0,size:"small",text:"",type:"primary",onClick:_=>el(c),loading:m.channels[c]._testing},{default:i(()=>[...e[112]||(e[112]=[r("测试",-1)])]),_:1},8,["onClick","loading"])):W("",!0)]),m.channels[c]._enabled?(p(),y("div",ms,[(p(!0),y(O,null,j(n.params,_=>(p(),k(o,{key:_.key,label:_.label,style:{"margin-bottom":"6px"}},{default:i(()=>[_.type==="password"?(p(),k(s,{key:0,modelValue:m.channels[c][_.key],"onUpdate:modelValue":I=>m.channels[c][_.key]=I,type:"password","show-password":"",placeholder:_.placeholder||"",style:{"max-width":"360px"}},null,8,["modelValue","onUpdate:modelValue","placeholder"])):_.type==="switch"?(p(),k(x,{key:1,modelValue:m.channels[c][_.key],"onUpdate:modelValue":I=>m.channels[c][_.key]=I},null,8,["modelValue","onUpdate:modelValue"])):_.type==="number"?(p(),k(K,{key:2,modelValue:m.channels[c][_.key],"onUpdate:modelValue":I=>m.channels[c][_.key]=I,min:1,max:10,style:{"max-width":"160px"}},null,8,["modelValue","onUpdate:modelValue"])):(p(),k(s,{key:3,modelValue:m.channels[c][_.key],"onUpdate:modelValue":I=>m.channels[c][_.key]=I,placeholder:_.placeholder||"",style:{"max-width":"360px"}},null,8,["modelValue","onUpdate:modelValue","placeholder"]))]),_:2},1032,["label"]))),128))])):W("",!0)]))),128))]),a(B,{"content-position":"left"},{default:i(()=>[...e[113]||(e[113]=[r("全局事件开关",-1)])]),_:1}),l("div",ys,[a(x,{modelValue:m.events.on_save_success,"onUpdate:modelValue":e[29]||(e[29]=n=>m.events.on_save_success=n),"active-text":"转存成功"},null,8,["modelValue"]),a(x,{modelValue:m.events.on_save_fail,"onUpdate:modelValue":e[30]||(e[30]=n=>m.events.on_save_fail=n),"active-text":"转存失败"},null,8,["modelValue"]),a(x,{modelValue:m.events.on_cookie_expire,"onUpdate:modelValue":e[31]||(e[31]=n=>m.events.on_cookie_expire=n),"active-text":"Cookie过期"},null,8,["modelValue"]),a(x,{modelValue:m.events.on_cleanup,"onUpdate:modelValue":e[32]||(e[32]=n=>m.events.on_cleanup=n),"active-text":"清理完成"},null,8,["modelValue"])]),e[114]||(e[114]=l("div",{class:"form-tip",style:{"margin-top":"8px"}},"全局推送作为兜底通道。设置了推送用户的网盘配置走用户推送,未设置的走全局推送。",-1))]),_:1})])]),_:1})]),_:1}),e[124]||(e[124]=r()),a(B,{"content-position":"left"},{default:i(()=>[...e[115]||(e[115]=[r("添加推送用户",-1)])]),_:1}),l("div",_s,[l("div",gs,[a(Ae,{modelValue:v.account,"onUpdate:modelValue":e[33]||(e[33]=n=>v.account=n),filterable:"","allow-create":"",clearable:"",placeholder:"选择推广账户",style:{width:"200px"}},{default:i(()=>[(p(!0),y(O,null,j(he.value,n=>(p(),k(je,{key:n,label:n,value:n},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),a(Ae,{modelValue:v.channels,"onUpdate:modelValue":e[34]||(e[34]=n=>v.channels=n),multiple:"","collapse-tags":"","collapse-tags-tooltip":"",placeholder:"选择您所需的消息频道",style:{width:"260px"}},{default:i(()=>[(p(!0),y(O,null,j(Ke.value,(n,c)=>(p(),k(je,{key:c,label:n.label,value:c},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),a(x,{modelValue:v.events.on_save_success,"onUpdate:modelValue":e[35]||(e[35]=n=>v.events.on_save_success=n),"active-text":"转存成功"},null,8,["modelValue"]),a(x,{modelValue:v.events.on_save_fail,"onUpdate:modelValue":e[36]||(e[36]=n=>v.events.on_save_fail=n),"active-text":"转存失败"},null,8,["modelValue"]),a(x,{modelValue:v.events.on_cookie_expire,"onUpdate:modelValue":e[37]||(e[37]=n=>v.events.on_cookie_expire=n),"active-text":"Cookie过期"},null,8,["modelValue"]),a(x,{modelValue:v.events.on_cleanup,"onUpdate:modelValue":e[38]||(e[38]=n=>v.events.on_cleanup=n),"active-text":"清理完成"},null,8,["modelValue"]),a(f,{type:"primary",size:"small",loading:ve.value,onClick:De},{default:i(()=>[r(b(v.id?"更新":"确认添加"),1)]),_:1},8,["loading"]),v.id?(p(),k(f,{key:0,size:"small",onClick:Me},{default:i(()=>[...e[116]||(e[116]=[r("取消编辑",-1)])]),_:1})):W("",!0)])]),a(B,{"content-position":"left"},{default:i(()=>[...e[117]||(e[117]=[r("推送用户列表",-1)])]),_:1}),a(zl,{data:Ve.value,stripe:"",style:{width:"100%"},"empty-text":"暂无推送用户"},{default:i(()=>[a(G,{prop:"account",label:"推广账号","min-width":"140"}),a(G,{label:"转存成功",width:"90",align:"center"},{default:i(({row:n})=>[de(n,"on_save_success")?(p(),k(T,{key:0,type:"success",size:"small"},{default:i(()=>[...e[118]||(e[118]=[r("✔",-1)])]),_:1})):(p(),y("span",bs,"—"))]),_:1}),a(G,{label:"转存失败",width:"90",align:"center"},{default:i(({row:n})=>[de(n,"on_save_fail")?(p(),k(T,{key:0,type:"success",size:"small"},{default:i(()=>[...e[119]||(e[119]=[r("✔",-1)])]),_:1})):(p(),y("span",ws,"—"))]),_:1}),a(G,{label:"Cookie过期",width:"90",align:"center"},{default:i(({row:n})=>[de(n,"on_cookie_expire")?(p(),k(T,{key:0,type:"success",size:"small"},{default:i(()=>[...e[120]||(e[120]=[r("✔",-1)])]),_:1})):(p(),y("span",xs,"—"))]),_:1}),a(G,{label:"清理完成",width:"90",align:"center"},{default:i(({row:n})=>[de(n,"on_cleanup")?(p(),k(T,{key:0,type:"success",size:"small"},{default:i(()=>[...e[121]||(e[121]=[r("✔",-1)])]),_:1})):(p(),y("span",ks,"—"))]),_:1}),a(G,{label:"已启用的通道","min-width":"220"},{default:i(({row:n})=>[(p(!0),y(O,null,j(Ce(n),(c,_)=>(p(),k(T,{key:_,size:"small",style:{"margin-right":"4px","margin-bottom":"2px"}},{default:i(()=>[r(b(Ye(_)),1)]),_:2},1024))),128)),Qe(n)?W("",!0):(p(),y("span",Vs,"走全局推送"))]),_:1}),a(G,{label:"操作",width:"180",fixed:"right"},{default:i(({row:n})=>[a(f,{text:"",type:"primary",size:"small",onClick:c=>qe(n)},{default:i(()=>[...e[122]||(e[122]=[r("编辑",-1)])]),_:1},8,["onClick"]),a(Ul,{title:"确定删除该推送用户?",onConfirm:c=>He(n)},{reference:i(()=>[a(f,{text:"",type:"danger",size:"small"},{default:i(()=>[...e[123]||(e[123]=[r("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:1})]),_:1},8,["data"])]),_:1},512),[[M,!U.value||U.value==="sys-notify"]]),q(a(z,{id:"section-sys-maintenance"},{header:i(()=>[...e[125]||(e[125]=[l("span",null,"🔄 系统维护",-1)])]),default:i(()=>[e[130]||(e[130]=r()),a(h,{"label-width":"180px","label-position":"left"},{default:i(()=>[a(o,{label:"自动更新镜像"},{default:i(()=>[a(x,{modelValue:ke.value,"onUpdate:modelValue":e[39]||(e[39]=n=>ke.value=n),"active-text":"启用","inactive-text":"禁用"},null,8,["modelValue"]),e[126]||(e[126]=r()),e[127]||(e[127]=l("div",{class:"form-tip"},"启用后 CloudSearch 将自动检测并更新到最新镜像版本",-1)),e[128]||(e[128]=r()),e[129]||(e[129]=l("div",{class:"form-tip",style:{color:"var(--(--el-color-warning,#e6a23c))"}}," 当前需手动在服务器执行:docker-compose -f /opt/CloudSearch/docker-compose.yml pull && docker-compose -f /opt/CloudSearch/docker-compose.yml up -d ",-1))]),_:1})]),_:1})]),_:1},512),[[M,!U.value||U.value==="sys-maintenance"]]),l("div",hs,[a(f,{type:"primary",size:"large",loading:pe.value,onClick:wl},{default:i(()=>[...e[131]||(e[131]=[r(" 保存配置 ",-1)])]),_:1},8,["loading"])])])}}}),Us=Ml(Cs,[["__scopeId","data-v-641a8223"]]);export{Us as default}; diff --git a/source_clean/frontend-src/dist-vite/assets/SystemConfig-C8bSCuHg.css b/source_clean/frontend-src/dist-vite/assets/SystemConfig-C8bSCuHg.css new file mode 100644 index 0000000..6bbcedb --- /dev/null +++ b/source_clean/frontend-src/dist-vite/assets/SystemConfig-C8bSCuHg.css @@ -0,0 +1 @@ +.el-card[data-v-6cdc2b1a]{margin-bottom:20px}.el-card[data-v-6cdc2b1a] .el-card__header{font-weight:600;font-size:15px}[data-v-6cdc2b1a] .el-divider__text.is-left{left:0;padding-left:0}.form-tip[data-v-6cdc2b1a]{font-size:12px;color:#909399;margin-top:4px}.fallback-upload-wrap[data-v-6cdc2b1a]{display:flex;flex-direction:column;gap:12px}.fallback-upload-row[data-v-6cdc2b1a]{display:flex;align-items:center;flex-wrap:wrap}.fallback-preview[data-v-6cdc2b1a]{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.fallback-preview img[data-v-6cdc2b1a]{max-width:100%;height:auto;max-height:120px;border-radius:8px;border:1px solid var(--border-color);background:#f0f0f0;object-fit:contain}.strategy-grid[data-v-6cdc2b1a]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px 16px}.grid-cell[data-v-6cdc2b1a]{display:flex;flex-direction:column;gap:4px}.strategy-section[data-v-6cdc2b1a]{padding:0 4px}.field-block[data-v-6cdc2b1a]{margin:12px 0}.field-label-row[data-v-6cdc2b1a]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.field-label[data-v-6cdc2b1a]{font-size:14px;font-weight:500;color:#303133;white-space:nowrap}.field-desc[data-v-6cdc2b1a]{font-size:12px;color:#909399;margin:3px 0 0;line-height:1.5}.keyword-input-row[data-v-6cdc2b1a]{display:flex;gap:8px;flex:1;min-width:200px}.tag-list[data-v-6cdc2b1a]{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}.tag-empty[data-v-6cdc2b1a]{font-size:13px;color:#c0c4cc;margin-top:8px}.filter-rule-help[data-v-6cdc2b1a]{margin-top:8px;padding:10px 12px;background:#f8f9fa;border-radius:8px;border:1px solid #e8e8e8}.filter-rule-help .help-title[data-v-6cdc2b1a]{font-weight:600;font-size:13px;margin:8px 0 4px;color:#333}.filter-rule-help .help-title[data-v-6cdc2b1a]:first-child{margin-top:0}.filter-rule-help .help-row[data-v-6cdc2b1a]{font-size:12px;color:#555;margin:3px 0;line-height:1.6}.filter-rule-help .help-row code[data-v-6cdc2b1a]{background:#eef1f5;padding:1px 5px;border-radius:3px;font-size:11px;font-family:monospace}.filter-rules-help[data-v-6cdc2b1a]{margin-top:8px;padding:12px;background:#f8f9fa;border-radius:8px;border:1px solid #e8e8e8}.help-title[data-v-6cdc2b1a]{font-weight:600;font-size:13px;margin:10px 0 6px;color:#333}.help-title[data-v-6cdc2b1a]:first-child{margin-top:0}.help-row[data-v-6cdc2b1a]{font-size:12px;color:#555;margin:3px 0;line-height:1.6}.help-row code[data-v-6cdc2b1a]{background:#eef1f5;padding:1px 5px;border-radius:3px;font-size:11px;font-family:monospace}.help-sample[data-v-6cdc2b1a]{background:#1e1e1e;color:#d4d4d4;padding:10px 14px;border-radius:6px;font-size:12px;line-height:1.6;overflow-x:auto;white-space:pre;margin:6px 0 0;font-family:monospace}.help-preview-row[data-v-6cdc2b1a]{font-size:13px;margin:4px 0;display:flex;align-items:center;gap:6px}.help-preview-label[data-v-6cdc2b1a]{color:#888;min-width:70px;font-size:12px}.help-preview-original[data-v-6cdc2b1a]{color:#e74c3c}.help-preview-filtered[data-v-6cdc2b1a]{color:#27ae60;font-weight:500}.filter-input-row[data-v-6cdc2b1a]{display:flex;gap:8px;width:100%;margin-bottom:8px}.filter-tag-list[data-v-6cdc2b1a]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.filter-empty[data-v-6cdc2b1a]{font-size:13px;color:#c0c4cc;padding:8px 0;margin-bottom:8px}.db-status-grid[data-v-6cdc2b1a]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-top:8px}.db-stat-item[data-v-6cdc2b1a]{background:#f8f9fa;border-radius:10px;padding:16px 12px;text-align:center;border:1px solid #eee;transition:transform .15s,box-shadow .15s}.db-stat-item[data-v-6cdc2b1a]:hover{transform:translateY(-2px);box-shadow:0 4px 12px #0000000f}.db-stat-value[data-v-6cdc2b1a]{white-space:nowrap;font-size:24px;font-weight:700;color:#303133;margin-bottom:4px}.db-stat-value.text-success[data-v-6cdc2b1a]{color:#67c23a}.db-stat-value.text-warning[data-v-6cdc2b1a]{color:#e6a23c}.db-stat-label[data-v-6cdc2b1a]{font-size:12px;color:#909399}@media (max-width: 900px){.strategy-grid[data-v-6cdc2b1a]{grid-template-columns:1fr 1fr}}@media (max-width: 600px){.strategy-grid[data-v-6cdc2b1a]{grid-template-columns:1fr}}.pansou-status-grid[data-v-6cdc2b1a]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-top:8px}.status-dot[data-v-6cdc2b1a]{width:8px;height:8px;border-radius:50%;display:inline-block}.dot-ok[data-v-6cdc2b1a]{background:#67c23a}.dot-err[data-v-6cdc2b1a]{background:#f56c6c} diff --git a/source_clean/frontend-src/dist-vite/assets/SystemConfig-DFR5iJEB.css b/source_clean/frontend-src/dist-vite/assets/SystemConfig-DFR5iJEB.css deleted file mode 100644 index c9afda5..0000000 --- a/source_clean/frontend-src/dist-vite/assets/SystemConfig-DFR5iJEB.css +++ /dev/null @@ -1 +0,0 @@ -.el-card[data-v-641a8223]{margin-bottom:20px}.el-card[data-v-641a8223] .el-card__header{font-weight:600;font-size:15px}[data-v-641a8223] .el-divider__text.is-left{left:0;padding-left:0}.form-tip[data-v-641a8223]{font-size:12px;color:#909399;margin-top:4px}.fallback-upload-wrap[data-v-641a8223]{display:flex;flex-direction:column;gap:12px}.fallback-upload-row[data-v-641a8223]{display:flex;align-items:center;flex-wrap:wrap}.fallback-preview[data-v-641a8223]{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.fallback-preview img[data-v-641a8223]{max-width:100%;height:auto;max-height:120px;border-radius:8px;border:1px solid var(--border-color);background:#f0f0f0;object-fit:contain}.strategy-grid[data-v-641a8223]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px 16px}.grid-cell[data-v-641a8223]{display:flex;flex-direction:column;gap:4px}.strategy-section[data-v-641a8223]{padding:0 4px}.field-block[data-v-641a8223]{margin:12px 0}.field-label-row[data-v-641a8223]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.field-label[data-v-641a8223]{font-size:14px;font-weight:500;color:#303133;white-space:nowrap}.field-desc[data-v-641a8223]{font-size:12px;color:#909399;margin:3px 0 0;line-height:1.5}.keyword-input-row[data-v-641a8223]{display:flex;gap:8px;flex:1;min-width:200px}.tag-list[data-v-641a8223]{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}.tag-empty[data-v-641a8223]{font-size:13px;color:#c0c4cc;margin-top:8px}.filter-rule-help[data-v-641a8223]{margin-top:8px;padding:10px 12px;background:#f8f9fa;border-radius:8px;border:1px solid #e8e8e8}.filter-rule-help .help-title[data-v-641a8223]{font-weight:600;font-size:13px;margin:8px 0 4px;color:#333}.filter-rule-help .help-title[data-v-641a8223]:first-child{margin-top:0}.filter-rule-help .help-row[data-v-641a8223]{font-size:12px;color:#555;margin:3px 0;line-height:1.6}.filter-rule-help .help-row code[data-v-641a8223]{background:#eef1f5;padding:1px 5px;border-radius:3px;font-size:11px;font-family:monospace}.filter-rules-help[data-v-641a8223]{margin-top:8px;padding:12px;background:#f8f9fa;border-radius:8px;border:1px solid #e8e8e8}.help-title[data-v-641a8223]{font-weight:600;font-size:13px;margin:10px 0 6px;color:#333}.help-title[data-v-641a8223]:first-child{margin-top:0}.help-row[data-v-641a8223]{font-size:12px;color:#555;margin:3px 0;line-height:1.6}.help-row code[data-v-641a8223]{background:#eef1f5;padding:1px 5px;border-radius:3px;font-size:11px;font-family:monospace}.help-sample[data-v-641a8223]{background:#1e1e1e;color:#d4d4d4;padding:10px 14px;border-radius:6px;font-size:12px;line-height:1.6;overflow-x:auto;white-space:pre;margin:6px 0 0;font-family:monospace}.help-preview-row[data-v-641a8223]{font-size:13px;margin:4px 0;display:flex;align-items:center;gap:6px}.help-preview-label[data-v-641a8223]{color:#888;min-width:70px;font-size:12px}.help-preview-original[data-v-641a8223]{color:#e74c3c}.help-preview-filtered[data-v-641a8223]{color:#27ae60;font-weight:500}.filter-input-row[data-v-641a8223]{display:flex;gap:8px;width:100%;margin-bottom:8px}.filter-tag-list[data-v-641a8223]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.filter-empty[data-v-641a8223]{font-size:13px;color:#c0c4cc;padding:8px 0;margin-bottom:8px}.db-status-grid[data-v-641a8223]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-top:8px}.db-stat-item[data-v-641a8223]{background:#f8f9fa;border-radius:10px;padding:16px 12px;text-align:center;border:1px solid #eee;transition:transform .15s,box-shadow .15s}.db-stat-item[data-v-641a8223]:hover{transform:translateY(-2px);box-shadow:0 4px 12px #0000000f}.db-stat-value[data-v-641a8223]{white-space:nowrap;font-size:24px;font-weight:700;color:#303133;margin-bottom:4px}.db-stat-value.text-success[data-v-641a8223]{color:#67c23a}.db-stat-value.text-warning[data-v-641a8223]{color:#e6a23c}.db-stat-label[data-v-641a8223]{font-size:12px;color:#909399}@media (max-width: 900px){.strategy-grid[data-v-641a8223]{grid-template-columns:1fr 1fr}}@media (max-width: 600px){.strategy-grid[data-v-641a8223]{grid-template-columns:1fr}}.pansou-status-grid[data-v-641a8223]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-top:8px}.status-dot[data-v-641a8223]{width:8px;height:8px;border-radius:50%;display:inline-block}.dot-ok[data-v-641a8223]{background:#67c23a}.dot-err[data-v-641a8223]{background:#f56c6c} diff --git a/source_clean/frontend-src/dist-vite/assets/index-D279dJND.js b/source_clean/frontend-src/dist-vite/assets/index-D_srC3bj.js similarity index 99% rename from source_clean/frontend-src/dist-vite/assets/index-D279dJND.js rename to source_clean/frontend-src/dist-vite/assets/index-D_srC3bj.js index 45d6a87..a7a6318 100644 --- a/source_clean/frontend-src/dist-vite/assets/index-D279dJND.js +++ b/source_clean/frontend-src/dist-vite/assets/index-D_srC3bj.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomePage--KOSYv1j.js","assets/_plugin-vue_export-helper-1Z-znrfZ.js","assets/HomePage-BVcQlSvu.css","assets/SearchResult-DLXOMefi.js","assets/index-Bn7NwETH.js","assets/SearchResult-B_gCJbmx.css","assets/ResultDetail-DdE8ZRMU.js","assets/CloudBadge-OZZzB6Zg.js","assets/CloudBadge-B7b7xKko.css","assets/ResultDetail-CVwsv2ff.css","assets/AdminLogin-DxE2POP4.js","assets/AdminLogin-DFflDgjp.css","assets/AdminLayout-DHRMhPUk.js","assets/AdminLayout-e6gnzMQk.css","assets/AdminDashboard-BvLIjTGZ.js","assets/CloudConfig-BADbnuPV.js","assets/CloudConfig-BEjvFHzE.css","assets/SystemConfig-C3is0eeI.js","assets/SystemConfig-DFR5iJEB.css","assets/SaveRecords-DLmXAM3V.js","assets/SaveRecords-C2kQYC3g.css","assets/AdminDashboard-BIBkHVvW.css","assets/Cleanup-CwLcANun.js","assets/Cleanup-Cq_o1Z9e.css"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomePage-CdqgUFQt.js","assets/_plugin-vue_export-helper-1Z-znrfZ.js","assets/HomePage-BVcQlSvu.css","assets/SearchResult-EeENDml7.js","assets/index-Bn7NwETH.js","assets/SearchResult-B_gCJbmx.css","assets/ResultDetail-BLqifyVI.js","assets/CloudBadge-CbpZHKLy.js","assets/CloudBadge-B7b7xKko.css","assets/ResultDetail-CVwsv2ff.css","assets/AdminLogin-BFh47H6c.js","assets/AdminLogin-DFflDgjp.css","assets/AdminLayout-qvvQgX9o.js","assets/AdminLayout-K9Kq5pc4.css","assets/AdminDashboard-CkHQl97R.js","assets/CloudConfig-3znuBWUR.js","assets/CloudConfig-BEjvFHzE.css","assets/SystemConfig-BbG7uBv0.js","assets/SystemConfig-C8bSCuHg.css","assets/SaveRecords-B5cCMWaP.js","assets/SaveRecords-C2kQYC3g.css","assets/AdminDashboard-BIBkHVvW.css","assets/Cleanup-BkDauFCX.js","assets/Cleanup-Cq_o1Z9e.css"])))=>i.map(i=>d[i]); (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))a(o);new MutationObserver(o=>{for(const l of o)if(l.type==="childList")for(const s of l.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&a(s)}).observe(document,{childList:!0,subtree:!0});function n(o){const l={};return o.integrity&&(l.integrity=o.integrity),o.referrerPolicy&&(l.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?l.credentials="include":o.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function a(o){if(o.ep)return;o.ep=!0;const l=n(o);fetch(o.href,l)}})();/** * @vue/shared v3.5.33 * (c) 2018-present Yuxi (Evan) You and Vue contributors @@ -89,4 +89,4 @@ usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:a,curr * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT - */let kJ=()=>location.protocol+"//"+location.host;function zE(e,t){const{pathname:n,search:a,hash:o}=t,l=e.indexOf("#");if(l>-1){let s=o.includes(e.slice(l))?e.slice(l).length:1,r=o.slice(s);return r[0]!=="/"&&(r="/"+r),h0(r,"")}return h0(n,e)+a+o}function EJ(e,t,n,a){let o=[],l=[],s=null;const r=({state:p})=>{const g=zE(e,location),v=n.value,h=t.value;let m=0;if(p){if(n.value=g,t.value=p,s&&s===v){s=null;return}m=h?p.position-h.position:0}else a(g);o.forEach(y=>{y(n.value,v,{delta:m,type:mv.pop,direction:m?m>0?qf.forward:qf.back:qf.unknown})})};function u(){s=n.value}function c(p){o.push(p);const g=()=>{const v=o.indexOf(p);v>-1&&o.splice(v,1)};return l.push(g),g}function d(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(Zt({},p.state,{scroll:Yd()}),"")}}function f(){for(const p of l)p();l=[],window.removeEventListener("popstate",r),window.removeEventListener("pagehide",d),document.removeEventListener("visibilitychange",d)}return window.addEventListener("popstate",r),window.addEventListener("pagehide",d),document.addEventListener("visibilitychange",d),{pauseListeners:u,listen:c,destroy:f}}function w0(e,t,n,a=!1,o=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:o?Yd():null}}function xJ(e){const{history:t,location:n}=window,a={value:zE(e,n)},o={value:t.state};o.value||l(a.value,{back:null,current:a.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function l(u,c,d){const f=e.indexOf("#"),p=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+u:kJ()+e+u;try{t[d?"replaceState":"pushState"](c,"",p),o.value=c}catch(g){console.error(g),n[d?"replace":"assign"](p)}}function s(u,c){l(u,Zt({},t.state,w0(o.value.back,u,o.value.forward,!0),c,{position:o.value.position}),!0),a.value=u}function r(u,c){const d=Zt({},o.value,t.state,{forward:u,scroll:Yd()});l(d.current,d,!0),l(u,Zt({},w0(a.value,u,null),{position:d.position+1},c),!1),a.value=u}return{location:a,state:o,push:r,replace:s}}function TJ(e){e=uJ(e);const t=xJ(e),n=EJ(e,t.state,t.location,t.replace);function a(l,s=!0){s||n.pauseListeners(),history.go(l)}const o=Zt({location:"",base:e,go:a,createHref:dJ.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let us=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Rn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Rn||{});const $J={type:us.Static,value:""},OJ=/[a-zA-Z0-9_]/;function NJ(e){if(!e)return[[]];if(e==="/")return[[$J]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${c}": ${g}`)}let n=Rn.Static,a=n;const o=[];let l;function s(){l&&o.push(l),l=[]}let r=0,u,c="",d="";function f(){c&&(n===Rn.Static?l.push({type:us.Static,value:c}):n===Rn.Param||n===Rn.ParamRegExp||n===Rn.ParamRegExpEnd?(l.length>1&&(u==="*"||u==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),l.push({type:us.Param,value:c,regexp:d,repeatable:u==="*"||u==="+",optional:u==="*"||u==="?"})):t("Invalid state to consume buffer"),c="")}function p(){c+=u}for(;rt.length?t.length===1&&t[0]===aa.Static+aa.Segment?1:-1:0}function HE(e,t){let n=0;const a=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const PJ={strict:!1,end:!0,sensitive:!1};function AJ(e,t,n){const a=IJ(NJ(e.path),n),o=Zt(a,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function LJ(e,t){const n=[],a=new Map;t=v0(PJ,t);function o(f){return a.get(f)}function l(f,p,g){const v=!g,h=E0(f);h.aliasOf=g&&g.record;const m=v0(t,f),y=[h];if("alias"in f){const C=typeof f.alias=="string"?[f.alias]:f.alias;for(const k of C)y.push(E0(Zt({},h,{components:g?g.record.components:h.components,path:k,aliasOf:g?g.record:h})))}let b,w;for(const C of y){const{path:k}=C;if(p&&k[0]!=="/"){const E=p.record.path,T=E[E.length-1]==="/"?"":"/";C.path=p.record.path+(k&&T+k)}if(b=AJ(C,p,m),g?g.alias.push(b):(w=w||b,w!==b&&w.alias.push(b),v&&f.name&&!x0(b)&&s(f.name)),KE(b)&&u(b),h.children){const E=h.children;for(let T=0;T{s(w)}:yi}function s(f){if(BE(f)){const p=a.get(f);p&&(a.delete(f),n.splice(n.indexOf(p),1),p.children.forEach(s),p.alias.forEach(s))}else{const p=n.indexOf(f);p>-1&&(n.splice(p,1),f.record.name&&a.delete(f.record.name),f.children.forEach(s),f.alias.forEach(s))}}function r(){return n}function u(f){const p=BJ(f,n);n.splice(p,0,f),f.record.name&&!x0(f)&&a.set(f.record.name,f)}function c(f,p){let g,v={},h,m;if("name"in f&&f.name){if(g=a.get(f.name),!g)throw Tr(wn.MATCHER_NOT_FOUND,{location:f});m=g.record.name,v=Zt(k0(p.params,g.keys.filter(w=>!w.optional).concat(g.parent?g.parent.keys.filter(w=>w.optional):[]).map(w=>w.name)),f.params&&k0(f.params,g.keys.map(w=>w.name))),h=g.stringify(v)}else if(f.path!=null)h=f.path,g=n.find(w=>w.re.test(h)),g&&(v=g.parse(h),m=g.record.name);else{if(g=p.name?a.get(p.name):n.find(w=>w.re.test(p.path)),!g)throw Tr(wn.MATCHER_NOT_FOUND,{location:f,currentLocation:p});m=g.record.name,v=Zt({},p.params,f.params),h=g.stringify(v)}const y=[];let b=g;for(;b;)y.unshift(b.record),b=b.parent;return{name:m,path:h,params:v,matched:y,meta:VJ(y)}}e.forEach(f=>l(f));function d(){n.length=0,a.clear()}return{addRoute:l,resolve:c,removeRoute:s,clearRoutes:d,getRoutes:r,getRecordMatcher:o}}function k0(e,t){const n={};for(const a of t)a in e&&(n[a]=e[a]);return n}function E0(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:DJ(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function DJ(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const a in e.components)t[a]=typeof n=="object"?n[a]:n;return t}function x0(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function VJ(e){return e.reduce((t,n)=>Zt(t,n.meta),{})}function BJ(e,t){let n=0,a=t.length;for(;n!==a;){const l=n+a>>1;HE(e,t[l])<0?a=l:n=l+1}const o=FJ(e);return o&&(a=t.lastIndexOf(o,a-1)),a}function FJ(e){let t=e;for(;t=t.parent;)if(KE(t)&&HE(e,t)===0)return t}function KE({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function T0(e){const t=_e(qd),n=_e(Mm),a=S(()=>{const u=i(e.to);return t.resolve(u)}),o=S(()=>{const{matched:u}=a.value,{length:c}=u,d=u[c-1],f=n.matched;if(!d||!f.length)return-1;const p=f.findIndex(xr.bind(null,d));if(p>-1)return p;const g=$0(u[c-2]);return c>1&&$0(d)===g&&f[f.length-1].path!==g?f.findIndex(xr.bind(null,u[c-2])):p}),l=S(()=>o.value>-1&&jJ(n.params,a.value.params)),s=S(()=>o.value>-1&&o.value===n.matched.length-1&&VE(n.params,a.value.params));function r(u={}){if(WJ(u)){const c=t[i(e.replace)?"replace":"push"](i(e.to)).catch(yi);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:a,href:S(()=>a.value.href),isActive:l,isExactActive:s,navigate:r}}function zJ(e){return e.length===1?e[0]:e}const HJ=ie({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:T0,setup(e,{slots:t}){const n=Rt(T0(e)),{options:a}=_e(qd),o=S(()=>({[O0(e.activeClass,a.linkActiveClass,"router-link-active")]:n.isActive,[O0(e.exactActiveClass,a.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const l=t.default&&zJ(t.default(n));return e.custom?l:Ye("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},l)}}}),KJ=HJ;function WJ(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function jJ(e,t){for(const n in t){const a=t[n],o=e[n];if(typeof a=="string"){if(a!==o)return!1}else if(!Ja(o)||o.length!==a.length||a.some((l,s)=>l.valueOf()!==o[s].valueOf()))return!1}return!0}function $0(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const O0=(e,t,n)=>e??t??n,UJ=ie({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const a=_e(yv),o=S(()=>e.route||a.value),l=_e(b0,0),s=S(()=>{let c=i(l);const{matched:d}=o.value;let f;for(;(f=d[c])&&!f.components;)c++;return c}),r=S(()=>o.value.matched[s.value]);bt(b0,S(()=>s.value+1)),bt(CJ,r),bt(yv,o);const u=A();return fe(()=>[u.value,r.value,e.name],([c,d,f],[p,g,v])=>{d&&(d.instances[f]=c,g&&g!==d&&c&&c===p&&(d.leaveGuards.size||(d.leaveGuards=g.leaveGuards),d.updateGuards.size||(d.updateGuards=g.updateGuards))),c&&d&&(!g||!xr(d,g)||!p)&&(d.enterCallbacks[f]||[]).forEach(h=>h(c))},{flush:"post"}),()=>{const c=o.value,d=e.name,f=r.value,p=f&&f.components[d];if(!p)return N0(n.default,{Component:p,route:c});const g=f.props[d],v=g?g===!0?c.params:typeof g=="function"?g(c):g:null,m=Ye(p,Zt({},v,t,{onVnodeUnmounted:y=>{y.component.isUnmounted&&(f.instances[d]=null)},ref:u}));return N0(n.default,{Component:m,route:c})||m}}});function N0(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const YJ=UJ;function qJ(e){const t=LJ(e.routes,e),n=e.parseQuery||bJ,a=e.stringifyQuery||y0,o=e.history,l=Xr(),s=Xr(),r=Xr(),u=Wt(gl);let c=gl;Ys&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=Uf.bind(null,te=>""+te),f=Uf.bind(null,nJ),p=Uf.bind(null,qi);function g(te,de){let se,Y;return BE(te)?(se=t.getRecordMatcher(te),Y=de):Y=te,t.addRoute(Y,se)}function v(te){const de=t.getRecordMatcher(te);de&&t.removeRoute(de)}function h(){return t.getRoutes().map(te=>te.record)}function m(te){return!!t.getRecordMatcher(te)}function y(te,de){if(de=Zt({},de||u.value),typeof te=="string"){const oe=Yf(n,te,de.path),ce=t.resolve({path:oe.path},de),ge=o.createHref(oe.fullPath);return Zt(oe,ce,{params:p(ce.params),hash:qi(oe.hash),redirectedFrom:void 0,href:ge})}let se;if(te.path!=null)se=Zt({},te,{path:Yf(n,te.path,de.path).path});else{const oe=Zt({},te.params);for(const ce in oe)oe[ce]==null&&delete oe[ce];se=Zt({},te,{params:f(oe)}),de.params=f(de.params)}const Y=t.resolve(se,de),G=te.hash||"";Y.params=d(p(Y.params));const V=lJ(a,Zt({},te,{hash:QZ(G),path:Y.path})),Z=o.createHref(V);return Zt({fullPath:V,hash:G,query:a===y0?wJ(te.query):te.query||{}},Y,{redirectedFrom:void 0,href:Z})}function b(te){return typeof te=="string"?Yf(n,te,u.value.path):Zt({},te)}function w(te,de){if(c!==te)return Tr(wn.NAVIGATION_CANCELLED,{from:de,to:te})}function C(te){return T(te)}function k(te){return C(Zt(b(te),{replace:!0}))}function E(te,de){const se=te.matched[te.matched.length-1];if(se&&se.redirect){const{redirect:Y}=se;let G=typeof Y=="function"?Y(te,de):Y;return typeof G=="string"&&(G=G.includes("?")||G.includes("#")?G=b(G):{path:G},G.params={}),Zt({query:te.query,hash:te.hash,params:G.path!=null?{}:te.params},G)}}function T(te,de){const se=c=y(te),Y=u.value,G=te.state,V=te.force,Z=te.replace===!0,oe=E(se,Y);if(oe)return T(Zt(b(oe),{state:typeof oe=="object"?Zt({},G,oe.state):G,force:V,replace:Z}),de||se);const ce=se;ce.redirectedFrom=de;let ge;return!V&&sJ(a,Y,se)&&(ge=Tr(wn.NAVIGATION_DUPLICATED,{to:ce,from:Y}),H(Y,Y,!0,!1)),(ge?Promise.resolve(ge):O(ce,Y)).catch(me=>Do(me)?Do(me,wn.NAVIGATION_GUARD_REDIRECT)?me:z(me):I(me,ce,Y)).then(me=>{if(me){if(Do(me,wn.NAVIGATION_GUARD_REDIRECT))return T(Zt({replace:Z},b(me.to),{state:typeof me.to=="object"?Zt({},G,me.to.state):G,force:V}),de||ce)}else me=P(ce,Y,!0,Z,G);return _(ce,Y,me),me})}function $(te,de){const se=w(te,de);return se?Promise.reject(se):Promise.resolve()}function N(te){const de=Q.values().next().value;return de&&typeof de.runWithContext=="function"?de.runWithContext(te):te()}function O(te,de){let se;const[Y,G,V]=SJ(te,de);se=Gf(Y.reverse(),"beforeRouteLeave",te,de);for(const oe of Y)oe.leaveGuards.forEach(ce=>{se.push(El(ce,te,de))});const Z=$.bind(null,te,de);return se.push(Z),ue(se).then(()=>{se=[];for(const oe of l.list())se.push(El(oe,te,de));return se.push(Z),ue(se)}).then(()=>{se=Gf(G,"beforeRouteUpdate",te,de);for(const oe of G)oe.updateGuards.forEach(ce=>{se.push(El(ce,te,de))});return se.push(Z),ue(se)}).then(()=>{se=[];for(const oe of V)if(oe.beforeEnter)if(Ja(oe.beforeEnter))for(const ce of oe.beforeEnter)se.push(El(ce,te,de));else se.push(El(oe.beforeEnter,te,de));return se.push(Z),ue(se)}).then(()=>(te.matched.forEach(oe=>oe.enterCallbacks={}),se=Gf(V,"beforeRouteEnter",te,de,N),se.push(Z),ue(se))).then(()=>{se=[];for(const oe of s.list())se.push(El(oe,te,de));return se.push(Z),ue(se)}).catch(oe=>Do(oe,wn.NAVIGATION_CANCELLED)?oe:Promise.reject(oe))}function _(te,de,se){r.list().forEach(Y=>N(()=>Y(te,de,se)))}function P(te,de,se,Y,G){const V=w(te,de);if(V)return V;const Z=de===gl,oe=Ys?history.state:{};se&&(Y||Z?o.replace(te.fullPath,Zt({scroll:Z&&oe&&oe.scroll},G)):o.push(te.fullPath,G)),u.value=te,H(te,de,se,Z),z()}let D;function W(){D||(D=o.listen((te,de,se)=>{if(!ee.listening)return;const Y=y(te),G=E(Y,ee.currentRoute.value);if(G){T(Zt(G,{replace:!0,force:!0}),Y).catch(yi);return}c=Y;const V=u.value;Ys&&vJ(g0(V.fullPath,se.delta),Yd()),O(Y,V).catch(Z=>Do(Z,wn.NAVIGATION_ABORTED|wn.NAVIGATION_CANCELLED)?Z:Do(Z,wn.NAVIGATION_GUARD_REDIRECT)?(T(Zt(b(Z.to),{force:!0}),Y).then(oe=>{Do(oe,wn.NAVIGATION_ABORTED|wn.NAVIGATION_DUPLICATED)&&!se.delta&&se.type===mv.pop&&o.go(-1,!1)}).catch(yi),Promise.reject()):(se.delta&&o.go(-se.delta,!1),I(Z,Y,V))).then(Z=>{Z=Z||P(Y,V,!1),Z&&(se.delta&&!Do(Z,wn.NAVIGATION_CANCELLED)?o.go(-se.delta,!1):se.type===mv.pop&&Do(Z,wn.NAVIGATION_ABORTED|wn.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),_(Y,V,Z)}).catch(yi)}))}let U=Xr(),F=Xr(),R;function I(te,de,se){z(te);const Y=F.list();return Y.length?Y.forEach(G=>G(te,de,se)):console.error(te),Promise.reject(te)}function L(){return R&&u.value!==gl?Promise.resolve():new Promise((te,de)=>{U.add([te,de])})}function z(te){return R||(R=!te,W(),U.list().forEach(([de,se])=>te?se(te):de()),U.reset()),te}function H(te,de,se,Y){const{scrollBehavior:G}=e;if(!Ys||!G)return Promise.resolve();const V=!se&&hJ(g0(te.fullPath,0))||(Y||!se)&&history.state&&history.state.scroll||null;return Ae().then(()=>G(te,de,V)).then(Z=>Z&&pJ(Z)).catch(Z=>I(Z,te,de))}const K=te=>o.go(te);let q;const Q=new Set,ee={currentRoute:u,listening:!0,addRoute:g,removeRoute:v,clearRoutes:t.clearRoutes,hasRoute:m,getRoutes:h,resolve:y,options:e,push:C,replace:k,go:K,back:()=>K(-1),forward:()=>K(1),beforeEach:l.add,beforeResolve:s.add,afterEach:r.add,onError:F.add,isReady:L,install(te){te.component("RouterLink",KJ),te.component("RouterView",YJ),te.config.globalProperties.$router=ee,Object.defineProperty(te.config.globalProperties,"$route",{enumerable:!0,get:()=>i(u)}),Ys&&!q&&u.value===gl&&(q=!0,C(o.location).catch(Y=>{}));const de={};for(const Y in gl)Object.defineProperty(de,Y,{get:()=>u.value[Y],enumerable:!0});te.provide(qd,ee),te.provide(Mm,rd(de)),te.provide(yv,u);const se=te.unmount;Q.add(te),te.unmount=function(){Q.delete(te),Q.size<1&&(c=gl,D&&D(),D=null,u.value=gl,q=!1,R=!1),se()}}};function ue(te){return te.reduce((de,se)=>de.then(()=>N(se)),Promise.resolve())}return ee}function oQ(){return _e(qd)}function lQ(e){return _e(Mm)}const GJ=[{path:"/",name:"home",component:()=>io(()=>import("./HomePage--KOSYv1j.js"),__vite__mapDeps([0,1,2]))},{path:"/search",name:"search",component:()=>io(()=>import("./SearchResult-DLXOMefi.js"),__vite__mapDeps([3,4,1,5]))},{path:"/result/:id",name:"result-detail",component:()=>io(()=>import("./ResultDetail-DdE8ZRMU.js"),__vite__mapDeps([6,7,4,1,8,9]))},{path:"/admin/login",name:"admin-login",component:()=>io(()=>import("./AdminLogin-DxE2POP4.js"),__vite__mapDeps([10,1,11]))},{path:"/admin",component:()=>io(()=>import("./AdminLayout-DHRMhPUk.js"),__vite__mapDeps([12,1,13])),meta:{requiresAuth:!0},children:[{path:"",redirect:"/admin/dashboard"},{path:"dashboard",name:"admin-dashboard",component:()=>io(()=>import("./AdminDashboard-BvLIjTGZ.js"),__vite__mapDeps([14,1,15,4,7,8,16,17,18,19,20,21]))},{path:"cloud-configs",name:"admin-cloud-configs",component:()=>io(()=>import("./CloudConfig-BADbnuPV.js"),__vite__mapDeps([15,4,1,7,8,16]))},{path:"cleanup",name:"admin-cleanup",component:()=>io(()=>import("./Cleanup-CwLcANun.js"),__vite__mapDeps([22,1,23]))},{path:"system",name:"admin-system",component:()=>io(()=>import("./SystemConfig-C3is0eeI.js"),__vite__mapDeps([17,1,18]))},{path:"save-records",name:"admin-save-records",component:()=>io(()=>import("./SaveRecords-DLmXAM3V.js"),__vite__mapDeps([19,1,20]))}]}],WE=qJ({history:TJ(),routes:GJ});WE.beforeEach((e,t,n)=>{const a=localStorage.getItem("admin_token");e.meta.requiresAuth&&!a?n("/admin/login"):n()});const Gd=lw(FZ);Gd.use(y$());Gd.use(WE);Gd.use(VZ);Gd.mount("#app");export{vP as A,Ae as B,ZJ as C,XJ as D,iZ as E,He as F,eQ as G,JJ as H,tQ as I,al as J,dt as K,Nt as L,Oo as M,aQ as N,QJ as O,nQ as P,Pv as Q,x as a,j as b,B as c,ie as d,le as e,J as f,en as g,A as h,Rt as i,Ot as j,i as k,St as l,$r as m,M as n,mt as o,je as p,Xe as q,Ct as r,QP as s,ke as t,oQ as u,S as v,ne as w,fe as x,re as y,lQ as z}; + */let kJ=()=>location.protocol+"//"+location.host;function zE(e,t){const{pathname:n,search:a,hash:o}=t,l=e.indexOf("#");if(l>-1){let s=o.includes(e.slice(l))?e.slice(l).length:1,r=o.slice(s);return r[0]!=="/"&&(r="/"+r),h0(r,"")}return h0(n,e)+a+o}function EJ(e,t,n,a){let o=[],l=[],s=null;const r=({state:p})=>{const g=zE(e,location),v=n.value,h=t.value;let m=0;if(p){if(n.value=g,t.value=p,s&&s===v){s=null;return}m=h?p.position-h.position:0}else a(g);o.forEach(y=>{y(n.value,v,{delta:m,type:mv.pop,direction:m?m>0?qf.forward:qf.back:qf.unknown})})};function u(){s=n.value}function c(p){o.push(p);const g=()=>{const v=o.indexOf(p);v>-1&&o.splice(v,1)};return l.push(g),g}function d(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(Zt({},p.state,{scroll:Yd()}),"")}}function f(){for(const p of l)p();l=[],window.removeEventListener("popstate",r),window.removeEventListener("pagehide",d),document.removeEventListener("visibilitychange",d)}return window.addEventListener("popstate",r),window.addEventListener("pagehide",d),document.addEventListener("visibilitychange",d),{pauseListeners:u,listen:c,destroy:f}}function w0(e,t,n,a=!1,o=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:o?Yd():null}}function xJ(e){const{history:t,location:n}=window,a={value:zE(e,n)},o={value:t.state};o.value||l(a.value,{back:null,current:a.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function l(u,c,d){const f=e.indexOf("#"),p=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+u:kJ()+e+u;try{t[d?"replaceState":"pushState"](c,"",p),o.value=c}catch(g){console.error(g),n[d?"replace":"assign"](p)}}function s(u,c){l(u,Zt({},t.state,w0(o.value.back,u,o.value.forward,!0),c,{position:o.value.position}),!0),a.value=u}function r(u,c){const d=Zt({},o.value,t.state,{forward:u,scroll:Yd()});l(d.current,d,!0),l(u,Zt({},w0(a.value,u,null),{position:d.position+1},c),!1),a.value=u}return{location:a,state:o,push:r,replace:s}}function TJ(e){e=uJ(e);const t=xJ(e),n=EJ(e,t.state,t.location,t.replace);function a(l,s=!0){s||n.pauseListeners(),history.go(l)}const o=Zt({location:"",base:e,go:a,createHref:dJ.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let us=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Rn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Rn||{});const $J={type:us.Static,value:""},OJ=/[a-zA-Z0-9_]/;function NJ(e){if(!e)return[[]];if(e==="/")return[[$J]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${c}": ${g}`)}let n=Rn.Static,a=n;const o=[];let l;function s(){l&&o.push(l),l=[]}let r=0,u,c="",d="";function f(){c&&(n===Rn.Static?l.push({type:us.Static,value:c}):n===Rn.Param||n===Rn.ParamRegExp||n===Rn.ParamRegExpEnd?(l.length>1&&(u==="*"||u==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),l.push({type:us.Param,value:c,regexp:d,repeatable:u==="*"||u==="+",optional:u==="*"||u==="?"})):t("Invalid state to consume buffer"),c="")}function p(){c+=u}for(;rt.length?t.length===1&&t[0]===aa.Static+aa.Segment?1:-1:0}function HE(e,t){let n=0;const a=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const PJ={strict:!1,end:!0,sensitive:!1};function AJ(e,t,n){const a=IJ(NJ(e.path),n),o=Zt(a,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function LJ(e,t){const n=[],a=new Map;t=v0(PJ,t);function o(f){return a.get(f)}function l(f,p,g){const v=!g,h=E0(f);h.aliasOf=g&&g.record;const m=v0(t,f),y=[h];if("alias"in f){const C=typeof f.alias=="string"?[f.alias]:f.alias;for(const k of C)y.push(E0(Zt({},h,{components:g?g.record.components:h.components,path:k,aliasOf:g?g.record:h})))}let b,w;for(const C of y){const{path:k}=C;if(p&&k[0]!=="/"){const E=p.record.path,T=E[E.length-1]==="/"?"":"/";C.path=p.record.path+(k&&T+k)}if(b=AJ(C,p,m),g?g.alias.push(b):(w=w||b,w!==b&&w.alias.push(b),v&&f.name&&!x0(b)&&s(f.name)),KE(b)&&u(b),h.children){const E=h.children;for(let T=0;T{s(w)}:yi}function s(f){if(BE(f)){const p=a.get(f);p&&(a.delete(f),n.splice(n.indexOf(p),1),p.children.forEach(s),p.alias.forEach(s))}else{const p=n.indexOf(f);p>-1&&(n.splice(p,1),f.record.name&&a.delete(f.record.name),f.children.forEach(s),f.alias.forEach(s))}}function r(){return n}function u(f){const p=BJ(f,n);n.splice(p,0,f),f.record.name&&!x0(f)&&a.set(f.record.name,f)}function c(f,p){let g,v={},h,m;if("name"in f&&f.name){if(g=a.get(f.name),!g)throw Tr(wn.MATCHER_NOT_FOUND,{location:f});m=g.record.name,v=Zt(k0(p.params,g.keys.filter(w=>!w.optional).concat(g.parent?g.parent.keys.filter(w=>w.optional):[]).map(w=>w.name)),f.params&&k0(f.params,g.keys.map(w=>w.name))),h=g.stringify(v)}else if(f.path!=null)h=f.path,g=n.find(w=>w.re.test(h)),g&&(v=g.parse(h),m=g.record.name);else{if(g=p.name?a.get(p.name):n.find(w=>w.re.test(p.path)),!g)throw Tr(wn.MATCHER_NOT_FOUND,{location:f,currentLocation:p});m=g.record.name,v=Zt({},p.params,f.params),h=g.stringify(v)}const y=[];let b=g;for(;b;)y.unshift(b.record),b=b.parent;return{name:m,path:h,params:v,matched:y,meta:VJ(y)}}e.forEach(f=>l(f));function d(){n.length=0,a.clear()}return{addRoute:l,resolve:c,removeRoute:s,clearRoutes:d,getRoutes:r,getRecordMatcher:o}}function k0(e,t){const n={};for(const a of t)a in e&&(n[a]=e[a]);return n}function E0(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:DJ(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function DJ(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const a in e.components)t[a]=typeof n=="object"?n[a]:n;return t}function x0(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function VJ(e){return e.reduce((t,n)=>Zt(t,n.meta),{})}function BJ(e,t){let n=0,a=t.length;for(;n!==a;){const l=n+a>>1;HE(e,t[l])<0?a=l:n=l+1}const o=FJ(e);return o&&(a=t.lastIndexOf(o,a-1)),a}function FJ(e){let t=e;for(;t=t.parent;)if(KE(t)&&HE(e,t)===0)return t}function KE({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function T0(e){const t=_e(qd),n=_e(Mm),a=S(()=>{const u=i(e.to);return t.resolve(u)}),o=S(()=>{const{matched:u}=a.value,{length:c}=u,d=u[c-1],f=n.matched;if(!d||!f.length)return-1;const p=f.findIndex(xr.bind(null,d));if(p>-1)return p;const g=$0(u[c-2]);return c>1&&$0(d)===g&&f[f.length-1].path!==g?f.findIndex(xr.bind(null,u[c-2])):p}),l=S(()=>o.value>-1&&jJ(n.params,a.value.params)),s=S(()=>o.value>-1&&o.value===n.matched.length-1&&VE(n.params,a.value.params));function r(u={}){if(WJ(u)){const c=t[i(e.replace)?"replace":"push"](i(e.to)).catch(yi);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:a,href:S(()=>a.value.href),isActive:l,isExactActive:s,navigate:r}}function zJ(e){return e.length===1?e[0]:e}const HJ=ie({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:T0,setup(e,{slots:t}){const n=Rt(T0(e)),{options:a}=_e(qd),o=S(()=>({[O0(e.activeClass,a.linkActiveClass,"router-link-active")]:n.isActive,[O0(e.exactActiveClass,a.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const l=t.default&&zJ(t.default(n));return e.custom?l:Ye("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},l)}}}),KJ=HJ;function WJ(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function jJ(e,t){for(const n in t){const a=t[n],o=e[n];if(typeof a=="string"){if(a!==o)return!1}else if(!Ja(o)||o.length!==a.length||a.some((l,s)=>l.valueOf()!==o[s].valueOf()))return!1}return!0}function $0(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const O0=(e,t,n)=>e??t??n,UJ=ie({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const a=_e(yv),o=S(()=>e.route||a.value),l=_e(b0,0),s=S(()=>{let c=i(l);const{matched:d}=o.value;let f;for(;(f=d[c])&&!f.components;)c++;return c}),r=S(()=>o.value.matched[s.value]);bt(b0,S(()=>s.value+1)),bt(CJ,r),bt(yv,o);const u=A();return fe(()=>[u.value,r.value,e.name],([c,d,f],[p,g,v])=>{d&&(d.instances[f]=c,g&&g!==d&&c&&c===p&&(d.leaveGuards.size||(d.leaveGuards=g.leaveGuards),d.updateGuards.size||(d.updateGuards=g.updateGuards))),c&&d&&(!g||!xr(d,g)||!p)&&(d.enterCallbacks[f]||[]).forEach(h=>h(c))},{flush:"post"}),()=>{const c=o.value,d=e.name,f=r.value,p=f&&f.components[d];if(!p)return N0(n.default,{Component:p,route:c});const g=f.props[d],v=g?g===!0?c.params:typeof g=="function"?g(c):g:null,m=Ye(p,Zt({},v,t,{onVnodeUnmounted:y=>{y.component.isUnmounted&&(f.instances[d]=null)},ref:u}));return N0(n.default,{Component:m,route:c})||m}}});function N0(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const YJ=UJ;function qJ(e){const t=LJ(e.routes,e),n=e.parseQuery||bJ,a=e.stringifyQuery||y0,o=e.history,l=Xr(),s=Xr(),r=Xr(),u=Wt(gl);let c=gl;Ys&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=Uf.bind(null,te=>""+te),f=Uf.bind(null,nJ),p=Uf.bind(null,qi);function g(te,de){let se,Y;return BE(te)?(se=t.getRecordMatcher(te),Y=de):Y=te,t.addRoute(Y,se)}function v(te){const de=t.getRecordMatcher(te);de&&t.removeRoute(de)}function h(){return t.getRoutes().map(te=>te.record)}function m(te){return!!t.getRecordMatcher(te)}function y(te,de){if(de=Zt({},de||u.value),typeof te=="string"){const oe=Yf(n,te,de.path),ce=t.resolve({path:oe.path},de),ge=o.createHref(oe.fullPath);return Zt(oe,ce,{params:p(ce.params),hash:qi(oe.hash),redirectedFrom:void 0,href:ge})}let se;if(te.path!=null)se=Zt({},te,{path:Yf(n,te.path,de.path).path});else{const oe=Zt({},te.params);for(const ce in oe)oe[ce]==null&&delete oe[ce];se=Zt({},te,{params:f(oe)}),de.params=f(de.params)}const Y=t.resolve(se,de),G=te.hash||"";Y.params=d(p(Y.params));const V=lJ(a,Zt({},te,{hash:QZ(G),path:Y.path})),Z=o.createHref(V);return Zt({fullPath:V,hash:G,query:a===y0?wJ(te.query):te.query||{}},Y,{redirectedFrom:void 0,href:Z})}function b(te){return typeof te=="string"?Yf(n,te,u.value.path):Zt({},te)}function w(te,de){if(c!==te)return Tr(wn.NAVIGATION_CANCELLED,{from:de,to:te})}function C(te){return T(te)}function k(te){return C(Zt(b(te),{replace:!0}))}function E(te,de){const se=te.matched[te.matched.length-1];if(se&&se.redirect){const{redirect:Y}=se;let G=typeof Y=="function"?Y(te,de):Y;return typeof G=="string"&&(G=G.includes("?")||G.includes("#")?G=b(G):{path:G},G.params={}),Zt({query:te.query,hash:te.hash,params:G.path!=null?{}:te.params},G)}}function T(te,de){const se=c=y(te),Y=u.value,G=te.state,V=te.force,Z=te.replace===!0,oe=E(se,Y);if(oe)return T(Zt(b(oe),{state:typeof oe=="object"?Zt({},G,oe.state):G,force:V,replace:Z}),de||se);const ce=se;ce.redirectedFrom=de;let ge;return!V&&sJ(a,Y,se)&&(ge=Tr(wn.NAVIGATION_DUPLICATED,{to:ce,from:Y}),H(Y,Y,!0,!1)),(ge?Promise.resolve(ge):O(ce,Y)).catch(me=>Do(me)?Do(me,wn.NAVIGATION_GUARD_REDIRECT)?me:z(me):I(me,ce,Y)).then(me=>{if(me){if(Do(me,wn.NAVIGATION_GUARD_REDIRECT))return T(Zt({replace:Z},b(me.to),{state:typeof me.to=="object"?Zt({},G,me.to.state):G,force:V}),de||ce)}else me=P(ce,Y,!0,Z,G);return _(ce,Y,me),me})}function $(te,de){const se=w(te,de);return se?Promise.reject(se):Promise.resolve()}function N(te){const de=Q.values().next().value;return de&&typeof de.runWithContext=="function"?de.runWithContext(te):te()}function O(te,de){let se;const[Y,G,V]=SJ(te,de);se=Gf(Y.reverse(),"beforeRouteLeave",te,de);for(const oe of Y)oe.leaveGuards.forEach(ce=>{se.push(El(ce,te,de))});const Z=$.bind(null,te,de);return se.push(Z),ue(se).then(()=>{se=[];for(const oe of l.list())se.push(El(oe,te,de));return se.push(Z),ue(se)}).then(()=>{se=Gf(G,"beforeRouteUpdate",te,de);for(const oe of G)oe.updateGuards.forEach(ce=>{se.push(El(ce,te,de))});return se.push(Z),ue(se)}).then(()=>{se=[];for(const oe of V)if(oe.beforeEnter)if(Ja(oe.beforeEnter))for(const ce of oe.beforeEnter)se.push(El(ce,te,de));else se.push(El(oe.beforeEnter,te,de));return se.push(Z),ue(se)}).then(()=>(te.matched.forEach(oe=>oe.enterCallbacks={}),se=Gf(V,"beforeRouteEnter",te,de,N),se.push(Z),ue(se))).then(()=>{se=[];for(const oe of s.list())se.push(El(oe,te,de));return se.push(Z),ue(se)}).catch(oe=>Do(oe,wn.NAVIGATION_CANCELLED)?oe:Promise.reject(oe))}function _(te,de,se){r.list().forEach(Y=>N(()=>Y(te,de,se)))}function P(te,de,se,Y,G){const V=w(te,de);if(V)return V;const Z=de===gl,oe=Ys?history.state:{};se&&(Y||Z?o.replace(te.fullPath,Zt({scroll:Z&&oe&&oe.scroll},G)):o.push(te.fullPath,G)),u.value=te,H(te,de,se,Z),z()}let D;function W(){D||(D=o.listen((te,de,se)=>{if(!ee.listening)return;const Y=y(te),G=E(Y,ee.currentRoute.value);if(G){T(Zt(G,{replace:!0,force:!0}),Y).catch(yi);return}c=Y;const V=u.value;Ys&&vJ(g0(V.fullPath,se.delta),Yd()),O(Y,V).catch(Z=>Do(Z,wn.NAVIGATION_ABORTED|wn.NAVIGATION_CANCELLED)?Z:Do(Z,wn.NAVIGATION_GUARD_REDIRECT)?(T(Zt(b(Z.to),{force:!0}),Y).then(oe=>{Do(oe,wn.NAVIGATION_ABORTED|wn.NAVIGATION_DUPLICATED)&&!se.delta&&se.type===mv.pop&&o.go(-1,!1)}).catch(yi),Promise.reject()):(se.delta&&o.go(-se.delta,!1),I(Z,Y,V))).then(Z=>{Z=Z||P(Y,V,!1),Z&&(se.delta&&!Do(Z,wn.NAVIGATION_CANCELLED)?o.go(-se.delta,!1):se.type===mv.pop&&Do(Z,wn.NAVIGATION_ABORTED|wn.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),_(Y,V,Z)}).catch(yi)}))}let U=Xr(),F=Xr(),R;function I(te,de,se){z(te);const Y=F.list();return Y.length?Y.forEach(G=>G(te,de,se)):console.error(te),Promise.reject(te)}function L(){return R&&u.value!==gl?Promise.resolve():new Promise((te,de)=>{U.add([te,de])})}function z(te){return R||(R=!te,W(),U.list().forEach(([de,se])=>te?se(te):de()),U.reset()),te}function H(te,de,se,Y){const{scrollBehavior:G}=e;if(!Ys||!G)return Promise.resolve();const V=!se&&hJ(g0(te.fullPath,0))||(Y||!se)&&history.state&&history.state.scroll||null;return Ae().then(()=>G(te,de,V)).then(Z=>Z&&pJ(Z)).catch(Z=>I(Z,te,de))}const K=te=>o.go(te);let q;const Q=new Set,ee={currentRoute:u,listening:!0,addRoute:g,removeRoute:v,clearRoutes:t.clearRoutes,hasRoute:m,getRoutes:h,resolve:y,options:e,push:C,replace:k,go:K,back:()=>K(-1),forward:()=>K(1),beforeEach:l.add,beforeResolve:s.add,afterEach:r.add,onError:F.add,isReady:L,install(te){te.component("RouterLink",KJ),te.component("RouterView",YJ),te.config.globalProperties.$router=ee,Object.defineProperty(te.config.globalProperties,"$route",{enumerable:!0,get:()=>i(u)}),Ys&&!q&&u.value===gl&&(q=!0,C(o.location).catch(Y=>{}));const de={};for(const Y in gl)Object.defineProperty(de,Y,{get:()=>u.value[Y],enumerable:!0});te.provide(qd,ee),te.provide(Mm,rd(de)),te.provide(yv,u);const se=te.unmount;Q.add(te),te.unmount=function(){Q.delete(te),Q.size<1&&(c=gl,D&&D(),D=null,u.value=gl,q=!1,R=!1),se()}}};function ue(te){return te.reduce((de,se)=>de.then(()=>N(se)),Promise.resolve())}return ee}function oQ(){return _e(qd)}function lQ(e){return _e(Mm)}const GJ=[{path:"/",name:"home",component:()=>io(()=>import("./HomePage-CdqgUFQt.js"),__vite__mapDeps([0,1,2]))},{path:"/search",name:"search",component:()=>io(()=>import("./SearchResult-EeENDml7.js"),__vite__mapDeps([3,4,1,5]))},{path:"/result/:id",name:"result-detail",component:()=>io(()=>import("./ResultDetail-BLqifyVI.js"),__vite__mapDeps([6,7,4,1,8,9]))},{path:"/admin/login",name:"admin-login",component:()=>io(()=>import("./AdminLogin-BFh47H6c.js"),__vite__mapDeps([10,1,11]))},{path:"/admin",component:()=>io(()=>import("./AdminLayout-qvvQgX9o.js"),__vite__mapDeps([12,1,13])),meta:{requiresAuth:!0},children:[{path:"",redirect:"/admin/dashboard"},{path:"dashboard",name:"admin-dashboard",component:()=>io(()=>import("./AdminDashboard-CkHQl97R.js"),__vite__mapDeps([14,1,15,4,7,8,16,17,18,19,20,21]))},{path:"cloud-configs",name:"admin-cloud-configs",component:()=>io(()=>import("./CloudConfig-3znuBWUR.js"),__vite__mapDeps([15,4,1,7,8,16]))},{path:"cleanup",name:"admin-cleanup",component:()=>io(()=>import("./Cleanup-BkDauFCX.js"),__vite__mapDeps([22,1,23]))},{path:"system",name:"admin-system",component:()=>io(()=>import("./SystemConfig-BbG7uBv0.js"),__vite__mapDeps([17,1,18]))},{path:"save-records",name:"admin-save-records",component:()=>io(()=>import("./SaveRecords-B5cCMWaP.js"),__vite__mapDeps([19,1,20]))}]}],WE=qJ({history:TJ(),routes:GJ});WE.beforeEach((e,t,n)=>{const a=localStorage.getItem("admin_token");e.meta.requiresAuth&&!a?n("/admin/login"):n()});const Gd=lw(FZ);Gd.use(y$());Gd.use(WE);Gd.use(VZ);Gd.mount("#app");export{vP as A,Ae as B,ZJ as C,XJ as D,iZ as E,He as F,eQ as G,JJ as H,tQ as I,al as J,dt as K,Nt as L,Oo as M,aQ as N,QJ as O,nQ as P,Pv as Q,x as a,j as b,B as c,ie as d,le as e,J as f,en as g,A as h,Rt as i,Ot as j,i as k,St as l,$r as m,M as n,mt as o,je as p,Xe as q,Ct as r,QP as s,ke as t,oQ as u,S as v,ne as w,fe as x,re as y,lQ as z}; diff --git a/source_clean/frontend-src/dist-vite/index.html b/source_clean/frontend-src/dist-vite/index.html index e227d68..afbd9d5 100644 --- a/source_clean/frontend-src/dist-vite/index.html +++ b/source_clean/frontend-src/dist-vite/index.html @@ -21,7 +21,7 @@ } })(); - + diff --git a/source_clean/frontend-src/src/pages/admin/AdminLayout.vue b/source_clean/frontend-src/src/pages/admin/AdminLayout.vue index fd0af15..a254324 100644 --- a/source_clean/frontend-src/src/pages/admin/AdminLayout.vue +++ b/source_clean/frontend-src/src/pages/admin/AdminLayout.vue @@ -38,6 +38,7 @@ ⚡ 性能配置 🔑 修改密码 📬 消息推送 + 📊 每日汇报 @@ -96,6 +97,7 @@ const pageTitles: Record = { 'sys-strategy': '性能配置', 'sys-password': '修改管理员密码', 'sys-notify': '消息推送', + 'sys-daily-report': '每日汇报', 'save-records': '转存日志', } diff --git a/source_clean/frontend-src/src/pages/admin/SystemConfig.vue b/source_clean/frontend-src/src/pages/admin/SystemConfig.vue index 35764bd..d937c7d 100755 --- a/source_clean/frontend-src/src/pages/admin/SystemConfig.vue +++ b/source_clean/frontend-src/src/pages/admin/SystemConfig.vue @@ -612,6 +612,51 @@ + + + + + + + + + + +
    默认每天 08:00 发送前一天的汇总报告
    +
    + +
    + + + + +
    +
    + + {{ dailyReportLastRun || '从未发送' }} + +
    + + + +
    {{ dailyReportPreview }}
    +
    +
    +
    启用后 CloudSearch 将自动检测并更新到最新镜像版本
    当前需手动在服务器执行:docker-compose -f /opt/CloudSearch/docker-compose.yml pull && docker-compose -f /opt/CloudSearch/docker-compose.yml up -d
    @@ -694,6 +739,92 @@ const autoUpdateEnabled = computed({ }) // ======================== Push User Notifications ======================== + +// ======================== Daily Report ======================== +const dailyReportForm = reactive({ + enabled: true, + time: '08:00', + includeSearch: true, + includeSaves: true, + includeStorage: true, + includeUsers: true, +}) +const dailyReportPreviewing = ref(false) +const dailyReportSending = ref(false) +const dailyReportPreview = ref('') +const dailyReportPreviewVisible = ref(false) +const dailyReportLastRun = ref('') + +async function loadDailyReportConfig() { + try { + const res = await fetch('/api/admin/daily-report/config', { + headers: { Authorization: `Bearer ${localStorage.getItem("admin_token")}` } + }) + if (res.ok) { + const cfg = await res.json() + Object.assign(dailyReportForm, cfg) + } + } catch {} +} +async function loadDailyReportLastRun() { + try { + const res = await fetch('/api/admin/daily-report/last-run', { + headers: { Authorization: `Bearer ${localStorage.getItem("admin_token")}` } + }) + if (res.ok) { + const data = await res.json() + if (data.date) { + dailyReportLastRun.value = `${data.date} ${new Date(data.sentAt).toLocaleTimeString('zh-CN')}` + } + } + } catch {} +} +async function saveDailyReportConfig() { + try { + await fetch('/api/admin/daily-report/config', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${localStorage.getItem("admin_token")}`, + }, + body: JSON.stringify({ ...dailyReportForm }), + }) + } catch {} +} +async function handleDailyReportPreview() { + dailyReportPreviewing.value = true + try { + const res = await fetch('/api/admin/daily-report/preview', { + headers: { Authorization: `Bearer ${localStorage.getItem("admin_token")}` } + }) + if (res.ok) { + const data = await res.json() + dailyReportPreview.value = data.content + dailyReportPreviewVisible.value = true + } + } finally { + dailyReportPreviewing.value = false + } +} +async function handleDailyReportSendTest() { + dailyReportSending.value = true + try { + const res = await fetch('/api/admin/daily-report/test', { + method: 'POST', + headers: { Authorization: `Bearer ${localStorage.getItem("admin_token")}` }, + }) + if (res.ok) { + ElMessage.success('测试报告已发送到全局通知通道') + } else { + ElMessage.error('发送失败') + } + } catch { + ElMessage.error('发送失败') + } finally { + dailyReportSending.value = false + } +} + const pushUsers = ref([]) const notifyProviders = ref>({}) // const pushUserDialogVisible = ref(false) // removed - using inline form @@ -1005,6 +1136,8 @@ onMounted(async () => { initGlobalNotifyForm() await loadGlobalNotifyConfig() loadPushUsers() + loadDailyReportConfig() + loadDailyReportLastRun() loadPushUserAccountOptions() }) @@ -1320,6 +1453,7 @@ async function handleSave() { key: cfg.key, value: String(configs[cfg.key] ?? cfg.value), })) + await saveDailyReportConfig() // Add global_notify_config as JSON entry entries.push({ key: 'global_notify_config', diff --git a/source_clean/frontend/assets/AdminDashboard-BvLIjTGZ.js b/source_clean/frontend/assets/AdminDashboard-CkHQl97R.js similarity index 99% rename from source_clean/frontend/assets/AdminDashboard-BvLIjTGZ.js rename to source_clean/frontend/assets/AdminDashboard-CkHQl97R.js index 56f4039..9f3cd2c 100644 --- a/source_clean/frontend/assets/AdminDashboard-BvLIjTGZ.js +++ b/source_clean/frontend/assets/AdminDashboard-CkHQl97R.js @@ -1,4 +1,4 @@ -import{x as qu,m as $_,h as Ce,B as Hg,d as q_,o as K_,a as Tt,c as Nt,K as ml,L as _l,b as Q,F as Vr,r as Gr,f as $t,w as qt,e as Oe,v as Ka,j as Hr,i as Q_,t as wt,n as Nc,y as Ei,l as zc,p as J_,E as j_,u as t1}from"./index-D279dJND.js";import{a as e1,h as r1,c as i1,i as n1,j as a1,t as o1,_ as s1}from"./_plugin-vue_export-helper-1Z-znrfZ.js";import l1 from"./CloudConfig-BADbnuPV.js";import u1 from"./SystemConfig-C3is0eeI.js";import f1 from"./SaveRecords-DLmXAM3V.js";import"./index-Bn7NwETH.js";import"./CloudBadge-OZZzB6Zg.js";/*! ***************************************************************************** +import{x as qu,m as $_,h as Ce,B as Hg,d as q_,o as K_,a as Tt,c as Nt,K as ml,L as _l,b as Q,F as Vr,r as Gr,f as $t,w as qt,e as Oe,v as Ka,j as Hr,i as Q_,t as wt,n as Nc,y as Ei,l as zc,p as J_,E as j_,u as t1}from"./index-D_srC3bj.js";import{a as e1,h as r1,c as i1,i as n1,j as a1,t as o1,_ as s1}from"./_plugin-vue_export-helper-1Z-znrfZ.js";import l1 from"./CloudConfig-3znuBWUR.js";import u1 from"./SystemConfig-BbG7uBv0.js";import f1 from"./SaveRecords-B5cCMWaP.js";import"./index-Bn7NwETH.js";import"./CloudBadge-CbpZHKLy.js";/*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any diff --git a/source_clean/frontend/assets/AdminLayout-DHRMhPUk.js b/source_clean/frontend/assets/AdminLayout-DHRMhPUk.js deleted file mode 100644 index f014134..0000000 --- a/source_clean/frontend/assets/AdminLayout-DHRMhPUk.js +++ /dev/null @@ -1 +0,0 @@ -import{d as B,o as N,a as V,c as I,b as n,t as c,f as e,w as t,h as g,v as y,j as i,k as r,C as M,l,D as T,G as j,H as q,I as z,J as A,u as D,z as H}from"./index-D279dJND.js";import{a as L,_ as R}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const E={class:"admin-layout"},G={class:"admin-sidebar"},J={class:"sidebar-brand"},W={class:"sidebar-brand-text"},F={class:"sidebar-version"},K={class:"admin-content"},O={class:"content-header"},P={class:"content-breadcrumb"},Q={class:"breadcrumb-current"},U={class:"content-actions"},X={class:"content-body"},Y=B({__name:"AdminLayout",setup(Z){const d=D(),f=H(),m=g(""),_=g(""),b={dashboard:"仪表盘","cloud-configs-toggle":"网盘设置及授权","cloud-configs-cleanup":"存储清理","sys-site":"网站设置","sys-services":"外部服务 & 缓存","sys-strategy":"性能配置","sys-password":"修改管理员密码","sys-notify":"消息推送","save-records":"转存日志"},p=y(()=>{const o=f.name;return o==="admin-cloud-configs"?"cloud-configs-toggle":o==="admin-cleanup"?"cloud-configs-cleanup":o==="admin-system"?f.query.section||"sys-site":o==="admin-save-records"?"save-records":"dashboard"}),x=y(()=>b[p.value]||"仪表盘");function w(o){o==="dashboard"?d.push("/admin/dashboard"):o==="cloud-configs-toggle"?d.push("/admin/cloud-configs"):o==="cloud-configs-cleanup"?d.push("/admin/cleanup"):o.startsWith("sys-")?d.push({path:"/admin/system",query:{section:o}}):o==="save-records"?d.push("/admin/save-records"):o==="logout"&&(localStorage.removeItem("admin_token"),d.push("/admin/login"))}function h(){d.push("/")}return N(async()=>{try{const o=await L();m.value=o.site_name||""}catch{}try{const s=await(await fetch("/health")).json();_.value=s.version}catch{}}),(o,s)=>{const u=i("el-icon"),a=i("el-menu-item"),v=i("el-sub-menu"),C=i("el-menu"),k=i("el-button"),S=i("router-view");return V(),I("div",E,[n("aside",G,[n("div",J,[s[1]||(s[1]=n("div",{class:"sidebar-logo"},"☁️",-1)),n("div",W,[n("h2",null,c(m.value||"CloudSearch"),1),s[0]||(s[0]=n("p",null,"管理控制台",-1))])]),e(C,{"default-active":p.value,class:"sidebar-menu",onSelect:w},{default:t(()=>[e(a,{index:"dashboard"},{default:t(()=>[e(u,null,{default:t(()=>[e(r(M))]),_:1}),s[2]||(s[2]=n("span",null,"仪表盘",-1))]),_:1}),e(v,{index:"cloud-configs"},{title:t(()=>[e(u,null,{default:t(()=>[e(r(T))]),_:1}),s[3]||(s[3]=n("span",null,"网盘管理",-1))]),default:t(()=>[e(a,{index:"cloud-configs-toggle"},{default:t(()=>[...s[4]||(s[4]=[l("📋 设置及授权",-1)])]),_:1}),e(a,{index:"cloud-configs-cleanup"},{default:t(()=>[...s[5]||(s[5]=[l("🧹 存储清理",-1)])]),_:1})]),_:1}),e(v,{index:"system"},{title:t(()=>[e(u,null,{default:t(()=>[e(r(j))]),_:1}),s[6]||(s[6]=n("span",null,"系统设置",-1))]),default:t(()=>[e(a,{index:"sys-site"},{default:t(()=>[...s[7]||(s[7]=[l("🌐 网站设置",-1)])]),_:1}),e(a,{index:"sys-services"},{default:t(()=>[...s[8]||(s[8]=[l("🔗 外部服务 & 缓存",-1)])]),_:1}),e(a,{index:"sys-strategy"},{default:t(()=>[...s[9]||(s[9]=[l("⚡ 性能配置",-1)])]),_:1}),e(a,{index:"sys-password"},{default:t(()=>[...s[10]||(s[10]=[l("🔑 修改密码",-1)])]),_:1}),e(a,{index:"sys-notify"},{default:t(()=>[...s[11]||(s[11]=[l("📬 消息推送",-1)])]),_:1})]),_:1}),e(a,{index:"save-records"},{default:t(()=>[e(u,null,{default:t(()=>[e(r(q))]),_:1}),s[12]||(s[12]=n("span",null,"转存日志",-1))]),_:1}),s[14]||(s[14]=n("div",{class:"sidebar-spacer"},null,-1)),n("div",F,"v"+c(_.value),1),e(a,{index:"logout"},{default:t(()=>[e(u,null,{default:t(()=>[e(r(z))]),_:1}),s[13]||(s[13]=n("span",null,"退出登录",-1))]),_:1})]),_:1},8,["default-active"])]),n("div",K,[n("header",O,[n("div",P,[n("span",Q,c(x.value),1)]),n("div",U,[e(k,{text:"",size:"small",onClick:h},{default:t(()=>[e(u,null,{default:t(()=>[e(r(A))]),_:1}),s[15]||(s[15]=l(" 返回前台 ",-1))]),_:1})])]),n("main",X,[e(S)])])])}}}),es=R(Y,[["__scopeId","data-v-29c9acc0"]]);export{es as default}; diff --git a/source_clean/frontend/assets/AdminLayout-K9Kq5pc4.css b/source_clean/frontend/assets/AdminLayout-K9Kq5pc4.css new file mode 100644 index 0000000..bfde3ca --- /dev/null +++ b/source_clean/frontend/assets/AdminLayout-K9Kq5pc4.css @@ -0,0 +1 @@ +.admin-layout[data-v-469751e8]{display:flex;height:100vh;background:var(--bg-page)}.admin-sidebar[data-v-469751e8]{width:var(--sidebar-w);flex-shrink:0;display:flex;flex-direction:column;background:linear-gradient(180deg,#111827,#1e293b);position:relative;z-index:10}.sidebar-brand[data-v-469751e8]{display:flex;align-items:center;gap:10px;padding:20px 20px 16px;border-bottom:1px solid rgba(255,255,255,.06)}.sidebar-logo[data-v-469751e8]{font-size:28px;line-height:1;flex-shrink:0}.sidebar-brand-text h2[data-v-469751e8]{font-size:16px;font-weight:700;margin:0;color:#fff;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar-brand-text p[data-v-469751e8]{font-size:11px;margin:2px 0 0;color:#ffffff73;letter-spacing:1px}.sidebar-menu[data-v-469751e8]{flex:1;display:flex;flex-direction:column;background:transparent!important;border-right:none!important;padding:4px 0}.sidebar-menu[data-v-469751e8] .el-menu-item,.sidebar-menu[data-v-469751e8] .el-sub-menu__title{color:#ffffffa6;height:44px;line-height:44px;transition:all .2s ease;margin:0 6px;border-radius:var(--radius-sm)}.sidebar-menu[data-v-469751e8] .el-menu-item:hover,.sidebar-menu[data-v-469751e8] .el-sub-menu__title:hover{background:#ffffff14;color:#ffffffe6}.sidebar-menu[data-v-469751e8] .el-menu-item.is-active{color:#fff;background:linear-gradient(90deg,#409eff40,#6366f126);font-weight:500}.sidebar-menu[data-v-469751e8] .el-menu-item:after{display:none}.sidebar-menu[data-v-469751e8] .el-sub-menu .el-menu{background:#0003!important}.sidebar-menu[data-v-469751e8] .el-sub-menu .el-menu .el-menu-item{padding-left:52px!important;font-size:13px;height:38px;line-height:38px}.sidebar-menu[data-v-469751e8] .el-icon{font-size:16px}.sidebar-spacer[data-v-469751e8]{flex:1}.sidebar-version[data-v-469751e8]{text-align:center;font-size:11px;color:#ffffff40;padding:8px 0;letter-spacing:.5px}.admin-content[data-v-469751e8]{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.content-header[data-v-469751e8]{display:flex;align-items:center;justify-content:space-between;padding:16px 28px;background:var(--bg-card);border-bottom:1px solid var(--border-light);flex-shrink:0}.content-breadcrumb[data-v-469751e8]{display:flex;align-items:center;gap:8px}.breadcrumb-current[data-v-469751e8]{font-size:18px;font-weight:700;color:var(--text)}.content-actions[data-v-469751e8] .el-button{color:var(--text-secondary);gap:4px}.content-body[data-v-469751e8]{flex:1;overflow-y:auto;padding:24px 28px}.content-body[data-v-469751e8] .save-bar{position:fixed;bottom:32px;right:32px;z-index:100;background:var(--bg-card);padding:12px 16px;border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:0 4px 16px #0000001f;display:flex;gap:10px;transition:box-shadow .2s,transform .2s}.content-body[data-v-469751e8] .save-bar:hover{box-shadow:0 6px 24px #0000002e;transform:translateY(-2px)} diff --git a/source_clean/frontend/assets/AdminLayout-e6gnzMQk.css b/source_clean/frontend/assets/AdminLayout-e6gnzMQk.css deleted file mode 100644 index 70729d5..0000000 --- a/source_clean/frontend/assets/AdminLayout-e6gnzMQk.css +++ /dev/null @@ -1 +0,0 @@ -.admin-layout[data-v-29c9acc0]{display:flex;height:100vh;background:var(--bg-page)}.admin-sidebar[data-v-29c9acc0]{width:var(--sidebar-w);flex-shrink:0;display:flex;flex-direction:column;background:linear-gradient(180deg,#111827,#1e293b);position:relative;z-index:10}.sidebar-brand[data-v-29c9acc0]{display:flex;align-items:center;gap:10px;padding:20px 20px 16px;border-bottom:1px solid rgba(255,255,255,.06)}.sidebar-logo[data-v-29c9acc0]{font-size:28px;line-height:1;flex-shrink:0}.sidebar-brand-text h2[data-v-29c9acc0]{font-size:16px;font-weight:700;margin:0;color:#fff;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar-brand-text p[data-v-29c9acc0]{font-size:11px;margin:2px 0 0;color:#ffffff73;letter-spacing:1px}.sidebar-menu[data-v-29c9acc0]{flex:1;display:flex;flex-direction:column;background:transparent!important;border-right:none!important;padding:4px 0}.sidebar-menu[data-v-29c9acc0] .el-menu-item,.sidebar-menu[data-v-29c9acc0] .el-sub-menu__title{color:#ffffffa6;height:44px;line-height:44px;transition:all .2s ease;margin:0 6px;border-radius:var(--radius-sm)}.sidebar-menu[data-v-29c9acc0] .el-menu-item:hover,.sidebar-menu[data-v-29c9acc0] .el-sub-menu__title:hover{background:#ffffff14;color:#ffffffe6}.sidebar-menu[data-v-29c9acc0] .el-menu-item.is-active{color:#fff;background:linear-gradient(90deg,#409eff40,#6366f126);font-weight:500}.sidebar-menu[data-v-29c9acc0] .el-menu-item:after{display:none}.sidebar-menu[data-v-29c9acc0] .el-sub-menu .el-menu{background:#0003!important}.sidebar-menu[data-v-29c9acc0] .el-sub-menu .el-menu .el-menu-item{padding-left:52px!important;font-size:13px;height:38px;line-height:38px}.sidebar-menu[data-v-29c9acc0] .el-icon{font-size:16px}.sidebar-spacer[data-v-29c9acc0]{flex:1}.sidebar-version[data-v-29c9acc0]{text-align:center;font-size:11px;color:#ffffff40;padding:8px 0;letter-spacing:.5px}.admin-content[data-v-29c9acc0]{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.content-header[data-v-29c9acc0]{display:flex;align-items:center;justify-content:space-between;padding:16px 28px;background:var(--bg-card);border-bottom:1px solid var(--border-light);flex-shrink:0}.content-breadcrumb[data-v-29c9acc0]{display:flex;align-items:center;gap:8px}.breadcrumb-current[data-v-29c9acc0]{font-size:18px;font-weight:700;color:var(--text)}.content-actions[data-v-29c9acc0] .el-button{color:var(--text-secondary);gap:4px}.content-body[data-v-29c9acc0]{flex:1;overflow-y:auto;padding:24px 28px}.content-body[data-v-29c9acc0] .save-bar{position:fixed;bottom:32px;right:32px;z-index:100;background:var(--bg-card);padding:12px 16px;border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:0 4px 16px #0000001f;display:flex;gap:10px;transition:box-shadow .2s,transform .2s}.content-body[data-v-29c9acc0] .save-bar:hover{box-shadow:0 6px 24px #0000002e;transform:translateY(-2px)} diff --git a/source_clean/frontend/assets/AdminLayout-qvvQgX9o.js b/source_clean/frontend/assets/AdminLayout-qvvQgX9o.js new file mode 100644 index 0000000..14de1b8 --- /dev/null +++ b/source_clean/frontend/assets/AdminLayout-qvvQgX9o.js @@ -0,0 +1 @@ +import{d as B,o as N,a as V,c as I,b as n,t as c,f as e,w as t,h as g,v as y,j as u,k as r,C as M,l,D as T,G as j,H as q,I as z,J as A,u as D,z as H}from"./index-D_srC3bj.js";import{a as L,_ as R}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const E={class:"admin-layout"},G={class:"admin-sidebar"},J={class:"sidebar-brand"},W={class:"sidebar-brand-text"},F={class:"sidebar-version"},K={class:"admin-content"},O={class:"content-header"},P={class:"content-breadcrumb"},Q={class:"breadcrumb-current"},U={class:"content-actions"},X={class:"content-body"},Y=B({__name:"AdminLayout",setup(Z){const d=D(),f=H(),m=g(""),_=g(""),b={dashboard:"仪表盘","cloud-configs-toggle":"网盘设置及授权","cloud-configs-cleanup":"存储清理","sys-site":"网站设置","sys-services":"外部服务 & 缓存","sys-strategy":"性能配置","sys-password":"修改管理员密码","sys-notify":"消息推送","sys-daily-report":"每日汇报","save-records":"转存日志"},p=y(()=>{const o=f.name;return o==="admin-cloud-configs"?"cloud-configs-toggle":o==="admin-cleanup"?"cloud-configs-cleanup":o==="admin-system"?f.query.section||"sys-site":o==="admin-save-records"?"save-records":"dashboard"}),x=y(()=>b[p.value]||"仪表盘");function w(o){o==="dashboard"?d.push("/admin/dashboard"):o==="cloud-configs-toggle"?d.push("/admin/cloud-configs"):o==="cloud-configs-cleanup"?d.push("/admin/cleanup"):o.startsWith("sys-")?d.push({path:"/admin/system",query:{section:o}}):o==="save-records"?d.push("/admin/save-records"):o==="logout"&&(localStorage.removeItem("admin_token"),d.push("/admin/login"))}function h(){d.push("/")}return N(async()=>{try{const o=await L();m.value=o.site_name||""}catch{}try{const s=await(await fetch("/health")).json();_.value=s.version}catch{}}),(o,s)=>{const i=u("el-icon"),a=u("el-menu-item"),v=u("el-sub-menu"),C=u("el-menu"),k=u("el-button"),S=u("router-view");return V(),I("div",E,[n("aside",G,[n("div",J,[s[1]||(s[1]=n("div",{class:"sidebar-logo"},"☁️",-1)),n("div",W,[n("h2",null,c(m.value||"CloudSearch"),1),s[0]||(s[0]=n("p",null,"管理控制台",-1))])]),e(C,{"default-active":p.value,class:"sidebar-menu",onSelect:w},{default:t(()=>[e(a,{index:"dashboard"},{default:t(()=>[e(i,null,{default:t(()=>[e(r(M))]),_:1}),s[2]||(s[2]=n("span",null,"仪表盘",-1))]),_:1}),e(v,{index:"cloud-configs"},{title:t(()=>[e(i,null,{default:t(()=>[e(r(T))]),_:1}),s[3]||(s[3]=n("span",null,"网盘管理",-1))]),default:t(()=>[e(a,{index:"cloud-configs-toggle"},{default:t(()=>[...s[4]||(s[4]=[l("📋 设置及授权",-1)])]),_:1}),e(a,{index:"cloud-configs-cleanup"},{default:t(()=>[...s[5]||(s[5]=[l("🧹 存储清理",-1)])]),_:1})]),_:1}),e(v,{index:"system"},{title:t(()=>[e(i,null,{default:t(()=>[e(r(j))]),_:1}),s[6]||(s[6]=n("span",null,"系统设置",-1))]),default:t(()=>[e(a,{index:"sys-site"},{default:t(()=>[...s[7]||(s[7]=[l("🌐 网站设置",-1)])]),_:1}),e(a,{index:"sys-services"},{default:t(()=>[...s[8]||(s[8]=[l("🔗 外部服务 & 缓存",-1)])]),_:1}),e(a,{index:"sys-strategy"},{default:t(()=>[...s[9]||(s[9]=[l("⚡ 性能配置",-1)])]),_:1}),e(a,{index:"sys-password"},{default:t(()=>[...s[10]||(s[10]=[l("🔑 修改密码",-1)])]),_:1}),e(a,{index:"sys-notify"},{default:t(()=>[...s[11]||(s[11]=[l("📬 消息推送",-1)])]),_:1}),e(a,{index:"sys-daily-report"},{default:t(()=>[...s[12]||(s[12]=[l("📊 每日汇报",-1)])]),_:1})]),_:1}),e(a,{index:"save-records"},{default:t(()=>[e(i,null,{default:t(()=>[e(r(q))]),_:1}),s[13]||(s[13]=n("span",null,"转存日志",-1))]),_:1}),s[15]||(s[15]=n("div",{class:"sidebar-spacer"},null,-1)),n("div",F,"v"+c(_.value),1),e(a,{index:"logout"},{default:t(()=>[e(i,null,{default:t(()=>[e(r(z))]),_:1}),s[14]||(s[14]=n("span",null,"退出登录",-1))]),_:1})]),_:1},8,["default-active"])]),n("div",K,[n("header",O,[n("div",P,[n("span",Q,c(x.value),1)]),n("div",U,[e(k,{text:"",size:"small",onClick:h},{default:t(()=>[e(i,null,{default:t(()=>[e(r(A))]),_:1}),s[16]||(s[16]=l(" 返回前台 ",-1))]),_:1})])]),n("main",X,[e(S)])])])}}}),es=R(Y,[["__scopeId","data-v-469751e8"]]);export{es as default}; diff --git a/source_clean/frontend-src/dist-vite/assets/AdminLogin-DxE2POP4.js b/source_clean/frontend/assets/AdminLogin-BFh47H6c.js similarity index 94% rename from source_clean/frontend-src/dist-vite/assets/AdminLogin-DxE2POP4.js rename to source_clean/frontend/assets/AdminLogin-BFh47H6c.js index b64c5cd..be11eae 100644 --- a/source_clean/frontend-src/dist-vite/assets/AdminLogin-DxE2POP4.js +++ b/source_clean/frontend/assets/AdminLogin-BFh47H6c.js @@ -1 +1 @@ -import{d as k,o as C,a as w,c as y,b as a,t as m,f as t,w as i,g as x,e as L,h as d,j as p,l as N,i as S,E as B}from"./index-D279dJND.js";import{a as E,d as M,_ as U}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const j={class:"admin-login-page"},q={class:"login-card"},A={class:"login-brand"},I={class:"login-title"},K={key:0,class:"error-msg"},R={class:"login-footer"},z=k({__name:"AdminLogin",setup(D){const f=d(),u=d(!1),c=d(""),g=d(""),v=d("");E().then(l=>{l.site_name&&(g.value=l.site_name)}).catch(()=>{});const s=S({username:"",password:""}),b={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]};async function h(){var e,r,n;if(await((e=f.value)==null?void 0:e.validate().catch(()=>!1))){u.value=!0,c.value="";try{const o=await M(s.username,s.password);localStorage.setItem("admin_token",o.token),B.success("登录成功"),window.location.href="/admin"}catch(o){c.value=((n=(r=o==null?void 0:o.response)==null?void 0:r.data)==null?void 0:n.message)||(o==null?void 0:o.message)||"登录失败"}finally{u.value=!1}}}return C(async()=>{try{const e=await(await fetch("/health")).json();v.value=e.version||""}catch{}}),(l,e)=>{const r=p("el-input"),n=p("el-form-item"),o=p("el-button"),V=p("el-form");return w(),y("div",j,[e[4]||(e[4]=a("div",{class:"login-bg-pattern"},null,-1)),a("div",q,[a("div",A,[e[2]||(e[2]=a("div",{class:"login-logo"},"☁️",-1)),a("h1",I,m(g.value||"CloudSearch"),1),e[3]||(e[3]=a("p",{class:"login-subtitle"},"管理后台",-1))]),t(V,{ref_key:"formRef",ref:f,model:s,rules:b,"label-width":"0",size:"large",onKeyup:x(h,["enter"])},{default:i(()=>[t(n,{prop:"username"},{default:i(()=>[t(r,{modelValue:s.username,"onUpdate:modelValue":e[0]||(e[0]=_=>s.username=_),placeholder:"用户名","prefix-icon":"User"},null,8,["modelValue"])]),_:1}),t(n,{prop:"password"},{default:i(()=>[t(r,{modelValue:s.password,"onUpdate:modelValue":e[1]||(e[1]=_=>s.password=_),type:"password",placeholder:"密码","prefix-icon":"Lock","show-password":""},null,8,["modelValue"])]),_:1}),t(n,null,{default:i(()=>[t(o,{type:"primary",loading:u.value,class:"login-btn",onClick:h},{default:i(()=>[N(m(u.value?"登录中...":"登 录"),1)]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"]),c.value?(w(),y("p",K,m(c.value),1)):L("",!0),a("p",R,"CloudSearch v"+m(v.value),1)])])}}}),G=U(z,[["__scopeId","data-v-bd0b6672"]]);export{G as default}; +import{d as k,o as C,a as w,c as y,b as a,t as m,f as t,w as i,g as x,e as L,h as d,j as p,l as N,i as S,E as B}from"./index-D_srC3bj.js";import{a as E,d as M,_ as U}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const j={class:"admin-login-page"},q={class:"login-card"},A={class:"login-brand"},I={class:"login-title"},K={key:0,class:"error-msg"},R={class:"login-footer"},z=k({__name:"AdminLogin",setup(D){const f=d(),u=d(!1),c=d(""),g=d(""),v=d("");E().then(l=>{l.site_name&&(g.value=l.site_name)}).catch(()=>{});const s=S({username:"",password:""}),b={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]};async function h(){var e,r,n;if(await((e=f.value)==null?void 0:e.validate().catch(()=>!1))){u.value=!0,c.value="";try{const o=await M(s.username,s.password);localStorage.setItem("admin_token",o.token),B.success("登录成功"),window.location.href="/admin"}catch(o){c.value=((n=(r=o==null?void 0:o.response)==null?void 0:r.data)==null?void 0:n.message)||(o==null?void 0:o.message)||"登录失败"}finally{u.value=!1}}}return C(async()=>{try{const e=await(await fetch("/health")).json();v.value=e.version||""}catch{}}),(l,e)=>{const r=p("el-input"),n=p("el-form-item"),o=p("el-button"),V=p("el-form");return w(),y("div",j,[e[4]||(e[4]=a("div",{class:"login-bg-pattern"},null,-1)),a("div",q,[a("div",A,[e[2]||(e[2]=a("div",{class:"login-logo"},"☁️",-1)),a("h1",I,m(g.value||"CloudSearch"),1),e[3]||(e[3]=a("p",{class:"login-subtitle"},"管理后台",-1))]),t(V,{ref_key:"formRef",ref:f,model:s,rules:b,"label-width":"0",size:"large",onKeyup:x(h,["enter"])},{default:i(()=>[t(n,{prop:"username"},{default:i(()=>[t(r,{modelValue:s.username,"onUpdate:modelValue":e[0]||(e[0]=_=>s.username=_),placeholder:"用户名","prefix-icon":"User"},null,8,["modelValue"])]),_:1}),t(n,{prop:"password"},{default:i(()=>[t(r,{modelValue:s.password,"onUpdate:modelValue":e[1]||(e[1]=_=>s.password=_),type:"password",placeholder:"密码","prefix-icon":"Lock","show-password":""},null,8,["modelValue"])]),_:1}),t(n,null,{default:i(()=>[t(o,{type:"primary",loading:u.value,class:"login-btn",onClick:h},{default:i(()=>[N(m(u.value?"登录中...":"登 录"),1)]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"]),c.value?(w(),y("p",K,m(c.value),1)):L("",!0),a("p",R,"CloudSearch v"+m(v.value),1)])])}}}),G=U(z,[["__scopeId","data-v-bd0b6672"]]);export{G as default}; diff --git a/source_clean/frontend/assets/Cleanup-CwLcANun.js b/source_clean/frontend/assets/Cleanup-BkDauFCX.js similarity index 99% rename from source_clean/frontend/assets/Cleanup-CwLcANun.js rename to source_clean/frontend/assets/Cleanup-BkDauFCX.js index 34744fd..2c5d2e7 100644 --- a/source_clean/frontend/assets/Cleanup-CwLcANun.js +++ b/source_clean/frontend/assets/Cleanup-BkDauFCX.js @@ -1 +1 @@ -import{d as X,o as Y,a as _,c as f,f as a,w as u,j as p,i as Z,b as t,F as ee,r as le,y as N,l as m,t as v,e as g,g as ae,h as y,v as r,E as d}from"./index-D279dJND.js";import{k as te,p as se,r as ne,v as oe,_ as ue}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const ie={class:"cleanup-section"},re={class:"cleanup-grid"},pe={class:"cleanup-group"},de={style:{display:"flex","align-items":"center",gap:"10px","flex-wrap":"wrap"}},ce={style:{display:"flex","align-items":"center",gap:"10px"}},_e={style:{width:"100%"}},me={key:0,style:{display:"flex",gap:"6px","flex-wrap":"wrap","margin-bottom":"6px"}},fe={style:{display:"flex",gap:"6px"}},ve={class:"cleanup-group"},ge={style:{display:"flex","align-items":"center",gap:"8px"}},ye={style:{display:"flex","align-items":"center",gap:"8px"}},he={style:{display:"flex","align-items":"center",gap:"8px"}},be={style:{display:"flex","align-items":"center",gap:"8px"}},xe={class:"cleanup-group"},we={class:"cleanup-group"},Ve={class:"cleanup-actions"},Ce={class:"cleanup-actions-buttons"},Se={key:0,class:"cleanup-info"},ke={key:0,style:{"margin-left":"12px"}},ze=X({__name:"Cleanup",setup(Ne){const s=Z({}),h=y(!1),b=y(!1),z=y(!1),D=r(()=>String(s.cleanup_last_run||"")),T=r(()=>{const l=String(s.cleanup_last_stats||"");if(!l)return"";try{const e=JSON.parse(l),n=[];return e.filesTrashed>0&&n.push(`移入回收站 ${e.filesTrashed} 个文件夹`),e.logsDeleted>0&&n.push(`删除 ${e.logsDeleted} 条日志`),e.trashEmptied&&n.push("已清空回收站"),e.errors>0&&n.push(`⚠️ ${e.errors} 个错误`),n.join(" / ")||"无操作"}catch{return""}}),U=r({get:()=>String(s.cleanup_enabled)==="true",set:l=>{s.cleanup_enabled=l?"true":"false"}}),E=r({get:()=>String(s.cleanup_empty_trash)!=="false",set:l=>{s.cleanup_empty_trash=l?"true":"false"}}),R=r({get:()=>Number(s.cleanup_file_retention_days??7),set:l=>{s.cleanup_file_retention_days=l}}),B=r({get:()=>Number(s.cleanup_log_retention_days??30),set:l=>{s.cleanup_log_retention_days=l}}),x=r({get:()=>String(s.cleanup_space_threshold_enabled)==="true",set:l=>{s.cleanup_space_threshold_enabled=l?"true":"false"}}),M=r({get:()=>Number(s.cleanup_space_threshold_percent??90),set:l=>{s.cleanup_space_threshold_percent=l}}),W=r({get:()=>Number(s.cleanup_space_threshold_delete_percent??10),set:l=>{s.cleanup_space_threshold_delete_percent=l}}),$=r({get:()=>String(s.save_reuse_enabled)!=="false",set:l=>{s.save_reuse_enabled=l?"true":"false"}}),c=y([]),w=y("");function L(){try{const l=String(s.cleanup_whitelist_dirs||"[]");c.value=JSON.parse(l)}catch{c.value=[]}}function F(){const l=w.value.trim();if(l){if(c.value.includes(l)){d.warning("该目录已在白名单中");return}c.value.push(l),w.value=""}}function P(l){c.value.splice(l,1)}const I=r({get:()=>Number(s.cleanup_verify_interval??30),set:l=>{s.cleanup_verify_interval=l}}),J=r({get:()=>Number(s.storage_refresh_interval??180),set:l=>{s.storage_refresh_interval=l}});async function O(){try{const l=await te();for(const e of l)s[e.key]=e.value;L()}catch(l){console.error("加载清理配置失败",l)}}async function A(){var l,e;z.value=!0;try{const i=["cleanup_enabled","cleanup_file_retention_days","cleanup_log_retention_days","cleanup_empty_trash","cleanup_space_threshold_enabled","cleanup_space_threshold_percent","cleanup_space_threshold_delete_percent","save_reuse_enabled","cleanup_verify_interval","storage_refresh_interval"].map(V=>({key:V,value:String(s[V]??"")}));i.push({key:"cleanup_whitelist_dirs",value:JSON.stringify(c.value)}),await se(i),d.success("清理配置已保存")}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"保存失败")}finally{z.value=!1}}async function q(){var l,e;h.value=!0;try{const n=await ne();n.success?d.success(n.message):d.warning(n.message),await O()}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"清理失败")}finally{h.value=!1}}async function G(){var l,e;b.value=!0;try{const n=await oe();n.success?d.success(n.message):d.warning(n.message)}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"清空回收站失败")}finally{b.value=!1}}return Y(()=>{O()}),(l,e)=>{const n=p("el-switch"),i=p("el-form-item"),V=p("el-tag"),H=p("el-input"),C=p("el-button"),S=p("el-form"),k=p("el-input-number"),j=p("el-slider"),Q=p("el-card");return _(),f("div",ie,[a(Q,{class:"config-card"},{header:u(()=>[...e[11]||(e[11]=[t("span",null,"🧹 存储清理",-1)])]),default:u(()=>[t("div",re,[t("div",pe,[e[15]||(e[15]=t("div",{class:"cleanup-group-label"},"⏱ 基础清理策略",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"自动清理"},{default:u(()=>[t("div",de,[a(n,{modelValue:U.value,"onUpdate:modelValue":e[0]||(e[0]=o=>U.value=o),size:"small"},null,8,["modelValue"]),e[12]||(e[12]=t("span",{class:"cleanup-hint"},"每天自动检查一次,删除过期日志、移入回收站文件",-1))])]),_:1}),a(i,{label:"清空回收站"},{default:u(()=>[t("div",ce,[a(n,{modelValue:E.value,"onUpdate:modelValue":e[1]||(e[1]=o=>E.value=o),size:"small"},null,8,["modelValue"]),e[13]||(e[13]=t("span",{class:"cleanup-hint"},"清理时一并清空各网盘回收站",-1))])]),_:1}),a(i,{label:"白名单目录"},{default:u(()=>[t("div",_e,[c.value.length?(_(),f("div",me,[(_(!0),f(ee,null,le(c.value,(o,K)=>(_(),N(V,{key:K,closable:"",size:"small",onClose:De=>P(K)},{default:u(()=>[m(v(o),1)]),_:2},1032,["onClose"]))),128))])):g("",!0),t("div",fe,[a(H,{modelValue:w.value,"onUpdate:modelValue":e[2]||(e[2]=o=>w.value=o),placeholder:"输入目录名",size:"small",style:{width:"160px"},onKeyup:ae(F,["enter"])},null,8,["modelValue"]),a(C,{type:"primary",size:"small",onClick:F},{default:u(()=>[...e[14]||(e[14]=[m("添加",-1)])]),_:1})])])]),_:1})]),_:1})]),t("div",ve,[e[20]||(e[20]=t("div",{class:"cleanup-group-label"},"📦 保留设置",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"文件保留"},{default:u(()=>[t("div",ge,[a(k,{modelValue:R.value,"onUpdate:modelValue":e[3]||(e[3]=o=>R.value=o),min:1,max:365,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[16]||(e[16]=t("span",null,"天",-1))])]),_:1}),a(i,{label:"日志保留"},{default:u(()=>[t("div",ye,[a(k,{modelValue:B.value,"onUpdate:modelValue":e[4]||(e[4]=o=>B.value=o),min:1,max:365,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[17]||(e[17]=t("span",null,"天",-1))])]),_:1}),a(i,{label:"Cookie检测"},{default:u(()=>[t("div",he,[a(k,{modelValue:I.value,"onUpdate:modelValue":e[5]||(e[5]=o=>I.value=o),min:5,max:1440,step:5,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[18]||(e[18]=t("span",null,"分钟",-1))])]),_:1}),a(i,{label:"空间校准"},{default:u(()=>[t("div",be,[a(k,{modelValue:J.value,"onUpdate:modelValue":e[6]||(e[6]=o=>J.value=o),min:5,max:1440,step:5,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[19]||(e[19]=t("span",null,"分钟",-1))])]),_:1})]),_:1})]),t("div",xe,[e[22]||(e[22]=t("div",{class:"cleanup-group-label"},"📊 空间阈值自动清理",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"启用"},{default:u(()=>[a(n,{modelValue:x.value,"onUpdate:modelValue":e[7]||(e[7]=o=>x.value=o),size:"small"},null,8,["modelValue"]),e[21]||(e[21]=t("span",{class:"cleanup-hint",style:{"margin-left":"8px"}},"已用空间超过阈值时,按比例删除最旧的转存文件",-1))]),_:1}),x.value?(_(),N(i,{key:0,label:"使用阈值"},{default:u(()=>[a(j,{modelValue:M.value,"onUpdate:modelValue":e[8]||(e[8]=o=>M.value=o),min:50,max:99,style:{width:"140px"},"show-input":"",size:"small"},null,8,["modelValue"])]),_:1})):g("",!0),x.value?(_(),N(i,{key:1,label:"删除比例"},{default:u(()=>[a(j,{modelValue:W.value,"onUpdate:modelValue":e[9]||(e[9]=o=>W.value=o),min:5,max:50,step:5,style:{width:"140px"},"show-input":"",size:"small"},null,8,["modelValue"])]),_:1})):g("",!0)]),_:1})]),t("div",we,[e[24]||(e[24]=t("div",{class:"cleanup-group-label"},"🔗 分享链接复用",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"复用"},{default:u(()=>[a(n,{modelValue:$.value,"onUpdate:modelValue":e[10]||(e[10]=o=>$.value=o),size:"small"},null,8,["modelValue"]),e[23]||(e[23]=t("span",{class:"cleanup-hint",style:{"margin-left":"8px"}},"相同原始链接不再重复转存,复用已有分享链接(会自动验证原链接有效性;60秒内重复请求直接返回已有链接)",-1))]),_:1})]),_:1})])]),t("div",Ve,[t("div",Ce,[a(C,{type:"primary",loading:z.value,onClick:A},{default:u(()=>[...e[25]||(e[25]=[m("💾 保存清理配置",-1)])]),_:1},8,["loading"]),a(C,{type:"danger",loading:h.value,onClick:q},{default:u(()=>[m(v(h.value?"清理中...":"🗑️ 立即清理"),1)]),_:1},8,["loading"]),a(C,{type:"warning",loading:b.value,onClick:G},{default:u(()=>[m(v(b.value?"清空中...":"🧹 清空回收站"),1)]),_:1},8,["loading"])]),D.value?(_(),f("div",Se,[m(" ⏰ 上次清理:"+v(D.value)+" ",1),T.value?(_(),f("span",ke,"📊 "+v(T.value),1)):g("",!0)])):g("",!0)])]),_:1})])}}}),Ee=ue(ze,[["__scopeId","data-v-dfd5abc7"]]);export{Ee as default}; +import{d as X,o as Y,a as _,c as f,f as a,w as u,j as p,i as Z,b as t,F as ee,r as le,y as N,l as m,t as v,e as g,g as ae,h as y,v as r,E as d}from"./index-D_srC3bj.js";import{k as te,p as se,r as ne,v as oe,_ as ue}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const ie={class:"cleanup-section"},re={class:"cleanup-grid"},pe={class:"cleanup-group"},de={style:{display:"flex","align-items":"center",gap:"10px","flex-wrap":"wrap"}},ce={style:{display:"flex","align-items":"center",gap:"10px"}},_e={style:{width:"100%"}},me={key:0,style:{display:"flex",gap:"6px","flex-wrap":"wrap","margin-bottom":"6px"}},fe={style:{display:"flex",gap:"6px"}},ve={class:"cleanup-group"},ge={style:{display:"flex","align-items":"center",gap:"8px"}},ye={style:{display:"flex","align-items":"center",gap:"8px"}},he={style:{display:"flex","align-items":"center",gap:"8px"}},be={style:{display:"flex","align-items":"center",gap:"8px"}},xe={class:"cleanup-group"},we={class:"cleanup-group"},Ve={class:"cleanup-actions"},Ce={class:"cleanup-actions-buttons"},Se={key:0,class:"cleanup-info"},ke={key:0,style:{"margin-left":"12px"}},ze=X({__name:"Cleanup",setup(Ne){const s=Z({}),h=y(!1),b=y(!1),z=y(!1),D=r(()=>String(s.cleanup_last_run||"")),T=r(()=>{const l=String(s.cleanup_last_stats||"");if(!l)return"";try{const e=JSON.parse(l),n=[];return e.filesTrashed>0&&n.push(`移入回收站 ${e.filesTrashed} 个文件夹`),e.logsDeleted>0&&n.push(`删除 ${e.logsDeleted} 条日志`),e.trashEmptied&&n.push("已清空回收站"),e.errors>0&&n.push(`⚠️ ${e.errors} 个错误`),n.join(" / ")||"无操作"}catch{return""}}),U=r({get:()=>String(s.cleanup_enabled)==="true",set:l=>{s.cleanup_enabled=l?"true":"false"}}),E=r({get:()=>String(s.cleanup_empty_trash)!=="false",set:l=>{s.cleanup_empty_trash=l?"true":"false"}}),R=r({get:()=>Number(s.cleanup_file_retention_days??7),set:l=>{s.cleanup_file_retention_days=l}}),B=r({get:()=>Number(s.cleanup_log_retention_days??30),set:l=>{s.cleanup_log_retention_days=l}}),x=r({get:()=>String(s.cleanup_space_threshold_enabled)==="true",set:l=>{s.cleanup_space_threshold_enabled=l?"true":"false"}}),M=r({get:()=>Number(s.cleanup_space_threshold_percent??90),set:l=>{s.cleanup_space_threshold_percent=l}}),W=r({get:()=>Number(s.cleanup_space_threshold_delete_percent??10),set:l=>{s.cleanup_space_threshold_delete_percent=l}}),$=r({get:()=>String(s.save_reuse_enabled)!=="false",set:l=>{s.save_reuse_enabled=l?"true":"false"}}),c=y([]),w=y("");function L(){try{const l=String(s.cleanup_whitelist_dirs||"[]");c.value=JSON.parse(l)}catch{c.value=[]}}function F(){const l=w.value.trim();if(l){if(c.value.includes(l)){d.warning("该目录已在白名单中");return}c.value.push(l),w.value=""}}function P(l){c.value.splice(l,1)}const I=r({get:()=>Number(s.cleanup_verify_interval??30),set:l=>{s.cleanup_verify_interval=l}}),J=r({get:()=>Number(s.storage_refresh_interval??180),set:l=>{s.storage_refresh_interval=l}});async function O(){try{const l=await te();for(const e of l)s[e.key]=e.value;L()}catch(l){console.error("加载清理配置失败",l)}}async function A(){var l,e;z.value=!0;try{const i=["cleanup_enabled","cleanup_file_retention_days","cleanup_log_retention_days","cleanup_empty_trash","cleanup_space_threshold_enabled","cleanup_space_threshold_percent","cleanup_space_threshold_delete_percent","save_reuse_enabled","cleanup_verify_interval","storage_refresh_interval"].map(V=>({key:V,value:String(s[V]??"")}));i.push({key:"cleanup_whitelist_dirs",value:JSON.stringify(c.value)}),await se(i),d.success("清理配置已保存")}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"保存失败")}finally{z.value=!1}}async function q(){var l,e;h.value=!0;try{const n=await ne();n.success?d.success(n.message):d.warning(n.message),await O()}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"清理失败")}finally{h.value=!1}}async function G(){var l,e;b.value=!0;try{const n=await oe();n.success?d.success(n.message):d.warning(n.message)}catch(n){d.error(((e=(l=n.response)==null?void 0:l.data)==null?void 0:e.error)||"清空回收站失败")}finally{b.value=!1}}return Y(()=>{O()}),(l,e)=>{const n=p("el-switch"),i=p("el-form-item"),V=p("el-tag"),H=p("el-input"),C=p("el-button"),S=p("el-form"),k=p("el-input-number"),j=p("el-slider"),Q=p("el-card");return _(),f("div",ie,[a(Q,{class:"config-card"},{header:u(()=>[...e[11]||(e[11]=[t("span",null,"🧹 存储清理",-1)])]),default:u(()=>[t("div",re,[t("div",pe,[e[15]||(e[15]=t("div",{class:"cleanup-group-label"},"⏱ 基础清理策略",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"自动清理"},{default:u(()=>[t("div",de,[a(n,{modelValue:U.value,"onUpdate:modelValue":e[0]||(e[0]=o=>U.value=o),size:"small"},null,8,["modelValue"]),e[12]||(e[12]=t("span",{class:"cleanup-hint"},"每天自动检查一次,删除过期日志、移入回收站文件",-1))])]),_:1}),a(i,{label:"清空回收站"},{default:u(()=>[t("div",ce,[a(n,{modelValue:E.value,"onUpdate:modelValue":e[1]||(e[1]=o=>E.value=o),size:"small"},null,8,["modelValue"]),e[13]||(e[13]=t("span",{class:"cleanup-hint"},"清理时一并清空各网盘回收站",-1))])]),_:1}),a(i,{label:"白名单目录"},{default:u(()=>[t("div",_e,[c.value.length?(_(),f("div",me,[(_(!0),f(ee,null,le(c.value,(o,K)=>(_(),N(V,{key:K,closable:"",size:"small",onClose:De=>P(K)},{default:u(()=>[m(v(o),1)]),_:2},1032,["onClose"]))),128))])):g("",!0),t("div",fe,[a(H,{modelValue:w.value,"onUpdate:modelValue":e[2]||(e[2]=o=>w.value=o),placeholder:"输入目录名",size:"small",style:{width:"160px"},onKeyup:ae(F,["enter"])},null,8,["modelValue"]),a(C,{type:"primary",size:"small",onClick:F},{default:u(()=>[...e[14]||(e[14]=[m("添加",-1)])]),_:1})])])]),_:1})]),_:1})]),t("div",ve,[e[20]||(e[20]=t("div",{class:"cleanup-group-label"},"📦 保留设置",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"文件保留"},{default:u(()=>[t("div",ge,[a(k,{modelValue:R.value,"onUpdate:modelValue":e[3]||(e[3]=o=>R.value=o),min:1,max:365,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[16]||(e[16]=t("span",null,"天",-1))])]),_:1}),a(i,{label:"日志保留"},{default:u(()=>[t("div",ye,[a(k,{modelValue:B.value,"onUpdate:modelValue":e[4]||(e[4]=o=>B.value=o),min:1,max:365,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[17]||(e[17]=t("span",null,"天",-1))])]),_:1}),a(i,{label:"Cookie检测"},{default:u(()=>[t("div",he,[a(k,{modelValue:I.value,"onUpdate:modelValue":e[5]||(e[5]=o=>I.value=o),min:5,max:1440,step:5,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[18]||(e[18]=t("span",null,"分钟",-1))])]),_:1}),a(i,{label:"空间校准"},{default:u(()=>[t("div",be,[a(k,{modelValue:J.value,"onUpdate:modelValue":e[6]||(e[6]=o=>J.value=o),min:5,max:1440,step:5,style:{width:"100px"},size:"small"},null,8,["modelValue"]),e[19]||(e[19]=t("span",null,"分钟",-1))])]),_:1})]),_:1})]),t("div",xe,[e[22]||(e[22]=t("div",{class:"cleanup-group-label"},"📊 空间阈值自动清理",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"启用"},{default:u(()=>[a(n,{modelValue:x.value,"onUpdate:modelValue":e[7]||(e[7]=o=>x.value=o),size:"small"},null,8,["modelValue"]),e[21]||(e[21]=t("span",{class:"cleanup-hint",style:{"margin-left":"8px"}},"已用空间超过阈值时,按比例删除最旧的转存文件",-1))]),_:1}),x.value?(_(),N(i,{key:0,label:"使用阈值"},{default:u(()=>[a(j,{modelValue:M.value,"onUpdate:modelValue":e[8]||(e[8]=o=>M.value=o),min:50,max:99,style:{width:"140px"},"show-input":"",size:"small"},null,8,["modelValue"])]),_:1})):g("",!0),x.value?(_(),N(i,{key:1,label:"删除比例"},{default:u(()=>[a(j,{modelValue:W.value,"onUpdate:modelValue":e[9]||(e[9]=o=>W.value=o),min:5,max:50,step:5,style:{width:"140px"},"show-input":"",size:"small"},null,8,["modelValue"])]),_:1})):g("",!0)]),_:1})]),t("div",we,[e[24]||(e[24]=t("div",{class:"cleanup-group-label"},"🔗 分享链接复用",-1)),a(S,{"label-width":"120px","label-position":"left",size:"small"},{default:u(()=>[a(i,{label:"复用"},{default:u(()=>[a(n,{modelValue:$.value,"onUpdate:modelValue":e[10]||(e[10]=o=>$.value=o),size:"small"},null,8,["modelValue"]),e[23]||(e[23]=t("span",{class:"cleanup-hint",style:{"margin-left":"8px"}},"相同原始链接不再重复转存,复用已有分享链接(会自动验证原链接有效性;60秒内重复请求直接返回已有链接)",-1))]),_:1})]),_:1})])]),t("div",Ve,[t("div",Ce,[a(C,{type:"primary",loading:z.value,onClick:A},{default:u(()=>[...e[25]||(e[25]=[m("💾 保存清理配置",-1)])]),_:1},8,["loading"]),a(C,{type:"danger",loading:h.value,onClick:q},{default:u(()=>[m(v(h.value?"清理中...":"🗑️ 立即清理"),1)]),_:1},8,["loading"]),a(C,{type:"warning",loading:b.value,onClick:G},{default:u(()=>[m(v(b.value?"清空中...":"🧹 清空回收站"),1)]),_:1},8,["loading"])]),D.value?(_(),f("div",Se,[m(" ⏰ 上次清理:"+v(D.value)+" ",1),T.value?(_(),f("span",ke,"📊 "+v(T.value),1)):g("",!0)])):g("",!0)])]),_:1})])}}}),Ee=ue(ze,[["__scopeId","data-v-dfd5abc7"]]);export{Ee as default}; diff --git a/source_clean/frontend/assets/CloudBadge-OZZzB6Zg.js b/source_clean/frontend/assets/CloudBadge-CbpZHKLy.js similarity index 78% rename from source_clean/frontend/assets/CloudBadge-OZZzB6Zg.js rename to source_clean/frontend/assets/CloudBadge-CbpZHKLy.js index 165c35f..556a21a 100644 --- a/source_clean/frontend/assets/CloudBadge-OZZzB6Zg.js +++ b/source_clean/frontend/assets/CloudBadge-CbpZHKLy.js @@ -1 +1 @@ -import{C as s,b as a,a as n}from"./index-Bn7NwETH.js";import{d as l,a as t,c,p as d,k as o,e as r,l as u,t as m}from"./index-D279dJND.js";import{_}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const p=["src"],i=l({__name:"CloudBadge",props:{cloud_type:{},showIcon:{type:Boolean}},setup(e){return(C,y)=>(t(),c("span",{class:"cloud-badge",style:d({background:o(s)[e.cloud_type]})},[e.showIcon&&o(a)[e.cloud_type]?(t(),c("img",{key:0,src:o(a)[e.cloud_type],class:"badge-icon"},null,8,p)):r("",!0),u(" "+m(o(n)[e.cloud_type]),1)],4))}}),L=_(i,[["__scopeId","data-v-9106805f"]]);export{L as C}; +import{C as s,b as a,a as n}from"./index-Bn7NwETH.js";import{d as l,a as t,c,p as d,k as o,e as r,l as u,t as m}from"./index-D_srC3bj.js";import{_}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const p=["src"],i=l({__name:"CloudBadge",props:{cloud_type:{},showIcon:{type:Boolean}},setup(e){return(C,y)=>(t(),c("span",{class:"cloud-badge",style:d({background:o(s)[e.cloud_type]})},[e.showIcon&&o(a)[e.cloud_type]?(t(),c("img",{key:0,src:o(a)[e.cloud_type],class:"badge-icon"},null,8,p)):r("",!0),u(" "+m(o(n)[e.cloud_type]),1)],4))}}),L=_(i,[["__scopeId","data-v-9106805f"]]);export{L as C}; diff --git a/source_clean/frontend/assets/CloudConfig-BADbnuPV.js b/source_clean/frontend/assets/CloudConfig-3znuBWUR.js similarity index 99% rename from source_clean/frontend/assets/CloudConfig-BADbnuPV.js rename to source_clean/frontend/assets/CloudConfig-3znuBWUR.js index e3eeb94..d85e47e 100644 --- a/source_clean/frontend/assets/CloudConfig-BADbnuPV.js +++ b/source_clean/frontend/assets/CloudConfig-3znuBWUR.js @@ -1,4 +1,4 @@ -import{d as ke,o as L,m as ve,E as _,a as c,c as k,f as n,w as a,b as r,h as C,j as p,i as be,F as R,r as K,t as v,y as g,l as d,e as A,k as Ce,M as he,p as xe,n as H,K as Be,L as Te,v as h}from"./index-D279dJND.js";import{a as x}from"./index-Bn7NwETH.js";import{c as we,k as Fe,h as Ne,l as G,t as Ve,u as P,m as ze,n as Se,o as $e,_ as Ue}from"./_plugin-vue_export-helper-1Z-znrfZ.js";import{C as De}from"./CloudBadge-OZZzB6Zg.js";const Ie={class:"cloud-config"},Me={class:"cloud-toggle-grid"},Oe=["src"],qe={class:"cloud-label"},Ee={class:"toolbar"},Le={key:0,class:"nickname-text"},Re={key:0,class:"promotion-text"},Ke={key:0,class:"uid-cell"},Ae={key:0,class:"verifying"},He={key:0,class:"storage-cell"},Ge={class:"storage-bar-wrap"},Pe={class:"storage-text"},je={class:"storage-used"},Je={class:"storage-total"},Qe={class:"storage-free"},We={key:0,class:"save-count"},Xe={style:{"line-height":"1.6"}},Ye={class:"cookie-tips-header"},Ze={class:"cookie-tips-title"},et=["innerHTML"],tt=ke({__name:"CloudConfig",setup(ot){const z=C([]),D=C(),F=C([]),B=C(!1),T=C(!1),b=C(null),l=be({cloud_type:"",nickname:"",promotion_account:"",is_transfer_enabled:!1,cookie:"",_verifying:!1,_storageUsed:"",_storageTotal:""}),j=h(()=>({cloud_type:[{required:!0,message:"请选择网盘类型",trigger:"change"}],nickname:[{required:!1,message:"请填写昵称(区分多个同类型网盘)",trigger:"blur"}],promotion_account:[{required:!0,message:"请填写推广平台及账号",trigger:"blur"}]})),J=h(()=>Object.entries(x)),Q=h(()=>{if(!l.cloud_type)return"请先选择网盘类型";const t=l.cloud_type;return t==="quark"||t==="baidu"?`请输入 ${x[t]||t} 的完整 Cookie`:b.value?"留空则保持原有":"输入完整 Cookie"}),W=h(()=>x[l.cloud_type]||l.cloud_type||""),X=h(()=>{const t=l.cloud_type;return t?{quark:`
  • 在电脑上打开 pan.quark.cn 并登录你的夸克账号
  • +import{d as ke,o as L,m as ve,E as _,a as c,c as k,f as n,w as a,b as r,h as C,j as p,i as be,F as R,r as K,t as v,y as g,l as d,e as A,k as Ce,M as he,p as xe,n as H,K as Be,L as Te,v as h}from"./index-D_srC3bj.js";import{a as x}from"./index-Bn7NwETH.js";import{c as we,k as Fe,h as Ne,l as G,t as Ve,u as P,m as ze,n as Se,o as $e,_ as Ue}from"./_plugin-vue_export-helper-1Z-znrfZ.js";import{C as De}from"./CloudBadge-CbpZHKLy.js";const Ie={class:"cloud-config"},Me={class:"cloud-toggle-grid"},Oe=["src"],qe={class:"cloud-label"},Ee={class:"toolbar"},Le={key:0,class:"nickname-text"},Re={key:0,class:"promotion-text"},Ke={key:0,class:"uid-cell"},Ae={key:0,class:"verifying"},He={key:0,class:"storage-cell"},Ge={class:"storage-bar-wrap"},Pe={class:"storage-text"},je={class:"storage-used"},Je={class:"storage-total"},Qe={class:"storage-free"},We={key:0,class:"save-count"},Xe={style:{"line-height":"1.6"}},Ye={class:"cookie-tips-header"},Ze={class:"cookie-tips-title"},et=["innerHTML"],tt=ke({__name:"CloudConfig",setup(ot){const z=C([]),D=C(),F=C([]),B=C(!1),T=C(!1),b=C(null),l=be({cloud_type:"",nickname:"",promotion_account:"",is_transfer_enabled:!1,cookie:"",_verifying:!1,_storageUsed:"",_storageTotal:""}),j=h(()=>({cloud_type:[{required:!0,message:"请选择网盘类型",trigger:"change"}],nickname:[{required:!1,message:"请填写昵称(区分多个同类型网盘)",trigger:"blur"}],promotion_account:[{required:!0,message:"请填写推广平台及账号",trigger:"blur"}]})),J=h(()=>Object.entries(x)),Q=h(()=>{if(!l.cloud_type)return"请先选择网盘类型";const t=l.cloud_type;return t==="quark"||t==="baidu"?`请输入 ${x[t]||t} 的完整 Cookie`:b.value?"留空则保持原有":"输入完整 Cookie"}),W=h(()=>x[l.cloud_type]||l.cloud_type||""),X=h(()=>{const t=l.cloud_type;return t?{quark:`
  • 在电脑上打开 pan.quark.cn 并登录你的夸克账号
  • F12 打开开发者工具 → 切换到 网络 (Network) 选项卡
  • 刷新页面,在请求列表中点击任意一个请求(如 account/info
  • 在右侧 请求头 (Request Headers) 中找到 Cookie 字段
  • diff --git a/source_clean/frontend/assets/HomePage--KOSYv1j.js b/source_clean/frontend/assets/HomePage-CdqgUFQt.js similarity index 98% rename from source_clean/frontend/assets/HomePage--KOSYv1j.js rename to source_clean/frontend/assets/HomePage-CdqgUFQt.js index c672733..54bd7fc 100644 --- a/source_clean/frontend/assets/HomePage--KOSYv1j.js +++ b/source_clean/frontend/assets/HomePage-CdqgUFQt.js @@ -1 +1 @@ -import{d as K,o as G,a as n,c as a,b as o,F as w,t as c,e as h,f as v,w as f,g as Q,r as z,h as l,i as B,j as x,u as W,k as Y,s as J,l as D,n as I}from"./index-D279dJND.js";import{g as X,a as Z,_ as ee}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const te={class:"home-page"},se={class:"hero-section"},oe=["src","alt"],ne={key:1,class:"logo-text"},ae={class:"search-box"},ie={key:1,class:"quote-section"},ce={class:"quote-text"},le={class:"quote-author"},re={class:"content-section"},ue={key:0,class:"rankings-grid"},de={class:"panel-header"},_e={class:"panel-title"},he={class:"panel-tabs"},ve=["onClick"],pe=["onClick"],ge={class:"panel-body"},fe=["onClick"],me={class:"rank-name"},ye={class:"rank-cnt"},ke=["onClick"],Ce={class:"panel-footer"},be={key:0},we={key:1},xe={key:2},Ie={key:3},qe={class:"footer-time"},Ae={key:0,class:"site-footer"},Se={class:"footer-inner"},Ne={class:"footer-actions"},R=8,Te=K({__name:"HomePage",setup(Ve){const q=W(),m=l(""),u=l([]),d=B({}),_=B({}),p=l(""),y=l(""),k=l(""),A=l(!1),g=l(""),C=l(""),S=l(""),F={movie:"🎬",western_movie:"🎥",western_tv:"🌍",donghua:"🐉",global_anime:"🌐",tv:"📺",niche:"💎",hotsite:"🏆"};function L(e){return F[e]||"📋"}function j(e){const t=[];if(e.rating&&t.push(`⭐${e.rating}`),e.searchCount>0){const i=e.searchCount;i>=1e8?t.push(`${(i/1e8).toFixed(1)}亿`):i>=1e4?t.push(`${(i/1e4).toFixed(0)}万`):t.push(String(i))}return t.join(" ")||""}function N(e){return(_[e.category]||"hot")==="hot"?e.hot||[]:e.newest||[]}function E(e){const t=N(e);return d[e.category]?t:t.slice(0,R)}function H(e){return N(e).length>R&&!d[e.category]}function M(e){d[e]=!0}function T(e,t){_[e]=t,d[e]=!1}function O(){window.open("/disclaimer/","_blank")}G(async()=>{try{const t=await(await fetch("https://v1.hitokoto.cn/")).json();g.value=t.hitokoto||"",C.value=t.from_who||t.from||""}catch{g.value="学而时习之,不亦说乎。",C.value="孔子"}try{const[e,t]=await Promise.all([X(),Z()]);e.fetchedAt?(S.value=e.fetchedAt,u.value=e.categories||[]):u.value=Array.isArray(e)?e:[];for(const i of u.value)_[i.category]="hot",d[i.category]=!1;t.site_logo&&(p.value=t.site_logo),t.site_name&&(y.value=t.site_name),t.site_disclaimer&&(k.value=t.site_disclaimer),A.value=!0}catch(e){console.error("加载首页数据失败",e)}});function V(){const e=m.value.trim();e&&q.push("/search?q="+encodeURIComponent(e))}function P(e){q.push("/search?q="+encodeURIComponent(e))}return(e,t)=>{const i=x("el-icon"),U=x("el-input"),$=x("el-button");return n(),a("div",te,[o("div",se,[A.value?(n(),a(w,{key:0},[p.value?(n(),a("img",{key:0,src:p.value,alt:y.value||"CloudSearch",class:"logo-img",onError:t[0]||(t[0]=s=>{s.target.style.display="none",p.value=""})},null,40,oe)):(n(),a("div",ne,c(y.value||"CloudSearch"),1))],64)):h("",!0),o("div",ae,[v(U,{modelValue:m.value,"onUpdate:modelValue":t[1]||(t[1]=s=>m.value=s),placeholder:"搜索网盘资源,或粘贴视频/网盘链接...",size:"large",clearable:"",onKeyup:Q(V,["enter"])},{prefix:f(()=>[v(i,null,{default:f(()=>[v(Y(J))]),_:1})]),_:1},8,["modelValue"]),v($,{type:"primary",size:"large",onClick:V,class:"search-btn"},{default:f(()=>[...t[2]||(t[2]=[D(" 搜 索 ",-1)])]),_:1})]),g.value?(n(),a("div",ie,[o("span",ce,"「 "+c(g.value)+" 」",1),o("span",le,"---"+c(C.value),1)])):h("",!0)]),o("div",re,[u.value.length>0?(n(),a("div",ue,[(n(!0),a(w,null,z(u.value,s=>(n(),a("div",{key:s.category,class:"rank-panel"},[o("div",de,[o("span",_e,c(L(s.category))+" "+c(s.label),1),o("div",he,[o("span",{class:I(["panel-tab",{active:_[s.category]==="hot"}]),onClick:r=>T(s.category,"hot")},"热榜",10,ve),o("span",{class:I(["panel-tab",{active:_[s.category]==="newest"}]),onClick:r=>T(s.category,"newest")},"最新",10,pe)])]),o("div",ge,[(n(!0),a(w,null,z(E(s),(r,b)=>(n(),a("div",{key:s.category+"-"+b,class:"rank-item",onClick:$e=>P(r.keyword)},[o("span",{class:I(["rank-idx",{"top-three":b<3}])},c(b+1),3),o("span",me,c(r.keyword),1),o("span",ye,c(j(r)),1)],8,fe))),128)),H(s)?(n(),a("div",{key:0,class:"rank-expand",onClick:r=>M(s.category)}," 展开全部 ▼ ",8,ke)):h("",!0)]),o("div",Ce,[s.category==="hotsite"?(n(),a("span",be,"基于本站搜索数据")):s.category==="donghua"||s.category==="global_anime"?(n(),a("span",we,"数据来源:Bilibili")):s.category==="movie"||s.category==="tv"?(n(),a("span",xe,"数据来源:百度")):(n(),a("span",Ie,"数据来源:TMDB")),o("span",qe,c(S.value),1)])]))),128))])):h("",!0)]),k.value?(n(),a("div",Ae,[o("div",Se,c(k.value),1),o("div",Ne,[v($,{class:"footer-disclaimer-btn",size:"small",onClick:O},{default:f(()=>[...t[3]||(t[3]=[D("📜 免责声明",-1)])]),_:1})])])):h("",!0)])}}}),De=ee(Te,[["__scopeId","data-v-1f536d99"]]);export{De as default}; +import{d as K,o as G,a as n,c as a,b as o,F as w,t as c,e as h,f as v,w as f,g as Q,r as z,h as l,i as B,j as x,u as W,k as Y,s as J,l as D,n as I}from"./index-D_srC3bj.js";import{g as X,a as Z,_ as ee}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const te={class:"home-page"},se={class:"hero-section"},oe=["src","alt"],ne={key:1,class:"logo-text"},ae={class:"search-box"},ie={key:1,class:"quote-section"},ce={class:"quote-text"},le={class:"quote-author"},re={class:"content-section"},ue={key:0,class:"rankings-grid"},de={class:"panel-header"},_e={class:"panel-title"},he={class:"panel-tabs"},ve=["onClick"],pe=["onClick"],ge={class:"panel-body"},fe=["onClick"],me={class:"rank-name"},ye={class:"rank-cnt"},ke=["onClick"],Ce={class:"panel-footer"},be={key:0},we={key:1},xe={key:2},Ie={key:3},qe={class:"footer-time"},Ae={key:0,class:"site-footer"},Se={class:"footer-inner"},Ne={class:"footer-actions"},R=8,Te=K({__name:"HomePage",setup(Ve){const q=W(),m=l(""),u=l([]),d=B({}),_=B({}),p=l(""),y=l(""),k=l(""),A=l(!1),g=l(""),C=l(""),S=l(""),F={movie:"🎬",western_movie:"🎥",western_tv:"🌍",donghua:"🐉",global_anime:"🌐",tv:"📺",niche:"💎",hotsite:"🏆"};function L(e){return F[e]||"📋"}function j(e){const t=[];if(e.rating&&t.push(`⭐${e.rating}`),e.searchCount>0){const i=e.searchCount;i>=1e8?t.push(`${(i/1e8).toFixed(1)}亿`):i>=1e4?t.push(`${(i/1e4).toFixed(0)}万`):t.push(String(i))}return t.join(" ")||""}function N(e){return(_[e.category]||"hot")==="hot"?e.hot||[]:e.newest||[]}function E(e){const t=N(e);return d[e.category]?t:t.slice(0,R)}function H(e){return N(e).length>R&&!d[e.category]}function M(e){d[e]=!0}function T(e,t){_[e]=t,d[e]=!1}function O(){window.open("/disclaimer/","_blank")}G(async()=>{try{const t=await(await fetch("https://v1.hitokoto.cn/")).json();g.value=t.hitokoto||"",C.value=t.from_who||t.from||""}catch{g.value="学而时习之,不亦说乎。",C.value="孔子"}try{const[e,t]=await Promise.all([X(),Z()]);e.fetchedAt?(S.value=e.fetchedAt,u.value=e.categories||[]):u.value=Array.isArray(e)?e:[];for(const i of u.value)_[i.category]="hot",d[i.category]=!1;t.site_logo&&(p.value=t.site_logo),t.site_name&&(y.value=t.site_name),t.site_disclaimer&&(k.value=t.site_disclaimer),A.value=!0}catch(e){console.error("加载首页数据失败",e)}});function V(){const e=m.value.trim();e&&q.push("/search?q="+encodeURIComponent(e))}function P(e){q.push("/search?q="+encodeURIComponent(e))}return(e,t)=>{const i=x("el-icon"),U=x("el-input"),$=x("el-button");return n(),a("div",te,[o("div",se,[A.value?(n(),a(w,{key:0},[p.value?(n(),a("img",{key:0,src:p.value,alt:y.value||"CloudSearch",class:"logo-img",onError:t[0]||(t[0]=s=>{s.target.style.display="none",p.value=""})},null,40,oe)):(n(),a("div",ne,c(y.value||"CloudSearch"),1))],64)):h("",!0),o("div",ae,[v(U,{modelValue:m.value,"onUpdate:modelValue":t[1]||(t[1]=s=>m.value=s),placeholder:"搜索网盘资源,或粘贴视频/网盘链接...",size:"large",clearable:"",onKeyup:Q(V,["enter"])},{prefix:f(()=>[v(i,null,{default:f(()=>[v(Y(J))]),_:1})]),_:1},8,["modelValue"]),v($,{type:"primary",size:"large",onClick:V,class:"search-btn"},{default:f(()=>[...t[2]||(t[2]=[D(" 搜 索 ",-1)])]),_:1})]),g.value?(n(),a("div",ie,[o("span",ce,"「 "+c(g.value)+" 」",1),o("span",le,"---"+c(C.value),1)])):h("",!0)]),o("div",re,[u.value.length>0?(n(),a("div",ue,[(n(!0),a(w,null,z(u.value,s=>(n(),a("div",{key:s.category,class:"rank-panel"},[o("div",de,[o("span",_e,c(L(s.category))+" "+c(s.label),1),o("div",he,[o("span",{class:I(["panel-tab",{active:_[s.category]==="hot"}]),onClick:r=>T(s.category,"hot")},"热榜",10,ve),o("span",{class:I(["panel-tab",{active:_[s.category]==="newest"}]),onClick:r=>T(s.category,"newest")},"最新",10,pe)])]),o("div",ge,[(n(!0),a(w,null,z(E(s),(r,b)=>(n(),a("div",{key:s.category+"-"+b,class:"rank-item",onClick:$e=>P(r.keyword)},[o("span",{class:I(["rank-idx",{"top-three":b<3}])},c(b+1),3),o("span",me,c(r.keyword),1),o("span",ye,c(j(r)),1)],8,fe))),128)),H(s)?(n(),a("div",{key:0,class:"rank-expand",onClick:r=>M(s.category)}," 展开全部 ▼ ",8,ke)):h("",!0)]),o("div",Ce,[s.category==="hotsite"?(n(),a("span",be,"基于本站搜索数据")):s.category==="donghua"||s.category==="global_anime"?(n(),a("span",we,"数据来源:Bilibili")):s.category==="movie"||s.category==="tv"?(n(),a("span",xe,"数据来源:百度")):(n(),a("span",Ie,"数据来源:TMDB")),o("span",qe,c(S.value),1)])]))),128))])):h("",!0)]),k.value?(n(),a("div",Ae,[o("div",Se,c(k.value),1),o("div",Ne,[v($,{class:"footer-disclaimer-btn",size:"small",onClick:O},{default:f(()=>[...t[3]||(t[3]=[D("📜 免责声明",-1)])]),_:1})])])):h("",!0)])}}}),De=ee(Te,[["__scopeId","data-v-1f536d99"]]);export{De as default}; diff --git a/source_clean/frontend/assets/ResultDetail-DdE8ZRMU.js b/source_clean/frontend/assets/ResultDetail-BLqifyVI.js similarity index 98% rename from source_clean/frontend/assets/ResultDetail-DdE8ZRMU.js rename to source_clean/frontend/assets/ResultDetail-BLqifyVI.js index 02b0772..93bd87e 100644 --- a/source_clean/frontend/assets/ResultDetail-DdE8ZRMU.js +++ b/source_clean/frontend/assets/ResultDetail-BLqifyVI.js @@ -1 +1 @@ -import{d as U,h as i,o as N,a,c,f as o,w as n,F as j,r as H,y as w,k as G,j as f,b as l,t as r,e as g,z as J,l as p,E as D}from"./index-D279dJND.js";import{C as K}from"./CloudBadge-OZZzB6Zg.js";import{a as Q}from"./index-Bn7NwETH.js";import{h as W,_ as T,q as X,f as Y,e as Z}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const ee={class:"cloud-select"},le=U({__name:"CloudSelect",props:{modelValue:{}},emits:["select","update:modelValue"],setup(R,{emit:E}){const V=R,t=E,s=i(V.modelValue),C=i([]);N(async()=>{try{C.value=await W()}catch(v){console.error("获取网盘配置失败",v)}});function m(v){t("select",v),t("update:modelValue",v)}return(v,y)=>{const b=f("el-option"),h=f("el-select");return a(),c("div",ee,[o(h,{modelValue:s.value,"onUpdate:modelValue":y[0]||(y[0]=_=>s.value=_),placeholder:"选择目标网盘",onChange:m},{default:n(()=>[(a(!0),c(j,null,H(C.value,_=>(a(),w(b,{key:_.cloud_type,label:_.nickname||G(Q)[_.cloud_type],value:_.cloud_type},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])}}}),te=T(le,[["__scopeId","data-v-098423df"]]),se={class:"result-detail-page"},ae={class:"detail-container"},oe={key:0,class:"loading-state"},ne={key:1,class:"detail-card"},ie={class:"detail-header"},ue={class:"detail-cover"},de=["src","alt"],re={class:"detail-info"},ce={class:"detail-meta"},ve={key:0,class:"detail-desc"},_e={class:"detail-actions"},pe={key:2,class:"detail-card"},fe={class:"detail-video"},me={class:"video-preview"},ye=["src","alt"],ge={class:"video-info"},he={key:0,class:"video-author"},ke={class:"video-platform"},Ve={key:1,class:"detail-desc"},Ce={class:"detail-actions"},we={key:0,class:"video-player-wrapper"},be=["src"],Se={class:"save-dialog-content"},xe={class:"save-file-name"},De={class:"result-dialog-content"},Ee={class:"share-link-box"},Le={class:"share-link-row"},Re=U({__name:"ResultDetail",setup(R){const E=J(),V=i(!1),t=i(null),s=i(null),C=i(!1),m=i(!1),v=i(!1),y=i(""),b=i(!1),h=i(!1),_=i(null),S=i("");N(async()=>{const u=E.params.id;if(u){V.value=!0;try{const e=await X(u);e.intent==="SEARCH"&&e.results.length>0?t.value=e.results[0]:e.intent==="VIDEO_PARSE"&&e.results.length>0&&(s.value=e.results[0])}catch(e){console.error("获取详情失败",e)}finally{V.value=!1}}});function B(){b.value=!!s.value,m.value=!0}function $(){C.value=!0}function A(u){y.value=u}async function I(){if(!y.value){D.warning("请选择目标网盘");return}v.value=!0;try{let u;if(b.value&&s.value)u=await Y({video_url:s.value.video_url,title:s.value.title,target_cloud:y.value});else if(t.value)u=await Z({type:"search",source:t.value,target_cloud:y.value});else return;_.value=u,S.value=u.share_url,m.value=!1,h.value=!0}catch(u){console.error("保存失败",u),D.error("保存失败")}finally{v.value=!1}}async function q(){try{await navigator.clipboard.writeText(S.value),D.success("链接已复制到剪贴板")}catch{D.warning("复制失败,请手动复制")}}return(u,e)=>{const F=f("el-skeleton"),L=f("el-tag"),k=f("el-button"),M=f("el-empty"),z=f("el-dialog"),O=f("el-alert"),P=f("el-input");return a(),c("div",se,[l("div",ae,[V.value?(a(),c("div",oe,[o(F,{rows:6,animated:""})])):t.value?(a(),c("div",ne,[l("div",ie,[l("div",ue,[l("img",{src:t.value.cover,alt:t.value.title},null,8,de),o(K,{cloud_type:t.value.cloud_type},null,8,["cloud_type"])]),l("div",re,[l("h1",null,r(t.value.title),1),l("div",ce,[t.value.file_size?(a(),w(L,{key:0},{default:n(()=>[p("📦 "+r(t.value.file_size),1)]),_:1})):g("",!0),t.value.update_time?(a(),w(L,{key:1},{default:n(()=>[p("🕐 "+r(t.value.update_time),1)]),_:1})):g("",!0),t.value.source?(a(),w(L,{key:2},{default:n(()=>[p("📂 "+r(t.value.source),1)]),_:1})):g("",!0)]),t.value.description?(a(),c("p",ve,r(t.value.description),1)):g("",!0)])]),l("div",_e,[o(k,{type:"primary",size:"large",onClick:B},{default:n(()=>[...e[5]||(e[5]=[p(" 📥 保存到网盘 ",-1)])]),_:1})])])):s.value?(a(),c("div",pe,[l("div",fe,[l("div",me,[l("img",{src:s.value.cover,alt:s.value.title},null,8,ye),l("div",{class:"play-overlay",onClick:$},[...e[6]||(e[6]=[l("div",{class:"play-btn"},"▶ 播放",-1)])])]),l("div",ge,[l("h1",null,r(s.value.title),1),s.value.author?(a(),c("p",he,"👤 "+r(s.value.author),1)):g("",!0),l("p",ke,"📺 "+r(s.value.platform),1),s.value.description?(a(),c("p",Ve,r(s.value.description),1)):g("",!0)])]),l("div",Ce,[o(k,{type:"primary",size:"large",onClick:B},{default:n(()=>[...e[7]||(e[7]=[p(" 📥 保存到云盘 ",-1)])]),_:1})]),C.value?(a(),c("div",we,[l("video",{src:s.value.video_url,controls:"",autoplay:"",class:"video-player"},null,8,be)])):g("",!0)])):(a(),w(M,{key:3,description:"未找到该资源"}))]),o(z,{modelValue:m.value,"onUpdate:modelValue":e[1]||(e[1]=d=>m.value=d),title:"保存到网盘",width:"420px"},{footer:n(()=>[o(k,{onClick:e[0]||(e[0]=d=>m.value=!1)},{default:n(()=>[...e[8]||(e[8]=[p("取消",-1)])]),_:1}),o(k,{type:"primary",loading:v.value,onClick:I},{default:n(()=>[...e[9]||(e[9]=[p("确认保存",-1)])]),_:1},8,["loading"])]),default:n(()=>{var d,x;return[l("div",Se,[l("p",xe,"📄 "+r(((d=t.value)==null?void 0:d.title)||((x=s.value)==null?void 0:x.title)),1),o(te,{onSelect:A})])]}),_:1},8,["modelValue"]),o(z,{modelValue:h.value,"onUpdate:modelValue":e[4]||(e[4]=d=>h.value=d),title:"保存成功",width:"420px"},{footer:n(()=>[o(k,{type:"primary",onClick:e[3]||(e[3]=d=>h.value=!1)},{default:n(()=>[...e[12]||(e[12]=[p("关闭",-1)])]),_:1})]),default:n(()=>{var d;return[l("div",De,[o(O,{type:"success",title:((d=_.value)==null?void 0:d.message)||"保存成功","show-icon":"",closable:!1},null,8,["title"]),l("div",Ee,[e[11]||(e[11]=l("p",{class:"share-label"},"分享链接:",-1)),l("div",Le,[o(P,{modelValue:S.value,"onUpdate:modelValue":e[2]||(e[2]=x=>S.value=x),readonly:""},null,8,["modelValue"]),o(k,{onClick:q},{default:n(()=>[...e[10]||(e[10]=[p("复制",-1)])]),_:1})])])])]}),_:1},8,["modelValue"])])}}}),Te=T(Re,[["__scopeId","data-v-755e2105"]]);export{Te as default}; +import{d as U,h as i,o as N,a,c,f as o,w as n,F as j,r as H,y as w,k as G,j as f,b as l,t as r,e as g,z as J,l as p,E as D}from"./index-D_srC3bj.js";import{C as K}from"./CloudBadge-CbpZHKLy.js";import{a as Q}from"./index-Bn7NwETH.js";import{h as W,_ as T,q as X,f as Y,e as Z}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const ee={class:"cloud-select"},le=U({__name:"CloudSelect",props:{modelValue:{}},emits:["select","update:modelValue"],setup(R,{emit:E}){const V=R,t=E,s=i(V.modelValue),C=i([]);N(async()=>{try{C.value=await W()}catch(v){console.error("获取网盘配置失败",v)}});function m(v){t("select",v),t("update:modelValue",v)}return(v,y)=>{const b=f("el-option"),h=f("el-select");return a(),c("div",ee,[o(h,{modelValue:s.value,"onUpdate:modelValue":y[0]||(y[0]=_=>s.value=_),placeholder:"选择目标网盘",onChange:m},{default:n(()=>[(a(!0),c(j,null,H(C.value,_=>(a(),w(b,{key:_.cloud_type,label:_.nickname||G(Q)[_.cloud_type],value:_.cloud_type},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])}}}),te=T(le,[["__scopeId","data-v-098423df"]]),se={class:"result-detail-page"},ae={class:"detail-container"},oe={key:0,class:"loading-state"},ne={key:1,class:"detail-card"},ie={class:"detail-header"},ue={class:"detail-cover"},de=["src","alt"],re={class:"detail-info"},ce={class:"detail-meta"},ve={key:0,class:"detail-desc"},_e={class:"detail-actions"},pe={key:2,class:"detail-card"},fe={class:"detail-video"},me={class:"video-preview"},ye=["src","alt"],ge={class:"video-info"},he={key:0,class:"video-author"},ke={class:"video-platform"},Ve={key:1,class:"detail-desc"},Ce={class:"detail-actions"},we={key:0,class:"video-player-wrapper"},be=["src"],Se={class:"save-dialog-content"},xe={class:"save-file-name"},De={class:"result-dialog-content"},Ee={class:"share-link-box"},Le={class:"share-link-row"},Re=U({__name:"ResultDetail",setup(R){const E=J(),V=i(!1),t=i(null),s=i(null),C=i(!1),m=i(!1),v=i(!1),y=i(""),b=i(!1),h=i(!1),_=i(null),S=i("");N(async()=>{const u=E.params.id;if(u){V.value=!0;try{const e=await X(u);e.intent==="SEARCH"&&e.results.length>0?t.value=e.results[0]:e.intent==="VIDEO_PARSE"&&e.results.length>0&&(s.value=e.results[0])}catch(e){console.error("获取详情失败",e)}finally{V.value=!1}}});function B(){b.value=!!s.value,m.value=!0}function $(){C.value=!0}function A(u){y.value=u}async function I(){if(!y.value){D.warning("请选择目标网盘");return}v.value=!0;try{let u;if(b.value&&s.value)u=await Y({video_url:s.value.video_url,title:s.value.title,target_cloud:y.value});else if(t.value)u=await Z({type:"search",source:t.value,target_cloud:y.value});else return;_.value=u,S.value=u.share_url,m.value=!1,h.value=!0}catch(u){console.error("保存失败",u),D.error("保存失败")}finally{v.value=!1}}async function q(){try{await navigator.clipboard.writeText(S.value),D.success("链接已复制到剪贴板")}catch{D.warning("复制失败,请手动复制")}}return(u,e)=>{const F=f("el-skeleton"),L=f("el-tag"),k=f("el-button"),M=f("el-empty"),z=f("el-dialog"),O=f("el-alert"),P=f("el-input");return a(),c("div",se,[l("div",ae,[V.value?(a(),c("div",oe,[o(F,{rows:6,animated:""})])):t.value?(a(),c("div",ne,[l("div",ie,[l("div",ue,[l("img",{src:t.value.cover,alt:t.value.title},null,8,de),o(K,{cloud_type:t.value.cloud_type},null,8,["cloud_type"])]),l("div",re,[l("h1",null,r(t.value.title),1),l("div",ce,[t.value.file_size?(a(),w(L,{key:0},{default:n(()=>[p("📦 "+r(t.value.file_size),1)]),_:1})):g("",!0),t.value.update_time?(a(),w(L,{key:1},{default:n(()=>[p("🕐 "+r(t.value.update_time),1)]),_:1})):g("",!0),t.value.source?(a(),w(L,{key:2},{default:n(()=>[p("📂 "+r(t.value.source),1)]),_:1})):g("",!0)]),t.value.description?(a(),c("p",ve,r(t.value.description),1)):g("",!0)])]),l("div",_e,[o(k,{type:"primary",size:"large",onClick:B},{default:n(()=>[...e[5]||(e[5]=[p(" 📥 保存到网盘 ",-1)])]),_:1})])])):s.value?(a(),c("div",pe,[l("div",fe,[l("div",me,[l("img",{src:s.value.cover,alt:s.value.title},null,8,ye),l("div",{class:"play-overlay",onClick:$},[...e[6]||(e[6]=[l("div",{class:"play-btn"},"▶ 播放",-1)])])]),l("div",ge,[l("h1",null,r(s.value.title),1),s.value.author?(a(),c("p",he,"👤 "+r(s.value.author),1)):g("",!0),l("p",ke,"📺 "+r(s.value.platform),1),s.value.description?(a(),c("p",Ve,r(s.value.description),1)):g("",!0)])]),l("div",Ce,[o(k,{type:"primary",size:"large",onClick:B},{default:n(()=>[...e[7]||(e[7]=[p(" 📥 保存到云盘 ",-1)])]),_:1})]),C.value?(a(),c("div",we,[l("video",{src:s.value.video_url,controls:"",autoplay:"",class:"video-player"},null,8,be)])):g("",!0)])):(a(),w(M,{key:3,description:"未找到该资源"}))]),o(z,{modelValue:m.value,"onUpdate:modelValue":e[1]||(e[1]=d=>m.value=d),title:"保存到网盘",width:"420px"},{footer:n(()=>[o(k,{onClick:e[0]||(e[0]=d=>m.value=!1)},{default:n(()=>[...e[8]||(e[8]=[p("取消",-1)])]),_:1}),o(k,{type:"primary",loading:v.value,onClick:I},{default:n(()=>[...e[9]||(e[9]=[p("确认保存",-1)])]),_:1},8,["loading"])]),default:n(()=>{var d,x;return[l("div",Se,[l("p",xe,"📄 "+r(((d=t.value)==null?void 0:d.title)||((x=s.value)==null?void 0:x.title)),1),o(te,{onSelect:A})])]}),_:1},8,["modelValue"]),o(z,{modelValue:h.value,"onUpdate:modelValue":e[4]||(e[4]=d=>h.value=d),title:"保存成功",width:"420px"},{footer:n(()=>[o(k,{type:"primary",onClick:e[3]||(e[3]=d=>h.value=!1)},{default:n(()=>[...e[12]||(e[12]=[p("关闭",-1)])]),_:1})]),default:n(()=>{var d;return[l("div",De,[o(O,{type:"success",title:((d=_.value)==null?void 0:d.message)||"保存成功","show-icon":"",closable:!1},null,8,["title"]),l("div",Ee,[e[11]||(e[11]=l("p",{class:"share-label"},"分享链接:",-1)),l("div",Le,[o(P,{modelValue:S.value,"onUpdate:modelValue":e[2]||(e[2]=x=>S.value=x),readonly:""},null,8,["modelValue"]),o(k,{onClick:q},{default:n(()=>[...e[10]||(e[10]=[p("复制",-1)])]),_:1})])])])]}),_:1},8,["modelValue"])])}}}),Te=T(Re,[["__scopeId","data-v-755e2105"]]);export{Te as default}; diff --git a/source_clean/frontend/assets/SaveRecords-DLmXAM3V.js b/source_clean/frontend/assets/SaveRecords-B5cCMWaP.js similarity index 99% rename from source_clean/frontend/assets/SaveRecords-DLmXAM3V.js rename to source_clean/frontend/assets/SaveRecords-B5cCMWaP.js index 59d3f81..955dc90 100644 --- a/source_clean/frontend/assets/SaveRecords-DLmXAM3V.js +++ b/source_clean/frontend/assets/SaveRecords-B5cCMWaP.js @@ -1 +1 @@ -import{d as Ce,o as xe,a as u,c as r,b as a,f as l,w as d,F as Z,r as q,g as De,t as n,l as g,e as _,h as p,j as m,y as ee,n as M,k as R,s as Se,K as we,O as ze,P as Ne,E as te,Q as Te}from"./index-D279dJND.js";import{c as Be,j as $e,_ as Me}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const Fe={class:"save-records"},Ve={class:"toolbar"},Ee={class:"toolbar-row"},He={class:"filter-group"},je={style:{display:"inline-flex",alignItems:"center",gap:"6px"}},Ie=["src"],Le={class:"time-btns"},Ye=["onClick"],Ae={class:"toolbar-actions"},Ge={class:"record-count"},Ke={key:0,class:"save-summary"},Re={class:"summary-item summary-all"},Ue={class:"summary-item summary-success"},Pe={class:"summary-item summary-reused"},Je={class:"summary-item summary-failed"},Oe={key:0,class:"summary-item summary-rate"},Qe={class:"el-table-wrap"},Xe={class:"expand-detail"},We={class:"detail-row"},Ze={class:"detail-cell",style:{flex:"2"}},qe=["href"],et={key:0,class:"detail-cell"},tt={class:"detail-code"},at={key:1,class:"detail-cell"},st={key:2,class:"detail-cell"},lt={key:3,class:"detail-cell"},nt={class:"detail-row"},ot={key:0,class:"detail-cell"},it={key:1,class:"detail-cell"},dt={class:"detail-code"},ut={key:2,class:"detail-cell"},rt={class:"detail-code"},ct={class:"detail-row"},_t={key:0,class:"detail-cell",style:{flex:"2"}},pt=["href"],gt={key:1,class:"detail-cell"},ft={class:"detail-cell"},mt={key:0,class:"detail-row"},vt={class:"detail-cell"},ht={class:"detail-code"},yt={key:0,class:"detail-cell"},bt={class:"detail-code"},kt={class:"detail-cell"},Ct={class:"detail-code"},xt={key:1,class:"detail-row"},Dt={class:"detail-cell detail-full"},St={class:"detail-error"},wt={key:2,class:"detail-row"},zt={class:"detail-cell detail-full"},Nt={class:"detail-error"},Tt=["title"],Bt=["src"],$t=["title"],Mt={key:0,class:"loc-badge"},Ft={key:1,class:"no-data"},Vt=["title"],Et={key:1,class:"err-msg"},Ht={key:2,class:"reuse-msg"},jt={key:3,class:"no-data"},It={class:"action-cell"},Lt={key:1,class:"pagination-wrap"},Yt={class:"pagination-info"},At='',Gt=Ce({__name:"SaveRecords",setup(Kt){const U=p([]),k=p(0),C=p(1),x=p(20),F=p(!1),S=p(""),w=p(""),z=p(""),V=p("today"),E=p(""),H=p(""),N=p(null),j=p([]),v=p(null),ae=[{key:"today",label:"今日"},{key:"week",label:"本周"},{key:"month",label:"本月"},{key:"lastMonth",label:"上月"}],I=p({});async function se(){try{const s=await Be(),e={};for(const o of s.types)e[o.type]={label:o.label,icon:o.icon};I.value=e}catch{}}function L(s){var e;return((e=I.value[s])==null?void 0:e.label)||s}function P(s){var e;return((e=I.value[s])==null?void 0:e.icon)||At}function le(s){const e=new Set;s.forEach(i=>{i.source_type&&e.add(i.source_type)});const o=new Set(j.value);e.forEach(i=>{o.has(i)||j.value.push(i)})}function Y(s){const e=s.getFullYear(),o=String(s.getMonth()+1).padStart(2,"0"),i=String(s.getDate()).padStart(2,"0");return`${e}-${o}-${i}`}function J(s){if(!s)return"-";let e=s;/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(e)&&(e=e.replace(" ","T")+"+08:00");const o=new Date(e);if(isNaN(o.getTime()))return s;const i=c=>String(c).padStart(2,"0");return`${o.getFullYear()}-${i(o.getMonth()+1)}-${i(o.getDate())} ${i(o.getHours())}:${i(o.getMinutes())}:${i(o.getSeconds())}`}function O(s){return s?s<1e3?`${s}ms`:`${(s/1e3).toFixed(1)}s`:"-"}function Q(s){return s?s>3e4?"dur-slow":s>1e4?"dur-warn":"dur-fast":""}function ne(s){return s.length>50?s.slice(0,50)+"…":s}function oe(s){return s==="success"?"转存成功":s==="reused"?"♻️ 复用已有分享链接":"转存失败"}function ie(s){return s==="success"?"status-ok":s==="reused"?"status-reuse":"status-fail"}function de(s){return s==="success"?"✓":s==="reused"?"♻️":"✗"}const ue={Anhui:"安徽",Beijing:"北京",Chongqing:"重庆",Fujian:"福建",Gansu:"甘肃",Guangdong:"广东",Guangxi:"广西",Guizhou:"贵州",Hainan:"海南",Hebei:"河北",Henan:"河南",Heilongjiang:"黑龙江",Hubei:"湖北",Hunan:"湖南","Inner Mongolia":"内蒙古",Jiangsu:"江苏",Jiangxi:"江西",Jilin:"吉林",Liaoning:"辽宁",Ningxia:"宁夏",Qinghai:"青海",Shaanxi:"陕西",Shandong:"山东",Shanghai:"上海",Shanxi:"山西",Sichuan:"四川",Tianjin:"天津",Tibet:"西藏",Xinjiang:"新疆",Yunnan:"云南",Zhejiang:"浙江","Hong Kong":"香港",Macau:"澳门",Taiwan:"台湾",Changsha:"长沙",Hefei:"合肥",Fuzhou:"福州",Lanzhou:"兰州",Guangzhou:"广州",Nanning:"南宁",Guiyang:"贵阳",Haikou:"海口",Shijiazhuang:"石家庄",Zhengzhou:"郑州",Harbin:"哈尔滨",Wuhan:"武汉",Nanjing:"南京",Nanchang:"南昌",Changchun:"长春",Shenyang:"沈阳",Yinchuan:"银川",Xining:"西宁","Xi'an":"西安",Jinan:"济南",Taiyuan:"太原",Chengdu:"成都",Shenzhen:"深圳",Hangzhou:"杭州",Suzhou:"苏州",Wuxi:"无锡",Ningbo:"宁波",Dongguan:"东莞",Foshan:"佛山",Zhuhai:"珠海",Qingdao:"青岛",Dalian:"大连",Xiamen:"厦门",Kunming:"昆明",Lhasa:"拉萨",Urumqi:"乌鲁木齐",Linyi:"临沂",Wenzhou:"温州",Quanzhou:"泉州"},re={"China Telecom":"中国电信","China Mobile":"中国移动","China Unicom":"中国联通",Chinanet:"中国电信",ChinaNet:"中国电信",CMNET:"中国移动","CNC Group":"中国联通",unicom:"中国联通",telecom:"中国电信",mobile:"中国移动","China Education and Research Network":"教育网",CERNET:"教育网","China Networks":"中国网络",China163:"中国电信","CHINANET BACKBONE":"中国电信","Tencent Cloud":"腾讯云","Alibaba Cloud":"阿里云",Aliyun:"阿里云","Huawei Cloud":"华为云",Baidu:"百度","Beijing Baidu":"百度"};function X(s){return s.replace(/^(中国|China)\s*/i,"").split(/\s+/).filter(Boolean).map(i=>ue[i]||re[i]||i).join(" ")}function ce({row:s}){return s.status==="failed"?"row-failed":""}async function _e(s){try{await navigator.clipboard.writeText(s),te.success("已复制到剪贴板")}catch{const e=document.createElement("textarea");e.value=s,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),te.success("已复制到剪贴板")}}function pe(s){window.open(s,"_blank")}function ge(s,e){}function T(s){V.value=s,N.value=null;const e=new Date,o=e.getFullYear(),i=e.getMonth();let c,f;switch(s){case"today":c=new Date(o,i,e.getDate()),f=c;break;case"week":{const D=e.getDay();c=new Date(o,i,e.getDate()+(D===0?-6:1-D)),f=e;break}case"month":c=new Date(o,i,1),f=e;break;case"lastMonth":c=new Date(o,i-1,1),f=new Date(o,i,0);break;default:c=new Date(o,i,e.getDate()),f=c}E.value=Y(c);const A=new Date(f.getFullYear(),f.getMonth(),f.getDate()+1);H.value=Y(A),y(1)}function fe(s){if(s&&s.length===2){V.value="",E.value=s[0];const e=new Date(s[1]);e.setDate(e.getDate()+1),H.value=Y(e),y(1)}else T("today")}function me(){S.value="",w.value="",z.value="",N.value=null,T("today")}async function y(s=1){F.value=!0;try{C.value=s;const e=S.value||void 0,o=w.value||void 0,i=z.value||void 0,c=await $e(s,x.value,E.value,H.value,e,o,i);U.value=c.records,k.value=c.total,v.value=c.summary||null,le(c.records)}catch(e){console.error("加载转存记录失败",e)}finally{F.value=!1}}return xe(()=>{T("today"),se()}),(s,e)=>{const o=m("el-option"),i=m("el-select"),c=m("el-date-picker"),f=m("el-icon"),A=m("el-input"),D=m("el-button"),W=m("el-tag"),h=m("el-table-column"),B=m("el-tooltip"),ve=m("el-table"),he=m("el-card"),ye=m("el-pagination"),be=Te("loading");return u(),r("div",Fe,[a("div",Ve,[a("div",Ee,[a("div",He,[l(i,{modelValue:S.value,"onUpdate:modelValue":e[0]||(e[0]=t=>S.value=t),placeholder:"状态",clearable:"",style:{width:"100px"},onChange:e[1]||(e[1]=t=>y(1))},{default:d(()=>[l(o,{label:"全部状态",value:""}),l(o,{label:"✓ 成功",value:"success"}),l(o,{label:"♻️ 复用",value:"reused"}),l(o,{label:"✗ 失败",value:"failed"})]),_:1},8,["modelValue"]),l(i,{modelValue:w.value,"onUpdate:modelValue":e[2]||(e[2]=t=>w.value=t),placeholder:"网盘",clearable:"",style:{width:"100px"},onChange:e[3]||(e[3]=t=>y(1))},{default:d(()=>[l(o,{label:"全部网盘",value:""}),(u(!0),r(Z,null,q(j.value,t=>(u(),ee(o,{key:t,label:L(t),value:t},{default:d(()=>[a("span",je,[a("img",{src:P(t),style:{width:"16px",height:"16px"}},null,8,Ie),g(" "+n(L(t)),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue"]),a("div",Le,[(u(),r(Z,null,q(ae,t=>a("button",{key:t.key,class:M(["time-btn",{active:V.value===t.key}]),onClick:b=>T(t.key)},n(t.label),11,Ye)),64))]),l(c,{modelValue:N.value,"onUpdate:modelValue":e[4]||(e[4]=t=>N.value=t),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期","value-format":"YYYY-MM-DD",style:{width:"220px"},onChange:fe},null,8,["modelValue"]),l(A,{modelValue:z.value,"onUpdate:modelValue":e[5]||(e[5]=t=>z.value=t),placeholder:"搜索资源名称…",clearable:"",style:{width:"180px"},onClear:e[6]||(e[6]=t=>y(1)),onKeyup:e[7]||(e[7]=De(t=>y(1),["enter"]))},{prefix:d(()=>[l(f,null,{default:d(()=>[l(R(Se))]),_:1})]),_:1},8,["modelValue"])]),a("div",Ae,[l(D,{size:"small",onClick:me},{default:d(()=>[...e[11]||(e[11]=[g("重置筛选",-1)])]),_:1}),a("span",Ge,"共 "+n(k.value)+" 条",1)])])]),v.value?(u(),r("div",Ke,[a("span",Re,[e[12]||(e[12]=g("📊 共 ",-1)),a("strong",null,n(v.value.total),1),e[13]||(e[13]=g(" 条",-1))]),e[18]||(e[18]=a("span",{class:"summary-divider"},"|",-1)),a("span",Ue,[e[14]||(e[14]=g("✅ 成功 ",-1)),a("strong",null,n(v.value.success),1)]),a("span",Pe,[e[15]||(e[15]=g("♻️ 复用 ",-1)),a("strong",null,n(v.value.reused),1)]),a("span",Je,[e[16]||(e[16]=g("❌ 失败 ",-1)),a("strong",null,n(v.value.failed),1)]),v.value.total>0?(u(),r("span",Oe,[e[17]||(e[17]=g(" 成功率 ",-1)),a("strong",null,n(((v.value.success+v.value.reused)/v.value.total*100).toFixed(1))+"%",1)])):_("",!0)])):_("",!0),l(he,{shadow:"never",class:"save-table-card"},{header:d(()=>[...e[19]||(e[19]=[a("span",null,"📋 转存日志列表",-1)])]),default:d(()=>[a("div",Qe,[we((u(),ee(ve,{data:U.value,stripe:"",style:{width:"100%"},"empty-text":"暂无转存记录",onExpandChange:ge,"row-class-name":ce},{default:d(()=>[l(h,{type:"expand",width:"36"},{default:d(({row:t})=>[a("div",Xe,[a("div",We,[a("div",Ze,[e[20]||(e[20]=a("span",{class:"detail-label"},"原始链接",-1)),a("a",{href:t.source_url,target:"_blank",class:"detail-link"},n(t.source_url),9,qe)]),t.file_size?(u(),r("div",et,[e[21]||(e[21]=a("span",{class:"detail-label"},"文件大小",-1)),a("code",tt,n(t.file_size?function(b){if(b==null||b==="")return"-";var G=typeof b=="string"?parseInt(b,10):b;if(!G||G<=0)return"-";for(var ke=["B","KB","MB","GB","TB"],$=0,K=G;K>=1024&&$<4;)K/=1024,$++;return K.toFixed($===0?0:2)+" "+ke[$]}(t.file_size):"-"),1)])):_("",!0),t.status!=="reused"&&(t.folder_count>0||t.file_count>0)?(u(),r("div",at,[e[23]||(e[23]=a("span",{class:"detail-label"},"文件夹",-1)),a("span",null,[a("strong",null,n(t.folder_count||0),1),e[22]||(e[22]=g(" 个",-1))])])):_("",!0),t.status!=="reused"&&(t.folder_count>0||t.file_count>0)?(u(),r("div",st,[e[25]||(e[25]=a("span",{class:"detail-label"},"文件",-1)),a("span",null,[a("strong",null,n(t.file_count||0),1),e[24]||(e[24]=g(" 个",-1))])])):_("",!0),t.status==="reused"?(u(),r("div",lt,[...e[26]||(e[26]=[a("span",{class:"detail-label"},"复用方式",-1),a("span",{class:"reuse-msg"},"♻️ 直接使用已有分享链接,无需实际转存",-1)])])):_("",!0)]),a("div",nt,[t.config_nickname?(u(),r("div",ot,[e[27]||(e[27]=a("span",{class:"detail-label"},"使用账号",-1)),l(W,{size:"small",type:"success",effect:"plain"},{default:d(()=>[g(n(t.config_nickname),1)]),_:2},1024)])):_("",!0),t.original_folder_name?(u(),r("div",it,[e[28]||(e[28]=a("span",{class:"detail-label"},"原始文件夹名",-1)),a("code",dt,n(t.original_folder_name),1)])):_("",!0),t.folder_name?(u(),r("div",ut,[e[29]||(e[29]=a("span",{class:"detail-label"},"转存文件夹",-1)),a("code",rt,n(t.folder_name),1)])):_("",!0)]),a("div",ct,[t.share_url?(u(),r("div",_t,[e[30]||(e[30]=a("span",{class:"detail-label"},"分享链接",-1)),a("a",{href:t.share_url,target:"_blank",class:"detail-link"},n(t.share_url),9,pt)])):_("",!0),t.share_pwd?(u(),r("div",gt,[e[31]||(e[31]=a("span",{class:"detail-label"},"分享密码",-1)),l(W,{size:"small",type:"warning"},{default:d(()=>[g(n(t.share_pwd),1)]),_:2},1024)])):_("",!0),a("div",ft,[e[32]||(e[32]=a("span",{class:"detail-label"},"耗时",-1)),a("span",{class:M(["detail-duration",Q(t.duration_ms)])},n(O(t.duration_ms)),3)])]),t.ip_address?(u(),r("div",mt,[a("div",vt,[e[33]||(e[33]=a("span",{class:"detail-label"},"IP 地址",-1)),a("code",ht,n(t.ip_address),1)]),t.ip_location?(u(),r("div",yt,[e[34]||(e[34]=a("span",{class:"detail-label"},"归属地",-1)),a("code",bt,n(X(t.ip_location)),1)])):_("",!0),a("div",kt,[e[35]||(e[35]=a("span",{class:"detail-label"},"时间",-1)),a("code",Ct,n(J(t.created_at)),1)])])):_("",!0),t.status==="failed"&&t.error_message?(u(),r("div",xt,[a("div",Dt,[e[36]||(e[36]=a("span",{class:"detail-label"},"错误信息",-1)),a("pre",St,n(t.error_message.includes(" | ")?t.error_message.split(" | ")[1]:t.error_message.split(" | ")[0]),1)])])):_("",!0),t.status==="failed"&&t.error_message&&t.error_message.includes(" | ")?(u(),r("div",wt,[a("div",zt,[e[37]||(e[37]=a("span",{class:"detail-label"},"友好提示",-1)),a("pre",Nt,n(t.error_message.split(" | ")[0]),1)])])):_("",!0)])]),_:1}),l(h,{label:"序号",width:"68",align:"center"},{default:d(({$index:t})=>[g(n((C.value-1)*x.value+t+1),1)]),_:1}),l(h,{label:"时间",width:"140"},{default:d(({row:t})=>[a("span",{title:t.created_at},n(J(t.created_at)),9,Tt)]),_:1}),l(h,{label:"网盘",width:"70",align:"center"},{default:d(({row:t})=>[l(B,{content:L(t.source_type),placement:"top"},{default:d(()=>[a("img",{src:P(t.source_type),style:{width:"22px",height:"22px",cursor:"default"}},null,8,Bt)]),_:2},1032,["content"])]),_:1}),l(h,{label:"状态",width:"72",align:"center"},{default:d(({row:t})=>[l(B,{content:oe(t.status),placement:"top"},{default:d(()=>[a("span",{class:M(["status-badge",ie(t.status)])},n(de(t.status)),3)]),_:2},1032,["content"])]),_:1}),l(h,{label:"资源名称","min-width":"160","show-overflow-tooltip":""},{default:d(({row:t})=>[a("span",{title:t.source_title||""},n(t.source_title||"-"),9,$t)]),_:1}),l(h,{label:"耗时",width:"85",align:"center"},{default:d(({row:t})=>[a("span",{class:M(["duration",Q(t.duration_ms)])},n(O(t.duration_ms)),3)]),_:1}),l(h,{label:"归属地","min-width":"130","show-overflow-tooltip":""},{default:d(({row:t})=>[t.ip_location?(u(),r("span",Mt,n(X(t.ip_location)),1)):(u(),r("span",Ft,"-"))]),_:1}),l(h,{label:"备注","min-width":"200","show-overflow-tooltip":""},{default:d(({row:t})=>[t.status==="failed"&&t.error_message?(u(),r("span",{key:0,class:"err-msg",title:t.error_message},n(ne(t.error_message)),9,Vt)):t.status==="failed"?(u(),r("span",Et,"失败")):t.status==="reused"?(u(),r("span",Ht,"♻️ 复用已有链接")):(u(),r("span",jt,"-"))]),_:1}),l(h,{label:"操作",width:"80",fixed:"right",align:"center"},{default:d(({row:t})=>[a("div",It,[l(B,{content:"复制分享链接",placement:"top"},{default:d(()=>[l(D,{size:"small",circle:"",text:"",disabled:!t.share_url,onClick:b=>_e(t.share_url)},{default:d(()=>[l(f,null,{default:d(()=>[l(R(ze))]),_:1})]),_:1},8,["disabled","onClick"])]),_:2},1024),l(B,{content:"打开分享链接",placement:"top"},{default:d(()=>[l(D,{size:"small",circle:"",text:"",disabled:!t.share_url,onClick:b=>pe(t.share_url)},{default:d(()=>[l(f,null,{default:d(()=>[l(R(Ne))]),_:1})]),_:1},8,["disabled","onClick"])]),_:2},1024)])]),_:1})]),_:1},8,["data"])),[[be,F.value]])])]),_:1}),k.value>0?(u(),r("div",Lt,[a("div",Yt," 第 "+n((C.value-1)*x.value+1)+"-"+n(Math.min(C.value*x.value,k.value))+" 条,共 "+n(k.value)+" 条 ",1),l(ye,{"current-page":C.value,"onUpdate:currentPage":e[8]||(e[8]=t=>C.value=t),"page-size":x.value,"onUpdate:pageSize":e[9]||(e[9]=t=>x.value=t),total:k.value,"page-sizes":[15,20,30,50,100],layout:"sizes, prev, pager, next, jumper",onCurrentChange:y,onSizeChange:e[10]||(e[10]=t=>y(1))},null,8,["current-page","page-size","total"])])):_("",!0)])}}}),Pt=Me(Gt,[["__scopeId","data-v-ccd92f86"]]);export{Pt as default}; +import{d as Ce,o as xe,a as u,c as r,b as a,f as l,w as d,F as Z,r as q,g as De,t as n,l as g,e as _,h as p,j as m,y as ee,n as M,k as R,s as Se,K as we,O as ze,P as Ne,E as te,Q as Te}from"./index-D_srC3bj.js";import{c as Be,j as $e,_ as Me}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const Fe={class:"save-records"},Ve={class:"toolbar"},Ee={class:"toolbar-row"},He={class:"filter-group"},je={style:{display:"inline-flex",alignItems:"center",gap:"6px"}},Ie=["src"],Le={class:"time-btns"},Ye=["onClick"],Ae={class:"toolbar-actions"},Ge={class:"record-count"},Ke={key:0,class:"save-summary"},Re={class:"summary-item summary-all"},Ue={class:"summary-item summary-success"},Pe={class:"summary-item summary-reused"},Je={class:"summary-item summary-failed"},Oe={key:0,class:"summary-item summary-rate"},Qe={class:"el-table-wrap"},Xe={class:"expand-detail"},We={class:"detail-row"},Ze={class:"detail-cell",style:{flex:"2"}},qe=["href"],et={key:0,class:"detail-cell"},tt={class:"detail-code"},at={key:1,class:"detail-cell"},st={key:2,class:"detail-cell"},lt={key:3,class:"detail-cell"},nt={class:"detail-row"},ot={key:0,class:"detail-cell"},it={key:1,class:"detail-cell"},dt={class:"detail-code"},ut={key:2,class:"detail-cell"},rt={class:"detail-code"},ct={class:"detail-row"},_t={key:0,class:"detail-cell",style:{flex:"2"}},pt=["href"],gt={key:1,class:"detail-cell"},ft={class:"detail-cell"},mt={key:0,class:"detail-row"},vt={class:"detail-cell"},ht={class:"detail-code"},yt={key:0,class:"detail-cell"},bt={class:"detail-code"},kt={class:"detail-cell"},Ct={class:"detail-code"},xt={key:1,class:"detail-row"},Dt={class:"detail-cell detail-full"},St={class:"detail-error"},wt={key:2,class:"detail-row"},zt={class:"detail-cell detail-full"},Nt={class:"detail-error"},Tt=["title"],Bt=["src"],$t=["title"],Mt={key:0,class:"loc-badge"},Ft={key:1,class:"no-data"},Vt=["title"],Et={key:1,class:"err-msg"},Ht={key:2,class:"reuse-msg"},jt={key:3,class:"no-data"},It={class:"action-cell"},Lt={key:1,class:"pagination-wrap"},Yt={class:"pagination-info"},At='',Gt=Ce({__name:"SaveRecords",setup(Kt){const U=p([]),k=p(0),C=p(1),x=p(20),F=p(!1),S=p(""),w=p(""),z=p(""),V=p("today"),E=p(""),H=p(""),N=p(null),j=p([]),v=p(null),ae=[{key:"today",label:"今日"},{key:"week",label:"本周"},{key:"month",label:"本月"},{key:"lastMonth",label:"上月"}],I=p({});async function se(){try{const s=await Be(),e={};for(const o of s.types)e[o.type]={label:o.label,icon:o.icon};I.value=e}catch{}}function L(s){var e;return((e=I.value[s])==null?void 0:e.label)||s}function P(s){var e;return((e=I.value[s])==null?void 0:e.icon)||At}function le(s){const e=new Set;s.forEach(i=>{i.source_type&&e.add(i.source_type)});const o=new Set(j.value);e.forEach(i=>{o.has(i)||j.value.push(i)})}function Y(s){const e=s.getFullYear(),o=String(s.getMonth()+1).padStart(2,"0"),i=String(s.getDate()).padStart(2,"0");return`${e}-${o}-${i}`}function J(s){if(!s)return"-";let e=s;/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(e)&&(e=e.replace(" ","T")+"+08:00");const o=new Date(e);if(isNaN(o.getTime()))return s;const i=c=>String(c).padStart(2,"0");return`${o.getFullYear()}-${i(o.getMonth()+1)}-${i(o.getDate())} ${i(o.getHours())}:${i(o.getMinutes())}:${i(o.getSeconds())}`}function O(s){return s?s<1e3?`${s}ms`:`${(s/1e3).toFixed(1)}s`:"-"}function Q(s){return s?s>3e4?"dur-slow":s>1e4?"dur-warn":"dur-fast":""}function ne(s){return s.length>50?s.slice(0,50)+"…":s}function oe(s){return s==="success"?"转存成功":s==="reused"?"♻️ 复用已有分享链接":"转存失败"}function ie(s){return s==="success"?"status-ok":s==="reused"?"status-reuse":"status-fail"}function de(s){return s==="success"?"✓":s==="reused"?"♻️":"✗"}const ue={Anhui:"安徽",Beijing:"北京",Chongqing:"重庆",Fujian:"福建",Gansu:"甘肃",Guangdong:"广东",Guangxi:"广西",Guizhou:"贵州",Hainan:"海南",Hebei:"河北",Henan:"河南",Heilongjiang:"黑龙江",Hubei:"湖北",Hunan:"湖南","Inner Mongolia":"内蒙古",Jiangsu:"江苏",Jiangxi:"江西",Jilin:"吉林",Liaoning:"辽宁",Ningxia:"宁夏",Qinghai:"青海",Shaanxi:"陕西",Shandong:"山东",Shanghai:"上海",Shanxi:"山西",Sichuan:"四川",Tianjin:"天津",Tibet:"西藏",Xinjiang:"新疆",Yunnan:"云南",Zhejiang:"浙江","Hong Kong":"香港",Macau:"澳门",Taiwan:"台湾",Changsha:"长沙",Hefei:"合肥",Fuzhou:"福州",Lanzhou:"兰州",Guangzhou:"广州",Nanning:"南宁",Guiyang:"贵阳",Haikou:"海口",Shijiazhuang:"石家庄",Zhengzhou:"郑州",Harbin:"哈尔滨",Wuhan:"武汉",Nanjing:"南京",Nanchang:"南昌",Changchun:"长春",Shenyang:"沈阳",Yinchuan:"银川",Xining:"西宁","Xi'an":"西安",Jinan:"济南",Taiyuan:"太原",Chengdu:"成都",Shenzhen:"深圳",Hangzhou:"杭州",Suzhou:"苏州",Wuxi:"无锡",Ningbo:"宁波",Dongguan:"东莞",Foshan:"佛山",Zhuhai:"珠海",Qingdao:"青岛",Dalian:"大连",Xiamen:"厦门",Kunming:"昆明",Lhasa:"拉萨",Urumqi:"乌鲁木齐",Linyi:"临沂",Wenzhou:"温州",Quanzhou:"泉州"},re={"China Telecom":"中国电信","China Mobile":"中国移动","China Unicom":"中国联通",Chinanet:"中国电信",ChinaNet:"中国电信",CMNET:"中国移动","CNC Group":"中国联通",unicom:"中国联通",telecom:"中国电信",mobile:"中国移动","China Education and Research Network":"教育网",CERNET:"教育网","China Networks":"中国网络",China163:"中国电信","CHINANET BACKBONE":"中国电信","Tencent Cloud":"腾讯云","Alibaba Cloud":"阿里云",Aliyun:"阿里云","Huawei Cloud":"华为云",Baidu:"百度","Beijing Baidu":"百度"};function X(s){return s.replace(/^(中国|China)\s*/i,"").split(/\s+/).filter(Boolean).map(i=>ue[i]||re[i]||i).join(" ")}function ce({row:s}){return s.status==="failed"?"row-failed":""}async function _e(s){try{await navigator.clipboard.writeText(s),te.success("已复制到剪贴板")}catch{const e=document.createElement("textarea");e.value=s,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),te.success("已复制到剪贴板")}}function pe(s){window.open(s,"_blank")}function ge(s,e){}function T(s){V.value=s,N.value=null;const e=new Date,o=e.getFullYear(),i=e.getMonth();let c,f;switch(s){case"today":c=new Date(o,i,e.getDate()),f=c;break;case"week":{const D=e.getDay();c=new Date(o,i,e.getDate()+(D===0?-6:1-D)),f=e;break}case"month":c=new Date(o,i,1),f=e;break;case"lastMonth":c=new Date(o,i-1,1),f=new Date(o,i,0);break;default:c=new Date(o,i,e.getDate()),f=c}E.value=Y(c);const A=new Date(f.getFullYear(),f.getMonth(),f.getDate()+1);H.value=Y(A),y(1)}function fe(s){if(s&&s.length===2){V.value="",E.value=s[0];const e=new Date(s[1]);e.setDate(e.getDate()+1),H.value=Y(e),y(1)}else T("today")}function me(){S.value="",w.value="",z.value="",N.value=null,T("today")}async function y(s=1){F.value=!0;try{C.value=s;const e=S.value||void 0,o=w.value||void 0,i=z.value||void 0,c=await $e(s,x.value,E.value,H.value,e,o,i);U.value=c.records,k.value=c.total,v.value=c.summary||null,le(c.records)}catch(e){console.error("加载转存记录失败",e)}finally{F.value=!1}}return xe(()=>{T("today"),se()}),(s,e)=>{const o=m("el-option"),i=m("el-select"),c=m("el-date-picker"),f=m("el-icon"),A=m("el-input"),D=m("el-button"),W=m("el-tag"),h=m("el-table-column"),B=m("el-tooltip"),ve=m("el-table"),he=m("el-card"),ye=m("el-pagination"),be=Te("loading");return u(),r("div",Fe,[a("div",Ve,[a("div",Ee,[a("div",He,[l(i,{modelValue:S.value,"onUpdate:modelValue":e[0]||(e[0]=t=>S.value=t),placeholder:"状态",clearable:"",style:{width:"100px"},onChange:e[1]||(e[1]=t=>y(1))},{default:d(()=>[l(o,{label:"全部状态",value:""}),l(o,{label:"✓ 成功",value:"success"}),l(o,{label:"♻️ 复用",value:"reused"}),l(o,{label:"✗ 失败",value:"failed"})]),_:1},8,["modelValue"]),l(i,{modelValue:w.value,"onUpdate:modelValue":e[2]||(e[2]=t=>w.value=t),placeholder:"网盘",clearable:"",style:{width:"100px"},onChange:e[3]||(e[3]=t=>y(1))},{default:d(()=>[l(o,{label:"全部网盘",value:""}),(u(!0),r(Z,null,q(j.value,t=>(u(),ee(o,{key:t,label:L(t),value:t},{default:d(()=>[a("span",je,[a("img",{src:P(t),style:{width:"16px",height:"16px"}},null,8,Ie),g(" "+n(L(t)),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue"]),a("div",Le,[(u(),r(Z,null,q(ae,t=>a("button",{key:t.key,class:M(["time-btn",{active:V.value===t.key}]),onClick:b=>T(t.key)},n(t.label),11,Ye)),64))]),l(c,{modelValue:N.value,"onUpdate:modelValue":e[4]||(e[4]=t=>N.value=t),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期","value-format":"YYYY-MM-DD",style:{width:"220px"},onChange:fe},null,8,["modelValue"]),l(A,{modelValue:z.value,"onUpdate:modelValue":e[5]||(e[5]=t=>z.value=t),placeholder:"搜索资源名称…",clearable:"",style:{width:"180px"},onClear:e[6]||(e[6]=t=>y(1)),onKeyup:e[7]||(e[7]=De(t=>y(1),["enter"]))},{prefix:d(()=>[l(f,null,{default:d(()=>[l(R(Se))]),_:1})]),_:1},8,["modelValue"])]),a("div",Ae,[l(D,{size:"small",onClick:me},{default:d(()=>[...e[11]||(e[11]=[g("重置筛选",-1)])]),_:1}),a("span",Ge,"共 "+n(k.value)+" 条",1)])])]),v.value?(u(),r("div",Ke,[a("span",Re,[e[12]||(e[12]=g("📊 共 ",-1)),a("strong",null,n(v.value.total),1),e[13]||(e[13]=g(" 条",-1))]),e[18]||(e[18]=a("span",{class:"summary-divider"},"|",-1)),a("span",Ue,[e[14]||(e[14]=g("✅ 成功 ",-1)),a("strong",null,n(v.value.success),1)]),a("span",Pe,[e[15]||(e[15]=g("♻️ 复用 ",-1)),a("strong",null,n(v.value.reused),1)]),a("span",Je,[e[16]||(e[16]=g("❌ 失败 ",-1)),a("strong",null,n(v.value.failed),1)]),v.value.total>0?(u(),r("span",Oe,[e[17]||(e[17]=g(" 成功率 ",-1)),a("strong",null,n(((v.value.success+v.value.reused)/v.value.total*100).toFixed(1))+"%",1)])):_("",!0)])):_("",!0),l(he,{shadow:"never",class:"save-table-card"},{header:d(()=>[...e[19]||(e[19]=[a("span",null,"📋 转存日志列表",-1)])]),default:d(()=>[a("div",Qe,[we((u(),ee(ve,{data:U.value,stripe:"",style:{width:"100%"},"empty-text":"暂无转存记录",onExpandChange:ge,"row-class-name":ce},{default:d(()=>[l(h,{type:"expand",width:"36"},{default:d(({row:t})=>[a("div",Xe,[a("div",We,[a("div",Ze,[e[20]||(e[20]=a("span",{class:"detail-label"},"原始链接",-1)),a("a",{href:t.source_url,target:"_blank",class:"detail-link"},n(t.source_url),9,qe)]),t.file_size?(u(),r("div",et,[e[21]||(e[21]=a("span",{class:"detail-label"},"文件大小",-1)),a("code",tt,n(t.file_size?function(b){if(b==null||b==="")return"-";var G=typeof b=="string"?parseInt(b,10):b;if(!G||G<=0)return"-";for(var ke=["B","KB","MB","GB","TB"],$=0,K=G;K>=1024&&$<4;)K/=1024,$++;return K.toFixed($===0?0:2)+" "+ke[$]}(t.file_size):"-"),1)])):_("",!0),t.status!=="reused"&&(t.folder_count>0||t.file_count>0)?(u(),r("div",at,[e[23]||(e[23]=a("span",{class:"detail-label"},"文件夹",-1)),a("span",null,[a("strong",null,n(t.folder_count||0),1),e[22]||(e[22]=g(" 个",-1))])])):_("",!0),t.status!=="reused"&&(t.folder_count>0||t.file_count>0)?(u(),r("div",st,[e[25]||(e[25]=a("span",{class:"detail-label"},"文件",-1)),a("span",null,[a("strong",null,n(t.file_count||0),1),e[24]||(e[24]=g(" 个",-1))])])):_("",!0),t.status==="reused"?(u(),r("div",lt,[...e[26]||(e[26]=[a("span",{class:"detail-label"},"复用方式",-1),a("span",{class:"reuse-msg"},"♻️ 直接使用已有分享链接,无需实际转存",-1)])])):_("",!0)]),a("div",nt,[t.config_nickname?(u(),r("div",ot,[e[27]||(e[27]=a("span",{class:"detail-label"},"使用账号",-1)),l(W,{size:"small",type:"success",effect:"plain"},{default:d(()=>[g(n(t.config_nickname),1)]),_:2},1024)])):_("",!0),t.original_folder_name?(u(),r("div",it,[e[28]||(e[28]=a("span",{class:"detail-label"},"原始文件夹名",-1)),a("code",dt,n(t.original_folder_name),1)])):_("",!0),t.folder_name?(u(),r("div",ut,[e[29]||(e[29]=a("span",{class:"detail-label"},"转存文件夹",-1)),a("code",rt,n(t.folder_name),1)])):_("",!0)]),a("div",ct,[t.share_url?(u(),r("div",_t,[e[30]||(e[30]=a("span",{class:"detail-label"},"分享链接",-1)),a("a",{href:t.share_url,target:"_blank",class:"detail-link"},n(t.share_url),9,pt)])):_("",!0),t.share_pwd?(u(),r("div",gt,[e[31]||(e[31]=a("span",{class:"detail-label"},"分享密码",-1)),l(W,{size:"small",type:"warning"},{default:d(()=>[g(n(t.share_pwd),1)]),_:2},1024)])):_("",!0),a("div",ft,[e[32]||(e[32]=a("span",{class:"detail-label"},"耗时",-1)),a("span",{class:M(["detail-duration",Q(t.duration_ms)])},n(O(t.duration_ms)),3)])]),t.ip_address?(u(),r("div",mt,[a("div",vt,[e[33]||(e[33]=a("span",{class:"detail-label"},"IP 地址",-1)),a("code",ht,n(t.ip_address),1)]),t.ip_location?(u(),r("div",yt,[e[34]||(e[34]=a("span",{class:"detail-label"},"归属地",-1)),a("code",bt,n(X(t.ip_location)),1)])):_("",!0),a("div",kt,[e[35]||(e[35]=a("span",{class:"detail-label"},"时间",-1)),a("code",Ct,n(J(t.created_at)),1)])])):_("",!0),t.status==="failed"&&t.error_message?(u(),r("div",xt,[a("div",Dt,[e[36]||(e[36]=a("span",{class:"detail-label"},"错误信息",-1)),a("pre",St,n(t.error_message.includes(" | ")?t.error_message.split(" | ")[1]:t.error_message.split(" | ")[0]),1)])])):_("",!0),t.status==="failed"&&t.error_message&&t.error_message.includes(" | ")?(u(),r("div",wt,[a("div",zt,[e[37]||(e[37]=a("span",{class:"detail-label"},"友好提示",-1)),a("pre",Nt,n(t.error_message.split(" | ")[0]),1)])])):_("",!0)])]),_:1}),l(h,{label:"序号",width:"68",align:"center"},{default:d(({$index:t})=>[g(n((C.value-1)*x.value+t+1),1)]),_:1}),l(h,{label:"时间",width:"140"},{default:d(({row:t})=>[a("span",{title:t.created_at},n(J(t.created_at)),9,Tt)]),_:1}),l(h,{label:"网盘",width:"70",align:"center"},{default:d(({row:t})=>[l(B,{content:L(t.source_type),placement:"top"},{default:d(()=>[a("img",{src:P(t.source_type),style:{width:"22px",height:"22px",cursor:"default"}},null,8,Bt)]),_:2},1032,["content"])]),_:1}),l(h,{label:"状态",width:"72",align:"center"},{default:d(({row:t})=>[l(B,{content:oe(t.status),placement:"top"},{default:d(()=>[a("span",{class:M(["status-badge",ie(t.status)])},n(de(t.status)),3)]),_:2},1032,["content"])]),_:1}),l(h,{label:"资源名称","min-width":"160","show-overflow-tooltip":""},{default:d(({row:t})=>[a("span",{title:t.source_title||""},n(t.source_title||"-"),9,$t)]),_:1}),l(h,{label:"耗时",width:"85",align:"center"},{default:d(({row:t})=>[a("span",{class:M(["duration",Q(t.duration_ms)])},n(O(t.duration_ms)),3)]),_:1}),l(h,{label:"归属地","min-width":"130","show-overflow-tooltip":""},{default:d(({row:t})=>[t.ip_location?(u(),r("span",Mt,n(X(t.ip_location)),1)):(u(),r("span",Ft,"-"))]),_:1}),l(h,{label:"备注","min-width":"200","show-overflow-tooltip":""},{default:d(({row:t})=>[t.status==="failed"&&t.error_message?(u(),r("span",{key:0,class:"err-msg",title:t.error_message},n(ne(t.error_message)),9,Vt)):t.status==="failed"?(u(),r("span",Et,"失败")):t.status==="reused"?(u(),r("span",Ht,"♻️ 复用已有链接")):(u(),r("span",jt,"-"))]),_:1}),l(h,{label:"操作",width:"80",fixed:"right",align:"center"},{default:d(({row:t})=>[a("div",It,[l(B,{content:"复制分享链接",placement:"top"},{default:d(()=>[l(D,{size:"small",circle:"",text:"",disabled:!t.share_url,onClick:b=>_e(t.share_url)},{default:d(()=>[l(f,null,{default:d(()=>[l(R(ze))]),_:1})]),_:1},8,["disabled","onClick"])]),_:2},1024),l(B,{content:"打开分享链接",placement:"top"},{default:d(()=>[l(D,{size:"small",circle:"",text:"",disabled:!t.share_url,onClick:b=>pe(t.share_url)},{default:d(()=>[l(f,null,{default:d(()=>[l(R(Ne))]),_:1})]),_:1},8,["disabled","onClick"])]),_:2},1024)])]),_:1})]),_:1},8,["data"])),[[be,F.value]])])]),_:1}),k.value>0?(u(),r("div",Lt,[a("div",Yt," 第 "+n((C.value-1)*x.value+1)+"-"+n(Math.min(C.value*x.value,k.value))+" 条,共 "+n(k.value)+" 条 ",1),l(ye,{"current-page":C.value,"onUpdate:currentPage":e[8]||(e[8]=t=>C.value=t),"page-size":x.value,"onUpdate:pageSize":e[9]||(e[9]=t=>x.value=t),total:k.value,"page-sizes":[15,20,30,50,100],layout:"sizes, prev, pager, next, jumper",onCurrentChange:y,onSizeChange:e[10]||(e[10]=t=>y(1))},null,8,["current-page","page-size","total"])])):_("",!0)])}}}),Pt=Me(Gt,[["__scopeId","data-v-ccd92f86"]]);export{Pt as default}; diff --git a/source_clean/frontend/assets/SearchResult-DLXOMefi.js b/source_clean/frontend/assets/SearchResult-EeENDml7.js similarity index 99% rename from source_clean/frontend/assets/SearchResult-DLXOMefi.js rename to source_clean/frontend/assets/SearchResult-EeENDml7.js index dd0075f..42bb1ec 100644 --- a/source_clean/frontend/assets/SearchResult-DLXOMefi.js +++ b/source_clean/frontend/assets/SearchResult-EeENDml7.js @@ -1,4 +1,4 @@ -import{d as ht,o as nn,m as qn,a as d,c as f,n as we,b as g,p as ut,t as m,k as Oe,e as R,F as $,r as oe,q as Gt,h as E,v as J,x as Qt,f as z,w as K,g as Xt,y as Me,l as G,z as Hn,j as le,s as Kn,A as On,i as xn,E as Re,u as Jn,B as Wn}from"./index-D279dJND.js";import{C as sn,a as Ae,b as on}from"./index-Bn7NwETH.js";import{_ as vt,b as Yn,s as jn,c as Gn,d as Qn,q as Xn,e as Zn,f as $n}from"./_plugin-vue_export-helper-1Z-znrfZ.js";var Ne={},es=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then},an={},se={};let pt;const ts=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];se.getSymbolSize=function(t){if(!t)throw new Error('"version" cannot be null or undefined');if(t<1||t>40)throw new Error('"version" should be in range from 1 to 40');return t*4+17};se.getSymbolTotalCodewords=function(t){return ts[t]};se.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t};se.setToSJISFunction=function(t){if(typeof t!="function")throw new Error('"toSJISFunc" is not a valid function.');pt=t};se.isKanjiModeEnabled=function(){return typeof pt<"u"};se.toSJIS=function(t){return pt(t)};var We={};(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(a){if(typeof a!="string")throw new Error("Param is not a string");switch(a.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+a)}}e.isValid=function(s){return s&&typeof s.bit<"u"&&s.bit>=0&&s.bit<4},e.from=function(s,n){if(e.isValid(s))return s;try{return t(s)}catch{return n}}})(We);function ln(){this.buffer=[],this.length=0}ln.prototype={get:function(e){const t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)===1},put:function(e,t){for(let a=0;a>>t-a-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(e){const t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}};var ns=ln;function Le(e){if(!e||e<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}Le.prototype.set=function(e,t,a,s){const n=e*this.size+t;this.data[n]=a,s&&(this.reservedBit[n]=!0)};Le.prototype.get=function(e,t){return this.data[e*this.size+t]};Le.prototype.xor=function(e,t,a){this.data[e*this.size+t]^=a};Le.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]};var ss=Le,rn={};(function(e){const t=se.getSymbolSize;e.getRowColCoords=function(s){if(s===1)return[];const n=Math.floor(s/7)+2,o=t(s),r=o===145?26:Math.ceil((o-13)/(2*n-2))*2,i=[o-7];for(let u=1;u=0&&n<=7},e.from=function(n){return e.isValid(n)?parseInt(n,10):void 0},e.getPenaltyN1=function(n){const o=n.size;let r=0,i=0,u=0,v=null,h=null;for(let D=0;D=5&&(r+=t.N1+(i-5)),v=y,i=1),y=n.get(T,D),y===h?u++:(u>=5&&(r+=t.N1+(u-5)),h=y,u=1)}i>=5&&(r+=t.N1+(i-5)),u>=5&&(r+=t.N1+(u-5))}return r},e.getPenaltyN2=function(n){const o=n.size;let r=0;for(let i=0;i=10&&(i===1488||i===93)&&r++,u=u<<1&2047|n.get(h,v),h>=10&&(u===1488||u===93)&&r++}return r*t.N3},e.getPenaltyN4=function(n){let o=0;const r=n.data.length;for(let u=0;u=0;){const r=o[0];for(let u=0;u0){const o=new Uint8Array(this.degree);return o.set(s,n),o}return s};var as=mt,gn={},ve={},yt={};yt.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40};var re={};const hn="[0-9]+",ls="[A-Z $%*+\\-./:]+";let Pe="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";Pe=Pe.replace(/u/g,"\\u");const rs="(?:(?![A-Z0-9 $%*+\\-./:]|"+Pe+`)(?:.|[\r +import{d as ht,o as nn,m as qn,a as d,c as f,n as we,b as g,p as ut,t as m,k as Oe,e as R,F as $,r as oe,q as Gt,h as E,v as J,x as Qt,f as z,w as K,g as Xt,y as Me,l as G,z as Hn,j as le,s as Kn,A as On,i as xn,E as Re,u as Jn,B as Wn}from"./index-D_srC3bj.js";import{C as sn,a as Ae,b as on}from"./index-Bn7NwETH.js";import{_ as vt,b as Yn,s as jn,c as Gn,d as Qn,q as Xn,e as Zn,f as $n}from"./_plugin-vue_export-helper-1Z-znrfZ.js";var Ne={},es=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then},an={},se={};let pt;const ts=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];se.getSymbolSize=function(t){if(!t)throw new Error('"version" cannot be null or undefined');if(t<1||t>40)throw new Error('"version" should be in range from 1 to 40');return t*4+17};se.getSymbolTotalCodewords=function(t){return ts[t]};se.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t};se.setToSJISFunction=function(t){if(typeof t!="function")throw new Error('"toSJISFunc" is not a valid function.');pt=t};se.isKanjiModeEnabled=function(){return typeof pt<"u"};se.toSJIS=function(t){return pt(t)};var We={};(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(a){if(typeof a!="string")throw new Error("Param is not a string");switch(a.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+a)}}e.isValid=function(s){return s&&typeof s.bit<"u"&&s.bit>=0&&s.bit<4},e.from=function(s,n){if(e.isValid(s))return s;try{return t(s)}catch{return n}}})(We);function ln(){this.buffer=[],this.length=0}ln.prototype={get:function(e){const t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)===1},put:function(e,t){for(let a=0;a>>t-a-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(e){const t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}};var ns=ln;function Le(e){if(!e||e<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}Le.prototype.set=function(e,t,a,s){const n=e*this.size+t;this.data[n]=a,s&&(this.reservedBit[n]=!0)};Le.prototype.get=function(e,t){return this.data[e*this.size+t]};Le.prototype.xor=function(e,t,a){this.data[e*this.size+t]^=a};Le.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]};var ss=Le,rn={};(function(e){const t=se.getSymbolSize;e.getRowColCoords=function(s){if(s===1)return[];const n=Math.floor(s/7)+2,o=t(s),r=o===145?26:Math.ceil((o-13)/(2*n-2))*2,i=[o-7];for(let u=1;u=0&&n<=7},e.from=function(n){return e.isValid(n)?parseInt(n,10):void 0},e.getPenaltyN1=function(n){const o=n.size;let r=0,i=0,u=0,v=null,h=null;for(let D=0;D=5&&(r+=t.N1+(i-5)),v=y,i=1),y=n.get(T,D),y===h?u++:(u>=5&&(r+=t.N1+(u-5)),h=y,u=1)}i>=5&&(r+=t.N1+(i-5)),u>=5&&(r+=t.N1+(u-5))}return r},e.getPenaltyN2=function(n){const o=n.size;let r=0;for(let i=0;i=10&&(i===1488||i===93)&&r++,u=u<<1&2047|n.get(h,v),h>=10&&(u===1488||u===93)&&r++}return r*t.N3},e.getPenaltyN4=function(n){let o=0;const r=n.data.length;for(let u=0;u=0;){const r=o[0];for(let u=0;u0){const o=new Uint8Array(this.degree);return o.set(s,n),o}return s};var as=mt,gn={},ve={},yt={};yt.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40};var re={};const hn="[0-9]+",ls="[A-Z $%*+\\-./:]+";let Pe="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";Pe=Pe.replace(/u/g,"\\u");const rs="(?:(?![A-Z0-9 $%*+\\-./:]|"+Pe+`)(?:.|[\r ]))+`;re.KANJI=new RegExp(Pe,"g");re.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g");re.BYTE=new RegExp(rs,"g");re.NUMERIC=new RegExp(hn,"g");re.ALPHANUMERIC=new RegExp(ls,"g");const is=new RegExp("^"+Pe+"$"),us=new RegExp("^"+hn+"$"),cs=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");re.testKanji=function(t){return is.test(t)};re.testNumeric=function(t){return us.test(t)};re.testAlphanumeric=function(t){return cs.test(t)};(function(e){const t=yt,a=re;e.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},e.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},e.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(o,r){if(!o.ccBits)throw new Error("Invalid mode: "+o);if(!t.isValid(r))throw new Error("Invalid version: "+r);return r>=1&&r<10?o.ccBits[0]:r<27?o.ccBits[1]:o.ccBits[2]},e.getBestModeForData=function(o){return a.testNumeric(o)?e.NUMERIC:a.testAlphanumeric(o)?e.ALPHANUMERIC:a.testKanji(o)?e.KANJI:e.BYTE},e.toString=function(o){if(o&&o.id)return o.id;throw new Error("Invalid mode")},e.isValid=function(o){return o&&o.bit&&o.ccBits};function s(n){if(typeof n!="string")throw new Error("Param is not a string");switch(n.toLowerCase()){case"numeric":return e.NUMERIC;case"alphanumeric":return e.ALPHANUMERIC;case"kanji":return e.KANJI;case"byte":return e.BYTE;default:throw new Error("Unknown mode: "+n)}}e.from=function(o,r){if(e.isValid(o))return o;try{return s(o)}catch{return r}}})(ve);(function(e){const t=se,a=Ye,s=We,n=ve,o=yt,r=7973,i=t.getBCHDigit(r);function u(T,y,M){for(let I=1;I<=40;I++)if(y<=e.getCapacity(I,M,T))return I}function v(T,y){return n.getCharCountIndicator(T,y)+4}function h(T,y){let M=0;return T.forEach(function(I){const F=v(I.mode,y);M+=F+I.getBitsLength()}),M}function D(T,y){for(let M=1;M<=40;M++)if(h(T,M)<=e.getCapacity(M,y,n.MIXED))return M}e.from=function(y,M){return o.isValid(y)?parseInt(y,10):M},e.getCapacity=function(y,M,I){if(!o.isValid(y))throw new Error("Invalid QR Code version");typeof I>"u"&&(I=n.BYTE);const F=t.getSymbolTotalCodewords(y),_=a.getTotalCodewordsCount(y,M),C=(F-_)*8;if(I===n.MIXED)return C;const w=C-v(I,y);switch(I){case n.NUMERIC:return Math.floor(w/10*3);case n.ALPHANUMERIC:return Math.floor(w/11*2);case n.KANJI:return Math.floor(w/13);case n.BYTE:default:return Math.floor(w/8)}},e.getBestVersionForData=function(y,M){let I;const F=s.from(M,s.M);if(Array.isArray(y)){if(y.length>1)return D(y,F);if(y.length===0)return 1;I=y[0]}else I=y;return u(I.mode,I.getLength(),F)},e.getEncodedBits=function(y){if(!o.isValid(y)||y<7)throw new Error("Invalid QR Code version");let M=y<<12;for(;t.getBCHDigit(M)-i>=0;)M^=r<=0;)n^=pn<0&&(s=this.data.substr(a),n=parseInt(s,10),t.put(n,o*3+1))};var gs=ke;const hs=ve,st=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function be(e){this.mode=hs.ALPHANUMERIC,this.data=e}be.getBitsLength=function(t){return 11*Math.floor(t/2)+6*(t%2)};be.prototype.getLength=function(){return this.data.length};be.prototype.getBitsLength=function(){return be.getBitsLength(this.data.length)};be.prototype.write=function(t){let a;for(a=0;a+2<=this.data.length;a+=2){let s=st.indexOf(this.data[a])*45;s+=st.indexOf(this.data[a+1]),t.put(s,11)}this.data.length%2&&t.put(st.indexOf(this.data[a]),6)};var vs=be;const ps=ve;function Ce(e){this.mode=ps.BYTE,typeof e=="string"?this.data=new TextEncoder().encode(e):this.data=new Uint8Array(e)}Ce.getBitsLength=function(t){return t*8};Ce.prototype.getLength=function(){return this.data.length};Ce.prototype.getBitsLength=function(){return Ce.getBitsLength(this.data.length)};Ce.prototype.write=function(e){for(let t=0,a=this.data.length;t=33088&&a<=40956)a-=33088;else if(a>=57408&&a<=60351)a-=49472;else throw new Error("Invalid SJIS character: "+this.data[t]+` Make sure your charset is UTF-8`);a=(a>>>8&255)*192+(a&255),e.put(a,13)}};var ws=Ee,yn={exports:{}};(function(e){var t={single_source_shortest_paths:function(a,s,n){var o={},r={};r[s]=0;var i=t.PriorityQueue.make();i.push(s,0);for(var u,v,h,D,T,y,M,I,F;!i.empty();){u=i.pop(),v=u.value,D=u.cost,T=a[v]||{};for(h in T)T.hasOwnProperty(h)&&(y=T[h],M=D+y,I=r[h],F=typeof r[h]>"u",(F||I>M)&&(r[h]=M,i.push(h,M),o[h]=v))}if(typeof n<"u"&&typeof r[n]>"u"){var _=["Could not find a path from ",s," to ",n,"."].join("");throw new Error(_)}return o},extract_shortest_path_from_predecessor_list:function(a,s){for(var n=[],o=s;o;)n.push(o),a[o],o=a[o];return n.reverse(),n},find_path:function(a,s,n){var o=t.single_source_shortest_paths(a,s,n);return t.extract_shortest_path_from_predecessor_list(o,n)},PriorityQueue:{make:function(a){var s=t.PriorityQueue,n={},o;a=a||{};for(o in s)s.hasOwnProperty(o)&&(n[o]=s[o]);return n.queue=[],n.sorter=a.sorter||s.default_sorter,n},default_sorter:function(a,s){return a.cost-s.cost},push:function(a,s){var n={value:a,cost:s};this.queue.push(n),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};e.exports=t})(yn);var ks=yn.exports;(function(e){const t=ve,a=gs,s=vs,n=ms,o=ws,r=re,i=se,u=ks;function v(_){return unescape(encodeURIComponent(_)).length}function h(_,C,w){const k=[];let L;for(;(L=_.exec(w))!==null;)k.push({data:L[0],index:L.index,mode:C,length:L[0].length});return k}function D(_){const C=h(r.NUMERIC,t.NUMERIC,_),w=h(r.ALPHANUMERIC,t.ALPHANUMERIC,_);let k,L;return i.isKanjiModeEnabled()?(k=h(r.BYTE,t.BYTE,_),L=h(r.KANJI,t.KANJI,_)):(k=h(r.BYTE_KANJI,t.BYTE,_),L=[]),C.concat(w,k,L).sort(function(V,b){return V.index-b.index}).map(function(V){return{data:V.data,mode:V.mode,length:V.length}})}function T(_,C){switch(C){case t.NUMERIC:return a.getBitsLength(_);case t.ALPHANUMERIC:return s.getBitsLength(_);case t.KANJI:return o.getBitsLength(_);case t.BYTE:return n.getBitsLength(_)}}function y(_){return _.reduce(function(C,w){const k=C.length-1>=0?C[C.length-1]:null;return k&&k.mode===w.mode?(C[C.length-1].data+=w.data,C):(C.push(w),C)},[])}function M(_){const C=[];for(let w=0;w<_.length;w++){const k=_[w];switch(k.mode){case t.NUMERIC:C.push([k,{data:k.data,mode:t.ALPHANUMERIC,length:k.length},{data:k.data,mode:t.BYTE,length:k.length}]);break;case t.ALPHANUMERIC:C.push([k,{data:k.data,mode:t.BYTE,length:k.length}]);break;case t.KANJI:C.push([k,{data:k.data,mode:t.BYTE,length:v(k.data)}]);break;case t.BYTE:C.push([{data:k.data,mode:t.BYTE,length:v(k.data)}])}}return C}function I(_,C){const w={},k={start:{}};let L=["start"];for(let B=0;B<_.length;B++){const V=_[B],b=[];for(let P=0;P=0&&i<=6&&(u===0||u===6)||u>=0&&u<=6&&(i===0||i===6)||i>=2&&i<=4&&u>=2&&u<=4?e.set(o+i,r+u,!0,!0):e.set(o+i,r+u,!1,!0))}}function As(e){const t=e.size;for(let a=8;a>i&1)===1,e.set(n,o,r,!0),e.set(o,n,r,!0)}function lt(e,t,a){const s=e.size,n=Bs.getEncodedBits(t,a);let o,r;for(o=0;o<15;o++)r=(n>>o&1)===1,o<6?e.set(o,8,r,!0):o<8?e.set(o+1,8,r,!0):e.set(s-15+o,8,r,!0),o<8?e.set(8,s-o-1,r,!0):o<9?e.set(8,15-o-1+1,r,!0):e.set(8,15-o-1,r,!0);e.set(s-8,8,1,!0)}function Ns(e,t){const a=e.size;let s=-1,n=a-1,o=7,r=0;for(let i=a-1;i>0;i-=2)for(i===6&&i--;;){for(let u=0;u<2;u++)if(!e.isReserved(n,i-u)){let v=!1;r>>o&1)===1),e.set(n,i-u,v),o--,o===-1&&(r++,o=7)}if(n+=s,n<0||a<=n){n-=s,s=-s;break}}}function Ls(e,t,a){const s=new bs;a.forEach(function(u){s.put(u.mode.bit,4),s.put(u.getLength(),Ms.getCharCountIndicator(u.mode,e)),u.write(s)});const n=Ge.getSymbolTotalCodewords(e),o=ft.getTotalCodewordsCount(e,t),r=(n-o)*8;for(s.getLengthInBits()+4<=r&&s.put(0,4);s.getLengthInBits()%8!==0;)s.putBit(0);const i=(r-s.getLengthInBits())/8;for(let u=0;uMe.section||He.query.section||""),xe=y(),pe=y([]),d=J({}),$=y([]),Y=y(""),E=y([]),Q=y(""),L=y([]),X=y(""),N=y([]),Z=y(""),ee=y(""),F=y([]),fe=y(!1),ce=y(!1),R=J({db_size:"-",save_records:0,search_stats:0,cloud_configs:0,content_cache:0,redis_status:"未连接"}),ke=y(!0),te=y(!1),se=y(!1),ae=y(!1),oe=y(!1),ne=y(!1),ie=y(!1),P=y(null),Ve=y(!0),de=y(!1),me=H({get:()=>String(d.search_proxy_enabled)==="true",set:t=>{d.search_proxy_enabled=t?"true":"false"}}),he=H({get:()=>String(d.pansou_web_enabled)==="true",set:t=>{d.pansou_web_enabled=t?"true":"false"}}),Se=H({get:()=>String(d.search_all_channels)==="true",set:t=>{d.search_all_channels=t?"true":"false"}}),Ce=H({get:()=>String(d.auto_update_enabled)==="true",set:t=>{d.auto_update_enabled=t?"true":"false"}}),h=J({enabled:!0,time:"08:00",includeSearch:!0,includeSaves:!0,includeStorage:!0,includeUsers:!0}),ve=y(!1),ye=y(!1),Ue=y(""),ge=y(!1),Pe=y("");async function Je(){try{const t=await fetch("/api/admin/daily-report/config",{headers:{Authorization:`Bearer ${localStorage.getItem("admin_token")}`}});if(t.ok){const e=await t.json();Object.assign(h,e)}}catch{}}async function Ye(){try{const t=await fetch("/api/admin/daily-report/last-run",{headers:{Authorization:`Bearer ${localStorage.getItem("admin_token")}`}});if(t.ok){const e=await t.json();e.date&&(Pe.value=`${e.date} ${new Date(e.sentAt).toLocaleTimeString("zh-CN")}`)}}catch{}}async function Qe(){try{await fetch("/api/admin/daily-report/config",{method:"PUT",headers:{"Content-Type":"application/json",Authorization:`Bearer ${localStorage.getItem("admin_token")}`},body:JSON.stringify({...h})})}catch{}}async function Xe(){ve.value=!0;try{const t=await fetch("/api/admin/daily-report/preview",{headers:{Authorization:`Bearer ${localStorage.getItem("admin_token")}`}});if(t.ok){const e=await t.json();Ue.value=e.content,ge.value=!0}}finally{ve.value=!1}}async function Ze(){ye.value=!0;try{(await fetch("/api/admin/daily-report/test",{method:"POST",headers:{Authorization:`Bearer ${localStorage.getItem("admin_token")}`}})).ok?u.success("测试报告已发送到全局通知通道"):u.error("发送失败")}catch{u.error("发送失败")}finally{ye.value=!1}}const ze=y([]),D=y({}),_e=y(!1),Te=y([]);async function el(){try{const t=await fetch("/api/admin/cloud-configs",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}});if(!t.ok)return;const e=await t.json(),a=Array.isArray(e)?[...new Set(e.map(n=>n.promotion_account||"").filter(Boolean))]:[];Te.value=a}catch{}}const m=J({id:null,account:"",channels:[],events:{on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}),ll=H(()=>{var e;const t={};for(const[a,n]of Object.entries(D.value))(e=v.channels[a])!=null&&e._enabled&&(t[a]=n);return t}),v=J({channels:{},events:{on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}});function tl(t){var e,a,n,x;if(t){m.id=t.id,m.account=t.account;const p=t.notify_config||{};m.channels=Object.keys(p.channels||{}),m.events={on_save_success:((e=p.events)==null?void 0:e.on_save_success)!==!1,on_save_fail:((a=p.events)==null?void 0:a.on_save_fail)!==!1,on_cookie_expire:((n=p.events)==null?void 0:n.on_cookie_expire)!==!1,on_cleanup:((x=p.events)==null?void 0:x.on_cleanup)===!0}}else m.id=null,m.account="",m.channels=[],m.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}function sl(){m.id=null,m.account="",m.channels=[],m.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}function re(t,e){return((t.notify_config||{}).events||{})[e]===!0}async function al(){if(!m.account){u.warning("请填写推广账号");return}_e.value=!0;try{const t={account:m.account,notify_config:{channels:{},events:m.events}},e={};for(const n of m.channels)e[n]={};t.notify_config.channels=e,m.id?await fetch("/api/admin/push-users/"+m.id,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")},body:JSON.stringify(t)}):await fetch("/api/admin/push-users",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")},body:JSON.stringify(t)});const a=!!m.id;m.id=null,m.account="",m.channels=[],m.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1},u.success(a?"推送用户已更新":"推送用户已添加"),await be()}catch(t){u.error(t.message||"保存失败")}finally{_e.value=!1}}async function be(){try{const t=await fetch("/api/admin/push-users",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}});t.ok&&(ze.value=await t.json())}catch(t){console.error("Failed to load push users",t)}}async function ol(){try{D.value=await Xl()}catch(t){console.error("Failed to load providers",t)}}async function nl(t){try{await fetch("/api/admin/push-users/"+t.id,{method:"DELETE",headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}}),u.success("已删除"),await be()}catch(e){u.error(e.message||"删除失败")}}function Ie(t){var a;return((a=t.notify_config)==null?void 0:a.channels)||{}}function il(t){var e;return((e=D.value[t])==null?void 0:e.label)||t}function dl(t){return Object.keys(Ie(t)).length>0}function rl(){const t={};for(const[e,a]of Object.entries(D.value)){t[e]={_enabled:!1,_testing:!1};for(const n of a.params||[])t[e][n.key]=n.default||""}v.channels=t,v.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}async function ul(){try{const a=(await(await fetch("/api/admin/system-configs",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}})).json()).find(n=>n.key==="global_notify_config");if(a&&a.value)try{const n=JSON.parse(a.value),x=n.channels||{};for(const[p,S]of Object.entries(x))if(v.channels[p]){v.channels[p]._enabled=!0;for(const[T,w]of Object.entries(S))v.channels[p][T]=w}n.events&&(v.events.on_save_success=n.events.on_save_success!==!1,v.events.on_save_fail=n.events.on_save_fail!==!1,v.events.on_cookie_expire=n.events.on_cookie_expire!==!1,v.events.on_cleanup=n.events.on_cleanup===!0)}catch{}}catch{}}async function pl(t){const e=v.channels[t];if(!(!e||!e._enabled)){e._testing=!0;try{const a=await et(t);a.success?u.success(a.message):u.error(a.message)}catch(a){u.error(a.message||"测试失败")}finally{e._testing=!1}}}const z=J({oldPassword:"",newPassword:"",confirmPassword:""}),fl={oldPassword:[{required:!0,message:"请输入原密码",trigger:"blur"}],newPassword:[{required:!0,message:"请输入新密码",trigger:"blur"},{min:6,message:"新密码至少需要6个字符",trigger:"blur"}],confirmPassword:[{required:!0,message:"请确认新密码",trigger:"blur"},{validator:(t,e,a)=>{e!==z.newPassword?a(new Error("两次输入的密码不一致")):a()},trigger:"blur"}]};Wl(async()=>{try{pe.value=await Yl();for(const p of pe.value)d[p.key]=p.value;const t=String(d.title_filter_rules||"");$.value=t.split(` +`).filter(p=>p.trim());const e=String(d.link_invalid_keywords||"");E.value=e.split(` +`).filter(p=>p.trim());const a=String(d.quark_ad_keywords||"");L.value=a.split(` +`).filter(p=>p.trim());const n=String(d.quark_warning_folder_names||"");N.value=n.split(` +`).filter(p=>p.trim());const x=String(d.quark_sus_extensions||"");F.value=x.split(` +`).filter(p=>p.trim())}catch{u.error("加载系统配置失败")}try{const t=await Ql();Object.assign(R,t)}catch{R.db_size="无法读取"}finally{ke.value=!1}we(),await ol(),rl(),await ul(),be(),Je(),Ye(),el()}),Kl(D,()=>{for(const[t,e]of Object.entries(D.value))if(!v.channels[t]){v.channels[t]={_enabled:!1,_testing:!1};for(const a of e.params||[])v.channels[t][a.key]=a.default||""}});async function cl(){var e,a;const t=String(d.redis_url||"redis://redis:6379");te.value=!0;try{const n=await lt(t);n.ok?u.success(`✅ Redis 连接成功 — ${n.info}`):u.error(`❌ Redis 连接失败 — ${n.info}`)}catch(n){u.error(((a=(e=n.response)==null?void 0:e.data)==null?void 0:a.error)||"测试请求失败")}finally{te.value=!1}}async function we(){Ve.value=!0;try{const t=localStorage.getItem("admin_token"),e={};t&&(e.Authorization="Bearer "+t);const a=await fetch("/api/admin/pansou-info",{headers:e});if(!a.ok)throw new Error("HTTP "+a.status);const n=await a.json();P.value=n}catch{P.value={status:"disconnected",version:"-",channelCount:0,pluginCount:0,diskCount:0}}finally{Ve.value=!1}}async function ml(){de.value=!0;try{const t=localStorage.getItem("admin_token"),e={"Content-Type":"application/json"};t&&(e.Authorization="Bearer "+t);const n=await(await fetch("/api/admin/update-pansou",{method:"POST",headers:e})).json();n.ok?(u.success("✅ PanSou 已更新并重启"),setTimeout(()=>we(),3e3)):u.error("❌ 更新失败 — "+(n.error||"未知错误"))}catch(t){u.error(t.message||"更新请求失败")}finally{de.value=!1}}async function vl(){var t,e;se.value=!0;try{const a=await le({type:"pansou",url:String(d.pansou_url||"")});a.ok?(we(),u.success(`✅ PanSou 连接成功 — ${a.info}`)):u.error(`❌ PanSou 连接失败 — ${a.info}`)}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{se.value=!1}}async function yl(){var t,e;ae.value=!0;try{const a=await le({type:"video_parser",url:String(d.video_parser_url||"")});a.ok?u.success(`✅ 视频解析服务连接成功 — ${a.info}`):u.error(`❌ 视频解析服务连接失败 — ${a.info}`)}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{ae.value=!1}}async function gl(){var t,e;oe.value=!0;try{const a=await le({type:"tmdb",token:String(d.tmdb_api_token||"")});a.ok?u.success(`✅ TMDB 令牌有效 — ${a.info}`):u.error(`❌ TMDB 连接失败 — ${a.info}`)}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{oe.value=!1}}async function _l(){var t,e;ne.value=!0;try{const a=await le({type:"proxy",url:String(d.search_proxy_url||"")});a.ok?u.success(`✅ 搜索代理可用 — ${a.info}`):u.error(`❌ 搜索代理不可用 — ${a.info}`)}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{ne.value=!1}}async function bl(){var t,e;ie.value=!0;try{const a=String(d.ip_geo_api_url||"");if(!a){u.warning("请先输入 IP 归属地查询 API 地址");return}const n=await le({type:"ip_geo",url:a});n.ok?u.success("✅ IP 归属地接口可用 — "+n.info):u.error("❌ IP 归属地接口不可用 — "+n.info)}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{ie.value=!1}}function wl(){const t=Y.value.trim();if(!t)return;const e=t.split(` +`).map(n=>n.trim()).filter(n=>n);let a=0;for(const n of e)$.value.includes(n)||($.value.push(n),a++);Y.value="",je(),a>0?u.success(`已添加 ${a} 条规则`):u.info("所有规则已存在")}function xl(t){$.value.splice(t,1),je()}function kl(t){return t.startsWith("#")?"info":t.startsWith("/")&&(t.endsWith("/")||t.endsWith("/g")||t.endsWith("/i")||t.endsWith("/gi"))?"warning":""}function je(){d.title_filter_rules=$.value.join(` +`)}function Vl(){const t=Q.value.trim();if(!t)return;const e=t.split(` +`).map(n=>n.trim()).filter(n=>n);let a=0;for(const n of e)E.value.includes(n)||(E.value.push(n),a++);Q.value="",Ae(),a>0?u.success(`已添加 ${a} 个关键词`):u.info("所有关键词已存在")}function hl(t){E.value.splice(t,1),Ae()}function Ae(){d.link_invalid_keywords=E.value.join(` +`)}function Sl(){const t=X.value.trim();if(!t)return;const e=t.split(` +`).map(n=>n.trim()).filter(n=>n);let a=0;for(const n of e)L.value.includes(n)||(L.value.push(n),a++);X.value="",Oe(),a>0?u.success():u.info("所有关键词已存在")}function Cl(t){L.value.splice(t,1),Oe()}function Oe(){d.quark_ad_keywords=L.value.join(` +`)}function Ul(){const t=Z.value.trim();if(!t)return;const e=t.split(` +`).map(n=>n.trim()).filter(n=>n);let a=0;for(const n of e)N.value.includes(n)||(N.value.push(n),a++);Z.value="",Re(),a>0?u.success():u.info("所有文件夹名已存在")}function Pl(t){N.value.splice(t,1),Re()}function Re(){d.quark_warning_folder_names=N.value.join(` +`)}function zl(){const t=ee.value.trim();if(!t)return;const e=t.split(` +`).map(n=>n.trim().toLowerCase().replace(/^\./,"")).filter(n=>n);let a=0;for(const n of e)F.value.includes(n)||(F.value.push(n),a++);ee.value="",Be(),a>0?u.success("已添加 ${added} 个后缀"):u.info("所有后缀已存在")}function Tl(t){F.value.splice(t,1),Be()}function Be(){d.quark_sus_extensions=F.value.join(` +`)}async function Il(){var t,e;fe.value=!0;try{const a={};for(const[x,p]of Object.entries(v.channels))if(p._enabled){const S={};for(const[T,w]of Object.entries(p))!T.startsWith("_")&&w!==""&&(S[T]=String(w));Object.keys(S).length>0&&(a[x]=S)}const n=pe.value.map(x=>({key:x.key,value:String(d[x.key]??x.value)}));await Qe(),n.push({key:"global_notify_config",value:JSON.stringify({channels:a,events:v.events})}),await Zl(n),u.success("配置已保存")}catch(a){u.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"保存失败")}finally{fe.value=!1}}async function jl(){var e,a,n;if(await((e=xe.value)==null?void 0:e.validate().catch(()=>!1))){ce.value=!0;try{const x=await tt(z.oldPassword,z.newPassword);x.success?(u.success("✅ 密码修改成功,下次登录请使用新密码"),z.oldPassword="",z.newPassword="",z.confirmPassword=""):u.error(x.message)}catch(x){u.error(((n=(a=x.response)==null?void 0:a.data)==null?void 0:n.error)||"密码修改失败")}finally{ce.value=!1}}}const $e=y();function Al(){var t;(t=$e.value)==null||t.click()}async function Ol(t){var n,x,p;const e=t.target,a=(n=e.files)==null?void 0:n[0];if(a){if(!a.type.startsWith("image/")){u.error("仅支持图片文件(JPEG/PNG/WebP)"),e.value="";return}if(a.size>2*1024*1024){u.error("图片大小不能超过 2MB"),e.value="";return}try{const S=await st(a);S.success?(d.site_logo=S.url,u.success("✅ LOGO 已上传并生效")):u.error(S.message)}catch(S){u.error(((p=(x=S.response)==null?void 0:x.data)==null?void 0:p.error)||"上传失败")}e.value=""}}async function Rl(){try{d.site_logo="",await at("site_logo",""),u.success("已移除 LOGO")}catch{u.error("移除失败")}}return(t,e)=>{const a=k("el-input"),n=k("el-form-item"),x=k("el-icon"),p=k("el-button"),S=k("el-form"),T=k("el-card"),w=k("el-switch"),B=k("el-divider"),Ee=k("el-radio"),Bl=k("el-radio-group"),M=k("el-input-number"),I=k("el-tag"),$l=k("el-collapse-item"),El=k("el-collapse"),Le=k("el-option"),Ne=k("el-select"),G=k("el-table-column"),Ll=k("el-popconfirm"),Nl=k("el-table"),Fl=k("el-time-picker"),Dl=k("el-dialog");return f(),g("div",nt,[W(s(T,{id:"section-sys-site"},{header:i(()=>[...e[47]||(e[47]=[l("span",null,"🌐 网站设置",-1)])]),default:i(()=>[s(S,{"label-width":"180px","label-position":"left"},{default:i(()=>[s(n,{label:"网站名称"},{default:i(()=>[s(a,{modelValue:d.site_name,"onUpdate:modelValue":e[0]||(e[0]=o=>d.site_name=o),placeholder:"CloudSearch",style:{"max-width":"300px"}},null,8,["modelValue"]),e[48]||(e[48]=l("div",{class:"form-tip"},"显示在网站标题和页脚",-1))]),_:1}),s(n,{label:"网站 LOGO"},{default:i(()=>[l("div",it,[l("div",dt,[s(p,{type:"primary",onClick:Al},{icon:i(()=>[s(x,null,{default:i(()=>[s(We(ql))]),_:1})]),default:i(()=>[e[49]||(e[49]=r(" 选择LOGO图片并上传 ",-1))]),_:1}),l("input",{ref_key:"logoInputRef",ref:$e,type:"file",accept:".jpg,.jpeg,.png,.webp",hidden:"",onChange:Ol},null,544),e[50]||(e[50]=l("div",{class:"form-tip",style:{"margin-left":"12px"}},[r(" 推荐 "),l("strong",null,"320×60"),r(" 或宽比例(如 4:1),JPEG/PNG/WebP,最大 2MB。"),l("br"),r(" LOGO 同时也作为搜索结果无封面图时的兜底图使用。 ")],-1))]),d.site_logo?(f(),g("div",rt,[l("img",{src:String(d.site_logo),alt:"LOGO预览",onError:e[1]||(e[1]=o=>o.target.style.display="none")},null,40,ut),s(p,{size:"small",type:"danger",plain:"",onClick:Rl},{default:i(()=>[...e[51]||(e[51]=[r("移除",-1)])]),_:1})])):q("",!0)])]),_:1}),s(n,{label:"底部免责声明"},{default:i(()=>[s(a,{modelValue:d.site_disclaimer,"onUpdate:modelValue":e[2]||(e[2]=o=>d.site_disclaimer=o),type:"textarea",rows:4,placeholder:"输入免责声明内容"},null,8,["modelValue"]),e[52]||(e[52]=l("div",{class:"form-tip"},"显示在网站底部,留空则不显示",-1))]),_:1}),s(n,{label:"滚动通知文字"},{default:i(()=>[s(a,{modelValue:d.site_marquee,"onUpdate:modelValue":e[3]||(e[3]=o=>d.site_marquee=o),placeholder:"📢 欢迎使用CloudSearch",style:{"max-width":"500px"}},null,8,["modelValue"]),e[53]||(e[53]=l("div",{class:"form-tip"},"搜索栏下方滚动的通知条(从右往左滚动),留空则不显示",-1))]),_:1}),s(n,{label:"系统时区"},{default:i(()=>[s(a,{modelValue:d.timezone,"onUpdate:modelValue":e[4]||(e[4]=o=>d.timezone=o),placeholder:"Asia/Shanghai",style:{"max-width":"300px"}},null,8,["modelValue"]),e[54]||(e[54]=l("div",{class:"form-tip"},"例如 Asia/Shanghai、America/New_York、UTC,修改后保存配置即可生效",-1))]),_:1})]),_:1})]),_:1},512),[[K,!U.value||U.value==="sys-site"]]),W(s(T,{id:"section-sys-services"},{header:i(()=>[...e[55]||(e[55]=[l("span",null,"🔗 外部服务 & 缓存",-1)])]),default:i(()=>[s(S,{"label-width":"180px","label-position":"left"},{default:i(()=>{var o,c,_,j,Fe,De;return[s(n,{label:"PanSou 搜索引擎地址"},{default:i(()=>{var C,Ge;return[l("div",pt,[s(a,{modelValue:d.pansou_url,"onUpdate:modelValue":e[5]||(e[5]=ue=>d.pansou_url=ue),placeholder:"http://pansou:8888",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",loading:se.value,onClick:vl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(se.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"]),s(p,{type:"warning",loading:de.value,onClick:ml,size:"default",style:{width:"130px"},disabled:!((C=P.value)!=null&&C.hasUpdate)},{default:i(()=>{var ue;return[r(b(de.value?"更新中...":(ue=P.value)!=null&&ue.hasUpdate?"🔄 有新版本":"无更新"),1)]}),_:1},8,["loading","disabled"]),(Ge=P.value)!=null&&Ge.latestVersion?(f(),g("span",ft,b(P.value.latestVersion),1)):q("",!0)]),e[56]||(e[56]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"盘搜搜索引擎的地址",-1))]}),_:1}),l("div",ct,[l("div",mt,[l("div",{class:Ke(["db-stat-value",((o=P.value)==null?void 0:o.status)==="connected"?"text-success":"text-warning"])},b(((c=P.value)==null?void 0:c.status)==="connected"?"已连接":P.value?"未连接":"-"),3),e[57]||(e[57]=l("div",{class:"db-stat-label"},"PanSou 状态",-1))]),l("div",vt,[l("div",yt,b(((_=P.value)==null?void 0:_.channelCount)??"-"),1),e[58]||(e[58]=l("div",{class:"db-stat-label"},"频道数量",-1))]),l("div",gt,[l("div",_t,b(((j=P.value)==null?void 0:j.pluginCount)??"-"),1),e[59]||(e[59]=l("div",{class:"db-stat-label"},"插件数量",-1))]),l("div",bt,[l("div",wt,b(((Fe=P.value)==null?void 0:Fe.diskCount)??"-"),1),e[60]||(e[60]=l("div",{class:"db-stat-label"},"网盘数量",-1))]),l("div",xt,[l("div",kt,b(((De=P.value)==null?void 0:De.version)||"-"),1),e[61]||(e[61]=l("div",{class:"db-stat-label"},"版本",-1))])]),s(n,{label:"PanSou Web 端访问"},{default:i(()=>[s(w,{modelValue:he.value,"onUpdate:modelValue":e[6]||(e[6]=C=>he.value=C),"active-text":"启用","inactive-text":"关闭"},null,8,["modelValue"]),e[62]||(e[62]=l("div",{class:"form-tip",style:{"margin-left":"12px"}},[r(" 开启后可通过 "),l("code",null,"/pansou/"),r(" 路径访问 PanSou 搜索引擎管理界面 ")],-1))]),_:1}),s(n,{label:"启用代理"},{default:i(()=>[s(w,{modelValue:me.value,"onUpdate:modelValue":e[7]||(e[7]=C=>me.value=C),"active-text":"启用","inactive-text":"关闭"},null,8,["modelValue"]),e[63]||(e[63]=l("div",{class:"form-tip",style:{"margin-left":"8px"}}," 仅 PanSou 需要此配置,开启后搜索请求将经过代理转发 ",-1))]),_:1}),me.value?(f(),V(n,{key:0,label:"代理地址",style:{"margin-top":"-12px"}},{default:i(()=>[l("div",Vt,[s(a,{modelValue:d.search_proxy_url,"onUpdate:modelValue":e[8]||(e[8]=C=>d.search_proxy_url=C),placeholder:"http://127.0.0.1:7890",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",loading:ne.value,onClick:_l,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(ne.value?"测试中...":"测试代理"),1)]),_:1},8,["loading"])]),e[64]||(e[64]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"HTTP 或 SOCKS5 协议地址",-1))]),_:1})):q("",!0),s(n,{label:"视频解析服务地址"},{default:i(()=>[l("div",ht,[s(a,{modelValue:d.video_parser_url,"onUpdate:modelValue":e[9]||(e[9]=C=>d.video_parser_url=C),placeholder:"http://video-parser:3001",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",loading:ae.value,onClick:yl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(ae.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"])]),e[65]||(e[65]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"视频链接解析服务地址",-1))]),_:1}),s(n,{label:"TMDB 读取令牌"},{default:i(()=>[l("div",St,[s(a,{modelValue:d.tmdb_api_token,"onUpdate:modelValue":e[10]||(e[10]=C=>d.tmdb_api_token=C),type:"password","show-password":"",placeholder:"输入 TMDB API 读取令牌(Bearer Token)",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",loading:oe.value,onClick:gl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(oe.value?"测试中...":"验证令牌"),1)]),_:1},8,["loading"])]),e[66]||(e[66]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" 用于搜索 TMDB 获取评分、导演、演员等完整内容信息。 "),l("a",{href:"https://www.themoviedb.org/settings/api",target:"_blank",rel:"noopener",style:{color:"var(--primary-color)"}},"获取令牌 →")],-1))]),_:1}),s(n,{label:"IP 归属地查询"},{default:i(()=>[l("div",Ct,[s(a,{modelValue:d.ip_geo_api_url,"onUpdate:modelValue":e[11]||(e[11]=C=>d.ip_geo_api_url=C),placeholder:"https://cn.apihz.cn/api/ip/chaapi.php?id=xxx&key=***&ip={ip}&td=0",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",loading:ie.value,onClick:bl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(ie.value?"测试中...":"验证接口"),1)]),_:1},8,["loading"])]),e[67]||(e[67]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" IP 归属地查询 API 地址,"),l("code",null,"{ip}"),r(" 会被替换为实际 IP。 ")],-1)),e[68]||(e[68]=l("div",{style:{color:"var(--el-color-warning)","font-size":"13px","margin-top":"2px",width:"100%"}}," ⚠ 当前仅支持 接口盒子(apihz.cn) 格式 ",-1))]),_:1}),s(B,{"content-position":"left"},{default:i(()=>[...e[69]||(e[69]=[r("Redis 缓存",-1)])]),_:1}),s(n,{label:"Redis 连接地址"},{default:i(()=>[l("div",Ut,[s(a,{modelValue:d.redis_url,"onUpdate:modelValue":e[12]||(e[12]=C=>d.redis_url=C),placeholder:"redis://:***@172.17.0.1:6379",style:{"max-width":"360px"}},null,8,["modelValue"]),s(p,{type:"primary",size:"default",loading:te.value,onClick:cl,style:{width:"100px"}},{default:i(()=>[r(b(te.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"])]),e[70]||(e[70]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" Redis 用于缓存搜索验证结果,提升响应速度。"),l("br"),l("strong",null,"带密码格式:"),l("code",null,"redis://:你的密码@地址:6379"),l("br"),r(" 修改后保存配置即可生效,无需重启。"),l("strong",null,"切换 Redis 只会清空缓存,不影响任何重要数据。")],-1))]),_:1})]}),_:1}),ke.value?(f(),g("div",Pt,[s(x,{class:"is-loading",size:20},{default:i(()=>[s(We(Ml))]),_:1}),e[71]||(e[71]=l("span",{style:{"margin-left":"8px",color:"#909399"}},"加载中...",-1))])):(f(),g("div",zt,[l("div",Tt,[l("div",{class:Ke(["db-stat-value",R.redis_status==="已连接"?"text-success":"text-warning"])},b(R.redis_status),3),e[72]||(e[72]=l("div",{class:"db-stat-label"},"Redis 状态",-1))]),l("div",It,[l("div",jt,b(R.db_size),1),e[73]||(e[73]=l("div",{class:"db-stat-label"},"数据库大小",-1))]),l("div",At,[l("div",Ot,b(R.save_records),1),e[74]||(e[74]=l("div",{class:"db-stat-label"},"转存记录",-1))]),l("div",Rt,[l("div",Bt,b(R.search_stats),1),e[75]||(e[75]=l("div",{class:"db-stat-label"},"搜索记录",-1))]),l("div",$t,[l("div",Et,b(R.cloud_configs),1),e[76]||(e[76]=l("div",{class:"db-stat-label"},"网盘配置",-1))]),l("div",Lt,[l("div",Nt,b(R.content_cache),1),e[77]||(e[77]=l("div",{class:"db-stat-label"},"内容缓存",-1))])]))]),_:1},512),[[K,!U.value||U.value==="sys-services"]]),W(s(T,{id:"section-sys-strategy"},{header:i(()=>[...e[78]||(e[78]=[l("span",null,"🔧 性能配置",-1)])]),default:i(()=>[l("div",Ft,[s(B,{"content-position":"left"},{default:i(()=>[...e[79]||(e[79]=[r("搜索结果返回方式",-1)])]),_:1}),l("div",Dt,[l("div",Gt,[e[80]||(e[80]=l("span",{class:"field-label"},"开启资源链接有效性监测",-1)),s(w,{modelValue:d.link_validation_enabled,"onUpdate:modelValue":e[13]||(e[13]=o=>d.link_validation_enabled=o),"active-value":"true","inactive-value":"false","active-text":"开启","inactive-text":"关闭"},null,8,["modelValue"])]),e[81]||(e[81]=l("div",{class:"field-desc"},"开启后搜索时会自动检测链接是否有效,过滤失效链接。关闭则直接返回所有结果(更快)",-1))]),l("div",Wt,[l("div",Kt,[e[84]||(e[84]=l("span",{class:"field-label"},"搜索结果方式",-1)),s(Bl,{modelValue:d.search_strategy,"onUpdate:modelValue":e[14]||(e[14]=o=>d.search_strategy=o)},{default:i(()=>[s(Ee,{value:"wait_all"},{default:i(()=>[...e[82]||(e[82]=[r("等待全部结果后展示",-1)])]),_:1}),s(Ee,{value:"stream_channel"},{default:i(()=>[...e[83]||(e[83]=[r("频道结果逐步展示",-1)])]),_:1})]),_:1},8,["modelValue"])]),e[85]||(e[85]=l("div",{class:"field-desc"},"逐步展示会分频道并发请求并优先展示先返回的频道;该模式下频道顺序按返回先后,不按配置顺序。",-1))]),s(B,{"content-position":"left"},{default:i(()=>[...e[86]||(e[86]=[r("搜索策略",-1)])]),_:1}),l("div",qt,[l("div",Mt,[l("div",Ht,[e[87]||(e[87]=l("span",{class:"field-label"},"使用所有频道参与搜索",-1)),s(w,{modelValue:Se.value,"onUpdate:modelValue":e[15]||(e[15]=o=>Se.value=o),"active-text":"开启","inactive-text":"关闭"},null,8,["modelValue"])]),e[88]||(e[88]=l("div",{class:"field-desc"},"包含未启用频道,命中更广但请求压力更高。",-1))]),l("div",Jt,[l("div",Yt,[e[89]||(e[89]=l("span",{class:"field-label"},"每类网盘有效结果数",-1)),s(M,{modelValue:d.search_result_limit,"onUpdate:modelValue":e[16]||(e[16]=o=>d.search_result_limit=o),min:1,max:100},null,8,["modelValue"])]),e[90]||(e[90]=l("div",{class:"field-desc"},"每个网盘类型最多展示的有效链接数量",-1))]),l("div",Qt,[l("div",Xt,[e[91]||(e[91]=l("span",{class:"field-label"},"验证并发数",-1)),s(M,{modelValue:d.validation_concurrency,"onUpdate:modelValue":e[17]||(e[17]=o=>d.validation_concurrency=o),min:1,max:50},null,8,["modelValue"])]),e[92]||(e[92]=l("div",{class:"field-desc"},"同时验证的链接数量",-1))]),l("div",Zt,[l("div",es,[e[93]||(e[93]=l("span",{class:"field-label"},"有效链接缓存 (s)",-1)),s(M,{modelValue:d.validation_cache_ttl_valid,"onUpdate:modelValue":e[18]||(e[18]=o=>d.validation_cache_ttl_valid=o),min:60,max:86400,step:60},null,8,["modelValue"])]),e[94]||(e[94]=l("div",{class:"field-desc"},"有效验证结果的缓存时间",-1))]),l("div",ls,[l("div",ts,[e[95]||(e[95]=l("span",{class:"field-label"},"无效链接缓存 (s)",-1)),s(M,{modelValue:d.validation_cache_ttl_invalid,"onUpdate:modelValue":e[19]||(e[19]=o=>d.validation_cache_ttl_invalid=o),min:60,max:86400,step:60},null,8,["modelValue"])]),e[96]||(e[96]=l("div",{class:"field-desc"},"无效验证结果的缓存时间",-1))]),l("div",ss,[l("div",as,[e[97]||(e[97]=l("span",{class:"field-label"},"验证超时 (ms)",-1)),s(M,{modelValue:d.validation_timeout,"onUpdate:modelValue":e[20]||(e[20]=o=>d.validation_timeout=o),min:1e3,max:3e4,step:500},null,8,["modelValue"])]),e[98]||(e[98]=l("div",{class:"field-desc"},"单个链接验证超时毫秒数",-1))])]),s(B,{"content-position":"left"},{default:i(()=>[...e[99]||(e[99]=[r("链接检测配置",-1)])]),_:1}),l("div",os,[e[101]||(e[101]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"搜索标题过滤规则")],-1)),l("div",ns,[s(a,{modelValue:Y.value,"onUpdate:modelValue":e[21]||(e[21]=o=>Y.value=o),type:"textarea",rows:1,placeholder:"每行一条规则,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),s(p,{type:"primary",onClick:wl,disabled:!Y.value.trim()},{default:i(()=>[...e[100]||(e[100]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),$.value.length>0?(f(),g("div",is,[(f(!0),g(A,null,O($.value,(o,c)=>(f(),V(I,{key:c,closable:"",type:kl(o),"disable-transitions":!1,onClose:_=>xl(c)},{default:i(()=>[r(b(o),1)]),_:2},1032,["type","onClose"]))),128))])):(f(),g("div",ds,"暂无过滤规则")),e[102]||(e[102]=l("div",{class:"filter-rule-help"},[l("div",{class:"help-title"},"📖 规则说明"),l("div",{class:"help-row"},[l("code",null,"# 注释内容"),r(" — "),l("code",null,"#"),r(" 后必须跟"),l("strong",null,"空格"),r("才会被识别为注释,单纯的 "),l("code",null,"#动漫"),r(" 会被当作要移除的文本")]),l("div",{class:"help-row"},[l("code",null,"/正则表达式/标志"),r(" — 正则匹配,匹配到的内容会被删除。如 "),l("code",null,"/^\\\\d+[、,.\\\\s]/"),r(" 去掉开头的序号")]),l("div",{class:"help-row"},[l("code",null,"纯文本"),r(" — 直接写要移除的文字(支持 emoji),凡是标题中含有的都会被删除")])],-1))]),l("div",rs,[e[104]||(e[104]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"失效关键词")],-1)),l("div",us,[s(a,{modelValue:Q.value,"onUpdate:modelValue":e[22]||(e[22]=o=>Q.value=o),type:"textarea",rows:1,placeholder:"每行一个关键词,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),s(p,{type:"danger",onClick:Vl,disabled:!Q.value.trim()},{default:i(()=>[...e[103]||(e[103]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[105]||(e[105]=l("div",{class:"field-desc"},"自定义失效关键词,PanSou 检测 summary 或 HTML 页面内容包含即判为失效。",-1)),E.value.length>0?(f(),g("div",ps,[(f(!0),g(A,null,O(E.value,(o,c)=>(f(),V(I,{key:c,closable:"",type:"danger","disable-transitions":!1,onClose:_=>hl(c)},{default:i(()=>[r(b(o),1)]),_:2},1032,["onClose"]))),128))])):(f(),g("div",fs,"暂无失效关键词,所有链接将默认判为有效"))]),s(B,{"content-position":"left"},{default:i(()=>[...e[106]||(e[106]=[r("夸克网盘转存清理",-1)])]),_:1}),l("div",cs,[e[108]||(e[108]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"广告关键词")],-1)),l("div",ms,[s(a,{modelValue:X.value,"onUpdate:modelValue":e[23]||(e[23]=o=>X.value=o),type:"textarea",rows:1,placeholder:"每行一个关键词,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),s(p,{type:"danger",onClick:Sl,disabled:!X.value.trim()},{default:i(()=>[...e[107]||(e[107]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[109]||(e[109]=l("div",{class:"field-desc"},"夸克转存完成后自动删除文件名/文件夹名含这些关键词的内容(防广告病毒)",-1)),L.value.length>0?(f(),g("div",vs,[(f(!0),g(A,null,O(L.value,(o,c)=>(f(),V(I,{key:c,closable:"",type:"warning","disable-transitions":!1,onClose:_=>Cl(c)},{default:i(()=>[r(b(o),1)]),_:2},1032,["onClose"]))),128))])):(f(),g("div",ys,"暂未配置广告关键词,不会进行广告清理"))]),l("div",gs,[e[111]||(e[111]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"警示文件夹名")],-1)),l("div",_s,[s(a,{modelValue:Z.value,"onUpdate:modelValue":e[24]||(e[24]=o=>Z.value=o),type:"textarea",rows:1,placeholder:"每行一个文件夹名,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),s(p,{type:"primary",onClick:Ul,disabled:!Z.value.trim()},{default:i(()=>[...e[110]||(e[110]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[112]||(e[112]=l("div",{class:"field-desc"},"夸克转存完成后在网盘根目录自动创建这些警示文件夹(自动加上 ⚠️ 前缀)",-1)),N.value.length>0?(f(),g("div",bs,[(f(!0),g(A,null,O(N.value,(o,c)=>(f(),V(I,{key:c,closable:"",type:"info","disable-transitions":!1,onClose:_=>Pl(c)},{default:i(()=>[r(b(o),1)]),_:2},1032,["onClose"]))),128))])):(f(),g("div",ws,"暂未配置警示文件夹"))]),l("div",xs,[e[114]||(e[114]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"可疑文件后缀")],-1)),l("div",ks,[s(a,{modelValue:ee.value,"onUpdate:modelValue":e[25]||(e[25]=o=>ee.value=o),type:"textarea",rows:1,placeholder:"每行一个后缀,不要带点号,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),s(p,{type:"danger",onClick:zl,disabled:!ee.value.trim()},{default:i(()=>[...e[113]||(e[113]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[115]||(e[115]=l("div",{class:"field-desc"},"夸克转存完成后自动删除后缀匹配的文件(防病毒,如 bat、exe、scr 等)",-1)),F.value.length>0?(f(),g("div",Vs,[(f(!0),g(A,null,O(F.value,(o,c)=>(f(),V(I,{key:c,closable:"",type:"danger","disable-transitions":!1,onClose:_=>Tl(c)},{default:i(()=>[r("."+b(o),1)]),_:2},1032,["onClose"]))),128))])):(f(),g("div",hs,"暂无配置,使用默认列表:bat、exe、vbs、scr、cmd、com、pif、js、jar、msi、reg、inf、ps1"))])])]),_:1},512),[[K,!U.value||U.value==="sys-strategy"]]),W(s(T,{id:"section-sys-password"},{header:i(()=>[...e[116]||(e[116]=[l("span",null,"🔑 修改管理员密码",-1)])]),default:i(()=>[s(S,{ref_key:"passwordFormRef",ref:xe,model:z,rules:fl,"label-width":"120px","label-position":"left"},{default:i(()=>[s(n,{label:"原密码",prop:"oldPassword"},{default:i(()=>[s(a,{modelValue:z.oldPassword,"onUpdate:modelValue":e[26]||(e[26]=o=>z.oldPassword=o),type:"password","show-password":"",placeholder:"输入原密码",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),s(n,{label:"新密码",prop:"newPassword"},{default:i(()=>[s(a,{modelValue:z.newPassword,"onUpdate:modelValue":e[27]||(e[27]=o=>z.newPassword=o),type:"password","show-password":"",placeholder:"输入新密码(至少6位)",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),s(n,{label:"确认新密码",prop:"confirmPassword"},{default:i(()=>[s(a,{modelValue:z.confirmPassword,"onUpdate:modelValue":e[28]||(e[28]=o=>z.confirmPassword=o),type:"password","show-password":"",placeholder:"再次输入新密码",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),s(n,null,{default:i(()=>[s(p,{type:"primary",loading:ce.value,onClick:jl},{default:i(()=>[...e[117]||(e[117]=[r("修改密码",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),_:1},512),[[K,!U.value||U.value==="sys-password"]]),W(s(T,{id:"section-sys-notify"},{header:i(()=>[...e[118]||(e[118]=[l("div",{style:{display:"flex","align-items":"center","justify-content":"space-between"}},[l("span",null,"📬 消息推送")],-1)])]),default:i(()=>[s(El,{"model-value":["global"]},{default:i(()=>[s($l,{title:"全局推送(管理员兜底)",name:"global"},{default:i(()=>[l("div",Ss,[s(S,{"label-width":"140px","label-position":"left"},{default:i(()=>[l("div",Cs,[(f(!0),g(A,null,O(D.value,(o,c)=>(f(),g("div",{key:c,style:{border:"1px solid var(--el-border-color-light)","border-radius":"6px",padding:"8px 12px"}},[l("div",Us,[s(w,{modelValue:v.channels[c]._enabled,"onUpdate:modelValue":_=>v.channels[c]._enabled=_,size:"small"},null,8,["modelValue","onUpdate:modelValue"]),l("strong",null,b(o.label),1),v.channels[c]._enabled?(f(),V(p,{key:0,size:"small",text:"",type:"primary",onClick:_=>pl(c),loading:v.channels[c]._testing},{default:i(()=>[...e[119]||(e[119]=[r("测试",-1)])]),_:1},8,["onClick","loading"])):q("",!0)]),v.channels[c]._enabled?(f(),g("div",Ps,[(f(!0),g(A,null,O(o.params,_=>(f(),V(n,{key:_.key,label:_.label,style:{"margin-bottom":"6px"}},{default:i(()=>[_.type==="password"?(f(),V(a,{key:0,modelValue:v.channels[c][_.key],"onUpdate:modelValue":j=>v.channels[c][_.key]=j,type:"password","show-password":"",placeholder:_.placeholder||"",style:{"max-width":"360px"}},null,8,["modelValue","onUpdate:modelValue","placeholder"])):_.type==="switch"?(f(),V(w,{key:1,modelValue:v.channels[c][_.key],"onUpdate:modelValue":j=>v.channels[c][_.key]=j},null,8,["modelValue","onUpdate:modelValue"])):_.type==="number"?(f(),V(M,{key:2,modelValue:v.channels[c][_.key],"onUpdate:modelValue":j=>v.channels[c][_.key]=j,min:1,max:10,style:{"max-width":"160px"}},null,8,["modelValue","onUpdate:modelValue"])):(f(),V(a,{key:3,modelValue:v.channels[c][_.key],"onUpdate:modelValue":j=>v.channels[c][_.key]=j,placeholder:_.placeholder||"",style:{"max-width":"360px"}},null,8,["modelValue","onUpdate:modelValue","placeholder"]))]),_:2},1032,["label"]))),128))])):q("",!0)]))),128))]),s(B,{"content-position":"left"},{default:i(()=>[...e[120]||(e[120]=[r("全局事件开关",-1)])]),_:1}),l("div",zs,[s(w,{modelValue:v.events.on_save_success,"onUpdate:modelValue":e[29]||(e[29]=o=>v.events.on_save_success=o),"active-text":"转存成功"},null,8,["modelValue"]),s(w,{modelValue:v.events.on_save_fail,"onUpdate:modelValue":e[30]||(e[30]=o=>v.events.on_save_fail=o),"active-text":"转存失败"},null,8,["modelValue"]),s(w,{modelValue:v.events.on_cookie_expire,"onUpdate:modelValue":e[31]||(e[31]=o=>v.events.on_cookie_expire=o),"active-text":"Cookie过期"},null,8,["modelValue"]),s(w,{modelValue:v.events.on_cleanup,"onUpdate:modelValue":e[32]||(e[32]=o=>v.events.on_cleanup=o),"active-text":"清理完成"},null,8,["modelValue"])]),e[121]||(e[121]=l("div",{class:"form-tip",style:{"margin-top":"8px"}},"全局推送作为兜底通道。设置了推送用户的网盘配置走用户推送,未设置的走全局推送。",-1))]),_:1})])]),_:1})]),_:1}),e[131]||(e[131]=r()),s(B,{"content-position":"left"},{default:i(()=>[...e[122]||(e[122]=[r("添加推送用户",-1)])]),_:1}),l("div",Ts,[l("div",Is,[s(Ne,{modelValue:m.account,"onUpdate:modelValue":e[33]||(e[33]=o=>m.account=o),filterable:"","allow-create":"",clearable:"",placeholder:"选择推广账户",style:{width:"200px"}},{default:i(()=>[(f(!0),g(A,null,O(Te.value,o=>(f(),V(Le,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),s(Ne,{modelValue:m.channels,"onUpdate:modelValue":e[34]||(e[34]=o=>m.channels=o),multiple:"","collapse-tags":"","collapse-tags-tooltip":"",placeholder:"选择您所需的消息频道",style:{width:"260px"}},{default:i(()=>[(f(!0),g(A,null,O(ll.value,(o,c)=>(f(),V(Le,{key:c,label:o.label,value:c},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),s(w,{modelValue:m.events.on_save_success,"onUpdate:modelValue":e[35]||(e[35]=o=>m.events.on_save_success=o),"active-text":"转存成功"},null,8,["modelValue"]),s(w,{modelValue:m.events.on_save_fail,"onUpdate:modelValue":e[36]||(e[36]=o=>m.events.on_save_fail=o),"active-text":"转存失败"},null,8,["modelValue"]),s(w,{modelValue:m.events.on_cookie_expire,"onUpdate:modelValue":e[37]||(e[37]=o=>m.events.on_cookie_expire=o),"active-text":"Cookie过期"},null,8,["modelValue"]),s(w,{modelValue:m.events.on_cleanup,"onUpdate:modelValue":e[38]||(e[38]=o=>m.events.on_cleanup=o),"active-text":"清理完成"},null,8,["modelValue"]),s(p,{type:"primary",size:"small",loading:_e.value,onClick:al},{default:i(()=>[r(b(m.id?"更新":"确认添加"),1)]),_:1},8,["loading"]),m.id?(f(),V(p,{key:0,size:"small",onClick:sl},{default:i(()=>[...e[123]||(e[123]=[r("取消编辑",-1)])]),_:1})):q("",!0)])]),s(B,{"content-position":"left"},{default:i(()=>[...e[124]||(e[124]=[r("推送用户列表",-1)])]),_:1}),s(Nl,{data:ze.value,stripe:"",style:{width:"100%"},"empty-text":"暂无推送用户"},{default:i(()=>[s(G,{prop:"account",label:"推广账号","min-width":"140"}),s(G,{label:"转存成功",width:"90",align:"center"},{default:i(({row:o})=>[re(o,"on_save_success")?(f(),V(I,{key:0,type:"success",size:"small"},{default:i(()=>[...e[125]||(e[125]=[r("✔",-1)])]),_:1})):(f(),g("span",js,"—"))]),_:1}),s(G,{label:"转存失败",width:"90",align:"center"},{default:i(({row:o})=>[re(o,"on_save_fail")?(f(),V(I,{key:0,type:"success",size:"small"},{default:i(()=>[...e[126]||(e[126]=[r("✔",-1)])]),_:1})):(f(),g("span",As,"—"))]),_:1}),s(G,{label:"Cookie过期",width:"90",align:"center"},{default:i(({row:o})=>[re(o,"on_cookie_expire")?(f(),V(I,{key:0,type:"success",size:"small"},{default:i(()=>[...e[127]||(e[127]=[r("✔",-1)])]),_:1})):(f(),g("span",Os,"—"))]),_:1}),s(G,{label:"清理完成",width:"90",align:"center"},{default:i(({row:o})=>[re(o,"on_cleanup")?(f(),V(I,{key:0,type:"success",size:"small"},{default:i(()=>[...e[128]||(e[128]=[r("✔",-1)])]),_:1})):(f(),g("span",Rs,"—"))]),_:1}),s(G,{label:"已启用的通道","min-width":"220"},{default:i(({row:o})=>[(f(!0),g(A,null,O(Ie(o),(c,_)=>(f(),V(I,{key:_,size:"small",style:{"margin-right":"4px","margin-bottom":"2px"}},{default:i(()=>[r(b(il(_)),1)]),_:2},1024))),128)),dl(o)?q("",!0):(f(),g("span",Bs,"走全局推送"))]),_:1}),s(G,{label:"操作",width:"180",fixed:"right"},{default:i(({row:o})=>[s(p,{text:"",type:"primary",size:"small",onClick:c=>tl(o)},{default:i(()=>[...e[129]||(e[129]=[r("编辑",-1)])]),_:1},8,["onClick"]),s(Ll,{title:"确定删除该推送用户?",onConfirm:c=>nl(o)},{reference:i(()=>[s(p,{text:"",type:"danger",size:"small"},{default:i(()=>[...e[130]||(e[130]=[r("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:1})]),_:1},8,["data"])]),_:1},512),[[K,!U.value||U.value==="sys-notify"]]),W(s(T,{id:"section-sys-daily-report"},{header:i(()=>[l("div",$s,[e[134]||(e[134]=l("span",null,"📊 每日汇报",-1)),l("div",null,[s(p,{size:"small",loading:ve.value,onClick:Xe},{default:i(()=>[...e[132]||(e[132]=[r("📋 预览",-1)])]),_:1},8,["loading"]),s(p,{size:"small",type:"primary",loading:ye.value,onClick:Ze},{default:i(()=>[...e[133]||(e[133]=[r("▶ 发送测试",-1)])]),_:1},8,["loading"])])])]),default:i(()=>[s(S,{"label-width":"140px","label-position":"left"},{default:i(()=>[s(n,{label:"启用每日汇报"},{default:i(()=>[s(w,{modelValue:h.enabled,"onUpdate:modelValue":e[39]||(e[39]=o=>h.enabled=o),"active-text":"每天8点自动发送"},null,8,["modelValue"])]),_:1}),s(n,{label:"发送时间"},{default:i(()=>[s(Fl,{modelValue:h.time,"onUpdate:modelValue":e[40]||(e[40]=o=>h.time=o),format:"HH:mm","value-format":"HH:mm",placeholder:"选择时间",disabled:!h.enabled},null,8,["modelValue","disabled"]),e[135]||(e[135]=l("div",{class:"form-tip"},"默认每天 08:00 发送前一天的汇总报告",-1))]),_:1}),s(n,{label:"报告内容"},{default:i(()=>[l("div",Es,[s(w,{modelValue:h.includeSearch,"onUpdate:modelValue":e[41]||(e[41]=o=>h.includeSearch=o),"active-text":"搜索统计",disabled:!h.enabled},null,8,["modelValue","disabled"]),s(w,{modelValue:h.includeSaves,"onUpdate:modelValue":e[42]||(e[42]=o=>h.includeSaves=o),"active-text":"转存统计",disabled:!h.enabled},null,8,["modelValue","disabled"]),s(w,{modelValue:h.includeStorage,"onUpdate:modelValue":e[43]||(e[43]=o=>h.includeStorage=o),"active-text":"网盘容量",disabled:!h.enabled},null,8,["modelValue","disabled"]),s(w,{modelValue:h.includeUsers,"onUpdate:modelValue":e[44]||(e[44]=o=>h.includeUsers=o),"active-text":"用户数",disabled:!h.enabled},null,8,["modelValue","disabled"])])]),_:1}),s(n,{label:"上次发送"},{default:i(()=>[l("span",null,b(Pe.value||"从未发送"),1)]),_:1})]),_:1}),s(Dl,{modelValue:ge.value,"onUpdate:modelValue":e[45]||(e[45]=o=>ge.value=o),title:"📊 每日汇报预览",width:"600px"},{default:i(()=>[l("div",Ls,b(Ue.value),1)]),_:1},8,["modelValue"])]),_:1},512),[[K,!U.value||U.value==="sys-daily-report"]]),W(s(T,{id:"section-sys-maintenance"},{header:i(()=>[...e[136]||(e[136]=[l("span",null,"🔄 系统维护",-1)])]),default:i(()=>[e[141]||(e[141]=r()),s(S,{"label-width":"180px","label-position":"left"},{default:i(()=>[s(n,{label:"自动更新镜像"},{default:i(()=>[s(w,{modelValue:Ce.value,"onUpdate:modelValue":e[46]||(e[46]=o=>Ce.value=o),"active-text":"启用","inactive-text":"禁用"},null,8,["modelValue"]),e[137]||(e[137]=r()),e[138]||(e[138]=l("div",{class:"form-tip"},"启用后 CloudSearch 将自动检测并更新到最新镜像版本",-1)),e[139]||(e[139]=r()),e[140]||(e[140]=l("div",{class:"form-tip",style:{color:"var(--(--el-color-warning,#e6a23c))"}}," 当前需手动在服务器执行:docker-compose -f /opt/CloudSearch/docker-compose.yml pull && docker-compose -f /opt/CloudSearch/docker-compose.yml up -d ",-1))]),_:1})]),_:1})]),_:1},512),[[K,!U.value||U.value==="sys-maintenance"]]),l("div",Ns,[s(p,{type:"primary",size:"large",loading:fe.value,onClick:Il},{default:i(()=>[...e[142]||(e[142]=[r(" 保存配置 ",-1)])]),_:1},8,["loading"])])])}}}),Ws=ot(Fs,[["__scopeId","data-v-6cdc2b1a"]]);export{Ws as default}; diff --git a/source_clean/frontend/assets/SystemConfig-C3is0eeI.js b/source_clean/frontend/assets/SystemConfig-C3is0eeI.js deleted file mode 100644 index 04fd1e4..0000000 --- a/source_clean/frontend/assets/SystemConfig-C3is0eeI.js +++ /dev/null @@ -1,16 +0,0 @@ -import{d as Tl,o as Il,E as u,x as Ol,a as p,c as y,K as q,L as M,f as a,w as i,b as l,v as D,h as g,i as Z,j as V,l as r,k as Re,N as jl,e as W,t as b,n as $e,y as k,M as Al,F as O,r as j,z as Bl,u as El}from"./index-D279dJND.js";import{k as Ll,w as Rl,x as $l,p as Nl,y as Fl,z as Gl,A as ee,B as Wl,C as Kl,D as ql,_ as Ml}from"./_plugin-vue_export-helper-1Z-znrfZ.js";const Dl={class:"system-config"},Jl={class:"fallback-upload-wrap"},Hl={class:"fallback-upload-row"},Yl={key:0,class:"fallback-preview"},Ql=["src"],Xl={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},Zl={key:0,style:{"font-size":"11px",color:"#e6a23c","white-space":"nowrap"}},et={class:"pansou-status-grid"},lt={class:"db-stat-item"},tt={class:"db-stat-item"},st={class:"db-stat-value"},at={class:"db-stat-item"},ot={class:"db-stat-value"},nt={class:"db-stat-item"},it={class:"db-stat-value"},dt={class:"db-stat-item"},rt={class:"db-stat-value"},ut={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},pt={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},ft={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},ct={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},vt={style:{display:"flex",gap:"8px","align-items":"center",width:"100%"}},mt={key:0,style:{"text-align":"center",padding:"16px"}},yt={key:1,class:"db-status-grid"},_t={class:"db-stat-item"},gt={class:"db-stat-item"},bt={class:"db-stat-value"},wt={class:"db-stat-item"},xt={class:"db-stat-value"},kt={class:"db-stat-item"},Vt={class:"db-stat-value"},ht={class:"db-stat-item"},Ct={class:"db-stat-value"},Pt={class:"db-stat-item"},St={class:"db-stat-value"},Ut={class:"strategy-section"},zt={class:"field-block"},Tt={class:"field-label-row"},It={class:"field-block"},Ot={class:"field-label-row"},jt={class:"strategy-grid"},At={class:"grid-cell"},Bt={class:"field-label-row"},Et={class:"grid-cell"},Lt={class:"field-label-row"},Rt={class:"grid-cell"},$t={class:"field-label-row"},Nt={class:"grid-cell"},Ft={class:"field-label-row"},Gt={class:"grid-cell"},Wt={class:"field-label-row"},Kt={class:"grid-cell"},qt={class:"field-label-row"},Mt={class:"field-block"},Dt={style:{display:"flex",gap:"8px","align-items":"stretch"}},Jt={key:0,class:"tag-list"},Ht={key:1,class:"tag-empty"},Yt={class:"field-block"},Qt={style:{display:"flex",gap:"8px","align-items":"stretch"}},Xt={key:0,class:"tag-list"},Zt={key:1,class:"tag-empty"},es={class:"field-block"},ls={style:{display:"flex",gap:"8px","align-items":"stretch"}},ts={key:0,class:"tag-list"},ss={key:1,class:"tag-empty"},as={class:"field-block"},os={style:{display:"flex",gap:"8px","align-items":"stretch"}},ns={key:0,class:"tag-list"},is={key:1,class:"tag-empty"},ds={class:"field-block"},rs={style:{display:"flex",gap:"8px","align-items":"stretch"}},us={key:0,class:"tag-list"},ps={key:1,class:"tag-empty"},fs={class:"strategy-section"},cs={style:{display:"grid","grid-template-columns":"repeat(2,1fr)",gap:"8px"}},vs={style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"6px"}},ms={key:0},ys={style:{display:"flex","flex-wrap":"wrap",gap:"16px"}},_s={style:{border:"1px solid var(--el-border-color-light)","border-radius":"6px",padding:"12px 16px","margin-bottom":"16px"}},gs={style:{display:"flex","align-items":"center",gap:"12px","flex-wrap":"wrap"}},bs={key:1,style:{color:"#ccc"}},ws={key:1,style:{color:"#ccc"}},xs={key:1,style:{color:"#ccc"}},ks={key:1,style:{color:"#ccc"}},Vs={key:0,style:{color:"#909399","font-size":"12px"}},hs={class:"save-bar"},Cs=Tl({__name:"SystemConfig",props:{section:{}},setup(Ne){const Fe=Ne,Ge=Bl();El();const U=D(()=>Fe.section||Ge.query.section||""),_e=g(),ue=g([]),d=Z({}),E=g([]),J=g(""),L=g([]),H=g(""),R=g([]),Y=g(""),$=g([]),Q=g(""),X=g(""),N=g([]),pe=g(!1),fe=g(!1),A=Z({db_size:"-",save_records:0,search_stats:0,cloud_configs:0,content_cache:0,redis_status:"未连接"}),ge=g(!0),le=g(!1),te=g(!1),se=g(!1),ae=g(!1),oe=g(!1),ne=g(!1),P=g(null),be=g(!0),ie=g(!1),ce=D({get:()=>String(d.search_proxy_enabled)==="true",set:t=>{d.search_proxy_enabled=t?"true":"false"}}),we=D({get:()=>String(d.pansou_web_enabled)==="true",set:t=>{d.pansou_web_enabled=t?"true":"false"}}),xe=D({get:()=>String(d.search_all_channels)==="true",set:t=>{d.search_all_channels=t?"true":"false"}}),ke=D({get:()=>String(d.auto_update_enabled)==="true",set:t=>{d.auto_update_enabled=t?"true":"false"}}),Ve=g([]),F=g({}),ve=g(!1),he=g([]);async function We(){try{const t=await fetch("/api/admin/cloud-configs",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}});if(!t.ok)return;const e=await t.json(),s=Array.isArray(e)?[...new Set(e.map(o=>o.promotion_account||"").filter(Boolean))]:[];he.value=s}catch{}}const v=Z({id:null,account:"",channels:[],events:{on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}),Ke=D(()=>{var e;const t={};for(const[s,o]of Object.entries(F.value))(e=m.channels[s])!=null&&e._enabled&&(t[s]=o);return t}),m=Z({channels:{},events:{on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}});function qe(t){var e,s,o,w;if(t){v.id=t.id,v.account=t.account;const f=t.notify_config||{};v.channels=Object.keys(f.channels||{}),v.events={on_save_success:((e=f.events)==null?void 0:e.on_save_success)!==!1,on_save_fail:((s=f.events)==null?void 0:s.on_save_fail)!==!1,on_cookie_expire:((o=f.events)==null?void 0:o.on_cookie_expire)!==!1,on_cleanup:((w=f.events)==null?void 0:w.on_cleanup)===!0}}else v.id=null,v.account="",v.channels=[],v.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}function Me(){v.id=null,v.account="",v.channels=[],v.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}function de(t,e){return((t.notify_config||{}).events||{})[e]===!0}async function De(){if(!v.account){u.warning("请填写推广账号");return}ve.value=!0;try{const t={account:v.account,notify_config:{channels:{},events:v.events}},e={};for(const o of v.channels)e[o]={};t.notify_config.channels=e,v.id?await fetch("/api/admin/push-users/"+v.id,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")},body:JSON.stringify(t)}):await fetch("/api/admin/push-users",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")},body:JSON.stringify(t)});const s=!!v.id;v.id=null,v.account="",v.channels=[],v.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1},u.success(s?"推送用户已更新":"推送用户已添加"),await me()}catch(t){u.error(t.message||"保存失败")}finally{ve.value=!1}}async function me(){try{const t=await fetch("/api/admin/push-users",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}});t.ok&&(Ve.value=await t.json())}catch(t){console.error("Failed to load push users",t)}}async function Je(){try{F.value=await $l()}catch(t){console.error("Failed to load providers",t)}}async function He(t){try{await fetch("/api/admin/push-users/"+t.id,{method:"DELETE",headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}}),u.success("已删除"),await me()}catch(e){u.error(e.message||"删除失败")}}function Ce(t){var s;return((s=t.notify_config)==null?void 0:s.channels)||{}}function Ye(t){var e;return((e=F.value[t])==null?void 0:e.label)||t}function Qe(t){return Object.keys(Ce(t)).length>0}function Xe(){const t={};for(const[e,s]of Object.entries(F.value)){t[e]={_enabled:!1,_testing:!1};for(const o of s.params||[])t[e][o.key]=o.default||""}m.channels=t,m.events={on_save_success:!0,on_save_fail:!0,on_cookie_expire:!0,on_cleanup:!1}}async function Ze(){try{const s=(await(await fetch("/api/admin/system-configs",{headers:{Authorization:"Bearer "+(localStorage.getItem("admin_token")||"")}})).json()).find(o=>o.key==="global_notify_config");if(s&&s.value)try{const o=JSON.parse(s.value),w=o.channels||{};for(const[f,h]of Object.entries(w))if(m.channels[f]){m.channels[f]._enabled=!0;for(const[z,x]of Object.entries(h))m.channels[f][z]=x}o.events&&(m.events.on_save_success=o.events.on_save_success!==!1,m.events.on_save_fail=o.events.on_save_fail!==!1,m.events.on_cookie_expire=o.events.on_cookie_expire!==!1,m.events.on_cleanup=o.events.on_cleanup===!0)}catch{}}catch{}}async function el(t){const e=m.channels[t];if(!(!e||!e._enabled)){e._testing=!0;try{const s=await Fl(t);s.success?u.success(s.message):u.error(s.message)}catch(s){u.error(s.message||"测试失败")}finally{e._testing=!1}}}const S=Z({oldPassword:"",newPassword:"",confirmPassword:""}),ll={oldPassword:[{required:!0,message:"请输入原密码",trigger:"blur"}],newPassword:[{required:!0,message:"请输入新密码",trigger:"blur"},{min:6,message:"新密码至少需要6个字符",trigger:"blur"}],confirmPassword:[{required:!0,message:"请确认新密码",trigger:"blur"},{validator:(t,e,s)=>{e!==S.newPassword?s(new Error("两次输入的密码不一致")):s()},trigger:"blur"}]};Il(async()=>{try{ue.value=await Ll();for(const f of ue.value)d[f.key]=f.value;const t=String(d.title_filter_rules||"");E.value=t.split(` -`).filter(f=>f.trim());const e=String(d.link_invalid_keywords||"");L.value=e.split(` -`).filter(f=>f.trim());const s=String(d.quark_ad_keywords||"");R.value=s.split(` -`).filter(f=>f.trim());const o=String(d.quark_warning_folder_names||"");$.value=o.split(` -`).filter(f=>f.trim());const w=String(d.quark_sus_extensions||"");N.value=w.split(` -`).filter(f=>f.trim())}catch{u.error("加载系统配置失败")}try{const t=await Rl();Object.assign(A,t)}catch{A.db_size="无法读取"}finally{ge.value=!1}ye(),await Je(),Xe(),await Ze(),me(),We()}),Ol(F,()=>{for(const[t,e]of Object.entries(F.value))if(!m.channels[t]){m.channels[t]={_enabled:!1,_testing:!1};for(const s of e.params||[])m.channels[t][s.key]=s.default||""}});async function tl(){var e,s;const t=String(d.redis_url||"redis://redis:6379");le.value=!0;try{const o=await Gl(t);o.ok?u.success(`✅ Redis 连接成功 — ${o.info}`):u.error(`❌ Redis 连接失败 — ${o.info}`)}catch(o){u.error(((s=(e=o.response)==null?void 0:e.data)==null?void 0:s.error)||"测试请求失败")}finally{le.value=!1}}async function ye(){be.value=!0;try{const t=localStorage.getItem("admin_token"),e={};t&&(e.Authorization="Bearer "+t);const s=await fetch("/api/admin/pansou-info",{headers:e});if(!s.ok)throw new Error("HTTP "+s.status);const o=await s.json();P.value=o}catch{P.value={status:"disconnected",version:"-",channelCount:0,pluginCount:0,diskCount:0}}finally{be.value=!1}}async function sl(){ie.value=!0;try{const t=localStorage.getItem("admin_token"),e={"Content-Type":"application/json"};t&&(e.Authorization="Bearer "+t);const o=await(await fetch("/api/admin/update-pansou",{method:"POST",headers:e})).json();o.ok?(u.success("✅ PanSou 已更新并重启"),setTimeout(()=>ye(),3e3)):u.error("❌ 更新失败 — "+(o.error||"未知错误"))}catch(t){u.error(t.message||"更新请求失败")}finally{ie.value=!1}}async function al(){var t,e;te.value=!0;try{const s=await ee({type:"pansou",url:String(d.pansou_url||"")});s.ok?(ye(),u.success(`✅ PanSou 连接成功 — ${s.info}`)):u.error(`❌ PanSou 连接失败 — ${s.info}`)}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{te.value=!1}}async function ol(){var t,e;se.value=!0;try{const s=await ee({type:"video_parser",url:String(d.video_parser_url||"")});s.ok?u.success(`✅ 视频解析服务连接成功 — ${s.info}`):u.error(`❌ 视频解析服务连接失败 — ${s.info}`)}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{se.value=!1}}async function nl(){var t,e;ae.value=!0;try{const s=await ee({type:"tmdb",token:String(d.tmdb_api_token||"")});s.ok?u.success(`✅ TMDB 令牌有效 — ${s.info}`):u.error(`❌ TMDB 连接失败 — ${s.info}`)}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{ae.value=!1}}async function il(){var t,e;oe.value=!0;try{const s=await ee({type:"proxy",url:String(d.search_proxy_url||"")});s.ok?u.success(`✅ 搜索代理可用 — ${s.info}`):u.error(`❌ 搜索代理不可用 — ${s.info}`)}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{oe.value=!1}}async function dl(){var t,e;ne.value=!0;try{const s=String(d.ip_geo_api_url||"");if(!s){u.warning("请先输入 IP 归属地查询 API 地址");return}const o=await ee({type:"ip_geo",url:s});o.ok?u.success("✅ IP 归属地接口可用 — "+o.info):u.error("❌ IP 归属地接口不可用 — "+o.info)}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"测试请求失败")}finally{ne.value=!1}}function rl(){const t=J.value.trim();if(!t)return;const e=t.split(` -`).map(o=>o.trim()).filter(o=>o);let s=0;for(const o of e)E.value.includes(o)||(E.value.push(o),s++);J.value="",Pe(),s>0?u.success(`已添加 ${s} 条规则`):u.info("所有规则已存在")}function ul(t){E.value.splice(t,1),Pe()}function pl(t){return t.startsWith("#")?"info":t.startsWith("/")&&(t.endsWith("/")||t.endsWith("/g")||t.endsWith("/i")||t.endsWith("/gi"))?"warning":""}function Pe(){d.title_filter_rules=E.value.join(` -`)}function fl(){const t=H.value.trim();if(!t)return;const e=t.split(` -`).map(o=>o.trim()).filter(o=>o);let s=0;for(const o of e)L.value.includes(o)||(L.value.push(o),s++);H.value="",Se(),s>0?u.success(`已添加 ${s} 个关键词`):u.info("所有关键词已存在")}function cl(t){L.value.splice(t,1),Se()}function Se(){d.link_invalid_keywords=L.value.join(` -`)}function vl(){const t=Y.value.trim();if(!t)return;const e=t.split(` -`).map(o=>o.trim()).filter(o=>o);let s=0;for(const o of e)R.value.includes(o)||(R.value.push(o),s++);Y.value="",Ue(),s>0?u.success():u.info("所有关键词已存在")}function ml(t){R.value.splice(t,1),Ue()}function Ue(){d.quark_ad_keywords=R.value.join(` -`)}function yl(){const t=Q.value.trim();if(!t)return;const e=t.split(` -`).map(o=>o.trim()).filter(o=>o);let s=0;for(const o of e)$.value.includes(o)||($.value.push(o),s++);Q.value="",ze(),s>0?u.success():u.info("所有文件夹名已存在")}function _l(t){$.value.splice(t,1),ze()}function ze(){d.quark_warning_folder_names=$.value.join(` -`)}function gl(){const t=X.value.trim();if(!t)return;const e=t.split(` -`).map(o=>o.trim().toLowerCase().replace(/^\./,"")).filter(o=>o);let s=0;for(const o of e)N.value.includes(o)||(N.value.push(o),s++);X.value="",Te(),s>0?u.success("已添加 ${added} 个后缀"):u.info("所有后缀已存在")}function bl(t){N.value.splice(t,1),Te()}function Te(){d.quark_sus_extensions=N.value.join(` -`)}async function wl(){var t,e;pe.value=!0;try{const s={};for(const[w,f]of Object.entries(m.channels))if(f._enabled){const h={};for(const[z,x]of Object.entries(f))!z.startsWith("_")&&x!==""&&(h[z]=String(x));Object.keys(h).length>0&&(s[w]=h)}const o=ue.value.map(w=>({key:w.key,value:String(d[w.key]??w.value)}));o.push({key:"global_notify_config",value:JSON.stringify({channels:s,events:m.events})}),await Nl(o),u.success("配置已保存")}catch(s){u.error(((e=(t=s.response)==null?void 0:t.data)==null?void 0:e.error)||"保存失败")}finally{pe.value=!1}}async function xl(){var e,s,o;if(await((e=_e.value)==null?void 0:e.validate().catch(()=>!1))){fe.value=!0;try{const w=await Wl(S.oldPassword,S.newPassword);w.success?(u.success("✅ 密码修改成功,下次登录请使用新密码"),S.oldPassword="",S.newPassword="",S.confirmPassword=""):u.error(w.message)}catch(w){u.error(((o=(s=w.response)==null?void 0:s.data)==null?void 0:o.error)||"密码修改失败")}finally{fe.value=!1}}}const Ie=g();function kl(){var t;(t=Ie.value)==null||t.click()}async function Vl(t){var o,w,f;const e=t.target,s=(o=e.files)==null?void 0:o[0];if(s){if(!s.type.startsWith("image/")){u.error("仅支持图片文件(JPEG/PNG/WebP)"),e.value="";return}if(s.size>2*1024*1024){u.error("图片大小不能超过 2MB"),e.value="";return}try{const h=await Kl(s);h.success?(d.site_logo=h.url,u.success("✅ LOGO 已上传并生效")):u.error(h.message)}catch(h){u.error(((f=(w=h.response)==null?void 0:w.data)==null?void 0:f.error)||"上传失败")}e.value=""}}async function hl(){try{d.site_logo="",await ql("site_logo",""),u.success("已移除 LOGO")}catch{u.error("移除失败")}}return(t,e)=>{const s=V("el-input"),o=V("el-form-item"),w=V("el-icon"),f=V("el-button"),h=V("el-form"),z=V("el-card"),x=V("el-switch"),B=V("el-divider"),Oe=V("el-radio"),Cl=V("el-radio-group"),K=V("el-input-number"),T=V("el-tag"),Pl=V("el-collapse-item"),Sl=V("el-collapse"),je=V("el-option"),Ae=V("el-select"),G=V("el-table-column"),Ul=V("el-popconfirm"),zl=V("el-table");return p(),y("div",Dl,[q(a(z,{id:"section-sys-site"},{header:i(()=>[...e[40]||(e[40]=[l("span",null,"🌐 网站设置",-1)])]),default:i(()=>[a(h,{"label-width":"180px","label-position":"left"},{default:i(()=>[a(o,{label:"网站名称"},{default:i(()=>[a(s,{modelValue:d.site_name,"onUpdate:modelValue":e[0]||(e[0]=n=>d.site_name=n),placeholder:"CloudSearch",style:{"max-width":"300px"}},null,8,["modelValue"]),e[41]||(e[41]=l("div",{class:"form-tip"},"显示在网站标题和页脚",-1))]),_:1}),a(o,{label:"网站 LOGO"},{default:i(()=>[l("div",Jl,[l("div",Hl,[a(f,{type:"primary",onClick:kl},{icon:i(()=>[a(w,null,{default:i(()=>[a(Re(jl))]),_:1})]),default:i(()=>[e[42]||(e[42]=r(" 选择LOGO图片并上传 ",-1))]),_:1}),l("input",{ref_key:"logoInputRef",ref:Ie,type:"file",accept:".jpg,.jpeg,.png,.webp",hidden:"",onChange:Vl},null,544),e[43]||(e[43]=l("div",{class:"form-tip",style:{"margin-left":"12px"}},[r(" 推荐 "),l("strong",null,"320×60"),r(" 或宽比例(如 4:1),JPEG/PNG/WebP,最大 2MB。"),l("br"),r(" LOGO 同时也作为搜索结果无封面图时的兜底图使用。 ")],-1))]),d.site_logo?(p(),y("div",Yl,[l("img",{src:String(d.site_logo),alt:"LOGO预览",onError:e[1]||(e[1]=n=>n.target.style.display="none")},null,40,Ql),a(f,{size:"small",type:"danger",plain:"",onClick:hl},{default:i(()=>[...e[44]||(e[44]=[r("移除",-1)])]),_:1})])):W("",!0)])]),_:1}),a(o,{label:"底部免责声明"},{default:i(()=>[a(s,{modelValue:d.site_disclaimer,"onUpdate:modelValue":e[2]||(e[2]=n=>d.site_disclaimer=n),type:"textarea",rows:4,placeholder:"输入免责声明内容"},null,8,["modelValue"]),e[45]||(e[45]=l("div",{class:"form-tip"},"显示在网站底部,留空则不显示",-1))]),_:1}),a(o,{label:"滚动通知文字"},{default:i(()=>[a(s,{modelValue:d.site_marquee,"onUpdate:modelValue":e[3]||(e[3]=n=>d.site_marquee=n),placeholder:"📢 欢迎使用CloudSearch",style:{"max-width":"500px"}},null,8,["modelValue"]),e[46]||(e[46]=l("div",{class:"form-tip"},"搜索栏下方滚动的通知条(从右往左滚动),留空则不显示",-1))]),_:1}),a(o,{label:"系统时区"},{default:i(()=>[a(s,{modelValue:d.timezone,"onUpdate:modelValue":e[4]||(e[4]=n=>d.timezone=n),placeholder:"Asia/Shanghai",style:{"max-width":"300px"}},null,8,["modelValue"]),e[47]||(e[47]=l("div",{class:"form-tip"},"例如 Asia/Shanghai、America/New_York、UTC,修改后保存配置即可生效",-1))]),_:1})]),_:1})]),_:1},512),[[M,!U.value||U.value==="sys-site"]]),q(a(z,{id:"section-sys-services"},{header:i(()=>[...e[48]||(e[48]=[l("span",null,"🔗 外部服务 & 缓存",-1)])]),default:i(()=>[a(h,{"label-width":"180px","label-position":"left"},{default:i(()=>{var n,c,_,I,Be,Ee;return[a(o,{label:"PanSou 搜索引擎地址"},{default:i(()=>{var C,Le;return[l("div",Xl,[a(s,{modelValue:d.pansou_url,"onUpdate:modelValue":e[5]||(e[5]=re=>d.pansou_url=re),placeholder:"http://pansou:8888",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",loading:te.value,onClick:al,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(te.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"]),a(f,{type:"warning",loading:ie.value,onClick:sl,size:"default",style:{width:"130px"},disabled:!((C=P.value)!=null&&C.hasUpdate)},{default:i(()=>{var re;return[r(b(ie.value?"更新中...":(re=P.value)!=null&&re.hasUpdate?"🔄 有新版本":"无更新"),1)]}),_:1},8,["loading","disabled"]),(Le=P.value)!=null&&Le.latestVersion?(p(),y("span",Zl,b(P.value.latestVersion),1)):W("",!0)]),e[49]||(e[49]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"盘搜搜索引擎的地址",-1))]}),_:1}),l("div",et,[l("div",lt,[l("div",{class:$e(["db-stat-value",((n=P.value)==null?void 0:n.status)==="connected"?"text-success":"text-warning"])},b(((c=P.value)==null?void 0:c.status)==="connected"?"已连接":P.value?"未连接":"-"),3),e[50]||(e[50]=l("div",{class:"db-stat-label"},"PanSou 状态",-1))]),l("div",tt,[l("div",st,b(((_=P.value)==null?void 0:_.channelCount)??"-"),1),e[51]||(e[51]=l("div",{class:"db-stat-label"},"频道数量",-1))]),l("div",at,[l("div",ot,b(((I=P.value)==null?void 0:I.pluginCount)??"-"),1),e[52]||(e[52]=l("div",{class:"db-stat-label"},"插件数量",-1))]),l("div",nt,[l("div",it,b(((Be=P.value)==null?void 0:Be.diskCount)??"-"),1),e[53]||(e[53]=l("div",{class:"db-stat-label"},"网盘数量",-1))]),l("div",dt,[l("div",rt,b(((Ee=P.value)==null?void 0:Ee.version)||"-"),1),e[54]||(e[54]=l("div",{class:"db-stat-label"},"版本",-1))])]),a(o,{label:"PanSou Web 端访问"},{default:i(()=>[a(x,{modelValue:we.value,"onUpdate:modelValue":e[6]||(e[6]=C=>we.value=C),"active-text":"启用","inactive-text":"关闭"},null,8,["modelValue"]),e[55]||(e[55]=l("div",{class:"form-tip",style:{"margin-left":"12px"}},[r(" 开启后可通过 "),l("code",null,"/pansou/"),r(" 路径访问 PanSou 搜索引擎管理界面 ")],-1))]),_:1}),a(o,{label:"启用代理"},{default:i(()=>[a(x,{modelValue:ce.value,"onUpdate:modelValue":e[7]||(e[7]=C=>ce.value=C),"active-text":"启用","inactive-text":"关闭"},null,8,["modelValue"]),e[56]||(e[56]=l("div",{class:"form-tip",style:{"margin-left":"8px"}}," 仅 PanSou 需要此配置,开启后搜索请求将经过代理转发 ",-1))]),_:1}),ce.value?(p(),k(o,{key:0,label:"代理地址",style:{"margin-top":"-12px"}},{default:i(()=>[l("div",ut,[a(s,{modelValue:d.search_proxy_url,"onUpdate:modelValue":e[8]||(e[8]=C=>d.search_proxy_url=C),placeholder:"http://127.0.0.1:7890",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",loading:oe.value,onClick:il,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(oe.value?"测试中...":"测试代理"),1)]),_:1},8,["loading"])]),e[57]||(e[57]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"HTTP 或 SOCKS5 协议地址",-1))]),_:1})):W("",!0),a(o,{label:"视频解析服务地址"},{default:i(()=>[l("div",pt,[a(s,{modelValue:d.video_parser_url,"onUpdate:modelValue":e[9]||(e[9]=C=>d.video_parser_url=C),placeholder:"http://video-parser:3001",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",loading:se.value,onClick:ol,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(se.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"])]),e[58]||(e[58]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},"视频链接解析服务地址",-1))]),_:1}),a(o,{label:"TMDB 读取令牌"},{default:i(()=>[l("div",ft,[a(s,{modelValue:d.tmdb_api_token,"onUpdate:modelValue":e[10]||(e[10]=C=>d.tmdb_api_token=C),type:"password","show-password":"",placeholder:"输入 TMDB API 读取令牌(Bearer Token)",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",loading:ae.value,onClick:nl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(ae.value?"测试中...":"验证令牌"),1)]),_:1},8,["loading"])]),e[59]||(e[59]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" 用于搜索 TMDB 获取评分、导演、演员等完整内容信息。 "),l("a",{href:"https://www.themoviedb.org/settings/api",target:"_blank",rel:"noopener",style:{color:"var(--primary-color)"}},"获取令牌 →")],-1))]),_:1}),a(o,{label:"IP 归属地查询"},{default:i(()=>[l("div",ct,[a(s,{modelValue:d.ip_geo_api_url,"onUpdate:modelValue":e[11]||(e[11]=C=>d.ip_geo_api_url=C),placeholder:"https://cn.apihz.cn/api/ip/chaapi.php?id=xxx&key=***&ip={ip}&td=0",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",loading:ne.value,onClick:dl,size:"default",style:{width:"100px"}},{default:i(()=>[r(b(ne.value?"测试中...":"验证接口"),1)]),_:1},8,["loading"])]),e[60]||(e[60]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" IP 归属地查询 API 地址,"),l("code",null,"{ip}"),r(" 会被替换为实际 IP。 ")],-1)),e[61]||(e[61]=l("div",{style:{color:"var(--el-color-warning)","font-size":"13px","margin-top":"2px",width:"100%"}}," ⚠ 当前仅支持 接口盒子(apihz.cn) 格式 ",-1))]),_:1}),a(B,{"content-position":"left"},{default:i(()=>[...e[62]||(e[62]=[r("Redis 缓存",-1)])]),_:1}),a(o,{label:"Redis 连接地址"},{default:i(()=>[l("div",vt,[a(s,{modelValue:d.redis_url,"onUpdate:modelValue":e[12]||(e[12]=C=>d.redis_url=C),placeholder:"redis://:***@172.17.0.1:6379",style:{"max-width":"360px"}},null,8,["modelValue"]),a(f,{type:"primary",size:"default",loading:le.value,onClick:tl,style:{width:"100px"}},{default:i(()=>[r(b(le.value?"测试中...":"验证连接"),1)]),_:1},8,["loading"])]),e[63]||(e[63]=l("div",{class:"form-tip",style:{"margin-top":"4px"}},[r(" Redis 用于缓存搜索验证结果,提升响应速度。"),l("br"),l("strong",null,"带密码格式:"),l("code",null,"redis://:你的密码@地址:6379"),l("br"),r(" 修改后保存配置即可生效,无需重启。"),l("strong",null,"切换 Redis 只会清空缓存,不影响任何重要数据。")],-1))]),_:1})]}),_:1}),ge.value?(p(),y("div",mt,[a(w,{class:"is-loading",size:20},{default:i(()=>[a(Re(Al))]),_:1}),e[64]||(e[64]=l("span",{style:{"margin-left":"8px",color:"#909399"}},"加载中...",-1))])):(p(),y("div",yt,[l("div",_t,[l("div",{class:$e(["db-stat-value",A.redis_status==="已连接"?"text-success":"text-warning"])},b(A.redis_status),3),e[65]||(e[65]=l("div",{class:"db-stat-label"},"Redis 状态",-1))]),l("div",gt,[l("div",bt,b(A.db_size),1),e[66]||(e[66]=l("div",{class:"db-stat-label"},"数据库大小",-1))]),l("div",wt,[l("div",xt,b(A.save_records),1),e[67]||(e[67]=l("div",{class:"db-stat-label"},"转存记录",-1))]),l("div",kt,[l("div",Vt,b(A.search_stats),1),e[68]||(e[68]=l("div",{class:"db-stat-label"},"搜索记录",-1))]),l("div",ht,[l("div",Ct,b(A.cloud_configs),1),e[69]||(e[69]=l("div",{class:"db-stat-label"},"网盘配置",-1))]),l("div",Pt,[l("div",St,b(A.content_cache),1),e[70]||(e[70]=l("div",{class:"db-stat-label"},"内容缓存",-1))])]))]),_:1},512),[[M,!U.value||U.value==="sys-services"]]),q(a(z,{id:"section-sys-strategy"},{header:i(()=>[...e[71]||(e[71]=[l("span",null,"🔧 性能配置",-1)])]),default:i(()=>[l("div",Ut,[a(B,{"content-position":"left"},{default:i(()=>[...e[72]||(e[72]=[r("搜索结果返回方式",-1)])]),_:1}),l("div",zt,[l("div",Tt,[e[73]||(e[73]=l("span",{class:"field-label"},"开启资源链接有效性监测",-1)),a(x,{modelValue:d.link_validation_enabled,"onUpdate:modelValue":e[13]||(e[13]=n=>d.link_validation_enabled=n),"active-value":"true","inactive-value":"false","active-text":"开启","inactive-text":"关闭"},null,8,["modelValue"])]),e[74]||(e[74]=l("div",{class:"field-desc"},"开启后搜索时会自动检测链接是否有效,过滤失效链接。关闭则直接返回所有结果(更快)",-1))]),l("div",It,[l("div",Ot,[e[77]||(e[77]=l("span",{class:"field-label"},"搜索结果方式",-1)),a(Cl,{modelValue:d.search_strategy,"onUpdate:modelValue":e[14]||(e[14]=n=>d.search_strategy=n)},{default:i(()=>[a(Oe,{value:"wait_all"},{default:i(()=>[...e[75]||(e[75]=[r("等待全部结果后展示",-1)])]),_:1}),a(Oe,{value:"stream_channel"},{default:i(()=>[...e[76]||(e[76]=[r("频道结果逐步展示",-1)])]),_:1})]),_:1},8,["modelValue"])]),e[78]||(e[78]=l("div",{class:"field-desc"},"逐步展示会分频道并发请求并优先展示先返回的频道;该模式下频道顺序按返回先后,不按配置顺序。",-1))]),a(B,{"content-position":"left"},{default:i(()=>[...e[79]||(e[79]=[r("搜索策略",-1)])]),_:1}),l("div",jt,[l("div",At,[l("div",Bt,[e[80]||(e[80]=l("span",{class:"field-label"},"使用所有频道参与搜索",-1)),a(x,{modelValue:xe.value,"onUpdate:modelValue":e[15]||(e[15]=n=>xe.value=n),"active-text":"开启","inactive-text":"关闭"},null,8,["modelValue"])]),e[81]||(e[81]=l("div",{class:"field-desc"},"包含未启用频道,命中更广但请求压力更高。",-1))]),l("div",Et,[l("div",Lt,[e[82]||(e[82]=l("span",{class:"field-label"},"每类网盘有效结果数",-1)),a(K,{modelValue:d.search_result_limit,"onUpdate:modelValue":e[16]||(e[16]=n=>d.search_result_limit=n),min:1,max:100},null,8,["modelValue"])]),e[83]||(e[83]=l("div",{class:"field-desc"},"每个网盘类型最多展示的有效链接数量",-1))]),l("div",Rt,[l("div",$t,[e[84]||(e[84]=l("span",{class:"field-label"},"验证并发数",-1)),a(K,{modelValue:d.validation_concurrency,"onUpdate:modelValue":e[17]||(e[17]=n=>d.validation_concurrency=n),min:1,max:50},null,8,["modelValue"])]),e[85]||(e[85]=l("div",{class:"field-desc"},"同时验证的链接数量",-1))]),l("div",Nt,[l("div",Ft,[e[86]||(e[86]=l("span",{class:"field-label"},"有效链接缓存 (s)",-1)),a(K,{modelValue:d.validation_cache_ttl_valid,"onUpdate:modelValue":e[18]||(e[18]=n=>d.validation_cache_ttl_valid=n),min:60,max:86400,step:60},null,8,["modelValue"])]),e[87]||(e[87]=l("div",{class:"field-desc"},"有效验证结果的缓存时间",-1))]),l("div",Gt,[l("div",Wt,[e[88]||(e[88]=l("span",{class:"field-label"},"无效链接缓存 (s)",-1)),a(K,{modelValue:d.validation_cache_ttl_invalid,"onUpdate:modelValue":e[19]||(e[19]=n=>d.validation_cache_ttl_invalid=n),min:60,max:86400,step:60},null,8,["modelValue"])]),e[89]||(e[89]=l("div",{class:"field-desc"},"无效验证结果的缓存时间",-1))]),l("div",Kt,[l("div",qt,[e[90]||(e[90]=l("span",{class:"field-label"},"验证超时 (ms)",-1)),a(K,{modelValue:d.validation_timeout,"onUpdate:modelValue":e[20]||(e[20]=n=>d.validation_timeout=n),min:1e3,max:3e4,step:500},null,8,["modelValue"])]),e[91]||(e[91]=l("div",{class:"field-desc"},"单个链接验证超时毫秒数",-1))])]),a(B,{"content-position":"left"},{default:i(()=>[...e[92]||(e[92]=[r("链接检测配置",-1)])]),_:1}),l("div",Mt,[e[94]||(e[94]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"搜索标题过滤规则")],-1)),l("div",Dt,[a(s,{modelValue:J.value,"onUpdate:modelValue":e[21]||(e[21]=n=>J.value=n),type:"textarea",rows:1,placeholder:"每行一条规则,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),a(f,{type:"primary",onClick:rl,disabled:!J.value.trim()},{default:i(()=>[...e[93]||(e[93]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),E.value.length>0?(p(),y("div",Jt,[(p(!0),y(O,null,j(E.value,(n,c)=>(p(),k(T,{key:c,closable:"",type:pl(n),"disable-transitions":!1,onClose:_=>ul(c)},{default:i(()=>[r(b(n),1)]),_:2},1032,["type","onClose"]))),128))])):(p(),y("div",Ht,"暂无过滤规则")),e[95]||(e[95]=l("div",{class:"filter-rule-help"},[l("div",{class:"help-title"},"📖 规则说明"),l("div",{class:"help-row"},[l("code",null,"# 注释内容"),r(" — "),l("code",null,"#"),r(" 后必须跟"),l("strong",null,"空格"),r("才会被识别为注释,单纯的 "),l("code",null,"#动漫"),r(" 会被当作要移除的文本")]),l("div",{class:"help-row"},[l("code",null,"/正则表达式/标志"),r(" — 正则匹配,匹配到的内容会被删除。如 "),l("code",null,"/^\\\\d+[、,.\\\\s]/"),r(" 去掉开头的序号")]),l("div",{class:"help-row"},[l("code",null,"纯文本"),r(" — 直接写要移除的文字(支持 emoji),凡是标题中含有的都会被删除")])],-1))]),l("div",Yt,[e[97]||(e[97]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"失效关键词")],-1)),l("div",Qt,[a(s,{modelValue:H.value,"onUpdate:modelValue":e[22]||(e[22]=n=>H.value=n),type:"textarea",rows:1,placeholder:"每行一个关键词,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),a(f,{type:"danger",onClick:fl,disabled:!H.value.trim()},{default:i(()=>[...e[96]||(e[96]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[98]||(e[98]=l("div",{class:"field-desc"},"自定义失效关键词,PanSou 检测 summary 或 HTML 页面内容包含即判为失效。",-1)),L.value.length>0?(p(),y("div",Xt,[(p(!0),y(O,null,j(L.value,(n,c)=>(p(),k(T,{key:c,closable:"",type:"danger","disable-transitions":!1,onClose:_=>cl(c)},{default:i(()=>[r(b(n),1)]),_:2},1032,["onClose"]))),128))])):(p(),y("div",Zt,"暂无失效关键词,所有链接将默认判为有效"))]),a(B,{"content-position":"left"},{default:i(()=>[...e[99]||(e[99]=[r("夸克网盘转存清理",-1)])]),_:1}),l("div",es,[e[101]||(e[101]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"广告关键词")],-1)),l("div",ls,[a(s,{modelValue:Y.value,"onUpdate:modelValue":e[23]||(e[23]=n=>Y.value=n),type:"textarea",rows:1,placeholder:"每行一个关键词,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),a(f,{type:"danger",onClick:vl,disabled:!Y.value.trim()},{default:i(()=>[...e[100]||(e[100]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[102]||(e[102]=l("div",{class:"field-desc"},"夸克转存完成后自动删除文件名/文件夹名含这些关键词的内容(防广告病毒)",-1)),R.value.length>0?(p(),y("div",ts,[(p(!0),y(O,null,j(R.value,(n,c)=>(p(),k(T,{key:c,closable:"",type:"warning","disable-transitions":!1,onClose:_=>ml(c)},{default:i(()=>[r(b(n),1)]),_:2},1032,["onClose"]))),128))])):(p(),y("div",ss,"暂未配置广告关键词,不会进行广告清理"))]),l("div",as,[e[104]||(e[104]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"警示文件夹名")],-1)),l("div",os,[a(s,{modelValue:Q.value,"onUpdate:modelValue":e[24]||(e[24]=n=>Q.value=n),type:"textarea",rows:1,placeholder:"每行一个文件夹名,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),a(f,{type:"primary",onClick:yl,disabled:!Q.value.trim()},{default:i(()=>[...e[103]||(e[103]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[105]||(e[105]=l("div",{class:"field-desc"},"夸克转存完成后在网盘根目录自动创建这些警示文件夹(自动加上 ⚠️ 前缀)",-1)),$.value.length>0?(p(),y("div",ns,[(p(!0),y(O,null,j($.value,(n,c)=>(p(),k(T,{key:c,closable:"",type:"info","disable-transitions":!1,onClose:_=>_l(c)},{default:i(()=>[r(b(n),1)]),_:2},1032,["onClose"]))),128))])):(p(),y("div",is,"暂未配置警示文件夹"))]),l("div",ds,[e[107]||(e[107]=l("div",{class:"field-label-row"},[l("span",{class:"field-label"},"可疑文件后缀")],-1)),l("div",rs,[a(s,{modelValue:X.value,"onUpdate:modelValue":e[25]||(e[25]=n=>X.value=n),type:"textarea",rows:1,placeholder:"每行一个后缀,不要带点号,回车分隔",style:{"max-width":"420px","font-family":"monospace","font-size":"12px"}},null,8,["modelValue"]),a(f,{type:"danger",onClick:gl,disabled:!X.value.trim()},{default:i(()=>[...e[106]||(e[106]=[r(" 确认添加 ",-1)])]),_:1},8,["disabled"])]),e[108]||(e[108]=l("div",{class:"field-desc"},"夸克转存完成后自动删除后缀匹配的文件(防病毒,如 bat、exe、scr 等)",-1)),N.value.length>0?(p(),y("div",us,[(p(!0),y(O,null,j(N.value,(n,c)=>(p(),k(T,{key:c,closable:"",type:"danger","disable-transitions":!1,onClose:_=>bl(c)},{default:i(()=>[r("."+b(n),1)]),_:2},1032,["onClose"]))),128))])):(p(),y("div",ps,"暂无配置,使用默认列表:bat、exe、vbs、scr、cmd、com、pif、js、jar、msi、reg、inf、ps1"))])])]),_:1},512),[[M,!U.value||U.value==="sys-strategy"]]),q(a(z,{id:"section-sys-password"},{header:i(()=>[...e[109]||(e[109]=[l("span",null,"🔑 修改管理员密码",-1)])]),default:i(()=>[a(h,{ref_key:"passwordFormRef",ref:_e,model:S,rules:ll,"label-width":"120px","label-position":"left"},{default:i(()=>[a(o,{label:"原密码",prop:"oldPassword"},{default:i(()=>[a(s,{modelValue:S.oldPassword,"onUpdate:modelValue":e[26]||(e[26]=n=>S.oldPassword=n),type:"password","show-password":"",placeholder:"输入原密码",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),a(o,{label:"新密码",prop:"newPassword"},{default:i(()=>[a(s,{modelValue:S.newPassword,"onUpdate:modelValue":e[27]||(e[27]=n=>S.newPassword=n),type:"password","show-password":"",placeholder:"输入新密码(至少6位)",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),a(o,{label:"确认新密码",prop:"confirmPassword"},{default:i(()=>[a(s,{modelValue:S.confirmPassword,"onUpdate:modelValue":e[28]||(e[28]=n=>S.confirmPassword=n),type:"password","show-password":"",placeholder:"再次输入新密码",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),a(o,null,{default:i(()=>[a(f,{type:"primary",loading:fe.value,onClick:xl},{default:i(()=>[...e[110]||(e[110]=[r("修改密码",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),_:1},512),[[M,!U.value||U.value==="sys-password"]]),q(a(z,{id:"section-sys-notify"},{header:i(()=>[...e[111]||(e[111]=[l("div",{style:{display:"flex","align-items":"center","justify-content":"space-between"}},[l("span",null,"📬 消息推送")],-1)])]),default:i(()=>[a(Sl,{"model-value":["global"]},{default:i(()=>[a(Pl,{title:"全局推送(管理员兜底)",name:"global"},{default:i(()=>[l("div",fs,[a(h,{"label-width":"140px","label-position":"left"},{default:i(()=>[l("div",cs,[(p(!0),y(O,null,j(F.value,(n,c)=>(p(),y("div",{key:c,style:{border:"1px solid var(--el-border-color-light)","border-radius":"6px",padding:"8px 12px"}},[l("div",vs,[a(x,{modelValue:m.channels[c]._enabled,"onUpdate:modelValue":_=>m.channels[c]._enabled=_,size:"small"},null,8,["modelValue","onUpdate:modelValue"]),l("strong",null,b(n.label),1),m.channels[c]._enabled?(p(),k(f,{key:0,size:"small",text:"",type:"primary",onClick:_=>el(c),loading:m.channels[c]._testing},{default:i(()=>[...e[112]||(e[112]=[r("测试",-1)])]),_:1},8,["onClick","loading"])):W("",!0)]),m.channels[c]._enabled?(p(),y("div",ms,[(p(!0),y(O,null,j(n.params,_=>(p(),k(o,{key:_.key,label:_.label,style:{"margin-bottom":"6px"}},{default:i(()=>[_.type==="password"?(p(),k(s,{key:0,modelValue:m.channels[c][_.key],"onUpdate:modelValue":I=>m.channels[c][_.key]=I,type:"password","show-password":"",placeholder:_.placeholder||"",style:{"max-width":"360px"}},null,8,["modelValue","onUpdate:modelValue","placeholder"])):_.type==="switch"?(p(),k(x,{key:1,modelValue:m.channels[c][_.key],"onUpdate:modelValue":I=>m.channels[c][_.key]=I},null,8,["modelValue","onUpdate:modelValue"])):_.type==="number"?(p(),k(K,{key:2,modelValue:m.channels[c][_.key],"onUpdate:modelValue":I=>m.channels[c][_.key]=I,min:1,max:10,style:{"max-width":"160px"}},null,8,["modelValue","onUpdate:modelValue"])):(p(),k(s,{key:3,modelValue:m.channels[c][_.key],"onUpdate:modelValue":I=>m.channels[c][_.key]=I,placeholder:_.placeholder||"",style:{"max-width":"360px"}},null,8,["modelValue","onUpdate:modelValue","placeholder"]))]),_:2},1032,["label"]))),128))])):W("",!0)]))),128))]),a(B,{"content-position":"left"},{default:i(()=>[...e[113]||(e[113]=[r("全局事件开关",-1)])]),_:1}),l("div",ys,[a(x,{modelValue:m.events.on_save_success,"onUpdate:modelValue":e[29]||(e[29]=n=>m.events.on_save_success=n),"active-text":"转存成功"},null,8,["modelValue"]),a(x,{modelValue:m.events.on_save_fail,"onUpdate:modelValue":e[30]||(e[30]=n=>m.events.on_save_fail=n),"active-text":"转存失败"},null,8,["modelValue"]),a(x,{modelValue:m.events.on_cookie_expire,"onUpdate:modelValue":e[31]||(e[31]=n=>m.events.on_cookie_expire=n),"active-text":"Cookie过期"},null,8,["modelValue"]),a(x,{modelValue:m.events.on_cleanup,"onUpdate:modelValue":e[32]||(e[32]=n=>m.events.on_cleanup=n),"active-text":"清理完成"},null,8,["modelValue"])]),e[114]||(e[114]=l("div",{class:"form-tip",style:{"margin-top":"8px"}},"全局推送作为兜底通道。设置了推送用户的网盘配置走用户推送,未设置的走全局推送。",-1))]),_:1})])]),_:1})]),_:1}),e[124]||(e[124]=r()),a(B,{"content-position":"left"},{default:i(()=>[...e[115]||(e[115]=[r("添加推送用户",-1)])]),_:1}),l("div",_s,[l("div",gs,[a(Ae,{modelValue:v.account,"onUpdate:modelValue":e[33]||(e[33]=n=>v.account=n),filterable:"","allow-create":"",clearable:"",placeholder:"选择推广账户",style:{width:"200px"}},{default:i(()=>[(p(!0),y(O,null,j(he.value,n=>(p(),k(je,{key:n,label:n,value:n},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),a(Ae,{modelValue:v.channels,"onUpdate:modelValue":e[34]||(e[34]=n=>v.channels=n),multiple:"","collapse-tags":"","collapse-tags-tooltip":"",placeholder:"选择您所需的消息频道",style:{width:"260px"}},{default:i(()=>[(p(!0),y(O,null,j(Ke.value,(n,c)=>(p(),k(je,{key:c,label:n.label,value:c},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),a(x,{modelValue:v.events.on_save_success,"onUpdate:modelValue":e[35]||(e[35]=n=>v.events.on_save_success=n),"active-text":"转存成功"},null,8,["modelValue"]),a(x,{modelValue:v.events.on_save_fail,"onUpdate:modelValue":e[36]||(e[36]=n=>v.events.on_save_fail=n),"active-text":"转存失败"},null,8,["modelValue"]),a(x,{modelValue:v.events.on_cookie_expire,"onUpdate:modelValue":e[37]||(e[37]=n=>v.events.on_cookie_expire=n),"active-text":"Cookie过期"},null,8,["modelValue"]),a(x,{modelValue:v.events.on_cleanup,"onUpdate:modelValue":e[38]||(e[38]=n=>v.events.on_cleanup=n),"active-text":"清理完成"},null,8,["modelValue"]),a(f,{type:"primary",size:"small",loading:ve.value,onClick:De},{default:i(()=>[r(b(v.id?"更新":"确认添加"),1)]),_:1},8,["loading"]),v.id?(p(),k(f,{key:0,size:"small",onClick:Me},{default:i(()=>[...e[116]||(e[116]=[r("取消编辑",-1)])]),_:1})):W("",!0)])]),a(B,{"content-position":"left"},{default:i(()=>[...e[117]||(e[117]=[r("推送用户列表",-1)])]),_:1}),a(zl,{data:Ve.value,stripe:"",style:{width:"100%"},"empty-text":"暂无推送用户"},{default:i(()=>[a(G,{prop:"account",label:"推广账号","min-width":"140"}),a(G,{label:"转存成功",width:"90",align:"center"},{default:i(({row:n})=>[de(n,"on_save_success")?(p(),k(T,{key:0,type:"success",size:"small"},{default:i(()=>[...e[118]||(e[118]=[r("✔",-1)])]),_:1})):(p(),y("span",bs,"—"))]),_:1}),a(G,{label:"转存失败",width:"90",align:"center"},{default:i(({row:n})=>[de(n,"on_save_fail")?(p(),k(T,{key:0,type:"success",size:"small"},{default:i(()=>[...e[119]||(e[119]=[r("✔",-1)])]),_:1})):(p(),y("span",ws,"—"))]),_:1}),a(G,{label:"Cookie过期",width:"90",align:"center"},{default:i(({row:n})=>[de(n,"on_cookie_expire")?(p(),k(T,{key:0,type:"success",size:"small"},{default:i(()=>[...e[120]||(e[120]=[r("✔",-1)])]),_:1})):(p(),y("span",xs,"—"))]),_:1}),a(G,{label:"清理完成",width:"90",align:"center"},{default:i(({row:n})=>[de(n,"on_cleanup")?(p(),k(T,{key:0,type:"success",size:"small"},{default:i(()=>[...e[121]||(e[121]=[r("✔",-1)])]),_:1})):(p(),y("span",ks,"—"))]),_:1}),a(G,{label:"已启用的通道","min-width":"220"},{default:i(({row:n})=>[(p(!0),y(O,null,j(Ce(n),(c,_)=>(p(),k(T,{key:_,size:"small",style:{"margin-right":"4px","margin-bottom":"2px"}},{default:i(()=>[r(b(Ye(_)),1)]),_:2},1024))),128)),Qe(n)?W("",!0):(p(),y("span",Vs,"走全局推送"))]),_:1}),a(G,{label:"操作",width:"180",fixed:"right"},{default:i(({row:n})=>[a(f,{text:"",type:"primary",size:"small",onClick:c=>qe(n)},{default:i(()=>[...e[122]||(e[122]=[r("编辑",-1)])]),_:1},8,["onClick"]),a(Ul,{title:"确定删除该推送用户?",onConfirm:c=>He(n)},{reference:i(()=>[a(f,{text:"",type:"danger",size:"small"},{default:i(()=>[...e[123]||(e[123]=[r("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:1})]),_:1},8,["data"])]),_:1},512),[[M,!U.value||U.value==="sys-notify"]]),q(a(z,{id:"section-sys-maintenance"},{header:i(()=>[...e[125]||(e[125]=[l("span",null,"🔄 系统维护",-1)])]),default:i(()=>[e[130]||(e[130]=r()),a(h,{"label-width":"180px","label-position":"left"},{default:i(()=>[a(o,{label:"自动更新镜像"},{default:i(()=>[a(x,{modelValue:ke.value,"onUpdate:modelValue":e[39]||(e[39]=n=>ke.value=n),"active-text":"启用","inactive-text":"禁用"},null,8,["modelValue"]),e[126]||(e[126]=r()),e[127]||(e[127]=l("div",{class:"form-tip"},"启用后 CloudSearch 将自动检测并更新到最新镜像版本",-1)),e[128]||(e[128]=r()),e[129]||(e[129]=l("div",{class:"form-tip",style:{color:"var(--(--el-color-warning,#e6a23c))"}}," 当前需手动在服务器执行:docker-compose -f /opt/CloudSearch/docker-compose.yml pull && docker-compose -f /opt/CloudSearch/docker-compose.yml up -d ",-1))]),_:1})]),_:1})]),_:1},512),[[M,!U.value||U.value==="sys-maintenance"]]),l("div",hs,[a(f,{type:"primary",size:"large",loading:pe.value,onClick:wl},{default:i(()=>[...e[131]||(e[131]=[r(" 保存配置 ",-1)])]),_:1},8,["loading"])])])}}}),Us=Ml(Cs,[["__scopeId","data-v-641a8223"]]);export{Us as default}; diff --git a/source_clean/frontend/assets/SystemConfig-C8bSCuHg.css b/source_clean/frontend/assets/SystemConfig-C8bSCuHg.css new file mode 100644 index 0000000..6bbcedb --- /dev/null +++ b/source_clean/frontend/assets/SystemConfig-C8bSCuHg.css @@ -0,0 +1 @@ +.el-card[data-v-6cdc2b1a]{margin-bottom:20px}.el-card[data-v-6cdc2b1a] .el-card__header{font-weight:600;font-size:15px}[data-v-6cdc2b1a] .el-divider__text.is-left{left:0;padding-left:0}.form-tip[data-v-6cdc2b1a]{font-size:12px;color:#909399;margin-top:4px}.fallback-upload-wrap[data-v-6cdc2b1a]{display:flex;flex-direction:column;gap:12px}.fallback-upload-row[data-v-6cdc2b1a]{display:flex;align-items:center;flex-wrap:wrap}.fallback-preview[data-v-6cdc2b1a]{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.fallback-preview img[data-v-6cdc2b1a]{max-width:100%;height:auto;max-height:120px;border-radius:8px;border:1px solid var(--border-color);background:#f0f0f0;object-fit:contain}.strategy-grid[data-v-6cdc2b1a]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px 16px}.grid-cell[data-v-6cdc2b1a]{display:flex;flex-direction:column;gap:4px}.strategy-section[data-v-6cdc2b1a]{padding:0 4px}.field-block[data-v-6cdc2b1a]{margin:12px 0}.field-label-row[data-v-6cdc2b1a]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.field-label[data-v-6cdc2b1a]{font-size:14px;font-weight:500;color:#303133;white-space:nowrap}.field-desc[data-v-6cdc2b1a]{font-size:12px;color:#909399;margin:3px 0 0;line-height:1.5}.keyword-input-row[data-v-6cdc2b1a]{display:flex;gap:8px;flex:1;min-width:200px}.tag-list[data-v-6cdc2b1a]{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}.tag-empty[data-v-6cdc2b1a]{font-size:13px;color:#c0c4cc;margin-top:8px}.filter-rule-help[data-v-6cdc2b1a]{margin-top:8px;padding:10px 12px;background:#f8f9fa;border-radius:8px;border:1px solid #e8e8e8}.filter-rule-help .help-title[data-v-6cdc2b1a]{font-weight:600;font-size:13px;margin:8px 0 4px;color:#333}.filter-rule-help .help-title[data-v-6cdc2b1a]:first-child{margin-top:0}.filter-rule-help .help-row[data-v-6cdc2b1a]{font-size:12px;color:#555;margin:3px 0;line-height:1.6}.filter-rule-help .help-row code[data-v-6cdc2b1a]{background:#eef1f5;padding:1px 5px;border-radius:3px;font-size:11px;font-family:monospace}.filter-rules-help[data-v-6cdc2b1a]{margin-top:8px;padding:12px;background:#f8f9fa;border-radius:8px;border:1px solid #e8e8e8}.help-title[data-v-6cdc2b1a]{font-weight:600;font-size:13px;margin:10px 0 6px;color:#333}.help-title[data-v-6cdc2b1a]:first-child{margin-top:0}.help-row[data-v-6cdc2b1a]{font-size:12px;color:#555;margin:3px 0;line-height:1.6}.help-row code[data-v-6cdc2b1a]{background:#eef1f5;padding:1px 5px;border-radius:3px;font-size:11px;font-family:monospace}.help-sample[data-v-6cdc2b1a]{background:#1e1e1e;color:#d4d4d4;padding:10px 14px;border-radius:6px;font-size:12px;line-height:1.6;overflow-x:auto;white-space:pre;margin:6px 0 0;font-family:monospace}.help-preview-row[data-v-6cdc2b1a]{font-size:13px;margin:4px 0;display:flex;align-items:center;gap:6px}.help-preview-label[data-v-6cdc2b1a]{color:#888;min-width:70px;font-size:12px}.help-preview-original[data-v-6cdc2b1a]{color:#e74c3c}.help-preview-filtered[data-v-6cdc2b1a]{color:#27ae60;font-weight:500}.filter-input-row[data-v-6cdc2b1a]{display:flex;gap:8px;width:100%;margin-bottom:8px}.filter-tag-list[data-v-6cdc2b1a]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.filter-empty[data-v-6cdc2b1a]{font-size:13px;color:#c0c4cc;padding:8px 0;margin-bottom:8px}.db-status-grid[data-v-6cdc2b1a]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-top:8px}.db-stat-item[data-v-6cdc2b1a]{background:#f8f9fa;border-radius:10px;padding:16px 12px;text-align:center;border:1px solid #eee;transition:transform .15s,box-shadow .15s}.db-stat-item[data-v-6cdc2b1a]:hover{transform:translateY(-2px);box-shadow:0 4px 12px #0000000f}.db-stat-value[data-v-6cdc2b1a]{white-space:nowrap;font-size:24px;font-weight:700;color:#303133;margin-bottom:4px}.db-stat-value.text-success[data-v-6cdc2b1a]{color:#67c23a}.db-stat-value.text-warning[data-v-6cdc2b1a]{color:#e6a23c}.db-stat-label[data-v-6cdc2b1a]{font-size:12px;color:#909399}@media (max-width: 900px){.strategy-grid[data-v-6cdc2b1a]{grid-template-columns:1fr 1fr}}@media (max-width: 600px){.strategy-grid[data-v-6cdc2b1a]{grid-template-columns:1fr}}.pansou-status-grid[data-v-6cdc2b1a]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-top:8px}.status-dot[data-v-6cdc2b1a]{width:8px;height:8px;border-radius:50%;display:inline-block}.dot-ok[data-v-6cdc2b1a]{background:#67c23a}.dot-err[data-v-6cdc2b1a]{background:#f56c6c} diff --git a/source_clean/frontend/assets/SystemConfig-DFR5iJEB.css b/source_clean/frontend/assets/SystemConfig-DFR5iJEB.css deleted file mode 100644 index c9afda5..0000000 --- a/source_clean/frontend/assets/SystemConfig-DFR5iJEB.css +++ /dev/null @@ -1 +0,0 @@ -.el-card[data-v-641a8223]{margin-bottom:20px}.el-card[data-v-641a8223] .el-card__header{font-weight:600;font-size:15px}[data-v-641a8223] .el-divider__text.is-left{left:0;padding-left:0}.form-tip[data-v-641a8223]{font-size:12px;color:#909399;margin-top:4px}.fallback-upload-wrap[data-v-641a8223]{display:flex;flex-direction:column;gap:12px}.fallback-upload-row[data-v-641a8223]{display:flex;align-items:center;flex-wrap:wrap}.fallback-preview[data-v-641a8223]{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.fallback-preview img[data-v-641a8223]{max-width:100%;height:auto;max-height:120px;border-radius:8px;border:1px solid var(--border-color);background:#f0f0f0;object-fit:contain}.strategy-grid[data-v-641a8223]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px 16px}.grid-cell[data-v-641a8223]{display:flex;flex-direction:column;gap:4px}.strategy-section[data-v-641a8223]{padding:0 4px}.field-block[data-v-641a8223]{margin:12px 0}.field-label-row[data-v-641a8223]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.field-label[data-v-641a8223]{font-size:14px;font-weight:500;color:#303133;white-space:nowrap}.field-desc[data-v-641a8223]{font-size:12px;color:#909399;margin:3px 0 0;line-height:1.5}.keyword-input-row[data-v-641a8223]{display:flex;gap:8px;flex:1;min-width:200px}.tag-list[data-v-641a8223]{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}.tag-empty[data-v-641a8223]{font-size:13px;color:#c0c4cc;margin-top:8px}.filter-rule-help[data-v-641a8223]{margin-top:8px;padding:10px 12px;background:#f8f9fa;border-radius:8px;border:1px solid #e8e8e8}.filter-rule-help .help-title[data-v-641a8223]{font-weight:600;font-size:13px;margin:8px 0 4px;color:#333}.filter-rule-help .help-title[data-v-641a8223]:first-child{margin-top:0}.filter-rule-help .help-row[data-v-641a8223]{font-size:12px;color:#555;margin:3px 0;line-height:1.6}.filter-rule-help .help-row code[data-v-641a8223]{background:#eef1f5;padding:1px 5px;border-radius:3px;font-size:11px;font-family:monospace}.filter-rules-help[data-v-641a8223]{margin-top:8px;padding:12px;background:#f8f9fa;border-radius:8px;border:1px solid #e8e8e8}.help-title[data-v-641a8223]{font-weight:600;font-size:13px;margin:10px 0 6px;color:#333}.help-title[data-v-641a8223]:first-child{margin-top:0}.help-row[data-v-641a8223]{font-size:12px;color:#555;margin:3px 0;line-height:1.6}.help-row code[data-v-641a8223]{background:#eef1f5;padding:1px 5px;border-radius:3px;font-size:11px;font-family:monospace}.help-sample[data-v-641a8223]{background:#1e1e1e;color:#d4d4d4;padding:10px 14px;border-radius:6px;font-size:12px;line-height:1.6;overflow-x:auto;white-space:pre;margin:6px 0 0;font-family:monospace}.help-preview-row[data-v-641a8223]{font-size:13px;margin:4px 0;display:flex;align-items:center;gap:6px}.help-preview-label[data-v-641a8223]{color:#888;min-width:70px;font-size:12px}.help-preview-original[data-v-641a8223]{color:#e74c3c}.help-preview-filtered[data-v-641a8223]{color:#27ae60;font-weight:500}.filter-input-row[data-v-641a8223]{display:flex;gap:8px;width:100%;margin-bottom:8px}.filter-tag-list[data-v-641a8223]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.filter-empty[data-v-641a8223]{font-size:13px;color:#c0c4cc;padding:8px 0;margin-bottom:8px}.db-status-grid[data-v-641a8223]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-top:8px}.db-stat-item[data-v-641a8223]{background:#f8f9fa;border-radius:10px;padding:16px 12px;text-align:center;border:1px solid #eee;transition:transform .15s,box-shadow .15s}.db-stat-item[data-v-641a8223]:hover{transform:translateY(-2px);box-shadow:0 4px 12px #0000000f}.db-stat-value[data-v-641a8223]{white-space:nowrap;font-size:24px;font-weight:700;color:#303133;margin-bottom:4px}.db-stat-value.text-success[data-v-641a8223]{color:#67c23a}.db-stat-value.text-warning[data-v-641a8223]{color:#e6a23c}.db-stat-label[data-v-641a8223]{font-size:12px;color:#909399}@media (max-width: 900px){.strategy-grid[data-v-641a8223]{grid-template-columns:1fr 1fr}}@media (max-width: 600px){.strategy-grid[data-v-641a8223]{grid-template-columns:1fr}}.pansou-status-grid[data-v-641a8223]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-top:8px}.status-dot[data-v-641a8223]{width:8px;height:8px;border-radius:50%;display:inline-block}.dot-ok[data-v-641a8223]{background:#67c23a}.dot-err[data-v-641a8223]{background:#f56c6c} diff --git a/source_clean/frontend/assets/index-D279dJND.js b/source_clean/frontend/assets/index-D_srC3bj.js similarity index 99% rename from source_clean/frontend/assets/index-D279dJND.js rename to source_clean/frontend/assets/index-D_srC3bj.js index 45d6a87..a7a6318 100644 --- a/source_clean/frontend/assets/index-D279dJND.js +++ b/source_clean/frontend/assets/index-D_srC3bj.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomePage--KOSYv1j.js","assets/_plugin-vue_export-helper-1Z-znrfZ.js","assets/HomePage-BVcQlSvu.css","assets/SearchResult-DLXOMefi.js","assets/index-Bn7NwETH.js","assets/SearchResult-B_gCJbmx.css","assets/ResultDetail-DdE8ZRMU.js","assets/CloudBadge-OZZzB6Zg.js","assets/CloudBadge-B7b7xKko.css","assets/ResultDetail-CVwsv2ff.css","assets/AdminLogin-DxE2POP4.js","assets/AdminLogin-DFflDgjp.css","assets/AdminLayout-DHRMhPUk.js","assets/AdminLayout-e6gnzMQk.css","assets/AdminDashboard-BvLIjTGZ.js","assets/CloudConfig-BADbnuPV.js","assets/CloudConfig-BEjvFHzE.css","assets/SystemConfig-C3is0eeI.js","assets/SystemConfig-DFR5iJEB.css","assets/SaveRecords-DLmXAM3V.js","assets/SaveRecords-C2kQYC3g.css","assets/AdminDashboard-BIBkHVvW.css","assets/Cleanup-CwLcANun.js","assets/Cleanup-Cq_o1Z9e.css"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomePage-CdqgUFQt.js","assets/_plugin-vue_export-helper-1Z-znrfZ.js","assets/HomePage-BVcQlSvu.css","assets/SearchResult-EeENDml7.js","assets/index-Bn7NwETH.js","assets/SearchResult-B_gCJbmx.css","assets/ResultDetail-BLqifyVI.js","assets/CloudBadge-CbpZHKLy.js","assets/CloudBadge-B7b7xKko.css","assets/ResultDetail-CVwsv2ff.css","assets/AdminLogin-BFh47H6c.js","assets/AdminLogin-DFflDgjp.css","assets/AdminLayout-qvvQgX9o.js","assets/AdminLayout-K9Kq5pc4.css","assets/AdminDashboard-CkHQl97R.js","assets/CloudConfig-3znuBWUR.js","assets/CloudConfig-BEjvFHzE.css","assets/SystemConfig-BbG7uBv0.js","assets/SystemConfig-C8bSCuHg.css","assets/SaveRecords-B5cCMWaP.js","assets/SaveRecords-C2kQYC3g.css","assets/AdminDashboard-BIBkHVvW.css","assets/Cleanup-BkDauFCX.js","assets/Cleanup-Cq_o1Z9e.css"])))=>i.map(i=>d[i]); (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))a(o);new MutationObserver(o=>{for(const l of o)if(l.type==="childList")for(const s of l.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&a(s)}).observe(document,{childList:!0,subtree:!0});function n(o){const l={};return o.integrity&&(l.integrity=o.integrity),o.referrerPolicy&&(l.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?l.credentials="include":o.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function a(o){if(o.ep)return;o.ep=!0;const l=n(o);fetch(o.href,l)}})();/** * @vue/shared v3.5.33 * (c) 2018-present Yuxi (Evan) You and Vue contributors @@ -89,4 +89,4 @@ usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:a,curr * vue-router v4.6.4 * (c) 2025 Eduardo San Martin Morote * @license MIT - */let kJ=()=>location.protocol+"//"+location.host;function zE(e,t){const{pathname:n,search:a,hash:o}=t,l=e.indexOf("#");if(l>-1){let s=o.includes(e.slice(l))?e.slice(l).length:1,r=o.slice(s);return r[0]!=="/"&&(r="/"+r),h0(r,"")}return h0(n,e)+a+o}function EJ(e,t,n,a){let o=[],l=[],s=null;const r=({state:p})=>{const g=zE(e,location),v=n.value,h=t.value;let m=0;if(p){if(n.value=g,t.value=p,s&&s===v){s=null;return}m=h?p.position-h.position:0}else a(g);o.forEach(y=>{y(n.value,v,{delta:m,type:mv.pop,direction:m?m>0?qf.forward:qf.back:qf.unknown})})};function u(){s=n.value}function c(p){o.push(p);const g=()=>{const v=o.indexOf(p);v>-1&&o.splice(v,1)};return l.push(g),g}function d(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(Zt({},p.state,{scroll:Yd()}),"")}}function f(){for(const p of l)p();l=[],window.removeEventListener("popstate",r),window.removeEventListener("pagehide",d),document.removeEventListener("visibilitychange",d)}return window.addEventListener("popstate",r),window.addEventListener("pagehide",d),document.addEventListener("visibilitychange",d),{pauseListeners:u,listen:c,destroy:f}}function w0(e,t,n,a=!1,o=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:o?Yd():null}}function xJ(e){const{history:t,location:n}=window,a={value:zE(e,n)},o={value:t.state};o.value||l(a.value,{back:null,current:a.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function l(u,c,d){const f=e.indexOf("#"),p=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+u:kJ()+e+u;try{t[d?"replaceState":"pushState"](c,"",p),o.value=c}catch(g){console.error(g),n[d?"replace":"assign"](p)}}function s(u,c){l(u,Zt({},t.state,w0(o.value.back,u,o.value.forward,!0),c,{position:o.value.position}),!0),a.value=u}function r(u,c){const d=Zt({},o.value,t.state,{forward:u,scroll:Yd()});l(d.current,d,!0),l(u,Zt({},w0(a.value,u,null),{position:d.position+1},c),!1),a.value=u}return{location:a,state:o,push:r,replace:s}}function TJ(e){e=uJ(e);const t=xJ(e),n=EJ(e,t.state,t.location,t.replace);function a(l,s=!0){s||n.pauseListeners(),history.go(l)}const o=Zt({location:"",base:e,go:a,createHref:dJ.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let us=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Rn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Rn||{});const $J={type:us.Static,value:""},OJ=/[a-zA-Z0-9_]/;function NJ(e){if(!e)return[[]];if(e==="/")return[[$J]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${c}": ${g}`)}let n=Rn.Static,a=n;const o=[];let l;function s(){l&&o.push(l),l=[]}let r=0,u,c="",d="";function f(){c&&(n===Rn.Static?l.push({type:us.Static,value:c}):n===Rn.Param||n===Rn.ParamRegExp||n===Rn.ParamRegExpEnd?(l.length>1&&(u==="*"||u==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),l.push({type:us.Param,value:c,regexp:d,repeatable:u==="*"||u==="+",optional:u==="*"||u==="?"})):t("Invalid state to consume buffer"),c="")}function p(){c+=u}for(;rt.length?t.length===1&&t[0]===aa.Static+aa.Segment?1:-1:0}function HE(e,t){let n=0;const a=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const PJ={strict:!1,end:!0,sensitive:!1};function AJ(e,t,n){const a=IJ(NJ(e.path),n),o=Zt(a,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function LJ(e,t){const n=[],a=new Map;t=v0(PJ,t);function o(f){return a.get(f)}function l(f,p,g){const v=!g,h=E0(f);h.aliasOf=g&&g.record;const m=v0(t,f),y=[h];if("alias"in f){const C=typeof f.alias=="string"?[f.alias]:f.alias;for(const k of C)y.push(E0(Zt({},h,{components:g?g.record.components:h.components,path:k,aliasOf:g?g.record:h})))}let b,w;for(const C of y){const{path:k}=C;if(p&&k[0]!=="/"){const E=p.record.path,T=E[E.length-1]==="/"?"":"/";C.path=p.record.path+(k&&T+k)}if(b=AJ(C,p,m),g?g.alias.push(b):(w=w||b,w!==b&&w.alias.push(b),v&&f.name&&!x0(b)&&s(f.name)),KE(b)&&u(b),h.children){const E=h.children;for(let T=0;T{s(w)}:yi}function s(f){if(BE(f)){const p=a.get(f);p&&(a.delete(f),n.splice(n.indexOf(p),1),p.children.forEach(s),p.alias.forEach(s))}else{const p=n.indexOf(f);p>-1&&(n.splice(p,1),f.record.name&&a.delete(f.record.name),f.children.forEach(s),f.alias.forEach(s))}}function r(){return n}function u(f){const p=BJ(f,n);n.splice(p,0,f),f.record.name&&!x0(f)&&a.set(f.record.name,f)}function c(f,p){let g,v={},h,m;if("name"in f&&f.name){if(g=a.get(f.name),!g)throw Tr(wn.MATCHER_NOT_FOUND,{location:f});m=g.record.name,v=Zt(k0(p.params,g.keys.filter(w=>!w.optional).concat(g.parent?g.parent.keys.filter(w=>w.optional):[]).map(w=>w.name)),f.params&&k0(f.params,g.keys.map(w=>w.name))),h=g.stringify(v)}else if(f.path!=null)h=f.path,g=n.find(w=>w.re.test(h)),g&&(v=g.parse(h),m=g.record.name);else{if(g=p.name?a.get(p.name):n.find(w=>w.re.test(p.path)),!g)throw Tr(wn.MATCHER_NOT_FOUND,{location:f,currentLocation:p});m=g.record.name,v=Zt({},p.params,f.params),h=g.stringify(v)}const y=[];let b=g;for(;b;)y.unshift(b.record),b=b.parent;return{name:m,path:h,params:v,matched:y,meta:VJ(y)}}e.forEach(f=>l(f));function d(){n.length=0,a.clear()}return{addRoute:l,resolve:c,removeRoute:s,clearRoutes:d,getRoutes:r,getRecordMatcher:o}}function k0(e,t){const n={};for(const a of t)a in e&&(n[a]=e[a]);return n}function E0(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:DJ(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function DJ(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const a in e.components)t[a]=typeof n=="object"?n[a]:n;return t}function x0(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function VJ(e){return e.reduce((t,n)=>Zt(t,n.meta),{})}function BJ(e,t){let n=0,a=t.length;for(;n!==a;){const l=n+a>>1;HE(e,t[l])<0?a=l:n=l+1}const o=FJ(e);return o&&(a=t.lastIndexOf(o,a-1)),a}function FJ(e){let t=e;for(;t=t.parent;)if(KE(t)&&HE(e,t)===0)return t}function KE({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function T0(e){const t=_e(qd),n=_e(Mm),a=S(()=>{const u=i(e.to);return t.resolve(u)}),o=S(()=>{const{matched:u}=a.value,{length:c}=u,d=u[c-1],f=n.matched;if(!d||!f.length)return-1;const p=f.findIndex(xr.bind(null,d));if(p>-1)return p;const g=$0(u[c-2]);return c>1&&$0(d)===g&&f[f.length-1].path!==g?f.findIndex(xr.bind(null,u[c-2])):p}),l=S(()=>o.value>-1&&jJ(n.params,a.value.params)),s=S(()=>o.value>-1&&o.value===n.matched.length-1&&VE(n.params,a.value.params));function r(u={}){if(WJ(u)){const c=t[i(e.replace)?"replace":"push"](i(e.to)).catch(yi);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:a,href:S(()=>a.value.href),isActive:l,isExactActive:s,navigate:r}}function zJ(e){return e.length===1?e[0]:e}const HJ=ie({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:T0,setup(e,{slots:t}){const n=Rt(T0(e)),{options:a}=_e(qd),o=S(()=>({[O0(e.activeClass,a.linkActiveClass,"router-link-active")]:n.isActive,[O0(e.exactActiveClass,a.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const l=t.default&&zJ(t.default(n));return e.custom?l:Ye("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},l)}}}),KJ=HJ;function WJ(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function jJ(e,t){for(const n in t){const a=t[n],o=e[n];if(typeof a=="string"){if(a!==o)return!1}else if(!Ja(o)||o.length!==a.length||a.some((l,s)=>l.valueOf()!==o[s].valueOf()))return!1}return!0}function $0(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const O0=(e,t,n)=>e??t??n,UJ=ie({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const a=_e(yv),o=S(()=>e.route||a.value),l=_e(b0,0),s=S(()=>{let c=i(l);const{matched:d}=o.value;let f;for(;(f=d[c])&&!f.components;)c++;return c}),r=S(()=>o.value.matched[s.value]);bt(b0,S(()=>s.value+1)),bt(CJ,r),bt(yv,o);const u=A();return fe(()=>[u.value,r.value,e.name],([c,d,f],[p,g,v])=>{d&&(d.instances[f]=c,g&&g!==d&&c&&c===p&&(d.leaveGuards.size||(d.leaveGuards=g.leaveGuards),d.updateGuards.size||(d.updateGuards=g.updateGuards))),c&&d&&(!g||!xr(d,g)||!p)&&(d.enterCallbacks[f]||[]).forEach(h=>h(c))},{flush:"post"}),()=>{const c=o.value,d=e.name,f=r.value,p=f&&f.components[d];if(!p)return N0(n.default,{Component:p,route:c});const g=f.props[d],v=g?g===!0?c.params:typeof g=="function"?g(c):g:null,m=Ye(p,Zt({},v,t,{onVnodeUnmounted:y=>{y.component.isUnmounted&&(f.instances[d]=null)},ref:u}));return N0(n.default,{Component:m,route:c})||m}}});function N0(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const YJ=UJ;function qJ(e){const t=LJ(e.routes,e),n=e.parseQuery||bJ,a=e.stringifyQuery||y0,o=e.history,l=Xr(),s=Xr(),r=Xr(),u=Wt(gl);let c=gl;Ys&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=Uf.bind(null,te=>""+te),f=Uf.bind(null,nJ),p=Uf.bind(null,qi);function g(te,de){let se,Y;return BE(te)?(se=t.getRecordMatcher(te),Y=de):Y=te,t.addRoute(Y,se)}function v(te){const de=t.getRecordMatcher(te);de&&t.removeRoute(de)}function h(){return t.getRoutes().map(te=>te.record)}function m(te){return!!t.getRecordMatcher(te)}function y(te,de){if(de=Zt({},de||u.value),typeof te=="string"){const oe=Yf(n,te,de.path),ce=t.resolve({path:oe.path},de),ge=o.createHref(oe.fullPath);return Zt(oe,ce,{params:p(ce.params),hash:qi(oe.hash),redirectedFrom:void 0,href:ge})}let se;if(te.path!=null)se=Zt({},te,{path:Yf(n,te.path,de.path).path});else{const oe=Zt({},te.params);for(const ce in oe)oe[ce]==null&&delete oe[ce];se=Zt({},te,{params:f(oe)}),de.params=f(de.params)}const Y=t.resolve(se,de),G=te.hash||"";Y.params=d(p(Y.params));const V=lJ(a,Zt({},te,{hash:QZ(G),path:Y.path})),Z=o.createHref(V);return Zt({fullPath:V,hash:G,query:a===y0?wJ(te.query):te.query||{}},Y,{redirectedFrom:void 0,href:Z})}function b(te){return typeof te=="string"?Yf(n,te,u.value.path):Zt({},te)}function w(te,de){if(c!==te)return Tr(wn.NAVIGATION_CANCELLED,{from:de,to:te})}function C(te){return T(te)}function k(te){return C(Zt(b(te),{replace:!0}))}function E(te,de){const se=te.matched[te.matched.length-1];if(se&&se.redirect){const{redirect:Y}=se;let G=typeof Y=="function"?Y(te,de):Y;return typeof G=="string"&&(G=G.includes("?")||G.includes("#")?G=b(G):{path:G},G.params={}),Zt({query:te.query,hash:te.hash,params:G.path!=null?{}:te.params},G)}}function T(te,de){const se=c=y(te),Y=u.value,G=te.state,V=te.force,Z=te.replace===!0,oe=E(se,Y);if(oe)return T(Zt(b(oe),{state:typeof oe=="object"?Zt({},G,oe.state):G,force:V,replace:Z}),de||se);const ce=se;ce.redirectedFrom=de;let ge;return!V&&sJ(a,Y,se)&&(ge=Tr(wn.NAVIGATION_DUPLICATED,{to:ce,from:Y}),H(Y,Y,!0,!1)),(ge?Promise.resolve(ge):O(ce,Y)).catch(me=>Do(me)?Do(me,wn.NAVIGATION_GUARD_REDIRECT)?me:z(me):I(me,ce,Y)).then(me=>{if(me){if(Do(me,wn.NAVIGATION_GUARD_REDIRECT))return T(Zt({replace:Z},b(me.to),{state:typeof me.to=="object"?Zt({},G,me.to.state):G,force:V}),de||ce)}else me=P(ce,Y,!0,Z,G);return _(ce,Y,me),me})}function $(te,de){const se=w(te,de);return se?Promise.reject(se):Promise.resolve()}function N(te){const de=Q.values().next().value;return de&&typeof de.runWithContext=="function"?de.runWithContext(te):te()}function O(te,de){let se;const[Y,G,V]=SJ(te,de);se=Gf(Y.reverse(),"beforeRouteLeave",te,de);for(const oe of Y)oe.leaveGuards.forEach(ce=>{se.push(El(ce,te,de))});const Z=$.bind(null,te,de);return se.push(Z),ue(se).then(()=>{se=[];for(const oe of l.list())se.push(El(oe,te,de));return se.push(Z),ue(se)}).then(()=>{se=Gf(G,"beforeRouteUpdate",te,de);for(const oe of G)oe.updateGuards.forEach(ce=>{se.push(El(ce,te,de))});return se.push(Z),ue(se)}).then(()=>{se=[];for(const oe of V)if(oe.beforeEnter)if(Ja(oe.beforeEnter))for(const ce of oe.beforeEnter)se.push(El(ce,te,de));else se.push(El(oe.beforeEnter,te,de));return se.push(Z),ue(se)}).then(()=>(te.matched.forEach(oe=>oe.enterCallbacks={}),se=Gf(V,"beforeRouteEnter",te,de,N),se.push(Z),ue(se))).then(()=>{se=[];for(const oe of s.list())se.push(El(oe,te,de));return se.push(Z),ue(se)}).catch(oe=>Do(oe,wn.NAVIGATION_CANCELLED)?oe:Promise.reject(oe))}function _(te,de,se){r.list().forEach(Y=>N(()=>Y(te,de,se)))}function P(te,de,se,Y,G){const V=w(te,de);if(V)return V;const Z=de===gl,oe=Ys?history.state:{};se&&(Y||Z?o.replace(te.fullPath,Zt({scroll:Z&&oe&&oe.scroll},G)):o.push(te.fullPath,G)),u.value=te,H(te,de,se,Z),z()}let D;function W(){D||(D=o.listen((te,de,se)=>{if(!ee.listening)return;const Y=y(te),G=E(Y,ee.currentRoute.value);if(G){T(Zt(G,{replace:!0,force:!0}),Y).catch(yi);return}c=Y;const V=u.value;Ys&&vJ(g0(V.fullPath,se.delta),Yd()),O(Y,V).catch(Z=>Do(Z,wn.NAVIGATION_ABORTED|wn.NAVIGATION_CANCELLED)?Z:Do(Z,wn.NAVIGATION_GUARD_REDIRECT)?(T(Zt(b(Z.to),{force:!0}),Y).then(oe=>{Do(oe,wn.NAVIGATION_ABORTED|wn.NAVIGATION_DUPLICATED)&&!se.delta&&se.type===mv.pop&&o.go(-1,!1)}).catch(yi),Promise.reject()):(se.delta&&o.go(-se.delta,!1),I(Z,Y,V))).then(Z=>{Z=Z||P(Y,V,!1),Z&&(se.delta&&!Do(Z,wn.NAVIGATION_CANCELLED)?o.go(-se.delta,!1):se.type===mv.pop&&Do(Z,wn.NAVIGATION_ABORTED|wn.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),_(Y,V,Z)}).catch(yi)}))}let U=Xr(),F=Xr(),R;function I(te,de,se){z(te);const Y=F.list();return Y.length?Y.forEach(G=>G(te,de,se)):console.error(te),Promise.reject(te)}function L(){return R&&u.value!==gl?Promise.resolve():new Promise((te,de)=>{U.add([te,de])})}function z(te){return R||(R=!te,W(),U.list().forEach(([de,se])=>te?se(te):de()),U.reset()),te}function H(te,de,se,Y){const{scrollBehavior:G}=e;if(!Ys||!G)return Promise.resolve();const V=!se&&hJ(g0(te.fullPath,0))||(Y||!se)&&history.state&&history.state.scroll||null;return Ae().then(()=>G(te,de,V)).then(Z=>Z&&pJ(Z)).catch(Z=>I(Z,te,de))}const K=te=>o.go(te);let q;const Q=new Set,ee={currentRoute:u,listening:!0,addRoute:g,removeRoute:v,clearRoutes:t.clearRoutes,hasRoute:m,getRoutes:h,resolve:y,options:e,push:C,replace:k,go:K,back:()=>K(-1),forward:()=>K(1),beforeEach:l.add,beforeResolve:s.add,afterEach:r.add,onError:F.add,isReady:L,install(te){te.component("RouterLink",KJ),te.component("RouterView",YJ),te.config.globalProperties.$router=ee,Object.defineProperty(te.config.globalProperties,"$route",{enumerable:!0,get:()=>i(u)}),Ys&&!q&&u.value===gl&&(q=!0,C(o.location).catch(Y=>{}));const de={};for(const Y in gl)Object.defineProperty(de,Y,{get:()=>u.value[Y],enumerable:!0});te.provide(qd,ee),te.provide(Mm,rd(de)),te.provide(yv,u);const se=te.unmount;Q.add(te),te.unmount=function(){Q.delete(te),Q.size<1&&(c=gl,D&&D(),D=null,u.value=gl,q=!1,R=!1),se()}}};function ue(te){return te.reduce((de,se)=>de.then(()=>N(se)),Promise.resolve())}return ee}function oQ(){return _e(qd)}function lQ(e){return _e(Mm)}const GJ=[{path:"/",name:"home",component:()=>io(()=>import("./HomePage--KOSYv1j.js"),__vite__mapDeps([0,1,2]))},{path:"/search",name:"search",component:()=>io(()=>import("./SearchResult-DLXOMefi.js"),__vite__mapDeps([3,4,1,5]))},{path:"/result/:id",name:"result-detail",component:()=>io(()=>import("./ResultDetail-DdE8ZRMU.js"),__vite__mapDeps([6,7,4,1,8,9]))},{path:"/admin/login",name:"admin-login",component:()=>io(()=>import("./AdminLogin-DxE2POP4.js"),__vite__mapDeps([10,1,11]))},{path:"/admin",component:()=>io(()=>import("./AdminLayout-DHRMhPUk.js"),__vite__mapDeps([12,1,13])),meta:{requiresAuth:!0},children:[{path:"",redirect:"/admin/dashboard"},{path:"dashboard",name:"admin-dashboard",component:()=>io(()=>import("./AdminDashboard-BvLIjTGZ.js"),__vite__mapDeps([14,1,15,4,7,8,16,17,18,19,20,21]))},{path:"cloud-configs",name:"admin-cloud-configs",component:()=>io(()=>import("./CloudConfig-BADbnuPV.js"),__vite__mapDeps([15,4,1,7,8,16]))},{path:"cleanup",name:"admin-cleanup",component:()=>io(()=>import("./Cleanup-CwLcANun.js"),__vite__mapDeps([22,1,23]))},{path:"system",name:"admin-system",component:()=>io(()=>import("./SystemConfig-C3is0eeI.js"),__vite__mapDeps([17,1,18]))},{path:"save-records",name:"admin-save-records",component:()=>io(()=>import("./SaveRecords-DLmXAM3V.js"),__vite__mapDeps([19,1,20]))}]}],WE=qJ({history:TJ(),routes:GJ});WE.beforeEach((e,t,n)=>{const a=localStorage.getItem("admin_token");e.meta.requiresAuth&&!a?n("/admin/login"):n()});const Gd=lw(FZ);Gd.use(y$());Gd.use(WE);Gd.use(VZ);Gd.mount("#app");export{vP as A,Ae as B,ZJ as C,XJ as D,iZ as E,He as F,eQ as G,JJ as H,tQ as I,al as J,dt as K,Nt as L,Oo as M,aQ as N,QJ as O,nQ as P,Pv as Q,x as a,j as b,B as c,ie as d,le as e,J as f,en as g,A as h,Rt as i,Ot as j,i as k,St as l,$r as m,M as n,mt as o,je as p,Xe as q,Ct as r,QP as s,ke as t,oQ as u,S as v,ne as w,fe as x,re as y,lQ as z}; + */let kJ=()=>location.protocol+"//"+location.host;function zE(e,t){const{pathname:n,search:a,hash:o}=t,l=e.indexOf("#");if(l>-1){let s=o.includes(e.slice(l))?e.slice(l).length:1,r=o.slice(s);return r[0]!=="/"&&(r="/"+r),h0(r,"")}return h0(n,e)+a+o}function EJ(e,t,n,a){let o=[],l=[],s=null;const r=({state:p})=>{const g=zE(e,location),v=n.value,h=t.value;let m=0;if(p){if(n.value=g,t.value=p,s&&s===v){s=null;return}m=h?p.position-h.position:0}else a(g);o.forEach(y=>{y(n.value,v,{delta:m,type:mv.pop,direction:m?m>0?qf.forward:qf.back:qf.unknown})})};function u(){s=n.value}function c(p){o.push(p);const g=()=>{const v=o.indexOf(p);v>-1&&o.splice(v,1)};return l.push(g),g}function d(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(Zt({},p.state,{scroll:Yd()}),"")}}function f(){for(const p of l)p();l=[],window.removeEventListener("popstate",r),window.removeEventListener("pagehide",d),document.removeEventListener("visibilitychange",d)}return window.addEventListener("popstate",r),window.addEventListener("pagehide",d),document.addEventListener("visibilitychange",d),{pauseListeners:u,listen:c,destroy:f}}function w0(e,t,n,a=!1,o=!1){return{back:e,current:t,forward:n,replaced:a,position:window.history.length,scroll:o?Yd():null}}function xJ(e){const{history:t,location:n}=window,a={value:zE(e,n)},o={value:t.state};o.value||l(a.value,{back:null,current:a.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function l(u,c,d){const f=e.indexOf("#"),p=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+u:kJ()+e+u;try{t[d?"replaceState":"pushState"](c,"",p),o.value=c}catch(g){console.error(g),n[d?"replace":"assign"](p)}}function s(u,c){l(u,Zt({},t.state,w0(o.value.back,u,o.value.forward,!0),c,{position:o.value.position}),!0),a.value=u}function r(u,c){const d=Zt({},o.value,t.state,{forward:u,scroll:Yd()});l(d.current,d,!0),l(u,Zt({},w0(a.value,u,null),{position:d.position+1},c),!1),a.value=u}return{location:a,state:o,push:r,replace:s}}function TJ(e){e=uJ(e);const t=xJ(e),n=EJ(e,t.state,t.location,t.replace);function a(l,s=!0){s||n.pauseListeners(),history.go(l)}const o=Zt({location:"",base:e,go:a,createHref:dJ.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}let us=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var Rn=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(Rn||{});const $J={type:us.Static,value:""},OJ=/[a-zA-Z0-9_]/;function NJ(e){if(!e)return[[]];if(e==="/")return[[$J]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${c}": ${g}`)}let n=Rn.Static,a=n;const o=[];let l;function s(){l&&o.push(l),l=[]}let r=0,u,c="",d="";function f(){c&&(n===Rn.Static?l.push({type:us.Static,value:c}):n===Rn.Param||n===Rn.ParamRegExp||n===Rn.ParamRegExpEnd?(l.length>1&&(u==="*"||u==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),l.push({type:us.Param,value:c,regexp:d,repeatable:u==="*"||u==="+",optional:u==="*"||u==="?"})):t("Invalid state to consume buffer"),c="")}function p(){c+=u}for(;rt.length?t.length===1&&t[0]===aa.Static+aa.Segment?1:-1:0}function HE(e,t){let n=0;const a=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const PJ={strict:!1,end:!0,sensitive:!1};function AJ(e,t,n){const a=IJ(NJ(e.path),n),o=Zt(a,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function LJ(e,t){const n=[],a=new Map;t=v0(PJ,t);function o(f){return a.get(f)}function l(f,p,g){const v=!g,h=E0(f);h.aliasOf=g&&g.record;const m=v0(t,f),y=[h];if("alias"in f){const C=typeof f.alias=="string"?[f.alias]:f.alias;for(const k of C)y.push(E0(Zt({},h,{components:g?g.record.components:h.components,path:k,aliasOf:g?g.record:h})))}let b,w;for(const C of y){const{path:k}=C;if(p&&k[0]!=="/"){const E=p.record.path,T=E[E.length-1]==="/"?"":"/";C.path=p.record.path+(k&&T+k)}if(b=AJ(C,p,m),g?g.alias.push(b):(w=w||b,w!==b&&w.alias.push(b),v&&f.name&&!x0(b)&&s(f.name)),KE(b)&&u(b),h.children){const E=h.children;for(let T=0;T{s(w)}:yi}function s(f){if(BE(f)){const p=a.get(f);p&&(a.delete(f),n.splice(n.indexOf(p),1),p.children.forEach(s),p.alias.forEach(s))}else{const p=n.indexOf(f);p>-1&&(n.splice(p,1),f.record.name&&a.delete(f.record.name),f.children.forEach(s),f.alias.forEach(s))}}function r(){return n}function u(f){const p=BJ(f,n);n.splice(p,0,f),f.record.name&&!x0(f)&&a.set(f.record.name,f)}function c(f,p){let g,v={},h,m;if("name"in f&&f.name){if(g=a.get(f.name),!g)throw Tr(wn.MATCHER_NOT_FOUND,{location:f});m=g.record.name,v=Zt(k0(p.params,g.keys.filter(w=>!w.optional).concat(g.parent?g.parent.keys.filter(w=>w.optional):[]).map(w=>w.name)),f.params&&k0(f.params,g.keys.map(w=>w.name))),h=g.stringify(v)}else if(f.path!=null)h=f.path,g=n.find(w=>w.re.test(h)),g&&(v=g.parse(h),m=g.record.name);else{if(g=p.name?a.get(p.name):n.find(w=>w.re.test(p.path)),!g)throw Tr(wn.MATCHER_NOT_FOUND,{location:f,currentLocation:p});m=g.record.name,v=Zt({},p.params,f.params),h=g.stringify(v)}const y=[];let b=g;for(;b;)y.unshift(b.record),b=b.parent;return{name:m,path:h,params:v,matched:y,meta:VJ(y)}}e.forEach(f=>l(f));function d(){n.length=0,a.clear()}return{addRoute:l,resolve:c,removeRoute:s,clearRoutes:d,getRoutes:r,getRecordMatcher:o}}function k0(e,t){const n={};for(const a of t)a in e&&(n[a]=e[a]);return n}function E0(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:DJ(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function DJ(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const a in e.components)t[a]=typeof n=="object"?n[a]:n;return t}function x0(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function VJ(e){return e.reduce((t,n)=>Zt(t,n.meta),{})}function BJ(e,t){let n=0,a=t.length;for(;n!==a;){const l=n+a>>1;HE(e,t[l])<0?a=l:n=l+1}const o=FJ(e);return o&&(a=t.lastIndexOf(o,a-1)),a}function FJ(e){let t=e;for(;t=t.parent;)if(KE(t)&&HE(e,t)===0)return t}function KE({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function T0(e){const t=_e(qd),n=_e(Mm),a=S(()=>{const u=i(e.to);return t.resolve(u)}),o=S(()=>{const{matched:u}=a.value,{length:c}=u,d=u[c-1],f=n.matched;if(!d||!f.length)return-1;const p=f.findIndex(xr.bind(null,d));if(p>-1)return p;const g=$0(u[c-2]);return c>1&&$0(d)===g&&f[f.length-1].path!==g?f.findIndex(xr.bind(null,u[c-2])):p}),l=S(()=>o.value>-1&&jJ(n.params,a.value.params)),s=S(()=>o.value>-1&&o.value===n.matched.length-1&&VE(n.params,a.value.params));function r(u={}){if(WJ(u)){const c=t[i(e.replace)?"replace":"push"](i(e.to)).catch(yi);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:a,href:S(()=>a.value.href),isActive:l,isExactActive:s,navigate:r}}function zJ(e){return e.length===1?e[0]:e}const HJ=ie({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:T0,setup(e,{slots:t}){const n=Rt(T0(e)),{options:a}=_e(qd),o=S(()=>({[O0(e.activeClass,a.linkActiveClass,"router-link-active")]:n.isActive,[O0(e.exactActiveClass,a.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const l=t.default&&zJ(t.default(n));return e.custom?l:Ye("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},l)}}}),KJ=HJ;function WJ(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function jJ(e,t){for(const n in t){const a=t[n],o=e[n];if(typeof a=="string"){if(a!==o)return!1}else if(!Ja(o)||o.length!==a.length||a.some((l,s)=>l.valueOf()!==o[s].valueOf()))return!1}return!0}function $0(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const O0=(e,t,n)=>e??t??n,UJ=ie({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const a=_e(yv),o=S(()=>e.route||a.value),l=_e(b0,0),s=S(()=>{let c=i(l);const{matched:d}=o.value;let f;for(;(f=d[c])&&!f.components;)c++;return c}),r=S(()=>o.value.matched[s.value]);bt(b0,S(()=>s.value+1)),bt(CJ,r),bt(yv,o);const u=A();return fe(()=>[u.value,r.value,e.name],([c,d,f],[p,g,v])=>{d&&(d.instances[f]=c,g&&g!==d&&c&&c===p&&(d.leaveGuards.size||(d.leaveGuards=g.leaveGuards),d.updateGuards.size||(d.updateGuards=g.updateGuards))),c&&d&&(!g||!xr(d,g)||!p)&&(d.enterCallbacks[f]||[]).forEach(h=>h(c))},{flush:"post"}),()=>{const c=o.value,d=e.name,f=r.value,p=f&&f.components[d];if(!p)return N0(n.default,{Component:p,route:c});const g=f.props[d],v=g?g===!0?c.params:typeof g=="function"?g(c):g:null,m=Ye(p,Zt({},v,t,{onVnodeUnmounted:y=>{y.component.isUnmounted&&(f.instances[d]=null)},ref:u}));return N0(n.default,{Component:m,route:c})||m}}});function N0(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const YJ=UJ;function qJ(e){const t=LJ(e.routes,e),n=e.parseQuery||bJ,a=e.stringifyQuery||y0,o=e.history,l=Xr(),s=Xr(),r=Xr(),u=Wt(gl);let c=gl;Ys&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=Uf.bind(null,te=>""+te),f=Uf.bind(null,nJ),p=Uf.bind(null,qi);function g(te,de){let se,Y;return BE(te)?(se=t.getRecordMatcher(te),Y=de):Y=te,t.addRoute(Y,se)}function v(te){const de=t.getRecordMatcher(te);de&&t.removeRoute(de)}function h(){return t.getRoutes().map(te=>te.record)}function m(te){return!!t.getRecordMatcher(te)}function y(te,de){if(de=Zt({},de||u.value),typeof te=="string"){const oe=Yf(n,te,de.path),ce=t.resolve({path:oe.path},de),ge=o.createHref(oe.fullPath);return Zt(oe,ce,{params:p(ce.params),hash:qi(oe.hash),redirectedFrom:void 0,href:ge})}let se;if(te.path!=null)se=Zt({},te,{path:Yf(n,te.path,de.path).path});else{const oe=Zt({},te.params);for(const ce in oe)oe[ce]==null&&delete oe[ce];se=Zt({},te,{params:f(oe)}),de.params=f(de.params)}const Y=t.resolve(se,de),G=te.hash||"";Y.params=d(p(Y.params));const V=lJ(a,Zt({},te,{hash:QZ(G),path:Y.path})),Z=o.createHref(V);return Zt({fullPath:V,hash:G,query:a===y0?wJ(te.query):te.query||{}},Y,{redirectedFrom:void 0,href:Z})}function b(te){return typeof te=="string"?Yf(n,te,u.value.path):Zt({},te)}function w(te,de){if(c!==te)return Tr(wn.NAVIGATION_CANCELLED,{from:de,to:te})}function C(te){return T(te)}function k(te){return C(Zt(b(te),{replace:!0}))}function E(te,de){const se=te.matched[te.matched.length-1];if(se&&se.redirect){const{redirect:Y}=se;let G=typeof Y=="function"?Y(te,de):Y;return typeof G=="string"&&(G=G.includes("?")||G.includes("#")?G=b(G):{path:G},G.params={}),Zt({query:te.query,hash:te.hash,params:G.path!=null?{}:te.params},G)}}function T(te,de){const se=c=y(te),Y=u.value,G=te.state,V=te.force,Z=te.replace===!0,oe=E(se,Y);if(oe)return T(Zt(b(oe),{state:typeof oe=="object"?Zt({},G,oe.state):G,force:V,replace:Z}),de||se);const ce=se;ce.redirectedFrom=de;let ge;return!V&&sJ(a,Y,se)&&(ge=Tr(wn.NAVIGATION_DUPLICATED,{to:ce,from:Y}),H(Y,Y,!0,!1)),(ge?Promise.resolve(ge):O(ce,Y)).catch(me=>Do(me)?Do(me,wn.NAVIGATION_GUARD_REDIRECT)?me:z(me):I(me,ce,Y)).then(me=>{if(me){if(Do(me,wn.NAVIGATION_GUARD_REDIRECT))return T(Zt({replace:Z},b(me.to),{state:typeof me.to=="object"?Zt({},G,me.to.state):G,force:V}),de||ce)}else me=P(ce,Y,!0,Z,G);return _(ce,Y,me),me})}function $(te,de){const se=w(te,de);return se?Promise.reject(se):Promise.resolve()}function N(te){const de=Q.values().next().value;return de&&typeof de.runWithContext=="function"?de.runWithContext(te):te()}function O(te,de){let se;const[Y,G,V]=SJ(te,de);se=Gf(Y.reverse(),"beforeRouteLeave",te,de);for(const oe of Y)oe.leaveGuards.forEach(ce=>{se.push(El(ce,te,de))});const Z=$.bind(null,te,de);return se.push(Z),ue(se).then(()=>{se=[];for(const oe of l.list())se.push(El(oe,te,de));return se.push(Z),ue(se)}).then(()=>{se=Gf(G,"beforeRouteUpdate",te,de);for(const oe of G)oe.updateGuards.forEach(ce=>{se.push(El(ce,te,de))});return se.push(Z),ue(se)}).then(()=>{se=[];for(const oe of V)if(oe.beforeEnter)if(Ja(oe.beforeEnter))for(const ce of oe.beforeEnter)se.push(El(ce,te,de));else se.push(El(oe.beforeEnter,te,de));return se.push(Z),ue(se)}).then(()=>(te.matched.forEach(oe=>oe.enterCallbacks={}),se=Gf(V,"beforeRouteEnter",te,de,N),se.push(Z),ue(se))).then(()=>{se=[];for(const oe of s.list())se.push(El(oe,te,de));return se.push(Z),ue(se)}).catch(oe=>Do(oe,wn.NAVIGATION_CANCELLED)?oe:Promise.reject(oe))}function _(te,de,se){r.list().forEach(Y=>N(()=>Y(te,de,se)))}function P(te,de,se,Y,G){const V=w(te,de);if(V)return V;const Z=de===gl,oe=Ys?history.state:{};se&&(Y||Z?o.replace(te.fullPath,Zt({scroll:Z&&oe&&oe.scroll},G)):o.push(te.fullPath,G)),u.value=te,H(te,de,se,Z),z()}let D;function W(){D||(D=o.listen((te,de,se)=>{if(!ee.listening)return;const Y=y(te),G=E(Y,ee.currentRoute.value);if(G){T(Zt(G,{replace:!0,force:!0}),Y).catch(yi);return}c=Y;const V=u.value;Ys&&vJ(g0(V.fullPath,se.delta),Yd()),O(Y,V).catch(Z=>Do(Z,wn.NAVIGATION_ABORTED|wn.NAVIGATION_CANCELLED)?Z:Do(Z,wn.NAVIGATION_GUARD_REDIRECT)?(T(Zt(b(Z.to),{force:!0}),Y).then(oe=>{Do(oe,wn.NAVIGATION_ABORTED|wn.NAVIGATION_DUPLICATED)&&!se.delta&&se.type===mv.pop&&o.go(-1,!1)}).catch(yi),Promise.reject()):(se.delta&&o.go(-se.delta,!1),I(Z,Y,V))).then(Z=>{Z=Z||P(Y,V,!1),Z&&(se.delta&&!Do(Z,wn.NAVIGATION_CANCELLED)?o.go(-se.delta,!1):se.type===mv.pop&&Do(Z,wn.NAVIGATION_ABORTED|wn.NAVIGATION_DUPLICATED)&&o.go(-1,!1)),_(Y,V,Z)}).catch(yi)}))}let U=Xr(),F=Xr(),R;function I(te,de,se){z(te);const Y=F.list();return Y.length?Y.forEach(G=>G(te,de,se)):console.error(te),Promise.reject(te)}function L(){return R&&u.value!==gl?Promise.resolve():new Promise((te,de)=>{U.add([te,de])})}function z(te){return R||(R=!te,W(),U.list().forEach(([de,se])=>te?se(te):de()),U.reset()),te}function H(te,de,se,Y){const{scrollBehavior:G}=e;if(!Ys||!G)return Promise.resolve();const V=!se&&hJ(g0(te.fullPath,0))||(Y||!se)&&history.state&&history.state.scroll||null;return Ae().then(()=>G(te,de,V)).then(Z=>Z&&pJ(Z)).catch(Z=>I(Z,te,de))}const K=te=>o.go(te);let q;const Q=new Set,ee={currentRoute:u,listening:!0,addRoute:g,removeRoute:v,clearRoutes:t.clearRoutes,hasRoute:m,getRoutes:h,resolve:y,options:e,push:C,replace:k,go:K,back:()=>K(-1),forward:()=>K(1),beforeEach:l.add,beforeResolve:s.add,afterEach:r.add,onError:F.add,isReady:L,install(te){te.component("RouterLink",KJ),te.component("RouterView",YJ),te.config.globalProperties.$router=ee,Object.defineProperty(te.config.globalProperties,"$route",{enumerable:!0,get:()=>i(u)}),Ys&&!q&&u.value===gl&&(q=!0,C(o.location).catch(Y=>{}));const de={};for(const Y in gl)Object.defineProperty(de,Y,{get:()=>u.value[Y],enumerable:!0});te.provide(qd,ee),te.provide(Mm,rd(de)),te.provide(yv,u);const se=te.unmount;Q.add(te),te.unmount=function(){Q.delete(te),Q.size<1&&(c=gl,D&&D(),D=null,u.value=gl,q=!1,R=!1),se()}}};function ue(te){return te.reduce((de,se)=>de.then(()=>N(se)),Promise.resolve())}return ee}function oQ(){return _e(qd)}function lQ(e){return _e(Mm)}const GJ=[{path:"/",name:"home",component:()=>io(()=>import("./HomePage-CdqgUFQt.js"),__vite__mapDeps([0,1,2]))},{path:"/search",name:"search",component:()=>io(()=>import("./SearchResult-EeENDml7.js"),__vite__mapDeps([3,4,1,5]))},{path:"/result/:id",name:"result-detail",component:()=>io(()=>import("./ResultDetail-BLqifyVI.js"),__vite__mapDeps([6,7,4,1,8,9]))},{path:"/admin/login",name:"admin-login",component:()=>io(()=>import("./AdminLogin-BFh47H6c.js"),__vite__mapDeps([10,1,11]))},{path:"/admin",component:()=>io(()=>import("./AdminLayout-qvvQgX9o.js"),__vite__mapDeps([12,1,13])),meta:{requiresAuth:!0},children:[{path:"",redirect:"/admin/dashboard"},{path:"dashboard",name:"admin-dashboard",component:()=>io(()=>import("./AdminDashboard-CkHQl97R.js"),__vite__mapDeps([14,1,15,4,7,8,16,17,18,19,20,21]))},{path:"cloud-configs",name:"admin-cloud-configs",component:()=>io(()=>import("./CloudConfig-3znuBWUR.js"),__vite__mapDeps([15,4,1,7,8,16]))},{path:"cleanup",name:"admin-cleanup",component:()=>io(()=>import("./Cleanup-BkDauFCX.js"),__vite__mapDeps([22,1,23]))},{path:"system",name:"admin-system",component:()=>io(()=>import("./SystemConfig-BbG7uBv0.js"),__vite__mapDeps([17,1,18]))},{path:"save-records",name:"admin-save-records",component:()=>io(()=>import("./SaveRecords-B5cCMWaP.js"),__vite__mapDeps([19,1,20]))}]}],WE=qJ({history:TJ(),routes:GJ});WE.beforeEach((e,t,n)=>{const a=localStorage.getItem("admin_token");e.meta.requiresAuth&&!a?n("/admin/login"):n()});const Gd=lw(FZ);Gd.use(y$());Gd.use(WE);Gd.use(VZ);Gd.mount("#app");export{vP as A,Ae as B,ZJ as C,XJ as D,iZ as E,He as F,eQ as G,JJ as H,tQ as I,al as J,dt as K,Nt as L,Oo as M,aQ as N,QJ as O,nQ as P,Pv as Q,x as a,j as b,B as c,ie as d,le as e,J as f,en as g,A as h,Rt as i,Ot as j,i as k,St as l,$r as m,M as n,mt as o,je as p,Xe as q,Ct as r,QP as s,ke as t,oQ as u,S as v,ne as w,fe as x,re as y,lQ as z}; diff --git a/source_clean/frontend/index.html b/source_clean/frontend/index.html index b8f2549..14566cf 100644 --- a/source_clean/frontend/index.html +++ b/source_clean/frontend/index.html @@ -21,7 +21,7 @@ } })(); - + diff --git a/source_clean/src/main.ts b/source_clean/src/main.ts index 0742c36..7e91d81 100755 --- a/source_clean/src/main.ts +++ b/source_clean/src/main.ts @@ -183,6 +183,23 @@ async function start(): Promise { setInterval(() => { refreshAllStorageInfo().catch(err => console.error('[Storage] Refresh error:', err.message)); }, STORAGE_REFRESH_INTERVAL); setTimeout(() => { refreshAllStorageInfo().catch(err => console.error('[Storage] Initial refresh error:', err.message)); }, 60000); + + // Daily Report scheduler — check every 60 seconds + const DAILY_REPORT_CHECK_INTERVAL = 60 * 1000; + setInterval(() => { + try { + const { runDailyReportIfScheduled } = require('./services/daily-report.service'); + runDailyReportIfScheduled().catch(err => console.error('[DailyReport] Scheduler error:', err.message)); + } catch {} + }, DAILY_REPORT_CHECK_INTERVAL); + // Also run once 30s after startup (catch case where server starts at 08:00-08:05) + setTimeout(() => { + try { + const { runDailyReportIfScheduled } = require('./services/daily-report.service'); + runDailyReportIfScheduled().catch(err => console.error('[DailyReport] Initial check error:', err.message)); + } catch {} + }, 30000); + const server = app.listen(config.port, () => { console.log(`[Server] CloudSearch Backend running on port ${config.port} (${config.nodeEnv})`); }); diff --git a/source_clean/src/routes/admin.routes.ts b/source_clean/src/routes/admin.routes.ts index c24623c..27dc33b 100644 --- a/source_clean/src/routes/admin.routes.ts +++ b/source_clean/src/routes/admin.routes.ts @@ -796,5 +796,71 @@ router.delete('/admin/push-users/:id', (req: Request, res: Response) => { } }); + + +// ═══════════════════════════════════════════════ +// Daily Report +// ═══════════════════════════════════════════════ + +/** GET /api/admin/daily-report/config */ +router.get('/admin/daily-report/config', (_req, res) => { + try { + const { getDailyReportConfig } = require('../services/daily-report.service'); + const cfg = getDailyReportConfig(); + res.json(cfg); + } catch (err: any) { + res.status(500).json({ error: err.message || 'Failed to get daily report config' }); + } +}); + +/** PUT /api/admin/daily-report/config */ +router.put('/admin/daily-report/config', (req, res) => { + try { + const { saveDailyReportConfig } = require('../services/daily-report.service'); + saveDailyReportConfig(req.body); + const { getDailyReportConfig } = require('../services/daily-report.service'); + res.json(getDailyReportConfig()); + } catch (err: any) { + res.status(500).json({ error: err.message || 'Failed to save daily report config' }); + } +}); + +/** GET /api/admin/daily-report/preview */ +router.get('/admin/daily-report/preview', (req, res) => { + try { + const { previewDailyReport, generateDailyReport } = require('../services/daily-report.service'); + const date = req.query.date as string || undefined; + const content = previewDailyReport(date); + const report = generateDailyReport(date); + res.json({ content, report }); + } catch (err: any) { + res.status(500).json({ error: err.message || 'Failed to preview daily report' }); + } +}); + +/** POST /api/admin/daily-report/test — send a test report immediately */ +router.post('/admin/daily-report/test', async (_req, res) => { + try { + const { sendTestDailyReport } = require('../services/daily-report.service'); + const result = await sendTestDailyReport(); + res.json(result); + } catch (err: any) { + res.status(500).json({ error: err.message || 'Failed to send test report' }); + } +}); + +/** GET /api/admin/daily-report/last-run */ +router.get('/admin/daily-report/last-run', (_req, res) => { + try { + const { getSystemConfig } = require('../admin/system-config.service'); + const raw = getSystemConfig('daily_report_last_run') || '{}'; + let data: any = {}; + try { data = JSON.parse(raw); } catch {} + res.json(data); + } catch (err: any) { + res.status(500).json({ error: err.message }); + } +}); + export default router; diff --git a/source_clean/src/services/daily-report.service.ts b/source_clean/src/services/daily-report.service.ts new file mode 100644 index 0000000..def74a0 --- /dev/null +++ b/source_clean/src/services/daily-report.service.ts @@ -0,0 +1,339 @@ +/** + * Daily Report Service — generates a summary of yesterday's cloud storage activity + * and sends it through configured notification channels at 08:00 daily. + */ +import { getDb } from '../database/database'; +import { getSystemConfig } from '../admin/system-config.service'; +import { getCloudConfigs } from '../cloud/credential.service'; +import { notify } from '../cloud/notification.service'; + +// ═══════════════════════════════════════════════ +// Types +// ═══════════════════════════════════════════════ + +export interface DailyReportConfig { + enabled: boolean; + time: string; // "HH:mm" e.g. "08:00" + includeSearch: boolean; + includeSaves: boolean; + includeStorage: boolean; + includeUsers: boolean; +} + +export interface DailyReport { + date: string; + searchCount: number; + uniqueSearchers: number; + saveCounts: { total: number; success: number; fail: number }; + byCloud: Array<{ + cloudType: string; + nickname: string; + saves: number; + successes: number; + storageUsed: string; + storageTotal: string; + isActive: boolean; + }>; + uniqueSavers: number; +} + +// ═══════════════════════════════════════════════ +// Config +// ═══════════════════════════════════════════════ + +export function getDailyReportConfig(): DailyReportConfig { + const raw = getSystemConfig('daily_report_config') || '{}'; + let parsed: Partial = {}; + try { parsed = JSON.parse(raw); } catch {} + return { + enabled: parsed.enabled !== false, + time: parsed.time || '08:00', + includeSearch: parsed.includeSearch !== false, + includeSaves: parsed.includeSaves !== false, + includeStorage: parsed.includeStorage !== false, + includeUsers: parsed.includeUsers !== false, + }; +} + +export function saveDailyReportConfig(cfg: Partial): void { + const current = getDailyReportConfig(); + const merged = { ...current, ...cfg }; + const { getDb } = require('../database/database'); + const db = getDb(); + const existing = db.prepare("SELECT key FROM system_configs WHERE key = 'daily_report_config'").get(); + if (existing) { + db.prepare("UPDATE system_configs SET value = ?, updated_at = datetime('now','localtime') WHERE key = 'daily_report_config'") + .run(JSON.stringify(merged)); + } else { + db.prepare("INSERT INTO system_configs (key, value, description) VALUES (?, ?, ?)") + .run('daily_report_config', JSON.stringify(merged), 'Daily report configuration'); + } +} + +// ═══════════════════════════════════════════════ +// Report Generation +// ═══════════════════════════════════════════════ + +function getYesterday(): string { + const d = new Date(); + d.setDate(d.getDate() - 1); + return d.toISOString().slice(0, 10); // "2026-05-16" +} + +function getYesterdayRange(): { start: string; end: string } { + const date = getYesterday(); + return { + start: `${date}T00:00:00`, + end: `${date}T23:59:59`, + }; +} + +export function generateDailyReport(dateOverride?: string): DailyReport { + const db = getDb(); + const { start, end } = dateOverride + ? { start: `${dateOverride}T00:00:00`, end: `${dateOverride}T23:59:59` } + : getYesterdayRange(); + const date = dateOverride || getYesterday(); + + // ── Searches ── + let searchCount = 0; + let uniqueSearchers = 0; + try { + const searchRow = db.prepare( + "SELECT COUNT(*) as cnt FROM search_stats WHERE created_at >= ? AND created_at <= ?" + ).get(start, end) as any; + searchCount = searchRow?.cnt || 0; + + const searcherRow = db.prepare( + "SELECT COUNT(DISTINCT ip_address) as cnt FROM search_stats WHERE created_at >= ? AND created_at <= ?" + ).get(start, end) as any; + uniqueSearchers = searcherRow?.cnt || 0; + } catch {} + + // ── Saves ── + let totalSaves = 0; + let successSaves = 0; + let failSaves = 0; + let uniqueSavers = 0; + try { + const saveRow = db.prepare( + "SELECT COUNT(*) as cnt FROM save_records WHERE created_at >= ? AND created_at <= ?" + ).get(start, end) as any; + totalSaves = saveRow?.cnt || 0; + + const successRow = db.prepare( + "SELECT COUNT(*) as cnt FROM save_records WHERE created_at >= ? AND created_at <= ? AND status = 'success'" + ).get(start, end) as any; + successSaves = successRow?.cnt || 0; + + const failRow = db.prepare( + "SELECT COUNT(*) as cnt FROM save_records WHERE created_at >= ? AND created_at <= ? AND status != 'success'" + ).get(start, end) as any; + failSaves = failRow?.cnt || 0; + + const saverRow = db.prepare( + "SELECT COUNT(DISTINCT ip_address) as cnt FROM save_records WHERE created_at >= ? AND created_at <= ?" + ).get(start, end) as any; + uniqueSavers = saverRow?.cnt || 0; + } catch {} + + // ── Per Cloud Breakdown ── + const byCloud: DailyReport['byCloud'] = []; + try { + const clouds = getCloudConfigs(); + for (const c of clouds) { + const cloudSaveRow = db.prepare( + "SELECT COUNT(*) as cnt FROM save_records WHERE created_at >= ? AND created_at <= ? AND target_cloud = ?" + ).get(start, end, c.cloud_type) as any; + const cloudSuccessRow = db.prepare( + "SELECT COUNT(*) as cnt FROM save_records WHERE created_at >= ? AND created_at <= ? AND target_cloud = ? AND status = 'success'" + ).get(start, end, c.cloud_type) as any; + + byCloud.push({ + cloudType: c.cloud_type, + nickname: c.nickname || '未知', + saves: cloudSaveRow?.cnt || 0, + successes: cloudSuccessRow?.cnt || 0, + storageUsed: c.storage_used || 'N/A', + storageTotal: c.storage_total || 'N/A', + isActive: !!c.is_active, + }); + } + } catch {} + + return { + date, + searchCount, + uniqueSearchers, + saveCounts: { total: totalSaves, success: successSaves, fail: failSaves }, + byCloud, + uniqueSavers, + }; +} + +// ═══════════════════════════════════════════════ +// Formatting +// ═══════════════════════════════════════════════ + +function formatStorage(used: string, total: string): string { + try { + const parseSize = (s: string): number => { + const m = s.match(/^([\d.]+)\s*(B|KB|MB|GB|TB)$/i); + if (!m) return 0; + const units: Record = { B: 1, KB: 1024, MB: 1024**2, GB: 1024**3, TB: 1024**4 }; + return parseFloat(m[1]) * (units[m[2].toUpperCase()] || 1); + }; + const u = parseSize(used); + const t = parseSize(total); + if (t === 0) return `${used} / ${total}`; + const pct = ((u / t) * 100).toFixed(1); + return `${used} / ${total} (${pct}%)`; + } catch { + return `${used} / ${total}`; + } +} + +const CLOUD_LABELS: Record = { + quark: '夸克', baidu: '百度', aliyun: '阿里云盘', '115': '115网盘', + tianyi: '天翼云', '123pan': '123云盘', uc: 'UC网盘', xunlei: '迅雷云盘', + pikpak: 'PikPak', magnet: '磁力链接', ed2k: '电驴链接', others: '其他', +}; + +function cloudLabel(type: string): string { + return CLOUD_LABELS[type] || type; +} + +export function formatDailyReport(report: DailyReport, includeSearch = true, includeSaves = true, includeStorage = true, includeUsers = true): string { + const lines: string[] = []; + const formattedDate = report.date.replace(/-/g, '/'); + + lines.push(`📊 **CloudSearch 每日汇报**`); + lines.push(`📅 ${formattedDate}`); + lines.push(''); + + if (includeSearch && report.searchCount > 0) { + lines.push(`🔍 **搜索统计**`); + lines.push(` 总搜索: ${report.searchCount} 次`); + if (includeUsers) lines.push(` 搜索用户: ${report.uniqueSearchers} 人`); + lines.push(''); + } + + if (includeSaves) { + const { total, success, fail } = report.saveCounts; + lines.push(`💾 **转存统计**`); + lines.push(` 总转存: ${total} 次`); + lines.push(` 成功: ${success} 次 | 失败: ${fail} 次`); + if (total > 0) lines.push(` 成功率: ${((success / total) * 100).toFixed(1)}%`); + if (includeUsers) lines.push(` 转存用户: ${report.uniqueSavers} 人`); + lines.push(''); + } + + if (includeStorage && report.byCloud.length > 0) { + lines.push(`☁️ **网盘状态**`); + for (const c of report.byCloud) { + const icon = c.isActive ? '🟢' : '🔴'; + const label = cloudLabel(c.cloudType); + if (c.saves > 0) { + lines.push(` ${icon} ${label} · ${c.nickname} · 转存 ${c.saves} 次 · ${formatStorage(c.storageUsed, c.storageTotal)}`); + } else { + lines.push(` ${icon} ${label} · ${c.nickname} · ${formatStorage(c.storageUsed, c.storageTotal)}`); + } + } + lines.push(''); + } + + if (report.saveCounts.total === 0 && report.searchCount === 0) { + lines.push(`💤 昨日无活动记录`); + } + + return lines.join('\n'); +} + +// ═══════════════════════════════════════════════ +// Scheduler +// ═══════════════════════════════════════════════ + +let lastRunDate = ''; + +function getTodayStr(): string { + return new Date().toISOString().slice(0, 10); +} + +export async function runDailyReportIfScheduled(): Promise { + const cfg = getDailyReportConfig(); + if (!cfg.enabled) return; + + const now = new Date(); + const [hh, mm] = cfg.time.split(':').map(Number); + const scheduledMinute = hh * 60 + mm; + const currentMinute = now.getHours() * 60 + now.getMinutes(); + + // Run within a 5-minute window of scheduled time + const diff = currentMinute - scheduledMinute; + if (diff < 0 || diff >= 5) return; + + const today = getTodayStr(); + if (lastRunDate === today) return; // already ran today + + lastRunDate = today; + + console.log(`[DailyReport] Running daily report for ${today}...`); + try { + const report = generateDailyReport(); + const content = formatDailyReport( + report, + cfg.includeSearch, + cfg.includeSaves, + cfg.includeStorage, + cfg.includeUsers + ); + + notify('CloudSearch 每日汇报', content, 'info'); + + // Record last run + const { getDb } = require('../database/database'); + const db = getDb(); + const existing = db.prepare("SELECT key FROM system_configs WHERE key = 'daily_report_last_run'").get(); + if (existing) { + db.prepare("UPDATE system_configs SET value = ?, updated_at = datetime('now','localtime') WHERE key = 'daily_report_last_run'") + .run(JSON.stringify({ date: today, sentAt: new Date().toISOString() })); + } else { + db.prepare("INSERT INTO system_configs (key, value, description) VALUES (?, ?, ?)") + .run('daily_report_last_run', JSON.stringify({ date: today, sentAt: new Date().toISOString() }), 'Last daily report run'); + } + + console.log(`[DailyReport] Report sent successfully for ${today}`); + } catch (err: any) { + console.error(`[DailyReport] Failed:`, err.message); + } +} + +// ═══════════════════════════════════════════════ +// Manual test preview +// ═══════════════════════════════════════════════ + +export function previewDailyReport(dateOverride?: string): string { + const report = generateDailyReport(dateOverride); + const cfg = getDailyReportConfig(); + return formatDailyReport( + report, + cfg.includeSearch, + cfg.includeSaves, + cfg.includeStorage, + cfg.includeUsers + ); +} + +export async function sendTestDailyReport(): Promise<{ success: boolean; report: DailyReport }> { + const report = generateDailyReport(); + const cfg = getDailyReportConfig(); + const content = formatDailyReport( + report, + cfg.includeSearch, + cfg.includeSaves, + cfg.includeStorage, + cfg.includeUsers + ); + notify('CloudSearch 每日汇报 [测试]', content, 'info'); + return { success: true, report }; +}