Browse Source

上传最新的服务后台代码

main
liwei1dao 3 months ago
parent
commit
a25b0c9fc0
  1. 2
      apps/admin/.output/nitro.json
  2. 1
      apps/admin/.output/public/_nuxt/-beHFMDW.js
  3. 1
      apps/admin/.output/public/_nuxt/68TsRI5B.js
  4. 1
      apps/admin/.output/public/_nuxt/6VNdSi_V.js
  5. 2
      apps/admin/.output/public/_nuxt/6Vsll5nc.js
  6. 1
      apps/admin/.output/public/_nuxt/B19LxAlE.js
  7. 1
      apps/admin/.output/public/_nuxt/B2Vd1HRg.js
  8. 1
      apps/admin/.output/public/_nuxt/B3ocY-Ie.js
  9. 1
      apps/admin/.output/public/_nuxt/B4xkvekX.js
  10. 4
      apps/admin/.output/public/_nuxt/BEabNURr.js
  11. 1
      apps/admin/.output/public/_nuxt/BSclnKbv.js
  12. 9
      apps/admin/.output/public/_nuxt/BYskkv1s.js
  13. 2
      apps/admin/.output/public/_nuxt/BaPL5gDJ.js
  14. 2
      apps/admin/.output/public/_nuxt/Bf0ZyEKY.js
  15. 1
      apps/admin/.output/public/_nuxt/C1U0GWax.js
  16. 1
      apps/admin/.output/public/_nuxt/C1a5GrA3.js
  17. 1
      apps/admin/.output/public/_nuxt/CDv-s6nK.js
  18. 2
      apps/admin/.output/public/_nuxt/CF1WwBSl.js
  19. 2
      apps/admin/.output/public/_nuxt/CHOPe4ZT.js
  20. 28
      apps/admin/.output/public/_nuxt/C_DpaApf.js
  21. 1
      apps/admin/.output/public/_nuxt/CcnZORBF.js
  22. 1
      apps/admin/.output/public/_nuxt/ChQPCk92.js
  23. 1
      apps/admin/.output/public/_nuxt/Ci8px2Rw.js
  24. 1
      apps/admin/.output/public/_nuxt/CnxFSuSr.js
  25. 1
      apps/admin/.output/public/_nuxt/CtB1c492.js
  26. 1
      apps/admin/.output/public/_nuxt/CtusP3zh.js
  27. 2
      apps/admin/.output/public/_nuxt/D7TmXHpa.js
  28. 2
      apps/admin/.output/public/_nuxt/D9QM7lI5.js
  29. 2
      apps/admin/.output/public/_nuxt/DACNvkq2.js
  30. 2
      apps/admin/.output/public/_nuxt/DB1wXbTP.js
  31. 1
      apps/admin/.output/public/_nuxt/DJcT_XDm.js
  32. 2
      apps/admin/.output/public/_nuxt/DOARJUYv.js
  33. 1
      apps/admin/.output/public/_nuxt/Dm32cczg.js
  34. 29
      apps/admin/.output/public/_nuxt/Dq9YeO1c.js
  35. 2
      apps/admin/.output/public/_nuxt/Dunpb1Z3.js
  36. 2
      apps/admin/.output/public/_nuxt/EInpjVbR.js
  37. 1
      apps/admin/.output/public/_nuxt/FegYaija.js
  38. 1
      apps/admin/.output/public/_nuxt/R6fio73R.js
  39. 6
      apps/admin/.output/public/_nuxt/T3_facgV.js
  40. 2
      apps/admin/.output/public/_nuxt/YYZWHM5Z.js
  41. 1
      apps/admin/.output/public/_nuxt/_name_.SM3hSUV-.css
  42. 1
      apps/admin/.output/public/_nuxt/accounts.B82323Fi.css
  43. 1
      apps/admin/.output/public/_nuxt/accounts.Bq0Boscu.css
  44. 1
      apps/admin/.output/public/_nuxt/appconfig.j94fgYL_.css
  45. 1
      apps/admin/.output/public/_nuxt/apps.BKS_pLby.css
  46. 2
      apps/admin/.output/public/_nuxt/builds/latest.json
  47. 1
      apps/admin/.output/public/_nuxt/builds/meta/1b101b0e-fb32-40fd-adf2-8e9d1b2f43f3.json
  48. 1
      apps/admin/.output/public/_nuxt/builds/meta/7536898a-7cbf-479a-b1a3-617064ef8470.json
  49. 1
      apps/admin/.output/public/_nuxt/entry.CYJ6hDh4.css
  50. 1
      apps/admin/.output/public/_nuxt/entry.CZS29VBu.css
  51. 1
      apps/admin/.output/public/_nuxt/index.BXNugdH5.css
  52. 1
      apps/admin/.output/public/_nuxt/meetingsvc.Cnu-3MbB.css
  53. 2
      apps/admin/.output/public/_nuxt/oUrQBHps.js
  54. 1
      apps/admin/.output/public/_nuxt/qiaU9ehm.js
  55. 15
      apps/admin/.output/public/_nuxt/rG8Kp0UJ.js
  56. 1
      apps/admin/.output/public/_nuxt/serviceconfig.C7KF_6ms.css
  57. 1
      apps/admin/.output/public/_nuxt/serviceconfig.Io3AqtMK.css
  58. 1
      apps/admin/.output/public/_nuxt/y51pRzN1.js
  59. 8
      apps/admin/.output/server/chunks/build/AppDeployTab-styles.B0mCMIhI.mjs
  60. 1
      apps/admin/.output/server/chunks/build/AppDeployTab-styles.B0mCMIhI.mjs.map
  61. 8
      apps/admin/.output/server/chunks/build/AppModuleTab-styles._m-oVrlE.mjs
  62. 1
      apps/admin/.output/server/chunks/build/AppModuleTab-styles._m-oVrlE.mjs.map
  63. 538
      apps/admin/.output/server/chunks/build/_name_-3YudcsGQ.mjs
  64. 1
      apps/admin/.output/server/chunks/build/_name_-3YudcsGQ.mjs.map
  65. 4
      apps/admin/.output/server/chunks/build/_name_-styles-1.mjs-vz5bkjKO.mjs
  66. 1
      apps/admin/.output/server/chunks/build/_name_-styles-1.mjs-vz5bkjKO.mjs.map
  67. 4
      apps/admin/.output/server/chunks/build/_name_-styles-2.mjs-BXCS7H7R.mjs
  68. 1
      apps/admin/.output/server/chunks/build/_name_-styles-2.mjs-BXCS7H7R.mjs.map
  69. 13
      apps/admin/.output/server/chunks/build/_name_-styles.DaB9D0lC.mjs
  70. 1
      apps/admin/.output/server/chunks/build/_name_-styles.DaB9D0lC.mjs.map
  71. 165
      apps/admin/.output/server/chunks/build/accounts-D3gizV-b.mjs
  72. 1
      apps/admin/.output/server/chunks/build/accounts-D3gizV-b.mjs.map
  73. 165
      apps/admin/.output/server/chunks/build/accounts-DMzzARF9.mjs
  74. 1
      apps/admin/.output/server/chunks/build/accounts-DMzzARF9.mjs.map
  75. 8
      apps/admin/.output/server/chunks/build/accounts-styles.CwGaTVL4.mjs
  76. 1
      apps/admin/.output/server/chunks/build/accounts-styles.CwGaTVL4.mjs.map
  77. 8
      apps/admin/.output/server/chunks/build/accounts-styles.DcThijbg.mjs
  78. 1
      apps/admin/.output/server/chunks/build/accounts-styles.DcThijbg.mjs.map
  79. 191
      apps/admin/.output/server/chunks/build/appconfig-DgyZbLy-.mjs
  80. 1
      apps/admin/.output/server/chunks/build/appconfig-DgyZbLy-.mjs.map
  81. 8
      apps/admin/.output/server/chunks/build/appconfig-styles.C960WaXM.mjs
  82. 1
      apps/admin/.output/server/chunks/build/appconfig-styles.C960WaXM.mjs.map
  83. 310
      apps/admin/.output/server/chunks/build/apps-M35AvXEe.mjs
  84. 1
      apps/admin/.output/server/chunks/build/apps-M35AvXEe.mjs.map
  85. 8
      apps/admin/.output/server/chunks/build/apps-styles.ohrc3N5k.mjs
  86. 1
      apps/admin/.output/server/chunks/build/apps-styles.ohrc3N5k.mjs.map
  87. 4
      apps/admin/.output/server/chunks/build/calltranslate-BUGc4owc.mjs
  88. 1
      apps/admin/.output/server/chunks/build/calltranslate-BUGc4owc.mjs.map
  89. 1
      apps/admin/.output/server/chunks/build/calltranslate-Bavowmkg.mjs.map
  90. 2
      apps/admin/.output/server/chunks/build/client.precomputed.mjs
  91. 22
      apps/admin/.output/server/chunks/build/code-LMhiXPoc.mjs
  92. 1
      apps/admin/.output/server/chunks/build/code-LMhiXPoc.mjs.map
  93. 1
      apps/admin/.output/server/chunks/build/code-RXZTcCgt.mjs.map
  94. 1
      apps/admin/.output/server/chunks/build/dashboard-C1ojHDcl.mjs.map
  95. 4
      apps/admin/.output/server/chunks/build/dashboard-Dq9mxBpq.mjs
  96. 1
      apps/admin/.output/server/chunks/build/dashboard-Dq9mxBpq.mjs.map
  97. 12
      apps/admin/.output/server/chunks/build/default-B-A39ome.mjs
  98. 1
      apps/admin/.output/server/chunks/build/default-B-A39ome.mjs.map
  99. 1
      apps/admin/.output/server/chunks/build/default-Vvv7KKiT.mjs.map
  100. 62
      apps/admin/.output/server/chunks/build/device-BBb3lo0K.mjs

2
apps/admin/.output/nitro.json

@ -1,5 +1,5 @@
{ {
"date": "2026-07-07T06:47:48.522Z", "date": "2026-07-22T04:12:39.683Z",
"preset": "node-server", "preset": "node-server",
"framework": { "framework": {
"name": "nuxt", "name": "nuxt",

1
apps/admin/.output/public/_nuxt/-beHFMDW.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/68TsRI5B.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/6VNdSi_V.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CEy0BeiT.js → apps/admin/.output/public/_nuxt/6Vsll5nc.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/B19LxAlE.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/B2Vd1HRg.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/B3ocY-Ie.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/B4xkvekX.js

File diff suppressed because one or more lines are too long

4
apps/admin/.output/public/_nuxt/CHwWlLZM.js → apps/admin/.output/public/_nuxt/BEabNURr.js

@ -1,4 +1,4 @@
import{g as z,j as G,K as P,c as a,a as e,d as u,k as x,p as U,F as f,r as B,m as Y,q as Z,t as n,s as i,A as E,o,n as F,l as A,_ as J}from"./CfpW9SkI.js";import{u as Q}from"./DSu8q42f.js";import{u as W}from"./CMwGY1Mu.js";import"./DL330dAC.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=z({__name:"statlog",setup(Ct){const{webApi:I}=Q(),{success:O,error:R}=W(),j={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?j[l]||l:"-"}const c=i([]),_=i(!1),g=i(""),L=i("-"),N=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function S(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const V=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function M(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function H(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+S(t.product_id)+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await I("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function K(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗? import{g as G,B as K,M as P,c as a,a as e,d as u,m as x,v as B,F as f,r as U,q as Y,s as Z,t as n,x as i,z as E,o,n as F,l as I,_ as J}from"./T3_facgV.js";import{u as Q}from"./YYZWHM5Z.js";import{u as W}from"./D7TmXHpa.js";import"./BaPL5gDJ.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=G({__name:"statlog",setup(Ct){const{webApi:A}=Q(),{success:O,error:R}=W(),z={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?z[l]||l:"-"}const c=i([]),_=i(!1),g=i(""),L=i("-"),M=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function N(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const S=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function V(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function H(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+N(t.product_id)+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await A("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,M.value=c.value.length?C(c.value[0].ts):"--"}catch(l){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function j(){const l=v.value||0,s=S.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗?
只清除本核对面板的记录,不影响已落库的统计数据。 只清除本核对面板的记录,不影响已落库的统计数据。
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await I("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function q(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return G(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[x(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,B(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[U,v.value,void 0,{number:!0}]]),x(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[U,b.value]]),x(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品"},null,512),[[Y,h.value]]),e("label",st,[x(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:q},null,544),[[Z,w.value]]),s[5]||(s[5]=u(" 自动刷新 ",-1))]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:m},"刷新"),e("button",{class:"btn btn-outline btn-error btn-sm",title:"清空本日核对流水(不影响已落库的统计数据),清空后可重新观察埋点是否正常进来",onClick:K},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(N.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[_.value?(o(),a("div",ct,"加载中...")):g.value?(o(),a("div",dt,"加载失败:"+n(g.value),1)):T.value.length?(o(!0),a(f,{key:3},B(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",M(t.level).cls])},n(M(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?A("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(S(t.product_id)),1)]),e("div",yt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",bt," · "+n(t.summary),1)):A("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):A("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=J(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default}; 清空后可重新触发埋点,观察是否正常进来。`))try{const r=await A("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function q(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return K(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[x(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,U(S.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[B,v.value,void 0,{number:!0}]]),x(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[B,b.value]]),x(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品"},null,512),[[Y,h.value]]),e("label",st,[x(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:q},null,544),[[Z,w.value]]),s[5]||(s[5]=u(" 自动刷新 ",-1))]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:m},"刷新"),e("button",{class:"btn btn-outline btn-error btn-sm",title:"清空本日核对流水(不影响已落库的统计数据),清空后可重新观察埋点是否正常进来",onClick:j},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(M.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[_.value?(o(),a("div",ct,"加载中...")):g.value?(o(),a("div",dt,"加载失败:"+n(g.value),1)):T.value.length?(o(!0),a(f,{key:3},U(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",V(t.level).cls])},n(V(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?I("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(N(t.product_id)),1)]),e("div",yt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",bt," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=J(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default};

1
apps/admin/.output/public/_nuxt/BSclnKbv.js

File diff suppressed because one or more lines are too long

9
apps/admin/.output/public/_nuxt/BYskkv1s.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DL330dAC.js → apps/admin/.output/public/_nuxt/BaPL5gDJ.js

@ -1 +1 @@
import{e as f,a5 as p,a6 as c,A as r}from"./CfpW9SkI.js";const l="$s";function y(...t){const a=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(a);const[n,e]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(e!==void 0&&typeof e!="function")throw new Error("[nuxt] [useState] init must be a function: "+e);const i=l+n,u=f(),s=p(u.payload.state,i);if(e&&(u._state[i]??={_default:e}),s.value===void 0&&e){const o=e();if(c(o))return u.payload.state[i]=o,o;s.value=o}return s}function v(){const t=y("app:loading",()=>0),a=r(()=>t.value>0);function n(){t.value++}function e(){t.value=Math.max(0,t.value-1)}return{count:t,loading:a,begin:n,end:e}}export{y as a,v as u}; import{e as f,a6 as p,a7 as c,z as r}from"./T3_facgV.js";const l="$s";function y(...t){const a=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(a);const[n,e]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(e!==void 0&&typeof e!="function")throw new Error("[nuxt] [useState] init must be a function: "+e);const i=l+n,u=f(),s=p(u.payload.state,i);if(e&&(u._state[i]??={_default:e}),s.value===void 0&&e){const o=e();if(c(o))return u.payload.state[i]=o,o;s.value=o}return s}function v(){const t=y("app:loading",()=>0),a=r(()=>t.value>0);function n(){t.value++}function e(){t.value=Math.max(0,t.value-1)}return{count:t,loading:a,begin:n,end:e}}export{y as a,v as u};

2
apps/admin/.output/public/_nuxt/B_rTis4D.js → apps/admin/.output/public/_nuxt/Bf0ZyEKY.js

@ -1 +1 @@
import{_ as t,o,c as s,L as c}from"./CfpW9SkI.js";const r={},a={class:"min-h-screen","data-theme":"corporate"};function n(e,_){return o(),s("div",a,[c(e.$slots,"default")])}const l=t(r,[["render",n]]);export{l as default}; import{_ as t,o,c as s,N as c}from"./T3_facgV.js";const r={},a={class:"min-h-screen","data-theme":"corporate"};function n(e,_){return o(),s("div",a,[c(e.$slots,"default")])}const l=t(r,[["render",n]]);export{l as default};

1
apps/admin/.output/public/_nuxt/C1U0GWax.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/C1a5GrA3.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/CDv-s6nK.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C4pFFOT7.js → apps/admin/.output/public/_nuxt/CF1WwBSl.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/tlYhbUA5.js → apps/admin/.output/public/_nuxt/CHOPe4ZT.js

@ -1 +1 @@
import{u as a,e as s,h as u,i as r,f as h}from"./CfpW9SkI.js";function i(t){const e=t||s();return e.ssrContext?.head||e.runWithContext(()=>{if(u()){const n=r(h);if(!n)throw new Error("[nuxt] [unhead] Missing Unhead instance.");return n}})}function d(t,e={}){const n=e.head||i(e.nuxt);return a(t,{head:n,...e})}export{d as u}; import{u as a,e as s,h as u,i as r,f as h}from"./T3_facgV.js";function i(t){const e=t||s();return e.ssrContext?.head||e.runWithContext(()=>{if(u()){const n=r(h);if(!n)throw new Error("[nuxt] [unhead] Missing Unhead instance.");return n}})}function d(t,e={}){const n=e.head||i(e.nuxt);return a(t,{head:n,...e})}export{d as u};

28
apps/admin/.output/public/_nuxt/C_DpaApf.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/CcnZORBF.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/ChQPCk92.js

@ -0,0 +1 @@
const o=[{code:"zh-CN",name:"中文(简体)"},{code:"zh-TW",name:"中文(繁体)"},{code:"zh-HK",name:"中文(香港)"},{code:"yue-HK",name:"粤语"},{code:"en-US",name:"英语(美国)"},{code:"en-GB",name:"英语(英国)"},{code:"ja-JP",name:"日语"},{code:"ko-KR",name:"韩语"},{code:"id-ID",name:"印尼语"},{code:"es-ES",name:"西班牙语(西)"},{code:"es-MX",name:"西班牙语(墨)"},{code:"pt-BR",name:"葡萄牙语(巴西)"},{code:"pt-PT",name:"葡萄牙语(葡)"},{code:"de-DE",name:"德语"},{code:"fr-FR",name:"法语"},{code:"it-IT",name:"意大利语"},{code:"nl-NL",name:"荷兰语"},{code:"pl-PL",name:"波兰语"},{code:"ru-RU",name:"俄语"},{code:"uk-UA",name:"乌克兰语"},{code:"tr-TR",name:"土耳其语"},{code:"vi-VN",name:"越南语"},{code:"th-TH",name:"泰语"},{code:"ms-MY",name:"马来语"},{code:"fil-PH",name:"菲律宾语"},{code:"ar-SA",name:"阿拉伯语"}];function c(e){const n=o.find(a=>a.code===e);return n?n.name:e}export{o as L,c as l};

1
apps/admin/.output/public/_nuxt/Ci8px2Rw.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/CnxFSuSr.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/CtB1c492.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/CtusP3zh.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CMwGY1Mu.js → apps/admin/.output/public/_nuxt/D7TmXHpa.js

@ -1 +1 @@
import{a as u}from"./DL330dAC.js";let i=0;function f(){const o=u("app:toasts",()=>[]);function e(s,t="info",r=3e3){const a=++i;o.value.push({id:a,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(n=>n.id!==a)},r)}return{toasts:o,toast:e,success:(s,t)=>e(s,"success",t),error:(s,t)=>e(s,"error",t),info:(s,t)=>e(s,"info",t),warn:(s,t)=>e(s,"warning",t)}}export{f as u}; import{a as u}from"./BaPL5gDJ.js";let i=0;function f(){const o=u("app:toasts",()=>[]);function e(s,t="info",r=3e3){const a=++i;o.value.push({id:a,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(n=>n.id!==a)},r)}return{toasts:o,toast:e,success:(s,t)=>e(s,"success",t),error:(s,t)=>e(s,"error",t),info:(s,t)=>e(s,"info",t),warn:(s,t)=>e(s,"warning",t)}}export{f as u};

2
apps/admin/.output/public/_nuxt/uI9fc-sC.js → apps/admin/.output/public/_nuxt/D9QM7lI5.js

@ -1 +1 @@
import{_ as s}from"./R6fio73R.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./CfpW9SkI.js";import{u as f}from"./tlYhbUA5.js";const p={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},m={class:"max-w-520px text-center"},h=["textContent"],b=["textContent"],x=["textContent"],g={class:"flex items-center justify-center w-full"},y={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:404},statusText:{type:String,default:"Page not found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(e){const r=e;return f({title:`${r.status} - ${r.statusText} | ${r.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(k,_)=>{const o=s;return i(),u("div",p,[t("div",m,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:n(e.status)},null,8,h),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:n(e.statusText)},null,8,b),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:n(e.description)},null,8,x),t("div",g,[c(o,{to:"/",class:"font-medium hover:text-[#00DC82] text-sm underline underline-offset-3"},{default:l(()=>[d(n(e.backHome),1)]),_:1})])])])}}},z=a(y,[["__scopeId","data-v-52418c85"]]);export{z as default}; import{_ as s}from"./BSclnKbv.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./T3_facgV.js";import{u as f}from"./CHOPe4ZT.js";const p={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},m={class:"max-w-520px text-center"},h=["textContent"],b=["textContent"],x=["textContent"],g={class:"flex items-center justify-center w-full"},y={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:404},statusText:{type:String,default:"Page not found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(e){const r=e;return f({title:`${r.status} - ${r.statusText} | ${r.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(k,_)=>{const o=s;return i(),u("div",p,[t("div",m,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:n(e.status)},null,8,h),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:n(e.statusText)},null,8,b),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:n(e.description)},null,8,x),t("div",g,[c(o,{to:"/",class:"font-medium hover:text-[#00DC82] text-sm underline underline-offset-3"},{default:l(()=>[d(n(e.backHome),1)]),_:1})])])])}}},z=a(y,[["__scopeId","data-v-52418c85"]]);export{z as default};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CgB4v6_d.js → apps/admin/.output/public/_nuxt/DACNvkq2.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DQJ7bpDC.js → apps/admin/.output/public/_nuxt/DB1wXbTP.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/DJcT_XDm.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/C_4yneL9.js → apps/admin/.output/public/_nuxt/DOARJUYv.js

@ -1 +1 @@
import{_ as o,o as s,c as a,a as t,t as r}from"./CfpW9SkI.js";import{u as i}from"./tlYhbUA5.js";const u={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},c={class:"max-w-520px text-center"},l=["textContent"],d=["textContent"],p=["textContent"],f={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:500},statusText:{type:String,default:"Internal server error"},description:{type:String,default:"This page is temporarily unavailable."},refresh:{type:String,default:"Refresh this page"}},setup(e){const n=e;return i({title:`${n.status} - ${n.statusText} | ${n.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(h,m)=>(s(),a("div",u,[t("div",c,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:r(e.status)},null,8,l),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:r(e.statusText)},null,8,d),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:r(e.description)},null,8,p)])]))}},x=o(f,[["__scopeId","data-v-2c2ce9e3"]]);export{x as default}; import{_ as o,o as s,c as a,a as t,t as r}from"./T3_facgV.js";import{u as i}from"./CHOPe4ZT.js";const u={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},c={class:"max-w-520px text-center"},l=["textContent"],d=["textContent"],p=["textContent"],f={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:500},statusText:{type:String,default:"Internal server error"},description:{type:String,default:"This page is temporarily unavailable."},refresh:{type:String,default:"Refresh this page"}},setup(e){const n=e;return i({title:`${n.status} - ${n.statusText} | ${n.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(h,m)=>(s(),a("div",u,[t("div",c,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:r(e.status)},null,8,l),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:r(e.statusText)},null,8,d),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:r(e.description)},null,8,p)])]))}},x=o(f,[["__scopeId","data-v-2c2ce9e3"]]);export{x as default};

1
apps/admin/.output/public/_nuxt/Dm32cczg.js

File diff suppressed because one or more lines are too long

29
apps/admin/.output/public/_nuxt/Dq9YeO1c.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DA87FDpn.js → apps/admin/.output/public/_nuxt/Dunpb1Z3.js

@ -1 +1 @@
import{g as h,C as x,z as w,j as y,c as r,a as e,t as d,l as b,D as _,k as v,m as g,n as k,x as M,s as u,o as p,_ as z}from"./CfpW9SkI.js";const A={class:"login-bg flex items-center justify-center px-4"},B={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=M({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function f(){l.value=!0,n.value="";try{const s=await $fetch("/web/api/api_login",{method:"POST",body:{account:o.account,password:o.password}});s.code===0&&s.data?(a.setLoginData(s.data),c.push("/dashboard")):n.value=s.msg||"登录失败"}catch{n.value="网络错误,请检查连接"}finally{l.value=!1}}return(s,t)=>(p(),r("div",A,[e("div",B,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(f,["prevent"])},[e("div",j,[t[5]||(t[5]=e("label",{class:"login-label"},"账号",-1)),v(e("input",{"onUpdate:modelValue":t[0]||(t[0]=i=>o.account=i),type:"text",class:"login-input",placeholder:"请输入管理员账号",autocomplete:"username",required:""},null,512),[[g,o.account]])]),e("div",D,[t[6]||(t[6]=e("label",{class:"login-label"},"密码",-1)),v(e("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>o.password=i),type:"password",class:"login-input",placeholder:"请输入密码",autocomplete:"current-password",required:""},null,512),[[g,o.password]])]),e("button",{type:"submit",class:k(["login-btn",{loading:l.value}])},d(l.value?"登录中...":"登 录"),3)],32),t[7]||(t[7]=e("p",{style:{"text-align":"center","font-size":"11px",color:"#94A3B8","margin-top":"24px"}}," © 2025 Admin Console · v1.0.1 ",-1))])]))}}),O=z(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default}; import{g as h,j as x,k as w,B as y,c as r,a as e,t as d,l as b,p as _,m as v,q as g,n as k,y as B,x as u,o as p,_ as M}from"./T3_facgV.js";const A={class:"login-bg flex items-center justify-center px-4"},z={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},q={style:{"margin-bottom":"24px"}},D=h({__name:"index",setup(L){const a=x(),c=w(),o=B({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function f(){l.value=!0,n.value="";try{const s=await $fetch("/web/api/api_login",{method:"POST",body:{account:o.account,password:o.password}});s.code===0&&s.data?(a.setLoginData(s.data),c.push("/dashboard")):n.value=s.msg||"登录失败"}catch{n.value="网络错误,请检查连接"}finally{l.value=!1}}return(s,t)=>(p(),r("div",A,[e("div",z,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(f,["prevent"])},[e("div",j,[t[5]||(t[5]=e("label",{class:"login-label"},"账号",-1)),v(e("input",{"onUpdate:modelValue":t[0]||(t[0]=i=>o.account=i),type:"text",class:"login-input",placeholder:"请输入管理员账号",autocomplete:"username",required:""},null,512),[[g,o.account]])]),e("div",q,[t[6]||(t[6]=e("label",{class:"login-label"},"密码",-1)),v(e("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>o.password=i),type:"password",class:"login-input",placeholder:"请输入密码",autocomplete:"current-password",required:""},null,512),[[g,o.password]])]),e("button",{type:"submit",class:k(["login-btn",{loading:l.value}])},d(l.value?"登录中...":"登 录"),3)],32),t[7]||(t[7]=e("p",{style:{"text-align":"center","font-size":"11px",color:"#94A3B8","margin-top":"24px"}}," © 2025 Admin Console · v1.0.1 ",-1))])]))}}),O=M(D,[["__scopeId","data-v-3a3bca03"]]);export{O as default};

2
apps/admin/.output/public/_nuxt/BjeKh_cp.js → apps/admin/.output/public/_nuxt/EInpjVbR.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/FegYaija.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/R6fio73R.js

File diff suppressed because one or more lines are too long

6
apps/admin/.output/public/_nuxt/CfpW9SkI.js → apps/admin/.output/public/_nuxt/T3_facgV.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DSu8q42f.js → apps/admin/.output/public/_nuxt/YYZWHM5Z.js

@ -1 +1 @@
import{C as w,z as d}from"./CfpW9SkI.js";import{u as h}from"./DL330dAC.js";async function f(o,i,a){const e=w(),u=d(),s={"Content-Type":"application/json"};e.token&&(s.Authorization=e.token),a&&Object.assign(s,a);const t=await fetch(o,{method:"POST",headers:s,body:JSON.stringify(i)});if(!t.ok)throw new Error(`HTTP error: ${t.status}`);const n=await t.json();if(n.code===18)throw e.logout(),u.push("/"),new Error(n.msg||"Unauthorized");if(n.code!==0)throw new Error(n.msg||"Unknown error");return n.data}const y=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function g(o){return!y.test(o)}function k(){const o=w(),{begin:i,end:a}=h();async function e(t,n){const r={};if(o.currentAppId&&(r["X-App-Id"]=String(o.currentAppId)),!g(t))return f(`/web/api/api_${t}`,n??{},r);i();try{return await f(`/web/api/api_${t}`,n??{},r)}finally{a()}}async function u(t,n){return f(`/console/api/${t}`,n??{})}async function s(t,n){const r=t.type||"application/octet-stream",c=await e("getcostoken",{path:n,filename:t.name,content_type:r}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":r},body:t});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:e,consoleApi:u,uploadFile:s}}export{k as u}; import{j as w,k as d}from"./T3_facgV.js";import{u as h}from"./BaPL5gDJ.js";async function f(o,i,a){const e=w(),u=d(),s={"Content-Type":"application/json"};e.token&&(s.Authorization=e.token),a&&Object.assign(s,a);const t=await fetch(o,{method:"POST",headers:s,body:JSON.stringify(i)});if(!t.ok)throw new Error(`HTTP error: ${t.status}`);const n=await t.json();if(n.code===18)throw e.logout(),u.push("/"),new Error(n.msg||"Unauthorized");if(n.code!==0)throw new Error(n.msg||"Unknown error");return n.data}const y=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function g(o){return!y.test(o)}function A(){const o=w(),{begin:i,end:a}=h();async function e(t,n){const r={};if(o.currentAppId&&(r["X-App-Id"]=String(o.currentAppId)),!g(t))return f(`/web/api/api_${t}`,n??{},r);i();try{return await f(`/web/api/api_${t}`,n??{},r)}finally{a()}}async function u(t,n){return f(`/console/api/${t}`,n??{})}async function s(t,n){const r=t.type||"application/octet-stream",c=await e("getcostoken",{path:n,filename:t.name,content_type:r}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":r},body:t});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:e,consoleApi:u,uploadFile:s}}export{A as u};

1
apps/admin/.output/public/_nuxt/_name_.SM3hSUV-.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/accounts.B82323Fi.css

@ -1 +0,0 @@
.chk[data-v-eb25cf37]{display:flex;align-items:center;gap:6px;padding:5px 9px;border:1px solid #e2e8f0;border-radius:8px;font-size:12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chk[data-v-eb25cf37]:hover{background:#f8fafc}.chk input[data-v-eb25cf37]{width:14px;height:14px}

1
apps/admin/.output/public/_nuxt/accounts.Bq0Boscu.css

@ -0,0 +1 @@
.chk[data-v-f682efe9]{display:flex;align-items:center;gap:6px;padding:5px 9px;border:1px solid #e2e8f0;border-radius:8px;font-size:12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chk[data-v-f682efe9]:hover{background:#f8fafc}.chk input[data-v-f682efe9]{width:14px;height:14px}

1
apps/admin/.output/public/_nuxt/appconfig.j94fgYL_.css

@ -1 +0,0 @@
.app-avatar[data-v-a2d8388e]{width:48px;height:48px;border-radius:13px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:20px;flex-shrink:0;box-shadow:0 6px 18px #4f46e54d}.lock-tag[data-v-a2d8388e]{font-size:10px;font-weight:600;color:#dc2626;background:#fef2f2;padding:1px 5px;border-radius:5px}

1
apps/admin/.output/public/_nuxt/apps.BKS_pLby.css

@ -1 +0,0 @@
.app-card[data-v-955faaec]{background:#fff;border:1px solid #eef2f7;border-radius:14px;box-shadow:0 1px 2px #00000008;overflow:hidden}.app-card.orphan[data-v-955faaec]{border-color:#fde68a}.app-head[data-v-955faaec]{display:flex;align-items:center;gap:12px;padding:13px 16px;cursor:pointer;background:linear-gradient(90deg,#f5f7ff,#fff);border-left:4px solid #6366f1;transition:background .15s}.app-card.orphan .app-head[data-v-955faaec]{background:linear-gradient(90deg,#fffbeb,#fff);border-left-color:#f59e0b}.app-head[data-v-955faaec]:hover{background:linear-gradient(90deg,#eef2ff,#fff)}.chev[data-v-955faaec]{color:#94a3b8;font-size:12px;width:16px;flex-shrink:0}.app-logo[data-v-955faaec]{width:38px;height:38px;border-radius:10px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;font-weight:700;font-size:17px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.app-logo.orphan-logo[data-v-955faaec]{background:#f59e0b}.app-name[data-v-955faaec]{font-size:15px;font-weight:700;color:#1e293b}.chip-app[data-v-955faaec]{font-size:10px;padding:1px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.chip-app[data-v-955faaec],.chip-dep[data-v-955faaec]{display:inline-flex;font-weight:700}.chip-dep[data-v-955faaec]{font-size:9px;padding:1px 6px;border-radius:5px;background:#ecfeff;color:#0e7490}.chip-mono[data-v-955faaec]{color:#475569;font-family:SF Mono,Menlo,monospace}.chip-count[data-v-955faaec],.chip-mono[data-v-955faaec]{display:inline-flex;font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px;background:#f1f5f9}.chip-count[data-v-955faaec]{color:#64748b}.app-body[data-v-955faaec]{padding:4px 12px 10px;border-top:1px solid #f1f5f9;background:#fcfcfd}.dep-row td[data-v-955faaec]{vertical-align:middle}

2
apps/admin/.output/public/_nuxt/builds/latest.json

@ -1 +1 @@
{"id":"1b101b0e-fb32-40fd-adf2-8e9d1b2f43f3","timestamp":1783406859699} {"id":"7536898a-7cbf-479a-b1a3-617064ef8470","timestamp":1784693551932}

1
apps/admin/.output/public/_nuxt/builds/meta/1b101b0e-fb32-40fd-adf2-8e9d1b2f43f3.json

@ -1 +0,0 @@
{"id":"1b101b0e-fb32-40fd-adf2-8e9d1b2f43f3","timestamp":1783406859699,"prerendered":[]}

1
apps/admin/.output/public/_nuxt/builds/meta/7536898a-7cbf-479a-b1a3-617064ef8470.json

@ -0,0 +1 @@
{"id":"7536898a-7cbf-479a-b1a3-617064ef8470","timestamp":1784693551932,"prerendered":[]}

1
apps/admin/.output/public/_nuxt/entry.CYJ6hDh4.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/entry.CZS29VBu.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/index.BXNugdH5.css

@ -0,0 +1 @@
.app-grid[data-v-6c9af955]{display:grid;grid-template-columns:repeat(auto-fill,minmax(310px,1fr));gap:16px}.app-card[data-v-6c9af955]{background:#fff;border:1px solid #eef2f7;border-radius:16px;overflow:hidden;box-shadow:0 1px 2px #0f172a0a,0 4px 16px #0f172a08;cursor:pointer;position:relative;display:flex;flex-direction:column;transition:transform .14s ease,box-shadow .14s ease,border-color .14s ease}.app-card[data-v-6c9af955]:hover{transform:translateY(-2px);box-shadow:0 10px 40px #0f172a1f;border-color:#e2e8f0}.app-card[data-v-6c9af955]:focus-visible{outline:2px solid #4f46e5;outline-offset:2px}.app-card[data-v-6c9af955]:before{content:"";position:absolute;inset:0 0 auto;height:3px;background:linear-gradient(90deg,#4f46e5,#7c3aed)}.app-card.off[data-v-6c9af955]:before{background:#94a3b8}.app-card.orphan[data-v-6c9af955]{cursor:default;border-color:#fde68a}.app-card.orphan[data-v-6c9af955]:before{background:#f59e0b}.app-card.orphan[data-v-6c9af955]:hover{transform:none}.ac-head[data-v-6c9af955]{padding:18px 18px 12px;display:flex;gap:13px;align-items:flex-start}.ac-logo[data-v-6c9af955]{width:44px;height:44px;border-radius:12px;flex-shrink:0;color:#fff;background:linear-gradient(135deg,#4f46e5,#7c3aed);display:grid;place-items:center;font-weight:800;font-size:18px;box-shadow:0 5px 14px #4f46e547}.app-card.off .ac-logo[data-v-6c9af955]{background:#94a3b8;box-shadow:none}.app-card.orphan .ac-logo[data-v-6c9af955]{background:#f59e0b;box-shadow:none}.ac-title[data-v-6c9af955]{font-size:15.5px;font-weight:700;color:#1e293b;letter-spacing:-.01em}.ac-meta[data-v-6c9af955]{font-size:11.5px;color:#94a3b8;margin-top:3px}.ac-remark[data-v-6c9af955]{font-size:12px;color:#64748b;padding:0 18px 14px;margin:0;min-height:2.4em}.ac-stats[data-v-6c9af955]{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid #eef2f7;background:#fcfcfd}.ac-stat[data-v-6c9af955]{padding:11px 8px;text-align:center;border-right:1px solid #eef2f7}.ac-stat[data-v-6c9af955]:last-child{border-right:0}.ac-stat-n[data-v-6c9af955]{font-size:17px;font-weight:700;line-height:1.2;color:#1e293b;font-family:SF Mono,Menlo,monospace;font-variant-numeric:tabular-nums}.ac-stat-n.warn[data-v-6c9af955]{color:#b45309}.ac-stat-n.zero[data-v-6c9af955]{color:#cbd5e1}.ac-stat-l[data-v-6c9af955]{font-size:10px;color:#94a3b8;margin-top:2px;letter-spacing:.03em}.ac-regions[data-v-6c9af955]{padding:11px 18px;gap:5px;flex-wrap:wrap;align-items:center;min-height:42px}.ac-foot[data-v-6c9af955],.ac-regions[data-v-6c9af955]{display:flex;border-top:1px solid #eef2f7}.ac-foot[data-v-6c9af955]{padding:10px 14px;gap:6px;justify-content:flex-end;margin-top:auto}.orphan-list[data-v-6c9af955]{border-top:1px solid #eef2f7}.orphan-row[data-v-6c9af955]{display:flex;align-items:center;gap:8px;padding:9px 16px;border-bottom:1px solid #f8fafc}.orphan-row[data-v-6c9af955]:last-child{border-bottom:0}.chip[data-v-6c9af955]{display:inline-flex;align-items:center;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#64748b}.chip-app[data-v-6c9af955]{background:#eef2ff;color:#4338ca}.chip-dep[data-v-6c9af955]{background:#ecfeff;color:#0e7490}.chip-warn[data-v-6c9af955]{background:#fef3c7;color:#b45309}

1
apps/admin/.output/public/_nuxt/meetingsvc.Cnu-3MbB.css

@ -0,0 +1 @@
.scopebar[data-v-4edbf244]{display:flex;align-items:center;gap:12px;flex-wrap:wrap;background:#f8fafc;border:1px solid #eef2f7;border-radius:11px;padding:10px 13px;margin-bottom:16px}.card[data-v-4edbf244]{background:#fff;border:1px solid #eef2f7;border-radius:14px;box-shadow:0 1px 2px #0f172a0a;overflow:hidden}.card-head[data-v-4edbf244]{padding:15px 18px;border-bottom:1px solid #eef2f7;display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap}.card-title[data-v-4edbf244]{font-size:14.5px;font-weight:700;color:#1e293b}.card-desc[data-v-4edbf244]{font-size:11.5px;color:#64748b;margin-top:3px;max-width:76ch;line-height:1.55}.probe-bar[data-v-4edbf244]{display:flex;align-items:center;gap:10px;padding:11px 16px;background:#fcfcfd;border-bottom:1px solid #eef2f7;flex-wrap:wrap}.probe-out[data-v-4edbf244]{font-size:11.5px;font-weight:600;color:#15803d;background:#dcfce7;padding:3px 9px;border-radius:6px}.probe-out.bad[data-v-4edbf244]{color:#dc2626;background:#fee2e2}.mode-bar[data-v-4edbf244]{display:flex;align-items:center;gap:14px;padding:12px 16px;background:#fcfcfd;border-bottom:1px solid #eef2f7;flex-wrap:wrap}.mode-txt[data-v-4edbf244]{font-size:12px;color:#64748b;flex:1;min-width:260px;line-height:1.6;margin:0}.mode-txt b[data-v-4edbf244]{color:#1e293b;font-weight:600}.svc[data-v-4edbf244]{display:grid;gap:12px;align-items:center;padding:11px 16px;border-bottom:1px solid #eef2f7}.svc[data-v-4edbf244]:last-child{border-bottom:0}.svc[data-v-4edbf244]:hover{background:#fcfcfd}.svc.off[data-v-4edbf244]{opacity:.55}.svc.hit[data-v-4edbf244]{background:linear-gradient(90deg,#dcfce7,transparent 42%)}.svc.isdefault[data-v-4edbf244]{background:linear-gradient(90deg,#eef2ff,transparent 42%)}.svc.asr[data-v-4edbf244]{grid-template-columns:34px 1fr 170px 110px 60px auto}.svc.mt[data-v-4edbf244]{grid-template-columns:34px 1fr 130px 60px auto}.svc.llm[data-v-4edbf244]{grid-template-columns:40px 1fr 130px 90px 60px auto}.col-h[data-v-4edbf244]{padding:8px 16px;background:#fcfcfd;font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:#94a3b8;font-weight:700;display:grid;gap:12px}.col-h.llm-h[data-v-4edbf244]{grid-template-columns:40px 1fr 130px 90px 60px auto;border-top:1px solid #eef2f7}.svc-rank[data-v-4edbf244]{width:26px;height:26px;border-radius:8px;display:grid;place-items:center;background:#f8fafc;border:1px solid #e2e8f0;color:#64748b;font-family:SF Mono,Menlo,monospace;font-size:12px;font-weight:700}.svc-rank.hit[data-v-4edbf244]{background:#16a34a;border-color:#16a34a;color:#fff}.svc-name[data-v-4edbf244]{font-weight:600;font-size:13.5px;color:#334155}.svc-name.skip[data-v-4edbf244]{text-decoration:line-through;text-decoration-color:#cbd5e1}.svc-prov[data-v-4edbf244]{font-size:11px;color:#94a3b8;margin-top:2px}.svc-cost[data-v-4edbf244],.svc-prov[data-v-4edbf244]{font-family:SF Mono,Menlo,monospace}.svc-cost[data-v-4edbf244]{font-size:12.5px;font-variant-numeric:tabular-nums;color:#334155}.svc-cost small[data-v-4edbf244]{color:#94a3b8;font-size:10px}.svc-acts[data-v-4edbf244]{display:flex;gap:3px;align-items:center;justify-content:flex-end}.svc-why[data-v-4edbf244]{grid-column:2/-1;font-size:11px;color:#64748b;margin-top:-2px}.svc-why.ok[data-v-4edbf244]{color:#15803d;font-weight:600}.svc-why.no[data-v-4edbf244]{color:#b45309}.arrow[data-v-4edbf244]{width:24px;height:24px;border-radius:6px;border:1px solid #e2e8f0;background:#fff;color:#64748b;cursor:pointer;display:grid;place-items:center;font-size:11px;padding:0}.arrow[data-v-4edbf244]:hover:not(:disabled){border-color:#4f46e5;color:#4f46e5}.arrow[data-v-4edbf244]:disabled{opacity:.25;cursor:not-allowed}.lang[data-v-4edbf244]{font-family:SF Mono,Menlo,monospace;font-size:9.5px;padding:1px 5px;border-radius:4px;background:#f8fafc;border:1px solid #eef2f7;color:#64748b}.lang.on[data-v-4edbf244]{background:#dcfce7;border-color:transparent;color:#15803d}.chip[data-v-4edbf244],.lang.on[data-v-4edbf244]{font-weight:700}.chip[data-v-4edbf244]{display:inline-flex;align-items:center;font-size:10.5px;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#64748b}.chip-app[data-v-4edbf244]{background:#eef2ff;color:#4338ca}@media(max-width:1100px){.svc.asr[data-v-4edbf244],.svc.llm[data-v-4edbf244],.svc.mt[data-v-4edbf244]{grid-template-columns:34px 1fr}.col-h[data-v-4edbf244]{display:none}.svc-acts[data-v-4edbf244]{justify-content:flex-start}.svc-acts[data-v-4edbf244],.svc-why[data-v-4edbf244]{grid-column:1/-1}}

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/B_WQdNTA.js → apps/admin/.output/public/_nuxt/oUrQBHps.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/qiaU9ehm.js

File diff suppressed because one or more lines are too long

15
apps/admin/.output/public/_nuxt/rG8Kp0UJ.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/serviceconfig.C7KF_6ms.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/serviceconfig.Io3AqtMK.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/y51pRzN1.js

File diff suppressed because one or more lines are too long

8
apps/admin/.output/server/chunks/build/AppDeployTab-styles.B0mCMIhI.mjs

@ -0,0 +1,8 @@
import { A as AppDeployTab_vue_vue_type_style_index_0_scoped_b8dfd02c_lang } from './_name_-styles-1.mjs-vz5bkjKO.mjs';
const AppDeployTabStyles_B0mCMIhI = [
AppDeployTab_vue_vue_type_style_index_0_scoped_b8dfd02c_lang
];
export { AppDeployTabStyles_B0mCMIhI as default };
//# sourceMappingURL=AppDeployTab-styles.B0mCMIhI.mjs.map

1
apps/admin/.output/server/chunks/build/AppDeployTab-styles.B0mCMIhI.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"AppDeployTab-styles.B0mCMIhI.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/AppDeployTab-styles.B0mCMIhI.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0]}

8
apps/admin/.output/server/chunks/build/AppModuleTab-styles._m-oVrlE.mjs

@ -0,0 +1,8 @@
import { A as AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang } from './_name_-styles-2.mjs-BXCS7H7R.mjs';
const AppModuleTabStyles__mOVrlE = [
AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang
];
export { AppModuleTabStyles__mOVrlE as default };
//# sourceMappingURL=AppModuleTab-styles._m-oVrlE.mjs.map

1
apps/admin/.output/server/chunks/build/AppModuleTab-styles._m-oVrlE.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"AppModuleTab-styles._m-oVrlE.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/AppModuleTab-styles._m-oVrlE.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0]}

538
apps/admin/.output/server/chunks/build/_name_-3YudcsGQ.mjs

@ -0,0 +1,538 @@
import { defineComponent, computed, ref, reactive, watch, mergeProps, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrInterpolate, ssrRenderClass, ssrRenderStyle, ssrRenderAttr, ssrRenderList, ssrRenderComponent, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderDynamicModel } from 'vue/server-renderer';
import { u as useApi } from './useApi-D_CttG2t.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { u as useAuthStore } from './auth-QFkCoU1C.mjs';
import { _ as _export_sfc, b as useRoute$1, a as useRouter } from './server.mjs';
import './useLoading-D4zrSa2m.mjs';
import 'pinia';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'perfect-debounce';
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
__name: "AppDeployTab",
__ssrInlineRender: true,
props: {
appName: {},
defaultImage: {},
deployments: {},
envs: {}
},
emits: ["refresh", "configure"],
setup(__props, { expose: __expose, emit: __emit }) {
const props = __props;
useApi();
useToast();
useAuthStore();
useRouter();
const REGIONS = ["中国", "美国", "东亚", "东南亚", "南亚", "中东", "欧洲", "俄罗斯", "非洲", "南美", "北美", "大洋洲", "巴西", "印度"];
function dbName(dsn) {
const m = (dsn || "").match(/\/([^/?]+)\?/);
return m ? m[1] : dsn ? "(自定义)" : "未配置";
}
function isPinned(tag) {
const t = (tag || "").trim();
return !!t && t !== "latest";
}
const envSavingId = ref(0);
const formDlg = ref(null);
const dIsEditing = ref(false);
const dMode = ref("existing");
const dForm = reactive({
id: 0,
name: "",
region: "",
env_id: 0,
base_url: "",
service_dsn: "",
deploy_dir: "",
image_name: "",
image_tag: "",
remark: "",
enabled: true
});
const testPassed = ref(false);
const testing = ref(false);
const testResult = reactive({ show: false, apiOk: false, apiMsg: "", dbOk: false, dbMsg: "" });
const availableRegions = computed(() => {
const used = new Set(props.deployments.filter((d) => d.id !== dForm.id).map((d) => d.region).filter(Boolean));
return REGIONS.filter((r) => !used.has(r) || r === dForm.region);
});
function resetTest() {
testPassed.value = false;
testResult.show = false;
}
function openNew() {
dIsEditing.value = false;
dMode.value = "existing";
Object.assign(dForm, {
id: 0,
name: "",
region: "",
env_id: 0,
base_url: "",
service_dsn: "",
deploy_dir: "",
image_name: props.defaultImage,
image_tag: "",
remark: "",
enabled: true
});
resetTest();
formDlg.value?.showModal();
}
ref(null);
ref(null);
const up = reactive({
id: 0,
label: "",
envName: "",
deployDir: "",
tag: "",
tags: [],
tagMode: "list",
tagsLoading: false,
tagsError: "",
log: "",
show: false,
running: false,
ok: false,
canRun: false,
btnText: "开始升级"
});
ref(null);
const az = reactive({
appId: 0,
label: "",
start: "",
end: "",
mode: "",
steps: [],
curIndex: 0,
curTotal: 0,
curName: "",
pct: 0,
errMsg: "",
report: null,
running: false,
btnText: "开始分析"
});
__expose({ openNew });
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-b8dfd02c><div class="card" data-v-b8dfd02c><div class="card-head" data-v-b8dfd02c><div data-v-b8dfd02c><div class="card-title" data-v-b8dfd02c>区域部署</div><div class="card-desc" data-v-b8dfd02c> 每个区域一份部署,各自连自己的业务库。「升级」会 SSH 到绑定的环境节点,在部署目录执行 <span class="font-mono" data-v-b8dfd02c>docker compose pull &amp; up -d</span>。 </div></div><button class="btn btn-primary btn-xs text-white shrink-0" data-v-b8dfd02c>+ 部署新环境</button></div>`);
if (!__props.deployments.length) {
_push(`<div class="py-14 text-center text-slate-400 text-sm" data-v-b8dfd02c> 该应用还没有部署,点右上「+ 部署新环境」添加。 </div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(__props.deployments, (d) => {
_push(`<div class="${ssrRenderClass([{ pending: d.status === "pending" }, "dep"])}" data-v-b8dfd02c><div class="min-w-0" data-v-b8dfd02c><div class="dep-name" data-v-b8dfd02c><span class="chip chip-dep" data-v-b8dfd02c>部署</span><span class="truncate" data-v-b8dfd02c>${ssrInterpolate(d.name || "部署#" + d.id)}</span>`);
if (d.status === "pending") {
_push(`<span class="chip chip-warn" data-v-b8dfd02c>待部署</span>`);
} else {
_push(`<span class="chip chip-ok" data-v-b8dfd02c>已接入</span>`);
}
if (!d.enabled) {
_push(`<span class="chip" data-v-b8dfd02c>停用</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="dep-sub" data-v-b8dfd02c>#${ssrInterpolate(d.id)} · ${ssrInterpolate(d.region || "未指定区域")} · 业务库 ${ssrInterpolate(dbName(d.service_dsn))}</div></div><div data-v-b8dfd02c><div class="field-l" data-v-b8dfd02c>环境节点</div><select class="select select-bordered select-xs w-full text-xs"${ssrIncludeBooleanAttr(envSavingId.value === d.id) ? " disabled" : ""} data-v-b8dfd02c><option${ssrRenderAttr("value", 0)} data-v-b8dfd02c${ssrIncludeBooleanAttr(Array.isArray(d.env_id) ? ssrLooseContain(d.env_id, 0) : ssrLooseEqual(d.env_id, 0)) ? " selected" : ""}>未绑定</option><!--[-->`);
ssrRenderList(__props.envs, (e) => {
_push(`<option${ssrRenderAttr("value", e.id)} data-v-b8dfd02c${ssrIncludeBooleanAttr(Array.isArray(d.env_id) ? ssrLooseContain(d.env_id, e.id) : ssrLooseEqual(d.env_id, e.id)) ? " selected" : ""}>${ssrInterpolate(e.name)}</option>`);
});
_push(`<!--]--></select></div><div data-v-b8dfd02c><div class="field-l" data-v-b8dfd02c>当前版本</div><div class="flex items-center gap-1.5" data-v-b8dfd02c><span class="${ssrRenderClass([isPinned(d.image_tag) ? "chip-ok" : "chip-warn", "chip chip-mono"])}" data-v-b8dfd02c>${ssrInterpolate(d.image_tag || "latest")}</span>`);
if (!isPinned(d.image_tag)) {
_push(`<span class="text-[10.5px] text-amber-700" title="latest 是可变 tag,升级后无法从列表看出实际版本" data-v-b8dfd02c>未固定</span>`);
} else {
_push(`<!---->`);
}
_push(`</div></div><div class="min-w-0" data-v-b8dfd02c><div class="field-l" data-v-b8dfd02c>部署目录</div><div class="${ssrRenderClass([d.deploy_dir ? "text-slate-500" : "text-red-500", "font-mono text-[11px] truncate"])}" data-v-b8dfd02c>${ssrInterpolate(d.deploy_dir || "未填")}</div></div><div class="dep-acts" data-v-b8dfd02c><button class="btn btn-xs btn-warning" data-v-b8dfd02c>升级</button><button class="btn btn-xs" data-v-b8dfd02c>配置</button><button class="btn btn-xs btn-ghost text-teal-600"${ssrIncludeBooleanAttr(!d.base_url) ? " disabled" : ""}${ssrRenderAttr("title", d.base_url ? "打开该部署的 Swagger 文档" : "该部署未配置对外地址(base_url)")} data-v-b8dfd02c>API 测试</button><button class="btn btn-xs btn-ghost" data-v-b8dfd02c>编辑</button><button class="btn btn-xs btn-ghost text-emerald-600"${ssrIncludeBooleanAttr(d.status === "pending") ? " disabled" : ""} data-v-b8dfd02c>分析</button><button class="btn btn-xs btn-ghost text-indigo-500"${ssrIncludeBooleanAttr(d.status === "pending") ? " disabled" : ""} data-v-b8dfd02c>发事件</button><button class="btn btn-xs btn-ghost text-red-500" data-v-b8dfd02c>删除</button></div></div>`);
});
_push(`<!--]--></div><dialog class="modal" data-v-b8dfd02c><div class="modal-box max-w-3xl" data-v-b8dfd02c><h3 class="font-bold text-lg" data-v-b8dfd02c>${ssrInterpolate(dIsEditing.value ? "编辑部署" : "部署新环境")}</h3>`);
if (!dIsEditing.value) {
_push(`<div class="tabs tabs-boxed bg-slate-100 w-fit my-3" data-v-b8dfd02c><a class="${ssrRenderClass([dMode.value === "existing" ? "tab-active" : "", "tab"])}" data-v-b8dfd02c>添加现有</a><a class="${ssrRenderClass([dMode.value === "deploy" ? "tab-active" : "", "tab"])}" data-v-b8dfd02c>部署到目标环境</a></div>`);
} else {
_push(`<!---->`);
}
_push(`<p class="${ssrRenderClass([dIsEditing.value ? "mt-1" : "", "text-xs text-slate-400 mb-4"])}" data-v-b8dfd02c>`);
if (dIsEditing.value) {
_push(`<!--[-->改好后回列表点「升级」执行远程部署(拉新镜像并重启)。<!--]-->`);
} else if (dMode.value === "existing") {
_push(`<!--[-->把「已经部署好的应用区域」加进来:填地址与业务库 DSN,测试通过后保存。<!--]-->`);
} else {
_push(`<!--[-->选一个目标环境节点,先建关联并标记<b data-v-b8dfd02c>待部署</b>;保存后回列表点「升级」执行首次部署。<!--]-->`);
}
_push(`</p><form class="space-y-3" data-v-b8dfd02c><div class="grid grid-cols-2 gap-3" data-v-b8dfd02c><div class="form-control" data-v-b8dfd02c><label class="label py-1" data-v-b8dfd02c><span class="label-text text-sm font-medium" data-v-b8dfd02c>所属应用</span></label><input${ssrRenderAttr("value", __props.appName)} type="text" class="input input-bordered input-sm bg-slate-100" readonly data-v-b8dfd02c></div><div class="form-control" data-v-b8dfd02c><label class="label py-1" data-v-b8dfd02c><span class="label-text text-sm font-medium" data-v-b8dfd02c>部署名称 *</span></label><input${ssrRenderAttr("value", dForm.name)} type="text" class="input input-bordered input-sm" required${ssrRenderAttr("placeholder", `如 ${__props.appName}(国内)`)} data-v-b8dfd02c></div></div><div class="grid grid-cols-2 gap-3" data-v-b8dfd02c><div class="form-control" data-v-b8dfd02c><label class="label py-1" data-v-b8dfd02c><span class="label-text text-sm font-medium" data-v-b8dfd02c>区域</span></label><select class="select select-bordered select-sm" data-v-b8dfd02c><option value="" data-v-b8dfd02c${ssrIncludeBooleanAttr(Array.isArray(dForm.region) ? ssrLooseContain(dForm.region, "") : ssrLooseEqual(dForm.region, "")) ? " selected" : ""}>未指定</option><!--[-->`);
ssrRenderList(availableRegions.value, (r) => {
_push(`<option${ssrRenderAttr("value", r)} data-v-b8dfd02c${ssrIncludeBooleanAttr(Array.isArray(dForm.region) ? ssrLooseContain(dForm.region, r) : ssrLooseEqual(dForm.region, r)) ? " selected" : ""}>${ssrInterpolate(r)}</option>`);
});
_push(`<!--]--></select><span class="text-[11px] text-slate-400 mt-1" data-v-b8dfd02c>已部署的区域不再出现(一个应用每区域一份部署)。</span></div><div class="form-control" data-v-b8dfd02c><label class="label py-1" data-v-b8dfd02c><span class="label-text text-sm font-medium" data-v-b8dfd02c>部署环境${ssrInterpolate(dMode.value === "deploy" ? " *" : "")}</span></label><select class="select select-bordered select-sm" data-v-b8dfd02c><option${ssrRenderAttr("value", 0)} data-v-b8dfd02c${ssrIncludeBooleanAttr(Array.isArray(dForm.env_id) ? ssrLooseContain(dForm.env_id, 0) : ssrLooseEqual(dForm.env_id, 0)) ? " selected" : ""}>${ssrInterpolate(dMode.value === "deploy" ? "请选择目标环境" : "未关联")}</option><!--[-->`);
ssrRenderList(__props.envs, (e) => {
_push(`<option${ssrRenderAttr("value", e.id)} data-v-b8dfd02c${ssrIncludeBooleanAttr(Array.isArray(dForm.env_id) ? ssrLooseContain(dForm.env_id, e.id) : ssrLooseEqual(dForm.env_id, e.id)) ? " selected" : ""}>${ssrInterpolate(e.name)}(${ssrInterpolate(e.code || "-")})</option>`);
});
_push(`<!--]--></select></div></div><div class="grid grid-cols-3 gap-3" data-v-b8dfd02c><div class="form-control" data-v-b8dfd02c><label class="label py-1" data-v-b8dfd02c><span class="label-text text-sm font-medium" data-v-b8dfd02c>部署目录</span></label><input${ssrRenderAttr("value", dForm.deploy_dir)} type="text" class="input input-bordered input-sm font-mono text-xs" placeholder="/home/work/app" data-v-b8dfd02c></div><div class="form-control" data-v-b8dfd02c><label class="label py-1" data-v-b8dfd02c><span class="label-text text-sm font-medium" data-v-b8dfd02c>镜像名</span></label><input${ssrRenderAttr("value", dForm.image_name)} type="text" class="input input-bordered input-sm font-mono text-xs"${ssrRenderAttr("placeholder", __props.defaultImage || "默认取应用")} data-v-b8dfd02c></div><div class="form-control" data-v-b8dfd02c><label class="label py-1" data-v-b8dfd02c><span class="label-text text-sm font-medium" data-v-b8dfd02c>镜像 Tag</span></label><input${ssrRenderAttr("value", dForm.image_tag)} type="text" class="input input-bordered input-sm font-mono text-xs" placeholder="0.1.1 / latest" data-v-b8dfd02c></div></div><div class="form-control" data-v-b8dfd02c><label class="label py-1" data-v-b8dfd02c><span class="label-text text-sm font-medium" data-v-b8dfd02c>业务库 DSN${ssrInterpolate(dMode.value === "existing" ? " *" : "")}</span></label><input${ssrRenderAttr("value", dForm.service_dsn)} type="text" class="input input-bordered input-sm font-mono text-xs" placeholder="root:pwd@tcp(host:3306)/earphone?charset=utf8mb4&amp;parseTime=True&amp;loc=Local" data-v-b8dfd02c><span class="text-[11px] text-slate-400 mt-1" data-v-b8dfd02c>业务功能配置、会议记录服务配置都写在这个库里。</span></div>`);
if (dMode.value === "existing") {
_push(`<!--[--><div class="form-control" data-v-b8dfd02c><label class="label py-1" data-v-b8dfd02c><span class="label-text text-sm font-medium" data-v-b8dfd02c>应用地址 *</span></label><input${ssrRenderAttr("value", dForm.base_url)} type="text" class="input input-bordered input-sm" placeholder="https://api.xxx.com/" data-v-b8dfd02c><span class="text-[11px] text-slate-400 mt-1" data-v-b8dfd02c>用于通知应用业务服务事件(如配置更新)、打开 Swagger。</span></div>`);
if (testResult.show) {
_push(`<div class="text-sm space-y-0.5" data-v-b8dfd02c><div class="${ssrRenderClass(testResult.apiOk ? "text-green-700" : "text-red-600")}" data-v-b8dfd02c>${ssrInterpolate(testResult.apiOk ? "✓" : "✗")} 应用地址:${ssrInterpolate(testResult.apiMsg)}</div><div class="${ssrRenderClass(testResult.dbOk ? "text-green-700" : "text-red-600")}" data-v-b8dfd02c>${ssrInterpolate(testResult.dbOk ? "✓" : "✗")} 业务库:${ssrInterpolate(testResult.dbMsg)}</div></div>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
} else {
_push(`<!---->`);
}
_push(`<div class="form-control" data-v-b8dfd02c><label class="label py-1" data-v-b8dfd02c><span class="label-text text-sm font-medium" data-v-b8dfd02c>备注</span></label><input${ssrRenderAttr("value", dForm.remark)} type="text" class="input input-bordered input-sm" data-v-b8dfd02c></div><label class="flex items-center gap-2 cursor-pointer" data-v-b8dfd02c><input${ssrIncludeBooleanAttr(Array.isArray(dForm.enabled) ? ssrLooseContain(dForm.enabled, null) : dForm.enabled) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-b8dfd02c><span class="text-sm" data-v-b8dfd02c>启用</span></label><div class="modal-action" data-v-b8dfd02c><button type="button" class="btn btn-ghost btn-sm" data-v-b8dfd02c>取消</button>`);
if (dMode.value === "existing") {
_push(`<button type="button" class="btn btn-outline btn-sm"${ssrIncludeBooleanAttr(testing.value) ? " disabled" : ""} data-v-b8dfd02c>${ssrInterpolate(testing.value ? "测试中…" : "测试连接")}</button>`);
} else {
_push(`<!---->`);
}
_push(`<button type="submit" class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(!dIsEditing.value && dMode.value === "existing" && !testPassed.value) ? " disabled" : ""} data-v-b8dfd02c>保存</button></div>`);
if (!dIsEditing.value && dMode.value === "existing") {
_push(`<p class="text-[11px] text-slate-400 text-right" data-v-b8dfd02c> 需先「测试连接」通过(应用地址可达 + 业务库可连)才能保存。 </p>`);
} else {
_push(`<!---->`);
}
_push(`</form></div><form method="dialog" class="modal-backdrop" data-v-b8dfd02c><button data-v-b8dfd02c>close</button></form></dialog><dialog class="modal" data-v-b8dfd02c><div class="modal-box max-w-2xl" data-v-b8dfd02c><h3 class="font-bold text-lg" data-v-b8dfd02c>升级部署</h3><p class="text-sm text-slate-500 mt-1" data-v-b8dfd02c>${ssrInterpolate(up.label)}</p><div class="text-xs text-amber-700 mt-3 bg-amber-50 border border-amber-100 rounded-lg p-3 leading-relaxed" data-v-b8dfd02c> 将 <b data-v-b8dfd02c>SSH 连到该部署绑定的环境节点</b>,进入部署目录执行 <span class="font-mono" data-v-b8dfd02c>docker login → compose pull → up -d → 清理旧镜像</span>。<br data-v-b8dfd02c> · 需服务器上已维护好 <span class="font-mono" data-v-b8dfd02c>docker-compose.yml / .env / confs</span>(本操作不上传真实配置)。<br data-v-b8dfd02c> · 会<b data-v-b8dfd02c>重启该部署的容器</b>,请确认无误后再执行。 </div><dl class="grid grid-cols-[76px_1fr] gap-x-3 gap-y-1 text-xs mt-4" data-v-b8dfd02c><dt class="text-slate-400" data-v-b8dfd02c>环境节点</dt><dd class="${ssrRenderClass(up.envName ? "font-medium text-slate-700" : "font-medium text-red-500")}" data-v-b8dfd02c>${ssrInterpolate(up.envName || "未绑定 —— 请先在「编辑」里选择环境节点")}</dd><dt class="text-slate-400" data-v-b8dfd02c>部署目录</dt><dd class="${ssrRenderClass(up.deployDir ? "font-mono text-slate-700" : "font-medium text-red-500")}" data-v-b8dfd02c>${ssrInterpolate(up.deployDir || "未填 —— 请先在「编辑」里填写远端部署目录")}</dd></dl><div class="mt-3" data-v-b8dfd02c><div class="flex items-center justify-between mb-1" data-v-b8dfd02c><label class="text-xs text-slate-500" data-v-b8dfd02c>镜像版本 Tag</label><button type="button" class="text-xs text-indigo-500 hover:underline"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-b8dfd02c>${ssrInterpolate(up.tagMode === "list" ? "手动输入…" : "从仓库选择")}</button></div>`);
if (up.tagMode === "list") {
_push(`<div class="flex gap-2" data-v-b8dfd02c><select class="select select-bordered select-sm flex-1 font-mono"${ssrIncludeBooleanAttr(up.running || up.tagsLoading) ? " disabled" : ""} data-v-b8dfd02c><option value="" data-v-b8dfd02c${ssrIncludeBooleanAttr(Array.isArray(up.tag) ? ssrLooseContain(up.tag, "") : ssrLooseEqual(up.tag, "")) ? " selected" : ""}>${ssrInterpolate(up.tagsLoading ? "加载可用版本中…" : "请选择版本")}</option>`);
if (up.tag && !up.tags.includes(up.tag)) {
_push(`<option${ssrRenderAttr("value", up.tag)} data-v-b8dfd02c${ssrIncludeBooleanAttr(Array.isArray(up.tag) ? ssrLooseContain(up.tag, up.tag) : ssrLooseEqual(up.tag, up.tag)) ? " selected" : ""}>${ssrInterpolate(up.tag)}(当前记录)</option>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(up.tags, (t) => {
_push(`<option${ssrRenderAttr("value", t)} data-v-b8dfd02c${ssrIncludeBooleanAttr(Array.isArray(up.tag) ? ssrLooseContain(up.tag, t) : ssrLooseEqual(up.tag, t)) ? " selected" : ""}>${ssrInterpolate(t)}${ssrInterpolate(t === "latest" ? " · 不固定,不推荐" : "")}</option>`);
});
_push(`<!--]--></select><button type="button" class="btn btn-ghost btn-sm"${ssrIncludeBooleanAttr(up.running || up.tagsLoading) ? " disabled" : ""} data-v-b8dfd02c>刷新</button></div>`);
} else {
_push(`<input${ssrRenderAttr("value", up.tag)} type="text" class="input input-bordered input-sm w-full font-mono" placeholder="0.1.1"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-b8dfd02c>`);
}
if (up.tagsError) {
_push(`<p class="text-xs text-amber-600 mt-1" data-v-b8dfd02c> 拉取仓库版本失败:${ssrInterpolate(up.tagsError)}(可点上方「手动输入」直接填版本号,或点「刷新」重试) </p>`);
} else if (!isPinned(up.tag)) {
_push(`<p class="text-xs text-amber-600 mt-1" data-v-b8dfd02c> ⚠ 未固定版本,升级后列表无法体现具体版本号,建议选明确版本(如 0.1.1)。 </p>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
if (up.show) {
_push(`<div class="mt-3" data-v-b8dfd02c><div class="flex items-center gap-2 text-xs mb-1" data-v-b8dfd02c>`);
if (up.running) {
_push(`<span class="loading loading-spinner loading-xs text-amber-500" data-v-b8dfd02c></span>`);
} else if (up.ok) {
_push(`<span class="text-green-600 font-semibold" data-v-b8dfd02c>✓ 部署完成</span>`);
} else {
_push(`<span class="text-red-600 font-semibold" data-v-b8dfd02c>✗ 部署失败</span>`);
}
_push(`<span class="text-slate-400" data-v-b8dfd02c>${ssrInterpolate(up.running ? "执行中…" : "")}</span></div><pre class="bg-slate-900 text-slate-100 text-[11px] leading-relaxed rounded-lg p-3 h-64 overflow-auto font-mono whitespace-pre-wrap" data-v-b8dfd02c>${ssrInterpolate(up.log || "(等待输出…)")}</pre></div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="modal-action" data-v-b8dfd02c><button class="btn btn-ghost btn-sm"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-b8dfd02c>关闭</button><button class="btn btn-warning btn-sm"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-b8dfd02c>${ssrInterpolate(up.btnText)}</button></div></div><form method="dialog" class="modal-backdrop" data-v-b8dfd02c><button${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-b8dfd02c>close</button></form></dialog><dialog class="modal" data-v-b8dfd02c><div class="modal-box" data-v-b8dfd02c><h3 class="font-bold text-lg" data-v-b8dfd02c>分析历史数据</h3><p class="text-sm text-slate-500 mt-1" data-v-b8dfd02c>${ssrInterpolate(az.label)}</p><div class="text-xs text-amber-700 mt-3 bg-amber-50 border border-amber-100 rounded-lg p-3 leading-relaxed" data-v-b8dfd02c> 扫描该应用业务库,按 <b data-v-b8dfd02c>天 + 产品 + 区域</b> 生成历史统计(新增用户 / 订单 / 资源发放·使用 / 激活绑定设备),汇入 console 主库。<br data-v-b8dfd02c> · <b data-v-b8dfd02c>分析前会先清理该应用+区域在所选区间内的旧统计行</b>,避免数据重叠。<br data-v-b8dfd02c> · 登录、活跃用户、AI对话等无每日原始记录,历史无法还原(由实时管道往后采集)。<br data-v-b8dfd02c> · 仅对实时管道上线前的区间运行。留空 = 全部历史。大库可能耗时。 </div><div class="grid grid-cols-2 gap-3 mt-4" data-v-b8dfd02c><div data-v-b8dfd02c><label class="text-xs text-slate-500" data-v-b8dfd02c>起始日(含)</label><input${ssrRenderAttr("value", az.start)} type="date" class="input input-bordered input-sm w-full" data-v-b8dfd02c></div><div data-v-b8dfd02c><label class="text-xs text-slate-500" data-v-b8dfd02c>结束日(含)</label><input${ssrRenderAttr("value", az.end)} type="date" class="input input-bordered input-sm w-full" data-v-b8dfd02c></div></div>`);
if (az.mode) {
_push(`<div class="text-sm mt-3" data-v-b8dfd02c>`);
if (az.mode === "progress") {
_push(`<div class="bg-slate-50 border border-slate-200 rounded-lg p-3" data-v-b8dfd02c><div class="flex justify-between items-center text-xs mb-1.5" data-v-b8dfd02c><span class="text-slate-600" data-v-b8dfd02c>`);
if (az.curName) {
_push(`<!--[--><span class="loading loading-spinner loading-xs" data-v-b8dfd02c></span> 正在:${ssrInterpolate(az.curName)} (${ssrInterpolate(az.curIndex)}/${ssrInterpolate(az.curTotal)})<!--]-->`);
} else {
_push(`<!--[-->准备中...<!--]-->`);
}
_push(`</span><span class="font-mono text-slate-400" data-v-b8dfd02c>${ssrInterpolate(az.pct)}%</span></div><progress class="progress progress-primary w-full h-2"${ssrRenderAttr("value", az.pct)} max="100" data-v-b8dfd02c></progress><div class="mt-2 text-xs space-y-0.5" data-v-b8dfd02c><!--[-->`);
ssrRenderList(az.steps, (nm, i) => {
_push(`<div class="${ssrRenderClass(i === az.curIndex - 1 ? "text-slate-600" : "text-green-600")}" data-v-b8dfd02c>`);
if (i === az.curIndex - 1) {
_push(`<!--[--><span class="loading loading-spinner loading-xs" data-v-b8dfd02c></span> ${ssrInterpolate(nm)}<!--]-->`);
} else {
_push(`<!--[-->✓ ${ssrInterpolate(nm)}<!--]-->`);
}
_push(`</div>`);
});
_push(`<!--]--></div></div>`);
} else if (az.mode === "error") {
_push(`<div class="text-red-600" data-v-b8dfd02c>✗ ${ssrInterpolate(az.errMsg)}</div>`);
} else if (az.mode === "done" && az.report) {
_push(`<div class="bg-green-50 border border-green-100 rounded-lg p-3" data-v-b8dfd02c><div class="font-semibold text-green-700 mb-2" data-v-b8dfd02c>✓ 分析完成</div><div class="grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-slate-600 mb-2" data-v-b8dfd02c><div data-v-b8dfd02c>应用:<b data-v-b8dfd02c>${ssrInterpolate(az.report.app_name || "")}</b></div><div data-v-b8dfd02c>区域:${ssrInterpolate(az.report.region || "未指定")}</div><div data-v-b8dfd02c>区间:${ssrInterpolate((az.report.start_day || "不限") + " ~ " + (az.report.end_day || "不限"))}</div><div data-v-b8dfd02c>清理旧行:${ssrInterpolate(az.report.cleared_rows || 0)}</div><div data-v-b8dfd02c>写入天数:<b data-v-b8dfd02c>${ssrInterpolate(az.report.days_written || 0)}</b></div><div data-v-b8dfd02c>写入行数:${ssrInterpolate(az.report.rows_written || 0)}</div></div><div class="border-t border-green-100 pt-2 text-xs" data-v-b8dfd02c><!--[-->`);
ssrRenderList(az.report.steps || [], (s, i) => {
_push(`<div class="flex justify-between py-0.5" data-v-b8dfd02c><span class="text-slate-500" data-v-b8dfd02c>${ssrInterpolate(s.name)}</span><span class="font-mono text-slate-700" data-v-b8dfd02c>${ssrInterpolate((s.groups || 0) + " 组")}</span></div>`);
});
_push(`<!--]--></div></div>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="modal-action" data-v-b8dfd02c><button class="btn btn-ghost btn-sm"${ssrIncludeBooleanAttr(az.running) ? " disabled" : ""} data-v-b8dfd02c>关闭</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(az.running) ? " disabled" : ""} data-v-b8dfd02c>${ssrInterpolate(az.btnText)}</button></div></div><form method="dialog" class="modal-backdrop" data-v-b8dfd02c><button${ssrIncludeBooleanAttr(az.running) ? " disabled" : ""} data-v-b8dfd02c>close</button></form></dialog></div>`);
};
}
});
const _sfc_setup$2 = _sfc_main$2.setup;
_sfc_main$2.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/AppDeployTab.vue");
return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0;
};
const __nuxt_component_0 = /* @__PURE__ */ Object.assign(_export_sfc(_sfc_main$2, [["__scopeId", "data-v-b8dfd02c"]]), { __name: "AppDeployTab" });
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
__name: "AppModuleTab",
__ssrInlineRender: true,
props: {
appId: {},
depName: {}
},
setup(__props) {
useApi();
useToast();
const catalog = ref([]);
const curModule = ref("");
const values = reactive({});
const dataModules = reactive(/* @__PURE__ */ new Set());
const show = reactive({});
const loading = ref(false);
const saving = ref(false);
const dbError = ref("");
const curDef = computed(() => catalog.value.find((m) => m.module === curModule.value) || null);
const cur = computed(() => values[curModule.value] || {});
const groups = computed(() => {
const order = [];
const map = /* @__PURE__ */ new Map();
for (const m of catalog.value) {
if (!map.has(m.group)) {
map.set(m.group, []);
order.push(m.group);
}
map.get(m.group).push(m);
}
return order.map((name) => ({ name, modules: map.get(name) }));
});
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "card" }, _attrs))} data-v-ff0e4b71><div class="card-head" data-v-ff0e4b71><div data-v-ff0e4b71><div class="card-title" data-v-ff0e4b71>业务功能配置</div><div class="card-desc" data-v-ff0e4b71> 登录 / 短信 / 邮件 / 支付等应用独立配置,保存在<b data-v-ff0e4b71>「${ssrInterpolate(__props.depName)}」这个部署的业务库</b>(不进公共库)。密钥字段加密落库,显示时脱敏。 </div></div><button class="btn btn-outline btn-error btn-xs shrink-0"${ssrIncludeBooleanAttr(saving.value || !!dbError.value) ? " disabled" : ""} title="把该部署业务库里所有业务模块的配置,整体还原为业务服务配置文件(yaml)的初始值。用于升级/迁移把库写脏后的整体恢复。" data-v-ff0e4b71>全部重置为配置文件</button></div>`);
if (dbError.value) {
_push(`<div class="m-4 alert alert-warning py-2 text-sm" data-v-ff0e4b71><span data-v-ff0e4b71> 无法连接应用业务库:${ssrInterpolate(dbError.value)}<br data-v-ff0e4b71><span class="text-xs opacity-70" data-v-ff0e4b71>待部署的应用先完成部署、或检查业务库 DSN 连通后再配置。</span></span></div>`);
} else {
_push(`<!---->`);
}
if (loading.value) {
_push(`<div class="py-14 text-center" data-v-ff0e4b71><span class="loading loading-spinner loading-sm" data-v-ff0e4b71></span></div>`);
} else {
_push(`<div class="cfg" data-v-ff0e4b71><aside class="cfg-nav" data-v-ff0e4b71><!--[-->`);
ssrRenderList(groups.value, (grp) => {
_push(`<div data-v-ff0e4b71><div class="cfg-group" data-v-ff0e4b71>${ssrInterpolate(grp.name)}</div><!--[-->`);
ssrRenderList(grp.modules, (m) => {
_push(`<button class="cfg-item"${ssrRenderAttr("aria-current", curModule.value === m.module)} data-v-ff0e4b71><span data-v-ff0e4b71>${ssrInterpolate(m.name)}</span>`);
if (dataModules.has(m.module)) {
_push(`<span class="dot" title="库中已有配置" data-v-ff0e4b71></span>`);
} else {
_push(`<!---->`);
}
_push(`</button>`);
});
_push(`<!--]--></div>`);
});
_push(`<!--]--></aside><section class="cfg-form" data-v-ff0e4b71>`);
if (curDef.value) {
_push(`<!--[--><div class="flex items-start justify-between gap-3 mb-4 flex-wrap" data-v-ff0e4b71><div data-v-ff0e4b71><div class="text-sm font-semibold text-slate-800" data-v-ff0e4b71>${ssrInterpolate(curDef.value.name)}</div>`);
if (curDef.value.desc) {
_push(`<div class="text-[11px] text-slate-400 mt-0.5" data-v-ff0e4b71>${ssrInterpolate(curDef.value.desc)}</div>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="flex items-center gap-2" data-v-ff0e4b71><button class="btn btn-ghost btn-xs text-amber-600"${ssrIncludeBooleanAttr(saving.value) ? " disabled" : ""} title="丢弃库中该模块的全部配置,改用业务服务配置文件(yaml)里的初始值重新写入。" data-v-ff0e4b71>重置</button>`);
if (dataModules.has(curModule.value)) {
_push(`<button class="btn btn-ghost btn-xs text-rose-500"${ssrIncludeBooleanAttr(saving.value) ? " disabled" : ""} data-v-ff0e4b71>清空</button>`);
} else {
_push(`<!---->`);
}
_push(`<button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(saving.value || !!dbError.value) ? " disabled" : ""} data-v-ff0e4b71>${ssrInterpolate(saving.value ? "保存中…" : "保存")}</button></div></div><div class="grid grid-cols-1 gap-3 max-w-2xl" data-v-ff0e4b71><!--[-->`);
ssrRenderList(curDef.value.fields, (f) => {
_push(`<div class="form-control" data-v-ff0e4b71><label class="label py-0.5" data-v-ff0e4b71><span class="label-text text-sm" data-v-ff0e4b71>${ssrInterpolate(f.label)} `);
if (f.required) {
_push(`<span class="text-rose-400" data-v-ff0e4b71>*</span>`);
} else {
_push(`<!---->`);
}
if (f.secret) {
_push(`<span class="lock-tag ml-1" data-v-ff0e4b71>🔒</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="text-[10px] font-normal text-slate-300 ml-1 font-mono" data-v-ff0e4b71>${ssrInterpolate(f.key)}</span></span></label>`);
if (f.type === "bool") {
_push(`<label class="cursor-pointer flex items-center gap-2" data-v-ff0e4b71><input type="checkbox" class="toggle toggle-sm toggle-primary"${ssrIncludeBooleanAttr(cur.value[f.key] === "true") ? " checked" : ""} data-v-ff0e4b71><span class="text-xs text-slate-500" data-v-ff0e4b71>${ssrInterpolate(cur.value[f.key] === "true" ? "开启" : "关闭")}</span></label>`);
} else if (f.type === "select") {
_push(`<select class="select select-bordered select-sm w-full" data-v-ff0e4b71><option value="" data-v-ff0e4b71${ssrIncludeBooleanAttr(Array.isArray(cur.value[f.key]) ? ssrLooseContain(cur.value[f.key], "") : ssrLooseEqual(cur.value[f.key], "")) ? " selected" : ""}>请选择</option><!--[-->`);
ssrRenderList(f.options, (o) => {
_push(`<option${ssrRenderAttr("value", o.value)} data-v-ff0e4b71${ssrIncludeBooleanAttr(Array.isArray(cur.value[f.key]) ? ssrLooseContain(cur.value[f.key], o.value) : ssrLooseEqual(cur.value[f.key], o.value)) ? " selected" : ""}>${ssrInterpolate(o.label)}</option>`);
});
_push(`<!--]--></select>`);
} else if (f.type === "textarea") {
_push(`<textarea class="textarea textarea-bordered w-full font-mono text-xs" rows="3"${ssrRenderAttr("placeholder", f.secret ? "留空/保持 [encrypted] 则不变" : f.placeholder || "")} data-v-ff0e4b71>${ssrInterpolate(cur.value[f.key])}</textarea>`);
} else if (f.type === "password") {
_push(`<div class="relative" data-v-ff0e4b71><input${ssrRenderDynamicModel(show[f.key] ? "text" : "password", cur.value[f.key], null)}${ssrRenderAttr("type", show[f.key] ? "text" : "password")} class="input input-bordered input-sm w-full font-mono text-xs pr-14" placeholder="留空/保持 [encrypted] 则不变" data-v-ff0e4b71><button type="button" class="absolute right-3 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-ff0e4b71>${ssrInterpolate(show[f.key] ? "隐藏" : "显示")}</button></div>`);
} else {
_push(`<input${ssrRenderAttr("value", cur.value[f.key])} type="text" class="input input-bordered input-sm w-full font-mono text-xs"${ssrRenderAttr("placeholder", f.placeholder || "")} data-v-ff0e4b71>`);
}
if (f.desc) {
_push(`<span class="text-[11px] text-slate-400 mt-0.5" data-v-ff0e4b71>${ssrInterpolate(f.desc)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
});
_push(`<!--]--></div><!--]-->`);
} else {
_push(`<div class="py-10 text-center text-slate-400 text-sm" data-v-ff0e4b71>暂无可配置的业务模块。</div>`);
}
_push(`</section></div>`);
}
_push(`</div>`);
};
}
});
const _sfc_setup$1 = _sfc_main$1.setup;
_sfc_main$1.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/AppModuleTab.vue");
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
};
const __nuxt_component_1 = /* @__PURE__ */ Object.assign(_export_sfc(_sfc_main$1, [["__scopeId", "data-v-ff0e4b71"]]), { __name: "AppModuleTab" });
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "[name]",
__ssrInlineRender: true,
setup(__props) {
const { consoleApi } = useApi();
const { error } = useToast();
const route = useRoute$1();
useRouter();
const appName = computed(() => String(route.params.name || ""));
const product = ref(null);
const deployments = ref([]);
const envs = ref([]);
const loading = ref(false);
const tab = ref("deps");
const curDep = ref(0);
const deployTab = ref(null);
const okCount = computed(() => deployments.value.filter((d) => d.status !== "pending").length);
const pendingCount = computed(() => deployments.value.filter((d) => d.status === "pending").length);
const curDepName = computed(() => {
const d = deployments.value.find((x) => x.id === curDep.value);
return d ? d.name || "部署#" + d.id : "";
});
const versionSpread = computed(() => {
const tags = [...new Set(deployments.value.filter((d) => d.status !== "pending").map((d) => d.image_tag || "latest"))];
return tags.length ? tags.join(" · ") : "—";
});
async function loadAll() {
loading.value = true;
try {
const [ps, ds, es] = await Promise.all([
consoleApi("products/list", {}),
consoleApi("apps/list", {}),
consoleApi("envs/list", {})
]);
product.value = (ps ?? []).find((p) => p.name === appName.value) ?? null;
deployments.value = (ds ?? []).filter((d) => d.app_name === appName.value);
envs.value = es ?? [];
if (!deployments.value.some((d) => d.id === curDep.value)) {
const first = deployments.value.find((d) => d.status !== "pending") ?? deployments.value[0];
curDep.value = first?.id ?? 0;
}
} catch (e) {
error(e?.message ?? "加载应用详情失败");
} finally {
loading.value = false;
}
}
function onConfigure(id) {
curDep.value = id;
tab.value = "modules";
}
ref(null);
const pForm = reactive({ id: 0, name: "", image_name: "", remark: "", enabled: true });
watch(appName, loadAll);
return (_ctx, _push, _parent, _attrs) => {
const _component_AppDeployTab = __nuxt_component_0;
const _component_AppModuleTab = __nuxt_component_1;
_push(`<div${ssrRenderAttrs(_attrs)} data-v-3e1700b0><div class="flex items-center gap-2 mb-4 text-sm" data-v-3e1700b0><button class="btn btn-ghost btn-xs" data-v-3e1700b0>← 应用中心</button><span class="text-slate-300" data-v-3e1700b0>/</span><span class="font-semibold text-slate-700" data-v-3e1700b0>${ssrInterpolate(appName.value)}</span></div>`);
if (loading.value) {
_push(`<div class="bg-white rounded-xl border border-slate-100 py-16 text-center" data-v-3e1700b0><span class="loading loading-spinner loading-sm" data-v-3e1700b0></span></div>`);
} else if (!product.value) {
_push(`<div class="bg-white rounded-xl border border-slate-100 py-16 text-center" data-v-3e1700b0><p class="text-slate-500" data-v-3e1700b0>找不到应用「${ssrInterpolate(appName.value)}」</p><button class="btn btn-sm mt-4" data-v-3e1700b0>返回应用中心</button></div>`);
} else {
_push(`<!--[--><div class="hero" data-v-3e1700b0><div class="hero-logo" data-v-3e1700b0>${ssrInterpolate((product.value.name || "?").charAt(0).toUpperCase())}</div><div class="flex-1 min-w-[240px]" data-v-3e1700b0><div class="hero-name" data-v-3e1700b0>${ssrInterpolate(product.value.name)} <span class="${ssrRenderClass([product.value.enabled ? "chip-ok" : "", "chip"])}" data-v-3e1700b0>${ssrInterpolate(product.value.enabled ? "启用" : "停用")}</span><span class="chip chip-mono" data-v-3e1700b0>🐳 ${ssrInterpolate(product.value.image_name || "未设置镜像")}</span></div><div class="text-xs text-slate-500 mt-1.5" data-v-3e1700b0>${ssrInterpolate(product.value.remark || "—")}</div></div><div class="flex gap-2" data-v-3e1700b0><button class="btn btn-sm" data-v-3e1700b0>编辑应用</button><button class="btn btn-primary btn-sm text-white" data-v-3e1700b0>+ 部署新环境</button></div></div><div class="kpis" data-v-3e1700b0><div class="kpi accent" data-v-3e1700b0><div class="kpi-l" data-v-3e1700b0>部署</div><div class="kpi-v" data-v-3e1700b0>${ssrInterpolate(deployments.value.length)}<small data-v-3e1700b0>个区域</small></div></div><div class="kpi ok" data-v-3e1700b0><div class="kpi-l" data-v-3e1700b0>已接入</div><div class="kpi-v" data-v-3e1700b0>${ssrInterpolate(okCount.value)}</div></div><div class="${ssrRenderClass([pendingCount.value ? "warn" : "", "kpi"])}" data-v-3e1700b0><div class="kpi-l" data-v-3e1700b0>待部署</div><div class="kpi-v" data-v-3e1700b0>${ssrInterpolate(pendingCount.value)}</div></div><div class="kpi" data-v-3e1700b0><div class="kpi-l" data-v-3e1700b0>版本分布</div><div class="kpi-v" style="${ssrRenderStyle({ "font-size": "14px", "padding-top": "5px" })}" data-v-3e1700b0>${ssrInterpolate(versionSpread.value)}</div></div></div><div class="tablist" role="tablist" data-v-3e1700b0><button class="tab" role="tab"${ssrRenderAttr("aria-selected", tab.value === "deps")} data-v-3e1700b0> 部署环境 <span class="tab-n" data-v-3e1700b0>${ssrInterpolate(deployments.value.length)}</span></button><button class="tab" role="tab"${ssrRenderAttr("aria-selected", tab.value === "modules")} data-v-3e1700b0>业务功能配置</button></div>`);
if (tab.value === "modules") {
_push(`<div class="depbar" data-v-3e1700b0><span class="text-xs text-slate-500 font-semibold shrink-0" data-v-3e1700b0>配置目标</span><div class="flex gap-1.5 flex-wrap" data-v-3e1700b0><!--[-->`);
ssrRenderList(deployments.value, (d) => {
_push(`<button class="depchip"${ssrRenderAttr("aria-pressed", curDep.value === d.id)}${ssrRenderAttr("title", d.status === "pending" ? "待部署:业务库可能还未就绪" : "")} data-v-3e1700b0><span class="${ssrRenderClass([{ pending: d.status === "pending" }, "dot"])}" data-v-3e1700b0></span> ${ssrInterpolate(d.region || d.name || "部署#" + d.id)} <span class="text-[10.5px] text-slate-400 font-mono" data-v-3e1700b0>#${ssrInterpolate(d.id)}</span></button>`);
});
_push(`<!--]-->`);
if (!deployments.value.length) {
_push(`<span class="text-xs text-slate-400 py-1" data-v-3e1700b0>该应用还没有部署,无处存放配置</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><span class="text-[11px] text-slate-400 ml-auto" data-v-3e1700b0>配置存在该部署自己的业务库里,各区域互不影响</span></div>`);
} else {
_push(`<!---->`);
}
_push(ssrRenderComponent(_component_AppDeployTab, {
style: tab.value === "deps" ? null : { display: "none" },
ref_key: "deployTab",
ref: deployTab,
"app-name": appName.value,
"default-image": product.value.image_name || "",
deployments: deployments.value,
envs: envs.value,
onRefresh: loadAll,
onConfigure
}, null, _parent));
if (tab.value === "modules" && curDep.value) {
_push(ssrRenderComponent(_component_AppModuleTab, {
key: "m" + curDep.value,
"app-id": curDep.value,
"dep-name": curDepName.value
}, null, _parent));
} else {
_push(`<!---->`);
}
if (tab.value === "modules" && !curDep.value) {
_push(`<div class="bg-white rounded-xl border border-slate-100 py-16 text-center text-slate-400" data-v-3e1700b0> 先在「部署环境」里创建一个部署,才能配置。 </div>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
}
_push(`<dialog class="modal" data-v-3e1700b0><div class="modal-box max-w-lg" data-v-3e1700b0><h3 class="font-bold text-lg" data-v-3e1700b0>编辑应用</h3><p class="text-xs text-slate-400 mt-1" data-v-3e1700b0> 应用名是关联键:部署、账号作用域、第三方服务配置都按它挂载,改名会断开已有关联。 </p><form class="mt-4 space-y-3" data-v-3e1700b0><div class="form-control" data-v-3e1700b0><label class="label py-1" data-v-3e1700b0><span class="label-text text-sm font-medium" data-v-3e1700b0>应用名 *</span></label><input${ssrRenderAttr("value", pForm.name)} type="text" class="input input-bordered input-sm w-full" required data-v-3e1700b0></div><div class="form-control" data-v-3e1700b0><label class="label py-1" data-v-3e1700b0><span class="label-text text-sm font-medium" data-v-3e1700b0>默认镜像名</span></label><input${ssrRenderAttr("value", pForm.image_name)} type="text" class="input input-bordered input-sm w-full font-mono text-xs" data-v-3e1700b0></div><div class="form-control" data-v-3e1700b0><label class="label py-1" data-v-3e1700b0><span class="label-text text-sm font-medium" data-v-3e1700b0>备注</span></label><input${ssrRenderAttr("value", pForm.remark)} type="text" class="input input-bordered input-sm w-full" data-v-3e1700b0></div><label class="flex items-center gap-2 cursor-pointer pt-1" data-v-3e1700b0><input${ssrIncludeBooleanAttr(Array.isArray(pForm.enabled) ? ssrLooseContain(pForm.enabled, null) : pForm.enabled) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-3e1700b0><span class="text-sm" data-v-3e1700b0>启用</span></label><div class="modal-action" data-v-3e1700b0><button type="button" class="btn btn-ghost btn-sm" data-v-3e1700b0>取消</button><button type="submit" class="btn btn-primary btn-sm text-white" data-v-3e1700b0>保存</button></div></form></div><form method="dialog" class="modal-backdrop" data-v-3e1700b0><button data-v-3e1700b0>close</button></form></dialog></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/apps/[name].vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const _name_ = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-3e1700b0"]]);
export { _name_ as default };
//# sourceMappingURL=_name_-3YudcsGQ.mjs.map

1
apps/admin/.output/server/chunks/build/_name_-3YudcsGQ.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"_name_-3YudcsGQ.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-3YudcsGQ.js"],"names":["useRoute"],"mappings":"","x_google_ignoreList":[0]}

4
apps/admin/.output/server/chunks/build/_name_-styles-1.mjs-vz5bkjKO.mjs

@ -0,0 +1,4 @@
const AppDeployTab_vue_vue_type_style_index_0_scoped_b8dfd02c_lang = ".card[data-v-b8dfd02c]{background:#fff;border:1px solid #eef2f7;border-radius:14px;box-shadow:0 1px 2px #0f172a0a;overflow:hidden}.card-head[data-v-b8dfd02c]{padding:15px 18px;border-bottom:1px solid #eef2f7;display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap}.card-title[data-v-b8dfd02c]{font-size:14.5px;font-weight:700;color:#1e293b}.card-desc[data-v-b8dfd02c]{font-size:11.5px;color:#64748b;margin-top:3px;max-width:74ch;line-height:1.55}.dep[data-v-b8dfd02c]{display:grid;grid-template-columns:1.5fr 1fr 1fr .9fr auto;gap:14px;align-items:center;padding:14px 18px;border-bottom:1px solid #eef2f7}.dep[data-v-b8dfd02c]:last-child{border-bottom:0}.dep[data-v-b8dfd02c]:hover{background:#fcfcfd}.dep.pending[data-v-b8dfd02c]{background:linear-gradient(90deg,#fef3c7,transparent 34%)}.dep-name[data-v-b8dfd02c]{font-weight:600;font-size:13.5px;color:#334155;display:flex;align-items:center;gap:7px;flex-wrap:wrap}.dep-sub[data-v-b8dfd02c]{font-size:11px;color:#94a3b8;margin-top:3px;font-family:SF Mono,Menlo,monospace}.dep-acts[data-v-b8dfd02c]{display:flex;gap:4px;flex-wrap:wrap;justify-content:flex-end}.field-l[data-v-b8dfd02c]{font-size:10px;color:#94a3b8;letter-spacing:.04em;text-transform:uppercase;font-weight:600;margin-bottom:3px}.chip[data-v-b8dfd02c]{display:inline-flex;align-items:center;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#64748b}.chip-dep[data-v-b8dfd02c]{background:#ecfeff;color:#0e7490}.chip-ok[data-v-b8dfd02c]{background:#dcfce7;color:#15803d}.chip-warn[data-v-b8dfd02c]{background:#fef3c7;color:#b45309}.chip-mono[data-v-b8dfd02c]{font-family:SF Mono,Menlo,monospace;font-weight:600}@media(max-width:1280px){.dep[data-v-b8dfd02c]{grid-template-columns:1fr 1fr}.dep-acts[data-v-b8dfd02c]{grid-column:1/-1;justify-content:flex-start}}";
export { AppDeployTab_vue_vue_type_style_index_0_scoped_b8dfd02c_lang as A };
//# sourceMappingURL=_name_-styles-1.mjs-vz5bkjKO.mjs.map

1
apps/admin/.output/server/chunks/build/_name_-styles-1.mjs-vz5bkjKO.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"_name_-styles-1.mjs-vz5bkjKO.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles-1.mjs-vz5bkjKO.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

4
apps/admin/.output/server/chunks/build/_name_-styles-2.mjs-BXCS7H7R.mjs

@ -0,0 +1,4 @@
const AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang = ".card[data-v-ff0e4b71]{background:#fff;border:1px solid #eef2f7;border-radius:14px;box-shadow:0 1px 2px #0f172a0a;overflow:hidden}.card-head[data-v-ff0e4b71]{padding:15px 18px;border-bottom:1px solid #eef2f7;display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap}.card-title[data-v-ff0e4b71]{font-size:14.5px;font-weight:700;color:#1e293b}.card-desc[data-v-ff0e4b71]{font-size:11.5px;color:#64748b;margin-top:3px;max-width:78ch;line-height:1.55}.cfg[data-v-ff0e4b71]{display:grid;grid-template-columns:190px 1fr}.cfg-nav[data-v-ff0e4b71]{border-right:1px solid #eef2f7;padding:12px 10px;background:#fcfcfd}.cfg-group[data-v-ff0e4b71]{font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#94a3b8;padding:10px 8px 4px}.cfg-item[data-v-ff0e4b71]{width:100%;border:0;background:none;font-size:13px;color:#334155;text-align:left;padding:7px 10px;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:8px}.cfg-item[data-v-ff0e4b71]:hover{background:#f8fafc}.cfg-item[aria-current=true][data-v-ff0e4b71]{background:#eef2ff;color:#4338ca;font-weight:600}.cfg-item .dot[data-v-ff0e4b71]{width:6px;height:6px;border-radius:50%;background:#4ade80;flex-shrink:0}.cfg-form[data-v-ff0e4b71]{padding:16px 20px;min-width:0}.lock-tag[data-v-ff0e4b71]{font-size:10px;font-weight:600;color:#dc2626;background:#fef2f2;padding:1px 5px;border-radius:5px}@media(max-width:900px){.cfg[data-v-ff0e4b71]{grid-template-columns:1fr}.cfg-nav[data-v-ff0e4b71]{border-right:0;border-bottom:1px solid #eef2f7}}";
export { AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang as A };
//# sourceMappingURL=_name_-styles-2.mjs-BXCS7H7R.mjs.map

1
apps/admin/.output/server/chunks/build/_name_-styles-2.mjs-BXCS7H7R.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"_name_-styles-2.mjs-BXCS7H7R.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles-2.mjs-BXCS7H7R.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

13
apps/admin/.output/server/chunks/build/_name_-styles.DaB9D0lC.mjs

@ -0,0 +1,13 @@
import { A as AppDeployTab_vue_vue_type_style_index_0_scoped_b8dfd02c_lang } from './_name_-styles-1.mjs-vz5bkjKO.mjs';
import { A as AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang } from './_name_-styles-2.mjs-BXCS7H7R.mjs';
const _name__vue_vue_type_style_index_0_scoped_3e1700b0_lang = '.hero[data-v-3e1700b0]{background:#fff;border:1px solid #eef2f7;border-radius:16px;padding:20px 22px;margin-bottom:16px;box-shadow:0 1px 2px #0f172a0a,0 4px 16px #0f172a08;display:flex;gap:18px;align-items:center;flex-wrap:wrap}.hero-logo[data-v-3e1700b0]{width:58px;height:58px;border-radius:15px;flex-shrink:0;color:#fff;background:linear-gradient(135deg,#4f46e5,#7c3aed);display:grid;place-items:center;font-weight:800;font-size:24px;box-shadow:0 8px 22px #4f46e54d}.hero-name[data-v-3e1700b0]{font-size:20px;font-weight:700;color:#1e293b;letter-spacing:-.015em;display:flex;align-items:center;gap:9px;flex-wrap:wrap}.kpis[data-v-3e1700b0]{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:18px}.kpi[data-v-3e1700b0]{background:#fff;border:1px solid #eef2f7;border-radius:12px;padding:13px 15px;position:relative;overflow:hidden;box-shadow:0 1px 2px #0f172a0a}.kpi[data-v-3e1700b0]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:#e2e8f0}.kpi.ok[data-v-3e1700b0]:before{background:#16a34a}.kpi.warn[data-v-3e1700b0]:before{background:#d97706}.kpi.accent[data-v-3e1700b0]:before{background:#4f46e5}.kpi-l[data-v-3e1700b0]{font-size:10.5px;color:#94a3b8;letter-spacing:.04em;text-transform:uppercase;font-weight:600}.kpi-v[data-v-3e1700b0]{font-size:22px;font-weight:700;color:#1e293b;margin-top:3px;letter-spacing:-.02em;font-family:SF Mono,Menlo,monospace;font-variant-numeric:tabular-nums}.kpi-v small[data-v-3e1700b0]{font-size:12px;color:#94a3b8;font-weight:500;margin-left:3px}.tablist[data-v-3e1700b0]{display:flex;gap:2px;border-bottom:1px solid #e2e8f0;margin-bottom:18px;overflow-x:auto}.tab[data-v-3e1700b0]{border:0;background:none;font-size:13.5px;color:#64748b;padding:10px 15px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap;display:flex;align-items:center;gap:6px}.tab[data-v-3e1700b0]:hover{color:#1e293b}.tab[aria-selected=true][data-v-3e1700b0]{color:#4338ca;border-bottom-color:#4f46e5;font-weight:600}.tab-n[data-v-3e1700b0]{font-size:10.5px;background:#f8fafc;border:1px solid #eef2f7;color:#64748b;border-radius:20px;padding:0 6px;font-family:SF Mono,Menlo,monospace}.tab[aria-selected=true] .tab-n[data-v-3e1700b0]{background:#eef2ff;color:#4338ca;border-color:transparent}.depbar[data-v-3e1700b0]{gap:10px;flex-wrap:wrap;background:#f8fafc;border:1px solid #eef2f7;border-radius:11px;padding:10px 13px;margin-bottom:16px}.depbar[data-v-3e1700b0],.depchip[data-v-3e1700b0]{display:flex;align-items:center}.depchip[data-v-3e1700b0]{border:1px solid #e2e8f0;background:#fff;border-radius:20px;padding:4px 12px;font-size:12px;cursor:pointer;color:#334155;gap:6px}.depchip[data-v-3e1700b0]:hover{border-color:#0e7490}.depchip[aria-pressed=true][data-v-3e1700b0]{background:#ecfeff;border-color:#0e7490;color:#0e7490;font-weight:600}.depchip .dot[data-v-3e1700b0]{width:6px;height:6px;border-radius:50%;background:#16a34a}.depchip .dot.pending[data-v-3e1700b0]{background:#d97706}.chip[data-v-3e1700b0]{display:inline-flex;align-items:center;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#64748b}.chip-ok[data-v-3e1700b0]{background:#dcfce7;color:#15803d}.chip-mono[data-v-3e1700b0]{font-family:SF Mono,Menlo,monospace;font-weight:600}';
const _name_Styles_DaB9D0lC = [
AppDeployTab_vue_vue_type_style_index_0_scoped_b8dfd02c_lang,
AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang,
_name__vue_vue_type_style_index_0_scoped_3e1700b0_lang
];
export { _name_Styles_DaB9D0lC as default };
//# sourceMappingURL=_name_-styles.DaB9D0lC.mjs.map

1
apps/admin/.output/server/chunks/build/_name_-styles.DaB9D0lC.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"_name_-styles.DaB9D0lC.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles-3.mjs-7yUQQ2f9.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles.DaB9D0lC.mjs"],"names":["style_0","style_1","style_2"],"mappings":"","x_google_ignoreList":[0,1]}

165
apps/admin/.output/server/chunks/build/accounts-D3gizV-b.mjs

@ -0,0 +1,165 @@
import { defineComponent, ref, reactive, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrInterpolate, ssrRenderClass, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer';
import { u as useApi } from './useApi-D_CttG2t.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { _ as _export_sfc } from './server.mjs';
import './auth-QFkCoU1C.mjs';
import 'pinia';
import './useLoading-D4zrSa2m.mjs';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'perfect-debounce';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "accounts",
__ssrInlineRender: true,
setup(__props) {
useApi();
useToast();
const ROLE = { 1: "超管", 2: "管理员", 3: "代理", 4: "运营" };
const ROLE_CLS = { 1: "badge-error", 2: "badge-primary", 3: "badge-warning", 4: "badge-info" };
const ACCESS_PAGES = [["dashboard", "仪表盘"], ["provider", "方案商"], ["factory", "品牌商"], ["product", "产品管理"], ["device", "生产管理"], ["code", "公码管理"], ["user", "用户查询"], ["apps", "应用注册"]];
const REGIONS = [["cn", "中国"], ["us", "美国"], ["ea", "东亚"], ["sea", "东南亚"], ["sa", "南亚"], ["me", "中东"], ["eu", "欧洲"], ["ru", "俄罗斯"], ["af", "非洲"], ["sam", "南美"], ["nam", "北美"], ["oc", "大洋洲"], ["br", "巴西"], ["in", "印度"]];
const view = ref("list");
const rows = ref([]);
const apps = ref([]);
const loading = ref(false);
const submitting = ref(false);
const editId = ref(0);
const form = reactive({
username: "",
password: "",
identity: 2,
enabled: "1",
remark: ""
});
const sel = reactive({
access: [],
apps: [],
regions: [],
products: []
});
const productGroups = ref([]);
const prodLoading = ref(false);
function fromCsv(s) {
return (s || "").split(",").map((x) => x.trim()).filter((x) => x);
}
function scopeParts(a) {
const parts = [];
if (a.apps) parts.push("应用:" + fromCsv(a.apps).length);
if (a.regions) parts.push("区域:" + fromCsv(a.regions).length);
if (a.products) parts.push("产品:" + fromCsv(a.products).length);
if (a.access) parts.push("页面:" + fromCsv(a.access).length);
return parts;
}
ref(null);
ref(0);
const topup = reactive({
name: "",
cur: "",
vipday: 0,
trademin: 0,
meetmin: 0
});
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-f682efe9><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}" data-v-f682efe9><div class="flex items-center justify-between mb-4" data-v-f682efe9><div data-v-f682efe9><h2 class="text-lg font-bold text-slate-700" data-v-f682efe9>后台账号</h2><p class="text-xs text-slate-400 mt-0.5" data-v-f682efe9>超管 / 管理员 / 代理 / 运营。代理·运营可绑定应用·区域·产品,登录后仪表盘按绑定限制。</p></div><button class="btn btn-primary btn-sm text-white" data-v-f682efe9>+ 新建账号</button></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 overflow-hidden" data-v-f682efe9><table class="table table-sm" data-v-f682efe9><thead data-v-f682efe9><tr class="text-slate-500" data-v-f682efe9><th data-v-f682efe9>ID</th><th data-v-f682efe9>用户名</th><th data-v-f682efe9>角色</th><th data-v-f682efe9>状态</th><th data-v-f682efe9>绑定作用域</th><th data-v-f682efe9>备注</th><th class="text-right" data-v-f682efe9>操作</th></tr></thead><tbody data-v-f682efe9>`);
if (loading.value) {
_push(`<tr data-v-f682efe9><td colspan="7" class="text-center text-slate-400 py-8" data-v-f682efe9>加载中...</td></tr>`);
} else if (!rows.value.length) {
_push(`<tr data-v-f682efe9><td colspan="7" class="text-center text-slate-400 py-8" data-v-f682efe9>暂无账号(引导超管不在此列)</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(rows.value, (a) => {
_push(`<tr data-v-f682efe9><td class="font-mono" data-v-f682efe9>${ssrInterpolate(a.id)}</td><td class="font-medium" data-v-f682efe9>${ssrInterpolate(a.username || "")}</td><td data-v-f682efe9><span class="${ssrRenderClass([ROLE_CLS[a.identity] || "", "badge badge-sm"])}" data-v-f682efe9>${ssrInterpolate(ROLE[a.identity] || a.identity)}</span></td><td data-v-f682efe9>`);
if (a.enabled) {
_push(`<span class="text-green-600 text-xs" data-v-f682efe9>启用</span>`);
} else {
_push(`<span class="text-slate-400 text-xs" data-v-f682efe9>停用</span>`);
}
_push(`</td><td data-v-f682efe9>`);
if (a.identity === 3 || a.identity === 4) {
_push(`<!--[-->`);
if (scopeParts(a).length) {
_push(`<span class="text-xs text-slate-500" data-v-f682efe9>${ssrInterpolate(scopeParts(a).join(" · "))}</span>`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-f682efe9>未绑定(不限)</span>`);
}
_push(`<!--]-->`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-f682efe9>全部权限</span>`);
}
if (a.identity === 3) {
_push(`<div class="text-[11px] text-emerald-600 mt-0.5" data-v-f682efe9> 余额 VIP${ssrInterpolate(a.balance_vipday || 0)}天 · 翻译${ssrInterpolate(a.balance_trademin || 0)}分 · 会议${ssrInterpolate(a.balance_meetmin || 0)}分 </div>`);
} else {
_push(`<!---->`);
}
_push(`</td><td class="text-xs text-slate-500" data-v-f682efe9>${ssrInterpolate(a.remark || "")}</td><td data-v-f682efe9><div class="flex gap-1 justify-end" data-v-f682efe9>`);
if (a.identity === 3) {
_push(`<button class="btn btn-ghost btn-xs text-emerald-600" data-v-f682efe9>充值</button>`);
} else {
_push(`<!---->`);
}
_push(`<button class="btn btn-ghost btn-xs" data-v-f682efe9>编辑</button><button class="btn btn-ghost btn-xs text-amber-600" data-v-f682efe9>改密</button><button class="btn btn-ghost btn-xs text-red-500" data-v-f682efe9>删除</button></div></td></tr>`);
});
_push(`<!--]--></tbody></table></div></div><div style="${ssrRenderStyle(view.value === "form" ? null : { display: "none" })}" data-v-f682efe9><div class="flex items-center gap-3 mb-5" data-v-f682efe9><button class="btn btn-ghost btn-sm" data-v-f682efe9>← 返回列表</button><h2 class="text-lg font-semibold text-slate-800" data-v-f682efe9>${ssrInterpolate(editId.value ? "编辑账号 #" + editId.value : "新建账号")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl" data-v-f682efe9><div class="grid grid-cols-2 gap-3" data-v-f682efe9><div data-v-f682efe9><label class="text-xs text-slate-500" data-v-f682efe9>用户名</label><input${ssrRenderAttr("value", form.username)}${ssrIncludeBooleanAttr(!!editId.value) ? " disabled" : ""} class="input input-bordered input-sm w-full" placeholder="登录用户名" data-v-f682efe9></div><div style="${ssrRenderStyle(!editId.value ? null : { display: "none" })}" data-v-f682efe9><label class="text-xs text-slate-500" data-v-f682efe9>密码</label><input${ssrRenderAttr("value", form.password)} type="password" class="input input-bordered input-sm w-full" placeholder="登录密码" data-v-f682efe9></div><div data-v-f682efe9><label class="text-xs text-slate-500" data-v-f682efe9>角色</label><select class="select select-bordered select-sm w-full" data-v-f682efe9><option${ssrRenderAttr("value", 2)} data-v-f682efe9${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 2) : ssrLooseEqual(form.identity, 2)) ? " selected" : ""}>管理员(除账号管理外全部)</option><option${ssrRenderAttr("value", 3)} data-v-f682efe9${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 3) : ssrLooseEqual(form.identity, 3)) ? " selected" : ""}>代理(外部,按绑定限制)</option><option${ssrRenderAttr("value", 4)} data-v-f682efe9${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 4) : ssrLooseEqual(form.identity, 4)) ? " selected" : ""}>运营(内部,按绑定限制)</option><option${ssrRenderAttr("value", 1)} data-v-f682efe9${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 1) : ssrLooseEqual(form.identity, 1)) ? " selected" : ""}>超管(全部权限)</option></select></div><div data-v-f682efe9><label class="text-xs text-slate-500" data-v-f682efe9>状态</label><select class="select select-bordered select-sm w-full" data-v-f682efe9><option value="1" data-v-f682efe9${ssrIncludeBooleanAttr(Array.isArray(form.enabled) ? ssrLooseContain(form.enabled, "1") : ssrLooseEqual(form.enabled, "1")) ? " selected" : ""}>启用</option><option value="0" data-v-f682efe9${ssrIncludeBooleanAttr(Array.isArray(form.enabled) ? ssrLooseContain(form.enabled, "0") : ssrLooseEqual(form.enabled, "0")) ? " selected" : ""}>停用</option></select></div><div class="col-span-2" data-v-f682efe9><label class="text-xs text-slate-500" data-v-f682efe9>备注</label><input${ssrRenderAttr("value", form.remark)} class="input input-bordered input-sm w-full" placeholder="可选" data-v-f682efe9></div></div><div class="mt-4 border-t border-slate-100 pt-4" style="${ssrRenderStyle(form.identity === 3 || form.identity === 4 ? null : { display: "none" })}" data-v-f682efe9><div class="text-sm font-semibold text-slate-600 mb-2" data-v-f682efe9>作用域绑定 <span class="text-xs text-slate-400 font-normal" data-v-f682efe9>(代理/运营生效;勾选可访问页面,并限制仪表盘数据范围)</span></div><div class="mb-3" data-v-f682efe9><div class="text-xs text-slate-500 mb-1.5" data-v-f682efe9>可访问页面</div><div class="flex flex-wrap gap-2" data-v-f682efe9><!--[-->`);
ssrRenderList(ACCESS_PAGES, (p) => {
_push(`<label class="chk" data-v-f682efe9><input${ssrIncludeBooleanAttr(Array.isArray(sel.access) ? ssrLooseContain(sel.access, p[0]) : sel.access) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", p[0])} data-v-f682efe9>${ssrInterpolate(p[1])}</label>`);
});
_push(`<!--]--></div></div><div class="mb-3" data-v-f682efe9><div class="text-xs text-slate-500 mb-1.5" data-v-f682efe9>绑定应用 <span class="text-slate-300" data-v-f682efe9>(仪表盘只显示这些应用数据;不勾=不限)</span></div><div class="flex flex-wrap gap-2" data-v-f682efe9>`);
if (apps.value.length) {
_push(`<!--[-->`);
ssrRenderList(apps.value, (a) => {
_push(`<label class="chk" data-v-f682efe9><input${ssrIncludeBooleanAttr(Array.isArray(sel.apps) ? ssrLooseContain(sel.apps, a.name) : sel.apps) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", a.name)} data-v-f682efe9>${ssrInterpolate(a.name || "应用#" + a.id)}</label>`);
});
_push(`<!--]-->`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-f682efe9>无注册应用</span>`);
}
_push(`</div></div><div class="mb-3" data-v-f682efe9><div class="text-xs text-slate-500 mb-1.5" data-v-f682efe9>绑定区域 <span class="text-slate-300" data-v-f682efe9>(不勾=不限)</span></div><div class="flex flex-wrap gap-2" data-v-f682efe9><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<label class="chk" data-v-f682efe9><input${ssrIncludeBooleanAttr(Array.isArray(sel.regions) ? ssrLooseContain(sel.regions, r[0]) : sel.regions) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", r[0])} data-v-f682efe9>${ssrInterpolate(r[1])}</label>`);
});
_push(`<!--]--></div></div><div data-v-f682efe9><div class="text-xs text-slate-500 mb-1.5" data-v-f682efe9>绑定产品 <span class="text-slate-300" data-v-f682efe9>(按厂家分组;仪表盘只显示这些产品数据;不勾=不限)</span></div><div class="max-h-56 overflow-y-auto pr-1 border border-slate-100 rounded-lg p-2" data-v-f682efe9>`);
if (prodLoading.value) {
_push(`<span class="text-xs text-slate-300" data-v-f682efe9>加载产品中...</span>`);
} else if (!productGroups.value.length) {
_push(`<span class="text-xs text-slate-300" data-v-f682efe9>无产品</span>`);
} else {
_push(`<!--[-->`);
ssrRenderList(productGroups.value, (g) => {
_push(`<div class="mb-2 last:mb-0" data-v-f682efe9><div class="text-[11px] font-semibold text-slate-500 mb-1 sticky top-0 bg-white py-0.5" data-v-f682efe9>🏭 ${ssrInterpolate(g.label)}</div><div class="flex flex-wrap gap-2" data-v-f682efe9><!--[-->`);
ssrRenderList(g.products, (p) => {
_push(`<label class="chk" data-v-f682efe9><input${ssrIncludeBooleanAttr(Array.isArray(sel.products) ? ssrLooseContain(sel.products, String(p.id)) : sel.products) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", String(p.id))} data-v-f682efe9>${ssrInterpolate((p.devicename || "产品") + " #" + p.id)}</label>`);
});
_push(`<!--]--></div></div>`);
});
_push(`<!--]-->`);
}
_push(`</div></div></div><div class="flex gap-3 justify-end mt-6" data-v-f682efe9><button class="btn btn-ghost btn-sm" data-v-f682efe9>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-f682efe9>保存</button></div></div></div><dialog class="modal" data-v-f682efe9><div class="modal-box max-w-md" data-v-f682efe9><h3 class="font-bold text-lg mb-1" data-v-f682efe9>充值 / 调整资源点</h3><p class="text-xs text-slate-400 mb-3" data-v-f682efe9>代理:<span class="font-medium text-slate-600" data-v-f682efe9>${ssrInterpolate(topup.name)}</span>。填增量(可填负数下调),当前余额:<span class="text-emerald-600" data-v-f682efe9>${ssrInterpolate(topup.cur)}</span></p><div class="grid grid-cols-3 gap-3" data-v-f682efe9><div data-v-f682efe9><label class="text-xs text-slate-500" data-v-f682efe9>VIP天数</label><input${ssrRenderAttr("value", topup.vipday)} type="number" class="input input-bordered input-sm w-full" data-v-f682efe9></div><div data-v-f682efe9><label class="text-xs text-slate-500" data-v-f682efe9>翻译分钟</label><input${ssrRenderAttr("value", topup.trademin)} type="number" class="input input-bordered input-sm w-full" data-v-f682efe9></div><div data-v-f682efe9><label class="text-xs text-slate-500" data-v-f682efe9>会议分钟</label><input${ssrRenderAttr("value", topup.meetmin)} type="number" class="input input-bordered input-sm w-full" data-v-f682efe9></div></div><div class="modal-action" data-v-f682efe9><button class="btn btn-ghost btn-sm" data-v-f682efe9>取消</button><button class="btn btn-primary btn-sm text-white" data-v-f682efe9>确认</button></div></div><form method="dialog" class="modal-backdrop" data-v-f682efe9><button data-v-f682efe9>close</button></form></dialog></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/accounts.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const accounts = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f682efe9"]]);
export { accounts as default };
//# sourceMappingURL=accounts-D3gizV-b.mjs.map

1
apps/admin/.output/server/chunks/build/accounts-D3gizV-b.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"accounts-D3gizV-b.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/accounts-D3gizV-b.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

165
apps/admin/.output/server/chunks/build/accounts-DMzzARF9.mjs

@ -1,165 +0,0 @@
import { defineComponent, ref, reactive, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrInterpolate, ssrRenderClass, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer';
import { u as useApi } from './useApi-DMQewX5_.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { _ as _export_sfc } from './server.mjs';
import './auth-QFkCoU1C.mjs';
import 'pinia';
import './useLoading-D4zrSa2m.mjs';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'perfect-debounce';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "accounts",
__ssrInlineRender: true,
setup(__props) {
useApi();
useToast();
const ROLE = { 1: "超管", 2: "管理员", 3: "代理", 4: "运营" };
const ROLE_CLS = { 1: "badge-error", 2: "badge-primary", 3: "badge-warning", 4: "badge-info" };
const ACCESS_PAGES = [["dashboard", "仪表盘"], ["factory", "厂家管理"], ["product", "产品管理"], ["device", "生产管理"], ["code", "公码管理"], ["user", "用户查询"], ["apps", "应用注册"]];
const REGIONS = [["cn", "中国"], ["us", "美国"], ["ea", "东亚"], ["sea", "东南亚"], ["sa", "南亚"], ["me", "中东"], ["eu", "欧洲"], ["ru", "俄罗斯"], ["af", "非洲"], ["sam", "南美"], ["nam", "北美"], ["oc", "大洋洲"], ["br", "巴西"], ["in", "印度"]];
const view = ref("list");
const rows = ref([]);
const apps = ref([]);
const loading = ref(false);
const submitting = ref(false);
const editId = ref(0);
const form = reactive({
username: "",
password: "",
identity: 2,
enabled: "1",
remark: ""
});
const sel = reactive({
access: [],
apps: [],
regions: [],
products: []
});
const productGroups = ref([]);
const prodLoading = ref(false);
function fromCsv(s) {
return (s || "").split(",").map((x) => x.trim()).filter((x) => x);
}
function scopeParts(a) {
const parts = [];
if (a.apps) parts.push("应用:" + fromCsv(a.apps).length);
if (a.regions) parts.push("区域:" + fromCsv(a.regions).length);
if (a.products) parts.push("产品:" + fromCsv(a.products).length);
if (a.access) parts.push("页面:" + fromCsv(a.access).length);
return parts;
}
ref(null);
ref(0);
const topup = reactive({
name: "",
cur: "",
vipday: 0,
trademin: 0,
meetmin: 0
});
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-eb25cf37><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}" data-v-eb25cf37><div class="flex items-center justify-between mb-4" data-v-eb25cf37><div data-v-eb25cf37><h2 class="text-lg font-bold text-slate-700" data-v-eb25cf37>后台账号</h2><p class="text-xs text-slate-400 mt-0.5" data-v-eb25cf37>超管 / 管理员 / 代理 / 运营。代理·运营可绑定应用·区域·产品,登录后仪表盘按绑定限制。</p></div><button class="btn btn-primary btn-sm text-white" data-v-eb25cf37>+ 新建账号</button></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 overflow-hidden" data-v-eb25cf37><table class="table table-sm" data-v-eb25cf37><thead data-v-eb25cf37><tr class="text-slate-500" data-v-eb25cf37><th data-v-eb25cf37>ID</th><th data-v-eb25cf37>用户名</th><th data-v-eb25cf37>角色</th><th data-v-eb25cf37>状态</th><th data-v-eb25cf37>绑定作用域</th><th data-v-eb25cf37>备注</th><th class="text-right" data-v-eb25cf37>操作</th></tr></thead><tbody data-v-eb25cf37>`);
if (loading.value) {
_push(`<tr data-v-eb25cf37><td colspan="7" class="text-center text-slate-400 py-8" data-v-eb25cf37>加载中...</td></tr>`);
} else if (!rows.value.length) {
_push(`<tr data-v-eb25cf37><td colspan="7" class="text-center text-slate-400 py-8" data-v-eb25cf37>暂无账号(引导超管不在此列)</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(rows.value, (a) => {
_push(`<tr data-v-eb25cf37><td class="font-mono" data-v-eb25cf37>${ssrInterpolate(a.id)}</td><td class="font-medium" data-v-eb25cf37>${ssrInterpolate(a.username || "")}</td><td data-v-eb25cf37><span class="${ssrRenderClass([ROLE_CLS[a.identity] || "", "badge badge-sm"])}" data-v-eb25cf37>${ssrInterpolate(ROLE[a.identity] || a.identity)}</span></td><td data-v-eb25cf37>`);
if (a.enabled) {
_push(`<span class="text-green-600 text-xs" data-v-eb25cf37>启用</span>`);
} else {
_push(`<span class="text-slate-400 text-xs" data-v-eb25cf37>停用</span>`);
}
_push(`</td><td data-v-eb25cf37>`);
if (a.identity === 3 || a.identity === 4) {
_push(`<!--[-->`);
if (scopeParts(a).length) {
_push(`<span class="text-xs text-slate-500" data-v-eb25cf37>${ssrInterpolate(scopeParts(a).join(" · "))}</span>`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-eb25cf37>未绑定(不限)</span>`);
}
_push(`<!--]-->`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-eb25cf37>全部权限</span>`);
}
if (a.identity === 3) {
_push(`<div class="text-[11px] text-emerald-600 mt-0.5" data-v-eb25cf37> 余额 VIP${ssrInterpolate(a.balance_vipday || 0)}天 · 翻译${ssrInterpolate(a.balance_trademin || 0)}分 · 会议${ssrInterpolate(a.balance_meetmin || 0)}分 </div>`);
} else {
_push(`<!---->`);
}
_push(`</td><td class="text-xs text-slate-500" data-v-eb25cf37>${ssrInterpolate(a.remark || "")}</td><td data-v-eb25cf37><div class="flex gap-1 justify-end" data-v-eb25cf37>`);
if (a.identity === 3) {
_push(`<button class="btn btn-ghost btn-xs text-emerald-600" data-v-eb25cf37>充值</button>`);
} else {
_push(`<!---->`);
}
_push(`<button class="btn btn-ghost btn-xs" data-v-eb25cf37>编辑</button><button class="btn btn-ghost btn-xs text-amber-600" data-v-eb25cf37>改密</button><button class="btn btn-ghost btn-xs text-red-500" data-v-eb25cf37>删除</button></div></td></tr>`);
});
_push(`<!--]--></tbody></table></div></div><div style="${ssrRenderStyle(view.value === "form" ? null : { display: "none" })}" data-v-eb25cf37><div class="flex items-center gap-3 mb-5" data-v-eb25cf37><button class="btn btn-ghost btn-sm" data-v-eb25cf37>← 返回列表</button><h2 class="text-lg font-semibold text-slate-800" data-v-eb25cf37>${ssrInterpolate(editId.value ? "编辑账号 #" + editId.value : "新建账号")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl" data-v-eb25cf37><div class="grid grid-cols-2 gap-3" data-v-eb25cf37><div data-v-eb25cf37><label class="text-xs text-slate-500" data-v-eb25cf37>用户名</label><input${ssrRenderAttr("value", form.username)}${ssrIncludeBooleanAttr(!!editId.value) ? " disabled" : ""} class="input input-bordered input-sm w-full" placeholder="登录用户名" data-v-eb25cf37></div><div style="${ssrRenderStyle(!editId.value ? null : { display: "none" })}" data-v-eb25cf37><label class="text-xs text-slate-500" data-v-eb25cf37>密码</label><input${ssrRenderAttr("value", form.password)} type="password" class="input input-bordered input-sm w-full" placeholder="登录密码" data-v-eb25cf37></div><div data-v-eb25cf37><label class="text-xs text-slate-500" data-v-eb25cf37>角色</label><select class="select select-bordered select-sm w-full" data-v-eb25cf37><option${ssrRenderAttr("value", 2)} data-v-eb25cf37${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 2) : ssrLooseEqual(form.identity, 2)) ? " selected" : ""}>管理员(除账号管理外全部)</option><option${ssrRenderAttr("value", 3)} data-v-eb25cf37${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 3) : ssrLooseEqual(form.identity, 3)) ? " selected" : ""}>代理(外部,按绑定限制)</option><option${ssrRenderAttr("value", 4)} data-v-eb25cf37${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 4) : ssrLooseEqual(form.identity, 4)) ? " selected" : ""}>运营(内部,按绑定限制)</option><option${ssrRenderAttr("value", 1)} data-v-eb25cf37${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 1) : ssrLooseEqual(form.identity, 1)) ? " selected" : ""}>超管(全部权限)</option></select></div><div data-v-eb25cf37><label class="text-xs text-slate-500" data-v-eb25cf37>状态</label><select class="select select-bordered select-sm w-full" data-v-eb25cf37><option value="1" data-v-eb25cf37${ssrIncludeBooleanAttr(Array.isArray(form.enabled) ? ssrLooseContain(form.enabled, "1") : ssrLooseEqual(form.enabled, "1")) ? " selected" : ""}>启用</option><option value="0" data-v-eb25cf37${ssrIncludeBooleanAttr(Array.isArray(form.enabled) ? ssrLooseContain(form.enabled, "0") : ssrLooseEqual(form.enabled, "0")) ? " selected" : ""}>停用</option></select></div><div class="col-span-2" data-v-eb25cf37><label class="text-xs text-slate-500" data-v-eb25cf37>备注</label><input${ssrRenderAttr("value", form.remark)} class="input input-bordered input-sm w-full" placeholder="可选" data-v-eb25cf37></div></div><div class="mt-4 border-t border-slate-100 pt-4" style="${ssrRenderStyle(form.identity === 3 || form.identity === 4 ? null : { display: "none" })}" data-v-eb25cf37><div class="text-sm font-semibold text-slate-600 mb-2" data-v-eb25cf37>作用域绑定 <span class="text-xs text-slate-400 font-normal" data-v-eb25cf37>(代理/运营生效;勾选可访问页面,并限制仪表盘数据范围)</span></div><div class="mb-3" data-v-eb25cf37><div class="text-xs text-slate-500 mb-1.5" data-v-eb25cf37>可访问页面</div><div class="flex flex-wrap gap-2" data-v-eb25cf37><!--[-->`);
ssrRenderList(ACCESS_PAGES, (p) => {
_push(`<label class="chk" data-v-eb25cf37><input${ssrIncludeBooleanAttr(Array.isArray(sel.access) ? ssrLooseContain(sel.access, p[0]) : sel.access) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", p[0])} data-v-eb25cf37>${ssrInterpolate(p[1])}</label>`);
});
_push(`<!--]--></div></div><div class="mb-3" data-v-eb25cf37><div class="text-xs text-slate-500 mb-1.5" data-v-eb25cf37>绑定应用 <span class="text-slate-300" data-v-eb25cf37>(仪表盘只显示这些应用数据;不勾=不限)</span></div><div class="flex flex-wrap gap-2" data-v-eb25cf37>`);
if (apps.value.length) {
_push(`<!--[-->`);
ssrRenderList(apps.value, (a) => {
_push(`<label class="chk" data-v-eb25cf37><input${ssrIncludeBooleanAttr(Array.isArray(sel.apps) ? ssrLooseContain(sel.apps, a.name) : sel.apps) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", a.name)} data-v-eb25cf37>${ssrInterpolate(a.name || "应用#" + a.id)}</label>`);
});
_push(`<!--]-->`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-eb25cf37>无注册应用</span>`);
}
_push(`</div></div><div class="mb-3" data-v-eb25cf37><div class="text-xs text-slate-500 mb-1.5" data-v-eb25cf37>绑定区域 <span class="text-slate-300" data-v-eb25cf37>(不勾=不限)</span></div><div class="flex flex-wrap gap-2" data-v-eb25cf37><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<label class="chk" data-v-eb25cf37><input${ssrIncludeBooleanAttr(Array.isArray(sel.regions) ? ssrLooseContain(sel.regions, r[0]) : sel.regions) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", r[0])} data-v-eb25cf37>${ssrInterpolate(r[1])}</label>`);
});
_push(`<!--]--></div></div><div data-v-eb25cf37><div class="text-xs text-slate-500 mb-1.5" data-v-eb25cf37>绑定产品 <span class="text-slate-300" data-v-eb25cf37>(按厂家分组;仪表盘只显示这些产品数据;不勾=不限)</span></div><div class="max-h-56 overflow-y-auto pr-1 border border-slate-100 rounded-lg p-2" data-v-eb25cf37>`);
if (prodLoading.value) {
_push(`<span class="text-xs text-slate-300" data-v-eb25cf37>加载产品中...</span>`);
} else if (!productGroups.value.length) {
_push(`<span class="text-xs text-slate-300" data-v-eb25cf37>无产品</span>`);
} else {
_push(`<!--[-->`);
ssrRenderList(productGroups.value, (g) => {
_push(`<div class="mb-2 last:mb-0" data-v-eb25cf37><div class="text-[11px] font-semibold text-slate-500 mb-1 sticky top-0 bg-white py-0.5" data-v-eb25cf37>🏭 ${ssrInterpolate(g.label)}</div><div class="flex flex-wrap gap-2" data-v-eb25cf37><!--[-->`);
ssrRenderList(g.products, (p) => {
_push(`<label class="chk" data-v-eb25cf37><input${ssrIncludeBooleanAttr(Array.isArray(sel.products) ? ssrLooseContain(sel.products, String(p.id)) : sel.products) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", String(p.id))} data-v-eb25cf37>${ssrInterpolate((p.devicename || "产品") + " #" + p.id)}</label>`);
});
_push(`<!--]--></div></div>`);
});
_push(`<!--]-->`);
}
_push(`</div></div></div><div class="flex gap-3 justify-end mt-6" data-v-eb25cf37><button class="btn btn-ghost btn-sm" data-v-eb25cf37>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-eb25cf37>保存</button></div></div></div><dialog class="modal" data-v-eb25cf37><div class="modal-box max-w-md" data-v-eb25cf37><h3 class="font-bold text-lg mb-1" data-v-eb25cf37>充值 / 调整资源点</h3><p class="text-xs text-slate-400 mb-3" data-v-eb25cf37>代理:<span class="font-medium text-slate-600" data-v-eb25cf37>${ssrInterpolate(topup.name)}</span>。填增量(可填负数下调),当前余额:<span class="text-emerald-600" data-v-eb25cf37>${ssrInterpolate(topup.cur)}</span></p><div class="grid grid-cols-3 gap-3" data-v-eb25cf37><div data-v-eb25cf37><label class="text-xs text-slate-500" data-v-eb25cf37>VIP天数</label><input${ssrRenderAttr("value", topup.vipday)} type="number" class="input input-bordered input-sm w-full" data-v-eb25cf37></div><div data-v-eb25cf37><label class="text-xs text-slate-500" data-v-eb25cf37>翻译分钟</label><input${ssrRenderAttr("value", topup.trademin)} type="number" class="input input-bordered input-sm w-full" data-v-eb25cf37></div><div data-v-eb25cf37><label class="text-xs text-slate-500" data-v-eb25cf37>会议分钟</label><input${ssrRenderAttr("value", topup.meetmin)} type="number" class="input input-bordered input-sm w-full" data-v-eb25cf37></div></div><div class="modal-action" data-v-eb25cf37><button class="btn btn-ghost btn-sm" data-v-eb25cf37>取消</button><button class="btn btn-primary btn-sm text-white" data-v-eb25cf37>确认</button></div></div><form method="dialog" class="modal-backdrop" data-v-eb25cf37><button data-v-eb25cf37>close</button></form></dialog></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/accounts.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const accounts = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-eb25cf37"]]);
export { accounts as default };
//# sourceMappingURL=accounts-DMzzARF9.mjs.map

1
apps/admin/.output/server/chunks/build/accounts-DMzzARF9.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"accounts-DMzzARF9.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/accounts-DMzzARF9.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

8
apps/admin/.output/server/chunks/build/accounts-styles.CwGaTVL4.mjs

@ -0,0 +1,8 @@
const accounts_vue_vue_type_style_index_0_scoped_f682efe9_lang = ".chk[data-v-f682efe9]{display:flex;align-items:center;gap:6px;padding:5px 9px;border:1px solid #e2e8f0;border-radius:8px;font-size:12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chk[data-v-f682efe9]:hover{background:#f8fafc}.chk input[data-v-f682efe9]{width:14px;height:14px}";
const accountsStyles_CwGaTVL4 = [
accounts_vue_vue_type_style_index_0_scoped_f682efe9_lang
];
export { accountsStyles_CwGaTVL4 as default };
//# sourceMappingURL=accounts-styles.CwGaTVL4.mjs.map

1
apps/admin/.output/server/chunks/build/accounts-styles.CwGaTVL4.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"accounts-styles.CwGaTVL4.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/accounts-styles-1.mjs-DOf6aK3f.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/accounts-styles.CwGaTVL4.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

8
apps/admin/.output/server/chunks/build/accounts-styles.DcThijbg.mjs

@ -1,8 +0,0 @@
const accounts_vue_vue_type_style_index_0_scoped_eb25cf37_lang = ".chk[data-v-eb25cf37]{display:flex;align-items:center;gap:6px;padding:5px 9px;border:1px solid #e2e8f0;border-radius:8px;font-size:12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chk[data-v-eb25cf37]:hover{background:#f8fafc}.chk input[data-v-eb25cf37]{width:14px;height:14px}";
const accountsStyles_DcThijbg = [
accounts_vue_vue_type_style_index_0_scoped_eb25cf37_lang
];
export { accountsStyles_DcThijbg as default };
//# sourceMappingURL=accounts-styles.DcThijbg.mjs.map

1
apps/admin/.output/server/chunks/build/accounts-styles.DcThijbg.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"accounts-styles.DcThijbg.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/accounts-styles-1.mjs-u86cirh-.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/accounts-styles.DcThijbg.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

191
apps/admin/.output/server/chunks/build/appconfig-DgyZbLy-.mjs

@ -1,191 +0,0 @@
import { defineComponent, computed, reactive, ref, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrInterpolate, ssrIncludeBooleanAttr, ssrRenderAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderClass, ssrRenderDynamicModel } from 'vue/server-renderer';
import { u as useApi } from './useApi-DMQewX5_.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { _ as _export_sfc, a as useRoute$1, b as useRouter } from './server.mjs';
import './auth-QFkCoU1C.mjs';
import 'pinia';
import './useLoading-D4zrSa2m.mjs';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'perfect-debounce';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "appconfig",
__ssrInlineRender: true,
setup(__props) {
useApi();
useToast();
const route = useRoute$1();
useRouter();
const appId = computed(() => Number(route.query.id) || 0);
const appName = computed(() => route.query.name || "未指定应用");
const appInitial = computed(() => (dep.app_name || appName.value || "A").charAt(0).toUpperCase());
const dep = reactive({ id: 0, app_name: "", status: "", name: "", region: "", env_id: 0, base_url: "", service_dsn: "" });
const envs = ref([]);
const envId = ref(0);
const envSaving = ref(false);
const catalog = ref([]);
const curModule = ref("");
const values = reactive({});
const dataModules = reactive(/* @__PURE__ */ new Set());
const show = reactive({});
const loading = ref(false);
const saving = ref(false);
const dbError = ref("");
const curDef = computed(() => catalog.value.find((m) => m.module === curModule.value) || null);
const cur = computed(() => values[curModule.value] || {});
const groups = computed(() => {
const order = [];
const map = /* @__PURE__ */ new Map();
for (const m of catalog.value) {
if (!map.has(m.group)) {
map.set(m.group, []);
order.push(m.group);
}
map.get(m.group).push(m);
}
return order.map((name) => ({ name, modules: map.get(name) }));
});
function dbName(dsn) {
const m = (dsn || "").match(/\/([^/?]+)\?/);
return m ? m[1] : dsn ? "(自定义)" : "—";
}
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-a2d8388e><div class="flex items-center gap-2 mb-4" data-v-a2d8388e><button class="btn btn-ghost btn-sm" data-v-a2d8388e>← 返回应用列表</button><span class="text-slate-300" data-v-a2d8388e>/</span><h2 class="text-lg font-semibold text-slate-800" data-v-a2d8388e>应用服务配置</h2></div><div class="rounded-xl px-5 py-4 mb-5" style="${ssrRenderStyle({ "background": "linear-gradient(135deg,#eef2ff,#faf5ff)", "border": "1px solid #e0e7ff" })}" data-v-a2d8388e><div class="flex items-center gap-4" data-v-a2d8388e><div class="app-avatar" data-v-a2d8388e>${ssrInterpolate(appInitial.value)}</div><div class="flex-1 min-w-0" data-v-a2d8388e><div class="flex items-center gap-2 flex-wrap" data-v-a2d8388e><span class="text-base font-bold text-slate-800" data-v-a2d8388e>${ssrInterpolate(dep.name || appName.value)}</span><span class="badge badge-sm" style="${ssrRenderStyle({ "background": "#e0e7ff", "color": "#4338ca", "border": "none" })}" data-v-a2d8388e>#${ssrInterpolate(appId.value)}</span>`);
if (dep.app_name) {
_push(`<span class="badge badge-ghost badge-sm" data-v-a2d8388e>应用:${ssrInterpolate(dep.app_name)}</span>`);
} else {
_push(`<!---->`);
}
if (dep.region) {
_push(`<span class="badge badge-ghost badge-sm" data-v-a2d8388e>${ssrInterpolate(dep.region)}</span>`);
} else {
_push(`<!---->`);
}
if (dep.status === "pending") {
_push(`<span class="badge badge-warning badge-sm text-amber-900" data-v-a2d8388e>待部署</span>`);
} else {
_push(`<span class="badge badge-success badge-sm text-white" data-v-a2d8388e>已接入</span>`);
}
_push(`</div><div class="text-[11px] text-slate-500 mt-1 flex flex-wrap gap-x-4 gap-y-0.5" data-v-a2d8388e>`);
if (dep.base_url) {
_push(`<span data-v-a2d8388e>地址:<span class="font-mono" data-v-a2d8388e>${ssrInterpolate(dep.base_url)}</span></span>`);
} else {
_push(`<!---->`);
}
_push(`<span data-v-a2d8388e>业务库:<span class="font-mono" data-v-a2d8388e>${ssrInterpolate(dbName(dep.service_dsn))}</span></span></div></div></div><div class="flex items-center gap-2 mt-3 pt-3 border-t border-indigo-100" data-v-a2d8388e><span class="text-xs text-slate-500 shrink-0" data-v-a2d8388e>部署环境</span><select class="select select-bordered select-sm w-64"${ssrIncludeBooleanAttr(envSaving.value) ? " disabled" : ""} data-v-a2d8388e><option${ssrRenderAttr("value", 0)} data-v-a2d8388e${ssrIncludeBooleanAttr(Array.isArray(envId.value) ? ssrLooseContain(envId.value, 0) : ssrLooseEqual(envId.value, 0)) ? " selected" : ""}>未绑定</option><!--[-->`);
ssrRenderList(envs.value, (e) => {
_push(`<option${ssrRenderAttr("value", e.id)} data-v-a2d8388e${ssrIncludeBooleanAttr(Array.isArray(envId.value) ? ssrLooseContain(envId.value, e.id) : ssrLooseEqual(envId.value, e.id)) ? " selected" : ""}>${ssrInterpolate(e.name)}(${ssrInterpolate(e.code || "-")})</option>`);
});
_push(`<!--]--></select>`);
if (envSaving.value) {
_push(`<span class="loading loading-spinner loading-xs text-indigo-400" data-v-a2d8388e></span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="text-[11px] text-slate-400" data-v-a2d8388e>切换后即时保存。</span></div></div><div class="bg-white rounded-2xl border border-slate-100 shadow-sm p-5" data-v-a2d8388e><div class="mb-3" data-v-a2d8388e><h3 class="text-base font-semibold text-slate-800" data-v-a2d8388e>业务功能配置</h3><p class="text-[11px] text-slate-400 mt-0.5" data-v-a2d8388e> 登录 / 短信 / 邮件 / 支付等应用独立配置,保存在<b data-v-a2d8388e>该部署的业务库</b>(不进公共库)。密钥字段加密落库,显示时脱敏。 </p></div>`);
if (dbError.value) {
_push(`<div class="alert alert-warning py-2 text-sm mb-3" data-v-a2d8388e><span data-v-a2d8388e>无法连接应用业务库:${ssrInterpolate(dbError.value)}<br data-v-a2d8388e><span class="text-xs opacity-70" data-v-a2d8388e>待部署的应用先完成部署、或检查业务库 DSN 连通后再配置。</span></span></div>`);
} else {
_push(`<!---->`);
}
if (loading.value) {
_push(`<div class="py-12 text-center" data-v-a2d8388e><span class="loading loading-spinner loading-sm" data-v-a2d8388e></span></div>`);
} else {
_push(`<div class="flex gap-5" data-v-a2d8388e><aside class="w-48 shrink-0" data-v-a2d8388e><!--[-->`);
ssrRenderList(groups.value, (grp) => {
_push(`<div class="mb-3" data-v-a2d8388e><div class="text-[11px] font-semibold text-slate-400 px-2 mb-1" data-v-a2d8388e>${ssrInterpolate(grp.name)}</div><!--[-->`);
ssrRenderList(grp.modules, (m) => {
_push(`<button class="${ssrRenderClass([curModule.value === m.module ? "bg-indigo-50 text-indigo-700 font-medium" : "text-slate-600 hover:bg-slate-50", "w-full flex items-center justify-between text-left px-3 py-2 rounded-lg text-sm mb-0.5 transition-colors"])}" data-v-a2d8388e><span data-v-a2d8388e>${ssrInterpolate(m.name)}</span>`);
if (dataModules.has(m.module)) {
_push(`<span class="w-1.5 h-1.5 rounded-full bg-emerald-400 inline-block" data-v-a2d8388e></span>`);
} else {
_push(`<!---->`);
}
_push(`</button>`);
});
_push(`<!--]--></div>`);
});
_push(`<!--]--></aside><section class="flex-1 min-w-0" data-v-a2d8388e>`);
if (curDef.value) {
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-a2d8388e><div data-v-a2d8388e><div class="text-sm font-semibold text-slate-800" data-v-a2d8388e>${ssrInterpolate(curDef.value.name)}</div>`);
if (curDef.value.desc) {
_push(`<div class="text-[11px] text-slate-400 mt-0.5" data-v-a2d8388e>${ssrInterpolate(curDef.value.desc)}</div>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="flex items-center gap-2" data-v-a2d8388e>`);
if (dataModules.has(curModule.value)) {
_push(`<button class="btn btn-ghost btn-xs text-rose-500"${ssrIncludeBooleanAttr(saving.value) ? " disabled" : ""} data-v-a2d8388e>清空</button>`);
} else {
_push(`<!---->`);
}
_push(`<button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(saving.value || dbError.value !== "") ? " disabled" : ""} data-v-a2d8388e>${ssrInterpolate(saving.value ? "保存中…" : "保存")}</button></div></div><div class="grid grid-cols-1 gap-3 max-w-2xl" data-v-a2d8388e><!--[-->`);
ssrRenderList(curDef.value.fields, (f) => {
_push(`<div class="form-control" data-v-a2d8388e><label class="label py-0.5" data-v-a2d8388e><span class="label-text text-sm" data-v-a2d8388e>${ssrInterpolate(f.label)} `);
if (f.required) {
_push(`<span class="text-rose-400" data-v-a2d8388e>*</span>`);
} else {
_push(`<!---->`);
}
if (f.secret) {
_push(`<span class="lock-tag ml-1" data-v-a2d8388e>🔒</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="text-[10px] font-normal text-slate-300 ml-1 font-mono" data-v-a2d8388e>${ssrInterpolate(f.key)}</span></span></label>`);
if (f.type === "bool") {
_push(`<label class="cursor-pointer flex items-center gap-2" data-v-a2d8388e><input type="checkbox" class="toggle toggle-sm toggle-primary"${ssrIncludeBooleanAttr(cur.value[f.key] === "true") ? " checked" : ""} data-v-a2d8388e><span class="text-xs text-slate-500" data-v-a2d8388e>${ssrInterpolate(cur.value[f.key] === "true" ? "开启" : "关闭")}</span></label>`);
} else if (f.type === "select") {
_push(`<select class="select select-bordered select-sm w-full" data-v-a2d8388e><option value="" data-v-a2d8388e${ssrIncludeBooleanAttr(Array.isArray(cur.value[f.key]) ? ssrLooseContain(cur.value[f.key], "") : ssrLooseEqual(cur.value[f.key], "")) ? " selected" : ""}>请选择</option><!--[-->`);
ssrRenderList(f.options, (o) => {
_push(`<option${ssrRenderAttr("value", o.value)} data-v-a2d8388e${ssrIncludeBooleanAttr(Array.isArray(cur.value[f.key]) ? ssrLooseContain(cur.value[f.key], o.value) : ssrLooseEqual(cur.value[f.key], o.value)) ? " selected" : ""}>${ssrInterpolate(o.label)}</option>`);
});
_push(`<!--]--></select>`);
} else if (f.type === "textarea") {
_push(`<textarea class="textarea textarea-bordered w-full font-mono text-xs" rows="3"${ssrRenderAttr("placeholder", f.secret ? "留空/保持 [encrypted] 则不变" : f.placeholder || "")} data-v-a2d8388e>${ssrInterpolate(cur.value[f.key])}</textarea>`);
} else if (f.type === "password") {
_push(`<div class="relative" data-v-a2d8388e><input${ssrRenderDynamicModel(show[f.key] ? "text" : "password", cur.value[f.key], null)}${ssrRenderAttr("type", show[f.key] ? "text" : "password")} class="input input-bordered input-sm w-full font-mono text-xs pr-14"${ssrRenderAttr("placeholder", "留空/保持 [encrypted] 则不变")} data-v-a2d8388e><button type="button" class="absolute right-3 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-a2d8388e>${ssrInterpolate(show[f.key] ? "隐藏" : "显示")}</button></div>`);
} else {
_push(`<input${ssrRenderAttr("value", cur.value[f.key])} type="text" class="input input-bordered input-sm w-full font-mono text-xs"${ssrRenderAttr("placeholder", f.placeholder || "")} data-v-a2d8388e>`);
}
if (f.desc) {
_push(`<span class="text-[11px] text-slate-400 mt-0.5" data-v-a2d8388e>${ssrInterpolate(f.desc)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
});
_push(`<!--]--></div><!--]-->`);
} else {
_push(`<div class="py-10 text-center text-slate-400 text-sm" data-v-a2d8388e>暂无可配置的业务模块。</div>`);
}
_push(`</section></div>`);
}
_push(`</div></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/appconfig.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const appconfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-a2d8388e"]]);
export { appconfig as default };
//# sourceMappingURL=appconfig-DgyZbLy-.mjs.map

1
apps/admin/.output/server/chunks/build/appconfig-DgyZbLy-.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"appconfig-DgyZbLy-.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/appconfig-DgyZbLy-.js"],"names":["useRoute"],"mappings":"","x_google_ignoreList":[0]}

8
apps/admin/.output/server/chunks/build/appconfig-styles.C960WaXM.mjs

@ -1,8 +0,0 @@
const appconfig_vue_vue_type_style_index_0_scoped_a2d8388e_lang = ".app-avatar[data-v-a2d8388e]{width:48px;height:48px;border-radius:13px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:20px;flex-shrink:0;box-shadow:0 6px 18px #4f46e54d}.lock-tag[data-v-a2d8388e]{font-size:10px;font-weight:600;color:#dc2626;background:#fef2f2;padding:1px 5px;border-radius:5px}";
const appconfigStyles_C960WaXM = [
appconfig_vue_vue_type_style_index_0_scoped_a2d8388e_lang
];
export { appconfigStyles_C960WaXM as default };
//# sourceMappingURL=appconfig-styles.C960WaXM.mjs.map

1
apps/admin/.output/server/chunks/build/appconfig-styles.C960WaXM.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"appconfig-styles.C960WaXM.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/appconfig-styles-1.mjs-D6A0tq1Y.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/appconfig-styles.C960WaXM.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

310
apps/admin/.output/server/chunks/build/apps-M35AvXEe.mjs

@ -1,310 +0,0 @@
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrRenderClass, ssrInterpolate, ssrIncludeBooleanAttr, ssrRenderAttr, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer';
import { u as useApi } from './useApi-DMQewX5_.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { u as useAuthStore } from './auth-QFkCoU1C.mjs';
import { _ as _export_sfc, b as useRouter } from './server.mjs';
import './useLoading-D4zrSa2m.mjs';
import 'pinia';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'perfect-debounce';
const ORPHAN_KEY = "__orphan__";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "apps",
__ssrInlineRender: true,
setup(__props) {
useApi();
useToast();
useAuthStore();
useRouter();
const view = ref("list");
const products = ref([]);
const apps2 = ref([]);
const envs = ref([]);
const loading = ref(false);
const envSavingId = ref(0);
const expanded = reactive({});
const regionOptions = ["中国", "美国", "东亚", "东南亚", "南亚", "中东", "欧洲", "俄罗斯", "非洲", "南美", "北美", "大洋洲", "巴西", "印度"];
const groups = computed(() => {
const byName = /* @__PURE__ */ new Map();
for (const d of apps2.value) {
const name = d.app_name || "";
if (!byName.has(name)) byName.set(name, []);
byName.get(name).push(d);
}
const known = new Set(products.value.map((p) => p.name));
const res = products.value.map((p) => ({ key: p.name, product: p, deployments: byName.get(p.name) || [] }));
const orphan = [];
for (const [name, ds] of byName) {
if (name === "" || !known.has(name)) orphan.push(...ds);
}
if (orphan.length) res.push({ key: ORPHAN_KEY, product: null, deployments: orphan });
return res;
});
function isExpanded(key) {
return expanded[key] !== false;
}
function dbName(dsn) {
const m = (dsn || "").match(/\/([^/?]+)\?/);
return m ? m[1] : "-";
}
function isPinnedVer(tag) {
const t = (tag || "").trim();
return !!t && t !== "latest";
}
const pIsEditing = ref(false);
const pForm = reactive({ id: 0, name: "", image_name: "", remark: "", enabled: true });
const dIsEditing = ref(false);
const dMode = ref("existing");
const dForm = reactive({ id: 0, app_name: "", name: "", region: "", env_id: 0, base_url: "", service_dsn: "", deploy_dir: "", image_name: "", image_tag: "", remark: "", enabled: true });
const availableRegions = computed(() => {
const used = new Set(
apps2.value.filter((d) => d.app_name === dForm.app_name && d.id !== dForm.id).map((d) => d.region).filter(Boolean)
);
return regionOptions.filter((r) => !used.has(r));
});
const testPassed = ref(false);
const testing = ref(false);
const testResult = reactive({ show: false, apiOk: false, apiMsg: "", dbOk: false, dbMsg: "" });
ref(null);
const az = reactive({
appId: 0,
appLabel: "",
start: "",
end: "",
resultShow: false,
resultClass: "",
mode: "",
steps: [],
curIndex: 0,
curTotal: 0,
curName: "",
pct: 0,
errMsg: "",
report: null,
running: false,
btnText: "开始分析"
});
ref(null);
ref(null);
const up = reactive({
id: 0,
label: "",
envName: "",
deployDir: "",
tag: "",
tags: [],
// 从仓库拉取的可用版本
tagMode: "list",
tagsLoading: false,
tagsError: "",
log: "",
show: false,
running: false,
ok: false,
canRun: false,
btnText: "开始升级"
});
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-955faaec><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}" data-v-955faaec><div class="flex items-center justify-between mb-5" data-v-955faaec><div data-v-955faaec><h2 class="text-lg font-semibold text-slate-800" data-v-955faaec>应用管理</h2><p class="text-sm text-slate-400 mt-1" data-v-955faaec><span class="chip-app" data-v-955faaec>应用</span> 是一个产品(如 Voitrans);其下挂多条 <span class="chip-dep" data-v-955faaec>部署</span>(各区域一份)。 卡片 = 应用;卡片内表格 = 该应用的区域部署。 </p></div><button class="btn btn-primary btn-sm text-white" data-v-955faaec>+ 添加应用</button></div>`);
if (loading.value) {
_push(`<div class="bg-white rounded-xl border border-slate-100 py-14 text-center" data-v-955faaec><span class="loading loading-spinner loading-sm" data-v-955faaec></span></div>`);
} else if (!groups.value.length) {
_push(`<div class="bg-white rounded-xl border border-slate-100 py-14 text-center text-slate-400" data-v-955faaec>暂无应用,先「添加应用」</div>`);
} else {
_push(`<div class="space-y-4" data-v-955faaec><!--[-->`);
ssrRenderList(groups.value, (g) => {
_push(`<div class="${ssrRenderClass([{ orphan: !g.product }, "app-card"])}" data-v-955faaec><div class="app-head" data-v-955faaec><button class="chev" data-v-955faaec>${ssrInterpolate(isExpanded(g.key) ? "▾" : "▸")}</button><div class="${ssrRenderClass([{ "orphan-logo": !g.product }, "app-logo"])}" data-v-955faaec>${ssrInterpolate(g.product ? (g.product.name || "?").charAt(0).toUpperCase() : "?")}</div><div class="min-w-0 flex-1" data-v-955faaec><div class="flex items-center gap-2 flex-wrap" data-v-955faaec><span class="chip-app" data-v-955faaec>应用</span><span class="app-name" data-v-955faaec>${ssrInterpolate(g.product ? g.product.name : "未分组部署")}</span>`);
if (g.product) {
_push(`<span class="${ssrRenderClass([g.product.enabled ? "badge-success" : "badge-ghost", "badge badge-xs"])}" data-v-955faaec>${ssrInterpolate(g.product.enabled ? "启用" : "停用")}</span>`);
} else {
_push(`<!---->`);
}
if (g.product && g.product.image_name) {
_push(`<span class="chip-mono" data-v-955faaec>🐳 ${ssrInterpolate(g.product.image_name)}</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="chip-count" data-v-955faaec>${ssrInterpolate(g.deployments.length)} 个部署</span></div><p class="text-xs text-slate-400 mt-0.5 truncate" data-v-955faaec>${ssrInterpolate(g.product ? g.product.remark || "—" : "未填所属应用名、或应用已删除的历史部署;编辑部署可归位到某个应用")}</p></div>`);
if (g.product) {
_push(`<div class="flex gap-1 shrink-0" data-v-955faaec><button class="btn btn-primary btn-xs text-white" data-v-955faaec>+ 部署</button><button class="btn btn-ghost btn-xs" data-v-955faaec>编辑应用</button><button class="btn btn-ghost btn-xs text-red-500" data-v-955faaec>删除</button></div>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="app-body" style="${ssrRenderStyle(isExpanded(g.key) ? null : { display: "none" })}" data-v-955faaec>`);
if (!g.deployments.length) {
_push(`<div class="text-center text-slate-300 py-5 text-xs" data-v-955faaec> 该应用暂无部署`);
if (g.product) {
_push(`<!--[-->,点右上「+ 部署」添加<!--]-->`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
} else {
_push(`<div class="overflow-x-auto" data-v-955faaec><table class="table table-sm text-sm" data-v-955faaec><thead data-v-955faaec><tr class="text-slate-400" data-v-955faaec><th data-v-955faaec>部署</th><th data-v-955faaec>区域</th><th data-v-955faaec>环境</th><th data-v-955faaec>状态</th><th data-v-955faaec>当前版本</th><th data-v-955faaec>业务库</th><th data-v-955faaec>启用</th><th class="text-right" data-v-955faaec>操作</th></tr></thead><tbody data-v-955faaec><!--[-->`);
ssrRenderList(g.deployments, (a) => {
_push(`<tr class="dep-row hover" data-v-955faaec><td data-v-955faaec><span class="chip-dep" data-v-955faaec>部署</span><span class="font-medium text-slate-700 ml-1" data-v-955faaec>${ssrInterpolate(a.name || "部署#" + a.id)}</span><span class="text-xs text-slate-400 ml-1 font-mono" data-v-955faaec>#${ssrInterpolate(a.id)}</span></td><td data-v-955faaec>${ssrInterpolate(a.region || "—")}</td><td data-v-955faaec><select class="select select-bordered select-xs w-36 text-xs"${ssrIncludeBooleanAttr(envSavingId.value === a.id) ? " disabled" : ""} data-v-955faaec><option${ssrRenderAttr("value", 0)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(a.env_id) ? ssrLooseContain(a.env_id, 0) : ssrLooseEqual(a.env_id, 0)) ? " selected" : ""}>未绑定</option><!--[-->`);
ssrRenderList(envs.value, (e) => {
_push(`<option${ssrRenderAttr("value", e.id)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(a.env_id) ? ssrLooseContain(a.env_id, e.id) : ssrLooseEqual(a.env_id, e.id)) ? " selected" : ""}>${ssrInterpolate(e.name)}</option>`);
});
_push(`<!--]--></select></td><td data-v-955faaec>`);
if (a.status === "pending") {
_push(`<span class="badge badge-warning badge-sm text-amber-900" data-v-955faaec>待部署</span>`);
} else {
_push(`<span class="badge badge-success badge-sm text-white" data-v-955faaec>已接入</span>`);
}
_push(`</td><td data-v-955faaec>`);
if (isPinnedVer(a.image_tag)) {
_push(`<span class="chip-mono text-emerald-700" data-v-955faaec>${ssrInterpolate(a.image_tag)}</span>`);
} else {
_push(`<span class="text-amber-600 text-xs font-mono" title="未固定版本,升级时建议选明确版本号(如 0.1.1)" data-v-955faaec>${ssrInterpolate(a.image_tag || "latest")} ⚠</span>`);
}
_push(`</td><td class="font-mono text-xs" data-v-955faaec>${ssrInterpolate(dbName(a.service_dsn))}</td><td data-v-955faaec>`);
if (a.enabled) {
_push(`<span class="text-green-600" data-v-955faaec>是</span>`);
} else {
_push(`<span class="text-slate-400" data-v-955faaec>否</span>`);
}
_push(`</td><td class="text-right" data-v-955faaec><div class="flex gap-1 justify-end" data-v-955faaec>`);
if (a.status !== "pending") {
_push(`<!--[--><button class="btn btn-ghost btn-xs text-indigo-600" data-v-955faaec>服务配置</button><button class="btn btn-ghost btn-xs text-slate-500" data-v-955faaec>编辑</button><button class="btn btn-ghost btn-xs text-amber-600" data-v-955faaec>升级</button><button class="btn btn-ghost btn-xs text-emerald-600" data-v-955faaec>分析</button><button class="btn btn-ghost btn-xs text-indigo-500" data-v-955faaec>发事件</button><!--]-->`);
} else {
_push(`<button class="btn btn-ghost btn-xs text-amber-600" data-v-955faaec>编辑</button>`);
}
_push(`<button class="btn btn-ghost btn-xs text-red-500" data-v-955faaec>删除</button></div></td></tr>`);
});
_push(`<!--]--></tbody></table></div>`);
}
_push(`</div></div>`);
});
_push(`<!--]--></div>`);
}
_push(`</div><div style="${ssrRenderStyle(view.value === "productForm" ? null : { display: "none" })}" data-v-955faaec><div class="flex items-center gap-3 mb-5" data-v-955faaec><button class="btn btn-ghost btn-sm" data-v-955faaec>← 返回</button><h2 class="text-lg font-semibold text-slate-800" data-v-955faaec>${ssrInterpolate(pIsEditing.value ? "编辑应用" : "添加应用")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-xl" data-v-955faaec><form data-v-955faaec><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>应用名 *</span></label><input${ssrRenderAttr("value", pForm.name)} type="text" class="input input-bordered w-full" required placeholder="如 Voitrans" data-v-955faaec><span class="text-xs text-slate-400 mt-1" data-v-955faaec>账号作用域按应用名绑定,尽量与统计/账号里一致。</span></div><div class="form-control mt-4" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>默认镜像名</span></label><input${ssrRenderAttr("value", pForm.image_name)} type="text" class="input input-bordered w-full" placeholder="voitrans-a11(部署时用,可留空)" data-v-955faaec></div><div class="form-control mt-4" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>备注</span></label><input${ssrRenderAttr("value", pForm.remark)} type="text" class="input input-bordered w-full" data-v-955faaec></div><div class="flex items-center gap-2 mt-4" data-v-955faaec><label class="flex items-center gap-2 cursor-pointer" data-v-955faaec><input${ssrIncludeBooleanAttr(Array.isArray(pForm.enabled) ? ssrLooseContain(pForm.enabled, null) : pForm.enabled) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-955faaec><span class="text-sm" data-v-955faaec>启用</span></label></div><div class="flex gap-3 mt-6" data-v-955faaec><button type="button" class="btn btn-ghost" data-v-955faaec>取消</button><button type="submit" class="btn btn-primary text-white" data-v-955faaec>保存</button></div></form></div></div><div style="${ssrRenderStyle(view.value === "deployForm" ? null : { display: "none" })}" data-v-955faaec><div class="flex items-center gap-3 mb-5" data-v-955faaec><button class="btn btn-ghost btn-sm" data-v-955faaec>← 返回</button><h2 class="text-lg font-semibold text-slate-800" data-v-955faaec>${ssrInterpolate(dIsEditing.value ? "编辑部署" : "添加部署")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-3xl" data-v-955faaec><form data-v-955faaec>`);
if (!dIsEditing.value) {
_push(`<div class="tabs tabs-boxed bg-slate-100 w-fit mb-5" data-v-955faaec><a class="${ssrRenderClass([dMode.value === "existing" ? "tab-active" : "", "tab"])}" data-v-955faaec>添加现有</a><a class="${ssrRenderClass([dMode.value === "deploy" ? "tab-active" : "", "tab"])}" data-v-955faaec>部署到目标环境</a></div>`);
} else {
_push(`<!---->`);
}
_push(`<p class="${ssrRenderClass([dIsEditing.value ? "" : "-mt-3", "text-xs text-slate-400 mb-4"])}" data-v-955faaec>`);
if (dIsEditing.value) {
_push(`<!--[-->编辑该区域部署的配置(镜像 Tag / 部署目录 / 环境节点 等);改好后回列表点「升级」执行远程部署(拉新镜像并重启)。<!--]-->`);
} else if (dMode.value === "existing") {
_push(`<!--[-->把「已经部署好的应用区域」加进来:填地址与业务库 DSN,测试通过后保存。<!--]-->`);
} else {
_push(`<!--[-->选一个「部署目标环境」,先建关联并标记<b data-v-955faaec>待部署</b>;保存后回列表点「升级」执行远程部署。<!--]-->`);
}
_push(`</p><div class="grid grid-cols-2 gap-4" data-v-955faaec><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>所属应用</span></label><input${ssrRenderAttr("value", dForm.app_name)} type="text" class="input input-bordered w-full bg-slate-100" readonly data-v-955faaec></div><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>部署名称 *</span></label><input${ssrRenderAttr("value", dForm.name)} type="text" class="input input-bordered w-full" required placeholder="如 Voitrans(国内)" data-v-955faaec></div></div><div class="grid grid-cols-2 gap-4 mt-4" data-v-955faaec><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>区域</span></label><select class="select select-bordered w-full" data-v-955faaec><option value="" data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(dForm.region) ? ssrLooseContain(dForm.region, "") : ssrLooseEqual(dForm.region, "")) ? " selected" : ""}>未指定</option><!--[-->`);
ssrRenderList(availableRegions.value, (r) => {
_push(`<option${ssrRenderAttr("value", r)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(dForm.region) ? ssrLooseContain(dForm.region, r) : ssrLooseEqual(dForm.region, r)) ? " selected" : ""}>${ssrInterpolate(r)}</option>`);
});
_push(`<!--]--></select><span class="text-xs text-slate-400 mt-1" data-v-955faaec>已部署的区域不再出现(一个应用每区域一份部署)。</span></div><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>部署环境${ssrInterpolate(dMode.value === "deploy" ? " *" : "")}</span></label><select class="select select-bordered w-full" data-v-955faaec><option${ssrRenderAttr("value", 0)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(dForm.env_id) ? ssrLooseContain(dForm.env_id, 0) : ssrLooseEqual(dForm.env_id, 0)) ? " selected" : ""}>${ssrInterpolate(dMode.value === "deploy" ? "请选择目标环境" : "未关联")}</option><!--[-->`);
ssrRenderList(envs.value, (e) => {
_push(`<option${ssrRenderAttr("value", e.id)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(dForm.env_id) ? ssrLooseContain(dForm.env_id, e.id) : ssrLooseEqual(dForm.env_id, e.id)) ? " selected" : ""}>${ssrInterpolate(e.name)}(${ssrInterpolate(e.code || "-")})</option>`);
});
_push(`<!--]--></select></div></div><div class="grid grid-cols-3 gap-4 mt-4" data-v-955faaec><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>部署目录</span></label><input${ssrRenderAttr("value", dForm.deploy_dir)} type="text" class="input input-bordered w-full font-mono text-xs" placeholder="/home/work/voitrans-a11" data-v-955faaec></div><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>镜像名</span></label><input${ssrRenderAttr("value", dForm.image_name)} type="text" class="input input-bordered w-full" placeholder="voitrans-a11(默认取应用)" data-v-955faaec></div><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>镜像 Tag</span></label><input${ssrRenderAttr("value", dForm.image_tag)} type="text" class="input input-bordered w-full" placeholder="0.1.1 / latest" data-v-955faaec></div></div><div class="form-control mt-4" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>业务库 DSN${ssrInterpolate(dMode.value === "existing" ? " *" : "")}</span></label><input${ssrRenderAttr("value", dForm.service_dsn)} type="text" class="input input-bordered w-full font-mono text-xs" placeholder="root:pwd@tcp(host:3306)/earphone?charset=utf8mb4&amp;parseTime=True&amp;loc=Local" data-v-955faaec><span class="text-xs text-slate-400 mt-1" data-v-955faaec>用于读取业务数据(重置设备码时清 userdevice/product_stat)</span></div>`);
if (dMode.value === "existing") {
_push(`<!--[--><div class="form-control mt-4" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>应用地址 *</span></label><input${ssrRenderAttr("value", dForm.base_url)} type="text" class="input input-bordered w-full" placeholder="https://api.xxx.com/" data-v-955faaec><span class="text-xs text-slate-400 mt-1" data-v-955faaec>用于通知应用业务服务事件(如配置更新)</span></div><div class="mt-4 text-sm" style="${ssrRenderStyle(testResult.show ? null : { display: "none" })}" data-v-955faaec><div class="${ssrRenderClass(testResult.apiOk ? "text-green-700" : "text-red-600")}" data-v-955faaec><span class="${ssrRenderClass(testResult.apiOk ? "text-green-600" : "text-red-500")}" data-v-955faaec>${ssrInterpolate(testResult.apiOk ? "✓" : "✗")}</span> 应用地址:${ssrInterpolate(testResult.apiMsg)}</div><div class="${ssrRenderClass(testResult.dbOk ? "text-green-700" : "text-red-600")}" data-v-955faaec><span class="${ssrRenderClass(testResult.dbOk ? "text-green-600" : "text-red-500")}" data-v-955faaec>${ssrInterpolate(testResult.dbOk ? "✓" : "✗")}</span> 业务库:${ssrInterpolate(testResult.dbMsg)}</div></div><!--]-->`);
} else {
_push(`<!---->`);
}
_push(`<div class="form-control mt-4" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>备注</span></label><input${ssrRenderAttr("value", dForm.remark)} type="text" class="input input-bordered w-full" data-v-955faaec></div><div class="flex items-center gap-2 mt-4" data-v-955faaec><label class="flex items-center gap-2 cursor-pointer" data-v-955faaec><input${ssrIncludeBooleanAttr(Array.isArray(dForm.enabled) ? ssrLooseContain(dForm.enabled, null) : dForm.enabled) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-955faaec><span class="text-sm" data-v-955faaec>启用</span></label></div><div class="flex gap-3 mt-6" data-v-955faaec><button type="button" class="btn btn-ghost" data-v-955faaec>取消</button>`);
if (dMode.value === "existing") {
_push(`<button type="button" class="btn btn-outline"${ssrIncludeBooleanAttr(testing.value) ? " disabled" : ""} data-v-955faaec>${ssrInterpolate(testing.value ? "测试中..." : "测试连接")}</button>`);
} else {
_push(`<!---->`);
}
_push(`<button type="submit" class="btn btn-primary text-white"${ssrIncludeBooleanAttr(!dIsEditing.value && dMode.value === "existing" && !testPassed.value) ? " disabled" : ""} data-v-955faaec>保存</button></div>`);
if (!dIsEditing.value && dMode.value === "existing") {
_push(`<p class="text-xs text-slate-400 mt-2" data-v-955faaec>需先「测试连接」通过(应用地址可达 + 业务库可连)才能保存。</p>`);
} else {
_push(`<!---->`);
}
_push(`</form></div></div><dialog class="modal" data-v-955faaec><div class="modal-box" data-v-955faaec><h3 class="font-bold text-lg" data-v-955faaec>分析历史数据</h3><p class="text-sm text-slate-500 mt-1" data-v-955faaec>${ssrInterpolate(az.appLabel)}</p><div class="text-xs text-amber-700 mt-3 bg-amber-50 border border-amber-100 rounded-lg p-3 leading-relaxed" data-v-955faaec> 扫描该应用业务库,按 <b data-v-955faaec>天 + 产品 + 区域</b> 生成历史统计(新增用户 / 订单 / 资源发放·使用 / 激活绑定设备),汇入 console 主库。<br data-v-955faaec> · <b data-v-955faaec>分析前会先清理该应用+区域在所选区间内的旧统计行</b>,避免数据重叠。<br data-v-955faaec> · 登录、活跃用户、AI对话等无每日原始记录,历史无法还原(由实时管道往后采集)。<br data-v-955faaec> · 仅对实时管道上线前的区间运行。留空 = 全部历史。大库可能耗时。 </div><div class="grid grid-cols-2 gap-3 mt-4" data-v-955faaec><div data-v-955faaec><label class="text-xs text-slate-500" data-v-955faaec>起始日(含)</label><input${ssrRenderAttr("value", az.start)} type="date" class="input input-bordered input-sm w-full" data-v-955faaec></div><div data-v-955faaec><label class="text-xs text-slate-500" data-v-955faaec>结束日(含)</label><input${ssrRenderAttr("value", az.end)} type="date" class="input input-bordered input-sm w-full" data-v-955faaec></div></div><div class="${ssrRenderClass([az.resultClass, "text-sm mt-3"])}" style="${ssrRenderStyle(az.resultShow ? null : { display: "none" })}" data-v-955faaec>`);
if (az.mode === "progress") {
_push(`<div class="bg-slate-50 border border-slate-200 rounded-lg p-3" data-v-955faaec><div class="flex justify-between items-center text-xs mb-1.5" data-v-955faaec><span class="text-slate-600" data-v-955faaec>`);
if (az.curName) {
_push(`<!--[--><span class="loading loading-spinner loading-xs" data-v-955faaec></span> 正在:${ssrInterpolate(az.curName)} (${ssrInterpolate(az.curIndex)}/${ssrInterpolate(az.curTotal)}) <!--]-->`);
} else {
_push(`<!--[-->准备中...<!--]-->`);
}
_push(`</span><span class="font-mono text-slate-400" data-v-955faaec>${ssrInterpolate(az.pct)}%</span></div><progress class="progress progress-primary w-full h-2"${ssrRenderAttr("value", az.pct)} max="100" data-v-955faaec></progress><div class="mt-2 text-xs space-y-0.5" data-v-955faaec><!--[-->`);
ssrRenderList(az.steps, (nm, i) => {
_push(`<div class="${ssrRenderClass(i === az.curIndex - 1 ? "text-slate-600" : "text-green-600")}" data-v-955faaec>`);
if (i === az.curIndex - 1) {
_push(`<!--[--><span class="loading loading-spinner loading-xs" data-v-955faaec></span> ${ssrInterpolate(nm)}<!--]-->`);
} else {
_push(`<!--[-->✓ ${ssrInterpolate(nm)}<!--]-->`);
}
_push(`</div>`);
});
_push(`<!--]--></div></div>`);
} else if (az.mode === "error") {
_push(`<div class="text-red-600" data-v-955faaec>✗ ${ssrInterpolate(az.errMsg)}</div>`);
} else if (az.mode === "done" && az.report) {
_push(`<div class="bg-green-50 border border-green-100 rounded-lg p-3" data-v-955faaec><div class="font-semibold text-green-700 mb-2" data-v-955faaec>✓ 分析完成</div><div class="grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-slate-600 mb-2" data-v-955faaec><div data-v-955faaec>应用:<b data-v-955faaec>${ssrInterpolate(az.report.app_name || "")}</b></div><div data-v-955faaec>区域:${ssrInterpolate(az.report.region || "未指定")}</div><div data-v-955faaec>区间:${ssrInterpolate((az.report.start_day || "不限") + " ~ " + (az.report.end_day || "不限"))}</div><div data-v-955faaec>清理旧行:${ssrInterpolate(az.report.cleared_rows || 0)}</div><div data-v-955faaec>写入天数:<b data-v-955faaec>${ssrInterpolate(az.report.days_written || 0)}</b></div><div data-v-955faaec>写入行数:${ssrInterpolate(az.report.rows_written || 0)}</div></div><div class="border-t border-green-100 pt-2 text-xs" data-v-955faaec><!--[-->`);
ssrRenderList(az.report.steps || [], (s, i) => {
_push(`<div class="flex justify-between py-0.5" data-v-955faaec><span class="text-slate-500" data-v-955faaec>${ssrInterpolate(s.name)}</span><span class="font-mono text-slate-700" data-v-955faaec>${ssrInterpolate((s.groups || 0) + " 组")}</span></div>`);
});
_push(`<!--]--></div></div>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="modal-action" data-v-955faaec><button class="btn btn-ghost btn-sm" data-v-955faaec>关闭</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(az.running) ? " disabled" : ""} data-v-955faaec>${ssrInterpolate(az.btnText)}</button></div></div><form method="dialog" class="modal-backdrop" data-v-955faaec><button data-v-955faaec>close</button></form></dialog><dialog class="modal" data-v-955faaec><div class="modal-box max-w-2xl" data-v-955faaec><h3 class="font-bold text-lg" data-v-955faaec>升级部署</h3><p class="text-sm text-slate-500 mt-1" data-v-955faaec>${ssrInterpolate(up.label)}</p><div class="text-xs text-amber-700 mt-3 bg-amber-50 border border-amber-100 rounded-lg p-3 leading-relaxed" data-v-955faaec> 将 <b data-v-955faaec>SSH 连接到该部署绑定的环境节点</b>,进入部署目录执行:<span class="font-mono" data-v-955faaec>docker login → compose pull → up -d 重启 → 清理旧镜像</span>。<br data-v-955faaec> · 需服务器上已维护好 <span class="font-mono" data-v-955faaec>docker-compose.yml / .env / confs</span>(本操作不上传真实配置)。<br data-v-955faaec> · 会<b data-v-955faaec>重启该部署的容器</b>,请确认无误后再执行。 </div><div class="grid grid-cols-1 gap-2 mt-4 text-xs" data-v-955faaec><div class="flex" data-v-955faaec><span class="w-20 text-slate-400 shrink-0" data-v-955faaec>环境节点</span><span class="${ssrRenderClass(up.envName ? "font-medium text-slate-700" : "font-medium text-red-500")}" data-v-955faaec>${ssrInterpolate(up.envName || "未绑定 —— 请先在「编辑」里选择环境节点")}</span></div><div class="flex" data-v-955faaec><span class="w-20 text-slate-400 shrink-0" data-v-955faaec>部署目录</span><span class="${ssrRenderClass(up.deployDir ? "font-mono text-slate-700" : "font-medium text-red-500")}" data-v-955faaec>${ssrInterpolate(up.deployDir || "未填 —— 请先在「编辑」里填写远端部署目录")}</span></div></div><div class="mt-3" data-v-955faaec><div class="flex items-center justify-between mb-1" data-v-955faaec><label class="text-xs text-slate-500" data-v-955faaec>镜像版本 Tag</label><button type="button" class="text-xs text-indigo-500 hover:underline"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-955faaec>${ssrInterpolate(up.tagMode === "list" ? "手动输入…" : "从仓库选择")}</button></div>`);
if (up.tagMode === "list") {
_push(`<div class="flex gap-2" data-v-955faaec><select class="select select-bordered select-sm flex-1 font-mono"${ssrIncludeBooleanAttr(up.running || up.tagsLoading) ? " disabled" : ""} data-v-955faaec><option value="" data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(up.tag) ? ssrLooseContain(up.tag, "") : ssrLooseEqual(up.tag, "")) ? " selected" : ""}>${ssrInterpolate(up.tagsLoading ? "加载可用版本中…" : "请选择版本")}</option>`);
if (up.tag && !up.tags.includes(up.tag)) {
_push(`<option${ssrRenderAttr("value", up.tag)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(up.tag) ? ssrLooseContain(up.tag, up.tag) : ssrLooseEqual(up.tag, up.tag)) ? " selected" : ""}>${ssrInterpolate(up.tag)}(当前记录)</option>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(up.tags, (t) => {
_push(`<option${ssrRenderAttr("value", t)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(up.tag) ? ssrLooseContain(up.tag, t) : ssrLooseEqual(up.tag, t)) ? " selected" : ""}>${ssrInterpolate(t)}${ssrInterpolate(t === "latest" ? " · 不固定,不推荐" : "")}</option>`);
});
_push(`<!--]--></select><button type="button" class="btn btn-ghost btn-sm"${ssrIncludeBooleanAttr(up.running || up.tagsLoading) ? " disabled" : ""} data-v-955faaec>刷新</button></div>`);
} else {
_push(`<input${ssrRenderAttr("value", up.tag)} type="text" class="input input-bordered input-sm w-full font-mono" placeholder="0.1.1"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-955faaec>`);
}
if (up.tagsError) {
_push(`<p class="text-xs text-amber-600 mt-1" data-v-955faaec>拉取仓库版本失败:${ssrInterpolate(up.tagsError)}(可点上方「手动输入」直接填版本号,或点「刷新」重试)</p>`);
} else if (up.tag === "latest" || up.tag === "") {
_push(`<p class="text-xs text-amber-600 mt-1" data-v-955faaec>⚠ 未固定版本,升级后列表无法体现具体版本号,建议选明确版本(如 0.1.1)。</p>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="mt-3" style="${ssrRenderStyle(up.show ? null : { display: "none" })}" data-v-955faaec><div class="flex items-center gap-2 text-xs mb-1" data-v-955faaec>`);
if (up.running) {
_push(`<span class="loading loading-spinner loading-xs text-amber-500" data-v-955faaec></span>`);
} else if (up.ok) {
_push(`<span class="text-green-600 font-semibold" data-v-955faaec>✓ 部署完成</span>`);
} else {
_push(`<span class="text-red-600 font-semibold" data-v-955faaec>✗ 部署失败</span>`);
}
_push(`<span class="text-slate-400" data-v-955faaec>${ssrInterpolate(up.running ? "执行中…" : "")}</span></div><pre class="bg-slate-900 text-slate-100 text-[11px] leading-relaxed rounded-lg p-3 h-64 overflow-auto font-mono whitespace-pre-wrap" data-v-955faaec>${ssrInterpolate(up.log || "(等待输出…)")}</pre></div><div class="modal-action" data-v-955faaec><button class="btn btn-ghost btn-sm"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-955faaec>关闭</button><button class="btn btn-warning btn-sm"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-955faaec>${ssrInterpolate(up.btnText)}</button></div></div><form method="dialog" class="modal-backdrop" data-v-955faaec><button${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-955faaec>close</button></form></dialog></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/apps.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const apps = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-955faaec"]]);
export { apps as default };
//# sourceMappingURL=apps-M35AvXEe.mjs.map

1
apps/admin/.output/server/chunks/build/apps-M35AvXEe.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"apps-M35AvXEe.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/apps-M35AvXEe.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

8
apps/admin/.output/server/chunks/build/apps-styles.ohrc3N5k.mjs

@ -1,8 +0,0 @@
const apps_vue_vue_type_style_index_0_scoped_955faaec_lang = ".app-card[data-v-955faaec]{background:#fff;border:1px solid #eef2f7;border-radius:14px;box-shadow:0 1px 2px #00000008;overflow:hidden}.app-card.orphan[data-v-955faaec]{border-color:#fde68a}.app-head[data-v-955faaec]{display:flex;align-items:center;gap:12px;padding:13px 16px;cursor:pointer;background:linear-gradient(90deg,#f5f7ff,#fff);border-left:4px solid #6366f1;transition:background .15s}.app-card.orphan .app-head[data-v-955faaec]{background:linear-gradient(90deg,#fffbeb,#fff);border-left-color:#f59e0b}.app-head[data-v-955faaec]:hover{background:linear-gradient(90deg,#eef2ff,#fff)}.chev[data-v-955faaec]{color:#94a3b8;font-size:12px;width:16px;flex-shrink:0}.app-logo[data-v-955faaec]{width:38px;height:38px;border-radius:10px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;font-weight:700;font-size:17px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.app-logo.orphan-logo[data-v-955faaec]{background:#f59e0b}.app-name[data-v-955faaec]{font-size:15px;font-weight:700;color:#1e293b}.chip-app[data-v-955faaec]{font-size:10px;padding:1px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.chip-app[data-v-955faaec],.chip-dep[data-v-955faaec]{display:inline-flex;font-weight:700}.chip-dep[data-v-955faaec]{font-size:9px;padding:1px 6px;border-radius:5px;background:#ecfeff;color:#0e7490}.chip-mono[data-v-955faaec]{color:#475569;font-family:SF Mono,Menlo,monospace}.chip-count[data-v-955faaec],.chip-mono[data-v-955faaec]{display:inline-flex;font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px;background:#f1f5f9}.chip-count[data-v-955faaec]{color:#64748b}.app-body[data-v-955faaec]{padding:4px 12px 10px;border-top:1px solid #f1f5f9;background:#fcfcfd}.dep-row td[data-v-955faaec]{vertical-align:middle}";
const appsStyles_ohrc3N5k = [
apps_vue_vue_type_style_index_0_scoped_955faaec_lang
];
export { appsStyles_ohrc3N5k as default };
//# sourceMappingURL=apps-styles.ohrc3N5k.mjs.map

1
apps/admin/.output/server/chunks/build/apps-styles.ohrc3N5k.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"apps-styles.ohrc3N5k.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/apps-styles-1.mjs-B1MkzUEk.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/apps-styles.ohrc3N5k.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

4
apps/admin/.output/server/chunks/build/calltranslate-Bavowmkg.mjs → apps/admin/.output/server/chunks/build/calltranslate-BUGc4owc.mjs

@ -1,6 +1,6 @@
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrInterpolate, ssrRenderClass } from 'vue/server-renderer'; import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrInterpolate, ssrRenderClass } from 'vue/server-renderer';
import { u as useApi } from './useApi-DMQewX5_.mjs'; import { u as useApi } from './useApi-D_CttG2t.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs'; import { u as useToast } from './useToast-CS21XT61.mjs';
import { _ as _export_sfc } from './server.mjs'; import { _ as _export_sfc } from './server.mjs';
import './auth-QFkCoU1C.mjs'; import './auth-QFkCoU1C.mjs';
@ -209,4 +209,4 @@ _sfc_main.setup = (props, ctx) => {
const calltranslate = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-51f11136"]]); const calltranslate = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-51f11136"]]);
export { calltranslate as default }; export { calltranslate as default };
//# sourceMappingURL=calltranslate-Bavowmkg.mjs.map //# sourceMappingURL=calltranslate-BUGc4owc.mjs.map

1
apps/admin/.output/server/chunks/build/calltranslate-BUGc4owc.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"calltranslate-BUGc4owc.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-BUGc4owc.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

1
apps/admin/.output/server/chunks/build/calltranslate-Bavowmkg.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"calltranslate-Bavowmkg.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-Bavowmkg.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

2
apps/admin/.output/server/chunks/build/client.precomputed.mjs

File diff suppressed because one or more lines are too long

22
apps/admin/.output/server/chunks/build/code-RXZTcCgt.mjs → apps/admin/.output/server/chunks/build/code-LMhiXPoc.mjs

@ -1,6 +1,6 @@
import { defineComponent, ref, reactive, mergeProps, useSSRContext } from 'vue'; import { defineComponent, ref, reactive, mergeProps, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrInterpolate } from 'vue/server-renderer'; import { ssrRenderAttrs, ssrRenderStyle, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrInterpolate } from 'vue/server-renderer';
import { u as useApi } from './useApi-DMQewX5_.mjs'; import { u as useApi } from './useApi-D_CttG2t.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs'; import { u as useToast } from './useToast-CS21XT61.mjs';
import './auth-QFkCoU1C.mjs'; import './auth-QFkCoU1C.mjs';
import 'pinia'; import 'pinia';
@ -31,12 +31,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
const view = ref("list"); const view = ref("list");
const loading = ref(false); const loading = ref(false);
const isEditing = ref(false); const isEditing = ref(false);
const currentFactoryId = ref(0); const currentBrandId = ref(0);
const filterStatus = ref(-1); const filterStatus = ref(-1);
const codes = ref([]); const codes = ref([]);
const factories = ref([]); const brands = ref([]);
const allProducts = ref([]); const allProducts = ref([]);
const factoryMap = reactive({}); const brandMap = reactive({});
const form = reactive({ const form = reactive({
code: "", code: "",
productid: 0, productid: 0,
@ -53,7 +53,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
return new Date(ts * 1e3).toLocaleString(); return new Date(ts * 1e3).toLocaleString();
} }
function facName(c) { function facName(c) {
return factoryMap[c.factoryid] || (c.factoryid ? "厂家#" + c.factoryid : "-"); return brandMap[c.brandid] || (c.brandid ? "品牌商#" + c.brandid : "-");
} }
function prodName(c) { function prodName(c) {
const prod = allProducts.value.find((p) => p.id === c.productid); const prod = allProducts.value.find((p) => p.id === c.productid);
@ -63,15 +63,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
ref(null); ref(null);
const currentQrCode = ref(""); const currentQrCode = ref("");
return (_ctx, _push, _parent, _attrs) => { return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "space-y-6" }, _attrs))}><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-4"><div class="flex items-end gap-3 flex-wrap"><div class="form-control"><label class="label py-1"><span class="label-text text-xs">厂家</span></label><select class="select select-bordered select-sm" style="${ssrRenderStyle({ "min-width": "200px" })}"><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(currentFactoryId.value) ? ssrLooseContain(currentFactoryId.value, 0) : ssrLooseEqual(currentFactoryId.value, 0)) ? " selected" : ""}>全部厂家</option><!--[-->`); _push(`<div${ssrRenderAttrs(mergeProps({ class: "space-y-6" }, _attrs))}><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-4"><div class="flex items-end gap-3 flex-wrap"><div class="form-control"><label class="label py-1"><span class="label-text text-xs">品牌商</span></label><select class="select select-bordered select-sm" style="${ssrRenderStyle({ "min-width": "200px" })}"><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(currentBrandId.value) ? ssrLooseContain(currentBrandId.value, 0) : ssrLooseEqual(currentBrandId.value, 0)) ? " selected" : ""}>全部品牌商</option><!--[-->`);
ssrRenderList(factories.value, (f) => { ssrRenderList(brands.value, (b) => {
_push(`<option${ssrRenderAttr("value", f.id)}${ssrIncludeBooleanAttr(Array.isArray(currentFactoryId.value) ? ssrLooseContain(currentFactoryId.value, f.id) : ssrLooseEqual(currentFactoryId.value, f.id)) ? " selected" : ""}>${ssrInterpolate(factoryMap[f.id])}</option>`); _push(`<option${ssrRenderAttr("value", b.id)}${ssrIncludeBooleanAttr(Array.isArray(currentBrandId.value) ? ssrLooseContain(currentBrandId.value, b.id) : ssrLooseEqual(currentBrandId.value, b.id)) ? " selected" : ""}>${ssrInterpolate(brandMap[b.id])}</option>`);
}); });
_push(`<!--]--></select></div><div class="form-control"><label class="label py-1"><span class="label-text text-xs">状态</span></label><select class="select select-bordered select-sm"><option${ssrRenderAttr("value", -1)}${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, -1) : ssrLooseEqual(filterStatus.value, -1)) ? " selected" : ""}>全部</option><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, 0) : ssrLooseEqual(filterStatus.value, 0)) ? " selected" : ""}>启用</option><option${ssrRenderAttr("value", 1)}${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, 1) : ssrLooseEqual(filterStatus.value, 1)) ? " selected" : ""}>停用</option></select></div><button class="btn btn-primary btn-sm text-white" title="新增公码需先选择具体厂家"${ssrIncludeBooleanAttr(currentFactoryId.value === 0) ? " disabled" : ""}>+ 新增公码</button></div></div><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}"><div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="overflow-x-auto"><table class="table table-zebra"><thead><tr><th>公码</th><th>厂家</th><th>关联产品</th><th>备注</th><th>VIP天/翻译分/会议分</th><th>核销/上限</th><th>失效时间</th><th>状态</th><th>操作</th></tr></thead><tbody>`); _push(`<!--]--></select></div><div class="form-control"><label class="label py-1"><span class="label-text text-xs">状态</span></label><select class="select select-bordered select-sm"><option${ssrRenderAttr("value", -1)}${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, -1) : ssrLooseEqual(filterStatus.value, -1)) ? " selected" : ""}>全部</option><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, 0) : ssrLooseEqual(filterStatus.value, 0)) ? " selected" : ""}>启用</option><option${ssrRenderAttr("value", 1)}${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, 1) : ssrLooseEqual(filterStatus.value, 1)) ? " selected" : ""}>停用</option></select></div><button class="btn btn-primary btn-sm text-white" title="新增公码需先选择具体品牌商"${ssrIncludeBooleanAttr(currentBrandId.value === 0) ? " disabled" : ""}>+ 新增公码</button></div></div><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}"><div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="overflow-x-auto"><table class="table table-zebra"><thead><tr><th>公码</th><th>品牌商</th><th>关联产品</th><th>备注</th><th>VIP天/翻译分/会议分</th><th>核销/上限</th><th>失效时间</th><th>状态</th><th>操作</th></tr></thead><tbody>`);
if (loading.value) { if (loading.value) {
_push(`<tr><td colspan="9" class="text-center text-slate-400 py-8">加载中…</td></tr>`); _push(`<tr><td colspan="9" class="text-center text-slate-400 py-8">加载中…</td></tr>`);
} else if (!codes.value.length) { } else if (!codes.value.length) {
_push(`<tr><td colspan="9" class="text-center text-slate-400 py-8">${ssrInterpolate(currentFactoryId.value ? "暂无公码,点击右上角“新增公码”创建" : "暂无公码")}</td></tr>`); _push(`<tr><td colspan="9" class="text-center text-slate-400 py-8">${ssrInterpolate(currentBrandId.value ? "暂无公码,点击右上角“新增公码”创建" : "暂无公码")}</td></tr>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
@ -101,4 +101,4 @@ _sfc_main.setup = (props, ctx) => {
}; };
export { _sfc_main as default }; export { _sfc_main as default };
//# sourceMappingURL=code-RXZTcCgt.mjs.map //# sourceMappingURL=code-LMhiXPoc.mjs.map

1
apps/admin/.output/server/chunks/build/code-LMhiXPoc.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"code-LMhiXPoc.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/code-LMhiXPoc.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

1
apps/admin/.output/server/chunks/build/code-RXZTcCgt.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"code-RXZTcCgt.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/code-RXZTcCgt.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

1
apps/admin/.output/server/chunks/build/dashboard-C1ojHDcl.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"dashboard-C1ojHDcl.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-C1ojHDcl.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

4
apps/admin/.output/server/chunks/build/dashboard-C1ojHDcl.mjs → apps/admin/.output/server/chunks/build/dashboard-Dq9mxBpq.mjs

@ -1,7 +1,7 @@
import { defineComponent, computed, reactive, ref, useSSRContext } from 'vue'; import { defineComponent, computed, reactive, ref, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass } from 'vue/server-renderer'; import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass } from 'vue/server-renderer';
import { u as useAuthStore } from './auth-QFkCoU1C.mjs'; import { u as useAuthStore } from './auth-QFkCoU1C.mjs';
import { u as useApi } from './useApi-DMQewX5_.mjs'; import { u as useApi } from './useApi-D_CttG2t.mjs';
import { _ as _export_sfc } from './server.mjs'; import { _ as _export_sfc } from './server.mjs';
import 'pinia'; import 'pinia';
import './useLoading-D4zrSa2m.mjs'; import './useLoading-D4zrSa2m.mjs';
@ -265,4 +265,4 @@ _sfc_main.setup = (props, ctx) => {
const dashboard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-7dbe8712"]]); const dashboard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-7dbe8712"]]);
export { dashboard as default }; export { dashboard as default };
//# sourceMappingURL=dashboard-C1ojHDcl.mjs.map //# sourceMappingURL=dashboard-Dq9mxBpq.mjs.map

1
apps/admin/.output/server/chunks/build/dashboard-Dq9mxBpq.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"dashboard-Dq9mxBpq.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-Dq9mxBpq.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

12
apps/admin/.output/server/chunks/build/default-Vvv7KKiT.mjs → apps/admin/.output/server/chunks/build/default-B-A39ome.mjs

@ -1,9 +1,9 @@
import { _ as __nuxt_component_0 } from './nuxt-link-CQqhT_O_.mjs'; import { _ as __nuxt_component_0 } from './nuxt-link-BpF9-8DI.mjs';
import { defineComponent, computed, mergeProps, unref, withCtx, openBlock, createBlock, createVNode, createTextVNode, toDisplayString, useSSRContext } from 'vue'; import { defineComponent, computed, mergeProps, unref, withCtx, openBlock, createBlock, createVNode, createTextVNode, toDisplayString, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrInterpolate, ssrRenderList, ssrRenderComponent, ssrRenderAttr, ssrRenderSlot, ssrRenderClass } from 'vue/server-renderer'; import { ssrRenderAttrs, ssrRenderStyle, ssrInterpolate, ssrRenderList, ssrRenderComponent, ssrRenderAttr, ssrRenderSlot, ssrRenderClass } from 'vue/server-renderer';
import { u as useToast } from './useToast-CS21XT61.mjs'; import { u as useToast } from './useToast-CS21XT61.mjs';
import { u as useLoading } from './useLoading-D4zrSa2m.mjs'; import { u as useLoading } from './useLoading-D4zrSa2m.mjs';
import { b as useRouter, a as useRoute$1, _ as _export_sfc } from './server.mjs'; import { a as useRouter, b as useRoute$1, _ as _export_sfc } from './server.mjs';
import { u as useAuthStore } from './auth-QFkCoU1C.mjs'; import { u as useAuthStore } from './auth-QFkCoU1C.mjs';
import '../nitro/nitro.mjs'; import '../nitro/nitro.mjs';
import 'node:http'; import 'node:http';
@ -107,7 +107,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
{ {
label: "生产管理", label: "生产管理",
items: [ items: [
{ id: "factory", label: "厂家管理", to: "/factory", icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" }, { id: "provider", label: "方案商管理", to: "/provider", icon: "M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" },
{ id: "factory", label: "品牌商管理", to: "/factory", icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" },
{ id: "product", label: "产品管理", to: "/product", icon: "M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" }, { id: "product", label: "产品管理", to: "/product", icon: "M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" },
{ id: "code", label: "公码管理", to: "/code", icon: "M4 4h6v6H4V4zm10 0h6v6h-6V4zM4 14h6v6H4v-6zm10 2h2m-2 4h6m-4-4v4m4-8h2m-2 0v4" }, { id: "code", label: "公码管理", to: "/code", icon: "M4 4h6v6H4V4zm10 0h6v6h-6V4zM4 14h6v6H4v-6zm10 2h2m-2 4h6m-4-4v4m4-8h2m-2 0v4" },
{ id: "device", label: "生产管理", to: "/device", icon: "M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z" } { id: "device", label: "生产管理", to: "/device", icon: "M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z" }
@ -126,13 +127,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
{ id: "mcpconfig", label: "MCP配置", to: "/mcpconfig", icon: "M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-3-4h.01M16 16h.01" }, { id: "mcpconfig", label: "MCP配置", to: "/mcpconfig", icon: "M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-3-4h.01M16 16h.01" },
{ id: "meettemplate", label: "会议模板", to: "/meettemplates", icon: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" }, { id: "meettemplate", label: "会议模板", to: "/meettemplates", icon: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" },
{ id: "svcconfig", label: "第三方服务配置", to: "/serviceconfig", icon: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z" }, { id: "svcconfig", label: "第三方服务配置", to: "/serviceconfig", icon: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z" },
{ id: "meetingsvc", label: "会议记录服务", to: "/meetingsvc", icon: "M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" },
{ id: "calltranslate", label: "通话翻译配置", to: "/calltranslate", icon: "M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129" } { id: "calltranslate", label: "通话翻译配置", to: "/calltranslate", icon: "M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129" }
] ]
}, },
{ {
label: "SaaS 管理", label: "SaaS 管理",
items: [ items: [
{ id: "apps", label: "应用管理", to: "/apps", icon: "M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" }, { id: "apps", label: "应用中心", to: "/apps", icon: "M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" },
{ id: "environments", label: "环境节点", to: "/environments", icon: "M5 3h14a2 2 0 012 2v4a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2zM5 13h14a2 2 0 012 2v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4a2 2 0 012-2zM7 7h.01M7 17h.01" } { id: "environments", label: "环境节点", to: "/environments", icon: "M5 3h14a2 2 0 012 2v4a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2zM5 13h14a2 2 0 012 2v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4a2 2 0 012-2zM7 7h.01M7 17h.01" }
] ]
}, },
@ -228,4 +230,4 @@ _sfc_main.setup = (props, ctx) => {
}; };
export { _sfc_main as default }; export { _sfc_main as default };
//# sourceMappingURL=default-Vvv7KKiT.mjs.map //# sourceMappingURL=default-B-A39ome.mjs.map

1
apps/admin/.output/server/chunks/build/default-B-A39ome.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"default-B-A39ome.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/default-B-A39ome.js"],"names":["useRoute"],"mappings":"","x_google_ignoreList":[0]}

1
apps/admin/.output/server/chunks/build/default-Vvv7KKiT.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"default-Vvv7KKiT.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/default-Vvv7KKiT.js"],"names":["useRoute"],"mappings":"","x_google_ignoreList":[0]}

62
apps/admin/.output/server/chunks/build/device-CfQFMgWh.mjs → apps/admin/.output/server/chunks/build/device-BBb3lo0K.mjs

File diff suppressed because one or more lines are too long

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save