Files
CoreInject/frontend/dist/assets/Cw0npQhr.js
QiuChenly 8394c93e6c 性能优化、错误修复
### 后端更新

性能优化
- Redis、数据库索引优化, 复杂联表查询查询速度从10秒降低到500ms

功能增强
- 统一文件上传 API
- 论坛权限管理优化

### 前端更新

问题修复
- 统一错误提示、组件复用、图标本地化、密码加密传输、大文件分片上传

新增功能
- 全局通知系统、WebSocket 实时消息、图标批量同步、IP 封禁管理、应用版本批量查询、头像上传、TypeScript 类型完善、讨论区功能增强

代码优化
- 删除冗余组件、统一 API 错误处理、优化代码结构、统一 UI 风格
2025-11-13 03:02:01 +08:00

216 lines
71 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{d as e,r as a,f as l,w as s,k as n,l as t,m as i,g as o,b as u,A as c,B as r,N as d,v,F as p,y as m,C as y,O as b,q as g,c as h,t as k,e as f,o as w,I,p as C,H as A,j as U,u as x,i as N,n as L,a as V,G as _}from"./Cf-ihD4f.js"
import{A as S,_ as T,U as M,a as R,b as $,u as D,c as E,M as B,V as j,L as F,d as q}from"./C_NDl53k.js"
import{u as P,L as z}from"./DrS-_GpA.js"
import{F as O}from"./6K6b4Qy_.js"
import{I as H}from"./DHc4z5Hj.js"
import{I as G}from"./Dl86DKZJ.js"
import{U as W}from"./BkWv3AV-.js"
import{u as K}from"./8cORuAeG.js"
const Y={class:"dialog-header"},J={class:"dialog-tabs"},Q={class:"dialog-content"},X={class:"tab-content"},Z={class:"upload-card"},ee={class:"card-header"},ae={class:"card-badge"},le={class:"card-body"},se={key:1,class:"screenshots-grid"},ne=["src","alt"],te=["onClick"],ie={key:0,class:"thumbnail-badge"},oe={class:"thumbnail-number"},ue={class:"tab-content"},ce={class:"form-card"},re={class:"card-header"},de={class:"card-body"},ve={class:"app-header-section"},pe={class:"icon-section"},me={class:"app-icon-display"},ye=["src","alt"],be={class:"icon-upload-control"},ge={key:0,class:"icon-status"},he={class:"name-section"},ke={class:"form-group"},fe={class:"form-group"},we={class:"form-group"},Ie={class:"form-group"},Ce={class:"form-group"},Ae={class:"checkbox-label"},Ue={class:"tab-content"},xe={class:"form-card"},Ne={class:"card-header"},Le={class:"card-body"},Ve={class:"array-field"},_e={class:"field-header"},Se={key:0,class:"empty-state"},Te={key:1,class:"array-items"},Me=["onUpdate:modelValue","placeholder"],Re=["onClick"],$e={class:"array-field"},De={class:"field-header"},Ee={key:0,class:"empty-state"},Be={key:1,class:"array-items"},je=["onUpdate:modelValue"],Fe=["onClick"],qe={class:"array-field"},Pe={class:"field-header"},ze={key:0,class:"empty-state"},Oe={key:1,class:"array-items"},He=["onUpdate:modelValue"],Ge=["onClick"],We={class:"array-field"},Ke={class:"field-header"},Ye={key:0,class:"empty-state"},Je={key:1,class:"array-items"},Qe=["onUpdate:modelValue"],Xe=["onClick"],Ze={class:"array-field"},ea={class:"field-header"},aa={key:0,class:"empty-state"},la={key:1,class:"array-items"},sa=["onUpdate:modelValue"],na=["onClick"],ta={class:"array-field"},ia={class:"field-header"},oa={key:0,class:"empty-state"},ua={key:1,class:"array-items"},ca=["onUpdate:modelValue"],ra=["onClick"],da={key:0,class:"upload-progress-bar"},va={class:"progress-info"},pa={class:"progress-text"},ma={class:"progress-percent"},ya={class:"progress-bar"},ba={key:1,class:"error-banner"},ga={class:"dialog-footer"},ha=["disabled"],ka=["disabled"],fa=R(e({__name:"AppInfoUploadDialog",props:{visible:{type:Boolean},app:{}},emits:["close","success"],setup(e,{emit:w}){const I=e,C=w,A=a("images"),U=a(null),x=a(null),N=a({bundleId:"",appName:"",appVersion:"",description:"",permissions:[],compatibility:[],architecture:[],language:[],category:[],developer:[],isDMCAed:!1}),L=a(null),V=a([]),_=a(!1),R=a(0),$=a(""),D=a(""),E=l(()=>!_.value&&""!==N.value.appName.trim())
l(()=>L.value?L.value.thumbnailUrl||L.value.preview:"")
const B=l(()=>L.value&&L.value.preview?L.value.preview:I.app?S.getAppIconUrl(I.app.bundleId):"")
s(()=>I.app,e=>{e&&(N.value.bundleId=e.bundleId,N.value.appName=e.name,N.value.appVersion=e.version)},{immediate:!0}),s(()=>I.visible,e=>{e&&(A.value="images")})
const j=()=>{var e
null==(e=U.value)||e.click()},F=e=>{var a
const l=null==(a=e.target.files)?void 0:a[0]
if(!l)return
const s=new FileReader
s.onload=e=>{var a
const s=null==(a=e.target)?void 0:a.result
L.value={file:l,preview:s}},s.readAsDataURL(l)},q=()=>{var e
null==(e=x.value)||e.click()},P=e=>{const a=e.target.files
if(!a)return
const l=5-V.value.length
Array.from(a).slice(0,l).forEach(e=>{const a=new FileReader
a.onload=a=>{var l
V.value.push({file:e,preview:null==(l=a.target)?void 0:l.result})},a.readAsDataURL(e)}),x.value&&(x.value.value="")},z=e=>{const a=N.value[e]
Array.isArray(a)&&a.push("")},O=(e,a)=>{const l=N.value[e]
Array.isArray(l)&&l.splice(a,1)},H=async()=>{var e,a
if(E.value){D.value="",_.value=!0,R.value=0,$.value="准备上传..."
try{let s="",n=null
if(L.value&&L.value.file)n=L.value.file
else{if(!I.app)throw new Error("请先选择应用图标或确保当前应用存在")
$.value="正在获取应用图标...",R.value=5
try{const e=S.getAppIconUrl(I.app.bundleId),a=await fetch(e)
if(!a.ok)throw new Error("获取应用图标失败")
const l=await a.blob()
n=new File([l],`${I.app.bundleId}.png`,{type:l.type||"image/png"})}catch(l){throw new Error(`获取应用图标失败: ${l.message||"未知错误"}`)}}if(!n)throw new Error("无法获取图标文件")
$.value="正在上传图标...",R.value=10
const t=await S.uploadFile(M.APP_ICON,n)
if(!t.success||!(null==(e=t.data)?void 0:e.fileId))throw new Error(t.message||"上传图标失败")
s=t.data.fileId,R.value=30,$.value="正在上传截图..."
const i=[]
for(let e=0;e<V.value.length;e++){const l=V.value[e]
R.value=30+e/V.value.length*30,$.value=`正在上传截图 ${e+1}/${V.value.length}...`
const s=await S.uploadFile(M.APP_IMAGE,l.file)
s.success&&(null==(a=s.data)?void 0:a.fileId)&&i.push(s.data.fileId)}R.value=60,$.value="正在提交应用信息..."
const o=(new Date).toISOString(),u={bundleId:N.value.bundleId,appName:N.value.appName.trim(),appVersion:N.value.appVersion,iconId:s,imageId:i,description:N.value.description.trim(),permissions:N.value.permissions.filter(e=>""!==e.trim()),releaseDate:o,updateDate:o,compatibility:N.value.compatibility.filter(e=>""!==e.trim()),architecture:N.value.architecture.filter(e=>""!==e.trim()),language:N.value.language.filter(e=>""!==e.trim()),category:N.value.category.filter(e=>""!==e.trim()),developer:N.value.developer.filter(e=>""!==e.trim()),isDMCAed:N.value.isDMCAed}
R.value=80
const c=await S.uploadAppInfo(u)
if(!c.success)throw new Error(c.message||"上传应用信息失败")
R.value=100,$.value="上传成功!",setTimeout(()=>{C("success"),G()},500)}catch(l){D.value=l.message||"上传失败,请重试"}finally{_.value=!1}}},G=()=>{var e,a,l
_.value||(C("close"),N.value={bundleId:(null==(e=I.app)?void 0:e.bundleId)||"",appName:(null==(a=I.app)?void 0:a.name)||"",appVersion:(null==(l=I.app)?void 0:l.version)||"",description:"",permissions:[],compatibility:[],architecture:[],language:[],category:[],developer:[],isDMCAed:!1},L.value=null,V.value=[],D.value="",R.value=0,$.value="",A.value="images")},W=e=>{e.target!==e.currentTarget||_.value||G()}
return(a,l)=>e.visible?(f(),n("div",{key:0,class:"dialog-overlay",onClick:W},[i("div",{class:"dialog-container",onClick:l[14]||(l[14]=k(()=>{},["stop"]))},[i("div",Y,[l[15]||(l[15]=i("h2",{class:"dialog-title"},"上传应用信息",-1)),i("button",{class:"dialog-close",onClick:G},[o(T,{icon:"mdi:close"})])]),i("div",J,[i("button",{class:u(["tab-button",{active:"images"===A.value}]),onClick:l[0]||(l[0]=e=>A.value="images")},[o(T,{icon:"mdi:image",class:"tab-icon"}),l[16]||(l[16]=c(" 图片 ",-1))],2),i("button",{class:u(["tab-button",{active:"basic"===A.value}]),onClick:l[1]||(l[1]=e=>A.value="basic")},[o(T,{icon:"mdi:information",class:"tab-icon"}),l[17]||(l[17]=c(" 基本信息 ",-1))],2),i("button",{class:u(["tab-button",{active:"details"===A.value}]),onClick:l[2]||(l[2]=e=>A.value="details")},[o(T,{icon:"mdi:format-list-bulleted",class:"tab-icon"}),l[18]||(l[18]=c(" 详细信息 ",-1))],2)]),i("div",Q,[r(i("div",X,[i("div",Z,[i("div",ee,[o(T,{icon:"mdi:image-multiple",class:"card-icon"}),l[19]||(l[19]=i("h3",null,"应用截图",-1)),i("span",ae,v(V.value.length)+"/5",1)]),i("div",le,[i("input",{ref_key:"screenshotInput",ref:x,type:"file",accept:"image/*",multiple:"",onChange:P,class:"file-input",style:{display:"none"}},null,544),0===V.value.length?(f(),n("div",{key:0,class:"upload-area",onClick:q},[o(T,{icon:"mdi:image-multiple-outline",class:"upload-icon"}),l[20]||(l[20]=i("p",{class:"upload-text"},"点击选择截图",-1)),l[21]||(l[21]=i("p",{class:"upload-hint"},"最多可选择5张图片",-1))])):(f(),n("div",se,[(f(!0),n(p,null,m(V.value,(e,a)=>(f(),n("div",{key:a,class:"thumbnail-box"},[i("img",{src:e.thumbnailUrl||e.preview,alt:`截图${a+1}`},null,8,ne),i("button",{onClick:e=>(e=>{V.value.splice(e,1)})(a),class:"thumbnail-remove"},[o(T,{icon:"mdi:close"})],8,te),e.fileId?(f(),n("div",ie,[o(T,{icon:"mdi:check-circle"})])):t("",!0),i("div",oe,v(a+1),1)]))),128)),V.value.length<5?(f(),n("div",{key:0,class:"thumbnail-box add-more",onClick:q},[o(T,{icon:"mdi:plus",class:"add-icon"}),l[22]||(l[22]=i("p",null,"添加更多",-1))])):t("",!0)]))])])],512),[[d,"images"===A.value]]),r(i("div",ue,[i("div",ce,[i("div",re,[o(T,{icon:"mdi:information",class:"card-icon"}),l[23]||(l[23]=i("h3",null,"基本信息",-1))]),i("div",de,[i("div",ve,[i("div",pe,[i("div",me,[i("img",{src:B.value,alt:N.value.appName||"应用图标"},null,8,ye)]),i("div",be,[i("input",{ref_key:"iconInput",ref:U,type:"file",accept:"image/*",onChange:F,class:"file-input",style:{display:"none"}},null,544),i("button",{onClick:j,class:"btn-icon-upload"},[o(T,{icon:"mdi:image-edit",class:"btn-icon"}),c(" "+v(L.value?"更换图标":"上传图标"),1)]),L.value?(f(),n("div",ge,[o(T,{icon:"mdi:check-circle",class:"status-icon success"}),l[24]||(l[24]=i("span",null,"已选择图标",-1))])):t("",!0)])]),i("div",he,[i("div",ke,[l[25]||(l[25]=i("label",{class:"form-label"},[c(" 应用名称 "),i("span",{class:"required"},"*")],-1)),r(i("input",{"onUpdate:modelValue":l[3]||(l[3]=e=>N.value.appName=e),type:"text",placeholder:"请输入应用名称",required:"",class:"form-input"},null,512),[[y,N.value.appName]])]),i("div",fe,[l[26]||(l[26]=i("label",{class:"form-label"},"版本号",-1)),r(i("input",{"onUpdate:modelValue":l[4]||(l[4]=e=>N.value.appVersion=e),type:"text",readonly:"",class:"form-input readonly-input"},null,512),[[y,N.value.appVersion]])])])]),i("div",we,[l[27]||(l[27]=i("label",{class:"form-label"},"Bundle ID",-1)),r(i("input",{"onUpdate:modelValue":l[5]||(l[5]=e=>N.value.bundleId=e),type:"text",readonly:"",class:"form-input readonly-input"},null,512),[[y,N.value.bundleId]])]),i("div",Ie,[l[28]||(l[28]=i("label",{class:"form-label"},"应用描述",-1)),r(i("textarea",{"onUpdate:modelValue":l[6]||(l[6]=e=>N.value.description=e),placeholder:"请输入应用描述...",rows:"5",class:"form-textarea"},null,512),[[y,N.value.description]])]),i("div",Ce,[i("label",Ae,[r(i("input",{"onUpdate:modelValue":l[7]||(l[7]=e=>N.value.isDMCAed=e),type:"checkbox"},null,512),[[b,N.value.isDMCAed]]),l[29]||(l[29]=i("span",null,"是否被DMCA",-1))])])])])],512),[[d,"basic"===A.value]]),r(i("div",Ue,[i("div",xe,[i("div",Ne,[o(T,{icon:"mdi:format-list-bulleted",class:"card-icon"}),l[30]||(l[30]=i("h3",null,"详细信息",-1))]),i("div",Le,[i("div",Ve,[i("div",_e,[l[32]||(l[32]=i("label",null,"权限列表",-1)),i("button",{onClick:l[8]||(l[8]=e=>z("permissions")),class:"btn-icon-text"},[o(T,{icon:"mdi:plus"}),l[31]||(l[31]=c(" 添加 ",-1))])]),0===N.value.permissions.length?(f(),n("div",Se,[o(T,{icon:"mdi:shield-off",class:"empty-icon"}),l[33]||(l[33]=i("p",null,"暂无权限信息",-1))])):(f(),n("div",Te,[(f(!0),n(p,null,m(N.value.permissions,(e,a)=>(f(),n("div",{key:a,class:"array-item-row"},[r(i("input",{"onUpdate:modelValue":e=>N.value.permissions[a]=e,type:"text",placeholder:`权限 ${a+1}`},null,8,Me),[[y,N.value.permissions[a]]]),i("button",{onClick:e=>O("permissions",a),class:"btn-icon-danger"},[o(T,{icon:"mdi:delete"})],8,Re)]))),128))]))]),i("div",$e,[i("div",De,[l[35]||(l[35]=i("label",null,"系统兼容性",-1)),i("button",{onClick:l[9]||(l[9]=e=>z("compatibility")),class:"btn-icon-text"},[o(T,{icon:"mdi:plus"}),l[34]||(l[34]=c(" 添加 ",-1))])]),0===N.value.compatibility.length?(f(),n("div",Ee,[o(T,{icon:"mdi:desktop-classic",class:"empty-icon"}),l[36]||(l[36]=i("p",null,"暂无兼容性信息",-1))])):(f(),n("div",Be,[(f(!0),n(p,null,m(N.value.compatibility,(e,a)=>(f(),n("div",{key:a,class:"array-item-row"},[r(i("input",{"onUpdate:modelValue":e=>N.value.compatibility[a]=e,type:"text",placeholder:"例如: macOS 10.15"},null,8,je),[[y,N.value.compatibility[a]]]),i("button",{onClick:e=>O("compatibility",a),class:"btn-icon-danger"},[o(T,{icon:"mdi:delete"})],8,Fe)]))),128))]))]),i("div",qe,[i("div",Pe,[l[38]||(l[38]=i("label",null,"系统架构",-1)),i("button",{onClick:l[10]||(l[10]=e=>z("architecture")),class:"btn-icon-text"},[o(T,{icon:"mdi:plus"}),l[37]||(l[37]=c(" 添加 ",-1))])]),0===N.value.architecture.length?(f(),n("div",ze,[o(T,{icon:"mdi:cpu-64-bit",class:"empty-icon"}),l[39]||(l[39]=i("p",null,"暂无架构信息",-1))])):(f(),n("div",Oe,[(f(!0),n(p,null,m(N.value.architecture,(e,a)=>(f(),n("div",{key:a,class:"array-item-row"},[r(i("input",{"onUpdate:modelValue":e=>N.value.architecture[a]=e,type:"text",placeholder:"例如: x86_64, arm64"},null,8,He),[[y,N.value.architecture[a]]]),i("button",{onClick:e=>O("architecture",a),class:"btn-icon-danger"},[o(T,{icon:"mdi:delete"})],8,Ge)]))),128))]))]),i("div",We,[i("div",Ke,[l[41]||(l[41]=i("label",null,"支持语言",-1)),i("button",{onClick:l[11]||(l[11]=e=>z("language")),class:"btn-icon-text"},[o(T,{icon:"mdi:plus"}),l[40]||(l[40]=c(" 添加 ",-1))])]),0===N.value.language.length?(f(),n("div",Ye,[o(T,{icon:"mdi:translate",class:"empty-icon"}),l[42]||(l[42]=i("p",null,"暂无语言信息",-1))])):(f(),n("div",Je,[(f(!0),n(p,null,m(N.value.language,(e,a)=>(f(),n("div",{key:a,class:"array-item-row"},[r(i("input",{"onUpdate:modelValue":e=>N.value.language[a]=e,type:"text",placeholder:"例如: English, Chinese"},null,8,Qe),[[y,N.value.language[a]]]),i("button",{onClick:e=>O("language",a),class:"btn-icon-danger"},[o(T,{icon:"mdi:delete"})],8,Xe)]))),128))]))]),i("div",Ze,[i("div",ea,[l[44]||(l[44]=i("label",null,"应用分类",-1)),i("button",{onClick:l[12]||(l[12]=e=>z("category")),class:"btn-icon-text"},[o(T,{icon:"mdi:plus"}),l[43]||(l[43]=c(" 添加 ",-1))])]),0===N.value.category.length?(f(),n("div",aa,[o(T,{icon:"mdi:folder",class:"empty-icon"}),l[45]||(l[45]=i("p",null,"暂无分类信息",-1))])):(f(),n("div",la,[(f(!0),n(p,null,m(N.value.category,(e,a)=>(f(),n("div",{key:a,class:"array-item-row"},[r(i("input",{"onUpdate:modelValue":e=>N.value.category[a]=e,type:"text",placeholder:"例如: Productivity, Games"},null,8,sa),[[y,N.value.category[a]]]),i("button",{onClick:e=>O("category",a),class:"btn-icon-danger"},[o(T,{icon:"mdi:delete"})],8,na)]))),128))]))]),i("div",ta,[i("div",ia,[l[47]||(l[47]=i("label",null,"开发者",-1)),i("button",{onClick:l[13]||(l[13]=e=>z("developer")),class:"btn-icon-text"},[o(T,{icon:"mdi:plus"}),l[46]||(l[46]=c(" 添加 ",-1))])]),0===N.value.developer.length?(f(),n("div",oa,[o(T,{icon:"mdi:account",class:"empty-icon"}),l[48]||(l[48]=i("p",null,"暂无开发者信息",-1))])):(f(),n("div",ua,[(f(!0),n(p,null,m(N.value.developer,(e,a)=>(f(),n("div",{key:a,class:"array-item-row"},[r(i("input",{"onUpdate:modelValue":e=>N.value.developer[a]=e,type:"text",placeholder:"例如: Apple Inc."},null,8,ca),[[y,N.value.developer[a]]]),i("button",{onClick:e=>O("developer",a),class:"btn-icon-danger"},[o(T,{icon:"mdi:delete"})],8,ra)]))),128))]))])])])],512),[[d,"details"===A.value]]),_.value?(f(),n("div",da,[i("div",va,[o(T,{icon:"mdi:cloud-upload",class:"progress-icon"}),i("span",pa,v($.value),1),i("span",ma,v(R.value)+"%",1)]),i("div",ya,[i("div",{class:"progress-fill",style:g({width:`${R.value}%`})},null,4)])])):t("",!0),D.value?(f(),n("div",ba,[o(T,{icon:"mdi:alert-circle",class:"error-icon"}),i("span",null,v(D.value),1)])):t("",!0)]),i("div",ga,[i("button",{onClick:G,class:"btn btn-secondary",disabled:_.value}," 取消 ",8,ha),i("button",{onClick:H,class:"btn btn-primary",disabled:_.value||!E.value},[_.value?(f(),h(T,{key:0,icon:"mdi:loading",class:"btn-icon spinning"})):t("",!0),c(" "+v(_.value?"上传中...":"确认上传"),1)],8,ka)])])])):t("",!0)}}),[["__scopeId","data-v-b311a51c"]]),wa={class:"app-recommendations"},Ia={class:"recommendations-header"},Ca={key:0,class:"loading"},Aa={key:1,class:"error"},Ua={key:2,class:"empty"},xa={key:3,class:"recommendations-list"},Na=["onClick"],La={class:"app-icon-small"},Va=["src","alt"],_a={key:1,class:"icon-placeholder-small"},Sa={class:"app-info-small"},Ta={class:"app-name-small"},Ma=["onClick"],Ra=R(e({__name:"AppRecommendations",props:{currentBundleId:{}},setup(e){const l=e,s=I(),t=a([]),u=a(!0),c=a(""),r=e=>{const a=e.target
a.style.display="none"
const l=a.nextElementSibling
l&&(l.style.display="flex")}
return w(()=>{(async()=>{u.value=!0,c.value=""
try{const e=[...(await S.getApps()).filter(e=>e.bundleId!==l.currentBundleId)].sort(()=>Math.random()-.5)
t.value=e.slice(0,4)}catch(e){c.value="加载推荐应用失败"}finally{u.value=!1}})()}),(e,a)=>(f(),n("div",wa,[i("div",Ia,[a[0]||(a[0]=i("h2",null,"发现更多",-1)),o(T,{icon:"fluent-color:arrow-right-24"})]),u.value?(f(),n("div",Ca,[...a[1]||(a[1]=[i("div",{class:"spinner"},null,-1)])])):c.value?(f(),n("div",Aa,[i("p",null,v(c.value),1)])):0===t.value.length?(f(),n("div",Ua,[...a[2]||(a[2]=[i("p",null,"暂无推荐应用",-1)])])):(f(),n("div",xa,[(f(!0),n(p,null,m(t.value,e=>{return f(),n("div",{key:e.bundleId,class:"recommendation-item",onClick:a=>(e=>{s.push(`/app/${e.bundleId}`).then(()=>{window.location.reload()})})(e)},[i("div",La,[e.hasIcon?(f(),n("img",{key:0,src:(a=e.bundleId,S.getAppIconUrl(a)),alt:e.name,onError:r},null,40,Va)):(f(),n("div",_a,v(e.name.charAt(0).toUpperCase()),1))]),i("div",Sa,[i("h3",Ta,v(e.name),1),i("button",{class:"download-btn",onClick:k(a=>(e=>{s.push(`/app/${e.bundleId}`).then(()=>{window.location.reload()})})(e),["stop"])}," 免费下载 ",8,Ma)])],8,Na)
var a}),128))]))]))}}),[["__scopeId","data-v-671dd3f9"]]),$a={class:"reply-item"},Da={class:"reply-avatar"},Ea={class:"reply-content-wrapper"},Ba={class:"reply-header"},ja={key:1,class:"replyer-name"},Fa={key:2,class:"reply-to-name"},qa={key:3,class:"reply-to-name"},Pa={class:"reply-date"},za={class:"reply-text"},Oa={class:"reply-actions"},Ha={key:0,class:"nested-replies-list"},Ga=R(e({__name:"ReplyItem",props:{reply:{},showReplyButton:{type:Boolean,default:!0}},emits:["like","dislike","reply","nestedLike","nestedDislike","userHover","userLeave"],setup(e,{emit:a}){const l=a,s=()=>{l("like")},r=()=>{l("dislike")},d=()=>{l("reply")},y=e=>{try{const a=new Date(e),l=(new Date).getTime()-a.getTime(),s=Math.floor(l/6e4),n=Math.floor(l/36e5),t=Math.floor(l/864e5)
return s<1?"刚刚":s<60?`${s}分钟前`:n<24?`${n}小时前`:t<30?`${t}天前`:t<365?`${Math.floor(t/30)}个月前`:`${Math.floor(t/365)}年前`}catch{return e}}
return(a,b)=>{const g=A("ReplyItem",!0)
return f(),n("div",$a,[i("div",Da,[o($,{"avatar-id":e.reply.userAvatar,"user-name":e.reply.userName,size:"small"},null,8,["avatar-id","user-name"])]),i("div",Ea,[i("div",Ba,[e.reply.userId?(f(),n("span",{key:0,class:"replyer-name clickable",onMouseenter:b[0]||(b[0]=k(l=>a.$emit("userHover",l,e.reply.userId,e.reply.userName,e.reply.userAvatar),["stop"])),onMouseleave:b[1]||(b[1]=k(e=>a.$emit("userLeave"),["stop"]))},v(e.reply.userName),33)):(f(),n("span",ja,v(e.reply.userName),1)),e.reply.replyToUserName&&e.reply.replyToUserId?(f(),n("span",Fa,[b[6]||(b[6]=c(" 回复 ",-1)),i("span",{class:"reply-to-name-clickable clickable",onMouseenter:b[2]||(b[2]=k(l=>a.$emit("userHover",l,e.reply.replyToUserId,e.reply.replyToUserName,e.reply.replyToUserAvatar),["stop"])),onMouseleave:b[3]||(b[3]=k(e=>a.$emit("userLeave"),["stop"]))}," @"+v(e.reply.replyToUserName),33)])):e.reply.replyToUserName?(f(),n("span",qa," 回复 @"+v(e.reply.replyToUserName),1)):t("",!0),i("span",Pa,v(y(e.reply.date)),1)]),i("p",za,v(e.reply.content),1),i("div",Oa,[i("button",{class:u(["action-btn small",{active:"liked"===e.reply.userLikeStatus}]),onClick:s},[o(T,{icon:"liked"===e.reply.userLikeStatus?"mdi:thumb-up":"mdi:thumb-up-outline",class:"action-icon"},null,8,["icon"]),i("span",null,v(e.reply.likeCount),1)],2),i("button",{class:u(["action-btn small",{active:"disliked"===e.reply.userLikeStatus}]),onClick:r},[o(T,{icon:"disliked"===e.reply.userLikeStatus?"mdi:thumb-down":"mdi:thumb-down-outline",class:"action-icon"},null,8,["icon"]),i("span",null,v(e.reply.dislikeCount),1)],2),e.showReplyButton?(f(),n("button",{key:0,class:"action-btn small reply-btn",onClick:d},[o(T,{icon:"mdi:reply-outline",class:"action-icon"}),b[7]||(b[7]=i("span",null,"回复",-1))])):t("",!0)]),C(a.$slots,"nested-reply-form",{replyId:e.reply.id},void 0),e.reply.nestedReplies&&e.reply.nestedReplies.length>0?(f(),n("div",Ha,[(f(!0),n(p,null,m(e.reply.nestedReplies,e=>(f(),h(g,{key:e.id,reply:e,"show-reply-button":!1,onLike:a=>{return s=e.id,void l("nestedLike",s)
var s},onDislike:a=>{return s=e.id,void l("nestedDislike",s)
var s},onUserHover:b[4]||(b[4]=(e,a,s,n)=>l("userHover",e,a,s,n)),onUserLeave:b[5]||(b[5]=e=>l("userLeave"))},{"nested-reply-form":U(({replyId:e})=>[C(a.$slots,"nested-reply-form",{replyId:e},void 0,!0)]),_:3},8,["reply","onLike","onDislike"]))),128))])):t("",!0)])])}}}),[["__scopeId","data-v-41f997fb"]]),Wa={class:"comment-form"},Ka={class:"form-avatar"},Ya={class:"form-content"},Ja={key:0,class:"reply-to-hint"},Qa=["placeholder","rows","maxlength"],Xa={class:"form-actions"},Za={class:"image-upload-area"},el=["disabled"],al={key:0,class:"image-count"},ll={class:"form-buttons"},sl=["disabled"],nl={key:1,class:"image-preview-list"},tl=["src","alt"],il=["onClick"],ol={key:0,class:"image-error"},ul=R(e({__name:"CommentForm",props:{userAvatar:{},userName:{},isReply:{type:Boolean,default:!1},replyToUserName:{},modelValue:{},placeholder:{default:"写下你的想法..."},maxImages:{default:5},avatarSize:{default:"medium"},submitText:{default:"发表评论"}},emits:["update:modelValue","submit","cancel"],setup(e,{expose:s,emit:d}){const b=e,g=d,h=l({get:()=>b.modelValue||"",set:e=>g("update:modelValue",e)}),k=a(null),w=a([]),I=l(()=>h.value.trim().length>0||w.value.length>0),C=l(()=>b.placeholder?b.placeholder:b.isReply&&b.replyToUserName?`回复 @${b.replyToUserName}...`:b.isReply?"写下你的回复...":"写下你的想法..."),A=()=>{var e
null==(e=k.value)||e.click()},U=e=>{const a=e.target,l=a.files
if(!l)return
const s=b.maxImages||5
Array.from(l).forEach(e=>{if(w.value.length>=s)return
if(!e.type.startsWith("image/"))return void w.value.push({file:e,preview:"",error:"只能上传图片文件"})
if(e.size>10485760)return void w.value.push({file:e,preview:"",error:"图片大小不能超过10MB"})
const a=new FileReader
a.onload=a=>{var l
const s=w.value.findIndex(a=>a.file===e);-1!==s&&(w.value[s].preview=null==(l=a.target)?void 0:l.result)},a.readAsDataURL(e),w.value.push({file:e,preview:""})}),a&&(a.value="")},x=()=>{if(!I.value)return
const e=w.value.filter(e=>!e.error).map(e=>e.file)
g("submit",h.value.trim(),e)},N=()=>{g("cancel")}
return s({clear:()=>{h.value="",w.value=[]}}),(a,l)=>(f(),n("div",{class:u(["comment-form-container",{"reply-mode":e.isReply}])},[i("div",Wa,[i("div",Ka,[o($,{"avatar-id":e.userAvatar,"user-name":e.userName,size:e.avatarSize},null,8,["avatar-id","user-name","size"])]),i("div",Ya,[e.replyToUserName?(f(),n("div",Ja," 回复 @"+v(e.replyToUserName),1)):t("",!0),r(i("textarea",{"onUpdate:modelValue":l[0]||(l[0]=e=>h.value=e),class:"comment-textarea",placeholder:C.value,rows:e.isReply?2:3,maxlength:e.isReply?500:1e3},null,8,Qa),[[y,h.value]]),i("div",Xa,[i("div",Za,[i("input",{ref_key:"imageInput",ref:k,type:"file",accept:"image/*",multiple:"",onChange:U,style:{display:"none"}},null,544),i("button",{class:"upload-image-btn",onClick:A,disabled:w.value.length>=e.maxImages},[o(T,{icon:"fluent-color:image-24",class:"btn-icon"}),l[1]||(l[1]=c(" 添加图片 ",-1))],8,el),w.value.length>0?(f(),n("span",al," 已选择 "+v(w.value.length)+"/"+v(e.maxImages),1)):t("",!0)]),i("div",ll,[e.isReply?(f(),n("button",{key:0,class:"cancel-btn",onClick:N}," 取消 ")):t("",!0),i("button",{class:"submit-btn",onClick:x,disabled:!I.value},[o(T,{icon:(e.isReply,"fluent-color:chat-24"),class:"btn-icon"},null,8,["icon"]),c(" "+v(e.submitText),1)],8,sl)])]),w.value.length>0?(f(),n("div",nl,[(f(!0),n(p,null,m(w.value,(e,a)=>(f(),n("div",{key:a,class:"image-preview-item"},[i("img",{src:e.preview,alt:`预览图 ${a+1}`},null,8,tl),i("button",{class:"remove-image-btn",onClick:e=>(e=>{w.value.splice(e,1)})(a)},[o(T,{icon:"mdi:close"})],8,il),e.error?(f(),n("div",ol,v(e.error),1)):t("",!0)]))),128))])):t("",!0)])])],2))}}),[["__scopeId","data-v-e1627800"]]),cl={class:"comments-section"},rl={class:"comments-header"},dl={class:"header-actions"},vl={key:0,class:"comments-count"},pl={key:3,class:"request-status"},ml={key:0,class:"comments-list"},yl={class:"comment-avatar"},bl={class:"comment-content-wrapper"},gl={class:"comment-header"},hl=["onMouseenter"],kl={key:1,class:"commenter-name"},fl={class:"comment-date"},wl={class:"comment-text"},Il={class:"comment-actions"},Cl=["onClick"],Al=["onClick"],Ul=["onClick"],xl={key:0,class:"reply-count"},Nl={key:2,class:"replies-list"},Ll={key:1,class:"no-comments"},Vl=R(e({__name:"CommentsSection",props:{bundleId:{},comments:{}},emits:["submitComment","likeComment","dislikeComment","likeReply","dislikeReply","submitReply"],setup(e,{emit:r}){const d=e,y=r,{isLoggedIn:b,user:g}=D(),C=I(),{error:A}=E(),N=K(),L=l(()=>{var e,a
return(null==(e=g.value)?void 0:e.nickName)||(null==(a=g.value)?void 0:a.username)||"游客"}),V=l(()=>b.value),_=a(!1),M=a(!1),R=a(""),j=async()=>{if(d.bundleId)try{const e=await S.checkUserRequestStatus(d.bundleId)
M.value=e.hasRequest&&e.status===O.PENDING}catch(e){M.value=!1}else M.value=!1},F=async()=>{if(d.bundleId)try{if(_.value=await S.checkForumEnabled(d.bundleId),_.value){const e=await S.getForumPermission(d.bundleId)
R.value=(null==e?void 0:e.appName)||d.bundleId,M.value=!1}else{try{const e=await S.getForumPermission(d.bundleId)
R.value=(null==e?void 0:e.appName)||d.bundleId}catch(e){try{const e=await S.getApp(d.bundleId)
R.value=e.name}catch(a){R.value=d.bundleId}}await j()}}catch(e){_.value=!1,await j()}else _.value=!1},q=()=>{d.bundleId&&C.push(`/discussion/${d.bundleId}`)},P=async()=>{var e,a
if(d.bundleId&&!M.value)try{let e=R.value||d.bundleId
if(!R.value)try{const a=await S.getApp(d.bundleId)
e=a.name,R.value=a.name}catch(l){}const a=await S.requestForumOpen(d.bundleId,e)
a.success?(M.value=!0,await N.show({title:"申请成功",message:"讨论区开通申请已提交,等待管理员审核",type:"success"})):await N.show({title:"申请失败",message:a.message||"申请失败,请稍后重试",type:"error"})}catch(l){await N.show({title:"申请失败",message:(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message||"申请失败,请稍后重试",type:"error"})}}
s(()=>d.bundleId,()=>{F()},{immediate:!0}),w(()=>{F()})
const z=l(()=>d.comments||[]),Y=a(""),J=a(null),Q=a(null),X=a(""),{showUserMenu:Z,userMenuPosition:ee,selectedUserId:ae,selectedUserName:le,userAvatarId:se,handleAuthorHover:ne,handleAuthorLeave:te,handleCardMouseEnter:ie,handleCloseUserMenu:oe}=function(){const e=a(!1),s=a(void 0),n=a(""),t=a(""),i=a(void 0),o=a(null),u=a(null),c=l(()=>i.value)
return{showUserMenu:e,userMenuPosition:s,selectedUserId:n,selectedUserName:t,userAvatarId:c,handleAuthorHover:(a,l,u,c)=>{o.value&&clearTimeout(o.value),n.value=l,t.value=u,c&&""!==c.trim()?i.value=c:i.value=void 0,o.value=window.setTimeout(()=>{const l=a.target.getBoundingClientRect()
s.value={x:l.left-100,y:l.bottom+8},e.value=!0},200)},handleAuthorLeave:()=>{o.value&&(clearTimeout(o.value),o.value=null),u.value&&(clearTimeout(u.value),u.value=null),u.value=window.setTimeout(()=>{e.value&&(e.value=!1)},200)},handleCardMouseEnter:()=>{u.value&&(clearTimeout(u.value),u.value=null)},handleCloseUserMenu:()=>{o.value&&(clearTimeout(o.value),o.value=null),u.value&&(clearTimeout(u.value),u.value=null),e.value=!1,i.value=void 0}}}(),ue=async(e,a)=>{V.value?(y("submitComment",e,a),Y.value=""):A("请先登录",2e3)},ce=(e,a)=>{V.value?y("likeReply",e,a):A("请先登录",2e3)},re=(e,a)=>{V.value?y("dislikeReply",e,a):A("请先登录",2e3)},de=()=>{J.value=null,Q.value=null,X.value=""},ve=(e,a,l,s,n,t)=>{var i,o,u
y("submitReply",e,a,l,s||(null==(i=Q.value)?void 0:i.id),n||(null==(o=Q.value)?void 0:o.userId),t||(null==(u=Q.value)?void 0:u.userName)),X.value="",J.value=null,Q.value=null},pe=a([]),me=a(0),ye=a(!1),be=()=>{ye.value=!1,pe.value=[],me.value=0},ge=(e,a)=>{C.push(`/messages?userId=${e}&userName=${encodeURIComponent(a)}`)},he=(e,a)=>{},ke=e=>{try{const a=new Date(e),l=(new Date).getTime()-a.getTime(),s=Math.floor(l/6e4),n=Math.floor(l/36e5),t=Math.floor(l/864e5)
return s<1?"刚刚":s<60?`${s}分钟前`:n<24?`${n}小时前`:t<30?`${t}天前`:t<365?`${Math.floor(t/30)}个月前`:`${Math.floor(t/365)}年前`}catch{return e}}
return(e,a)=>{var l
return f(),n(p,null,[i("div",cl,[i("div",rl,[a[8]||(a[8]=i("h2",{class:"section-title"},"大家都在说",-1)),i("div",dl,[z.value.length>0?(f(),n("span",vl,v(z.value.length)+"条评论 ",1)):t("",!0),_.value?(f(),n("button",{key:1,class:"goto-forum-btn",onClick:q},[o(T,{icon:"mdi:forum-outline",class:"btn-icon"}),a[5]||(a[5]=c(" 跳转到讨论区 ",-1))])):M.value?M.value?(f(),n("span",pl,[o(T,{icon:"mdi:clock-outline",class:"status-icon"}),a[7]||(a[7]=c(" 等待申请结果中 ",-1))])):t("",!0):(f(),n("button",{key:2,class:"request-forum-btn",onClick:P},[o(T,{icon:"mdi:forum-plus-outline",class:"btn-icon"}),a[6]||(a[6]=c(" 申请开通讨论区 ",-1))]))])]),o(ul,{"user-avatar":null==(l=x(g))?void 0:l.avatar,"user-name":L.value,modelValue:Y.value,"onUpdate:modelValue":a[0]||(a[0]=e=>Y.value=e),"max-images":5,"submit-text":"发表评论",placeholder:"写下你的想法...",onSubmit:ue},null,8,["user-avatar","user-name","modelValue"]),z.value.length>0?(f(),n("div",ml,[(f(!0),n(p,null,m(z.value,e=>{var l
return f(),n("div",{key:e.id,class:"comment-item"},[i("div",yl,[o($,{"avatar-id":e.userAvatar,"user-name":e.userName,size:"medium"},null,8,["avatar-id","user-name"])]),i("div",bl,[i("div",gl,[e.userId?(f(),n("span",{key:0,class:"commenter-name clickable",onMouseenter:k(a=>x(ne)(a,e.userId,e.userName,e.userAvatar),["stop"]),onMouseleave:a[1]||(a[1]=k((...e)=>x(te)&&x(te)(...e),["stop"]))},v(e.userName),41,hl)):(f(),n("span",kl,v(e.userName),1)),i("span",fl,v(ke(e.date)),1)]),i("p",wl,v(e.content),1),e.images&&e.images.length>0?(f(),h(G,{key:0,images:e.images,"show-index":!1,columns:3,"max-width":150,onImageClick:(a,l)=>((e,a)=>{a&&a.length>0?(pe.value=a,me.value=a.indexOf(e),-1===me.value&&(me.value=0)):(pe.value=[e],me.value=0),ye.value=!0})(l,e.images)},null,8,["images","onImageClick"])):t("",!0),i("div",Il,[i("button",{class:u(["action-btn",{active:"liked"===e.userLikeStatus}]),onClick:a=>{return l=e.id,void(V.value?y("likeComment",l):A("请先登录",2e3))
var l}},[o(T,{icon:"liked"===e.userLikeStatus?"mdi:thumb-up":"mdi:thumb-up-outline",class:"action-icon"},null,8,["icon"]),i("span",null,v(e.likeCount),1)],10,Cl),i("button",{class:u(["action-btn",{active:"disliked"===e.userLikeStatus}]),onClick:a=>{return l=e.id,void(V.value?y("dislikeComment",l):A("请先登录",2e3))
var l}},[o(T,{icon:"disliked"===e.userLikeStatus?"mdi:thumb-down":"mdi:thumb-down-outline",class:"action-icon"},null,8,["icon"]),i("span",null,v(e.dislikeCount),1)],10,Al),i("button",{class:"action-btn reply-btn",onClick:a=>{return l=e.id,void(V.value?J.value!==l||Q.value?(J.value=l,Q.value=null):(J.value=null,X.value=""):A("请先登录",2e3))
var l}},[o(T,{icon:"mdi:reply-outline",class:"action-icon"}),a[9]||(a[9]=i("span",null,"回复",-1)),e.replyCount?(f(),n("span",xl," ("+v(e.replyCount)+") ",1)):t("",!0)],8,Ul)]),J.value!==e.id||Q.value?t("",!0):(f(),h(ul,{key:1,"user-avatar":null==(l=x(g))?void 0:l.avatar,"user-name":L.value,modelValue:X.value,"onUpdate:modelValue":a[2]||(a[2]=e=>X.value=e),"is-reply":!0,"max-images":3,"submit-text":"发表回复",placeholder:"写下你的回复...",onSubmit:(a,l)=>ve(e.id,a,l),onCancel:de},null,8,["user-avatar","user-name","modelValue","onSubmit"])),e.replies&&e.replies.length>0?(f(),n("div",Nl,[(f(!0),n(p,null,m(e.replies,l=>(f(),h(Ga,{key:l.id,reply:l,onLike:a=>ce(e.id,l.id),onDislike:a=>re(e.id,l.id),onReply:a=>((e,a,l,s)=>{var n
V.value?J.value===e&&(null==(n=Q.value)?void 0:n.id)===a?(J.value=null,Q.value=null,X.value=""):(J.value=e,Q.value={id:a,userId:l,userName:s}):A("请先登录",2e3)})(e.id,l.id,l.userId||"",l.userName),onNestedLike:a=>ce(e.id,a),onNestedDislike:a=>re(e.id,a),onUserHover:x(ne),onUserLeave:x(te)},{"nested-reply-form":U(({replyId:s})=>{var n,i,o
return[J.value===e.id&&(null==(n=Q.value)?void 0:n.id)===s?(f(),h(ul,{key:0,"user-avatar":null==(i=x(g))?void 0:i.avatar,"user-name":L.value,modelValue:X.value,"onUpdate:modelValue":a[3]||(a[3]=e=>X.value=e),"is-reply":!0,"max-images":3,"reply-to-user-name":(null==(o=Q.value)?void 0:o.userName)||l.userName,"submit-text":"发表回复",onSubmit:(a,n)=>{var t,i
return ve(e.id,a,n,s,(null==(t=Q.value)?void 0:t.userId)||l.userId||"",(null==(i=Q.value)?void 0:i.userName)||l.userName)},onCancel:de},null,8,["user-avatar","user-name","modelValue","reply-to-user-name","onSubmit"])):t("",!0)]}),_:2},1032,["reply","onLike","onDislike","onReply","onNestedLike","onNestedDislike","onUserHover","onUserLeave"]))),128))])):t("",!0)])])}),128))])):(f(),n("div",Ll,[o(T,{icon:"mdi:comment-multiple-outline",class:"no-comments-icon"}),a[10]||(a[10]=i("p",null,"还没有评论,快来发表第一条吧!",-1))])),o(H,{visible:ye.value,images:pe.value,"initial-index":me.value,"show-navigation":pe.value.length>1,"show-info":!1,onClose:be,onIndexChange:a[4]||(a[4]=e=>me.value=e)},null,8,["visible","images","initial-index","show-navigation"]),o(W,{visible:x(Z),"user-id":x(ae),"user-name":x(le),"avatar-id":x(se),position:x(ee),onClose:x(oe),onSendMessage:ge,onBlockUser:he,onMouseEnter:x(ie)},null,8,["visible","user-id","user-name","avatar-id","position","onClose","onMouseEnter"])]),o(B,{visible:x(N).visible.value,title:x(N).config.value.title||"",message:x(N).config.value.message,type:x(N).config.value.type,"confirm-text":x(N).config.value.confirmText,onConfirm:x(N).handleConfirm},null,8,["visible","title","message","type","confirm-text","onConfirm"])],64)}}}),[["__scopeId","data-v-3788093e"]]),_l={class:"dialog-header"},Sl={class:"dialog-title"},Tl={class:"dialog-content"},Ml={class:"info-section"},Rl={class:"info-grid"},$l={class:"info-item"},Dl={class:"info-value"},El={class:"info-item"},Bl={class:"info-value"},jl={class:"info-item"},Fl={class:"info-value"},ql={class:"info-item"},Pl={class:"info-value"},zl={class:"info-item"},Ol={class:"info-value"},Hl={class:"form-section"},Gl={class:"section-title"},Wl={class:"error-type-grid"},Kl=["onClick"],Yl={class:"type-label"},Jl={class:"form-section"},Ql={class:"section-title"},Xl={class:"char-count"},Zl={class:"form-section"},es={class:"section-title"},as={class:"upload-area"},ls={key:0,class:"screenshots-list"},ss=["src","alt"],ns=["onClick"],ts={key:0,class:"screenshot-error"},is={class:"form-section"},os={class:"section-title"},us={class:"upload-area"},cs={key:0,class:"files-list"},rs={class:"file-name"},ds={class:"file-size"},vs=["onClick"],ps={class:"dialog-footer"},ms=["disabled"],ys=R(e({__name:"ReportIssueDialog",props:{visible:{type:Boolean},appInfo:{}},emits:["close","submit"],setup(e,{emit:d}){const b=e,g=d,I=[{value:"crash",label:"打开崩溃",icon:"mdi:alert-octagon"},{value:"crack_failed",label:"破解失效",icon:"mdi:shield-off"},{value:"update_request",label:"请求更新",icon:"mdi:update"},{value:"unexpected_error",label:"意外错误",icon:"mdi:alert-circle"}],C=a(""),A=a(""),x=a([]),L=a([]),V=a(null),_=a(null),M=a({osVersion:"获取中...",architecture:"获取中..."}),R=async()=>{try{const e=await S.getStatus()
M.value={osVersion:e.os_version||"未知",architecture:e.architecture||"未知"}}catch(e){M.value={osVersion:"未知",architecture:"未知"}}}
w(()=>{R()}),s(()=>b.visible,e=>{e&&R()})
const $=l(()=>""!==C.value&&A.value.trim().length>0),D=()=>{var e
null==(e=V.value)||e.click()},E=e=>{const a=e.target,l=a.files
l&&(Array.from(l).forEach(e=>{if(!e.type.startsWith("image/"))return void x.value.push({file:e,preview:"",error:"只能上传图片文件"})
if(e.size>10485760)return void x.value.push({file:e,preview:"",error:"图片大小不能超过10MB"})
const a=new FileReader
a.onload=a=>{var l
const s=x.value.findIndex(a=>a.file===e);-1!==s&&(x.value[s].preview=null==(l=a.target)?void 0:l.result)},a.readAsDataURL(e),x.value.push({file:e,preview:""})}),a&&(a.value=""))},B=()=>{var e
null==(e=_.value)||e.click()},j=e=>{const a=e.target,l=a.files
l&&(Array.from(l).forEach(e=>{L.value.push(e)}),a&&(a.value=""))},F=e=>{if(0===e)return"0 B"
const a=Math.floor(Math.log(e)/Math.log(1024))
return Math.round(e/Math.pow(1024,a)*100)/100+" "+["B","KB","MB","GB"][a]},q=()=>{g("close")},P=()=>{q()},z=()=>{if(!$.value||!b.appInfo)return
const e={appName:b.appInfo.name,appVersion:b.appInfo.version,bundleId:b.appInfo.bundleId,osVersion:M.value.osVersion,architecture:M.value.architecture,errorType:C.value,description:A.value.trim(),screenshots:x.value.filter(e=>!e.error).map(e=>e.file),files:L.value}
g("submit",e)}
return s(()=>b.visible,e=>{e||(C.value="",A.value="",x.value=[],L.value=[])}),(a,l)=>(f(),h(N,{name:"dialog-fade"},{default:U(()=>[e.visible?(f(),n("div",{key:0,class:"report-issue-dialog-overlay",onClick:P},[i("div",{class:"report-issue-dialog",onClick:l[1]||(l[1]=k(()=>{},["stop"]))},[i("div",_l,[i("h2",Sl,[o(T,{icon:"mdi:alert-circle",class:"title-icon"}),l[2]||(l[2]=c(" 报告问题 ",-1))]),i("button",{class:"close-btn",onClick:q},[o(T,{icon:"mdi:close"})])]),i("div",Tl,[i("div",Ml,[l[8]||(l[8]=i("h3",{class:"section-title"},"应用信息",-1)),i("div",Rl,[i("div",$l,[l[3]||(l[3]=i("span",{class:"info-label"},"应用名称",-1)),i("span",Dl,v(e.appInfo.name),1)]),i("div",El,[l[4]||(l[4]=i("span",{class:"info-label"},"版本",-1)),i("span",Bl,v(e.appInfo.version),1)]),i("div",jl,[l[5]||(l[5]=i("span",{class:"info-label"},"包名",-1)),i("span",Fl,v(e.appInfo.bundleId),1)]),i("div",ql,[l[6]||(l[6]=i("span",{class:"info-label"},"系统版本",-1)),i("span",Pl,v(M.value.osVersion),1)]),i("div",zl,[l[7]||(l[7]=i("span",{class:"info-label"},"架构",-1)),i("span",Ol,v(M.value.architecture),1)])])]),i("div",Hl,[i("h3",Gl,[o(T,{icon:"mdi:tag-outline",class:"section-icon"}),l[9]||(l[9]=c(" 错误类型 ",-1)),l[10]||(l[10]=i("span",{class:"required"},"*",-1))]),i("div",Wl,[(f(),n(p,null,m(I,e=>i("button",{key:e.value,class:u(["error-type-btn",{active:C.value===e.value}]),onClick:a=>C.value=e.value},[o(T,{icon:e.icon,class:"type-icon"},null,8,["icon"]),i("span",Yl,v(e.label),1)],10,Kl)),64))])]),i("div",Jl,[i("h3",Ql,[o(T,{icon:"mdi:text-box-outline",class:"section-icon"}),l[11]||(l[11]=c(" 问题描述 ",-1)),l[12]||(l[12]=i("span",{class:"required"},"*",-1))]),r(i("textarea",{"onUpdate:modelValue":l[0]||(l[0]=e=>A.value=e),class:"description-textarea",placeholder:"请详细描述遇到的问题,包括操作步骤、预期结果和实际结果...",rows:"6",maxlength:"2000"},null,512),[[y,A.value]]),i("div",Xl,v(A.value.length)+"/2000",1)]),i("div",Zl,[i("h3",es,[o(T,{icon:"mdi:image-outline",class:"section-icon"}),l[13]||(l[13]=c(" 报错截图 ",-1))]),i("div",as,[i("input",{ref_key:"screenshotInput",ref:V,type:"file",accept:"image/*",multiple:"",onChange:E,style:{display:"none"}},null,544),i("button",{class:"upload-btn",onClick:D},[o(T,{icon:"fluent-color:image-24",class:"upload-icon"}),l[14]||(l[14]=i("span",null,"选择截图",-1))]),l[15]||(l[15]=i("span",{class:"upload-hint"},"支持多张图片单张最大10MB",-1))]),x.value.length>0?(f(),n("div",ls,[(f(!0),n(p,null,m(x.value,(e,a)=>(f(),n("div",{key:a,class:"screenshot-item"},[i("img",{src:e.preview,alt:`截图 ${a+1}`},null,8,ss),i("button",{class:"remove-screenshot-btn",onClick:e=>(e=>{x.value.splice(e,1)})(a)},[o(T,{icon:"mdi:close"})],8,ns),e.error?(f(),n("div",ts,v(e.error),1)):t("",!0)]))),128))])):t("",!0)]),i("div",is,[i("h3",os,[o(T,{icon:"mdi:file-upload-outline",class:"section-icon"}),l[16]||(l[16]=c(" 报告文件 ",-1))]),i("div",us,[i("input",{ref_key:"fileInput",ref:_,type:"file",multiple:"",onChange:j,style:{display:"none"}},null,544),i("button",{class:"upload-btn",onClick:B},[o(T,{icon:"mdi:file-upload-outline",class:"upload-icon"}),l[17]||(l[17]=i("span",null,"选择文件",-1))]),l[18]||(l[18]=i("span",{class:"upload-hint"},"可上传日志文件、配置文件等",-1))]),L.value.length>0?(f(),n("div",cs,[(f(!0),n(p,null,m(L.value,(e,a)=>(f(),n("div",{key:a,class:"file-item"},[o(T,{icon:"mdi:file-document-outline",class:"file-icon"}),i("span",rs,v(e.name),1),i("span",ds,v(F(e.size)),1),i("button",{class:"remove-file-btn",onClick:e=>(e=>{L.value.splice(e,1)})(a)},[o(T,{icon:"mdi:close"})],8,vs)]))),128))])):t("",!0)])]),i("div",ps,[i("button",{class:"cancel-btn",onClick:q},"取消"),i("button",{class:"submit-btn",onClick:z,disabled:!$.value},[o(T,{icon:"mdi:send",class:"btn-icon"}),l[19]||(l[19]=c(" 提交报告 ",-1))],8,ms)])])])):t("",!0)]),_:1}))}}),[["__scopeId","data-v-3ddef453"]]),bs={class:"info-tooltip-wrapper"},gs=R(e({__name:"InfoTooltip",props:{position:{default:"bottom"},maxWidth:{default:"600px"}},setup(e){const a=e,s=l(()=>({maxWidth:a.maxWidth}))
return(e,a)=>(f(),n("div",bs,[C(e.$slots,"trigger",{},()=>[o(T,{icon:"mdi:information-outline",class:"info-trigger-icon"})]),i("div",{class:"info-tooltip-content",style:g(s.value)},[C(e.$slots,"default",{},void 0)],4)]))}}),[["__scopeId","data-v-0182f96a"]]),hs={class:"app-detail-page"},ks={key:0,class:"loading-container"},fs={key:1,class:"error-container"},ws={key:2,class:"detail-layout"},Is={class:"back-section"},Cs={class:"main-content"},As={class:"content-left"},Us={class:"app-header-section"},xs={class:"app-icon-container"},Ns=["src","alt"],Ls={key:1,class:"icon-loading"},Vs={key:2,class:"icon-placeholder"},_s={class:"app-info-main"},Ss={class:"app-info-section"},Ts={class:"app-name"},Ms={class:"app-meta-row"},Rs={key:0,class:"rating-info"},$s={class:"rating-value"},Ds={key:0,class:"rating-count"},Es={key:1,class:"category-separator"},Bs={key:2,class:"category-badge"},js={class:"app-version-info"},Fs={class:"version-text"},qs={key:0,class:"bundle-version-text"},Ps={key:1,class:"injection-info"},zs={class:"app-detail-info"},Os={class:"detail-info-row"},Hs={class:"detail-value"},Gs={class:"detail-info-row"},Ws={class:"detail-value"},Ks={class:"description-compact"},Ys={class:"description-text"},Js={class:"app-actions-compact"},Qs=["disabled"],Xs=["disabled"],Zs=["disabled"],en={key:4,class:"download-precracked-wrapper"},an={key:1,class:"download-dropdown-wrapper"},ln=["onClick"],sn={class:"option-content"},nn={class:"option-version"},tn={key:0,class:"option-beta"},on={key:0,class:"option-uploader"},un={key:0,class:"screenshots-section"},cn={class:"section-header"},rn={class:"view-all-btn"},dn={class:"screenshots-grid"},vn=["src","alt"],pn={key:1,class:"description-section"},mn={class:"description-content"},yn={key:0},bn={key:1},gn={class:"rating-section"},hn={key:0,class:"rating-overview"},kn={class:"rating-content-wrapper"},fn={class:"rating-left"},wn={class:"rating-summary"},In={class:"rating-main"},Cn={class:"rating-number"},An={class:"rating-count"},Un={class:"rating-distribution"},xn={class:"bar-star-number"},Nn={class:"bar-container"},Ln={class:"bar-value"},Vn={key:0,class:"app-info-card"},_n={class:"features-developer-column"},Sn={key:0,class:"info-card-item features-item"},Tn={class:"info-icon-wrapper"},Mn={class:"info-content"},Rn={class:"features-tags"},$n={key:1,class:"info-card-item developer-item"},Dn={class:"info-icon-wrapper"},En={class:"info-content"},Bn={class:"info-value"},jn={key:0,class:"info-card-grid"},Fn={key:0,class:"info-card-item"},qn={class:"info-icon-wrapper"},Pn={class:"info-content"},zn={class:"info-value"},On={key:1,class:"info-card-item"},Hn={class:"info-icon-wrapper"},Gn={class:"info-content"},Wn={class:"info-value"},Kn={key:2,class:"info-card-item"},Yn={class:"info-icon-wrapper"},Jn={class:"info-content"},Qn={class:"info-value"},Xn={key:3,class:"info-card-item"},Zn={class:"info-icon-wrapper"},et={class:"info-content"},at={class:"info-value"},lt={class:"rating-right"},st={key:0,class:"info-card-item highlight"},nt={class:"info-icon-wrapper update"},tt={class:"info-content"},it={class:"info-value update-value"},ot={key:1,class:"info-card-item highlight pre-cracked-card"},ut={class:"info-icon-wrapper pre-cracked"},ct={class:"info-content"},rt={class:"info-value pre-cracked-value"},dt={key:1,class:"no-rating"},vt={key:3,class:"rating-input-section"},pt={class:"star-rating-input"},mt=["onClick","onMouseenter"],yt={key:0,class:"star-rating-tooltip"},bt={key:0,class:"rating-submit-section"},gt={key:2,class:"versions-section"},ht={class:"content-right"},kt={key:0,class:"sticky-header"},ft={class:"sticky-header-content"},wt={class:"sticky-icon"},It=["src","alt"],Ct={key:1,class:"sticky-icon-placeholder"},At={class:"sticky-info"},Ut={class:"sticky-app-name"},xt={class:"sticky-developer"},Nt={class:"sticky-meta"},Lt={class:"sticky-version"},Vt={key:0,class:"sticky-bundle-version"},_t={key:1,class:"sticky-injection"},St={key:2,class:"sticky-update"},Tt={key:3,class:"sticky-pre-cracked"},Mt={key:4,class:"sticky-rating"},Rt={class:"sticky-right"},$t={class:"sticky-actions"},Dt=["disabled"],Et=["disabled"],Bt=["disabled"],jt={key:4,class:"sticky-download-wrapper"},Ft={key:1,class:"sticky-download-dropdown-wrapper"},qt=["onClick"],Pt={class:"option-content"},zt={class:"option-version"},Ot={key:0,class:"option-beta"},Ht={key:0,class:"option-uploader"},Gt={class:"sticky-provider"},Wt=R(e({__name:"AppDetail",setup(e){const r=_(),d=I(),{isLoggedIn:y}=D(),{success:b,error:h}=E(),{show:C,hide:A}=q(),R=a(null),$=a(!0),B=a(""),O=a(!1),H=a(!1),G=a(!1),W=a(!1),K=a(!1),Y=a([]),J=a(0),Q=a(0),X=a(null),Z=a([]),ee=a(!1),ae=a([]),le=l(()=>!!R.value&&(R.value.description||Ue()).length>200),se=a(null),ne=e=>{const a=e.target.scrollTop||window.pageYOffset||document.documentElement.scrollTop
K.value=a>200},te=e=>{const a=e.target
a.closest(".download-dropdown-wrapper")||a.closest(".sticky-download-dropdown-wrapper")||(ee.value=!1)}
w(async()=>{await ce(),document.addEventListener("click",te),await L()
const e=document.querySelector(".main-content-right")
if(e){se.value=e,e.addEventListener("scroll",ne,{passive:!0})
let a=null
const l=()=>{if(!K.value)return
const a=document.querySelector(".sticky-header")
if(a&&e){const l=e.getBoundingClientRect()
a.style.top=`${l.top+40}px`
const s=l.width,n=.6*s
a.style.left=`${l.left+(s-n)/2}px`,a.style.width=`${n}px`}}
s(K,()=>{K.value&&L(()=>{l()})}),l(),a=()=>{l()},window.addEventListener("resize",a,{passive:!0})
const n=()=>{l()}
e.addEventListener("scroll",n,{passive:!0}),ae.value.push(()=>{a&&window.removeEventListener("resize",a),e.removeEventListener("scroll",n)})}else window.addEventListener("scroll",ne,{passive:!0})}),V(()=>{se.value?se.value.removeEventListener("scroll",ne):window.removeEventListener("scroll",ne),document.removeEventListener("click",te),ae.value.forEach(e=>e()),ae.value=[]})
const ie=a(!0),oe=a(!1),ue=a(!1),ce=async()=>{$.value=!0,B.value=""
const e=r.params.bundleId
if(!e)return B.value="应用 ID 不存在",void($.value=!1)
try{const a=await S.getApp(e)
R.value=a,R.value.rating||(R.value.rating=4.1,R.value.ratingCount=661),R.value.description||(R.value.description=Ue()),R.value.category||(R.value.category=Ce()),R.value.reviews&&0!==R.value.reviews.length||(R.value.reviews=[{id:"1",userName:"dddddddddd",rating:5,title:"",content:"ddddddddddddddddd",date:new Date(Date.now()-2592e6).toISOString(),helpfulCount:5},{id:"2",userName:"信泽",rating:5,title:"",content:"这个应用功能强大,界面美观,使用体验很棒!",date:new Date(Date.now()-2592e6).toISOString(),helpfulCount:3},{id:"3",userName:"用户B",rating:4,title:"",content:"整体来说还不错,但还有一些小问题需要改进。",date:new Date(Date.now()-1296e6).toISOString(),helpfulCount:2}]),R.value.features&&0!==R.value.features.length||(R.value.features=["AI智能搜索","深度思考模式","高效信息获取","多端协同"]),await Pe(),ie.value=!1!==R.value.hasIcon,oe.value=!1,ue.value=!1,!1===R.value.hasIcon&&(ie.value=!1,ue.value=!0),await Ee(),y.value&&await Be(),await Je(),await Ye()}catch(a){B.value="加载应用详情失败,请检查网络连接"}finally{$.value=!1}},{updating:re,modalVisible:de,modalTitle:ve,logs:pe,modalStatus:me,handleUpdate:ye,handleReinstall:be,hideModal:ge}=P({onRefresh:async()=>{await ce()}}),he=()=>R.value&&!1!==R.value.hasIcon?S.getAppIconUrl(R.value.bundleId):"",ke=()=>{R.value&&ye(R.value)},fe=async()=>{var e,a
if(R.value&&R.value.bundleId)try{const e=await fetch(`/api/apps/${R.value.bundleId}/open`,{method:"POST"}),a=await e.json()
if(!e.ok){const e=a.message||"打开应用失败"
return void h(e,3e3)}!1===a.success?h(a.message||"打开应用失败",3e3):b(a.message||"打开应用成功",2e3)}catch(l){const s=(null==(a=null==(e=l.response)?void 0:e.data)?void 0:a.message)||l.message||"打开应用失败"
h(s,3e3)}},we=()=>{d.back()},Ie=()=>{d.push("/")},Ce=()=>{if(!R.value)return"应用"
const e=R.value.bundleId.toLowerCase()
return e.includes("social")||e.includes("chat")||e.includes("qq")||e.includes("wechat")?"社交":e.includes("music")||e.includes("video")||e.includes("player")?"娱乐":e.includes("design")||e.includes("photo")||e.includes("edit")?"设计":e.includes("tool")||e.includes("util")?"实用程序与工具":"应用"},Ae=()=>{if(!R.value)return""
const e=R.value.bundleId.split(".")
return e.length>=2?e[1].charAt(0).toUpperCase()+e[1].slice(1)+" 公司":""},Ue=()=>R.value?`${R.value.name}是一款优秀的应用程序,提供丰富的功能和良好的用户体验。`:"",xe=l(()=>{if(X.value&&X.value.distribution.length>0)return X.value.distribution
if(!R.value||!R.value.ratingCount)return[]
const e=R.value.ratingCount,a=[]
for(let l=5;l>=1;l--){let s=0
s=5===l?Math.round(.4*e):4===l?Math.round(.3*e):3===l?Math.round(.15*e):2===l?Math.round(.1*e):e-a.reduce((e,a)=>e+a.count,0),a.push({stars:l,count:s,percentage:s/e*100})}return a}),Ne=()=>{var e,a
navigator.share?navigator.share({title:null==(e=R.value)?void 0:e.name,text:`查看 ${null==(a=R.value)?void 0:a.name} 应用详情`,url:window.location.href}).catch(()=>{}):(navigator.clipboard.writeText(window.location.href),b("链接已复制到剪贴板",2e3))},Le=()=>{G.value=!0},Ve=()=>{G.value=!1},_e=async e=>{var a
if(e&&R.value){if(!y.value)return h("请先登录后再提交问题报告",3e3),G.value=!1,void(H.value=!0)
C("正在提交问题报告...")
try{let s
if(R.value&&!1!==R.value.hasIcon)try{const e=he()
if(e){const l=await fetch(e)
if(l.ok){const e=await l.blob(),n=new File([e],`${R.value.bundleId}.png`,{type:e.type||"image/png"}),t=await S.uploadFile(M.APP_ICON,n)
t.success&&(null==(a=t.data)?void 0:a.fileId)&&(s=t.data.fileId)}}}catch(l){}const n=await S.submitIssue(e.bundleId,e.appName,e.appVersion,e.osVersion,e.architecture,e.errorType,e.description,e.screenshots||[],e.files||[],s)
A(),n.success?(G.value=!1,setTimeout(()=>{b("问题报告已提交,感谢您的反馈!",3e3)},100)):h(n.message||"提交失败,请稍后重试",3e3)}catch(s){A(),h(s.message||"提交失败,请稍后重试",3e3)}}else h("提交失败:缺少必要信息",3e3)},Se=()=>{ie.value=!1,oe.value=!0,ue.value=!1},Te=e=>{ie.value=!1,oe.value=!1,ue.value=!0
const a=e.target
a&&(a.style.display="none"),R.value&&(R.value.hasIcon=!1)}
s(()=>r.params.bundleId,async(e,a)=>{e&&e!==a&&await ce()},{immediate:!1})
const Me=async()=>{await ce()},Re=()=>{H.value=!0},$e=()=>{H.value=!1},De=async()=>{H.value=!1,await Ee()},Ee=async()=>{var e
if(null==(e=R.value)?void 0:e.bundleId)try{const e=await S.getAppRatingStats(R.value.bundleId)
e&&(X.value=e,R.value&&(R.value.rating=e.averageRating,R.value.ratingCount=e.totalCount))}catch(a){}},Be=async()=>{var e
if((null==(e=R.value)?void 0:e.bundleId)&&y.value)try{const e=await S.getUserAppRating(R.value.bundleId)
e&&(J.value=e)}catch(a){}},je=async()=>{var e
if((null==(e=R.value)?void 0:e.bundleId)&&y.value&&0!==J.value)try{C("正在提交评分..."),await S.submitAppRating(R.value.bundleId,J.value),A(),b("评分提交成功",2e3),await Ee()}catch(a){A(),h(a.message||"提交评分失败",3e3)}},Fe=a(new Map),qe=e=>{const a=[]
for(const l of e){const e=Fe.value.get(l)
e&&a.push(e)}return a},Pe=async()=>{var e
if(null==(e=R.value)?void 0:e.bundleId)try{const e=await S.getAppComments(R.value.bundleId)
if(e.comments){const a=[]
e.comments.forEach(e=>{e.imageAttachmentIds&&e.imageAttachmentIds.length>0&&a.push(...e.imageAttachmentIds),(e.replies||[]).forEach(e=>{e.imageAttachmentIds&&e.imageAttachmentIds.length>0&&a.push(...e.imageAttachmentIds),(e.nestedReplies||[]).forEach(e=>{e.imageAttachmentIds&&e.imageAttachmentIds.length>0&&a.push(...e.imageAttachmentIds)})})}),a.length>0&&await(async e=>{for(const l of e)if(!Fe.value.has(l))try{const e=await S.getAttachmentImage(l)
e&&Fe.value.set(l,e)}catch(a){}})(a),Y.value=e.comments.map(e=>({id:e._id||e.id,userId:e.userId,userName:e.userName,userAvatar:e.userAvatar,content:e.content,imageAttachmentIds:e.imageAttachmentIds||[],images:qe(e.imageAttachmentIds||[]),date:e.date,likeCount:e.likeCount||0,dislikeCount:e.dislikeCount||0,userLikeStatus:e.userLikeStatus||null,replyCount:e.replyCount||0,replies:(e.replies||[]).map(e=>{var a,l,s,n,t,i
return{id:e._id||e.id,userName:e.userName,userAvatar:e.userAvatar,userId:(null==(a=e.replyUser)?void 0:a.id)||e.userId,content:e.content,imageAttachmentIds:e.imageAttachmentIds||[],images:qe(e.imageAttachmentIds||[]),date:e.date,likeCount:e.likeCount||0,dislikeCount:e.dislikeCount||0,userLikeStatus:e.userLikeStatus||null,replyToUserName:(null==(l=e.replyTo)?void 0:l.userName)||e.replyToUserName,replyToUserId:(null==(s=e.replyToUser)?void 0:s.id)||(null==(n=e.replyTo)?void 0:n.userId),replyToUserAvatar:(null==(t=e.replyToUser)?void 0:t.avatar)||(null==(i=e.replyTo)?void 0:i.userAvatar),nestedReplies:(e.nestedReplies||[]).map(e=>{var a,l,s,n,t,i
return{id:e._id||e.id,userName:e.userName,userAvatar:e.userAvatar,userId:(null==(a=e.replyUser)?void 0:a.id)||e.userId,content:e.content,imageAttachmentIds:e.imageAttachmentIds||[],images:qe(e.imageAttachmentIds||[]),date:e.date,likeCount:e.likeCount||0,dislikeCount:e.dislikeCount||0,userLikeStatus:e.userLikeStatus||null,replyToUserName:(null==(l=e.replyTo)?void 0:l.userName)||e.replyToUserName,replyToUserId:(null==(s=e.replyToUser)?void 0:s.id)||(null==(n=e.replyTo)?void 0:n.userId),replyToUserAvatar:(null==(t=e.replyToUser)?void 0:t.avatar)||(null==(i=e.replyTo)?void 0:i.userAvatar)}})}})}))}else Y.value=[]}catch(a){Y.value=[]}},ze=async(e,a)=>{var l
if((null==(l=R.value)?void 0:l.bundleId)&&y.value)try{C("正在提交评论...")
let l=[]
if(a&&a.length>0)for(const e of a){const a=await S.uploadImageAttachment(e)
a.success&&a.attachmentId&&l.push(a.attachmentId)}const s=await S.createAppComment(R.value.bundleId,e,l.length>0?l:void 0)
A(),s.success?(b("评论发表成功",2e3),await Pe()):h(s.message||"提交评论失败",3e3)}catch(s){A(),h(s.message||"提交评论失败",3e3)}else h("请先登录",2e3)},Oe=async e=>{var a
if((null==(a=R.value)?void 0:a.bundleId)&&y.value)try{const a=Y.value.find(a=>a.id===e),l="liked"===(null==a?void 0:a.userLikeStatus)?"cancel":"like",s=await S.likeAppComment(R.value.bundleId,e,l)
s.success&&a&&(a.likeCount=s.likeCount,a.dislikeCount=s.dislikeCount,a.userLikeStatus=s.userLikeStatus)}catch(l){h(l.message||"操作失败",3e3)}else h("请先登录",2e3)},He=async e=>{var a
if((null==(a=R.value)?void 0:a.bundleId)&&y.value)try{const a=Y.value.find(a=>a.id===e),l="disliked"===(null==a?void 0:a.userLikeStatus)?"cancel":"dislike",s=await S.likeAppComment(R.value.bundleId,e,l)
s.success&&a&&(a.likeCount=s.likeCount,a.dislikeCount=s.dislikeCount,a.userLikeStatus=s.userLikeStatus)}catch(l){h(l.message||"操作失败",3e3)}else h("请先登录",2e3)},Ge=async(e,a)=>{var l,s
if((null==(l=R.value)?void 0:l.bundleId)&&y.value)try{const l=Y.value.find(a=>a.id===e),n=null==(s=null==l?void 0:l.replies)?void 0:s.find(e=>e.id===a),t="liked"===(null==n?void 0:n.userLikeStatus)?"cancel":"like",i=await S.likeAppCommentReply(R.value.bundleId,e,a,t)
i.success&&n&&(n.likeCount=i.likeCount,n.dislikeCount=i.dislikeCount,n.userLikeStatus=i.userLikeStatus)}catch(n){h(n.message||"操作失败",3e3)}else h("请先登录",2e3)},We=async(e,a)=>{var l,s
if((null==(l=R.value)?void 0:l.bundleId)&&y.value)try{const l=Y.value.find(a=>a.id===e),n=null==(s=null==l?void 0:l.replies)?void 0:s.find(e=>e.id===a),t="disliked"===(null==n?void 0:n.userLikeStatus)?"cancel":"dislike",i=await S.likeAppCommentReply(R.value.bundleId,e,a,t)
i.success&&n&&(n.likeCount=i.likeCount,n.dislikeCount=i.dislikeCount,n.userLikeStatus=i.userLikeStatus)}catch(n){h(n.message||"操作失败",3e3)}else h("请先登录",2e3)},Ke=async(e,a,l,s,n,t)=>{var i
if((null==(i=R.value)?void 0:i.bundleId)&&y.value)try{C("正在提交回复...")
let i,o=[]
if(l&&l.length>0)for(const e of l){const a=await S.uploadImageAttachment(e)
a.success&&a.attachmentId&&o.push(a.attachmentId)}i=s&&n&&t?await S.createAppCommentNestedReply(R.value.bundleId,e,s,a,n,t,o.length>0?o:void 0):await S.createAppCommentReply(R.value.bundleId,e,a,o.length>0?o:void 0),A(),i.success?(b("回复发表成功",2e3),await Pe()):h(i.message||"提交回复失败",3e3)}catch(o){A(),h(o.message||"提交回复失败",3e3)}else h("请先登录",2e3)},Ye=async()=>{var e
if(null==(e=R.value)?void 0:e.bundleId)try{const e=await S.getAppVersions(R.value.bundleId)
e.success&&e.data&&(R.value.update||(R.value.update={hasUpdate:!1,latestVersion:"",feedUrl:"",versions:[]}),R.value.update.versions=e.data,e.data.length>0&&(R.value.update.latestVersion=e.data[0].version))}catch(a){}},Je=async()=>{var e
if(null==(e=R.value)?void 0:e.bundleId)try{const e=await S.getBindByBundleId(R.value.bundleId)
if(e.success&&e.data){const a=Array.isArray(e.data)?e.data:[]
Z.value=a.map(e=>({version:e.version||"",fileId:e.fileId||"",beta:e.beta||!1,uploader:e.uploader||e.uploaderName||void 0}))}else Z.value=[]}catch(a){Z.value=[]}},Qe=async e=>{var a,l,s,n,t,i,o
if(!(null==(a=R.value)?void 0:a.bundleId)||0===Z.value.length)return
const u=e||Z.value[0]
try{C("正在获取下载链接...")
const e=await S.downloadPreCrackedPackage(R.value.bundleId,u.version)
if(!e.success||!(null==(l=e.data)?void 0:l.downloadUrl))return A(),void h(e.message||"获取下载链接失败",3e3)
const{downloadUrl:a,fileName:i,appName:o,version:d}=e.data
try{const e=await S.startDownload(a,i)
A(),e.success&&(null==(s=e.data)?void 0:s.taskId)?b(e.message||`下载任务已添加到下载列表:${o} ${d}`,3e3):h(e.message||"添加下载任务失败,请检查下载管理器",3e3)}catch(c){A()
const e=(null==(t=null==(n=c.response)?void 0:n.data)?void 0:t.message)||c.message||"启动下载失败"
h(e,3e3)
try{window.open(a,"_blank"),b("下载链接已在新窗口打开",3e3)}catch(r){}}}catch(d){A()
const e=(null==(o=null==(i=d.response)?void 0:i.data)?void 0:o.message)||d.message||"下载失败,请稍后重试"
h(e,3e3)}}
return(e,a)=>{var l,s,r
return f(),n("div",hs,[$.value?(f(),n("div",ks,[...a[11]||(a[11]=[i("div",{class:"spinner"},null,-1),i("p",null,"加载应用详情...",-1)])])):B.value?(f(),n("div",fs,[i("p",null,v(B.value),1),i("button",{onClick:ce,class:"btn btn-primary"},"重试")])):R.value?(f(),n("div",ws,[i("div",Is,[i("button",{onClick:we,class:"back-btn"},[o(T,{icon:"mdi:arrow-left",class:"btn-icon"}),a[12]||(a[12]=c(" 返回 ",-1))]),i("button",{onClick:Ie,class:"home-btn"},[o(T,{icon:"fluent-color:home-32",class:"btn-icon"}),a[13]||(a[13]=c(" 首页 ",-1))])]),i("div",Cs,[i("div",As,[i("div",Us,[i("div",xs,[!1!==R.value.hasIcon&&he()?(f(),n("img",{key:0,src:he(),alt:R.value.name,class:u({"icon-hidden":ie.value}),onLoad:Se,onError:Te},null,42,Ns)):t("",!0),ie.value&&!1!==R.value.hasIcon?(f(),n("div",Ls,[...a[14]||(a[14]=[i("div",{class:"spinner"},null,-1)])])):t("",!0),ue.value||!1===R.value.hasIcon?(f(),n("div",Vs,v(R.value.name.charAt(0).toUpperCase()),1)):t("",!0)]),i("div",_s,[i("div",Ss,[i("h1",Ts,v(R.value.name),1),i("div",Ms,[void 0!==R.value.rating?(f(),n("div",Rs,[i("span",$s,v(R.value.rating.toFixed(1)),1),o(T,{icon:"fluent-color:star-24",class:"star-icon"}),R.value.ratingCount?(f(),n("span",Ds,v(R.value.ratingCount)+"个评级 ",1)):t("",!0)])):t("",!0),R.value.category||Ce()?(f(),n("span",Es,"·")):t("",!0),R.value.category||Ce()?(f(),n("span",Bs,v(R.value.category||Ce()),1)):t("",!0)]),i("div",js,[i("span",Fs,"版本 "+v(R.value.version),1),R.value.bundleVersion?(f(),n("span",qs," ("+v(R.value.bundleVersion)+") ",1)):t("",!0),R.value.injection&&R.value.injection.version?(f(),n("span",Ps," · 已注入 "+v(R.value.injection.version),1)):t("",!0),o(gs,{"max-width":"350px"},{trigger:U(()=>[o(T,{icon:"mdi:information-outline",class:"info-trigger-icon"})]),default:U(()=>[i("div",zs,[i("div",Os,[a[15]||(a[15]=i("span",{class:"detail-label"},"Bundle ID:",-1)),i("span",Hs,v(R.value.bundleId),1)]),i("div",Gs,[a[16]||(a[16]=i("span",{class:"detail-label"},"路径:",-1)),i("span",Ws,v(R.value.path),1)])])]),_:1})]),i("div",Ks,[i("p",Ys,v(R.value.description||Ue()),1),le.value?(f(),n("button",{key:0,class:"expand-btn-inline",onClick:a[0]||(a[0]=e=>W.value=!W.value)},v(W.value?"收起":"详细显示"),1)):t("",!0)]),i("div",Js,["upgrade_available"===R.value.status?(f(),n("button",{key:0,class:"install-btn-compact btn-primary",onClick:ke,disabled:x(re)},[o(T,{icon:"mdi:update",class:"btn-icon"}),c(" "+v(x(re)?"更新中...":"更新"),1)],8,Qs)):"supported"===R.value.status?(f(),n("button",{key:1,class:"install-btn-compact btn-primary",onClick:ke,disabled:x(re)},[o(T,{icon:"mdi:power",class:"btn-icon"}),c(" "+v(x(re)?"处理中...":"激活"),1)],8,Xs)):"injected"===R.value.status?(f(),n("button",{key:2,class:"install-btn-compact btn-success",onClick:fe},[o(T,{icon:"mdi:open-in-app",class:"btn-icon"}),a[17]||(a[17]=c(" 打开 ",-1))])):(f(),n("button",{key:3,class:"install-btn-compact btn-secondary",onClick:a[1]||(a[1]=(...e)=>x(be)&&x(be)(...e)),disabled:x(re)},[o(T,{icon:"fluent-color:arrow-sync-24",class:"btn-icon"}),c(" "+v(x(re)?"处理中...":"重新安装"),1)],8,Zs)),Z.value.length>0?(f(),n("div",en,[1===Z.value.length?(f(),n("button",{key:0,class:"install-btn-compact btn-warning",onClick:a[2]||(a[2]=e=>Qe(Z.value[0]))},[o(T,{icon:"mdi:download",class:"btn-icon"}),a[18]||(a[18]=c(" 下载预破解包 ",-1))])):(f(),n("div",an,[i("button",{class:"install-btn-compact btn-warning download-btn-with-dropdown",onClick:a[3]||(a[3]=e=>ee.value=!ee.value)},[o(T,{icon:"mdi:download",class:"btn-icon"}),a[19]||(a[19]=c(" 下载预破解包 ",-1))]),o(N,{name:"dropdown-fade"},{default:U(()=>[ee.value?(f(),n("div",{key:0,class:"download-dropdown",onClick:a[4]||(a[4]=k(()=>{},["stop"]))},[(f(!0),n(p,null,m(Z.value,(e,a)=>(f(),n("div",{key:a,class:"download-option",onClick:a=>{Qe(e),ee.value=!1}},[o(T,{icon:"mdi:package-variant",class:"option-icon"}),i("div",sn,[i("span",nn,[c(" 版本 "+v(e.version)+" ",1),e.beta?(f(),n("span",tn,"Beta")):t("",!0)]),e.uploader?(f(),n("span",on," 上传者: "+v(e.uploader),1)):t("",!0)]),o(T,{icon:"mdi:download",class:"option-action-icon"})],8,ln))),128))])):t("",!0)]),_:1})]))])):t("",!0),i("button",{class:"report-btn-compact",onClick:Le},[o(T,{icon:"mdi:alert-circle-outline",class:"btn-icon"}),a[20]||(a[20]=c(" 报告问题 ",-1))]),i("button",{class:"share-btn-compact",onClick:Ne},[o(T,{icon:"fluent-color:share-ios-24"})])]),a[21]||(a[21]=i("div",{class:"provider-info-compact"}," 将进行下载和安装 ",-1))])])]),R.value.screenshots&&R.value.screenshots.length>0?(f(),n("div",un,[i("div",cn,[a[23]||(a[23]=i("h2",null,"屏幕截图",-1)),i("button",rn,[a[22]||(a[22]=c(" 查看全部 ",-1)),o(T,{icon:"fluent-color:arrow-right-24"})])]),i("div",dn,[(f(!0),n(p,null,m(R.value.screenshots.slice(0,2),(e,a)=>(f(),n("div",{key:a,class:"screenshot-item"},[i("img",{src:e,alt:`${R.value.name} 截图 ${a+1}`},null,8,vn)]))),128))])])):t("",!0),W.value?(f(),n("div",pn,[a[24]||(a[24]=i("h2",{class:"section-title"},"描述",-1)),i("div",mn,[R.value.description?(f(),n("p",yn,v(R.value.description),1)):(f(),n("p",bn,v(Ue()),1))])])):t("",!0),i("div",gn,[a[36]||(a[36]=i("div",{class:"rating-header"},[i("h2",{class:"section-title"},"评分")],-1)),X.value||void 0!==R.value.rating?(f(),n("div",hn,[i("div",kn,[i("div",fn,[i("div",wn,[i("div",In,[i("span",Cn,v(((null==(l=X.value)?void 0:l.averageRating)||R.value.rating||0).toFixed(1)),1),i("span",An,v((null==(s=X.value)?void 0:s.totalCount)||R.value.ratingCount||0)+"个评分",1)]),i("div",Un,[(f(!0),n(p,null,m(xe.value,(e,a)=>(f(),n("div",{key:a,class:"rating-bar-item"},[i("span",xn,v(5-a),1),o(T,{icon:"fluent-color:star-16",class:"bar-star-icon"}),i("div",Nn,[i("div",{class:"bar-fill",style:g({width:`${e.percentage}%`})},null,4)]),i("span",Ln,v(e.count),1)]))),128))]),R.value.features&&R.value.features.length>0||R.value.developer||Ae()?(f(),n("div",Vn,[i("div",_n,[R.value.features&&R.value.features.length>0?(f(),n("div",Sn,[i("div",Tn,[o(T,{icon:"mdi:sparkles",class:"info-icon"})]),i("div",Mn,[a[25]||(a[25]=i("span",{class:"info-label"},"功能亮点",-1)),i("div",Rn,[(f(!0),n(p,null,m(R.value.features,(e,a)=>(f(),n("span",{key:a,class:"feature-tag"},v(e),1))),128))])])])):t("",!0),R.value.developer||Ae()?(f(),n("div",$n,[i("div",Dn,[o(T,{icon:"mdi:account",class:"info-icon"})]),i("div",En,[a[26]||(a[26]=i("span",{class:"info-label"},"开发者",-1)),i("span",Bn,v(R.value.developer||Ae()),1)])])):t("",!0)]),Y.value.length>0||X.value&&X.value.totalCount>0||R.value.update&&R.value.update.versions&&R.value.update.versions.length>0||R.value.screenshots&&R.value.screenshots.length>0?(f(),n("div",jn,[Y.value.length>0?(f(),n("div",Fn,[i("div",qn,[o(T,{icon:"fluent-color:comment-multiple-16",class:"info-icon"})]),i("div",Pn,[a[27]||(a[27]=i("span",{class:"info-label"},"用户评论",-1)),i("span",zn,v(Y.value.length)+"条",1)])])):t("",!0),X.value&&X.value.totalCount>0?(f(),n("div",On,[i("div",Hn,[o(T,{icon:"fluent-color:star-16",class:"info-icon"})]),i("div",Gn,[a[28]||(a[28]=i("span",{class:"info-label"},"总评分",-1)),i("span",Wn,v(X.value.totalCount)+"个",1)])])):t("",!0),R.value.update&&R.value.update.versions&&R.value.update.versions.length>0?(f(),n("div",Kn,[i("div",Yn,[o(T,{icon:"mdi:history",class:"info-icon"})]),i("div",Jn,[a[29]||(a[29]=i("span",{class:"info-label"},"历史版本",-1)),i("span",Qn,v(R.value.update.versions.length)+"个",1)])])):t("",!0),R.value.screenshots&&R.value.screenshots.length>0?(f(),n("div",Xn,[i("div",Zn,[o(T,{icon:"mdi:image-multiple",class:"info-icon"})]),i("div",et,[a[30]||(a[30]=i("span",{class:"info-label"},"截图",-1)),i("span",at,v(R.value.screenshots.length)+"张",1)])])):t("",!0)])):t("",!0)])):t("",!0)])]),i("div",lt,[R.value.update&&R.value.update.latestVersion&&R.value.update.latestVersion!==R.value.version?(f(),n("div",st,[i("div",nt,[o(T,{icon:"mdi:arrow-up-circle",class:"info-icon"})]),i("div",tt,[a[31]||(a[31]=i("span",{class:"info-label"},"存在更新版本",-1)),i("span",it,v(R.value.update.latestVersion),1)])])):t("",!0),Z.value.length>0?(f(),n("div",ot,[i("div",ut,[o(T,{icon:"mdi:package-variant",class:"info-icon"})]),i("div",ct,[a[32]||(a[32]=i("span",{class:"info-label"},"存在预破解包",-1)),i("span",rt,v(Z.value.map(e=>e.version).join(", ")),1)])])):t("",!0)])])])):(f(),n("div",dt,[...a[33]||(a[33]=[i("p",null,"暂无评分",-1)])])),x(y)?t("",!0):(f(),n("button",{key:2,class:"login-to-review-btn",onClick:Re},[o(T,{icon:"fluent-color:comment-multiple-16",class:"btn-icon"}),a[34]||(a[34]=c(" 登录以进行评分或评价 ",-1))])),x(y)?(f(),n("div",vt,[a[35]||(a[35]=i("div",{class:"rating-input-label"},"为这个应用评分",-1)),i("div",pt,[(f(),n(p,null,m(5,e=>i("button",{key:e,class:u(["star-btn",{active:J.value>=e,hover:Q.value>=e}]),onClick:a=>{return l=e,void(y.value?J.value=l:H.value=!0)
var l},onMouseenter:a=>Q.value=e,onMouseleave:a[5]||(a[5]=e=>Q.value=0)},[o(T,{icon:"fluent-color:star-24"}),Q.value===e?(f(),n("span",yt,v(e)+"分",1)):t("",!0)],42,mt)),64))]),J.value>0?(f(),n("div",bt,[i("button",{class:"submit-rating-btn",onClick:je}," 提交评分 ")])):t("",!0)])):t("",!0)]),o(Vl,{"bundle-id":R.value.bundleId,comments:Y.value,onSubmitComment:ze,onLikeComment:Oe,onDislikeComment:He,onLikeReply:Ge,onDislikeReply:We,onSubmitReply:Ke},null,8,["bundle-id","comments"]),R.value?(f(),n("div",gt,[a[37]||(a[37]=i("h2",{class:"section-title"},"可用版本",-1)),o(j,{bundleId:R.value.bundleId,versions:null==(r=R.value.update)?void 0:r.versions},null,8,["bundleId","versions"])])):t("",!0)]),i("div",ht,[o(Ra,{"current-bundle-id":R.value.bundleId},null,8,["current-bundle-id"])])]),o(z,{visible:x(de),title:x(ve),logs:x(pe),loading:x(re),status:x(me),"can-close":"loading"!==x(me),onClose:x(ge)},null,8,["visible","title","logs","loading","status","can-close","onClose"]),o(fa,{visible:O.value,app:R.value,onClose:a[6]||(a[6]=e=>O.value=!1),onSuccess:Me},null,8,["visible","app"]),o(F,{show:H.value,onClose:$e,onSuccess:De},null,8,["show"]),o(ys,{visible:G.value,"app-info":R.value,onClose:Ve,onSubmit:_e},null,8,["visible","app-info"])])):t("",!0),o(N,{name:"sticky-header"},{default:U(()=>[K.value&&R.value?(f(),n("div",kt,[i("div",ft,[i("div",wt,[!1!==R.value.hasIcon&&he()?(f(),n("img",{key:0,src:he(),alt:R.value.name,onError:Te},null,40,It)):(f(),n("div",Ct,v(R.value.name.charAt(0).toUpperCase()),1))]),i("div",At,[i("h2",Ut,v(R.value.name),1),i("p",xt,v(R.value.developer||Ae()),1),i("div",Nt,[i("span",Lt,"版本 "+v(R.value.version),1),R.value.bundleVersion?(f(),n("span",Vt," ("+v(R.value.bundleVersion)+") ",1)):t("",!0),R.value.injection&&R.value.injection.version?(f(),n("span",_t," · 已注入 "+v(R.value.injection.version),1)):t("",!0),R.value.update&&R.value.update.latestVersion&&R.value.update.latestVersion!==R.value.version?(f(),n("span",St," · 最新 "+v(R.value.update.latestVersion),1)):t("",!0),Z.value.length>0?(f(),n("span",Tt," · 预破解包 "+v(Z.value.map(e=>e.version).join(", ")),1)):t("",!0),void 0!==R.value.rating?(f(),n("span",Mt,[c(" · "+v(R.value.rating.toFixed(1))+" ",1),o(T,{icon:"fluent-color:star-16",class:"sticky-star-icon"})])):t("",!0)])]),i("div",Rt,[i("div",$t,["upgrade_available"===R.value.status?(f(),n("button",{key:0,class:"sticky-install-btn btn-primary",onClick:ke,disabled:x(re)},[o(T,{icon:"mdi:update",class:"btn-icon"}),c(" "+v(x(re)?"更新中...":"更新"),1)],8,Dt)):"supported"===R.value.status?(f(),n("button",{key:1,class:"sticky-install-btn btn-primary",onClick:ke,disabled:x(re)},[o(T,{icon:"mdi:power",class:"btn-icon"}),c(" "+v(x(re)?"处理中...":"激活"),1)],8,Et)):"injected"===R.value.status?(f(),n("button",{key:2,class:"sticky-install-btn btn-success",onClick:fe},[o(T,{icon:"mdi:open-in-app",class:"btn-icon"}),a[38]||(a[38]=c(" 打开 ",-1))])):(f(),n("button",{key:3,class:"sticky-install-btn btn-secondary",onClick:a[7]||(a[7]=(...e)=>x(be)&&x(be)(...e)),disabled:x(re)},[o(T,{icon:"fluent-color:arrow-sync-24",class:"btn-icon"}),c(" "+v(x(re)?"处理中...":"重新安装"),1)],8,Bt)),Z.value.length>0?(f(),n("div",jt,[1===Z.value.length?(f(),n("button",{key:0,class:"sticky-install-btn btn-warning",onClick:a[8]||(a[8]=e=>Qe(Z.value[0]))},[o(T,{icon:"mdi:download",class:"btn-icon"}),a[39]||(a[39]=c(" 下载预破解包 ",-1))])):(f(),n("div",Ft,[i("button",{class:"sticky-install-btn btn-warning download-btn-with-dropdown",onClick:a[9]||(a[9]=e=>ee.value=!ee.value)},[o(T,{icon:"mdi:download",class:"btn-icon"}),a[40]||(a[40]=c(" 下载预破解包 ",-1))]),o(N,{name:"dropdown-fade"},{default:U(()=>[ee.value?(f(),n("div",{key:0,class:"download-dropdown sticky-download-dropdown",onClick:a[10]||(a[10]=k(()=>{},["stop"]))},[(f(!0),n(p,null,m(Z.value,(e,a)=>(f(),n("div",{key:a,class:"download-option",onClick:a=>{Qe(e),ee.value=!1}},[o(T,{icon:"mdi:package-variant",class:"option-icon"}),i("div",Pt,[i("span",zt,[c(" 版本 "+v(e.version)+" ",1),e.beta?(f(),n("span",Ot,"Beta")):t("",!0)]),e.uploader?(f(),n("span",Ht," 上传者: "+v(e.uploader),1)):t("",!0)]),o(T,{icon:"mdi:download",class:"option-action-icon"})],8,qt))),128))])):t("",!0)]),_:1})]))])):t("",!0)]),i("div",Gt,[i("span",null,"由 "+v(R.value.developer||Ae())+" 提供和更新",1),a[41]||(a[41]=i("span",null,"·将进行下载和安装",-1))])])])])):t("",!0)]),_:1})])}}}),[["__scopeId","data-v-75b6a5b3"]])
export{Wt as default}