client: Windows 客户端(WinUI3 壳 + agent-core;调试用 Electron 壳存档);localserver token 改为常数时间比较

This commit is contained in:
Qiufeng
2026-08-20 20:38:21 +08:00
parent 33b7d57498
commit 9abf7f8213
60 changed files with 10025 additions and 0 deletions
+119
View File
@@ -0,0 +1,119 @@
using System;
using System.IO;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media.Imaging;
using EveryPublish.Client.Pages;
using EveryPublish.Client.Services;
using H.NotifyIcon;
namespace EveryPublish.Client;
public sealed partial class MainWindow : Window
{
private readonly string _dataDir = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"EveryPublish");
private readonly CoreClient _core;
private readonly Watchdog _watchdog;
private readonly ClientContext _context;
private TaskbarIcon? _tray;
private bool _exiting;
/// <summary>供设置页「退出客户端」调用</summary>
public static Action? ExitAction;
public MainWindow()
{
InitializeComponent();
Directory.CreateDirectory(_dataDir);
_core = new CoreClient(_dataDir);
_watchdog = new Watchdog(_core, _dataDir, OnCoreFatal);
_context = new ClientContext(_core, _dataDir, _watchdog);
ExitAction = ExitApp;
AppWindow.Closing += OnClosing;
InitTray();
NavView.SelectedItem = NavView.MenuItems[0];
Navigate("status");
_watchdog.Start();
}
private void OnCoreFatal()
{
DispatcherQueue.TryEnqueue(async () =>
{
var dialog = new ContentDialog
{
Title = "核心进程异常",
Content = "agent-core 连续重启失败,请检查安装目录或重新安装。",
CloseButtonText = "知道了",
XamlRoot = Content.XamlRoot,
};
await dialog.ShowAsync();
});
}
private void InitTray()
{
try
{
_tray = new TaskbarIcon { ToolTipText = "EveryPublish 客户端" };
var iconPath = Path.Combine(AppContext.BaseDirectory, "Assets", "app.ico");
if (File.Exists(iconPath))
{
_tray.IconSource = new BitmapImage(new Uri(iconPath));
}
// H.NotifyIcon 2.x:左/右键命令打开主窗口(退出入口在设置页)
_tray.LeftClickCommand = new SimpleCommand(ShowWindow);
_tray.RightClickCommand = new SimpleCommand(ShowWindow);
}
catch
{
// 托盘不可用不影响主功能
}
}
private void ShowWindow()
{
AppWindow.Show();
Activate();
}
private void OnClosing(AppWindow sender, AppWindowClosingEventArgs args)
{
if (!_exiting)
{
args.Cancel = true;
AppWindow.Hide(); // 隐藏到托盘(WinUI 3 无 Window.Hide,用 AppWindow.Hide)
}
}
private void ExitApp()
{
_exiting = true;
_tray?.Dispose();
_watchdog.Dispose();
_core.Dispose();
Close();
}
private void NavView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
if (args.SelectedItem is NavigationViewItem item && item.Tag is string tag)
{
Navigate(tag);
}
}
private void Navigate(string tag)
{
Type page = tag switch
{
"pair" => typeof(PairPage),
"challenges" => typeof(ChallengesPage),
"settings" => typeof(SettingsPage),
_ => typeof(StatusPage),
};
ContentFrame.Navigate(page, _context);
}
}