diff --git a/ShengShengBuXi.ConsoleApp/AutoRestart.bat b/ShengShengBuXi.ConsoleApp/AutoRestart.bat index 135da80..343a2ea 100644 --- a/ShengShengBuXi.ConsoleApp/AutoRestart.bat +++ b/ShengShengBuXi.ConsoleApp/AutoRestart.bat @@ -1,9 +1,38 @@ @echo off -echo. +setlocal enabledelayedexpansion + +:: 配置参数 +set LOG_FILE=ShengShengBuXi.log +set MAX_LOG_SIZE=1048576 :: 最大日志大小1MB +set RESTART_DELAY=1 :: 重启延迟(秒) +set APP_NAME=ShengShengBuXi.ConsoleApp.exe + +:: 初始化日志 +if not exist "%LOG_FILE%" ( + echo 日志创建时间: %date% %time% > "%LOG_FILE%" + echo ======================================= >> "%LOG_FILE%" +) :restart -echo start - %date% %time% -start /wait /min ShengShengBuXi.ConsoleApp.exe -echo ext... -timeout /t 0 /nobreak > nul +:: 检查日志大小并轮转 +for %%F in ("%LOG_FILE%") do set LOG_SIZE=%%~zF +if !LOG_SIZE! gtr %MAX_LOG_SIZE% ( + echo 日志文件过大(!LOG_SIZE!字节),正在轮转... >> "%LOG_FILE%" + move /y "%LOG_FILE%" "ShengShengBuXi_%date:/=-%_%time::=-%.log" >nul + echo 新日志创建时间: %date% %time% > "%LOG_FILE%" + echo ======================================= >> "%LOG_FILE%" +) + +:: 记录启动信息 +echo [%date% %time%] 启动 %APP_NAME% >> "%LOG_FILE%" + +:: 启动程序并重定向输出 +start /b /wait "%APP_NAME%" >> "%LOG_FILE%" 2>&1 + +:: 记录退出信息 +echo [%date% %time%] 程序退出,代码: !errorlevel! >> "%LOG_FILE%" +echo [%date% %time%] 将在 %RESTART_DELAY% 秒后重启... >> "%LOG_FILE%" + +:: 延迟后重启 +timeout /t %RESTART_DELAY% /nobreak >nul goto restart \ No newline at end of file diff --git a/ShengShengBuXi.ConsoleApp/Models/AppSettings.cs b/ShengShengBuXi.ConsoleApp/Models/AppSettings.cs index ecd729c..678045d 100644 --- a/ShengShengBuXi.ConsoleApp/Models/AppSettings.cs +++ b/ShengShengBuXi.ConsoleApp/Models/AppSettings.cs @@ -22,6 +22,11 @@ public class AppSettings /// public bool AutoConnectToServer { get; set; } = true; + /// + /// 鏄惁鍏佽绂荤嚎鍚姩 + /// + public bool AllowOfflineStart { get; set; } = false; + /// /// 浠庢枃浠跺姞杞借缃 /// diff --git a/ShengShengBuXi.ConsoleApp/Program.cs b/ShengShengBuXi.ConsoleApp/Program.cs index fb9430f..09b0fd5 100644 --- a/ShengShengBuXi.ConsoleApp/Program.cs +++ b/ShengShengBuXi.ConsoleApp/Program.cs @@ -103,7 +103,42 @@ public class Program if (appSettings.AutoConnectToServer) { Console.WriteLine($"姝e湪杩炴帴鍒版湇鍔″櫒: {appSettings.SignalRHubUrl}"); - await signalRService.StartConnectionAsync(appSettings.SignalRHubUrl); + int retryCount = 0; + bool connected = false; + while (retryCount < 10) + { + try + { + await signalRService.StartConnectionAsync(appSettings.SignalRHubUrl); + connected = true; + break; + } + catch (Exception ex) + { + retryCount++; + Console.WriteLine($"杩炴帴澶辫触 (绗瑊retryCount}娆): {ex.Message}"); + if (retryCount >= 10) + { + if (!appSettings.AllowOfflineStart) + { + Console.WriteLine("杈惧埌鏈澶ч噸璇曟鏁帮紝绋嬪簭灏嗛鍑"); + return; + } + else + { + Console.WriteLine("杈惧埌鏈澶ч噸璇曟鏁帮紝浣嗛厤缃厑璁哥绾垮惎鍔紝灏嗙户缁繍琛"); + break; + } + } + await Task.Delay(1000); + } + } + + if (!connected && !appSettings.AllowOfflineStart) + { + Console.WriteLine("鏃犳硶杩炴帴鍒版湇鍔″櫒涓斾笉鍏佽绂荤嚎鍚姩锛岀▼搴忓皢閫鍑"); + return; + } } // 鍚姩鐢佃瘽浜湇鍔 diff --git a/ShengShengBuXi.ConsoleApp/Services/SignalRService.cs b/ShengShengBuXi.ConsoleApp/Services/SignalRService.cs index b4c5376..d8f878a 100644 --- a/ShengShengBuXi.ConsoleApp/Services/SignalRService.cs +++ b/ShengShengBuXi.ConsoleApp/Services/SignalRService.cs @@ -16,6 +16,9 @@ public class SignalRService : ISignalRService private PhoneBoothConfig _currentConfig; private readonly SemaphoreSlim _semaphore = new(1, 1); private string? _clientId; + private bool _isInitialConnection = true; + private const int MAX_RETRY_COUNT = 10; + private const int RETRY_INTERVAL_MS = 1000; /// /// 杩炴帴鐘舵佹敼鍙樹簨浠 @@ -57,7 +60,16 @@ public class SignalRService : ISignalRService { if (_hubConnection != null) { - return; + try + { + await _hubConnection.StopAsync(); + await _hubConnection.DisposeAsync(); + _hubConnection = null; + } + catch (Exception ex) + { + Console.WriteLine($"鍋滄鏃ц繛鎺ュけ璐: {ex.Message}"); + } } _hubConnection = new HubConnectionBuilder() @@ -68,14 +80,47 @@ public class SignalRService : ISignalRService // 娉ㄥ唽杩炴帴鍏抽棴浜嬩欢 _hubConnection.Closed += async (error) => { - await Task.Delay(new Random().Next(0, 5) * 1000); - ConnectionStateChanged?.Invoke(this, false); - await _hubConnection.StartAsync(); + Console.WriteLine($"SignalR杩炴帴宸插叧闂: {error?.Message ?? "鏈煡鍘熷洜"}"); + + if (_isInitialConnection) + { + // 鍒濆杩炴帴澶辫触锛屽皾璇曢噸杩 + int retryCount = 0; + while (retryCount < MAX_RETRY_COUNT) + { + try + { + Console.WriteLine($"灏濊瘯閲嶆柊杩炴帴鏈嶅姟鍣 (绗瑊retryCount + 1}娆)..."); + await _hubConnection.StartAsync(); + Console.WriteLine("閲嶆柊杩炴帴鎴愬姛"); + ConnectionStateChanged?.Invoke(this, true); + return; + } + catch (Exception ex) + { + retryCount++; + Console.WriteLine($"閲嶈繛澶辫触: {ex.Message}"); + if (retryCount >= MAX_RETRY_COUNT) + { + Console.WriteLine($"杈惧埌鏈澶ч噸璇曟鏁({MAX_RETRY_COUNT})锛岀▼搴忓皢閫鍑"); + Environment.Exit(1); + } + await Task.Delay(RETRY_INTERVAL_MS); + } + } + } + else + { + // 杩愯鏃剁殑杩炴帴鏂紑锛岀洿鎺ラ鍑虹▼搴 + Console.WriteLine("SignalR杩炴帴鏂紑锛岀▼搴忓皢閫鍑"); + Environment.Exit(1); + } }; // 娉ㄥ唽杩炴帴鎭㈠浜嬩欢 _hubConnection.Reconnected += connectionId => { + _isInitialConnection = false; ConnectionStateChanged?.Invoke(this, true); return Task.CompletedTask; }; @@ -120,6 +165,7 @@ public class SignalRService : ISignalRService try { await _hubConnection.StartAsync(); + _isInitialConnection = false; ConnectionStateChanged?.Invoke(this, true); // 杩炴帴鎴愬姛鍚庯紝娉ㄥ唽涓烘帶鍒跺櫒瀹㈡埛绔 @@ -132,6 +178,14 @@ public class SignalRService : ISignalRService { Console.WriteLine($"SignalR杩炴帴澶辫触: {ex.Message}"); ConnectionStateChanged?.Invoke(this, false); + try + { + await _hubConnection.StopAsync(); + await _hubConnection.DisposeAsync(); + _hubConnection = null; + } + catch { /* 蹇界暐娓呯悊鏃剁殑閿欒 */ } + throw; // 鎶涘嚭寮傚父锛岃璋冪敤鑰呭鐞 } } diff --git a/ShengShengBuXi.ConsoleApp/appsettings.json b/ShengShengBuXi.ConsoleApp/appsettings.json index be2a092..529168b 100644 --- a/ShengShengBuXi.ConsoleApp/appsettings.json +++ b/ShengShengBuXi.ConsoleApp/appsettings.json @@ -1,5 +1,6 @@ { - "SignalRHubUrl": "http://115.159.44.16/audiohub", + "SignalRHubUrl": "http://localhost:82/audiohub", "ConfigBackupPath": "config.json", - "AutoConnectToServer": true + "AutoConnectToServer": true, + "AllowOfflineStart": false } diff --git a/ShengShengBuXi/Hubs/AudioHub.cs b/ShengShengBuXi/Hubs/AudioHub.cs index d24914c..cb99c58 100644 --- a/ShengShengBuXi/Hubs/AudioHub.cs +++ b/ShengShengBuXi/Hubs/AudioHub.cs @@ -14,6 +14,7 @@ using Newtonsoft.Json; using ShengShengBuXi.Models; using ShengShengBuXi.Services; using System.Xml.Linq; +using static System.Net.Mime.MediaTypeNames; namespace ShengShengBuXi.Hubs { @@ -963,19 +964,33 @@ namespace ShengShengBuXi.Hubs _presetSentences.Add("鏃跺厜鍖嗗寙娴侀濓紝鎬濆康鍗磋秺鏉ヨ秺娣便"); } } - if (_presetSentencesIndex == -1) + //if (_presetSentencesIndex == -1) + //{ + // _presetSentencesIndex = new Random().Next(_presetSentences.Count); + //} + //if (_presetSentencesIndex >= _presetSentences.Count) + //{ + // _presetSentencesIndex = new Random().Next(_presetSentences.Count); ; + //} + _presetSentences.OrderBy(it => Guid.NewGuid()).ToList().ForEach(item => { - _presetSentencesIndex = new Random().Next(_presetSentences.Count); - } - if (_presetSentencesIndex >= _presetSentences.Count) - { - _presetSentencesIndex = new Random().Next(_presetSentences.Count); ; - } + var displayText = new DisplayText + { + Id = Guid.NewGuid(), + Text = item, + Timestamp = DateTime.Now, + IsRealUser = false, + RecognitionId = "" + }; + //AddRecognizedTextToDisplay(item, false); + _displayTextQueue.TryAdd(displayText.Id, displayText); + //_logger.LogInformation($"娣诲姞棰勮鏂囨湰鍒版樉绀洪槦鍒: {text}"); + }); // 浠庢湭鏈杩戞樉绀鸿繃鐨勫彞瀛愪腑闅忔満閫夋嫨涓鏉 - string randomText = _presetSentences[_presetSentencesIndex]; - AddRecognizedTextToDisplay(randomText, false); - _presetSentencesIndex += new Random().Next(3); + //string randomText = _presetSentences[_presetSentencesIndex]; + + //_presetSentencesIndex += new Random().Next(3); } catch (Exception ex) @@ -1005,11 +1020,7 @@ namespace ShengShengBuXi.Hubs // 鍐欏叆榛樿鐨勯璁惧彞瀛 File.WriteAllLines(_sentencesFilePath, new string[] { - "璁板緱姣忓埌澶忓ぉ鍌嶆櫄锛屾偍灏辨憞鐫钂叉墖鍧愬湪钘ゆ閲岋紝鎶婂垏濂界殑瑗跨摐鏈鐢滈偅鍧楃‖濉炵粰鎴戯紝鑷繁鍗村晝鐫闈犺繎鐨殑鐧界摛锛岃繕绗戠潃璇:澶栧叕灏辩埍杩欏彛锛屾竻鐖姐", - "濂冲効鍟 鑺卞紑浜 浣犲惁鍒颁簡鍚?", - "澶栧叕锛屼綘鍦ㄩ偅杈硅繃鐨勮繕濂戒箞澶у閮藉緢鎯崇О锛岃寰楀父鍥炲鐪嬬湅", - "澶栧叕锛屼粖澶╃獥鍙颁笂鐨勮寜鑾夊紑浜嗭紝鐧界泩鐩堢殑锛屽氨鍍忎互鍓嶆偍鎬诲埆鍦ㄤ腑灞辫鍙h涓婄殑閭f湹銆", - "澶栧叕锛屽贩鍙i偅瀹惰佽尪棣嗘媶浜嗭紝鎮ㄦ渶鐖卞潗鐨勯潬绐椾綅缃啀涔熸壘涓嶅埌浜嗭紝灏卞儚鍐嶄篃鎵句笉鍒版偍涓鏍枫" + }); } diff --git a/ShengShengBuXi/Pages/Index.cshtml b/ShengShengBuXi/Pages/Index.cshtml index 1000d75..67c48ed 100644 --- a/ShengShengBuXi/Pages/Index.cshtml +++ b/ShengShengBuXi/Pages/Index.cshtml @@ -228,7 +228,6 @@ * @@param {string} text - 瑕佹坊鍔犵殑鏂囧瓧 */ function addToHistory(text, id) { - // 妫鏌ユ槸鍚﹂渶瑕佺炕椤 if (checkNeedTurnPage(id)) { let currentPage = $("#magazine").turn("page"); @@ -251,32 +250,25 @@ $('#l_container_' + (currentPage1 - 2)).html(''); $('#r_container_' + (currentPage1 - 1)).html(''); console.log('#r_container_' + (currentPage1 - 1), $('#r_container_' + (currentPage1 - 1))); - }, 300); + }, 600); // 澧炲姞寤舵椂浠ラ厤鍚堟洿鎱㈢殑缈婚〉閫熷害 return false; } const container = $(id); // 鍒涘缓鏂扮殑娈佃惤鍏冪礌 const newP = $('

'); - // 鎻掑叆鍒板鍣ㄧ殑鏈鍓嶉潰 - container.prepend(newP); + // 灏嗘柊娈佃惤娣诲姞鍒板鍣ㄧ殑鏈熬锛堣屼笉鏄紑澶达級 + container.append(newP); - // 浣跨敤鎵撳瓧鏈烘晥鏋滄樉绀烘枃瀛 - let i = 0; - function typeHistoryText() { - if (i < text.length) { - // 鍒涘缓瀛楃 span 骞惰缃垵濮嬮忔槑搴 - const charSpan = $('').text(text.charAt(i)); - charSpan.css('opacity', 0); - newP.append(charSpan); - - // 瀛楃娣″叆鏁堟灉 - charSpan.animate({opacity: 1}, CONFIG.leftContainer.typewriterSpeed * 0.8, function() { - i++; - setTimeout(typeHistoryText, CONFIG.leftContainer.typewriterSpeed * 0.2); - }); - } - } - typeHistoryText(); + // 璁剧疆鍒濆閫忔槑搴︿负0 + newP.css('opacity', 0); + // 璁剧疆鏂囨湰鍐呭 + newP.text(text); + // 鏁存潯鏂囧瓧娓愭樉鏁堟灉 + newP.animate( + { opacity: 1 }, + 1500, // 璁剧疆鍔ㄧ敾鏃堕暱涓1.5绉 + 'swing' + ); return true; } @@ -474,9 +466,10 @@ $('#magazine').turn({ display: 'double', acceleration: true, - pages: numberOfPages, // 璁剧疆鎬婚〉鏁 + pages: numberOfPages, gradients: !$.isTouch, elevation: 50, + duration: 2000, // 澧炲姞缈婚〉鍔ㄧ敾鏃堕暱鍒2000姣锛堝師鏉ョ殑涓ゅ嶏級 when: { // 缈婚〉杩囩▼涓殑鍥炶皟鍑芥暟 turning: function (e, page, view) {