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

167 lines
5.0 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 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;
}
}
}