diff --git a/ShengShengBuXi/Hubs/AudioHub.cs b/ShengShengBuXi/Hubs/AudioHub.cs index 9238239..7aeb927 100644 --- a/ShengShengBuXi/Hubs/AudioHub.cs +++ b/ShengShengBuXi/Hubs/AudioHub.cs @@ -908,6 +908,11 @@ namespace ShengShengBuXi.Hubs public async Task AddDisplayList(string text) { + if (text.Contains("青竹园")) + { + + return false; + } var id = Guid.NewGuid(); _displayTextQueue.TryAdd(id, new DisplayText() { @@ -2329,5 +2334,80 @@ namespace ShengShengBuXi.Hubs // 发送预设句子2列表 await Clients.Caller.SendAsync("ReceivePresetSentences2", _presetSentences2); } + + /// + /// 获取显示队列数据 + /// + /// 处理任务 + public async Task GetDisplayQueue() + { + if (!_clients.TryGetValue(Context.ConnectionId, out var clientInfo)) + { + _logger.LogWarning($"未注册的客户端尝试获取显示队列数据: {Context.ConnectionId}"); + await Clients.Caller.SendAsync("Error", "请先注册客户端"); + return; + } + + if (clientInfo.ClientType != ClientType.WebAdmin && clientInfo.ClientType != ClientType.Monitor) + { + _logger.LogWarning($"非管理端或监控端客户端尝试获取显示队列数据: {Context.ConnectionId}, 类型: {clientInfo.ClientType}"); + await Clients.Caller.SendAsync("Error", "只有管理端或监控端客户端可以获取显示队列数据"); + return; + } + + _logger.LogInformation($"获取显示队列数据: {Context.ConnectionId}"); + + // 获取显示队列数据 + var displayItems = _displayTextQueue.Values.OrderBy(it => it.Timestamp).ToList(); + + // 转换文件路径为URL路径 + foreach (var item in displayItems) + { + ConvertFilePathsToUrls(item); + } + + // 发送显示队列数据 + await Clients.Caller.SendAsync("ReceiveDisplayQueue", displayItems); + } + + /// + /// 删除显示队列项 + /// + /// 要删除的项目ID + /// 是否删除成功 + public async Task DeleteDisplayItem(string id) + { + if (!_clients.TryGetValue(Context.ConnectionId, out var clientInfo)) + { + _logger.LogWarning($"未注册的客户端尝试删除显示队列项: {Context.ConnectionId}"); + return false; + } + + if (clientInfo.ClientType != ClientType.WebAdmin && clientInfo.ClientType != ClientType.Monitor) + { + _logger.LogWarning($"非管理端或监控端客户端尝试删除显示队列项: {Context.ConnectionId}, 类型: {clientInfo.ClientType}"); + return false; + } + + if (string.IsNullOrEmpty(id) || !Guid.TryParse(id, out Guid itemId)) + { + _logger.LogWarning($"无效的显示队列项ID: {id}"); + return false; + } + + _logger.LogInformation($"删除显示队列项: {Context.ConnectionId}, ID: {itemId}"); + + // 从队列中移除项目 + if (_displayTextQueue.TryRemove(itemId, out _)) + { + _logger.LogInformation($"成功删除显示队列项: {itemId}"); + return true; + } + else + { + _logger.LogWarning($"无法从显示队列中移除项目: {itemId}"); + return false; + } + } } } \ No newline at end of file diff --git a/ShengShengBuXi/Pages/Admin.cshtml b/ShengShengBuXi/Pages/Admin.cshtml index 9e86cb2..259d262 100644 --- a/ShengShengBuXi/Pages/Admin.cshtml +++ b/ShengShengBuXi/Pages/Admin.cshtml @@ -75,6 +75,14 @@ 大屏文本->文本2 + +
@@ -623,6 +631,40 @@
+ +
+
+
+

显示队列管理

+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + +
序号时间类型内容录音操作
暂无显示队列数据
+
+
+
+
+
@@ -1579,6 +1621,13 @@ log("预设句子2保存结果: " + message); showMessage(message, success ? "success" : "danger"); }); + + // 接收显示队列数据 + connection.on("ReceiveDisplayQueue", (displayItems) => { + log("接收到显示队列数据,数量: " + (displayItems ? displayItems.length : 0)); + updateDisplayQueueTable(displayItems); + showMessage("成功获取显示队列数据", "success"); + }); } // 更新客户端列表 @@ -2020,6 +2069,107 @@ } }); + // 切换到显示队列标签页时自动获取队列数据 + document.getElementById('display-queue-tab').addEventListener('click', function () { + if (connection && connection.state === signalR.HubConnectionState.Connected) { + log("切换到显示队列标签页,自动获取队列数据"); + setTimeout(getDisplayQueue, 500); + } + }); + + // 获取显示队列数据 + function getDisplayQueue() { + if (!connection || connection.state !== signalR.HubConnectionState.Connected) { + showMessage("无法获取显示队列:未连接到服务器", "warning"); + return; + } + + log("正在获取显示队列数据..."); + + connection.invoke("GetDisplayQueue") + .then(() => { + log("已成功发送获取显示队列数据请求"); + }) + .catch(err => { + log("获取显示队列数据失败: " + err); + showMessage("获取显示队列数据失败: " + err, "danger"); + }); + } + + // 更新显示队列表格 + function updateDisplayQueueTable(displayItems) { + const tableBody = document.getElementById("display-queue-list"); + + // 清空表格 + tableBody.innerHTML = ""; + + if (!displayItems || displayItems.length === 0) { + const row = document.createElement("tr"); + row.innerHTML = `暂无显示队列数据`; + tableBody.appendChild(row); + return; + } + + // 添加新数据 + displayItems.forEach((item, index) => { + const row = document.createElement("tr"); + const timestamp = new Date(item.timestamp); + const formattedTime = `${timestamp.getFullYear()}-${(timestamp.getMonth() + 1).toString().padStart(2, '0')}-${timestamp.getDate().toString().padStart(2, '0')} ${timestamp.getHours().toString().padStart(2, '0')}:${timestamp.getMinutes().toString().padStart(2, '0')}:${timestamp.getSeconds().toString().padStart(2, '0')}`; + + // 判断是否有录音文件 + const hasRecording = item.recordingPath && item.recordingPath.trim() !== ""; + const audioButton = hasRecording ? + `` : + `无录音`; + + row.innerHTML = ` + ${index + 1} + ${formattedTime} + ${item.isRealUser ? '真实用户' : '预设'} + ${item.text} + ${audioButton} + + `; + tableBody.appendChild(row); + }); + } + + // 删除显示队列项 + function deleteDisplayItem(id) { + if (!connection || connection.state !== signalR.HubConnectionState.Connected) { + showMessage("无法删除显示队列项:未连接到服务器", "warning"); + return; + } + + if (!id) { + showMessage("无效的显示队列项ID", "warning"); + return; + } + + if (!confirm("确认要删除这条显示队列项吗?")) { + return; + } + + log(`正在删除显示队列项: ${id}...`); + + connection.invoke("DeleteDisplayItem", id) + .then(result => { + if (result) { + log("显示队列项删除成功"); + showMessage("显示队列项已成功删除", "success"); + // 刷新显示队列 + getDisplayQueue(); + } else { + log("显示队列项删除失败"); + showMessage("删除显示队列项失败", "danger"); + } + }) + .catch(err => { + log("删除显示队列项失败: " + err); + showMessage("删除显示队列项失败: " + err, "danger"); + }); + } + // 获取预设句子列表 function getPresetSentences() { if (!connection || connection.state !== signalR.HubConnectionState.Connected) { @@ -2080,7 +2230,7 @@ }); } - // 保存预设句子列表 + // 保存预设句子2列表 function savePresetSentences2() { if (!connection || connection.state !== signalR.HubConnectionState.Connected) { showMessage("无法保存预设句子2:未连接到服务器", "warning");