PageSourceSearch

https://0520.com.cn/dist/assets/backup.ff709b83.1790502374068.js

js 0520.com.cn collected 2026-10-06 06:09:12 UTC 23,001 bytes, 1 lines download raw bytes

1import{_ as e,r as a,x as t,o as s,q as n,a as l,b as r,c as o,d,j as i,g as c,F as u,e as p,L as v,l as f,t as g,f as m,ar as h,T as b,a1 as y,B as w,N as x,a3 as k,bf as _,a5 as C,i as B,a0 as $,bg as j,n as z,aD as S,ad as M,bh as P,bi as I,bj as L,bk as D,k as E,h as T,bl as R,S as U,bm as q}from"./index.041d960f.1790502374068.js";const A={class:"Backup"},O={class:"p-5 bg-white rounded-lg overflow-hidden"},V={class:"flex items-center justify-between"},F={class:"flex items-center gap-2"},K={class:"flex flex-wrap gap-6"},N={class:"flex-1 min-w-[280px]"},W={class:"flex gap-3"},Z=["onClick"],G={key:0,class:"absolute -top-2 -right-2 w-5 h-5 rounded-full bg-[#409eff] text-white flex items-center justify-center"},H={class:"flex items-center gap-3"},J={class:"text-xs text-gray-400 mt-0.5"},Q={class:"mt-4"},X={class:"flex-1 min-w-[320px]"},Y={key:0,class:"bg-gray-50 rounded-lg p-4"},ee={class:"flex items-center gap-2 mb-2 flex-wrap"},ae={key:0,class:"text-xs text-orange-500 flex items-center gap-1"},te={class:"text-sm text-gray-600"},se={key:0,class:"mt-2 text-xs text-gray-400 flex items-center gap-1"},ne={key:1,class:"bg-gray-50 rounded-lg p-6 text-center text-gray-400 text-sm"},le={class:"text-2xl mb-2 opacity-40"},re={class:"mt-4 p-4 bg-white rounded-lg overflow-hidden w-full"},oe={class:"flex items-center mb-3"},de={class:"ml-auto flex items-center gap-3"},ie={key:0,style:{display:"inline-flex","align-items":"center",gap:"6px"}},ce={style:{"font-size":"12px",color:"#666","white-space":"nowrap","min-width":"36px"}},ue={class:"mt-4 p-4 bg-white rounded-lg overflow-hidden w-full"},pe={class:"text-sm text-gray-600 leading-relaxed"},ve={class:"bg-gray-900 text-gray-100 rounded-lg p-4 font-mono text-xs leading-relaxed space-y-2 overflow-x-auto"},fe={class:"mt-3 flex items-center gap-1 flex-wrap"},ge={class:"font-mono text-[#409eff] break-all"},me={key:0,class:"auth-overlay"},he={class:"auth-card"},be={class:"auth-title"},ye={class:"auth-subtitle"},we={class:"auth-field"},xe={class:"auth-label"},ke={class:"auth-input-wrap"},_e=["type","placeholder"],Ce={key:0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},Be={key:1,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},$e={key:0,class:"auth-field"},je={class:"auth-input-wrap"},ze=["type"],Se={key:1,class:"auth-tip"},Me=["disabled"],Pe={key:0,class:"auth-spinner"};var Ie=e({__name:"backup",setup(e){const Ie=a(!1),Le=a("login"),De=a(!1),Ee=a({password:"",confirmPassword:""}),Te=a(!1),Re=e=>{Le.value="need_set_password"===e?"set_password":"login",Ee.value={password:"",confirmPassword:""},Ie.value=!0},Ue=e=>!(1===e.code||!e.data||!e.data.auth)&&(Re(e.data.auth),!0),qe=async()=>{try{const e=await w({url:"/admin.Backup/authStatus",method:"get"});if(1!==e.code)return!1;const{password_set:a,authenticated:t}=e.data||{};return a?!!t||(Re("need_login"),!1):(Re("need_set_password"),!1)}catch{return!1}},Ae=async()=>{const{password:e,confirmPassword:a}=Ee.value;if(!e)return x.warning("请输入密码");if("set_password"===Le.value){if(e!==a)return x.warning("两次密码不一致");if(e.length<8)return x.warning("密码长度不能少于8位");if(!/[a-zA-Z]/.test(e)||!/[0-9]/.test(e))return x.warning("密码必须包含字母和数字");De.value=!0;try{const a=await w({url:"/admin.Backup/setPassword",method:"post",data:{password:e}});1===a.code?(Ie.value=!1,x.success("密码设置成功"),ta()):x.error(a.msg||"设置失败")}finally{De.value=!1}}else{De.value=!0;try{const a=await w({url:"/admin.Backup/login",method:"post",data:{password:e}});1===a.code?(Ie.value=!1,x.success("验证成功"),ta()):x.error(a.msg||"密码错误")}finally{De.value=!1}}},Oe=async()=>{try{await w({url:"/admin.Backup/logout",method:"post"})}catch{}Ne.value=[],We.value=[],Ye(),Ge.value={running:!1,type:"",step:"",percent:0,message:"",file:"",error:""},Re("need_login"),x.info("已锁定备份功能")},Ve=a(["database"]),Fe=[{value:"database",name:"数据库",desc:"导出全部表结构与数据",icon:q},{value:"app",name:"程序文件",desc:"打包程序代码与配置",icon:D}],Ke=a(!1),Ne=a([]),We=a([]),Ze=a(""),Ge=a({running:!1,type:"",step:"",percent:0,message:"",file:"",error:""});let He=null;const Je=t((()=>Ge.value.running||"done"===Ge.value.step||"error"===Ge.value.step)),Qe=t((()=>Ze.value.replace(/\/?backup\/?$/,""))),Xe=e=>{We.value=e.map((e=>e.name))},Ye=()=>{He&&(clearInterval(He),He=null)},ea=()=>{He||(He=setInterval(aa,2e3))},aa=()=>{w({url:"/admin.Backup/status",method:"get"}).then((e=>{if(1!==e.code)return;const a=e.data||{},t=Ge.value.running;Ge.value=a,a.running?ea():(Ye(),t&&("error"===a.step?x.error(a.error||"任务执行失败"):"done"===a.step&&("restore"===a.type?k.confirm("恢复完成,请刷新页面以重新加载数据","恢复完成",{confirmButtonText:"立即刷新",cancelButtonText:"稍后",type:"warning"}).then((()=>{window.location.reload()})).catch((()=>{})):(x.success(a.message||"任务完成"),ta()))))}
1))},ta=()=>{w({url:"/admin.Backup/list",method:"get"}).then((e=>{if(Ue(e))return;if(1!==e.code)return;Ne.value=e.data.files||[],Ze.value=e.data.backup_dir||"";const a=e.data.status||{},t=Ge.value.running;a.running?(Ge.value=a,ea()):(Ye(),Ge.value={running:!1,type:"",step:"",percent:0,message:"",file:"",error:""},t&&"done"===a.step&&x.success(a.message||"任务完成"))}))},sa=()=>{if(!Ve.value.length)return x.warning("请至少选择一种备份类型");const e={database:"数据库",app:"程序文件"};k.confirm(`即将备份:${Ve.value.map((a=>e[a])).join("、")}。任务将在后台执行,完成后自动出现在下方列表。`,"开始备份").then((()=>{Ke.value=!0,w({url:"/admin.Backup/start",method:"post",data:{types:Ve.value}}).then((e=>{Ue(e)||(1===e.code?(x.success(e.msg),aa()):x.error(e.msg||"启动失败"))})).finally((()=>{Ke.value=!1}))})).catch((()=>{}))},na=e=>{k.confirm(`确定删除选中的 ${e.length} 个备份文件?删除后不可恢复`,"删除提示",{type:"warning"}).then((()=>{w({url:"/admin.Backup/delete",method:"post",data:{names:e}}).then((e=>{Ue(e)||(x.success(e.msg),ta())}))})).catch((()=>{}))},la=a(!1),ra=a(""),oa=a(0),da=a(!1);function ia(){return new Promise(((e,a)=>{const t=indexedDB.open("backup_download",1);t.onupgradeneeded=e=>{const a=e.target.result;a.objectStoreNames.contains("chunks")||a.createObjectStore("chunks")},t.onsuccess=()=>e(t.result),t.onerror=()=>a(t.error)}))}async function ca(e,a,t){const s=await ia();return new Promise(((n,l)=>{const r=s.transaction("chunks","readwrite");r.objectStore("chunks").put({index:a,data:t},`${e}_${a}`),r.oncomplete=()=>{s.close(),n()},r.onerror=()=>{s.close(),l(r.error)}}))}async function ua(e,a){const t=await ia();return new Promise(((s,n)=>{const l=t.transaction("chunks","readonly").objectStore("chunks").get(`${e}_${a}`);l.onsuccess=()=>{t.close(),s(l.result)},l.onerror=()=>{t.close(),n(l.error)}}))}async function pa(e){const a=await ia();return new Promise(((t,s)=>{const n=a.transaction("chunks","readwrite"),l=n.objectStore("chunks"),r=l.getAllKeys();r.onsuccess=()=>{(r.result||[]).forEach((a=>{const t=String(a);(t===`meta_${e}`||t.startsWith(`${e}_`))&&l.delete(a)}))},n.oncomplete=()=>{a.close(),t()},n.onerror=()=>{a.close(),s(n.error)}}))}const va=(e,a)=>{const t=URL.createObjectURL(e),s=document.createElement("a");s.href=t,s.download=a,document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(t)},fa=async e=>{if(la.value)return void x.warning("已有文件正在下载,请稍候");if(!(await qe()))return;la.value=!0,ra.value=e.name,oa.value=0;const a={userid:localStorage.getItem("user_id"),token:localStorage.getItem("token")},t=`${C}/admin.Backup/download`;try{let n=0;try{const s=((await _.get(t,{params:{name:e.name},headers:{...a,Range:"bytes=0-0"},responseType:"arraybuffer"})).headers["content-range"]||"").match(/\/(\d+)$/);s&&(n=Number(s[1]))}catch(s){n=0}if(!n){const s=await _.get(t,{params:{name:e.name},headers:a,responseType:"blob"});return va(s.data,e.name),void x.success("下载完成")}const l=Math.ceil(n/2097152),r=await async function(e){const a=await ia();return new Promise(((t,s)=>{const n=a.transaction("chunks","readonly").objectStore("chunks").get(`meta_${e}`);n.onsuccess=()=>{a.close(),t(n.result)},n.onerror=()=>{a.close(),s(n.error)}}))}(e.name);r&&r.total!==n&&await pa(e.name);let o=!1;for(let s=0;s<l;s++){if(da.value){o=!0;break}if(await ua(e.name,s)){oa.value=Math.round((s+1)/l*100);continue}const r=2097152*s,d=Math.min(r+2097152-1,n-1),i=await _.get(t,{params:{name:e.name},headers:{...a,Range:`bytes=${r}-${d}`},responseType:"arraybuffer"});if(206!==i.status&&200!==i.status)throw new Error("分片下载失败");await ca(e.name,s,i.data),oa.value=Math.round((s+1)/l*100)}if(o)return void x.warning("已取消下载");await async function(e,a,t){const s=await ia();return new Promise(((n,l)=>{const r=s.transaction("chunks","readwrite");r.objectStore("chunks").put({total:a,chunkCount:t},`meta_${e}`),r.oncomplete=()=>{s.close(),n()},r.onerror=()=>{s.close(),l(r.error)}}))}(e.name,n,l);const d=[];for(let a=0;a<l;a++){const t=await ua(e.name,a);t&&d.push(t.data)}const i=new Blob(d);va(i,e.name),await pa(e.name),x.success("下载完成")}catch(s){x.error("下载失败,可重新点击继续断点续传")}finally{la.value=!1,ra.value="",da.value=!1}},ga=()=>{da.value=!0},ma=a(!1),ha=a(0),ba=a(null),ya=()=>{ma.value||ba.value&&ba.value.click()},wa=e=>{const a=e.target.files&&e.target.files[0];if(e.target.value="",!a)return;const t=(a.name.split(".").pop()||"").toLowerCase();if(!["sql","zip"].includes(t))return x.warning("仅支持 .sql / .zip 备份文件");xa(a)},xa=async e=>{if(!(await qe()))return;const a=5242880,t=Math.ceil(e.size/a),s=`${Date.now()}_${Math.random().toString(36).slice(2,10)}`;ma.value=!0,ha.value=0;const n={userid:localStorage.getItem("user_id"),token:localStorage.getItem("token")};try{for(let o=0;o<t;o++){const l=e.slice(o*a,Math.min((o+1)*a,e.size)),r=new FormData;r.append("chunk",l,e.name),r.append("upload_id",s),r.append("index",o),r.append("total",t),r.append("name",e.name);const d=await _.post(`${C}/admin.Backup/uploadChunk`,r,{headers:n});if(!d.data||1!==d.data.code)throw new Error(d.data&&d.data.msg||"分片上传失败");ha.value=Math.round((o+1)/t*90)}const l=new FormData;l.append("upload_id",s),l.append("total",t),l.append("name",e.name);const r=await _.post(`${C}/admin.Backup/uploadMerge`,l,{headers:n});if(!r.data||1!==r.data.code)throw new Error(r.data&&r.data.msg||"合并失败");ha.value=100,x.success((r.data.msg||"上传成功")+(r.data.data&&r.data.data.name?`:${r.data.data.name}`:"")),ta()}catch(l){x.error(l.message||"上传失败")}finally{ma.value=!1,ha.value=0}},ka=e=>{if(la.value)return e.preventDefault(),e.returnValue="",""};return s((()=>{window.addEventListener("beforeunload",ka)})),n((()=>{Ye(),window.removeEventListener("beforeunload",ka)})),ta(),(e,a)=>{const t=l("el-icon"),s=l("el-button"),n=l("el-tag"),_=l("el-progress"),C=l("el-alert"),q=l("el-table-column"),Re=l("el-table");return r(),o("div",A,[d("div",O,[d("div",V,[a[5]||(a[5]=d("div",null,[d("div",{class:"text-base font-bold"},"手动备份"),d("div",{class:"text-xs text-gray-400 mt-1"},"选择备份内容,任务在后台执行,完成后自动出现在下方文件列表")],-1)),d("div",F,[i(s,{disabled:Ge.value.running,onClick:ta},{default:c((()=>[i(t,{class:"mr-1"},{default:c((()=>[i(B($))])),_:1}),a[4]||(a[4]=v(" 刷新 "))])),_:1},8,["disabled"]),i(s,{onClick:Oe,title:"锁定(退出认证)"},{default:c((()=>[i(t,null,{default:c((()=>[i(B(j))])),_:1})])),_:1})])]),a[12]||(a[12]=d("div",{class:"h-px bg-gray-100 my-4"},null,-1)),d("div",K,[d("div",N,[a[7]||(a[7]=d("div",{class:"text-sm text-gray-500 mb-3"},"备份类型",-1)),d("div",W,[(r(),o(u,null,p(Fe,(e=>d("div",{key:e.value,onClick:a=>(e=>{const a=Ve.value.indexOf(e);a>=0?Ve.value.splice(a,1):Ve.value.push(e)})(e.value),class:z(["relative flex-1 cursor-pointer rounded-lg border-2 p-4 transition-all select-none",Ve.value.includes(e.value)?"border-[#409eff] bg-[#ecf5ff]":"border-gray-200 bg-white hover:border-[#a0cfff]"])},[Ve.value.includes(e.value)?(r(),o("div",G,[i(t,{size:12},{default:c((()=>[i(B(S))])),_:1})])):f("",!0),d("div",H,[d("div",{class:z(["w-10 h-10 shrink-0 rounded-lg flex items-center justify-center text-xl",Ve.value.includes(e.value)?"bg-[#409eff] text-white":"bg-gray-100 text-gray-400"])},[i(t,{size:22},{default:c((()=>[(r(),m(M(e.icon)))])),_:2},1024)],2),d("div",null,[d("div",{class:z(["font-bold text-sm",Ve.value.includes(e.value)?"text-[#409eff]":"text-gray-700"])},g(e.name),3),d("div",J,g(e.desc),1)])])],10,Z))),64))]),d("div",Q,[i(s,{type:"primary",class:"w-full",loading:Ke.value,disabled:Ge.value.running,onClick:sa},{default:c((()=>[i(t,{class:"mr-1"},{default:c((()=>
1[i(B(P))])),_:1}),a[6]||(a[6]=v(" 开始备份 "))])),_:1},8,["loading","disabled"])])]),d("div",X,[a[11]||(a[11]=d("div",{class:"text-sm text-gray-500 mb-3"},"任务状态",-1)),Je.value?(r(),o("div",Y,[d("div",ee,[i(n,{type:"restore"===Ge.value.type?"warning":"primary",size:"small"},{default:c((()=>[v(g("restore"===Ge.value.type?"恢复任务":"备份任务"),1)])),_:1},8,["type"]),Ge.value.running?(r(),o("span",ae,a[8]||(a[8]=[d("span",{class:"w-1.5 h-1.5 rounded-full bg-orange-500 animate-pulse inline-block"},null,-1),v(" 执行中 ")]))):f("",!0),d("span",te,g(Ge.value.message),1)]),i(_,{percentage:Ge.value.percent,"stroke-width":14,status:"error"===Ge.value.step?"exception":"done"===Ge.value.step?"success":void 0},null,8,["percentage","status"]),Ge.value.file?(r(),o("div",se,[i(t,null,{default:c((()=>[i(B(I))])),_:1}),v(" "+g("restore"===Ge.value.type?"恢复文件":"生成文件")+":"+g(Ge.value.file),1)])):f("",!0),Ge.value.error?(r(),m(C,{key:1,class:"mt-3",type:"error",title:Ge.value.error,closable:!1},null,8,["title"])):f("",!0)])):(r(),o("div",ne,[d("div",le,[i(t,null,{default:c((()=>[i(B(I))])),_:1})]),a[9]||(a[9]=v(" 当前无执行中的任务 ")),a[10]||(a[10]=d("div",{class:"text-xs mt-1 text-gray-300"},"备份 / 恢复任务进度将在此显示",-1))]))])])]),d("div",re,[d("div",oe,[a[15]||(a[15]=d("span",{class:"font-bold"},"备份文件",-1)),i(s,{type:"danger",size:"small",class:"ml-4",disabled:!We.value.length,onClick:a[0]||(a[0]=e=>na(We.value))},{default:c((()=>a[13]||(a[13]=[v(" 批量删除 ")]))),_:1},8,["disabled"]),d("div",de,[ma.value?(r(),m(_,{key:0,percentage:ha.value,"stroke-width":8,style:{width:"180px"}},null,8,["percentage"])):f("",!0),i(s,{type:"primary",size:"small",loading:ma.value,onClick:ya},{default:c((()=>[i(t,{class:"mr-1"},{default:c((()=>[i(B(L))])),_:1}),a[14]||(a[14]=v(" 上传备份 "))])),_:1},8,["loading"])]),d("input",{ref_key:"fileInput",ref:ba,type:"file",accept:".sql,.zip",class:"hidden",onChange:wa},null,544)]),i(Re,{onSelectionChange:Xe,data:Ne.value},{empty:c((()=>a[20]||(a[20]=[d("div",{class:"py-8 text-gray-400"},"暂无备份文件,点击上方「开始备份」创建",-1)]))),default:c((()=>[i(q,{type:"selection",width:"50"}),i(q,{label:"类型",width:"110",align:"center"},{default:c((e=>[i(n,{type:"database"===e.row.type?"primary":"warning",size:"small"},{default:c((()=>[v(g("database"===e.row.type?"数据库":"程序文件"),1)])),_:2},1032,["type"])])),_:1}),i(q,{prop:"name",label:"文件名","min-width":"280","show-overflow-tooltip":""}),i(q,{prop:"size_text",label:"大小",width:"110",align:"center"}),i(q,{prop:"time",label:"备份时间",width:"180",align:"center"}),i(q,{label:"操作",width:"220",align:"center"},{default:c((e=>[ra.value===e.row.name?(r(),o("div",ie,[i(_,{percentage:oa.value,"stroke-width":8,"show-text":!1,style:{width:"80px"}},null,8,["percentage"]),d("span",ce,g(oa.value)+"%",1),i(s,{size:"small",type:"danger",link:"",onClick:ga},{default:c((()=>a[16]||(a[16]=[v("取消")]))),_:1})])):(r(),o(u,{key:1},[i(s,{size:"small",type:"primary",link:"",disabled:la.value,onClick:a=>fa(e.row)},{default:c((()=>a[17]||(a[17]=[v(" 下载 ")]))),_:2},1032,["disabled","onClick"]),i(s,{size:"small",type:"warning",link:"",disabled:Ge.value.running,onClick:a=>(e=>{const a="database"===e.type?"恢复数据库将覆盖当前全部数据!强烈建议先备份当前数据。":"恢复程序文件将覆盖当前项目中的文件(不会覆盖 runtime / backup / web 等目录)。";k.confirm(`${a}\n\n确认恢复「${e.name}」?`,"恢复警告",{type:"warning"}).then((()=>{w({url:"/admin.Backup/restore",method:"post",data:{file:e.name}}).then((e=>{Ue(e)||(1===e.code?(x.success(e.msg),aa()):x.error(e.msg||"恢复失败"))}))})).catch((()=>{}))})(e.row)},{default:c((()=>a[18]||(a[18]=[v(" 恢复 ")]))),_:2},1032,["disabled","onClick"]),i(s,{size:"small",type:"danger",link:"",onClick:a=>na([e.row.name])},{default:c((()=>a[19]||(a[19]=[v("删除")]))),_:2},1032,["onClick"])],64))])),_:1})])),_:1},8,["data"])]),d("div",ue,[a[26]||(a[26]=d("div",{class:"flex items-center mb-3"},[d("span",{class:"font-bold"},"命令行备份(CLI)"),d("span",{class:"ml-2 text-xs text-gray-400"},"可视化备份不成功时,可在服务器命令行执行")],-1)),d("div",pe,[a[25]||(a[25]=h('<p class="mb-3" data-v-f71a7b70>当页面可视化备份失败(如超时、内存不足)时,可登录服务器使用命令行方式备份,效果与页面一致。</p><div class="mb-3 p-3 bg-orange-50 border border-orange-200 rounded-lg text-orange-600 text-xs leading-relaxed" data-v-f71a7b70><span class="font-bold" data-v-f71a7b70>Docker 部署提示:</span> 若项目通过 Docker 容器部署,请先进入容器终端再执行ä¸
1‹æ–¹å‘½ä»¤ï¼š <span class="font-mono text-orange-700" data-v-f71a7b70>docker exec -it mTabServer bash</span><span class="text-orange-500" data-v-f71a7b70>(容器名如与部署配置不同,请替换为实际容器名)</span></div>',2)),d("div",ve,[d("div",null,[a[22]||(a[22]=d("span",{class:"text-gray-500"},"# 进入项目根目录",-1)),d("div",null,[a[21]||(a[21]=d("span",{class:"text-green-400"},"cd",-1)),v(" "+g(Qe.value||"项目路径"),1)])]),a[23]||(a[23]=h('<div class="pt-2 text-gray-400" data-v-f71a7b70>━━━ 备份 ━━━</div><div data-v-f71a7b70><span class="text-gray-500" data-v-f71a7b70># 交互式备份(按提示选择数据库/程序文件/全量)</span><div data-v-f71a7b70><span class="text-green-400" data-v-f71a7b70>php think backup</span></div></div><div data-v-f71a7b70><span class="text-gray-500" data-v-f71a7b70># 直接备份数据库</span><div data-v-f71a7b70><span class="text-green-400" data-v-f71a7b70>php think backup database</span></div></div><div data-v-f71a7b70><span class="text-gray-500" data-v-f71a7b70># 直接备份程序文件</span><div data-v-f71a7b70><span class="text-green-400" data-v-f71a7b70>php think backup app</span></div></div><div class="pt-2 text-gray-400" data-v-f71a7b70>━━━ 恢复数据 ━━━</div><div data-v-f71a7b70><span class="text-gray-500" data-v-f71a7b70># 恢复只能交互式操作,先进入主菜单</span><div data-v-f71a7b70><span class="text-green-400" data-v-f71a7b70>php think backup</span></div></div><div data-v-f71a7b70><span class="text-gray-500" data-v-f71a7b70># 主菜单选择 [2] 恢复数据</span><div class="text-gray-100" data-v-f71a7b70>输入:2</div></div><div data-v-f71a7b70><span class="text-gray-500" data-v-f71a7b70># 选择恢复类型:1=数据库 2=程序文件</span><div class="text-gray-100" data-v-f71a7b70>输入:1 或 2</div></div><div data-v-f71a7b70><span class="text-gray-500" data-v-f71a7b70># 选择要恢复的备份文件(输入编号)</span><div class="text-gray-100" data-v-f71a7b70>输入:文件编号</div></div><div data-v-f71a7b70><span class="text-gray-500" data-v-f71a7b70># 输入 yes 确认恢复</span><div class="text-gray-100" data-v-f71a7b70>输入:yes</div></div>',10))]),d("p",fe,[i(t,{class:"text-gray-400"},{default:c((()=>[i(B(D))])),_:1}),a[24]||(a[24]=d("span",{class:"text-gray-500"},"备份文件存储位置:",-1)),d("span",ge,g(Ze.value||"获取中..."),1)])])]),(r(),m(y,{to:"body"},[i(b,{name:"auth-fade"},{default:c((()=>[Ie.value?(r(),o("div",me,[d("div",he,[a[31]||(a[31]=d("div",{class:"auth-icon-wrap"},[d("svg",{class:"auth-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[d("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}),d("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"}),d("circle",{cx:"12",cy:"16",r:"1"})])],-1)),d("h2",be,g("set_password"===Le.value?"设置备份密码":"验证备份密码"),1),d("p",ye,g("set_password"===Le.value?"首次使用需设置安全密码,保护备份数据":"请输入备份安全密码以继续操作"),1),d("div",{class:"auth-form",onSubmit:E(Ae,["prevent"])},[d("div",we,[d("label",xe,g("set_password"===Le.value?"设置密码":"输入密码"),1),d("div",ke,[T(d("input",{"onUpdate:modelValue":a[1]||(a[1]=e=>Ee.value.password=e),type:Te.value?"text":"password",class:"auth-input",placeholder:"set_password"===Le.value?"至少8位,含字母和数字":"请输入备份安全密码",onKeyup:U(Ae,["enter"])},null,40,_e),[[R,Ee.value.password]]),d("span",{class:"auth-eye",onClick:a[2]||(a[2]=e=>Te.value=!Te.value)},[Te.value?(r(),o("svg",Be,a[28]||(a[28]=[d("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94"},null,-1),d("path",{d:"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19"},null,-1),d("line",{x1:"1",y1:"1",x2:"23",y2:"23"},null,-1),d("path",{d:"M14.12 14.12a3 3 0 1 1-4.24-4.24"},null,-1)]))):(r(),o("svg",Ce,a[27]||(a[27]=[d("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"},null,-1),d("circle",{cx:"12",cy:"12",r:"3"},null,-1)])))])])]),"set_password"===Le.value?(r(),o("div",$e,[a[29]||(a[29]=d("label",{class:"auth-label"},"确认密码",-1)),d("div",je,[T(d("input",{"onUpdate:modelValue":a[3]||(a[3]=e=>Ee.value.confirmPassword=e),type:Te.value?"text":"password",class:"auth-input",placeholder:"再次输入密码",onKeyup:U(Ae,["enter"])},null,40,ze),[[R,Ee.value.confirmPassword]])])])):f("",!0),"set_password"===Le.value?(r(),o("div",Se,a[30]||(a[30]=[d("svg",{class:"auth-tip-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[d("circle",{cx:"12",cy:"12",r:"10"}),d("line",{x1:"12",y1:"16",x2:"12",y2:"12"}),d("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"})],-1),d("span",null,[v("请牢记此密码,忘记后无法找回,只能手动删除 "),d("code",null,"backup/backup_auth.json"),v(" 重置")],-1)]))):f("",!0),d("button",{class:z(["auth-btn",{loading:De.value}]),disabled:De.value,onClick:Ae},[De.value?(r(),o("span",Pe)):f("",!0),v(" "+g("set_password"===Le.value?"设置并进入":"验证进入"),1)],10,Me)],32)])])):f("",!0)])),_:1})]))])}}},[["__scopeId","data-v-f71a7b70"]]);export{Ie as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.