You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
16 KiB
1 lines
16 KiB
import{_ as Lt}from"./D1rGIbQk.js";import{u as it}from"./CX31_Ko0.js";import{h as Nt,R as $t,a as Rt}from"./PN667bHc.js";import{g as ct,B as dt,o,c as l,a as s,t as r,l as F,G as Ot,b as K,w as lt,d as I,F as b,r as g,n as G,x as v,z as h,_ as ut,j as Vt,p as J,q as Z,y as rt,L as H}from"./CSjlBIfC.js";import"./CgE-6DOq.js";const Tt={class:"ab-head"},qt={class:"ab-ico"},zt={class:"ab-title"},It={key:0,class:"ab-sub"},Ht={class:"ab-sub"},Gt={key:0,class:"ab-list"},Ut={class:"ab-name"},jt={key:0,class:"ab-chip"},Pt={class:"ab-chip ab-chip-scope"},Yt={class:"ab-msg"},Wt={key:1,class:"ab-streak"},Jt={key:0,class:"ab-more"},Zt=12,Kt=ct({__name:"SvcAlertBanner",setup(_t,{expose:C}){const{webApi:N}=it(),w=v([]),p=v(0),y=v(0),A=v(0),k=v(!1),x=v(!1),E=h(()=>Nt(A.value));function U(c){const m=c.app_name?c.app_name:"全局";return c.region?`${m} · ${$t[c.region]||"区域"+c.region}`:m}function $(c){return Rt(c)}async function M(){try{const c=await N("getsvcalerts",{limit:Zt});w.value=c.alerts||[],p.value=c.error_count||0,y.value=c.warn_count||0,A.value=c.last_run||0,x.value=p.value+y.value>w.value.length,k.value=p.value>0}catch{w.value=[],p.value=0,y.value=0}}return dt(M),C({load:M}),(c,m)=>{const R=Lt;return p.value+y.value>0?(o(),l("div",{key:0,class:G(["alert-banner",p.value>0?"lv-error":"lv-warn"])},[s("div",Tt,[s("span",qt,r(p.value>0?"🚨":"⚠️"),1),s("div",zt,[s("strong",null,r(p.value>0?`${p.value} 项第三方服务不可用`:`${y.value} 项第三方服务存在隐患`),1),p.value>0&&y.value>0?(o(),l("span",It,",另有 "+r(y.value)+" 项隐患",1)):F("",!0),s("span",Ht," · 最近巡检 "+r(Ot(E)),1)]),s("button",{class:"ab-btn",onClick:m[0]||(m[0]=d=>k.value=!k.value)},r(k.value?"收起":"展开详情"),1),K(R,{to:"/svcinspect",class:"ab-btn ab-btn-primary"},{default:lt(()=>[...m[1]||(m[1]=[I("前往巡检",-1)])]),_:1})]),k.value?(o(),l("div",Gt,[(o(!0),l(b,null,g(w.value,d=>(o(),l("div",{key:`${d.app_name}/${d.svc_id}/${d.region}`,class:"ab-item"},[s("span",{class:G(["ab-dot",d.status==="error"?"d-error":"d-warn"])},null,2),s("span",Ut,r(d.name||d.svc_id),1),d.provider?(o(),l("span",jt,r(d.provider),1)):F("",!0),s("span",Pt,r(U(d)),1),s("span",Yt,r($(d)),1),d.fail_streak>1?(o(),l("span",Wt,"连续失败 "+r(d.fail_streak)+" 次",1)):F("",!0)]))),128)),x.value?(o(),l("div",Jt,[I(" 仅显示前 "+r(w.value.length)+" 条,其余请到",1),K(R,{to:"/svcinspect",class:"ab-link"},{default:lt(()=>[...m[2]||(m[2]=[I("服务巡检",-1)])]),_:1}),m[3]||(m[3]=I("查看 ",-1))])):F("",!0)])):F("",!0)],2)):F("",!0)}}}),Qt=Object.assign(ut(Kt,[["__scopeId","data-v-3dd2fb7c"]]),{__name:"SvcAlertBanner"}),Xt={class:"panel p-4 mb-5"},te={class:"flex flex-wrap items-end gap-3"},ee={class:"form-control"},se=["value"],ae={class:"form-control"},ne=["value"],oe={class:"form-control"},le=["value"],re={class:"grid grid-cols-2 md:grid-cols-4 gap-3 mb-8"},ie={class:"body"},ce={class:"lbl"},de={class:"val"},ue={class:"today-wrap mb-8"},_e={class:"sec-title hero",style:{"margin-bottom":"16px"}},ve={class:"tag",style:{color:"#0369a1",background:"#dbeafe"}},pe={class:"grid grid-cols-2 md:grid-cols-4 gap-4"},me={class:"today-card-top"},fe={class:"lbl"},ye={class:"val"},be={class:"foot"},ge={key:0,class:"delta up"},he={class:"grid grid-cols-1 xl:grid-cols-2 gap-6"},ke={class:"panel-head"},Ee=["stroke"],Fe=["d"],we={class:"font-semibold text-slate-700 text-sm"},xe={key:0,class:"ml-auto text-xs text-slate-400"},Ce={key:1,class:"ml-auto flex items-center gap-1"},De=["onClick"],Ae={class:"px-5 py-4"},Me={class:"grid grid-cols-2 sm:grid-cols-3 gap-2.5"},Se={class:"stat-label"},Be={class:"stat-val"},Le={key:0,style:{height:"170px","margin-top":"1rem"}},Ne=ct({__name:"dashboard",setup(_t){const C=Vt(),{webApi:N,consoleApi:w}=it(),p=[["cn","中国"],["us","美国"],["ea","东亚"],["sea","东南亚"],["sa","南亚"],["me","中东"],["eu","欧洲"],["ru","俄罗斯"],["af","非洲"],["sam","南美"],["nam","北美"],["oc","大洋洲"],["br","巴西"],["in","印度"]],y={new_user_count:["👥","#EEF2FF","#6366F1"],active_user_count:["🟢","#ECFDF5","#10B981"],bind_device_count:["📱","#E0F2FE","#0EA5E9"],qr_active_count:["🔳","#FCE7F3","#EC4899"],order_paid_count:["🧾","#FEF3C7","#F59E0B"],order_paid_amount:["💰","#FEE2E2","#EF4444"],pay_user_count:["⭐","#FFF7ED","#F97316"],meet_second:["🎙️","#CFFAFE","#22D3EE"],trade_second:["🌐","#F3E8FF","#8B5CF6"]},A=[["new_user_count","累计用户",!1],["bind_device_count","累计绑定设备",!1],["qr_active_count","累计二维码激活",!1],["order_paid_count","累计支付订单",!1],["order_paid_amount","累计支付金额",!0],["meet_second","累计会议时长",!1],["trade_second","累计翻译时长",!1]],k=[["new_user_count","新增用户",!1],["active_user_count","活跃用户",!1],["qr_active_count","二维码激活",!1],["order_paid_count","支付订单",!1],["order_paid_amount","支付金额",!0],["pay_user_count","付费用户",!1],["meet_second","会议时长",!1,!0],["trade_second","翻译时长",!1,!0]],x=[{key:"user",title:"用户增长",color:"#6366F1",tint:"#EEF2FF",icon:"M17 20h5v-2a4 4 0 00-3-3.87M9 20H4v-2a4 4 0 013-3.87m6-1.13a4 4 0 10-4-4 4 4 0 004 4z",stats:[["new_user_count","新增用户"],["active_user_count","活跃用户"],["login_user_count","登录用户"],["login_count","登录次数"]],lines:[["new_user_count","新增用户","#6366F1"],["active_user_count","活跃用户","#34D399"]]},{key:"device",title:"设备激活绑定",color:"#0EA5E9",tint:"#E0F2FE",icon:"M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z",stats:[["active_device_count","已激活"],["bind_device_count","已绑定"]],lines:[["active_device_count","已激活","#0EA5E9"],["bind_device_count","已绑定","#818CF8"]]},{key:"qrcode",title:"二维码激活",color:"#EC4899",tint:"#FCE7F3",icon:"M12 4v1m6 11h2m-6 0h-1v4m-6-4H5m14 0h-2m-6-7H5m0 0V5m0 4v6m14-6V5h-4M5 5h4M5 19h4m6 0h4v-4M4 4h6v6H4V4zm10 0h6v6h-6V4zM4 14h6v6H4v-6z",stats:[["qr_active_count","二维码激活次数"]],lines:[["qr_active_count","二维码激活","#EC4899"]]},{key:"order",title:"订单支付",color:"#F59E0B",tint:"#FEF3C7",icon:"M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z",stats:[["order_create_count","创建订单"],["order_paid_count","支付订单"],["order_failed_count","失败订单"],["pay_user_count","付费用户"],["order_paid_amount","支付金额",!0],["order_create_amount","创建金额",!0]],lines:[["order_paid_count","支付订单","#F59E0B"],["order_create_count","创建订单","#FCD34D"]]},{key:"meeting",title:"会议",color:"#22D3EE",tint:"#CFFAFE",icon:"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z",stats:[["meet_count","会议次数"],["meet_second","会议时长",!1,!0],["grant_meet_second","发放会议时长",!1,!0]],lines:[["meet_count","会议次数","#22D3EE"],["meet_second","会议时长(秒)","#0EA5E9"]]},{key:"translate",title:"翻译",color:"#8B5CF6",tint:"#F3E8FF",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",stats:[["trade_count","翻译次数"],["trade_second","翻译时长",!1,!0],["trade_words","翻译字数"],["grant_trade_second","发放翻译时长",!1,!0]],lines:[["trade_count","翻译次数","#8B5CF6"],["trade_second","翻译时长(秒)","#A78BFA"]]}],E=h(()=>C.identity===3),U=h(()=>C.apps),$=h(()=>C.regions),M=h(()=>C.products.map(t=>parseInt(t)).filter(t=>!isNaN(t))),c=["new_user_count","active_user_count","qr_active_count"],m=h(()=>E.value?A.filter(t=>!c.includes(t[0])):A),R=h(()=>E.value?k.filter(t=>!c.includes(t[0])):k),d=h(()=>E.value?x.filter(t=>t.key!=="user"&&t.key!=="qrcode"):x),vt=[[7,"7天"],[30,"30天"],[90,"90天"],[0,"全部"]],u=rt({app:"",region:"",product:""}),O=v([]),j=v([]),pt=h(()=>E.value&&$.value.length?p.filter(t=>$.value.includes(t[0])).map(t=>({value:t[0],label:t[1]})):p.map(t=>({value:t[0],label:t[1]}))),Q=v({}),X=v({}),P=v({}),tt=v({}),et=v("实时"),Y=v({}),V=rt({});x.forEach(t=>{V[t.key]=30});function T(t){const e=t.getFullYear(),n=("0"+(t.getMonth()+1)).slice(-2),a=("0"+t.getDate()).slice(-2);return parseInt(e+n+a)}function mt(t){if(!t)return{start:0,end:0};const e=new Date,n=new Date;return n.setDate(n.getDate()-(t-1)),{start:T(n),end:T(e)}}function ft(t,e){return t=Number(t)||0,e?"¥"+(t/100).toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2}):t.toLocaleString()}function yt(t){t=Math.max(0,Math.floor(Number(t)||0));const e=Math.floor(t/3600),n=Math.floor(t%3600/60),a=t%60;return e>0?e+"时"+n+"分":n>0?n+"分"+a+"秒":a+"秒"}function W(t,e,n){return n?yt(t):ft(t,e)}function bt(t){const e=String(t);return e.length===8?e.slice(4,6)+"-"+e.slice(6,8):e}function gt(t,e){return t=Number(t)||0,e=Number(e)||0,e===0?t>0?null:0:(t-e)/e*100}function S(t){return y[t]||["📊","#f1f5f9","#94a3b8"]}function ht(t){const e=t[0]==="bind_device_count"||t[0]==="active_device_count"?X.value:Q.value,n=t[0]==="meet_second"||t[0]==="trade_second";return W(e[t[0]],t[2],n)}function kt(t){return W(P.value[t[0]],t[2],!!t[3])}function B(t){const e=gt(P.value[t[0]],tt.value[t[0]]);if(e===null)return{type:"new",arrow:"",abs:""};const n=e>0?"up":e<0?"down":"flat",a=e>0?"▲":e<0?"▼":"—";return{type:n,arrow:a,abs:Math.abs(e).toFixed(1)}}function Et(t,e){return W((Y.value[t.key]||{})[e[0]],e[2],e[3])}function q(){const t={};return u.app!==""&&(t.app_id=u.app),u.region!==""&&(t.region=u.region),u.product!==""&&(t.product_id=parseInt(String(u.product))),t}function st(){const t={};return u.product!==""&&(t.product_id=parseInt(String(u.product))),t}async function D(t,e){try{return{code:0,data:await N(t,e)??{}}}catch{return null}}async function Ft(){const t=await D("getstatssummary",q());Q.value=t&&t.code===0&&t.data?t.data:{};const e=await D("getstatssummary",st());X.value=e&&e.code===0&&e.data?e.data:{}}async function wt(){const t=T(new Date),e=new Date;e.setDate(e.getDate()-1);const n=T(e),a=q();a.start_day=t,a.end_day=t;const i=q();i.start_day=n,i.end_day=n;const f=await D("getstatssummary",a);P.value=f&&f.code===0&&f.data?f.data:{};const _=await D("getstatssummary",i);tt.value=_&&_.code===0&&_.data?_.data:{};const z=new Date,St=("0"+(z.getMonth()+1)).slice(-2),Bt=("0"+z.getDate()).slice(-2);et.value=St+"-"+Bt+" 实时"}async function at(t){let e;if(t.key==="device")e=st();else{const _=mt(V[t.key]);e=q(),e.start_day=_.start,e.end_day=_.end}const n=await D("getstatssummary",e),a=n&&n.code===0&&n.data?n.data:{};if(Y.value={...Y.value,[t.key]:a},t.key==="device")return;const i=await D("getstatstrend",e),f=i&&i.code===0?i.data||[]:[];Dt(t,f)}function xt(t,e){V[t]=e;const n=x.find(a=>a.key===t);n&&at(n)}function nt(){Ft(),wt(),d.value.forEach(t=>at(t))}const ot={},L={};function Ct(t,e){e&&(ot[t]=e)}function Dt(t,e){const n=window.Chart,a=ot[t.key];if(!n||!a)return;const i=e.map(_=>bt(_.stat_day)),f=t.lines.map(_=>({label:_[1],data:e.map(z=>Number(z[_[0]])||0),borderColor:_[2],backgroundColor:_[2]+"22",tension:.35,fill:!0,pointRadius:0,borderWidth:2}));if(L[t.key]){L[t.key].data.labels=i,L[t.key].data.datasets=f,L[t.key].update();return}L[t.key]=new n(a,{type:"line",data:{labels:i,datasets:f},options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{boxWidth:10,padding:12,font:{size:11}}}},scales:{x:{ticks:{maxTicksLimit:8,font:{size:10},color:"#94a3b8"},grid:{display:!1}},y:{beginAtZero:!0,ticks:{precision:0,maxTicksLimit:5,font:{size:10},color:"#94a3b8"},grid:{color:"#f1f5f9"}}},interaction:{mode:"index",intersect:!1}}})}async function At(){if(E.value)O.value=U.value.map(t=>({value:t,label:t}));else try{const t=await w("apps/list",{}),e=Array.isArray(t)?t:[];O.value=e.map(n=>({value:n.name||"",label:n.name||"应用#"+n.id}))}catch{O.value=[]}try{const t=await N("getproducts",{});let e=t&&t.products?t.products:[];E.value&&M.value.length&&(e=e.filter(n=>M.value.includes(n.id))),j.value=e.map(n=>({value:n.id,label:(n.devicename||"产品#"+n.id)+" (#"+n.id+")"}))}catch{j.value=[]}}function Mt(){return new Promise(t=>{if(window.Chart)return t();const e=document.createElement("script");e.src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js",e.onload=()=>t(),e.onerror=()=>t(),document.head.appendChild(e)})}return dt(async()=>{await Mt(),await At(),nt()}),(t,e)=>{const n=Qt;return o(),l("div",null,[K(n),s("div",Xt,[s("div",te,[s("div",ee,[e[4]||(e[4]=s("label",{class:"label py-1"},[s("span",{class:"label-text text-xs text-slate-500"},"应用")],-1)),J(s("select",{"onUpdate:modelValue":e[0]||(e[0]=a=>u.app=a),class:"select select-bordered select-sm w-40"},[e[3]||(e[3]=s("option",{value:""},"全部应用",-1)),(o(!0),l(b,null,g(O.value,a=>(o(),l("option",{key:a.value,value:a.value},r(a.label),9,se))),128))],512),[[Z,u.app]])]),s("div",ae,[e[6]||(e[6]=s("label",{class:"label py-1"},[s("span",{class:"label-text text-xs text-slate-500"},"区域")],-1)),J(s("select",{"onUpdate:modelValue":e[1]||(e[1]=a=>u.region=a),class:"select select-bordered select-sm w-32"},[e[5]||(e[5]=s("option",{value:""},"全部区域",-1)),(o(!0),l(b,null,g(pt.value,a=>(o(),l("option",{key:a.value,value:a.value},r(a.label),9,ne))),128))],512),[[Z,u.region]])]),s("div",oe,[e[8]||(e[8]=s("label",{class:"label py-1"},[s("span",{class:"label-text text-xs text-slate-500"},"产品")],-1)),J(s("select",{"onUpdate:modelValue":e[2]||(e[2]=a=>u.product=a),class:"select select-bordered select-sm w-48"},[e[7]||(e[7]=s("option",{value:""},"全部产品",-1)),(o(!0),l(b,null,g(j.value,a=>(o(),l("option",{key:a.value,value:a.value},r(a.label),9,le))),128))],512),[[Z,u.product]])]),s("button",{class:"btn btn-primary btn-sm text-white",onClick:nt},"查询"),e[9]||(e[9]=s("span",{class:"text-xs text-slate-400 ml-auto self-center"},"顶部为全量总览;各版面右上角可单独选时间周期",-1))])]),e[14]||(e[14]=s("div",{class:"sec-title muted"},[s("span",{class:"bar",style:{background:"#cbd5e1"}}),s("h2",null,"累计数据"),s("span",{class:"sub"},"全量累计 · 随筛选条件变化")],-1)),s("div",re,[(o(!0),l(b,null,g(m.value,a=>(o(),l("div",{key:a[0],class:"cum-card"},[s("span",{class:"ico",style:H({background:S(a[0])[1]})},r(S(a[0])[0]),5),s("div",ie,[s("div",ce,r(a[1]),1),s("div",de,r(ht(a)),1)])]))),128))]),s("div",ue,[s("div",_e,[e[10]||(e[10]=s("span",{class:"bar",style:{background:"linear-gradient(180deg,#0EA5E9,#22D3EE)"}},null,-1)),e[11]||(e[11]=s("h2",null,"今日数据",-1)),s("span",ve,r(et.value),1),e[12]||(e[12]=s("span",{class:"sub"},"今日 0 点至现在 · 含较昨日同比(设备类无日期维度,仅见累计)",-1))]),s("div",pe,[(o(!0),l(b,null,g(R.value,a=>(o(),l("div",{key:a[0],class:"today-card"},[s("span",{class:"accent",style:H({background:S(a[0])[2]})},null,4),s("div",me,[s("span",fe,r(a[1]),1),s("span",{class:"ico",style:H({background:S(a[0])[1]})},r(S(a[0])[0]),5)]),s("div",ye,r(kt(a)),1),s("div",be,[B(a).type==="new"?(o(),l("span",ge,"新")):B(a).type!=="none"?(o(),l("span",{key:1,class:G(["delta",B(a).type])},r(B(a).arrow)+" "+r(B(a).abs)+"%",3)):F("",!0),e[13]||(e[13]=s("span",null,"较昨日",-1))])]))),128))])]),e[15]||(e[15]=s("div",{class:"sec-title"},[s("span",{class:"bar",style:{background:"linear-gradient(180deg,#10B981,#22D3EE)"}}),s("h2",null,"趋势分析"),s("span",{class:"sub"},"各版面右上角可独立选择时间周期")],-1)),s("div",he,[(o(!0),l(b,null,g(d.value,a=>(o(),l("div",{key:a.key,class:"panel"},[s("div",ke,[s("span",{class:"panel-dot",style:H({background:a.tint})},[(o(),l("svg",{width:"17",height:"17",fill:"none",viewBox:"0 0 24 24",stroke:a.color},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:a.icon},null,8,Fe)],8,Ee))],4),s("span",we,r(a.title),1),a.key==="device"?(o(),l("span",xe,"当前累计 · 无日期维度")):(o(),l("div",Ce,[(o(),l(b,null,g(vt,i=>s("button",{key:i[0],class:G(["tbtn",{"tbtn-on":i[0]===V[a.key]}]),onClick:f=>xt(a.key,Number(i[0]))},r(i[1]),11,De)),64))]))]),s("div",Ae,[s("div",Me,[(o(!0),l(b,null,g(a.stats,i=>(o(),l("div",{key:i[0],class:"stat-box"},[s("div",Se,r(i[1]),1),s("div",Be,r(Et(a,i)),1)]))),128))]),a.key!=="device"?(o(),l("div",Le,[s("canvas",{ref_for:!0,ref:i=>Ct(a.key,i)},null,512)])):F("",!0)])]))),128))])])}}}),qe=ut(Ne,[["__scopeId","data-v-0c034b8c"]]);export{qe as default};
|
|
|