167 lines
5.0 KiB
C#
167 lines
5.0 KiB
C#
|
|
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 过期时间建议在 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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|