mirror of
https://git-qiuchenly.yltfspace.com/QiuChenly/corepatch
synced 2025-11-25 05:40:27 +08:00
性能优化、错误修复
### 后端更新 性能优化 - Redis、数据库索引优化, 复杂联表查询查询速度从10秒降低到500ms 功能增强 - 统一文件上传 API - 论坛权限管理优化 ### 前端更新 问题修复 - 统一错误提示、组件复用、图标本地化、密码加密传输、大文件分片上传 新增功能 - 全局通知系统、WebSocket 实时消息、图标批量同步、IP 封禁管理、应用版本批量查询、头像上传、TypeScript 类型完善、讨论区功能增强 代码优化 - 删除冗余组件、统一 API 错误处理、优化代码结构、统一 UI 风格
This commit is contained in:
1
frontend/dist/assets/0jLa3ujY.css
vendored
Normal file
1
frontend/dist/assets/0jLa3ujY.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.pagination[data-v-fde42dc3]{display:flex;justify-content:center;align-items:center;gap:16px;margin-top:24px;padding:16px;border-top:1px solid var(--border-light)}.pagination .pagination-info[data-v-fde42dc3]{font-size:14px;color:var(--text-secondary);white-space:nowrap}.pagination .btn[data-v-fde42dc3]{min-width:80px;padding:8px 16px;background:var(--bg-secondary);border:1px solid var(--border-color);color:var(--text-primary);border-radius:6px;font-size:14px;transition:all .2s ease}.pagination .btn[data-v-fde42dc3]:hover:not(:disabled){background:var(--bg-hover);border-color:var(--primary-color);color:var(--primary-color)}.pagination .btn[data-v-fde42dc3]:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}
|
||||
4
frontend/dist/assets/6K6b4Qy_.js
vendored
Normal file
4
frontend/dist/assets/6K6b4Qy_.js
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
var l=(l=>(l.PENDING="pending",l.APPROVED="approved",l.REJECTED="rejected",l))(l||{})
|
||||
const o={"com.hayaku.builtin.product-issues":"mdi:bug-outline","com.hayaku.builtin.chat":"mdi:chat-outline","com.hayaku.builtin.adult":"mdi:alert-circle-outline"}
|
||||
function a(l){return o[l]||"mdi:forum-outline"}const i={pornography:{label:"涉黄",icon:"mdi:eye-off-outline",colorClass:"type-pornography"},fraud:{label:"诈骗",icon:"mdi:shield-alert-outline",colorClass:"type-fraud"},malicious_drainage:{label:"恶意引流",icon:"mdi:link-variant-off",colorClass:"type-drainage"},abuse:{label:"侮辱谩骂",icon:"mdi:emoticon-angry-outline",colorClass:"type-abuse"},trolling:{label:"引战",icon:"mdi:fire",colorClass:"type-trolling"},against_values:{label:"不符合社会核心主义价值观",icon:"mdi:flag-outline",colorClass:"type-values"}}
|
||||
function e(l){return i[l]||{label:l,icon:"mdi:help-circle-outline",colorClass:""}}function n(l){return e(l).label}function t(l){return e(l).colorClass}export{l as F,i as R,t as a,n as b,a as g}
|
||||
5
frontend/dist/assets/7RZZg0Mz.js
vendored
Normal file
5
frontend/dist/assets/7RZZg0Mz.js
vendored
Normal file
File diff suppressed because one or more lines are too long
4
frontend/dist/assets/8cORuAeG.js
vendored
Normal file
4
frontend/dist/assets/8cORuAeG.js
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
import{r as e,f as l}from"./Cf-ihD4f.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}
|
||||
1
frontend/dist/assets/B3_Cw5dF.css
vendored
Normal file
1
frontend/dist/assets/B3_Cw5dF.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/B7QzR7Di.css
vendored
Normal file
1
frontend/dist/assets/B7QzR7Di.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.card-overlay[data-v-2b4c3d26]{position:fixed;top:0;left:0;right:0;bottom:0;z-index:999;background:transparent;pointer-events:none}.card-container[data-v-2b4c3d26]{position:fixed;width:360px;background:var(--bg-card);border-radius:16px;box-shadow:0 8px 32px #00000026;overflow:hidden;z-index:1000;pointer-events:auto;animation:card-slide-in-2b4c3d26 .25s cubic-bezier(.34,1.56,.64,1)}@keyframes card-slide-in-2b4c3d26{0%{opacity:0;transform:translateY(-10px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}.avatar-background[data-v-2b4c3d26]{width:100%;height:80px;overflow:hidden;position:relative;background:linear-gradient(135deg,var(--primary-color) 0%,var(--primary-hover) 100%)}.avatar-background .background-avatar-blur[data-v-2b4c3d26]{position:absolute;top:-20px;left:-20px;right:-20px;bottom:-20px;width:calc(100% + 40px);height:calc(100% + 40px);filter:blur(8px);transform:scale(1.1);overflow:hidden;display:flex;align-items:center;justify-content:center;background:var(--bg-secondary)}.avatar-background .background-avatar-blur .background-image[data-v-2b4c3d26]{width:100%;height:100%;object-fit:cover;object-position:center}.avatar-background .background-overlay[data-v-2b4c3d26]{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(to bottom,#0000001a,#0003);pointer-events:none;z-index:1}.card-content[data-v-2b4c3d26]{padding:16px 20px 20px;position:relative;margin-top:-40px;display:flex;flex-direction:column;z-index:2}.content-layout[data-v-2b4c3d26]{display:flex;align-items:center;gap:16px;margin-bottom:16px}.avatar-wrapper[data-v-2b4c3d26]{position:relative;flex-shrink:0;display:flex;align-items:center;justify-content:center}.avatar-wrapper .online-indicator[data-v-2b4c3d26]{position:absolute;bottom:2px;right:2px;width:18px;height:18px;background:var(--success-color);border:3px solid var(--bg-card);border-radius:50%;box-shadow:0 2px 8px #0003;z-index:1}.user-info[data-v-2b4c3d26]{flex:1;display:flex;align-items:center;min-width:0}.user-name[data-v-2b4c3d26]{font-size:16px;font-weight:600;color:var(--text-primary);word-break:break-word;line-height:1.3}.action-buttons[data-v-2b4c3d26]{display:flex;gap:10px;width:100%}.action-btn[data-v-2b4c3d26]{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:8px 12px;border:none;border-radius:8px;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s ease}.action-btn .btn-icon[data-v-2b4c3d26]{font-size:16px;width:16px;height:16px}.action-btn.message-btn[data-v-2b4c3d26]{background:var(--primary-color);color:#fff}.action-btn.message-btn[data-v-2b4c3d26]:hover{background:var(--primary-hover);transform:translateY(-1px);box-shadow:0 4px 12px #007aff4d}.action-btn.block-btn[data-v-2b4c3d26]{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border-color)}.action-btn.block-btn[data-v-2b4c3d26]:hover{background:var(--bg-hover);border-color:var(--error-color);color:var(--error-color)}.action-btn.block-btn:hover .btn-icon[data-v-2b4c3d26]{color:var(--error-color)}.action-btn.block-btn .btn-icon[data-v-2b4c3d26]{color:var(--text-secondary)}.action-btn[data-v-2b4c3d26]:active{transform:translateY(0)}.card-fade-enter-active[data-v-2b4c3d26],.card-fade-leave-active[data-v-2b4c3d26]{transition:opacity .2s ease}.card-fade-enter-from[data-v-2b4c3d26],.card-fade-leave-to[data-v-2b4c3d26]{opacity:0}.card-fade-enter-active .card-container[data-v-2b4c3d26],.card-fade-leave-active .card-container[data-v-2b4c3d26]{transition:opacity .2s ease,transform .2s ease}.card-fade-leave-active .card-container[data-v-2b4c3d26]{transition:opacity .15s ease,transform .15s ease}.card-fade-enter-from .card-container[data-v-2b4c3d26],.card-fade-leave-to .card-container[data-v-2b4c3d26]{opacity:0;transform:translateY(-10px) scale(.95)}[data-theme=dark] .card-container[data-v-2b4c3d26]{box-shadow:0 8px 32px #0006}[data-theme=dark] .avatar-background .background-avatar-blur .background-image[data-v-2b4c3d26]{opacity:.5}
|
||||
1
frontend/dist/assets/B9nULCh1.css
vendored
Normal file
1
frontend/dist/assets/B9nULCh1.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/BQlUPjYn.css
vendored
Normal file
1
frontend/dist/assets/BQlUPjYn.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/BWVVIzHX.css
vendored
Normal file
1
frontend/dist/assets/BWVVIzHX.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.modal-overlay[data-v-f5d3fd24]{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:9999;padding:var(--spacing-lg)}.modal-container[data-v-f5d3fd24]{background:var(--bg-primary);border-radius:var(--radius-xl);box-shadow:var(--shadow-2xl);width:100%;max-width:800px;max-height:90vh;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border-light)}.modal-header[data-v-f5d3fd24]{padding:var(--spacing-lg) var(--spacing-xl);border-bottom:1px solid var(--border-light);display:flex;align-items:center;justify-content:space-between;background:var(--bg-secondary)}.modal-header .modal-title[data-v-f5d3fd24]{margin:0;font-size:1.3rem;font-weight:600;color:var(--text-primary);display:flex;align-items:center;gap:var(--spacing-sm)}.modal-header .modal-title .modal-icon[data-v-f5d3fd24]{font-size:1.5rem;color:var(--primary-color)}.modal-header .modal-close[data-v-f5d3fd24]{background:transparent;border:none;cursor:pointer;padding:var(--spacing-xs);border-radius:var(--radius-sm);color:var(--text-secondary);font-size:1.5rem;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.modal-header .modal-close[data-v-f5d3fd24]:hover{background:var(--bg-primary);color:var(--text-primary)}.modal-body[data-v-f5d3fd24]{flex:0 0 auto;overflow:hidden;padding:var(--spacing-md)}.log-container[data-v-f5d3fd24]{height:500px;min-height:500px;max-height:60vh;overflow-y:auto;overflow-x:hidden;background:var(--bg-tertiary, #1a1a1a);border-radius:var(--radius-md);padding:var(--spacing-md);font-family:SF Mono,Monaco,Cascadia Code,Roboto Mono,Consolas,Courier New,monospace;font-size:.9rem;line-height:1.6;scroll-behavior:smooth}.log-container[data-v-f5d3fd24]::-webkit-scrollbar{width:8px}.log-container[data-v-f5d3fd24]::-webkit-scrollbar-track{background:var(--bg-secondary);border-radius:4px}.log-container[data-v-f5d3fd24]::-webkit-scrollbar-thumb{background:var(--border-color);border-radius:4px}.log-container[data-v-f5d3fd24]::-webkit-scrollbar-thumb:hover{background:var(--text-tertiary)}.log-line[data-v-f5d3fd24]{display:flex;gap:var(--spacing-sm);margin-bottom:var(--spacing-xs);padding:var(--spacing-xs) 0;align-items:flex-start}.log-line.loading[data-v-f5d3fd24]{color:var(--primary-color)}.log-line .log-time[data-v-f5d3fd24]{color:var(--text-tertiary);flex-shrink:0;font-size:.85rem}.log-line .log-message[data-v-f5d3fd24]{color:var(--text-secondary);flex:1;word-break:break-word;white-space:pre-wrap}.log-line.log-info .log-message[data-v-f5d3fd24]{color:var(--text-secondary)}.log-line.log-success .log-message[data-v-f5d3fd24]{color:var(--success-color)}.log-line.log-warning .log-message[data-v-f5d3fd24]{color:var(--warning-color)}.log-line.log-error .log-message[data-v-f5d3fd24]{color:var(--error-color)}.modal-footer[data-v-f5d3fd24]{padding:var(--spacing-lg) var(--spacing-xl);border-top:1px solid var(--border-light);background:var(--bg-secondary);display:flex;align-items:center;justify-content:space-between}.modal-footer .footer-status[data-v-f5d3fd24]{display:flex;align-items:center;gap:var(--spacing-sm);font-size:1rem;font-weight:500}.modal-footer .footer-status .status-success[data-v-f5d3fd24]{color:var(--success-color);display:flex;align-items:center;gap:var(--spacing-xs)}.modal-footer .footer-status .status-error[data-v-f5d3fd24]{color:var(--error-color);display:flex;align-items:center;gap:var(--spacing-xs)}.modal-footer .footer-status .status-loading[data-v-f5d3fd24]{color:var(--primary-color);display:flex;align-items:center;gap:var(--spacing-xs)}.modal-footer .footer-actions[data-v-f5d3fd24]{display:flex;gap:var(--spacing-sm)}.spinner-small[data-v-f5d3fd24]{width:16px;height:16px;border:2px solid var(--border-color);border-top:2px solid var(--primary-color);border-radius:50%;animation:spin-f5d3fd24 1s linear infinite}@keyframes spin-f5d3fd24{to{transform:rotate(360deg)}}.modal-enter-active[data-v-f5d3fd24],.modal-leave-active[data-v-f5d3fd24]{transition:opacity .3s ease}.modal-enter-from[data-v-f5d3fd24],.modal-leave-to[data-v-f5d3fd24]{opacity:0}.modal-enter-active .modal-container[data-v-f5d3fd24],.modal-leave-active .modal-container[data-v-f5d3fd24]{transition:transform .3s ease}.modal-enter-from .modal-container[data-v-f5d3fd24],.modal-leave-to .modal-container[data-v-f5d3fd24]{transform:scale(.9) translateY(-20px)}@media (max-width: 768px){.modal-overlay[data-v-f5d3fd24]{padding:0}.modal-container[data-v-f5d3fd24]{max-width:100%;max-height:100vh;border-radius:0}.log-container[data-v-f5d3fd24]{height:400px;min-height:400px;max-height:50vh}.modal-footer[data-v-f5d3fd24]{flex-direction:column;gap:var(--spacing-md);align-items:stretch}.modal-footer .footer-actions[data-v-f5d3fd24]{width:100%}.modal-footer .footer-actions .btn[data-v-f5d3fd24]{flex:1}}
|
||||
57
frontend/dist/assets/BeU_EQB7.js
vendored
Normal file
57
frontend/dist/assets/BeU_EQB7.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/BgQSLo-i.css
vendored
Normal file
1
frontend/dist/assets/BgQSLo-i.css
vendored
Normal file
File diff suppressed because one or more lines are too long
11
frontend/dist/assets/BkWv3AV-.js
vendored
Normal file
11
frontend/dist/assets/BkWv3AV-.js
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
import{d as e,r as a,f as s,w as l,P as t,c as o,g as i,i as n,j as u,k as r,l as c,m as v,t as d,q as b,v as p,T as m,e as f,n as k}from"./Cf-ihD4f.js"
|
||||
import{b as g,_ as y,a as U}from"./C_NDl53k.js"
|
||||
const h={class:"avatar-background"},w={class:"background-avatar-blur"},R=["src"],x={class:"card-content"},I={class:"content-layout"},L={class:"avatar-wrapper"},j={class:"user-info"},C={class:"user-name"},_={class:"action-buttons"},N=U(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}},emits:["close","sendMessage","blockUser","mouseEnter"],setup(e,{emit:U}){const N=e,M=U,O=a(null),T=a(null),W=a(""),$=e=>{W.value&&W.value.startsWith("blob:")&&URL.revokeObjectURL(W.value),W.value=URL.createObjectURL(e)},B=s(()=>N.position?T.value?{left:`${T.value.x}px`,top:`${T.value.y}px`}:{left:`${N.position.x}px`,top:`${N.position.y}px`}:{})
|
||||
l(()=>[N.visible,N.position],()=>{T.value=null,N.visible&&N.position&&k(()=>{(()=>{if(!N.position||!O.value)return
|
||||
const e=O.value.getBoundingClientRect(),a=e.width||260,s=e.height||240,l=16
|
||||
let t=N.position.x,o=N.position.y
|
||||
const i=window.innerWidth,n=window.innerHeight
|
||||
t+a>i-l&&(t=i-a-l),t<l&&(t=l),o+s>n-l&&(o=N.position.y-l>=s?N.position.y-s-8:n-s-l),o<l&&(o=l),T.value={x:t,y:o}})()})},{immediate:!0})
|
||||
const E=a(null),P=()=>{E.value&&(clearTimeout(E.value),E.value=null),M("close")},q=()=>{E.value&&(clearTimeout(E.value),E.value=null),M("mouseEnter")},z=()=>{E.value=window.setTimeout(()=>{P()},300)},H=()=>{M("sendMessage",N.userId,N.userName),P()},A=()=>{M("blockUser",N.userId,N.userName),P()}
|
||||
return t(()=>{W.value&&W.value.startsWith("blob:")&&URL.revokeObjectURL(W.value)}),l(()=>N.visible,e=>{!e&&W.value&&W.value.startsWith("blob:")&&(URL.revokeObjectURL(W.value),W.value="")}),(a,s)=>(f(),o(m,{to:"body"},[i(n,{name:"card-fade"},{default:u(()=>[e.visible?(f(),r("div",{key:0,class:"card-overlay",onClick:P},[v("div",{ref_key:"cardContainerRef",ref:O,class:"card-container",style:b(B.value),onClick:s[0]||(s[0]=d(()=>{},["stop"])),onMouseenter:q,onMouseleave:z},[v("div",h,[v("div",w,[W.value?(f(),r("img",{key:0,src:W.value,alt:"",class:"background-image"},null,8,R)):c("",!0)]),s[1]||(s[1]=v("div",{class:"background-overlay"},null,-1))]),v("div",x,[v("div",I,[v("div",L,[i(g,{size:"large",userId:e.userId,"user-name":e.userName,"avatar-id":e.avatarId,width:80,height:80,"on-avatar-loaded":$},null,8,["userId","user-name","avatar-id"]),s[2]||(s[2]=v("div",{class:"online-indicator"},null,-1))]),v("div",j,[v("div",C,p(e.userName),1)])]),v("div",_,[v("button",{class:"action-btn message-btn",onClick:H},[i(y,{icon:"fluent-color:comment-multiple-32",class:"btn-icon"}),s[3]||(s[3]=v("span",null,"私信",-1))]),v("button",{class:"action-btn block-btn",onClick:A},[i(y,{icon:"mdi:block-helper",class:"btn-icon"}),s[4]||(s[4]=v("span",null,"拉黑",-1))])])])],36)])):c("",!0)]),_:1})]))}}),[["__scopeId","data-v-2b4c3d26"]])
|
||||
export{N as U}
|
||||
67
frontend/dist/assets/BkjA6pKr.js
vendored
Normal file
67
frontend/dist/assets/BkjA6pKr.js
vendored
Normal file
File diff suppressed because one or more lines are too long
108
frontend/dist/assets/Bl7EgoMN.js
vendored
Normal file
108
frontend/dist/assets/Bl7EgoMN.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/BmMm3Z_T.css
vendored
Normal file
1
frontend/dist/assets/BmMm3Z_T.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/BwNN0oka.css
vendored
Normal file
1
frontend/dist/assets/BwNN0oka.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/CFnX84jv.css
vendored
Normal file
1
frontend/dist/assets/CFnX84jv.css
vendored
Normal file
File diff suppressed because one or more lines are too long
21
frontend/dist/assets/CTPaZ9b5.js
vendored
Normal file
21
frontend/dist/assets/CTPaZ9b5.js
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
import{A as t}from"./C_NDl53k.js"
|
||||
async function s(s){var e,n
|
||||
try{const c=s.filter(t=>t.hasIcon&&t.bundleId)
|
||||
if(0===c.length)return
|
||||
const a=c.map(t=>t.bundleId),o=await t.batchCheckAppIconsExist(a)
|
||||
if(!o.success)return
|
||||
const r=(null==(e=o.data)?void 0:e.missingBundleIds)||[]
|
||||
if(0===r.length)return
|
||||
const i=5
|
||||
let l=0,u=0
|
||||
const d=[],h=new Map
|
||||
c.forEach(t=>{h.set(t.bundleId,t)})
|
||||
for(let s=0;s<r.length;s+=i){const e=r.slice(s,s+i);(await Promise.allSettled(e.map(async s=>{try{const e=h.get(s),n=(null==e?void 0:e.name)||void 0,c=t.getAppIconUrl(s),a=await fetch(c)
|
||||
if(!a.ok)throw new Error(`获取本地图标失败: HTTP ${a.status}`)
|
||||
const o=await a.blob()
|
||||
if(0===o.size)throw new Error("图标文件为空")
|
||||
const r=new File([o],`${s}.png`,{type:o.type||"image/png"}),i=await t.syncAppIconToCloud(s,r,n)
|
||||
if(i.success)return d.push(s),{bundleId:s,success:!0}
|
||||
throw new Error(i.message||"上传失败")}catch(e){return{bundleId:s,success:!1,error:e.message||String(e)}}}))).forEach(t=>{"fulfilled"===t.status&&t.value.success?l++:u++})}if(d.length>0){await new Promise(t=>setTimeout(t,500))
|
||||
const s=await t.batchCheckAppIconsExist(d)
|
||||
s.success&&((null==(n=s.data)?void 0:n.missingBundleIds)||[]).length}}catch(c){}}export{s as b}
|
||||
1
frontend/dist/assets/CW6bQbsc.css
vendored
Normal file
1
frontend/dist/assets/CW6bQbsc.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.avatar-upload[data-v-6e1ea79a]{position:relative;display:inline-block}.avatar-preview[data-v-6e1ea79a]{width:var(--v6394d537);height:var(--v6394d537);border-radius:50%;overflow:hidden;border:2px solid var(--border-light);background:var(--bg-secondary);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.avatar-preview[data-v-6e1ea79a]:hover{border-color:var(--primary-color);box-shadow:0 0 0 4px rgba(var(--primary-rgb),.1)}.avatar-preview[data-v-6e1ea79a] .avatar-wrapper{width:100%!important;height:100%!important;min-width:100%!important;min-height:100%!important;max-width:100%!important;max-height:100%!important;border-radius:50%!important;border:none!important}.avatar-preview .preview-image[data-v-6e1ea79a]{width:100%;height:100%;object-fit:cover;border-radius:50%}.avatar-preview .cloud-image[data-v-6e1ea79a]{display:none}.avatar-menu[data-v-6e1ea79a]{position:fixed;z-index:10002;background:var(--bg-card);border:1px solid var(--border-light);border-radius:var(--radius-md);box-shadow:0 4px 16px #00000026,0 2px 8px #0000001a;padding:6px;display:flex;flex-direction:column;gap:4px}.avatar-menu-item[data-v-6e1ea79a]{display:flex;align-items:center;justify-content:center;padding:10px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-primary);cursor:pointer;transition:all .2s ease;width:40px;height:40px;min-width:40px;min-height:40px}.avatar-menu-item[data-v-6e1ea79a]:hover:not(:disabled):not(.uploading){background:var(--bg-secondary);color:var(--primary-color)}.avatar-menu-item[data-v-6e1ea79a]:disabled{opacity:.5;cursor:not-allowed}.avatar-menu-item.danger[data-v-6e1ea79a]{color:#ef4444}.avatar-menu-item.danger[data-v-6e1ea79a]:hover:not(:disabled){background:#ef44441a;color:#ef4444}.avatar-menu-item.uploading[data-v-6e1ea79a]{justify-content:center;color:var(--text-secondary);cursor:default}.avatar-menu-item[data-v-6e1ea79a] svg{font-size:20px;width:20px;height:20px}.spinner-small[data-v-6e1ea79a]{width:16px;height:16px;border:2px solid var(--border-light);border-top-color:var(--primary-color);border-radius:50%;animation:spin-6e1ea79a .6s linear infinite}@keyframes spin-6e1ea79a{to{transform:rotate(360deg)}}.avatar-menu-fade-enter-active[data-v-6e1ea79a],.avatar-menu-fade-leave-active[data-v-6e1ea79a]{transition:opacity .2s ease,transform .2s ease}.avatar-menu-fade-enter-from[data-v-6e1ea79a],.avatar-menu-fade-leave-to[data-v-6e1ea79a]{opacity:0;transform:scale(.95) translateY(-4px)}
|
||||
1
frontend/dist/assets/CXAkPYOs.css
vendored
Normal file
1
frontend/dist/assets/CXAkPYOs.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/CZ9e21iu.css
vendored
Normal file
1
frontend/dist/assets/CZ9e21iu.css
vendored
Normal file
File diff suppressed because one or more lines are too long
907
frontend/dist/assets/C_NDl53k.js
vendored
Normal file
907
frontend/dist/assets/C_NDl53k.js
vendored
Normal file
File diff suppressed because one or more lines are too long
23
frontend/dist/assets/Ca51JAdg.js
vendored
Normal file
23
frontend/dist/assets/Ca51JAdg.js
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
import{A as a}from"./DUMqsWsK.js"
|
||||
import{_ as s,A as e,a as l}from"./C_NDl53k.js"
|
||||
import{d as t,r as n,f as p,o as i,k as c,m as d,l as o,v as u,g as v,F as r,y as h,c as m,e as b}from"./Cf-ihD4f.js"
|
||||
import"./DrS-_GpA.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"},E={class:"stat-item"},x={class:"stat-value"},F={class:"stat-item"},N={class:"stat-value"},O=l(t({__name:"OfficialApps",setup(l){const t=n([]),O=n(!0),Q=n(""),q=p(()=>t.value.sort((a,s)=>a.name.localeCompare(s.name))),z=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()=>{O.value=!0,Q.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){Q.value="加载应用列表失败,请检查服务是否运行",t.value=[]}finally{O.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)),O.value?(b(),c("div",I,[...l[0]||(l[0]=[d("div",{class:"spinner"},null,-1),d("p",null,"加载应用中...",-1)])])):Q.value?(b(),c("div",y,[d("p",null,u(Q.value),1),d("button",{onClick:D,class:"btn btn-primary"},"重试")])):0===q.value.length?(b(),c("div",k,[v(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,[z.value.length>0?(b(),c("div",U,[l[3]||(l[3]=d("h3",{class:"section-title"},"已安装的应用",-1)),d("div",V,[(b(!0),c(r,null,h(z.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(r,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",E,[l[6]||(l[6]=d("span",{class:"stat-label"},"已安装:",-1)),d("span",x,u(z.value.length),1)]),d("span",F,[l[7]||(l[7]=d("span",{class:"stat-label"},"未安装:",-1)),d("span",N,u(B.value.length),1)])])])):o("",!0)])]))}}),[["__scopeId","data-v-843b7db8"]])
|
||||
export{O as default}
|
||||
1167
frontend/dist/assets/Cf-ihD4f.js
vendored
Normal file
1167
frontend/dist/assets/Cf-ihD4f.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
364
frontend/dist/assets/CmsWcu4V.js
vendored
Normal file
364
frontend/dist/assets/CmsWcu4V.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/CnpXc_CW.css
vendored
Normal file
1
frontend/dist/assets/CnpXc_CW.css
vendored
Normal file
File diff suppressed because one or more lines are too long
80
frontend/dist/assets/Cu9yn_kO.js
vendored
Normal file
80
frontend/dist/assets/Cu9yn_kO.js
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
import{d as e,c as a,j as l,m as t,k as s,l as n,g as u,v as o,q as i,e as c,r,f as v,G as d,P as p,o as m,B as h,N as b,C as g,A as f,F as y,y as k,i as w,t as C,b as I,u as x,T as M,I as S}from"./Cf-ihD4f.js"
|
||||
import{_ as $,f as L,a as A,c as T,A as P,b as _,T as B,d as F,l as U}from"./C_NDl53k.js"
|
||||
import{R as j}from"./DHwqePp8.js"
|
||||
import{U as D}from"./BkWv3AV-.js"
|
||||
import{C as E}from"./DZt01rzp.js"
|
||||
import{g as R}from"./6K6b4Qy_.js"
|
||||
const N={class:"upload-progress-content"},z={class:"progress-info"},O={class:"progress-text"},V={class:"progress-bar-container"},X={class:"progress-bar"},Y={class:"progress-percent"},q={key:0,class:"error-message"},H={class:"dialog-footer"},W=A(e({__name:"UploadProgressDialog",props:{visible:{type:Boolean},progress:{},title:{default:"上传中..."},statusText:{default:"正在上传文件"},error:{},cancellable:{type:Boolean,default:!0},completed:{type:Boolean,default:!1}},emits:["cancel","close"],setup(e,{emit:r}){const v=e,d=r,p=()=>{v.cancellable&&!v.completed&&d("cancel")},m=()=>{d("close")}
|
||||
return(r,v)=>(c(),a(L,{visible:e.visible,"max-width":400,"close-on-overlay-click":e.cancellable&&!e.completed,"show-close-button":e.cancellable&&!e.completed,"close-button-position":"header","enable-keyboard":e.cancellable&&!e.completed,onClose:p},{header:l(()=>[t("h3",null,o(e.title),1)]),footer:l(()=>[t("div",H,[e.cancellable&&!e.completed?(c(),s("button",{key:0,class:"btn btn-secondary",onClick:p}," 取消 ")):n("",!0),e.completed||e.error?(c(),s("button",{key:1,class:"btn btn-primary",onClick:m}," 确定 ")):n("",!0)])]),default:l(()=>[t("div",N,[t("div",z,[u($,{icon:"mdi:cloud-upload",class:"progress-icon"}),t("span",O,o(e.statusText),1)]),t("div",V,[t("div",X,[t("div",{class:"progress-fill",style:i({width:`${e.progress}%`})},null,4)]),t("span",Y,o(e.progress)+"%",1)]),e.error?(c(),s("div",q,[u($,{icon:"mdi:alert-circle",class:"error-icon"}),t("span",null,o(e.error),1)])):n("",!0)])]),_:1},8,["visible","close-on-overlay-click","show-close-button","enable-keyboard"]))}}),[["__scopeId","data-v-a922ff57"]]),G={class:"discussion-forum-page"},K={class:"page-container"},J={class:"page-header"},Q={class:"header-buttons"},Z={key:0,class:"header-content"},ee={class:"app-header"},ae={class:"app-icon-wrapper"},le=["src","alt"],te={class:"app-title-info"},se={class:"page-title"},ne={key:0,class:"page-description"},ue={key:1,class:"page-description"},oe={key:2,class:"forum-stats"},ie={class:"stat-item"},ce={class:"stat-item"},re={key:1,class:"header-content"},ve={key:0,class:"loading"},de={key:1,class:"error"},pe={key:2,class:"discussion-content"},me={class:"create-post-section"},he={class:"section-header"},be={class:"sort-selector"},ge={key:0,class:"post-form-container"},fe={class:"post-form-header"},ye={class:"post-form"},ke={class:"form-row"},we={class:"form-row"},Ce={class:"form-actions"},Ie={class:"upload-area"},xe=["disabled"],Me=["disabled"],Se={key:0,class:"upload-count"},$e=["disabled"],Le={key:0,class:"attachment-preview-list"},Ae=["src"],Te=["onClick"],Pe={key:0,class:"attachment-error"},_e={class:"file-name"},Be={class:"file-size"},Fe=["onClick"],Ue={key:0,class:"attachment-error"},je={key:0,class:"posts-list"},De=["onClick"],Ee={class:"post-header"},Re={class:"post-title"},Ne={class:"post-meta"},ze=["onMouseenter"],Oe={class:"author-avatar"},Ve={class:"post-author clickable"},Xe={class:"post-time"},Ye={class:"post-content-preview"},qe={class:"post-footer"},He={class:"post-stats"},We={class:"stat-item"},Ge={class:"post-actions"},Ke=["onClick","disabled"],Je=["onClick","disabled"],Qe=["onClick"],Ze={key:1,class:"empty-discussion"},ea=["src","alt"],aa={key:1,class:"preview-loading"},la=A(e({__name:"DiscussionForum",setup(e){const L=S(),A=d(),N=T(),z=F(),O=r(null),V=r(!0),X=r(""),Y=r(!1),q=r(!1),H=v(()=>{var e
|
||||
return"builtin"===(null==(e=ta.value)?void 0:e.type)}),la=v(()=>{var e
|
||||
return"created"===(null==(e=ta.value)?void 0:e.type)}),ta=r(null),sa=v(()=>ta.value?R(ta.value.bundleId):"mdi:forum-outline"),na=r(null),ua=r(!1),oa=r(!1),ia=v(()=>{var e
|
||||
return(null==(e=ta.value)?void 0:e.description)??""}),ca=r(!1),ra=r(null),va=r(!1),da=r(null),pa=r({top:"0px",left:"0px"}),ma=r({x:0,y:0}),ha=r([]),ba=r(null),ga=r("time"),fa=[{value:"time",label:"按时间",icon:"fluent-color:clock-24"},{value:"lastReply",label:"按最后回复",icon:"fluent-color:mail-clock-32"}],ya=r(null),ka=r(""),wa=r(""),Ca=r([]),Ia=r([]),xa=r(null),Ma=r(null),Sa=r(!1),$a=r(!1),La=r(null),Aa=r(!1),Ta=r(void 0),Pa=r(""),_a=r(""),Ba=r(""),Fa=r(null),Ua=v(()=>A.params.bundleId),ja=v(()=>O.value?H.value?"":la.value?na.value||"":P.getAppIconUrl(O.value.bundleId):""),Da=e=>{const a=e.target
|
||||
da.value={width:a.naturalWidth,height:a.naturalHeight},ma.value.x&&ma.value.y&&Ea(ma.value.x,ma.value.y)},Ea=(e,a)=>{var l,t
|
||||
const s=20,n=(null==(l=da.value)?void 0:l.width)||400,u=(null==(t=da.value)?void 0:t.height)||400,o=window.innerWidth,i=window.innerHeight,c=Math.min(n,.9*o),r=Math.min(u,.9*i),v=Math.min(n,c),d=Math.min(u,r)
|
||||
let p=e+s,m=a+s
|
||||
p+v/2>o&&(p=e-s-v/2),p-v/2<0&&(p=e+s+v/2),m+d>i&&(m=a-s-d),m<0&&(m=a+s),p=Math.max(v/2,Math.min(p,o-v/2)),m=Math.max(0,Math.min(m,i-d)),pa.value={top:`${m}px`,left:`${p}px`}},Ra=e=>{ca.value&&(ma.value={x:e.clientX,y:e.clientY},Ea(e.clientX,e.clientY))},Na=async e=>{if(ja.value&&Y.value&&!q.value&&!H.value){ma.value={x:e.clientX,y:e.clientY},Ea(e.clientX,e.clientY),ca.value=!0,va.value=!0,ra.value=null,document.addEventListener("mousemove",Ra)
|
||||
try{const e=await(async()=>{var e
|
||||
if(!O.value)return null
|
||||
if(la.value&&(null==(e=ta.value)?void 0:e.iconId))try{return await P.getIcon(ta.value.iconId,void 0,400,400)}catch(a){return na.value}return ja.value||null})()
|
||||
e?(ra.value=e,va.value=!1):(ca.value=!1,document.removeEventListener("mousemove",Ra))}catch(a){ca.value=!1,document.removeEventListener("mousemove",Ra)}}},za=()=>{ca.value=!1,ra.value=null,da.value=null,document.removeEventListener("mousemove",Ra)},Oa=async()=>{if(Ua.value)try{const e=await P.getForumPosts(Ua.value,1,20,ga.value)
|
||||
ha.value=e.posts||[]}catch(e){ha.value=[]}},Va=()=>{Oa()},Xa=async()=>{if(!Ua.value)return X.value="无效的应用标识符",void(V.value=!1)
|
||||
V.value=!0,X.value=""
|
||||
try{const a=await P.getForumByBundleId(Ua.value)
|
||||
if(!a||"builtin"!==a.type&&"created"!==a.type){if(await(async e=>{try{const a=await P.getForumPermission(e)
|
||||
ba.value=a||{bundleId:e,appName:"",enabled:!1,postCount:0,todayPostCount:0,totalPostCount:0,createdAt:(new Date).toISOString(),updatedAt:(new Date).toISOString()}}catch(a){ba.value={bundleId:e,appName:"",enabled:!1,postCount:0,todayPostCount:0,totalPostCount:0,createdAt:(new Date).toISOString(),updatedAt:(new Date).toISOString()}}})(Ua.value),!ba.value||!ba.value.enabled)return X.value="该讨论区暂未开放,请等待管理员启用",void(V.value=!1)
|
||||
O.value=await P.getApp(Ua.value),Y.value=!1,q.value=!1}else if(ta.value=a,O.value={bundleId:a.bundleId,name:a.name,version:"",path:"",status:"unsupported",injection:null,update:null,hasIcon:!1},ba.value={bundleId:Ua.value,appName:a.name,enabled:!0,postCount:0,todayPostCount:0,totalPostCount:0,createdAt:(new Date).toISOString(),updatedAt:(new Date).toISOString()},"created"===a.type&&a.iconId)try{const e=await P.getIcon(a.iconId)
|
||||
na.value=e,ua.value=!0,oa.value=!1,Y.value=!0,q.value=!1}catch(e){oa.value=!0,ua.value=!0,Y.value=!0,q.value=!0}else Y.value=!0,q.value=!1
|
||||
await Oa()}catch(e){X.value="加载应用信息失败,请检查服务是否运行",O.value=null}finally{V.value=!1}},Ya=()=>{L.push("/discussion")},qa=()=>{L.push("/")},Ha=v(()=>ka.value.trim().length>0&&(wa.value.trim().length>0||Ca.value.length>0||Ia.value.length>0)),Wa=()=>{var e
|
||||
null==(e=xa.value)||e.click()},Ga=()=>{var e
|
||||
null==(e=Ma.value)||e.click()},Ka=e=>{const a=e.target
|
||||
Array.from(a.files||[]).forEach(e=>{if(Ca.value.length>=5)return
|
||||
if(e.size>10485760)return void Ca.value.push({file:e,preview:"",error:"图片大小不能超过10MB"})
|
||||
const a=new FileReader
|
||||
a.onload=a=>{var l
|
||||
const t=Ca.value.findIndex(a=>a.file===e)
|
||||
t>=0&&(Ca.value[t].preview=null==(l=a.target)?void 0:l.result)},a.readAsDataURL(e),Ca.value.push({file:e,preview:""})}),a.value=""},Ja=e=>{const a=e.target
|
||||
Array.from(a.files||[]).forEach(e=>{Ia.value.length>=5||(e.size>20971520?Ia.value.push({file:e,error:"文件大小不能超过20MB"}):Ia.value.push({file:e}))}),a.value=""},Qa=r(!1),Za=r(0),el=r("正在上传..."),al=r(""),ll=async()=>{var e,a,l,t,s,n,u,o
|
||||
if(Ha.value&&Ua.value){Qa.value=!0,Za.value=0,el.value="正在上传文件...",al.value=""
|
||||
try{const u=[],o=Ca.value.length+Ia.value.length
|
||||
let i=0
|
||||
for(let l=0;l<Ca.value.length;l++){const t=Ca.value[l]
|
||||
el.value=`正在上传图片 ${l+1}/${Ca.value.length}...`
|
||||
const s=await P.uploadImageAttachment(t.file,e=>{const a=e/100
|
||||
Za.value=Math.round((i+a)/o*100)})
|
||||
if(!s.success||!(null==(e=s.data)?void 0:e.attachmentId))throw new Error(s.message||(null==(a=s.data)?void 0:a.message)||"图片上传失败")
|
||||
u.push(s.data.attachmentId),i++}for(let e=0;e<Ia.value.length;e++){const a=Ia.value[e]
|
||||
el.value=`正在上传文件 ${e+1}/${Ia.value.length}...`
|
||||
const s=await P.uploadFileAttachment(a.file,e=>{const a=e/100
|
||||
Za.value=Math.round((i+a)/o*100)})
|
||||
if(!s.success||!(null==(l=s.data)?void 0:l.attachmentId))throw new Error(s.message||(null==(t=s.data)?void 0:t.message)||"文件上传失败")
|
||||
u.push(s.data.attachmentId),i++}el.value="正在发布帖子...",Za.value=90
|
||||
const c=await P.createForumPost(Ua.value,ka.value.trim(),wa.value.trim(),u.length>0?u:void 0)
|
||||
c.success&&(null==(s=c.data)?void 0:s.postId)?(Za.value=100,el.value="发布成功!",await new Promise(e=>setTimeout(e,500)),await Oa(),ka.value="",wa.value="",Ca.value=[],Ia.value=[],Sa.value=!1,Qa.value=!1,N.success("帖子发布成功")):(al.value=c.message||(null==(n=c.data)?void 0:n.message)||"发帖失败,请稍后重试",el.value="发布失败")}catch(i){al.value=(null==(o=null==(u=i.response)?void 0:u.data)?void 0:o.message)||i.message||"发帖失败,请稍后重试",el.value="发布失败"}}},tl=()=>{Qa.value=!1,Za.value=0,al.value=""},sl=()=>{Qa.value=!1,Za.value=0,al.value=""},nl=()=>{Sa.value=!1},ul=async(e,a,l)=>{var t,s
|
||||
if(Ua.value&&l.type&&l.postId){z.show("提交举报中...")
|
||||
try{let t=""
|
||||
if("post"===l.type?t=l.postId:("reply"===l.type||"nestedReply"===l.type)&&(t=l.replyId||""),!t)return
|
||||
const s=await P.submitReport(l.type,t,Ua.value,l.postId,e,l.content,a||void 0)
|
||||
s.success?($a.value=!1,N.success("举报提交成功")):N.error(s.message||"举报失败")}catch(n){N.error((null==(s=null==(t=n.response)?void 0:t.data)?void 0:s.message)||n.message||"举报失败")}finally{z.hide()}}},ol=e=>{if("object"==typeof e.author&&null!==e.author){const a=e.author
|
||||
return a.nickName||a.username||""}return"string"==typeof e.author?e.author:""},il=r(null),cl=()=>{Fa.value&&(clearTimeout(Fa.value),Fa.value=null),il.value&&(clearTimeout(il.value),il.value=null),il.value=window.setTimeout(()=>{Aa.value&&(Aa.value=!1)},200)},rl=()=>{il.value&&(clearTimeout(il.value),il.value=null)},vl=()=>{Fa.value&&(clearTimeout(Fa.value),Fa.value=null),il.value&&(clearTimeout(il.value),il.value=null),Aa.value=!1,Ba.value=""},dl=(e,a)=>{L.push(`/messages?userId=${e}&userName=${encodeURIComponent(a)}`)},pl=(e,a)=>{},ml=e=>{const a=new Date(e),l=(new Date).getTime()-a.getTime(),t=Math.floor(l/6e4),s=Math.floor(l/36e5),n=Math.floor(l/864e5)
|
||||
return t<60?`${t}分钟前`:s<24?`${s}小时前`:n<7?`${n}天前`:a.toLocaleDateString("zh-CN")}
|
||||
return p(()=>{document.removeEventListener("mousemove",Ra)}),m(()=>{Xa()}),(e,r)=>(c(),s("div",G,[t("div",K,[t("div",J,[t("div",Q,[t("button",{class:"back-button",onClick:Ya},[u($,{icon:"mdi:arrow-left",class:"back-icon"}),r[7]||(r[7]=t("span",null,"返回讨论区",-1))]),t("button",{class:"home-button",onClick:qa},[u($,{icon:"fluent-color:home-48",class:"home-icon"}),r[8]||(r[8]=t("span",null,"首页",-1))])]),O.value?(c(),s("div",Z,[t("div",ee,[t("div",ae,[t("div",{class:"app-icon",onMouseenter:Na,onMouseleave:za},[ja.value&&!H.value?h((c(),s("img",{key:0,src:ja.value,alt:O.value.name,onLoad:r[0]||(r[0]=e=>Y.value=!0),onError:r[1]||(r[1]=e=>q.value=!0)},null,40,le)),[[b,Y.value&&!q.value]]):n("",!0),H.value?(c(),a($,{key:1,icon:sa.value,class:"builtin-forum-icon"},null,8,["icon"])):n("",!0),h(t("div",{class:"icon-placeholder"},o(O.value.name.charAt(0).toUpperCase()),513),[[b,(!ja.value||!Y.value||q.value)&&!H.value&&!la.value]])],32)]),t("div",te,[t("h1",se,o(O.value.name),1),H.value?n("",!0):(c(),s("p",ne,o(O.value.bundleId),1)),H.value&&ia.value?(c(),s("p",ue,o(ia.value),1)):n("",!0),ba.value?(c(),s("div",oe,[t("span",ie,[u($,{icon:"fluent-color:news-28",class:"stat-icon"}),t("span",null,"今日发帖:"+o(ba.value.todayPostCount??0),1)]),t("span",ce,[u($,{icon:"fluent-color:reward-24",class:"stat-icon"}),t("span",null,"总发帖数:"+o(ba.value.totalPostCount??0),1)])])):n("",!0)])])])):(c(),s("div",re,[...r[9]||(r[9]=[t("h1",{class:"page-title"},"讨论区",-1)])]))]),V.value?(c(),s("div",ve,[...r[10]||(r[10]=[t("div",{class:"spinner"},null,-1),t("p",null,"加载中...",-1)])])):X.value?(c(),s("div",de,[t("p",null,o(X.value),1),t("button",{onClick:Xa,class:"btn btn-primary"},"重试")])):O.value?(c(),s("div",pe,[t("div",me,[t("div",he,[Sa.value?n("",!0):(c(),s("button",{key:0,class:"create-post-btn",onClick:r[2]||(r[2]=e=>Sa.value=!0)},[u($,{icon:"mdi:plus",class:"btn-icon"}),r[11]||(r[11]=t("span",null,"发帖",-1))])),t("div",be,[r[12]||(r[12]=t("label",{class:"sort-label"},"排序方式:",-1)),u(E,{modelValue:ga.value,"onUpdate:modelValue":[r[3]||(r[3]=e=>ga.value=e),Va],options:fa},null,8,["modelValue"])])])]),u(w,{name:"post-form-slide"},{default:l(()=>[Sa.value?(c(),s("div",ge,[t("div",fe,[r[13]||(r[13]=t("h3",null,"发布新帖子",-1)),t("button",{class:"close-form-btn",onClick:nl},[u($,{icon:"mdi:close"})])]),t("div",ye,[t("div",ke,[h(t("input",{"onUpdate:modelValue":r[4]||(r[4]=e=>ka.value=e),class:"post-title-input",placeholder:"请输入帖子标题...",maxlength:"100"},null,512),[[g,ka.value]])]),t("div",we,[h(t("textarea",{"onUpdate:modelValue":r[5]||(r[5]=e=>wa.value=e),class:"post-content-input",placeholder:"写下你想说的...",rows:"4",maxlength:"2000"},null,512),[[g,wa.value]])]),t("div",Ce,[t("div",Ie,[t("input",{ref_key:"postImageInput",ref:xa,type:"file",accept:"image/*",multiple:"",onChange:Ka,style:{display:"none"}},null,544),t("input",{ref_key:"postFileInput",ref:Ma,type:"file",multiple:"",onChange:Ja,style:{display:"none"}},null,544),t("button",{class:"upload-btn",onClick:Wa,disabled:Ca.value.length>=5,title:"添加图片(最多5张,每张10M以内)"},[u($,{icon:"mdi:image-outline",class:"btn-icon"}),r[14]||(r[14]=f(" 图片 ",-1))],8,xe),t("button",{class:"upload-btn",onClick:Ga,disabled:Ia.value.length>=5,title:"添加文件(最多5个,每个20M以内)"},[u($,{icon:"mdi:file-outline",class:"btn-icon"}),r[15]||(r[15]=f(" 文件 ",-1))],8,Me),Ca.value.length>0||Ia.value.length>0?(c(),s("span",Se,o(Ca.value.length+Ia.value.length)+" 个附件 ",1)):n("",!0)]),t("button",{class:"submit-post-btn",onClick:ll,disabled:!Ha.value},[u($,{icon:"mdi:send",class:"btn-icon"}),r[16]||(r[16]=f(" 发布帖子 ",-1))],8,$e)]),Ca.value.length>0||Ia.value.length>0?(c(),s("div",Le,[(c(!0),s(y,null,k(Ca.value,(e,a)=>(c(),s("div",{key:`post-img-${a}`,class:"attachment-preview-item"},[t("img",{src:e.preview,alt:"预览图"},null,8,Ae),t("button",{class:"remove-attachment-btn",onClick:e=>(e=>{Ca.value.splice(e,1)})(a)},[u($,{icon:"mdi:close"})],8,Te),e.error?(c(),s("div",Pe,o(e.error),1)):n("",!0)]))),128)),(c(!0),s(y,null,k(Ia.value,(e,a)=>{return c(),s("div",{key:`post-file-${a}`,class:"attachment-preview-item file"},[u($,{icon:"mdi:file",class:"file-icon"}),t("span",_e,o(e.file.name),1),t("span",Be,o((l=e.file.size,l<1024?`${l} B`:l<1048576?`${(l/1024).toFixed(1)} KB`:`${(l/1048576).toFixed(1)} MB`)),1),t("button",{class:"remove-attachment-btn",onClick:e=>(e=>{Ia.value.splice(e,1)})(a)},[u($,{icon:"mdi:close"})],8,Fe),e.error?(c(),s("div",Ue,o(e.error),1)):n("",!0)])
|
||||
var l}),128))])):n("",!0)])])):n("",!0)]),_:1}),ha.value.length>0?(c(),s("div",je,[(c(!0),s(y,null,k(ha.value,e=>{return c(),s("div",{key:e.id,class:"post-card",onClick:a=>{return l=e.id,void L.push(`/discussion/${Ua.value}/post/${l}`)
|
||||
var l}},[t("div",Ee,[t("h3",Re,o(e.title),1),t("div",Ne,[t("div",{class:"author-wrapper",onMouseenter:C(a=>(async(e,a,l)=>{Fa.value&&clearTimeout(Fa.value),Pa.value=a,_a.value=l,Ba.value="",(async e=>{try{const a=await P.getUserInfo(e)
|
||||
if(a&&a.avatar)return await U(a.avatar,a.nickName||a.username)}catch(a){}return""})(a).then(e=>{Ba.value=e||(l?`https://ui-avatars.com/api/?name=${encodeURIComponent(l)}&background=random&size=200`:"https://ui-avatars.com/api/?name=User&background=random&size=200")}),Fa.value=window.setTimeout(()=>{const a=e.target.getBoundingClientRect()
|
||||
Ta.value={x:a.left-100,y:a.bottom+8},Aa.value=!0},200)})(a,(e=>"object"==typeof e.author&&null!==e.author?e.author.id||"":"string"==typeof e.author?e.author:"")(e),ol(e)),["stop"]),onMouseleave:C(cl,["stop"])},[t("div",Oe,[u(_,{"avatar-id":e.authorAvatar||("object"==typeof e.author&&null!==e.author?e.author.avatar:void 0),"user-name":ol(e),size:"small"},null,8,["avatar-id","user-name"]),r[17]||(r[17]=t("div",{class:"online-indicator"},null,-1))]),t("span",Ve,o(ol(e)),1)],40,ze),t("span",Xe,o(ml(e.publishTime)),1)])]),t("div",Ye,[t("p",null,o((a=e.content,a.length<=150?a:a.substring(0,150)+"...")),1)]),t("div",qe,[t("div",He,[t("span",We,[u($,{icon:"mdi:comment-outline",class:"stat-icon"}),t("span",null,o(e.replyCount)+" 回复",1)])]),t("div",Ge,[t("button",{class:I(["action-btn",{active:"liked"===e.userLikeStatus}]),onClick:C(a=>(async e=>{var a,l
|
||||
const t=ha.value.find(a=>a.id===e)
|
||||
if(!t||!Ua.value||ya.value===e)return
|
||||
const s="liked"===t.userLikeStatus?"cancel":"like"
|
||||
ya.value=e,z.show("cancel"===s?"取消点赞中...":"点赞中...")
|
||||
try{const a=await P.likeForumPost(Ua.value,e,s)
|
||||
a.success?(t.userLikeStatus=a.userLikeStatus,t.likeCount=a.likeCount,t.dislikeCount=a.dislikeCount,"cancel"===s?N.success("已取消点赞"):N.success("点赞成功")):N.error(a.message||"点赞失败")}catch(n){N.error((null==(l=null==(a=n.response)?void 0:a.data)?void 0:l.message)||n.message||"点赞失败")}finally{ya.value=null,z.hide()}})(e.id),["stop"]),disabled:ya.value===e.id},[u($,{icon:"liked"===e.userLikeStatus?"mdi:thumb-up":"mdi:thumb-up-outline",class:"action-icon"},null,8,["icon"]),t("span",null,o(e.likeCount),1)],10,Ke),t("button",{class:I(["action-btn",{active:"disliked"===e.userLikeStatus}]),onClick:C(a=>(async e=>{var a,l
|
||||
const t=ha.value.find(a=>a.id===e)
|
||||
if(!t||!Ua.value||ya.value===e)return
|
||||
const s="disliked"===t.userLikeStatus?"cancel":"dislike"
|
||||
ya.value=e,z.show("cancel"===s?"取消点踩中...":"点踩中...")
|
||||
try{const a=await P.likeForumPost(Ua.value,e,s)
|
||||
a.success?(t.userLikeStatus=a.userLikeStatus,t.likeCount=a.likeCount,t.dislikeCount=a.dislikeCount,"cancel"===s?N.success("已取消点踩"):N.success("点踩成功")):N.error(a.message||"点踩失败")}catch(n){N.error((null==(l=null==(a=n.response)?void 0:a.data)?void 0:l.message)||n.message||"点踩失败")}finally{ya.value=null,z.hide()}})(e.id),["stop"]),disabled:ya.value===e.id},[u($,{icon:"disliked"===e.userLikeStatus?"mdi:thumb-down":"mdi:thumb-down-outline",class:"action-icon"},null,8,["icon"]),t("span",null,o(e.dislikeCount),1)],10,Je),t("button",{class:"action-btn report-btn",onClick:C(a=>(e=>{const a=ha.value.find(a=>a.id===e)
|
||||
a&&(La.value={userId:a.author,userName:a.author,content:a.content,type:"post",postId:a.id},$a.value=!0)})(e.id),["stop"])},[u($,{icon:"mdi:flag-outline",class:"action-icon"}),r[18]||(r[18]=t("span",null,"举报",-1))],8,Qe)])])],8,De)
|
||||
var a}),128))])):(c(),s("div",Ze,[u($,{icon:"fluent-color:chat-bubbles-question-24",class:"empty-icon"}),r[19]||(r[19]=t("p",null,"暂无讨论内容",-1)),r[20]||(r[20]=t("p",{class:"empty-hint"},"还没有人发布帖子",-1))]))])):n("",!0)]),u(j,{visible:$a.value,"report-info":La.value,onClose:r[6]||(r[6]=e=>$a.value=!1),onSubmit:ul},null,8,["visible","report-info"]),u(D,{visible:Aa.value,"user-id":Pa.value,"user-name":_a.value,"avatar-url":Ba.value,position:Ta.value,onClose:vl,onSendMessage:dl,onBlockUser:pl,onMouseEnter:rl},null,8,["visible","user-id","user-name","avatar-url","position"]),u(W,{visible:Qa.value,progress:Za.value,title:el.value,"status-text":el.value,error:al.value,completed:100===Za.value&&!al.value,cancellable:Za.value<100&&!al.value,onCancel:tl,onClose:sl},null,8,["visible","progress","title","status-text","error","completed","cancellable"]),u(B,{toasts:x(N).toasts.value,onRemove:x(N).removeToast},null,8,["toasts","onRemove"]),(c(),a(M,{to:"body"},[u(w,{name:"icon-preview-fade"},{default:l(()=>{var e
|
||||
return[ca.value?(c(),s("div",{key:0,class:"icon-preview-overlay",style:i(pa.value)},[ra.value&&!va.value?(c(),s("img",{key:0,src:ra.value,alt:(null==(e=O.value)?void 0:e.name)||"图标预览",class:"preview-image",onLoad:Da},null,40,ea)):(c(),s("div",aa,[...r[21]||(r[21]=[t("div",{class:"loading-spinner"},null,-1),t("p",null,"加载中...",-1)])]))],4)):n("",!0)]}),_:1})]))]))}}),[["__scopeId","data-v-973c5f2d"]])
|
||||
export{la as default}
|
||||
215
frontend/dist/assets/Cw0npQhr.js
vendored
Normal file
215
frontend/dist/assets/Cw0npQhr.js
vendored
Normal file
File diff suppressed because one or more lines are too long
38
frontend/dist/assets/CyXXdKuZ.js
vendored
Normal file
38
frontend/dist/assets/CyXXdKuZ.js
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
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,y as r,b as u,A as d,v,l as m,q as p,u as g,t as f,e as w}from"./Cf-ihD4f.js"
|
||||
import{c as y,A as k,_ as h,M as b,T as C,a as x}from"./C_NDl53k.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"},A={class:"download-list"},E={key:0,class:"empty-state"},I={class:"item-icon"},N={class:"item-content"},j={class:"item-name-row"},q={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=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 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,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""},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",A,[0===he.value.length?(w(),o("div",E,[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",I,[c(h,{icon:Ce(e),class:"icon"},null,8,["icon"])]),n("div",N,[n("div",j,[n("span",q,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,[xe(e)?(w(),o("div",Z,v(xe(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(C,{toasts:g(x),onRemove:g(ue)},null,8,["toasts","onRemove"])]))}}),[["__scopeId","data-v-70173d45"]])
|
||||
export{ie as default}
|
||||
17
frontend/dist/assets/D-_YwqDW.js
vendored
Normal file
17
frontend/dist/assets/D-_YwqDW.js
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
import{A as e}from"./C_NDl53k.js"
|
||||
import"./Cf-ihD4f.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
|
||||
t.append("file",s)
|
||||
const a=await fetch("/api/proxy",{method:"POST",headers:{"x-forward-by-qiuchenly":"/api/v1/attachments/file","x-forward-method-by-qiuchenly":"POST",Authorization:`Bearer ${localStorage.getItem("token")||""}`},body:t}),n=await a.json()
|
||||
return n.success&&n.data?{success:!0,attachmentId:n.data.attachmentId}:{success:!1,message:n.message||"上传失败"}}catch(d){return{success:!1,message:d.message||"上传失败"}}const u=Math.ceil(c.size/o)
|
||||
let m=0
|
||||
try{const e=encodeURIComponent(c.name),s=await t(e,c.size,u)
|
||||
if(!s.success||!s.uploadId)return{success:!1,message:s.message||"初始化分片上传失败"}
|
||||
const d=s.uploadId
|
||||
for(let t=0;t<u;t++){const e=t*o,s=Math.min(e+o,c.size),n=c.slice(e,s),h=await a(d,t,n,e=>{if(i&&i(t,e),r){const s=Math.round((m+e/100)/u*100)
|
||||
r(s)}})
|
||||
if(!h.success)return{success:!1,message:`分片 ${t+1}/${u} 上传失败: ${h.message}`}
|
||||
m++,r&&r(Math.round(m/u*100))}const h=await n(d,e)
|
||||
return h.success?{success:!0,attachmentId:h.attachmentId}:{success:!1,message:h.message||"完成分片上传失败"}}catch(d){return{success:!1,message:d.message||"分片上传失败"}}}export{c as chunkUpload,n as completeChunkUpload,t as initChunkUpload,a as uploadChunk}
|
||||
23
frontend/dist/assets/DGXpaUX-.js
vendored
Normal file
23
frontend/dist/assets/DGXpaUX-.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
frontend/dist/assets/DHc4z5Hj.js
vendored
Normal file
11
frontend/dist/assets/DHc4z5Hj.js
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
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 v,k as u,l as r,m as d,t as m,v as c,T as g,e as f,n as p}from"./Cf-ihD4f.js"
|
||||
import{_ as h,a as k}from"./C_NDl53k.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]
|
||||
if(!e)return U.value=!0,void(E.value=null)
|
||||
N.value=!1,U.value=!1,E.value=e},K=()=>{j.value>0&&(j.value--,$("indexChange",j.value))},L=()=>{j.value<z.value.length-1&&(j.value++,$("indexChange",j.value))},M=()=>{$("close")},S=e=>{"Escape"===e.key?M():"ArrowLeft"===e.key?K():"ArrowRight"===e.key&&L()},q=()=>{U.value=!1},P=()=>{U.value=!0,E.value=null}
|
||||
return i(()=>_.visible,e=>{e?(j.value=_.initialIndex,F(),p(()=>{const e=document.querySelector(".image-preview-modal")
|
||||
e&&e.focus()})):(E.value=null,N.value=!1,U.value=!1)},{immediate:!0}),i(j,()=>{F()}),i(()=>_.images,()=>{_.visible&&F()}),n(()=>{_.visible&&F()}),(a,l)=>(f(),s(g,{to:"body"},[o(t,{name:"preview-fade"},{default:v(()=>{return[e.visible?(f(),u("div",{key:0,class:"image-preview-modal",onClick:M,onKeydown:S,tabindex:"-1"},[d("div",{class:"preview-content",onClick:l[0]||(l[0]=m(()=>{},["stop"]))},[e.showNavigation&&j.value>0?(f(),u("button",{key:0,class:"nav-btn prev-btn",onClick:m(K,["stop"]),title:"上一张 (←)"},[o(h,{icon:"mdi:chevron-left"})])):r("",!0),d("div",y,[E.value?(f(),u("img",{key:0,src:E.value,alt:`图片 ${j.value+1}`,onLoad:q,onError:P},null,40,b)):N.value?(f(),u("div",w,[...l[1]||(l[1]=[d("div",{class:"spinner"},null,-1),d("p",null,"加载中...",-1)])])):U.value?(f(),u("div",I,[o(h,{icon:"mdi:image-broken"}),l[2]||(l[2]=d("p",null,"图片加载失败",-1))])):r("",!0)]),e.showNavigation&&j.value<z.value.length-1?(f(),u("button",{key:1,class:"nav-btn next-btn",onClick:m(L,["stop"]),title:"下一张 (→)"},[o(h,{icon:"mdi:chevron-right"})])):r("",!0),d("button",{class:"close-preview-btn",onClick:m(M,["stop"]),title:"关闭 (ESC)"},[o(h,{icon:"mdi:close"})]),e.showInfo&&z.value.length>0?(f(),u("div",x,[d("span",C,c(j.value+1)+" / "+c(z.value.length),1),A.value?(f(),u("span",B,c((a=A.value,a?a<1024?`${a} B`:a<1048576?`${(a/1024).toFixed(1)} KB`:`${(a/1048576).toFixed(1)} MB`:"")),1)):r("",!0)])):r("",!0)])],32)):r("",!0)]
|
||||
var a}),_:1})]))}}),[["__scopeId","data-v-a54a074d"]])
|
||||
export{_ as I}
|
||||
10
frontend/dist/assets/DHwqePp8.js
vendored
Normal file
10
frontend/dist/assets/DHwqePp8.js
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
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,v as d,F as v,y as p,b as m,B as f,C as b,A as g,T as y,e as h}from"./Cf-ihD4f.js"
|
||||
import{_ as k,a as _}from"./C_NDl53k.js"
|
||||
import{R as I}from"./6K6b4Qy_.js"
|
||||
const C={class:"dialog-header"},w={class:"header-icon"},x={class:"dialog-content"},j={class:"report-info-section"},R={class:"section-title"},B={class:"info-grid"},D={class:"info-row"},q={class:"info-value"},A={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"},z=["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="")})
|
||||
const X=()=>{P("close")},Y=()=>{0!==S.value.length&&M.reportInfo&&P("submit",S.value,W.value,M.reportInfo)}
|
||||
return(l,s)=>(h(),e(y,{to:"body"},[i(o,{name:"dialog-fade"},{default:n(()=>{var l,o,n
|
||||
return[a.visible?(h(),t("div",{key:0,class:"dialog-overlay",onClick:r(X,["self"])},[u("div",{class:"dialog-container",onClick:s[1]||(s[1]=r(()=>{},["stop"]))},[u("div",C,[u("div",w,[i(k,{icon:"mdi:flag"})]),s[2]||(s[2]=u("h2",{class:"dialog-title"},"举报内容",-1)),u("button",{class:"dialog-close",onClick:X,"aria-label":"关闭"},[i(k,{icon:"mdi:close"})])]),u("div",x,[u("div",j,[u("div",R,[i(k,{icon:"mdi:information-outline",class:"title-icon"}),s[3]||(s[3]=u("span",null,"被举报信息",-1))]),u("div",B,[u("div",D,[s[4]||(s[4]=u("span",{class:"info-label"},"用户ID",-1)),u("span",q,d((null==(l=a.reportInfo)?void 0:l.userId)||"-"),1)]),u("div",A,[s[5]||(s[5]=u("span",{class:"info-label"},"用户昵称",-1)),u("span",F,d((null==(o=a.reportInfo)?void 0:o.userName)||"-"),1)]),u("div",N,[s[6]||(s[6]=u("span",{class:"info-label"},"内容",-1)),u("div",O,d((null==(n=a.reportInfo)?void 0:n.content)||"-"),1)])])]),u("div",T,[u("div",U,[i(k,{icon:"mdi:alert-circle-outline",class:"title-icon"}),s[7]||(s[7]=u("span",null,"选择举报类型",-1)),s[8]||(s[8]=u("span",{class:"required"},"*",-1))]),u("div",V,[(h(),t(v,null,p(Q,a=>u("button",{key:a.value,type:"button",class:m(["report-type-btn",{active:S.value.includes(a.value)}]),onClick:l=>(a=>{const l=S.value.indexOf(a)
|
||||
l>-1?S.value.splice(l,1):S.value.push(a)})(a.value)},[i(k,{icon:a.icon,class:"type-icon"},null,8,["icon"]),u("span",E,d(a.label),1),S.value.includes(a.value)?(h(),e(k,{key:0,icon:"mdi:check-circle",class:"check-icon"})):c("",!0)],10,z)),64))])]),u("div",G,[u("div",H,[i(k,{icon:"mdi:comment-text-outline",class:"title-icon"}),s[9]||(s[9]=u("span",null,"补充说明(可选)",-1))]),f(u("textarea",{"onUpdate:modelValue":s[0]||(s[0]=a=>W.value=a),class:"comment-textarea",placeholder:"请详细描述举报原因,帮助我们更好地处理...",rows:"4",maxlength:"500"},null,512),[[b,W.value]]),u("div",J,d(W.value.length)+"/500",1)])]),u("div",K,[u("button",{class:"btn btn-secondary",onClick:X},"取消"),u("button",{class:"btn btn-primary",onClick:Y,disabled:0===S.value.length},[i(k,{icon:"mdi:send",class:"btn-icon"}),s[10]||(s[10]=g(" 提交举报 ",-1))],8,L)])])])):c("",!0)]}),_:1})]))}}),[["__scopeId","data-v-48a6bea7"]])
|
||||
export{M as R}
|
||||
39
frontend/dist/assets/DI01Uixr.js
vendored
Normal file
39
frontend/dist/assets/DI01Uixr.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/DI4mSc6T.css
vendored
Normal file
1
frontend/dist/assets/DI4mSc6T.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.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}
|
||||
5
frontend/dist/assets/DIWZ-aSU.js
vendored
Normal file
5
frontend/dist/assets/DIWZ-aSU.js
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
import{d as a,k as t,l as e,m as s,A as n,v as o,F as r,e as g}from"./Cf-ihD4f.js"
|
||||
import{a as c}from"./C_NDl53k.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}
|
||||
1
frontend/dist/assets/DTTm7QTi.css
vendored
Normal file
1
frontend/dist/assets/DTTm7QTi.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.new-features-page[data-v-5d89dd00]{margin:-32px -40px;padding:32px 40px;width:calc(100% + 80px);min-height:calc(100% + 64px);box-sizing:border-box;background:transparent}.features-container[data-v-5d89dd00]{position:relative}.page-header[data-v-5d89dd00]{margin-bottom:48px}.page-title[data-v-5d89dd00]{font-size:32px;font-weight:600;color:var(--text-primary);margin:0 0 12px;padding:0}.page-subtitle[data-v-5d89dd00]{font-size:16px;color:var(--text-secondary);margin:0;padding:0;line-height:1.6}.features-list[data-v-5d89dd00]{display:flex;flex-direction:column;gap:32px}.feature-item[data-v-5d89dd00]{padding:24px;background:var(--bg-card);border:1px solid var(--border-light);border-radius:12px;transition:all .2s ease;position:relative;cursor:pointer}.feature-item[data-v-5d89dd00]:hover{background:var(--bg-secondary);border-color:var(--border-color);box-shadow:var(--shadow-md);transform:translateY(-2px)}.feature-item.feature-type-new[data-v-5d89dd00]{background:linear-gradient(to right,rgba(0,122,255,.05) 0%,var(--bg-card) 100%)}.feature-item.feature-type-fix[data-v-5d89dd00]{background:linear-gradient(to right,rgba(52,199,89,.05) 0%,var(--bg-card) 100%)}.feature-header[data-v-5d89dd00]{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:12px;gap:16px}.feature-title[data-v-5d89dd00]{font-size:20px;font-weight:600;color:var(--text-primary);margin:0;padding:0;flex:1;line-height:1.4}.new-badge[data-v-5d89dd00]{display:inline-flex;align-items:center;justify-content:center;padding:4px 8px;font-size:12px;font-weight:600;border-radius:4px;flex-shrink:0;text-transform:uppercase;letter-spacing:.5px;transition:all .2s ease}.new-badge.badge-feature[data-v-5d89dd00]{background:var(--primary-color);color:#fff}.new-badge.badge-fix[data-v-5d89dd00]{background:#34c759;color:#fff}.feature-description[data-v-5d89dd00]{font-size:15px;color:var(--text-secondary);margin:0 0 16px;padding:0;line-height:1.7}.feature-action[data-v-5d89dd00]{margin-top:16px}.action-button[data-v-5d89dd00]{display:inline-flex;align-items:center;padding:10px 20px;background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border-color);border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease}.action-button[data-v-5d89dd00]:hover{background:var(--bg-hover);border-color:var(--primary-color);color:var(--primary-color)}.action-button[data-v-5d89dd00]:active{transform:scale(.98)}[data-theme=dark] .feature-item[data-v-5d89dd00]{background:var(--bg-card);border-color:var(--border-light)}[data-theme=dark] .feature-item.feature-type-new[data-v-5d89dd00]{background:linear-gradient(to right,rgba(0,122,255,.1) 0%,var(--bg-card) 100%)}[data-theme=dark] .feature-item.feature-type-fix[data-v-5d89dd00]{background:linear-gradient(to right,rgba(52,199,89,.1) 0%,var(--bg-card) 100%)}[data-theme=dark] .action-button[data-v-5d89dd00]{background:var(--bg-secondary);border-color:var(--border-color)}[data-theme=dark] .action-button[data-v-5d89dd00]:hover{background:var(--bg-hover);border-color:var(--primary-color)}@media (max-width: 768px){.new-features-page[data-v-5d89dd00]{padding:16px}.page-title[data-v-5d89dd00]{font-size:28px}.feature-item[data-v-5d89dd00]{padding:20px}.feature-title[data-v-5d89dd00]{font-size:18px}.feature-description[data-v-5d89dd00]{font-size:14px}}
|
||||
16
frontend/dist/assets/DUMqsWsK.js
vendored
Normal file
16
frontend/dist/assets/DUMqsWsK.js
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
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,B as u,N as c,v as r,u as v,t as h,c as m,I as g,e as b}from"./Cf-ihD4f.js"
|
||||
import{c as y,A as k,_ as w,T as I,a as f}from"./C_NDl53k.js"
|
||||
import{u as j,L as C}from"./DrS-_GpA.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"},B={key:1,class:"version-info"},x={key:0,class:"version-item"},M={class:"version-value"},N={key:1,class:"version-item latest"},S={class:"version-label"},z={class:"version-value"},F={key:2,class:"version-item bundle-id"},G={class:"version-value bundle-id-value"},H={key:2,class:"app-description"},J={class:"app-actions"},K=["disabled","title"],O={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)
|
||||
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()})
|
||||
const ta=t(()=>P.app.iconId&&Z.value?Z.value:P.app.path&&P.app.hasIcon?k.getAppIconUrl(P.app.bundleId):null),{updating:la,modalVisible:na,modalTitle:ia,logs:oa,modalStatus:da,handleUpdate:ua,handleReinstall:ca,hideModal:ra}=j({onRefresh:async()=>{try{await k.getApp(P.app.bundleId),Q("updated",P.app.bundleId)}catch(a){throw a}}}),va=()=>{const a=P.app.bundleId.toLowerCase()
|
||||
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")?"工具":"应用"},ha=t(()=>{if(!P.app.path||0===P.app.path.length)return!1
|
||||
const a="upgrade_available"===P.app.status,s=null!==P.app.update&&!0===P.app.update.hasUpdate
|
||||
return a||s}),ma=t(()=>{var a
|
||||
return!(P.app.path||(null==(a=P.app.update)?void 0:a.versions)&&0!==P.app.update.versions.length)}),ga=()=>{var a
|
||||
return la.value?"处理中...":P.app.path?ha.value?"更新":"injected"===P.app.status?"已安装":"supported"===P.app.status?"一键激活":"unsupported"===P.app.status?"不支持":"一键激活":((null==(a=P.app.update)?void 0:a.versions)&&P.app.update.versions.length,"下载")},ba=()=>{P.app.path&&W.push(`/app/${P.app.bundleId}`)},ya=()=>{var a,s
|
||||
P.app.path?ha.value&&(null==(s=P.app.update)?void 0:s.versions)&&P.app.update.versions.length>0?window.dispatchEvent(new CustomEvent("open-version-dialog",{detail:P.app})):ha.value||"supported"===P.app.status?ua(P.app):"injected"!==P.app.status&&"unsupported"!==P.app.status&&ca():(null==(a=P.app.update)?void 0:a.versions)&&P.app.update.versions.length>0?window.dispatchEvent(new CustomEvent("open-version-dialog",{detail:P.app})):sa("该应用暂无可用的下载版本",3e3)},ka=()=>{X.value=!0,Y.value=!1},wa=()=>{X.value=!1,Y.value=!0}
|
||||
return(s,e)=>{var p
|
||||
return b(),l("div",{class:n(["app-card",[`mode-${a.mode}`,{"not-installed":!a.app.path}]]),onClick:ba},["list"===a.mode?(b(),l("div",A,[ha.value?(b(),l("div",_,[...e[0]||(e[0]=[o("span",null,"可更新",-1)])])):"injected"===a.app.status?(b(),l("div",E,[...e[1]||(e[1]=[o("span",null,"已注入",-1)])])):i("",!0)])):i("",!0),o("div",R,[o("div",U,[o("div",V,[ta.value?u((b(),l("img",{key:0,src:ta.value,alt:a.app.name,onLoad:ka,onError:wa},null,40,D)),[[c,X.value&&!Y.value]]):i("",!0),u(o("div",{class:"icon-placeholder"},r(a.app.name.charAt(0).toUpperCase()),513),[[c,!ta.value||!X.value||Y.value]])])]),o("div",L,[o("h3",T,r(a.app.name),1),"search"===a.mode?(b(),l("div",$,[d(w,{icon:"fluent-color:star-24",class:"star-icon"}),e[2]||(e[2]=o("span",null,"4.5",-1))])):i("",!0),o("div",q,[o("span",null,r(va()),1)]),"list"===a.mode?(b(),l("div",B,[a.app.path?(b(),l("div",x,[e[3]||(e[3]=o("span",{class:"version-label"},"当前",-1)),o("span",M,r(a.app.version||"未知"),1)])):i("",!0),(null==(p=a.app.update)?void 0:p.latestVersion)?(b(),l("div",N,[o("span",S,r(a.app.path?"最新":"版本"),1),o("span",z,r(a.app.update.latestVersion),1)])):i("",!0),a.app.path?i("",!0):(b(),l("div",F,[e[4]||(e[4]=o("span",{class:"version-label"},"包名",-1)),o("span",G,r(a.app.bundleId),1)]))])):i("",!0),"search"===a.mode&&a.showDescription?(b(),l("div",H,r(`${P.app.name}是一款优秀的应用程序,提供丰富的功能和良好的用户体验。`),1)):i("",!0)]),o("div",J,[o("button",{class:n(["action-button",!P.app.path&&ma.value?"disabled":ha.value?"warning":"injected"===P.app.status?"success":"supported"===P.app.status?"primary":"unsupported"===P.app.status?"disabled":"primary"]),onClick:h(ya,["stop"]),disabled:v(la)||ma.value,title:!P.app.path&&ma.value?"该应用暂无可用的下载版本":la.value?"正在处理中...":""},[ha.value?(b(),m(w,{key:0,icon:"mdi:arrow-down-circle",class:"button-icon"})):"supported"===P.app.status?(b(),m(w,{key:1,icon:"mdi:key",class:"button-icon"})):"injected"===P.app.status?(b(),m(w,{key:2,icon:"mdi:check-circle",class:"button-icon"})):P.app.path?i("",!0):(b(),m(w,{key:3,icon:"mdi:download",class:"button-icon"})),o("span",null,r(ga()),1),ma.value&&!P.app.path?(b(),l("span",O," 该应用暂无可用的下载版本 ")):i("",!0)],10,K)])]),d(C,{visible:v(na),title:v(ia),logs:v(oa),loading:v(la),status:v(da),"can-close":"loading"!==v(da),onClose:v(ra)},null,8,["visible","title","logs","loading","status","can-close","onClose"]),d(I,{toasts:v(aa),onRemove:v(ea)},null,8,["toasts","onRemove"])],2)}}}),[["__scopeId","data-v-ff5d0d27"]])
|
||||
export{P as A}
|
||||
10
frontend/dist/assets/DZt01rzp.js
vendored
Normal file
10
frontend/dist/assets/DZt01rzp.js
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
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,v as u,i as v,j as p,l as w,t as m,q as f,F as k,y as h,T as g,n as y,e as E}from"./Cf-ihD4f.js"
|
||||
import{_ as L,a as _}from"./C_NDl53k.js"
|
||||
const x={class:"select-selected"},C=["onClick"],b=_(e({__name:"CustomSelect",props:{modelValue:{},options:{},placeholder:{default:"请选择"}},emits:["update:modelValue"],setup(e,{emit:_}){const b=e,V=_,j=l(!1),z=l(null),H=l(null),R=l({top:"0px",left:"0px",width:"200px"}),$=o(()=>b.options.find(e=>e.value===b.modelValue)||null),W=()=>{j.value&&z.value&&y(()=>{const e=z.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=()=>{j.value=!j.value,j.value&&W()},B=e=>{const l=e.target
|
||||
z.value&&z.value.contains(l)||H.value&&H.value.contains(l)||(j.value=!1)}
|
||||
return n(j,e=>{e?(W(),window.addEventListener("scroll",W,!0),window.addEventListener("resize",W)):(window.removeEventListener("scroll",W,!0),window.removeEventListener("resize",W))}),a(()=>{document.addEventListener("click",B)}),t(()=>{document.removeEventListener("click",B),window.removeEventListener("scroll",W,!0),window.removeEventListener("resize",W)}),(l,o)=>{var n,a
|
||||
return E(),s("div",{class:"custom-select-wrapper",ref_key:"wrapperRef",ref:z},[i("div",{class:d(["custom-select",{open:j.value}]),onClick:q},[i("div",x,[r(L,{icon:(null==(n=$.value)?void 0:n.icon)||"",class:"select-icon"},null,8,["icon"]),i("span",null,u((null==(a=$.value)?void 0:a.label)||e.placeholder),1),r(L,{icon:"fluent-color:chevron-down-24",class:d(["select-arrow",{rotated:j.value}])},null,8,["class"])])],2),(E(),c(g,{to:"body"},[r(v,{name:"dropdown-fade"},{default:p(()=>[j.value?(E(),s("div",{key:0,ref_key:"dropdownRef",ref:H,class:"select-dropdown",style:f(R.value),onClick:o[0]||(o[0]=m(()=>{},["stop"]))},[(E(!0),s(k,null,h(e.options,l=>(E(),s("div",{key:l.value,class:d(["select-option",{active:e.modelValue===l.value}]),onClick:e=>{return o=l.value,V("update:modelValue",o),void(j.value=!1)
|
||||
var o}},[r(L,{icon:l.icon,class:"option-icon"},null,8,["icon"]),i("span",null,u(l.label),1),e.modelValue===l.value?(E(),c(L,{key:0,icon:"fluent-color:checkmark-24",class:"option-check"})):w("",!0)],10,C))),128))],4)):w("",!0)]),_:1})]))],512)}}}),[["__scopeId","data-v-3ceed415"]])
|
||||
export{b as C}
|
||||
1
frontend/dist/assets/DjM3KHR-.css
vendored
Normal file
1
frontend/dist/assets/DjM3KHR-.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.image-preview-modal[data-v-a54a074d]{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000f2;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);display:flex;align-items:center;justify-content:center;z-index:10001;cursor:pointer;padding:var(--spacing-lg);outline:none}.image-preview-modal .preview-content[data-v-a54a074d]{position:relative;width:100%;height:100%;max-width:95vw;max-height:95vh;cursor:default;display:flex;align-items:center;justify-content:center}.image-container[data-v-a54a074d]{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.image-container img[data-v-a54a074d]{max-width:100%;max-height:95vh;border-radius:var(--radius-lg);box-shadow:0 20px 60px #00000080;object-fit:contain;-webkit-user-select:none;user-select:none}.loading-state[data-v-a54a074d],.error-state[data-v-a54a074d]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;color:#fffc;font-size:16px}.loading-state .spinner[data-v-a54a074d],.error-state .spinner[data-v-a54a074d]{width:48px;height:48px;border:4px solid rgba(255,255,255,.2);border-top:4px solid white;border-radius:50%;animation:spin-a54a074d .8s linear infinite}.loading-state p[data-v-a54a074d],.error-state p[data-v-a54a074d]{margin:0}.loading-state[data-v-a54a074d] svg,.error-state[data-v-a54a074d] svg{font-size:48px;opacity:.6}.nav-btn[data-v-a54a074d]{position:absolute;top:50%;transform:translateY(-50%);width:56px;height:56px;background:#ffffff26;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.2);border-radius:50%;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 12px #0000004d;z-index:10}.nav-btn[data-v-a54a074d]:hover{background:#ffffff40;border-color:#fff6;transform:translateY(-50%) scale(1.1);box-shadow:0 6px 20px #0006}.nav-btn[data-v-a54a074d]:active{transform:translateY(-50%) scale(.95)}.nav-btn[data-v-a54a074d] svg,.nav-btn[data-v-a54a074d] .iconify{font-size:28px;width:28px;height:28px}.nav-btn.prev-btn[data-v-a54a074d]{left:20px}.nav-btn.next-btn[data-v-a54a074d]{right:20px}.close-preview-btn[data-v-a54a074d]{position:absolute;top:20px;right:20px;width:44px;height:44px;background:#ffffff26;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.2);border-radius:50%;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 12px #0000004d;z-index:10}.close-preview-btn[data-v-a54a074d]:hover{background:#ffffff40;border-color:#fff6;transform:scale(1.1) rotate(90deg);box-shadow:0 6px 20px #0006}.close-preview-btn[data-v-a54a074d]:active{transform:scale(.95) rotate(90deg)}.close-preview-btn[data-v-a54a074d] svg,.close-preview-btn[data-v-a54a074d] .iconify{font-size:24px;width:24px;height:24px}.image-info[data-v-a54a074d]{position:absolute;bottom:20px;left:50%;transform:translate(-50%);background:#0009;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:#fff;padding:8px 16px;border-radius:20px;font-size:14px;font-weight:500;display:flex;align-items:center;gap:12px}.image-info .image-index[data-v-a54a074d]{font-weight:500}.image-info .image-size[data-v-a54a074d]{font-size:12px;opacity:.8}.preview-fade-enter-active[data-v-a54a074d],.preview-fade-leave-active[data-v-a54a074d]{transition:opacity .3s ease}.preview-fade-enter-active .preview-content[data-v-a54a074d]{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s ease}.preview-fade-leave-active .preview-content[data-v-a54a074d]{transition:transform .2s ease,opacity .2s ease}.preview-fade-enter-from[data-v-a54a074d]{opacity:0}.preview-fade-enter-from .preview-content[data-v-a54a074d]{transform:scale(.9)}.preview-fade-leave-to[data-v-a54a074d]{opacity:0}.preview-fade-leave-to .preview-content[data-v-a54a074d]{transform:scale(.9)}@keyframes spin-a54a074d{to{transform:rotate(360deg)}}@media (max-width: 768px){.image-preview-modal[data-v-a54a074d]{padding:var(--spacing-md)}.image-preview-modal .nav-btn[data-v-a54a074d]{width:44px;height:44px}.image-preview-modal .nav-btn.prev-btn[data-v-a54a074d]{left:10px}.image-preview-modal .nav-btn.next-btn[data-v-a54a074d]{right:10px}.image-preview-modal .nav-btn[data-v-a54a074d] svg{font-size:24px}.image-preview-modal .close-preview-btn[data-v-a54a074d]{top:10px;right:10px;width:36px;height:36px}.image-preview-modal .image-info[data-v-a54a074d]{bottom:10px;font-size:12px;padding:6px 12px}}
|
||||
7
frontend/dist/assets/Dl86DKZJ.js
vendored
Normal file
7
frontend/dist/assets/Dl86DKZJ.js
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import{d as a,r as s,f as e,k as i,l,F as m,y as o,m as n,g as t,v as r,R as c,e as d}from"./Cf-ihD4f.js"
|
||||
import{_ as g,a as u}from"./C_NDl53k.js"
|
||||
const p={key:0,class:"image-list"},v=["onClick"],k={class:"image-wrapper"},f=["src","alt","onError"],h={key:1,class:"image-error"},x={key:0,class:"image-index"},y=u(a({__name:"ImageList",props:{images:{},showIndex:{type:Boolean,default:!1},columns:{default:3},maxWidth:{default:void 0}},emits:["imageClick"],setup(a,{emit:u}){c(a=>({f589b9d6:a.columns,v08c50147:w.value}))
|
||||
const y=a,I=u,_=s(new Map),w=e(()=>y.maxWidth?`${y.maxWidth}px`:"none")
|
||||
return(s,e)=>a.images.length>0?(d(),i("div",p,[(d(!0),i(m,null,o(a.images,(s,m)=>(d(),i("div",{key:m,class:"image-item",onClick:a=>(a=>{const s=y.images[a]
|
||||
I("imageClick",a,s)})(m)},[n("div",k,[s&&!_.value.has(m)?(d(),i("img",{key:0,src:s,alt:`图片 ${m+1}`,onError:a=>(a=>{_.value.set(a,!0)})(m)},null,40,f)):l("",!0),_.value.has(m)?(d(),i("div",h,[t(g,{icon:"mdi:image-broken"}),e[0]||(e[0]=n("span",null,"加载失败",-1))])):l("",!0)]),a.showIndex?(d(),i("div",x,r(m+1)+"/"+r(a.images.length),1)):l("",!0)],8,v))),128))])):l("",!0)}}),[["__scopeId","data-v-f368ecaf"]])
|
||||
export{y as I}
|
||||
16
frontend/dist/assets/DrS-_GpA.js
vendored
Normal file
16
frontend/dist/assets/DrS-_GpA.js
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
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,A as u,v as g,F as m,y as v,b as p,t as f,e as y,n as h}from"./Cf-ihD4f.js"
|
||||
import{_ as k,a as b,A as S}from"./C_NDl53k.js"
|
||||
const w={class:"modal-header"},C={class:"modal-title"},$={class:"modal-body"},M={class:"log-time"},_={class:"log-message"},T={key:0,class:"log-line loading"},j={class:"modal-footer"},B={class:"footer-status"},I={key:0,class:"status-success"},L={key:1,class:"status-error"},A={key:2,class:"status-loading"},E={class:"footer-actions"},V=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,V=b,D=a(null),H=()=>{D.value&&(D.value.scrollTop=D.value.scrollHeight)}
|
||||
l(()=>S.logs,async()=>{await h(),H()},{deep:!0,flush:"post"}),l(()=>S.loading,async()=>{await h(),H()})
|
||||
const R=()=>{switch(S.status){case"success":return"mdi:check-circle"
|
||||
case"error":return"mdi:alert-circle"
|
||||
case"loading":return"mdi:loading"
|
||||
default:return"mdi:information"}},x=s=>s.level?`log-${s.level}`:"log-info",F=()=>{V("close")},U=()=>{S.canClose&&F()}
|
||||
return(a,l)=>(y(),e(o,{to:"body"},[t(n,{name:"modal"},{default:i(()=>[s.visible?(y(),c("div",{key:0,class:"modal-overlay",onClick:U},[r("div",{class:"modal-container",onClick:l[0]||(l[0]=f(()=>{},["stop"]))},[r("div",w,[r("h2",C,[t(k,{icon:R(),class:"modal-icon"},null,8,["icon"]),u(" "+g(s.title),1)]),s.canClose?(y(),c("button",{key:0,onClick:F,class:"modal-close","aria-label":"关闭"},[t(k,{icon:"mdi:close"})])):d("",!0)]),r("div",$,[r("div",{ref_key:"logContainer",ref:D,class:"log-container"},[(y(!0),c(m,null,v(s.logs,(s,a)=>(y(),c("div",{key:a,class:p(["log-line",x(s)])},[r("span",M,g(s.time),1),r("span",_,g(s.message),1)],2))),128)),s.loading?(y(),c("div",T,[...l[1]||(l[1]=[r("div",{class:"spinner-small"},null,-1),r("span",{class:"log-message"},"处理中...",-1)])])):d("",!0)],512)]),r("div",j,[r("div",B,["success"===s.status?(y(),c("span",I,[t(k,{icon:"mdi:check-circle"}),l[2]||(l[2]=u(" 操作成功 ",-1))])):"error"===s.status?(y(),c("span",L,[t(k,{icon:"mdi:alert-circle"}),l[3]||(l[3]=u(" 操作失败 ",-1))])):s.loading?(y(),c("span",A,[...l[4]||(l[4]=[r("div",{class:"spinner-small"},null,-1),u(" 处理中... ",-1)])])):d("",!0)]),r("div",E,[s.canClose?(y(),c("button",{key:0,onClick:F,class:"btn btn-outline"}," 关闭 ")):d("",!0)])])])])):d("",!0)]),_:1})]))}}),[["__scopeId","data-v-f5d3fd24"]])
|
||||
function D(s){const l=a(!1),{onRefresh:e}=s,{modalVisible:o,modalTitle:t,logs:n,modalStatus:i,addLog:c,showModal:d,hideModal:r,setSuccess:u,setError:g}=function(){const s=a(!1),l=a(""),e=a([]),o=a("idle")
|
||||
return{modalVisible:s,modalTitle:l,logs:e,modalStatus:o,addLog:(s,a="info")=>{const l=new Date,o=`${l.getHours().toString().padStart(2,"0")}:${l.getMinutes().toString().padStart(2,"0")}:${l.getSeconds().toString().padStart(2,"0")}`
|
||||
e.value.push({time:o,message:s,level:a})},showModal:a=>{l.value=a,e.value=[],o.value="loading",s.value=!0},hideModal:()=>{s.value=!1},setSuccess:()=>{o.value="success"},setError:()=>{o.value="error"}}}()
|
||||
return{updating:l,modalVisible:o,modalTitle:t,logs:n,modalStatus:i,handleUpdate:async s=>{l.value=!0,d("injected"===s.status?"更新应用":"注入应用"),c(`开始处理应用: ${s.name}`),c(`Bundle ID: ${s.bundleId}`),c(`当前版本: ${s.version}`)
|
||||
try{c("正在连接到服务器...")
|
||||
const a=await S.updateApp(s.bundleId)
|
||||
a.logs&&a.logs.length>0&&a.logs.forEach(s=>{c(s,"info")}),a.success?(c("操作成功完成!","success"),u(),c("正在刷新应用状态..."),await e(),c("应用状态已更新","success")):(c(`操作失败: ${a.errorMessage||"更新失败"}`,"error"),g())}catch(a){c(`网络错误: ${a}`,"error"),g()}finally{l.value=!1}},handleReinstall:async()=>{},hideModal:r}}export{V as L,D as u}
|
||||
82
frontend/dist/assets/DyfdGCIk.js
vendored
Normal file
82
frontend/dist/assets/DyfdGCIk.js
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
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,y as p,b as v,v as m,g,e as f,c as y,t as h,s as b,G as k,I}from"./Cf-ihD4f.js"
|
||||
import{A as w}from"./DUMqsWsK.js"
|
||||
import{_ as C,A,a as _}from"./C_NDl53k.js"
|
||||
import{C as U}from"./DZt01rzp.js"
|
||||
import{b as D}from"./CTPaZ9b5.js"
|
||||
import"./DrS-_GpA.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"],B={class:"app-info"},E={key:0,class:"app-price"},q={class:"app-title"},H={key:1,class:"app-description"},z={class:"app-actions"},N=["onClick"],S=["onClick"],F=["disabled"],G=["disabled"],W=["viewBox"],R=["cx","cy","r"],O=["d"],X={key:3,class:"carousel-indicators"},Z=["onClick"],Y=_(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
|
||||
const D=a([]),Y=a(!1),T=l(()=>({size:h.progressSize,viewBox:"0 0 24 24",centerX:12,centerY:12,radius:9})),J=e=>e.imageUrl?{backgroundImage:`url(${e.imageUrl})`}:e.imageId?{}:{background:"linear-gradient(135deg, #0078d4 0%, #106ebe 100%)"},K=e=>{var a
|
||||
if(null==(a=e.app)?void 0:a.bundleId)return A.getAppIconUrl(e.app.bundleId)},Q=e=>{e.target.style.display="none"},ee=(e,a)=>{b("action",e,a)},ae=(e=!1)=>{k.value<h.items.length-1?k.value++:k.value=0,e||re(),se(),i(()=>{ie()})},le=()=>{ae(!1)},te=()=>{k.value>0?k.value--:k.value=h.items.length-1,re(),se(),i(()=>{ie()})},se=()=>{h.items[k.value]&&b("slideChange",k.value,h.items[k.value])},ie=()=>{i(()=>{D.value.forEach((e,a)=>{e&&(a===k.value?e.play().catch(()=>{}):(e.pause(),e.currentTime=0))})})},ne=()=>{const e=T.value.centerX,a=T.value.centerY,l=T.value.radius
|
||||
if(w.value<=0)return""
|
||||
if(w.value>=100)return`M ${e} ${a} m -${l} 0 a ${l} ${l} 0 1 1 ${2*l} 0 a ${l} ${l} 0 1 1 -${2*l} 0`
|
||||
const t=(w.value/100*360-90)*Math.PI/180,s=e+l*Math.cos(t),i=a+l*Math.sin(t)
|
||||
return`M ${e} ${a} L ${e} ${a-l} A ${l} ${l} 0 ${w.value>50?1:0} 1 ${s} ${i} Z`},re=()=>{w.value=0,U=Date.now()},ce=()=>{Y.value=!0,ue()},oe=()=>{Y.value=!1,de()},ue=()=>{I||(I=!0,_&&(clearInterval(_),_=null))},de=()=>{if(!I)return
|
||||
if(!h.autoPlay||h.items.length<=1)return
|
||||
I=!1
|
||||
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(J(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",B,[e.price?(f(),r("div",E,m(e.price),1)):o("",!0),c("h2",q,m(e.title),1),e.description?(f(),r("p",H,m(e.description),1)):o("",!0)]),c("div",z,[e.primaryAction?(f(),r("button",{key:0,class:"action-button primary",onClick:a=>ee("primary",e)},m(e.primaryAction.label),9,N)):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:Y.value}]),onClick:te,disabled:0===k.value},[g(C,{icon:"mdi:triangle",class:"arrow-icon arrow-icon-left"})],10,F)):o("",!0),e.items.length>1?(f(),r("button",{key:1,class:v(["nav-arrow nav-arrow-right",{visible:Y.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:`${T.value.size}px`,height:`${T.value.size}px`})},[(f(),r("svg",{class:"progress-circle",viewBox:T.value.viewBox,xmlns:"http://www.w3.org/2000/svg"},[c("circle",{class:"progress-track",cx:T.value.centerX,cy:T.value.centerY,r:T.value.radius,fill:"rgba(255, 255, 255, 0.2)"},null,8,R),c("path",{class:"progress-bar",d:ne(),fill:"white"},null,8,O)],8,W))],4)):o("",!0),e.items.length>1?(f(),r("div",X,[(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,Z))),128))])):o("",!0)],32))}}),[["__scopeId","data-v-77596baf"]]),T={class:"right-sidebar"},J={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",T,[e.featuredAppData?(f(),r("div",J,[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
|
||||
const e=k.value
|
||||
return e.scrollWidth>e.clientWidth&&w.value<e.scrollWidth-e.clientWidth-1}),D=()=>{k.value&&(w.value=k.value.scrollLeft)},$=()=>{k.value&&k.value.scrollBy({left:-400,behavior:"smooth"})},j=()=>{k.value&&k.value.scrollBy({left:400,behavior:"smooth"})},V=e=>A.getAppIconUrl(e.bundleId),P=()=>{},M=e=>{const a=e.bundleId.toLowerCase()
|
||||
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"],Be={class:"featured-large-icon-wrapper"},Ee=["src","alt"],qe={key:1,class:"featured-large-icon-placeholder"},He={class:"featured-large-info"},ze={class:"featured-large-name"},Ne={class:"featured-large-desc"},Se=["onClick"],Fe={class:"category-right"},Ge={class:"category-grid"},We=["onClick"],Re={class:"category-icon"},Oe={class:"category-name"},Xe=_(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",Be,[t(e)?(f(),r("img",{key:0,src:t(e),alt:e.name,class:"featured-large-icon",onError:s},null,40,Ee)):(f(),r("div",qe,m(e.name.charAt(0).toUpperCase()),1))]),c("div",He,[c("h4",ze,m(e.name),1),c("p",Ne,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",Fe,[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",Oe,m(e.name),1)],8,We))),128))])])])]))}}),[["__scopeId","data-v-2970f815"]]),Ze={class:"app-list"},Ye={class:"search-header"},Te={class:"search-title"},Je={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=l(()=>t.query.search||""),_=l(()=>!!h.value),$=[{id:"all",label:"所有分类"},{id:"app",label:"应用"},{id:"game",label:"游戏"},{id:"mobile",label:"移动应用"}],j=a("all"),V=[{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"}],P=l(()=>n.value.filter(e=>"injected"===e.status||"upgrade_available"===e.status).slice(0,5)),M=l(()=>[{id:"test-banner",type:"image",imageUrl:"https://cn.bing.com/th?id=OHR.LagoonNebula_ZH-CN3890147543_1920x1080.jpg",title:"测试横幅",description:"这是一个测试横幅展示",price:"",primaryAction:{label:"了解更多",action:"view"}},...P.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}})]),x=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}))}),L=[["专业级应用,为您提供卓越的使用体验。","功能强大,界面简洁,操作便捷。","让您的工作和生活更加高效。"],["精心设计的应用,满足您的各种需求。","稳定可靠,性能优异,值得信赖。","为您带来全新的使用感受。"],["功能丰富,设计精美,体验流畅。","无论是工作还是娱乐,都能轻松应对。","让您的数字生活更加精彩。"],["强大的功能,简洁的界面,出色的性能。","为您提供专业级的解决方案。","让每一次使用都成为享受。"],["创新设计,卓越性能,完美体验。","满足您的专业需求和个人喜好。","让您的设备发挥最大潜力。"],["功能全面,操作简单,效果出色。","无论是新手还是专家都能轻松上手。","为您的工作和生活增添便利。"]],B=l(()=>{var e,a
|
||||
if(0===n.value.length)return
|
||||
const l=P.value[0]||n.value.find(e=>null!==e.update)||n.value[0]
|
||||
if(!l)return
|
||||
const t=l.hasIcon?A.getAppIconUrl(l.bundleId):void 0,s=(null==(e=l.update)?void 0:e.imageId)&&l.update.imageId.length>0?l.update.imageId[0]:void 0,i=(e=>{const a=(e=>{let a=0
|
||||
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 L[a%L.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}}),E=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
|
||||
const t=l.hasIcon?A.getAppIconUrl(l.bundleId):void 0,s=(null==(e=l.update)?void 0:e.imageId)&&l.update.imageId.length>0?l.update.imageId[0]:void 0,i=["JPG","PNG","GIF","HEIC","BMP","WEBP","TIFF","SVG","ICO","RAW","PSD","PDF"]
|
||||
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}}),q=l(()=>{let e=[...n.value]
|
||||
if(_.value&&h.value){const a=h.value.toLowerCase()
|
||||
e=e.filter(e=>e.name.toLowerCase().includes(a)||e.bundleId.toLowerCase().includes(a))}if(_.value&&"all"!==j.value)switch(j.value){case"injected":e=e.filter(e=>"injected"===e.status)
|
||||
break
|
||||
case"update":e=e.filter(e=>"upgrade_available"===e.status)
|
||||
break
|
||||
case"store":e=e.filter(e=>null!==e.update)}else if(!_.value){const a=t.query.filter
|
||||
if(a)switch(a){case"injected":e=e.filter(e=>"injected"===e.status)
|
||||
break
|
||||
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}),H=()=>{switch(t.query.filter){case"injected":return"已注入应用"
|
||||
case"update":return"可更新应用"
|
||||
case"unsupported":return"不支持的应用"
|
||||
case"store":return"应用商店"
|
||||
default:return"所有应用"}},z=()=>{switch(t.query.filter){case"store":return"浏览和下载应用更新版本"
|
||||
case"injected":return"已成功注入的应用列表"
|
||||
case"update":return"有新版本可用的应用"
|
||||
case"unsupported":return"当前版本不支持的应用"
|
||||
default:return"系统中所有已安装的应用"}},N=async()=>{u.value=!0,v.value=""
|
||||
try{const a=await A.getApps(),l=a.map(e=>e.bundleId)
|
||||
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]||[]
|
||||
return n.length>0?{...a,update:{...a.update,versions:n,latestVersion:(null==(l=n[0])?void 0:l.version)||(null==(t=a.update)?void 0:t.latestVersion)||"",hasUpdate:(null==(s=a.update)?void 0:s.hasUpdate)||!1,feedUrl:(null==(i=a.update)?void 0:i.feedUrl)||""}}:a}):n.value=a}catch(e){n.value=a}else n.value=a
|
||||
D(n.value).catch(e=>{})}catch(e){v.value="加载应用列表失败,请检查服务是否运行",n.value=[]}finally{u.value=!1}},S=async e=>{await N()},F=e=>{i.push(`/app/${e.bundleId}`)},G=e=>{},W=e=>{if(e.bundleId){const a=n.value.find(a=>a.bundleId===e.bundleId)
|
||||
a?F(a):i.push(`/app/${e.bundleId}`)}},R=(e,a)=>{const l="primary"===e?a.primaryAction:a.secondaryAction
|
||||
l&&(l.route?i.push(l.route):l.url?window.open(l.url,"_blank"):"update"===l.action&&a.app)},O=(e,a)=>{},X=e=>{}
|
||||
return s(()=>{N()}),(e,a)=>(f(),r("div",Ze,[_.value?(f(),r(d,{key:0},[c("div",Ye,[c("h2",Te,'"'+m(h.value)+'"',1)]),c("div",Je,[c("div",Ke,[(f(),r(d,null,p($,e=>c("button",{key:e.id,class:"filter-tag"},m(e.label),1)),64))]),g(U,{modelValue:j.value,"onUpdate:modelValue":a[0]||(a[0]=e=>j.value=e),options:V},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:N,class:"btn btn-primary"},"重试")])):0===q.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(q.value,e=>(f(),y(w,{key:e.bundleId,app:e,mode:"search","show-description":!0,onUpdated:S},null,8,["app"]))),128))]))],64)):(f(),r(d,{key:1},[c("div",ta,[M.value.length>0?(f(),y(Y,{key:0,items:M.value,"auto-play":!0,"auto-play-interval":5e3,onAction:R,onSlideChange:O},null,8,["items"])):o("",!0),g(he,{"entertainment-data":x.value,"image-viewer-data":E.value,"featured-app-data":B.value,onAppClick:W},null,8,["entertainment-data","image-viewer-data","featured-app-data"])]),P.value.length>0?(f(),y(je,{key:0,apps:P.value,onAppClick:F,onAction:G},null,8,["apps"])):o("",!0),P.value.length>0?(f(),y(Xe,{key:1,"featured-apps":P.value.slice(0,2),onAppClick:F,onAction:G,onCategoryClick:X},null,8,["featured-apps"])):o("",!0),c("div",sa,[c("div",ia,[c("h2",na,m(H()),1),c("p",ra,m(z()),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:N,class:"btn btn-primary"},"重试")])):0===q.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(q.value,e=>(f(),y(w,{key:e.bundleId,app:e,mode:"list",onUpdated:S},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(q.value.length),1)])])])])],64))]))}}),[["__scopeId","data-v-4ccd9b61"]])
|
||||
export{ha as default}
|
||||
1
frontend/dist/assets/H2Fevp83.css
vendored
Normal file
1
frontend/dist/assets/H2Fevp83.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.image-list[data-v-f368ecaf]{display:grid;grid-template-columns:repeat(var(--f589b9d6),1fr);gap:6px;margin-top:8px}.image-item[data-v-f368ecaf]{position:relative;width:100%;aspect-ratio:1;border-radius:6px;overflow:hidden;background:var(--bg-secondary);border:1px solid var(--border-light);cursor:pointer;transition:all .2s ease;max-width:var(--v08c50147)}.image-item[data-v-f368ecaf]:hover{transform:translateY(-2px);box-shadow:0 4px 12px #00000026;border-color:var(--primary-color)}.image-wrapper[data-v-f368ecaf]{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden}.image-wrapper img[data-v-f368ecaf]{width:100%;height:100%;object-fit:cover;transition:transform .3s ease}.image-wrapper:hover img[data-v-f368ecaf]{transform:scale(1.05)}.image-error[data-v-f368ecaf]{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;background:var(--bg-secondary);color:var(--text-tertiary);font-size:11px}.image-error[data-v-f368ecaf] svg{font-size:24px;opacity:.5}.image-index[data-v-f368ecaf]{position:absolute;bottom:4px;right:4px;background:#0009;color:#fff;font-size:11px;padding:2px 6px;border-radius:4px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}@media (max-width: 768px){.image-list[data-v-f368ecaf]{grid-template-columns:repeat(2,1fr);gap:6px}}
|
||||
1
frontend/dist/assets/XG6vN4_Y.css
vendored
Normal file
1
frontend/dist/assets/XG6vN4_Y.css
vendored
Normal file
File diff suppressed because one or more lines are too long
25
frontend/dist/assets/fAzknAlb.js
vendored
Normal file
25
frontend/dist/assets/fAzknAlb.js
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
import{d as e,r as a,o as s,k as l,m as t,g as n,l as o,v as c,F as i,y as u,c as d,u as r,b as v,B as p,N as m,t as b,I as y,e as f}from"./Cf-ihD4f.js"
|
||||
import{c as h,_ as I,T as g,A as k,a as C}from"./C_NDl53k.js"
|
||||
import{g as w,F as P}from"./6K6b4Qy_.js"
|
||||
const E={class:"discussion-forums-page"},q={class:"page-container"},F={key:0,class:"loading"},L={key:1,class:"error"},U={key:2,class:"builtin-forums-section"},A={key:0,class:"forums-grid builtin-grid"},_=["onClick"],j={class:"forum-icon-wrapper"},M={class:"forum-icon builtin-icon"},N=["src","alt","onError"],R={key:2,class:"icon-placeholder"},B={class:"forum-info"},D={class:"forum-name"},S={key:0,class:"forum-description"},T={key:1,class:"forum-stats"},$={class:"stat-item"},x={class:"stat-item"},G={key:1,class:"empty-state"},O={key:3,class:"app-forums-section"},z={key:0,class:"empty"},H={key:1,class:"forums-grid"},J=["onClick"],K={class:"forum-icon-wrapper"},Q={class:"forum-icon"},V=["src","alt","onLoad","onError"],W={class:"forum-info"},X={class:"forum-name"},Y={class:"forum-bundle-id"},Z={key:0,class:"forum-stats"},ee={class:"stat-item"},ae={class:"stat-item"},se={key:1,class:"forum-status-disabled"},le=["onClick","disabled"],te={key:4,class:"list-footer"},ne={class:"footer-stats"},oe={class:"stat-item"},ce={class:"stat-value"},ie=C(e({__name:"DiscussionForums",setup(e){const C=y(),ie=a([]),ue=a([]),de=a(!0),re=a(""),ve=a(new Map),pe=h(),me=a(new Map),be=a(new Set),ye=e=>me.value.get(e)||null,fe=async()=>{de.value=!0,re.value=""
|
||||
try{await(async()=>{try{const e=(await k.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)),ue.value=e,ue.value.forEach(e=>{"created"===e.type&&e.iconId&&(async(e,a)=>{if(!me.value.has(e)&&!be.value.has(e))try{const s=await k.getIcon(a)
|
||||
me.value.set(e,s),be.value.delete(e)}catch(s){be.value.add(e),me.value.delete(e)}})(e.bundleId,e.iconId)})}catch(e){ue.value=[]}})()
|
||||
const e=(await k.getApps()).filter(e=>e.path&&e.path.length>0),a=e.map(e=>e.bundleId),s=await k.getForumPermissionsBatch(a),l=new Map
|
||||
s.forEach(e=>{l.set(e.bundleId,e)})
|
||||
const t=e.map(e=>{const a=l.get(e.bundleId)
|
||||
return{bundleId:e.bundleId,name:e.name,iconUrl:k.getAppIconUrl(e.bundleId),iconLoaded:!1,iconError:!1,enabled:(null==a?void 0:a.enabled)??!1,requested:(null==a?void 0:a.hasRequest)&&(null==a?void 0:a.requestStatus)===P.PENDING,todayPostCount:(null==a?void 0:a.todayPostCount)??0,totalPostCount:(null==a?void 0:a.totalPostCount)??0}})
|
||||
ie.value=t,ie.value.sort((e,a)=>e.name.localeCompare(a.name))}catch(e){re.value="加载应用列表失败,请检查服务是否运行",ie.value=[]}finally{de.value=!1}},he=e=>{const a=ue.value.find(a=>a.bundleId===e)
|
||||
if(a&&("builtin"===a.type||"created"===a.type))return void C.push(`/discussion/${e}`)
|
||||
const s=ie.value.find(a=>a.bundleId===e)
|
||||
s&&s.enabled&&C.push(`/discussion/${e}`)}
|
||||
return s(async()=>{await(async()=>{try{const e=await k.getForumPermissions()
|
||||
ve.value.clear(),e.forEach(e=>{ve.value.set(e.bundleId,e)})}catch(e){ve.value.clear()}})(),await fe()}),(e,a)=>(f(),l(i,null,[t("div",E,[t("div",q,[a[6]||(a[6]=t("div",{class:"page-header"},[t("h1",{class:"page-title"},"讨论区"),t("p",{class:"page-description"},"浏览和参与已安装应用的讨论")],-1)),de.value?(f(),l("div",F,[...a[0]||(a[0]=[t("div",{class:"spinner"},null,-1),t("p",null,"加载板块中...",-1)])])):re.value?(f(),l("div",L,[t("p",null,c(re.value),1),t("button",{onClick:fe,class:"btn btn-primary"},"重试")])):o("",!0),de.value||re.value?o("",!0):(f(),l("div",U,[a[1]||(a[1]=t("h2",{class:"section-title"},"内置板块",-1)),ue.value.length>0?(f(),l("div",A,[(f(!0),l(i,null,u(ue.value,e=>(f(),l("div",{key:e.bundleId,class:"forum-card builtin-forum-card",onClick:a=>he(e.bundleId)},[t("div",j,[t("div",M,["builtin"===e.type?(f(),d(I,{key:0,icon:r(w)(e.bundleId),class:"builtin-icon-svg"},null,8,["icon"])):"created"===e.type&&e.iconId&&ye(e.bundleId)?(f(),l("img",{key:1,src:ye(e.bundleId),alt:e.name,class:"created-icon-img",onError:a=>{return s=e.bundleId,be.value.add(s),void me.value.delete(s)
|
||||
var s}},null,40,N)):(f(),l("div",R,c(e.name.charAt(0).toUpperCase()),1))])]),t("div",B,[t("h3",D,c(e.name),1),e.description?(f(),l("p",S,c(e.description),1)):o("",!0),void 0!==e.todayPostCount||void 0!==e.totalPostCount?(f(),l("div",T,[t("span",$,[n(I,{icon:"fluent-color:news-28",class:"stat-icon"}),t("span",null,"今日发帖:"+c(e.todayPostCount??0),1)]),t("span",x,[n(I,{icon:"fluent-color:reward-24",class:"stat-icon"}),t("span",null,"总发帖数:"+c(e.totalPostCount??0),1)])])):o("",!0)])],8,_))),128))])):(f(),l("div",G,[n(I,{icon:"mdi:forum-outline",class:"empty-icon"}),t("p",null,"暂无内置板块(调试:已加载 "+c(ue.value.length)+" 个)",1)]))])),de.value||re.value?o("",!0):(f(),l("div",O,[a[4]||(a[4]=t("h2",{class:"section-title"},"应用板块",-1)),0===ie.value.length?(f(),l("div",z,[n(I,{icon:"fluent-color:chat-bubbles-question-24",class:"empty-icon"}),a[2]||(a[2]=t("p",null,"没有找到讨论板块",-1)),a[3]||(a[3]=t("p",{class:"empty-hint"},"系统中没有已安装的应用",-1))])):(f(),l("div",H,[(f(!0),l(i,null,u(ie.value,e=>(f(),l("div",{key:e.bundleId,class:v(["forum-card",{disabled:!e.enabled}]),onClick:a=>e.enabled?he(e.bundleId):null},[t("div",K,[t("div",Q,[e.iconUrl?p((f(),l("img",{key:0,src:e.iconUrl,alt:e.name,onLoad:a=>(e=>{const a=ie.value.find(a=>a.bundleId===e)
|
||||
a&&(a.iconLoaded=!0)})(e.bundleId),onError:a=>(e=>{const a=ie.value.find(a=>a.bundleId===e)
|
||||
a&&(a.iconError=!0,a.iconLoaded=!0)})(e.bundleId)},null,40,V)),[[m,e.iconLoaded&&!e.iconError]]):o("",!0),p(t("div",{class:"icon-placeholder"},c(e.name.charAt(0).toUpperCase()),513),[[m,!e.iconUrl||!e.iconLoaded||e.iconError]])])]),t("div",W,[t("h3",X,c(e.name),1),t("p",Y,c(e.bundleId),1),!e.enabled||void 0===e.todayPostCount&&void 0===e.totalPostCount?o("",!0):(f(),l("div",Z,[t("span",ee,[n(I,{icon:"fluent-color:news-28",class:"stat-icon"}),t("span",null,"今日发帖:"+c(e.todayPostCount??0),1)]),t("span",ae,[n(I,{icon:"fluent-color:reward-24",class:"stat-icon"}),t("span",null,"总发帖数:"+c(e.totalPostCount??0),1)])])),e.enabled?o("",!0):(f(),l("p",se,"未开放")),e.enabled?o("",!0):(f(),l("button",{key:2,class:"request-open-btn",onClick:b(a=>(async e=>{var a,s
|
||||
const l=ie.value.find(a=>a.bundleId===e)
|
||||
if(l&&!l.requested)try{const a=await k.requestForumOpen(e,l.name)
|
||||
a.success?(l.requested=!0,pe.success("申请提交成功,等待管理员审核")):pe.error(a.message||"申请失败,请稍后重试")}catch(t){const e=(null==(s=null==(a=t.response)?void 0:a.data)?void 0:s.message)||t.message||"申请失败,请稍后重试"
|
||||
pe.error(e)}})(e.bundleId),["stop"]),disabled:e.requested},c(e.requested?"等待申请结果中":"申请开放"),9,le))])],10,J))),128))]))])),ie.value.length>0?(f(),l("div",te,[t("div",ne,[t("span",oe,[a[5]||(a[5]=t("span",{class:"stat-label"},"应用板块:",-1)),t("span",ce,c(ie.value.length),1)])])])):o("",!0)])]),n(g,{toasts:r(pe).toasts.value,onRemove:r(pe).removeToast},null,8,["toasts","onRemove"])],64))}}),[["__scopeId","data-v-796923df"]])
|
||||
export{ie as default}
|
||||
1
frontend/dist/assets/i5pZ5jEX.css
vendored
Normal file
1
frontend/dist/assets/i5pZ5jEX.css
vendored
Normal file
File diff suppressed because one or more lines are too long
31
frontend/dist/assets/index-08137Aqg.js
vendored
31
frontend/dist/assets/index-08137Aqg.js
vendored
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/index-DYlHKrdo.css
vendored
1
frontend/dist/assets/index-DYlHKrdo.css
vendored
File diff suppressed because one or more lines are too long
17
frontend/dist/assets/pYCxXVca.js
vendored
Normal file
17
frontend/dist/assets/pYCxXVca.js
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
import{A as a}from"./DUMqsWsK.js"
|
||||
import{_ as s,A as e,a as l}from"./C_NDl53k.js"
|
||||
import{b as t}from"./CTPaZ9b5.js"
|
||||
import{d as n,r as p,o as d,k as o,m as i,l as c,v as r,g as u,F as v,y as m,c as y,e as b}from"./Cf-ihD4f.js"
|
||||
import"./DrS-_GpA.js"
|
||||
const f={class:"apps-page"},h={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),C=p(""),x=async()=>{w.value=!0,C.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){C.value="加载应用列表失败,请检查服务是否运行",n.value=[]}finally{w.value=!1}},E=async a=>{await x()}
|
||||
return d(()=>{x()}),(e,l)=>(b(),o("div",f,[i("div",h,[l[4]||(l[4]=i("div",{class:"page-header"},[i("h1",{class:"page-title"},"所有应用"),i("p",{class:"page-description"},"系统中所有已安装的应用")],-1)),w.value?(b(),o("div",g,[...l[0]||(l[0]=[i("div",{class:"spinner"},null,-1),i("p",null,"加载应用中...",-1)])])):C.value?(b(),o("div",k,[i("p",null,r(C.value),1),i("button",{onClick:x,class:"btn btn-primary"},"重试")])):0===n.value.length?(b(),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))])):(b(),o("div",j,[(b(!0),o(v,null,m(n.value,s=>(b(),y(a,{key:s.bundleId,app:s,mode:"list",onUpdated:E},null,8,["app"]))),128))])),n.value.length>0?(b(),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}
|
||||
1
frontend/dist/assets/pjFLbtwi.css
vendored
Normal file
1
frontend/dist/assets/pjFLbtwi.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.custom-select-wrapper[data-v-3ceed415]{position:relative;min-width:160px;z-index:1}.custom-select[data-v-3ceed415]{position:relative;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-select.open .select-selected[data-v-3ceed415]{border-color:var(--primary-color);box-shadow:0 0 0 3px rgba(var(--primary-color-rgb),.1)}.custom-select.open .select-arrow[data-v-3ceed415]{transform:rotate(180deg)}.select-selected[data-v-3ceed415]{display:flex;align-items:center;gap:8px;padding:10px 14px;border:1px solid var(--border-light);border-radius:8px;background:var(--bg-secondary);color:var(--text-primary);font-size:14px;font-weight:500;transition:all .2s ease;height:40px;box-sizing:border-box}.select-selected[data-v-3ceed415]:hover{border-color:var(--primary-color);background:var(--bg-hover)}.select-icon[data-v-3ceed415]{font-size:18px;color:var(--text-secondary);flex-shrink:0}.select-arrow[data-v-3ceed415]{margin-left:auto;font-size:16px;color:var(--text-tertiary);transition:transform .2s ease;flex-shrink:0}.select-arrow.rotated[data-v-3ceed415]{transform:rotate(180deg)}.select-dropdown[data-v-3ceed415]{position:fixed;background:var(--bg-card);background-color:var(--bg-card);border:1px solid var(--border-light);border-radius:8px;box-shadow:0 4px 16px #00000026,0 2px 8px #0000001a;z-index:10001;overflow:hidden;max-height:300px;overflow-y:auto}.select-option[data-v-3ceed415]{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;transition:all .2s ease;color:var(--text-primary);font-size:14px}.select-option[data-v-3ceed415]:hover{background:var(--bg-secondary)}.select-option.active[data-v-3ceed415]{background:rgba(var(--primary-color-rgb),.1);color:var(--primary-color);font-weight:500}.select-option.active .option-icon[data-v-3ceed415]{color:var(--primary-color)}.select-option .option-icon[data-v-3ceed415]{font-size:18px;color:var(--text-secondary);flex-shrink:0}.select-option .option-check[data-v-3ceed415]{margin-left:auto;font-size:16px;color:var(--primary-color);flex-shrink:0}.dropdown-fade-enter-active[data-v-3ceed415],.dropdown-fade-leave-active[data-v-3ceed415]{transition:opacity .2s ease,transform .2s ease}.dropdown-fade-enter-from[data-v-3ceed415],.dropdown-fade-leave-to[data-v-3ceed415]{opacity:0;transform:translateY(-8px)}
|
||||
1
frontend/dist/assets/u03bkUTR.css
vendored
Normal file
1
frontend/dist/assets/u03bkUTR.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.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}
|
||||
1
frontend/dist/assets/uScsWnzu.css
vendored
Normal file
1
frontend/dist/assets/uScsWnzu.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/vZ2P8W--.css
vendored
Normal file
1
frontend/dist/assets/vZ2P8W--.css
vendored
Normal file
File diff suppressed because one or more lines are too long
26
frontend/dist/assets/xfPxXP8V.js
vendored
Normal file
26
frontend/dist/assets/xfPxXP8V.js
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
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,R as m,e as p,n as f}from"./Cf-ihD4f.js"
|
||||
import{b as g,_ as w,A as y,U as h,a as b}from"./C_NDl53k.js"
|
||||
const k=["src"],L=["src"],R=["src"],_=["disabled"],z=["disabled"],U={key:1,class:"avatar-menu-item uploading"},E=b(e({__name:"AvatarUpload",props:{modelValue:{},size:{default:80},disabled:{type:Boolean,default:!1}},emits:["update:modelValue","change"],setup(e,{emit:b}){m(e=>({v6394d537:E.size+"px"}))
|
||||
const E=e,I=b,T=a(null),V=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
|
||||
E.disabled||null==(e=T.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("请选择图片文件")
|
||||
if(l.size>10485760)return void alert("图片大小不能超过10MB")
|
||||
const t=new FileReader
|
||||
t.onload=e=>{var a
|
||||
C.value=null==(a=e.target)?void 0:a.result},t.readAsDataURL(l),A.value=l,await F(l)},F=async e=>{var a,l,t
|
||||
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
|
||||
I("update:modelValue",e),I("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}},$=()=>{E.disabled||(A.value=null,C.value="",M.value="",x.value=!1,I("update:modelValue",""),I("change",""),T.value&&(T.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},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||!V.value||!j.value)return
|
||||
const e=V.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&&f(()=>{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)=>(p(),s("div",{class:"avatar-upload",onMouseenter:G,onMouseleave:J},[i("div",{ref_key:"avatarPreviewRef",ref:V,class:"avatar-preview"},[x.value&&M.value?(p(),s("img",{key:0,src:M.value,alt:"云端图标",class:"preview-image"},null,8,k)):C.value?(p(),s("img",{key:1,src:C.value,alt:"图标预览",class:"preview-image"},null,8,L)):(p(),n(g,{key:2,"avatar-id":e.modelValue,width:e.size,height:e.size,onLoad:D},null,8,["avatar-id","width","height"])),M.value&&!x.value?(p(),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:T,type:"file",accept:"image/*",onChange:P,class:"file-input",style:{display:"none"}},null,544),(p(),n(c,{to:"body"},[r(o,{name:"avatar-menu-fade"},{default:d(()=>[B.value?(p(),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?(p(),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?(p(),s("div",U,[...l[0]||(l[0]=[i("div",{class:"spinner-small"},null,-1)])])):v("",!0)],544)):v("",!0)]),_:1})]))],32))}}),[["__scopeId","data-v-6e1ea79a"]])
|
||||
export{E as A}
|
||||
5
frontend/dist/index.html
vendored
5
frontend/dist/index.html
vendored
@@ -5,8 +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/index-08137Aqg.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-DYlHKrdo.css">
|
||||
<script type="module" crossorigin src="/assets/C_NDl53k.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="/assets/Cf-ihD4f.js">
|
||||
<link rel="stylesheet" crossorigin href="/assets/BQlUPjYn.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
||||
Reference in New Issue
Block a user