添加项目文件。

This commit is contained in:
2026-10-12 16:22:04 +08:00
parent 7c68a0ca0a
commit aad11be43d
1000 changed files with 120807 additions and 0 deletions
@@ -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>