添加项目文件。
This commit is contained in:
@@ -0,0 +1,948 @@
|
||||
|
||||
<title>房间管理</title>
|
||||
|
||||
<div class="layui-card layadmin-header">
|
||||
<div class="layui-breadcrumb" lay-filter="breadcrumb">
|
||||
<a lay-href="">主页</a>
|
||||
<a><cite>游戏管理</cite></a>
|
||||
<a><cite>房间管理</cite></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-fluid">
|
||||
<!-- Tab切换 -->
|
||||
<div class="layui-tab layui-tab-brief" lay-filter="room-tab-filter">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this" lay-id="fish">捕鱼房间</li>
|
||||
<li lay-id="chess">象棋房间</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<!-- 捕鱼房间 -->
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="layui-form layui-card-header layuiadmin-card-header-auto" lay-filter="layadmin-room-formlist">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">房间等级</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="roomLevel" id="roomLevelFilter">
|
||||
<option value="">全部</option>
|
||||
<option value="1">初级场</option>
|
||||
<option value="2">中级场</option>
|
||||
<option value="3">高级场</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">游戏类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="gameType" id="gameTypeFilter">
|
||||
<option value="">全部</option>
|
||||
<option value="1">风雷之渊</option>
|
||||
<option value="2">永夜尸城</option>
|
||||
<option value="3">中国象棋</option>
|
||||
<option value="4">星际迷航</option>
|
||||
<option value="5">黑神话悟空</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">排序方式</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="sortField" id="sortFieldFilter">
|
||||
<option value="roomId" selected>按房间号</option>
|
||||
<option value="currentOnline">按当前在线</option>
|
||||
<option value="robotCount">按机器人数量</option>
|
||||
<option value="roomLevel">按房间等级</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="sortOrder" id="sortOrderFilter">
|
||||
<option value="asc" selected>升序</option>
|
||||
<option value="desc">降序</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn" lay-submit lay-filter="LAY-room-search">
|
||||
<i class="layui-icon layui-icon-search"></i> 查询
|
||||
</button>
|
||||
<button class="layui-btn layui-btn-primary" id="LAY-room-refresh">
|
||||
<i class="layui-icon layui-icon-refresh"></i> 刷新
|
||||
</button>
|
||||
<button class="layui-btn layui-btn-normal" id="LAY-room-auto-refresh">
|
||||
<i class="layui-icon layui-icon-loading"></i> 自动刷新:关
|
||||
</button>
|
||||
<button class="layui-btn layui-btn-warm" id="LAY-room-init">
|
||||
<i class="layui-icon layui-icon-util"></i> 初始化房间
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md3">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">总房间数</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<h3 id="stat-total-rooms">0</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">在线玩家</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<h3 id="stat-total-players" style="color: #5FB878;">0</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">机器人</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<h3 id="stat-total-robots" style="color: #FFB800;">0</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md3">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">总人数</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<h3 id="stat-total-count" style="color: #1E9FFF;">0</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<button class="layui-btn layui-btn-normal" id="btn-regenerate-bot-ids">
|
||||
<i class="layui-icon layui-icon-refresh"></i> 一键刷新机器人编号
|
||||
</button>
|
||||
|
||||
<table id="LAY-room-manage" lay-filter="LAY-room-manage"></table>
|
||||
|
||||
<script type="text/html" id="table-room-admin">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="detail">
|
||||
<i class="layui-icon layui-icon-about"></i> 详情
|
||||
</a>
|
||||
<a class="layui-btn layui-btn-xs" lay-event="addRobot">
|
||||
<i class="layui-icon layui-icon-add-1"></i> 添加机器人
|
||||
</a>
|
||||
<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="setRobot">
|
||||
<i class="layui-icon layui-icon-set"></i> 设置机器人
|
||||
</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="clear">
|
||||
<i class="layui-icon layui-icon-close"></i> 清空玩家
|
||||
</a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 象棋房间 -->
|
||||
<div class="layui-tab-item">
|
||||
<div class="layui-form layui-card-header layuiadmin-card-header-auto" lay-filter="layadmin-chess-formlist">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">房间状态</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="state" id="chessStateFilter">
|
||||
<option value="">全部</option>
|
||||
<option value="0">空房</option>
|
||||
<option value="1">待开始</option>
|
||||
<option value="2">进行中</option>
|
||||
<option value="3">已结束</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label">游戏类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="gameType" id="chessGameTypeFilter">
|
||||
<option value="">全部</option>
|
||||
<option value="1">我方黑</option>
|
||||
<option value="2">我方红</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn" lay-submit lay-filter="LAY-chess-search">
|
||||
<i class="layui-icon layui-icon-search"></i> 查询
|
||||
</button>
|
||||
<button class="layui-btn layui-btn-primary" id="LAY-chess-refresh">
|
||||
<i class="layui-icon layui-icon-refresh"></i> 刷新
|
||||
</button>
|
||||
<button class="layui-btn layui-btn-normal" id="LAY-chess-auto-refresh">
|
||||
<i class="layui-icon layui-icon-loading"></i> 自动刷新:关
|
||||
</button>
|
||||
<button class="layui-btn layui-btn-warm" id="LAY-chess-reinit">
|
||||
<i class="layui-icon layui-icon-util"></i> 重新初始化象棋房间
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">总房间数</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<h3 id="chess-stat-total">0</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">空房率</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<h3 id="chess-stat-waiting" style="color: #FFB800;">0</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">进行中</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<h3 id="chess-stat-playing" style="color: #5FB878;">0</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">已结束</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<h3 id="chess-stat-finished" style="color: #999;">0</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">黑方玩家</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<h3 id="chess-stat-black" style="color: #393939;">0</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-col-md2">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">红方玩家</div>
|
||||
<div class="layui-card-body layui-text">
|
||||
<h3 id="chess-stat-red" style="color: #FF5722;">0</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
|
||||
<table id="LAY-chess-room-manage" lay-filter="LAY-chess-room-manage"></table>
|
||||
|
||||
<script type="text/html" id="table-chess-admin">
|
||||
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="detail">
|
||||
<i class="layui-icon layui-icon-about"></i> 详情
|
||||
</a>
|
||||
<a class="layui-btn layui-btn-xs" lay-event="addRobot">
|
||||
<i class="layui-icon layui-icon-add-1"></i> 添加机器人
|
||||
</a>
|
||||
<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="setRobot">
|
||||
<i class="layui-icon layui-icon-edit"></i> 设置机器人
|
||||
</a>
|
||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="clear">
|
||||
<i class="layui-icon layui-icon-close"></i> 清空房间
|
||||
</a>
|
||||
<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="delete">
|
||||
<i class="layui-icon layui-icon-delete"></i> 删除
|
||||
</a>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['admin', 'table', 'form', 'element'], function () {
|
||||
var $ = layui.$,
|
||||
admin = layui.admin,
|
||||
table = layui.table,
|
||||
form = layui.form,
|
||||
element = layui.element,
|
||||
setter = layui.setter,
|
||||
layer = layui.layer;
|
||||
|
||||
var autoRefreshFish = false;
|
||||
var refreshIntervalFish = null;
|
||||
var autoRefreshChess = false;
|
||||
var refreshIntervalChess = null;
|
||||
|
||||
form.render();
|
||||
|
||||
// ============ 捕鱼房间 ============
|
||||
|
||||
table.render({
|
||||
elem: "#LAY-room-manage",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/GetAllRooms",
|
||||
method: "get",
|
||||
headers: {
|
||||
'token': layui.data(setter.tableName)[setter.request.tokenName]
|
||||
},
|
||||
page: { curr: 1, limit: 20 },
|
||||
where: {
|
||||
roomLevel: "",
|
||||
gameType: "",
|
||||
sortField: "roomId",
|
||||
sortOrder: "asc"
|
||||
},
|
||||
request: {
|
||||
pageName: 'pageIndex',
|
||||
limitName: 'pageSize'
|
||||
},
|
||||
limit: 20,
|
||||
cols: [[
|
||||
{ field: "roomId", title: "房间ID", width: 180, fixed: 'left' },
|
||||
{ field: "roomName", title: "房间名称", width: 120 },
|
||||
{ field: "roomLevel", title: "等级", width: 80 },
|
||||
{ field: "roomPartition", title: "分区", width: 70 },
|
||||
{ field: "roomNumber", title: "编号", width: 70 },
|
||||
{ field: "gameType", title: "游戏类型", width: 100 },
|
||||
{ field: "maxPlayerCount", title: "最大人数", width: 90 },
|
||||
{ field: "currentOnlinePlayerCount", title: "当前在线", width: 90, templet: function(d) {
|
||||
var count = d.currentOnlinePlayerCount || 0;
|
||||
return '<span class="layui-badge layui-bg-green">' + count + '</span>';
|
||||
}},
|
||||
{ field: "robotCount", title: "机器人", width: 90, templet: function(d) {
|
||||
var count = d.robotCount || 0;
|
||||
return '<span class="layui-badge layui-bg-orange">' + count + '</span>';
|
||||
}},
|
||||
{
|
||||
field: "players", title: "玩家列表", minWidth: 200, templet: function(d) {
|
||||
if (!d.players || d.players.length === 0) return '-';
|
||||
var names = d.players.map(p => p.userName || p.userId).slice(0, 3);
|
||||
var result = names.join(', ');
|
||||
if (d.players.length > 3) result += ' 等' + d.players.length + '人';
|
||||
return result;
|
||||
}
|
||||
},
|
||||
{ width: 260, title: "操作", align: "center", fixed: "right", toolbar: "#table-room-admin" }
|
||||
]],
|
||||
text: "对不起,加载出现异常!",
|
||||
response: {
|
||||
statusName: 'code',
|
||||
statusCode: 0,
|
||||
msgName: 'info',
|
||||
countName: 'count',
|
||||
dataName: 'data'
|
||||
},
|
||||
done: function(res) {
|
||||
loadStatistics();
|
||||
}
|
||||
});
|
||||
|
||||
function loadStatistics() {
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/GetRoomStatistics",
|
||||
done: function(res) {
|
||||
if (res.code === 0 && res.data) {
|
||||
$('#stat-total-rooms').text(res.data.totalRooms || 0);
|
||||
$('#stat-total-players').text(res.data.totalPlayers || 0);
|
||||
$('#stat-total-robots').text(res.data.totalRobots || 0);
|
||||
$('#stat-total-count').text((res.data.totalPlayers || 0) + (res.data.totalRobots || 0));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
form.on('submit(LAY-room-search)', function (data) {
|
||||
table.reload('LAY-room-manage', {
|
||||
where: {
|
||||
roomLevel: data.field.roomLevel || '',
|
||||
gameType: data.field.gameType || '',
|
||||
sortField: data.field.sortField || 'roomId',
|
||||
sortOrder: data.field.sortOrder || 'desc'
|
||||
},
|
||||
page: { curr: 1 }
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#LAY-room-refresh').on('click', function () {
|
||||
table.reload('LAY-room-manage');
|
||||
});
|
||||
|
||||
$('#btn-regenerate-bot-ids').on('click', function () {
|
||||
layer.confirm('确定要刷新所有机器人的编号吗?机器人将获得新的ID和编号。', function (index) {
|
||||
layer.close(index);
|
||||
var loadIndex = layer.load(2);
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/RegenerateAllBotIds",
|
||||
done: function (res) {
|
||||
layer.close(loadIndex);
|
||||
layer.msg(res.info || '刷新成功');
|
||||
table.reload('LAY-room-manage');
|
||||
},
|
||||
error: function () {
|
||||
layer.close(loadIndex);
|
||||
layer.msg('操作失败');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$('#LAY-room-auto-refresh').on('click', function () {
|
||||
autoRefreshFish = !autoRefreshFish;
|
||||
var btn = $(this);
|
||||
if (autoRefreshFish) {
|
||||
btn.html('<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i> 自动刷新:开');
|
||||
btn.addClass('layui-btn-normal');
|
||||
refreshIntervalFish = setInterval(function () {
|
||||
table.reload('LAY-room-manage', { page: { curr: 1 } });
|
||||
}, 5000);
|
||||
} else {
|
||||
btn.html('<i class="layui-icon layui-icon-loading"></i> 自动刷新:关');
|
||||
btn.removeClass('layui-btn-normal');
|
||||
if (refreshIntervalFish) {
|
||||
clearInterval(refreshIntervalFish);
|
||||
refreshIntervalFish = null;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('#LAY-room-init').on('click', function () {
|
||||
layer.confirm('确定要重新初始化所有房间吗?此操作将清空现有房间数据并重新生成。', function (index) {
|
||||
var btn = $(this);
|
||||
btn.html('<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i> 初始化中...');
|
||||
btn.attr('disabled', true);
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/InitRooms",
|
||||
done: function (res) {
|
||||
layer.close(index);
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.info || '房间初始化成功', { icon: 1 });
|
||||
table.reload('LAY-room-manage');
|
||||
loadStatistics();
|
||||
} else {
|
||||
layer.msg(res.info || '初始化失败');
|
||||
}
|
||||
$('#LAY-room-init').html('<i class="layui-icon layui-icon-util"></i> 初始化房间');
|
||||
$('#LAY-room-init').attr('disabled', false);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
table.on("tool(LAY-room-manage)", function (obj) {
|
||||
var data = obj.data;
|
||||
|
||||
if ("detail" === obj.event) {
|
||||
showFishRoomDetail(data);
|
||||
}
|
||||
|
||||
if ("addRobot" === obj.event) {
|
||||
layer.prompt({
|
||||
title: '添加机器人 - ' + data.roomName,
|
||||
formType: 0
|
||||
}, function (value, index, elem) {
|
||||
var count = parseInt(value) || 0;
|
||||
if (count <= 0) {
|
||||
layer.msg('请输入有效的数量');
|
||||
return;
|
||||
}
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/AddRobot",
|
||||
data: {
|
||||
roomId: data.roomId,
|
||||
count: count
|
||||
},
|
||||
done: function (res) {
|
||||
layer.close(index);
|
||||
layer.msg(res.info || '添加成功');
|
||||
table.reload('LAY-room-manage');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if ("setRobot" === obj.event) {
|
||||
layer.prompt({
|
||||
title: '设置机器人数量 - ' + data.roomName,
|
||||
formType: 0,
|
||||
value: data.robotCount || 0
|
||||
}, function (value, index, elem) {
|
||||
var count = parseInt(value) || 0;
|
||||
if (count < 0) {
|
||||
layer.msg('数量不能为负数');
|
||||
return;
|
||||
}
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/SetRobotCount",
|
||||
data: {
|
||||
roomId: data.roomId,
|
||||
count: count
|
||||
},
|
||||
done: function (res) {
|
||||
layer.close(index);
|
||||
layer.msg(res.info || '设置成功');
|
||||
table.reload('LAY-room-manage');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if ("clear" === obj.event) {
|
||||
layer.confirm('确定清空房间 ' + data.roomName + ' 的所有玩家吗?', function (index) {
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/ClearRoom",
|
||||
data: {
|
||||
roomId: data.roomId
|
||||
},
|
||||
done: function (res) {
|
||||
layer.close(index);
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.info || '清空成功');
|
||||
} else {
|
||||
layer.msg(res.info || '清空失败');
|
||||
}
|
||||
table.reload('LAY-room-manage');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function showFishRoomDetail(room) {
|
||||
var playersHtml = '';
|
||||
if (room.players && room.players.length > 0) {
|
||||
playersHtml = '<table class="layui-table"><thead><tr><th>玩家ID</th><th>昵称</th><th>金币</th><th>炮倍</th><th>位置</th></tr></thead><tbody>';
|
||||
room.players.forEach(function (p) {
|
||||
playersHtml += '<tr><td>' + (p.userId || '-') + '</td><td>' + (p.userName || '-') + '</td><td>' + (p.gold || 0) + '</td><td>' + (p.cannonMultiple || 0) + '</td><td>' + (p.position || 0) + '</td></tr>';
|
||||
});
|
||||
playersHtml += '</tbody></table>';
|
||||
} else {
|
||||
playersHtml = '<p style="text-align:center;color:#999;">暂无玩家</p>';
|
||||
}
|
||||
|
||||
var content =
|
||||
'<div style="padding: 20px;">' +
|
||||
'<fieldset class="layui-elem-field">' +
|
||||
'<legend>房间信息</legend>' +
|
||||
'<div class="layui-field-box">' +
|
||||
'<p>房间ID:' + (room.roomId || '-') + '</p>' +
|
||||
'<p>房间名称:' + (room.roomName || '-') + '</p>' +
|
||||
'<p>游戏类型:' + (room.gameType || '-') + '</p>' +
|
||||
'<p>房间等级:' + (room.roomLevel || '-') + '</p>' +
|
||||
'<p>房间分区:' + (room.roomPartition || '-') + '</p>' +
|
||||
'<p>房间编号:' + (room.roomNumber || '-') + '</p>' +
|
||||
'<p>最大人数:' + (room.maxPlayerCount || 0) + '</p>' +
|
||||
'<p>当前在线:' + (room.currentOnlinePlayerCount || 0) + '</p>' +
|
||||
'<p>机器人数:' + (room.robotCount || 0) + '</p>' +
|
||||
'</div>' +
|
||||
'</fieldset>' +
|
||||
'<fieldset class="layui-elem-field">' +
|
||||
'<legend>玩家列表 (' + (room.players ? room.players.length : 0) + '人)</legend>' +
|
||||
'<div class="layui-field-box">' +
|
||||
playersHtml +
|
||||
'</div>' +
|
||||
'</fieldset>' +
|
||||
'</div>';
|
||||
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: '房间详情',
|
||||
area: ['700px', '600px'],
|
||||
content: content
|
||||
});
|
||||
}
|
||||
|
||||
// ============ 象棋房间 ============
|
||||
|
||||
function renderChessTable(state, gameType) {
|
||||
table.render({
|
||||
elem: "#LAY-chess-room-manage",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/GetAllChessRooms",
|
||||
method: "get",
|
||||
headers: {
|
||||
'token': layui.data(setter.tableName)[setter.request.tokenName]
|
||||
},
|
||||
page: true,
|
||||
where: {
|
||||
state: state || "",
|
||||
gameType: gameType || ""
|
||||
},
|
||||
request: {
|
||||
pageName: 'pageIndex',
|
||||
limitName: 'pageSize'
|
||||
},
|
||||
limit: 20,
|
||||
parseData: function(res) {
|
||||
console.log('象棋房间数据:', res);
|
||||
return {
|
||||
"code": res.code,
|
||||
"msg": res.info,
|
||||
"count": res.count,
|
||||
"data": res.data || []
|
||||
};
|
||||
},
|
||||
cols: [[
|
||||
{ field: "roomId", title: "房间ID", width: 200, fixed: 'left', templet: function(d) {
|
||||
return d.roomId || '-';
|
||||
}},
|
||||
{ field: "state", title: "状态", width: 100, templet: function(d) {
|
||||
var stateMap = {0: '<span class="layui-badge layui-bg-blue">空房</span>', 1: '<span class="layui-badge layui-bg-orange">待开始</span>', 2: '<span class="layui-badge layui-bg-green">进行中</span>', 3: '<span class="layui-badge layui-bg-gray">已结束</span>'};
|
||||
return stateMap[d.state] || '-';
|
||||
}},
|
||||
{ field: "gameType", title: "游戏类型", width: 100, templet: function(d) {
|
||||
return d.gameType === 1 ? '我方黑' : '我方红';
|
||||
}},
|
||||
{ field: "gold", title: "房间金币", width: 120 },
|
||||
{ field: "password", title: "密码", width: 100, templet: function(d) {
|
||||
return d.password ? '<span class="layui-badge">有密码</span>' : '<span class="layui-badge layui-bg-green">无</span>';
|
||||
}},
|
||||
{ field: "createTime", title: "创建时间", width: 170, templet: function(d) {
|
||||
var ct = d.createTime || d.CreateTime;
|
||||
if (!ct) return '-';
|
||||
var date = new Date(ct);
|
||||
return date.getFullYear() + '-' +
|
||||
String(date.getMonth() + 1).padStart(2, '0') + '-' +
|
||||
String(date.getDate()).padStart(2, '0') + ' ' +
|
||||
String(date.getHours()).padStart(2, '0') + ':' +
|
||||
String(date.getMinutes()).padStart(2, '0') + ':' +
|
||||
String(date.getSeconds()).padStart(2, '0');
|
||||
}},
|
||||
{ field: "userCount", title: "玩家数", width: 80, templet: function(d) {
|
||||
var count = (d.users && d.users.length) || 0;
|
||||
return '<span class="layui-badge">' + count + '/2</span>';
|
||||
}},
|
||||
{ field: "robotCount", title: "机器人", width: 80, templet: function(d) {
|
||||
var count = d.robotCount || 0;
|
||||
return '<span class="layui-badge layui-bg-orange">' + count + '</span>';
|
||||
}},
|
||||
{ field: "users", title: "玩家信息", minWidth: 250, templet: function(d) {
|
||||
if (!d.users || d.users.length === 0) return '<span style="color:#999;">暂无玩家</span>';
|
||||
var html = '<div style="display:flex;gap:10px;">';
|
||||
d.users.forEach(function(u) {
|
||||
var side = u.type === 1 ? '黑方' : '红方';
|
||||
var ready = u.isReady ? '<span class="layui-badge layui-bg-green">已准备</span>' : '<span class="layui-badge layui-bg-gray">未准备</span>';
|
||||
html += '<div style="background:#f5f5f5;padding:5px 10px;border-radius:3px;">' +
|
||||
'<div style="font-weight:bold;">' + (u.userName || u.userId) + '</div>' +
|
||||
'<div style="font-size:12px;color:#666;">' + side + '</div>' +
|
||||
'<div style="font-size:12px;">' + ready + '</div>' +
|
||||
'</div>';
|
||||
});
|
||||
html += '</div>';
|
||||
return html;
|
||||
}},
|
||||
{ width: 220, title: "操作", align: "center", fixed: "right", toolbar: "#table-chess-admin" }
|
||||
]],
|
||||
text: "对不起,加载出现异常!",
|
||||
response: {
|
||||
statusName: 'code',
|
||||
statusCode: 0,
|
||||
msgName: 'info',
|
||||
countName: 'count',
|
||||
dataName: 'data'
|
||||
},
|
||||
done: function(res) {
|
||||
loadChessStatistics();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadChessStatistics() {
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/GetChessRoomStatistics",
|
||||
done: function(res) {
|
||||
if (res.code === 0 && res.data) {
|
||||
$('#chess-stat-total').text(res.data.totalRooms || 0);
|
||||
$('#chess-stat-waiting').text((res.data.emptyRooms || 0) + ' (' + (res.data.emptyRoomRate || 0) + '%)');
|
||||
$('#chess-stat-playing').text(res.data.playingRooms || 0);
|
||||
$('#chess-stat-finished').text(res.data.finishedRooms || 0);
|
||||
$('#chess-stat-black').text(res.data.blackSidePlayers || 0);
|
||||
$('#chess-stat-red').text(res.data.redSidePlayers || 0);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
form.on('submit(LAY-chess-search)', function (data) {
|
||||
renderChessTable(data.field.state, data.field.gameType);
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#LAY-chess-refresh').on('click', function () {
|
||||
table.reload('LAY-chess-room-manage');
|
||||
});
|
||||
|
||||
$('#LAY-chess-reinit').on('click', function () {
|
||||
layer.confirm('确定要清空所有象棋房间并重新初始化吗?此操作不可恢复!', function (index) {
|
||||
var btn = $(this);
|
||||
btn.html('<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i> 初始化中...');
|
||||
btn.attr('disabled', true);
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/ReInitChessRooms",
|
||||
done: function (res) {
|
||||
layer.close(index);
|
||||
if (res.code === 0 || res.code === 200) {
|
||||
layer.msg(res.info || '初始化成功', { icon: 1 });
|
||||
table.reload('LAY-chess-room-manage');
|
||||
loadChessStatistics();
|
||||
} else {
|
||||
layer.msg(res.info || '初始化失败');
|
||||
}
|
||||
$('#LAY-chess-reinit').html('<i class="layui-icon layui-icon-util"></i> 重新初始化象棋房间');
|
||||
$('#LAY-chess-reinit').attr('disabled', false);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$('#LAY-chess-auto-refresh').on('click', function () {
|
||||
autoRefreshChess = !autoRefreshChess;
|
||||
var btn = $(this);
|
||||
if (autoRefreshChess) {
|
||||
btn.html('<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i> 自动刷新:开');
|
||||
btn.addClass('layui-btn-normal');
|
||||
refreshIntervalChess = setInterval(function () {
|
||||
table.reload('LAY-chess-room-manage');
|
||||
}, 5000);
|
||||
} else {
|
||||
btn.html('<i class="layui-icon layui-icon-loading"></i> 自动刷新:关');
|
||||
btn.removeClass('layui-btn-normal');
|
||||
if (refreshIntervalChess) {
|
||||
clearInterval(refreshIntervalChess);
|
||||
refreshIntervalChess = null;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
table.on("tool(LAY-chess-room-manage)", function (obj) {
|
||||
var data = obj.data;
|
||||
|
||||
if ("detail" === obj.event) {
|
||||
showChessRoomDetail(data);
|
||||
}
|
||||
|
||||
if ("clear" === obj.event) {
|
||||
layer.confirm('确定清空房间 ' + data.roomId + ' 的所有玩家吗?', function (index) {
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/ClearChessRoom",
|
||||
data: {
|
||||
roomId: data.roomId
|
||||
},
|
||||
done: function (res) {
|
||||
layer.close(index);
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.info || '清空成功');
|
||||
} else {
|
||||
layer.msg(res.info || '清空失败');
|
||||
}
|
||||
table.reload('LAY-chess-room-manage');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
if ("addRobot" === obj.event) {
|
||||
layer.prompt({
|
||||
title: '添加机器人 - ' + data.roomId,
|
||||
formType: 0
|
||||
}, function (value, index, elem) {
|
||||
var count = parseInt(value) || 0;
|
||||
if (count <= 0) {
|
||||
layer.msg('请输入有效的数量');
|
||||
return;
|
||||
}
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/AddChessRobot",
|
||||
data: {
|
||||
roomId: data.roomId,
|
||||
count: count
|
||||
},
|
||||
done: function (res) {
|
||||
layer.close(index);
|
||||
layer.msg(res.info || '添加成功');
|
||||
table.reload('LAY-chess-room-manage');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if ("setRobot" === obj.event) {
|
||||
var currentCount = data.robotCount || 0;
|
||||
layer.prompt({
|
||||
title: '设置机器人数量 - ' + data.roomId + ' (当前: ' + currentCount + ')',
|
||||
formType: 0,
|
||||
value: currentCount
|
||||
}, function (value, index, elem) {
|
||||
var count = parseInt(value);
|
||||
if (isNaN(count) || count < 0 || count > 2) {
|
||||
layer.msg('请输入0~2的整数');
|
||||
return;
|
||||
}
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/SetChessRobot",
|
||||
data: {
|
||||
roomId: data.roomId,
|
||||
count: count
|
||||
},
|
||||
done: function (res) {
|
||||
layer.close(index);
|
||||
layer.msg(res.info || '设置成功');
|
||||
table.reload('LAY-chess-room-manage');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if ("delete" === obj.event) {
|
||||
layer.confirm('确定删除房间 ' + data.roomId + ' 吗?此操作不可恢复!', function (index) {
|
||||
admin.req({
|
||||
method: "get",
|
||||
url: setter.baseurl + "adminapi/Admin/Room/DeleteChessRoom",
|
||||
data: {
|
||||
roomId: data.roomId
|
||||
},
|
||||
done: function (res) {
|
||||
layer.close(index);
|
||||
layer.msg(res.info || '删除成功');
|
||||
table.reload('LAY-chess-room-manage');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function showChessRoomDetail(room) {
|
||||
var stateMap = {0: '空房', 1: '待开始', 2: '进行中', 3: '已结束'};
|
||||
var typeMap = {1: '我方黑', 2: '我方红'};
|
||||
|
||||
var usersHtml = '';
|
||||
if (room.users && room.users.length > 0) {
|
||||
usersHtml = '<table class="layui-table"><thead><tr><th>玩家ID</th><th>昵称</th><th>阵营</th><th>状态</th><th>金币</th><th>操作</th></tr></thead><tbody>';
|
||||
room.users.forEach(function (u) {
|
||||
usersHtml += '<tr>' +
|
||||
'<td>' + (u.userId || '-') + '</td>' +
|
||||
'<td>' + (u.userName || '-') + '</td>' +
|
||||
'<td>' + (typeMap[u.type] || '-') + '</td>' +
|
||||
'<td>' + (u.isReady ? '已准备' : '未准备') + '</td>' +
|
||||
'<td>' + (u.gold || 0) + '</td>' +
|
||||
'<td><button type="button" class="layui-btn layui-btn-danger layui-btn-xs chess-kick-player" ' +
|
||||
'data-room-id="' + (room.roomId || room.RoomId || '') + '" data-user-id="' + (u.userId || '') + '" ' +
|
||||
(room.state === 2 ? 'disabled title="游戏进行中不能踢人"' : '') + '>踢出</button></td>' +
|
||||
'</tr>';
|
||||
});
|
||||
usersHtml += '</tbody></table>';
|
||||
} else {
|
||||
usersHtml = '<p style="text-align:center;color:#999;">暂无玩家</p>';
|
||||
}
|
||||
|
||||
var createTimeStr = '-';
|
||||
var ct = room.createTime || room.CreateTime;
|
||||
if (ct) {
|
||||
var date = new Date(ct);
|
||||
createTimeStr = date.getFullYear() + '-' +
|
||||
String(date.getMonth() + 1).padStart(2, '0') + '-' +
|
||||
String(date.getDate()).padStart(2, '0') + ' ' +
|
||||
String(date.getHours()).padStart(2, '0') + ':' +
|
||||
String(date.getMinutes()).padStart(2, '0') + ':' +
|
||||
String(date.getSeconds()).padStart(2, '0');
|
||||
}
|
||||
|
||||
var content =
|
||||
'<div style="padding: 20px;">' +
|
||||
'<fieldset class="layui-elem-field">' +
|
||||
'<legend>房间信息</legend>' +
|
||||
'<div class="layui-field-box">' +
|
||||
'<p>房间ID:' + (room.roomId || room.RoomId || '-') + '</p>' +
|
||||
'<p>房间状态:' + (stateMap[room.state] || '-') + '</p>' +
|
||||
'<p>游戏类型:' + (typeMap[room.gameType] || '-') + '</p>' +
|
||||
'<p>房间金币:' + (room.gold || 0) + '</p>' +
|
||||
'<p>密码:' + (room.password ? room.password : '无') + '</p>' +
|
||||
'<p>创建时间:' + createTimeStr + '</p>' +
|
||||
'<p>机器人数:' + (room.robotCount || 0) + '</p>' +
|
||||
'<p>创建者:' + (room.createUserId || '-') + '</p>' +
|
||||
'</div>' +
|
||||
'</fieldset>' +
|
||||
'<fieldset class="layui-elem-field">' +
|
||||
'<legend>玩家列表 (' + ((room.users && room.users.length) || 0) + '人)</legend>' +
|
||||
'<div class="layui-field-box">' +
|
||||
usersHtml +
|
||||
'</div>' +
|
||||
'</fieldset>' +
|
||||
'</div>';
|
||||
|
||||
layer.open({
|
||||
type: 1,
|
||||
title: '象棋房间详情',
|
||||
area: ['700px', '600px'],
|
||||
content: content,
|
||||
success: function(layero, index) {
|
||||
layero.find('.chess-kick-player').on('click', function() {
|
||||
var button = $(this);
|
||||
var roomId = button.attr('data-room-id');
|
||||
var userId = button.attr('data-user-id');
|
||||
if (button.prop('disabled')) return;
|
||||
layer.confirm('确定将玩家 ' + userId + ' 踢出房间 ' + roomId + ' 吗?', function(confirmIndex) {
|
||||
button.prop('disabled', true);
|
||||
admin.req({
|
||||
method: 'get',
|
||||
url: setter.baseurl + 'adminapi/Admin/Room/KickChessPlayer',
|
||||
data: { roomId: roomId, userId: userId },
|
||||
done: function(res) {
|
||||
layer.close(confirmIndex);
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.info || '踢人指令已提交', { icon: 1 });
|
||||
layer.close(index);
|
||||
setTimeout(function() {
|
||||
table.reload('LAY-chess-room-manage');
|
||||
loadChessStatistics();
|
||||
}, 800);
|
||||
} else {
|
||||
button.prop('disabled', false);
|
||||
layer.msg(res.info || '踢人失败', { icon: 2 });
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 页面切换时渲染象棋表格
|
||||
element.on('tab(room-tab-filter)', function(data){
|
||||
if (data.index === 1) {
|
||||
renderChessTable('', '');
|
||||
}
|
||||
});
|
||||
|
||||
// 页面卸载时清除定时器
|
||||
$(window).on('unload', function () {
|
||||
if (refreshIntervalFish) clearInterval(refreshIntervalFish);
|
||||
if (refreshIntervalChess) clearInterval(refreshIntervalChess);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user