import{s as Pe,_ as H,u as Re,a as ue,b as X,r as u,c as A,w as ce,d as S,o as _,e as j,f as b,g as V,h as de,i as e,j as M,t as g,k as c,l as a,m as K,n as pe,T as me,E as h,p as Te,q as qe,v as Le,x as G,y as Ie,z as te,A as ae,B as J,C as le,D as oe,F as ne,G as ie,H as Me}from"./index-Bg_jr9nS.js";function Ne(T){return Pe({url:"/system/music/search",method:"get",params:{keyword:T}})}function re(T,U,w=!1){const d=new URLSearchParams;return d.set("url",T),d.set("name",U||"music-preview"),d.set("download",String(w)),`/prod-api/system/music/audio?${d.toString()}`}const Ee={class:"console-modal"},Be={class:"modal-head"},Ae={class:"field-shell"},Oe={class:"field-icon"},Ke={class:"field-shell"},De={class:"field-icon"},Fe={class:"form-note"},Je={key:0},je={key:1},ze={__name:"ConsoleLoginModal",props:{modelValue:{type:Boolean,default:!1},closable:{type:Boolean,default:!0}},emits:["update:modelValue","success","close"],setup(T,{emit:U}){const w=U,d=Re(),f=ue(),k=X(),v=u({username:"admin",password:"admin123",code:"",uuid:""}),y=u(!1),x=u(void 0),C=u(null),r=u(!1),N=A(()=>({username:[{required:!0,trigger:"blur",message:"请输入账号"}],password:[{required:!0,trigger:"blur",message:"请输入密码"}]})),q=A(()=>{var l;return((l=f.query)==null?void 0:l.registered)==="1"?"账号已创建成功,输入密码后可直接进入后台。":"输入账号和密码后直接进入后台管理。"});ce(()=>f.fullPath,()=>{var l,i,p;x.value=(l=f.query)==null?void 0:l.redirect,typeof((i=f.query)==null?void 0:i.username)=="string"&&f.query.username&&(v.value.username=f.query.username,v.value.password=""),((p=f.query)==null?void 0:p.registered)==="1"&&!r.value&&(h.success("注册成功,请登录系统"),r.value=!0)},{immediate:!0});function $(){w("update:modelValue",!1),w("close")}function P(){if(!C.value){h.error("登录表单未初始化");return}C.value.validate(async l=>{if(!l){h.warning("请输入账号和密码");return}y.value=!0;try{await d.login(v.value);const i=f.query||{},p=Object.keys(i).reduce((o,m)=>(["redirect","registered","username"].includes(m)||(o[m]=i[m]),o),{});if(await k.push({path:x.value||"/index",query:p}),k.currentRoute.value.path==="/login")throw new Error("登录后未能进入后台,请稍后重试");w("success"),w("update:modelValue",!1)}catch(i){h.error((i==null?void 0:i.message)||"登录失败,请重试"),console.error("登录失败:",i)}finally{y.value=!1}})}return(l,i)=>{const p=S("svg-icon"),o=S("el-input"),m=S("el-form-item"),R=S("router-link"),I=S("el-button"),O=S("el-form");return _(),j(me,{name:"console-fade"},{default:b(()=>[T.modelValue?(_(),V("div",{key:0,class:"console-modal-mask",onClick:de($,["self"])},[e("section",Ee,[T.closable?(_(),V("button",{key:0,type:"button",class:"close-btn",onClick:$},"×")):M("",!0),e("header",Be,[i[2]||(i[2]=e("p",{class:"head-tag"},"CONTROL ACCESS",-1)),i[3]||(i[3]=e("h2",null,"登录后台",-1)),e("p",null,g(q.value),1)]),c(O,{ref_key:"loginRef",ref:C,model:a(v),rules:N.value,class:"login-form"},{default:b(()=>[c(m,{prop:"username",class:"compact-item"},{default:b(()=>[e("div",Ae,[e("span",Oe,[c(p,{"icon-class":"user",class:"input-icon"})]),c(o,{modelValue:a(v).username,"onUpdate:modelValue":i[0]||(i[0]=E=>a(v).username=E),type:"text",autocomplete:"off",placeholder:"账号"},null,8,["modelValue"])])]),_:1}),c(m,{prop:"password",class:"compact-item"},{default:b(()=>[e("div",Ke,[e("span",De,[c(p,{"icon-class":"password",class:"input-icon"})]),c(o,{modelValue:a(v).password,"onUpdate:modelValue":i[1]||(i[1]=E=>a(v).password=E),type:"password",autocomplete:"off",placeholder:"密码","show-password":"",onKeyup:K(P,["enter"])},null,8,["modelValue"])])]),_:1}),e("div",Fe,[i[5]||(i[5]=e("span",null,"当前登录不校验验证码。",-1)),c(R,{class:"action-link",to:"/register"},{default:b(()=>[...i[4]||(i[4]=[pe("去注册",-1)])]),_:1})]),c(m,{class:"submit-row"},{default:b(()=>[c(I,{loading:a(y),type:"primary",class:"submit-btn",onClick:P},{default:b(()=>[a(y)?(_(),V("span",je,"登录中...")):(_(),V("span",Je,"进入后台"))]),_:1},8,["loading"])]),_:1})]),_:1},8,["model","rules"])])])):M("",!0)]),_:1})}}},Ge=H(ze,[["__scopeId","data-v-7c5ed1a7"]]),He={class:"console-modal"},Xe={key:1,class:"success-panel"},Qe={class:"success-copy"},We={class:"field-shell"},Ye={class:"field-icon"},Ze={class:"field-shell"},es={class:"field-icon"},ss={class:"field-shell"},ts={class:"field-icon"},as={class:"captcha-shell"},ls={class:"field-shell"},os={class:"field-icon"},ns=["src"],is={class:"form-note"},rs={key:0},us={key:1},cs={__name:"ConsoleRegisterModal",props:{modelValue:{type:Boolean,default:!1},closable:{type:Boolean,default:!0}},emits:["update:modelValue","success","close"],setup(T,{emit:U}){const w=U,d=X(),f=u(null),k=u(!1),v=u(!1),y=u(""),x=u(!1),C=u(""),r=u({username:"",password:"",confirmPassword:"",code:"",uuid:""}),q={username:[{required:!0,trigger:"blur",message:"请输入账号"},{min:2,max:20,trigger:"blur",message:"账号长度需在 2 到 20 个字符之间"}],password:[{required:!0,trigger:"blur",message:"请输入密码"},{min:5,max:20,trigger:"blur",message:"密码长度需在 5 到 20 个字符之间"},{pattern:/^[^<>"'|\\]+$/,trigger:"blur",message:"密码不能包含非法字符"}],confirmPassword:[{required:!0,trigger:"blur",message:"请再次输入密码"},{validator:(p,o,m)=>{if(r.value.password!==o){m(new Error("两次输入的密码不一致"));return}m()},trigger:"blur"}],code:[{required:!0,trigger:"change",message:"请输入验证码"}]};function $(){w("update:modelValue",!1),w("close")}function P(){if(!f.value){h.error("注册表单未初始化");return}f.value.validate(p=>{p&&(k.value=!0,qe({username:r.value.username,password:r.value.password,code:r.value.code,uuid:r.value.uuid}).then(()=>{C.value=r.value.username,x.value=!0}).catch(o=>{h.error((o==null?void 0:o.message)||"注册失败"),v.value&&i()}).finally(()=>{k.value=!1}))})}function l(){w("success"),w("update:modelValue",!1),x.value=!1,d.push({path:"/login",query:{username:C.value,registered:"1"}})}function i(){Te().then(p=>{v.value=(p==null?void 0:p.captchaEnabled)===void 0?!0:!!p.captchaEnabled,v.value?(y.value="data:image/gif;base64,"+(p.img||""),r.value.uuid=p.uuid||""):(r.value.code="",r.value.uuid="")}).catch(p=>{console.error("获取验证码失败:",p),v.value=!1,r.value.code="",r.value.uuid=""})}return i(),(p,o)=>{const m=S("svg-icon"),R=S("el-input"),I=S("el-form-item"),O=S("router-link"),E=S("el-button"),z=S("el-form");return _(),j(me,{name:"console-fade"},{default:b(()=>[T.modelValue?(_(),V("div",{key:0,class:"console-modal-mask",onClick:de($,["self"])},[e("section",He,[T.closable?(_(),V("button",{key:0,type:"button",class:"close-btn",onClick:$},"×")):M("",!0),o[8]||(o[8]=e("header",{class:"modal-head"},[e("p",{class:"head-tag"},"CREATE ACCOUNT"),e("h2",null,"创建账号"),e("p",null,"先完成基础注册,再返回登录进入后台。")],-1)),a(x)?(_(),V("div",Xe,[o[5]||(o[5]=e("div",{class:"success-badge"},"✓",-1)),e("div",Qe,[o[4]||(o[4]=e("p",{class:"success-title"},"注册成功",-1)),e("p",null,"账号 "+g(a(C))+" 已创建,现在可以直接登录。",1)]),e("button",{type:"button",class:"success-btn",onClick:l},"去登录")])):M("",!0),a(x)?M("",!0):(_(),j(z,{key:2,ref_key:"registerRef",ref:f,model:a(r),rules:q,class:"register-form"},{default:b(()=>[c(I,{prop:"username",class:"compact-item"},{default:b(()=>[e("div",We,[e("span",Ye,[c(m,{"icon-class":"user",class:"input-icon"})]),c(R,{modelValue:a(r).username,"onUpdate:modelValue":o[0]||(o[0]=L=>a(r).username=L),type:"text",autocomplete:"off",placeholder:"账号"},null,8,["modelValue"])])]),_:1}),c(I,{prop:"password",class:"compact-item"},{default:b(()=>[e("div",Ze,[e("span",es,[c(m,{"icon-class":"password",class:"input-icon"})]),c(R,{modelValue:a(r).password,"onUpdate:modelValue":o[1]||(o[1]=L=>a(r).password=L),type:"password",autocomplete:"off",placeholder:"密码","show-password":""},null,8,["modelValue"])])]),_:1}),c(I,{prop:"confirmPassword",class:"compact-item"},{default:b(()=>[e("div",ss,[e("span",ts,[c(m,{"icon-class":"password",class:"input-icon"})]),c(R,{modelValue:a(r).confirmPassword,"onUpdate:modelValue":o[2]||(o[2]=L=>a(r).confirmPassword=L),type:"password",autocomplete:"off",placeholder:"确认密码","show-password":"",onKeyup:K(P,["enter"])},null,8,["modelValue"])])]),_:1}),a(v)?(_(),j(I,{key:0,prop:"code",class:"compact-item"},{default:b(()=>[e("div",as,[e("div",ls,[e("span",os,[c(m,{"icon-class":"validCode",class:"input-icon"})]),c(R,{modelValue:a(r).code,"onUpdate:modelValue":o[3]||(o[3]=L=>a(r).code=L),type:"text",autocomplete:"off",placeholder:"验证码",onKeyup:K(P,["enter"])},null,8,["modelValue"])]),e("img",{src:a(y),class:"captcha-img",onClick:i},null,8,ns)])]),_:1})):M("",!0),e("div",is,[o[7]||(o[7]=e("span",null,"仅提交后端稳定支持的最小注册参数。",-1)),c(O,{class:"action-link",to:"/login"},{default:b(()=>[...o[6]||(o[6]=[pe("返回登录",-1)])]),_:1})]),c(I,{class:"submit-row"},{default:b(()=>[c(E,{loading:a(k),type:"primary",class:"submit-btn",onClick:P},{default:b(()=>[a(k)?(_(),V("span",us,"提交中...")):(_(),V("span",rs,"创建账号"))]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"]))])])):M("",!0)]),_:1})}}},ds=H(cs,[["__scopeId","data-v-a8005e9d"]]),ps={class:"console-shell"},ms={class:"console-frame"},fs={class:"stage"},vs={class:"topbar"},gs={class:"search-box"},hs={class:"top-actions"},_s={class:"profile-avatar"},ys={class:"profile-label"},bs={class:"board"},ws={class:"hero-card music-card"},ks={class:"player-panel"},Cs={class:"track-meta"},$s={class:"music-search-row"},Vs={class:"progress-line"},xs={class:"playlist-actions"},Ss={class:"player-controls"},Us={class:"search-result-list"},Ps=["onClick"],Rs={class:"track-chip-title"},Ts={class:"track-chip-meta"},qs={key:0,class:"track-chip empty-state"},Ls={class:"hero-actions"},Is={class:"panel-card service-card"},Ms={class:"metric-value"},Ns={class:"service-grid"},Es=["onClick"],Bs={__name:"index",setup(T){const U=X(),w=ue(),d=u(null),f=u(""),k=u(""),v=u(!1),y=u([]),x=u(-1),C=u(!1),r=u(0),N=u(0),q=u(L("landing-music-favorites")),$=u(L("landing-music-playlists")),P=u(fe("landing-music-downloaded")),l=Le(z()),i=[{name:"Jenkins",desc:"持续集成",href:"/jenkins/",external:!0},{name:"Nacos",desc:"注册配置",href:"/nacos/",external:!0},{name:"XXL-JOB",desc:"任务调度",href:"/xxl-job-admin/",external:!0},{name:"Seata",desc:"事务控制",href:"/seata/",external:!0},{name:"MinIO",desc:"文件对象",href:"/minio/",external:!0},{name:"ncm2mp3",desc:"音频转换",href:"/ncm2mp3/",external:!0}],p=A(()=>G()?"进入后台":"登录"),o=A(()=>G()?"A":"→"),m=u(!1),R=u(!1),I=A(()=>N.value?Math.min(100,r.value/N.value*100):0),O=A(()=>l.artwork?{backgroundImage:`url(${l.artwork})`,backgroundSize:"cover",backgroundPosition:"center"}:{}),E=A(()=>q.value.some(s=>s.id===l.id));function z(){return{id:0,title:"Neon Console",artist:"公开试听模式",album:"请输入歌名开始搜索",artwork:"",previewUrl:"",source:"Apple Music"}}function L(s){try{const t=localStorage.getItem(s);return t?JSON.parse(t):[]}catch{return[]}}function fe(s){try{const t=sessionStorage.getItem(s);return t?JSON.parse(t):[]}catch{return[]}}function Q(s,t){localStorage.setItem(s,JSON.stringify(t))}function ve(s,t){sessionStorage.setItem(s,JSON.stringify(t))}function ge(s){l.id=s.id,l.title=s.title,l.artist=s.artist,l.album=s.album,l.artwork=s.artwork,l.previewUrl=s.previewUrl,l.source=s.source}function W(){if(G()){U.push("/index");return}U.push("/login")}function Y(s){if(s.external){window.open(s.href,"_blank");return}U.push(s.href)}async function D(){const s=k.value.trim()||f.value.trim();if(!(!s||v.value)){v.value=!0;try{const n=(await Ne(s)).data||[];if(y.value=n,!n.length){h.warning("没有找到可试听的音乐结果");return}F(n[0],0,!1),h.success(`找到 ${n.length} 首可试听歌曲`)}catch{h.error("音乐搜索暂时不可用")}finally{v.value=!1}}}function F(s,t,n){x.value=t,ge(s),r.value=0,N.value=0,d.value&&(d.value.src=re(s.previewUrl,`${s.artist}-${s.title}`,!1),d.value.load()),n&&Z()}async function Z(){if(!l.previewUrl){k.value.trim()||f.value.trim()?await D():h.info("先输入歌名或歌手再开始播放");return}if(d.value)try{await d.value.play(),C.value=!0,be(l)}catch{h.error("当前歌曲暂时无法播放")}}function he(){d.value&&(d.value.pause(),C.value=!1)}function ee(){if(C.value){he();return}Z()}function _e(){if(!y.value.length){h.info("先搜索歌曲,再使用上一曲");return}const s=x.value<=0?y.value.length-1:x.value-1;F(y.value[s],s,!0)}function ye(){if(!y.value.length){h.info("先搜索歌曲,再使用下一曲");return}const s=x.value>=y.value.length-1?0:x.value+1;F(y.value[s],s,!0)}function be(s){if(!s.id||P.value.includes(s.id))return;P.value=[...P.value,s.id],ve("landing-music-downloaded",P.value);const t=document.createElement("a");t.href=re(s.previewUrl,`${s.artist}-${s.title}`,!0),t.target="_blank",t.rel="noreferrer",document.body.appendChild(t),t.click(),document.body.removeChild(t)}function we(){if(!l.id){h.info("先选择一首歌");return}const s=q.value.some(t=>t.id===l.id);q.value=s?q.value.filter(t=>t.id!==l.id):[...q.value,{...l}],Q("landing-music-favorites",q.value),h.success(s?"已取消收藏":"已加入收藏")}function ke(){if(!l.id){h.info("先选中一首歌再建歌单");return}const s=window.prompt("输入歌单名称",`我的歌单 ${$.value.length+1}`);if(!s||!s.trim())return;const t=s.trim(),n=$.value.find(B=>B.name===t);n?n.tracks.some(B=>B.id===l.id)||n.tracks.push({...l}):$.value=[...$.value,{name:t,tracks:[{...l}]}],Q("landing-music-playlists",$.value),h.success(`已保存到歌单:${t}`)}function Ce(){if(!$.value.length){h.info("还没有本地歌单");return}const s=$.value.map(t=>`${t.name} · ${t.tracks.length} 首`).join(" | ");h.success(s)}function se(){const s=f.value.trim();if(!s)return;const t=i.find(n=>n.name.toLowerCase().includes(s.toLowerCase()));if(t){Y(t);return}k.value=s,D()}function $e(){d.value&&(r.value=d.value.currentTime||0)}function Ve(){d.value&&(N.value=d.value.duration||0)}function xe(){C.value=!1}function Se(){w.path==="/login"&&U.push("/")}function Ue(){w.path==="/register"&&U.push("/")}return Ie(()=>{d.value&&d.value.pause()}),ce(()=>w.path,s=>{m.value=s==="/login",R.value=s==="/register"},{immediate:!0}),(s,t)=>(_(),V("div",ps,[t[10]||(t[10]=e("div",{class:"ambient ambient-left"},null,-1)),t[11]||(t[11]=e("div",{class:"ambient ambient-right"},null,-1)),e("section",ms,[e("main",fs,[e("header",vs,[e("div",gs,[t[4]||(t[4]=e("span",{class:"search-icon"},"⌕",-1)),te(e("input",{"onUpdate:modelValue":t[0]||(t[0]=n=>J(f)?f.value=n:null),type:"text",placeholder:"ai搜索音乐、项目组件、控制台入口",onKeyup:K(se,["enter"])},null,544),[[ae,a(f)]]),e("button",{type:"button",class:"search-submit",onClick:se},"ai搜索")]),e("div",hs,[e("button",{type:"button",class:"profile-chip",onClick:W},[e("span",_s,g(o.value),1),e("span",ys,g(p.value),1)])])]),e("section",bs,[e("article",ws,[t[6]||(t[6]=le('
LiveGuest Ready

Player Access

音乐播放器

现在不用登录也能直接搜歌、试听和播放。播放时会自动把当前试听音频下载到本地, 收藏和歌单先保存在当前浏览器里。

',2)),e("div",ks,[e("div",{class:"cover-disc",style:oe(O.value)},null,4),e("div",Cs,[e("strong",null,g(a(l).title),1),e("span",null,g(a(l).artist),1),e("small",null,g(a(l).album||a(l).source),1)]),e("div",$s,[te(e("input",{"onUpdate:modelValue":t[1]||(t[1]=n=>J(k)?k.value=n:null),class:"music-search-input",type:"text",placeholder:"全网搜索音乐,输入歌名或歌手",onKeyup:K(D,["enter"])},null,544),[[ae,a(k)]]),e("button",{type:"button",class:"music-search-button",onClick:D},g(a(v)?"搜索中":"搜歌"),1)]),e("div",Vs,[e("i",{style:oe({width:`${I.value}%`})},null,4)]),e("div",xs,[e("button",{type:"button",onClick:we},g(E.value?"取消收藏":"收藏"),1),e("button",{type:"button",onClick:ke},"创建歌单"),e("button",{type:"button",onClick:Ce},"歌单库 "+g(a($).length),1)]),e("div",Ss,[e("button",{type:"button",onClick:_e},"◁"),e("button",{type:"button",class:"play-btn",onClick:ee},g(a(C)?"❚❚":"▶"),1),e("button",{type:"button",onClick:ye},"▷")]),e("div",Us,[(_(!0),V(ne,null,ie(a(y),(n,B)=>(_(),V("button",{key:`${n.id}-${B}`,type:"button",class:Me(["track-chip",{"is-active":a(l).id===n.id}]),onClick:As=>F(n,B,!0)},[e("span",Rs,g(n.title),1),e("span",Ts,g(n.artist)+" · "+g(n.source),1)],10,Ps))),128)),a(y).length?M("",!0):(_(),V("div",qs,[...t[5]||(t[5]=[e("span",{class:"track-chip-title"},"还没有搜索结果",-1),e("span",{class:"track-chip-meta"},"先输入歌名或歌手,播放器会在公开音乐源里帮你找试听。",-1)])]))])]),e("div",Ls,[e("button",{type:"button",class:"primary-action",onClick:ee},g(a(C)?"暂停播放":"立即播放"),1),e("button",{type:"button",class:"secondary-action",onClick:W},g(p.value),1)]),e("audio",{ref_key:"audioRef",ref:d,preload:"none",onTimeupdate:$e,onLoadedmetadata:Ve,onEnded:xe},null,544)]),e("article",Is,[t[7]||(t[7]=e("div",{class:"card-head"},[e("div",null,[e("p",{class:"card-kicker"},"Gateway"),e("h3",null,"业务入口")]),e("span",{class:"status-dot"})],-1)),e("div",Ms,g(i.length),1),t[8]||(t[8]=e("p",{class:"metric-desc"},"当前保留的主要控制台入口",-1)),e("div",Ns,[(_(),V(ne,null,ie(i,n=>e("button",{key:n.name,type:"button",class:"service-pill",onClick:B=>Y(n)},[e("span",null,g(n.name),1),e("small",null,g(n.desc),1)],8,Es)),64))])]),t[9]||(t[9]=le('

Module Placeholder

游戏模块

Later
Game Hub

这里先继续保留占位,后面你要接正式游戏模块时,直接在这块扩展就行。

',1))])])]),c(Ge,{modelValue:a(m),"onUpdate:modelValue":t[2]||(t[2]=n=>J(m)?m.value=n:null),onClose:Se},null,8,["modelValue"]),c(ds,{modelValue:a(R),"onUpdate:modelValue":t[3]||(t[3]=n=>J(R)?R.value=n:null),onClose:Ue},null,8,["modelValue"])]))}},Ks=H(Bs,[["__scopeId","data-v-cc93a616"]]);export{Ks as default};