diff --git a/gradle.properties b/gradle.properties index 6d41bff..cc6016e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=1.3.1 +version=1.3.2 diff --git a/src/main/resources/console/chunks/631.d30af8f8.css b/src/main/resources/console/chunks/216.7732423c.css similarity index 90% rename from src/main/resources/console/chunks/631.d30af8f8.css rename to src/main/resources/console/chunks/216.7732423c.css index 8ff95b3..4c72ccf 100644 --- a/src/main/resources/console/chunks/631.d30af8f8.css +++ b/src/main/resources/console/chunks/216.7732423c.css @@ -1 +1 @@ -.resource-form[data-v-e4a7554b]{flex-direction:column;gap:14px;display:flex}.form-item[data-v-e4a7554b]{justify-content:space-between;align-items:center;gap:12px;display:flex}.form-item--column[data-v-e4a7554b]{flex-direction:column;align-items:stretch;gap:6px}.form-label[data-v-e4a7554b]{color:#374151;font-size:14px}.required[data-v-e4a7554b]{color:#dc2626}.form-input[data-v-e4a7554b]{box-sizing:border-box;border:1px solid #d1d5db;border-radius:4px;outline:none;width:100%;padding:6px 10px;font-size:14px}.form-input[data-v-e4a7554b]:focus{border-color:#2563eb}.form-input[data-v-e4a7554b]:disabled{color:#6b7280;cursor:not-allowed;background:#f3f4f6}.form-hint[data-v-e4a7554b]{color:#9ca3af;font-size:12px}.attachment-picker[data-v-e4a7554b]{align-items:center;gap:10px;display:flex}.attachment-name[data-v-e4a7554b]{color:#374151;text-overflow:ellipsis;white-space:nowrap;max-width:380px;font-size:13px;overflow:hidden}.records-toolbar[data-v-45b20d48]{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.table-wrapper[data-v-45b20d48]{overflow-x:auto}.records-table[data-v-45b20d48]{border-collapse:collapse;width:100%;font-size:14px}.records-table th[data-v-45b20d48],.records-table td[data-v-45b20d48]{text-align:left;white-space:nowrap;border-bottom:1px solid #f0f0f0;padding:8px 12px}.records-table th[data-v-45b20d48]{color:#6b7280;background:#fafafa;font-weight:500}.ua-cell[data-v-45b20d48]{text-overflow:ellipsis;max-width:260px;overflow:hidden}.records-pagination[data-v-45b20d48]{justify-content:flex-end;margin-top:12px;display:flex}.card-toolbar[data-v-9127f5d6]{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.table-wrapper[data-v-9127f5d6]{overflow-x:auto}.resource-table[data-v-9127f5d6]{border-collapse:collapse;width:100%;font-size:14px}.resource-table th[data-v-9127f5d6],.resource-table td[data-v-9127f5d6]{text-align:left;vertical-align:middle;white-space:nowrap;border-bottom:1px solid #f0f0f0;padding:10px 12px}.resource-table th[data-v-9127f5d6]{color:#6b7280;background:#fafafa;font-weight:500}.link-cell[data-v-9127f5d6]{align-items:center;gap:8px;display:flex}.link-code[data-v-9127f5d6]{background:#f3f4f6;border-radius:4px;padding:2px 6px;font-size:12px}.cell-ellipsis[data-v-9127f5d6]{text-overflow:ellipsis;max-width:180px;overflow:hidden}.desc-line[data-v-9127f5d6]{text-overflow:ellipsis;white-space:nowrap;max-width:200px;overflow:hidden}.refs-row td[data-v-9127f5d6]{white-space:normal;background:#fafafa}.refs-empty[data-v-9127f5d6]{padding:4px 0}.refs-list[data-v-9127f5d6]{margin:0;padding:0;list-style:none}.refs-list li[data-v-9127f5d6]{align-items:center;gap:12px;padding:4px 0;display:flex}.refs-title[data-v-9127f5d6]{font-weight:500}.refs-link[data-v-9127f5d6]{color:#2563eb;align-items:center;gap:2px;font-size:13px;text-decoration:none;display:inline-flex}.refs-link[data-v-9127f5d6]:hover{text-decoration:underline}.link-form[data-v-760eafaf]{flex-direction:column;gap:14px;display:flex}.form-item[data-v-760eafaf]{justify-content:space-between;align-items:center;gap:12px;display:flex}.form-item--column[data-v-760eafaf]{flex-direction:column;align-items:stretch;gap:6px}.form-label[data-v-760eafaf]{color:#374151;font-size:14px}.required[data-v-760eafaf]{color:#dc2626}.form-input[data-v-760eafaf]{box-sizing:border-box;border:1px solid #d1d5db;border-radius:4px;outline:none;width:100%;padding:6px 10px;font-size:14px}.form-input[data-v-760eafaf]:focus{border-color:#2563eb}.form-input[data-v-760eafaf]:disabled{color:#6b7280;cursor:not-allowed;background:#f3f4f6}.form-hint[data-v-760eafaf]{color:#9ca3af;font-size:12px}.card-toolbar[data-v-e1bcba19]{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.table-wrapper[data-v-e1bcba19]{overflow-x:auto}.link-table[data-v-e1bcba19]{border-collapse:collapse;width:100%;font-size:14px}.link-table th[data-v-e1bcba19],.link-table td[data-v-e1bcba19]{text-align:left;vertical-align:middle;white-space:nowrap;border-bottom:1px solid #f0f0f0;padding:10px 12px}.link-table th[data-v-e1bcba19]{color:#6b7280;background:#fafafa;font-weight:500}.link-cell[data-v-e1bcba19]{align-items:center;gap:8px;display:flex}.link-code[data-v-e1bcba19]{background:#f3f4f6;border-radius:4px;padding:2px 6px;font-size:12px}.target-link[data-v-e1bcba19]{text-overflow:ellipsis;color:#2563eb;align-items:center;gap:4px;max-width:220px;text-decoration:none;display:inline-flex;overflow:hidden}.target-link[data-v-e1bcba19]:hover{text-decoration:underline}.desc-line[data-v-e1bcba19]{text-overflow:ellipsis;white-space:nowrap;max-width:200px;overflow:hidden}.refs-row td[data-v-e1bcba19]{white-space:normal;background:#fafafa}.refs-empty[data-v-e1bcba19]{padding:4px 0}.refs-list[data-v-e1bcba19]{margin:0;padding:0;list-style:none}.refs-list li[data-v-e1bcba19]{align-items:center;gap:12px;padding:4px 0;display:flex}.refs-title[data-v-e1bcba19]{font-weight:500}.refs-link[data-v-e1bcba19]{color:#2563eb;align-items:center;gap:2px;font-size:13px;text-decoration:none;display:inline-flex}.refs-link[data-v-e1bcba19]:hover{text-decoration:underline}.resource-manager__body[data-v-2715b11d]{margin-top:12px} \ No newline at end of file +.resource-form[data-v-e4a7554b]{flex-direction:column;gap:14px;display:flex}.form-item[data-v-e4a7554b]{justify-content:space-between;align-items:center;gap:12px;display:flex}.form-item--column[data-v-e4a7554b]{flex-direction:column;align-items:stretch;gap:6px}.form-label[data-v-e4a7554b]{color:#374151;font-size:14px}.required[data-v-e4a7554b]{color:#dc2626}.form-input[data-v-e4a7554b]{box-sizing:border-box;border:1px solid #d1d5db;border-radius:4px;outline:none;width:100%;padding:6px 10px;font-size:14px}.form-input[data-v-e4a7554b]:focus{border-color:#2563eb}.form-input[data-v-e4a7554b]:disabled{color:#6b7280;cursor:not-allowed;background:#f3f4f6}.form-hint[data-v-e4a7554b]{color:#9ca3af;font-size:12px}.attachment-picker[data-v-e4a7554b]{align-items:center;gap:10px;display:flex}.attachment-name[data-v-e4a7554b]{color:#374151;text-overflow:ellipsis;white-space:nowrap;max-width:380px;font-size:13px;overflow:hidden}.records-toolbar[data-v-11be3fec]{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.table-wrapper[data-v-11be3fec]{overflow-x:auto}.records-table[data-v-11be3fec]{border-collapse:collapse;width:100%;font-size:14px}.records-table th[data-v-11be3fec],.records-table td[data-v-11be3fec]{text-align:left;white-space:nowrap;border-bottom:1px solid #f0f0f0;padding:8px 12px}.records-table th[data-v-11be3fec]{color:#6b7280;background:#fafafa;font-weight:500}.ua-cell[data-v-11be3fec]{text-overflow:ellipsis;max-width:260px;overflow:hidden}.records-pagination[data-v-11be3fec]{justify-content:flex-end;margin-top:12px;display:flex}.card-toolbar[data-v-9127f5d6]{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.table-wrapper[data-v-9127f5d6]{overflow-x:auto}.resource-table[data-v-9127f5d6]{border-collapse:collapse;width:100%;font-size:14px}.resource-table th[data-v-9127f5d6],.resource-table td[data-v-9127f5d6]{text-align:left;vertical-align:middle;white-space:nowrap;border-bottom:1px solid #f0f0f0;padding:10px 12px}.resource-table th[data-v-9127f5d6]{color:#6b7280;background:#fafafa;font-weight:500}.link-cell[data-v-9127f5d6]{align-items:center;gap:8px;display:flex}.link-code[data-v-9127f5d6]{background:#f3f4f6;border-radius:4px;padding:2px 6px;font-size:12px}.cell-ellipsis[data-v-9127f5d6]{text-overflow:ellipsis;max-width:180px;overflow:hidden}.desc-line[data-v-9127f5d6]{text-overflow:ellipsis;white-space:nowrap;max-width:200px;overflow:hidden}.refs-row td[data-v-9127f5d6]{white-space:normal;background:#fafafa}.refs-empty[data-v-9127f5d6]{padding:4px 0}.refs-list[data-v-9127f5d6]{margin:0;padding:0;list-style:none}.refs-list li[data-v-9127f5d6]{align-items:center;gap:12px;padding:4px 0;display:flex}.refs-title[data-v-9127f5d6]{font-weight:500}.refs-link[data-v-9127f5d6]{color:#2563eb;align-items:center;gap:2px;font-size:13px;text-decoration:none;display:inline-flex}.refs-link[data-v-9127f5d6]:hover{text-decoration:underline}.link-form[data-v-760eafaf]{flex-direction:column;gap:14px;display:flex}.form-item[data-v-760eafaf]{justify-content:space-between;align-items:center;gap:12px;display:flex}.form-item--column[data-v-760eafaf]{flex-direction:column;align-items:stretch;gap:6px}.form-label[data-v-760eafaf]{color:#374151;font-size:14px}.required[data-v-760eafaf]{color:#dc2626}.form-input[data-v-760eafaf]{box-sizing:border-box;border:1px solid #d1d5db;border-radius:4px;outline:none;width:100%;padding:6px 10px;font-size:14px}.form-input[data-v-760eafaf]:focus{border-color:#2563eb}.form-input[data-v-760eafaf]:disabled{color:#6b7280;cursor:not-allowed;background:#f3f4f6}.form-hint[data-v-760eafaf]{color:#9ca3af;font-size:12px}.card-toolbar[data-v-e1bcba19]{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.table-wrapper[data-v-e1bcba19]{overflow-x:auto}.link-table[data-v-e1bcba19]{border-collapse:collapse;width:100%;font-size:14px}.link-table th[data-v-e1bcba19],.link-table td[data-v-e1bcba19]{text-align:left;vertical-align:middle;white-space:nowrap;border-bottom:1px solid #f0f0f0;padding:10px 12px}.link-table th[data-v-e1bcba19]{color:#6b7280;background:#fafafa;font-weight:500}.link-cell[data-v-e1bcba19]{align-items:center;gap:8px;display:flex}.link-code[data-v-e1bcba19]{background:#f3f4f6;border-radius:4px;padding:2px 6px;font-size:12px}.target-link[data-v-e1bcba19]{text-overflow:ellipsis;color:#2563eb;align-items:center;gap:4px;max-width:220px;text-decoration:none;display:inline-flex;overflow:hidden}.target-link[data-v-e1bcba19]:hover{text-decoration:underline}.desc-line[data-v-e1bcba19]{text-overflow:ellipsis;white-space:nowrap;max-width:200px;overflow:hidden}.refs-row td[data-v-e1bcba19]{white-space:normal;background:#fafafa}.refs-empty[data-v-e1bcba19]{padding:4px 0}.refs-list[data-v-e1bcba19]{margin:0;padding:0;list-style:none}.refs-list li[data-v-e1bcba19]{align-items:center;gap:12px;padding:4px 0;display:flex}.refs-title[data-v-e1bcba19]{font-weight:500}.refs-link[data-v-e1bcba19]{color:#2563eb;align-items:center;gap:2px;font-size:13px;text-decoration:none;display:inline-flex}.refs-link[data-v-e1bcba19]:hover{text-decoration:underline}.resource-manager__body[data-v-2715b11d]{margin-top:12px} \ No newline at end of file diff --git a/src/main/resources/console/chunks/216.a71ca438.js b/src/main/resources/console/chunks/216.a71ca438.js new file mode 100644 index 0000000..6346f7b --- /dev/null +++ b/src/main/resources/console/chunks/216.a71ca438.js @@ -0,0 +1 @@ +"use strict";(window.rspackChunksharelink=window.rspackChunksharelink||[]).push([[216],{"./node_modules/.pnpm/rspack-vue-loader@17.6.1_@rspack+core@2.1.7_@swc+helpers@0.5.23__@vue+compiler-sfc@3.5.40_vue@3.5.40_typescript@5.8.3_/node_modules/rspack-vue-loader/dist/exportHelper.js"(e,t){t.A=(e,t)=>{let a=e.__vccOpts||e;for(let[e,l]of t)a[e]=l;return a}},"./src/views/ResourceManager.vue"(e,t,a){a.r(t),a.d(t,{default:()=>eJ});var l=a("vue"),n=a("@halo-dev/components"),r=a("@halo-dev/api-client");let o="/apis/console.api.sharelink.halo.run/v1alpha1";function i(e){return{metadata:{name:e.name,creationTimestamp:e.creationTimestamp},spec:{slug:e.slug,displayName:e.displayName,description:e.description,attachmentName:e.attachmentName,requireEmailVerify:e.requireEmailVerify,enabled:e.enabled},status:{downloadCount:e.stats?.downloadCount??0},stats:{downloaderCount:e.stats?.downloaderCount??0,referenceCount:e.stats?.referenceCount??0}}}async function c(){let{data:e}=await r.axiosInstance.get(`${o}/download-resources`),t=(e??[]).map(i);return{items:t,total:t.length}}async function s(e){let{data:t}=await r.axiosInstance.post(`${o}/download-resources`,e);return i(t)}async function d(e,t){let{data:a}=await r.axiosInstance.put(`${o}/download-resources/${e}`,t);return i(a)}async function u(e){await r.axiosInstance.delete(`${o}/download-resources/${e}`)}async function m(e){let{data:t}=await r.axiosInstance.get(`${o}/download-records`,{params:e});return t}async function p(e){await r.axiosInstance.delete(`${o}/download-records/${e}`)}async function f(){let{data:e}=await r.axiosInstance.get(`${o}/references`);return e}async function v(){let{data:e}=await r.axiosInstance.post(`${o}/references/-/refresh`);return e}function V(e){return{metadata:{name:e.name,creationTimestamp:e.creationTimestamp},spec:{slug:e.slug,displayName:e.displayName,description:e.description,targetUrl:e.targetUrl,requireEmailVerify:e.requireEmailVerify,enabled:e.enabled},status:{visitCount:e.stats?.visitCount??0},stats:{visitorCount:e.stats?.visitorCount??0,referenceCount:e.stats?.referenceCount??0}}}async function N(){let{data:e}=await r.axiosInstance.get(`${o}/protected-links`),t=(e??[]).map(V);return{items:t,total:t.length}}async function y(e){let{data:t}=await r.axiosInstance.post(`${o}/protected-links`,e);return V(t)}async function g(e,t){let{data:a}=await r.axiosInstance.put(`${o}/protected-links/${e}`,t);return V(a)}async function h(e){await r.axiosInstance.delete(`${o}/protected-links/${e}`)}async function k(e){let{data:t}=await r.axiosInstance.get(`${o}/link-visit-records`,{params:e});return t}async function E(e){await r.axiosInstance.delete(`${o}/link-visit-records/${e}`)}async function w(){let{data:e}=await r.axiosInstance.get(`${o}/link-references`);return e}async function x(){let{data:e}=await r.axiosInstance.post(`${o}/link-references/-/refresh`);return e}let b={class:"resource-form"},C={class:"form-item form-item--column"},B={class:"form-item form-item--column"},T=["disabled"],_={key:0,class:"form-hint"},S={key:1,class:"form-hint"},$={class:"form-item form-item--column"},D={class:"form-item form-item--column"},I={class:"attachment-picker"},U=["title"],q={key:1,class:"text-sm text-gray-400"},z={class:"form-item"},L={class:"form-item"};var M=(0,l.defineComponent)({__name:"ResourceFormModal",props:{visible:{type:Boolean},resource:{}},emits:["update:visible","saved"],setup(e,t){let{emit:a}=t,r=/^[a-z0-9][a-z0-9-]{0,63}$/,o=(0,l.computed)(()=>null!==e.resource),i=(0,l.ref)({slug:"",displayName:"",description:"",attachmentName:"",requireEmailVerify:!1,enabled:!0}),c=(0,l.ref)(null),u=(0,l.ref)(!1),m=(0,l.ref)(!1);function p(){a("update:visible",!1)}function f(e){let t=e?.[0],a=t?.metadata?.name;if(t&&a){if(c.value=t,i.value.attachmentName=a,!o.value&&!i.value.slug){let e,l=t.spec?.displayName??a;i.value.slug=(e=l.replace(/\.[^.]+$/,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64).replace(/^-+|-+$/g,""),(r.test(e)?e:"")||Math.random().toString(36).slice(2,10))}u.value=!1}}(0,l.watch)(()=>e.visible,t=>{if(t)if(c.value=null,e.resource){let t=e.resource.spec;i.value={slug:t.slug,displayName:t.displayName,description:t.description??"",attachmentName:t.attachmentName??"",requireEmailVerify:t.requireEmailVerify??!1,enabled:t.enabled??!0}}else i.value={slug:"",displayName:"",description:"",attachmentName:"",requireEmailVerify:!1,enabled:!0}});let v=(0,l.computed)(()=>{if(c.value){var e;let t=c.value.spec?.displayName??c.value.metadata?.name??"",a=(e=c.value.spec?.size)&&!(e<=0)?e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:e<0x40000000?`${(e/1024/1024).toFixed(1)} MB`:`${(e/1024/1024/1024).toFixed(2)} GB`:"";return a?`${t}(${a})`:t}return i.value.attachmentName||""});async function V(){let t=i.value.displayName.trim(),l=i.value.slug.trim();if(!t)return void n.Toast.warning("请填写资源名称");if(!l)return void n.Toast.warning("请填写 slug");if(!o.value&&!r.test(l))return void n.Toast.warning("slug 只能包含小写字母、数字和中划线,且必须以字母或数字开头(最长 64 位)");m.value=!0;try{if(o.value&&e.resource){let l={...e.resource.spec,displayName:t,description:i.value.description?.trim()??"",attachmentName:i.value.attachmentName,requireEmailVerify:i.value.requireEmailVerify,enabled:i.value.enabled},r=await d(e.resource.metadata.name,l);n.Toast.success("资源已更新"),a("saved",r,!1)}else{let e=await s({slug:l,displayName:t,description:i.value.description?.trim()??"",attachmentName:i.value.attachmentName,requireEmailVerify:i.value.requireEmailVerify,enabled:i.value.enabled});n.Toast.success("资源已创建"),a("saved",e,!0)}p()}catch(e){n.Toast.error(e?.response?.data?.detail||e?.response?.data?.title||e?.message||"保存失败,请稍后重试")}finally{m.value=!1}}return(t,r)=>{let c=(0,l.resolveComponent)("AttachmentSelectorModal");return(0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,null,[(0,l.createVNode)((0,l.unref)(n.VModal),{visible:e.visible,title:o.value?"编辑下载资源":"新建下载资源",width:640,"onUpdate:visible":r[6]||(r[6]=e=>a("update:visible",e)),onClose:p},{footer:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{type:"primary",loading:m.value,onClick:V},{default:(0,l.withCtx)(()=>[...r[15]||(r[15]=[(0,l.createTextVNode)(" 保存 ",-1)])]),_:1},8,["loading"]),(0,l.createVNode)((0,l.unref)(n.VButton),{type:"default",onClick:p},{default:(0,l.withCtx)(()=>[...r[16]||(r[16]=[(0,l.createTextVNode)("取消",-1)])]),_:1})]),default:(0,l.withCtx)(()=>[(0,l.createElementVNode)("div",b,[(0,l.createElementVNode)("div",C,[r[8]||(r[8]=(0,l.createElementVNode)("label",{class:"form-label"},[(0,l.createTextVNode)(" 资源名称 "),(0,l.createElementVNode)("span",{class:"required"},"*")],-1)),(0,l.withDirectives)((0,l.createElementVNode)("input",{"onUpdate:modelValue":r[0]||(r[0]=e=>i.value.displayName=e),class:"form-input",type:"text",placeholder:"例如:产品白皮书 PDF"},null,512),[[l.vModelText,i.value.displayName]])]),(0,l.createElementVNode)("div",B,[r[9]||(r[9]=(0,l.createElementVNode)("label",{class:"form-label"},[(0,l.createTextVNode)(" slug "),(0,l.createElementVNode)("span",{class:"required"},"*")],-1)),(0,l.withDirectives)((0,l.createElementVNode)("input",{"onUpdate:modelValue":r[1]||(r[1]=e=>i.value.slug=e),class:"form-input",type:"text",disabled:o.value,placeholder:"例如:whitepaper-2024(下载链接为 /download/{slug})"},null,8,T),[[l.vModelText,i.value.slug]]),o.value?((0,l.openBlock)(),(0,l.createElementBlock)("div",_,"slug 创建后不可修改")):((0,l.openBlock)(),(0,l.createElementBlock)("div",S," 小写字母、数字、中划线,以字母或数字开头,最长 64 位 "))]),(0,l.createElementVNode)("div",$,[r[10]||(r[10]=(0,l.createElementVNode)("label",{class:"form-label"},"描述",-1)),(0,l.withDirectives)((0,l.createElementVNode)("textarea",{"onUpdate:modelValue":r[2]||(r[2]=e=>i.value.description=e),class:"form-input",rows:"3",placeholder:"可选,资源用途说明"},null,512),[[l.vModelText,i.value.description]])]),(0,l.createElementVNode)("div",D,[r[12]||(r[12]=(0,l.createElementVNode)("label",{class:"form-label"},"附件",-1)),(0,l.createElementVNode)("div",I,[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",onClick:r[3]||(r[3]=e=>u.value=!0)},{default:(0,l.withCtx)(()=>[...r[11]||(r[11]=[(0,l.createTextVNode)(" 选择附件 ",-1)])]),_:1}),v.value?((0,l.openBlock)(),(0,l.createElementBlock)("span",{key:0,class:"attachment-name",title:i.value.attachmentName},(0,l.toDisplayString)(v.value),9,U)):((0,l.openBlock)(),(0,l.createElementBlock)("span",q,"未选择"))])]),(0,l.createElementVNode)("div",z,[r[13]||(r[13]=(0,l.createElementVNode)("span",{class:"form-label"},"需要邮箱验证",-1)),(0,l.createVNode)((0,l.unref)(n.VSwitch),{modelValue:i.value.requireEmailVerify,"onUpdate:modelValue":r[4]||(r[4]=e=>i.value.requireEmailVerify=e)},null,8,["modelValue"])]),(0,l.createElementVNode)("div",L,[r[14]||(r[14]=(0,l.createElementVNode)("span",{class:"form-label"},"启用",-1)),(0,l.createVNode)((0,l.unref)(n.VSwitch),{modelValue:i.value.enabled,"onUpdate:modelValue":r[5]||(r[5]=e=>i.value.enabled=e)},null,8,["modelValue"])])])]),_:1},8,["visible","title"]),(0,l.createVNode)(c,{visible:u.value,"onUpdate:visible":r[7]||(r[7]=e=>u.value=e),onSelect:f},null,8,["visible"])],64)}}}),F=a("./node_modules/.pnpm/rspack-vue-loader@17.6.1_@rspack+core@2.1.7_@swc+helpers@0.5.23__@vue+compiler-sfc@3.5.40_vue@3.5.40_typescript@5.8.3_/node_modules/rspack-vue-loader/dist/exportHelper.js");let A=(0,F.A)(M,[["__scopeId","data-v-e4a7554b"]]),R={class:"records-toolbar"},P={class:"text-sm text-gray-500"},H={class:"table-wrapper"},j={class:"records-table"},G=["title"],K={class:"records-pagination"};var O=(0,l.defineComponent)({__name:"RecordsDrawer",props:{visible:{type:Boolean},resource:{},kind:{}},emits:["update:visible"],setup(e,t){let{emit:a}=t,r=(0,l.computed)(()=>"link"===e.kind),i=(0,l.ref)([]),c=(0,l.ref)(!1),s=(0,l.ref)(1),d=(0,l.ref)(20),u=(0,l.ref)(0),f=new Set;function v(e){return e?.response?.data?.detail||e?.response?.data?.title||e?.message||"请求失败,请稍后重试"}async function V(){if(e.resource){c.value=!0;try{let t=e.resource.spec.slug??"",a={page:s.value,size:d.value},l=r.value?await k({...a,linkSlug:t}):await m({...a,resourceSlug:t});i.value=(l.items??[]).filter(e=>!f.has(e.metadata.name)).map(e=>({metadata:{name:e.metadata.name},spec:{email:e.spec.email,ip:e.spec.ip,userAgent:e.spec.userAgent,time:"visitedAt"in e.spec?e.spec.visitedAt:e.spec.downloadedAt}})),u.value=l.total??0}catch(e){n.Toast.error(v(e))}finally{c.value=!1}}}function N(){var t,a;let l,n,i=r.value?(l=(t=e.resource?.spec.slug)?`?linkSlug=${encodeURIComponent(t)}`:"",`${o}/link-visit-records/-/export${l}`):(n=(a=e.resource?.spec.slug)?`?resourceSlug=${encodeURIComponent(a)}`:"",`${o}/download-records/-/export${n}`);window.open(i,"_blank")}return(0,l.watch)(()=>[e.visible,e.resource?.metadata.name],e=>{let[t]=e;t&&(s.value=1,V())}),(t,o)=>((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VModal),{visible:e.visible,title:`${r.value?"访问":"下载"}记录${e.resource?` - ${e.resource.spec.displayName}`:""}`,width:960,"mount-to-body":"","onUpdate:visible":o[2]||(o[2]=e=>a("update:visible",e)),onClose:o[3]||(o[3]=e=>a("update:visible",!1))},{default:(0,l.withCtx)(()=>[(0,l.createElementVNode)("div",R,[(0,l.createElementVNode)("div",P,"共 "+(0,l.toDisplayString)(u.value)+" 条记录",1),(0,l.createVNode)((0,l.unref)(n.VSpace),null,{default:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",onClick:N},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRiUpload2Fill))]),default:(0,l.withCtx)(()=>[o[4]||(o[4]=(0,l.createTextVNode)(" 导出 CSV ",-1))]),_:1}),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"secondary",loading:c.value,onClick:V},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRefreshLine))]),default:(0,l.withCtx)(()=>[o[5]||(o[5]=(0,l.createTextVNode)(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),(0,l.withDirectives)((0,l.createVNode)((0,l.unref)(n.VLoading),null,null,512),[[l.vShow,c.value]]),(0,l.withDirectives)((0,l.createVNode)((0,l.unref)(n.VEmpty),{title:r.value?"暂无访问记录":"暂无下载记录",message:r.value?"该链接还没有产生访问":"该资源还没有产生下载"},null,8,["title","message"]),[[l.vShow,!c.value&&0===i.value.length]]),(0,l.withDirectives)((0,l.createElementVNode)("div",H,[(0,l.createElementVNode)("table",j,[o[7]||(o[7]=(0,l.createElementVNode)("thead",null,[(0,l.createElementVNode)("tr",null,[(0,l.createElementVNode)("th",null,"时间"),(0,l.createElementVNode)("th",null,"邮箱"),(0,l.createElementVNode)("th",null,"IP"),(0,l.createElementVNode)("th",null,"User-Agent"),(0,l.createElementVNode)("th",{class:"w-24"},"操作")])],-1)),(0,l.createElementVNode)("tbody",null,[((0,l.openBlock)(!0),(0,l.createElementBlock)(l.Fragment,null,(0,l.renderList)(i.value,e=>((0,l.openBlock)(),(0,l.createElementBlock)("tr",{key:e.metadata.name},[(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(function(e){if(!e)return"-";let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString("zh-CN",{hour12:!1})}(e.spec.time)),1),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.spec.email||"匿名"),1),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.spec.ip||"-"),1),(0,l.createElementVNode)("td",{class:"ua-cell",title:e.spec.userAgent},(0,l.toDisplayString)(e.spec.userAgent||"-"),9,G),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"danger",ghost:"",onClick:t=>{n.Dialog.warning({title:r.value?"删除访问记录":"删除下载记录",description:"确定要删除这条记录吗?删除后不可恢复。",confirmType:"danger",confirmText:"删除",cancelText:"取消",onConfirm:async()=>{try{r.value?await E(e.metadata.name):await p(e.metadata.name),1===i.value.length&&s.value>1&&(s.value-=1),f.add(e.metadata.name),setTimeout(()=>f.delete(e.metadata.name),3e3),i.value=i.value.filter(t=>t.metadata.name!==e.metadata.name),n.Toast.success("记录已删除"),V()}catch(e){n.Toast.error(v(e))}}})}},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconDeleteBin))]),default:(0,l.withCtx)(()=>[o[6]||(o[6]=(0,l.createTextVNode)(" 删除 ",-1))]),_:1},8,["onClick"])])]))),128))])])],512),[[l.vShow,!c.value&&i.value.length>0]]),(0,l.withDirectives)((0,l.createElementVNode)("div",K,[(0,l.createVNode)((0,l.unref)(n.VPagination),{page:s.value,"onUpdate:page":o[0]||(o[0]=e=>s.value=e),size:d.value,"onUpdate:size":o[1]||(o[1]=e=>d.value=e),total:u.value,"size-options":[20,50,100],"show-total":"",onChange:V},null,8,["page","size","total"])],512),[[l.vShow,u.value>0]])]),_:1},8,["visible","title"]))}});let J=(0,F.A)(O,[["__scopeId","data-v-11be3fec"]]),Q={class:"download-manager-page m-4"},W={class:"card-toolbar"},X={class:"text-sm text-gray-500"},Y={key:2,class:"table-wrapper"},Z={class:"resource-table"},ee={class:"font-medium"},et=["title"],ea={class:"link-cell"},el={class:"link-code"},en=["title"],er={key:0,class:"refs-row"},eo={colspan:"9"},ei={key:0,class:"text-sm text-gray-400 refs-empty"},ec={key:1,class:"refs-list"},es={class:"refs-title"},ed=["href"],eu=["href"];var em=(0,l.defineComponent)({__name:"DownloadManager",props:{embedded:{type:Boolean}},setup(e){let t=(0,l.ref)([]),a=(0,l.ref)(!1),r=(0,l.ref)({}),o=(0,l.ref)(!1),i=(0,l.ref)(!1),s=new Set,m=(0,l.ref)(new Set),p=(0,l.ref)(!1),V=(0,l.ref)(null),N=(0,l.ref)(!1),y=(0,l.ref)(null);function g(e){return e?.response?.data?.detail||e?.response?.data?.title||e?.message||"请求失败,请稍后重试"}async function h(e){let t=`${window.location.origin}/download/${e}`;try{await navigator.clipboard.writeText(t),n.Toast.success("下载链接已复制")}catch{let e=document.createElement("textarea");e.value=t,document.body.appendChild(e),e.select();try{document.execCommand("copy"),n.Toast.success("下载链接已复制")}catch{n.Toast.error("复制失败,请手动复制")}document.body.removeChild(e)}}async function k(){a.value=!0;try{t.value=((await c()).items??[]).filter(e=>!s.has(e.metadata.name))}catch(e){n.Toast.error(g(e))}finally{a.value=!1}}async function E(){o.value=!0;try{r.value=await f()??{}}catch(e){n.Toast.error(g(e))}finally{o.value=!1}}async function w(){i.value=!0;try{r.value=await v()??{},n.Toast.success("引用扫描已刷新"),k()}catch(e){n.Toast.error(g(e))}finally{i.value=!1}}function x(){V.value=null,p.value=!0}async function b(e,t){let a=e.spec.enabled;e.spec.enabled=t;try{await d(e.metadata.name,{...e.spec,enabled:t}),n.Toast.success(t?"已启用":"已停用")}catch(t){e.spec.enabled=a,n.Toast.error(g(t)),k()}}function C(e,t){k(),t&&e.spec.enabled&&n.Toast.success(`下载链接:/download/${e.spec.slug}`)}return(0,l.onMounted)(()=>{k(),E()}),(c,d)=>((0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,null,[e.embedded?(0,l.createCommentVNode)("",!0):((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VPageHeader),{key:0,title:"下载管理"})),(0,l.createElementVNode)("div",Q,[(0,l.createVNode)((0,l.unref)(n.VCard),null,{default:(0,l.withCtx)(()=>[(0,l.createElementVNode)("div",W,[(0,l.createElementVNode)("div",X," 共 "+(0,l.toDisplayString)(t.value.length)+" 个下载资源 ",1),(0,l.createVNode)((0,l.unref)(n.VSpace),null,{default:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"primary",onClick:x},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconAddCircle))]),default:(0,l.withCtx)(()=>[d[3]||(d[3]=(0,l.createTextVNode)(" 新建资源 ",-1))]),_:1}),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"secondary",loading:i.value,onClick:w},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRefreshLine))]),default:(0,l.withCtx)(()=>[d[4]||(d[4]=(0,l.createTextVNode)(" 刷新引用扫描 ",-1))]),_:1},8,["loading"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",loading:a.value||o.value,onClick:d[0]||(d[0]=e=>{k(),E()})},{default:(0,l.withCtx)(()=>[...d[5]||(d[5]=[(0,l.createTextVNode)(" 刷新 ",-1)])]),_:1},8,["loading"])]),_:1})]),a.value?((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VLoading),{key:0})):0===t.value.length?((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VEmpty),{key:1,title:"暂无下载资源",message:"点击右上角「新建资源」创建第一个资源下载链接"})):((0,l.openBlock)(),(0,l.createElementBlock)("div",Y,[(0,l.createElementVNode)("table",Z,[d[12]||(d[12]=(0,l.createElementVNode)("thead",null,[(0,l.createElementVNode)("tr",null,[(0,l.createElementVNode)("th",null,"名称"),(0,l.createElementVNode)("th",null,"下载链接"),(0,l.createElementVNode)("th",null,"附件"),(0,l.createElementVNode)("th",null,"邮箱验证"),(0,l.createElementVNode)("th",null,"启用"),(0,l.createElementVNode)("th",null,"引用文章"),(0,l.createElementVNode)("th",null,"下载数"),(0,l.createElementVNode)("th",null,"下载人数"),(0,l.createElementVNode)("th",{class:"w-56"},"操作")])],-1)),(0,l.createElementVNode)("tbody",null,[((0,l.openBlock)(!0),(0,l.createElementBlock)(l.Fragment,null,(0,l.renderList)(t.value,e=>((0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,{key:e.metadata.name},[(0,l.createElementVNode)("tr",null,[(0,l.createElementVNode)("td",ee,[(0,l.createElementVNode)("div",null,(0,l.toDisplayString)(e.spec.displayName),1),e.spec.description?((0,l.openBlock)(),(0,l.createElementBlock)("div",{key:0,class:"text-xs text-gray-400 desc-line",title:e.spec.description},(0,l.toDisplayString)(e.spec.description),9,et)):(0,l.createCommentVNode)("",!0)]),(0,l.createElementVNode)("td",null,[(0,l.createElementVNode)("div",ea,[(0,l.createElementVNode)("code",el,"/download/"+(0,l.toDisplayString)(e.spec.slug),1),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",ghost:"",onClick:t=>h(e.spec.slug)},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconClipboardLine))]),default:(0,l.withCtx)(()=>[d[6]||(d[6]=(0,l.createTextVNode)(" 复制 ",-1))]),_:1},8,["onClick"])])]),(0,l.createElementVNode)("td",{class:"cell-ellipsis",title:e.spec.attachmentName},(0,l.toDisplayString)(e.spec.attachmentName||"-"),9,en),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VTag),{theme:e.spec.requireEmailVerify?"primary":"default"},{default:(0,l.withCtx)(()=>[(0,l.createTextVNode)((0,l.toDisplayString)(e.spec.requireEmailVerify?"需要":"不需要"),1)]),_:2},1032,["theme"])]),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VSwitch),{"model-value":e.spec.enabled??!1,onChange:t=>b(e,t)},null,8,["model-value","onChange"])]),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",ghost:"",onClick:t=>{var a;let l;return a=e.spec.slug,void((l=new Set(m.value)).has(a)?l.delete(a):l.add(a),m.value=l)}},{default:(0,l.withCtx)(()=>[(0,l.createTextVNode)((0,l.toDisplayString)(e.stats?.referenceCount??0)+" 篇 "+(0,l.toDisplayString)(m.value.has(e.spec.slug)?"▲":"▼"),1)]),_:2},1032,["onClick"])]),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.status?.downloadCount??0),1),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.stats?.downloaderCount??0),1),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VSpace),null,{default:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",onClick:t=>{y.value=e,N.value=!0}},{default:(0,l.withCtx)(()=>[...d[7]||(d[7]=[(0,l.createTextVNode)(" 记录 ",-1)])]),_:1},8,["onClick"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"secondary",onClick:t=>{V.value=e,p.value=!0}},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRiPencilFill))]),default:(0,l.withCtx)(()=>[d[8]||(d[8]=(0,l.createTextVNode)(" 编辑 ",-1))]),_:1},8,["onClick"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"danger",ghost:"",onClick:a=>{n.Dialog.warning({title:"删除下载资源",description:`确定要删除资源「${e.spec.displayName}」吗?删除后下载链接 /download/${e.spec.slug} 将立即失效。`,confirmType:"danger",confirmText:"删除",cancelText:"取消",onConfirm:async()=>{try{await u(e.metadata.name),s.add(e.metadata.name),setTimeout(()=>s.delete(e.metadata.name),3e3),t.value=t.value.filter(t=>t.metadata.name!==e.metadata.name),n.Toast.success(`已删除资源「${e.spec.displayName}」`),k()}catch(e){n.Toast.error(g(e))}}})}},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconDeleteBin))]),default:(0,l.withCtx)(()=>[d[9]||(d[9]=(0,l.createTextVNode)(" 删除 ",-1))]),_:1},8,["onClick"])]),_:2},1024)])]),m.value.has(e.spec.slug)?((0,l.openBlock)(),(0,l.createElementBlock)("tr",er,[(0,l.createElementVNode)("td",eo,[0===(r.value[e.spec.slug]??[]).length?((0,l.openBlock)(),(0,l.createElementBlock)("div",ei," 暂无文章引用该资源(可在编辑器中插入 /download/"+(0,l.toDisplayString)(e.spec.slug)+" 链接后点击「刷新引用扫描」) ",1)):((0,l.openBlock)(),(0,l.createElementBlock)("ul",ec,[((0,l.openBlock)(!0),(0,l.createElementBlock)(l.Fragment,null,(0,l.renderList)(r.value[e.spec.slug],e=>((0,l.openBlock)(),(0,l.createElementBlock)("li",{key:e.postName},[(0,l.createElementVNode)("span",es,(0,l.toDisplayString)(e.title),1),(0,l.createElementVNode)("a",{class:"refs-link",href:e.editorUrl,target:"_blank",rel:"noopener noreferrer"},[(0,l.createVNode)((0,l.unref)(n.IconExternalLinkLine)),d[10]||(d[10]=(0,l.createTextVNode)(" 编辑器 ",-1))],8,ed),(0,l.createElementVNode)("a",{class:"refs-link",href:e.permalink,target:"_blank",rel:"noopener noreferrer"},[(0,l.createVNode)((0,l.unref)(n.IconExternalLinkLine)),d[11]||(d[11]=(0,l.createTextVNode)(" 访问 ",-1))],8,eu)]))),128))]))])])):(0,l.createCommentVNode)("",!0)],64))),128))])])]))]),_:1}),(0,l.createVNode)(A,{visible:p.value,"onUpdate:visible":d[1]||(d[1]=e=>p.value=e),resource:V.value,onSaved:C},null,8,["visible","resource"]),(0,l.createVNode)(J,{visible:N.value,"onUpdate:visible":d[2]||(d[2]=e=>N.value=e),resource:y.value},null,8,["visible","resource"])])],64))}});let ep=(0,F.A)(em,[["__scopeId","data-v-9127f5d6"]]),ef={class:"link-form"},ev={class:"form-item form-item--column"},eV={class:"form-item form-item--column"},eN=["disabled"],ey={key:0,class:"form-hint"},eg={key:1,class:"form-hint"},eh={class:"form-item form-item--column"},ek={class:"form-item form-item--column"},eE={class:"form-item"},ew={class:"form-item"};var ex=(0,l.defineComponent)({__name:"LinkFormModal",props:{visible:{type:Boolean},link:{}},emits:["update:visible","saved"],setup(e,t){let{emit:a}=t,r=/^[a-z0-9][a-z0-9-]{0,63}$/,o=(0,l.computed)(()=>null!==e.link),i=(0,l.ref)({slug:"",displayName:"",description:"",targetUrl:"",requireEmailVerify:!1,enabled:!0}),c=(0,l.ref)(!1);function s(){a("update:visible",!1)}async function d(){let t=i.value.displayName.trim(),l=i.value.slug.trim(),d=(i.value.targetUrl??"").trim();if(!t)return void n.Toast.warning("请填写链接名称");if(!l)return void n.Toast.warning("请填写 slug");if(!o.value&&!r.test(l))return void n.Toast.warning("slug 只能包含小写字母、数字和中划线,且必须以字母或数字开头(最长 64 位)");if(!function(e){try{let t=new URL(e);return("http:"===t.protocol||"https:"===t.protocol)&&!!t.hostname}catch{return!1}}(d))return void n.Toast.warning("目标链接必须是合法的 http/https 地址");c.value=!0;try{if(o.value&&e.link){let l={...e.link.spec,displayName:t,description:i.value.description?.trim()??"",targetUrl:d,requireEmailVerify:i.value.requireEmailVerify,enabled:i.value.enabled},r=await g(e.link.metadata.name,l);n.Toast.success("链接已更新"),a("saved",r,!1)}else{let e=await y({slug:l,displayName:t,description:i.value.description?.trim()??"",targetUrl:d,requireEmailVerify:i.value.requireEmailVerify,enabled:i.value.enabled});n.Toast.success("链接已创建"),a("saved",e,!0)}s()}catch(e){n.Toast.error(e?.response?.data?.detail||e?.response?.data?.title||e?.message||"保存失败,请稍后重试")}finally{c.value=!1}}return(0,l.watch)(()=>e.visible,t=>{if(t)if(e.link){let t=e.link.spec;i.value={slug:t.slug,displayName:t.displayName,description:t.description??"",targetUrl:t.targetUrl??"",requireEmailVerify:t.requireEmailVerify??!1,enabled:t.enabled??!0}}else i.value={slug:"",displayName:"",description:"",targetUrl:"",requireEmailVerify:!1,enabled:!0}}),(t,u)=>((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VModal),{visible:e.visible,title:o.value?"编辑受保护链接":"新建受保护链接",width:640,"onUpdate:visible":u[7]||(u[7]=e=>a("update:visible",e)),onClose:s},{footer:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{type:"primary",loading:c.value,onClick:d},{default:(0,l.withCtx)(()=>[...u[15]||(u[15]=[(0,l.createTextVNode)(" 保存 ",-1)])]),_:1},8,["loading"]),(0,l.createVNode)((0,l.unref)(n.VButton),{type:"default",onClick:s},{default:(0,l.withCtx)(()=>[...u[16]||(u[16]=[(0,l.createTextVNode)("取消",-1)])]),_:1})]),default:(0,l.withCtx)(()=>[(0,l.createElementVNode)("div",ef,[(0,l.createElementVNode)("div",ev,[u[8]||(u[8]=(0,l.createElementVNode)("label",{class:"form-label"},[(0,l.createTextVNode)(" 链接名称 "),(0,l.createElementVNode)("span",{class:"required"},"*")],-1)),(0,l.withDirectives)((0,l.createElementVNode)("input",{"onUpdate:modelValue":u[0]||(u[0]=e=>i.value.displayName=e),class:"form-input",type:"text",placeholder:"例如:内部文档"},null,512),[[l.vModelText,i.value.displayName]])]),(0,l.createElementVNode)("div",eV,[u[9]||(u[9]=(0,l.createElementVNode)("label",{class:"form-label"},[(0,l.createTextVNode)(" slug "),(0,l.createElementVNode)("span",{class:"required"},"*")],-1)),(0,l.withDirectives)((0,l.createElementVNode)("input",{"onUpdate:modelValue":u[1]||(u[1]=e=>i.value.slug=e),class:"form-input",type:"text",disabled:o.value,placeholder:"例如:internal-docs(访问链接为 /link/{slug})"},null,8,eN),[[l.vModelText,i.value.slug]]),o.value?((0,l.openBlock)(),(0,l.createElementBlock)("div",ey,"slug 创建后不可修改")):((0,l.openBlock)(),(0,l.createElementBlock)("div",eg," 小写字母、数字、中划线,以字母或数字开头,最长 64 位;留空时可根据目标链接自动生成 "))]),(0,l.createElementVNode)("div",eh,[u[10]||(u[10]=(0,l.createElementVNode)("label",{class:"form-label"},[(0,l.createTextVNode)(" 目标链接 "),(0,l.createElementVNode)("span",{class:"required"},"*")],-1)),(0,l.withDirectives)((0,l.createElementVNode)("input",{"onUpdate:modelValue":u[2]||(u[2]=e=>i.value.targetUrl=e),class:"form-input",type:"url",placeholder:"https://example.com/secret-page",onBlur:u[3]||(u[3]=e=>{o.value||i.value.slug||!i.value.targetUrl||(i.value.slug=function(e){try{let t=new URL(e.trim()),a=(t.pathname.split("/").filter(Boolean).pop()??t.hostname).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64).replace(/^-+|-+$/g,"");return r.test(a)?a:""}catch{return""}}(i.value.targetUrl)||Math.random().toString(36).slice(2,10))})},null,544),[[l.vModelText,i.value.targetUrl]]),u[11]||(u[11]=(0,l.createElementVNode)("div",{class:"form-hint"}," 访客完成验证后将被 302 跳转到该地址;真实地址不会在门禁页展示 ",-1))]),(0,l.createElementVNode)("div",ek,[u[12]||(u[12]=(0,l.createElementVNode)("label",{class:"form-label"},"描述",-1)),(0,l.withDirectives)((0,l.createElementVNode)("textarea",{"onUpdate:modelValue":u[4]||(u[4]=e=>i.value.description=e),class:"form-input",rows:"3",placeholder:"可选,向访客说明链接内容"},null,512),[[l.vModelText,i.value.description]])]),(0,l.createElementVNode)("div",eE,[u[13]||(u[13]=(0,l.createElementVNode)("span",{class:"form-label"},"需要邮箱验证",-1)),(0,l.createVNode)((0,l.unref)(n.VSwitch),{modelValue:i.value.requireEmailVerify,"onUpdate:modelValue":u[5]||(u[5]=e=>i.value.requireEmailVerify=e)},null,8,["modelValue"])]),(0,l.createElementVNode)("div",ew,[u[14]||(u[14]=(0,l.createElementVNode)("span",{class:"form-label"},"启用",-1)),(0,l.createVNode)((0,l.unref)(n.VSwitch),{modelValue:i.value.enabled,"onUpdate:modelValue":u[6]||(u[6]=e=>i.value.enabled=e)},null,8,["modelValue"])])])]),_:1},8,["visible","title"]))}});let eb=(0,F.A)(ex,[["__scopeId","data-v-760eafaf"]]),eC={class:"link-manager-page m-4"},eB={class:"card-toolbar"},eT={class:"text-sm text-gray-500"},e_={key:2,class:"table-wrapper"},eS={class:"link-table"},e$={class:"font-medium"},eD=["title"],eI={class:"link-cell"},eU={class:"link-code"},eq=["href","title"],ez={key:0,class:"refs-row"},eL={colspan:"9"},eM={key:0,class:"text-sm text-gray-400 refs-empty"},eF={key:1,class:"refs-list"},eA={class:"refs-title"},eR=["href"],eP=["href"];var eH=(0,l.defineComponent)({__name:"LinkManager",props:{embedded:{type:Boolean}},setup(e){let t=(0,l.ref)([]),a=(0,l.ref)(!1),r=(0,l.ref)({}),o=(0,l.ref)(!1),i=(0,l.ref)(!1),c=new Set,s=(0,l.ref)(new Set),d=(0,l.ref)(!1),u=(0,l.ref)(null),m=(0,l.ref)(!1),p=(0,l.ref)(null);function f(e){return e?.response?.data?.detail||e?.response?.data?.title||e?.message||"请求失败,请稍后重试"}async function v(e){let t=`${window.location.origin}/link/${e}`;try{await navigator.clipboard.writeText(t),n.Toast.success("访问链接已复制")}catch{let e=document.createElement("textarea");e.value=t,document.body.appendChild(e),e.select();try{document.execCommand("copy"),n.Toast.success("访问链接已复制")}catch{n.Toast.error("复制失败,请手动复制")}document.body.removeChild(e)}}async function V(){a.value=!0;try{t.value=((await N()).items??[]).filter(e=>!c.has(e.metadata.name))}catch(e){n.Toast.error(f(e))}finally{a.value=!1}}async function y(){o.value=!0;try{r.value=await w()??{}}catch(e){n.Toast.error(f(e))}finally{o.value=!1}}async function k(){i.value=!0;try{r.value=await x()??{},n.Toast.success("引用扫描已刷新"),V()}catch(e){n.Toast.error(f(e))}finally{i.value=!1}}function E(){u.value=null,d.value=!0}async function b(e,t){let a=e.spec.enabled;e.spec.enabled=t;try{await g(e.metadata.name,{...e.spec,enabled:t}),n.Toast.success(t?"已启用":"已停用")}catch(t){e.spec.enabled=a,n.Toast.error(f(t)),V()}}function C(e,t){V(),t&&e.spec.enabled&&n.Toast.success(`访问链接:/link/${e.spec.slug}`)}return(0,l.onMounted)(()=>{V(),y()}),(N,g)=>((0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,null,[e.embedded?(0,l.createCommentVNode)("",!0):((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VPageHeader),{key:0,title:"链接访问管理"})),(0,l.createElementVNode)("div",eC,[(0,l.createVNode)((0,l.unref)(n.VCard),null,{default:(0,l.withCtx)(()=>[(0,l.createElementVNode)("div",eB,[(0,l.createElementVNode)("div",eT," 共 "+(0,l.toDisplayString)(t.value.length)+" 个受保护链接 ",1),(0,l.createVNode)((0,l.unref)(n.VSpace),null,{default:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"primary",onClick:E},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconAddCircle))]),default:(0,l.withCtx)(()=>[g[3]||(g[3]=(0,l.createTextVNode)(" 新建链接 ",-1))]),_:1}),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"secondary",loading:i.value,onClick:k},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRefreshLine))]),default:(0,l.withCtx)(()=>[g[4]||(g[4]=(0,l.createTextVNode)(" 刷新引用扫描 ",-1))]),_:1},8,["loading"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",loading:a.value||o.value,onClick:g[0]||(g[0]=e=>{V(),y()})},{default:(0,l.withCtx)(()=>[...g[5]||(g[5]=[(0,l.createTextVNode)(" 刷新 ",-1)])]),_:1},8,["loading"])]),_:1})]),a.value?((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VLoading),{key:0})):0===t.value.length?((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VEmpty),{key:1,title:"暂无受保护链接",message:"点击右上角「新建链接」为任意 http/https 地址创建访问门禁"})):((0,l.openBlock)(),(0,l.createElementBlock)("div",e_,[(0,l.createElementVNode)("table",eS,[g[12]||(g[12]=(0,l.createElementVNode)("thead",null,[(0,l.createElementVNode)("tr",null,[(0,l.createElementVNode)("th",null,"名称"),(0,l.createElementVNode)("th",null,"访问链接"),(0,l.createElementVNode)("th",null,"目标链接"),(0,l.createElementVNode)("th",null,"邮箱验证"),(0,l.createElementVNode)("th",null,"启用"),(0,l.createElementVNode)("th",null,"引用文章"),(0,l.createElementVNode)("th",null,"访问数"),(0,l.createElementVNode)("th",null,"访问人数"),(0,l.createElementVNode)("th",{class:"w-56"},"操作")])],-1)),(0,l.createElementVNode)("tbody",null,[((0,l.openBlock)(!0),(0,l.createElementBlock)(l.Fragment,null,(0,l.renderList)(t.value,e=>((0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,{key:e.metadata.name},[(0,l.createElementVNode)("tr",null,[(0,l.createElementVNode)("td",e$,[(0,l.createElementVNode)("div",null,(0,l.toDisplayString)(e.spec.displayName),1),e.spec.description?((0,l.openBlock)(),(0,l.createElementBlock)("div",{key:0,class:"text-xs text-gray-400 desc-line",title:e.spec.description},(0,l.toDisplayString)(e.spec.description),9,eD)):(0,l.createCommentVNode)("",!0)]),(0,l.createElementVNode)("td",null,[(0,l.createElementVNode)("div",eI,[(0,l.createElementVNode)("code",eU,"/link/"+(0,l.toDisplayString)(e.spec.slug),1),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",ghost:"",onClick:t=>v(e.spec.slug)},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconClipboardLine))]),default:(0,l.withCtx)(()=>[g[6]||(g[6]=(0,l.createTextVNode)(" 复制 ",-1))]),_:1},8,["onClick"])])]),(0,l.createElementVNode)("td",null,[(0,l.createElementVNode)("a",{class:"target-link",href:e.spec.targetUrl,target:"_blank",rel:"noopener noreferrer",title:e.spec.targetUrl},[(0,l.createTextVNode)((0,l.toDisplayString)(e.spec.targetUrl)+" ",1),(0,l.createVNode)((0,l.unref)(n.IconExternalLinkLine))],8,eq)]),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VTag),{theme:e.spec.requireEmailVerify?"primary":"default"},{default:(0,l.withCtx)(()=>[(0,l.createTextVNode)((0,l.toDisplayString)(e.spec.requireEmailVerify?"需要":"不需要"),1)]),_:2},1032,["theme"])]),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VSwitch),{"model-value":e.spec.enabled??!1,onChange:t=>b(e,t)},null,8,["model-value","onChange"])]),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",ghost:"",onClick:t=>{var a;let l;return a=e.spec.slug,void((l=new Set(s.value)).has(a)?l.delete(a):l.add(a),s.value=l)}},{default:(0,l.withCtx)(()=>[(0,l.createTextVNode)((0,l.toDisplayString)(e.stats?.referenceCount??0)+" 篇 "+(0,l.toDisplayString)(s.value.has(e.spec.slug)?"▲":"▼"),1)]),_:2},1032,["onClick"])]),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.status?.visitCount??0),1),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.stats?.visitorCount??0),1),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VSpace),null,{default:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",onClick:t=>{p.value=e,m.value=!0}},{default:(0,l.withCtx)(()=>[...g[7]||(g[7]=[(0,l.createTextVNode)(" 记录 ",-1)])]),_:1},8,["onClick"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"secondary",onClick:t=>{u.value=e,d.value=!0}},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRiPencilFill))]),default:(0,l.withCtx)(()=>[g[8]||(g[8]=(0,l.createTextVNode)(" 编辑 ",-1))]),_:1},8,["onClick"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"danger",ghost:"",onClick:a=>{n.Dialog.warning({title:"删除受保护链接",description:`确定要删除链接「${e.spec.displayName}」吗?删除后访问链接 /link/${e.spec.slug} 将立即失效。`,confirmType:"danger",confirmText:"删除",cancelText:"取消",onConfirm:async()=>{try{await h(e.metadata.name),c.add(e.metadata.name),setTimeout(()=>c.delete(e.metadata.name),3e3),t.value=t.value.filter(t=>t.metadata.name!==e.metadata.name),n.Toast.success(`已删除链接「${e.spec.displayName}」`),V()}catch(e){n.Toast.error(f(e))}}})}},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconDeleteBin))]),default:(0,l.withCtx)(()=>[g[9]||(g[9]=(0,l.createTextVNode)(" 删除 ",-1))]),_:1},8,["onClick"])]),_:2},1024)])]),s.value.has(e.spec.slug)?((0,l.openBlock)(),(0,l.createElementBlock)("tr",ez,[(0,l.createElementVNode)("td",eL,[0===(r.value[e.spec.slug]??[]).length?((0,l.openBlock)(),(0,l.createElementBlock)("div",eM," 暂无文章引用该链接(可在编辑器中插入 /link/"+(0,l.toDisplayString)(e.spec.slug)+" 链接后点击「刷新引用扫描」) ",1)):((0,l.openBlock)(),(0,l.createElementBlock)("ul",eF,[((0,l.openBlock)(!0),(0,l.createElementBlock)(l.Fragment,null,(0,l.renderList)(r.value[e.spec.slug],e=>((0,l.openBlock)(),(0,l.createElementBlock)("li",{key:e.postName},[(0,l.createElementVNode)("span",eA,(0,l.toDisplayString)(e.title),1),(0,l.createElementVNode)("a",{class:"refs-link",href:e.editorUrl,target:"_blank",rel:"noopener noreferrer"},[(0,l.createVNode)((0,l.unref)(n.IconExternalLinkLine)),g[10]||(g[10]=(0,l.createTextVNode)(" 编辑器 ",-1))],8,eR),(0,l.createElementVNode)("a",{class:"refs-link",href:e.permalink,target:"_blank",rel:"noopener noreferrer"},[(0,l.createVNode)((0,l.unref)(n.IconExternalLinkLine)),g[11]||(g[11]=(0,l.createTextVNode)(" 访问 ",-1))],8,eP)]))),128))]))])])):(0,l.createCommentVNode)("",!0)],64))),128))])])]))]),_:1}),(0,l.createVNode)(eb,{visible:d.value,"onUpdate:visible":g[1]||(g[1]=e=>d.value=e),link:u.value,onSaved:C},null,8,["visible","link"]),(0,l.createVNode)(J,{visible:m.value,"onUpdate:visible":g[2]||(g[2]=e=>m.value=e),kind:"link",resource:p.value},null,8,["visible","resource"])])],64))}});let ej=(0,F.A)(eH,[["__scopeId","data-v-e1bcba19"]]),eG={class:"resource-manager m-4"},eK={class:"resource-manager__body"};var eO=(0,l.defineComponent)({__name:"ResourceManager",setup(e){let t=(0,l.ref)("download");return(e,a)=>((0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,null,[(0,l.createVNode)((0,l.unref)(n.VPageHeader),{title:"资源访问管理"}),(0,l.createElementVNode)("div",eG,[(0,l.createVNode)((0,l.unref)(n.VTabbar),{"active-id":t.value,"onUpdate:activeId":a[0]||(a[0]=e=>t.value=e),items:[{id:"download",label:"下载资源"},{id:"link",label:"受保护链接"}]},null,8,["active-id"]),(0,l.createElementVNode)("div",eK,["download"===t.value?((0,l.openBlock)(),(0,l.createBlock)(ep,{key:0,embedded:""})):((0,l.openBlock)(),(0,l.createBlock)(ej,{key:1,embedded:""}))])])],64))}}),eJ=(0,F.A)(eO,[["__scopeId","data-v-2715b11d"]])}}]); \ No newline at end of file diff --git a/src/main/resources/console/chunks/631.9382678d.js b/src/main/resources/console/chunks/631.9382678d.js deleted file mode 100644 index a943f6a..0000000 --- a/src/main/resources/console/chunks/631.9382678d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(window.rspackChunksharelink=window.rspackChunksharelink||[]).push([[631],{"./node_modules/.pnpm/rspack-vue-loader@17.6.1_@rspack+core@2.1.7_@swc+helpers@0.5.23__@vue+compiler-sfc@3.5.40_vue@3.5.40_typescript@5.8.3_/node_modules/rspack-vue-loader/dist/exportHelper.js"(e,t){t.A=(e,t)=>{let a=e.__vccOpts||e;for(let[e,l]of t)a[e]=l;return a}},"./src/views/ResourceManager.vue"(e,t,a){a.r(t),a.d(t,{default:()=>eJ});var l=a("vue"),n=a("@halo-dev/components"),r=a("@halo-dev/api-client");let o="/apis/console.api.sharelink.halo.run/v1alpha1";function c(e){return{metadata:{name:e.name,creationTimestamp:e.creationTimestamp},spec:{slug:e.slug,displayName:e.displayName,description:e.description,attachmentName:e.attachmentName,requireEmailVerify:e.requireEmailVerify,enabled:e.enabled},status:{downloadCount:e.stats?.downloadCount??0},stats:{downloaderCount:e.stats?.downloaderCount??0,referenceCount:e.stats?.referenceCount??0}}}async function i(){let{data:e}=await r.axiosInstance.get(`${o}/download-resources`),t=(e??[]).map(c);return{items:t,total:t.length}}async function s(e){let{data:t}=await r.axiosInstance.post(`${o}/download-resources`,e);return c(t)}async function d(e,t){let{data:a}=await r.axiosInstance.put(`${o}/download-resources/${e}`,t);return c(a)}async function u(e){await r.axiosInstance.delete(`${o}/download-resources/${e}`)}async function m(e){let{data:t}=await r.axiosInstance.get(`${o}/download-records`,{params:e});return t}async function p(e){await r.axiosInstance.delete(`${o}/download-records/${e}`)}async function f(){let{data:e}=await r.axiosInstance.get(`${o}/references`);return e}async function v(){let{data:e}=await r.axiosInstance.post(`${o}/references/-/refresh`);return e}function V(e){return{metadata:{name:e.name,creationTimestamp:e.creationTimestamp},spec:{slug:e.slug,displayName:e.displayName,description:e.description,targetUrl:e.targetUrl,requireEmailVerify:e.requireEmailVerify,enabled:e.enabled},status:{visitCount:e.stats?.visitCount??0},stats:{visitorCount:e.stats?.visitorCount??0,referenceCount:e.stats?.referenceCount??0}}}async function N(){let{data:e}=await r.axiosInstance.get(`${o}/protected-links`),t=(e??[]).map(V);return{items:t,total:t.length}}async function y(e){let{data:t}=await r.axiosInstance.post(`${o}/protected-links`,e);return V(t)}async function g(e,t){let{data:a}=await r.axiosInstance.put(`${o}/protected-links/${e}`,t);return V(a)}async function k(e){await r.axiosInstance.delete(`${o}/protected-links/${e}`)}async function h(e){let{data:t}=await r.axiosInstance.get(`${o}/link-visit-records`,{params:e});return t}async function E(e){await r.axiosInstance.delete(`${o}/link-visit-records/${e}`)}async function w(){let{data:e}=await r.axiosInstance.get(`${o}/link-references`);return e}async function x(){let{data:e}=await r.axiosInstance.post(`${o}/link-references/-/refresh`);return e}let b={class:"resource-form"},C={class:"form-item form-item--column"},B={class:"form-item form-item--column"},T=["disabled"],_={key:0,class:"form-hint"},S={key:1,class:"form-hint"},$={class:"form-item form-item--column"},D={class:"form-item form-item--column"},I={class:"attachment-picker"},U=["title"],q={key:1,class:"text-sm text-gray-400"},z={class:"form-item"},L={class:"form-item"};var M=(0,l.defineComponent)({__name:"ResourceFormModal",props:{visible:{type:Boolean},resource:{}},emits:["update:visible","saved"],setup(e,t){let{emit:a}=t,r=/^[a-z0-9][a-z0-9-]{0,63}$/,o=(0,l.computed)(()=>null!==e.resource),c=(0,l.ref)({slug:"",displayName:"",description:"",attachmentName:"",requireEmailVerify:!1,enabled:!0}),i=(0,l.ref)(null),u=(0,l.ref)(!1),m=(0,l.ref)(!1);function p(){a("update:visible",!1)}function f(e){let t=e?.[0],a=t?.metadata?.name;if(t&&a){if(i.value=t,c.value.attachmentName=a,!o.value&&!c.value.slug){let e,l=t.spec?.displayName??a;c.value.slug=(e=l.replace(/\.[^.]+$/,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64).replace(/^-+|-+$/g,""),(r.test(e)?e:"")||Math.random().toString(36).slice(2,10))}u.value=!1}}(0,l.watch)(()=>e.visible,t=>{if(t)if(i.value=null,e.resource){let t=e.resource.spec;c.value={slug:t.slug,displayName:t.displayName,description:t.description??"",attachmentName:t.attachmentName??"",requireEmailVerify:t.requireEmailVerify??!1,enabled:t.enabled??!0}}else c.value={slug:"",displayName:"",description:"",attachmentName:"",requireEmailVerify:!1,enabled:!0}});let v=(0,l.computed)(()=>{if(i.value){var e;let t=i.value.spec?.displayName??i.value.metadata?.name??"",a=(e=i.value.spec?.size)&&!(e<=0)?e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:e<0x40000000?`${(e/1024/1024).toFixed(1)} MB`:`${(e/1024/1024/1024).toFixed(2)} GB`:"";return a?`${t}(${a})`:t}return c.value.attachmentName||""});async function V(){let t=c.value.displayName.trim(),l=c.value.slug.trim();if(!t)return void n.Toast.warning("请填写资源名称");if(!l)return void n.Toast.warning("请填写 slug");if(!o.value&&!r.test(l))return void n.Toast.warning("slug 只能包含小写字母、数字和中划线,且必须以字母或数字开头(最长 64 位)");m.value=!0;try{if(o.value&&e.resource){let l={...e.resource.spec,displayName:t,description:c.value.description?.trim()??"",attachmentName:c.value.attachmentName,requireEmailVerify:c.value.requireEmailVerify,enabled:c.value.enabled},r=await d(e.resource.metadata.name,l);n.Toast.success("资源已更新"),a("saved",r,!1)}else{let e=await s({slug:l,displayName:t,description:c.value.description?.trim()??"",attachmentName:c.value.attachmentName,requireEmailVerify:c.value.requireEmailVerify,enabled:c.value.enabled});n.Toast.success("资源已创建"),a("saved",e,!0)}p()}catch(e){n.Toast.error(e?.response?.data?.detail||e?.response?.data?.title||e?.message||"保存失败,请稍后重试")}finally{m.value=!1}}return(t,r)=>{let i=(0,l.resolveComponent)("AttachmentSelectorModal");return(0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,null,[(0,l.createVNode)((0,l.unref)(n.VModal),{visible:e.visible,title:o.value?"编辑下载资源":"新建下载资源",width:640,"onUpdate:visible":r[6]||(r[6]=e=>a("update:visible",e)),onClose:p},{footer:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{type:"primary",loading:m.value,onClick:V},{default:(0,l.withCtx)(()=>[...r[15]||(r[15]=[(0,l.createTextVNode)(" 保存 ",-1)])]),_:1},8,["loading"]),(0,l.createVNode)((0,l.unref)(n.VButton),{type:"default",onClick:p},{default:(0,l.withCtx)(()=>[...r[16]||(r[16]=[(0,l.createTextVNode)("取消",-1)])]),_:1})]),default:(0,l.withCtx)(()=>[(0,l.createElementVNode)("div",b,[(0,l.createElementVNode)("div",C,[r[8]||(r[8]=(0,l.createElementVNode)("label",{class:"form-label"},[(0,l.createTextVNode)(" 资源名称 "),(0,l.createElementVNode)("span",{class:"required"},"*")],-1)),(0,l.withDirectives)((0,l.createElementVNode)("input",{"onUpdate:modelValue":r[0]||(r[0]=e=>c.value.displayName=e),class:"form-input",type:"text",placeholder:"例如:产品白皮书 PDF"},null,512),[[l.vModelText,c.value.displayName]])]),(0,l.createElementVNode)("div",B,[r[9]||(r[9]=(0,l.createElementVNode)("label",{class:"form-label"},[(0,l.createTextVNode)(" slug "),(0,l.createElementVNode)("span",{class:"required"},"*")],-1)),(0,l.withDirectives)((0,l.createElementVNode)("input",{"onUpdate:modelValue":r[1]||(r[1]=e=>c.value.slug=e),class:"form-input",type:"text",disabled:o.value,placeholder:"例如:whitepaper-2024(下载链接为 /download/{slug})"},null,8,T),[[l.vModelText,c.value.slug]]),o.value?((0,l.openBlock)(),(0,l.createElementBlock)("div",_,"slug 创建后不可修改")):((0,l.openBlock)(),(0,l.createElementBlock)("div",S," 小写字母、数字、中划线,以字母或数字开头,最长 64 位 "))]),(0,l.createElementVNode)("div",$,[r[10]||(r[10]=(0,l.createElementVNode)("label",{class:"form-label"},"描述",-1)),(0,l.withDirectives)((0,l.createElementVNode)("textarea",{"onUpdate:modelValue":r[2]||(r[2]=e=>c.value.description=e),class:"form-input",rows:"3",placeholder:"可选,资源用途说明"},null,512),[[l.vModelText,c.value.description]])]),(0,l.createElementVNode)("div",D,[r[12]||(r[12]=(0,l.createElementVNode)("label",{class:"form-label"},"附件",-1)),(0,l.createElementVNode)("div",I,[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",onClick:r[3]||(r[3]=e=>u.value=!0)},{default:(0,l.withCtx)(()=>[...r[11]||(r[11]=[(0,l.createTextVNode)(" 选择附件 ",-1)])]),_:1}),v.value?((0,l.openBlock)(),(0,l.createElementBlock)("span",{key:0,class:"attachment-name",title:c.value.attachmentName},(0,l.toDisplayString)(v.value),9,U)):((0,l.openBlock)(),(0,l.createElementBlock)("span",q,"未选择"))])]),(0,l.createElementVNode)("div",z,[r[13]||(r[13]=(0,l.createElementVNode)("span",{class:"form-label"},"需要邮箱验证",-1)),(0,l.createVNode)((0,l.unref)(n.VSwitch),{modelValue:c.value.requireEmailVerify,"onUpdate:modelValue":r[4]||(r[4]=e=>c.value.requireEmailVerify=e)},null,8,["modelValue"])]),(0,l.createElementVNode)("div",L,[r[14]||(r[14]=(0,l.createElementVNode)("span",{class:"form-label"},"启用",-1)),(0,l.createVNode)((0,l.unref)(n.VSwitch),{modelValue:c.value.enabled,"onUpdate:modelValue":r[5]||(r[5]=e=>c.value.enabled=e)},null,8,["modelValue"])])])]),_:1},8,["visible","title"]),(0,l.createVNode)(i,{visible:u.value,"onUpdate:visible":r[7]||(r[7]=e=>u.value=e),onSelect:f},null,8,["visible"])],64)}}}),F=a("./node_modules/.pnpm/rspack-vue-loader@17.6.1_@rspack+core@2.1.7_@swc+helpers@0.5.23__@vue+compiler-sfc@3.5.40_vue@3.5.40_typescript@5.8.3_/node_modules/rspack-vue-loader/dist/exportHelper.js");let A=(0,F.A)(M,[["__scopeId","data-v-e4a7554b"]]),R={class:"records-toolbar"},P={class:"text-sm text-gray-500"},H={key:2,class:"table-wrapper"},j={class:"records-table"},G=["title"],K={key:3,class:"records-pagination"};var O=(0,l.defineComponent)({__name:"RecordsDrawer",props:{visible:{type:Boolean},resource:{},kind:{}},emits:["update:visible"],setup(e,t){let{emit:a}=t,r=(0,l.computed)(()=>"link"===e.kind),c=(0,l.ref)([]),i=(0,l.ref)(!1),s=(0,l.ref)(1),d=(0,l.ref)(20),u=(0,l.ref)(0),f=new Set;function v(e){return e?.response?.data?.detail||e?.response?.data?.title||e?.message||"请求失败,请稍后重试"}async function V(){if(e.resource){i.value=!0;try{let t=e.resource.spec.slug??"",a={page:s.value,size:d.value},l=r.value?await h({...a,linkSlug:t}):await m({...a,resourceSlug:t});c.value=(l.items??[]).filter(e=>!f.has(e.metadata.name)).map(e=>({metadata:{name:e.metadata.name},spec:{email:e.spec.email,ip:e.spec.ip,userAgent:e.spec.userAgent,time:"visitedAt"in e.spec?e.spec.visitedAt:e.spec.downloadedAt}})),u.value=l.total??0}catch(e){n.Toast.error(v(e))}finally{i.value=!1}}}function N(){var t,a;let l,n,c=r.value?(l=(t=e.resource?.spec.slug)?`?linkSlug=${encodeURIComponent(t)}`:"",`${o}/link-visit-records/-/export${l}`):(n=(a=e.resource?.spec.slug)?`?resourceSlug=${encodeURIComponent(a)}`:"",`${o}/download-records/-/export${n}`);window.open(c,"_blank")}return(0,l.watch)(()=>[e.visible,e.resource?.metadata.name],e=>{let[t]=e;t&&(s.value=1,V())}),(t,o)=>((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VModal),{visible:e.visible,title:`${r.value?"访问":"下载"}记录${e.resource?` - ${e.resource.spec.displayName}`:""}`,width:960,"mount-to-body":"","onUpdate:visible":o[2]||(o[2]=e=>a("update:visible",e)),onClose:o[3]||(o[3]=e=>a("update:visible",!1))},{default:(0,l.withCtx)(()=>[(0,l.createElementVNode)("div",R,[(0,l.createElementVNode)("div",P,"共 "+(0,l.toDisplayString)(u.value)+" 条记录",1),(0,l.createVNode)((0,l.unref)(n.VSpace),null,{default:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",onClick:N},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRiUpload2Fill))]),default:(0,l.withCtx)(()=>[o[4]||(o[4]=(0,l.createTextVNode)(" 导出 CSV ",-1))]),_:1}),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"secondary",loading:i.value,onClick:V},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRefreshLine))]),default:(0,l.withCtx)(()=>[o[5]||(o[5]=(0,l.createTextVNode)(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),i.value?((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VLoading),{key:0})):0===c.value.length?((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VEmpty),{key:1,title:r.value?"暂无访问记录":"暂无下载记录",message:r.value?"该链接还没有产生访问":"该资源还没有产生下载"},null,8,["title","message"])):((0,l.openBlock)(),(0,l.createElementBlock)("div",H,[(0,l.createElementVNode)("table",j,[o[7]||(o[7]=(0,l.createElementVNode)("thead",null,[(0,l.createElementVNode)("tr",null,[(0,l.createElementVNode)("th",null,"时间"),(0,l.createElementVNode)("th",null,"邮箱"),(0,l.createElementVNode)("th",null,"IP"),(0,l.createElementVNode)("th",null,"User-Agent"),(0,l.createElementVNode)("th",{class:"w-24"},"操作")])],-1)),(0,l.createElementVNode)("tbody",null,[((0,l.openBlock)(!0),(0,l.createElementBlock)(l.Fragment,null,(0,l.renderList)(c.value,e=>((0,l.openBlock)(),(0,l.createElementBlock)("tr",{key:e.metadata.name},[(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(function(e){if(!e)return"-";let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString("zh-CN",{hour12:!1})}(e.spec.time)),1),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.spec.email||"匿名"),1),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.spec.ip||"-"),1),(0,l.createElementVNode)("td",{class:"ua-cell",title:e.spec.userAgent},(0,l.toDisplayString)(e.spec.userAgent||"-"),9,G),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"danger",ghost:"",onClick:t=>{n.Dialog.warning({title:r.value?"删除访问记录":"删除下载记录",description:"确定要删除这条记录吗?删除后不可恢复。",confirmType:"danger",confirmText:"删除",cancelText:"取消",onConfirm:async()=>{try{r.value?await E(e.metadata.name):await p(e.metadata.name),1===c.value.length&&s.value>1&&(s.value-=1),f.add(e.metadata.name),setTimeout(()=>f.delete(e.metadata.name),3e3),c.value=c.value.filter(t=>t.metadata.name!==e.metadata.name),n.Toast.success("记录已删除"),V()}catch(e){n.Toast.error(v(e))}}})}},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconDeleteBin))]),default:(0,l.withCtx)(()=>[o[6]||(o[6]=(0,l.createTextVNode)(" 删除 ",-1))]),_:1},8,["onClick"])])]))),128))])])])),u.value>0?((0,l.openBlock)(),(0,l.createElementBlock)("div",K,[(0,l.createVNode)((0,l.unref)(n.VPagination),{page:s.value,"onUpdate:page":o[0]||(o[0]=e=>s.value=e),size:d.value,"onUpdate:size":o[1]||(o[1]=e=>d.value=e),total:u.value,"size-options":[20,50,100],"show-total":"",onChange:V},null,8,["page","size","total"])])):(0,l.createCommentVNode)("",!0)]),_:1},8,["visible","title"]))}});let J=(0,F.A)(O,[["__scopeId","data-v-45b20d48"]]),Q={class:"download-manager-page m-4"},W={class:"card-toolbar"},X={class:"text-sm text-gray-500"},Y={key:2,class:"table-wrapper"},Z={class:"resource-table"},ee={class:"font-medium"},et=["title"],ea={class:"link-cell"},el={class:"link-code"},en=["title"],er={key:0,class:"refs-row"},eo={colspan:"9"},ec={key:0,class:"text-sm text-gray-400 refs-empty"},ei={key:1,class:"refs-list"},es={class:"refs-title"},ed=["href"],eu=["href"];var em=(0,l.defineComponent)({__name:"DownloadManager",props:{embedded:{type:Boolean}},setup(e){let t=(0,l.ref)([]),a=(0,l.ref)(!1),r=(0,l.ref)({}),o=(0,l.ref)(!1),c=(0,l.ref)(!1),s=new Set,m=(0,l.ref)(new Set),p=(0,l.ref)(!1),V=(0,l.ref)(null),N=(0,l.ref)(!1),y=(0,l.ref)(null);function g(e){return e?.response?.data?.detail||e?.response?.data?.title||e?.message||"请求失败,请稍后重试"}async function k(e){let t=`${window.location.origin}/download/${e}`;try{await navigator.clipboard.writeText(t),n.Toast.success("下载链接已复制")}catch{let e=document.createElement("textarea");e.value=t,document.body.appendChild(e),e.select();try{document.execCommand("copy"),n.Toast.success("下载链接已复制")}catch{n.Toast.error("复制失败,请手动复制")}document.body.removeChild(e)}}async function h(){a.value=!0;try{t.value=((await i()).items??[]).filter(e=>!s.has(e.metadata.name))}catch(e){n.Toast.error(g(e))}finally{a.value=!1}}async function E(){o.value=!0;try{r.value=await f()??{}}catch(e){n.Toast.error(g(e))}finally{o.value=!1}}async function w(){c.value=!0;try{r.value=await v()??{},n.Toast.success("引用扫描已刷新"),h()}catch(e){n.Toast.error(g(e))}finally{c.value=!1}}function x(){V.value=null,p.value=!0}async function b(e,t){let a=e.spec.enabled;e.spec.enabled=t;try{await d(e.metadata.name,{...e.spec,enabled:t}),n.Toast.success(t?"已启用":"已停用")}catch(t){e.spec.enabled=a,n.Toast.error(g(t)),h()}}function C(e,t){h(),t&&e.spec.enabled&&n.Toast.success(`下载链接:/download/${e.spec.slug}`)}return(0,l.onMounted)(()=>{h(),E()}),(i,d)=>((0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,null,[e.embedded?(0,l.createCommentVNode)("",!0):((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VPageHeader),{key:0,title:"下载管理"})),(0,l.createElementVNode)("div",Q,[(0,l.createVNode)((0,l.unref)(n.VCard),null,{default:(0,l.withCtx)(()=>[(0,l.createElementVNode)("div",W,[(0,l.createElementVNode)("div",X," 共 "+(0,l.toDisplayString)(t.value.length)+" 个下载资源 ",1),(0,l.createVNode)((0,l.unref)(n.VSpace),null,{default:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"primary",onClick:x},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconAddCircle))]),default:(0,l.withCtx)(()=>[d[3]||(d[3]=(0,l.createTextVNode)(" 新建资源 ",-1))]),_:1}),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"secondary",loading:c.value,onClick:w},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRefreshLine))]),default:(0,l.withCtx)(()=>[d[4]||(d[4]=(0,l.createTextVNode)(" 刷新引用扫描 ",-1))]),_:1},8,["loading"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",loading:a.value||o.value,onClick:d[0]||(d[0]=e=>{h(),E()})},{default:(0,l.withCtx)(()=>[...d[5]||(d[5]=[(0,l.createTextVNode)(" 刷新 ",-1)])]),_:1},8,["loading"])]),_:1})]),a.value?((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VLoading),{key:0})):0===t.value.length?((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VEmpty),{key:1,title:"暂无下载资源",message:"点击右上角「新建资源」创建第一个资源下载链接"})):((0,l.openBlock)(),(0,l.createElementBlock)("div",Y,[(0,l.createElementVNode)("table",Z,[d[12]||(d[12]=(0,l.createElementVNode)("thead",null,[(0,l.createElementVNode)("tr",null,[(0,l.createElementVNode)("th",null,"名称"),(0,l.createElementVNode)("th",null,"下载链接"),(0,l.createElementVNode)("th",null,"附件"),(0,l.createElementVNode)("th",null,"邮箱验证"),(0,l.createElementVNode)("th",null,"启用"),(0,l.createElementVNode)("th",null,"引用文章"),(0,l.createElementVNode)("th",null,"下载数"),(0,l.createElementVNode)("th",null,"下载人数"),(0,l.createElementVNode)("th",{class:"w-56"},"操作")])],-1)),(0,l.createElementVNode)("tbody",null,[((0,l.openBlock)(!0),(0,l.createElementBlock)(l.Fragment,null,(0,l.renderList)(t.value,e=>((0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,{key:e.metadata.name},[(0,l.createElementVNode)("tr",null,[(0,l.createElementVNode)("td",ee,[(0,l.createElementVNode)("div",null,(0,l.toDisplayString)(e.spec.displayName),1),e.spec.description?((0,l.openBlock)(),(0,l.createElementBlock)("div",{key:0,class:"text-xs text-gray-400 desc-line",title:e.spec.description},(0,l.toDisplayString)(e.spec.description),9,et)):(0,l.createCommentVNode)("",!0)]),(0,l.createElementVNode)("td",null,[(0,l.createElementVNode)("div",ea,[(0,l.createElementVNode)("code",el,"/download/"+(0,l.toDisplayString)(e.spec.slug),1),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",ghost:"",onClick:t=>k(e.spec.slug)},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconClipboardLine))]),default:(0,l.withCtx)(()=>[d[6]||(d[6]=(0,l.createTextVNode)(" 复制 ",-1))]),_:1},8,["onClick"])])]),(0,l.createElementVNode)("td",{class:"cell-ellipsis",title:e.spec.attachmentName},(0,l.toDisplayString)(e.spec.attachmentName||"-"),9,en),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VTag),{theme:e.spec.requireEmailVerify?"primary":"default"},{default:(0,l.withCtx)(()=>[(0,l.createTextVNode)((0,l.toDisplayString)(e.spec.requireEmailVerify?"需要":"不需要"),1)]),_:2},1032,["theme"])]),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VSwitch),{"model-value":e.spec.enabled??!1,onChange:t=>b(e,t)},null,8,["model-value","onChange"])]),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",ghost:"",onClick:t=>{var a;let l;return a=e.spec.slug,void((l=new Set(m.value)).has(a)?l.delete(a):l.add(a),m.value=l)}},{default:(0,l.withCtx)(()=>[(0,l.createTextVNode)((0,l.toDisplayString)(e.stats?.referenceCount??0)+" 篇 "+(0,l.toDisplayString)(m.value.has(e.spec.slug)?"▲":"▼"),1)]),_:2},1032,["onClick"])]),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.status?.downloadCount??0),1),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.stats?.downloaderCount??0),1),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VSpace),null,{default:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",onClick:t=>{y.value=e,N.value=!0}},{default:(0,l.withCtx)(()=>[...d[7]||(d[7]=[(0,l.createTextVNode)(" 记录 ",-1)])]),_:1},8,["onClick"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"secondary",onClick:t=>{V.value=e,p.value=!0}},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRiPencilFill))]),default:(0,l.withCtx)(()=>[d[8]||(d[8]=(0,l.createTextVNode)(" 编辑 ",-1))]),_:1},8,["onClick"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"danger",ghost:"",onClick:a=>{n.Dialog.warning({title:"删除下载资源",description:`确定要删除资源「${e.spec.displayName}」吗?删除后下载链接 /download/${e.spec.slug} 将立即失效。`,confirmType:"danger",confirmText:"删除",cancelText:"取消",onConfirm:async()=>{try{await u(e.metadata.name),s.add(e.metadata.name),setTimeout(()=>s.delete(e.metadata.name),3e3),t.value=t.value.filter(t=>t.metadata.name!==e.metadata.name),n.Toast.success(`已删除资源「${e.spec.displayName}」`),h()}catch(e){n.Toast.error(g(e))}}})}},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconDeleteBin))]),default:(0,l.withCtx)(()=>[d[9]||(d[9]=(0,l.createTextVNode)(" 删除 ",-1))]),_:1},8,["onClick"])]),_:2},1024)])]),m.value.has(e.spec.slug)?((0,l.openBlock)(),(0,l.createElementBlock)("tr",er,[(0,l.createElementVNode)("td",eo,[0===(r.value[e.spec.slug]??[]).length?((0,l.openBlock)(),(0,l.createElementBlock)("div",ec," 暂无文章引用该资源(可在编辑器中插入 /download/"+(0,l.toDisplayString)(e.spec.slug)+" 链接后点击「刷新引用扫描」) ",1)):((0,l.openBlock)(),(0,l.createElementBlock)("ul",ei,[((0,l.openBlock)(!0),(0,l.createElementBlock)(l.Fragment,null,(0,l.renderList)(r.value[e.spec.slug],e=>((0,l.openBlock)(),(0,l.createElementBlock)("li",{key:e.postName},[(0,l.createElementVNode)("span",es,(0,l.toDisplayString)(e.title),1),(0,l.createElementVNode)("a",{class:"refs-link",href:e.editorUrl,target:"_blank",rel:"noopener noreferrer"},[(0,l.createVNode)((0,l.unref)(n.IconExternalLinkLine)),d[10]||(d[10]=(0,l.createTextVNode)(" 编辑器 ",-1))],8,ed),(0,l.createElementVNode)("a",{class:"refs-link",href:e.permalink,target:"_blank",rel:"noopener noreferrer"},[(0,l.createVNode)((0,l.unref)(n.IconExternalLinkLine)),d[11]||(d[11]=(0,l.createTextVNode)(" 访问 ",-1))],8,eu)]))),128))]))])])):(0,l.createCommentVNode)("",!0)],64))),128))])])]))]),_:1}),(0,l.createVNode)(A,{visible:p.value,"onUpdate:visible":d[1]||(d[1]=e=>p.value=e),resource:V.value,onSaved:C},null,8,["visible","resource"]),(0,l.createVNode)(J,{visible:N.value,"onUpdate:visible":d[2]||(d[2]=e=>N.value=e),resource:y.value},null,8,["visible","resource"])])],64))}});let ep=(0,F.A)(em,[["__scopeId","data-v-9127f5d6"]]),ef={class:"link-form"},ev={class:"form-item form-item--column"},eV={class:"form-item form-item--column"},eN=["disabled"],ey={key:0,class:"form-hint"},eg={key:1,class:"form-hint"},ek={class:"form-item form-item--column"},eh={class:"form-item form-item--column"},eE={class:"form-item"},ew={class:"form-item"};var ex=(0,l.defineComponent)({__name:"LinkFormModal",props:{visible:{type:Boolean},link:{}},emits:["update:visible","saved"],setup(e,t){let{emit:a}=t,r=/^[a-z0-9][a-z0-9-]{0,63}$/,o=(0,l.computed)(()=>null!==e.link),c=(0,l.ref)({slug:"",displayName:"",description:"",targetUrl:"",requireEmailVerify:!1,enabled:!0}),i=(0,l.ref)(!1);function s(){a("update:visible",!1)}async function d(){let t=c.value.displayName.trim(),l=c.value.slug.trim(),d=(c.value.targetUrl??"").trim();if(!t)return void n.Toast.warning("请填写链接名称");if(!l)return void n.Toast.warning("请填写 slug");if(!o.value&&!r.test(l))return void n.Toast.warning("slug 只能包含小写字母、数字和中划线,且必须以字母或数字开头(最长 64 位)");if(!function(e){try{let t=new URL(e);return("http:"===t.protocol||"https:"===t.protocol)&&!!t.hostname}catch{return!1}}(d))return void n.Toast.warning("目标链接必须是合法的 http/https 地址");i.value=!0;try{if(o.value&&e.link){let l={...e.link.spec,displayName:t,description:c.value.description?.trim()??"",targetUrl:d,requireEmailVerify:c.value.requireEmailVerify,enabled:c.value.enabled},r=await g(e.link.metadata.name,l);n.Toast.success("链接已更新"),a("saved",r,!1)}else{let e=await y({slug:l,displayName:t,description:c.value.description?.trim()??"",targetUrl:d,requireEmailVerify:c.value.requireEmailVerify,enabled:c.value.enabled});n.Toast.success("链接已创建"),a("saved",e,!0)}s()}catch(e){n.Toast.error(e?.response?.data?.detail||e?.response?.data?.title||e?.message||"保存失败,请稍后重试")}finally{i.value=!1}}return(0,l.watch)(()=>e.visible,t=>{if(t)if(e.link){let t=e.link.spec;c.value={slug:t.slug,displayName:t.displayName,description:t.description??"",targetUrl:t.targetUrl??"",requireEmailVerify:t.requireEmailVerify??!1,enabled:t.enabled??!0}}else c.value={slug:"",displayName:"",description:"",targetUrl:"",requireEmailVerify:!1,enabled:!0}}),(t,u)=>((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VModal),{visible:e.visible,title:o.value?"编辑受保护链接":"新建受保护链接",width:640,"onUpdate:visible":u[7]||(u[7]=e=>a("update:visible",e)),onClose:s},{footer:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{type:"primary",loading:i.value,onClick:d},{default:(0,l.withCtx)(()=>[...u[15]||(u[15]=[(0,l.createTextVNode)(" 保存 ",-1)])]),_:1},8,["loading"]),(0,l.createVNode)((0,l.unref)(n.VButton),{type:"default",onClick:s},{default:(0,l.withCtx)(()=>[...u[16]||(u[16]=[(0,l.createTextVNode)("取消",-1)])]),_:1})]),default:(0,l.withCtx)(()=>[(0,l.createElementVNode)("div",ef,[(0,l.createElementVNode)("div",ev,[u[8]||(u[8]=(0,l.createElementVNode)("label",{class:"form-label"},[(0,l.createTextVNode)(" 链接名称 "),(0,l.createElementVNode)("span",{class:"required"},"*")],-1)),(0,l.withDirectives)((0,l.createElementVNode)("input",{"onUpdate:modelValue":u[0]||(u[0]=e=>c.value.displayName=e),class:"form-input",type:"text",placeholder:"例如:内部文档"},null,512),[[l.vModelText,c.value.displayName]])]),(0,l.createElementVNode)("div",eV,[u[9]||(u[9]=(0,l.createElementVNode)("label",{class:"form-label"},[(0,l.createTextVNode)(" slug "),(0,l.createElementVNode)("span",{class:"required"},"*")],-1)),(0,l.withDirectives)((0,l.createElementVNode)("input",{"onUpdate:modelValue":u[1]||(u[1]=e=>c.value.slug=e),class:"form-input",type:"text",disabled:o.value,placeholder:"例如:internal-docs(访问链接为 /link/{slug})"},null,8,eN),[[l.vModelText,c.value.slug]]),o.value?((0,l.openBlock)(),(0,l.createElementBlock)("div",ey,"slug 创建后不可修改")):((0,l.openBlock)(),(0,l.createElementBlock)("div",eg," 小写字母、数字、中划线,以字母或数字开头,最长 64 位;留空时可根据目标链接自动生成 "))]),(0,l.createElementVNode)("div",ek,[u[10]||(u[10]=(0,l.createElementVNode)("label",{class:"form-label"},[(0,l.createTextVNode)(" 目标链接 "),(0,l.createElementVNode)("span",{class:"required"},"*")],-1)),(0,l.withDirectives)((0,l.createElementVNode)("input",{"onUpdate:modelValue":u[2]||(u[2]=e=>c.value.targetUrl=e),class:"form-input",type:"url",placeholder:"https://example.com/secret-page",onBlur:u[3]||(u[3]=e=>{o.value||c.value.slug||!c.value.targetUrl||(c.value.slug=function(e){try{let t=new URL(e.trim()),a=(t.pathname.split("/").filter(Boolean).pop()??t.hostname).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64).replace(/^-+|-+$/g,"");return r.test(a)?a:""}catch{return""}}(c.value.targetUrl)||Math.random().toString(36).slice(2,10))})},null,544),[[l.vModelText,c.value.targetUrl]]),u[11]||(u[11]=(0,l.createElementVNode)("div",{class:"form-hint"}," 访客完成验证后将被 302 跳转到该地址;真实地址不会在门禁页展示 ",-1))]),(0,l.createElementVNode)("div",eh,[u[12]||(u[12]=(0,l.createElementVNode)("label",{class:"form-label"},"描述",-1)),(0,l.withDirectives)((0,l.createElementVNode)("textarea",{"onUpdate:modelValue":u[4]||(u[4]=e=>c.value.description=e),class:"form-input",rows:"3",placeholder:"可选,向访客说明链接内容"},null,512),[[l.vModelText,c.value.description]])]),(0,l.createElementVNode)("div",eE,[u[13]||(u[13]=(0,l.createElementVNode)("span",{class:"form-label"},"需要邮箱验证",-1)),(0,l.createVNode)((0,l.unref)(n.VSwitch),{modelValue:c.value.requireEmailVerify,"onUpdate:modelValue":u[5]||(u[5]=e=>c.value.requireEmailVerify=e)},null,8,["modelValue"])]),(0,l.createElementVNode)("div",ew,[u[14]||(u[14]=(0,l.createElementVNode)("span",{class:"form-label"},"启用",-1)),(0,l.createVNode)((0,l.unref)(n.VSwitch),{modelValue:c.value.enabled,"onUpdate:modelValue":u[6]||(u[6]=e=>c.value.enabled=e)},null,8,["modelValue"])])])]),_:1},8,["visible","title"]))}});let eb=(0,F.A)(ex,[["__scopeId","data-v-760eafaf"]]),eC={class:"link-manager-page m-4"},eB={class:"card-toolbar"},eT={class:"text-sm text-gray-500"},e_={key:2,class:"table-wrapper"},eS={class:"link-table"},e$={class:"font-medium"},eD=["title"],eI={class:"link-cell"},eU={class:"link-code"},eq=["href","title"],ez={key:0,class:"refs-row"},eL={colspan:"9"},eM={key:0,class:"text-sm text-gray-400 refs-empty"},eF={key:1,class:"refs-list"},eA={class:"refs-title"},eR=["href"],eP=["href"];var eH=(0,l.defineComponent)({__name:"LinkManager",props:{embedded:{type:Boolean}},setup(e){let t=(0,l.ref)([]),a=(0,l.ref)(!1),r=(0,l.ref)({}),o=(0,l.ref)(!1),c=(0,l.ref)(!1),i=new Set,s=(0,l.ref)(new Set),d=(0,l.ref)(!1),u=(0,l.ref)(null),m=(0,l.ref)(!1),p=(0,l.ref)(null);function f(e){return e?.response?.data?.detail||e?.response?.data?.title||e?.message||"请求失败,请稍后重试"}async function v(e){let t=`${window.location.origin}/link/${e}`;try{await navigator.clipboard.writeText(t),n.Toast.success("访问链接已复制")}catch{let e=document.createElement("textarea");e.value=t,document.body.appendChild(e),e.select();try{document.execCommand("copy"),n.Toast.success("访问链接已复制")}catch{n.Toast.error("复制失败,请手动复制")}document.body.removeChild(e)}}async function V(){a.value=!0;try{t.value=((await N()).items??[]).filter(e=>!i.has(e.metadata.name))}catch(e){n.Toast.error(f(e))}finally{a.value=!1}}async function y(){o.value=!0;try{r.value=await w()??{}}catch(e){n.Toast.error(f(e))}finally{o.value=!1}}async function h(){c.value=!0;try{r.value=await x()??{},n.Toast.success("引用扫描已刷新"),V()}catch(e){n.Toast.error(f(e))}finally{c.value=!1}}function E(){u.value=null,d.value=!0}async function b(e,t){let a=e.spec.enabled;e.spec.enabled=t;try{await g(e.metadata.name,{...e.spec,enabled:t}),n.Toast.success(t?"已启用":"已停用")}catch(t){e.spec.enabled=a,n.Toast.error(f(t)),V()}}function C(e,t){V(),t&&e.spec.enabled&&n.Toast.success(`访问链接:/link/${e.spec.slug}`)}return(0,l.onMounted)(()=>{V(),y()}),(N,g)=>((0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,null,[e.embedded?(0,l.createCommentVNode)("",!0):((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VPageHeader),{key:0,title:"链接访问管理"})),(0,l.createElementVNode)("div",eC,[(0,l.createVNode)((0,l.unref)(n.VCard),null,{default:(0,l.withCtx)(()=>[(0,l.createElementVNode)("div",eB,[(0,l.createElementVNode)("div",eT," 共 "+(0,l.toDisplayString)(t.value.length)+" 个受保护链接 ",1),(0,l.createVNode)((0,l.unref)(n.VSpace),null,{default:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"primary",onClick:E},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconAddCircle))]),default:(0,l.withCtx)(()=>[g[3]||(g[3]=(0,l.createTextVNode)(" 新建链接 ",-1))]),_:1}),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"secondary",loading:c.value,onClick:h},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRefreshLine))]),default:(0,l.withCtx)(()=>[g[4]||(g[4]=(0,l.createTextVNode)(" 刷新引用扫描 ",-1))]),_:1},8,["loading"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",loading:a.value||o.value,onClick:g[0]||(g[0]=e=>{V(),y()})},{default:(0,l.withCtx)(()=>[...g[5]||(g[5]=[(0,l.createTextVNode)(" 刷新 ",-1)])]),_:1},8,["loading"])]),_:1})]),a.value?((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VLoading),{key:0})):0===t.value.length?((0,l.openBlock)(),(0,l.createBlock)((0,l.unref)(n.VEmpty),{key:1,title:"暂无受保护链接",message:"点击右上角「新建链接」为任意 http/https 地址创建访问门禁"})):((0,l.openBlock)(),(0,l.createElementBlock)("div",e_,[(0,l.createElementVNode)("table",eS,[g[12]||(g[12]=(0,l.createElementVNode)("thead",null,[(0,l.createElementVNode)("tr",null,[(0,l.createElementVNode)("th",null,"名称"),(0,l.createElementVNode)("th",null,"访问链接"),(0,l.createElementVNode)("th",null,"目标链接"),(0,l.createElementVNode)("th",null,"邮箱验证"),(0,l.createElementVNode)("th",null,"启用"),(0,l.createElementVNode)("th",null,"引用文章"),(0,l.createElementVNode)("th",null,"访问数"),(0,l.createElementVNode)("th",null,"访问人数"),(0,l.createElementVNode)("th",{class:"w-56"},"操作")])],-1)),(0,l.createElementVNode)("tbody",null,[((0,l.openBlock)(!0),(0,l.createElementBlock)(l.Fragment,null,(0,l.renderList)(t.value,e=>((0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,{key:e.metadata.name},[(0,l.createElementVNode)("tr",null,[(0,l.createElementVNode)("td",e$,[(0,l.createElementVNode)("div",null,(0,l.toDisplayString)(e.spec.displayName),1),e.spec.description?((0,l.openBlock)(),(0,l.createElementBlock)("div",{key:0,class:"text-xs text-gray-400 desc-line",title:e.spec.description},(0,l.toDisplayString)(e.spec.description),9,eD)):(0,l.createCommentVNode)("",!0)]),(0,l.createElementVNode)("td",null,[(0,l.createElementVNode)("div",eI,[(0,l.createElementVNode)("code",eU,"/link/"+(0,l.toDisplayString)(e.spec.slug),1),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",ghost:"",onClick:t=>v(e.spec.slug)},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconClipboardLine))]),default:(0,l.withCtx)(()=>[g[6]||(g[6]=(0,l.createTextVNode)(" 复制 ",-1))]),_:1},8,["onClick"])])]),(0,l.createElementVNode)("td",null,[(0,l.createElementVNode)("a",{class:"target-link",href:e.spec.targetUrl,target:"_blank",rel:"noopener noreferrer",title:e.spec.targetUrl},[(0,l.createTextVNode)((0,l.toDisplayString)(e.spec.targetUrl)+" ",1),(0,l.createVNode)((0,l.unref)(n.IconExternalLinkLine))],8,eq)]),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VTag),{theme:e.spec.requireEmailVerify?"primary":"default"},{default:(0,l.withCtx)(()=>[(0,l.createTextVNode)((0,l.toDisplayString)(e.spec.requireEmailVerify?"需要":"不需要"),1)]),_:2},1032,["theme"])]),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VSwitch),{"model-value":e.spec.enabled??!1,onChange:t=>b(e,t)},null,8,["model-value","onChange"])]),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",ghost:"",onClick:t=>{var a;let l;return a=e.spec.slug,void((l=new Set(s.value)).has(a)?l.delete(a):l.add(a),s.value=l)}},{default:(0,l.withCtx)(()=>[(0,l.createTextVNode)((0,l.toDisplayString)(e.stats?.referenceCount??0)+" 篇 "+(0,l.toDisplayString)(s.value.has(e.spec.slug)?"▲":"▼"),1)]),_:2},1032,["onClick"])]),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.status?.visitCount??0),1),(0,l.createElementVNode)("td",null,(0,l.toDisplayString)(e.stats?.visitorCount??0),1),(0,l.createElementVNode)("td",null,[(0,l.createVNode)((0,l.unref)(n.VSpace),null,{default:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"default",onClick:t=>{p.value=e,m.value=!0}},{default:(0,l.withCtx)(()=>[...g[7]||(g[7]=[(0,l.createTextVNode)(" 记录 ",-1)])]),_:1},8,["onClick"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"secondary",onClick:t=>{u.value=e,d.value=!0}},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconRiPencilFill))]),default:(0,l.withCtx)(()=>[g[8]||(g[8]=(0,l.createTextVNode)(" 编辑 ",-1))]),_:1},8,["onClick"]),(0,l.createVNode)((0,l.unref)(n.VButton),{size:"sm",type:"danger",ghost:"",onClick:a=>{n.Dialog.warning({title:"删除受保护链接",description:`确定要删除链接「${e.spec.displayName}」吗?删除后访问链接 /link/${e.spec.slug} 将立即失效。`,confirmType:"danger",confirmText:"删除",cancelText:"取消",onConfirm:async()=>{try{await k(e.metadata.name),i.add(e.metadata.name),setTimeout(()=>i.delete(e.metadata.name),3e3),t.value=t.value.filter(t=>t.metadata.name!==e.metadata.name),n.Toast.success(`已删除链接「${e.spec.displayName}」`),V()}catch(e){n.Toast.error(f(e))}}})}},{icon:(0,l.withCtx)(()=>[(0,l.createVNode)((0,l.unref)(n.IconDeleteBin))]),default:(0,l.withCtx)(()=>[g[9]||(g[9]=(0,l.createTextVNode)(" 删除 ",-1))]),_:1},8,["onClick"])]),_:2},1024)])]),s.value.has(e.spec.slug)?((0,l.openBlock)(),(0,l.createElementBlock)("tr",ez,[(0,l.createElementVNode)("td",eL,[0===(r.value[e.spec.slug]??[]).length?((0,l.openBlock)(),(0,l.createElementBlock)("div",eM," 暂无文章引用该链接(可在编辑器中插入 /link/"+(0,l.toDisplayString)(e.spec.slug)+" 链接后点击「刷新引用扫描」) ",1)):((0,l.openBlock)(),(0,l.createElementBlock)("ul",eF,[((0,l.openBlock)(!0),(0,l.createElementBlock)(l.Fragment,null,(0,l.renderList)(r.value[e.spec.slug],e=>((0,l.openBlock)(),(0,l.createElementBlock)("li",{key:e.postName},[(0,l.createElementVNode)("span",eA,(0,l.toDisplayString)(e.title),1),(0,l.createElementVNode)("a",{class:"refs-link",href:e.editorUrl,target:"_blank",rel:"noopener noreferrer"},[(0,l.createVNode)((0,l.unref)(n.IconExternalLinkLine)),g[10]||(g[10]=(0,l.createTextVNode)(" 编辑器 ",-1))],8,eR),(0,l.createElementVNode)("a",{class:"refs-link",href:e.permalink,target:"_blank",rel:"noopener noreferrer"},[(0,l.createVNode)((0,l.unref)(n.IconExternalLinkLine)),g[11]||(g[11]=(0,l.createTextVNode)(" 访问 ",-1))],8,eP)]))),128))]))])])):(0,l.createCommentVNode)("",!0)],64))),128))])])]))]),_:1}),(0,l.createVNode)(eb,{visible:d.value,"onUpdate:visible":g[1]||(g[1]=e=>d.value=e),link:u.value,onSaved:C},null,8,["visible","link"]),(0,l.createVNode)(J,{visible:m.value,"onUpdate:visible":g[2]||(g[2]=e=>m.value=e),kind:"link",resource:p.value},null,8,["visible","resource"])])],64))}});let ej=(0,F.A)(eH,[["__scopeId","data-v-e1bcba19"]]),eG={class:"resource-manager m-4"},eK={class:"resource-manager__body"};var eO=(0,l.defineComponent)({__name:"ResourceManager",setup(e){let t=(0,l.ref)("download");return(e,a)=>((0,l.openBlock)(),(0,l.createElementBlock)(l.Fragment,null,[(0,l.createVNode)((0,l.unref)(n.VPageHeader),{title:"资源访问管理"}),(0,l.createElementVNode)("div",eG,[(0,l.createVNode)((0,l.unref)(n.VTabbar),{"active-id":t.value,"onUpdate:activeId":a[0]||(a[0]=e=>t.value=e),items:[{id:"download",label:"下载资源"},{id:"link",label:"受保护链接"}]},null,8,["active-id"]),(0,l.createElementVNode)("div",eK,["download"===t.value?((0,l.openBlock)(),(0,l.createBlock)(ep,{key:0,embedded:""})):((0,l.openBlock)(),(0,l.createBlock)(ej,{key:1,embedded:""}))])])],64))}}),eJ=(0,F.A)(eO,[["__scopeId","data-v-2715b11d"]])}}]); \ No newline at end of file diff --git a/src/main/resources/console/main.js b/src/main/resources/console/main.js index 3995876..5e33a37 100644 --- a/src/main/resources/console/main.js +++ b/src/main/resources/console/main.js @@ -1 +1 @@ -(()=>{"use strict";var e,r,n,t,o,a={"./src/index.ts"(e,r,n){n.d(r,{default:()=>i});var t=n("@halo-dev/components"),o=window.HaloUiShared,a=n("vue"),i=(0,o.definePlugin)({components:{},routes:[{parentName:"Root",route:{path:"/resource-manager",name:"ResourceManager",component:()=>n.e(631).then(n.bind(n,"./src/views/ResourceManager.vue")),meta:{title:"资源访问管理",permissions:["plugin:sharelink:view"],menu:{name:"资源访问管理",group:"content",icon:(0,a.markRaw)(t.IconArrowDownCircleLine),priority:52}}}},{parentName:"Root",route:{path:"/download-manager",name:"DownloadManagerRedirect",redirect:"/resource-manager"}},{parentName:"Root",route:{path:"/link-manager",name:"LinkManagerRedirect",redirect:"/resource-manager"}}],extensionPoints:{}})},"@halo-dev/api-client"(e){e.exports=window.HaloApiClient},"@halo-dev/components"(e){e.exports=window.HaloComponents},vue(e){e.exports=window.Vue}},i={};function s(e){var r=i[e];if(void 0!==r)return r.exports;var n=i[e]={exports:{}};return a[e](n,n.exports,s),n.exports}if(s.m=a,s.d=(e,r,n)=>{var t=(r,n)=>{for(var t in r)s.o(r,t)&&!s.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,[n]:r[t]})};t(r,"get"),t(n,"value")},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce((r,n)=>(s.f[n](e,r),r),[])),s.u=e=>631===e?"chunks/631.9382678d.js":""+e+".javascript",s.miniCssF=e=>631===e?"chunks/631.d30af8f8.css":""+e+".css",s.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e={},r="sharelink:",s.l=function(n,t,o,a){if(e[n])return void e[n].push(t);if(void 0!==o)for(var i,u,l=document.getElementsByTagName("script"),d=0;d{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.p="/plugins/sharelink/assets/console/","u">typeof document){var u=function(e,r,n,t,o,a){var i=document.createElement("link");return i.rel="stylesheet",i.type="text/css",s.nc&&(i.nonce=s.nc),i.href=r,i.onerror=i.onload=function(n){if(i.onerror=i.onload=null,"load"===n.type)t();else{var a=n&&("load"===n.type?"missing":n.type),s=n&&n.target&&n.target.href||r,u=Error("Loading CSS chunk "+e+" failed.\\n("+s+")");u.code="CSS_CHUNK_LOAD_FAILED",u.type=a,u.request=s,i.parentNode&&i.parentNode.removeChild(i),o(u)}},n?n.parentNode.insertBefore(i,n.nextSibling):document.head.appendChild(i),i},l=function(e,r){for(var n=document.getElementsByTagName("link"),t=0;tt=n[e]=[r,o]);r.push(t[2]=o);var a=s.p+s.u(e),i=Error();s.l(a,function(r){if(s.o(n,e)&&(0!==(t=n[e])&&(n[e]=void 0),t)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;i.message="Loading chunk "+e+" failed.\n("+o+": "+a+")",i.name="ChunkLoadError",i.type=o,i.request=a,t[1](i)}},"chunk-"+e,e)}},t=(e,r)=>{var t,o,[a,i,u]=r,l=0;if(a.some(e=>0!==n[e])){for(t in i)s.o(i,t)&&(s.m[t]=i[t]);u&&u(s)}for(e&&e(r);l{"use strict";var e,r,n,t,o,a={"./src/index.ts"(e,r,n){n.d(r,{default:()=>i});var t=n("@halo-dev/components"),o=window.HaloUiShared,a=n("vue"),i=(0,o.definePlugin)({components:{},routes:[{parentName:"Root",route:{path:"/resource-manager",name:"ResourceManager",component:()=>n.e(216).then(n.bind(n,"./src/views/ResourceManager.vue")),meta:{title:"资源访问管理",permissions:["plugin:sharelink:view"],menu:{name:"资源访问管理",group:"content",icon:(0,a.markRaw)(t.IconArrowDownCircleLine),priority:52}}}},{parentName:"Root",route:{path:"/download-manager",name:"DownloadManagerRedirect",redirect:"/resource-manager"}},{parentName:"Root",route:{path:"/link-manager",name:"LinkManagerRedirect",redirect:"/resource-manager"}}],extensionPoints:{}})},"@halo-dev/api-client"(e){e.exports=window.HaloApiClient},"@halo-dev/components"(e){e.exports=window.HaloComponents},vue(e){e.exports=window.Vue}},i={};function s(e){var r=i[e];if(void 0!==r)return r.exports;var n=i[e]={exports:{}};return a[e](n,n.exports,s),n.exports}if(s.m=a,s.d=(e,r,n)=>{var t=(r,n)=>{for(var t in r)s.o(r,t)&&!s.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,[n]:r[t]})};t(r,"get"),t(n,"value")},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce((r,n)=>(s.f[n](e,r),r),[])),s.u=e=>216===e?"chunks/216.a71ca438.js":""+e+".javascript",s.miniCssF=e=>216===e?"chunks/216.7732423c.css":""+e+".css",s.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e={},r="sharelink:",s.l=function(n,t,o,a){if(e[n])return void e[n].push(t);if(void 0!==o)for(var i,u,l=document.getElementsByTagName("script"),d=0;d{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.p="/plugins/sharelink/assets/console/","u">typeof document){var u=function(e,r,n,t,o,a){var i=document.createElement("link");return i.rel="stylesheet",i.type="text/css",s.nc&&(i.nonce=s.nc),i.href=r,i.onerror=i.onload=function(n){if(i.onerror=i.onload=null,"load"===n.type)t();else{var a=n&&("load"===n.type?"missing":n.type),s=n&&n.target&&n.target.href||r,u=Error("Loading CSS chunk "+e+" failed.\\n("+s+")");u.code="CSS_CHUNK_LOAD_FAILED",u.type=a,u.request=s,i.parentNode&&i.parentNode.removeChild(i),o(u)}},n?n.parentNode.insertBefore(i,n.nextSibling):document.head.appendChild(i),i},l=function(e,r){for(var n=document.getElementsByTagName("link"),t=0;tt=n[e]=[r,o]);r.push(t[2]=o);var a=s.p+s.u(e),i=Error();s.l(a,function(r){if(s.o(n,e)&&(0!==(t=n[e])&&(n[e]=void 0),t)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;i.message="Loading chunk "+e+" failed.\n("+o+": "+a+")",i.name="ChunkLoadError",i.type=o,i.request=a,t[1](i)}},"chunk-"+e,e)}},t=(e,r)=>{var t,o,[a,i,u]=r,l=0;if(a.some(e=>0!==n[e])){for(t in i)s.o(i,t)&&(s.m[t]=i[t]);u&&u(s)}for(e&&e(r);l - + + -
+
@@ -244,7 +249,7 @@ watch(
-
+