diff --git a/css/510.55072d4d.css b/css/510.55072d4d.css new file mode 100644 index 0000000..7851b26 --- /dev/null +++ b/css/510.55072d4d.css @@ -0,0 +1 @@ +.public-browse[data-v-151b62f8]{min-height:100vh;background:#0a0a0a;color:#fff}.header[data-v-151b62f8]{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-151b62f8]{font-size:20px;font-weight:600;color:#fff}.breadcrumb[data-v-151b62f8]{display:flex;align-items:center;gap:4px;font-size:14px}.breadcrumb-item[data-v-151b62f8]{padding:6px 12px;border-radius:6px;cursor:pointer;transition:background .2s;color:#ccc}.breadcrumb-item[data-v-151b62f8]:hover{background:#252525;color:#fff}.breadcrumb-sep[data-v-151b62f8]{color:#444}.file-count[data-v-151b62f8]{color:#666;font-size:14px}.error-container[data-v-151b62f8],.loading-container[data-v-151b62f8]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;color:#666}.loading-spinner[data-v-151b62f8]{width:48px;height:48px;border:3px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-151b62f8 1s linear infinite}.loading-spinner-small[data-v-151b62f8]{width:24px;height:24px;border:2px solid #222;border-top-color:#3b82f6;border-radius:50%;animation:spin-151b62f8 1s linear infinite}@keyframes spin-151b62f8{to{transform:rotate(1turn)}}.retry-btn[data-v-151b62f8]{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-151b62f8]:hover{background:#2563eb}.gallery-container[data-v-151b62f8]{padding:8px}@media (min-width:1200px){.gallery-container[data-v-151b62f8]{max-width:1400px;margin:0 auto;padding:24px}}.folders-section[data-v-151b62f8]{margin-bottom:24px}.folders-grid[data-v-151b62f8]{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:16px}.folder-card[data-v-151b62f8]{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-151b62f8]:hover{background:#1a1a1a;border-color:#333;transform:translateY(-2px)}.folder-icon[data-v-151b62f8]{width:48px;height:48px;margin-bottom:12px;color:#555}.folder-icon svg[data-v-151b62f8]{width:100%;height:100%}.folder-name[data-v-151b62f8]{font-size:14px;color:#999;text-align:center;word-break:break-all}.waterfall[data-v-151b62f8]{display:flex;gap:16px}.waterfall-column[data-v-151b62f8]{flex:1;display:flex;flex-direction:column;gap:16px}.waterfall-item[data-v-151b62f8]{cursor:pointer}.image-wrapper[data-v-151b62f8]{position:relative;border-radius:12px;overflow:hidden;background:#141414;border:1px solid #1a1a1a;min-height:180px}.image-wrapper[data-v-151b62f8]:before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#141414 25%,#1a1a1a 50%,#141414 75%);background-size:200% 100%;animation:shimmer-151b62f8 1.5s infinite;z-index:1;pointer-events:none}.image-wrapper.loaded[data-v-151b62f8]:before{display:none}.image-wrapper.loaded[data-v-151b62f8]{min-height:auto}.image-wrapper img[data-v-151b62f8],.image-wrapper video[data-v-151b62f8]{width:100%;display:block;position:relative;z-index:2}@keyframes shimmer-151b62f8{0%{background-position:200% 0}to{background-position:-200% 0}}.image-wrapper[data-v-151b62f8]:hover{border-color:#333}.overlay[data-v-151b62f8]{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-151b62f8]{opacity:1}.file-placeholder[data-v-151b62f8]{width:100%;height:200px;display:flex;align-items:center;justify-content:center;background:#141414;color:#333}.file-placeholder svg[data-v-151b62f8]{width:56px;height:56px}.overlay-actions[data-v-151b62f8]{display:flex;gap:8px}.action-btn[data-v-151b62f8]{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-151b62f8]{width:16px;height:16px}.action-btn[data-v-151b62f8]:hover{background:hsla(0,0%,100%,.2);color:#fff;transform:scale(1.1)}.load-trigger[data-v-151b62f8]{display:flex;justify-content:center;align-items:center;padding:48px;min-height:100px}.loading-more[data-v-151b62f8]{display:flex;align-items:center;gap:12px;color:#666;font-size:14px}.no-more[data-v-151b62f8]{color:#444;font-size:14px}.preview-modal[data-v-151b62f8]{position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,.97);display:flex;align-items:center;justify-content:center;overflow:hidden}.swipe-container[data-v-151b62f8]{position:absolute;inset:0;overflow:hidden;touch-action:pan-y}.swipe-track[data-v-151b62f8]{display:flex;width:300%;height:100%;will-change:transform;transform:translateX(-33.333%)}.swipe-slide[data-v-151b62f8]{flex:0 0 33.333%;width:33.333%;height:100%;display:flex;align-items:center;justify-content:center;padding:60px 20px;box-sizing:border-box}.swipe-placeholder[data-v-151b62f8]{background:transparent}.preview-image[data-v-151b62f8],.preview-video[data-v-151b62f8]{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-151b62f8]{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-151b62f8]:hover{background:hsla(0,0%,100%,.2)}.preview-close svg[data-v-151b62f8]{width:28px;height:28px}.page-indicator[data-v-151b62f8]{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-151b62f8],.preview-prev[data-v-151b62f8]{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-151b62f8]:hover,.preview-prev[data-v-151b62f8]:hover{background:hsla(0,0%,100%,.2)}.preview-next svg[data-v-151b62f8],.preview-prev svg[data-v-151b62f8]{width:32px;height:32px}.preview-prev[data-v-151b62f8]{left:20px}.preview-next[data-v-151b62f8]{right:20px}@media (max-width:768px){.desktop-only[data-v-151b62f8]{display:none!important}.page-indicator[data-v-151b62f8]{bottom:40px}}@media (max-width:1199px) and (min-width:601px){.gallery-container[data-v-151b62f8]{padding:12px}.waterfall-column[data-v-151b62f8],.waterfall[data-v-151b62f8]{gap:10px}.image-wrapper[data-v-151b62f8]{border-radius:8px}}@media (max-width:600px){.header[data-v-151b62f8]{flex-direction:column;gap:8px;padding:12px}.gallery-container[data-v-151b62f8]{padding:6px}.waterfall-column[data-v-151b62f8],.waterfall[data-v-151b62f8]{gap:6px}.image-wrapper[data-v-151b62f8]{border-radius:6px;min-height:120px}.folders-section[data-v-151b62f8]{margin-bottom:12px}.folders-grid[data-v-151b62f8]{grid-template-columns:repeat(2,1fr);gap:8px}.folder-card[data-v-151b62f8]{padding:16px 12px;border-radius:8px}.folder-icon[data-v-151b62f8]{width:36px;height:36px;margin-bottom:8px}.folder-name[data-v-151b62f8]{font-size:12px}.preview-next[data-v-151b62f8],.preview-prev[data-v-151b62f8]{width:44px;height:44px}.preview-next svg[data-v-151b62f8],.preview-prev svg[data-v-151b62f8]{width:24px;height:24px}.load-trigger[data-v-151b62f8]{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/510.55072d4d.css.gz b/css/510.55072d4d.css.gz new file mode 100644 index 0000000..6c9fb9e Binary files /dev/null and b/css/510.55072d4d.css.gz differ diff --git a/index.html b/index.html index aba4461..afe47aa 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -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 5fe47ca..ce2e951 100644 Binary files a/index.html.gz and b/index.html.gz differ diff --git a/js/510.f9d8420a.js b/js/510.f9d8420a.js new file mode 100644 index 0000000..d849058 --- /dev/null +++ b/js/510.f9d8420a.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[510],{6510:function(e,i,t){t.r(i),t.d(i,{default:function(){return J}});var s=t(6768),o=t(4232),n=t(5130);const r={class:"public-browse"},a={class:"header"},l={class:"header-left"},c={class:"logo"},d={class:"header-center"},h={class:"breadcrumb"},u=["onClick"],m={class:"header-right"},p={class:"file-count"},v={key:0,class:"loading-container"},g={key:1,class:"error-container"},w={key:2,class:"gallery-container",ref:"galleryContainer"},k={key:0,class:"folders-section"},C={class:"folders-grid"},f=["onClick"],L={class:"folder-name"},y={class:"waterfall",ref:"waterfall"},b=["onClick"],I=["src","alt","onLoad"],F=["src","onLoadedmetadata"],x={key:2,class:"file-placeholder"},E={class:"overlay"},T={class:"overlay-actions"},X=["onClick"],M=["onClick"],P={ref:"loadTrigger",class:"load-trigger"},S={key:0,class:"loading-more"},$={key:1,class:"no-more"},z={key:0,class:"swipe-slide"},D=["src"],H=["src"],V={key:1,class:"swipe-slide swipe-placeholder"},R={class:"swipe-slide swipe-current"},U=["src"],A=["src"],B={key:2,class:"swipe-slide"},_=["src"],Q=["src"],j={key:3,class:"swipe-slide swipe-placeholder"},N={class:"page-indicator"};function O(e,i,t,O,W,K){return(0,s.uX)(),(0,s.CE)("div",r,[(0,s.Lk)("header",a,[(0,s.Lk)("div",l,[(0,s.Lk)("span",c,(0,o.v_)(K.siteName),1)]),(0,s.Lk)("div",d,[(0,s.Lk)("div",h,[(0,s.Lk)("span",{class:"breadcrumb-item",onClick:i[0]||(i[0]=(...e)=>K.goToRoot&&K.goToRoot(...e))},(0,o.v_)(K.rootDirName),1),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(K.pathParts,(e,t)=>((0,s.uX)(),(0,s.CE)(s.FK,{key:t},[i[14]||(i[14]=(0,s.Lk)("span",{class:"breadcrumb-sep"},"/",-1)),(0,s.Lk)("span",{class:"breadcrumb-item",onClick:e=>K.goToPath(t)},(0,o.v_)(e),9,u)],64))),128))])]),(0,s.Lk)("div",m,[(0,s.Lk)("span",p,(0,o.v_)(W.totalCount)+" 个文件",1)])]),W.loading&&0===W.files.length?((0,s.uX)(),(0,s.CE)("div",v,[...i[15]||(i[15]=[(0,s.Lk)("div",{class:"loading-spinner"},null,-1),(0,s.Lk)("p",null,"加载中...",-1)])])):W.error?((0,s.uX)(),(0,s.CE)("div",g,[(0,s.Lk)("p",null,(0,o.v_)(W.error),1),W.canRetry?((0,s.uX)(),(0,s.CE)("button",{key:0,onClick:i[1]||(i[1]=(...e)=>K.loadFiles&&K.loadFiles(...e)),class:"retry-btn"},"重试")):(0,s.Q3)("",!0)])):((0,s.uX)(),(0,s.CE)("div",w,[K.folders.length>0?((0,s.uX)(),(0,s.CE)("div",k,[(0,s.Lk)("div",C,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(K.folders,e=>((0,s.uX)(),(0,s.CE)("div",{key:e.name,class:"folder-card",onClick:i=>K.enterFolder(e.name)},[i[16]||(i[16]=(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",L,(0,o.v_)(K.getFolderName(e.name)),1)],8,f))),128))])])):(0,s.Q3)("",!0),(0,s.Lk)("div",y,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(K.columns,(e,t)=>((0,s.uX)(),(0,s.CE)("div",{key:t,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:i=>K.openPreview(e)},[(0,s.Lk)("div",{class:(0,o.C4)(["image-wrapper",{loaded:e.loaded}])},[K.isImage(e)?((0,s.uX)(),(0,s.CE)("img",{key:0,src:K.getFileUrl(e.name),alt:e.name,loading:"lazy",onLoad:i=>K.onImageLoad(i,e),onError:i[2]||(i[2]=(...e)=>K.handleImageError&&K.handleImageError(...e))},null,40,I)):K.isVideo(e)?((0,s.uX)(),(0,s.CE)("video",{key:1,src:K.getFileUrl(e.name),muted:"",loop:"",preload:"metadata",onLoadedmetadata:i=>K.onVideoLoad(i,e),onMouseenter:i[3]||(i[3]=e=>e.target.play()),onMouseleave:i[4]||(i[4]=e=>e.target.pause())},null,40,F)):((0,s.uX)(),(0,s.CE)("div",x,[...i[17]||(i[17]=[(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",E,[(0,s.Lk)("div",T,[(0,s.Lk)("button",{class:"action-btn",onClick:(0,n.D$)(i=>K.copyLink(e.name),["stop"]),title:"复制链接"},[...i[18]||(i[18]=[(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,X),(0,s.Lk)("button",{class:"action-btn",onClick:(0,n.D$)(i=>K.downloadFile(e.name),["stop"]),title:"下载"},[...i[19]||(i[19]=[(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,M)])])],2)],8,b))),128))]))),128))],512),(0,s.Lk)("div",P,[W.loading&&W.files.length>0?((0,s.uX)(),(0,s.CE)("div",S,[...i[20]||(i[20]=[(0,s.Lk)("div",{class:"loading-spinner-small"},null,-1),(0,s.Lk)("span",null,"加载中...",-1)])])):!W.hasMore&&K.mediaFiles.length>0?((0,s.uX)(),(0,s.CE)("div",$," 已加载全部 ")):(0,s.Q3)("",!0)],512)],512)),W.previewVisible?((0,s.uX)(),(0,s.CE)("div",{key:3,class:"preview-modal",onClick:i[13]||(i[13]=(...e)=>K.handleModalClick&&K.handleModalClick(...e))},[(0,s.Lk)("button",{class:"preview-close",onClick:i[5]||(i[5]=(0,n.D$)((...e)=>K.closePreview&&K.closePreview(...e),["stop"]))},[...i[21]||(i[21]=[(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:"swipe-container",ref:"swipeContainer",onClick:i[7]||(i[7]=(0,n.D$)(()=>{},["stop"])),onTouchstartPassive:i[8]||(i[8]=(...e)=>K.onTouchStart&&K.onTouchStart(...e)),onTouchmove:i[9]||(i[9]=(...e)=>K.onTouchMove&&K.onTouchMove(...e)),onTouchend:i[10]||(i[10]=(...e)=>K.onTouchEnd&&K.onTouchEnd(...e))},[(0,s.Lk)("div",{class:"swipe-track",style:(0,o.Tr)(K.swipeTrackStyle)},[W.previewIndex>0?((0,s.uX)(),(0,s.CE)("div",z,[K.isImage(K.mediaFiles[W.previewIndex-1])?((0,s.uX)(),(0,s.CE)("img",{key:0,src:K.getFileUrl(K.mediaFiles[W.previewIndex-1].name),class:"preview-image"},null,8,D)):K.isVideo(K.mediaFiles[W.previewIndex-1])?((0,s.uX)(),(0,s.CE)("video",{key:1,src:K.getFileUrl(K.mediaFiles[W.previewIndex-1].name),muted:"",class:"preview-video"},null,8,H)):(0,s.Q3)("",!0)])):((0,s.uX)(),(0,s.CE)("div",V)),(0,s.Lk)("div",R,[K.currentPreviewFile&&K.isImage(K.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("img",{key:0,src:K.getFileUrl(K.currentPreviewFile.name),class:"preview-image",ref:"previewImg",onLoad:i[6]||(i[6]=(...e)=>K.onPreviewImageLoad&&K.onPreviewImageLoad(...e))},null,40,U)):K.currentPreviewFile&&K.isVideo(K.currentPreviewFile)?((0,s.uX)(),(0,s.CE)("video",{key:1,src:K.getFileUrl(K.currentPreviewFile.name),controls:"",autoplay:"",class:"preview-video"},null,8,A)):(0,s.Q3)("",!0)]),W.previewIndex0?((0,s.uX)(),(0,s.CE)("button",{key:0,class:"preview-prev desktop-only",onClick:i[11]||(i[11]=(0,n.D$)((...e)=>K.prevImage&&K.prevImage(...e),["stop"]))},[...i[22]||(i[22]=[(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),W.previewIndexK.nextImage&&K.nextImage(...e),["stop"]))},[...i[23]||(i[23]=[(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)("div",N,(0,o.v_)(W.previewIndex+1)+" / "+(0,o.v_)(K.mediaFiles.length),1)])):(0,s.Q3)("",!0)])}t(4114),t(8111),t(2489),t(7588),t(1701);var W=t(4373),K=t(8401),Y={name:"PublicBrowse",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],isMobile:!1,isLandscapeImage:!1,touchStartX:0,touchStartY:0,touchCurrentX:0,isSwiping:!1,swipeOffset:0,isAnimating:!1,justTouched:!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 i of this.mediaFiles){const t=i.columnIndex??0;twindow.innerWidth},onPreviewImageLoad(e){const i=e.target;this.isLandscapeImage=i.naturalWidth>1.2*i.naturalHeight},updateColumnCount(){const e=window.innerWidth;let i;i=e<600?2:e<900?3:4,i!==this.columnCount&&(this.columnCount=i,this.columnHeights=new Array(this.columnCount).fill(0),this.mediaFiles.forEach(e=>{e.columnIndex=void 0,this.assignToColumn(e)}))},getShortestColumn(){let e=0,i=this.columnHeights[0];for(let t=1;t{const i=e[0];i.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||"",i=Array.isArray(e)?e.join("/"):e;if(!i)return this.error="请指定要浏览的目录,例如: /browse/landscape",void(this.canRetry=!1);const t=i.split("/").filter(Boolean);this.rootDir=t[0],this.currentPath=i,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 W.A.get(`/api/public/list?dir=${encodeURIComponent(this.currentPath)}&count=${this.pageSize}`);e.data.allowedDirs&&(this.allowedDirs=e.data.allowedDirs);const i=(e.data.directories||[]).map(e=>({name:e,isFolder:!0})),t=(e.data.files||[]).map(e=>({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));t.forEach(e=>this.assignToColumn(e)),this.files=[...i,...t],this.totalCount=e.data.totalCount||this.files.length,this.hasMore=this.mediaFiles.length({name:e.name,isFolder:!1,metadata:e.metadata,columnIndex:void 0}));t.forEach(e=>this.assignToColumn(e)),this.files.push(...t),this.hasMore=this.mediaFiles.length{this.showToast("已复制")}).catch(()=>{const e=document.createElement("input");e.value=i,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),this.showToast("已复制")})},showToast(e){const i=document.querySelector(".copy-toast");i&&i.remove();const t=document.createElement("div");t.className="copy-toast",t.textContent=e,document.body.appendChild(t),setTimeout(()=>t.classList.add("show"),10),setTimeout(()=>{t.classList.remove("show"),setTimeout(()=>t.remove(),300)},1500)},downloadFile(e){const i=document.createElement("a");i.href=this.getFileUrl(e),i.download=e.split("/").pop(),i.click()},openPreview(e){if(e.isFolder)return;const i=this.mediaFiles.findIndex(i=>i.name===e.name);i>=0&&(this.previewIndex=i,this.previewVisible=!0,this.isLandscapeImage=!1,this.checkMobile(),document.body.style.overflow="hidden")},closePreview(){this.previewVisible=!1,document.body.style.overflow=""},prevImage(){this.previewIndex>0&&(this.previewIndex--,this.isLandscapeImage=!1)},nextImage(){this.previewIndex10&&Math.abs(t)>Math.abs(s)&&(this.isSwiping=!0),this.isSwiping){e.preventDefault(),this.touchCurrentX=i.clientX;let s=t;(0===this.previewIndex&&s>0||this.previewIndex===this.mediaFiles.length-1&&s<0)&&(s*=.3),this.swipeOffset=s}},onTouchEnd(){if(!this.isSwiping)return;const e=this.touchCurrentX-this.touchStartX,i=.2*window.innerWidth,t=Math.abs(e)/100;this.isSwiping=!1,this.isAnimating=!0,e<-i||e<-50&&t>.5?this.previewIndexi||e>50&&t>.5)&&this.previewIndex>0&&(this.previewIndex--,this.isLandscapeImage=!1),this.swipeOffset=0,setTimeout(()=>{this.isAnimating=!1,this.justTouched=!1},350)}}},q=t(1241);const G=(0,q.A)(Y,[["render",O],["__scopeId","data-v-151b62f8"]]);var J=G}}]); +//# sourceMappingURL=510.f9d8420a.js.map \ No newline at end of file diff --git a/js/510.f9d8420a.js.gz b/js/510.f9d8420a.js.gz new file mode 100644 index 0000000..851316f Binary files /dev/null and b/js/510.f9d8420a.js.gz differ diff --git a/js/510.f9d8420a.js.map b/js/510.f9d8420a.js.map new file mode 100644 index 0000000..caf9eab --- /dev/null +++ b/js/510.f9d8420a.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/510.f9d8420a.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/views/PublicBrowse.vue?28dc","webpack://sanyue_imghub/./src/views/PublicBrowse.vue","webpack://sanyue_imghub/./src/views/PublicBrowse.vue?bab5"],"sourcesContent":["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 } 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: 0,\n class: \"swipe-slide\"\n};\nconst _hoisted_30 = [\"src\"];\nconst _hoisted_31 = [\"src\"];\nconst _hoisted_32 = {\n key: 1,\n class: \"swipe-slide swipe-placeholder\"\n};\nconst _hoisted_33 = {\n class: \"swipe-slide swipe-current\"\n};\nconst _hoisted_34 = [\"src\"];\nconst _hoisted_35 = [\"src\"];\nconst _hoisted_36 = {\n key: 2,\n class: \"swipe-slide\"\n};\nconst _hoisted_37 = [\"src\"];\nconst _hoisted_38 = [\"src\"];\nconst _hoisted_39 = {\n key: 3,\n class: \"swipe-slide swipe-placeholder\"\n};\nconst _hoisted_40 = {\n class: \"page-indicator\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\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[14] || (_cache[14] = _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[15] || (_cache[15] = [_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[16] || (_cache[16] = _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[17] || (_cache[17] = [_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[18] || (_cache[18] = [_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[19] || (_cache[19] = [_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[20] || (_cache[20] = [_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)], 512)], 512)), $data.previewVisible ? (_openBlock(), _createElementBlock(\"div\", {\n key: 3,\n class: \"preview-modal\",\n onClick: _cache[13] || (_cache[13] = (...args) => $options.handleModalClick && $options.handleModalClick(...args))\n }, [_createElementVNode(\"button\", {\n class: \"preview-close\",\n onClick: _cache[5] || (_cache[5] = _withModifiers((...args) => $options.closePreview && $options.closePreview(...args), [\"stop\"]))\n }, [...(_cache[21] || (_cache[21] = [_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: \"swipe-container\",\n ref: \"swipeContainer\",\n onClick: _cache[7] || (_cache[7] = _withModifiers(() => {}, [\"stop\"])),\n onTouchstartPassive: _cache[8] || (_cache[8] = (...args) => $options.onTouchStart && $options.onTouchStart(...args)),\n onTouchmove: _cache[9] || (_cache[9] = (...args) => $options.onTouchMove && $options.onTouchMove(...args)),\n onTouchend: _cache[10] || (_cache[10] = (...args) => $options.onTouchEnd && $options.onTouchEnd(...args))\n }, [_createElementVNode(\"div\", {\n class: \"swipe-track\",\n style: _normalizeStyle($options.swipeTrackStyle)\n }, [$data.previewIndex > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [$options.isImage($options.mediaFiles[$data.previewIndex - 1]) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $options.getFileUrl($options.mediaFiles[$data.previewIndex - 1].name),\n class: \"preview-image\"\n }, null, 8, _hoisted_30)) : $options.isVideo($options.mediaFiles[$data.previewIndex - 1]) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: $options.getFileUrl($options.mediaFiles[$data.previewIndex - 1].name),\n muted: \"\",\n class: \"preview-video\"\n }, null, 8, _hoisted_31)) : _createCommentVNode(\"\", true)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32)), _createElementVNode(\"div\", _hoisted_33, [$options.currentPreviewFile && $options.isImage($options.currentPreviewFile) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $options.getFileUrl($options.currentPreviewFile.name),\n class: \"preview-image\",\n ref: \"previewImg\",\n onLoad: _cache[6] || (_cache[6] = (...args) => $options.onPreviewImageLoad && $options.onPreviewImageLoad(...args))\n }, null, 40, _hoisted_34)) : $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 }, null, 8, _hoisted_35)) : _createCommentVNode(\"\", true)]), $data.previewIndex < $options.mediaFiles.length - 1 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [$options.isImage($options.mediaFiles[$data.previewIndex + 1]) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: $options.getFileUrl($options.mediaFiles[$data.previewIndex + 1].name),\n class: \"preview-image\"\n }, null, 8, _hoisted_37)) : $options.isVideo($options.mediaFiles[$data.previewIndex + 1]) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: $options.getFileUrl($options.mediaFiles[$data.previewIndex + 1].name),\n muted: \"\",\n class: \"preview-video\"\n }, null, 8, _hoisted_38)) : _createCommentVNode(\"\", true)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_39))], 4)], 544), $data.previewIndex > 0 ? (_openBlock(), _createElementBlock(\"button\", {\n key: 0,\n class: \"preview-prev desktop-only\",\n onClick: _cache[11] || (_cache[11] = _withModifiers((...args) => $options.prevImage && $options.prevImage(...args), [\"stop\"]))\n }, [...(_cache[22] || (_cache[22] = [_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[12] || (_cache[12] = _withModifiers((...args) => $options.nextImage && $options.nextImage(...args), [\"stop\"]))\n }, [...(_cache[23] || (_cache[23] = [_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(\"div\", _hoisted_40, _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';\nexport default {\n name: 'PublicBrowse',\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 isMobile: false,\n isLandscapeImage: false,\n // 滑动相关\n touchStartX: 0,\n touchStartY: 0,\n touchCurrentX: 0,\n isSwiping: false,\n swipeOffset: 0,\n isAnimating: false,\n justTouched: 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 shouldRotate() {\n // 手机端竖屏 + 横屏图片 = 旋转90度\n return this.isMobile && this.isLandscapeImage;\n },\n swipeTrackStyle() {\n const offset = this.isSwiping ? this.swipeOffset : 0;\n // 基础位置是 -33.333%(显示中间的当前图片)\n return {\n transform: `translateX(calc(-33.333% + ${offset}px))`,\n transition: this.isSwiping ? 'none' : 'transform 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94)'\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 this.checkMobile();\n window.addEventListener('resize', this.updateColumnCount);\n window.addEventListener('resize', this.checkMobile);\n },\n beforeUnmount() {\n if (this.observer) {\n this.observer.disconnect();\n }\n window.removeEventListener('resize', this.updateColumnCount);\n window.removeEventListener('resize', this.checkMobile);\n },\n methods: {\n checkMobile() {\n // 检测是否为手机端竖屏模式\n this.isMobile = window.innerWidth < 768 && window.innerHeight > window.innerWidth;\n },\n onPreviewImageLoad(event) {\n const img = event.target;\n // 检测是否为横屏图片(宽度 > 高度 * 1.2)\n this.isLandscapeImage = img.naturalWidth > img.naturalHeight * 1.2;\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 // 重新分配所有文件到列\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\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 // 降级方案\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.isLandscapeImage = false; // 重置,等图片加载后再判断\n this.checkMobile();\n document.body.style.overflow = 'hidden';\n }\n },\n closePreview() {\n this.previewVisible = false;\n document.body.style.overflow = '';\n },\n prevImage() {\n if (this.previewIndex > 0) {\n this.previewIndex--;\n this.isLandscapeImage = false; // 重置,等新图片加载后再判断\n }\n },\n nextImage() {\n if (this.previewIndex < this.mediaFiles.length - 1) {\n this.previewIndex++;\n this.isLandscapeImage = false; // 重置,等新图片加载后再判断\n }\n },\n handleModalClick(e) {\n // 如果刚刚触摸过,忽略这次点击(防止触摸结束后触发click)\n if (this.justTouched) return;\n this.closePreview();\n },\n // 触摸滑动事件\n onTouchStart(e) {\n if (this.isAnimating) return;\n this.justTouched = true;\n const touch = e.touches[0];\n this.touchStartX = touch.clientX;\n this.touchStartY = touch.clientY;\n this.touchCurrentX = touch.clientX;\n this.isSwiping = false;\n this.swipeOffset = 0;\n },\n onTouchMove(e) {\n if (this.isAnimating) return;\n const touch = e.touches[0];\n const deltaX = touch.clientX - this.touchStartX;\n const deltaY = touch.clientY - this.touchStartY;\n\n // 判断是否为水平滑动(水平位移大于垂直位移)\n if (!this.isSwiping && Math.abs(deltaX) > 10) {\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n this.isSwiping = true;\n }\n }\n if (this.isSwiping) {\n e.preventDefault();\n this.touchCurrentX = touch.clientX;\n\n // 计算滑动偏移,添加边界阻尼\n let offset = deltaX;\n\n // 第一张往右滑 或 最后一张往左滑,添加阻尼效果\n if (this.previewIndex === 0 && offset > 0 || this.previewIndex === this.mediaFiles.length - 1 && offset < 0) {\n offset = offset * 0.3; // 阻尼系数\n }\n this.swipeOffset = offset;\n }\n },\n onTouchEnd() {\n if (!this.isSwiping) return;\n const deltaX = this.touchCurrentX - this.touchStartX;\n const threshold = window.innerWidth * 0.2; // 滑动超过20%屏幕宽度触发切换\n const velocity = Math.abs(deltaX) / 100; // 简单的速度判断\n\n this.isSwiping = false;\n this.isAnimating = true;\n\n // 判断是否切换\n if (deltaX < -threshold || deltaX < -50 && velocity > 0.5) {\n // 左滑 -> 下一张\n if (this.previewIndex < this.mediaFiles.length - 1) {\n this.previewIndex++;\n this.isLandscapeImage = false;\n }\n } else if (deltaX > threshold || deltaX > 50 && velocity > 0.5) {\n // 右滑 -> 上一张\n if (this.previewIndex > 0) {\n this.previewIndex--;\n this.isLandscapeImage = false;\n }\n }\n\n // 重置偏移\n this.swipeOffset = 0;\n\n // 动画结束后重置状态\n setTimeout(() => {\n this.isAnimating = false;\n this.justTouched = false;\n }, 350);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./PublicBrowse.vue?vue&type=template&id=151b62f8&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=151b62f8&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-151b62f8\"]])\n\nexport default __exports__"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","key","_hoisted_11","_hoisted_12","ref","_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","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","render","_ctx","_cache","$props","$setup","$data","$options","siteName","onClick","args","goToRoot","rootDirName","pathParts","part","index","$event","goToPath","totalCount","loading","files","length","error","canRetry","loadFiles","folders","folder","name","enterFolder","viewBox","fill","d","getFolderName","columns","column","colIndex","file","openPreview","loaded","isImage","src","getFileUrl","alt","onLoad","onImageLoad","onError","handleImageError","isVideo","muted","loop","preload","onLoadedmetadata","onVideoLoad","onMouseenter","target","play","onMouseleave","pause","copyLink","title","downloadFile","hasMore","mediaFiles","previewVisible","handleModalClick","closePreview","onTouchstartPassive","onTouchStart","onTouchmove","onTouchMove","onTouchend","onTouchEnd","style","swipeTrackStyle","previewIndex","currentPreviewFile","onPreviewImageLoad","controls","autoplay","prevImage","nextImage","data","allowedDirs","rootDir","currentPath","observer","pageSize","columnCount","columnHeights","isMobile","isLandscapeImage","touchStartX","touchStartY","touchCurrentX","isSwiping","swipeOffset","isAnimating","justTouched","computed","this","userConfig","siteTitle","split","filter","Boolean","pop","relative","replace","f","isFolder","cols","Array","from","idx","columnIndex","push","shouldRotate","offset","transform","transition","watch","handler","initFromRoute","mounted","setupIntersectionObserver","updateColumnCount","checkMobile","window","addEventListener","beforeUnmount","disconnect","removeEventListener","methods","innerWidth","innerHeight","event","img","naturalWidth","naturalHeight","width","newCount","forEach","undefined","assignToColumn","getShortestColumn","minIndex","minHeight","i","height","ratio","video","videoHeight","videoWidth","IntersectionObserver","entries","entry","isIntersecting","loadMore","rootMargin","observeLoadTrigger","$nextTick","$refs","loadTrigger","observe","dirParam","$route","params","dir","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","e","display","url","navigator","clipboard","writeText","then","showToast","catch","input","document","createElement","value","body","appendChild","select","execCommand","removeChild","existing","querySelector","remove","toast","className","textContent","setTimeout","classList","add","link","href","download","click","mediaIndex","findIndex","overflow","touch","touches","clientX","clientY","deltaX","deltaY","Math","abs","preventDefault","threshold","velocity","__exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/js/510.f9d8420a.js.map.gz b/js/510.f9d8420a.js.map.gz new file mode 100644 index 0000000..6e04180 Binary files /dev/null and b/js/510.f9d8420a.js.map.gz differ diff --git a/js/app.e9f07d34.js b/js/app.e9f07d34.js new file mode 100644 index 0000000..6316106 --- /dev/null +++ b/js/app.e9f07d34.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),f={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)}}},m=o(1241);const h=(0,m.A)(f,[["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(818)]).then(o.bind(o,7878)),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(643)]).then(o.bind(o,6643)),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(510).then(o.bind(o,6510))},{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+"."+{171:"833208d0",226:"577ea134",239:"32572dba",419:"99e00aec",482:"e302adaf",510:"f9d8420a",643:"d1f24e26",672:"11bec4e1",698:"77f859a8",818:"f84df3cc",845:"6b4cb4a5",917:"5bf3db27"}[e]+".js"}}(),function(){o.miniCssF=function(e){return"css/"+e+"."+{226:"6548e7b4",239:"6563616d",419:"1d235d6e",482:"f42e1415",510:"55072d4d",643:"74c1c29d",672:"aed3581b",698:"aed3581b",818:"4f4f6da5",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"),c=0;c {\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 + \".\" + {\"171\":\"833208d0\",\"226\":\"577ea134\",\"239\":\"32572dba\",\"419\":\"99e00aec\",\"482\":\"e302adaf\",\"510\":\"f9d8420a\",\"643\":\"d1f24e26\",\"672\":\"11bec4e1\",\"698\":\"77f859a8\",\"818\":\"f84df3cc\",\"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 + \".\" + {\"226\":\"6548e7b4\",\"239\":\"6563616d\",\"419\":\"1d235d6e\",\"482\":\"f42e1415\",\"510\":\"55072d4d\",\"643\":\"74c1c29d\",\"672\":\"aed3581b\",\"698\":\"aed3581b\",\"818\":\"4f4f6da5\",\"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 = {\"226\":1,\"239\":1,\"419\":1,\"482\":1,\"510\":1,\"643\":1,\"672\":1,\"698\":1,\"818\":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.e9f07d34.js.map.gz b/js/app.e9f07d34.js.map.gz new file mode 100644 index 0000000..e3d4858 Binary files /dev/null and b/js/app.e9f07d34.js.map.gz differ