FieldWorkClient/App.xaml.cs

421 lines
15 KiB
C#
Raw Normal View History

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Windows;
2025-03-20 09:09:14 +08:00
using System.Windows.Media;
using HeBianGu.Base.WpfBase;
2025-03-17 10:58:59 +08:00
using HeBianGu.Control.Guide;
using HeBianGu.Control.ThemeSet;
using HeBianGu.General.WpfControlLib;
using HeBianGu.Service.Mvp;
using HeBianGu.Systems.Identity;
using HeBianGu.Systems.Setting;
2025-04-11 16:11:55 +08:00
using HeBianGu.Window.Link;
2025-04-24 14:22:38 +08:00
using Hopetry.Provider;
2025-03-21 13:12:43 +08:00
using Hopetry.Services;
2025-07-04 15:18:41 +08:00
using Hopetry.ViewModel.Sync;
2025-04-02 09:30:13 +08:00
using SqlSugar;
using SystemSetting = FileUploader.Models.SystemSetting;
2025-03-13 09:58:16 +08:00
2025-03-17 10:58:59 +08:00
namespace HeBianGu.App.Disk
2025-03-13 09:58:16 +08:00
{
/// <summary>
2025-03-17 10:58:59 +08:00
/// App.xaml 的交互逻辑
2025-03-13 09:58:16 +08:00
/// </summary>
2025-03-17 10:58:59 +08:00
public partial class App : ApplicationBase
2025-03-13 09:58:16 +08:00
{
2025-04-11 16:11:55 +08:00
public new static ComponentResourceKey Custom
{
get => new ComponentResourceKey(typeof(LinkWindowBase), (object)"S.Window.Link.Custom");
2025-04-11 16:11:55 +08:00
}
public static ComponentResourceKey WaitingPercent =>
new ComponentResourceKey(typeof(ProgressBarKeys), "S.ProgressBar.Custom");
2025-03-17 10:58:59 +08:00
protected override MainWindowBase CreateMainWindow(StartupEventArgs e)
{
return new ShellWindow();
}
2025-03-17 10:58:59 +08:00
protected override void ConfigureServices(IServiceCollection services)
{
base.ConfigureServices(services);
2025-03-22 15:29:32 +08:00
// 本地持久化
services.AddXmlSerialize();
2025-03-29 11:16:54 +08:00
// 设置
services.AddSetting();
// 另外保存设置目录
//services.AddSettingPath();
2025-03-29 11:16:54 +08:00
2025-03-21 13:12:43 +08:00
// minio 服务
services.AddSingleton<MinioService, MinioService>();
2025-03-17 10:58:59 +08:00
services.AddWindowDialog();
services.AddObjectWindowDialog();
2025-03-20 09:09:14 +08:00
services.AddWindowAnimation();
2025-03-17 10:58:59 +08:00
services.AddMessageProxy();
services.AddPropertyGridMessage();
services.AddAutoColumnPagedDataGridMessage();
//services.AddNotifyMessage();
2025-03-29 11:16:54 +08:00
2025-03-20 09:09:14 +08:00
// 认证
// services.AddIdentity(x => x.ProductFontSize = 50);
2025-03-17 10:58:59 +08:00
services.AddMvc();
//services.AddProjectDefault();
2025-03-22 15:29:32 +08:00
2025-03-17 10:58:59 +08:00
services.AddXmlWebSerializerService();
//// Do :注册软件更新页面
2025-03-20 09:09:14 +08:00
/* services.AddAutoUpgrade(x =>
{
x.Uri = "https://gitee.com/hebiangu/wpf-auto-update/raw/master/Install/Computer/AutoUpdate.xml";
x.UseIEDownload = true;
});*/
2025-03-29 11:16:54 +08:00
2025-03-17 10:58:59 +08:00
services.AddDESCryptService();
services.AddPrintBoxMessage();
2025-03-22 15:29:32 +08:00
// ???
2025-03-17 10:58:59 +08:00
services.AddWindowExplorer();
#region - More -
2025-03-20 09:09:14 +08:00
2025-03-17 10:58:59 +08:00
//services.AddUpgradeViewPresenter();
//services.AddLicense();
//services.AddLicenseViewPresenter();
//services.AddVip();
//services.AddVipViewPresenter();
//services.AddSurveyViewPresenter();
//services.AddFeedbackViewPresenter();
services.AddLogoutViewPresenter();
//services.AddAboutViewPresenter();
2025-03-17 10:58:59 +08:00
services.AddMoreViewPresenter(x =>
{
//x.AddPersenter(UpgradeViewPresenter.Instance);
//x.AddPersenter(LicenseViewPresenter.Instance);
//x.AddPersenter(VipViewPresenter.Instance);
//x.AddPersenter(SurveyViewPresenter.Instance);
//x.AddPersenter(FeedbackViewPresenter.Instance);
//x.AddPersenter(AboutViewPresenter.Instance);
2025-03-17 10:58:59 +08:00
x.AddPersenter(LogoutViewPresenter.Instance);
});
2025-03-20 09:09:14 +08:00
2025-03-17 10:58:59 +08:00
#endregion
2025-04-02 11:26:08 +08:00
2025-03-17 10:58:59 +08:00
#region - WindowCaption -
2025-03-20 09:09:14 +08:00
//以下各种功能按钮
//services.AddLoginViewPresenter();
2025-03-22 15:29:32 +08:00
// 引导功能按钮
2025-03-17 10:58:59 +08:00
services.AddGuideViewPresenter();
services.AddHideWindowViewPresenter();
services.AddSettingViewPrenter();
2025-03-17 10:58:59 +08:00
//services.AddThemeRightToolViewPresenter();
2025-03-25 10:37:50 +08:00
//services.AddThemeRightViewPresenter();
2025-03-17 10:58:59 +08:00
services.AddWindowCaptionViewPresenter(x =>
{
x.AddPersenter(LoginViewPresenter.Instance);
2025-03-17 10:58:59 +08:00
x.AddPersenter(MoreViewPresenter.Instance);
x.AddPersenter(GuideViewPresenter.Instance);
x.AddPersenter(HideWindowViewPresenter.Instance);
2025-03-17 10:58:59 +08:00
x.AddPersenter(SettingViewPresenter.Instance);
//x.AddPersenter(ThemeRightToolViewPresenter.Instance);
2025-03-17 10:58:59 +08:00
});
2025-03-13 09:58:16 +08:00
2025-03-17 10:58:59 +08:00
#endregion
//string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Module", "HeBianGu.Domain.FATFS.dll");
//var dll = Assembly.LoadFile(path);
//var find = dll.GetTypes().Where(x => typeof(IExplorerService).IsAssignableFrom(x))?.FirstOrDefault();
//ServiceRegistry.Instance.Register(typeof(IExplorerService), find);
//services.AddSingleton<IExplorerService, WindowExplorerServiceDemo>();
2025-04-24 14:22:38 +08:00
//minio分片上传修改
PartSizeOverride.OverrideMinioCalculator();
2025-04-02 11:26:08 +08:00
var minioService = services.GetService<MinioService>();
2025-03-29 11:16:54 +08:00
var bucketName = minioService._bucketName;
var xmlSerializerService = services.GetService<ISerializerService>();
2025-04-02 11:26:08 +08:00
if (!File.Exists("./settings.xml"))
{
var tempSetting = new SystemSetting();
tempSetting.TaskCount = 3;
tempSetting.SyncDir = Path.Combine(SelectDrive(), "HopetryBoxData");
2025-04-02 11:26:08 +08:00
if (!Directory.Exists(tempSetting.SyncDir))
{
Directory.CreateDirectory(tempSetting.SyncDir);
}
2025-04-02 11:26:08 +08:00
xmlSerializerService.Save("./settings.xml", tempSetting);
}
var setting = xmlSerializerService.Load<SystemSetting>("./settings.xml");
if (string.IsNullOrEmpty(setting.SyncDir))
2025-03-29 11:16:54 +08:00
{
2025-04-02 11:26:08 +08:00
var selectDrive = SelectDrive();
setting.SyncDir = Path.Combine(selectDrive, "HopetryBoxData");
if (!Directory.Exists(setting.SyncDir))
2025-03-29 11:16:54 +08:00
{
2025-04-02 11:26:08 +08:00
Directory.CreateDirectory(setting.SyncDir);
}
// 保存配置
xmlSerializerService.Save("./settings.xml", setting);
}
if (setting.TaskCount == 0)
{
setting.TaskCount = 3;
}
// 创建统一的取消令牌源
var cancelToken = new CancellationTokenSource();
var temp = SyncSetting.Instance;
var notRun = true;
// 注册设置变更监听
temp.PropertyChanged += (s, e) =>
{
// 取下载目录
var setting1 = xmlSerializerService.Load<SystemSetting>("./settings.xml");
if (!string.IsNullOrEmpty(setting.SyncDir))
{
xmlSerializerService.Save("./settings.xml", setting);
setting.SyncDir = setting1.SyncDir;
}
2025-07-04 15:18:41 +08:00
2025-04-02 11:26:08 +08:00
if (temp.IsOn && notRun)
{
// 异步启动服务
Console.WriteLine("启动同步:");
try
2025-03-29 11:16:54 +08:00
{
2025-07-04 15:18:41 +08:00
var syncModel = services.GetService<SyncViewModel>();
Task.Run(async () =>
{
await minioService.MirrorAsync(bucketName, setting.SyncDir, (total, count, fileName) =>
{
//添加同步信息
syncModel.SyncProgressText = $"同步中: {count}/{total} {fileName}";
},
setting.TaskCount);
syncModel.SyncProgressText = "同步完成";
});
2025-07-04 15:33:22 +08:00
Task.Run(async () =>
{
await minioService.RealTimeListen(bucketName, setting.SyncDir, ( fileName) =>
{
//添加同步信息
2025-07-04 15:36:28 +08:00
syncModel.SyncProgressText = $"{fileName}";
2025-07-04 15:33:22 +08:00
},
cancellationToken: cancelToken.Token);
2025-07-04 15:36:28 +08:00
//syncModel.SyncProgressText = $"实时同步完成";
2025-07-04 15:33:22 +08:00
});
2025-04-02 11:26:08 +08:00
notRun = false;
2025-03-29 11:16:54 +08:00
}
2025-04-02 11:26:08 +08:00
catch (OperationCanceledException)
{
Console.WriteLine("同步监听已取消");
}
catch (Exception ex)
{
Console.WriteLine($"同步失败: {ex.Message}");
}
}
// 运行中 且 temp.IsOn 变成 false
else if (!notRun && !temp.IsOn)
{
notRun = true;
// 当设置关闭时取消所有任务
cancelToken.Cancel(); // 取消任务
cancelToken.Dispose();
cancelToken = new CancellationTokenSource();
}
};
/*var delayTimer = new DispatcherTimer();
delayTimer.Interval = TimeSpan.FromSeconds(5);
delayTimer.Tick += async (s, e) =>
{
delayTimer.Stop(); // 确保只执行一次
// 异步操作不会阻塞UI
await Current.Dispatcher.InvokeAsync(() =>
{
// 注册设置变更监听
2025-04-02 11:26:08 +08:00
SyncSetting.Instance.PropertyChanged += (s1, e1) =>
{
2025-04-02 11:26:08 +08:00
if (SyncSetting.Instance.IsOn)
{
// 异步启动服务
2025-04-02 11:26:08 +08:00
_ = StartSyncServicesAsync();
}
2025-04-02 11:26:08 +08:00
else
{
// 当设置关闭时取消所有任务
2025-04-02 11:26:08 +08:00
cancelToken.Cancel();
cancelToken.Dispose();
cancelToken = new CancellationTokenSource();
}
};
2025-04-02 11:26:08 +08:00
});
};
2025-04-02 11:26:08 +08:00
delayTimer.Start();*/
2025-04-02 11:26:08 +08:00
/*var syncSettingPath = SyncSetting.Instance.GetPath();
var syncSetting = xmlSerializerService.Load<SyncSetting>(syncSettingPath);
SyncSetting.Instance.IsOn = syncSetting.IsOn;
if (syncSetting.IsOn)
{
// 是否启监听
minioService.MirrorAsync1(bucketName, setting.SyncDir, setting.TaskCount);
}*/
/*minioService.RealTimeListen(bucketName, setting.SyncDir,
cancellationToken: cancelToken.Token);*/
}
2025-04-02 11:26:08 +08:00
private static string SelectDrive()
{
var maxFreeSpace = 0L;
var selectDrive = "";
// 如果同步目录为空,则选择一个本地空闲空间比较大的分区
foreach (DriveInfo drive in DriveInfo.GetDrives())
{
if (drive.DriveType != DriveType.Fixed) continue; // 只获取固定硬盘
if (drive.AvailableFreeSpace > maxFreeSpace)
{
maxFreeSpace = drive.AvailableFreeSpace;
selectDrive = drive.Name;
2025-03-29 11:16:54 +08:00
}
}
2025-04-02 11:26:08 +08:00
return selectDrive;
2025-03-17 10:58:59 +08:00
}
protected override void Configure(IApplicationBuilder app)
{
base.Configure(app);
app.UseSetting(x =>
{
2025-03-28 14:20:51 +08:00
x.Settings.Clear();
x.Settings.Add(MySetting.Instance);
x.Settings.Add(SyncSetting.Instance);
2025-04-24 16:44:43 +08:00
x.Settings.Add(DownloadSetting.Instance);
});
2025-03-17 10:58:59 +08:00
app.UseStyle();
//app.UseSettingDefault();
2025-03-17 10:58:59 +08:00
// Do设置默认主题
app.UseLocalTheme(l =>
{
2025-03-22 15:29:32 +08:00
// 主题色
2025-03-17 10:58:59 +08:00
l.AccentColor = (Color)ColorConverter.ConvertFromString("#FF0093FF");
l.DefaultFontSize = 13D;
l.FontSize = FontSize.Normal;
l.ItemHeight = 35;
//l.ItemWidth = 120;
l.ItemCornerRadius = 5;
l.AnimalSpeed = 300;
2025-03-17 10:58:59 +08:00
l.AccentColorSelectType = 0;
l.IsUseAnimal = false;
l.ThemeType = ThemeType.DarkBlack;
l.StyleType = StyleType.Single;
l.Language = Language.Chinese;
l.AccentBrushType = AccentBrushType.LinearGradientBrush;
});
}
}
2025-04-24 16:44:43 +08:00
[Displayer(Name = "下载设置", GroupName = "通用设置")]
public class DownloadSetting : LazySettingInstance<DownloadSetting>
{
private int _maxConcurrent;
[DefaultValue(3)]
[Display(Name = "下载并行任务数")]
public int MaxConcurrent
{
get => _maxConcurrent;
set
{
if (_maxConcurrent == value) return;
_maxConcurrent = value;
RaisePropertyChanged();
}
}
2025-04-24 16:44:43 +08:00
private string _downDir;
2025-04-24 16:44:43 +08:00
[Display(Name = "下载目录")]
public string DownDir
{
get => _downDir;
set
{
if (_downDir == value) return;
_downDir = value;
RaisePropertyChanged();
}
}
2025-04-24 16:44:43 +08:00
private bool _isSelect;
2025-04-24 16:44:43 +08:00
[DefaultValue(false)]
[Display(Name = "设置为默认下载目录")]
public bool IsSelect
{
get => _isSelect;
set
{
if (_isSelect == value) return;
_isSelect = value;
RaisePropertyChanged();
}
}
}
2025-03-28 14:20:51 +08:00
[Displayer(Name = "同步设置", GroupName = "通用设置")]
public class SyncSetting : LazySettingInstance<SyncSetting>
{
private bool _ison;
2025-03-29 11:16:54 +08:00
public string GetPath()
{
return GetDefaultPath();
}
[DefaultValue(false)]
[Display(Name = "自动同步")]
public bool IsOn
{
get { return _ison; }
set
{
if (_ison == value) return;
_ison = value;
2025-03-29 11:16:54 +08:00
RaisePropertyChanged();
}
}
}
2025-03-28 14:20:51 +08:00
[Displayer(Name = "关机设置", GroupName = "通用设置")]
public class MySetting : LazySettingInstance<MySetting>
2025-03-25 11:20:19 +08:00
{
private bool _ison;
2025-03-25 11:20:19 +08:00
[DefaultValue(false)]
[Display(Name = "是否上传完成关机")]
public bool IsOn
{
get { return _ison; }
set
{
_ison = value;
RaisePropertyChanged("IsOn");
}
}
}
2025-03-20 09:09:14 +08:00
}