Files
FootwearTest-20260602/Footwear Test methodsfor wholeshoe Slipresistanceperformance/Views/LicenseWindow.axaml.cs
2026-06-15 10:28:16 +08:00

215 lines
8.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Avalonia.Controls;
using Avalonia.Media;
using Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Models;
using Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Services;
using Serilog;
using System;
namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Views
{
public enum LicenseWindowMode
{
Initialization,
Unlock,
Administration,
Blocked
}
public partial class LicenseWindow : Window
{
private readonly MachineLicenseService licenseService;
private readonly LicenseWindowMode mode;
private bool adminAuthenticated;
public bool Succeeded { get; private set; }
public LicenseWindow() : this(new MachineLicenseService(), LicenseWindowMode.Blocked, "授权窗口需要由软件启动流程打开。")
{
}
public LicenseWindow(MachineLicenseService licenseService, LicenseWindowMode mode, string message = "")
{
this.licenseService = licenseService;
this.mode = mode;
InitializeComponent();
MessageText.Text = message;
InitializationPanel.IsVisible = mode == LicenseWindowMode.Initialization;
UnlockPanel.IsVisible = mode == LicenseWindowMode.Unlock;
AdminLoginPanel.IsVisible = mode == LicenseWindowMode.Administration;
CancelButton.Content = mode == LicenseWindowMode.Administration ? "关闭" : "退出";
switch (mode)
{
case LicenseWindowMode.Initialization:
TitleText.Text = "首次使用授权设置";
PrimaryButton.Content = "保存并开始使用";
break;
case LicenseWindowMode.Unlock:
TitleText.Text = "软件使用时效已到";
PrimaryButton.Content = "校验并继续使用";
break;
case LicenseWindowMode.Administration:
TitleText.Text = "时效授权管理";
PrimaryButton.Content = "验证管理密码";
break;
default:
TitleText.Text = "软件授权已锁定";
PrimaryButton.IsVisible = false;
break;
}
}
private void OnPrimaryClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
ErrorText.Foreground = Brushes.Crimson;
ErrorText.Text = string.Empty;
try
{
switch (mode)
{
case LicenseWindowMode.Initialization:
InitializeLicense();
break;
case LicenseWindowMode.Unlock:
UnlockLicense();
break;
case LicenseWindowMode.Administration:
HandleAdministration();
break;
}
}
catch (Exception ex)
{
Log.Warning(ex, "授权窗口操作失败Mode={Mode}", mode);
ErrorText.Text = ex.Message;
}
}
private void InitializeLicense()
{
RequireMatch(InitialAdminPassword.Text, InitialAdminConfirm.Text, "管理密码");
RequireMatch(InitialFirstPassword.Text, InitialFirstConfirm.Text, "第一次时效密码");
RequireMatch(InitialSecondPassword.Text, InitialSecondConfirm.Text, "第二次时效密码");
licenseService.Initialize(
InitialAdminPassword.Text ?? string.Empty,
InitialFirstPassword.Text ?? string.Empty,
InitialSecondPassword.Text ?? string.Empty,
ReadMonths(InitialFirstMonths),
ReadMonths(InitialSecondMonths));
Succeeded = true;
Close();
}
private void UnlockLicense()
{
if (!licenseService.UnlockCurrentStage(UnlockPassword.Text ?? string.Empty))
{
ErrorText.Text = "时效密码不正确。";
UnlockPassword.Text = string.Empty;
return;
}
Succeeded = true;
Close();
}
private void HandleAdministration()
{
if (!adminAuthenticated)
{
if (!licenseService.VerifyAdminPassword(AdminLoginPassword.Text ?? string.Empty))
{
ErrorText.Text = "管理密码不正确。";
AdminLoginPassword.Text = string.Empty;
return;
}
adminAuthenticated = true;
AdminLoginPanel.IsVisible = false;
AdminSettingsPanel.IsVisible = true;
PrimaryButton.Content = "保存设置";
LoadAdminValues();
return;
}
var newAdminPassword = ReadOptionalMatchingPassword(NewAdminPassword.Text, NewAdminConfirm.Text, "新管理密码");
var newFirstPassword = ReadOptionalMatchingPassword(NewFirstPassword.Text, NewFirstConfirm.Text, "新第一次时效密码");
var newSecondPassword = ReadOptionalMatchingPassword(NewSecondPassword.Text, NewSecondConfirm.Text, "新第二次时效密码");
licenseService.UpdateSettings(
newAdminPassword,
newFirstPassword,
newSecondPassword,
ReadMonths(AdminFirstMonths),
ReadMonths(AdminSecondMonths));
LicenseStatusText.Text = licenseService.DescribeCurrent();
ErrorText.Foreground = Avalonia.Media.Brushes.ForestGreen;
ErrorText.Text = "时效授权设置已保存。";
NewAdminPassword.Text = string.Empty;
NewAdminConfirm.Text = string.Empty;
NewFirstPassword.Text = string.Empty;
NewFirstConfirm.Text = string.Empty;
NewSecondPassword.Text = string.Empty;
NewSecondConfirm.Text = string.Empty;
Succeeded = true;
}
private void LoadAdminValues()
{
var data = licenseService.Current ?? throw new InvalidOperationException("授权状态未加载。");
AdminFirstMonths.Value = data.FirstPeriodMonths;
AdminSecondMonths.Value = data.SecondPeriodMonths;
LicenseStatusText.Text = licenseService.DescribeCurrent();
}
private void OnRestartTimingClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
ConfirmationPanel.IsVisible = true;
}
private void OnConfirmRestartClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
try
{
licenseService.RestartTiming();
ConfirmationPanel.IsVisible = false;
LicenseStatusText.Text = licenseService.DescribeCurrent();
ErrorText.Foreground = Avalonia.Media.Brushes.ForestGreen;
ErrorText.Text = "已从当前时间重新开始第一阶段计时。";
Succeeded = true;
}
catch (Exception ex)
{
ErrorText.Text = ex.Message;
}
}
private void OnCancelRestartClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e) =>
ConfirmationPanel.IsVisible = false;
private void OnCancelClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e) => Close();
private static int ReadMonths(NumericUpDown input) =>
decimal.ToInt32(input.Value ?? throw new ArgumentException("请输入有效的时效月数。"));
private static void RequireMatch(string? password, string? confirmation, string label)
{
if (!string.Equals(password, confirmation, StringComparison.Ordinal))
{
throw new ArgumentException($"{label}与确认输入不一致。");
}
}
private static string? ReadOptionalMatchingPassword(string? password, string? confirmation, string label)
{
if (string.IsNullOrWhiteSpace(password) && string.IsNullOrWhiteSpace(confirmation))
{
return null;
}
RequireMatch(password, confirmation, label);
return password;
}
}
}