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;
|
||
}
|
||
}
|
||
}
|