using HandyControl.Controls; using Prism.Commands; using Prism.Ioc; using YY.Admin.Core.Const; using YY.Admin.Services.Service.Config; namespace YY.Admin.ViewModels.SysManage; /// /// 登录与会话相关系统配置 /// public class LoginSettingsViewModel : BaseViewModel { private readonly ISysConfigService _configService; private int _tokenExpireMinutes = 30; public int TokenExpireMinutes { get => _tokenExpireMinutes; set => SetProperty(ref _tokenExpireMinutes, value); } private int _refreshTokenExpireMinutes = 20160; public int RefreshTokenExpireMinutes { get => _refreshTokenExpireMinutes; set => SetProperty(ref _refreshTokenExpireMinutes, value); } private int _idleExtendMinutes = 20; public int IdleExtendMinutes { get => _idleExtendMinutes; set => SetProperty(ref _idleExtendMinutes, value); } private int _checkIntervalMinutes = 1; public int CheckIntervalMinutes { get => _checkIntervalMinutes; set => SetProperty(ref _checkIntervalMinutes, value); } private bool _neverExpire; public bool NeverExpire { get => _neverExpire; set { if (SetProperty(ref _neverExpire, value)) RaisePropertyChanged(nameof(IsConfigEditable)); } } public bool IsConfigEditable => !NeverExpire; public DelegateCommand LoadCommand { get; } public DelegateCommand SaveCommand { get; } public LoginSettingsViewModel( ISysConfigService configService, IContainerExtension container, IRegionManager regionManager) : base(container, regionManager) { _configService = configService; LoadCommand = new DelegateCommand(async () => await LoadAsync()); SaveCommand = new DelegateCommand(async () => await SaveAsync()); _ = LoadAsync(); } private async Task LoadAsync() { try { IsLoading = true; var t = await _configService.GetConfigValue(ConfigConst.SysTokenExpire); TokenExpireMinutes = t > 0 ? t : 30; var r = await _configService.GetConfigValue(ConfigConst.SysRefreshTokenExpire); RefreshTokenExpireMinutes = r > 0 ? r : 20160; var i = await _configService.GetConfigValue(ConfigConst.SysTokenIdleExtendMinutes); IdleExtendMinutes = i > 0 ? i : 20; var c = await _configService.GetConfigValue(ConfigConst.SysTokenCheckIntervalMinutes); CheckIntervalMinutes = c > 0 ? c : 1; NeverExpire = await _configService.GetConfigValue(ConfigConst.SysTokenNeverExpire); } catch (Exception ex) { Growl.Error($"加载配置失败:{ex.Message}"); } finally { IsLoading = false; } } private async Task SaveAsync() { if (!NeverExpire && (TokenExpireMinutes < 5 || TokenExpireMinutes > 43200)) { Growl.Warning("Token 过期时间建议在 5~43200 分钟之间"); return; } if (!NeverExpire && (IdleExtendMinutes < 1 || IdleExtendMinutes > 1440)) { Growl.Warning("会话续期阈值建议在 1~1440 分钟之间"); return; } if (!NeverExpire && IdleExtendMinutes > TokenExpireMinutes) { Growl.Warning("续期阈值不应大于 Token 过期时间"); return; } if (!NeverExpire && (CheckIntervalMinutes < 1 || CheckIntervalMinutes > 120)) { Growl.Warning("登录状态检查间隔建议在 1~120 分钟之间"); return; } if (!NeverExpire && RefreshTokenExpireMinutes < TokenExpireMinutes * 2) { Growl.Warning("RefreshToken 过期时间建议不小于 Token 过期时间的 2 倍"); return; } try { IsLoading = true; var pairs = new[] { (ConfigConst.SysTokenExpire, TokenExpireMinutes.ToString()), (ConfigConst.SysRefreshTokenExpire, RefreshTokenExpireMinutes.ToString()), (ConfigConst.SysTokenIdleExtendMinutes, IdleExtendMinutes.ToString()), (ConfigConst.SysTokenCheckIntervalMinutes, CheckIntervalMinutes.ToString()), (ConfigConst.SysTokenNeverExpire, NeverExpire.ToString()), }; foreach (var (code, val) in pairs) { var (ok, msg) = await _configService.SetConfigValueAsync(code, val); if (!ok) { Growl.Warning($"{code}:{msg}"); return; } } Growl.Success("登录相关配置已保存"); BaseViewModel.RefreshTokenCheckIntervalFromConfig(); } catch (Exception ex) { Growl.Error($"保存失败:{ex.Message}"); } finally { IsLoading = false; } } }