- 修复Redis认证 (配置密码) - 启动Python管理后台 (端口9531, 15个功能开关) - 统一版本号 0.2.7 - 更新docker-compose.yml (镜像版本/Redis URL/Admin服务)
2 lines
15 KiB
JavaScript
2 lines
15 KiB
JavaScript
import{d as xe,o as X,m as Y,E as d,a as u,c as _,f as i,w as l,b as n,h as g,j as p,i as Be,F as x,r as Z,t as C,y,l as c,e as L,k as ee,L as te,p as we,n as Te,J as $e,K as Ve,v as ae,B as ze}from"./index-C5b4pIQL.js";import{a as S}from"./index-Bz21yOih.js";import{c as Ie,h as Ue,j as D,t as Pe,u as Le,k as Se,l as Ae,_ as Fe}from"./_plugin-vue_export-helper-CzL5NdOX.js";import{C as he}from"./CloudBadge-sfzDTvGE.js";import{b as Me}from"./browser-JP79f-a9.js";const Ee={class:"cloud-config"},Oe={class:"cloud-toggle-grid"},Re=["src"],je={class:"cloud-label"},De={class:"toolbar"},Ke={key:0,class:"nickname-text"},Ne={key:0,class:"verifying"},Qe={key:0,class:"storage-cell"},Ge={class:"storage-bar-wrap"},Je={class:"storage-text"},He={class:"storage-used"},We={class:"storage-total"},Xe={class:"storage-free"},Ye={key:0,class:"save-count"},Ze={class:"cookie-help"},et={class:"cookie-help-header"},tt={class:"qr-login-body"},at={class:"qr-login-qr-wrap"},st={key:0,class:"qr-loading"},ot={class:"qr-login-right"},lt={class:"qr-login-steps"},nt={class:"qr-step"},it={class:"qr-login-status-area"},rt={class:"qr-status-tip qr-status-warn"},ut=xe({__name:"CloudConfig",setup(dt){const A=g([]),K=g(),V=g([]),B=g(!1),F=g(!1),k=g(null),s=Be({cloud_type:"",nickname:"",cookie:"",_verifying:!1,_storageUsed:"",_storageTotal:""}),se=ae(()=>({cloud_type:[{required:!0,message:"请选择网盘类型",trigger:"change"}],nickname:[{required:!0,message:"请填写昵称(区分多个同类型网盘)",trigger:"blur"}]})),oe=ae(()=>Object.entries(S));X(async()=>{await z(),await le()});let h=null;X(()=>{h=setInterval(()=>{ie()},30*60*1e3)}),Y(()=>{h&&clearInterval(h)});async function le(){try{const t=await Ie();A.value=t.types}catch(t){console.error("加载网盘类型失败",t)}}async function ne(t,e){const a=A.value.find(r=>r.type===t);if(a)try{await Pe(t,e),a.enabled=e}catch(r){d.error(r.message||"切换失败"),a.enabled=!e}}async function z(){try{V.value=await Ue()}catch(t){console.error("加载网盘配置失败",t)}}async function ie(){for(const t of V.value)(t.cookie_preview||t.nickname)&&await M(t,!0)}async function re(){for(const t of V.value)(t.cookie_preview||t.nickname)&&!t._verifying&&await M(t,!1);d.success("全部验证完成")}async function M(t,e=!1){if(!t.cookie_preview&&!t.nickname){e||d.warning("该配置没有 Cookie,请先编辑保存后再验证");return}t._verifying=!0;try{const a=await D(t.cloud_type,void 0,t.id);t.verification_status=a.success?"valid":"invalid",a.success?(a.nickname&&!t.nickname&&(t.nickname=a.nickname),a.storage_used&&(t.storage_used=a.storage_used),a.storage_total&&(t.storage_total=a.storage_total),e||d.success(`${S[t.cloud_type]}:${a.message}`)):e||d.error(`${S[t.cloud_type]}:${a.message}`)}catch{t.verification_status="invalid",e||d.error(`${S[t.cloud_type]}:验证失败`)}finally{t._verifying=!1}}async function ue(){var t,e;if(!s.cookie){d.warning("请先输入 Cookie");return}if(!s.cloud_type){d.warning("请先选择网盘类型");return}s._verifying=!0;try{const a=await D(s.cloud_type,s.cookie);a.success?(a.nickname&&(s.nickname=a.nickname),a.storage_used&&(s._storageUsed=a.storage_used),a.storage_total&&(s._storageTotal=a.storage_total),d.success(`昵称:${a.nickname||"获取成功"}`)):d.warning(a.message||"验证失败,请检查 Cookie")}catch(a){d.error(((e=(t=a.response)==null?void 0:t.data)==null?void 0:e.error)||"验证失败,请检查 Cookie")}finally{s._verifying=!1}}function N(t){t?(k.value=t.id??null,s.cloud_type=t.cloud_type,s.nickname=t.nickname||"",s.cookie=t.cookie||"",s._verifying=!1):(k.value=null,s.cloud_type="",s.nickname="",s.cookie="",s._verifying=!1),B.value=!0}async function de(){var e,a,r;if(await((e=K.value)==null?void 0:e.validate().catch(()=>!1))){F.value=!0;try{if(k.value)await Le({id:k.value,cloud_type:s.cloud_type,nickname:s.nickname,cookie:s.cookie||void 0,is_active:!0,storage_used:s._storageUsed||void 0,storage_total:s._storageTotal||void 0}),d.success("配置更新成功");else{const $=await Se({cloud_type:s.cloud_type,nickname:s.nickname,cookie:s.cookie,is_active:!0,storage_used:s._storageUsed||void 0,storage_total:s._storageTotal||void 0});if(d.success("配置保存成功"),!s._storageTotal){const f=await D(s.cloud_type,void 0,$.id);f.success||d.warning(`配置已保存,但连接验证失败:${f.message}`)}}B.value=!1,k.value=null,await z()}catch($){d.error(((r=(a=$.response)==null?void 0:a.data)==null?void 0:r.error)||"保存失败")}finally{F.value=!1}}}async function ce(t){try{await Ae(t.id),d.success("删除成功"),await z()}catch{d.error("删除失败")}}const w=g(!1),E=g(""),v=g("idle"),O=g(""),T=g("quark"),Q=g(""),R=g(null),m=g(null);function fe(){T.value=s.cloud_type||"quark",v.value="loading",w.value=!0,O.value="",Q.value="",I()}async function pe(t){if(await ze(),!!R.value)try{await Me.toCanvas(R.value,t,{width:200,margin:2,color:{dark:"#000000",light:"#ffffff"}})}catch(e){console.error("二维码渲染失败",e)}}async function I(){v.value="loading",m.value&&(clearInterval(m.value),m.value=null);try{const t=localStorage.getItem("admin_token"),a=await(await fetch(`/api/admin/${T.value}/qr-login/start`,{method:"POST",headers:t?{Authorization:`Bearer ${t}`}:{}})).json();if(!a.ok)throw new Error(a.error||"启动失败");E.value=a.sessionId,Q.value=a.qrUrl,v.value="pending",await pe(a.qrUrl),ge(a.sessionId)}catch(t){v.value="error",O.value=t.message||"启动扫码登录失败"}}function ge(t){m.value=setInterval(async()=>{try{const e=localStorage.getItem("admin_token"),r=await(await fetch(`/api/admin/${T.value}/qr-login/${t}/status`,{headers:e?{Authorization:`Bearer ${e}`}:{}})).json();if(!r.ok)return;r.status==="logged_in"&&r.cookie?(clearInterval(m.value),m.value=null,v.value="logged_in",r.autoUpdated&&r.updatedConfigId?(d.success(`✅ 已更新配置 #${r.updatedConfigId}「${r.nickname||""}」的 Cookie`),await z()):r.nickname?(s.cookie=r.cookie,s.nickname=r.nickname,s._storageUsed=r.storage_used||"",s._storageTotal=r.storage_total||"",d.success("✅ 登录成功,容量已获取,点击「保存」完成")):(s.cookie=r.cookie,d.success("✅ 登录成功,Cookie 已填入")),setTimeout(()=>{w.value=!1},1e3)):r.status==="expired"&&(clearInterval(m.value),m.value=null,v.value="expired")}catch{}},5e3)}function ve(){if(m.value&&(clearInterval(m.value),m.value=null),E.value){const t=localStorage.getItem("admin_token");fetch(`/api/admin/${T.value}/qr-login/${E.value}/cancel`,{method:"POST",headers:t?{Authorization:`Bearer ${t}`}:{}}).catch(()=>{})}w.value=!1}Y(()=>{m.value&&clearInterval(m.value)});function U(t){const e=t.match(/^([\d.]+)\s*(B|KB|MB|GB|TB)$/i);if(!e)return 0;const a=parseFloat(e[1]),r={B:1,KB:1024,MB:1024**2,GB:1024**3,TB:1024**4};return a*(r[e[2].toUpperCase()]||1)}function G(t){if(!t.storage_total||!t.storage_used)return 0;const e=U(t.storage_total),a=U(t.storage_used);return e===0?0:Math.min(100,Math.round(a/e*100))}function me(t){const e=G(t);return e>=90?"bar-danger":e>=70?"bar-warning":"bar-normal"}function _e(t){if(!t.storage_total||!t.storage_used)return"?";const e=U(t.storage_total),a=U(t.storage_used);if(e===0)return"?";const r=e-a;return r<1024?"小于 1 KB":r<1024*1024?(r/1024).toFixed(1)+" KB":r<1024*1024*1024?(r/(1024*1024)).toFixed(1)+" MB":r<1024*1024*1024*1024?(r/(1024*1024*1024)).toFixed(1)+" GB":(r/(1024*1024*1024*1024)).toFixed(1)+" TB"}return(t,e)=>{const a=p("el-tag"),r=p("el-switch"),$=p("el-card"),f=p("el-button"),q=p("el-table-column"),j=p("el-text"),J=p("el-icon"),ye=p("el-popconfirm"),ke=p("el-table"),Ce=p("el-option"),qe=p("el-select"),P=p("el-form-item"),H=p("el-input"),be=p("el-form"),W=p("el-dialog");return u(),_("div",Ee,[i($,{class:"toggle-card",style:{"margin-bottom":"20px"}},{header:l(()=>[...e[7]||(e[7]=[n("span",null,"📂 网盘设置及授权",-1)])]),default:l(()=>[n("div",Oe,[(u(!0),_(x,null,Z(A.value,o=>(u(),_("div",{key:o.type,class:"cloud-toggle-chip"},[n("img",{src:o.icon,class:"cloud-icon-img"},null,8,Re),n("span",je,C(o.label),1),o.type==="others"?(u(),y(a,{key:0,size:"small",type:"info"},{default:l(()=>[...e[8]||(e[8]=[c("关",-1)])]),_:1})):L("",!0),i(r,{"model-value":o.enabled,size:"small",onChange:b=>ne(o.type,b)},null,8,["model-value","onChange"])]))),128))]),e[9]||(e[9]=n("div",{class:"form-tip",style:{"margin-top":"12px"}}," 关闭的网盘类型在搜索结果中不会展示。修改后立即生效,无需点击保存。 ",-1))]),_:1}),n("div",De,[i(f,{type:"primary",onClick:e[0]||(e[0]=o=>N(null))},{default:l(()=>[...e[10]||(e[10]=[c("新增配置",-1)])]),_:1}),i(f,{onClick:re},{default:l(()=>[...e[11]||(e[11]=[c("全部重新验证",-1)])]),_:1})]),i(ke,{data:V.value,stripe:"",style:{width:"100%"}},{default:l(()=>[i(q,{label:"网盘类型",width:"110"},{default:l(({row:o})=>[i(he,{cloud_type:o.cloud_type},null,8,["cloud_type"])]),_:1}),i(q,{prop:"nickname",label:"昵称",width:"140"},{default:l(({row:o})=>[o.nickname?(u(),_("span",Ke,C(o.nickname),1)):(u(),y(j,{key:1,type:"info",size:"small"},{default:l(()=>[...e[12]||(e[12]=[c("未设置",-1)])]),_:1}))]),_:1}),i(q,{label:"验证",width:"100",align:"center"},{default:l(({row:o})=>[o._verifying?(u(),_("span",Ne,[i(J,{class:"is-loading"},{default:l(()=>[i(ee(te))]),_:1})])):o.verification_status==="valid"?(u(),y(a,{key:1,type:"success",size:"small"},{default:l(()=>[...e[13]||(e[13]=[c("有效",-1)])]),_:1})):o.verification_status==="invalid"?(u(),y(a,{key:2,type:"danger",size:"small"},{default:l(()=>[...e[14]||(e[14]=[c("无效",-1)])]),_:1})):(u(),y(a,{key:3,type:"info",size:"small"},{default:l(()=>[...e[15]||(e[15]=[c("未验证",-1)])]),_:1}))]),_:1}),i(q,{label:"空间",width:"200"},{default:l(({row:o})=>[o.storage_total?(u(),_("div",Qe,[n("div",Ge,[n("div",{class:Te(["storage-bar-fill",me(o)]),style:we({width:G(o)+"%"})},null,6)]),n("div",Je,[n("span",He,C(o.storage_used||"?"),1),e[16]||(e[16]=n("span",{class:"storage-sep"},"/",-1)),n("span",We,C(o.storage_total),1),n("span",Xe,"(可用 "+C(_e(o))+")",1)])])):(u(),y(j,{key:1,type:"info",size:"small"},{default:l(()=>[...e[17]||(e[17]=[c("—",-1)])]),_:1}))]),_:1}),i(q,{label:"转存",width:"80",align:"center"},{default:l(({row:o})=>[o.total_saves>0?(u(),_("span",Ye,C(o.total_saves)+"次",1)):(u(),y(j,{key:1,type:"info",size:"small"},{default:l(()=>[...e[18]||(e[18]=[c("-",-1)])]),_:1}))]),_:1}),i(q,{label:"操作",width:"390",align:"center"},{default:l(({row:o})=>[i(f,{text:"",type:"primary",onClick:b=>N(o)},{default:l(()=>[...e[19]||(e[19]=[c("编辑",-1)])]),_:1},8,["onClick"]),i(f,{text:"",type:"primary",onClick:b=>M(o)},{default:l(()=>[...e[20]||(e[20]=[c("验证",-1)])]),_:1},8,["onClick"]),i(ye,{title:"确定删除该配置?",onConfirm:b=>ce(o)},{reference:l(()=>[i(f,{text:"",type:"danger"},{default:l(()=>[...e[21]||(e[21]=[c("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:1})]),_:1},8,["data"]),i(W,{modelValue:B.value,"onUpdate:modelValue":e[5]||(e[5]=o=>B.value=o),title:k.value?"编辑配置":"新增配置",width:"560px"},{footer:l(()=>[i(f,{onClick:e[4]||(e[4]=o=>B.value=!1)},{default:l(()=>[...e[25]||(e[25]=[c("取消",-1)])]),_:1}),i(f,{type:"primary",loading:F.value,onClick:de},{default:l(()=>[...e[26]||(e[26]=[c("保存",-1)])]),_:1},8,["loading"])]),default:l(()=>[i(be,{ref_key:"formRef",ref:K,model:s,rules:se.value,"label-width":"100px"},{default:l(()=>[i(P,{label:"网盘类型",prop:"cloud_type"},{default:l(()=>[i(qe,{modelValue:s.cloud_type,"onUpdate:modelValue":e[1]||(e[1]=o=>s.cloud_type=o),style:{width:"100%"},disabled:!!k.value},{default:l(()=>[(u(!0),_(x,null,Z(oe.value,([o,b])=>(u(),y(Ce,{key:o,label:b,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled"])]),_:1}),i(P,{label:"昵称",prop:"nickname"},{default:l(()=>[i(H,{modelValue:s.nickname,"onUpdate:modelValue":e[2]||(e[2]=o=>s.nickname=o),placeholder:"必填,用于区分多个同类型网盘"},{append:l(()=>[i(f,{loading:s._verifying,onClick:ue},{default:l(()=>[...e[22]||(e[22]=[c("自动获取",-1)])]),_:1},8,["loading"])]),_:1},8,["modelValue"])]),_:1}),i(P,{label:"Cookie",prop:"cookie"},{default:l(()=>[i(H,{modelValue:s.cookie,"onUpdate:modelValue":e[3]||(e[3]=o=>s.cookie=o),type:"textarea",autosize:{minRows:2,maxRows:4},placeholder:s.cloud_type==="quark"?"夸克网盘可用扫码登录,无需填写Cookie":s.cloud_type==="baidu"?"百度网盘可用扫码登录":k.value?"留空则保持原有":"输入完整 Cookie(含 kps/sign/vcode)","input-style":"font-family: monospace; font-size: 12px;"},null,8,["modelValue","placeholder"])]),_:1}),s.cloud_type==="quark"||s.cloud_type==="baidu"?(u(),y(P,{key:0,label:" "},{default:l(()=>[n("div",Ze,[n("div",et,[i(f,{size:"small",type:"success",onClick:fe},{default:l(()=>[...e[23]||(e[23]=[c("📱 扫码登录(推荐)",-1)])]),_:1}),e[24]||(e[24]=n("span",{style:{"font-size":"12px",color:"#909399","margin-left":"8px"}},"夸克APP扫码即可,无需手动填Cookie",-1))])])]),_:1})):L("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title"]),i(W,{modelValue:w.value,"onUpdate:modelValue":e[6]||(e[6]=o=>w.value=o),title:"📱 请使用手机 夸克APP 扫码登录",width:"480px","close-on-click-modal":!1,"destroy-on-close":"",onClosed:ve},{default:l(()=>[n("div",tt,[n("div",at,[v.value==="loading"?(u(),_("div",st,[i(J,{class:"is-loading",size:36},{default:l(()=>[i(ee(te))]),_:1}),e[27]||(e[27]=n("p",null,"正在生成二维码...",-1))])):L("",!0),$e(n("canvas",{ref_key:"qrCanvasRef",ref:R,class:"qr-canvas"},null,512),[[Ve,v.value==="pending"||v.value==="expired"]])]),n("div",ot,[n("div",lt,[n("div",nt,[e[28]||(e[28]=n("span",{class:"qr-step-num"},"1",-1)),n("span",null,C(T.value==="baidu"?"打开百度网盘APP":"打开夸克APP"),1)]),e[29]||(e[29]=n("div",{class:"qr-step"},[n("span",{class:"qr-step-num"},"2"),n("span",null,"扫描二维码")],-1)),e[30]||(e[30]=n("div",{class:"qr-step"},[n("span",{class:"qr-step-num"},"3"),n("span",null,"手机确认后自动获取 Cookie")],-1))]),n("div",it,[v.value==="pending"?(u(),_(x,{key:0},[e[32]||(e[32]=n("span",{class:"qr-status-icon"},"⏳",-1)),e[33]||(e[33]=n("span",{class:"qr-status-tip"},"请用夸克APP扫码",-1)),i(f,{class:"qr-refresh-btn",size:"small",type:"primary",plain:"",onClick:I},{default:l(()=>[...e[31]||(e[31]=[c("刷新登录二维码",-1)])]),_:1})],64)):v.value==="expired"?(u(),_(x,{key:1},[e[35]||(e[35]=n("span",{class:"qr-status-icon"},"⏰",-1)),e[36]||(e[36]=n("span",{class:"qr-status-tip qr-status-warn"},"二维码已过期",-1)),i(f,{class:"qr-refresh-btn",size:"small",type:"primary",onClick:I},{default:l(()=>[...e[34]||(e[34]=[c("重新生成",-1)])]),_:1})],64)):v.value==="error"?(u(),_(x,{key:2},[e[38]||(e[38]=n("span",{class:"qr-status-icon"},"❌",-1)),n("span",rt,C(O.value),1),i(f,{class:"qr-refresh-btn",size:"small",type:"primary",onClick:I},{default:l(()=>[...e[37]||(e[37]=[c("重试",-1)])]),_:1})],64)):v.value==="logged_in"?(u(),_(x,{key:3},[e[39]||(e[39]=n("span",{class:"qr-status-icon"},"✅",-1)),e[40]||(e[40]=n("span",{class:"qr-status-tip",style:{color:"#67c23a"}},"登录成功,Cookie 已自动填入",-1))],64)):L("",!0)])])])]),_:1},8,["modelValue"])])}}}),_t=Fe(ut,[["__scopeId","data-v-d5c0f4b4"]]);export{_t as default};
|