145 lines
3.9 KiB
C#
145 lines
3.9 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Reactive;
|
|||
|
using System.Windows.Forms;
|
|||
|
using DispenserCommon.Aop;
|
|||
|
using DispenserCommon.Ioc;
|
|||
|
using DispenserCommon.Utils;
|
|||
|
using DispenserCore.Context;
|
|||
|
using DispenserCore.Model.DTO;
|
|||
|
using DispenserCore.Service;
|
|||
|
using ReactiveUI;
|
|||
|
using LoginErrorWindow = DispenserUI.Views.Windows.LoginErrorWindow;
|
|||
|
|
|||
|
namespace DispenserUI.ViewModels.Login;
|
|||
|
|
|||
|
[Component, GlobalTry]
|
|||
|
public class LoginVM : DynamicViewModel
|
|||
|
{
|
|||
|
private readonly Dictionary<string, int> _errorTimes = new();
|
|||
|
|
|||
|
private readonly GlobalSessionHolder _sessionHolder = ServiceLocator.GetService<GlobalSessionHolder>();
|
|||
|
|
|||
|
// 用来记录登录错误告警情况,10分钟内异常超过3次则添加到小黑屋里面去
|
|||
|
private readonly SlidingWindow _slidingWindow = new(10 * 60 * 1000);
|
|||
|
private readonly UserService _userService = ServiceLocator.GetService<UserService>();
|
|||
|
private bool _isCapsLockIndicatorVisible;
|
|||
|
|
|||
|
//订阅IsCapsLockOn、IsPwdTextBoxFocus
|
|||
|
private bool _isCapsLockOn;
|
|||
|
private bool _isPwdTextBoxFocus;
|
|||
|
|
|||
|
private string _password;
|
|||
|
|
|||
|
private bool _showError;
|
|||
|
|
|||
|
private string _userName;
|
|||
|
|
|||
|
public LoginVM()
|
|||
|
{
|
|||
|
Visible = false;
|
|||
|
CapsLockUpCommand = ReactiveCommand.Create(CapsLockUp);
|
|||
|
PwdTextBoxGotFocusCommand = ReactiveCommand.Create(PwdTextBoxGotFocus);
|
|||
|
PwdTextBoxLostFocusCommand = ReactiveCommand.Create(PwdTextBoxLostFocus);
|
|||
|
ToLogin = ReactiveCommand.Create(Login);
|
|||
|
}
|
|||
|
|
|||
|
public string UserName
|
|||
|
{
|
|||
|
get => _userName;
|
|||
|
set => this.RaiseAndSetIfChanged(ref _userName, value);
|
|||
|
}
|
|||
|
|
|||
|
public string Password
|
|||
|
{
|
|||
|
get => _password;
|
|||
|
set => this.RaiseAndSetIfChanged(ref _password, value);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public bool IsCapsLockIndicatorVisible
|
|||
|
{
|
|||
|
get => _isCapsLockIndicatorVisible;
|
|||
|
set => this.RaiseAndSetIfChanged(ref _isCapsLockIndicatorVisible, value);
|
|||
|
}
|
|||
|
|
|||
|
public bool ShowError
|
|||
|
{
|
|||
|
get => _showError;
|
|||
|
set => this.RaiseAndSetIfChanged(ref _showError, value);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public ReactiveCommand<Unit, Unit> CapsLockUpCommand { get; }
|
|||
|
public ReactiveCommand<Unit, Unit> PwdTextBoxGotFocusCommand { get; }
|
|||
|
|
|||
|
public ReactiveCommand<Unit, Unit> PwdTextBoxLostFocusCommand { get; }
|
|||
|
|
|||
|
public ReactiveCommand<Unit, Unit> ToLogin { get; }
|
|||
|
|
|||
|
private void CapsLockUp()
|
|||
|
{
|
|||
|
_isCapsLockOn = Control.IsKeyLocked(Keys.CapsLock);
|
|||
|
UpdateCapsLockIndicator();
|
|||
|
}
|
|||
|
|
|||
|
private void PwdTextBoxGotFocus()
|
|||
|
{
|
|||
|
_isPwdTextBoxFocus = true;
|
|||
|
ShowError = false;
|
|||
|
UpdateCapsLockIndicator();
|
|||
|
}
|
|||
|
|
|||
|
private void PwdTextBoxLostFocus()
|
|||
|
{
|
|||
|
_isPwdTextBoxFocus = false;
|
|||
|
ShowError = false;
|
|||
|
UpdateCapsLockIndicator();
|
|||
|
}
|
|||
|
|
|||
|
private void UpdateCapsLockIndicator()
|
|||
|
{
|
|||
|
IsCapsLockIndicatorVisible = _isCapsLockOn && _isPwdTextBoxFocus;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 登录
|
|||
|
/// </summary>
|
|||
|
[Operation("用户登录")]
|
|||
|
private void Login()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
// 如果登录异常次数超过3次,则提示用户
|
|||
|
if (_slidingWindow.Contains(UserName))
|
|||
|
{
|
|||
|
WindowUtil.ShowDialog(new LoginErrorWindow());
|
|||
|
// 清空当前的错误统计
|
|||
|
_errorTimes.Remove(UserName);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
ShowError = false;
|
|||
|
|
|||
|
// 进行登录验证
|
|||
|
var user = _userService.Login(UserName, Password);
|
|||
|
|
|||
|
// 将登录结果记录下来
|
|||
|
_sessionHolder.SetSession(new Session(user));
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
ShowError = true;
|
|||
|
_errorTimes.TryGetValue(UserName, out var times);
|
|||
|
times += 1;
|
|||
|
if (times >= 3)
|
|||
|
{
|
|||
|
// 添加到小黑屋,10分钟内不能进行登录
|
|||
|
_slidingWindow.AllowValue(UserName);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
_errorTimes[UserName] = times;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|