Files
qhmes/yy-admin-master/YY.Admin/ViewModels/SysManage/LoginSettingsViewModel.cs

167 lines
5.0 KiB
C#
Raw Normal View History

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;
/// <summary>
/// 登录与会话相关系统配置
/// </summary>
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<int>(ConfigConst.SysTokenExpire);
TokenExpireMinutes = t > 0 ? t : 30;
var r = await _configService.GetConfigValue<int>(ConfigConst.SysRefreshTokenExpire);
RefreshTokenExpireMinutes = r > 0 ? r : 20160;
var i = await _configService.GetConfigValue<int>(ConfigConst.SysTokenIdleExtendMinutes);
IdleExtendMinutes = i > 0 ? i : 20;
var c = await _configService.GetConfigValue<int>(ConfigConst.SysTokenCheckIntervalMinutes);
CheckIntervalMinutes = c > 0 ? c : 1;
NeverExpire = await _configService.GetConfigValue<bool>(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 过期时间建议在 543200 分钟之间");
return;
}
if (!NeverExpire && (IdleExtendMinutes < 1 || IdleExtendMinutes > 1440))
{
Growl.Warning("会话续期阈值建议在 11440 分钟之间");
return;
}
if (!NeverExpire && IdleExtendMinutes > TokenExpireMinutes)
{
Growl.Warning("续期阈值不应大于 Token 过期时间");
return;
}
if (!NeverExpire && (CheckIntervalMinutes < 1 || CheckIntervalMinutes > 120))
{
Growl.Warning("登录状态检查间隔建议在 1120 分钟之间");
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;
}
}
}