From 924b98d4739d9a135f3cf30707d40f430e9b3272 Mon Sep 17 00:00:00 2001 From: "GukSang.Jin" Date: Thu, 4 Jun 2026 17:13:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B020260604?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../02_源代码文档_CSI-Z434_V2026.04.17.txt | 16 -- Cardiopulmonarybypasssystems/App.xaml.cs | 16 -- .../Models/PasswordAccessStatus.cs | 16 -- .../Services/IPasswordAccessService.cs | 9 - .../Services/PasswordAccessService.cs | 260 ------------------ .../StartupPasswordWindow.xaml | 137 --------- .../StartupPasswordWindow.xaml.cs | 29 -- .../ViewModels/StartupPasswordViewModel.cs | 132 --------- 8 files changed, 615 deletions(-) delete mode 100644 Cardiopulmonarybypasssystems/Models/PasswordAccessStatus.cs delete mode 100644 Cardiopulmonarybypasssystems/Services/IPasswordAccessService.cs delete mode 100644 Cardiopulmonarybypasssystems/Services/PasswordAccessService.cs delete mode 100644 Cardiopulmonarybypasssystems/StartupPasswordWindow.xaml delete mode 100644 Cardiopulmonarybypasssystems/StartupPasswordWindow.xaml.cs delete mode 100644 Cardiopulmonarybypasssystems/ViewModels/StartupPasswordViewModel.cs diff --git a/Cardiopulmonarybypasssystems/02_源代码文档_CSI-Z434_V2026.04.17.txt b/Cardiopulmonarybypasssystems/02_源代码文档_CSI-Z434_V2026.04.17.txt index 3b705f8..a81faff 100644 --- a/Cardiopulmonarybypasssystems/02_源代码文档_CSI-Z434_V2026.04.17.txt +++ b/Cardiopulmonarybypasssystems/02_源代码文档_CSI-Z434_V2026.04.17.txt @@ -33,30 +33,14 @@ public partial class App : Application var services = new ServiceCollection(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); services.AddSingleton(); services.AddSingleton(); _serviceProvider = services.BuildServiceProvider(); - var passwordAccessService = _serviceProvider.GetRequiredService(); - var passwordStatus = passwordAccessService.GetStatus(); - if (passwordStatus.ShouldPromptAtStartup) - { - var passwordWindow = _serviceProvider.GetRequiredService(); - var passwordResult = passwordWindow.ShowDialog(); - if (passwordResult != true || !passwordAccessService.GetStatus().CanLaunch) - { - Shutdown(); - return; - } - } - var mainWindow = _serviceProvider.GetRequiredService(); mainWindow.Show(); } diff --git a/Cardiopulmonarybypasssystems/App.xaml.cs b/Cardiopulmonarybypasssystems/App.xaml.cs index 73eb7b7..557a18d 100644 --- a/Cardiopulmonarybypasssystems/App.xaml.cs +++ b/Cardiopulmonarybypasssystems/App.xaml.cs @@ -19,30 +19,14 @@ public partial class App : Application var services = new ServiceCollection(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); services.AddSingleton(); services.AddSingleton(); _serviceProvider = services.BuildServiceProvider(); - var passwordAccessService = _serviceProvider.GetRequiredService(); - var passwordStatus = passwordAccessService.GetStatus(); - if (passwordStatus.ShouldPromptAtStartup) - { - var passwordWindow = _serviceProvider.GetRequiredService(); - var passwordResult = passwordWindow.ShowDialog(); - if (passwordResult != true || !passwordAccessService.GetStatus().CanLaunch) - { - Shutdown(); - return; - } - } - var mainWindow = _serviceProvider.GetRequiredService(); mainWindow.Show(); } diff --git a/Cardiopulmonarybypasssystems/Models/PasswordAccessStatus.cs b/Cardiopulmonarybypasssystems/Models/PasswordAccessStatus.cs deleted file mode 100644 index 5ea45c8..0000000 --- a/Cardiopulmonarybypasssystems/Models/PasswordAccessStatus.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Cardiopulmonarybypasssystems.Models; - -public sealed class PasswordAccessStatus -{ - public int Stage { get; init; } - public bool CanLaunch { get; init; } - public bool IsPermanent { get; init; } - public bool ShouldPromptAtStartup { get; init; } - public bool CanSubmitPassword { get; init; } - public bool RequiresPassword => !CanLaunch; - public string StageText { get; init; } = string.Empty; - public string StatusTitle { get; init; } = string.Empty; - public string StatusDetail { get; init; } = string.Empty; - public int RemainingDays { get; init; } - public DateTime? ExpiresAt { get; init; } -} diff --git a/Cardiopulmonarybypasssystems/Services/IPasswordAccessService.cs b/Cardiopulmonarybypasssystems/Services/IPasswordAccessService.cs deleted file mode 100644 index 21c1d1f..0000000 --- a/Cardiopulmonarybypasssystems/Services/IPasswordAccessService.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Cardiopulmonarybypasssystems.Models; - -namespace Cardiopulmonarybypasssystems.Services; - -public interface IPasswordAccessService -{ - PasswordAccessStatus GetStatus(); - bool TryUnlock(string password, out PasswordAccessStatus status, out string message); -} diff --git a/Cardiopulmonarybypasssystems/Services/PasswordAccessService.cs b/Cardiopulmonarybypasssystems/Services/PasswordAccessService.cs deleted file mode 100644 index f8b91ed..0000000 --- a/Cardiopulmonarybypasssystems/Services/PasswordAccessService.cs +++ /dev/null @@ -1,260 +0,0 @@ -using System.IO; -using System.Text.Json; -using Cardiopulmonarybypasssystems.Models; - -namespace Cardiopulmonarybypasssystems.Services; - -public sealed class PasswordAccessService : IPasswordAccessService -{ - private const int ExpirationReminderDays = 3; - private const string SettingsDirectoryName = "Cardiopulmonarybypasssystems"; - private const string StatusFileName = "password-access.json"; - public const string FirstStagePassword = "152026001"; - public const string SecondStagePassword = "302026002"; - private const int InitialAccessDays = 20; - private const int ExtendedAccessDays = 30; - - private static readonly string StatusFilePath = Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), - SettingsDirectoryName, - StatusFileName); - - public PasswordAccessStatus GetStatus() - { - var state = LoadOrCreateState(); - return BuildStatus(state, persistState: true); - } - - public bool TryUnlock(string password, out PasswordAccessStatus status, out string message) - { - var normalizedPassword = password?.Trim() ?? string.Empty; - var state = LoadOrCreateState(); - var currentStatus = BuildStatus(state, persistState: true); - - if (currentStatus.IsPermanent) - { - status = currentStatus; - message = "当前版本已永久有效,不需要再输入密码。"; - return true; - } - - if (currentStatus.CanLaunch) - { - status = currentStatus; - message = currentStatus.ShouldPromptAtStartup - ? $"当前仍在有效期内,可直接进入系统;满 {GetStageDays(currentStatus.Stage)} 天后再输入密码。" - : $"{GetStageName(currentStatus.Stage)}仍在有效期内,无需再次输入密码。"; - return false; - } - - var expectedPassword = currentStatus.Stage switch - { - 0 => FirstStagePassword, - 1 => SecondStagePassword, - _ => string.Empty - }; - - if (!string.Equals(normalizedPassword, expectedPassword, StringComparison.Ordinal)) - { - status = currentStatus; - message = currentStatus.Stage switch - { - 0 => "密码错误,请输入第 1 次时效密码。", - 1 => "密码错误,请输入第 2 次时效密码。", - _ => "密码错误。" - }; - return false; - } - - var now = DateTime.Now; - - if (currentStatus.Stage == 1) - { - var permanentState = new PasswordAccessState - { - Stage = 2, - ActivatedAt = state?.ActivatedAt ?? now, - ExpiresAt = null - }; - - SaveState(permanentState); - status = BuildStatus(permanentState, persistState: false); - message = "第 2 次密码验证通过,系统已永久有效。"; - return true; - } - - var expiresAt = now.AddDays(ExtendedAccessDays); - var nextState = new PasswordAccessState - { - Stage = 1, - ActivatedAt = now, - ExpiresAt = expiresAt - }; - - SaveState(nextState); - status = BuildStatus(nextState, persistState: false); - message = $"第 1 次密码验证通过,已继续开放 {ExtendedAccessDays} 天,有效期至 {expiresAt:yyyy-MM-dd HH:mm}。"; - return true; - } - - private static PasswordAccessStatus BuildStatus(PasswordAccessState? state, bool persistState) - { - if (state is null) - { - state = CreateInitialState(); - if (persistState) - { - SaveState(state); - } - } - - if (state.Stage >= 2) - { - return new PasswordAccessStatus - { - Stage = 2, - CanLaunch = true, - IsPermanent = true, - ShouldPromptAtStartup = false, - CanSubmitPassword = false, - StageText = "当前阶段:永久有效", - StatusTitle = "系统已永久有效", - StatusDetail = "当前可直接进入系统。", - RemainingDays = int.MaxValue - }; - } - - var now = DateTime.Now; - if (state.ExpiresAt > now) - { - var remainingDays = Math.Max(1, (int)Math.Ceiling((state.ExpiresAt.Value - now).TotalDays)); - var isReminderWindow = remainingDays <= ExpirationReminderDays; - var isInitialStage = state.Stage == 0; - return new PasswordAccessStatus - { - Stage = state.Stage, - CanLaunch = true, - IsPermanent = false, - ShouldPromptAtStartup = isReminderWindow, - CanSubmitPassword = false, - StageText = isInitialStage ? $"当前阶段:首次使用({InitialAccessDays} 天)" : $"当前阶段:第 1 次续期({ExtendedAccessDays} 天)", - StatusTitle = isReminderWindow - ? isInitialStage ? "首次使用即将到期" : "第 1 次续期即将到期" - : "时效有效", - StatusDetail = isReminderWindow - ? isInitialStage - ? $"剩余 {remainingDays} 天,到期后需输入第 1 次时效密码。" - : $"剩余 {remainingDays} 天,到期后需输入第 2 次时效密码。" - : $"当前可直接进入系统。", - RemainingDays = remainingDays, - ExpiresAt = state.ExpiresAt - }; - } - - if (state.Stage == 0) - { - return new PasswordAccessStatus - { - Stage = 0, - CanLaunch = false, - IsPermanent = false, - ShouldPromptAtStartup = true, - CanSubmitPassword = true, - StageText = "当前阶段:首次使用已到期", - StatusTitle = "需要输入第 1 次时效密码", - StatusDetail = $"输入密码后继续使用 {ExtendedAccessDays} 天。", - RemainingDays = 0, - ExpiresAt = state.ExpiresAt - }; - } - - return new PasswordAccessStatus - { - Stage = 1, - CanLaunch = false, - IsPermanent = false, - ShouldPromptAtStartup = true, - CanSubmitPassword = true, - StageText = "当前阶段:第 1 次续期已到期", - StatusTitle = "需要输入第 2 次时效密码", - StatusDetail = "输入密码后系统转为永久有效。", - RemainingDays = 0, - ExpiresAt = state.ExpiresAt - }; - } - - private static int GetStageDays(int stage) => stage switch - { - 0 => InitialAccessDays, - 1 => ExtendedAccessDays, - _ => 0 - }; - - private static string GetStageName(int stage) => stage switch - { - 0 => "首次使用阶段", - 1 => "第 1 次续期阶段", - _ => "当前阶段" - }; - - private static PasswordAccessState LoadOrCreateState() - { - var state = LoadState(); - if (state is not null) - { - return state; - } - - var initialState = CreateInitialState(); - SaveState(initialState); - return initialState; - } - - private static PasswordAccessState CreateInitialState() - { - var now = DateTime.Now; - return new PasswordAccessState - { - Stage = 0, - ActivatedAt = now, - ExpiresAt = now.AddDays(InitialAccessDays) - }; - } - - private static PasswordAccessState? LoadState() - { - try - { - if (!File.Exists(StatusFilePath)) - { - return null; - } - - var json = File.ReadAllText(StatusFilePath); - return JsonSerializer.Deserialize(json); - } - catch - { - return null; - } - } - - private static void SaveState(PasswordAccessState state) - { - var directory = Path.GetDirectoryName(StatusFilePath); - if (!string.IsNullOrWhiteSpace(directory)) - { - Directory.CreateDirectory(directory); - } - - var json = JsonSerializer.Serialize(state, new JsonSerializerOptions { WriteIndented = true }); - File.WriteAllText(StatusFilePath, json); - } - - private sealed class PasswordAccessState - { - public int Stage { get; set; } - public DateTime ActivatedAt { get; set; } - public DateTime? ExpiresAt { get; set; } - } -} diff --git a/Cardiopulmonarybypasssystems/StartupPasswordWindow.xaml b/Cardiopulmonarybypasssystems/StartupPasswordWindow.xaml deleted file mode 100644 index cd009fb..0000000 --- a/Cardiopulmonarybypasssystems/StartupPasswordWindow.xaml +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -