From 1bab42704384cdc9ae34f907cc88be699ce83c37 Mon Sep 17 00:00:00 2001 From: axibayuit Date: Thu, 1 Jan 2026 00:24:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=9E=97=E9=85=B1?= =?UTF-8?q?=E8=B4=A1=E7=8C=AE=E6=B0=B4=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/775.0882ba00.css | 1 + css/775.0882ba00.css.gz | Bin 0 -> 2113 bytes index.html | 2 +- index.html.gz | Bin 511 -> 512 bytes js/775.fdc2404c.js | 2 ++ js/775.fdc2404c.js.gz | Bin 0 -> 7889 bytes js/775.fdc2404c.js.map | 1 + js/775.fdc2404c.js.map.gz | Bin 0 -> 21412 bytes js/app.743d3780.js | 2 ++ js/app.743d3780.js.gz | Bin 0 -> 4904 bytes js/app.743d3780.js.map | 1 + js/app.743d3780.js.map.gz | Bin 0 -> 15257 bytes 12 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 css/775.0882ba00.css create mode 100644 css/775.0882ba00.css.gz create mode 100644 js/775.fdc2404c.js create mode 100644 js/775.fdc2404c.js.gz create mode 100644 js/775.fdc2404c.js.map create mode 100644 js/775.fdc2404c.js.map.gz create mode 100644 js/app.743d3780.js create mode 100644 js/app.743d3780.js.gz create mode 100644 js/app.743d3780.js.map create mode 100644 js/app.743d3780.js.map.gz diff --git a/css/775.0882ba00.css b/css/775.0882ba00.css new file mode 100644 index 0000000..5c0d8c0 --- /dev/null +++ b/css/775.0882ba00.css @@ -0,0 +1 @@ +.tm-viewport[data-v-1e6c105f]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.tm-media[data-v-1e6c105f]{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain;-webkit-user-drag:none}.public-browse[data-v-5c1230be]{min-height:100vh;background:#0a0a0a;color:#fff}.header[data-v-5c1230be]{position:sticky;top:0;z-index:100;display:flex;align-items:center;justify-content:space-between;padding:16px 32px;background:hsla(0,0%,6%,.95);backdrop-filter:blur(10px);border-bottom:1px solid #1a1a1a}.logo[data-v-5c1230be]{font-size:20px;font-weight:600;color:#fff}.breadcrumb[data-v-5c1230be]{display:flex;align-items:center;gap:4px;font-size:14px}.breadcrumb-item[data-v-5c1230be]{padding:6px 12px;border-radius:6px;cursor:pointer;transition:background .2s;color:#ccc}.breadcrumb-item[data-v-5c1230be]:hover{background:#252525;color:#fff}.breadcrumb-sep[data-v-5c1230be]{color:#444}.file-count[data-v-5c1230be]{color:#666;font-size:14px}.error-container[data-v-5c1230be],.loading-container[data-v-5c1230be]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;color:#666}.loading-spinner[data-v-5c1230be]{width:48px;height:48px;border:3px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-5c1230be 1s linear infinite}.loading-spinner-small[data-v-5c1230be]{width:24px;height:24px;border:2px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-5c1230be 1s linear infinite}@keyframes spin-5c1230be{to{transform:rotate(1turn)}}.retry-btn[data-v-5c1230be]{margin-top:20px;padding:10px 32px;background:#3b82f6;border:none;border-radius:8px;color:#fff;font-size:14px;cursor:pointer;transition:background .2s}.retry-btn[data-v-5c1230be]:hover{background:#2563eb}.gallery-container[data-v-5c1230be]{padding:8px}@media (min-width:1200px){.gallery-container[data-v-5c1230be]{max-width:1400px;margin:0 auto;padding:24px}}.folders-section[data-v-5c1230be]{margin-bottom:24px}.folders-grid[data-v-5c1230be]{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:16px}.folder-card[data-v-5c1230be]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:24px 16px;background:#141414;border-radius:12px;border:1px solid #1a1a1a;cursor:pointer;transition:all .2s}.folder-card[data-v-5c1230be]:hover{background:#1a1a1a;border-color:#333;transform:translateY(-2px)}.folder-icon[data-v-5c1230be]{width:48px;height:48px;margin-bottom:12px;color:#555}.folder-icon svg[data-v-5c1230be]{width:100%;height:100%}.folder-name[data-v-5c1230be]{font-size:14px;color:#999;text-align:center;word-break:break-all}.waterfall[data-v-5c1230be]{display:flex;gap:16px}.waterfall-column[data-v-5c1230be]{flex:1;display:flex;flex-direction:column;gap:16px}.waterfall-item[data-v-5c1230be]{cursor:pointer}.image-wrapper[data-v-5c1230be]{position:relative;border-radius:12px;overflow:hidden;background:#141414;border:1px solid #1a1a1a;min-height:180px}.image-wrapper[data-v-5c1230be]:before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#141414 25%,#1a1a1a 50%,#141414 75%);background-size:200% 100%;animation:shimmer-5c1230be 1.5s infinite;z-index:1;pointer-events:none}.image-wrapper.loaded[data-v-5c1230be]:before{display:none}.image-wrapper.loaded[data-v-5c1230be]{min-height:auto}.image-wrapper img[data-v-5c1230be],.image-wrapper video[data-v-5c1230be]{width:100%;display:block;position:relative;z-index:2}@keyframes shimmer-5c1230be{0%{background-position:200% 0}to{background-position:-200% 0}}.image-wrapper[data-v-5c1230be]:hover{border-color:#333}.overlay[data-v-5c1230be]{position:absolute;inset:0;background:linear-gradient(transparent 50%,rgba(0,0,0,.85));opacity:0;transition:opacity .2s;display:flex;align-items:flex-end;justify-content:flex-end;padding:12px;z-index:10}.image-wrapper:hover .overlay[data-v-5c1230be]{opacity:1}.file-placeholder[data-v-5c1230be]{width:100%;height:200px;display:flex;align-items:center;justify-content:center;background:#141414;color:#333}.file-placeholder svg[data-v-5c1230be]{width:56px;height:56px}.overlay-actions[data-v-5c1230be]{display:flex;gap:8px}.action-btn[data-v-5c1230be]{width:32px;height:32px;border:none;border-radius:50%;background:hsla(0,0%,100%,.08);backdrop-filter:blur(8px);cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;color:hsla(0,0%,100%,.6)}.action-btn svg[data-v-5c1230be]{width:16px;height:16px}.action-btn[data-v-5c1230be]:hover{background:hsla(0,0%,100%,.2);color:#fff;transform:scale(1.1)}.load-trigger[data-v-5c1230be]{display:flex;justify-content:center;align-items:center;padding:48px;min-height:100px}.loading-more[data-v-5c1230be]{display:flex;align-items:center;gap:12px;color:#666;font-size:14px}.no-more[data-v-5c1230be]{color:#444;font-size:14px}.credit-link[data-v-5c1230be]{display:block;margin-top:8px;color:#555;font-size:12px;text-decoration:none;transition:color .2s}.credit-link[data-v-5c1230be]:hover{color:#888}.preview-modal[data-v-5c1230be]{position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,.97)}.preview-content[data-v-5c1230be],.preview-modal[data-v-5c1230be]{display:flex;align-items:center;justify-content:center;overflow:hidden}.preview-content[data-v-5c1230be]{width:100%;height:100%;padding:60px 80px;box-sizing:border-box}.swipe-viewport[data-v-5c1230be]{width:100%;height:100%;overflow:hidden;position:relative}.swipe-track[data-v-5c1230be]{width:300%;height:100%;display:flex;will-change:transform}.swipe-slide[data-v-5c1230be]{width:33.333%;flex-shrink:0;height:100%;display:flex;align-items:center;justify-content:center}.preview-image[data-v-5c1230be],.preview-video[data-v-5c1230be]{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.preview-close[data-v-5c1230be]{position:fixed;top:20px;right:20px;background:hsla(0,0%,100%,.1);border:none;color:#fff;cursor:pointer;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.preview-close[data-v-5c1230be]:hover{background:hsla(0,0%,100%,.2)}.preview-close svg[data-v-5c1230be]{width:28px;height:28px}.page-indicator[data-v-5c1230be]{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,.6);color:hsla(0,0%,100%,.8);padding:8px 16px;border-radius:20px;font-size:14px;z-index:1010}.preview-next[data-v-5c1230be],.preview-prev[data-v-5c1230be]{position:fixed;top:50%;transform:translateY(-50%);background:hsla(0,0%,100%,.1);border:none;color:#fff;padding:16px;cursor:pointer;border-radius:50%;width:56px;height:56px;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.preview-next[data-v-5c1230be]:hover,.preview-prev[data-v-5c1230be]:hover{background:hsla(0,0%,100%,.2)}.preview-next svg[data-v-5c1230be],.preview-prev svg[data-v-5c1230be]{width:32px;height:32px}.preview-prev[data-v-5c1230be]{left:20px}.preview-next[data-v-5c1230be]{right:20px}.rotate-btn[data-v-5c1230be]{position:fixed;bottom:30px;right:20px;background:hsla(0,0%,100%,.1);border:none;color:#fff;cursor:pointer;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background .2s;z-index:1010}.rotate-btn[data-v-5c1230be]:hover{background:hsla(0,0%,100%,.2)}.rotate-btn svg[data-v-5c1230be]{width:24px;height:24px}@media (max-width:768px){.desktop-only[data-v-5c1230be]{display:none!important}.preview-content.mobile-only[data-v-5c1230be]{display:block;padding:0;width:100%;height:100%;position:absolute;top:0;left:0}.page-indicator[data-v-5c1230be]{bottom:40px}}@media (min-width:769px){.mobile-only[data-v-5c1230be]{display:none!important}}@media (max-width:1199px) and (min-width:601px){.gallery-container[data-v-5c1230be]{padding:12px}.waterfall-column[data-v-5c1230be],.waterfall[data-v-5c1230be]{gap:10px}.image-wrapper[data-v-5c1230be]{border-radius:8px}}@media (max-width:600px){.header[data-v-5c1230be]{padding:10px 12px}.header-left .logo[data-v-5c1230be]{font-size:16px}.breadcrumb[data-v-5c1230be]{font-size:12px}.breadcrumb-item[data-v-5c1230be]{padding:4px 8px}.file-count[data-v-5c1230be]{font-size:12px}.gallery-container[data-v-5c1230be]{padding:6px}.waterfall-column[data-v-5c1230be],.waterfall[data-v-5c1230be]{gap:6px}.image-wrapper[data-v-5c1230be]{border-radius:6px;min-height:120px}.folders-section[data-v-5c1230be]{margin-bottom:12px}.folders-grid[data-v-5c1230be]{grid-template-columns:repeat(2,1fr);gap:8px}.folder-card[data-v-5c1230be]{padding:16px 12px;border-radius:8px}.folder-icon[data-v-5c1230be]{width:36px;height:36px;margin-bottom:8px}.folder-name[data-v-5c1230be]{font-size:12px}.load-trigger[data-v-5c1230be]{padding:24px;min-height:60px}}.copy-toast{position:fixed;bottom:80px;left:50%;transform:translateX(-50%) translateY(20px);background:rgba(0,0,0,.8);color:#fff;padding:10px 24px;border-radius:20px;font-size:14px;opacity:0;transition:all .3s ease;z-index:9999;pointer-events:none}.copy-toast.show{opacity:1;transform:translateX(-50%) translateY(0)} \ No newline at end of file diff --git a/css/775.0882ba00.css.gz b/css/775.0882ba00.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..1b92ac66f7ac5aeba822fa9d18d23e9c40ed6da4 GIT binary patch literal 2113 zcmV-H2)_3piwFP!000023f)@UuB$c^eihoSNQo39AS>)FxaniG`qc{qL*fQ(WSo^` zN4)zlo09=UlC8EERix}J4&yn`H#6H7Ir<`SEf^R7OR&J`3%TIOuCq`7d|XK)PJ!z< ztMCNmcoOyRgp@^w??IZuEyNi)QbYvgWe@`uz{9^Tr6B1Y#f%D|qP;BGB|ae>3&LnX z8HEsCAvzO*E+ueOLI$yDZshF8^y>IRWs4l;kPtj&J;yhsu`mDBML-O(=r4!`N{I+0 zqnOapaB09|!tt>=xwu3biBZJawS@Ngee8NWCxSm8IicElU#Bp_@%hNvg(kr_2g^?w zvyAcJTbiboeFB^SpVBEBTPzlA9`{vn?kB`buNd_op7b<3-^L>A!A>f>G)P#e1vWrPCe7NIGjM8JeeROUF#=2-PU zdREo%hE?z1VD+~%+*6KoD6PS>55XSF&r`F}2f^2;S|&KFZWDsqa75$SZD} z?hF!}EIgCwhK5&SHmB|P`vFO-{5sB&9YezIMT&D+D)Mz))(3umeue^W0x3(j#=0_| zAX(SWf%--`%PRYd1@P3ECI_z4yI1!{AE($45X{j*DUu z-f_sVAYWi|L+LDO#;(DMBni-Y=QVh$jzbTQlwg^oAcB-}c(f7p>#t$QBaTXzT?B-L zmLLL0XQVD1=qULHD%PJ)0>^E`p5^UV+lC`+@2tA(-}kGHMy17p&dO2_rWL9a$#dXZ zt+MxJSEhPA95#wa@C8(q4OSnBtg0_0vy!*&@W!h;+Ly_1^qNKTqX9MzpZOvQu*Gm| z8H+L&pTnu=v`X*>RePkkhqKc14(g~Vr8|{i#=EGw{nUG!#5T@il`XGl_`VPU?|7F= zg$3q7h4LqUj8vntb+-0lzuAPWz%dc`z|nJab5TL@*?vJK0HDdFmUK5d$RcC2@5DyB zsa0Xk3*NHmHpslla11AvMPJFf3Of93CvM0fy0OOmELDQN-xrv@N|BAkO`~7Fkgz2> zvg^mqsIfju!NcaLomQU>xKP4eVRs{)8j>o5M-Hgx%^|TRG1Cqg{L<-fmM>*s0 zbDh2pYfL>YWi!P4etGgv%poBHWrUvRnW}TM*5n)p_(~@#SybpJftYdJ55+WpQ*YLI za_RWS)Xh1E!=bVZ4sxuAa+ct1A?v2(21%E4wYkzD|LXbm^ZTYJ-`Ltv-JUS;lMyt6 zLeCkQ8)0^19octEU=&8|CM_c`cB8CYWtUe{z+^=Fl>QjAP0DpkS#TVmXEWa7A< zxIJNdgrJMwmTsAm1ZL^(?A>m+s?lzF;)I?9=WiJC_V!S5O7`4%wa&-xW>C?z+&rpCi!&^}1pe%xes+S{CkP36mbLLp0UFU* zDt?|OuBQ+~A>kIG35l^_{HZmXmUkzukU=Vxh79fX?`yPo27SpO|M{DlI)2!M+PJ5g zGYm}9Pq_PD*sM_sx22>i|9#2(W<>mBD&p(TsILsho;h_vGfMooJkzMh+A*JK^F8mC z=NO%Lc*>H0kI`-Q#M;V*Jx71gDD9(9K9yZhYRw>fAzc2W`D;NNubICmu$Z|<6a0P> z+*P~p{y`0b6DZGegwJSpp9f7+y}yuL0uoHc1O(YRi)074Or#kjG{NkIb3kd*pVuo$ z<$lidB;2^shjc%~2>iSMsRVzC<&oS5J-Y6vq-SB8=%@IO`|6xs@9tk1B5s!^ld2VY zVd(alEHzBB`OUImc2%seQfl_=N0GFZ^>qJQca%#@)?xSZ#`09o-Brn6+Ch$~zhNx@ z@3EEtwyFG416ya=H@7dfxXas@#f6Kfb}RiTWpT4I*!UYZ+B$`$&B9JA>FW1TD4opH zrGVGA{qv&+eTOsL0IP*p%!)e_43}c2jvZcveU=82y!t;jm~r4?V+2Jq__Q_c67(|; rDbLb}zSGp4hdYD!wS9v#I_MaRGj&10(Sanyue ImgHub
\ No newline at end of file +Sanyue ImgHub
\ No newline at end of file diff --git a/index.html.gz b/index.html.gz index 0441cb57d6e9f4547e1658a231006825f8ffdbee..a627e98bf9272b00affb78f87114ed0e8bdcc2cc 100644 GIT binary patch literal 512 zcmV+b0{{IViwFP!000023WZa_Zrd;n{S{6-^b*@Ck~S$I8z_bW>rNYrVY>~oL|bZP z(UWKg{`(`vffi1;X#NVB$Bs=z4oe7u4 zoRqUgFxX%`SZ**1NKu!fcuIw~L)c{_217CBo9(i`y}7x|pOUC#F+<;@P<@|o)+@8x zY?l|nlyOh%8>C4~?$Z+s&O;*Kc8p`SNQrQzZjE zJK#v6t$yNFL`W3l1ogm>juZRsy4DUg7{U~;81@u*&`0Vq`U&=qEe#A`)uZ+b=CU|-mBoJ{#*N_2@xTvijTHT?o)1H~|4-DyKHY_~y{XiJSO zY7*_h|9(iEc1??-7Xc*r9^WG=`N5FpIU-mdd?R-+coq6uh(=merjY}(0&P{w$h8=` zE3U;MYnfw#e@8df;&<`$w)jj#RP0)h0yG82z_qyhQlshd5fs#bwU``kBPD)Tw{?bX zZE$iLi+!+i!Ld`m$Xa=<&qO1=3mZu2YvD8n0XAV*i^@|^WeojMg^JN*!8B@Hyk9-2 zym_MxG{Ic8n{PG;l`li%5i)E9UXOGz;vUrW&H9A{gU)^YR_7c.onPointerDown&&c.onPointerDown(...e)),onPointermove:t[2]||(t[2]=(...e)=>c.onPointerMove&&c.onPointerMove(...e)),onPointerup:t[3]||(t[3]=(...e)=>c.onPointerUp&&c.onPointerUp(...e)),onPointercancel:t[4]||(t[4]=(...e)=>c.onPointerUp&&c.onPointerUp(...e)),onDblclick:t[5]||(t[5]=(0,r.D$)((...e)=>c.onDblClick&&c.onDblClick(...e),["prevent"]))},[i.isImage?((0,s.uX)(),(0,s.CE)("img",{key:0,class:"tm-media",src:i.src,draggable:"false",style:(0,o.Tr)(c.mediaStyle),onLoad:t[0]||(t[0]=(...e)=>c.onLoad&&c.onLoad(...e))},null,44,n)):i.isVideo?((0,s.uX)(),(0,s.CE)("video",{key:1,class:"tm-media",src:i.src,controls:"",autoplay:"",playsinline:"",style:(0,o.Tr)(c.mediaStyle)},null,12,a)):(0,s.Q3)("",!0)],544)}var h={name:"TransformMedia",props:{file:{type:Object,required:!0},src:{type:String,required:!0},isImage:{type:Boolean,default:!0},isVideo:{type:Boolean,default:!1}},data(){return{pointers:new Map,scale:1,rotation:0,rotatePreview:0,tx:0,ty:0,naturalWidth:0,naturalHeight:0,startScale:1,startRotation:0,startTx:0,startTy:0,startCenter:null,startDist:0,startAngle:0,dragging:!1,dragStart:null,viewportRect:null,minScale:1,maxScale:4,gestureMode:null,edgeOverflow:0,edgeDir:0}},computed:{isActiveTransform(){return this.scale>1.001||this.pointers.size>=2||this.dragging},displayRotation(){return this.rotation+this.rotatePreview},rotateShrink(){const e=Math.min(1,Math.abs(this.rotatePreview)/90),t=Math.sin(Math.PI*e);return 1-.12*t},mediaStyle(){const e=this.scale*this.rotateShrink,t=this.pointers.size>0;return{transform:`translate3d(${this.tx}px, ${this.ty}px, 0) scale(${e}) rotate(${this.displayRotation}deg)`,transition:t?"none":"transform 0.25s ease",transformOrigin:"center center"}}},watch:{isActiveTransform(e){this.$emit(e?"lock":"unlock")}},methods:{onLoad(e){const t=e.target;this.naturalWidth=t.naturalWidth,this.naturalHeight=t.naturalHeight},reset(){this.scale=1,this.rotation=0,this.rotatePreview=0,this.tx=0,this.ty=0,this.pointers.clear(),this.dragging=!1,this.edgeOverflow=0,this.edgeDir=0,this.$emit("unlock")},clamp(e,t,i){return Math.max(t,Math.min(i,e))},rubberBand(e,t,i=.55){return e*t*i/(t+i*e)},getViewportRect(){return this.$refs.viewport?.getBoundingClientRect()},getPanBounds(){const e=this.$refs.viewport?.getBoundingClientRect();if(!e)return{maxX:0,maxY:0,vw:0,vh:0};const t=e.width,i=e.height,s=this.$el.querySelector("img, video"),r=s?.clientWidth||t,o=s?.clientHeight||i,n=r*this.scale,a=o*this.scale,l=Math.max(0,(n-t)/2),h=Math.max(0,(a-i)/2);return{maxX:l,maxY:h,vw:t,vh:i}},applyBoundWithRubber(e,t,i){return e>t?t+this.rubberBand(e-t,i,.55):e<-t?-t-this.rubberBand(-t-e,i,.55):e},calcTwoPointer(){const e=Array.from(this.pointers.values()),t=e[0],i=e[1],s=i.x-t.x,r=i.y-t.y,o=Math.hypot(s,r),n=Math.atan2(r,s)*(180/Math.PI),a={x:(t.x+i.x)/2,y:(t.y+i.y)/2};return{dist:o,angle:n,center:a}},normalizeAngle(e){return e=(e%360+360)%360,e>180?e-360:e},onPointerDown(e){if(e.currentTarget.setPointerCapture?.(e.pointerId),this.viewportRect=this.getViewportRect(),this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),2===this.pointers.size){const{dist:e,angle:t,center:i}=this.calcTwoPointer();return this.startDist=e,this.startAngle=t,this.startCenter=i,this.startScale=this.scale,this.startRotation=this.rotation,this.startTx=this.tx,this.startTy=this.ty,this.dragging=!1,this.gestureMode=null,void(this.rotatePreview=0)}this.scale>1.001&&(this.dragging=!0,this.dragStart={x:e.clientX,y:e.clientY},this.startTx=this.tx,this.startTy=this.ty)},onPointerMove(e){if(this.pointers.has(e.pointerId)){if(this.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),2===this.pointers.size){e.preventDefault();const{dist:t,angle:i,center:s}=this.calcTwoPointer(),r=t/(this.startDist||t),o=Math.abs(r-1),n=this.normalizeAngle(i-this.startAngle),a=Math.abs(n),l=8,h=.08;if(!this.gestureMode)if(a>=l)this.gestureMode="rotate";else{if(!(o>=h))return;this.gestureMode="pinch"}if("rotate"===this.gestureMode)return this.scale=this.startScale,void(this.rotatePreview=this.clamp(n,-90,90));if("pinch"===this.gestureMode&&(this.scale=this.clamp(this.startScale*r,this.minScale,this.maxScale),this.rotatePreview=0),this.startCenter&&this.viewportRect){const e=this.startCenter.x-this.viewportRect.left-this.viewportRect.width/2,t=this.startCenter.y-this.viewportRect.top-this.viewportRect.height/2,i=s.x-this.viewportRect.left-this.viewportRect.width/2,r=s.y-this.viewportRect.top-this.viewportRect.height/2;this.tx=this.startTx+(i-e),this.ty=this.startTy+(r-t)}return}if(this.dragging&&this.scale>1.001){e.preventDefault();const t=e.clientX-this.dragStart.x,i=e.clientY-this.dragStart.y,s=this.startTx+t,r=this.startTy+i,{maxX:o,maxY:n,vw:a,vh:l}=this.getPanBounds();let h=0,c=0;s>o?(h=s-o,c=-1):s<-o&&(h=-o-s,c=1),this.edgeOverflow=h,this.edgeDir=c,this.tx=this.applyBoundWithRubber(s,o,a),this.ty=this.applyBoundWithRubber(r,n,l)}}},onPointerUp(e){if(this.pointers.has(e.pointerId)&&this.pointers.delete(e.pointerId),this.pointers.size<2&&"rotate"===this.gestureMode&&(this.finishRotate(),this.gestureMode=null),this.pointers.size<2&&(this.startCenter=null,this.startDist=0,this.startAngle=0,this.gestureMode=null),0===this.pointers.size){if(this.dragging=!1,this.edgeOverflow>60&&0!==this.edgeDir){const e=this.edgeDir;return this.reset(),void this.$emit("edge-swipe",e)}if(this.edgeOverflow=0,this.edgeDir=0,this.scale<=1.001)this.scale=1,this.tx=0,this.ty=0;else{const{maxX:e,maxY:t}=this.getPanBounds();this.tx=Math.max(-e,Math.min(e,this.tx)),this.ty=Math.max(-t,Math.min(t,this.ty))}}},finishRotate(){const e=this.rotatePreview,t=30;let i=0;Math.abs(e)>=t&&(i=e>0?90:-90);const s=((this.rotation+i)%360+360)%360;this.rotation=s,this.rotatePreview=0,this.updateFillScale()},updateFillScale(){const e=this.rotation%360,t=90===e||270===e;t?(this.scale=2,this.tx=0,this.ty=0):(this.scale=1,this.tx=0,this.ty=0)},onDblClick(){this.scale>1.001?(this.scale=1,this.tx=0,this.ty=0):this.scale=2}}},c=i(1241);const d=(0,c.A)(h,[["render",l],["__scopeId","data-v-1e6c105f"]]);var u=d;const p={class:"public-browse"},m={class:"header"},g={class:"header-left"},v={class:"logo"},w={class:"header-center"},f={class:"breadcrumb"},y=["onClick"],k={class:"header-right"},C={class:"file-count"},x={key:0,class:"loading-container"},b={key:1,class:"error-container"},L={key:2,class:"gallery-container",ref:"galleryContainer"},I={key:0,class:"folders-section"},F={class:"folders-grid"},M=["onClick"],P={class:"folder-name"},S={class:"waterfall",ref:"waterfall"},T=["onClick"],X=["src","alt","onLoad"],E=["src","onLoadedmetadata"],R={key:2,class:"file-placeholder"},D={class:"overlay"},$={class:"overlay-actions"},A=["onClick"],B=["onClick"],z={ref:"loadTrigger",class:"load-trigger"},V={key:0,class:"loading-more"},H={key:1,class:"no-more"},W={key:2,class:"credit-link",href:"https://github.com/axibayuit-a11y",target:"_blank",rel:"noopener"},U=["src"],_=["src"],Y={class:"page-indicator"};function O(e,t,i,n,a,l){const h=u;return(0,s.uX)(),(0,s.CE)("div",p,[(0,s.Lk)("header",m,[(0,s.Lk)("div",g,[(0,s.Lk)("span",v,(0,o.v_)(l.siteName),1)]),(0,s.Lk)("div",w,[(0,s.Lk)("div",f,[(0,s.Lk)("span",{class:"breadcrumb-item",onClick:t[0]||(t[0]=(...e)=>l.goToRoot&&l.goToRoot(...e))},(0,o.v_)(l.rootDirName),1),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.pathParts,(e,i)=>((0,s.uX)(),(0,s.CE)(s.FK,{key:i},[t[18]||(t[18]=(0,s.Lk)("span",{class:"breadcrumb-sep"},"/",-1)),(0,s.Lk)("span",{class:"breadcrumb-item",onClick:e=>l.goToPath(i)},(0,o.v_)(e),9,y)],64))),128))])]),(0,s.Lk)("div",k,[(0,s.Lk)("span",C,(0,o.v_)(a.totalCount)+" 个文件",1)])]),a.loading&&0===a.files.length?((0,s.uX)(),(0,s.CE)("div",x,[...t[19]||(t[19]=[(0,s.Lk)("div",{class:"loading-spinner"},null,-1),(0,s.Lk)("p",null,"加载中...",-1)])])):a.error?((0,s.uX)(),(0,s.CE)("div",b,[(0,s.Lk)("p",null,(0,o.v_)(a.error),1),a.canRetry?((0,s.uX)(),(0,s.CE)("button",{key:0,onClick:t[1]||(t[1]=(...e)=>l.loadFiles&&l.loadFiles(...e)),class:"retry-btn"},"重试")):(0,s.Q3)("",!0)])):((0,s.uX)(),(0,s.CE)("div",L,[l.folders.length>0?((0,s.uX)(),(0,s.CE)("div",I,[(0,s.Lk)("div",F,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.folders,e=>((0,s.uX)(),(0,s.CE)("div",{key:e.name,class:"folder-card",onClick:t=>l.enterFolder(e.name)},[t[20]||(t[20]=(0,s.Lk)("div",{class:"folder-icon"},[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"})])],-1)),(0,s.Lk)("span",P,(0,o.v_)(l.getFolderName(e.name)),1)],8,M))),128))])])):(0,s.Q3)("",!0),(0,s.Lk)("div",S,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.columns,(e,i)=>((0,s.uX)(),(0,s.CE)("div",{key:i,class:"waterfall-column"},[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(e,e=>((0,s.uX)(),(0,s.CE)("div",{key:e.name,class:"waterfall-item",onClick:t=>l.openPreview(e)},[(0,s.Lk)("div",{class:(0,o.C4)(["image-wrapper",{loaded:e.loaded}])},[l.isImage(e)?((0,s.uX)(),(0,s.CE)("img",{key:0,src:l.getFileUrl(e.name),alt:e.name,loading:"lazy",onLoad:t=>l.onImageLoad(t,e),onError:t[2]||(t[2]=(...e)=>l.handleImageError&&l.handleImageError(...e))},null,40,X)):l.isVideo(e)?((0,s.uX)(),(0,s.CE)("video",{key:1,src:l.getFileUrl(e.name),muted:"",loop:"",preload:"metadata",onLoadedmetadata:t=>l.onVideoLoad(t,e),onMouseenter:t[3]||(t[3]=e=>e.target.play()),onMouseleave:t[4]||(t[4]=e=>e.target.pause())},null,40,E)):((0,s.uX)(),(0,s.CE)("div",R,[...t[21]||(t[21]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13z"})],-1)])])),(0,s.Lk)("div",D,[(0,s.Lk)("div",$,[(0,s.Lk)("button",{class:"action-btn",onClick:(0,r.D$)(t=>l.copyLink(e.name),["stop"]),title:"复制链接"},[...t[22]||(t[22]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"})],-1)])],8,A),(0,s.Lk)("button",{class:"action-btn",onClick:(0,r.D$)(t=>l.downloadFile(e.name),["stop"]),title:"下载"},[...t[23]||(t[23]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"})],-1)])],8,B)])])],2)],8,T))),128))]))),128))],512),(0,s.Lk)("div",z,[a.loading&&a.files.length>0?((0,s.uX)(),(0,s.CE)("div",V,[...t[24]||(t[24]=[(0,s.Lk)("div",{class:"loading-spinner-small"},null,-1),(0,s.Lk)("span",null,"加载中...",-1)])])):!a.hasMore&&l.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("div",H," 已加载全部 ")):(0,s.Q3)("",!0),!a.hasMore&&l.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("a",W," 林酱贡献 ")):(0,s.Q3)("",!0)],512)],512)),a.previewVisible?((0,s.uX)(),(0,s.CE)("div",{key:3,class:"preview-modal",onClick:t[17]||(t[17]=(0,r.D$)((...e)=>l.closePreview&&l.closePreview(...e),["self"]))},[(0,s.Lk)("button",{class:"preview-close",onClick:t[5]||(t[5]=(0,r.D$)((...e)=>l.closePreview&&l.closePreview(...e),["stop"]))},[...t[25]||(t[25]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})],-1)])]),(0,s.Lk)("div",{class:"preview-content desktop-only",onClick:t[6]||(t[6]=(0,r.D$)(()=>{},["stop"]))},[l.currentPreviewFile&&l.isImage(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("img",{key:0,src:l.getFileUrl(l.currentPreviewFile.name),class:"preview-image",style:(0,o.Tr)(l.desktopImageStyle),draggable:"false"},null,12,U)):l.currentPreviewFile&&l.isVideo(l.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("video",{key:1,src:l.getFileUrl(l.currentPreviewFile.name),controls:"",autoplay:"",class:"preview-video",style:(0,o.Tr)(l.desktopImageStyle)},null,12,_)):(0,s.Q3)("",!0)]),(0,s.Lk)("div",{class:"preview-content mobile-only",onClick:t[13]||(t[13]=(0,r.D$)(()=>{},["stop"]))},[(0,s.Lk)("div",{class:"swipe-viewport",ref:"mobileViewport",onTouchstart:t[10]||(t[10]=(...e)=>l.onSwipeStart&&l.onSwipeStart(...e)),onTouchmove:t[11]||(t[11]=(...e)=>l.onSwipeMove&&l.onSwipeMove(...e)),onTouchend:t[12]||(t[12]=(...e)=>l.onSwipeEnd&&l.onSwipeEnd(...e))},[(0,s.Lk)("div",{class:"swipe-track",style:(0,o.Tr)(l.swipeTrackStyle),onTransitionend:t[9]||(t[9]=(...e)=>l.onSwipeTransitionEnd&&l.onSwipeTransitionEnd(...e))},[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.swipeWindow,(e,i)=>((0,s.uX)(),(0,s.CE)("div",{class:"swipe-slide",key:l.getSlideKey(e,i)},[e?((0,s.uX)(),(0,s.Wv)(h,{key:0,file:e,src:l.getFileUrl(e.name),"is-image":l.isImage(e),"is-video":l.isVideo(e),onLock:t[7]||(t[7]=e=>a.gestureLocked=!0),onUnlock:t[8]||(t[8]=e=>a.gestureLocked=!1),onEdgeSwipe:l.onEdgeSwipe},null,8,["file","src","is-image","is-video","onEdgeSwipe"])):(0,s.Q3)("",!0)]))),128))],36)],544)]),a.previewIndex>0?((0,s.uX)(),(0,s.CE)("button",{key:0,class:"preview-prev desktop-only",onClick:t[14]||(t[14]=(0,r.D$)((...e)=>l.prevImage&&l.prevImage(...e),["stop"]))},[...t[26]||(t[26]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"})],-1)])])):(0,s.Q3)("",!0),a.previewIndexl.nextImage&&l.nextImage(...e),["stop"]))},[...t[27]||(t[27]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})],-1)])])):(0,s.Q3)("",!0),(0,s.Lk)("button",{class:"rotate-btn desktop-only",onClick:t[16]||(t[16]=(0,r.D$)((...e)=>l.rotateImage&&l.rotateImage(...e),["stop"])),title:"旋转90°"},[...t[28]||(t[28]=[(0,s.Lk)("svg",{viewBox:"0 0 24 24",fill:"currentColor"},[(0,s.Lk)("path",{d:"M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z"})],-1)])]),(0,s.Lk)("div",Y,(0,o.v_)(a.previewIndex+1)+" / "+(0,o.v_)(l.mediaFiles.length),1)])):(0,s.Q3)("",!0)])}i(4114),i(8111),i(2489),i(7588),i(1701);var Q=i(4373),K=i(8401),N={name:"PublicBrowse",components:{TransformMedia:u},data(){return{files:[],allowedDirs:[],rootDir:"",currentPath:"",totalCount:0,loading:!1,error:null,canRetry:!0,hasMore:!0,previewVisible:!1,previewIndex:0,observer:null,pageSize:24,columnCount:4,columnHeights:[0,0,0,0],imageRotation:0,swipeX:0,swipeStartX:0,swipeStartY:0,swipeStartT:0,swipeActive:!1,swipeAnimating:!1,swipeDir:0,viewportW:0,gestureLocked:!1}},computed:{...(0,K.L8)(["userConfig"]),siteName(){return this.userConfig?.siteTitle||"公开相册"},rootDirName(){return this.rootDir.split("/").filter(Boolean).pop()||"根目录"},pathParts(){if(!this.currentPath||!this.rootDir)return[];const e=this.currentPath.replace(this.rootDir,"").replace(/^\/+/,"");return e.split("/").filter(Boolean)},folders(){return this.files.filter(e=>e.isFolder)},mediaFiles(){return this.files.filter(e=>!e.isFolder)},columns(){const e=Array.from({length:this.columnCount},()=>[]);for(const t of this.mediaFiles){const i=t.columnIndex??0;i0?this.mediaFiles[this.previewIndex-1]:null},nextPreviewFile(){return this.previewIndex{e.columnIndex=void 0,this.assignToColumn(e)}))},getShortestColumn(){let e=0,t=this.columnHeights[0];for(let i=1;i{const t=e[0];t.isIntersecting&&this.hasMore&&!this.loading&&this.loadMore()},{rootMargin:"200px"})},observeLoadTrigger(){this.$nextTick(()=>{this.$refs.loadTrigger&&this.observer&&this.observer.observe(this.$refs.loadTrigger)})},async initFromRoute(){const e=this.$route.params.dir||"",t=Array.isArray(e)?e.join("/"):e;if(!t)return this.error="请指定要浏览的目录,例如: /browse/landscape",void(this.canRetry=!1);const i=t.split("/").filter(Boolean);this.rootDir=i[0],this.currentPath=t,this.files=[],this.hasMore=!0,this.columnHeights=new Array(this.columnCount).fill(0),await this.loadFiles(),this.observeLoadTrigger()},async loadFiles(){this.loading=!0,this.error=null,this.canRetry=!0;try{const e=await Q.A.get(`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&count=${this.pageSize}`);e.data.allowedDirs&&(this.allowedDirs=e.data.allowedDirs);const t=(e.data.directories||[]).map(e=>({name:e,isFolder:!0})),i=(e.data.files||[]).map(e=>({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));i.forEach(e=>this.assignToColumn(e)),this.files=[...t,...i],this.totalCount=e.data.totalCount||this.files.length,this.hasMore=this.mediaFiles.length({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));i.forEach(e=>this.assignToColumn(e)),this.files.push(...i),this.hasMore=this.mediaFiles.length{this.showToast("已复制")}).catch(()=>{const e=document.createElement("input");e.value=t,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),this.showToast("已复制")})},showToast(e){const t=document.querySelector(".copy-toast");t&&t.remove();const i=document.createElement("div");i.className="copy-toast",i.textContent=e,document.body.appendChild(i),setTimeout(()=>i.classList.add("show"),10),setTimeout(()=>{i.classList.remove("show"),setTimeout(()=>i.remove(),300)},1500)},downloadFile(e){const t=document.createElement("a");t.href=this.getFileUrl(e),t.download=e.split("/").pop(),t.click()},openPreview(e){if(e.isFolder)return;const t=this.mediaFiles.findIndex(t=>t.name===e.name);t>=0&&(this.previewIndex=t,this.previewVisible=!0,this.imageRotation=0,this.gestureLocked=!1,document.body.style.overflow="hidden",this.$nextTick(()=>{this.viewportW=this.$refs.mobileViewport?.getBoundingClientRect().width||window.innerWidth}))},closePreview(){this.previewVisible=!1,this.imageRotation=0,this.gestureLocked=!1,document.body.style.overflow=""},prevImage(){this.previewIndex>0&&(this.previewIndex--,this.imageRotation=0)},nextImage(){this.previewIndex=360&&setTimeout(()=>{const e=this.$el.querySelector(".preview-image, .preview-video");e?(e.style.transition="none",this.imageRotation=0,e.offsetHeight,e.style.transition=""):this.imageRotation=0},300)},onSwipeStart(e){if(this.gestureLocked)return;if(this.swipeAnimating)return;const t=e.touches[0];this.swipeStartX=t.clientX,this.swipeStartY=t.clientY,this.swipeStartT=performance.now(),this.swipeX=0,this.swipeActive=!1,this.viewportW=this.$refs.mobileViewport?.getBoundingClientRect().width||window.innerWidth},onSwipeMove(e){if(this.gestureLocked)return;if(this.swipeAnimating)return;const t=e.touches[0],i=t.clientX-this.swipeStartX,s=t.clientY-this.swipeStartY;if(!this.swipeActive){if(Math.abs(i)<8)return;if(Math.abs(i)<=Math.abs(s))return;this.swipeActive=!0}e.preventDefault();let r=i;0===this.previewIndex&&r>0?r=this.rubberBand(r,this.viewportW,.55):this.previewIndex===this.mediaFiles.length-1&&r<0&&(r=-this.rubberBand(-r,this.viewportW,.55)),this.swipeX=r},onSwipeEnd(){if(this.gestureLocked)return;if(this.swipeAnimating)return;if(!this.swipeActive)return void(this.swipeX=0);const e=Math.max(1,performance.now()-this.swipeStartT),t=this.swipeX/e,i=.2*this.viewportW;let s=0;(this.swipeX<=-i||t<=-.8)&&(s=1),(this.swipeX>=i||t>=.8)&&(s=-1),(-1===s&&0===this.previewIndex||1===s&&this.previewIndex===this.mediaFiles.length-1)&&(s=0),this.swipeDir=s,this.swipeAnimating=!0,this.swipeX=1===s?-this.viewportW:-1===s?+this.viewportW:0},onSwipeTransitionEnd(){this.swipeAnimating&&(1===this.swipeDir&&this.previewIndex++,-1===this.swipeDir&&this.previewIndex--,this.swipeAnimating=!1,this.swipeDir=0,this.swipeX=0)},rubberBand(e,t,i=.55){return e*t*i/(t+i*e)},onEdgeSwipe(e){1===e&&this.previewIndex0&&this.previewIndex--}}};const j=(0,c.A)(N,[["render",O],["__scopeId","data-v-5c1230be"]]);var q=j}}]); +//# sourceMappingURL=775.fdc2404c.js.map \ No newline at end of file diff --git a/js/775.fdc2404c.js.gz b/js/775.fdc2404c.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..5b381f793e6add12ec16a80f57c96ed2116c0922 GIT binary patch literal 7889 zcmV;?9xmY@iwFP!000023e9|LkK9If==b~zictonrdUI=yQjO^;tcGO3<*10Yo(EF zqtmfC?3(Vf*kmtRJu|Hy0(osV$a<3?uLXAV#%{96!%l*|SzlzG3*6sg$?~WCh2T^b zpUobP92*G6R+Gi5Q&p$VtLmIn>LMXZ!eZ((b)Y3AI2o#ExhjIMVTakxaGWu-om7(5l<*I46tHXEX{mf*7LuisD#fI-+>2F|-gBt z?5iW>Wlw_)q!Ng(QGlk%&){n&O7P-cUDFYNJh-iE>X@FYXypf9k~k`x8K;z-&7+v9 zC?+S4TD(T#{fLH)#N+5JblA`uU0i7J<7yaVqPu%O&glNcW;sQh@{oYmgRmhYec-POA~lqj?3&qxl*P-wS;bIBeJ!aN4g6=hkuH2h@M+ zuwh4l=!{&=L@~Z~UDwL6ZXE{)P*Z@)-b4*FROc}{B_UHsx}KsT#WcA)^Co0pYg|D( zo2Y2@lq?++73(-7W9q3WiG7FSB=*rb_9heWI3SLC;sps&QNor1aWoS}_$byjAM-X3 zp%kWb7vx*J)C`J!Y5(g;?7eRp9Z4~Od1LJ;7$0XV??o;?CM{ZpoZgXdZY=c!uAEh5-!;yk0gPIWo&eo~}E54Bu+$nyR8}ranTQc3V$@@uu!7 z^k&3Sk76%OPNH~rPmE?BNAtv4ozQ?dE4G{y=k4PUh|f?=zP+F^89Ud^l#f|_eaK=O zPO4w!GRhinMo~b#5M|;()Zhr)RKrSBH1?R6ON`ZAP+{VPZ(HvST844*vkPgdSVOUhobbvuW{qhtSECIVMV&7qf>FAb)vKK;`d8=lRnz zdpaO6B8TIf7u=#r4(*L_5)j7}#7M)5bIsz<58jV2^v zii1KoXsFbW10XZX1J*V%obw1c+1uzl}qz*8q@HprmuuxC+& zZo}+N33$aa^f^!XW8g8;8f({Ayb(K3=jTYt-j@8$)D_;Bc6~)sT@jsSEowMS$7G^E zK^!#Y1jqK(Fbaw4sCn0liS16J5D#QoUix-SCp2_apOc{?e$+Hg(V55mX%htyT@2zn znNg;ZeKm;ur>dhaLjItqfIl{k#)-3%@{VL!WG=zXizkE)IE*q&xvcVv$`u5Y6*a_r ziei!wrpWnvN>;>t2)a%j}ail{}Qa3Ir8+ z0iivcXI74+IYGSMxyDdV#}skx5HF68N&Kc4jzt?6cRG1Ha)aHVI~v=jH$Yxb2zy+T z1U0U@9+Q&Trd$aACeYvATfU?MFvn7(7{Xj&=t3<{-#@}vSWsVPi~ z!K7%KB5ytqmK-bZP&R$Q7qGVAWRLALDc(v8Y=Hd<3+#}a2HQ87QLkb!gXDEmdC zbQVd&sd#Id);Cvh~>ssw%N1q+gBI!Hk>G)I8*p*2E@OYynE@Hv>zcxf=aM3I>P zbUBZhmY`Tip(yc~7us5k68(l|^~@b9MRnx4t8+(V_@>sO z7}Q&YJg(V7Bm|D*r6~%dc;*H48R1$FWJZQDS0lgD+BLUZyQU5gi0oNCbDtQkT@z4I zHJgdPq9+=`{vwV^$d0(U!3klq(t$SzO}LLWlHum=Sh9Ipn+hsiW2~B#0QpmbgI4Db zkrenYTISF1r8=@*w?RwDg%gM&5-}`83{6Fo`f3jO$* z-H89I4_q%%6yH7ximEQ%)JrP#(@^CrAPs`$=H`|#YBjl?71Y8cwa|=Ok`2^?Vwde` zRa&{YV0y;pU@^sp1xzlqZj}|OQKKs0_Pk-JqrmNKAjp8>Foj@Pg(;+hYChD6y zS81~6hTbxwEOjIR)cU*;3u?>kbNMDsbiL6`(bu?lYimtV)lJl*GKlqhZ5)sj)=8YTS zG~?S$s7MT##Li|uB#+lWE;B198!ZDKEsv2RVP{0b&IrNI@W9Rp z(p)o@Y_&l^m@;)u zB3TD|L6Swq(gurVpLI@>RVt|BtRj#Rb6Y0oH0qjzTmuq)&t+R%8gq{9(ZM z%c{$6S|8ofUbTeWUdm5p%bRf_KKEY@!6^>|mc)0dX4!2kL*p1uhJE~ou1(Q!sKz85 zlUPN;2o2Tu-%tE#PVSCXq{4ZhacWp(*SE~hi8>ky7s0|EOGtA!JHDSUjsxl&$8mI) z5H&@!{L7Sh06s;NT9EZsikbi))RKt%JArzmx)f4O>@?alsz}c@yL*DVRTRkf#aU8{!8i%5W zoz<9lK|tbVsgCe!$nt|y)4R0+oJ7Hx#EFp*?om-w^j0x)`E3%@v6`ZLm6_kKRWsl~ zSxwQyy!^~#BtG$iK#rz(Ptj2Y*1OWPgH$hIDpJMilR84T^ADnkjAw*-Kr8A9J*Z)U zBYGZqKAG|nsVTaZ4<XK1M=_mD0L`Uk zG?*+*(c=xPJd0vL(Vf}?hf((Bo!XTAn2aei0vbM5(Uf;TWo(`}J3AA~ri)|jN3$L8 zoF0421!ab3SxXg(gE~ij|2XiVVN3$(B$^XJ1CMf-+WYy_dj)rS6JpSCOnr|d% zwzs9XEkqs)GJ!R97lT*%-R5Y>OAepvTE?SjRxae#CgqZ3?u9BkMcmPG`o69OIH8Pu z)0+_;S^7wJQnWr>gLkqHZ=IzL%E%1deh1R0weAQC@FY5l9z+q_+A5xNXHaQ`aTKvz zG|mQz3Xjk=vxJodzx55_so_QQyU=#-vFUv;W(m>=qPn}+=uYBIIg!v54cXA@N&jSz z``}(R*@Vp16sbEZGAzA}!YiVOWZ1axv8hJOvnM+0qoqDVyKP<9k!AOEeblf{PuExF zpn&3G7BMe40C}lztIB7e{KJbs`|fA|@$V{M^pTD{EZJ#m3zVUUf$tL>kZ{7L8+>rQ z<8w5`7_*_(mniFx+&amuY8;!)X(*V6FBfdJixzWLl&a5v@2_8e`srt%{4>UwV-^Og zJ09ku`?4_|mywadDDt243+bTMtLExzJ81x_tKnhpr#A8zxt;UXe&oY(vowjdS*iuZxR&d|2 z75mh(eN(Zph5L#Pe^YDM=T#KjfHK2=-1ALnWk3t~n;N|UexIo+kZ-emxL+1_6T$>a zK-^_$;j$U^(7lQbSRcOgSOqT)6Pt;T?t08hPe91z}wR|EM| zFRO)FnCM+ycY-X;V)Lx3kro^0HRCRFRYgG*&3S-DOkjeJnj4p>Zf<6C~Ba-;i`O$oN2;m1A6%5scMRRqeBSslS3qAkw_n-gnzkl(^|M}wge*%~g zSj}kI{_3&X!hHnUoAr&|snI^QaDUqNMI-2ucdy9q z6C-=e1~fI=kFD;s?TgVU9YYMl=p=?17yOl%6!p*>|RH)dZ+f(Y6F(*Sa_2Y_z2nj?Wm*{ z^C#4?>@^N}hK40ew`%2HZa_WGa3Lj(-M+G&Ya}zVKX0&hg#~b_!F$bvQ{a11OhByj zV4SzEJnTD2Ri6L+-vsFA-}&hmzx7k4!Q4b&wi8c9?;urq@s~gN;yeHP@@IeZ`G+4h z!56C`{spUhE)?`*n$Y8b?7vF=w=&Hy+ZnTH>;>ihrPY=8c();HGQfTiCE58QOtAc( zM@~Y-t_+*p%wpLHIE3;DE{WQ_YX5=>^_=Y_NW1g3u-z_hTZdK`clt_4v24XM;Sox? z9OMt8%(9_IH~(z$BCExpd9fw_6VIaDuIM7PfmL#JMj<01Q^q8D3hu2a43=f=?g~`w zma(h5d#kjHw;+pikhldJ27G6>ThsS1WzIDLlG3y`Gj3h31(*g{&XkW!hRv=;*%pzf zkGQe6X>!7Zd!5O>!m7J$dK&_2Ytxn;Tw&V9B;Rk^2Va$PX3;SmRn`f|lDf-ky@GT$ zbi;i<^}u$~*W*%n`%$#;r`)Xteaa22RXOg8!iNBhdpu#;%I`%SI0qzS+pX-7!D@gb zV%saPH7F#65Nt~tTbA7bvO zFq)!jbzGJ5(gUFNu`OD5>9!S$;$;BRrYCo8^vi`>bx%B?0A_E6+V)&3pk0wM?BopVMBSM z*=w$A@g3%PLO8x1z%E={(3sT^cC36!M1ZsPSAYH_%$UGJ1YgG70X6 zV{*RH+^8ML)kFdOZqy)_G~BFqqlSjI9P>bT`O9YAEESTy`!(q14k*wrSI=!_H!yY; z@n_*SY(${k#JyHs$F5s-Rjl4@FzgKLDwwwFm=4MLW?gMbyTxj@g`jPY>HK9grX`iz z-LC=Drm}n31EZzOZI%|cx{757MjLl}N*j0jhnA^Wy#Th`m!o>K#VDNDuqoS&F-c9< zZX?D7gdAt3*EOtVJGd7=_}fVaZ&`>y{{gTU2IuO4|iIJ9o$vm?Vyc& zN)Ovzr45_fKHjyIHa5G8Wle2t+CH}02JUrnyARuJTd}Zd8#ZotpWWNVCYX_TpuW$S z1h@K7$Hv{3V&Pp|Y2jW!$oRqb4cxH}-0c8F!@?baX<7o@3?7vZZt-)JT{uI*9oU<< z+X_D|z`NFCtBdwG)cRGsI zQY`Z^4BWSIuZ`P11r8Vb{7eD&E!fdpyGjSQTZSk(H|>UQabc})fg&tHS6PN~+mthSD**0U@Ne(iRz z55L_`uLr+Y*R(`T!M7mAu+?qp=o>E8dTrCv(KoYr$VVV|E-uvP-}$HKzxegffAq=o-}z8YQOS3^mfOU? z;A9>^fYpww!)Xiz=*rYJ9nYh=re9pBFaG-fe*UA6o`3qMYKn4)uEs;bM0jn90xmAD zmBGv4*WqYTi3BP&z%k+B4O+PwQdK?wu=8uby0g6lMOmyExn$HSlCHAae8o|dtjrIm zX(Bv5x=gVW-ondUU8^*c9-HQLhn3)N5lmE~&lJJ-XE@RaCsC})z)dAO5gisI$$(Oq z$>y95_V>*Jy;%pkPlj|Pl9`$AKt4tGl4dwd(fXdUHrt}}p$PpevEL}=+_<@M&47F* zK*JhwK28xBAyuN9wF>rodhTn{vhYCn#7mG$i>}$HJ`61 z=k17Wzf#(sdOeO7jNrK!doxHFj8$hP9At48qDMo@-io8y1E{I-NXQvbHW_cIA;UWf zTg>nB096s}^|sUzSp^Z3cu=s4rlT{yBG?;`Z$lXMAx#)W5ou~nAjnnS&{9v)F*%81 z@+h1MNMc}_T9U!R*()SQ`cW8)L><{@OyF?gb-T?|7^~Y~R%9jZTM)0i|K$2gY->|P zQf`?C(kIgQ={zB`Ia@-V^hp-CS;0|GPjcM+B%Nor@rYA4U@p12YnuDELvHp>bHC-Z z5z8WeOOh!IO)eE>X+RY${LMU-mt39tc0%$cMq-zRE#dB0{SC%}KPe zBG6x+f&qlW;25NgpQ|ZEHj54qi)hVk zjMqU&96`u4KU^*4$d*DoYXYh+ujGT)+*pSJc*!#Km6{~3XXe&q{lx|B3Z!X76T#y| z-zWHkh=$yVbBM^*s^m)X4TGz`{P^cDKK$_?|$RO|M`QLfB(Cm|M0hkJ^Ek2 z`0%s;{ND4w`%OpL5rNY?fftSw--A4XBC9IfZ@@v@ps=bo8zEMtid3&FPK^PTvV=!uH2BcCW8U=tpDn=)v8CY%{6VF{GzkJVM;fG?Cn|rB6Us z!8Q|@HkFy4C>6QuwTet9O@18HnCD|tl8769X5Jk5Q4?EVf--v@F6q#9MDvz>?F z_@JVph4PRYg0n|d5;cyHKq+MBm6cMn`q3+t1BXKhV@xFp75nFG{zZwrzoP6muhLz! zeSEV9IQ79UlL=34vjyoFkb5(a!i4NYdJtPABJHPSrqfbO{FF*Q!U;N-B)v46wWiS8sA76a$k3Rp8zfkLJV5N}# zQ;|K=Z~x*DyLq#t83gD08Z;+8mArCA_;rq?&sE-9$IA&*}#4MMJ>Jh8z^ zKz*W_h-|}IqFV;Bt+6cFT-{N(SxGg&a^O_-Uk#isb|zOiVIrb==9kObKDoYLEG zeZbirJg(e&qare}Mhz7_4?^#hP9P%&GK1&Gkr$8m@mUP#iR7GVOvh|W!jeguOrx`- z$V-@}LRb@zE>!hY$AY1F#Y}dMBY!a?A;W%5JVtH@1l}~2hVune!3N-WfVd3hHIJk5 z5>j?aI6j!t0PgBR1SkB;6-_Vdk#pi7M6(&(M54l6RlNp8?6Y$qmkvHf#g`Jka)7ma zUwGK1!Js;@#?}^-y=jGUxoPg;F92c3eN(_Gu3CbIC}!lG9f*($mt2Avs>8nJh|Wl~ zU>xrfD4Z(5$%dxFq*NVQ=33QNxvm_0R(%a>HaFBVA-U4(@SkcRV*}D^6ZZgB7_z+@ z=n%0yFw(8a3(h-;VP7P3rl=ZSF0NL|4`k&%4HbGX9~RJX%+(HrVlvLB-03B>+X^%8*Sn5nLu4VZ^;N^UanlkQM&k%{adNy7*v7-+rarc} zH}z3=_v#I&!P{=Xi5B+U79_#fIj_1^UcXcdSK`)?f~x^t`he_fMB=qLot1LGd7%i7 zPEHac@1R0WtyP)xTx*(2p09*TmF@tjtbWFR*~jWxah*8{W;{lUAFCDhg%8eU`OP%7 zPw(ZQ-m8B)a_1z5vuL;q6o+u)UaInLejh;Lz{^Sd>)|g{4h{S2v4&`YCZmo)xX`0| z+eZn9#l1KsWbpCjmk3b(X0J4~a(QvrPEx%Zr-E5CZMdZbj!t8j4vM=aN*uVg74Mn* z^4^isO=EFwjl`W}>vGz4H}iXZ69h}_u3ux;2)#-;alVoe{`Nmw$410UL%BGv$_Q2; zR41k_Av$8>FV``Y!_BJxEQZLhL_32o(Sy!iLzUEborFcM)K`=1V zFql_3R;%+9*lYp=`nzGGX_{TJ_(6Vi#y871XS}`P=8TSS*)8*! $options.onPointerDown && $options.onPointerDown(...args)),\n onPointermove: _cache[2] || (_cache[2] = (...args) => $options.onPointerMove && $options.onPointerMove(...args)),\n onPointerup: _cache[3] || (_cache[3] = (...args) => $options.onPointerUp && $options.onPointerUp(...args)),\n onPointercancel: _cache[4] || (_cache[4] = (...args) => $options.onPointerUp && $options.onPointerUp(...args)),\n onDblclick: _cache[5] || (_cache[5] = _withModifiers((...args) => $options.onDblClick && $options.onDblClick(...args), [\"prevent\"]))\n }, [$props.isImage ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n class: \"tm-media\",\n src: $props.src,\n draggable: \"false\",\n style: _normalizeStyle($options.mediaStyle),\n onLoad: _cache[0] || (_cache[0] = (...args) => $options.onLoad && $options.onLoad(...args))\n }, null, 44, _hoisted_1)) : $props.isVideo ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n class: \"tm-media\",\n src: $props.src,\n controls: \"\",\n autoplay: \"\",\n playsinline: \"\",\n style: _normalizeStyle($options.mediaStyle)\n }, null, 12, _hoisted_2)) : _createCommentVNode(\"\", true)], 544);\n}","export default {\n name: \"TransformMedia\",\n props: {\n file: {\n type: Object,\n required: true\n },\n src: {\n type: String,\n required: true\n },\n isImage: {\n type: Boolean,\n default: true\n },\n isVideo: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n pointers: new Map(),\n // transform state\n scale: 1,\n rotation: 0,\n // 落地的旋转角度:0, 90, 180, 270\n rotatePreview: 0,\n // 旋转预览角度(-90~+90,跟手)\n tx: 0,\n ty: 0,\n // 图片原始尺寸\n naturalWidth: 0,\n naturalHeight: 0,\n // gesture start snapshots\n startScale: 1,\n startRotation: 0,\n startTx: 0,\n startTy: 0,\n startCenter: null,\n startDist: 0,\n startAngle: 0,\n // drag\n dragging: false,\n dragStart: null,\n viewportRect: null,\n // bounds\n minScale: 1,\n maxScale: 4,\n // 手势模式锁定:'pinch' | 'rotate' | null\n gestureMode: null,\n // 边界翻页相关\n edgeOverflow: 0,\n // 超出边界的累计距离\n edgeDir: 0 // 超出方向:-1左 +1右\n };\n },\n computed: {\n isActiveTransform() {\n return this.scale > 1.001 || this.pointers.size >= 2 || this.dragging;\n },\n // 实际显示的旋转角度 = 落地角度 + 预览角度\n displayRotation() {\n return this.rotation + this.rotatePreview;\n },\n // 旋转时缩小系数(中间最小,两端恢复)\n rotateShrink() {\n const p = Math.min(1, Math.abs(this.rotatePreview) / 90);\n const k = Math.sin(Math.PI * p);\n return 1 - 0.12 * k; // 最多缩小12%\n },\n mediaStyle() {\n const finalScale = this.scale * this.rotateShrink;\n const inGesture = this.pointers.size > 0;\n return {\n transform: `translate3d(${this.tx}px, ${this.ty}px, 0) scale(${finalScale}) rotate(${this.displayRotation}deg)`,\n transition: inGesture ? \"none\" : \"transform 0.25s ease\",\n transformOrigin: \"center center\"\n };\n }\n },\n watch: {\n isActiveTransform(v) {\n this.$emit(v ? \"lock\" : \"unlock\");\n }\n },\n methods: {\n onLoad(e) {\n // 记录图片原始尺寸\n const img = e.target;\n this.naturalWidth = img.naturalWidth;\n this.naturalHeight = img.naturalHeight;\n },\n reset() {\n this.scale = 1;\n this.rotation = 0;\n this.rotatePreview = 0;\n this.tx = 0;\n this.ty = 0;\n this.pointers.clear();\n this.dragging = false;\n this.edgeOverflow = 0;\n this.edgeDir = 0;\n this.$emit(\"unlock\");\n },\n clamp(v, min, max) {\n return Math.max(min, Math.min(max, v));\n },\n // iOS 风格橡皮筋阻尼函数\n rubberBand(distance, dimension, constant = 0.55) {\n return distance * dimension * constant / (dimension + constant * distance);\n },\n getViewportRect() {\n return this.$refs.viewport?.getBoundingClientRect();\n },\n // 计算放大后允许的最大平移范围\n getPanBounds() {\n const rect = this.$refs.viewport?.getBoundingClientRect();\n if (!rect) return {\n maxX: 0,\n maxY: 0,\n vw: 0,\n vh: 0\n };\n const vw = rect.width,\n vh = rect.height;\n const img = this.$el.querySelector('img, video');\n const iw = img?.clientWidth || vw;\n const ih = img?.clientHeight || vh;\n const sw = iw * this.scale;\n const sh = ih * this.scale;\n const maxX = Math.max(0, (sw - vw) / 2);\n const maxY = Math.max(0, (sh - vh) / 2);\n return {\n maxX,\n maxY,\n vw,\n vh\n };\n },\n // 应用边界阻尼\n applyBoundWithRubber(value, max, dimension) {\n if (value > max) {\n return max + this.rubberBand(value - max, dimension, 0.55);\n }\n if (value < -max) {\n return -max - this.rubberBand(-max - value, dimension, 0.55);\n }\n return value;\n },\n calcTwoPointer() {\n const pts = Array.from(this.pointers.values());\n const p0 = pts[0],\n p1 = pts[1];\n const dx = p1.x - p0.x;\n const dy = p1.y - p0.y;\n const dist = Math.hypot(dx, dy);\n const angle = Math.atan2(dy, dx) * (180 / Math.PI);\n const center = {\n x: (p0.x + p1.x) / 2,\n y: (p0.y + p1.y) / 2\n };\n return {\n dist,\n angle,\n center\n };\n },\n // 角度归一化到 -180~180\n normalizeAngle(deg) {\n deg = (deg % 360 + 360) % 360;\n return deg > 180 ? deg - 360 : deg;\n },\n onPointerDown(e) {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n this.viewportRect = this.getViewportRect();\n this.pointers.set(e.pointerId, {\n x: e.clientX,\n y: e.clientY\n });\n\n // 2指开始:初始化 pinch/rotate 基准\n if (this.pointers.size === 2) {\n const {\n dist,\n angle,\n center\n } = this.calcTwoPointer();\n this.startDist = dist;\n this.startAngle = angle;\n this.startCenter = center;\n this.startScale = this.scale;\n this.startRotation = this.rotation;\n this.startTx = this.tx;\n this.startTy = this.ty;\n this.dragging = false;\n this.gestureMode = null;\n this.rotatePreview = 0;\n return;\n }\n\n // 1指:如果已放大,则进入拖拽\n if (this.scale > 1.001) {\n this.dragging = true;\n this.dragStart = {\n x: e.clientX,\n y: e.clientY\n };\n this.startTx = this.tx;\n this.startTy = this.ty;\n }\n },\n onPointerMove(e) {\n if (!this.pointers.has(e.pointerId)) return;\n this.pointers.set(e.pointerId, {\n x: e.clientX,\n y: e.clientY\n });\n\n // 2指:缩放 + 旋转(带死区锁定)\n if (this.pointers.size === 2) {\n e.preventDefault();\n const {\n dist,\n angle,\n center\n } = this.calcTwoPointer();\n const scaleFactor = dist / (this.startDist || dist);\n const scaleChange = Math.abs(scaleFactor - 1);\n const deltaAngle = this.normalizeAngle(angle - this.startAngle);\n const angleChange = Math.abs(deltaAngle);\n\n // 阈值\n const rotateStartDeg = 8; // 8° 开始进入旋转模式\n const pinchStartScale = 0.08; // 8% 缩放变化开始进入缩放模式\n\n // 判断手势模式(只在第一次超过死区时锁定)\n // 优先判断旋转:角度变化超过8°就进入旋转模式(不管缩放)\n if (!this.gestureMode) {\n if (angleChange >= rotateStartDeg) {\n this.gestureMode = 'rotate';\n } else if (scaleChange >= pinchStartScale) {\n this.gestureMode = 'pinch';\n } else {\n return; // 还在死区内\n }\n }\n\n // 旋转模式:预览角跟手,限制在 -90~+90\n if (this.gestureMode === 'rotate') {\n this.scale = this.startScale; // 锁定缩放\n this.rotatePreview = this.clamp(deltaAngle, -90, 90);\n return;\n }\n\n // 缩放模式\n if (this.gestureMode === 'pinch') {\n this.scale = this.clamp(this.startScale * scaleFactor, this.minScale, this.maxScale);\n this.rotatePreview = 0;\n }\n\n // 跟随双指中心移动\n if (this.startCenter && this.viewportRect) {\n const cx0 = this.startCenter.x - this.viewportRect.left - this.viewportRect.width / 2;\n const cy0 = this.startCenter.y - this.viewportRect.top - this.viewportRect.height / 2;\n const cx1 = center.x - this.viewportRect.left - this.viewportRect.width / 2;\n const cy1 = center.y - this.viewportRect.top - this.viewportRect.height / 2;\n this.tx = this.startTx + (cx1 - cx0);\n this.ty = this.startTy + (cy1 - cy0);\n }\n return;\n }\n\n // 1指:拖拽(只在 scale>1 时)+ 边界阻尼 + 边界翻页检测\n if (this.dragging && this.scale > 1.001) {\n e.preventDefault();\n const dx = e.clientX - this.dragStart.x;\n const dy = e.clientY - this.dragStart.y;\n const rawX = this.startTx + dx;\n const rawY = this.startTy + dy;\n const {\n maxX,\n maxY,\n vw,\n vh\n } = this.getPanBounds();\n\n // 检测是否超出左右边界\n let overflow = 0;\n let dir = 0;\n if (rawX > maxX) {\n overflow = rawX - maxX;\n dir = -1; // 往右拖 = 上一页\n } else if (rawX < -maxX) {\n overflow = -maxX - rawX;\n dir = +1; // 往左拖 = 下一页\n }\n\n // 记录超出状态\n this.edgeOverflow = overflow;\n this.edgeDir = dir;\n this.tx = this.applyBoundWithRubber(rawX, maxX, vw);\n this.ty = this.applyBoundWithRubber(rawY, maxY, vh);\n }\n },\n onPointerUp(e) {\n if (this.pointers.has(e.pointerId)) this.pointers.delete(e.pointerId);\n\n // 两指结束:处理旋转吸附\n if (this.pointers.size < 2 && this.gestureMode === 'rotate') {\n this.finishRotate();\n this.gestureMode = null;\n }\n if (this.pointers.size < 2) {\n this.startCenter = null;\n this.startDist = 0;\n this.startAngle = 0;\n this.gestureMode = null;\n }\n if (this.pointers.size === 0) {\n this.dragging = false;\n\n // 检查是否触发边界翻页(超出60px触发)\n if (this.edgeOverflow > 60 && this.edgeDir !== 0) {\n const dir = this.edgeDir;\n // 翻页前先重置自身状态,解除 gestureLocked\n this.reset();\n this.$emit('edge-swipe', dir);\n return;\n }\n this.edgeOverflow = 0;\n this.edgeDir = 0;\n\n // 缩放回到1附近,自动归位\n if (this.scale <= 1.001) {\n this.scale = 1;\n this.tx = 0;\n this.ty = 0;\n } else {\n // 放大状态:回弹到合法范围\n const {\n maxX,\n maxY\n } = this.getPanBounds();\n this.tx = Math.max(-maxX, Math.min(maxX, this.tx));\n this.ty = Math.max(-maxY, Math.min(maxY, this.ty));\n }\n }\n },\n // 松手后吸附到 0° 或 ±90°\n finishRotate() {\n const d = this.rotatePreview;\n const commitDeg = 30; // 超过30°就翻到90°\n\n let target = 0;\n if (Math.abs(d) >= commitDeg) {\n target = d > 0 ? 90 : -90;\n }\n\n // 计算新的落地角度\n const newRot = ((this.rotation + target) % 360 + 360) % 360;\n\n // 落地并重置预览角(transition 会自动处理动画)\n this.rotation = newRot;\n this.rotatePreview = 0;\n\n // 计算旋转后的铺满缩放\n this.updateFillScale();\n },\n // 旋转后铺满屏幕:90°/270°时放大到2倍(类似双击效果)\n updateFillScale() {\n const rot = this.rotation % 360;\n const isRotated = rot === 90 || rot === 270;\n if (isRotated) {\n // 90°/270° 时放大到2倍铺满\n this.scale = 2;\n this.tx = 0;\n this.ty = 0;\n } else {\n // 0° 或 180° 恢复正常\n this.scale = 1;\n this.tx = 0;\n this.ty = 0;\n }\n },\n onDblClick() {\n if (this.scale > 1.001) {\n this.scale = 1;\n this.tx = 0;\n this.ty = 0;\n } else {\n this.scale = 2;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./TransformMedia.vue?vue&type=template&id=1e6c105f&scoped=true\"\nimport script from \"./TransformMedia.vue?vue&type=script&lang=js\"\nexport * from \"./TransformMedia.vue?vue&type=script&lang=js\"\n\nimport \"./TransformMedia.vue?vue&type=style&index=0&id=1e6c105f&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1e6c105f\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, resolveComponent as _resolveComponent, createBlock as _createBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"public-browse\"\n};\nconst _hoisted_2 = {\n class: \"header\"\n};\nconst _hoisted_3 = {\n class: \"header-left\"\n};\nconst _hoisted_4 = {\n class: \"logo\"\n};\nconst _hoisted_5 = {\n class: \"header-center\"\n};\nconst _hoisted_6 = {\n class: \"breadcrumb\"\n};\nconst _hoisted_7 = [\"onClick\"];\nconst _hoisted_8 = {\n class: \"header-right\"\n};\nconst _hoisted_9 = {\n class: \"file-count\"\n};\nconst _hoisted_10 = {\n key: 0,\n class: \"loading-container\"\n};\nconst _hoisted_11 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_12 = {\n key: 2,\n class: \"gallery-container\",\n ref: \"galleryContainer\"\n};\nconst _hoisted_13 = {\n key: 0,\n class: \"folders-section\"\n};\nconst _hoisted_14 = {\n class: \"folders-grid\"\n};\nconst _hoisted_15 = [\"onClick\"];\nconst _hoisted_16 = {\n class: \"folder-name\"\n};\nconst _hoisted_17 = {\n class: \"waterfall\",\n ref: \"waterfall\"\n};\nconst _hoisted_18 = [\"onClick\"];\nconst _hoisted_19 = [\"src\", \"alt\", \"onLoad\"];\nconst _hoisted_20 = [\"src\", \"onLoadedmetadata\"];\nconst _hoisted_21 = {\n key: 2,\n class: \"file-placeholder\"\n};\nconst _hoisted_22 = {\n class: \"overlay\"\n};\nconst _hoisted_23 = {\n class: \"overlay-actions\"\n};\nconst _hoisted_24 = [\"onClick\"];\nconst _hoisted_25 = [\"onClick\"];\nconst _hoisted_26 = {\n ref: \"loadTrigger\",\n class: \"load-trigger\"\n};\nconst _hoisted_27 = {\n key: 0,\n class: \"loading-more\"\n};\nconst _hoisted_28 = {\n key: 1,\n class: \"no-more\"\n};\nconst _hoisted_29 = {\n key: 2,\n class: \"credit-link\",\n href: \"https://github.com/axibayuit-a11y\",\n target: \"_blank\",\n rel: \"noopener\"\n};\nconst _hoisted_30 = [\"src\"];\nconst _hoisted_31 = [\"src\"];\nconst _hoisted_32 = {\n class: \"page-indicator\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_TransformMedia = _resolveComponent(\"TransformMedia\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"header\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [_createElementVNode(\"span\", _hoisted_4, _toDisplayString($options.siteName), 1)]), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"span\", {\n class: \"breadcrumb-item\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.goToRoot && $options.goToRoot(...args))\n }, _toDisplayString($options.rootDirName), 1), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.pathParts, (part, index) => {\n return _openBlock(), _createElementBlock(_Fragment, {\n key: index\n }, [_cache[18] || (_cache[18] = _createElementVNode(\"span\", {\n class: \"breadcrumb-sep\"\n }, \"/\", -1)), _createElementVNode(\"span\", {\n class: \"breadcrumb-item\",\n onClick: $event => $options.goToPath(index)\n }, _toDisplayString(part), 9, _hoisted_7)], 64);\n }), 128))])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"span\", _hoisted_9, _toDisplayString($data.totalCount) + \" 个文件\", 1)])]), $data.loading && $data.files.length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_10, [...(_cache[19] || (_cache[19] = [_createElementVNode(\"div\", {\n class: \"loading-spinner\"\n }, null, -1), _createElementVNode(\"p\", null, \"加载中...\", -1)]))])) : $data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createElementVNode(\"p\", null, _toDisplayString($data.error), 1), $data.canRetry ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n onClick: _cache[1] || (_cache[1] = (...args) => $options.loadFiles && $options.loadFiles(...args)),\n class: \"retry-btn\"\n }, \"重试\")) : _createCommentVNode(\"\", true)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_12, [$options.folders.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.folders, folder => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: folder.name,\n class: \"folder-card\",\n onClick: $event => $options.enterFolder(folder.name)\n }, [_cache[20] || (_cache[20] = _createElementVNode(\"div\", {\n class: \"folder-icon\"\n }, [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z\"\n })])], -1)), _createElementVNode(\"span\", _hoisted_16, _toDisplayString($options.getFolderName(folder.name)), 1)], 8, _hoisted_15);\n }), 128))])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_17, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.columns, (column, colIndex) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: colIndex,\n class: \"waterfall-column\"\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(column, file => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: file.name,\n class: \"waterfall-item\",\n onClick: $event => $options.openPreview(file)\n }, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"image-wrapper\", {\n loaded: file.loaded\n }])\n }, [$options.isImage(file) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $options.getFileUrl(file.name),\n alt: file.name,\n loading: \"lazy\",\n onLoad: $event => $options.onImageLoad($event, file),\n onError: _cache[2] || (_cache[2] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_19)) : $options.isVideo(file) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: $options.getFileUrl(file.name),\n muted: \"\",\n loop: \"\",\n preload: \"metadata\",\n onLoadedmetadata: $event => $options.onVideoLoad($event, file),\n onMouseenter: _cache[3] || (_cache[3] = $event => $event.target.play()),\n onMouseleave: _cache[4] || (_cache[4] = $event => $event.target.pause())\n }, null, 40, _hoisted_20)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_21, [...(_cache[21] || (_cache[21] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M14 2H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V8l-6-6zm-1 7V3.5L18.5 9H13z\"\n })], -1)]))])), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"div\", _hoisted_23, [_createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _withModifiers($event => $options.copyLink(file.name), [\"stop\"]),\n title: \"复制链接\"\n }, [...(_cache[22] || (_cache[22] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"\n })], -1)]))], 8, _hoisted_24), _createElementVNode(\"button\", {\n class: \"action-btn\",\n onClick: _withModifiers($event => $options.downloadFile(file.name), [\"stop\"]),\n title: \"下载\"\n }, [...(_cache[23] || (_cache[23] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"\n })], -1)]))], 8, _hoisted_25)])])], 2)], 8, _hoisted_18);\n }), 128))]);\n }), 128))], 512), _createElementVNode(\"div\", _hoisted_26, [$data.loading && $data.files.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_27, [...(_cache[24] || (_cache[24] = [_createElementVNode(\"div\", {\n class: \"loading-spinner-small\"\n }, null, -1), _createElementVNode(\"span\", null, \"加载中...\", -1)]))])) : !$data.hasMore && $options.mediaFiles.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, \" 已加载全部 \")) : _createCommentVNode(\"\", true), !$data.hasMore && $options.mediaFiles.length > 0 ? (_openBlock(), _createElementBlock(\"a\", _hoisted_29, \" 林酱贡献 \")) : _createCommentVNode(\"\", true)], 512)], 512)), $data.previewVisible ? (_openBlock(), _createElementBlock(\"div\", {\n key: 3,\n class: \"preview-modal\",\n onClick: _cache[17] || (_cache[17] = _withModifiers((...args) => $options.closePreview && $options.closePreview(...args), [\"self\"]))\n }, [_createElementVNode(\"button\", {\n class: \"preview-close\",\n onClick: _cache[5] || (_cache[5] = _withModifiers((...args) => $options.closePreview && $options.closePreview(...args), [\"stop\"]))\n }, [...(_cache[25] || (_cache[25] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\n })], -1)]))]), _createElementVNode(\"div\", {\n class: \"preview-content desktop-only\",\n onClick: _cache[6] || (_cache[6] = _withModifiers(() => {}, [\"stop\"]))\n }, [$options.currentPreviewFile && $options.isImage($options.currentPreviewFile) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $options.getFileUrl($options.currentPreviewFile.name),\n class: \"preview-image\",\n style: _normalizeStyle($options.desktopImageStyle),\n draggable: \"false\"\n }, null, 12, _hoisted_30)) : $options.currentPreviewFile && $options.isVideo($options.currentPreviewFile) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: $options.getFileUrl($options.currentPreviewFile.name),\n controls: \"\",\n autoplay: \"\",\n class: \"preview-video\",\n style: _normalizeStyle($options.desktopImageStyle)\n }, null, 12, _hoisted_31)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", {\n class: \"preview-content mobile-only\",\n onClick: _cache[13] || (_cache[13] = _withModifiers(() => {}, [\"stop\"]))\n }, [_createElementVNode(\"div\", {\n class: \"swipe-viewport\",\n ref: \"mobileViewport\",\n onTouchstart: _cache[10] || (_cache[10] = (...args) => $options.onSwipeStart && $options.onSwipeStart(...args)),\n onTouchmove: _cache[11] || (_cache[11] = (...args) => $options.onSwipeMove && $options.onSwipeMove(...args)),\n onTouchend: _cache[12] || (_cache[12] = (...args) => $options.onSwipeEnd && $options.onSwipeEnd(...args))\n }, [_createElementVNode(\"div\", {\n class: \"swipe-track\",\n style: _normalizeStyle($options.swipeTrackStyle),\n onTransitionend: _cache[9] || (_cache[9] = (...args) => $options.onSwipeTransitionEnd && $options.onSwipeTransitionEnd(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.swipeWindow, (f, i) => {\n return _openBlock(), _createElementBlock(\"div\", {\n class: \"swipe-slide\",\n key: $options.getSlideKey(f, i)\n }, [f ? (_openBlock(), _createBlock(_component_TransformMedia, {\n key: 0,\n file: f,\n src: $options.getFileUrl(f.name),\n \"is-image\": $options.isImage(f),\n \"is-video\": $options.isVideo(f),\n onLock: _cache[7] || (_cache[7] = $event => $data.gestureLocked = true),\n onUnlock: _cache[8] || (_cache[8] = $event => $data.gestureLocked = false),\n onEdgeSwipe: $options.onEdgeSwipe\n }, null, 8, [\"file\", \"src\", \"is-image\", \"is-video\", \"onEdgeSwipe\"])) : _createCommentVNode(\"\", true)]);\n }), 128))], 36)], 544)]), $data.previewIndex > 0 ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n class: \"preview-prev desktop-only\",\n onClick: _cache[14] || (_cache[14] = _withModifiers((...args) => $options.prevImage && $options.prevImage(...args), [\"stop\"]))\n }, [...(_cache[26] || (_cache[26] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"\n })], -1)]))])) : _createCommentVNode(\"\", true), $data.previewIndex < $options.mediaFiles.length - 1 ? (_openBlock(), _createElementBlock(\"button\", {\n key: 1,\n class: \"preview-next desktop-only\",\n onClick: _cache[15] || (_cache[15] = _withModifiers((...args) => $options.nextImage && $options.nextImage(...args), [\"stop\"]))\n }, [...(_cache[27] || (_cache[27] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"\n })], -1)]))])) : _createCommentVNode(\"\", true), _createElementVNode(\"button\", {\n class: \"rotate-btn desktop-only\",\n onClick: _cache[16] || (_cache[16] = _withModifiers((...args) => $options.rotateImage && $options.rotateImage(...args), [\"stop\"])),\n title: \"旋转90°\"\n }, [...(_cache[28] || (_cache[28] = [_createElementVNode(\"svg\", {\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\"\n }, [_createElementVNode(\"path\", {\n d: \"M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z\"\n })], -1)]))]), _createElementVNode(\"div\", _hoisted_32, _toDisplayString($data.previewIndex + 1) + \" / \" + _toDisplayString($options.mediaFiles.length), 1)])) : _createCommentVNode(\"\", true)]);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport axios from 'axios';\nimport { mapGetters } from 'vuex';\nimport TransformMedia from '@/components/TransformMedia.vue';\nexport default {\n name: 'PublicBrowse',\n components: {\n TransformMedia\n },\n data() {\n return {\n files: [],\n allowedDirs: [],\n rootDir: '',\n currentPath: '',\n totalCount: 0,\n loading: false,\n error: null,\n canRetry: true,\n hasMore: true,\n previewVisible: false,\n previewIndex: 0,\n observer: null,\n pageSize: 24,\n columnCount: 4,\n columnHeights: [0, 0, 0, 0],\n // 桌面端旋转\n imageRotation: 0,\n // 手机端滑动\n swipeX: 0,\n swipeStartX: 0,\n swipeStartY: 0,\n swipeStartT: 0,\n swipeActive: false,\n swipeAnimating: false,\n swipeDir: 0,\n viewportW: 0,\n // 手势锁定(子组件缩放/旋转时锁住轮播)\n gestureLocked: false\n };\n },\n computed: {\n ...mapGetters(['userConfig']),\n siteName() {\n return this.userConfig?.siteTitle || '公开相册';\n },\n rootDirName() {\n return this.rootDir.split('/').filter(Boolean).pop() || '根目录';\n },\n pathParts() {\n if (!this.currentPath || !this.rootDir) return [];\n const relative = this.currentPath.replace(this.rootDir, '').replace(/^\\/+/, '');\n return relative.split('/').filter(Boolean);\n },\n folders() {\n return this.files.filter(f => f.isFolder);\n },\n mediaFiles() {\n return this.files.filter(f => !f.isFolder);\n },\n columns() {\n const cols = Array.from({\n length: this.columnCount\n }, () => []);\n for (const file of this.mediaFiles) {\n const idx = file.columnIndex ?? 0;\n if (idx < this.columnCount) {\n cols[idx].push(file);\n } else {\n cols[0].push(file);\n }\n }\n return cols;\n },\n currentPreviewFile() {\n return this.mediaFiles[this.previewIndex];\n },\n prevPreviewFile() {\n return this.previewIndex > 0 ? this.mediaFiles[this.previewIndex - 1] : null;\n },\n nextPreviewFile() {\n return this.previewIndex < this.mediaFiles.length - 1 ? this.mediaFiles[this.previewIndex + 1] : null;\n },\n desktopImageStyle() {\n return {\n transform: `rotate(${this.imageRotation}deg)`,\n transition: 'transform 0.3s ease'\n };\n },\n swipeWindow() {\n return [this.prevPreviewFile, this.currentPreviewFile, this.nextPreviewFile];\n },\n swipeTrackStyle() {\n // 默认停在中间那页(-viewportW)\n const base = -this.viewportW;\n const x = base + this.swipeX;\n return {\n transform: `translate3d(${x}px, 0, 0)`,\n transition: this.swipeAnimating ? 'transform 0.28s ease' : 'none'\n };\n }\n },\n watch: {\n '$route.params.dir': {\n handler() {\n this.initFromRoute();\n }\n }\n },\n mounted() {\n this.initFromRoute();\n this.setupIntersectionObserver();\n this.updateColumnCount();\n window.addEventListener('resize', this.updateColumnCount);\n },\n beforeUnmount() {\n if (this.observer) {\n this.observer.disconnect();\n }\n window.removeEventListener('resize', this.updateColumnCount);\n },\n methods: {\n // 生成 slide key,切换时让子组件重新挂载以重置 transform\n getSlideKey(f, i) {\n if (!f) return `empty-${i}`;\n // 中间那张用 previewIndex 作为 key 的一部分,确保切换时重新挂载\n if (i === 1) return `${f.name}-${this.previewIndex}`;\n return f.name;\n },\n updateColumnCount() {\n const width = window.innerWidth;\n let newCount;\n if (width < 600) {\n newCount = 2;\n } else if (width < 900) {\n newCount = 3;\n } else {\n newCount = 4;\n }\n if (newCount !== this.columnCount) {\n this.columnCount = newCount;\n this.columnHeights = new Array(this.columnCount).fill(0);\n this.mediaFiles.forEach(f => {\n f.columnIndex = undefined;\n this.assignToColumn(f);\n });\n }\n },\n getShortestColumn() {\n let minIndex = 0;\n let minHeight = this.columnHeights[0];\n for (let i = 1; i < this.columnCount; i++) {\n if (this.columnHeights[i] < minHeight) {\n minHeight = this.columnHeights[i];\n minIndex = i;\n }\n }\n return minIndex;\n },\n assignToColumn(file, height = 200) {\n const colIndex = this.getShortestColumn();\n file.columnIndex = colIndex;\n this.columnHeights[colIndex] += height;\n },\n onImageLoad(event, file) {\n const img = event.target;\n const ratio = img.naturalHeight / img.naturalWidth;\n const height = 280 * ratio;\n if (file.columnIndex === undefined) {\n this.assignToColumn(file, height);\n }\n file.loaded = true;\n },\n onVideoLoad(event, file) {\n const video = event.target;\n const ratio = video.videoHeight / video.videoWidth;\n const height = 280 * ratio;\n if (file.columnIndex === undefined) {\n this.assignToColumn(file, height);\n }\n file.loaded = true;\n },\n setupIntersectionObserver() {\n this.observer = new IntersectionObserver(entries => {\n const entry = entries[0];\n if (entry.isIntersecting && this.hasMore && !this.loading) {\n this.loadMore();\n }\n }, {\n rootMargin: '200px'\n });\n },\n observeLoadTrigger() {\n this.$nextTick(() => {\n if (this.$refs.loadTrigger && this.observer) {\n this.observer.observe(this.$refs.loadTrigger);\n }\n });\n },\n async initFromRoute() {\n const dirParam = this.$route.params.dir || '';\n const dirPath = Array.isArray(dirParam) ? dirParam.join('/') : dirParam;\n if (!dirPath) {\n this.error = '请指定要浏览的目录,例如: /browse/landscape';\n this.canRetry = false;\n return;\n }\n const parts = dirPath.split('/').filter(Boolean);\n this.rootDir = parts[0];\n this.currentPath = dirPath;\n this.files = [];\n this.hasMore = true;\n this.columnHeights = new Array(this.columnCount).fill(0);\n await this.loadFiles();\n this.observeLoadTrigger();\n },\n async loadFiles() {\n this.loading = true;\n this.error = null;\n this.canRetry = true;\n try {\n const res = await axios.get(`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&count=${this.pageSize}`);\n if (res.data.allowedDirs) {\n this.allowedDirs = res.data.allowedDirs;\n }\n const dirs = (res.data.directories || []).map(d => ({\n name: d,\n isFolder: true\n }));\n const files = (res.data.files || []).map(f => ({\n name: f.name,\n isFolder: false,\n metadata: f.metadata,\n columnIndex: undefined\n }));\n files.forEach(f => this.assignToColumn(f));\n this.files = [...dirs, ...files];\n this.totalCount = res.data.totalCount || this.files.length;\n this.hasMore = this.mediaFiles.length < this.totalCount;\n } catch (err) {\n if (err.response?.status === 403) {\n const msg = err.response?.data?.error || '';\n if (msg.includes('disabled')) {\n this.error = '公开浏览功能未启用';\n } else if (msg.includes('not allowed') || msg.includes('No public')) {\n this.error = '该目录不允许公开访问';\n } else {\n this.error = '访问被拒绝';\n }\n this.canRetry = false;\n } else {\n this.error = '加载失败,请重试';\n }\n } finally {\n this.loading = false;\n }\n },\n async loadMore() {\n if (this.loading || !this.hasMore) return;\n this.loading = true;\n try {\n const start = this.mediaFiles.length;\n const res = await axios.get(`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&start=${start}&count=${this.pageSize}`);\n const moreFiles = (res.data.files || []).map(f => ({\n name: f.name,\n isFolder: false,\n metadata: f.metadata,\n columnIndex: undefined\n }));\n moreFiles.forEach(f => this.assignToColumn(f));\n this.files.push(...moreFiles);\n this.hasMore = this.mediaFiles.length < this.totalCount;\n } catch (err) {\n console.error('加载更多失败', err);\n } finally {\n this.loading = false;\n }\n },\n enterFolder(folderPath) {\n const newPath = folderPath.replace(/\\/+$/, '');\n this.$router.push(`/browse/${newPath}`);\n },\n goToRoot() {\n this.$router.push(`/browse/${this.rootDir}`);\n },\n goToPath(index) {\n const parts = this.pathParts.slice(0, index + 1);\n const newPath = this.rootDir + (parts.length ? '/' + parts.join('/') : '');\n this.$router.push(`/browse/${newPath}`);\n },\n getFolderName(path) {\n return path.split('/').filter(Boolean).pop() || path;\n },\n getFileUrl(name) {\n return `${window.location.origin}/file/${name}`;\n },\n isImage(file) {\n const ext = file.name.split('.').pop().toLowerCase();\n return ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'svg'].includes(ext);\n },\n isVideo(file) {\n const ext = file.name.split('.').pop().toLowerCase();\n return ['mp4', 'webm', 'ogg', 'mov'].includes(ext);\n },\n handleImageError(e) {\n e.target.style.display = 'none';\n },\n copyLink(name) {\n const url = this.getFileUrl(name);\n navigator.clipboard?.writeText(url).then(() => {\n this.showToast('已复制');\n }).catch(() => {\n const input = document.createElement('input');\n input.value = url;\n document.body.appendChild(input);\n input.select();\n document.execCommand('copy');\n document.body.removeChild(input);\n this.showToast('已复制');\n });\n },\n showToast(msg) {\n const existing = document.querySelector('.copy-toast');\n if (existing) existing.remove();\n const toast = document.createElement('div');\n toast.className = 'copy-toast';\n toast.textContent = msg;\n document.body.appendChild(toast);\n setTimeout(() => toast.classList.add('show'), 10);\n setTimeout(() => {\n toast.classList.remove('show');\n setTimeout(() => toast.remove(), 300);\n }, 1500);\n },\n downloadFile(name) {\n const link = document.createElement('a');\n link.href = this.getFileUrl(name);\n link.download = name.split('/').pop();\n link.click();\n },\n openPreview(file) {\n if (file.isFolder) return;\n const mediaIndex = this.mediaFiles.findIndex(f => f.name === file.name);\n if (mediaIndex >= 0) {\n this.previewIndex = mediaIndex;\n this.previewVisible = true;\n this.imageRotation = 0;\n this.gestureLocked = false;\n document.body.style.overflow = 'hidden';\n this.$nextTick(() => {\n this.viewportW = this.$refs.mobileViewport?.getBoundingClientRect().width || window.innerWidth;\n });\n }\n },\n closePreview() {\n this.previewVisible = false;\n this.imageRotation = 0;\n this.gestureLocked = false;\n document.body.style.overflow = '';\n },\n prevImage() {\n if (this.previewIndex > 0) {\n this.previewIndex--;\n this.imageRotation = 0;\n }\n },\n nextImage() {\n if (this.previewIndex < this.mediaFiles.length - 1) {\n this.previewIndex++;\n this.imageRotation = 0;\n }\n },\n rotateImage() {\n this.imageRotation += 90;\n // 动画结束后归一化(无动画)\n if (this.imageRotation >= 360) {\n setTimeout(() => {\n // 临时禁用 transition\n const el = this.$el.querySelector('.preview-image, .preview-video');\n if (el) {\n el.style.transition = 'none';\n this.imageRotation = 0;\n // 强制重绘后恢复 transition\n el.offsetHeight;\n el.style.transition = '';\n } else {\n this.imageRotation = 0;\n }\n }, 300);\n }\n },\n // 手机端滑动:开始\n onSwipeStart(e) {\n if (this.gestureLocked) return;\n if (this.swipeAnimating) return;\n const t = e.touches[0];\n this.swipeStartX = t.clientX;\n this.swipeStartY = t.clientY;\n this.swipeStartT = performance.now();\n this.swipeX = 0;\n this.swipeActive = false;\n this.viewportW = this.$refs.mobileViewport?.getBoundingClientRect().width || window.innerWidth;\n },\n // 手机端滑动:移动\n onSwipeMove(e) {\n if (this.gestureLocked) return;\n if (this.swipeAnimating) return;\n const t = e.touches[0];\n const dx = t.clientX - this.swipeStartX;\n const dy = t.clientY - this.swipeStartY;\n if (!this.swipeActive) {\n if (Math.abs(dx) < 8) return;\n if (Math.abs(dx) <= Math.abs(dy)) return;\n this.swipeActive = true;\n }\n e.preventDefault();\n let x = dx;\n // 边界阻尼:用 rubberBand 代替线性 *0.3\n if (this.previewIndex === 0 && x > 0) {\n x = this.rubberBand(x, this.viewportW, 0.55);\n } else if (this.previewIndex === this.mediaFiles.length - 1 && x < 0) {\n x = -this.rubberBand(-x, this.viewportW, 0.55);\n }\n this.swipeX = x;\n },\n // 手机端滑动:结束\n onSwipeEnd() {\n if (this.gestureLocked) return;\n if (this.swipeAnimating) return;\n if (!this.swipeActive) {\n this.swipeX = 0;\n return;\n }\n const dt = Math.max(1, performance.now() - this.swipeStartT);\n const vx = this.swipeX / dt;\n const threshold = this.viewportW * 0.2;\n let dir = 0;\n if (this.swipeX <= -threshold || vx <= -0.8) dir = +1;\n if (this.swipeX >= threshold || vx >= 0.8) dir = -1;\n if (dir === -1 && this.previewIndex === 0 || dir === +1 && this.previewIndex === this.mediaFiles.length - 1) {\n dir = 0;\n }\n this.swipeDir = dir;\n this.swipeAnimating = true;\n if (dir === +1) this.swipeX = -this.viewportW;else if (dir === -1) this.swipeX = +this.viewportW;else this.swipeX = 0;\n },\n onSwipeTransitionEnd() {\n if (!this.swipeAnimating) return;\n if (this.swipeDir === +1) this.previewIndex++;\n if (this.swipeDir === -1) this.previewIndex--;\n this.swipeAnimating = false;\n this.swipeDir = 0;\n this.swipeX = 0;\n },\n // iOS 风格橡皮筋阻尼函数\n rubberBand(distance, dimension, constant = 0.55) {\n return distance * dimension * constant / (dimension + constant * distance);\n },\n // 放大状态下边界滑动翻页\n onEdgeSwipe(dir) {\n // dir: +1 下一页, -1 上一页\n if (dir === +1 && this.previewIndex < this.mediaFiles.length - 1) {\n this.previewIndex++;\n } else if (dir === -1 && this.previewIndex > 0) {\n this.previewIndex--;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./PublicBrowse.vue?vue&type=template&id=5c1230be&scoped=true\"\nimport script from \"./PublicBrowse.vue?vue&type=script&lang=js\"\nexport * from \"./PublicBrowse.vue?vue&type=script&lang=js\"\n\nimport \"./PublicBrowse.vue?vue&type=style&index=0&id=5c1230be&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5c1230be\"]])\n\nexport default __exports__"],"names":["_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","class","ref","onPointerdown","args","onPointerDown","onPointermove","onPointerMove","onPointerup","onPointerUp","onPointercancel","onDblclick","onDblClick","isImage","key","src","draggable","style","mediaStyle","onLoad","isVideo","controls","autoplay","playsinline","name","props","file","type","Object","required","String","Boolean","default","data","pointers","Map","scale","rotation","rotatePreview","tx","ty","naturalWidth","naturalHeight","startScale","startRotation","startTx","startTy","startCenter","startDist","startAngle","dragging","dragStart","viewportRect","minScale","maxScale","gestureMode","edgeOverflow","edgeDir","computed","isActiveTransform","this","size","displayRotation","rotateShrink","p","Math","min","abs","k","sin","PI","finalScale","inGesture","transform","transition","transformOrigin","watch","v","$emit","methods","e","img","target","reset","clear","clamp","max","rubberBand","distance","dimension","constant","getViewportRect","$refs","viewport","getBoundingClientRect","getPanBounds","rect","maxX","maxY","vw","vh","width","height","$el","querySelector","iw","clientWidth","ih","clientHeight","sw","sh","applyBoundWithRubber","value","calcTwoPointer","pts","Array","from","values","p0","p1","dx","x","dy","y","dist","hypot","angle","atan2","center","normalizeAngle","deg","currentTarget","setPointerCapture","pointerId","set","clientX","clientY","has","preventDefault","scaleFactor","scaleChange","deltaAngle","angleChange","rotateStartDeg","pinchStartScale","cx0","left","cy0","top","cx1","cy1","rawX","rawY","overflow","dir","delete","finishRotate","d","commitDeg","newRot","updateFillScale","rot","isRotated","__exports__","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","href","rel","_hoisted_30","_hoisted_31","_hoisted_32","_component_TransformMedia","siteName","onClick","goToRoot","rootDirName","pathParts","part","index","$event","goToPath","totalCount","loading","files","length","error","canRetry","loadFiles","folders","folder","enterFolder","viewBox","fill","getFolderName","columns","column","colIndex","openPreview","loaded","getFileUrl","alt","onImageLoad","onError","handleImageError","muted","loop","preload","onLoadedmetadata","onVideoLoad","onMouseenter","play","onMouseleave","pause","copyLink","title","downloadFile","hasMore","mediaFiles","previewVisible","closePreview","currentPreviewFile","desktopImageStyle","onTouchstart","onSwipeStart","onTouchmove","onSwipeMove","onTouchend","onSwipeEnd","swipeTrackStyle","onTransitionend","onSwipeTransitionEnd","swipeWindow","f","i","getSlideKey","onLock","gestureLocked","onUnlock","onEdgeSwipe","previewIndex","prevImage","nextImage","rotateImage","components","TransformMedia","allowedDirs","rootDir","currentPath","observer","pageSize","columnCount","columnHeights","imageRotation","swipeX","swipeStartX","swipeStartY","swipeStartT","swipeActive","swipeAnimating","swipeDir","viewportW","userConfig","siteTitle","split","filter","pop","relative","replace","isFolder","cols","idx","columnIndex","push","prevPreviewFile","nextPreviewFile","base","handler","initFromRoute","mounted","setupIntersectionObserver","updateColumnCount","window","addEventListener","beforeUnmount","disconnect","removeEventListener","innerWidth","newCount","forEach","undefined","assignToColumn","getShortestColumn","minIndex","minHeight","event","ratio","video","videoHeight","videoWidth","IntersectionObserver","entries","entry","isIntersecting","loadMore","rootMargin","observeLoadTrigger","$nextTick","loadTrigger","observe","dirParam","$route","params","dirPath","isArray","join","parts","res","axios","get","encodeURIComponent","dirs","directories","map","metadata","err","response","status","msg","includes","start","moreFiles","console","folderPath","newPath","$router","slice","path","location","origin","ext","toLowerCase","display","url","navigator","clipboard","writeText","then","showToast","catch","input","document","createElement","body","appendChild","select","execCommand","removeChild","existing","remove","toast","className","textContent","setTimeout","classList","add","link","download","click","mediaIndex","findIndex","mobileViewport","el","offsetHeight","t","touches","performance","now","dt","vx","threshold"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/775.fdc2404c.js.map.gz b/js/775.fdc2404c.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..99186c4655f41bff52e1faf0db2decf09d8870f7 GIT binary patch literal 21412 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 D=cgCX literal 0 HcmV?d00001 diff --git a/js/app.743d3780.js b/js/app.743d3780.js new file mode 100644 index 0000000..fc7b44d --- /dev/null +++ b/js/app.743d3780.js @@ -0,0 +1,2 @@ +(function(){"use strict";var e={457:function(e,t,o){o(4114);var n=o(4373),r=o(4570),a=o.n(r),s=o(6915),i=o(1219);const l=n.A.create({baseURL:"/"});l.interceptors.request.use(e=>{if(e.withAuthCode){const t=a().get("authCode");t&&(e.headers["authCode"]=t)}return e},e=>Promise.reject(e)),l.interceptors.response.use(e=>e,e=>(e.config?.withAuthCode&&401===e.response?.status&&(i.nk.error("认证失败,请重新登录!"),s.A.push("/login")),Promise.reject(e))),t.A=l},3354:function(e,t,o){o(8111),o(7588);var n=o(5130),r=o(3888),a=o(4068),s=(o(9436),o(372),o(8950)),i=o(2353),l=o(292),u=o(6768);function c(e,t,o,n,r,a){const s=(0,u.g2)("router-view");return(0,u.uX)(),(0,u.Wv)(s)}var d=o(8401),p=o(3785),m={computed:{...(0,d.L8)(["userConfig","useDarkMode"])},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars()})},watch:{useDarkMode(){this.setSiteIcon()}},methods:{initOverlayScrollbars(){try{if(p.ae.valid(document.body))return;(0,p.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setSiteIcon(){const e=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');e.forEach(e=>e.remove());const t=document.createElement("link"),o=document.createElement("link"),n=document.createElement("link");t.rel="icon",o.rel="apple-touch-icon",n.rel="mask-icon",this.useDarkMode?(t.href=this.userConfig?.siteIcon||"/logo-dark.png",o.href=this.userConfig?.siteIcon||"/logo-dark.png",n.href=this.userConfig?.siteIcon||"/logo-dark.png"):(t.href=this.userConfig?.siteIcon||"/logo.png",o.href=this.userConfig?.siteIcon||"/logo.png",n.href=this.userConfig?.siteIcon||"/logo.png"),document.head.appendChild(t),document.head.appendChild(o),document.head.appendChild(n)}}},f=o(1241);const h=(0,f.A)(m,[["render",c]]);var g=h,b=o(6915),k=o(5507),y=o(7477);o(1862),o(635);s.Yv.add(i.X7I);const C=(0,n.Ef)(g),v=(0,r.Zf)();C.component("font-awesome-icon",l.gc);for(const[M,E]of Object.entries(y))C.component(M,E);const A=()=>{const e=document.documentElement;let t;if(k.A.state.cusDarkMode&&null!==k.A.state.useDarkMode)t=k.A.state.useDarkMode;else{if(t=window.matchMedia("(prefers-color-scheme: dark)").matches,!t){const e=new Date,o=e.getHours();t=o>=22||o<6}k.A.commit("setUseDarkMode",t)}t?e.classList.add("dark"):e.classList.remove("dark")},U=e=>{const t=document.documentElement;e?t.classList.add("dark"):t.classList.remove("dark")},w=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},S=(e,t)=>{const o=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');o.forEach(e=>e.remove());const n=document.createElement("link"),r=document.createElement("link"),a=document.createElement("link");n.rel="icon",r.rel="apple-touch-icon",a.rel="mask-icon",e?(n.href=t?.siteIcon||"/logo-dark.png",r.href=t?.siteIcon||"/logo-dark.png",a.href=t?.siteIcon||"/logo-dark.png"):(n.href=t?.siteIcon||"/logo.png",r.href=t?.siteIcon||"/logo.png",a.href=t?.siteIcon||"/logo.png"),document.head.appendChild(n),document.head.appendChild(r),document.head.appendChild(a)};k.A.dispatch("fetchUserConfig").then(()=>{A(),w(k.A.getters.userConfig),S(k.A.state.useDarkMode,k.A.getters.userConfig),k.A.subscribe((e,t)=>{"setUseDarkMode"===e.type&&k.A.state.cusDarkMode&&(U(t.useDarkMode),S(t.useDarkMode,k.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(A(),S(k.A.state.useDarkMode,k.A.getters.userConfig))}),C.use(k.A).use(b.A).use(a.A).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),C.use(k.A).use(b.A).use(a.A).use(v).mount("#app")})},5507:function(e,t,o){o(8111),o(1701);var n=o(8401),r=o(457),a=o(5131);t.A=(0,n.y$)({state:{userConfig:null,bingWallPapers:[],credentials:null,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:!0,compressQuality:4,compressBar:5,serverCompress:!0},storeUploadChannel:"",storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,credentials:e=>e.credentials,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,t){e.userConfig=t},setBingWallPapers(e,t){e.bingWallPapers=t},setCredentials(e,t){e.credentials=t},setUploadMethod(e,t){e.uploadMethod=t},setUploadCopyUrlForm(e,t){e.uploadCopyUrlForm=t},setCompressConfig(e,{key:t,value:o}){e.compressConfig[t]=o},setStoreUploadChannel(e,t){e.storeUploadChannel=t},setStoreUploadNameType(e,t){e.storeUploadNameType=t},setCustomUrlSettings(e,{key:t,value:o}){e.customUrlSettings[t]=o},setStoreAutoRetry(e,t){e.storeAutoRetry=t},setAdminUrlSettings(e,{key:t,value:o}){e.adminUrlSettings[t]=o},setUseDarkMode(e,t){e.useDarkMode=t},setCusDarkMode(e,t){e.cusDarkMode=t},setStoreUploadFolder(e,t){e.uploadFolder=t,localStorage.setItem("uploadFolder",t)},setStoreAutoReUpload(e,t){e.autoReUpload=t}},actions:{async fetchUserConfig({commit:e}){try{const t=await r.A.get("/api/userConfig");e("setUserConfig",t.data)}catch(t){console.log(t)}},async fetchBingWallPapers({commit:e}){try{const t=await r.A.get("/api/bing/wallpaper"),o=t.data.data,n=o.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(n.map(e=>new Promise((t,o)=>{const n=new Image;n.onload=t,n.onerror=o,n.src=e.url}))),e("setBingWallPapers",n)}catch(t){console.log(t)}}},modules:{},plugins:[(0,a.A)()]})},6915:function(e,t,o){o(4979);var n=o(8512),r=o(1219),a=o(4570),s=o.n(a),i=o(5507),l=o(457);const u=(e,t,o)=>{const n=i.A.getters.credentials;if(null===n&&"adminLogin"!==e.name){const e=btoa("unset:unset");l.A.get("/api/manage/check",{headers:{Authorization:"Basic "+e},withCredentials:!0}).then(t=>{if(200!==t.status)throw new Error("认证失败!");i.A.commit("setCredentials",e),o()}).catch(e=>{r.nk.error("请先认证!"),o({name:"adminLogin"})})}else o()},c=(e,t,o)=>{let n=s().get("authCode");null===n&&"login"!==e.name?l.A.post("/api/login",{authCode:"unset"}).then(e=>{if(200!==e.status)throw new Error("认证失败!");s().set("authCode","unset","14d"),n="unset",o()}).catch(e=>{r.nk.error("请先认证!"),o({name:"login"})}):o()},d=[{path:"/",name:"home",component:()=>Promise.all([o.e(171),o.e(747)]).then(o.bind(o,3695)),beforeEnter:c},{path:"/login",name:"login",component:()=>Promise.all([o.e(171),o.e(672)]).then(o.bind(o,2560))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([o.e(239),o.e(482)]).then(o.bind(o,1482)),beforeEnter:u},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([o.e(239),o.e(419)]).then(o.bind(o,8419)),beforeEnter:u},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([o.e(239),o.e(32)]).then(o.bind(o,8032)),beforeEnter:u},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([o.e(171),o.e(698)]).then(o.bind(o,3950))},{path:"/blockimg",name:"blockimg",component:()=>o.e(917).then(o.bind(o,4917))},{path:"/whiteliston",name:"whiteliston",component:()=>o.e(845).then(o.bind(o,7226))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>o.e(775).then(o.bind(o,775))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>o.e(226).then(o.bind(o,8226))}],p=(0,n.aE)({history:(0,n.LA)("/"),routes:d});t.A=p}},t={};function o(n){var r=t[n];if(void 0!==r)return r.exports;var a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,o),a.exports}o.m=e,function(){var e=[];o.O=function(t,n,r,a){if(!n){var s=1/0;for(c=0;c=a)&&Object.keys(o.O).every(function(e){return o.O[e](n[l])})?n.splice(l--,1):(i=!1,a0&&e[c-1][2]>a;c--)e[c]=e[c-1];e[c]=[n,r,a]}}(),function(){o.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return o.d(t,{a:t}),t}}(),function(){o.d=function(e,t){for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}}(),function(){o.f={},o.e=function(e){return Promise.all(Object.keys(o.f).reduce(function(t,n){return o.f[n](e,t),t},[]))}}(),function(){o.u=function(e){return"js/"+e+"."+{32:"a8086e01",171:"833208d0",226:"577ea134",239:"32572dba",419:"99e00aec",482:"e302adaf",672:"11bec4e1",698:"77f859a8",747:"51eee506",775:"fdc2404c",845:"6b4cb4a5",917:"5bf3db27"}[e]+".js"}}(),function(){o.miniCssF=function(e){return"css/"+e+"."+{32:"3ae41ed4",226:"6548e7b4",239:"6563616d",419:"1d235d6e",482:"f42e1415",672:"aed3581b",698:"aed3581b",747:"e115ba5f",775:"0882ba00",845:"6b45e8e3",917:"8529ad1e"}[e]+".css"}}(),function(){o.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="sanyue_imghub:";o.l=function(n,r,a,s){if(e[n])e[n].push(r);else{var i,l;if(void 0!==a)for(var u=document.getElementsByTagName("script"),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

4poABPWl(RJ$v?sjP+R51y z1JNnv9Q4{(JPAc5XKYRhI%Bohbc&I3t^*Bn=vb?1W0t82&)&{cQ$^YxWC%51wcqEd z*=!*7d|6>cwIM`s?JI(ll>Gf(Ma91X$45-7gZ)>oD7}8El~sT;m~->yQC6GH$9!0D zsD|>xDmZqKad%|jq>I@+pG0V=f^0|41te-5|8R^Dcb2%%fHd(pl`d-2Z10TXq>2#v z?rv%(svAG^`RXm7LC*!l#~SIU5G@SgK=07?YdL z;Rw{%=Z|8tun7QHvnwRK&6>t`TpxrT_J7KDav(S^db60yE|3ng?b`QbPK3C)_# zr*Gy`=uRANC%qTtP%ix;l|XS?Zq2*ZVxqEU)Bgun-C3Q=*;_t)`eZwvOV_@Ihx{3h z3PPV+jCMyks+K`l;F$X*gKre~p%7k9iBT!0+VXq-mokI%soMvxkd40_Hg=T>GZ#=R z8+XOWkQLwA3kbI5#=s_Udx5#FF!Wj7mauZnnyt;vo?9b$gb1k|asnCGHp)n*noU0d zT_E@DoN4#uE`K*0OEXsM3A|D~N#(3@dw17}=efLZxZ|ubb$5cnUrUV6os!%iiVX4NO7 zETv{|1DdBcpdpmwjO^0(6FLH9{(76rYgxyXN+Y!W+*Og-P#M6tgm>vAOXZA2Pwx*y zsDWePbbhBk6uq|}gSCe8GgZZIS;cP66oeqo^r-+1lE7uk;h={@9IN{qW6XWJ&}?E3 zx7nKw{8_Rshl&G7e&W0VjL3f+cRY-?sd$TG0D$HSI|g4R;?UB+2&&u)inn{StY z!AA%wQ^E4gH7PANG~I~^y8%m@Qny(E0d!V1Tld=Cs8ztHCKaXwi+XE9_7=LNEp)kB z=u))MWoDsE$U>Kgg)aRHUDg%4WGi$zR#*)6NQ|#-nF5T&m_)899f@(XsoZaEkU@a; zb#lG@fRR?Qi(eMLTZKMed2Yc3Y7254yUWC-ChoUvKgTcK&XpmST#Jz%NB$%Nefk1A zonlR7#b$e4i!q#?w3Tw@0|RVqq$m_C!x{p{eVjASaw^E-o4a%uf@rqq73maL3^tqC zqos~D_)r{Zc#a9xgj8%bn|K=?rHeDyXptI|${C700J`L|*_7L`SUo|iF-(JnFow?r z+Xloc7}|qi$bB$05DaPhL@Z2wu;Vn{20KIbC>*;(7xGAKXhxAEa*ocdOGK#(-s~A| zyGdHGqegaI41Ixn!mf~uG6_9|lu2kHWK53QW12H(T@%1JfcO;dXC-dpgPVrJHFbq+ zN;OzP1&fg$vvj1#ZhvRQm+%=RIk3bwn-)tl%y$7JKRY9wnNdEb-k#8#5FBsI^FJN;%NNg8Jo>$Je1p%&DPQ*_(0w}D64}#s00uw zG^(qY;7ysn(^0S09n<4>fx_@jKLO8o(SBx*0 aLBHEcI{iT__}0KZ)&Bv3ts}_iF#rI0w~uE4 literal 0 HcmV?d00001 diff --git a/js/app.743d3780.js.map b/js/app.743d3780.js.map new file mode 100644 index 0000000..375d0b3 --- /dev/null +++ b/js/app.743d3780.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/app.743d3780.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/App.vue?0365","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/webpack/bootstrap","webpack://sanyue_imghub/webpack/runtime/chunk loaded","webpack://sanyue_imghub/webpack/runtime/compat get default export","webpack://sanyue_imghub/webpack/runtime/define property getters","webpack://sanyue_imghub/webpack/runtime/ensure chunk","webpack://sanyue_imghub/webpack/runtime/get javascript chunk filename","webpack://sanyue_imghub/webpack/runtime/get mini-css chunk filename","webpack://sanyue_imghub/webpack/runtime/global","webpack://sanyue_imghub/webpack/runtime/hasOwnProperty shorthand","webpack://sanyue_imghub/webpack/runtime/load script","webpack://sanyue_imghub/webpack/runtime/make namespace object","webpack://sanyue_imghub/webpack/runtime/publicPath","webpack://sanyue_imghub/webpack/runtime/css loading","webpack://sanyue_imghub/webpack/runtime/jsonp chunk loading","webpack://sanyue_imghub/webpack/startup"],"sourcesContent":["import axios from 'axios';\r\nimport cookies from 'vue-cookies';\r\nimport router from '@/router/index';\r\nimport { ElMessage } from 'element-plus'\r\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n});\r\n\r\n// 请求拦截器\r\ninstance.interceptors.request.use(\r\n (config) => {\r\n // 如果配置中标记了withAuthCode,则添加authCode到header\r\n if (config.withAuthCode) {\r\n const authCode = cookies.get('authCode');\r\n if (authCode) {\r\n config.headers['authCode'] = authCode;\r\n }\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\n// 响应拦截器\r\ninstance.interceptors.response.use(\r\n (response) => {\r\n return response;\r\n },\r\n (error) => {\r\n // 如果请求配置了withAuthCode且返回401,则跳转到登录页\r\n if (error.config?.withAuthCode && error.response?.status === 401) {\r\n ElMessage.error('认证失败,请重新登录!');\r\n router.push('/login');\r\n }\r\n return Promise.reject(error);\r\n }\r\n);\r\n\r\nexport default instance;\r\n","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n return _openBlock(), _createBlock(_component_router_view);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nexport default {\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode'])\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n });\n },\n watch: {\n useDarkMode() {\n this.setSiteIcon();\n }\n },\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setSiteIcon() {\n // 同时更改 icon apple-touch-icon 和 mask-icon\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\n existingIcons.forEach(icon => icon.remove());\n const iconLink = document.createElement('link');\n const appleIconLink = document.createElement('link');\n const maskIconLink = document.createElement('link');\n iconLink.rel = 'icon';\n appleIconLink.rel = 'apple-touch-icon';\n maskIconLink.rel = 'mask-icon';\n if (this.useDarkMode) {\n iconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n appleIconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n maskIconLink.href = this.userConfig?.siteIcon || '/logo-dark.png';\n } else {\n iconLink.href = this.userConfig?.siteIcon || '/logo.png';\n appleIconLink.href = this.userConfig?.siteIcon || '/logo.png';\n maskIconLink.href = this.userConfig?.siteIcon || '/logo.png';\n }\n document.head.appendChild(iconLink);\n document.head.appendChild(appleIconLink);\n document.head.appendChild(maskIconLink);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=7d6c298a\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=7d6c298a&lang=css\"\nimport \"./App.vue?vue&type=style&index=1&id=7d6c298a&lang=css\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { fas } from '@fortawesome/free-solid-svg-icons'; // 引入所有 solid 图标\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(fas);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(head).mount('#app');\r\n})\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n credentials: null,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: true,\r\n compressQuality: 4,\r\n compressBar: 5,\r\n serverCompress: true,\r\n },\r\n storeUploadChannel: '',\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n credentials: state => state.credentials,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n setCredentials(state, credentials) {\r\n state.credentials = credentials;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState()]\r\n})\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport cookies from 'vue-cookies'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n // 从store中获取凭据\r\n const credentials = store.getters.credentials\r\n if (credentials === null && to.name !== 'adminLogin') {\r\n // 尝试未设置密码的情况\r\n const credentials = btoa('unset:unset')\r\n axios.get('/api/manage/check', {\r\n headers: {\r\n 'Authorization': 'Basic ' + credentials\r\n },\r\n withCredentials: true\r\n }).then(res => {\r\n if (res.status !== 200) {\r\n throw new Error('认证失败!')\r\n }\r\n store.commit('setCredentials', credentials)\r\n next()\r\n }).catch(err => {\r\n ElMessage.error('请先认证!')\r\n next({ name: 'adminLogin' })\r\n })\r\n } else {\r\n next()\r\n }\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n let authCode = cookies.get('authCode');\r\n if (authCode === null && to.name !== 'login') {\r\n // 尝试未设置密码的情况\r\n axios.post('/api/login', {\r\n authCode: 'unset'\r\n }).then(res => {\r\n if (res.status !== 200) {\r\n throw new Error('认证失败!')\r\n }\r\n cookies.set('authCode', 'unset', '14d')\r\n authCode = 'unset'\r\n next()\r\n }).catch(err => {\r\n ElMessage.error('请先认证!')\r\n next({ name: 'login' })\r\n })\r\n } else {\r\n next()\r\n }\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"32\":\"a8086e01\",\"171\":\"833208d0\",\"226\":\"577ea134\",\"239\":\"32572dba\",\"419\":\"99e00aec\",\"482\":\"e302adaf\",\"672\":\"11bec4e1\",\"698\":\"77f859a8\",\"747\":\"51eee506\",\"775\":\"fdc2404c\",\"845\":\"6b4cb4a5\",\"917\":\"5bf3db27\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"32\":\"3ae41ed4\",\"226\":\"6548e7b4\",\"239\":\"6563616d\",\"419\":\"1d235d6e\",\"482\":\"f42e1415\",\"672\":\"aed3581b\",\"698\":\"aed3581b\",\"747\":\"e115ba5f\",\"775\":\"0882ba00\",\"845\":\"6b45e8e3\",\"917\":\"8529ad1e\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"32\":1,\"226\":1,\"239\":1,\"419\":1,\"482\":1,\"672\":1,\"698\":1,\"747\":1,\"775\":1,\"845\":1,\"917\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(3354); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","interceptors","request","use","config","withAuthCode","authCode","cookies","headers","error","Promise","reject","response","status","ElMessage","router","push","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","computed","mounted","this","$nextTick","initOverlayScrollbars","watch","useDarkMode","setSiteIcon","methods","valid","document","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","console","log","existingIcons","querySelectorAll","forEach","icon","remove","iconLink","createElement","appleIconLink","maskIconLink","rel","href","userConfig","siteIcon","head","appendChild","__exports__","library","add","fas","app","createApp","App","createHead","component","FontAwesomeIcon","key","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","documentElement","isDarkMode","store","state","cusDarkMode","window","matchMedia","matches","now","Date","hour","getHours","commit","classList","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","dispatch","then","getters","subscribe","mutation","type","payload","ElementPlus","mount","catch","createStore","bingWallPapers","credentials","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","compressQuality","compressBar","serverCompress","storeUploadChannel","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setCredentials","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","value","setStoreUploadChannel","uploadChannel","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","get","data","fetchBingWallPapers","wallpapers","map","wallpaper","url","all","resolve","img","Image","onload","onerror","src","modules","plugins","createPersistedState","adminAuthGuard","to","from","next","name","btoa","withCredentials","res","Error","err","userAuthGuard","post","routes","path","beforeEnter","createRouter","history","createWebHistory","process","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","code","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/app.743d3780.js.map.gz b/js/app.743d3780.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..f8274c038f38301a377a110ef4318c9dd171fbed GIT binary patch literal 15257 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 literal 0 HcmV?d00001