var monitorServerIp = "192.168.1.220"
var monitorServerPort = 55666
var monitorServerWebScoektPort = 10509
var netdataPort = 19999
var ServerLists = new Array()
var selServer
var selPanle
var ServerDetailInfo
function showMessage( msg ) {
// simulate loading (for demo purposes only)
setTimeout(function () {
// create the notification
var notification = new NotificationFx({
message: '
' + msg + '.
',
layout: 'attached',
effect: 'bouncyflip',
type: 'notice', // notice, warning or error
ttl: 3000,
onClose: function () {
}
})
// show the notification
notification.show()
})
}
// jsonp的回调函数
function jsonpCallback(params) {
return params
}
// 发起get请求
function HttpGet(ip, port, method, successCb, errorCb) {
var url = "http://" + ip + ":" + port + "/" + method
$.ajax({
type: "get",
async: false,
url: url,
dataType: "jsonp",
jsonpCallback: "jsonpCallback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
success: successCb,
error: errorCb
})
}
// 加载集群的服务器列表,并填充到serverLists中(select)
function loadServerList() {
var mainTable = document.getElementById("mainTable")
mainTable.hidden = true
currentSelect("a_select")
selectServer()
HttpGet(monitorServerIp, monitorServerPort, "getServerList", function (data) {
ServerLists = data
var serverListSelect = document.getElementById("serverListSelect")
var array = new Array()
for (const serverName in ServerLists) {
array.push(serverName)
}
array.sort()
for (const index in array) {
// 添加进select
serverListSelect.options.add(new Option(array[index], array[index]))
}
// 加载到nice-select中
(function () {
[].slice.call(document.querySelectorAll('select.cs-select')).forEach(function (el) {
new SelectFx(el, { onChange: selectChange });
});
})();
},
function (error) {
showMessage("loadServerList Error!")
}
)
}
function newTd() {
var td = document.createElement("td")
td.className = "center"
td.setAttribute("valign", "middle")
return td
}
function memTrans(memCount) {
var preFix = " Kb"
var memCount = memCount / 1024
if(memCount > 1024) {
memCount = memCount / 1024
preFix = " Mb"
if (memCount > 1024) {
memCount = memCount / 1024
preFix = " Gb"
}
}
return memCount.toFixed(2) + preFix
}
function ShowServerInfoByData(data) {
//获取table
var mainTable = document.getElementById("mainTable")
var mainTbody = document.getElementById("mainTbody")
var luaMem = 0
// 清空旧数据
$("#mainTable tbody").html("");
// 动态插入
for (const addr in data.service) {
//生成元素信息
var tr = document.createElement("tr")
var addrTd = newTd()
addrTd.innerText = data.service[addr]["addr"]
tr.appendChild(addrTd)
var nameTd = newTd()
nameTd.innerText = data.service[addr]["name"]
tr.appendChild(nameTd)
var mqlenTd = newTd()
mqlenTd.innerText = data.service[addr]["stat"]["mqlen"]
tr.appendChild(mqlenTd)
var taskTd = newTd()
taskTd.innerText = data.service[addr]["stat"]["task"]
tr.appendChild(taskTd)
var lmemTd = newTd()
lmemTd.innerText = data.service[addr]["mem"]
luaMem = luaMem + parseFloat(data.service[addr]["mem"].split(" KB")[0])
tr.appendChild(lmemTd)
var cmemTd = newTd()
cmemTd.innerText = data.service[addr]["cmem"] + " KB"
tr.appendChild(cmemTd)
var messageTd = newTd()
messageTd.innerText = data.service[addr]["stat"]["message"]
tr.appendChild(messageTd)
var cpuTd = newTd()
cpuTd.innerText = data.service[addr]["stat"]["cpu"]
tr.appendChild(cpuTd)
var cpuDetailTd = newTd()
if(data.service[addr]["info"])
{
var span = document.createElement("span")
for (const key in data.service[addr]["info"]) {
var p = document.createElement("p")
p.innerText = "func:" + key + ", count:" + data.service[addr]["info"][key]["count"]
+ ", time:" + data.service[addr]["info"][key]["time"] + "s"
span.appendChild(p)
}
cpuDetailTd.appendChild(span)
}
else
cpuDetailTd.innerText = ""
tr.appendChild(cpuDetailTd)
mainTbody.appendChild(tr)
}
var serverTotalCMem = document.getElementById("serverTotalCMem")
var memInfo = "总计LUA内存:" + memTrans(luaMem * 1024) + ",总计C内存:" + memTrans(data.totalcmem) + ",总计C内存块数量:" + data.blockcmem
serverTotalCMem.innerText = memInfo
mainTable.hidden = false
}
// 刷新服务器详细信息
function RefreshServerInfo() {
getServerInfo(selServer)
}
// 获取服务器详细信息
function getServerInfo(nodeName) {
HttpGet(monitorServerIp, monitorServerPort, "getServerInfo?serverNode=" + selServer,
function (data) {
//排序
data.service.sort(function (a,b) {
return parseInt(a.addr.substring(2), 16) - parseInt(b.addr.substring(2), 16)
})
ShowServerInfoByData(data)
ServerDetailInfo = data
},
function (error) {
showMessage("getServerInfo Error!")
}
)
serverTotalOnlineCount.innerText = ""
if(nodeName.indexOf("game") >= 0) {
// 游戏服务器,额外请求在线数量
HttpGet(monitorServerIp, monitorServerPort, "getOnlineCount?serverNode=" + selServer,
function (data) {
serverTotalOnlineCount.innerText = "在线人数:" + data.count
},
function (error) {
showMessage("getOnlineCount Error!")
}
)
}
}
var addrSortFlag = false
// 地址排序
function addrSort() {
addrSortFlag = !addrSortFlag
ServerDetailInfo.service.sort(function (a, b) {
return addrSortFlag ? parseInt(a.addr.substring(2), 16) - parseInt(b.addr.substring(2), 16)
: parseInt(b.addr.substring(2), 16) - parseInt(a.addr.substring(2), 16)
})
ShowServerInfoByData(ServerDetailInfo)
}
var nameSortFlag = false
// 名称排序
function nameSort() {
nameSortFlag = !nameSortFlag
ServerDetailInfo.service.sort(function (a, b) {
return nameSortFlag ? ( a.name > b.name ? 1 : -1) : ( a.name < b.name ? 1 : -1 )
})
ShowServerInfoByData(ServerDetailInfo)
}
var mqlenSortFlag = false
// 消息队列排序
function mqlenSort() {
mqlenSortFlag = !mqlenSortFlag
ServerDetailInfo.service.sort(function (a, b) {
return mqlenSortFlag ? a.stat.mqlen - b.stat.mqlen : b.stat.mqlen - a.stat.mqlen
})
ShowServerInfoByData(ServerDetailInfo)
}
var taskSortFlag = false
// 任务队列排序
function taskSort() {
taskSortFlag = !taskSortFlag
ServerDetailInfo.service.sort(function (a, b) {
return taskSortFlag ? a.stat.task - b.stat.task : b.stat.task - a.stat.task
})
ShowServerInfoByData(ServerDetailInfo)
}
var lmemSortFlag = false
// lua内存排序
function lmemSort() {
lmemSortFlag = !lmemSortFlag
ServerDetailInfo.service.sort(function (a, b) {
return lmemSortFlag ? parseInt(a.mem.substring(0, a.mem.indexOf("Kb")), 10) - parseInt(b.mem.substring(0, b.mem.indexOf("Kb")), 10)
: parseInt(b.mem.substring(0, b.mem.indexOf("Kb")), 10) - parseInt(a.mem.substring(0, a.mem.indexOf("Kb")), 10)
})
ShowServerInfoByData(ServerDetailInfo)
}
var cmemSortFlag = false
// C内存排序
function cmemSort() {
cmemSortFlag = !cmemSortFlag
ServerDetailInfo.service.sort(function (a, b) {
return cmemSortFlag ? a.cmem - b.cmem : b.cmem - a.cmem
})
ShowServerInfoByData(ServerDetailInfo)
}
var messageSortFlag = false
// 总消息数量排序
function messageSort() {
messageSortFlag = !messageSortFlag
ServerDetailInfo.service.sort(function (a, b) {
return messageSortFlag ? a.stat.message - b.stat.message : b.stat.message - a.stat.message
})
ShowServerInfoByData(ServerDetailInfo)
}
var cpuSortFlag = false
// CU时间排序
function cpuSort() {
cpuSortFlag = !cpuSortFlag
ServerDetailInfo.service.sort(function (a, b) {
return cpuSortFlag ? a.stat.cpu - b.stat.cpu : b.stat.cpu - a.stat.cpu
})
ShowServerInfoByData(ServerDetailInfo)
}
// 选择改变
function selectChange( val ) {
selServer = val
if (selPanle=="server") {
// 获取选择的服务器node
var serverListSelect = document.getElementById("serverListSelect")
var node = serverListSelect.options[serverListSelect.selectedIndex].value
serverStatus()
if (node != null && node != "") {
//请求服务器信息
getServerInfo(val)
}
}
else if (selPanle == "pm" ) {
// 显示PM指令
var pmDiv = document.getElementById("pmDiv")
pmDiv.hidden = false
getPmHelp()
}
}
function HideAll() {
var mainTable = document.getElementById("mainTable")
mainTable.hidden = true
var selectDiv = document.getElementById("selectDiv")
selectDiv.hidden = true
var pmDiv = document.getElementById("pmDiv")
pmDiv.hidden = true
var serverInfoDiv = document.getElementById("serverInfoDiv")
serverInfoDiv.hidden = true
var pmInput = document.getElementById("pmInput")
var pmButton = document.getElementById("pmButton")
pmInput.hidden = true
pmButton.hidden = true
var battleInfoDiv = document.getElementById("battleInfoDiv")
battleInfoDiv.hidden = true
var testcaseLogPre = document.getElementById("testcaseLog")
testcaseLogPre.hidden = true
var createEvEDiv = document.getElementById("createEvEDiv")
createEvEDiv.hidden = true
var restartClusterDiv = document.getElementById("restartClusterDiv")
restartClusterDiv.hidden = true
var modifyDataDiv = document.getElementById("modifyDataDiv")
modifyDataDiv.hidden = true
var exportSpriteDataDiv = document.getElementById("exportSpriteDataDiv")
exportSpriteDataDiv.hidden = true
var reloadConfigDiv = document.getElementById("reloadConfigDiv")
reloadConfigDiv.hidden = true
var closeServerDiv = document.getElementById("closeServerDiv")
closeServerDiv.hidden = true
var hotfixDiv = document.getElementById("hotfixDiv")
hotfixDiv.hidden = true
var transDataDiv = document.getElementById("transDataDiv")
transDataDiv.hidden = true
var restartGameLineDiv = document.getElementById("restartGameLineDiv")
restartGameLineDiv.hidden = true
}
function currentSelect(name) {
var navs = ["a_select", "a_pm", "a_status", "a_battleInfo", "a_netdata",
"a_testcase", "a_createEvE", "a_restartCluster", "a_modifyData", "a_exportSpriteData", "a_reloadConfig",
"a_closeServer", "a_hotfix", "a_transData"]
navs.forEach(element => {
var select = document.getElementById(element)
if(select != null)
select.setAttribute("class", "")
});
var curselect = document.getElementById(name)
curselect.setAttribute("class", "current-demo")
}
function emptyClass(obj) {
obj.setAttribute("class", "")
}
// 选择服务器
function selectServer() {
HideAll()
var selectDiv = document.getElementById("selectDiv")
selectDiv.hidden = false
currentSelect("a_select")
selPanle = "server"
}
//PM命令
function pmCmd() {
HideAll()
var selectDiv = document.getElementById("selectDiv")
selectDiv.hidden = false
var pmDiv = document.getElementById("pmDiv")
var pmInput = document.getElementById("pmInput")
var pmButton = document.getElementById("pmButton")
if (selServer == null || selServer.startsWith("game") == false) {
pmDiv.hidden = true
pmInput.hidden = true
pmButton.hidden = true
}
else {
pmDiv.hidden = false
pmInput.hidden = true
pmButton.hidden = true
getPmHelp()
}
currentSelect("a_pm")
selPanle = "pm"
}
//服务器状态
function serverStatus() {
HideAll()
var serverInfoDiv = document.getElementById("serverInfoDiv")
serverInfoDiv.hidden = false
var mainTable = document.getElementById("mainTable")
mainTable.hidden = false
currentSelect("a_status")
selPanle = "status"
}
//战斗数据
function battleInfo() {
if (selServer == null || selServer.startsWith("battle") == false) {
showMessage("请选择战斗服务器!")
return
}
HideAll()
var battleInfoDiv = document.getElementById("battleInfoDiv")
battleInfoDiv.hidden = false
currentSelect("a_battleInfo")
}
//监控数据
function netdata() {
window.open("http://" + monitorServerIp + ":" + netdataPort)
}
var pmCmds
//获取PM命令帮助指令
function getPmHelp() {
if (selServer == null || selServer.startsWith("game")== false) {
showMessage("请选择游服!")
return
}
HttpGet(monitorServerIp, monitorServerPort, "pmCmd?serverNode=" + selServer +"&cmd=showHelp", function (data) {
pmCmds = data
//显示PM命令列表
var pmNav = document.getElementById("pmNav")
// 清空旧数据
$("#pmNav").html("");
var i = 0
for (const index in data) {
var a = document.createElement("a")
a.href = "javascript:void(0)"
i = i + 1
if(i >= 5) {
a.innerHTML = " " + data[index]["explan"] + "
"
i = 0
}
else
a.innerHTML = " " + data[index]["explan"] + " "
a.onclick = function () {
clickPM(index)
}
pmNav.appendChild(a)
}
})
}
var pmIndex
var roleId
function clickPM(index) {
pmIndex = index
if (pmCmds[index]) {
//显示PM命令的参数和说明
var pmExplan = document.getElementById("pmExplan")
pmExplan.innerHTML = "命令说明:" + pmCmds[index]["explan"]
var pmInput = document.getElementById("pmInput")
var pmButton = document.getElementById("pmButton")
pmInput.hidden = false
pmButton.hidden = false
$("#pmInput").html("")
var lable = document.createElement("lable")
lable.innerHTML = "角色ID:"
var input = document.createElement("input")
input.id = "input0"
if (roleId){
input.value = roleId
}
pmInput.appendChild(lable)
pmInput.appendChild(input)
var br = document.createElement("br")
pmInput.appendChild(br)
var br = document.createElement("br")
pmInput.appendChild(br)
//生成input
var args = pmCmds[index]["arg"].split("|")
for (let index = 0; index < args.length; index++) {
const name = args[index];
if(name == "") continue;
var lable = document.createElement("lable")
lable.innerHTML = name + ":"
var input = document.createElement("input")
input.id = "input" + (index + 1)
pmInput.appendChild(lable)
pmInput.appendChild(input)
var br = document.createElement("br")
pmInput.appendChild(br)
var br = document.createElement("br")
pmInput.appendChild(br)
}
}
}
function clickPMButton() {
var cmd = pmCmds[pmIndex]["cmd"]
var args = ""
for (let index = 0; index < 100; index++) {
var input = document.getElementById("input"+index)
if(input == null) break
//记忆roleId
if(index == 0) {
roleId = input.value
}
else
args = args + "&" + index + "=" + input.value
}
HttpGet(monitorServerIp, monitorServerPort, "pmCmd?serverNode=" + selServer +"&cmd=" + cmd + "&rid=" + roleId + args, function (data) {
if(data["error"] == undefined) {
showMessage("命令:" + cmd + ",执行结果:" + data)
}else{
showMessage("命令:" + cmd + ",执行结果:" + data["error"])
}
})
}
var battleScene
// 获取战斗信息
function clickBattleInfo() {
var battleIndex = document.getElementById("battleIndex")
HttpGet(monitorServerIp, monitorServerPort, "getBattleServerDetail?serverNode=" + selServer +"&battleIndex=" + battleIndex.value, function (data) {
var roleArray = new Array()
battleScene = data
var showBattleInfo = document.getElementById("showBattleInfo")
$("#showBattleInfo").html("");
// 创建table
var table = document.createElement("table")
table.className = "bordered"
// 创建thead
var thead = document.createElement("thead")
table.appendChild(thead)
// 创建tr
var tr = document.createElement("tr")
thead.appendChild(tr)
//创建tbody
var tbody = document.createElement("tbody")
var bodytr = document.createElement("tr")
tbody.appendChild(bodytr)
table.appendChild(tbody)
for (const key in data) {
// 创建th
var th = document.createElement("th")
th.className = "center"
th.innerHTML = key
tr.appendChild(th)
//创建td
var td = newTd()
if(typeof(data[key]) == "object") {
if(key == "roleInfos") {
for (const battleNo in data[key]) {
var roleTable = document.createElement("table")
roleTable.className = "bordered"
// 创建thead
var roleThead = document.createElement("thead")
roleTable.appendChild(roleThead)
// 创建tr
var roleTr = document.createElement("tr")
roleThead.appendChild(roleTr)
//创建tbody
var roleTbody = document.createElement("tbody")
var roleBodytr = document.createElement("tr")
roleTbody.appendChild(roleBodytr)
roleTable.appendChild(roleTbody)
// 创建th
var roleTh = document.createElement("th")
roleTh.className = "center"
roleTh.innerHTML = key + "(" + battleNo + ")"
roleTr.appendChild(roleTh)
var roleTd = newTd()
var roleSubTable = document.createElement("table")
roleSubTable.className = "bordered"
// 创建thead
var roleSubThead = document.createElement("thead")
roleSubTable.appendChild(roleSubThead)
// 创建tr
var roleSubTr = document.createElement("tr")
roleSubThead.appendChild(roleSubTr)
//创建tbody
var roleSubTbody = document.createElement("tbody")
var roleSubBodytr = document.createElement("tr")
roleSubTbody.appendChild(roleSubBodytr)
roleSubTable.appendChild(roleSubTbody)
roleTd.appendChild(roleSubTable)
//角色属性信息
for (const roleKey in data[key][battleNo]) {
// 创建th
var roleSubTh = document.createElement("th")
roleSubTh.className = "center"
roleSubTh.innerHTML = roleKey
roleSubTr.appendChild(roleSubTh)
var roleSubTd = newTd()
if(roleKey != "roleAttr") {
if (typeof (data[key][battleNo][roleKey]) == "object") {
roleSubTd.innerText = JSON.stringify(data[key][battleNo][roleKey])
}
else {
roleSubTd.innerText = data[key][battleNo][roleKey]
}
}
else {
//加入按钮
var btn = document.createElement("button")
btn.innerText = "角色属性"
btn.onclick = function () {
clickRoleAttr(battleNo)
}
roleSubTd.appendChild(btn)
}
roleSubBodytr.appendChild(roleSubTd)
}
roleBodytr.appendChild(roleTd)
roleArray.push(roleTable)
}
}
else
td.innerText = JSON.stringify(data[key])
}
else
td.innerText = data[key]
bodytr.appendChild(td)
}
showBattleInfo.appendChild(table)
for (const key in roleArray) {
showBattleInfo.appendChild(roleArray[key])
}
})
}
function clickRoleAttr(battleNo) {
var roleAttr = battleScene["roleInfos"][battleNo].roleAttr
var showBattleInfo = document.getElementById("showBattleInfo")
$("#showBattleInfo").html("");
showBattleInfo.innerHTML = JSON.stringify(roleAttr);
/*
// 创建table
var table = document.createElement("table")
table.className = "bordered"
// 创建thead
var thead = document.createElement("thead")
table.appendChild(thead)
// 创建tr
var tr = document.createElement("tr")
thead.appendChild(tr)
//创建tbody
var tbody = document.createElement("tbody")
var bodytr = document.createElement("tr")
tbody.appendChild(bodytr)
table.appendChild(tbody)
for (const key in roleAttr) {
// 创建th
var th = document.createElement("th")
th.className = "center"
th.innerHTML = key
tr.appendChild(th)
//创建td
var td = newTd()
if (typeof (roleAttr[key]) == "object") {
td.innerText = JSON.stringify(roleAttr[key])
}
else {
td.innerText = roleAttr[key]
}
bodytr.appendChild(td)
}
showBattleInfo.appendChild(table)
*/
}
function testcase() {
HideAll()
var testcaseLogPre = document.getElementById("testcaseLog")
testcaseLogPre.hidden = false
currentSelect("a_testcase")
webSocketMessageRealTime()
}
// 通过websocket 时候获取内容
function webSocketMessageRealTime() {
HttpGet(monitorServerIp, monitorServerPort, "runTestCase")
var ws = new WebSocket('ws://' + monitorServerIp + ':' + monitorServerWebScoektPort)
// helper function: log message to screen
function log(msg) {
document.getElementById('testcaseLog').textContent += msg + '\n';
}
log("执行测试用例ing...")
ws.onmessage = function (event) {
log(event.data)
}
}
function createEvE() {
if (selServer == null || selServer.startsWith("battle") == false) {
showMessage("请选择战斗服务器!")
return
}
HideAll()
var createEvEDiv = document.getElementById("createEvEDiv")
createEvEDiv.hidden = false
currentSelect("a_createEvE")
}
function restartCluster() {
if (selServer == null || selServer.startsWith("monitor") == false) {
showMessage("请选择监控服务器!")
return
}
HideAll()
var createEvEDiv = document.getElementById("restartClusterDiv")
createEvEDiv.hidden = false
currentSelect("a_restartCluster")
}
function ClickCreateEVE() {
var createEvEGroupDown = document.getElementById("createEvEGroupDown")
var createEvEGroupUp = document.getElementById("createEvEGroupUp")
var createEvECount = document.getElementById("createEvECount")
var createEvEDivResult = document.getElementById("createEvEDivResult")
var loadingLable = document.createElement("lable")
loadingLable.innerHTML = "正在模拟,请稍后..."
while (createEvEDivResult.hasChildNodes()) //当div下还存在子节点时 循环继续
createEvEDivResult.removeChild(createEvEDivResult.firstChild);
createEvEDivResult.appendChild(loadingLable)
HttpGet(monitorServerIp, monitorServerPort,
"createEvE?serverNode=" + selServer +"&downMonsterGroupId=" + createEvEGroupDown.value + "&upMonsterGroupId=" + createEvEGroupUp.value + "&count=" + createEvECount.value, function (data) {
if (data.error) {
showMessage(data.error)
return
}
else {
var createEvEDivResult = document.getElementById("createEvEDivResult")
while (createEvEDivResult.hasChildNodes()) //当div下还存在子节点时 循环继续
createEvEDivResult.removeChild(createEvEDivResult.firstChild);
var resultTable = document.createElement("table")
resultTable.className = "bordered"
// 创建tbody
var resultTbody = document.createElement("tbody")
// 创建tr、td
var resultBodytr = document.createElement("tr")
var resultTd = newTd()
resultTd.innerHTML = "战斗汇总统计"
resultTd.bgColor = "#7FFFD4"
resultTd.colSpan = 4
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "战斗场次"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = createEvECount.value
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "战斗平均回合"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = data["arvgTrun"]
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "战斗最小回合数"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["minTrun"]
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "战斗最大回合数"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["maxTrun"]
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.bgColor = "#7FFFD4"
resultTd.innerHTML = "玩家方统计"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.colSpan = 2
resultTd.bgColor = "#7FFFD4"
resultTd.innerHTML = "怪物方统计"
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.innerHTML = "阵容编号"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = createEvEGroupDown.value
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = "阵容编号"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = createEvEGroupUp.value
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.innerHTML = "成员数量"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["downSide"]["memberCount"]
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = "成员数量"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["upSide"]["memberCount"]
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.innerHTML = "胜利场次"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["downSide"]["win"]
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = "胜利场次"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["upSide"]["win"]
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.innerHTML = "胜率"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["downSide"]["winRate"] + "%"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = "胜率"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["upSide"]["winRate"] + "%"
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.innerHTML = "胜场平局回合数"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["downSide"]["winArvgTrun"]
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = "胜场平局回合数"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["upSide"]["winArvgTrun"]
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.innerHTML = "胜场最小回合数"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["downSide"]["winMinTrun"]
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = "胜场最小回合数"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["upSide"]["winMinTrun"]
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.innerHTML = "胜场最大回合数"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["downSide"]["winMaxTrun"]
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = "胜场最大回合数"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["upSide"]["winMaxTrun"]
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
resultBodytr = document.createElement("tr")
resultTd = newTd()
resultTd.innerHTML = "胜利时平均剩余人数"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["downSide"]["winMemberCount"]
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = "胜利时平均剩余人数"
resultBodytr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = data["upSide"]["winMemberCount"]
resultBodytr.appendChild(resultTd)
resultTbody.appendChild(resultBodytr)
for (let index = 0; index < data["roleDetail"].length; index++) {
const element = data["roleDetail"][index];
var detailTr = document.createElement("tr")
resultTd = newTd()
if (element["battleNo"] < 10)
resultTd.innerHTML = "玩家方成员统计(" + (element["battleNo"] + 1) + ")"
else
resultTd.innerHTML = "怪物方成员统计(" + (element["battleNo"] + 1) + ")"
resultTd.bgColor = "#7FFFD4"
resultTd.colSpan = 4
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
detailTr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "位置编号"
detailTr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = element["battleNo"] + 1
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
detailTr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "怪物ID"
detailTr.appendChild(resultTd)
resultTd = newTd()
resultTd.innerHTML = element["monsterId"]
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
detailTr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "怪物等级"
detailTr.appendChild(resultTd)
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = element["level"]
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
detailTr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "该怪物平均伤害总量"
detailTr.appendChild(resultTd)
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = element["arvgDamage"]
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
detailTr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "该怪物平均受伤总量"
detailTr.appendChild(resultTd)
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = element["arvgHurt"]
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
detailTr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "该怪物平均有效治疗量"
detailTr.appendChild(resultTd)
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = element["arvgHeal"]
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
detailTr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "该怪物平均被治疗量"
detailTr.appendChild(resultTd)
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = element["arvgHealed"]
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
detailTr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "该单位平均生存回合数"
detailTr.appendChild(resultTd)
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = element["arvgLiveTrun"]
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
detailTr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "该单位胜利场的平均生存回合数"
detailTr.appendChild(resultTd)
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = element["arvgWinLiveTrun"]
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
detailTr = document.createElement("tr")
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = "该单位失败场的平均生存回合数"
detailTr.appendChild(resultTd)
resultTd = newTd()
resultTd.colSpan = 2
resultTd.innerHTML = element["arvgLoseLiveTrun"]
detailTr.appendChild(resultTd)
resultTbody.appendChild(detailTr)
}
resultTable.appendChild(resultTbody)
createEvEDivResult.appendChild(resultTable)
}
})
}
function ClickRestartCluster() {
var restartClusterBranch = document.getElementById("restartClusterBranch")
var branch = restartClusterBranch.value
HttpGet(monitorServerIp, monitorServerPort,
"restartCluster?serverNode=" + selServer +"&branch=" + branch, function (data) {
if (data.error) {
showMessage("重启集群失败!" + data.error)
return
}
else
{
showMessage("重启集群完成!")
}
}
)
}
// 修改数据
function modifyData() {
if (selServer == null || selServer.startsWith("game") == false) {
showMessage("请选择游戏服务器!")
return
}
HideAll()
var createEvEDiv = document.getElementById("modifyDataDiv")
createEvEDiv.hidden = false
currentSelect("a_modifyData")
}
// 查询数据
function QueryModifyData() {
var modifyDataTable = document.getElementById("modifyDataTable")
var modifyDataKey = document.getElementById("modifyDataKey")
if(modifyDataTable.value == "" || modifyDataKey.value == "")
{
showMessage("请输入表名和主键值")
return
}
HttpGet(monitorServerIp, monitorServerPort,
"modifyData?serverNode=" + selServer +"&mode=1&tbname=" + modifyDataTable.value + "&key=" + modifyDataKey.value, function (data) {
document.getElementById("modifyDataLable").innerText = JSON.stringify(data, null, 2)
}
)
}
// 导出精灵数据
function exportSpriteData() {
HideAll()
var exportSpriteDataDiv = document.getElementById("exportSpriteDataDiv")
exportSpriteDataDiv.hidden = false
currentSelect("a_exportSpriteData")
}
// 重载配置
function reloadConfig() {
HideAll()
var reloadConfigDiv = document.getElementById("reloadConfigDiv")
reloadConfigDiv.hidden = false
currentSelect("a_reloadConfig")
}
function Base64() {
// private property
_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
// public method for encoding
this.encode = function (input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = _utf8_encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
_keyStr.charAt(enc3) + _keyStr.charAt(enc4);
}
return output;
}
// public method for decoding
this.decode = function (input) {
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
while (i < input.length) {
enc1 = _keyStr.indexOf(input.charAt(i++));
enc2 = _keyStr.indexOf(input.charAt(i++));
enc3 = _keyStr.indexOf(input.charAt(i++));
enc4 = _keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
}
output = _utf8_decode(output);
return output;
}
// private method for UTF-8 encoding
_utf8_encode = function (string) {
string = string.replace(/\r\n/g, "\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
} else if ((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
} else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
// private method for UTF-8 decoding
_utf8_decode = function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;
while (i < utftext.length) {
c = utftext.charCodeAt(i);
if (c < 128) {
string += String.fromCharCode(c);
i++;
} else if ((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i + 1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
} else {
c2 = utftext.charCodeAt(i + 1);
c3 = utftext.charCodeAt(i + 2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return string;
}
}
// 更新数据
function UpdateModifyData() {
var modifyDataTable = document.getElementById("modifyDataTable")
var modifyDataKey = document.getElementById("modifyDataKey")
var modifyDataLable = document.getElementById("modifyDataLable")
if (modifyDataTable.value == "" || modifyDataKey.value == "" || modifyDataLable.innerText == "") {
showMessage("请输入表名和主键值,以及内容")
return
}
var b = new Base64()
var content = b.encode(modifyDataLable.innerText)
HttpGet(monitorServerIp, monitorServerPort,
"modifyData?serverNode=" + selServer +"&mode=2&tbname=" + modifyDataTable.value + "&key=" + modifyDataKey.value + "&value=" + content,
function (data) {
if(data.result) {
showMessage("更新成功")
}
else {
showMessage("更新失败")
}
}
)
}
// 导出精灵问答数据
function ExportSpriteData() {
HttpGet(monitorServerIp, monitorServerPort, "spriteData?serverNode=" + selServer,
function (data) {
}
)
}
// 重载配置数据
function ReloadConfig() {
HttpGet(monitorServerIp, monitorServerPort, "reloadConfig?serverNode=" + selServer,
function (data) {
if (data.result) {
showMessage(data.name + " 重载完成!")
}
else {
showMessage(data.name + " 重载失败!")
}
}
)
}
// 关闭服务器
function closeServer() {
HideAll()
var closeServerDiv = document.getElementById("closeServerDiv")
closeServerDiv.hidden = false
currentSelect("a_closeServer")
}
// 关闭服务器
function CloseServer() {
var closeTypeSelect = document.getElementById("closeTypeSelect")
HttpGet(monitorServerIp, monitorServerPort, "closeSelf?serverNode=" + selServer +"&type=" + closeTypeSelect.value,
function () {
showMessage("已通知服务器[" + selServer + "] 开始维护!")
}
)
}
// 点击热更
function clickHotfix() {
if (selServer == null || selServer.startsWith("monitor")== false)
{
showMessage("请选择monitor服务器")
return
}
HideAll()
var hotfixDiv = document.getElementById("hotfixDiv")
hotfixDiv.hidden = false
currentSelect("a_hotfix")
}
// 执行热更
function Hotfix() {
HttpGet(monitorServerIp, monitorServerPort, "hotfixServer?serverNode=" + selServer,
function (data) {
showMessage(data.result)
}
)
}
// 点击数据转换
function clickTransData() {
if (selServer == null || selServer.startsWith("db")== false) {
showMessage("请选择db服务器!")
return
}
HideAll()
var transDataDiv = document.getElementById("transDataDiv")
transDataDiv.hidden = false
currentSelect("a_transData")
}
// 点击重启游戏
function clickRestartGameLine() {
if (selServer == null || selServer.startsWith("game")== false) {
showMessage("请选择game服务器!")
return
}
HideAll()
var transDataDiv = document.getElementById("restartGameLineDiv")
transDataDiv.hidden = false
currentSelect("a_restartGameLine")
}
// 执行重启
function restartGameLine() {
HttpGet(monitorServerIp, monitorServerPort, "restartGame?serverNode=" + selServer,
function () {
showMessage("已通知所有线路重启!10s左右完成!")
}
)
}
// 二进制转JSON
function TransDataToJSON() {
var transDataInput = document.getElementById("transDataInput")
if (transDataInput.value == "") {
showMessage("请输入表名")
return
}
var tbTypeSelect = document.getElementById("tbTypeSelect")
HttpGet(monitorServerIp, monitorServerPort, "transData?serverNode=" + selServer +"&tbName="
+ transDataInput.value + "&tbType=" + tbTypeSelect.value + "&transType=1",
function () {
showMessage("服务器[" + selServer + "] 二进制转换JSON完成!")
}
)
}
// JSON转二进制
function TransJSONToData() {
var transDataInput = document.getElementById("transDataInput")
if (transDataInput.value == "") {
showMessage("请输入表名")
return
}
var tbTypeSelect = document.getElementById("tbTypeSelect")
HttpGet(monitorServerIp, monitorServerPort, "transData?serverNode=" + selServer +"&tbName="
+ transDataInput.value + "&tbType=" + tbTypeSelect.value + "&transType=2",
function () {
showMessage("服务器[" + selServer + "] JSON转换二进制完成!")
}
)
}