Files
zsglpt/static/app/assets/ScreenshotsPage-C_eU28nf.js

2 lines
6.3 KiB
JavaScript

import{p as B,_ as W,a as v,o as j,h,w as r,e as g,f as d,g as s,b as x,d as u,k as m,F as U,v as D,t as E,x as P,E as i}from"./index-BzB0auqv.js";async function F(){const{data:f}=await B.get("/screenshots");return f}async function H(f){const{data:p}=await B.delete(`/screenshots/${encodeURIComponent(f)}`);return p}async function q(){const{data:f}=await B.post("/screenshots/clear",{});return f}const G={class:"panel-head"},J={class:"panel-actions"},K={key:1,class:"grid"},Q=["src","alt","data-shot-filename","onClick"],X={class:"shot-body"},Y=["title"],Z={class:"shot-meta app-muted"},ee={class:"shot-actions"},te={class:"preview"},ne=["src","alt"],ae={__name:"ScreenshotsPage",setup(f){const p=v(!1),c=v([]),w=v(!1),_=v(""),b=v("");function y(e){return`/screenshots/${encodeURIComponent(e)}`}async function S(){p.value=!0;try{const e=await F();c.value=Array.isArray(e)?e:[]}catch(e){e?.response?.status===401&&(window.location.href="/login"),c.value=[]}finally{p.value=!1}}function R(e){b.value=e.display_name||e.filename||"截图预览",_.value=y(e.filename),w.value=!0}function L(e){try{const t=typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(String(e)):String(e);return document.querySelector(`img[data-shot-filename="${t}"]`)}catch{return null}}function T(e){return new Promise((t,n)=>{e.toBlob(o=>o?t(o):n(new Error("toBlob_failed")),"image/png")})}async function I(e){if(!e)throw new Error("no_image");(!e.complete||e.naturalWidth<=0)&&(typeof e.decode=="function"?await e.decode():await new Promise((o,l)=>{e.addEventListener("load",o,{once:!0}),e.addEventListener("error",l,{once:!0})}));const t=document.createElement("canvas");t.width=e.naturalWidth,t.height=e.naturalHeight;const n=t.getContext("2d");if(!n)throw new Error("no_canvas");return n.drawImage(e,0,0),await T(t)}async function V(e){if(!e)throw new Error("no_blob");if(e.type==="image/png")return e;if(typeof createImageBitmap=="function"){const n=await createImageBitmap(e),o=document.createElement("canvas");o.width=n.width,o.height=n.height;const l=o.getContext("2d");if(!l)throw new Error("no_canvas");return l.drawImage(n,0,0),await T(o)}const t=URL.createObjectURL(e);try{const n=new Image;return n.src=t,typeof n.decode=="function"&&await n.decode(),await I(n)}finally{URL.revokeObjectURL(t)}}async function $(e,t){const n=L(t);if(n)try{return await I(n)}catch{}const o=await fetch(e,{credentials:"include",cache:"no-store"});if(!o.ok)throw new Error("fetch_failed");const l=await o.blob();if(!(o.headers.get("Content-Type")||l.type||"").startsWith("image/"))throw new Error("not_image");return await V(l)}async function z(){try{await P.confirm("确定要清空全部截图吗?","清空截图",{confirmButtonText:"清空",cancelButtonText:"取消",type:"warning"})}catch{return}try{const e=await q();if(e?.success){i.success(`已清空(删除 ${e?.deleted||0} 张)`),c.value=[],w.value=!1;return}i.error(e?.error||"操作失败")}catch(e){const t=e?.response?.data;i.error(t?.error||"操作失败")}}async function A(e){try{await P.confirm(`确定要删除截图「${e.display_name||e.filename}」吗?`,"删除截图",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}try{const t=await H(e.filename);if(t?.success){c.value=c.value.filter(n=>n.filename!==e.filename),_.value.includes(encodeURIComponent(e.filename))&&(w.value=!1),i.success("已删除");return}i.error(t?.error||"删除失败")}catch(t){const n=t?.response?.data;i.error(n?.error||"删除失败")}}async function M(e){const t=y(e.filename);if(!navigator.clipboard||typeof navigator.clipboard.write!="function"||typeof window.ClipboardItem>"u"){i.warning("当前环境不支持复制图片(建议使用 Chrome/Edge 并通过 HTTPS 访问);可用“下载”。");return}try{try{await navigator.clipboard.write([new ClipboardItem({"image/png":$(t,e.filename)})])}catch{const n=await $(t,e.filename);await navigator.clipboard.write([new ClipboardItem({"image/png":n})])}i.success("图片已复制到剪贴板")}catch{try{if(navigator.clipboard&&typeof navigator.clipboard.writeText=="function"){await navigator.clipboard.writeText(`${window.location.origin}${t}`),i.warning("复制图片失败,已复制图片链接(可直接粘贴到浏览器打开)");return}}catch{}i.warning("复制图片失败:请确认允许剪贴板权限;可用“下载”。")}}function N(e){const t=document.createElement("a");t.href=y(e.filename),t.download=e.display_name||e.filename,document.body.appendChild(t),t.click(),t.remove()}return j(S),(e,t)=>{const n=g("el-button"),o=g("el-skeleton"),l=g("el-empty"),C=g("el-card"),O=g("el-dialog");return d(),h(C,{shadow:"never",class:"panel","body-style":{padding:"14px"}},{default:r(()=>[s("div",G,[t[4]||(t[4]=s("div",{class:"panel-title"},"截图管理",-1)),s("div",J,[u(n,{loading:p.value,onClick:S},{default:r(()=>[...t[2]||(t[2]=[m("刷新",-1)])]),_:1},8,["loading"]),u(n,{type:"danger",plain:"",disabled:c.value.length===0,onClick:z},{default:r(()=>[...t[3]||(t[3]=[m("清空全部",-1)])]),_:1},8,["disabled"])])]),p.value?(d(),h(o,{key:0,rows:6,animated:""})):(d(),x(U,{key:1},[c.value.length===0?(d(),h(l,{key:0,description:"暂无截图"})):(d(),x("div",K,[(d(!0),x(U,null,D(c.value,a=>(d(),h(C,{key:a.filename,shadow:"never",class:"shot-card","body-style":{padding:"0"}},{default:r(()=>[s("img",{class:"shot-img",src:y(a.filename),alt:a.display_name||a.filename,"data-shot-filename":a.filename,loading:"lazy",onClick:k=>R(a)},null,8,Q),s("div",X,[s("div",{class:"shot-name",title:a.display_name||a.filename},E(a.display_name||a.filename),9,Y),s("div",Z,E(a.created||""),1),s("div",ee,[u(n,{size:"small",text:"",type:"primary",onClick:k=>M(a)},{default:r(()=>[...t[5]||(t[5]=[m("复制图片",-1)])]),_:1},8,["onClick"]),u(n,{size:"small",text:"",onClick:k=>N(a)},{default:r(()=>[...t[6]||(t[6]=[m("下载",-1)])]),_:1},8,["onClick"]),u(n,{size:"small",text:"",type:"danger",onClick:k=>A(a)},{default:r(()=>[...t[7]||(t[7]=[m("删除",-1)])]),_:1},8,["onClick"])])])]),_:2},1024))),128))]))],64)),u(O,{modelValue:w.value,"onUpdate:modelValue":t[1]||(t[1]=a=>w.value=a),title:b.value,width:"min(920px, 94vw)"},{footer:r(()=>[u(n,{onClick:t[0]||(t[0]=a=>w.value=!1)},{default:r(()=>[...t[8]||(t[8]=[m("关闭",-1)])]),_:1})]),default:r(()=>[s("div",te,[s("img",{src:_.value,alt:b.value,class:"preview-img"},null,8,ne)])]),_:1},8,["modelValue","title"])]),_:1})}}},re=W(ae,[["__scopeId","data-v-4871f4ca"]]);export{re as default};