File: /www/server/panel/BTPanel/static/js/index75.js
import{k as L,iM as re,iN as Re,iO as Me,iP as qe,c as pe,cl as ke,M as b,e as E,_ as h,w as A,da as T,G as C,R as Ae,iQ as De,fj as Ce,dc as _e,iR as Le,cT as me,cU as de,cP as Te,cZ as xe,gT as Be,eb as $e,iS as ve,iT as Oe,cR as Pe}from"./utils-lib.js?v=1777008528";import{aJ as x,aK as He,aI as B,r as y,e as o,x as q,b6 as Ve,b5 as we,i as Ie,c as $,o as Ne,n as je,j as O,k as be,v as g,p as m,L as ye,C as Fe,Q as Ge}from"./base-lib.js?v=1777008528";import{_ as ge}from"./index118.js?v=1777008528";import{b as fe,g as P,e as he}from"./index3.js?v=1777008528";import"./useController13.js?v=1777008528";const Qe=x("MASTER-STORE",()=>({tabActive:He("nodeRedisTabActive","mysqlMaster")})),ne=x("MASTER-MYSQL-STORE",()=>{const e=y(!1),t=y([]);return{deleteMysqlSlaveEvent:async i=>{try{let c={slave_ip:i.slave_ip};const v=await L({loading:"正在删除从库,请稍候...",request:re(c),message:!0});return{status:v.status,msg:v.msg}}catch(c){return{status:!1,msg:"删除从库失败"}}},multDeleteMysqlSlaveEvent:async(i,c,v,_)=>{const{label:d,value:S}=_,s=async(p,f)=>{switch(S){case"delete":return await re({slave_ip:p.slave_ip})}};await i({title:"批量".concat(d,"从库"),content:"批量".concat(d,"已选的从库,是否继续操作!"),column:[{label:"从库地址",prop:"slave_ip"},fe()],onConfirm:async()=>(await c(s),e.value=!0,!1)})},setMysqlSlaveEvent:async(i,c)=>{try{return await qe({slave_ip:i.slave_ip,status:c})}catch(v){}},getMysqlSlaveHistoryEvent:async()=>{try{return await Re()}catch(i){}},deleteMysqlSlaveHistoryEvent:async i=>{try{return await Me(i)}catch(c){}},isRefreshList:e,mysqlRowData:t}}),k=()=>({...ne(),...B(ne())});function oe(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!Ie(e)}const{mysqlRowData:We}=k(),{plugin:yt,getGlobalInfo:ze}=pe(),ie=async()=>{var t;const e=await ze();await L({request:ke(),loading:"正在获取节点数据,请稍等...",success:l=>{l.msg&&l.status===!1&&b.error(l.msg),We.value=l.data.data.filter(a=>!a.is_local&&!a.lpver).map(a=>({label:"".concat(a.remarks," - ").concat(a.server_ip),value:a.id,remarks:a.server_ip}))}}),E({title:"添加主从",area:62,compData:{panel_address:typeof e=="object"&&((t=e==null?void 0:e.panel)==null?void 0:t.address)},btn:["添加","取消"],component:()=>h(()=>import("./add-form.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),showFooter:!0})},D=(e,t=!1)=>{const{openMasterSlaveLog:l}=Ke();l(e,t)},Ye=async e=>{const{deleteMysqlSlaveEvent:t,isRefreshList:l}=k();await A({title:"".concat("删除mysql从库【".concat(e.slave_ip,"】")),content:"".concat("风险操作,此操作不可逆,删除【".concat(e.slave_ip,"】后您将无法管理该从库,是否继续操作?"))});const{status:a,msg:n}=await t(e);a?(b.success(n),l.value=!0):b.error(n)},Ue=async e=>{await A({title:"".concat(e.run_status==="start"?"停止":"启动","从库同步【").concat(e.slave_ip,"】"),content:"是否确认".concat(e.run_status==="start"?"停止":"启动","从库同步【").concat(e.slave_ip,"】?")});const{setMysqlSlaveEvent:t,isRefreshList:l}=k();await t(e,e.run_status==="start"?"stop":"start"),l.value=!0},Je=()=>{const{getMysqlSlaveHistoryEvent:e,deleteMysqlSlaveHistoryEvent:t}=k();return{openHistoryBackup:()=>{const{BtTable:a,refresh:n}=T({request:async()=>{const{data:r}=await e();return r.msg&&r.status===!1&&b.error(r.msg),{data:r.data,total:r.data.length}},columns:[{label:"文件名",prop:"name"},{label:"大小",prop:"size",render:r=>C(r.size)},{label:"创建时间",prop:"mtime",width:160,render:r=>Ae(r.mtime)},P([{title:"下载",onClick:r=>{window.open("/download?filename="+r.path)}},{title:"删除",onClick:async r=>{await A({title:"删除备份文件",content:"是否确认删除该备份文件?"});const{status:u,msg:i}=await t({path:r.path});u?(b.success(i),n()):b.error(i)}}])]});E({title:"主库历史备份文件",area:62,component:()=>o("div",{class:"p-[1.6rem]"},[o(a,{maxHeight:"40rem"},null)])})}}},Ke=()=>({openMasterSlaveLog:async(t,l=!1)=>{let a=y();if(l&&t.config_status==="done"){const{data:r}=await De({slave_ip:t.slave_ip});a.value=r}else if(!Ce(t.error_msg))a.value=t.error_msg;else{t.config_status!=="done"&&b.error("主从配置未完成,请先完成主从配置:操作 - 同步中");return}const n=b.load("正在获取日志信息,请稍后...");E({title:"从库状态日志",area:60,component:()=>{let r;return o("div",{class:"p-[1.6rem] max-h-[60rem] overflow-y-auto"},[o("div",{class:"mb-[1.6rem]"},[q("从库地址: "),t.slave_ip]),o(Ve,{column:1,border:!0},oe(r=Object.entries(a.value).map(([u,i])=>{let c;return o(we,{label:u},oe(c=String(i))?c:{default:()=>[c]})}))?r:{default:()=>[r]})])}}),n==null||n.close()}}),Ze=e=>{E({title:"同步进度",area:[60,"auto"],component:()=>h(()=>import("./index471.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),compData:{slave_ip:e}})},Xe=$({__name:"index",setup(e){pe();const{isRefreshList:t,multDeleteMysqlSlaveEvent:l}=k(),{BtOperation:a}=_e({options:[{type:"button",label:"添加主从",active:!0,onClick:ie},{type:"button",label:"历史备份",active:!1,onClick:()=>{const{openHistoryBackup:s}=Je();s()}}]}),n=de([{label:"删除",value:"delete",event:l}]),r=s=>({label:s.label,prop:s.prop,render:p=>{const f=typeof s.status=="function"?s.status(p):p[s.prop];return s.render?s.render(p):o("span",{class:"bt-link ".concat(s.onClick?"cursor-pointer":""," ").concat(s.class?s.class(p):""),style:{color:f.type==="success"?"var(--el-color-primary)":"#ef0808"},onClick:()=>{var R;(R=s.onClick)==null||R.call(s,p)}},[f.text])}}),{BtTable:u,BtSearch:i,BtRefresh:c,BtPage:v,BtColumn:_,BtBatch:d,refresh:S}=T({request:async s=>{const{data:p}=await Le(s);return p.msg&&p.status===!1&&b.error(p.msg),{data:p.data,total:0,search:{}}},columns:[he({key:"slave_ip"}),{label:"从库地址",prop:"slave_ip",minWidth:220},{label:"同步中的数据库",prop:"db_name",render:s=>s.db_name},r({label:"读写状态",prop:"io_status",status:s=>({type:s.io_status==="Yes"&&s.config_status==="done"?"success":"danger",text:s.config_status!=="done"?"未开始":s.io_status==="Yes"?"正常":s.sql_status==="api_error"?"从库面板api连接异常":"异常"}),onClick:D}),r({label:"同步状态",prop:"sql_status",status:s=>({type:s.sql_status==="Yes"&&s.config_status==="done"?"success":"danger",text:s.config_status!=="done"?"未开始":s.sql_status==="Yes"?"正常":s.sql_status==="api_error"?"从库面板api连接异常":"异常"}),onClick:D}),r({label:"是否启用",prop:"run_status",status:s=>({type:s.run_status==="start"?"success":"danger",text:s.run_status==="start"?"已启用":"已停用"}),onClick:Ue}),P([{render:s=>{const p=s.config_status==="done"?"状态":"同步中";return o("span",null,[o("span",{onClick:()=>s.config_status==="done"?D(s,!0):Ze(s.slave_ip),title:p,class:"bt-link"},[p]),o("div",{class:"el-divider el-divider--vertical",role:"separator",style:"--el-border-style: solid;"},null)])}},{title:"删除",onClick:s=>Ye(s)}])],extension:[n,me(t)],empty:()=>o("span",null,[q("您的列表为空,您可以"),o("span",{class:"bt-link",onClick:ie},[q("添加一个主从")])])});return Ne(()=>{je(()=>{h(()=>import("./index258.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),h(()=>import("./index259.js?v=1777008528"),__vite__mapDeps([]),import.meta.url)})}),(s,p)=>{const f=ge,R=Te;return O(),be("div",null,[o(f,null,{"header-left":g(()=>[o(m(a))]),"header-right":g(()=>[o(m(i),{class:ye(["mr-[10px]","!w-[210px]"]),placeholder:"请输入地址"}),o(m(c))]),content:g(()=>[o(m(u))]),"footer-left":g(()=>[o(m(d))]),"footer-right":g(()=>[o(m(v))]),_:1}),o(R,{class:"mt-[1rem]",options:[{content:"如从库面板连接异常(从库面板停止,密钥变更),将无法正常获取读写/同步状态"}]})])}}}),et=xe(Xe,[["__scopeId","data-v-1779f5de"]]),ue=x("MASTER-REDIS-STORE",()=>{const e=y(!1),t=y([]),l=y({row:[],nodes:[]}),a=y({}),n=y(!0),r=y(!0);return{isRedisRefreshList:e,redisRowData:t,redisAvailableNodes:l,redisGroupDetail:a,openNodesLoading:n,slaveListLoad:r}}),Ee=()=>({...ue(),...B(ue())}),{isRedisRefreshList:Se,redisAvailableNodes:tt,redisGroupDetail:at,openNodesLoading:st,slaveListLoad:lt}=Ee(),M=(e,t=2)=>{if(typeof e!="number"||isNaN(e))return"-";let a=(+(e*100).toFixed(t)).toString();return a.indexOf(".")>-1&&(a=a.replace(/\.0+$/,""),a=a.replace(/(\.[1-9]*)0+$/,"$1")),a+"%"},ce=async()=>{E({title:"新建主从复制组",area:60,btn:["创建","取消"],component:()=>h(()=>import("./index469.js?v=1777008528"),__vite__mapDeps([]),import.meta.url)});try{const{data:e}=await Be();e.status||b.error(e.msg||"获取可用节点失败!"),tt.value={row:e.data,nodes:e.data.map(t=>{var l;return{label:"".concat(t.name," - ").concat(t.server_ip," ").concat(t.group_info===null?"":"(主从组 - ".concat((l=t.group_info)==null?void 0:l.group_name,")")),value:t.id,server_ip:t.server_ip,disabled:t.group_info!==null}})}}catch(e){}finally{st.value=!1}},rt=async(e,t,l,a)=>{const{label:n,value:r}=a,u=async(i,c)=>{switch(r){case"delete":return await ve({group_id:i.group_id})}};await e({title:"批量".concat(n),content:"批量删除选中的项目后,项目将无法恢复,是否继续操作?",column:[{label:"主从组名称",prop:"group_name"},fe()],onConfirm:async()=>(await t(u),Se.value=!0,!1)})},nt=async e=>{E({title:"管理主从复制组【".concat(e.group_name,"】"),area:80,component:()=>h(()=>import("./index522.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),compData:{rowData:e}});const{data:t}=await $e({group_id:e.group_id});t.status||b.error(t.msg||"获取主从复制组失败!"),at.value=t.data,lt.value=!1},gt=(e,t)=>{var l,a,n;E({title:"".concat(t==="slave"?"从节点详情【".concat(e.data.server_ip,"】"):"主节点详情【".concat((n=(a=(l=e.value)==null?void 0:l.master_detail)==null?void 0:a.data)==null?void 0:n.address,"】")),area:70,component:()=>h(()=>import("./index470.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),compData:{rowData:e,type:t||"master"}})},ot=async e=>{try{await A({icon:"warning-filled",title:"删除主从复制组【".concat(e.group_name,"】"),content:"即将删除主从复制组,是否继续操作?"}),await L({loading:"正在删除主从复制组,因需重新还原所有redis相关配置进行重启操作,过程可能较长请稍等...",request:ve({group_id:e.group_id}),message:!0,success:t=>{Se.value=!0}})}catch(t){}},ft=async e=>{E({title:"创建主从复制组",area:60,component:()=>h(()=>import("./redis-create-log.js?v=1777008528"),__vite__mapDeps([]),import.meta.url),compData:{task_id:e}})};function ht(e,t="master"){var v,_,d,S,s,p,f,R,H,V,w,I,N,j,F,G,Q,W,z,Y,U,J,K,Z,X,ee,te,ae,se,le;const l=t=="master"?((v=e.value)==null?void 0:v.master_detail.data)||{}:e.data||{},a=l.memory||{},n=l.performance||{},r=l.connections||{},u=l.replication||{},i=[{name:"base",label:"基础信息",items:[{label:"节点状态",value:l.status==="online"?"在线":"离线"},{label:"Redis版本",value:l.redis_version||"--"},{label:"运行天数",value:((_=l.uptime_days)!=null?_:"--")+"天"},{label:"监听端口",value:(d=l.port)!=null?d:"--"},{label:"连接数",value:(S=l.connected_slaves)!=null?S:"--"},{label:"角色",value:(s=l.role)!=null?s:"--"}]},{name:"memory",label:"内存信息",items:[{label:"已使用内存",value:(p=a.used_memory_human)!=null?p:"--"},{label:"系统内存",value:a.max_memory?C(a.max_memory):"--"},{label:"内存使用率",value:a.usage_percent!=null?M(a.usage_percent):"--",tooltip:"计算方式:已使用内存/系统内存"}]},{name:"connection",label:"连接信息",items:[{label:"当前连接数",value:(f=r.connected_clients)!=null?f:"--"},{label:"总连接数",value:(R=r.total_connections)!=null?R:"--",tooltip:"仅记录TCP连接数"},{label:"最大连接数限制",value:(H=r.max_clients)!=null?H:"--"},{label:"拒绝连接数",value:(V=r.rejected_connections)!=null?V:"--"}]},{name:"performance",label:"性能统计",items:[{label:"当前QPS",value:(w=n.qps)!=null?w:"--"},{label:"总执行命令数",value:(I=n.total_commands)!=null?I:"--"},{label:"键命中次数",value:(N=n.keyspace_hits)!=null?N:"--"},{label:"键未命中次数",value:(j=n.keyspace_misses)!=null?j:"--"},{label:"命中率",value:n.hit_rate!=null?M(n.hit_rate):"--"}]}],c=[{name:"base",label:"基础信息",items:[{label:"Redis版本",value:l.redis_version||"--"},{label:"运行天数",value:((F=l.uptime_days)!=null?F:"--")+"天"},{label:"监听端口",value:(G=l.tcp_port)!=null?G:"--"},{label:"角色",value:(Q=u.role)!=null?Q:"--"},{label:"主节点地址",value:(W=u.master_host)!=null?W:"--"},{label:"主节点端口",value:(z=u.master_port)!=null?z:"--"}]},{name:"memory",label:"内存信息",items:[{label:"已使用内存",value:(Y=a.used_memory_human)!=null?Y:"--"},{label:"系统内存",value:a.max_memory?C(a.max_memory):"--"},{label:"内存使用率",value:a.usage_percent!=null?M(a.usage_percent):"--"}]},{name:"connection",label:"连接信息",items:[{label:"当前连接数",value:(U=r.connected_clients)!=null?U:"--"},{label:"总连接数",value:(J=r.total_connections)!=null?J:"--"},{label:"阻塞连接数",value:(K=r.rejected_connections)!=null?K:"--"}]},{name:"replication",label:"复制信息",items:[{label:"主从连接状态",value:(Z=u.master_link_status)!=null?Z:"--"},{label:"最后IO时间",value:u.last_io_seconds?u.last_io_seconds+"秒前":"--"},{label:"同步进度",value:u.sync_in_progress?"是":"否"},{label:"复制偏移量",value:(X=u.repl_offset)!=null?X:"--"},{label:"复制延迟(秒)",value:(ee=u.lag)!=null?ee:"--"},{label:"是否在线",value:u.is_online?"是":"否"}]},{name:"performance",label:"性能统计",items:[{label:"当前QPS",value:(te=n.qps)!=null?te:"--"},{label:"总执行命令数",value:(ae=n.total_commands)!=null?ae:"--"},{label:"键命中次数",value:(se=n.keyspace_hits)!=null?se:"--"},{label:"键未命中次数",value:(le=n.keyspace_misses)!=null?le:"--"},{label:"命中率",value:n.hit_rate!=null?M(n.hit_rate):"--"}]}];return t=="master"?i:c}const it={class:"node-master-redis"},ut=$({__name:"index",setup(e){const{isRedisRefreshList:t}=Ee(),l=de([{label:"删除主从组",value:"delete",event:rt}]),{BtOperation:a}=_e({options:y([{type:"button",label:"新建主从复制组",active:!0,onClick:()=>ce()}])}),n=[he({key:"group_id"}),{label:"主从组名称",prop:"group_name",minWidth:120},{label:"主库地址",prop:"master_server_ip",minWidth:160},{label:"内存占用",prop:"memory_usage",minWidth:100,render:_=>o("span",{style:{color:_.memory_usage>=.95?"var(--el-color-danger)":_.memory_usage>.8?"var(--el-color-warning)":"var(--el-color-primary)"}},[M(_.memory_usage,0)])},{label:"QPS",prop:"qps",minWidth:80},{label:"连接数",prop:"connections",minWidth:80},{label:"从库数量",prop:"slave_count",minWidth:80},{label:"从库正常数",prop:"normal_slaves",minWidth:100,render:_=>o("span",{style:{color:_.normal_slaves<_.slave_count?"var(--el-color-danger)":"var(--el-color-text-primary)"}},[_.normal_slaves])},{label:"平均延迟(秒)",prop:"avg_lag",minWidth:100},P([{title:"管理",onClick:nt},{title:"删除",onClick:ot}])],{BtTable:r,BtBatch:u,BtSearch:i,BtRefresh:c,BtPage:v}=T({request:async _=>{const{data:d}=await Oe(_);return d.status||b.error(d.msg),{data:d.data,total:d.page.total_count,search:{}}},columns:n,extension:[l,me(t)],empty:()=>o("span",null,[q("您的列表为空,您可以"),o("span",{class:"bt-link",onClick:()=>ce()},[q("新建主从复制组")])])});return(_,d)=>{const S=ge;return O(),be("div",it,[o(S,null,{"header-left":g(()=>[o(m(a))]),"header-right":g(()=>[o(m(i),{class:ye(["mr-[10px]","!w-[210px]"]),placeholder:"请输入名称或地址"}),o(m(c))]),content:g(()=>[o(m(r))]),"footer-left":g(()=>[o(m(u))]),"footer-right":g(()=>[o(m(v))]),_:1})])}}}),ct=[{label:"MySQL",name:"mysqlMaster",lazy:!0,render:()=>o(et,null,null)},{label:"Redis",name:"redisMaster",lazy:!0,render:()=>o(ut,null,null)}],pt=$({__name:"index",setup(e){const{tabActive:t}=B(Qe());return(l,a)=>{const n=Pe;return O(),Fe(n,{class:"module-ui",type:"card",modelValue:m(t),"onUpdate:modelValue":a[0]||(a[0]=r=>Ge(t)?t.value=r:null),options:m(ct)},null,8,["modelValue","options"])}}}),Et=Object.freeze(Object.defineProperty({__proto__:null,default:pt},Symbol.toStringTag,{value:"Module"}));export{k as a,Ze as b,M as f,ht as g,gt as h,Et as i,ft as o,Ee as u};
function __vite__mapDeps(indexes) {
if (!__vite__mapDeps.viteFileDeps) {
__vite__mapDeps.viteFileDeps = []
}
return indexes.map((i) => __vite__mapDeps.viteFileDeps[i])
}