优化性能 修复卡顿 修复各种bug

This commit is contained in:
QiuChenly
2025-11-14 04:00:32 +08:00
parent f0f79f04df
commit 34c2e46567
66 changed files with 2726 additions and 2528 deletions

1
frontend/dist/assets/4ypFp_vH.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
import{d as a,r as e,o as l,k as i,m as s,l as t,g as d,i as m,j as n,x as u,e as o,f as g,F as v,z as c,c as r,S as I}from"./PkdM_Em6.js"
import{_ as f,A as p,a as x}from"./iUIDG-9P.js"
import{d as a,r as e,o as l,k as i,m as s,l as t,g as d,i as m,j as n,x as u,e as o,f as g,F as v,z as c,c as r,V as I}from"./CD7TqNEc.js"
import{_ as f,A as p,a as x}from"./DTEPVF5R.js"
const k={class:"image-wrapper"},h={key:0,class:"image-loading"},_=["src"],y={key:0,class:"image-error"},w={key:0,class:"image-index"},b=x(a({__name:"ImageListItem",props:{imageId:{},showIndex:{type:Boolean,default:!1},index:{default:0},total:{default:0}},emits:["imageClick"],setup(a,{emit:g}){const v=a,c=g,r=e(!0),I=e(!1),x=e(null),b=()=>{r.value=!1},C=()=>{I.value=!0,r.value=!1},$=()=>{x.value&&c("imageClick",v.imageId,x.value)}
return l(()=>{(async()=>{if(!v.imageId)return I.value=!0,void(r.value=!1)
r.value=!0,I.value=!1,x.value=null

File diff suppressed because one or more lines are too long

View File

@@ -1,17 +0,0 @@
import{A as a}from"./Bcwzdu8R.js"
import{_ as s,A as e,a as l}from"./iUIDG-9P.js"
import{b as t}from"./BGR_u7Bv.js"
import{d as n,r as p,o as d,k as o,m as i,l as c,x as r,g as u,F as v,z as m,c as b,e as f}from"./PkdM_Em6.js"
import"./CK2jwJap.js"
const h={class:"apps-page"},y={class:"page-container"},g={key:0,class:"loading"},k={key:1,class:"error"},I={key:2,class:"empty"},j={key:3,class:"apps-grid"},A={key:4,class:"list-footer"},U={class:"footer-stats"},_={class:"stat-item"},V={class:"stat-value"},w=l(n({__name:"Apps",setup(l){const n=p([]),w=p(!0),x=p(""),C=async()=>{w.value=!0,x.value=""
try{const s=await e.getApps(),l=s.map(a=>a.bundleId),p={},d={}
s.forEach(a=>{a.version&&(p[a.bundleId]=a.version),a.bundleVersion&&(d[a.bundleId]=a.bundleVersion)})
let o=s
if(l.length>0)try{const a=await e.batchGetAppVersions(l,p,d)
if(a.success&&a.data){const e=a.data.hasUpdateMap||{}
o=s.map(s=>{var l,t
const n=a.data[s.bundleId]||[]
if(n.length>0){const a=(null==(l=n[0])?void 0:l.version)||"",p=e[s.bundleId]??!1
return{...s,update:{...s.update,versions:n,latestVersion:a,hasUpdate:p,feedUrl:(null==(t=s.update)?void 0:t.feedUrl)||""}}}return s})}}catch(a){}n.value=o.sort((a,s)=>a.name.localeCompare(s.name)),t(n.value).catch(a=>{})}catch(a){x.value="加载应用列表失败,请检查服务是否运行",n.value=[]}finally{w.value=!1}},z=async a=>{await C()}
return d(()=>{C()}),(e,l)=>(f(),o("div",h,[i("div",y,[l[4]||(l[4]=i("div",{class:"page-header"},[i("h1",{class:"page-title"},"所有应用"),i("p",{class:"page-description"},"系统中所有已安装的应用")],-1)),w.value?(f(),o("div",g,[...l[0]||(l[0]=[i("div",{class:"spinner"},null,-1),i("p",null,"加载应用中...",-1)])])):x.value?(f(),o("div",k,[i("p",null,r(x.value),1),i("button",{onClick:C,class:"btn btn-primary"},"重试")])):0===n.value.length?(f(),o("div",I,[u(s,{icon:"fluent-color:apps-24",class:"empty-icon"}),l[1]||(l[1]=i("p",null,"没有找到应用",-1)),l[2]||(l[2]=i("p",{class:"empty-hint"},"系统中没有已安装的应用",-1))])):(f(),o("div",j,[(f(!0),o(v,null,m(n.value,s=>(f(),b(a,{key:s.bundleId,app:s,mode:"list",onUpdated:z},null,8,["app"]))),128))])),n.value.length>0?(f(),o("div",A,[i("div",U,[i("span",_,[l[3]||(l[3]=i("span",{class:"stat-label"},"总计:",-1)),i("span",V,r(n.value.length),1)])])])):c("",!0)])]))}}),[["__scopeId","data-v-dc4bed26"]])
export{w as default}

217
frontend/dist/assets/BAJVn196.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
import{d as a,r as s,w as e,o as p,f as t,k as l,b as n,l as i,m as o,g as d,C as u,O as c,x as r,u as v,t as h,c as m,J as g,e as b}from"./PkdM_Em6.js"
import{c as y,A as k,_ as w,T as I,a as f}from"./iUIDG-9P.js"
import{u as C,L as j}from"./CK2jwJap.js"
import{d as a,r as s,w as e,o as p,f as t,k as l,b as n,l as i,m as o,g as d,C as u,O as c,x as r,u as v,t as h,c as m,J as g,e as b}from"./CD7TqNEc.js"
import{c as y,A as k,_ as w,T as I,a as f}from"./DTEPVF5R.js"
import{u as C,L as j}from"./CY6538_b.js"
const A={key:0,class:"status-badge"},_={key:0,class:"badge upgrade"},E={key:1,class:"badge injected"},R={class:"card-content"},U={class:"app-icon-wrapper"},V={class:"app-icon"},D=["src","alt"],L={class:"app-info"},T={class:"app-name"},$={key:0,class:"app-rating"},q={class:"category-tag"},x={key:1,class:"version-info"},B={key:0,class:"version-item"},J={class:"version-value"},M={key:1,class:"version-item latest"},O={class:"version-label"},S={class:"version-value"},z={key:2,class:"version-item bundle-id"},F={class:"version-value bundle-id-value"},G={key:2,class:"app-description"},H={class:"app-actions"},K=["disabled","title"],N={key:4,class:"button-tooltip"},P=f(a({__name:"AppCard",props:{app:{},mode:{default:"list"},showDescription:{type:Boolean,default:!1}},emits:["updated","openVersionDialog"],setup(a,{emit:f}){const P=a,Q=f,W=g(),X=s(!1),Y=s(!1),Z=s(null),{toasts:aa,warning:sa,removeToast:ea}=y(),pa=async()=>{if(P.app.iconId)try{const a=await k.getIcon(P.app.iconId,80,128,128)
Z.value=a,Y.value=!1}catch(a){Z.value=null,Y.value=!0}else Z.value=null}
e(()=>P.app.iconId,()=>{pa()},{immediate:!0}),p(()=>{P.app.iconId&&pa()})

View File

@@ -1,6 +1,6 @@
import{d as e,r as a,f as s,o as l,k as n,m as t,g as o,l as c,x as i,F as u,z as d,c as r,u as p,b as v,C as m,O as b,t as f,J as y,e as h}from"./PkdM_Em6.js"
import{c as g,_ as I,T as k,A as C,a as E}from"./iUIDG-9P.js"
import{P}from"./D8sLW-eU.js"
import{d as e,r as a,f as s,o as l,k as n,m as t,g as o,l as c,x as i,F as u,z as d,c as r,u as p,b as v,C as m,O as b,t as f,J as y,e as h}from"./CD7TqNEc.js"
import{c as g,_ as I,T as k,A as C,a as E}from"./DTEPVF5R.js"
import{P}from"./Cq_Y6BRc.js"
import{g as w,F as q}from"./6K6b4Qy_.js"
const U={class:"discussion-forums-page"},L={class:"page-container"},A={key:0,class:"loading"},F={key:1,class:"error"},N={key:2,class:"builtin-forums-section"},_={key:0,class:"forums-grid builtin-grid"},j=["onClick"],M={class:"forum-icon-wrapper"},R={class:"forum-icon builtin-icon"},D=["src","alt","onError"],S={key:2,class:"icon-placeholder"},x={class:"forum-info"},G={class:"forum-name"},O={key:0,class:"forum-description"},T={key:1,class:"forum-stats"},$={class:"stat-item"},z={class:"stat-item"},B={key:1,class:"empty-state"},J={key:3,class:"app-forums-section"},H={key:0,class:"app-loading"},K={key:1,class:"empty"},Q={key:2},V={class:"forums-grid"},W=["onClick"],X={class:"forum-icon-wrapper"},Y={class:"forum-icon"},Z=["src","alt","onLoad","onError"],ee={class:"forum-info"},ae={class:"forum-name"},se={class:"forum-bundle-id"},le={key:0,class:"forum-status-uninstalled"},ne={key:1,class:"forum-stats"},te={class:"stat-item"},oe={class:"stat-item"},ce={key:2,class:"forum-status-disabled"},ie=["onClick","disabled"],ue=E(e({__name:"DiscussionForums",setup(e){const E=y(),ue=a([]),de=a([]),re=a(!0),pe=a(!1),ve=a(""),me=g(),be=a(1),fe=a(20),ye=a(0),he=s(()=>Math.ceil(ye.value/fe.value)),ge=s(()=>ue.value),Ie=async()=>{try{const e=(await C.getAllForums()).filter(e=>"builtin"===e.type||"created"===e.type)
e.sort((e,a)=>"builtin"===e.type&&"created"===a.type?-1:"created"===e.type&&"builtin"===a.type?1:e.name.localeCompare(a.name)),de.value=e,de.value.forEach(e=>{"created"===e.type&&e.iconId&&ke(e.bundleId,e.iconId)})}catch(e){de.value=[]}},ke=async(e,a)=>{const s=de.value.find(a=>a.bundleId===e)

View File

@@ -1,4 +1,4 @@
import{r as e,f as l}from"./PkdM_Em6.js"
import{r as e,f as l}from"./CD7TqNEc.js"
function n(){const n=e(!1),o=e({title:"",type:"info",confirmText:"确定"})
let u=null
return{visible:l(()=>n.value),config:l(()=>o.value),show:e=>(o.value={...o.value,...e},n.value=!0,new Promise(e=>{u=e})),handleConfirm:()=>{n.value=!1,u&&(u(),u=null)}}}export{n as u}

File diff suppressed because one or more lines are too long

View File

@@ -1,23 +0,0 @@
import{A as a}from"./Bcwzdu8R.js"
import{_ as s,A as e,a as l}from"./iUIDG-9P.js"
import{d as t,r as n,f as p,o as i,k as c,m as d,l as o,x as u,g as r,F as v,z as h,c as m,e as b}from"./PkdM_Em6.js"
import"./CK2jwJap.js"
const f={class:"official-apps-page"},g={class:"page-container"},I={key:0,class:"loading"},y={key:1,class:"error"},k={key:2,class:"empty"},A={key:3},U={key:0,class:"app-section"},V={class:"apps-grid"},j={key:1,class:"app-section"},w={class:"apps-grid"},M={key:4,class:"list-footer"},_={class:"footer-stats"},C={class:"stat-item"},G={class:"stat-value"},x={class:"stat-item"},E={class:"stat-value"},z={class:"stat-item"},F={class:"stat-value"},N=l(t({__name:"OfficialApps",setup(l){const t=n([]),N=n(!0),O=n(""),Q=p(()=>t.value.sort((a,s)=>a.name.localeCompare(s.name))),q=p(()=>Q.value.filter(a=>a.path&&a.path.length>0)),B=p(()=>Q.value.filter(a=>!a.path||0===a.path.length)),D=async()=>{N.value=!0,O.value=""
try{const s=await e.getApps(),l=s.map(a=>a.bundleId),n={},p={}
if(s.forEach(a=>{a.version&&(n[a.bundleId]=a.version),a.bundleVersion&&(p[a.bundleId]=a.bundleVersion)}),0===l.length){const a=await e.batchGetAppVersions([],{},{})
if(a.success&&a.data){const s=a.data.notInstalledApps||[]
t.value=s.map(a=>H(a))}else t.value=[]}else{const i=await e.batchGetAppVersions(l,n,p)
if(i.success&&i.data){const l=i.data,n=[],p=l.versions||{},c=l.hasUpdateMap||{}
s.forEach(a=>{var s,e
const l=p[a.bundleId]
if(l&&l.length>0){const t=(null==(s=l[0])?void 0:s.version)||"",p=c[a.bundleId]??!1
n.push({...a,update:{hasUpdate:p,latestVersion:t,feedUrl:(null==(e=a.update)?void 0:e.feedUrl)||"",versions:l}})}})
const d=(l.notInstalledApps||[]).map(a=>H(a))
t.value=[...n,...d]
const o=d.map(a=>a.bundleId)
if(o.length>0)try{const a=await e.batchGetAppIconIds(o)
a.success&&a.iconIdMap&&(t.value=t.value.map(s=>!s.path&&a.iconIdMap[s.bundleId]?{...s,iconId:a.iconIdMap[s.bundleId]}:s))}catch(a){}}else t.value=[]}}catch(a){O.value="加载应用列表失败,请检查服务是否运行",t.value=[]}finally{N.value=!1}}
function H(a){var s
return{bundleId:a.bundleId,name:a.appName,version:"",bundleVersion:"",path:"",status:"supported",injection:null,update:a.versions.length>0?{hasUpdate:!1,latestVersion:(null==(s=a.versions[0])?void 0:s.version)||"",feedUrl:"",versions:a.versions}:null}}const J=async a=>{await D()}
return i(()=>{D()}),(e,l)=>(b(),c("div",f,[d("div",g,[l[8]||(l[8]=d("div",{class:"page-header"},[d("h1",{class:"page-title"},"来自官方"),d("p",{class:"page-description"},"浏览和下载经过 QiuChenly 认证的可信来源应用")],-1)),N.value?(b(),c("div",I,[...l[0]||(l[0]=[d("div",{class:"spinner"},null,-1),d("p",null,"加载应用中...",-1)])])):O.value?(b(),c("div",y,[d("p",null,u(O.value),1),d("button",{onClick:D,class:"btn btn-primary"},"重试")])):0===Q.value.length?(b(),c("div",k,[r(s,{icon:"fluent-color:shield-checkmark-24",class:"empty-icon"}),l[1]||(l[1]=d("p",null,"没有找到来自官方的应用",-1)),l[2]||(l[2]=d("p",{class:"empty-hint"},"当前没有可用的应用更新",-1))])):(b(),c("div",A,[q.value.length>0?(b(),c("div",U,[l[3]||(l[3]=d("h3",{class:"section-title"},"已安装的应用",-1)),d("div",V,[(b(!0),c(v,null,h(q.value,s=>(b(),m(a,{key:s.bundleId,app:s,mode:"list",onUpdated:J},null,8,["app"]))),128))])])):o("",!0),B.value.length>0?(b(),c("div",j,[l[4]||(l[4]=d("h3",{class:"section-title"},"未在此Mac上安装",-1)),d("div",w,[(b(!0),c(v,null,h(B.value,s=>(b(),m(a,{key:s.bundleId,app:s,mode:"list",onUpdated:J},null,8,["app"]))),128))])])):o("",!0)])),Q.value.length>0?(b(),c("div",M,[d("div",_,[d("span",C,[l[5]||(l[5]=d("span",{class:"stat-label"},"总计:",-1)),d("span",G,u(Q.value.length),1)]),d("span",x,[l[6]||(l[6]=d("span",{class:"stat-label"},"已安装:",-1)),d("span",E,u(q.value.length),1)]),d("span",z,[l[7]||(l[7]=d("span",{class:"stat-label"},"未安装:",-1)),d("span",F,u(B.value.length),1)])])])):o("",!0)])]))}}),[["__scopeId","data-v-843b7db8"]])
export{N as default}

View File

@@ -1,10 +1,10 @@
import{d as e,r as a,f as l,w as t,o as s,n as i,a as n,k as r,m as c,l as o,q as u,F as d,z as p,b as v,x as m,g,e as f,c as y,t as h,s as b,H as k,J as I}from"./PkdM_Em6.js"
import{A as w}from"./Bcwzdu8R.js"
import{_ as C,A,a as _}from"./iUIDG-9P.js"
import{C as U}from"./-1Ok8Jxz.js"
import{b as D}from"./BGR_u7Bv.js"
import"./CK2jwJap.js"
const $={class:"carousel-wrapper"},j={class:"slide-background"},V=["src"],P={class:"slide-content"},M={class:"content-wrapper"},x={key:0,class:"app-icon-wrapper"},L=["src","alt"],E={class:"app-info"},B={key:0,class:"app-price"},q={class:"app-title"},z={key:1,class:"app-description"},H={class:"app-actions"},S=["onClick"],F=["onClick"],W=["disabled"],G=["disabled"],N=["viewBox"],R=["cx","cy","r"],X=["d"],O={key:3,class:"carousel-indicators"},Y=["onClick"],Z=_(e({__name:"HeroBanner",props:{items:{},autoPlay:{type:Boolean,default:!0},autoPlayInterval:{default:5e3},progressSize:{default:18}},emits:["action","slideChange"],setup(e,{emit:y}){const h=e,b=y,k=a(0)
import{d as e,r as a,f as l,w as t,o as s,n as i,a as n,k as r,m as c,l as o,q as u,F as d,z as p,b as v,x as m,g,e as f,c as y,t as h,s as b,H as k,J as I}from"./CD7TqNEc.js"
import{A as w}from"./BDxeGjad.js"
import{_ as C,A,a as _}from"./DTEPVF5R.js"
import{C as U}from"./wbXCoqpH.js"
import{b as D}from"./DyA65EFq.js"
import"./CY6538_b.js"
const $={class:"carousel-wrapper"},j={class:"slide-background"},V=["src"],P={class:"slide-content"},M={class:"content-wrapper"},x={key:0,class:"app-icon-wrapper"},L=["src","alt"],E={class:"app-info"},B={key:0,class:"app-price"},q={class:"app-title"},z={key:1,class:"app-description"},F={class:"app-actions"},H=["onClick"],S=["onClick"],W=["disabled"],G=["disabled"],N=["viewBox"],R=["cx","cy","r"],X=["d"],O={key:3,class:"carousel-indicators"},Y=["onClick"],Z=_(e({__name:"HeroBanner",props:{items:{},autoPlay:{type:Boolean,default:!0},autoPlayInterval:{default:5e3},progressSize:{default:18}},emits:["action","slideChange"],setup(e,{emit:y}){const h=e,b=y,k=a(0)
let I=!1
const w=a(0)
let _=null,U=0
@@ -20,7 +20,7 @@ const e=w.value/100*h.autoPlayInterval
U=Date.now()-e,pe(!1)},pe=(e=!1)=>{_&&clearInterval(_),e&&re(),_=window.setInterval(()=>{I||(()=>{if(!h.autoPlay||I||h.items.length<=1)return
const e=(Date.now()-U)/h.autoPlayInterval*100
e>=100?(re(),ae(!0)):w.value=e})()},50)}
return t(()=>h.items,()=>{k.value>=h.items.length&&(k.value=0),D.value=new Array(h.items.length).fill(null),h.autoPlay&&h.items.length>1&&pe(!0),i(()=>{ie()})},{immediate:!0}),t(()=>k.value,()=>{ie()}),s(()=>{h.autoPlay&&h.items.length>1&&pe(!0),i(()=>{ie()})}),n(()=>{_&&(clearInterval(_),_=null)}),(a,l)=>(f(),r("div",{class:"hero-carousel",onMouseenter:ce,onMouseleave:oe},[c("div",$,[c("div",{class:"carousel-container",style:u({transform:`translateX(-${100*k.value}%)`})},[(f(!0),r(d,null,p(e.items,(e,a)=>(f(),r("div",{key:e.id||a,class:v(["carousel-slide",{active:a===k.value}])},[c("div",j,["video"===e.type&&e.videoUrl?(f(),r("video",{key:0,ref_for:!0,ref:e=>((e,a)=>{e&&(D.value[a]=e)})(e,a),class:v(["background-video",{active:a===k.value}]),src:e.videoUrl,muted:"",loop:"",playsinline:""},null,10,V)):(f(),r("div",{key:1,class:"background-image",style:u(T(e))},null,4)),l[0]||(l[0]=c("div",{class:"background-overlay"},null,-1))]),c("div",P,[c("div",M,[K(e)?(f(),r("div",x,[c("img",{src:K(e),alt:e.title,class:"app-icon",onError:Q},null,40,L)])):o("",!0),c("div",E,[e.price?(f(),r("div",B,m(e.price),1)):o("",!0),c("h2",q,m(e.title),1),e.description?(f(),r("p",z,m(e.description),1)):o("",!0)]),c("div",H,[e.primaryAction?(f(),r("button",{key:0,class:"action-button primary",onClick:a=>ee("primary",e)},m(e.primaryAction.label),9,S)):o("",!0),e.secondaryAction?(f(),r("button",{key:1,class:"action-button secondary",onClick:a=>ee("secondary",e)},m(e.secondaryAction.label),9,F)):o("",!0)])])])],2))),128))],4)]),e.items.length>1?(f(),r("button",{key:0,class:v(["nav-arrow nav-arrow-left",{visible:Z.value}]),onClick:te,disabled:0===k.value},[g(C,{icon:"mdi:triangle",class:"arrow-icon arrow-icon-left"})],10,W)):o("",!0),e.items.length>1?(f(),r("button",{key:1,class:v(["nav-arrow nav-arrow-right",{visible:Z.value}]),onClick:le,disabled:k.value===e.items.length-1},[g(C,{icon:"mdi:triangle",class:"arrow-icon arrow-icon-right"})],10,G)):o("",!0),e.items.length>1&&e.autoPlay?(f(),r("div",{key:2,class:"progress-indicator",style:u({width:`${J.value.size}px`,height:`${J.value.size}px`})},[(f(),r("svg",{class:"progress-circle",viewBox:J.value.viewBox,xmlns:"http://www.w3.org/2000/svg"},[c("circle",{class:"progress-track",cx:J.value.centerX,cy:J.value.centerY,r:J.value.radius,fill:"rgba(255, 255, 255, 0.2)"},null,8,R),c("path",{class:"progress-bar",d:ne(),fill:"white"},null,8,X)],8,N))],4)):o("",!0),e.items.length>1?(f(),r("div",O,[(f(!0),r(d,null,p(e.items,(e,a)=>(f(),r("button",{key:e.id||a,class:v(["indicator",{active:a===k.value}]),onClick:e=>(e=>{e>=0&&e<h.items.length&&(k.value=e,re(),se(),i(()=>{ie()}))})(a)},null,10,Y))),128))])):o("",!0)],32))}}),[["__scopeId","data-v-77596baf"]]),J={class:"right-sidebar"},T={key:0,class:"featured-app-card"},K={class:"featured-app-content"},Q={class:"featured-app-icon"},ee=["src","alt"],ae={class:"featured-app-info"},le={key:0,class:"app-price"},te={class:"app-name"},se={key:1,class:"app-version"},ie={key:2,class:"app-description"},ne={class:"bottom-cards"},re={key:0,class:"card image-viewer-card"},ce={class:"card-icon-container"},oe={class:"main-icon"},ue=["src"],de={class:"format-icons"},pe={class:"card-title"},ve={key:1,class:"card entertainment-card"},me={class:"app-icons-grid"},ge=["onClick"],fe=["src","alt"],ye={class:"card-title"},he=_(e({__name:"RightSidebar",props:{entertainmentData:{default:void 0},imageViewerData:{default:void 0},featuredAppData:{default:void 0}},emits:["appClick"],setup(e,{emit:a}){const l=e,t=a,s=()=>{var e
return t(()=>h.items,()=>{k.value>=h.items.length&&(k.value=0),D.value=new Array(h.items.length).fill(null),h.autoPlay&&h.items.length>1&&pe(!0),i(()=>{ie()})},{immediate:!0}),t(()=>k.value,()=>{ie()}),s(()=>{h.autoPlay&&h.items.length>1&&pe(!0),i(()=>{ie()})}),n(()=>{_&&(clearInterval(_),_=null)}),(a,l)=>(f(),r("div",{class:"hero-carousel",onMouseenter:ce,onMouseleave:oe},[c("div",$,[c("div",{class:"carousel-container",style:u({transform:`translateX(-${100*k.value}%)`})},[(f(!0),r(d,null,p(e.items,(e,a)=>(f(),r("div",{key:e.id||a,class:v(["carousel-slide",{active:a===k.value}])},[c("div",j,["video"===e.type&&e.videoUrl?(f(),r("video",{key:0,ref_for:!0,ref:e=>((e,a)=>{e&&(D.value[a]=e)})(e,a),class:v(["background-video",{active:a===k.value}]),src:e.videoUrl,muted:"",loop:"",playsinline:""},null,10,V)):(f(),r("div",{key:1,class:"background-image",style:u(T(e))},null,4)),l[0]||(l[0]=c("div",{class:"background-overlay"},null,-1))]),c("div",P,[c("div",M,[K(e)?(f(),r("div",x,[c("img",{src:K(e),alt:e.title,class:"app-icon",onError:Q},null,40,L)])):o("",!0),c("div",E,[e.price?(f(),r("div",B,m(e.price),1)):o("",!0),c("h2",q,m(e.title),1),e.description?(f(),r("p",z,m(e.description),1)):o("",!0)]),c("div",F,[e.primaryAction?(f(),r("button",{key:0,class:"action-button primary",onClick:a=>ee("primary",e)},m(e.primaryAction.label),9,H)):o("",!0),e.secondaryAction?(f(),r("button",{key:1,class:"action-button secondary",onClick:a=>ee("secondary",e)},m(e.secondaryAction.label),9,S)):o("",!0)])])])],2))),128))],4)]),e.items.length>1?(f(),r("button",{key:0,class:v(["nav-arrow nav-arrow-left",{visible:Z.value}]),onClick:te,disabled:0===k.value},[g(C,{icon:"mdi:triangle",class:"arrow-icon arrow-icon-left"})],10,W)):o("",!0),e.items.length>1?(f(),r("button",{key:1,class:v(["nav-arrow nav-arrow-right",{visible:Z.value}]),onClick:le,disabled:k.value===e.items.length-1},[g(C,{icon:"mdi:triangle",class:"arrow-icon arrow-icon-right"})],10,G)):o("",!0),e.items.length>1&&e.autoPlay?(f(),r("div",{key:2,class:"progress-indicator",style:u({width:`${J.value.size}px`,height:`${J.value.size}px`})},[(f(),r("svg",{class:"progress-circle",viewBox:J.value.viewBox,xmlns:"http://www.w3.org/2000/svg"},[c("circle",{class:"progress-track",cx:J.value.centerX,cy:J.value.centerY,r:J.value.radius,fill:"rgba(255, 255, 255, 0.2)"},null,8,R),c("path",{class:"progress-bar",d:ne(),fill:"white"},null,8,X)],8,N))],4)):o("",!0),e.items.length>1?(f(),r("div",O,[(f(!0),r(d,null,p(e.items,(e,a)=>(f(),r("button",{key:e.id||a,class:v(["indicator",{active:a===k.value}]),onClick:e=>(e=>{e>=0&&e<h.items.length&&(k.value=e,re(),se(),i(()=>{ie()}))})(a)},null,10,Y))),128))])):o("",!0)],32))}}),[["__scopeId","data-v-77596baf"]]),J={class:"right-sidebar"},T={key:0,class:"featured-app-card"},K={class:"featured-app-content"},Q={class:"featured-app-icon"},ee=["src","alt"],ae={class:"featured-app-info"},le={key:0,class:"app-price"},te={class:"app-name"},se={key:1,class:"app-version"},ie={key:2,class:"app-description"},ne={class:"bottom-cards"},re={key:0,class:"card image-viewer-card"},ce={class:"card-icon-container"},oe={class:"main-icon"},ue=["src"],de={class:"format-icons"},pe={class:"card-title"},ve={key:1,class:"card entertainment-card"},me={class:"app-icons-grid"},ge=["onClick"],fe=["src","alt"],ye={class:"card-title"},he=_(e({__name:"RightSidebar",props:{entertainmentData:{default:void 0},imageViewerData:{default:void 0},featuredAppData:{default:void 0}},emits:["appClick"],setup(e,{emit:a}){const l=e,t=a,s=()=>{var e
return(null==(e=l.featuredAppData)?void 0:e.screenshotUrl)?{backgroundImage:`url(${l.featuredAppData.screenshotUrl})`}:{backgroundImage:"url(https://cn.bing.com/th?id=OHR.LagoonNebula_ZH-CN3890147543_1920x1080.jpg)"}},i=()=>{var e
return(null==(e=l.imageViewerData)?void 0:e.backgroundUrl)?{backgroundImage:`url(${l.imageViewerData.backgroundUrl})`}:{backgroundImage:"url(https://cn.bing.com/th?id=OHR.LagoonNebula_ZH-CN3890147543_1920x1080.jpg)"}}
return(a,l)=>(f(),r("div",J,[e.featuredAppData?(f(),r("div",T,[c("div",{class:"featured-app-background",style:u(s())},null,4),c("div",K,[c("div",Q,[e.featuredAppData.iconUrl?(f(),r("img",{key:0,src:e.featuredAppData.iconUrl,alt:e.featuredAppData.name},null,8,ee)):(f(),y(C,{key:1,icon:"fluent-color:apps-24",class:"default-icon"}))]),c("div",ae,[e.featuredAppData.price?(f(),r("div",le,m(e.featuredAppData.price),1)):o("",!0),c("div",te,m(e.featuredAppData.name),1),e.featuredAppData.version?(f(),r("div",se,m(e.featuredAppData.version),1)):o("",!0),e.featuredAppData.description?(f(),r("div",ie,m(e.featuredAppData.description),1)):o("",!0)])])])):o("",!0),c("div",ne,[e.imageViewerData?(f(),r("div",re,[c("div",{class:"image-viewer-background",style:u(i())},null,4),c("div",ce,[c("div",oe,[e.imageViewerData.iconUrl?(f(),r("img",{key:0,src:e.imageViewerData.iconUrl,alt:"",class:"icon-image"},null,8,ue)):(f(),y(C,{key:1,icon:"fluent-color:image-24",class:"icon-large"}))]),c("div",de,[(f(!0),r(d,null,p(e.imageViewerData.tags,(e,a)=>(f(),r("span",{key:a,class:"format-tag"},m(e),1))),128))])]),c("div",pe,m(e.imageViewerData.title),1)])):o("",!0),e.entertainmentData?(f(),r("div",ve,[c("div",me,[(f(!0),r(d,null,p(e.entertainmentData.apps,(e,a)=>(f(),r("div",{class:"app-icon",key:a,onClick:h(a=>(e=>{t("appClick",e)})(e),["stop"])},[e.iconUrl?(f(),r("img",{key:0,src:e.iconUrl,alt:e.name,class:"app-icon-image"},null,8,fe)):(f(),y(C,{key:1,icon:"fluent-color:play-circle-24"}))],8,ge))),128))]),c("div",ye,m(e.entertainmentData.title),1)])):o("",!0)])]))}}),[["__scopeId","data-v-45de0ff0"]]),be={class:"featured-scroll-wrapper"},ke={class:"featured-list"},Ie=["onClick"],we={class:"featured-icon-wrapper"},Ce=["src","alt"],Ae={key:1,class:"featured-icon-placeholder"},_e={class:"featured-name"},Ue={class:"featured-category"},De={class:"category-tag"},$e=["onClick"],je=_(e({__name:"FeaturedApps",props:{apps:{}},emits:["appClick","action"],setup(e,{emit:u}){const y=e,b=u,k=a(null),I=a(!1),w=a(0),_=l(()=>w.value>0),U=l(()=>{if(!k.value)return!1
@@ -29,8 +29,8 @@ return e.scrollWidth>e.clientWidth&&w.value<e.scrollWidth-e.clientWidth-1}),D=()
return a.includes("social")||a.includes("chat")||a.includes("qq")||a.includes("wechat")?"社交":a.includes("music")||a.includes("video")||a.includes("player")?"娱乐":a.includes("design")||a.includes("photo")||a.includes("edit")?"设计":a.includes("tool")||a.includes("util")?"工具":"应用"},x=e=>"upgrade_available"===e.status?"更新":"injected"===e.status?"已安装":(e.status,"获取")
t(()=>y.apps,()=>{i(()=>{D()})},{immediate:!0})
const L=()=>{i(()=>{D()})}
return s(()=>{i(()=>{D(),k.value&&k.value.addEventListener("scroll",D)}),window.addEventListener("resize",L)}),n(()=>{k.value&&k.value.removeEventListener("scroll",D),window.removeEventListener("resize",L)}),(a,l)=>(f(),r("div",{class:"featured-apps",onMouseenter:l[0]||(l[0]=e=>I.value=!0),onMouseleave:l[1]||(l[1]=e=>I.value=!1)},[l[2]||(l[2]=c("h3",{class:"section-title"},"推荐应用",-1)),c("div",be,[c("div",{class:"featured-scroll",ref_key:"scrollContainer",ref:k},[c("div",ke,[(f(!0),r(d,null,p(e.apps,e=>(f(),r("div",{key:e.bundleId,class:"featured-card",onClick:a=>(e=>{b("appClick",e)})(e)},[c("div",we,[V(e)?(f(),r("img",{key:0,src:V(e),alt:e.name,class:"featured-icon",onError:P},null,40,Ce)):(f(),r("div",Ae,m(e.name.charAt(0).toUpperCase()),1))]),c("h4",_e,m(e.name),1),c("div",Ue,[c("span",De,m(M(e)),1)]),c("button",{class:"featured-button",onClick:h(a=>(e=>{b("action",e)})(e),["stop"])},m(x(e)),9,$e)],8,Ie))),128))])],512),_.value?(f(),r("button",{key:0,class:v(["scroll-button scroll-button-left",{visible:I.value}]),onClick:$},[g(C,{icon:"mdi:chevron-left"})],2)):o("",!0),U.value?(f(),r("button",{key:1,class:v(["scroll-button scroll-button-right",{visible:I.value}]),onClick:j},[g(C,{icon:"mdi:chevron-right"})],2)):o("",!0)])],32))}}),[["__scopeId","data-v-f9c47b05"]]),Ve={class:"category-section"},Pe={class:"category-content"},Me={class:"category-left"},xe={class:"featured-list"},Le=["onClick"],Ee={class:"featured-large-icon-wrapper"},Be=["src","alt"],qe={key:1,class:"featured-large-icon-placeholder"},ze={class:"featured-large-info"},He={class:"featured-large-name"},Se={class:"featured-large-desc"},Fe=["onClick"],We={class:"category-right"},Ge={class:"category-grid"},Ne=["onClick"],Re={class:"category-icon"},Xe={class:"category-name"},Oe=_(e({__name:"CategorySection",props:{featuredApps:{},categories:{default:()=>[{id:"tools",name:"工具",icon:"fluent-color:wrench-24"},{id:"social",name:"社交",icon:"fluent-color:people-24"},{id:"entertainment",name:"娱乐",icon:"fluent-color:video-24"},{id:"design",name:"设计",icon:"fluent-color:paint-brush-24"},{id:"education",name:"教育",icon:"fluent-color:book-24"},{id:"productivity",name:"效率",icon:"fluent-color:briefcase-24"},{id:"photo",name:"摄影",icon:"fluent-color:camera-24"},{id:"music",name:"音乐",icon:"fluent-color:headphones-48"},{id:"news",name:"新闻",icon:"fluent-color:news-24"},{id:"health",name:"健康",icon:"fluent-color:heart-24"},{id:"finance",name:"财务",icon:"fluent-color:coin-multiple-48"},{id:"travel",name:"旅行",icon:"fluent-color:globe-24"}]}},emits:["appClick","action","categoryClick"],setup(e,{emit:a}){const l=a,t=e=>A.getAppIconUrl(e.bundleId),s=()=>{},i=e=>"upgrade_available"===e.status?"更新":"injected"===e.status?"已安装":(e.status,"获取")
return(a,n)=>(f(),r("div",Ve,[c("div",Pe,[c("div",Me,[n[0]||(n[0]=c("h3",{class:"section-title"},"特色应用",-1)),c("div",xe,[(f(!0),r(d,null,p(e.featuredApps.slice(0,2),e=>(f(),r("div",{key:e.bundleId,class:"featured-large-card",onClick:a=>(e=>{l("appClick",e)})(e)},[c("div",Ee,[t(e)?(f(),r("img",{key:0,src:t(e),alt:e.name,class:"featured-large-icon",onError:s},null,40,Be)):(f(),r("div",qe,m(e.name.charAt(0).toUpperCase()),1))]),c("div",ze,[c("h4",He,m(e.name),1),c("p",Se,m(e.bundleId),1),c("button",{class:"featured-large-button",onClick:h(a=>(e=>{l("action",e)})(e),["stop"])},m(i(e)),9,Fe)])],8,Le))),128))])]),c("div",We,[n[1]||(n[1]=c("h3",{class:"section-title"},"分类",-1)),c("div",Ge,[(f(!0),r(d,null,p(e.categories,e=>(f(),r("div",{key:e.id,class:"category-card",onClick:a=>(e=>{l("categoryClick",e)})(e)},[c("div",Re,[g(C,{icon:e.icon},null,8,["icon"])]),c("span",Xe,m(e.name),1)],8,Ne))),128))])])])]))}}),[["__scopeId","data-v-2970f815"]]),Ye={class:"app-list"},Ze={class:"search-header"},Je={class:"search-title"},Te={class:"search-filters"},Ke={class:"filter-tags"},Qe={key:0,class:"loading"},ea={key:1,class:"error"},aa={key:2,class:"empty"},la={key:3,class:"apps-grid search-results-grid"},ta={class:"hero-section"},sa={class:"list-section"},ia={class:"list-header"},na={class:"section-title"},ra={class:"section-description"},ca={key:0,class:"loading"},oa={key:1,class:"error"},ua={key:2,class:"empty"},da={key:3,class:"apps-grid"},pa={class:"list-footer"},va={class:"footer-stats"},ma={class:"stat-item"},ga={class:"stat-value"},fa={class:"stat-item"},ya={class:"stat-value"},ha=_(e({__name:"AppList",setup(e){const t=k(),i=I(),n=b([]),u=a(!0),v=a(""),h=a([]),_=a(!1),$=a({}),j=l(()=>t.query.search||""),V=l(()=>!!j.value),P=[{id:"all",label:"所有分类"},{id:"app",label:"应用"},{id:"game",label:"游戏"},{id:"mobile",label:"移动应用"}],M=a("all"),x=[{value:"all",label:"全部",icon:"fluent-color:text-bullet-list-square-sparkle-32"},{value:"injected",label:"已安装",icon:"fluent-color:checkmark-circle-24"},{value:"update",label:"可更新",icon:"fluent-color:arrow-download-24"},{value:"store",label:"商店应用",icon:"fluent-color:store-24"}],L=l(()=>n.value.filter(e=>"injected"===e.status||"upgrade_available"===e.status).slice(0,5)),E=l(()=>h.value.length>0?h.value.map(e=>{const a=$.value[e.imageId]||void 0
return s(()=>{i(()=>{D(),k.value&&k.value.addEventListener("scroll",D)}),window.addEventListener("resize",L)}),n(()=>{k.value&&k.value.removeEventListener("scroll",D),window.removeEventListener("resize",L)}),(a,l)=>(f(),r("div",{class:"featured-apps",onMouseenter:l[0]||(l[0]=e=>I.value=!0),onMouseleave:l[1]||(l[1]=e=>I.value=!1)},[l[2]||(l[2]=c("h3",{class:"section-title"},"推荐应用",-1)),c("div",be,[c("div",{class:"featured-scroll",ref_key:"scrollContainer",ref:k},[c("div",ke,[(f(!0),r(d,null,p(e.apps,e=>(f(),r("div",{key:e.bundleId,class:"featured-card",onClick:a=>(e=>{b("appClick",e)})(e)},[c("div",we,[V(e)?(f(),r("img",{key:0,src:V(e),alt:e.name,class:"featured-icon",onError:P},null,40,Ce)):(f(),r("div",Ae,m(e.name.charAt(0).toUpperCase()),1))]),c("h4",_e,m(e.name),1),c("div",Ue,[c("span",De,m(M(e)),1)]),c("button",{class:"featured-button",onClick:h(a=>(e=>{b("action",e)})(e),["stop"])},m(x(e)),9,$e)],8,Ie))),128))])],512),_.value?(f(),r("button",{key:0,class:v(["scroll-button scroll-button-left",{visible:I.value}]),onClick:$},[g(C,{icon:"mdi:chevron-left"})],2)):o("",!0),U.value?(f(),r("button",{key:1,class:v(["scroll-button scroll-button-right",{visible:I.value}]),onClick:j},[g(C,{icon:"mdi:chevron-right"})],2)):o("",!0)])],32))}}),[["__scopeId","data-v-f9c47b05"]]),Ve={class:"category-section"},Pe={class:"category-content"},Me={class:"category-left"},xe={class:"featured-list"},Le=["onClick"],Ee={class:"featured-large-icon-wrapper"},Be=["src","alt"],qe={key:1,class:"featured-large-icon-placeholder"},ze={class:"featured-large-info"},Fe={class:"featured-large-name"},He={class:"featured-large-desc"},Se=["onClick"],We={class:"category-right"},Ge={class:"category-grid"},Ne=["onClick"],Re={class:"category-icon"},Xe={class:"category-name"},Oe=_(e({__name:"CategorySection",props:{featuredApps:{},categories:{default:()=>[{id:"tools",name:"工具",icon:"fluent-color:wrench-24"},{id:"social",name:"社交",icon:"fluent-color:people-24"},{id:"entertainment",name:"娱乐",icon:"fluent-color:video-24"},{id:"design",name:"设计",icon:"fluent-color:paint-brush-24"},{id:"education",name:"教育",icon:"fluent-color:book-24"},{id:"productivity",name:"效率",icon:"fluent-color:briefcase-24"},{id:"photo",name:"摄影",icon:"fluent-color:camera-24"},{id:"music",name:"音乐",icon:"fluent-color:headphones-48"},{id:"news",name:"新闻",icon:"fluent-color:news-24"},{id:"health",name:"健康",icon:"fluent-color:heart-24"},{id:"finance",name:"财务",icon:"fluent-color:coin-multiple-48"},{id:"travel",name:"旅行",icon:"fluent-color:globe-24"}]}},emits:["appClick","action","categoryClick"],setup(e,{emit:a}){const l=a,t=e=>A.getAppIconUrl(e.bundleId),s=()=>{},i=e=>"upgrade_available"===e.status?"更新":"injected"===e.status?"已安装":(e.status,"获取")
return(a,n)=>(f(),r("div",Ve,[c("div",Pe,[c("div",Me,[n[0]||(n[0]=c("h3",{class:"section-title"},"特色应用",-1)),c("div",xe,[(f(!0),r(d,null,p(e.featuredApps.slice(0,2),e=>(f(),r("div",{key:e.bundleId,class:"featured-large-card",onClick:a=>(e=>{l("appClick",e)})(e)},[c("div",Ee,[t(e)?(f(),r("img",{key:0,src:t(e),alt:e.name,class:"featured-large-icon",onError:s},null,40,Be)):(f(),r("div",qe,m(e.name.charAt(0).toUpperCase()),1))]),c("div",ze,[c("h4",Fe,m(e.name),1),c("p",He,m(e.bundleId),1),c("button",{class:"featured-large-button",onClick:h(a=>(e=>{l("action",e)})(e),["stop"])},m(i(e)),9,Se)])],8,Le))),128))])]),c("div",We,[n[1]||(n[1]=c("h3",{class:"section-title"},"分类",-1)),c("div",Ge,[(f(!0),r(d,null,p(e.categories,e=>(f(),r("div",{key:e.id,class:"category-card",onClick:a=>(e=>{l("categoryClick",e)})(e)},[c("div",Re,[g(C,{icon:e.icon},null,8,["icon"])]),c("span",Xe,m(e.name),1)],8,Ne))),128))])])])]))}}),[["__scopeId","data-v-2970f815"]]),Ye={class:"app-list"},Ze={class:"search-header"},Je={class:"search-title"},Te={class:"search-filters"},Ke={class:"filter-tags"},Qe={key:0,class:"loading"},ea={key:1,class:"error"},aa={key:2,class:"empty"},la={key:3,class:"apps-grid search-results-grid"},ta={class:"hero-section"},sa={class:"list-section"},ia={class:"list-header"},na={class:"section-title"},ra={class:"section-description"},ca={key:0,class:"loading"},oa={key:1,class:"error"},ua={key:2,class:"empty"},da={key:3,class:"apps-grid"},pa={class:"list-footer"},va={class:"footer-stats"},ma={class:"stat-item"},ga={class:"stat-value"},fa={class:"stat-item"},ya={class:"stat-value"},ha=_(e({__name:"AppList",setup(e){const t=k(),i=I(),n=b([]),u=a(!0),v=a(""),h=a([]),_=a(!1),$=a({}),j=l(()=>t.query.search||""),V=l(()=>!!j.value),P=[{id:"all",label:"所有分类"},{id:"app",label:"应用"},{id:"game",label:"游戏"},{id:"mobile",label:"移动应用"}],M=a("all"),x=[{value:"all",label:"全部",icon:"fluent-color:text-bullet-list-square-sparkle-32"},{value:"injected",label:"已安装",icon:"fluent-color:checkmark-circle-24"},{value:"update",label:"可更新",icon:"fluent-color:arrow-download-24"},{value:"store",label:"商店应用",icon:"fluent-color:store-24"}],L=l(()=>n.value.filter(e=>"injected"===e.status||"upgrade_available"===e.status).slice(0,5)),E=l(()=>h.value.length>0?h.value.map(e=>{const a=$.value[e.imageId]||void 0
return{id:e._id,type:e.type,imageUrl:a,imageId:e.imageId,videoUrl:e.videoUrl,title:e.title,description:e.description,price:e.price,primaryAction:e.primaryAction,secondaryAction:e.secondaryAction}}):L.value.map(e=>{var a,l
const t=(null==(a=e.update)?void 0:a.imageId)||[],s=t.length>0?t[0]:void 0,i=t.length>1
return{id:e.bundleId,type:i?"video":"image",imageId:s,videoId:i&&t[1]?t[1]:void 0,title:e.name,description:(null==(l=e.update)?void 0:l.latestVersion)?`版本 ${e.update.latestVersion}`:`版本 ${e.version}`,price:"",primaryAction:{label:"upgrade_available"===e.status?"查看详情":"injected"===e.status?"已安装":"获取",action:"view",route:`/app/${e.bundleId}`},secondaryAction:"upgrade_available"===e.status?{label:"更新",action:"update"}:void 0,app:e}})),B=l(()=>0===n.value.length?{title:"App精选",apps:[]}:{title:"App精选",apps:[...n.value].sort(()=>Math.random()-.5).slice(0,6).map(e=>({iconUrl:e.hasIcon?A.getAppIconUrl(e.bundleId):void 0,name:e.name,bundleId:e.bundleId,...e}))}),q=[["专业级应用,为您提供卓越的使用体验。","功能强大,界面简洁,操作便捷。","让您的工作和生活更加高效。"],["精心设计的应用,满足您的各种需求。","稳定可靠,性能优异,值得信赖。","为您带来全新的使用感受。"],["功能丰富,设计精美,体验流畅。","无论是工作还是娱乐,都能轻松应对。","让您的数字生活更加精彩。"],["强大的功能,简洁的界面,出色的性能。","为您提供专业级的解决方案。","让每一次使用都成为享受。"],["创新设计,卓越性能,完美体验。","满足您的专业需求和个人喜好。","让您的设备发挥最大潜力。"],["功能全面,操作简单,效果出色。","无论是新手还是专家都能轻松上手。","为您的工作和生活增添便利。"]],z=l(()=>{var e,a
@@ -41,7 +41,7 @@ const t=l.hasIcon?A.getAppIconUrl(l.bundleId):void 0,s=(null==(e=l.update)?void
for(let l=0;l<e.length;l++)a=(a<<5)-a+e.charCodeAt(l),a&=a
return Math.abs(a)})(e),l=a%2+2
return q[a%q.length].slice(0,l).join(" ")})(l.bundleId)
return{name:l.name,iconUrl:t,version:(null==(a=l.update)?void 0:a.latestVersion)||l.version,description:i,price:"",screenshotId:s}}),H=l(()=>{var e,a
return{name:l.name,iconUrl:t,version:(null==(a=l.update)?void 0:a.latestVersion)||l.version,description:i,price:"",screenshotId:s}}),F=l(()=>{var e,a
if(0===n.value.length)return
const l=n.value.find(e=>null!==e.update)||n.value[0]
if(!l)return
@@ -49,7 +49,7 @@ const t=l.hasIcon?A.getAppIconUrl(l.bundleId):void 0,s=(null==(e=l.update)?void
let r
if((null==(a=l.update)?void 0:a.category)&&l.update.category.length>0)r=l.update.category
else{const e=[...i].sort(()=>Math.random()-.5),a=Math.floor(2*Math.random())+4
r=e.slice(0,a)}return{title:l.name,iconUrl:t,tags:r.slice(0,6),backgroundId:s}}),S=l(()=>{let e=[...n.value]
r=e.slice(0,a)}return{title:l.name,iconUrl:t,tags:r.slice(0,6),backgroundId:s}}),H=l(()=>{let e=[...n.value]
if(V.value&&j.value){const a=j.value.toLowerCase()
e=e.filter(e=>e.name.toLowerCase().includes(a)||e.bundleId.toLowerCase().includes(a))}if(V.value&&"all"!==M.value)switch(M.value){case"injected":e=e.filter(e=>"injected"===e.status)
break
@@ -62,7 +62,7 @@ case"update":e=e.filter(e=>"upgrade_available"===e.status)
break
case"unsupported":e=e.filter(e=>"unsupported"===e.status)
break
case"store":e=e.filter(e=>null!==e.update)}}return e.sort((e,a)=>e.name.localeCompare(a.name)),e}),F=()=>{switch(t.query.filter){case"injected":return"已注入应用"
case"store":e=e.filter(e=>null!==e.update)}}return e.sort((e,a)=>e.name.localeCompare(a.name)),e}),S=()=>{switch(t.query.filter){case"injected":return"已注入应用"
case"update":return"可更新应用"
case"unsupported":return"不支持的应用"
case"store":return"应用商店"
@@ -71,7 +71,7 @@ case"injected":return"已成功注入的应用列表"
case"update":return"有新版本可用的应用"
case"unsupported":return"当前版本不支持的应用"
default:return"系统中所有已安装的应用"}},G=async()=>{u.value=!0,v.value=""
try{const a=await A.getApps(),l=a.map(e=>e.bundleId)
try{const a=await A.getApps(),l=a.map(e=>({bundleId:e.bundleId,currentVersion:e.version,currentFullVersion:e.bundleVersion}))
if(l.length>0)try{const e=await A.batchGetAppVersions(l)
e.success&&e.data?n.value=a.map(a=>{var l,t,s,i
const n=e.data[a.bundleId]||[]
@@ -82,5 +82,5 @@ l&&(l.route?i.push(l.route):l.url?window.open(l.url,"_blank"):"update"===l.actio
return s(()=>{G(),(async()=>{_.value=!0
try{const e=await A.getPublicCarousels()
e.success&&e.data&&(h.value=e.data,e.data.forEach(e=>{e.imageId&&!$.value[e.imageId]&&(async e=>{if(!$.value[e])try{const a=await A.getImage(e)
$.value[e]=a}catch(a){}})(e.imageId)}))}catch(e){}finally{_.value=!1}})()}),(e,a)=>(f(),r("div",Ye,[V.value?(f(),r(d,{key:0},[c("div",Ze,[c("h2",Je,'"'+m(j.value)+'"',1)]),c("div",Te,[c("div",Ke,[(f(),r(d,null,p(P,e=>c("button",{key:e.id,class:"filter-tag"},m(e.label),1)),64))]),g(U,{modelValue:M.value,"onUpdate:modelValue":a[0]||(a[0]=e=>M.value=e),options:x},null,8,["modelValue"])]),u.value?(f(),r("div",Qe,[...a[1]||(a[1]=[c("div",{class:"spinner"},null,-1),c("p",null,"加载应用中...",-1)])])):v.value?(f(),r("div",ea,[c("p",null,m(v.value),1),c("button",{onClick:G,class:"btn btn-primary"},"重试")])):0===S.value.length?(f(),r("div",aa,[g(C,{icon:"fluent-color:apps-24",class:"empty-icon"}),a[2]||(a[2]=c("p",null,"没有找到应用",-1)),a[3]||(a[3]=c("p",{class:"empty-hint"},"尝试调整搜索条件或筛选器",-1))])):(f(),r("div",la,[(f(!0),r(d,null,p(S.value,e=>(f(),y(w,{key:e.bundleId,app:e,mode:"search","show-description":!0,onUpdated:N},null,8,["app"]))),128))]))],64)):(f(),r(d,{key:1},[c("div",ta,[E.value.length>0?(f(),y(Z,{key:0,items:E.value,"auto-play":!0,"auto-play-interval":5e3,onAction:Y,onSlideChange:J},null,8,["items"])):o("",!0),g(he,{"entertainment-data":B.value,"image-viewer-data":H.value,"featured-app-data":z.value,onAppClick:O},null,8,["entertainment-data","image-viewer-data","featured-app-data"])]),L.value.length>0?(f(),y(je,{key:0,apps:L.value,onAppClick:R,onAction:X},null,8,["apps"])):o("",!0),L.value.length>0?(f(),y(Oe,{key:1,"featured-apps":L.value.slice(0,2),onAppClick:R,onAction:X,onCategoryClick:T},null,8,["featured-apps"])):o("",!0),c("div",sa,[c("div",ia,[c("h2",na,m(F()),1),c("p",ra,m(W()),1)]),u.value?(f(),r("div",ca,[...a[4]||(a[4]=[c("div",{class:"spinner"},null,-1),c("p",null,"加载应用中...",-1)])])):v.value?(f(),r("div",oa,[c("p",null,m(v.value),1),c("button",{onClick:G,class:"btn btn-primary"},"重试")])):0===S.value.length?(f(),r("div",ua,[g(C,{icon:"fluent-color:apps-24",class:"empty-icon"}),a[5]||(a[5]=c("p",null,"没有找到应用",-1)),a[6]||(a[6]=c("p",{class:"empty-hint"},"尝试调整筛选器",-1))])):(f(),r("div",da,[(f(!0),r(d,null,p(S.value,e=>(f(),y(w,{key:e.bundleId,app:e,mode:"list",onUpdated:N},null,8,["app"]))),128))])),c("div",pa,[c("div",va,[c("span",ma,[a[7]||(a[7]=c("span",{class:"stat-label"},"总计:",-1)),c("span",ga,m(n.value.length),1)]),c("span",fa,[a[8]||(a[8]=c("span",{class:"stat-label"},"显示:",-1)),c("span",ya,m(S.value.length),1)])])])])],64))]))}}),[["__scopeId","data-v-0ceb0bef"]])
$.value[e]=a}catch(a){}})(e.imageId)}))}catch(e){}finally{_.value=!1}})()}),(e,a)=>(f(),r("div",Ye,[V.value?(f(),r(d,{key:0},[c("div",Ze,[c("h2",Je,'"'+m(j.value)+'"',1)]),c("div",Te,[c("div",Ke,[(f(),r(d,null,p(P,e=>c("button",{key:e.id,class:"filter-tag"},m(e.label),1)),64))]),g(U,{modelValue:M.value,"onUpdate:modelValue":a[0]||(a[0]=e=>M.value=e),options:x},null,8,["modelValue"])]),u.value?(f(),r("div",Qe,[...a[1]||(a[1]=[c("div",{class:"spinner"},null,-1),c("p",null,"加载应用中...",-1)])])):v.value?(f(),r("div",ea,[c("p",null,m(v.value),1),c("button",{onClick:G,class:"btn btn-primary"},"重试")])):0===H.value.length?(f(),r("div",aa,[g(C,{icon:"fluent-color:apps-24",class:"empty-icon"}),a[2]||(a[2]=c("p",null,"没有找到应用",-1)),a[3]||(a[3]=c("p",{class:"empty-hint"},"尝试调整搜索条件或筛选器",-1))])):(f(),r("div",la,[(f(!0),r(d,null,p(H.value,e=>(f(),y(w,{key:e.bundleId,app:e,mode:"search","show-description":!0,onUpdated:N},null,8,["app"]))),128))]))],64)):(f(),r(d,{key:1},[c("div",ta,[E.value.length>0?(f(),y(Z,{key:0,items:E.value,"auto-play":!0,"auto-play-interval":5e3,onAction:Y,onSlideChange:J},null,8,["items"])):o("",!0),g(he,{"entertainment-data":B.value,"image-viewer-data":F.value,"featured-app-data":z.value,onAppClick:O},null,8,["entertainment-data","image-viewer-data","featured-app-data"])]),L.value.length>0?(f(),y(je,{key:0,apps:L.value,onAppClick:R,onAction:X},null,8,["apps"])):o("",!0),L.value.length>0?(f(),y(Oe,{key:1,"featured-apps":L.value.slice(0,2),onAppClick:R,onAction:X,onCategoryClick:T},null,8,["featured-apps"])):o("",!0),c("div",sa,[c("div",ia,[c("h2",na,m(S()),1),c("p",ra,m(W()),1)]),u.value?(f(),r("div",ca,[...a[4]||(a[4]=[c("div",{class:"spinner"},null,-1),c("p",null,"加载应用中...",-1)])])):v.value?(f(),r("div",oa,[c("p",null,m(v.value),1),c("button",{onClick:G,class:"btn btn-primary"},"重试")])):0===H.value.length?(f(),r("div",ua,[g(C,{icon:"fluent-color:apps-24",class:"empty-icon"}),a[5]||(a[5]=c("p",null,"没有找到应用",-1)),a[6]||(a[6]=c("p",{class:"empty-hint"},"尝试调整筛选器",-1))])):(f(),r("div",da,[(f(!0),r(d,null,p(H.value,e=>(f(),y(w,{key:e.bundleId,app:e,mode:"list",onUpdated:N},null,8,["app"]))),128))])),c("div",pa,[c("div",va,[c("span",ma,[a[7]||(a[7]=c("span",{class:"stat-label"},"总计:",-1)),c("span",ga,m(n.value.length),1)]),c("span",fa,[a[8]||(a[8]=c("span",{class:"stat-label"},"显示:",-1)),c("span",ya,m(H.value.length),1)])])])])],64))]))}}),[["__scopeId","data-v-3d49ce31"]])
export{ha as default}

File diff suppressed because one or more lines are too long

29
frontend/dist/assets/BvcmZ1eR.js vendored Normal file
View File

@@ -0,0 +1,29 @@
import{d as a,r as e,f as t,w as l,k as s,F as n,c as i,g as o,T as c,i as d,j as u,l as r,t as m,m as v,x as p,C as h,B as b,D as f,z as g,b as y,e as k}from"./CD7TqNEc.js"
import{c as D,_ as C,b as w,A as I,a as _}from"./DTEPVF5R.js"
import{I as B}from"./CugD9gGX.js"
const z={class:"post-edit-dialog"},M={class:"dialog-header"},j={class:"dialog-body"},x={key:0,class:"loading-state"},A={key:1,class:"post-form"},U={key:0,class:"form-group author-info-section"},R={class:"author-card"},q={class:"author-avatar"},E={class:"author-details"},F={class:"author-name"},L={key:0,class:"author-id"},P={class:"form-group"},V=["disabled"],G={class:"form-group"},K=["disabled"],O={class:"form-group"},T={key:0,class:"attachments-list"},H=["onClick","disabled"],J=["onClick"],N={class:"attachment-name"},Q={class:"attachment-size"},S={key:1,class:"no-attachments"},W={class:"form-group"},X={class:"attachment-upload"},Y=["disabled"],Z=["disabled"],$=["disabled"],aa=["disabled"],ea={key:0,class:"upload-progress"},ta={class:"dialog-actions"},la=["disabled"],sa=["disabled"],na={key:0},ia={key:1},oa=_(a({__name:"PostEditDialog",props:{visible:{type:Boolean},postData:{},loading:{type:Boolean,default:!1}},emits:["confirm","cancel"],setup(a,{emit:_}){const oa=a,ca=_,da=D(),ua=e({title:"",content:"",attachments:[]}),ra=e(!1),ma=e(!1),va=e(null),pa=e(null),ha=e(null)
e("")
const ba=t(()=>ua.value.title.trim().length>0&&ua.value.content.trim().length>0),fa=a=>{if(0===a)return"0 B"
const e=Math.floor(Math.log(a)/Math.log(1024))
return Math.round(a/Math.pow(1024,e)*100)/100+" "+["B","KB","MB","GB"][e]},ga=()=>{oa.postData?ua.value={title:oa.postData.title||"",content:oa.postData.content||"",attachments:oa.postData.attachments||[]}:ua.value={title:"",content:"",attachments:[]}}
l(()=>oa.visible,a=>{a&&oa.postData&&ga()}),l(()=>oa.postData,a=>{oa.visible&&a&&ga()},{deep:!0}),l(()=>oa.loading,a=>{})
const ya=()=>{var a
null==(a=va.value)||a.click()},ka=()=>{var a
null==(a=pa.value)||a.click()},Da=async a=>{var e,t,l
const s=a.target,n=null==(e=s.files)?void 0:e[0]
if(n){ma.value=!0
try{const a=await I.uploadImageAttachment(n)
a.success&&a.attachmentId?(ua.value.attachments.push({id:a.attachmentId,name:n.name,type:"image",size:n.size}),da.success("图片上传成功")):da.error(a.message||"图片上传失败")}catch(i){da.error((null==(l=null==(t=i.response)?void 0:t.data)?void 0:l.message)||i.message||"图片上传失败")}finally{ma.value=!1,s&&(s.value="")}}},Ca=async a=>{var e,t,l
const s=a.target,n=null==(e=s.files)?void 0:e[0]
if(n){ma.value=!0
try{const a=await I.uploadFileAttachment(n)
a.success&&a.attachmentId?(ua.value.attachments.push({id:a.attachmentId,name:n.name,type:"file",size:n.size}),da.success("文件上传成功")):da.error(a.message||"文件上传失败")}catch(i){da.error((null==(l=null==(t=i.response)?void 0:t.data)?void 0:l.message)||i.message||"文件上传失败")}finally{ma.value=!1,s&&(s.value="")}}},wa=()=>{if(!ba.value)return
const a=ua.value.attachments.map(a=>a.id)
ca("confirm",{title:ua.value.title.trim(),content:ua.value.content.trim(),attachmentIds:a})},Ia=()=>{ca("cancel")},_a=()=>{ha.value&&(URL.revokeObjectURL(ha.value),ha.value=null)}
return(e,t)=>(k(),s(n,null,[(k(),i(c,{to:"body"},[o(d,{name:"fade"},{default:u(()=>{var e
return[a.visible?(k(),s("div",{key:0,class:"post-edit-dialog-overlay",onClick:m(Ia,["self"])},[v("div",z,[v("div",M,[t[2]||(t[2]=v("h3",{class:"dialog-title"},"编辑帖子",-1)),v("button",{class:"close-btn",onClick:Ia,type:"button"},[o(C,{icon:"mdi:close"})])]),v("div",j,[oa.loading?(k(),s("div",x,[...t[3]||(t[3]=[v("div",{class:"spinner"},null,-1),v("p",null,"加载帖子详情中...",-1)])])):(k(),s("div",A,[(null==(e=oa.postData)?void 0:e.author)?(k(),s("div",U,[t[4]||(t[4]=v("label",{class:"form-label"},"发帖人",-1)),v("div",R,[v("div",q,[o(w,{"avatar-id":oa.postData.author.avatar,"user-name":oa.postData.author.name,width:36,height:36},null,8,["avatar-id","user-name"])]),v("div",E,[v("div",F,p(oa.postData.author.name),1),oa.postData.author.id?(k(),s("div",L," ID: "+p(oa.postData.author.id),1)):r("",!0)])])])):r("",!0),v("div",P,[t[5]||(t[5]=v("label",{class:"form-label"},[b("标题 "),v("span",{class:"required"},"*")],-1)),h(v("input",{"onUpdate:modelValue":t[0]||(t[0]=a=>ua.value.title=a),type:"text",placeholder:"请输入帖子标题",class:"form-input",disabled:ra.value},null,8,V),[[f,ua.value.title]])]),v("div",G,[t[6]||(t[6]=v("label",{class:"form-label"},[b("内容 "),v("span",{class:"required"},"*")],-1)),h(v("textarea",{"onUpdate:modelValue":t[1]||(t[1]=a=>ua.value.content=a),placeholder:"请输入帖子内容",class:"form-textarea",rows:"15",disabled:ra.value},null,8,K),[[f,ua.value.content]])]),v("div",O,[t[8]||(t[8]=v("label",{class:"form-label"},"附件",-1)),ua.value.attachments&&ua.value.attachments.length>0?(k(),s("div",T,[(k(!0),s(n,null,g(ua.value.attachments,a=>(k(),s("div",{key:a.id,class:y(["attachment-item",{clickable:!0}])},[v("button",{class:"remove-attachment-btn-left",onClick:m(e=>{return t=a.id,void(ua.value.attachments=ua.value.attachments.filter(a=>a.id!==t))
var t},["stop"]),disabled:ra.value,type:"button",title:"删除附件"},[o(C,{icon:"mdi:close"})],8,H),v("div",{class:"attachment-info",onClick:m(e=>(async a=>{if("image"===a.type){if(a.id){const e=await I.getAttachmentImage(a.id)
e?ha.value=e:da.error("图片加载失败")}}else await(async a=>{try{const e=await I.getAttachmentDownloadUrl(a.id)
if(e){const a=document.createElement("a")
a.href=e.url,a.download=e.name,a.target="_blank",document.body.appendChild(a),a.click(),document.body.removeChild(a),da.success("文件下载已开始")}else da.error("无法获取下载链接")}catch(e){da.error("下载文件失败: "+(e.message||"未知错误"))}})(a)})(a),["stop"])},[o(C,{icon:"image"===a.type?"mdi:image":"mdi:file",class:"attachment-icon"},null,8,["icon"]),v("span",N,p(a.name),1),v("span",Q,p(fa(a.size)),1),"image"===a.type?(k(),i(C,{key:0,icon:"mdi:eye-outline",class:"attachment-action-icon",title:"预览图片"})):(k(),i(C,{key:1,icon:"mdi:download",class:"attachment-action-icon",title:"下载文件"}))],8,J)]))),128))])):(k(),s("div",S,[...t[7]||(t[7]=[v("p",null,"暂无附件",-1)])]))]),v("div",W,[t[12]||(t[12]=v("label",{class:"form-label"},"添加附件",-1)),v("div",X,[v("input",{ref_key:"imageInputRef",ref:va,type:"file",accept:"image/*",onChange:Da,class:"file-input",style:{display:"none"},disabled:ra.value},null,40,Y),v("input",{ref_key:"fileInputRef",ref:pa,type:"file",onChange:Ca,class:"file-input",style:{display:"none"},disabled:ra.value},null,40,Z),v("button",{class:"btn btn-outline",onClick:ya,disabled:ra.value||ma.value,type:"button"},[o(C,{icon:"mdi:image",class:"btn-icon"}),t[9]||(t[9]=b(" 添加图片 ",-1))],8,$),v("button",{class:"btn btn-outline",onClick:ka,disabled:ra.value||ma.value,type:"button"},[o(C,{icon:"mdi:file",class:"btn-icon"}),t[10]||(t[10]=b(" 添加文件 ",-1))],8,aa)]),ma.value?(k(),s("div",ea,[...t[11]||(t[11]=[v("div",{class:"spinner-small"},null,-1),v("span",null,"上传中...",-1)])])):r("",!0)])]))]),v("div",ta,[v("button",{class:"btn btn-outline",onClick:Ia,disabled:ra.value||ma.value}," 取消 ",8,la),v("button",{class:"btn btn-primary",onClick:wa,disabled:!ba.value||ra.value||ma.value},[ra.value?(k(),s("span",na,"保存中...")):(k(),s("span",ia,"保存"))],8,sa)])])])):r("",!0)]}),_:1})])),o(B,{visible:!!ha.value,"image-url":ha.value,onClose:_a},null,8,["visible","image-url"])],64))}}),[["__scopeId","data-v-eaeb94ca"]])
export{oa as P}

File diff suppressed because one or more lines are too long

1
frontend/dist/assets/BzGh6Fet.css vendored Normal file

File diff suppressed because one or more lines are too long

93
frontend/dist/assets/CBlhC2CZ.js vendored Normal file

File diff suppressed because one or more lines are too long

1171
frontend/dist/assets/CD7TqNEc.js vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
frontend/dist/assets/CJ-6BEJ8.js vendored Normal file
View File

@@ -0,0 +1,4 @@
import{r as e,f as l}from"./CD7TqNEc.js"
function u(){const u=e(!1),a=e(void 0),v=e(""),t=e(""),o=e(""),r=e(void 0),n=e(null),s=e(null),i=l(()=>r.value)
return{showUserMenu:u,userMenuPosition:a,selectedUserId:v,selectedUserName:t,selectedUserUsername:o,userAvatarId:i,handleAuthorHover:(e,l,s,i,d)=>{n.value&&clearTimeout(n.value),v.value=l,t.value=s,o.value=i,d&&""!==d.trim()?r.value=d:r.value=void 0,n.value=window.setTimeout(()=>{const l=e.target.getBoundingClientRect()
a.value={x:l.left-100,y:l.bottom+8},u.value=!0},200)},handleAuthorLeave:()=>{n.value&&(clearTimeout(n.value),n.value=null),s.value&&(clearTimeout(s.value),s.value=null),s.value=window.setTimeout(()=>{u.value&&(u.value=!1)},200)},handleCardMouseEnter:()=>{s.value&&(clearTimeout(s.value),s.value=null)},handleCloseUserMenu:()=>{n.value&&(clearTimeout(n.value),n.value=null),s.value&&(clearTimeout(s.value),s.value=null),u.value=!1,r.value=void 0,o.value=""}}}export{u}

File diff suppressed because one or more lines are too long

19
frontend/dist/assets/CTwXCDf2.js vendored Normal file
View File

@@ -0,0 +1,19 @@
import{d as e,r as a,f as l,w as s,Q as u,c as t,g as n,i,j as o,k as r,l as v,m as c,t as d,q as m,b,x as p,T as f,e as k,n as y}from"./CD7TqNEc.js"
import{b as g,_ as U,a as h}from"./DTEPVF5R.js"
import{u as w}from"./Tr3ZfNrL.js"
const I={key:0,class:"background-avatar-blur"},x=["src"],R={class:"card-content"},T={class:"content-layout"},j={class:"avatar-wrapper"},L={class:"user-info"},C={class:"user-name-row"},_={class:"user-name"},O={class:"user-username"},N={class:"action-buttons"},M=h(e({__name:"UserProfileCard",props:{visible:{type:Boolean,default:!1},userId:{default:""},userName:{default:""},username:{default:""},position:{default:void 0},avatarUrl:{default:void 0},avatarId:{default:void 0}},emits:["close","sendMessage","blockUser","mouseEnter"],setup(e,{emit:h}){const M=e,W=h,$=a(null),q=a(null),B=a(""),E=a(!1),{isUserOnline:z,queryUsersOnlineStatus:H}=w(),P=l(()=>z(M.userId)),Q=l(()=>E.value&&""!==B.value),S=a(!1)
let A=null
const D=l(()=>M.username||M.userId||"未知用户"),F=l(()=>S.value?"加载中...":!0===P.value?"在线":!1===P.value?"离线":"未知")
s(()=>P.value,e=>{S.value&&null!==e&&(S.value=!1,A&&(clearTimeout(A),A=null))}),s(()=>[M.visible,M.userId],async()=>{if(M.visible&&M.userId){if(S.value=!1,A&&(clearTimeout(A),A=null),null===P.value){S.value=!0
try{await H([M.userId]),A=window.setTimeout(()=>{S.value=!1,A=null},3e3)}catch(e){S.value=!1}}}else A&&(clearTimeout(A),A=null)},{immediate:!0})
const G=e=>{E.value=!0,B.value&&B.value.startsWith("blob:")&&URL.revokeObjectURL(B.value),B.value=URL.createObjectURL(e)}
s(()=>M.visible,e=>{e?E.value=!1:(E.value=!1,B.value&&B.value.startsWith("blob:")&&(URL.revokeObjectURL(B.value),B.value=""))})
const J=l(()=>M.position?q.value?{left:`${q.value.x}px`,top:`${q.value.y}px`}:{left:`${M.position.x}px`,top:`${M.position.y}px`}:{})
s(()=>[M.visible,M.position],()=>{q.value=null,M.visible&&M.position&&y(()=>{(()=>{if(!M.position||!$.value)return
const e=$.value.getBoundingClientRect(),a=e.width||260,l=e.height||240,s=16
let u=M.position.x,t=M.position.y
const n=window.innerWidth,i=window.innerHeight
u+a>n-s&&(u=n-a-s),u<s&&(u=s),t+l>i-s&&(t=M.position.y-s>=l?M.position.y-l-8:i-l-s),t<s&&(t=s),q.value={x:u,y:t}})()})},{immediate:!0})
const K=a(null),V=()=>{K.value&&(clearTimeout(K.value),K.value=null),W("close")},X=()=>{K.value&&(clearTimeout(K.value),K.value=null),W("mouseEnter")},Y=()=>{K.value=window.setTimeout(()=>{V()},300)},Z=()=>{W("sendMessage",M.userId,M.userName),V()},ee=()=>{W("blockUser",M.userId,M.userName),V()}
return u(()=>{B.value&&B.value.startsWith("blob:")&&URL.revokeObjectURL(B.value),A&&(clearTimeout(A),A=null)}),(a,l)=>(k(),t(f,{to:"body"},[n(i,{name:"card-fade"},{default:o(()=>[e.visible?(k(),r("div",{key:0,class:"card-overlay",onClick:V},[c("div",{ref_key:"cardContainerRef",ref:$,class:"card-container",style:m(J.value),onClick:l[0]||(l[0]=d(()=>{},["stop"])),onMouseenter:X,onMouseleave:Y},[c("div",{class:b(["avatar-background",{"has-avatar":Q.value}])},[Q.value?(k(),r("div",I,[B.value?(k(),r("img",{key:0,src:B.value,alt:"",class:"background-image"},null,8,x)):v("",!0)])):v("",!0),l[1]||(l[1]=c("div",{class:"background-overlay"},null,-1))],2),c("div",R,[c("div",T,[c("div",j,[n(g,{size:"large",userId:e.userId,"user-name":e.userName,"avatar-id":e.avatarId,width:80,height:80,"on-avatar-loaded":G},null,8,["userId","user-name","avatar-id"]),c("div",{class:b(["online-indicator",{online:P.value,offline:!1===P.value}])},null,2)]),c("div",L,[c("div",C,[c("div",_,p(e.userName),1),c("span",{class:b(["user-status",{online:P.value,offline:!1===P.value}])},[l[2]||(l[2]=c("span",{class:"status-dot"},null,-1)),c("span",null,p(F.value),1)],2)]),c("div",O,"@"+p(D.value),1),l[3]||(l[3]=c("div",{class:"user-info-backdrop"},null,-1))])]),c("div",N,[c("button",{class:"action-btn message-btn",onClick:Z},[n(U,{icon:"fluent-color:comment-multiple-32",class:"btn-icon"}),l[4]||(l[4]=c("span",null,"私信",-1))]),c("button",{class:"action-btn block-btn",onClick:ee},[n(U,{icon:"mdi:block-helper",class:"btn-icon"}),l[5]||(l[5]=c("span",null,"拉黑",-1))])])])],36)])):v("",!0)]),_:1})]))}}),[["__scopeId","data-v-c775c2dc"]])
export{M as U}

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
import{d as s,r as a,w as l,c as e,T as o,g as t,i as n,j as i,k as c,l as d,m as r,B as u,x as g,F as m,z as v,b as p,t as f,e as y,n as h}from"./PkdM_Em6.js"
import{_ as k,a as b,A as S}from"./iUIDG-9P.js"
import{d as s,r as a,w as l,c as e,T as o,g as t,i as n,j as i,k as c,l as d,m as r,B as u,x as g,F as m,z as v,b as p,t as f,e as y,n as h}from"./CD7TqNEc.js"
import{_ as k,a as b,A as S}from"./DTEPVF5R.js"
const w={class:"modal-header"},C={class:"modal-title"},$={class:"modal-body"},M={class:"log-time"},_={class:"log-message"},B={key:0,class:"log-line loading"},T={class:"modal-footer"},j={class:"footer-status"},I={key:0,class:"status-success"},L={key:1,class:"status-error"},E={key:2,class:"status-loading"},V={class:"footer-actions"},x=b(s({__name:"LogModal",props:{visible:{type:Boolean},title:{default:"操作日志"},logs:{default:()=>[]},loading:{type:Boolean,default:!1},status:{default:"idle"},canClose:{type:Boolean,default:!0}},emits:["close"],setup(s,{emit:b}){const S=s,x=b,A=a(null),D=()=>{A.value&&(A.value.scrollTop=A.value.scrollHeight)}
l(()=>S.logs,async()=>{await h(),D()},{deep:!0,flush:"post"}),l(()=>S.loading,async()=>{await h(),D()})
const H=()=>{switch(S.status){case"success":return"mdi:check-circle"

1
frontend/dist/assets/CYMBojqf.css vendored Normal file
View File

@@ -0,0 +1 @@
.official-apps-page[data-v-525238ba]{width:100%;min-height:100%}.page-container[data-v-525238ba]{width:100%}.page-header[data-v-525238ba]{margin-bottom:32px}.page-title[data-v-525238ba]{margin:0 0 8px;font-size:28px;font-weight:600;color:var(--text-primary)}.page-description[data-v-525238ba]{margin:0;font-size:14px;color:var(--text-secondary)}.app-section[data-v-525238ba]{margin-bottom:48px}.app-section[data-v-525238ba]:last-child{margin-bottom:0}.section-title[data-v-525238ba]{margin:0 0 20px;font-size:20px;font-weight:600;color:var(--text-primary)}.apps-grid[data-v-525238ba]{display:grid;grid-template-columns:repeat(auto-fill,200px);gap:20px;margin-bottom:0;justify-content:center}.loading[data-v-525238ba],.error[data-v-525238ba],.empty[data-v-525238ba]{text-align:center;padding:60px 0}.loading .spinner[data-v-525238ba],.error .spinner[data-v-525238ba],.empty .spinner[data-v-525238ba]{width:40px;height:40px;border:3px solid var(--border-light);border-top:3px solid var(--primary-color);border-radius:50%;animation:spin-525238ba .8s linear infinite;margin:0 auto 16px}.loading p[data-v-525238ba],.error p[data-v-525238ba],.empty p[data-v-525238ba]{color:var(--text-secondary);font-size:14px;margin-bottom:8px}.loading .empty-hint[data-v-525238ba],.error .empty-hint[data-v-525238ba],.empty .empty-hint[data-v-525238ba]{font-size:12px;color:var(--text-tertiary)}@keyframes spin-525238ba{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.empty-icon[data-v-525238ba]{font-size:64px;margin-bottom:16px;opacity:.3;color:var(--text-tertiary)}.list-footer[data-v-525238ba]{padding:20px 0;border-top:1px solid var(--border-light)}.footer-stats[data-v-525238ba]{display:flex;gap:24px;justify-content:center}.footer-stats .stat-item[data-v-525238ba]{display:flex;gap:8px}.footer-stats .stat-item .stat-label[data-v-525238ba]{color:var(--text-secondary);font-size:14px}.footer-stats .stat-item .stat-value[data-v-525238ba]{color:var(--text-primary);font-weight:600;font-size:14px}.btn[data-v-525238ba]{padding:8px 16px;border:none;border-radius:4px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.btn.btn-primary[data-v-525238ba]{background:var(--primary-color);color:#fff}.btn.btn-primary[data-v-525238ba]:hover{opacity:.9}

File diff suppressed because one or more lines are too long

37
frontend/dist/assets/CeYMEH4Q.js vendored Normal file
View File

@@ -0,0 +1,37 @@
import{d as e,r as s,f as a,o as l,a as t,k as o,m as n,g as c,F as i,z as r,b as u,B as d,x as v,l as m,q as p,u as g,t as w,e as f}from"./CD7TqNEc.js"
import{c as y,A as k,_ as b,M as h,T as C,a as x}from"./DTEPVF5R.js"
import{f as T,a as D,b as S,c as M}from"./DHQqjBVd.js"
const _={class:"download-manager"},z={class:"filter-bar"},$=["onClick"],j={class:"filter-count"},E={class:"recent-updates-section"},F={class:"download-list"},I={key:0,class:"empty-state"},N={class:"item-icon"},q={class:"item-content"},A={class:"item-name-row"},L={class:"item-name"},P={class:"item-meta-row"},R={class:"item-type"},B={key:0,class:"item-progress-section"},Y={class:"progress-bar"},G={class:"progress-info"},H={class:"progress-text"},J={class:"progress-stats"},K={class:"progress-speed"},O={class:"progress-time"},Q={key:1,class:"item-progress-section"},U={class:"progress-info"},V={class:"progress-stats"},W={key:2,class:"item-error"},X={class:"item-right"},Z={key:0,class:"item-status-text"},ee={class:"item-actions"},se=["onClick"],ae={class:"btn-more-wrapper"},le=["onClick"],te=["onClick"],oe=["onClick"],ne=["onClick"],ce=["onClick"],ie=x(e({__name:"DownloadManager",setup(e){const{toasts:x,success:ie,error:re,removeToast:ue}=y(),de=s([]),ve=s("all")
let me=null
const pe=s(!1),ge=s({title:"",message:"",type:"warning",confirmText:"确认",cancelText:"取消"})
let we=null
const fe=s(!1),ye=s(null),ke=[{label:"全部",value:"all"},{label:"下载中",value:"downloading"},{label:"已完成",value:"completed"},{label:"已暂停",value:"paused"},{label:"失败",value:"error"}],be=a(()=>"all"===ve.value?de.value:de.value.filter(e=>e.status===ve.value)),he=e=>"all"===e?de.value.length:de.value.filter(s=>s.status===e).length,Ce=e=>({downloading:"fluent-color:arrow-square-down-32",completed:"fluent-color:checkmark-circle-24",paused:"fluent-color:clock-24",error:"fluent-color:error-circle-24",pending:"fluent-color:hourglass-24"}[e.status]||"fluent-color:document-24"),xe=e=>{if("downloading"===e.status)return"下载中"
if("completed"===e.status&&e.updateTime){const s=new Date(1e3*e.updateTime),a=(new Date).getTime()-s.getTime()
return 0===Math.floor(a/864e5)?"今天更新":`已于${s.getFullYear()}/${String(s.getMonth()+1).padStart(2,"0")}/${String(s.getDate()).padStart(2,"0")}更新`}return""},Te=e=>{const s=e.target
!fe.value||s.closest(".menu-popup")||s.closest(".btn-more")||(fe.value=!1,ye.value=null)}
l(()=>{De(),me=setInterval(De,1e3),document.addEventListener("click",Te)}),t(()=>{me&&clearInterval(me),document.removeEventListener("click",Te)})
const De=async()=>{try{de.value=await k.getAllDownloads()}catch(e){}},Se=()=>{De()},Me=(e,s,a="warning")=>(fe.value=!1,ye.value=null,new Promise(l=>{ge.value={title:e,message:s,type:a,confirmText:"确认",cancelText:"取消"},pe.value=!0,we=l})),_e=()=>{pe.value=!1,we&&(we(!0),we=null)},ze=()=>{pe.value=!1,we&&(we(!1),we=null)}
return(e,s)=>(f(),o("div",_,[n("div",{class:"page-header"},[s[1]||(s[1]=n("div",{class:"header-content"},[n("h1",{class:"page-title"},"更新和下载"),n("p",{class:"page-subtitle"},' 通过单击"检查更新"、"全部更新"或"更新"下载并安装应用更新 ')],-1)),n("button",{class:"btn-check-updates",onClick:Se}," 检查更新 ")]),n("div",z,[(f(),o(i,null,r(ke,e=>n("button",{key:e.value,class:u(["filter-btn",{active:ve.value===e.value}]),onClick:s=>ve.value=e.value},[d(v(e.label)+" ",1),n("span",j,v(he(e.value)),1)],10,$)),64))]),n("div",E,[s[12]||(s[12]=n("h2",{class:"section-title"},"最近的更新",-1)),n("div",F,[0===be.value.length?(f(),o("div",I,[c(b,{icon:"fluent-color:cloud-24",class:"empty-icon"}),s[2]||(s[2]=n("p",{class:"empty-text"},"暂无下载任务",-1))])):m("",!0),(f(!0),o(i,null,r(be.value,e=>{var a,l
return f(),o("div",{key:e.id,class:"download-item"},[n("div",N,[c(b,{icon:Ce(e),class:"icon"},null,8,["icon"])]),n("div",q,[n("div",A,[n("span",L,v(e.fileName),1)]),n("div",P,[s[3]||(s[3]=n("span",{class:"item-publisher"},"下载任务",-1)),s[4]||(s[4]=n("span",{class:"item-separator"},"•",-1)),n("span",R,v((l=e.status,{pending:"等待中",downloading:"下载中",paused:"已暂停",completed:"应用",error:"失败"}[l]||"下载任务")),1)]),"downloading"===e.status?(f(),o("div",B,[n("div",Y,[n("div",{class:"progress-fill",style:p({width:g(T)(100*e.progress)})},null,4)]),n("div",G,[n("span",H,v(g(T)(100*e.progress)),1),n("span",J,v(g(D)(e.downloadedSize))+" / "+v(g(D)(e.totalSize)),1),n("span",K,v(g(S)(e.downloadSpeed)),1),n("span",O," 剩余 "+v(g(M)(e.remainingTime)),1)])])):"completed"===e.status?(f(),o("div",Q,[s[6]||(s[6]=n("div",{class:"progress-bar"},[n("div",{class:"progress-fill completed",style:{width:"100%"}})],-1)),n("div",U,[s[5]||(s[5]=n("span",{class:"progress-text"},"100%",-1)),n("span",V,v(g(D)(e.totalSize)),1)])])):m("",!0),e.errorMsg?(f(),o("div",W,[c(b,{icon:"fluent-color:error-circle-24",class:"error-icon"}),d(" "+v(e.errorMsg),1)])):m("",!0)]),n("div",X,[xe(e)?(f(),o("div",Z,v(xe(e)),1)):m("",!0),n("div",ee,["completed"===e.status?(f(),o("button",{key:0,class:"btn-action btn-open",onClick:s=>(async e=>{var s,a
try{const s=await k.openDownloadFile(e)
s.success?ie(s.message||"打开文件成功",2e3):re(s.message||"打开文件失败",3e3)}catch(l){const e=(null==(a=null==(s=l.response)?void 0:s.data)?void 0:a.message)||l.message||"打开文件失败"
re(e,3e3)}})(e.id)},[c(b,{icon:"mdi:folder-open",class:"btn-icon"}),s[7]||(s[7]=d(" 打开 ",-1))],8,se)):m("",!0),n("div",ae,[n("button",{class:"btn-more",onClick:w(s=>((e,s)=>{var a
null==s||s.stopPropagation(),fe.value&&(null==(a=ye.value)?void 0:a.id)===e.id?(fe.value=!1,ye.value=null):(ye.value=e,fe.value=!0)})(e,s),["stop"])},[c(b,{icon:"mdi:dots-vertical"})],8,le),fe.value&&(null==(a=ye.value)?void 0:a.id)===e.id?(f(),o("div",{key:0,class:"menu-popup",onClick:s[0]||(s[0]=w(()=>{},["stop"]))},["downloading"===e.status?(f(),o("button",{key:0,class:"menu-item",onClick:w(s=>{(async e=>{var s,a
try{const s=await k.pauseDownload(e)
if(!s.success)return void re(s.message||"暂停下载失败",3e3)
ie(s.message||"暂停下载成功",2e3),await De()}catch(l){const e=(null==(a=null==(s=l.response)?void 0:s.data)?void 0:a.message)||l.message||"暂停下载失败"
re(e,3e3)}})(e.id),fe.value=!1},["stop"])},[c(b,{icon:"fluent-color:clock-24"}),s[8]||(s[8]=d(" 暂停 ",-1))],8,te)):m("",!0),"paused"===e.status?(f(),o("button",{key:1,class:"menu-item",onClick:w(s=>{(async e=>{var s,a
try{const s=await k.resumeDownload(e)
if(!s.success)return void re(s.message||"恢复下载失败",3e3)
ie(s.message||"恢复下载成功",2e3),await De()}catch(l){const e=(null==(a=null==(s=l.response)?void 0:s.data)?void 0:a.message)||l.message||"恢复下载失败"
re(e,3e3)}})(e.id),fe.value=!1},["stop"])},[c(b,{icon:"fluent-color:arrow-sync-24"}),s[9]||(s[9]=d(" 继续 ",-1))],8,oe)):m("",!0),"completed"===e.status||"error"===e.status?(f(),o("button",{key:2,class:"menu-item",onClick:w(s=>{(async e=>{var s,a
if(await Me("重新下载",`确定要重新下载 "${e.fileName}" 吗?这将删除并重新下载该文件。`,"warning"))try{await k.deleteDownload(e.id)
const s=await k.startDownload(e.url,e.fileName)
if(!s.success)throw new Error(s.message||"重新下载失败")
await De()}catch(l){const e=(null==(a=null==(s=l.response)?void 0:s.data)?void 0:a.message)||l.message||"重新下载失败"
re(e,3e3)}})(e),fe.value=!1},["stop"])},[c(b,{icon:"fluent-color:arrow-sync-24"}),s[10]||(s[10]=d(" 重新下载 ",-1))],8,ne)):m("",!0),n("button",{class:"menu-item danger",onClick:w(s=>{(async e=>{var s,a
if(await Me("删除下载任务","确定要删除这个下载任务吗?","danger"))try{const s=await k.deleteDownload(e)
if(!s.success)return void re(s.message||"删除下载任务失败",3e3)
ie(s.message||"删除下载任务成功",2e3),await De()}catch(l){const e=(null==(a=null==(s=l.response)?void 0:s.data)?void 0:a.message)||l.message||"删除下载任务失败"
re(e,3e3)}})(e.id),fe.value=!1},["stop"])},[c(b,{icon:"fluent-color:dismiss-circle-24"}),s[11]||(s[11]=d(" 删除 ",-1))],8,ce)])):m("",!0)])])])])}),128))])]),c(h,{visible:pe.value,title:ge.value.title,message:ge.value.message,type:"danger"===ge.value.type?"error":ge.value.type||"warning","confirm-text":ge.value.confirmText,"cancel-text":ge.value.cancelText,onConfirm:_e,onCancel:ze},null,8,["visible","title","message","type","confirm-text","cancel-text"]),c(C,{toasts:g(x),onRemove:g(ue)},null,8,["toasts","onRemove"])]))}}),[["__scopeId","data-v-70173d45"]])
export{ie as default}

View File

@@ -1,5 +1,5 @@
import{d as a,k as t,l as e,m as s,B as n,x as o,F as r,e as g}from"./PkdM_Em6.js"
import{a as c}from"./iUIDG-9P.js"
import{d as a,k as t,l as e,m as s,B as n,x as o,F as r,e as g}from"./CD7TqNEc.js"
import{a as c}from"./DTEPVF5R.js"
const i={key:0,class:"pagination"},l=["disabled"],d={class:"pagination-info"},P=["disabled"],p=c(a({__name:"Pagination",props:{currentPage:{},totalPages:{},total:{}},emits:["page-change"],setup(a,{emit:c}){const p=a,u=c,b=()=>{p.currentPage>1&&u("page-change",p.currentPage-1)},m=()=>{p.currentPage<p.totalPages&&u("page-change",p.currentPage+1)}
return(c,p)=>a.totalPages>1?(g(),t("div",i,[s("button",{onClick:b,disabled:1===a.currentPage,class:"btn btn-sm"}," 上一页 ",8,l),s("span",d,[n(" 第 "+o(a.currentPage)+" 页,共 "+o(a.totalPages)+" 页",1),void 0!==a.total?(g(),t(r,{key:0},[n("(共 "+o(a.total)+" 条)",1)],64)):e("",!0)]),s("button",{onClick:m,disabled:a.currentPage>=a.totalPages,class:"btn btn-sm"}," 下一页 ",8,P)])):e("",!0)}}),[["__scopeId","data-v-fde42dc3"]])
export{p as P}

View File

@@ -1,5 +1,5 @@
import{d as e,r as a,f as l,w as i,o as n,c as s,g as o,i as t,j as u,k as v,l as r,m as d,t as m,x as c,T as g,e as f,n as p}from"./PkdM_Em6.js"
import{_ as h,a as k}from"./iUIDG-9P.js"
import{d as e,r as a,f as l,w as i,o as n,c as s,g as o,i as t,j as u,k as v,l as r,m as d,t as m,x as c,T as g,e as f,n as p}from"./CD7TqNEc.js"
import{_ as h,a as k}from"./DTEPVF5R.js"
const y={class:"image-container"},b=["src","alt"],w={key:1,class:"loading-state"},I={key:2,class:"error-state"},x={key:2,class:"image-info"},C={class:"image-index"},B={key:0,class:"image-size"},_=k(e({__name:"ImagePreviewModal",props:{visible:{type:Boolean},imageUrl:{default:null},images:{default:()=>[]},imagesInfo:{default:()=>[]},initialIndex:{default:0},showNavigation:{type:Boolean,default:!0},showInfo:{type:Boolean,default:!0}},emits:["close","indexChange"],setup(e,{emit:k}){const _=e,$=k,j=a(_.initialIndex),E=a(null),N=a(!1),U=a(!1),z=l(()=>_.imagesInfo&&_.imagesInfo.length>0?_.imagesInfo.map(e=>e.url):_.images&&_.images.length>0?_.images:_.imageUrl?[_.imageUrl]:[]),A=l(()=>{if(_.imagesInfo&&_.imagesInfo.length>0){const e=_.imagesInfo[j.value]
return null==e?void 0:e.size}}),F=()=>{if(0===z.value.length)return void(E.value=null)
const e=z.value[j.value]

20
frontend/dist/assets/D0Zic1w3.js vendored Normal file
View File

@@ -0,0 +1,20 @@
import{d as t,r as e,w as a,o as n,k as i,F as o,z as s,b as c,m as r,t as l,g as u,x as m,e as h}from"./CD7TqNEc.js"
import{_ as f,A as g,a as v}from"./DTEPVF5R.js"
function d(t){const e=new Date(t),a=(new Date).getTime()-e.getTime(),n=Math.floor(a/6e4),i=Math.floor(a/36e5),o=Math.floor(a/864e5)
return n<1?"刚刚":n<60?`${n}分钟前`:i<24?`${i}小时前`:o<7?`${o}天前`:e.toLocaleDateString("zh-CN")}function p(t){return"object"==typeof t.author&&null!==t.author?t.author.id||"":"string"==typeof t.author?t.author:""}function y(t){if("object"==typeof t.author&&null!==t.author){const e=t.author
return e.nickName||e.username||""}return"string"==typeof t.author?t.author:""}function k(t){if("object"==typeof t.author&&null!==t.author)return t.author.username}function b(t){return t.filter(t=>"image"===t.type)}function w(t){return t.filter(t=>"image"!==t.type)}function C(t){var e,a
return"string"==typeof t?t:t&&"object"==typeof t?(null==(e=t._id)?void 0:e.toString())||(null==(a=t.id)?void 0:a.toString())||t.toString():String(t)}function I(t){return b(t).map(t=>C(t))}const j={class:"edit-attachments-list"},_=["onClick"],A=["src","alt"],M={key:1,class:"image-loading"},S=["onClick"],z={class:"attachment-name"},E=["onClick"],P=v(t({__name:"EditAttachmentPreview",props:{attachments:{}},emits:["remove","imageClick"],setup(t,{emit:v}){const d=t,p=v,y=e({}),k=async()=>{const t=d.attachments.filter(t=>"image"===t.type)
await Promise.all(t.map(t=>(async t=>{if(!y.value[t])try{const e=await g.getAttachmentImage(t)
e&&(y.value[t]=e)}catch(e){}})(t.id)))}
a(()=>d.attachments,()=>{y.value={},k()},{immediate:!0}),n(()=>{k()})
const b=t=>{t.target.style.display="none"}
return(e,a)=>(h(),i("div",j,[(h(!0),i(o,null,s(t.attachments,t=>(h(),i("div",{key:t.id,class:c(["edit-attachment-item",{"image-preview":"image"===t.type}])},["image"===t.type?(h(),i("div",{key:0,class:"edit-attachment-preview",onClick:()=>p("imageClick",t.id)},[y.value[t.id]?(h(),i("img",{key:0,src:y.value[t.id]||"",alt:t.name,onError:b,class:"clickable-image"},null,40,A)):(h(),i("div",M,[...a[0]||(a[0]=[r("div",{class:"spinner"},null,-1)])])),r("button",{class:"remove-attachment-btn",onClick:l(e=>p("remove",t.id),["stop"])},[u(f,{icon:"mdi:close"})],8,S)],8,_)):(h(),i(o,{key:1},[u(f,{icon:"mdi:file",class:"attachment-icon"}),r("span",z,m(t.name),1),r("button",{class:"remove-attachment-btn",onClick:a=>e.$emit("remove",t.id)},[u(f,{icon:"mdi:close"})],8,E)],64))],2))),128))]))}}),[["__scopeId","data-v-b3def6f7"]])
function $(){const t=e(!1),a=e([]),n=e(0),i=e(new Map)
return{previewVisible:t,previewImagesInfo:a,previewIndex:n,imageCache:i,preloadPostImages:async t=>{const e=b(t)
for(const n of e){const t=C(n)
if(!i.value.has(t))try{const e=await g.getAttachmentImage(t)
e&&i.value.set(t,e)}catch(a){}}},handleImageClick:async(e,o)=>{const s=b(e),c=[]
for(const t of s){const e=C(t)
let a=i.value.get(e)
if(!a)try{const t=await g.getAttachmentImage(e)
t&&(a=t,i.value.set(e,t))}catch(r){continue}a&&c.push({url:a,size:t.size})}c.length>0&&(a.value=c,n.value=Math.min(o,c.length-1),t.value=!0)},closePreview:()=>{t.value=!1,a.value=[],n.value=0},clearImageCache:()=>{i.value.forEach(t=>{t.startsWith("blob:")&&URL.revokeObjectURL(t)}),i.value.clear()}}}export{P as E,w as a,I as b,y as c,p as d,k as e,d as f,b as g,$ as u}

View File

@@ -1,5 +1,5 @@
import{A as e}from"./iUIDG-9P.js"
import"./PkdM_Em6.js"
import{A as e}from"./DTEPVF5R.js"
import"./CD7TqNEc.js"
const s=5242880
async function t(s,t,a){return await e.initChunkUpload(s,t,a)}async function a(s,t,a,n){return await e.uploadFileChunk(s,t,a,n)}async function n(s,t){return await e.completeChunkUpload(s,t)}async function c(e){const{file:c,chunkSize:o=s,onProgress:r,onChunkProgress:i}=e
if(c.size<=o)try{const e=encodeURIComponent(c.name),s=new File([c],e,{type:c.type}),t=new FormData

View File

@@ -1,38 +0,0 @@
import{d as e,r as s,f as a,o as t,a as l,k as o,m as n,g as c,F as i,z as r,b as u,B as d,x as v,l as m,q as p,u as g,t as f,e as w}from"./PkdM_Em6.js"
import{c as y,A as k,_ as h,M as b,T as x,a as C}from"./iUIDG-9P.js"
function M(e){if(0===e)return"0 B"
const s=Math.floor(Math.log(e)/Math.log(1024))
return`${(e/Math.pow(1024,s)).toFixed(2)} ${["B","KB","MB","GB","TB"][s]}`}function T(e){return e<=0?"--":`${M(e)}/s`}function $(e){return e<=0?"完成":e>=3600?`${Math.floor(e/3600)}小时${Math.floor(e%3600/60)}分钟`:e>=60?`${Math.floor(e/60)}${Math.floor(e%60)}`:`${Math.floor(e)}`}function D(e){return e<0?"0.00%":e>=100?"100.00%":`${e.toFixed(2)}%`}const S={class:"download-manager"},B={class:"filter-bar"},F=["onClick"],_={class:"filter-count"},z={class:"recent-updates-section"},E={class:"download-list"},I={key:0,class:"empty-state"},N={class:"item-icon"},j={class:"item-content"},q={class:"item-name-row"},A={class:"item-name"},L={class:"item-meta-row"},P={class:"item-type"},R={key:0,class:"item-progress-section"},G={class:"progress-bar"},K={class:"progress-info"},Y={class:"progress-text"},H={class:"progress-stats"},J={class:"progress-speed"},O={class:"progress-time"},Q={key:1,class:"item-progress-section"},U={class:"progress-info"},V={class:"progress-stats"},W={key:2,class:"item-error"},X={class:"item-right"},Z={key:0,class:"item-status-text"},ee={class:"item-actions"},se=["onClick"],ae={class:"btn-more-wrapper"},te=["onClick"],le=["onClick"],oe=["onClick"],ne=["onClick"],ce=["onClick"],ie=C(e({__name:"DownloadManager",setup(e){const{toasts:C,success:ie,error:re,removeToast:ue}=y(),de=s([]),ve=s("all")
let me=null
const pe=s(!1),ge=s({title:"",message:"",type:"warning",confirmText:"确认",cancelText:"取消"})
let fe=null
const we=s(!1),ye=s(null),ke=[{label:"全部",value:"all"},{label:"下载中",value:"downloading"},{label:"已完成",value:"completed"},{label:"已暂停",value:"paused"},{label:"失败",value:"error"}],he=a(()=>"all"===ve.value?de.value:de.value.filter(e=>e.status===ve.value)),be=e=>"all"===e?de.value.length:de.value.filter(s=>s.status===e).length,xe=e=>({downloading:"fluent-color:arrow-square-down-32",completed:"fluent-color:checkmark-circle-24",paused:"fluent-color:clock-24",error:"fluent-color:error-circle-24",pending:"fluent-color:hourglass-24"}[e.status]||"fluent-color:document-24"),Ce=e=>{if("downloading"===e.status)return"下载中"
if("completed"===e.status&&e.updateTime){const s=new Date(1e3*e.updateTime),a=(new Date).getTime()-s.getTime()
return 0===Math.floor(a/864e5)?"今天更新":`已于${s.getFullYear()}/${String(s.getMonth()+1).padStart(2,"0")}/${String(s.getDate()).padStart(2,"0")}更新`}return""},Me=e=>{const s=e.target
!we.value||s.closest(".menu-popup")||s.closest(".btn-more")||(we.value=!1,ye.value=null)}
t(()=>{Te(),me=setInterval(Te,1e3),document.addEventListener("click",Me)}),l(()=>{me&&clearInterval(me),document.removeEventListener("click",Me)})
const Te=async()=>{try{de.value=await k.getAllDownloads()}catch(e){}},$e=()=>{Te()},De=(e,s,a="warning")=>(we.value=!1,ye.value=null,new Promise(t=>{ge.value={title:e,message:s,type:a,confirmText:"确认",cancelText:"取消"},pe.value=!0,fe=t})),Se=()=>{pe.value=!1,fe&&(fe(!0),fe=null)},Be=()=>{pe.value=!1,fe&&(fe(!1),fe=null)}
return(e,s)=>(w(),o("div",S,[n("div",{class:"page-header"},[s[1]||(s[1]=n("div",{class:"header-content"},[n("h1",{class:"page-title"},"更新和下载"),n("p",{class:"page-subtitle"},' 通过单击"检查更新"、"全部更新"或"更新"下载并安装应用更新 ')],-1)),n("button",{class:"btn-check-updates",onClick:$e}," 检查更新 ")]),n("div",B,[(w(),o(i,null,r(ke,e=>n("button",{key:e.value,class:u(["filter-btn",{active:ve.value===e.value}]),onClick:s=>ve.value=e.value},[d(v(e.label)+" ",1),n("span",_,v(be(e.value)),1)],10,F)),64))]),n("div",z,[s[12]||(s[12]=n("h2",{class:"section-title"},"最近的更新",-1)),n("div",E,[0===he.value.length?(w(),o("div",I,[c(h,{icon:"fluent-color:cloud-24",class:"empty-icon"}),s[2]||(s[2]=n("p",{class:"empty-text"},"暂无下载任务",-1))])):m("",!0),(w(!0),o(i,null,r(he.value,e=>{var a,t
return w(),o("div",{key:e.id,class:"download-item"},[n("div",N,[c(h,{icon:xe(e),class:"icon"},null,8,["icon"])]),n("div",j,[n("div",q,[n("span",A,v(e.fileName),1)]),n("div",L,[s[3]||(s[3]=n("span",{class:"item-publisher"},"下载任务",-1)),s[4]||(s[4]=n("span",{class:"item-separator"},"•",-1)),n("span",P,v((t=e.status,{pending:"等待中",downloading:"下载中",paused:"已暂停",completed:"应用",error:"失败"}[t]||"下载任务")),1)]),"downloading"===e.status?(w(),o("div",R,[n("div",G,[n("div",{class:"progress-fill",style:p({width:g(D)(100*e.progress)})},null,4)]),n("div",K,[n("span",Y,v(g(D)(100*e.progress)),1),n("span",H,v(g(M)(e.downloadedSize))+" / "+v(g(M)(e.totalSize)),1),n("span",J,v(g(T)(e.downloadSpeed)),1),n("span",O," 剩余 "+v(g($)(e.remainingTime)),1)])])):"completed"===e.status?(w(),o("div",Q,[s[6]||(s[6]=n("div",{class:"progress-bar"},[n("div",{class:"progress-fill completed",style:{width:"100%"}})],-1)),n("div",U,[s[5]||(s[5]=n("span",{class:"progress-text"},"100%",-1)),n("span",V,v(g(M)(e.totalSize)),1)])])):m("",!0),e.errorMsg?(w(),o("div",W,[c(h,{icon:"fluent-color:error-circle-24",class:"error-icon"}),d(" "+v(e.errorMsg),1)])):m("",!0)]),n("div",X,[Ce(e)?(w(),o("div",Z,v(Ce(e)),1)):m("",!0),n("div",ee,["completed"===e.status?(w(),o("button",{key:0,class:"btn-action btn-open",onClick:s=>(async e=>{var s,a
try{const s=await k.openDownloadFile(e)
s.success?ie(s.message||"打开文件成功",2e3):re(s.message||"打开文件失败",3e3)}catch(t){const e=(null==(a=null==(s=t.response)?void 0:s.data)?void 0:a.message)||t.message||"打开文件失败"
re(e,3e3)}})(e.id)},[c(h,{icon:"mdi:folder-open",class:"btn-icon"}),s[7]||(s[7]=d(" 打开 ",-1))],8,se)):m("",!0),n("div",ae,[n("button",{class:"btn-more",onClick:f(s=>((e,s)=>{var a
null==s||s.stopPropagation(),we.value&&(null==(a=ye.value)?void 0:a.id)===e.id?(we.value=!1,ye.value=null):(ye.value=e,we.value=!0)})(e,s),["stop"])},[c(h,{icon:"mdi:dots-vertical"})],8,te),we.value&&(null==(a=ye.value)?void 0:a.id)===e.id?(w(),o("div",{key:0,class:"menu-popup",onClick:s[0]||(s[0]=f(()=>{},["stop"]))},["downloading"===e.status?(w(),o("button",{key:0,class:"menu-item",onClick:f(s=>{(async e=>{var s,a
try{const s=await k.pauseDownload(e)
if(!s.success)return void re(s.message||"暂停下载失败",3e3)
ie(s.message||"暂停下载成功",2e3),await Te()}catch(t){const e=(null==(a=null==(s=t.response)?void 0:s.data)?void 0:a.message)||t.message||"暂停下载失败"
re(e,3e3)}})(e.id),we.value=!1},["stop"])},[c(h,{icon:"fluent-color:clock-24"}),s[8]||(s[8]=d(" 暂停 ",-1))],8,le)):m("",!0),"paused"===e.status?(w(),o("button",{key:1,class:"menu-item",onClick:f(s=>{(async e=>{var s,a
try{const s=await k.resumeDownload(e)
if(!s.success)return void re(s.message||"恢复下载失败",3e3)
ie(s.message||"恢复下载成功",2e3),await Te()}catch(t){const e=(null==(a=null==(s=t.response)?void 0:s.data)?void 0:a.message)||t.message||"恢复下载失败"
re(e,3e3)}})(e.id),we.value=!1},["stop"])},[c(h,{icon:"fluent-color:arrow-sync-24"}),s[9]||(s[9]=d(" 继续 ",-1))],8,oe)):m("",!0),"completed"===e.status||"error"===e.status?(w(),o("button",{key:2,class:"menu-item",onClick:f(s=>{(async e=>{var s,a
if(await De("重新下载",`确定要重新下载 "${e.fileName}" 吗?这将删除并重新下载该文件。`,"warning"))try{await k.deleteDownload(e.id)
const s=await k.startDownload(e.url,e.fileName)
if(!s.success)throw new Error(s.message||"重新下载失败")
await Te()}catch(t){const e=(null==(a=null==(s=t.response)?void 0:s.data)?void 0:a.message)||t.message||"重新下载失败"
re(e,3e3)}})(e),we.value=!1},["stop"])},[c(h,{icon:"fluent-color:arrow-sync-24"}),s[10]||(s[10]=d(" 重新下载 ",-1))],8,ne)):m("",!0),n("button",{class:"menu-item danger",onClick:f(s=>{(async e=>{var s,a
if(await De("删除下载任务","确定要删除这个下载任务吗?","danger"))try{const s=await k.deleteDownload(e)
if(!s.success)return void re(s.message||"删除下载任务失败",3e3)
ie(s.message||"删除下载任务成功",2e3),await Te()}catch(t){const e=(null==(a=null==(s=t.response)?void 0:s.data)?void 0:a.message)||t.message||"删除下载任务失败"
re(e,3e3)}})(e.id),we.value=!1},["stop"])},[c(h,{icon:"fluent-color:dismiss-circle-24"}),s[11]||(s[11]=d(" 删除 ",-1))],8,ce)])):m("",!0)])])])])}),128))])]),c(b,{visible:pe.value,title:ge.value.title,message:ge.value.message,type:"danger"===ge.value.type?"error":ge.value.type||"warning","confirm-text":ge.value.confirmText,"cancel-text":ge.value.cancelText,onConfirm:Se,onCancel:Be},null,8,["visible","title","message","type","confirm-text","cancel-text"]),c(x,{toasts:g(C),onRemove:g(ue)},null,8,["toasts","onRemove"])]))}}),[["__scopeId","data-v-70173d45"]])
export{ie as default}

3
frontend/dist/assets/DHQqjBVd.js vendored Normal file
View File

@@ -0,0 +1,3 @@
function o(o){if(0===o)return"0 B"
const t=Math.floor(Math.log(o)/Math.log(1024))
return`${(o/Math.pow(1024,t)).toFixed(2)} ${["B","KB","MB","GB","TB"][t]}`}function t(t){return t<=0?"--":`${o(t)}/s`}function r(o){return o<=0?"完成":o>=3600?`${Math.floor(o/3600)}小时${Math.floor(o%3600/60)}分钟`:o>=60?`${Math.floor(o/60)}${Math.floor(o%60)}`:`${Math.floor(o)}`}function a(o){return o<0?"0.00%":o>=100?"100.00%":`${o.toFixed(2)}%`}export{o as a,t as b,r as c,a as f}

View File

@@ -1 +0,0 @@
.official-apps-page[data-v-843b7db8]{width:100%;min-height:100%}.page-container[data-v-843b7db8]{width:100%}.page-header[data-v-843b7db8]{margin-bottom:32px}.page-title[data-v-843b7db8]{margin:0 0 8px;font-size:28px;font-weight:600;color:var(--text-primary)}.page-description[data-v-843b7db8]{margin:0;font-size:14px;color:var(--text-secondary)}.app-section[data-v-843b7db8]{margin-bottom:48px}.app-section[data-v-843b7db8]:last-child{margin-bottom:0}.section-title[data-v-843b7db8]{margin:0 0 20px;font-size:20px;font-weight:600;color:var(--text-primary)}.apps-grid[data-v-843b7db8]{display:grid;grid-template-columns:repeat(auto-fill,200px);gap:20px;margin-bottom:0;justify-content:center}.loading[data-v-843b7db8],.error[data-v-843b7db8],.empty[data-v-843b7db8]{text-align:center;padding:60px 0}.loading .spinner[data-v-843b7db8],.error .spinner[data-v-843b7db8],.empty .spinner[data-v-843b7db8]{width:40px;height:40px;border:3px solid var(--border-light);border-top:3px solid var(--primary-color);border-radius:50%;animation:spin-843b7db8 .8s linear infinite;margin:0 auto 16px}.loading p[data-v-843b7db8],.error p[data-v-843b7db8],.empty p[data-v-843b7db8]{color:var(--text-secondary);font-size:14px;margin-bottom:8px}.loading .empty-hint[data-v-843b7db8],.error .empty-hint[data-v-843b7db8],.empty .empty-hint[data-v-843b7db8]{font-size:12px;color:var(--text-tertiary)}@keyframes spin-843b7db8{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.empty-icon[data-v-843b7db8]{font-size:64px;margin-bottom:16px;opacity:.3;color:var(--text-tertiary)}.list-footer[data-v-843b7db8]{padding:20px 0;border-top:1px solid var(--border-light)}.footer-stats[data-v-843b7db8]{display:flex;gap:24px;justify-content:center}.footer-stats .stat-item[data-v-843b7db8]{display:flex;gap:8px}.footer-stats .stat-item .stat-label[data-v-843b7db8]{color:var(--text-secondary);font-size:14px}.footer-stats .stat-item .stat-value[data-v-843b7db8]{color:var(--text-primary);font-weight:600;font-size:14px}.btn[data-v-843b7db8]{padding:8px 16px;border:none;border-radius:4px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.btn.btn-primary[data-v-843b7db8]{background:var(--primary-color);color:#fff}.btn.btn-primary[data-v-843b7db8]:hover{opacity:.9}

1
frontend/dist/assets/DPQyXJVy.css vendored Normal file
View File

@@ -0,0 +1 @@
.apps-page[data-v-27654ba7]{width:100%;min-height:100%}.page-container[data-v-27654ba7]{width:100%}.page-header[data-v-27654ba7]{margin-bottom:32px}.page-title[data-v-27654ba7]{margin:0 0 8px;font-size:28px;font-weight:600;color:var(--text-primary)}.page-description[data-v-27654ba7]{margin:0;font-size:14px;color:var(--text-secondary)}.apps-grid[data-v-27654ba7]{display:grid;grid-template-columns:repeat(auto-fill,200px);gap:20px;margin-bottom:40px;justify-content:center}.loading[data-v-27654ba7],.error[data-v-27654ba7],.empty[data-v-27654ba7]{text-align:center;padding:60px 0}.loading .spinner[data-v-27654ba7],.error .spinner[data-v-27654ba7],.empty .spinner[data-v-27654ba7]{width:40px;height:40px;border:3px solid var(--border-light);border-top:3px solid var(--primary-color);border-radius:50%;animation:spin-27654ba7 .8s linear infinite;margin:0 auto 16px}.loading p[data-v-27654ba7],.error p[data-v-27654ba7],.empty p[data-v-27654ba7]{color:var(--text-secondary);font-size:14px;margin-bottom:8px}.loading .empty-hint[data-v-27654ba7],.error .empty-hint[data-v-27654ba7],.empty .empty-hint[data-v-27654ba7]{font-size:12px;color:var(--text-tertiary)}@keyframes spin-27654ba7{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.empty-icon[data-v-27654ba7]{font-size:64px;margin-bottom:16px;opacity:.3;color:var(--text-tertiary)}.list-footer[data-v-27654ba7]{padding:20px 0;border-top:1px solid var(--border-light)}.footer-stats[data-v-27654ba7]{display:flex;gap:24px;justify-content:center}.footer-stats .stat-item[data-v-27654ba7]{display:flex;gap:8px}.footer-stats .stat-item .stat-label[data-v-27654ba7]{color:var(--text-secondary);font-size:14px}.footer-stats .stat-item .stat-value[data-v-27654ba7]{color:var(--text-primary);font-weight:600;font-size:14px}.btn[data-v-27654ba7]{padding:8px 16px;border:none;border-radius:4px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.btn.btn-primary[data-v-27654ba7]{background:var(--primary-color);color:#fff}.btn.btn-primary[data-v-27654ba7]:hover{opacity:.9}

File diff suppressed because one or more lines are too long

16
frontend/dist/assets/DYXpM6bE.js vendored Normal file
View File

@@ -0,0 +1,16 @@
import{A as a}from"./BDxeGjad.js"
import{_ as s,A as e,a as l}from"./DTEPVF5R.js"
import{b as t}from"./DyA65EFq.js"
import{d as n,r as p,o as r,k as i,m as o,l as c,x as d,g as u,F as v,z as m,c as y,e as f}from"./CD7TqNEc.js"
import"./CY6538_b.js"
const g={class:"apps-page"},h={class:"page-container"},b={key:0,class:"loading"},k={key:1,class:"error"},I={key:2,class:"empty"},j={key:3,class:"apps-grid"},A={key:4,class:"list-footer"},U={class:"footer-stats"},V={class:"stat-item"},_={class:"stat-value"},w=l(n({__name:"Apps",setup(l){const n=p([]),w=p(!0),x=p(""),C=async()=>{w.value=!0,x.value=""
try{const s=await e.getApps(),l=s.map(a=>({bundleId:a.bundleId,currentVersion:a.version,currentFullVersion:a.bundleVersion}))
let p=s
if(l.length>0)try{const a=await e.batchGetAppVersions(l)
if(a.success&&a.data){const e=a.data.hasUpdateMap||{}
p=s.map(s=>{var l,t
const n=a.data[s.bundleId]||[]
if(n.length>0){const a=(null==(l=n[0])?void 0:l.version)||"",p=e[s.bundleId]??!1
return{...s,update:{...s.update,versions:n,latestVersion:a,hasUpdate:p,feedUrl:(null==(t=s.update)?void 0:t.feedUrl)||""}}}return s})}}catch(a){}n.value=p.sort((a,s)=>a.name.localeCompare(s.name)),t(n.value).catch(a=>{})}catch(a){x.value="加载应用列表失败,请检查服务是否运行",n.value=[]}finally{w.value=!1}},F=async a=>{await C()}
return r(()=>{C()}),(e,l)=>(f(),i("div",g,[o("div",h,[l[4]||(l[4]=o("div",{class:"page-header"},[o("h1",{class:"page-title"},"所有应用"),o("p",{class:"page-description"},"系统中所有已安装的应用")],-1)),w.value?(f(),i("div",b,[...l[0]||(l[0]=[o("div",{class:"spinner"},null,-1),o("p",null,"加载应用中...",-1)])])):x.value?(f(),i("div",k,[o("p",null,d(x.value),1),o("button",{onClick:C,class:"btn btn-primary"},"重试")])):0===n.value.length?(f(),i("div",I,[u(s,{icon:"fluent-color:apps-24",class:"empty-icon"}),l[1]||(l[1]=o("p",null,"没有找到应用",-1)),l[2]||(l[2]=o("p",{class:"empty-hint"},"系统中没有已安装的应用",-1))])):(f(),i("div",j,[(f(!0),i(v,null,m(n.value,s=>(f(),y(a,{key:s.bundleId,app:s,mode:"list",onUpdated:F},null,8,["app"]))),128))])),n.value.length>0?(f(),i("div",A,[o("div",U,[o("span",V,[l[3]||(l[3]=o("span",{class:"stat-label"},"总计:",-1)),o("span",_,d(n.value.length),1)])])])):c("",!0)])]))}}),[["__scopeId","data-v-27654ba7"]])
export{w as default}

1
frontend/dist/assets/D_BUbo7l.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,8 +1,8 @@
import{d as e,r as a,w as l,o as t,a as u,k as s,m as i,c as n,l as v,g as r,i as o,j as d,T as c,S as m,e as f,n as g}from"./PkdM_Em6.js"
import{b as p,_ as w,A as y,U as h,a as b}from"./iUIDG-9P.js"
const k=["src"],L=["src"],R=["src"],_=["disabled"],z=["disabled"],I={key:1,class:"avatar-menu-item uploading"},U=b(e({__name:"AvatarUpload",props:{modelValue:{},size:{default:80},disabled:{type:Boolean,default:!1}},emits:["update:modelValue","change"],setup(e,{emit:b}){m(e=>({v6174d950:U.size+"px"}))
const U=e,V=b,E=a(null),T=a(null),j=a(null),A=a(null),C=a(""),M=a(""),x=a(!1),W=a(!1),B=a(!1),H=a(null),O=()=>{var e
U.disabled||null==(e=E.value)||e.click()},P=async e=>{var a
import{d as e,r as a,w as l,o as t,a as u,k as s,m as i,c as n,l as v,g as r,i as o,j as d,T as c,V as m,e as f,n as g}from"./CD7TqNEc.js"
import{b as p,_ as w,A as y,U as h,a as b}from"./DTEPVF5R.js"
const k=["src"],L=["src"],R=["src"],_=["disabled"],V=["disabled"],z={key:1,class:"avatar-menu-item uploading"},I=b(e({__name:"AvatarUpload",props:{modelValue:{},size:{default:80},disabled:{type:Boolean,default:!1}},emits:["update:modelValue","change"],setup(e,{emit:b}){m(e=>({v6174d950:I.size+"px"}))
const I=e,U=b,E=a(null),T=a(null),j=a(null),A=a(null),C=a(""),M=a(""),x=a(!1),W=a(!1),B=a(!1),H=a(null),O=()=>{var e
I.disabled||null==(e=E.value)||e.click()},P=async e=>{var a
const l=null==(a=e.target.files)?void 0:a[0]
if(!l)return
if(!l.type.startsWith("image/"))return void alert("请选择图片文件")
@@ -14,17 +14,17 @@ W.value=!0,x.value=!1
try{const l=await y.uploadFile(h.APP_ICON,e)
if(!l.success||!(null==(a=l.data)?void 0:a.fileId))throw new Error(l.message||"上传失败")
{const e=l.data.fileId
V("update:modelValue",e),V("change",e)
U("update:modelValue",e),U("change",e)
try{const a=await y.getIcon(e)
M.value=a}catch(u){M.value=""}}}catch(s){const e=(null==(t=null==(l=s.response)?void 0:l.data)?void 0:t.message)||s.message||"上传失败"
alert(e),A.value=null,C.value="",M.value=""}finally{W.value=!1}},$=()=>{U.disabled||(A.value=null,C.value="",M.value="",x.value=!1,V("update:modelValue",""),V("change",""),E.value&&(E.value.value=""),B.value=!1)},D=()=>{},N=()=>{x.value=!0,C.value&&C.value.startsWith("blob:")&&URL.revokeObjectURL(C.value),C.value=""},S=()=>{M.value="",x.value=!1}
l(()=>U.modelValue,e=>{!e||C.value||W.value?e||(M.value="",x.value=!1):(async e=>{if(!e)return M.value="",void(x.value=!1)
alert(e),A.value=null,C.value="",M.value=""}finally{W.value=!1}},$=()=>{I.disabled||(A.value=null,C.value="",M.value="",x.value=!1,U("update:modelValue",""),U("change",""),E.value&&(E.value.value=""),B.value=!1)},D=()=>{},N=()=>{x.value=!0,C.value&&C.value.startsWith("blob:")&&URL.revokeObjectURL(C.value),C.value=""},q=()=>{M.value="",x.value=!1}
l(()=>I.modelValue,e=>{!e||C.value||W.value?e||(M.value="",x.value=!1):(async e=>{if(!e)return M.value="",void(x.value=!1)
if(!C.value&&!W.value)try{const a=await y.getIcon(e)
M.value=a,x.value=!0}catch(a){M.value="",x.value=!1}})(e)},{immediate:!0})
const q=()=>{H.value&&(clearTimeout(H.value),H.value=null),B.value=!0},G=e=>{const a=e.relatedTarget
a&&j.value&&j.value.contains(a)||(H.value&&clearTimeout(H.value),H.value=window.setTimeout(()=>{B.value=!1},200))},J=()=>{if(!B.value||!T.value||!j.value)return
const G=()=>{H.value&&(clearTimeout(H.value),H.value=null),B.value=!0},J=e=>{const a=e.relatedTarget
a&&j.value&&j.value.contains(a)||(H.value&&clearTimeout(H.value),H.value=window.setTimeout(()=>{B.value=!1},200))},K=()=>{if(!B.value||!T.value||!j.value)return
const e=T.value.getBoundingClientRect(),a=j.value,l=a.offsetHeight
let t=e.right+12,u=e.top
t+52>window.innerWidth-20&&(t=e.left-52-12),u+l>window.innerHeight-20&&(u=window.innerHeight-l-20),t<20&&(t=20),u<20&&(u=20),a.style.left=`${t}px`,a.style.top=`${u}px`}
return l(B,e=>{e&&g(()=>{J()})}),t(()=>{window.addEventListener("scroll",J,!0),window.addEventListener("resize",J)}),u(()=>{window.removeEventListener("scroll",J,!0),window.removeEventListener("resize",J),H.value&&clearTimeout(H.value),C.value&&C.value.startsWith("blob:")&&URL.revokeObjectURL(C.value)}),(a,l)=>(f(),s("div",{class:"avatar-upload",onMouseenter:q,onMouseleave:G},[i("div",{ref_key:"avatarPreviewRef",ref:T,class:"avatar-preview"},[x.value&&M.value?(f(),s("img",{key:0,src:M.value,alt:"云端图标",class:"preview-image"},null,8,k)):C.value?(f(),s("img",{key:1,src:C.value,alt:"图标预览",class:"preview-image"},null,8,L)):(f(),n(p,{key:2,"avatar-id":e.modelValue,width:e.size,height:e.size,onLoad:D},null,8,["avatar-id","width","height"])),M.value&&!x.value?(f(),s("img",{key:3,src:M.value,alt:"云端图标",class:"cloud-image",onLoad:N,onError:S},null,40,R)):v("",!0)],512),i("input",{ref_key:"fileInputRef",ref:E,type:"file",accept:"image/*",onChange:P,class:"file-input",style:{display:"none"}},null,544),(f(),n(c,{to:"body"},[r(o,{name:"avatar-menu-fade"},{default:d(()=>[B.value?(f(),s("div",{key:0,ref_key:"menuRef",ref:j,class:"avatar-menu",onMouseenter:q,onMouseleave:G},[i("button",{type:"button",class:"avatar-menu-item",onClick:O,disabled:W.value,title:"更换"},[r(w,{icon:"fluent:image-edit-24-regular"})],8,_),A.value||e.modelValue?(f(),s("button",{key:0,type:"button",class:"avatar-menu-item danger",onClick:$,disabled:W.value,title:"清除"},[r(w,{icon:"fluent:delete-24-regular"})],8,z)):v("",!0),W.value?(f(),s("div",I,[...l[0]||(l[0]=[i("div",{class:"spinner-small"},null,-1)])])):v("",!0)],544)):v("",!0)]),_:1})]))],32))}}),[["__scopeId","data-v-8cef3395"]])
export{U as A}
return l(B,e=>{e&&g(()=>{K()})}),t(()=>{window.addEventListener("scroll",K,!0),window.addEventListener("resize",K)}),u(()=>{window.removeEventListener("scroll",K,!0),window.removeEventListener("resize",K),H.value&&clearTimeout(H.value),C.value&&C.value.startsWith("blob:")&&URL.revokeObjectURL(C.value)}),(a,l)=>(f(),s("div",{class:"avatar-upload",onMouseenter:G,onMouseleave:J},[i("div",{ref_key:"avatarPreviewRef",ref:T,class:"avatar-preview"},[x.value&&M.value?(f(),s("img",{key:0,src:M.value,alt:"云端图标",class:"preview-image"},null,8,k)):C.value?(f(),s("img",{key:1,src:C.value,alt:"图标预览",class:"preview-image"},null,8,L)):(f(),n(p,{key:2,"avatar-id":e.modelValue,width:e.size,height:e.size,onLoad:D},null,8,["avatar-id","width","height"])),M.value&&!x.value?(f(),s("img",{key:3,src:M.value,alt:"云端图标",class:"cloud-image",onLoad:N,onError:q},null,40,R)):v("",!0)],512),i("input",{ref_key:"fileInputRef",ref:E,type:"file",accept:"image/*",onChange:P,class:"file-input",style:{display:"none"}},null,544),(f(),n(c,{to:"body"},[r(o,{name:"avatar-menu-fade"},{default:d(()=>[B.value?(f(),s("div",{key:0,ref_key:"menuRef",ref:j,class:"avatar-menu",onMouseenter:G,onMouseleave:J},[i("button",{type:"button",class:"avatar-menu-item",onClick:O,disabled:W.value,title:"更换"},[r(w,{icon:"fluent:image-edit-24-regular"})],8,_),A.value||e.modelValue?(f(),s("button",{key:0,type:"button",class:"avatar-menu-item danger",onClick:$,disabled:W.value,title:"清除"},[r(w,{icon:"fluent:delete-24-regular"})],8,V)):v("",!0),W.value?(f(),s("div",z,[...l[0]||(l[0]=[i("div",{class:"spinner-small"},null,-1)])])):v("",!0)],544)):v("",!0)]),_:1})]))],32))}}),[["__scopeId","data-v-8cef3395"]])
export{I as A}

File diff suppressed because one or more lines are too long

1
frontend/dist/assets/DnpucMi4.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,18 +0,0 @@
import{d as e,r as a,f as s,w as l,Q as u,c as t,g as n,i,j as o,k as r,l as v,m as c,t as d,q as m,b,x as p,T as f,e as k,n as y}from"./PkdM_Em6.js"
import{b as g,_ as I,A as U,a as h}from"./iUIDG-9P.js"
import{u as w}from"./Do10fZI7.js"
const x={key:0,class:"background-avatar-blur"},R=["src"],j={class:"card-content"},L={class:"content-layout"},C={class:"avatar-wrapper"},_={class:"user-info"},O={class:"user-name-row"},N={class:"user-name"},M={class:"user-username"},T={class:"action-buttons"},W=h(e({__name:"UserProfileCard",props:{visible:{type:Boolean,default:!1},userId:{default:""},userName:{default:""},position:{default:void 0},avatarUrl:{default:void 0},avatarId:{default:void 0},username:{default:void 0}},emits:["close","sendMessage","blockUser","mouseEnter"],setup(e,{emit:h}){const W=e,$=h,q=a(null),B=a(null),E=a(""),z=a(!1),{isUserOnline:A,queryUsersOnlineStatus:H}=w(),P=s(()=>A(W.userId)),Q=s(()=>z.value&&""!==E.value),S=a(""),D=s(()=>S.value||W.userId||"未知用户"),F=s(()=>!0===P.value?"在线":!1===P.value?"离线":"未知")
l(()=>[W.visible,W.userId,W.username],()=>{W.visible&&W.userId&&((async()=>{if(W.username)S.value=W.username
else if(W.userId)try{const e=await U.getUserInfo(W.userId)
e&&e.username&&(S.value=e.username)}catch(e){}})(),H([W.userId]))},{immediate:!0})
const G=e=>{z.value=!0,E.value&&E.value.startsWith("blob:")&&URL.revokeObjectURL(E.value),E.value=URL.createObjectURL(e)}
l(()=>W.visible,e=>{e?z.value=!1:(z.value=!1,E.value&&E.value.startsWith("blob:")&&(URL.revokeObjectURL(E.value),E.value=""))})
const J=s(()=>W.position?B.value?{left:`${B.value.x}px`,top:`${B.value.y}px`}:{left:`${W.position.x}px`,top:`${W.position.y}px`}:{})
l(()=>[W.visible,W.position],()=>{B.value=null,W.visible&&W.position&&y(()=>{(()=>{if(!W.position||!q.value)return
const e=q.value.getBoundingClientRect(),a=e.width||260,s=e.height||240,l=16
let u=W.position.x,t=W.position.y
const n=window.innerWidth,i=window.innerHeight
u+a>n-l&&(u=n-a-l),u<l&&(u=l),t+s>i-l&&(t=W.position.y-l>=s?W.position.y-s-8:i-s-l),t<l&&(t=l),B.value={x:u,y:t}})()})},{immediate:!0})
const K=a(null),V=()=>{K.value&&(clearTimeout(K.value),K.value=null),$("close")},X=()=>{K.value&&(clearTimeout(K.value),K.value=null),$("mouseEnter")},Y=()=>{K.value=window.setTimeout(()=>{V()},300)},Z=()=>{$("sendMessage",W.userId,W.userName),V()},ee=()=>{$("blockUser",W.userId,W.userName),V()}
return u(()=>{E.value&&E.value.startsWith("blob:")&&URL.revokeObjectURL(E.value)}),(a,s)=>(k(),t(f,{to:"body"},[n(i,{name:"card-fade"},{default:o(()=>[e.visible?(k(),r("div",{key:0,class:"card-overlay",onClick:V},[c("div",{ref_key:"cardContainerRef",ref:q,class:"card-container",style:m(J.value),onClick:s[0]||(s[0]=d(()=>{},["stop"])),onMouseenter:X,onMouseleave:Y},[c("div",{class:b(["avatar-background",{"has-avatar":Q.value}])},[Q.value?(k(),r("div",x,[E.value?(k(),r("img",{key:0,src:E.value,alt:"",class:"background-image"},null,8,R)):v("",!0)])):v("",!0),s[1]||(s[1]=c("div",{class:"background-overlay"},null,-1))],2),c("div",j,[c("div",L,[c("div",C,[n(g,{size:"large",userId:e.userId,"user-name":e.userName,"avatar-id":e.avatarId,width:80,height:80,"on-avatar-loaded":G},null,8,["userId","user-name","avatar-id"]),c("div",{class:b(["online-indicator",{online:P.value,offline:!1===P.value}])},null,2)]),c("div",_,[c("div",O,[c("div",N,p(e.userName),1),c("span",{class:b(["user-status",{online:P.value,offline:!1===P.value}])},[s[2]||(s[2]=c("span",{class:"status-dot"},null,-1)),c("span",null,p(F.value),1)],2)]),c("div",M,"@"+p(D.value),1),s[3]||(s[3]=c("div",{class:"user-info-backdrop"},null,-1))])]),c("div",T,[c("button",{class:"action-btn message-btn",onClick:Z},[n(I,{icon:"fluent-color:comment-multiple-32",class:"btn-icon"}),s[4]||(s[4]=c("span",null,"私信",-1))]),c("button",{class:"action-btn block-btn",onClick:ee},[n(I,{icon:"mdi:block-helper",class:"btn-icon"}),s[5]||(s[5]=c("span",null,"拉黑",-1))])])])],36)])):v("",!0)]),_:1})]))}}),[["__scopeId","data-v-379de16d"]])
export{W as U}

View File

@@ -1,4 +1,4 @@
import{A as s}from"./iUIDG-9P.js"
import{A as s}from"./DTEPVF5R.js"
async function e(e){if(localStorage.getItem("token"))try{const t=e.filter(s=>s.hasIcon&&s.bundleId)
if(0===t.length)return
const n=t.map(s=>s.bundleId),c=50,a=[]

105
frontend/dist/assets/DymHSfDy.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
import{d as a,r as l,w as s,c as e,g as i,i as o,j as n,k as t,l as c,t as r,m as u,x as d,F as v,z as p,b as m,C as f,D as b,B as g,T as y,e as h}from"./PkdM_Em6.js"
import{_ as k,a as _}from"./iUIDG-9P.js"
import{d as a,r as l,w as s,c as e,g as i,i as o,j as n,k as t,l as c,t as r,m as u,x as d,F as v,z as p,b as m,C as f,D as b,B as g,T as y,e as h}from"./CD7TqNEc.js"
import{_ as k,a as _}from"./DTEPVF5R.js"
import{R as I}from"./6K6b4Qy_.js"
const C={class:"dialog-header"},x={class:"header-icon"},w={class:"dialog-content"},j={class:"report-info-section"},D={class:"section-title"},R={class:"info-grid"},B={class:"info-row"},q={class:"info-value"},z={class:"info-row"},F={class:"info-value"},N={class:"info-row full-width"},O={class:"info-content"},T={class:"report-type-section"},U={class:"section-title"},V={class:"report-types"},A=["onClick"],E={class:"type-label"},G={class:"report-comment-section"},H={class:"section-title"},J={class:"char-count"},K={class:"dialog-footer"},L=["disabled"],M=_(a({__name:"ReportDialog",props:{visible:{type:Boolean,default:!1},reportInfo:{default:null}},emits:["close","submit"],setup(a,{emit:_}){const M=a,P=_,Q=[{value:"pornography",...I.pornography},{value:"fraud",...I.fraud},{value:"malicious_drainage",...I.malicious_drainage},{value:"abuse",...I.abuse},{value:"trolling",...I.trolling},{value:"against_values",...I.against_values}],S=l([]),W=l("")
s(()=>M.visible,a=>{a&&(S.value=[],W.value="")})

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
import{u as e,g as t}from"./iUIDG-9P.js"
import{r as s,o as n,a}from"./PkdM_Em6.js"
import{u as e,g as t}from"./DTEPVF5R.js"
import{r as s,o as n,a}from"./CD7TqNEc.js"
function i(){const{user:i}=e(),{queryUsersOnlineStatus:r,isConnected:l}=t(),u=s(new Map),o=e=>{const t=e,{userId:s,isOnline:n,lastActiveAt:a}=t.detail
s&&u.value.set(s,{isOnline:!0===n,lastActiveAt:a?new Date(a):new Date})},c=e=>{const t=e,{statuses:s}=t.detail
s&&Array.isArray(s)&&s.forEach(e=>{e.userId&&u.value.set(e.userId,{isOnline:!0===e.isOnline,lastActiveAt:e.lastActiveAt?new Date(e.lastActiveAt):new Date})})},v=e=>{const t=u.value.get(e)

1
frontend/dist/assets/U1EmyDQg.css vendored Normal file
View File

@@ -0,0 +1 @@
.reply-textarea[data-v-b3def6f7]{width:100%;padding:12px;border:1px solid var(--border-light);border-radius:8px;background:var(--bg-card);color:var(--text-primary);font-size:14px;font-family:inherit;resize:vertical;min-height:60px}.reply-textarea[data-v-b3def6f7]:focus{outline:none;border-color:var(--primary-color)}.edit-attachments-list[data-v-b3def6f7]{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.edit-attachment-item[data-v-b3def6f7]{display:flex;align-items:center;gap:8px;padding:8px 12px;background:var(--bg-secondary);border-radius:6px;font-size:13px}.edit-new-attachments[data-v-b3def6f7]{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.edit-attachment-preview[data-v-b3def6f7]{position:relative;width:80px;height:80px;border-radius:6px;overflow:hidden;background:var(--bg-secondary);cursor:pointer}.edit-attachment-preview img[data-v-b3def6f7]{width:100%;height:100%;object-fit:cover;-webkit-user-select:none;user-select:none;pointer-events:auto}.edit-attachment-preview img.clickable-image[data-v-b3def6f7]{cursor:pointer;transition:transform .2s ease}.edit-attachment-preview:hover img.clickable-image[data-v-b3def6f7]{transform:scale(1.05)}.edit-attachment-preview .remove-attachment-btn[data-v-b3def6f7]{pointer-events:auto}.edit-attachment-preview .image-loading[data-v-b3def6f7]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:var(--bg-secondary)}.edit-attachment-preview .image-loading .spinner[data-v-b3def6f7]{width:24px;height:24px;border:2px solid var(--border-light);border-top-color:var(--primary-color);border-radius:50%;animation:spin-b3def6f7 .8s linear infinite}.edit-attachment-preview.file[data-v-b3def6f7]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:8px;width:auto;height:auto;min-width:120px}.edit-attachment-actions[data-v-b3def6f7]{display:flex;gap:8px;margin-top:8px}.upload-btn[data-v-b3def6f7]{display:flex;align-items:center;gap:6px;padding:4px 8px;background:transparent;border:1px solid var(--border-light);border-radius:6px;color:var(--text-secondary);font-size:12px;cursor:pointer;transition:all .2s ease}.upload-btn[data-v-b3def6f7]:hover{color:var(--text-primary);border-color:var(--primary-color);background:var(--bg-secondary)}.upload-btn.small[data-v-b3def6f7]{padding:4px 8px;font-size:12px}.edit-reply-actions[data-v-b3def6f7]{display:flex;gap:8px;margin-top:8px}.cancel-btn[data-v-b3def6f7]{padding:6px 12px;background:transparent;border:1px solid var(--border-light);border-radius:6px;color:var(--text-secondary);font-size:13px;cursor:pointer;transition:all .2s ease}.cancel-btn[data-v-b3def6f7]:hover{color:var(--text-primary);border-color:var(--primary-color)}.submit-reply-btn[data-v-b3def6f7]{display:flex;align-items:center;gap:6px;padding:6px 12px;background:var(--primary-color);border:none;border-radius:6px;color:#fff;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease}.submit-reply-btn[data-v-b3def6f7]:hover:not(:disabled){opacity:.9;transform:translateY(-1px)}.submit-reply-btn[data-v-b3def6f7]:disabled{opacity:.5;cursor:not-allowed}.submit-reply-btn.small[data-v-b3def6f7]{padding:6px 12px;font-size:13px}.attachment-preview-list[data-v-b3def6f7]{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.attachment-preview-item[data-v-b3def6f7]{position:relative;width:80px;height:80px;border-radius:6px;overflow:hidden;background:var(--bg-secondary)}.attachment-preview-item img[data-v-b3def6f7]{width:100%;height:100%;object-fit:cover}.attachment-preview-item.file[data-v-b3def6f7]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:8px;width:auto;height:auto;min-width:120px}.attachment-preview-item.file .file-icon[data-v-b3def6f7]{font-size:24px;color:var(--text-secondary);margin-bottom:4px}.attachment-preview-item.file .file-name[data-v-b3def6f7]{font-size:11px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100px}.attachment-preview-item.file .file-size[data-v-b3def6f7]{font-size:10px;color:var(--text-tertiary)}.remove-attachment-btn[data-v-b3def6f7]{position:absolute;top:4px;right:4px;width:20px;height:20px;background:#0009;border:none;border-radius:50%;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;z-index:10}.remove-attachment-btn[data-v-b3def6f7]:hover{background:#000c}.remove-attachment-btn[data-v-b3def6f7] svg{font-size:12px}.attachment-error[data-v-b3def6f7]{position:absolute;bottom:0;left:0;right:0;background:#f00c;color:#fff;font-size:10px;padding:2px 4px;text-align:center}@keyframes spin-b3def6f7{to{transform:rotate(360deg)}}

File diff suppressed because one or more lines are too long

227
frontend/dist/assets/_YA5wcFS.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
import{d as e,r as a,f as s,w as t,o as i,a as l,Q as n,k as c,m as o,g as d,F as r,z as u,b as p,l as v,x as m,B as f,u as y,t as h,J as b,e as g}from"./PkdM_Em6.js"
import{c as k,g as w,_ as I,T,A as D,a as C}from"./iUIDG-9P.js"
import{I as N}from"./BCfwJ2p5.js"
import{I as x}from"./C9KKuA8Z.js"
import{d as e,r as a,f as s,w as t,o as i,a as l,Q as n,k as c,m as o,g as d,F as r,z as u,b as p,l as v,x as m,B as f,u as y,t as h,J as b,e as g}from"./CD7TqNEc.js"
import{c as k,g as w,_ as I,T,A as D,a as C}from"./DTEPVF5R.js"
import{I as N}from"./CugD9gGX.js"
import{I as x}from"./5jZb0Mvm.js"
import{a as _,b as A}from"./6K6b4Qy_.js"
const R={class:"notifications-page"},U={class:"page-container"},M={class:"tabs-container"},j={class:"tabs"},q=["onClick"],S={key:0,class:"tab-badge"},E={class:"content-area"},L={key:0,class:"tab-content"},B={class:"section-header"},$={class:"header-actions"},z=["disabled"],V={class:"notifications-list"},W={class:"notification-icon"},O={key:0,class:"unread-dot"},F={class:"notification-content"},J={class:"notification-header"},Q={class:"notification-title"},G={class:"notification-time"},H={class:"notification-body"},K={class:"detail-content"},P={key:0,class:"notification-expanded-details"},X={key:0,class:"expanded-section"},Y={class:"detail-item"},Z={class:"detail-value"},ee={class:"detail-item"},ae={class:"detail-value"},se={class:"detail-item"},te={class:"detail-value"},ie={class:"detail-item"},le={class:"detail-content"},ne={class:"detail-item"},ce={class:"detail-value"},oe={key:0,class:"detail-item"},de={class:"detail-content admin-comment"},re={key:1,class:"expanded-section"},ue={class:"detail-item"},pe={class:"detail-value"},ve={class:"detail-item"},me={class:"report-types-tags"},fe={class:"detail-item"},ye={class:"detail-content"},he={key:0,class:"detail-item"},be={class:"detail-content admin-comment"},ge={key:2,class:"expanded-section"},ke={class:"detail-item"},we={class:"detail-value"},Ie={class:"detail-item"},Te={class:"detail-value"},De={key:0,class:"detail-item"},Ce={class:"detail-content"},Ne={class:"notification-actions"},xe=["onClick"],_e={key:0,class:"empty-state"},Ae={key:1,class:"tab-content"},Re={class:"notifications-list"},Ue={key:0,class:"loading-state issues-loading"},Me={key:1,class:"empty-state"},je={class:"notification-icon"},qe=["src","alt"],Se={key:1,class:"app-icon-placeholder"},Ee={class:"notification-content"},Le={class:"notification-header"},Be={class:"notification-title"},$e={class:"notification-time"},ze={class:"notification-body"},Ve={class:"issue-type"},We={class:"issue-type-value"},Oe={class:"detail-content"},Fe={key:0,class:"notification-expanded-details"},Je={class:"expanded-section"},Qe={class:"detail-item"},Ge={class:"detail-value"},He={class:"detail-item"},Ke={class:"detail-value"},Pe={key:0,class:"detail-item"},Xe={key:1,class:"detail-item"},Ye={class:"attachments-list"},Ze=["onClick"],ea={class:"attachment-name"},aa={key:2,class:"detail-item"},sa={class:"detail-content admin-comment"},ta={key:3,class:"detail-item"},ia={class:"detail-value"},la={class:"notification-actions"},na=["onClick"],ca={key:2,class:"tab-content"},oa={class:"notifications-list"},da=["onClick"],ra={class:"notification-icon"},ua={class:"notification-content"},pa={class:"notification-header"},va={class:"notification-title"},ma={class:"notification-time"},fa={class:"notification-body"},ya={class:"notification-details"},ha={class:"detail-content"},ba={key:0,class:"new-replies-badge"},ga={key:0,class:"empty-state"},ka={key:3,class:"tab-content"},wa={class:"section-header"},Ia={class:"notifications-list"},Ta={class:"notification-icon"},Da={key:0,class:"unread-dot"},Ca={class:"notification-content"},Na={class:"notification-header"},xa={class:"notification-title"},_a={class:"user-name"},Aa={class:"notification-time"},Ra={class:"notification-body"},Ua={class:"detail-content"},Ma={key:0,class:"empty-state"},ja={key:4,class:"tab-content"},qa={class:"section-header"},Sa={class:"header-actions"},Ea=["disabled"],La={class:"notifications-list"},Ba=["onClick"],$a={class:"notification-icon"},za={key:0,class:"unread-dot"},Va={class:"notification-content"},Wa={class:"notification-header"},Oa={class:"notification-title"},Fa={class:"user-name"},Ja={key:0,class:"reply-to"},Qa={key:1},Ga={class:"notification-time"},Ha={class:"notification-body"},Ka={class:"notification-text"},Pa={class:"notification-details"},Xa={class:"detail-content"},Ya={key:0,class:"empty-state"},Za=C(e({__name:"Notifications",setup(e){const C=b(),{toasts:Za,showError:es,showSuccess:as,showWarning:ss,removeToast:ts}=k(),is=a("system"),ls=a(new Set),ns=a([]),cs=a([]),os=a([]),ds=a([]),rs=a(!1),us=a(!1),ps=a(!1),vs=a(!1),ms=a(new Map),fs=a(!1),ys=async()=>{fs.value=!0
try{const e=await D.getNotifications(1,100)

1
frontend/dist/assets/bID-OVBg.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
import{d as e,f as a,k as t,m as l,q as s,x as n,e as o,l as c,r as i,o as d,g as u,C as r,D as v,B as p,b as m,j as _,u as h,i as g}from"./PkdM_Em6.js"
import{a as f,c as k,e as x,_ as y,T as w,M as b,A as V}from"./iUIDG-9P.js"
import{d as e,f as a,k as t,m as l,q as s,x as n,e as o,l as c,r as i,o as d,g as u,C as r,D as v,B as p,b as m,j as _,u as h,i as g}from"./CD7TqNEc.js"
import{a as f,c as k,e as x,_ as y,T as w,M as b,A as V}from"./DTEPVF5R.js"
const C={class:"slider-wrapper"},U=["value","min","max","step"],S={class:"slider-value"},T=f(e({__name:"Slider",props:{modelValue:{},min:{default:0},max:{default:100},step:{default:1},suffix:{default:""}},emits:["update:modelValue"],setup(e,{emit:c}){const i=e,d=c,u=a(()=>i.suffix?`${i.modelValue} ${i.suffix}`:i.modelValue.toString()),r=a(()=>{let e=i.modelValue
return e<i.min?e=i.min:e>i.max&&(e=i.max),e}),v=a(()=>{const e=(r.value-i.min)/(i.max-i.min)*100
return{"--progress-percent":`${Math.max(0,Math.min(100,e))}%`}}),p=e=>{const a=e.target

1
frontend/dist/assets/n_4z6mU9.css vendored Normal file

File diff suppressed because one or more lines are too long

1
frontend/dist/assets/ouGwZezW.css vendored Normal file

File diff suppressed because one or more lines are too long

23
frontend/dist/assets/rudU4q4P.js vendored Normal file
View File

@@ -0,0 +1,23 @@
import{A as a}from"./BDxeGjad.js"
import{_ as s,A as e,a as l}from"./DTEPVF5R.js"
import{d as t,r as n,f as p,o as i,k as c,m as o,l as d,x as u,g as r,F as v,z as h,c as m,e as f}from"./CD7TqNEc.js"
import"./CY6538_b.js"
const b={class:"official-apps-page"},g={class:"page-container"},I={key:0,class:"loading"},y={key:1,class:"error"},k={key:2,class:"empty"},A={key:3},U={key:0,class:"app-section"},V={class:"apps-grid"},j={key:1,class:"app-section"},w={class:"apps-grid"},M={key:4,class:"list-footer"},_={class:"footer-stats"},C={class:"stat-item"},G={class:"stat-value"},x={class:"stat-item"},F={class:"stat-value"},z={class:"stat-item"},E={class:"stat-value"},N=l(t({__name:"OfficialApps",setup(l){const t=n([]),N=n(!0),O=n(""),Q=p(()=>t.value.sort((a,s)=>a.name.localeCompare(s.name))),q=p(()=>Q.value.filter(a=>a.path&&a.path.length>0)),B=p(()=>Q.value.filter(a=>!a.path||0===a.path.length)),D=async()=>{N.value=!0,O.value=""
try{const s=await e.getApps(),l=s.map(a=>({bundleId:a.bundleId,currentVersion:a.version,currentFullVersion:a.bundleVersion}))
if(0===l.length){const a=await e.batchGetAppVersions([])
if(a.success&&a.data){const s=a.data.notInstalledApps||[]
t.value=s.map(a=>H(a))}else t.value=[]}else{const n=await e.batchGetAppVersions(l)
if(n.success&&n.data){const l=n.data,p=[],i=l.versions||{},c=l.hasUpdateMap||{}
s.forEach(a=>{var s,e
const l=i[a.bundleId]
if(l&&l.length>0){const t=(null==(s=l[0])?void 0:s.version)||"",n=c[a.bundleId]??!1
p.push({...a,update:{hasUpdate:n,latestVersion:t,feedUrl:(null==(e=a.update)?void 0:e.feedUrl)||"",versions:l}})}})
const o=(l.notInstalledApps||[]).map(a=>H(a))
t.value=[...p,...o]
const d=o.map(a=>a.bundleId)
if(d.length>0)try{const a=await e.batchGetAppIconIds(d)
a.success&&a.iconIdMap&&(t.value=t.value.map(s=>!s.path&&a.iconIdMap[s.bundleId]?{...s,iconId:a.iconIdMap[s.bundleId]}:s))}catch(a){}}else t.value=[]}}catch(a){O.value="加载应用列表失败,请检查服务是否运行",t.value=[]}finally{N.value=!1}}
function H(a){var s
return{bundleId:a.bundleId,name:a.appName,version:"",bundleVersion:"",path:"",status:"supported",injection:null,update:a.versions.length>0?{hasUpdate:!1,latestVersion:(null==(s=a.versions[0])?void 0:s.version)||"",feedUrl:"",versions:a.versions}:null}}const J=async a=>{await D()}
return i(()=>{D()}),(e,l)=>(f(),c("div",b,[o("div",g,[l[8]||(l[8]=o("div",{class:"page-header"},[o("h1",{class:"page-title"},"来自官方"),o("p",{class:"page-description"},"浏览和下载经过 QiuChenly 认证的可信来源应用")],-1)),N.value?(f(),c("div",I,[...l[0]||(l[0]=[o("div",{class:"spinner"},null,-1),o("p",null,"加载应用中...",-1)])])):O.value?(f(),c("div",y,[o("p",null,u(O.value),1),o("button",{onClick:D,class:"btn btn-primary"},"重试")])):0===Q.value.length?(f(),c("div",k,[r(s,{icon:"fluent-color:shield-checkmark-24",class:"empty-icon"}),l[1]||(l[1]=o("p",null,"没有找到来自官方的应用",-1)),l[2]||(l[2]=o("p",{class:"empty-hint"},"当前没有可用的应用更新",-1))])):(f(),c("div",A,[q.value.length>0?(f(),c("div",U,[l[3]||(l[3]=o("h3",{class:"section-title"},"已安装的应用",-1)),o("div",V,[(f(!0),c(v,null,h(q.value,s=>(f(),m(a,{key:s.bundleId,app:s,mode:"list",onUpdated:J},null,8,["app"]))),128))])])):d("",!0),B.value.length>0?(f(),c("div",j,[l[4]||(l[4]=o("h3",{class:"section-title"},"未在此Mac上安装",-1)),o("div",w,[(f(!0),c(v,null,h(B.value,s=>(f(),m(a,{key:s.bundleId,app:s,mode:"list",onUpdated:J},null,8,["app"]))),128))])])):d("",!0)])),Q.value.length>0?(f(),c("div",M,[o("div",_,[o("span",C,[l[5]||(l[5]=o("span",{class:"stat-label"},"总计:",-1)),o("span",G,u(Q.value.length),1)]),o("span",x,[l[6]||(l[6]=o("span",{class:"stat-label"},"已安装:",-1)),o("span",F,u(q.value.length),1)]),o("span",z,[l[7]||(l[7]=o("span",{class:"stat-label"},"未安装:",-1)),o("span",E,u(B.value.length),1)])])])):d("",!0)])]))}}),[["__scopeId","data-v-525238ba"]])
export{N as default}

View File

@@ -1 +0,0 @@
.apps-page[data-v-dc4bed26]{width:100%;min-height:100%}.page-container[data-v-dc4bed26]{width:100%}.page-header[data-v-dc4bed26]{margin-bottom:32px}.page-title[data-v-dc4bed26]{margin:0 0 8px;font-size:28px;font-weight:600;color:var(--text-primary)}.page-description[data-v-dc4bed26]{margin:0;font-size:14px;color:var(--text-secondary)}.apps-grid[data-v-dc4bed26]{display:grid;grid-template-columns:repeat(auto-fill,200px);gap:20px;margin-bottom:40px;justify-content:center}.loading[data-v-dc4bed26],.error[data-v-dc4bed26],.empty[data-v-dc4bed26]{text-align:center;padding:60px 0}.loading .spinner[data-v-dc4bed26],.error .spinner[data-v-dc4bed26],.empty .spinner[data-v-dc4bed26]{width:40px;height:40px;border:3px solid var(--border-light);border-top:3px solid var(--primary-color);border-radius:50%;animation:spin-dc4bed26 .8s linear infinite;margin:0 auto 16px}.loading p[data-v-dc4bed26],.error p[data-v-dc4bed26],.empty p[data-v-dc4bed26]{color:var(--text-secondary);font-size:14px;margin-bottom:8px}.loading .empty-hint[data-v-dc4bed26],.error .empty-hint[data-v-dc4bed26],.empty .empty-hint[data-v-dc4bed26]{font-size:12px;color:var(--text-tertiary)}@keyframes spin-dc4bed26{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.empty-icon[data-v-dc4bed26]{font-size:64px;margin-bottom:16px;opacity:.3;color:var(--text-tertiary)}.list-footer[data-v-dc4bed26]{padding:20px 0;border-top:1px solid var(--border-light)}.footer-stats[data-v-dc4bed26]{display:flex;gap:24px;justify-content:center}.footer-stats .stat-item[data-v-dc4bed26]{display:flex;gap:8px}.footer-stats .stat-item .stat-label[data-v-dc4bed26]{color:var(--text-secondary);font-size:14px}.footer-stats .stat-item .stat-value[data-v-dc4bed26]{color:var(--text-primary);font-weight:600;font-size:14px}.btn[data-v-dc4bed26]{padding:8px 16px;border:none;border-radius:4px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease}.btn.btn-primary[data-v-dc4bed26]{background:var(--primary-color);color:#fff}.btn.btn-primary[data-v-dc4bed26]:hover{opacity:.9}

View File

@@ -1,5 +1,5 @@
import{d as e,r as l,f as o,w as n,o as a,a as t,k as s,m as i,c,b as d,g as r,x as u,i as v,j as p,l as w,t as m,q as f,F as k,z as h,T as g,n as x,e as E}from"./PkdM_Em6.js"
import{_ as L,a as _}from"./iUIDG-9P.js"
import{d as e,r as l,f as o,w as n,o as a,a as t,k as s,m as i,c,b as d,g as r,x as u,i as v,j as p,l as w,t as m,q as f,F as k,z as h,T as g,n as x,e as E}from"./CD7TqNEc.js"
import{_ as L,a as _}from"./DTEPVF5R.js"
const y={class:"select-selected"},C=["onClick"],b=_(e({__name:"CustomSelect",props:{modelValue:{},options:{},placeholder:{default:"请选择"}},emits:["update:modelValue"],setup(e,{emit:_}){const b=e,V=_,z=l(!1),j=l(null),H=l(null),R=l({top:"0px",left:"0px",width:"200px"}),$=o(()=>b.options.find(e=>e.value===b.modelValue)||null),W=()=>{z.value&&j.value&&x(()=>{const e=j.value.getBoundingClientRect(),l=48*b.options.length+16,o=window.innerHeight-e.bottom,n=e.top
let a=e.bottom+8,t=e.left,s=e.width
o<l&&n>o&&(a=e.top-l-8),t+s>window.innerWidth&&(t=window.innerWidth-s-16),t<16&&(t=16),a<16&&(a=16),a+l>window.innerHeight-16&&(a=window.innerHeight-l-16),R.value={top:`${a}px`,left:`${t}px`,width:`${s}px`}})},q=()=>{z.value=!z.value,z.value&&W()},B=e=>{const l=e.target

View File

@@ -1,16 +1,16 @@
import{d as e,r as s,f as a,w as n,o as l,H as t,a as i,k as u,m as c,g as o,B as r,l as d,x as v,c as m,j as g,F as p,z as h,t as f,b as y,u as k,y as w,C as b,D as C,i as I,G as M,n as T,J as x,e as N}from"./PkdM_Em6.js"
import{c as E,e as _,d as S,u as A,h as L,g as $,_ as B,b as D,M as U,T as z,A as O,a as R}from"./iUIDG-9P.js"
import{I as j}from"./BCfwJ2p5.js"
import{u as F}from"./Do10fZI7.js"
const q={class:"messages-page"},W={class:"page-container"},K={class:"page-header"},H={class:"page-title"},V={key:0,class:"title-badge"},G={class:"messages-layout"},J={class:"conversations-sidebar"},P={class:"sidebar-header"},Q={class:"conversations-list"},X={key:0,class:"conversations-loading"},Y=["onClick","onContextmenu"],Z={class:"conversation-avatar"},ee=["title"],se={key:0,class:"unread-badge"},ae={class:"conversation-info"},ne={class:"conversation-header"},le={class:"conversation-name"},te={class:"conversation-time"},ie={class:"conversation-preview"},ue={class:"preview-text"},ce={key:0,class:"unread-indicator"},oe=["onClick"],re={key:2,class:"empty-conversations"},de={class:"messages-content"},ve={key:0,class:"user-selection-view"},me={class:"selection-header"},ge={class:"selection-search"},pe={class:"search-input-wrapper"},he={class:"user-list-container"},fe={key:0,class:"users-loading"},ye={key:1,class:"users-error"},ke={key:2,class:"users-empty"},we={key:3,class:"users-list"},be=["onClick"],Ce={class:"user-item-info"},Ie={class:"user-item-name"},Me={key:0,class:"user-item-username"},Te={key:1,class:"user-item-username"},xe={key:1,class:"empty-conversation-view"},Ne={key:2,class:"conversation-view"},Ee={class:"conversation-header-bar"},_e={class:"header-user-info"},Se={class:"user-details"},Ae={class:"user-name"},Le={class:"user-status"},$e={key:0,class:"status-badge blocked"},Be={key:1,class:"status-badge muted"},De={key:2,class:"status-badge online"},Ue={key:3,class:"status-badge offline"},ze={key:4,class:"status-badge offline"},Oe={class:"header-actions-group"},Re={key:0,class:"messages-loading"},je={key:0,class:"message-avatar"},Fe={class:"message-content-wrapper"},qe={class:"message-content"},We={class:"message-text"},Ke={key:0,class:"message-attachments"},He=["onClick"],Ve={class:"attachment-name"},Ge={class:"attachment-size"},Je={class:"message-footer"},Pe={class:"message-time"},Qe={key:0,class:"message-status sending"},Xe={key:1,class:"message-status sent"},Ye={key:2,class:"message-status failed"},Ze={key:1,class:"message-avatar"},es={class:"message-input-area"},ss={key:0,class:"input-disabled-notice"},as={key:1},ns={class:"input-toolbar"},ls=["disabled"],ts=["disabled"],is=["onKeydown"],us={key:2,class:"attachments-preview"},cs=["src"],os=["onClick"],rs={class:"file-name"},ds=["onClick"],vs={key:3,class:"input-footer"},ms={class:"char-count"},gs=["disabled"],ps=R(e({__name:"Messages",setup(e){const R=x(),ps=t(),{toasts:hs,error:fs,success:ys,removeToast:ks}=E(),ws=_(),{loadingState:bs,show:Cs,hide:Is}=S(),{user:Ms}=A()
import{d as e,r as s,f as a,w as n,o as t,H as l,a as i,k as u,m as c,g as o,B as r,l as d,x as v,c as m,j as g,F as p,z as h,t as f,b as y,u as k,y as w,C as b,D as C,i as I,G as M,n as T,J as x,e as N}from"./CD7TqNEc.js"
import{c as E,e as _,d as S,u as A,h as L,g as $,_ as B,b as D,M as U,T as z,A as O,a as R}from"./DTEPVF5R.js"
import{I as j}from"./CugD9gGX.js"
import{u as F}from"./Tr3ZfNrL.js"
const q={class:"messages-page"},W={class:"page-container"},K={class:"page-header"},H={class:"page-title"},V={key:0,class:"title-badge"},G={class:"messages-layout"},J={class:"conversations-sidebar"},P={class:"sidebar-header"},Q={class:"conversations-list"},X={key:0,class:"conversations-loading"},Y=["onClick","onContextmenu"],Z={class:"conversation-avatar"},ee=["title"],se={key:0,class:"unread-badge"},ae={class:"conversation-info"},ne={class:"conversation-header"},te={class:"conversation-name"},le={class:"conversation-time"},ie={class:"conversation-preview"},ue={class:"preview-text"},ce={key:0,class:"unread-indicator"},oe=["onClick"],re={key:2,class:"empty-conversations"},de={class:"messages-content"},ve={key:0,class:"user-selection-view"},me={class:"selection-header"},ge={class:"selection-search"},pe={class:"search-input-wrapper"},he={class:"user-list-container"},fe={key:0,class:"users-loading"},ye={key:1,class:"users-error"},ke={key:2,class:"users-empty"},we={key:3,class:"users-list"},be=["onClick"],Ce={class:"user-item-info"},Ie={class:"user-item-name"},Me={key:0,class:"user-item-username"},Te={key:1,class:"user-item-username"},xe={key:1,class:"empty-conversation-view"},Ne={key:2,class:"conversation-view"},Ee={class:"conversation-header-bar"},_e={class:"header-user-info"},Se={class:"user-details"},Ae={class:"user-name"},Le={class:"user-status"},$e={key:0,class:"status-badge blocked"},Be={key:1,class:"status-badge muted"},De={key:2,class:"status-badge online"},Ue={key:3,class:"status-badge offline"},ze={key:4,class:"status-badge offline"},Oe={class:"header-actions-group"},Re={key:0,class:"messages-loading"},je={key:0,class:"message-avatar"},Fe={class:"message-content-wrapper"},qe={class:"message-content"},We={class:"message-text"},Ke={key:0,class:"message-attachments"},He=["onClick"],Ve={class:"attachment-name"},Ge={class:"attachment-size"},Je={class:"message-footer"},Pe={class:"message-time"},Qe={key:0,class:"message-status sending"},Xe={key:1,class:"message-status sent"},Ye={key:2,class:"message-status failed"},Ze={key:1,class:"message-avatar"},es={class:"message-input-area"},ss={key:0,class:"input-disabled-notice"},as={key:1},ns={class:"input-toolbar"},ts=["disabled"],ls=["disabled"],is=["onKeydown"],us={key:2,class:"attachments-preview"},cs=["src"],os=["onClick"],rs={class:"file-name"},ds=["onClick"],vs={key:3,class:"input-footer"},ms={class:"char-count"},gs=["disabled"],ps=R(e({__name:"Messages",setup(e){const R=x(),ps=l(),{toasts:hs,error:fs,success:ys,removeToast:ks}=E(),ws=_(),{loadingState:bs,show:Cs,hide:Is}=S(),{user:Ms}=A()
L()
const Ts=$(),{isConnected:xs,getConversations:Ns,deleteConversation:Es,getMessages:_s,sendMessage:Ss}=Ts,{isUserOnline:As,queryUsersOnlineStatus:Ls}=F(),$s=s([]),Bs=s(!1),Ds=s(!1),Us=s(null),zs=s(""),Os=s([]),Rs=s([]),js=s(null),Fs=s(null),qs=s(null),Ws=s(null),Ks=s(!1),Hs=s(null),Vs=s(!1),Gs=s(null),Js=s(!1),Ps=s(""),Qs=s([]),Xs=s(!1),Ys=s(""),Zs=s(1),ea=s(50),sa=s(0),aa=a(()=>$s.value.find(e=>e.id===Us.value)||null),na=a(()=>$s.value.reduce((e,s)=>e+(s.unreadCount||0),0)),la=a(()=>zs.value.trim().length>0||Os.value.length>0||Rs.value.length>0),ta=async e=>{Js.value=!1,Us.value=e
const Ts=$(),{isConnected:xs,getConversations:Ns,deleteConversation:Es,getMessages:_s,sendMessage:Ss}=Ts,{isUserOnline:As,queryUsersOnlineStatus:Ls}=F(),$s=s([]),Bs=s(!1),Ds=s(!1),Us=s(null),zs=s(""),Os=s([]),Rs=s([]),js=s(null),Fs=s(null),qs=s(null),Ws=s(null),Ks=s(!1),Hs=s(null),Vs=s(!1),Gs=s(null),Js=s(!1),Ps=s(""),Qs=s([]),Xs=s(!1),Ys=s(""),Zs=s(1),ea=s(50),sa=s(0),aa=a(()=>$s.value.find(e=>e.id===Us.value)||null),na=a(()=>$s.value.reduce((e,s)=>e+(s.unreadCount||0),0)),ta=a(()=>zs.value.trim().length>0||Os.value.length>0||Rs.value.length>0),la=async e=>{Js.value=!1,Us.value=e
const s=$s.value.find(s=>s.id===e)
s&&(s.unreadCount=0,s.messages&&0!==s.messages.length||await ua(e)),T(()=>{Ea()})},ia=(e,s=!1)=>{if(e&&e.conversations){const s=e.conversations.map(e=>{var s
return{id:e.id,userId:e.userId,userName:e.userName,userAvatar:e.userAvatar||e.avatar,lastMessage:e.lastMessage,lastMessageTime:e.lastMessageTime,unreadCount:e.unreadCount||0,messages:(null==(s=$s.value.find(s=>s.id===e.id))?void 0:s.messages)||[],blocked:e.blocked||!1,muted:e.muted||!1}}),a=new Map($s.value.map(e=>[e.id,e])),n=s.filter(e=>!a.has(e.id)&&e.lastMessage&&e.lastMessage.trim().length>0),l=s.filter(e=>!(a.has(e.id)||e.lastMessage&&0!==e.lastMessage.trim().length)),t=[],i=[]
return{id:e.id,userId:e.userId,userName:e.userName,userAvatar:e.userAvatar||e.avatar,lastMessage:e.lastMessage,lastMessageTime:e.lastMessageTime,unreadCount:e.unreadCount||0,messages:(null==(s=$s.value.find(s=>s.id===e.id))?void 0:s.messages)||[],blocked:e.blocked||!1,muted:e.muted||!1}}),a=new Map($s.value.map(e=>[e.id,e])),n=s.filter(e=>!a.has(e.id)&&e.lastMessage&&e.lastMessage.trim().length>0),t=s.filter(e=>!(a.has(e.id)||e.lastMessage&&0!==e.lastMessage.trim().length)),l=[],i=[]
s.forEach(e=>{const s=a.get(e.id)
if(s){const a=s.lastMessageTime!==e.lastMessageTime&&e.lastMessage&&e.lastMessage.trim().length>0,n=s.unreadCount!==e.unreadCount
a||n?t.push({...e,messages:s.messages||[]}):i.push(s)}}),0===$s.value.length?$s.value=s:$s.value=[...t,...n,...i,...l]}else s||($s.value=[])
a||n?l.push({...e,messages:s.messages||[]}):i.push(s)}}),0===$s.value.length?$s.value=s:$s.value=[...l,...n,...i,...t]}else s||($s.value=[])
if(window.dispatchEvent(new CustomEvent("messages:conversations-updated")),e&&e.conversations&&e.conversations.length>0){const s=e.conversations.map(e=>e.userId).filter(Boolean)
s.length>0&&xs.value&&Ls(s).catch(e=>{})}},ua=async e=>{if(xs.value){Ds.value=!0
try{const s=await _s(e,1,100)
@@ -23,12 +23,12 @@ return{id:e.id||e._id||(null==(s=e._id)?void 0:s.toString()),username:e.username
const e=Ps.value.toLowerCase()
return Qs.value.filter(s=>s.username&&s.username.toLowerCase().includes(e)||s.nickName&&s.nickName.toLowerCase().includes(e))}),ga=async e=>{Cs("创建会话...")
try{const a=await O.getOrCreateConversationByUserId(e)
if(a.success&&a.data){const{conversationId:n,userName:l}=a.data
if($s.value.find(e=>e.id===n))Us.value=n,await ta(n)
if(a.success&&a.data){const{conversationId:n,userName:t}=a.data
if($s.value.find(e=>e.id===n))Us.value=n,await la(n)
else{let a
try{const s=await O.getUserInfo(e)
s&&(a=s.avatar)}catch(s){}const t={id:n,userId:e,userName:l,userAvatar:a,lastMessage:"",lastMessageTime:(new Date).toISOString(),unreadCount:0,messages:[],blocked:!1,muted:!1}
$s.value.push(t),Us.value=n,await ta(n)}R.replace({path:"/messages",query:{}})}else fs(a.message||"创建会话失败",2e3)}catch(s){fs("创建会话失败",2e3)}finally{Is()}},pa=()=>{aa.value&&(Hs.value={userId:aa.value.userId,userName:aa.value.userName,content:"",type:void 0},Ks.value=!0,Vs.value=!1)},ha=async()=>{if(aa.value){Cs("设置拒收...")
s&&(a=s.avatar)}catch(s){}const l={id:n,userId:e,userName:t,userAvatar:a,lastMessage:"",lastMessageTime:(new Date).toISOString(),unreadCount:0,messages:[],blocked:!1,muted:!1}
$s.value.push(l),Us.value=n,await la(n)}R.replace({path:"/messages",query:{}})}else fs(a.message||"创建会话失败",2e3)}catch(s){fs("创建会话失败",2e3)}finally{Is()}},pa=()=>{aa.value&&(Hs.value={userId:aa.value.userId,userName:aa.value.userName,content:"",type:void 0},Ks.value=!0,Vs.value=!1)},ha=async()=>{if(aa.value){Cs("设置拒收...")
try{const e=await O.setConversationMute(aa.value.id,!0)
e.success?(aa.value.muted=!0,Vs.value=!1):fs(e.message||"操作失败",2e3)}catch(e){fs("设置拒收失败",2e3)}finally{Is()}}},fa=async()=>{if(aa.value){Cs("取消拒收...")
try{const e=await O.setConversationMute(aa.value.id,!1)
@@ -37,12 +37,12 @@ try{const e=await O.setConversationBlock(aa.value.id,!0)
e.success?(aa.value.blocked=!0,aa.value.muted=!0,Vs.value=!1):fs(e.message||"操作失败",2e3)}catch(e){fs("拉黑用户失败",2e3)}finally{Is()}}},ka=async()=>{if(aa.value){Cs("取消拉黑...")
try{const e=await O.setConversationBlock(aa.value.id,!1)
e.success?(aa.value.blocked=!1,Vs.value=!1):fs(e.message||"操作失败",2e3)}catch(e){fs("取消拉黑失败",2e3)}finally{Is()}}},wa=e=>{const s=e.target
Gs.value&&!Gs.value.contains(s)&&(Vs.value=!1)},ba=async()=>{if(!la.value||!aa.value)return
Gs.value&&!Gs.value.contains(s)&&(Vs.value=!1)},ba=async()=>{if(!ta.value||!aa.value)return
if(Os.value.length>0||Rs.value.length>0)return void fs("附件功能暂未实现",2e3)
const e=zs.value.trim()
if(!e)return
const s=`temp-${Date.now()}-${Math.random()}`,a={id:s,content:e,sendTime:(new Date).toISOString(),sent:!0,status:"sending"}
if(aa.value.messages.push(a),zs.value="",Os.value=[],Rs.value=[],T(()=>{Ea()}),xs.value)try{const a=await Ss(aa.value.id,e),n=aa.value.messages.findIndex(e=>e.id===s),l=a.sendTime instanceof Date?a.sendTime.toISOString():a.sendTime;-1!==n&&(aa.value.messages[n]={id:a.messageId,content:a.content,sendTime:l,sent:!0,status:"sent"}),aa.value.lastMessage=e,aa.value.lastMessageTime=l,window.dispatchEvent(new CustomEvent("messages:conversations-updated"))}catch(n){const e=aa.value.messages.findIndex(e=>e.id===s);-1!==e&&(aa.value.messages[e].status="failed"),fs(n.message||"发送消息失败",2e3)}else fs("WebSocket未连接无法发送消息",2e3)},Ca=()=>{var e
if(aa.value.messages.push(a),zs.value="",Os.value=[],Rs.value=[],T(()=>{Ea()}),xs.value)try{const a=await Ss(aa.value.id,e),n=aa.value.messages.findIndex(e=>e.id===s),t=a.sendTime instanceof Date?a.sendTime.toISOString():a.sendTime;-1!==n&&(aa.value.messages[n]={id:a.messageId,content:a.content,sendTime:t,sent:!0,status:"sent"}),aa.value.lastMessage=e,aa.value.lastMessageTime=t,window.dispatchEvent(new CustomEvent("messages:conversations-updated"))}catch(n){const e=aa.value.messages.findIndex(e=>e.id===s);-1!==e&&(aa.value.messages[e].status="failed"),fs(n.message||"发送消息失败",2e3)}else fs("WebSocket未连接无法发送消息",2e3)},Ca=()=>{var e
null==(e=js.value)||e.click()},Ia=()=>{var e
null==(e=Fs.value)||e.click()},Ma=e=>{const s=e.target
Array.from(s.files||[]).forEach(e=>{if(Os.value.length>=5)return
@@ -50,25 +50,25 @@ if(e.size>10485760)return void fs("图片大小不能超过10MB",2e3)
const s=new FileReader
s.onload=s=>{var a
Os.value.push({file:e,preview:null==(a=s.target)?void 0:a.result})},s.readAsDataURL(e)}),s.value=""},Ta=e=>{const s=e.target
Array.from(s.files||[]).forEach(e=>{Rs.value.length>=5||(e.size>20971520?fs("文件大小不能超过20MB",2e3):Rs.value.push({file:e}))}),s.value=""},xa=()=>{Ws.value=null},Na=e=>{const s=new Date(e),a=(new Date).getTime()-s.getTime(),n=Math.floor(a/6e4),l=Math.floor(a/36e5),t=Math.floor(a/864e5)
return n<1?"刚刚":n<60?`${n}分钟前`:l<24?`${l}小时前`:t<7?`${t}天前`:s.toLocaleDateString("zh-CN")},Ea=()=>{qs.value&&(qs.value.scrollTop=qs.value.scrollHeight)},_a=e=>{const s=e.detail
Array.from(s.files||[]).forEach(e=>{Rs.value.length>=5||(e.size>20971520?fs("文件大小不能超过20MB",2e3):Rs.value.push({file:e}))}),s.value=""},xa=()=>{Ws.value=null},Na=e=>{const s=new Date(e),a=(new Date).getTime()-s.getTime(),n=Math.floor(a/6e4),t=Math.floor(a/36e5),l=Math.floor(a/864e5)
return n<1?"刚刚":n<60?`${n}分钟前`:t<24?`${t}小时前`:l<7?`${l}天前`:s.toLocaleDateString("zh-CN")},Ea=()=>{qs.value&&(qs.value.scrollTop=qs.value.scrollHeight)},_a=e=>{const s=e.detail
Bs.value&&(Bs.value=!1),ia(s,!0)},Sa=e=>{var s
const a=e.detail,{conversationId:n,messageId:l,content:t,sendTime:i,senderId:u}=a,c=$s.value.find(e=>e.id===n)
if(c){Us.value===n?c.messages.some(e=>e.id===l)||(c.messages.push({id:l,content:t,sendTime:i,sent:u===(null==(s=Ms.value)?void 0:s._id),status:"sent"}),T(()=>{Ea()})):c.unreadCount=(c.unreadCount||0)+1,c.lastMessage=t.length>50?t.substring(0,50)+"...":t,c.lastMessageTime=i
const a=e.detail,{conversationId:n,messageId:t,content:l,sendTime:i,senderId:u}=a,c=$s.value.find(e=>e.id===n)
if(c){Us.value===n?c.messages.some(e=>e.id===t)||(c.messages.push({id:t,content:l,sendTime:i,sent:u===(null==(s=Ms.value)?void 0:s._id),status:"sent"}),T(()=>{Ea()})):c.unreadCount=(c.unreadCount||0)+1,c.lastMessage=l.length>50?l.substring(0,50)+"...":l,c.lastMessageTime=i
const e=$s.value.findIndex(e=>e.id===n)
e>0&&($s.value.splice(e,1),$s.value.unshift(c))}window.dispatchEvent(new CustomEvent("messages:conversations-updated"))},Aa=async(e=0,s=3)=>{if(xs.value&&(!Bs.value||0!==e)){Bs.value=!0
try{const e=await Ns(1,50)
e&&e.conversations&&ia(e,!1)}catch(a){const n=a.message||"",l=n.includes("超时")||n.includes("timeout")||n.includes("请求超时")
if(l&&e<s)return Bs.value=!1,void setTimeout(()=>{Aa(e+1,s)},1e3*(e+1))
l||!n||n.includes("WebSocket未连接")||fs(n||"加载会话列表失败",2e3)}finally{0!==e&&Bs.value||(Bs.value=!1)}}}
return n(xs,e=>{e?Aa():Bs.value&&(Bs.value=!1)}),l(async()=>{xs.value?await Aa():0===$s.value.length&&(Bs.value=!0)
e&&e.conversations&&ia(e,!1)}catch(a){const n=a.message||"",t=n.includes("超时")||n.includes("timeout")||n.includes("请求超时")
if(t&&e<s)return Bs.value=!1,void setTimeout(()=>{Aa(e+1,s)},1e3*(e+1))
t||!n||n.includes("WebSocket未连接")||fs(n||"加载会话列表失败",2e3)}finally{0!==e&&Bs.value||(Bs.value=!1)}}}
return n(xs,e=>{e?Aa():Bs.value&&(Bs.value=!1)}),t(async()=>{xs.value?await Aa():0===$s.value.length&&(Bs.value=!0)
const e=ps.query.userId
e&&await ga(e),document.addEventListener("click",wa),window.addEventListener("websocket:conversations",_a),window.addEventListener("websocket:new-message",Sa)}),n(()=>ps.query.userId,async e=>{e&&"string"==typeof e&&await ga(e)}),i(()=>{document.removeEventListener("click",wa),window.removeEventListener("websocket:conversations",_a),window.removeEventListener("websocket:new-message",Sa)}),(e,s)=>(N(),u(p,null,[c("div",q,[c("div",W,[c("div",K,[c("h1",H,[s[4]||(s[4]=r(" 私信 ",-1)),na.value>0?(N(),u("span",V,v(na.value>99?"99+":na.value),1)):d("",!0)]),s[5]||(s[5]=c("p",{class:"page-description"},"与用户进行一对一私信交流",-1))]),c("div",G,[c("div",J,[c("div",P,[s[7]||(s[7]=c("h2",null,"会话列表",-1)),c("button",{class:"new-conversation-btn",onClick:ca},[o(B,{icon:"mdi:plus",class:"btn-icon"}),s[6]||(s[6]=r(" 新会话 ",-1))])]),c("div",Q,[Bs.value&&0===$s.value.length?(N(),u("div",X,[o(B,{icon:"mdi:loading",class:"loading-icon spinning"}),s[8]||(s[8]=c("span",null,"加载会话列表...",-1))])):(N(),m(w,{key:1,name:"conversation-list",tag:"div",class:"conversations-transition-wrapper"},{default:g(()=>[(N(!0),u(p,null,h($s.value,e=>(N(),u("div",{key:e.id,class:y(["conversation-item",{active:Us.value===e.id}]),onClick:s=>ta(e.id),onContextmenu:f(e=>{},["prevent"])},[c("div",Z,[o(D,{"user-id":e.userId,"user-name":e.userName,width:40,height:40},null,8,["user-id","user-name"]),c("div",{class:y(["conversation-online-indicator",{online:!0===k(As)(e.userId),offline:!1===k(As)(e.userId)}]),title:!0===k(As)(e.userId)?"在线":!1===k(As)(e.userId)?"离线":"状态未知"},null,10,ee),e.unreadCount>0?(N(),u("span",se,v(e.unreadCount),1)):d("",!0)]),c("div",ae,[c("div",ne,[c("span",le,v(e.userName),1),c("span",te,v(Na(e.lastMessageTime)),1)]),c("div",ie,[c("span",ue,v(e.lastMessage),1),e.unreadCount>0?(N(),u("span",ce)):d("",!0)])]),c("button",{class:"conversation-delete-btn",onClick:f(s=>(async e=>{if(await ws.show({title:"隐藏会话",message:`确定要隐藏与"${e.userName}"的会话吗?\n\n隐藏后会话将从列表中移除,但所有消息记录都会保留。重新建立会话时可以恢复。`,type:"warning",confirmText:"隐藏",cancelText:"取消"}))if(xs.value)try{await Es(e.id),Us.value===e.id&&(Us.value=null)
const s=$s.value.findIndex(s=>s.id===e.id);-1!==s&&$s.value.splice(s,1),window.dispatchEvent(new CustomEvent("messages:conversations-updated")),ys("隐藏会话成功",2e3)}catch(s){fs(s.message||"隐藏会话失败",2e3)}else fs("WebSocket未连接无法隐藏会话",2e3)})(e),["stop"]),title:"隐藏会话"},[o(B,{icon:"mdi:delete-outline"})],8,oe)],42,Y))),128))]),_:1})),Bs.value||0!==$s.value.length?d("",!0):(N(),u("div",re,[o(B,{icon:"fluent-color:comment-multiple-32",class:"empty-icon"}),s[9]||(s[9]=c("p",null,"暂无会话",-1))]))])]),c("div",de,[Js.value?(N(),u("div",ve,[c("div",me,[s[10]||(s[10]=c("h2",null,"选择用户开始聊天",-1)),c("button",{class:"close-btn",onClick:oa},[o(B,{icon:"mdi:close"})])]),c("div",ge,[c("div",pe,[o(B,{icon:"mdi:magnify",class:"search-icon"}),b(c("input",{"onUpdate:modelValue":s[0]||(s[0]=e=>Ps.value=e),type:"text",placeholder:"搜索用户名或昵称...",class:"search-input",onInput:da},null,544),[[C,Ps.value]]),Ps.value?(N(),u("button",{key:0,class:"clear-search-btn",onClick:va},[o(B,{icon:"mdi:close-circle"})])):d("",!0)])]),c("div",he,[Xs.value?(N(),u("div",fe,[o(B,{icon:"mdi:loading",class:"loading-icon spinning"}),s[11]||(s[11]=c("span",null,"加载用户列表...",-1))])):Ys.value?(N(),u("div",ye,[o(B,{icon:"mdi:alert-circle",class:"error-icon"}),c("p",null,v(Ys.value),1),c("button",{class:"retry-btn",onClick:ra},"重试")])):0===ma.value.length?(N(),u("div",ke,[o(B,{icon:"mdi:account-off",class:"empty-icon"}),c("p",null,v(Ps.value?"未找到匹配的用户":"暂无用户"),1)])):(N(),u("div",we,[(N(!0),u(p,null,h(ma.value,e=>(N(),u("div",{key:e.id,class:"user-item",onClick:s=>(async e=>{oa(),await ga(e.id)})(e)},[o(D,{"user-id":e.id,"user-name":e.nickName||e.username,width:48,height:48},null,8,["user-id","user-name"]),c("div",Ce,[c("div",Ie,v(e.nickName||e.username||"未知用户"),1),e.username?(N(),u("div",Me,"@"+v(e.username),1)):e.age?(N(),u("div",Te,"年龄: "+v(e.age),1)):d("",!0)]),o(B,{icon:"mdi:chevron-right",class:"chevron-icon"})],8,be))),128))]))])])):aa.value?(N(),u("div",Ne,[c("div",Ee,[c("div",_e,[o(D,{"user-id":aa.value.userId,"user-name":aa.value.userName,width:40,height:40},null,8,["user-id","user-name"]),c("div",Se,[c("h3",Ae,v(aa.value.userName),1),c("span",Le,[aa.value.blocked?(N(),u("span",$e,"已拉黑")):aa.value.muted?(N(),u("span",Be,"已拒收")):!0===k(As)(aa.value.userId)?(N(),u("span",De,"在线")):!1===k(As)(aa.value.userId)?(N(),u("span",Ue,"离线")):(N(),u("span",ze,"状态未知"))])])]),c("div",Oe,[c("button",{class:"header-action-btn report-btn",onClick:pa},[o(B,{icon:"mdi:flag-outline"})]),c("div",{class:"more-actions-wrapper",ref_key:"moreActionsRef",ref:Gs},[c("button",{class:"header-action-btn",onClick:s[1]||(s[1]=e=>Vs.value=!Vs.value)},[o(B,{icon:"mdi:dots-vertical"})]),o(I,{name:"menu-fade"},{default:g(()=>[Vs.value?(N(),u("div",{key:0,class:"more-actions-menu",onClick:s[2]||(s[2]=f(()=>{},["stop"]))},[aa.value.muted?(N(),u("div",{key:1,class:"menu-item",onClick:fa},[o(B,{icon:"mdi:bell-outline",class:"menu-icon"}),s[14]||(s[14]=c("span",null,"接收消息",-1))])):(N(),u("div",{key:0,class:"menu-item",onClick:ha},[o(B,{icon:"mdi:bell-off-outline",class:"menu-icon"}),s[13]||(s[13]=c("span",null,"拒收消息",-1))])),aa.value.blocked?(N(),u("div",{key:3,class:"menu-item",onClick:ka},[o(B,{icon:"mdi:account-check-outline",class:"menu-icon"}),s[16]||(s[16]=c("span",null,"取消拉黑",-1))])):(N(),u("div",{key:2,class:"menu-item danger",onClick:ya},[o(B,{icon:"mdi:block-helper",class:"menu-icon"}),s[15]||(s[15]=c("span",null,"拉黑用户",-1))]))])):d("",!0)]),_:1})],512)])]),c("div",{class:"messages-list",ref_key:"messagesListRef",ref:qs},[Ds.value?(N(),u("div",Re,[o(B,{icon:"mdi:loading",class:"loading-icon spinning"}),s[17]||(s[17]=c("span",null,"加载消息...",-1))])):(N(!0),u(p,{key:1},h(aa.value.messages,e=>{var s,a,n,l
e&&await ga(e),document.addEventListener("click",wa),window.addEventListener("websocket:conversations",_a),window.addEventListener("websocket:new-message",Sa)}),n(()=>ps.query.userId,async e=>{e&&"string"==typeof e&&await ga(e)}),i(()=>{document.removeEventListener("click",wa),window.removeEventListener("websocket:conversations",_a),window.removeEventListener("websocket:new-message",Sa)}),(e,s)=>(N(),u(p,null,[c("div",q,[c("div",W,[c("div",K,[c("h1",H,[s[4]||(s[4]=r(" 私信 ",-1)),na.value>0?(N(),u("span",V,v(na.value>99?"99+":na.value),1)):d("",!0)]),s[5]||(s[5]=c("p",{class:"page-description"},"与用户进行一对一私信交流",-1))]),c("div",G,[c("div",J,[c("div",P,[s[7]||(s[7]=c("h2",null,"会话列表",-1)),c("button",{class:"new-conversation-btn",onClick:ca},[o(B,{icon:"mdi:plus",class:"btn-icon"}),s[6]||(s[6]=r(" 新会话 ",-1))])]),c("div",Q,[Bs.value&&0===$s.value.length?(N(),u("div",X,[o(B,{icon:"mdi:loading",class:"loading-icon spinning"}),s[8]||(s[8]=c("span",null,"加载会话列表...",-1))])):(N(),m(w,{key:1,name:"conversation-list",tag:"div",class:"conversations-transition-wrapper"},{default:g(()=>[(N(!0),u(p,null,h($s.value,e=>(N(),u("div",{key:e.id,class:y(["conversation-item",{active:Us.value===e.id}]),onClick:s=>la(e.id),onContextmenu:f(e=>{},["prevent"])},[c("div",Z,[o(D,{"user-id":e.userId,"user-name":e.userName,width:40,height:40},null,8,["user-id","user-name"]),c("div",{class:y(["conversation-online-indicator",{online:!0===k(As)(e.userId),offline:!1===k(As)(e.userId)}]),title:!0===k(As)(e.userId)?"在线":!1===k(As)(e.userId)?"离线":"状态未知"},null,10,ee),e.unreadCount>0?(N(),u("span",se,v(e.unreadCount),1)):d("",!0)]),c("div",ae,[c("div",ne,[c("span",te,v(e.userName),1),c("span",le,v(Na(e.lastMessageTime)),1)]),c("div",ie,[c("span",ue,v(e.lastMessage),1),e.unreadCount>0?(N(),u("span",ce)):d("",!0)])]),c("button",{class:"conversation-delete-btn",onClick:f(s=>(async e=>{if(await ws.show({title:"隐藏会话",message:`确定要隐藏与"${e.userName}"的会话吗?\n\n隐藏后会话将从列表中移除,但所有消息记录都会保留。重新建立会话时可以恢复。`,type:"warning",confirmText:"隐藏",cancelText:"取消"}))if(xs.value)try{await Es(e.id),Us.value===e.id&&(Us.value=null)
const s=$s.value.findIndex(s=>s.id===e.id);-1!==s&&$s.value.splice(s,1),window.dispatchEvent(new CustomEvent("messages:conversations-updated")),ys("隐藏会话成功",2e3)}catch(s){fs(s.message||"隐藏会话失败",2e3)}else fs("WebSocket未连接无法隐藏会话",2e3)})(e),["stop"]),title:"隐藏会话"},[o(B,{icon:"mdi:delete-outline"})],8,oe)],42,Y))),128))]),_:1})),Bs.value||0!==$s.value.length?d("",!0):(N(),u("div",re,[o(B,{icon:"fluent-color:comment-multiple-32",class:"empty-icon"}),s[9]||(s[9]=c("p",null,"暂无会话",-1))]))])]),c("div",de,[Js.value?(N(),u("div",ve,[c("div",me,[s[10]||(s[10]=c("h2",null,"选择用户开始聊天",-1)),c("button",{class:"close-btn",onClick:oa},[o(B,{icon:"mdi:close"})])]),c("div",ge,[c("div",pe,[o(B,{icon:"mdi:magnify",class:"search-icon"}),b(c("input",{"onUpdate:modelValue":s[0]||(s[0]=e=>Ps.value=e),type:"text",placeholder:"搜索用户名或昵称...",class:"search-input",onInput:da},null,544),[[C,Ps.value]]),Ps.value?(N(),u("button",{key:0,class:"clear-search-btn",onClick:va},[o(B,{icon:"mdi:close-circle"})])):d("",!0)])]),c("div",he,[Xs.value?(N(),u("div",fe,[o(B,{icon:"mdi:loading",class:"loading-icon spinning"}),s[11]||(s[11]=c("span",null,"加载用户列表...",-1))])):Ys.value?(N(),u("div",ye,[o(B,{icon:"mdi:alert-circle",class:"error-icon"}),c("p",null,v(Ys.value),1),c("button",{class:"retry-btn",onClick:ra},"重试")])):0===ma.value.length?(N(),u("div",ke,[o(B,{icon:"mdi:account-off",class:"empty-icon"}),c("p",null,v(Ps.value?"未找到匹配的用户":"暂无用户"),1)])):(N(),u("div",we,[(N(!0),u(p,null,h(ma.value,e=>(N(),u("div",{key:e.id,class:"user-item",onClick:s=>(async e=>{oa(),await ga(e.id)})(e)},[o(D,{"user-id":e.id,"user-name":e.nickName||e.username,width:48,height:48},null,8,["user-id","user-name"]),c("div",Ce,[c("div",Ie,v(e.nickName||e.username||"未知用户"),1),e.username?(N(),u("div",Me,"@"+v(e.username),1)):e.age?(N(),u("div",Te,"年龄: "+v(e.age),1)):d("",!0)]),o(B,{icon:"mdi:chevron-right",class:"chevron-icon"})],8,be))),128))]))])])):aa.value?(N(),u("div",Ne,[c("div",Ee,[c("div",_e,[o(D,{"user-id":aa.value.userId,"user-name":aa.value.userName,width:40,height:40},null,8,["user-id","user-name"]),c("div",Se,[c("h3",Ae,v(aa.value.userName),1),c("span",Le,[aa.value.blocked?(N(),u("span",$e,"已拉黑")):aa.value.muted?(N(),u("span",Be,"已拒收")):!0===k(As)(aa.value.userId)?(N(),u("span",De,"在线")):!1===k(As)(aa.value.userId)?(N(),u("span",Ue,"离线")):(N(),u("span",ze,"状态未知"))])])]),c("div",Oe,[c("button",{class:"header-action-btn report-btn",onClick:pa},[o(B,{icon:"mdi:flag-outline"})]),c("div",{class:"more-actions-wrapper",ref_key:"moreActionsRef",ref:Gs},[c("button",{class:"header-action-btn",onClick:s[1]||(s[1]=e=>Vs.value=!Vs.value)},[o(B,{icon:"mdi:dots-vertical"})]),o(I,{name:"menu-fade"},{default:g(()=>[Vs.value?(N(),u("div",{key:0,class:"more-actions-menu",onClick:s[2]||(s[2]=f(()=>{},["stop"]))},[aa.value.muted?(N(),u("div",{key:1,class:"menu-item",onClick:fa},[o(B,{icon:"mdi:bell-outline",class:"menu-icon"}),s[14]||(s[14]=c("span",null,"接收消息",-1))])):(N(),u("div",{key:0,class:"menu-item",onClick:ha},[o(B,{icon:"mdi:bell-off-outline",class:"menu-icon"}),s[13]||(s[13]=c("span",null,"拒收消息",-1))])),aa.value.blocked?(N(),u("div",{key:3,class:"menu-item",onClick:ka},[o(B,{icon:"mdi:account-check-outline",class:"menu-icon"}),s[16]||(s[16]=c("span",null,"取消拉黑",-1))])):(N(),u("div",{key:2,class:"menu-item danger",onClick:ya},[o(B,{icon:"mdi:block-helper",class:"menu-icon"}),s[15]||(s[15]=c("span",null,"拉黑用户",-1))]))])):d("",!0)]),_:1})],512)])]),c("div",{class:"messages-list",ref_key:"messagesListRef",ref:qs},[Ds.value?(N(),u("div",Re,[o(B,{icon:"mdi:loading",class:"loading-icon spinning"}),s[17]||(s[17]=c("span",null,"加载消息...",-1))])):(N(!0),u(p,{key:1},h(aa.value.messages,e=>{var s,a,n,t
return N(),u("div",{key:e.id,class:y(["message-item",{sent:e.sent,received:!e.sent}])},[e.sent?d("",!0):(N(),u("div",je,[o(D,{"user-id":aa.value.userId,"user-name":aa.value.userName,width:40,height:40},null,8,["user-id","user-name"])])),c("div",Fe,[c("div",qe,[c("p",We,v(e.content),1),e.attachments&&e.attachments.length>0?(N(),u("div",Ke,[(N(!0),u(p,null,h(e.attachments,e=>{return N(),u("div",{key:e.id,class:"attachment-item",onClick:s=>(async e=>{if("image"===e.type){const s=await O.getAttachmentImage(e.id)
s&&(Ws.value=s)}else await(async e=>{const s=await O.getAttachmentDownloadUrl(e.id)
if(!s)return
const a=document.createElement("a")
a.href=s.url,a.download=s.name,a.target="_blank",document.body.appendChild(a),a.click(),document.body.removeChild(a)})(e)})(e)},[o(B,{icon:"image"===e.type?"mdi:image":"mdi:file",class:"attachment-icon"},null,8,["icon"]),c("span",Ve,v(e.name),1),c("span",Ge,v((s=e.size,s<1024?`${s} B`:s<1048576?`${(s/1024).toFixed(1)} KB`:`${(s/1048576).toFixed(1)} MB`)),1)],8,He)
var s}),128))])):d("",!0),c("div",Je,[c("span",Pe,v(Na(e.sendTime)),1),e.sent&&"sending"===e.status?(N(),u("span",Qe,[o(B,{icon:"mdi:loading",class:"status-icon spinning"})])):e.sent&&"sent"===e.status?(N(),u("span",Xe,[o(B,{icon:"mdi:check-circle",class:"status-icon"})])):e.sent&&"failed"===e.status?(N(),u("span",Ye,[o(B,{icon:"mdi:alert-circle",class:"status-icon",title:"发送失败"})])):d("",!0)])])]),e.sent?(N(),u("div",Ze,[o(D,{"user-id":(null==(s=k(Ms))?void 0:s.id)||(null==(a=k(Ms))?void 0:a._id),"user-name":(null==(n=k(Ms))?void 0:n.nickName)||(null==(l=k(Ms))?void 0:l.username)||"我",width:40,height:40},null,8,["user-id","user-name"])])):d("",!0)],2)}),128))],512),c("div",es,[aa.value.blocked||aa.value.muted?(N(),u("div",ss,[o(B,{icon:aa.value.blocked?"mdi:block-helper":"mdi:bell-off-outline",class:"notice-icon"},null,8,["icon"]),c("span",null,v(aa.value.blocked?"该用户已被拉黑,无法发送消息":"已拒收该用户的消息"),1)])):(N(),u("div",as,[c("div",ns,[c("button",{class:"toolbar-btn",onClick:Ca,disabled:Os.value.length>=5,title:"添加图片最多5张每张10M以内"},[o(B,{icon:"mdi:image-outline"})],8,ls),c("button",{class:"toolbar-btn",onClick:Ia,disabled:Rs.value.length>=5,title:"添加文件最多5个每个20M以内"},[o(B,{icon:"mdi:file-outline"})],8,ts)]),b(c("textarea",{"onUpdate:modelValue":s[3]||(s[3]=e=>zs.value=e),class:"message-textarea",placeholder:"输入消息...",rows:"3",maxlength:"2000",onKeydown:M(f(ba,["ctrl"]),["enter"])},null,40,is),[[C,zs.value]])])),aa.value.blocked||aa.value.muted||!(Os.value.length>0||Rs.value.length>0)?d("",!0):(N(),u("div",us,[(N(!0),u(p,null,h(Os.value,(e,s)=>(N(),u("div",{key:`img-${s}`,class:"attachment-preview-item"},[c("img",{src:e.preview,alt:"预览"},null,8,cs),c("button",{class:"remove-btn",onClick:e=>(e=>{Os.value.splice(e,1)})(s)},[o(B,{icon:"mdi:close"})],8,os)]))),128)),(N(!0),u(p,null,h(Rs.value,(e,s)=>(N(),u("div",{key:`file-${s}`,class:"attachment-preview-item file"},[o(B,{icon:"mdi:file"}),c("span",rs,v(e.file.name),1),c("button",{class:"remove-btn",onClick:e=>(e=>{Rs.value.splice(e,1)})(s)},[o(B,{icon:"mdi:close"})],8,ds)]))),128))])),aa.value.blocked||aa.value.muted?d("",!0):(N(),u("div",vs,[c("span",ms,v(zs.value.length)+"/2000",1),c("button",{class:"send-btn",onClick:ba,disabled:!la.value},[o(B,{icon:"mdi:send",class:"btn-icon"}),s[18]||(s[18]=r(" 发送 ",-1))],8,gs)])),c("input",{ref_key:"imageInput",ref:js,type:"file",accept:"image/*",multiple:"",onChange:Ma,style:{display:"none"}},null,544),c("input",{ref_key:"fileInput",ref:Fs,type:"file",multiple:"",onChange:Ta,style:{display:"none"}},null,544)])])):(N(),u("div",xe,[o(B,{icon:"fluent-color:chat-32",class:"empty-icon"}),s[12]||(s[12]=c("p",{class:"empty-text"},"选择一个会话开始聊天",-1))]))])])]),o(j,{visible:!!Ws.value,"image-url":Ws.value,onClose:xa},null,8,["visible","image-url"])]),o(U,{visible:k(ws).visible.value,title:k(ws).config.value.title||"",message:k(ws).config.value.message||"",type:"danger"===k(ws).config.value.type?"error":k(ws).config.value.type||"warning","confirm-text":k(ws).config.value.confirmText,"cancel-text":k(ws).config.value.cancelText,onConfirm:k(ws).handleConfirm,onCancel:k(ws).handleCancel},null,8,["visible","title","message","type","confirm-text","cancel-text","onConfirm","onCancel"]),o(z,{toasts:k(hs),onRemove:k(ks)},null,8,["toasts","onRemove"]),o(U,{visible:k(bs).visible,title:k(bs).text,loading:!0,simple:!0,"close-on-overlay-click":!1,"enable-keyboard":!1},null,8,["visible","title"])],64))}}),[["__scopeId","data-v-6c1210f9"]])
var s}),128))])):d("",!0),c("div",Je,[c("span",Pe,v(Na(e.sendTime)),1),e.sent&&"sending"===e.status?(N(),u("span",Qe,[o(B,{icon:"mdi:loading",class:"status-icon spinning"})])):e.sent&&"sent"===e.status?(N(),u("span",Xe,[o(B,{icon:"mdi:check-circle",class:"status-icon"})])):e.sent&&"failed"===e.status?(N(),u("span",Ye,[o(B,{icon:"mdi:alert-circle",class:"status-icon",title:"发送失败"})])):d("",!0)])])]),e.sent?(N(),u("div",Ze,[o(D,{"user-id":(null==(s=k(Ms))?void 0:s.id)||(null==(a=k(Ms))?void 0:a._id),"user-name":(null==(n=k(Ms))?void 0:n.nickName)||(null==(t=k(Ms))?void 0:t.username)||"我",width:40,height:40},null,8,["user-id","user-name"])])):d("",!0)],2)}),128))],512),c("div",es,[aa.value.blocked||aa.value.muted?(N(),u("div",ss,[o(B,{icon:aa.value.blocked?"mdi:block-helper":"mdi:bell-off-outline",class:"notice-icon"},null,8,["icon"]),c("span",null,v(aa.value.blocked?"该用户已被拉黑,无法发送消息":"已拒收该用户的消息"),1)])):(N(),u("div",as,[c("div",ns,[c("button",{class:"toolbar-btn",onClick:Ca,disabled:Os.value.length>=5,title:"添加图片最多5张每张10M以内"},[o(B,{icon:"mdi:image-outline"})],8,ts),c("button",{class:"toolbar-btn",onClick:Ia,disabled:Rs.value.length>=5,title:"添加文件最多5个每个20M以内"},[o(B,{icon:"mdi:file-outline"})],8,ls)]),b(c("textarea",{"onUpdate:modelValue":s[3]||(s[3]=e=>zs.value=e),class:"message-textarea",placeholder:"输入消息...",rows:"3",maxlength:"2000",onKeydown:M(f(ba,["ctrl"]),["enter"])},null,40,is),[[C,zs.value]])])),aa.value.blocked||aa.value.muted||!(Os.value.length>0||Rs.value.length>0)?d("",!0):(N(),u("div",us,[(N(!0),u(p,null,h(Os.value,(e,s)=>(N(),u("div",{key:`img-${s}`,class:"attachment-preview-item"},[c("img",{src:e.preview,alt:"预览"},null,8,cs),c("button",{class:"remove-attachment-btn",onClick:e=>(e=>{Os.value.splice(e,1)})(s)},[o(B,{icon:"mdi:close"})],8,os)]))),128)),(N(!0),u(p,null,h(Rs.value,(e,s)=>(N(),u("div",{key:`file-${s}`,class:"attachment-preview-item file"},[o(B,{icon:"mdi:file"}),c("span",rs,v(e.file.name),1),c("button",{class:"remove-attachment-btn",onClick:e=>(e=>{Rs.value.splice(e,1)})(s)},[o(B,{icon:"mdi:close"})],8,ds)]))),128))])),aa.value.blocked||aa.value.muted?d("",!0):(N(),u("div",vs,[c("span",ms,v(zs.value.length)+"/2000",1),c("button",{class:"send-btn",onClick:ba,disabled:!ta.value},[o(B,{icon:"mdi:send",class:"btn-icon"}),s[18]||(s[18]=r(" 发送 ",-1))],8,gs)])),c("input",{ref_key:"imageInput",ref:js,type:"file",accept:"image/*",multiple:"",onChange:Ma,style:{display:"none"}},null,544),c("input",{ref_key:"fileInput",ref:Fs,type:"file",multiple:"",onChange:Ta,style:{display:"none"}},null,544)])])):(N(),u("div",xe,[o(B,{icon:"fluent-color:chat-32",class:"empty-icon"}),s[12]||(s[12]=c("p",{class:"empty-text"},"选择一个会话开始聊天",-1))]))])])]),o(j,{visible:!!Ws.value,"image-url":Ws.value,onClose:xa},null,8,["visible","image-url"])]),o(U,{visible:k(ws).visible.value,title:k(ws).config.value.title||"",message:k(ws).config.value.message||"",type:"danger"===k(ws).config.value.type?"error":k(ws).config.value.type||"warning","confirm-text":k(ws).config.value.confirmText,"cancel-text":k(ws).config.value.cancelText,onConfirm:k(ws).handleConfirm,onCancel:k(ws).handleCancel},null,8,["visible","title","message","type","confirm-text","cancel-text","onConfirm","onCancel"]),o(z,{toasts:k(hs),onRemove:k(ks)},null,8,["toasts","onRemove"]),o(U,{visible:k(bs).visible,title:k(bs).text,loading:!0,simple:!0,"close-on-overlay-click":!1,"enable-keyboard":!1},null,8,["visible","title"])],64))}}),[["__scopeId","data-v-c2e697a8"]])
export{ps as default}

View File

@@ -5,9 +5,9 @@
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>QiuChenly 应用商店</title>
<script type="module" crossorigin src="/assets/iUIDG-9P.js"></script>
<link rel="modulepreload" crossorigin href="/assets/PkdM_Em6.js">
<link rel="stylesheet" crossorigin href="/assets/BiWX0Qx5.css">
<script type="module" crossorigin src="/assets/DTEPVF5R.js"></script>
<link rel="modulepreload" crossorigin href="/assets/CD7TqNEc.js">
<link rel="stylesheet" crossorigin href="/assets/CZoHnJZO.css">
</head>
<body>
<div id="app"></div>