diff --git a/ShengShengBuXi.ConsoleApp/appsettings.json b/ShengShengBuXi.ConsoleApp/appsettings.json
index f1dd3dd..7700478 100644
--- a/ShengShengBuXi.ConsoleApp/appsettings.json
+++ b/ShengShengBuXi.ConsoleApp/appsettings.json
@@ -1,5 +1,5 @@
{
- "SignalRHubUrl": "http://localhost:81/audiohub",
+ "SignalRHubUrl": "http://115.159.44.16/audiohub",
"ConfigBackupPath": "config.json",
"AutoConnectToServer": true,
"AllowOfflineStart": false
diff --git a/ShengShengBuXi/Hubs/AudioHub.cs b/ShengShengBuXi/Hubs/AudioHub.cs
index a8bfcc2..bd09c44 100644
--- a/ShengShengBuXi/Hubs/AudioHub.cs
+++ b/ShengShengBuXi/Hubs/AudioHub.cs
@@ -2130,5 +2130,197 @@ namespace ShengShengBuXi.Hubs
var clients = _clients.Values.ToList();
await Clients.Caller.SendAsync("ClientList", clients);
}
+
+ ///
+ /// 获取预设句子列表
+ ///
+ /// 处理任务
+ public async Task GetPresetSentences()
+ {
+ 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}");
+
+ // 确保列表已加载
+ if (_presetSentences.Count == 0)
+ {
+ LoadPresetSentencesFromFile();
+ }
+
+ // 发送预设句子列表
+ await Clients.Caller.SendAsync("ReceivePresetSentences", _presetSentences);
+ }
+
+ ///
+ /// 保存预设句子列表
+ ///
+ /// 句子列表
+ /// 处理任务
+ public async Task SavePresetSentences(List sentences)
+ {
+ sentences = sentences.Where(it => !string.IsNullOrEmpty(it)).ToList();
+ if (!_clients.TryGetValue(Context.ConnectionId, out var clientInfo))
+ {
+ _logger.LogWarning($"未注册的客户端尝试保存预设句子列表: {Context.ConnectionId}");
+ await Clients.Caller.SendAsync("PresetSentencesSaved", false, "请先注册客户端");
+ return;
+ }
+
+ if (clientInfo.ClientType != ClientType.WebAdmin && clientInfo.ClientType != ClientType.Monitor)
+ {
+ _logger.LogWarning($"非管理端或监控端客户端尝试保存预设句子列表: {Context.ConnectionId}, 类型: {clientInfo.ClientType}");
+ await Clients.Caller.SendAsync("PresetSentencesSaved", false, "只有管理端或监控端客户端可以保存预设句子列表");
+ return;
+ }
+
+ _logger.LogInformation($"保存预设句子列表: {Context.ConnectionId}, 句子数量: {sentences?.Count ?? 0}");
+
+ if (sentences == null)
+ {
+ await Clients.Caller.SendAsync("PresetSentencesSaved", false, "句子列表不能为空");
+ return;
+ }
+
+ try
+ {
+ // 更新内存中的列表
+ _presetSentences.Clear();
+ foreach (var sentence in sentences)
+ {
+ if (!string.IsNullOrWhiteSpace(sentence))
+ {
+ _presetSentences.Add(sentence.Trim());
+ }
+ }
+
+ // 确保目录存在
+ Directory.CreateDirectory(Path.GetDirectoryName(_sentencesFilePath));
+
+ // 保存到文件
+ File.WriteAllLines(_sentencesFilePath, _presetSentences);
+
+ _logger.LogInformation($"成功保存预设句子到文件: {_presetSentences.Count} 条");
+
+ // 通知调用客户端保存成功
+ await Clients.Caller.SendAsync("PresetSentencesSaved", true, $"成功保存 {_presetSentences.Count} 条预设句子");
+
+ // 通知其他管理端和监控端客户端预设句子已更新
+ await Clients.OthersInGroup("webadmin").SendAsync("PresetSentencesUpdated");
+ await Clients.OthersInGroup("monitor").SendAsync("PresetSentencesUpdated");
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"保存预设句子失败: {ex.Message}");
+ await Clients.Caller.SendAsync("PresetSentencesSaved", false, $"保存预设句子失败: {ex.Message}");
+ }
+ }
+
+ ///
+ /// 保存预设句子2列表
+ ///
+ /// 句子列表
+ /// 处理任务
+ public async Task SavePresetSentences2(List sentences)
+ {
+ sentences = sentences.Where(it => !string.IsNullOrEmpty(it)).ToList();
+ if (!_clients.TryGetValue(Context.ConnectionId, out var clientInfo))
+ {
+ _logger.LogWarning($"未注册的客户端尝试保存预设句子2列表: {Context.ConnectionId}");
+ await Clients.Caller.SendAsync("PresetSentences2Saved", false, "请先注册客户端");
+ return;
+ }
+
+ if (clientInfo.ClientType != ClientType.WebAdmin && clientInfo.ClientType != ClientType.Monitor)
+ {
+ _logger.LogWarning($"非管理端或监控端客户端尝试保存预设句子2列表: {Context.ConnectionId}, 类型: {clientInfo.ClientType}");
+ await Clients.Caller.SendAsync("PresetSentences2Saved", false, "只有管理端或监控端客户端可以保存预设句子2列表");
+ return;
+ }
+
+ _logger.LogInformation($"保存预设句子2列表: {Context.ConnectionId}, 句子数量: {sentences?.Count ?? 0}");
+
+ if (sentences == null)
+ {
+ await Clients.Caller.SendAsync("PresetSentences2Saved", false, "句子列表不能为空");
+ return;
+ }
+
+ try
+ {
+ // 更新内存中的列表
+ _presetSentences2.Clear();
+ foreach (var sentence in sentences)
+ {
+ if (!string.IsNullOrWhiteSpace(sentence))
+ {
+ _presetSentences2.Add(sentence.Trim());
+ }
+ }
+
+ // 确保目录存在
+ Directory.CreateDirectory(Path.GetDirectoryName(_sentences2FilePath));
+
+ // 保存到文件
+ File.WriteAllLines(_sentences2FilePath, _presetSentences2);
+
+ _logger.LogInformation($"成功保存预设句子2到文件: {_presetSentences2.Count} 条");
+
+ // 通知调用客户端保存成功
+ await Clients.Caller.SendAsync("PresetSentences2Saved", true, $"成功保存 {_presetSentences2.Count} 条预设句子2");
+
+ // 通知其他管理端和监控端客户端预设句子2已更新
+ await Clients.OthersInGroup("webadmin").SendAsync("PresetSentencesUpdated");
+ await Clients.OthersInGroup("monitor").SendAsync("PresetSentencesUpdated");
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"保存预设句子2失败: {ex.Message}");
+ await Clients.Caller.SendAsync("PresetSentences2Saved", false, $"保存预设句子2失败: {ex.Message}");
+ }
+ }
+
+ ///
+ /// 获取预设句子2列表
+ ///
+ /// 处理任务
+ public async Task GetPresetSentences2()
+ {
+ if (!_clients.TryGetValue(Context.ConnectionId, out var clientInfo))
+ {
+ _logger.LogWarning($"未注册的客户端尝试获取预设句子2列表: {Context.ConnectionId}");
+ await Clients.Caller.SendAsync("Error", "请先注册客户端");
+ return;
+ }
+
+ if (clientInfo.ClientType != ClientType.WebAdmin && clientInfo.ClientType != ClientType.Monitor)
+ {
+ _logger.LogWarning($"非管理端或监控端客户端尝试获取预设句子2列表: {Context.ConnectionId}, 类型: {clientInfo.ClientType}");
+ await Clients.Caller.SendAsync("Error", "只有管理端或监控端客户端可以获取预设句子2列表");
+ return;
+ }
+
+ _logger.LogInformation($"获取预设句子2列表: {Context.ConnectionId}");
+
+ // 确保列表已加载
+ if (_presetSentences2.Count == 0)
+ {
+ LoadPresetSentences2FromFile();
+ }
+
+ // 发送预设句子2列表
+ await Clients.Caller.SendAsync("ReceivePresetSentences2", _presetSentences2);
+ }
}
}
\ No newline at end of file
diff --git a/ShengShengBuXi/Pages/Admin.cshtml b/ShengShengBuXi/Pages/Admin.cshtml
index 751e1a5..71b5514 100644
--- a/ShengShengBuXi/Pages/Admin.cshtml
+++ b/ShengShengBuXi/Pages/Admin.cshtml
@@ -53,6 +53,18 @@
data-bs-target="#user-records" type="button" role="tab" aria-controls="user-records"
aria-selected="false">用户记录
+
+
+
+
+
+
+
+
@@ -548,6 +560,43 @@
+
+
+
+
+
+
大屏文本管理 - 文本集1
+
+
+
+
+
+
+
+
每行一条文本,保存后将覆盖原有内容并写入文件
+
+
+
+
+
+
+
+
+
+
大屏文本管理 - 文本集2
+
+
+
+
+
+
+
+
每行一条文本,保存后将覆盖原有内容并写入文件
+
+
+
+
+
@@ -1476,6 +1525,34 @@
showMessage("解析显示配置失败: " + error, "danger");
}
});
+
+ // 接收预设句子列表
+ connection.on("ReceivePresetSentences", (sentences) => {
+ log("接收到预设句子列表,数量: " + (sentences ? sentences.length : 0));
+ const textArea = document.getElementById("preset-sentences");
+ textArea.value = sentences ? sentences.join('\n') : '';
+ showMessage("成功获取预设句子列表", "success");
+ });
+
+ // 接收预设句子2列表
+ connection.on("ReceivePresetSentences2", (sentences) => {
+ log("接收到预设句子2列表,数量: " + (sentences ? sentences.length : 0));
+ const textArea = document.getElementById("preset-sentences2");
+ textArea.value = sentences ? sentences.join('\n') : '';
+ showMessage("成功获取预设句子2列表", "success");
+ });
+
+ // 预设句子保存结果
+ connection.on("PresetSentencesSaved", (success, message) => {
+ log("预设句子保存结果: " + message);
+ showMessage(message, success ? "success" : "danger");
+ });
+
+ // 预设句子2保存结果
+ connection.on("PresetSentences2Saved", (success, message) => {
+ log("预设句子2保存结果: " + message);
+ showMessage(message, success ? "success" : "danger");
+ });
}
// 更新客户端列表
@@ -1897,5 +1974,103 @@
setTimeout(getClientList, 500);
}
});
+
+ // 切换到大屏文本标签页时自动刷新预设句子
+ document.getElementById('screen-text-tab').addEventListener('click', function () {
+ if (connection && connection.state === signalR.HubConnectionState.Connected) {
+ log("切换到大屏文本标签页,自动刷新预设句子");
+ setTimeout(getPresetSentences, 500);
+ }
+ });
+
+ // 切换到大屏文本2标签页时自动刷新预设句子2
+ document.getElementById('screen-text2-tab').addEventListener('click', function () {
+ if (connection && connection.state === signalR.HubConnectionState.Connected) {
+ log("切换到大屏文本2标签页,自动刷新预设句子2");
+ setTimeout(getPresetSentences2, 500);
+ }
+ });
+
+ // 获取预设句子列表
+ function getPresetSentences() {
+ if (!connection || connection.state !== signalR.HubConnectionState.Connected) {
+ showMessage("无法获取预设句子:未连接到服务器", "warning");
+ return;
+ }
+
+ log("正在获取预设句子列表...");
+
+ connection.invoke("GetPresetSentences")
+ .then(() => {
+ log("已成功发送获取预设句子列表请求");
+ })
+ .catch(err => {
+ log("获取预设句子列表失败: " + err);
+ showMessage("获取预设句子列表失败: " + err, "danger");
+ });
+ }
+
+ // 保存预设句子列表
+ function savePresetSentences() {
+ if (!connection || connection.state !== signalR.HubConnectionState.Connected) {
+ showMessage("无法保存预设句子:未连接到服务器", "warning");
+ return;
+ }
+
+ const textArea = document.getElementById("preset-sentences");
+ const sentences = textArea.value.split('\n').filter(line => line.trim() !== '');
+
+ log(`正在保存预设句子列表,共${sentences.length}条...`);
+
+ connection.invoke("SavePresetSentences", sentences)
+ .then(result => {
+ log("预设句子保存请求已发送");
+ })
+ .catch(err => {
+ log("保存预设句子列表失败: " + err);
+ showMessage("保存预设句子列表失败: " + err, "danger");
+ });
+ }
+
+ // 获取预设句子2列表
+ function getPresetSentences2() {
+ if (!connection || connection.state !== signalR.HubConnectionState.Connected) {
+ showMessage("无法获取预设句子2:未连接到服务器", "warning");
+ return;
+ }
+
+ log("正在获取预设句子2列表...");
+
+ connection.invoke("GetPresetSentences2")
+ .then(() => {
+ log("已成功发送获取预设句子2列表请求");
+ })
+ .catch(err => {
+ log("获取预设句子2列表失败: " + err);
+ showMessage("获取预设句子2列表失败: " + err, "danger");
+ });
+ }
+
+ // 保存预设句子列表
+ function savePresetSentences2() {
+ if (!connection || connection.state !== signalR.HubConnectionState.Connected) {
+ showMessage("无法保存预设句子2:未连接到服务器", "warning");
+ return;
+ }
+
+ const textArea = document.getElementById("preset-sentences2");
+ const sentences = textArea.value.split('\n').filter(line => line.trim() !== '');
+
+ log(`正在保存预设句子2列表,共${sentences.length}条...`);
+
+ connection.invoke("SavePresetSentences2", sentences)
+ .then(result => {
+ log("预设句子2保存请求已发送");
+ })
+ .catch(err => {
+ log("保存预设句子2列表失败: " + err);
+ showMessage("保存预设句子2列表失败: " + err, "danger");
+ });
+ }
}
\ No newline at end of file
diff --git a/ShengShengBuXi/config/sentences.txt b/ShengShengBuXi/config/sentences.txt
index aa7170c..2ee82c1 100644
Binary files a/ShengShengBuXi/config/sentences.txt and b/ShengShengBuXi/config/sentences.txt differ