|
|
@@ -51,26 +51,51 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
}
|
|
|
|
|
|
private string _SelectedUserName;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 当前在账号登录页选择的用户名。
|
|
|
+ /// 窗口加载时会清空;切换用户名时会同步清空密码。
|
|
|
+ /// </summary>
|
|
|
public string SelectedUserName
|
|
|
{
|
|
|
get { return _SelectedUserName; }
|
|
|
- set { SetProperty(ref _SelectedUserName, value); }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ if (SetProperty(ref _SelectedUserName, value))
|
|
|
+ {
|
|
|
+ Password = string.Empty;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private string _Password;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 当前输入的账号登录密码。
|
|
|
+ /// 登录流程结束后会清空,避免窗口保留密码记录。
|
|
|
+ /// </summary>
|
|
|
public string Password
|
|
|
{
|
|
|
get { return _Password; }
|
|
|
set { SetProperty(ref _Password, value); }
|
|
|
}
|
|
|
|
|
|
- public bool IsRemember { get; set; }
|
|
|
-
|
|
|
+ /// <summary>
|
|
|
+ /// 标识当前登录是否为本地登录模式。
|
|
|
+ /// </summary>
|
|
|
public bool IsLocal { get; private set; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 当前弹窗实例,用于登录成功或取消时设置 DialogResult。
|
|
|
+ /// </summary>
|
|
|
public CardLoginWindow View { get; set; }
|
|
|
|
|
|
//正在登录中
|
|
|
private bool _IsLogining;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 标识账号登录流程是否正在执行,用于禁用重复点击登录。
|
|
|
+ /// </summary>
|
|
|
public bool IsLogining
|
|
|
{
|
|
|
get { return _IsLogining; }
|
|
|
@@ -78,6 +103,11 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
}
|
|
|
|
|
|
private int _PageIndex;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 当前登录页索引。
|
|
|
+ /// 0 表示刷卡登录页,1 表示账号登录页。
|
|
|
+ /// </summary>
|
|
|
public int PageIndex
|
|
|
{
|
|
|
get { return _PageIndex; }
|
|
|
@@ -85,29 +115,54 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
}
|
|
|
|
|
|
private Visibility _CardBtnVisibility = Visibility.Visible;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 刷卡登录按钮可见性。
|
|
|
+ /// 管理员模式下隐藏刷卡入口。
|
|
|
+ /// </summary>
|
|
|
public Visibility CardBtnVisibility
|
|
|
{
|
|
|
get { return _CardBtnVisibility; }
|
|
|
set { SetProperty(ref _CardBtnVisibility, value); }
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 刷卡器串口通讯对象。
|
|
|
+ /// 窗口关闭时需要解绑事件并释放连接。
|
|
|
+ /// </summary>
|
|
|
public SerialPortProtocol serialPortProtocol { get; set; }
|
|
|
#endregion
|
|
|
|
|
|
#region 命令
|
|
|
private DelegateCommand _LoginCommand;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 账号登录命令。
|
|
|
+ /// </summary>
|
|
|
public DelegateCommand LoginCommand =>
|
|
|
_LoginCommand ?? (_LoginCommand = new DelegateCommand(ExecuteLoginCommand, CanExecuteLoginCommand).ObservesProperty(() => SelectedUserName).ObservesProperty(() => Password).ObservesProperty(() => IsLogining));
|
|
|
|
|
|
private DelegateCommand _CloseCommand;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 关闭登录窗口命令。
|
|
|
+ /// </summary>
|
|
|
public DelegateCommand CloseCommand =>
|
|
|
_CloseCommand ?? (_CloseCommand = new DelegateCommand(ExecuteCloseCommand));
|
|
|
|
|
|
private DelegateCommand<string> _TransitionerCommand;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 切换登录页命令。
|
|
|
+ /// </summary>
|
|
|
public DelegateCommand<string> TransitionerCommand =>
|
|
|
_TransitionerCommand ?? (_TransitionerCommand = new DelegateCommand<string>(ExecuteTransitionerCommand));
|
|
|
|
|
|
private DelegateCommand _LoadedCommand;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 窗口加载命令。
|
|
|
+ /// </summary>
|
|
|
public DelegateCommand LoadedCommand =>
|
|
|
_LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand));
|
|
|
#endregion
|
|
|
@@ -126,7 +181,8 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
|
|
|
#region 方法
|
|
|
/// <summary>
|
|
|
- /// 加载
|
|
|
+ /// 窗口加载时初始化用户列表和刷卡器通讯。
|
|
|
+ /// 同时清除记住用户标记,并清空用户名选择和密码输入。
|
|
|
/// </summary>
|
|
|
async void ExecuteLoadedCommand()
|
|
|
{
|
|
|
@@ -140,27 +196,24 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
{
|
|
|
Users = new List<TeamAAS_VP.Models.User>();
|
|
|
}
|
|
|
- TeamAAS_VP.Models.User rememberUser = null;
|
|
|
if (Users != null)
|
|
|
{
|
|
|
UserNameList.Clear();
|
|
|
foreach (var user in Users)
|
|
|
{
|
|
|
UserNameList.Add(user.UserName);
|
|
|
- if (user.IsRemember)
|
|
|
- {
|
|
|
- rememberUser = user;
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
+ try
|
|
|
+ {
|
|
|
+ await _systemDatabaseService.ClearRememberUserAsync();
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ }
|
|
|
|
|
|
- //对记住的用户界面绑定
|
|
|
- //if (rememberUser != null)
|
|
|
- //{
|
|
|
- // SelectedUserName = UserNameList.FirstOrDefault(p => p == rememberUser.UserName);
|
|
|
- // Password = rememberUser.UserPassword;
|
|
|
- // IsRemember = true;
|
|
|
- //}
|
|
|
+ SelectedUserName = null;
|
|
|
+ Password = string.Empty;
|
|
|
|
|
|
//创建刷卡器通讯
|
|
|
serialPortProtocol = new SerialPortProtocol(cardConfig);
|
|
|
@@ -172,6 +225,12 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 处理刷卡器收到的卡号。
|
|
|
+ /// 在刷卡登录页中将卡号作为临时工程师账号登录,并发布用户切换事件。
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="sender">串口事件发送方。</param>
|
|
|
+ /// <param name="code">刷卡器读取到的卡号。</param>
|
|
|
private async void CardSerial_DataReceived(object sender, string code)
|
|
|
{
|
|
|
if (PageIndex == 0)
|
|
|
@@ -191,13 +250,19 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
|
|
|
App.Current.Dispatcher.Invoke(() =>
|
|
|
{
|
|
|
- _eventAggregator.GetEvent<UserLoginNotification>().Publish(user);
|
|
|
+ user.UserPassword = string.Empty;
|
|
|
+ _eventAggregator.GetEvent<UserLoginNotification>().Publish(_systemDatabaseService.GetCurrentUser());
|
|
|
View.DialogResult = true;
|
|
|
});
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 窗口关闭时释放刷卡器通讯资源。
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="sender">窗口关闭事件发送方。</param>
|
|
|
+ /// <param name="e">关闭事件参数。</param>
|
|
|
public async void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
|
|
|
{
|
|
|
if (serialPortProtocol!=null)
|
|
|
@@ -210,6 +275,11 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
serialPortProtocol = null;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 执行账号登录。
|
|
|
+ /// 操作员账号允许免密码登录;工程师和管理员仍需要密码认证。
|
|
|
+ /// 登录完成后清除记住用户标记、清空密码,并关闭登录弹窗。
|
|
|
+ /// </summary>
|
|
|
async void ExecuteLoginCommand()
|
|
|
{
|
|
|
if (Users == null || string.IsNullOrEmpty(SelectedUserName))
|
|
|
@@ -218,26 +288,30 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
IsLogining = true;
|
|
|
try
|
|
|
{
|
|
|
+ var selectedUser = Users.FirstOrDefault(u => u.UserName == SelectedUserName);
|
|
|
+ if (selectedUser == null)
|
|
|
+ return;
|
|
|
+
|
|
|
if (_systemDatabaseService.GetCurrentUser() != null)
|
|
|
{
|
|
|
if (_systemDatabaseService.GetCurrentUser().UserName == SelectedUserName)
|
|
|
{
|
|
|
+ Password = string.Empty;
|
|
|
+ _eventAggregator.GetEvent<UserLoginNotification>().Publish(_systemDatabaseService.GetCurrentUser());
|
|
|
View.DialogResult = true;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // authenticate via system database service
|
|
|
- var user = await _systemDatabaseService.AuthenticateUserAsync(SelectedUserName, Password);
|
|
|
+ var user = selectedUser.userPart == UserPart.Operator
|
|
|
+ ? selectedUser
|
|
|
+ : await _systemDatabaseService.AuthenticateUserAsync(SelectedUserName, Password);
|
|
|
+
|
|
|
if (user != null)
|
|
|
{
|
|
|
- // set remember flag via system database service
|
|
|
try
|
|
|
{
|
|
|
- if (IsRemember)
|
|
|
- await _systemDatabaseService.SetRememberUserAsync(SelectedUserName);
|
|
|
- else
|
|
|
- await _systemDatabaseService.ClearRememberUserAsync();
|
|
|
+ await _systemDatabaseService.ClearRememberUserAsync();
|
|
|
}
|
|
|
catch
|
|
|
{
|
|
|
@@ -247,7 +321,8 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
// mark current user in system DB and record login
|
|
|
await _systemDatabaseService.SetCurrentUserAsync(user.Id);
|
|
|
await _systemDatabaseService.RecordUserLoginAsync(new UserLoginRecord { UserId = user.Id, Success = true, Time = DateTime.Now, Message = "Login success" });
|
|
|
- _eventAggregator.GetEvent<UserLoginNotification>().Publish(user);
|
|
|
+ Password = string.Empty;
|
|
|
+ _eventAggregator.GetEvent<UserLoginNotification>().Publish(_systemDatabaseService.GetCurrentUser());
|
|
|
View.DialogResult = true;
|
|
|
}
|
|
|
|
|
|
@@ -258,25 +333,43 @@ namespace TeamAAS_VP.ViewModels.User
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
+ Password = string.Empty;
|
|
|
IsLogining = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 判断账号登录命令是否可执行。
|
|
|
+ /// 选择用户名且当前未处于登录中时允许执行。
|
|
|
+ /// </summary>
|
|
|
+ /// <returns>可执行返回 true,否则返回 false。</returns>
|
|
|
bool CanExecuteLoginCommand()
|
|
|
{
|
|
|
return !string.IsNullOrEmpty(SelectedUserName) && !IsLogining;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 关闭登录窗口并返回取消结果。
|
|
|
+ /// </summary>
|
|
|
void ExecuteCloseCommand()
|
|
|
{
|
|
|
View.DialogResult = false;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 切换刷卡登录页和账号登录页。
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="parameter">目标页索引字符串。</param>
|
|
|
void ExecuteTransitionerCommand(string parameter)
|
|
|
{
|
|
|
PageIndex = int.Parse(parameter);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 设置登录窗口模式。
|
|
|
+ /// 管理员模式进入账号登录页并隐藏刷卡按钮,普通模式进入刷卡登录页。
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="isAdmin">是否使用管理员登录模式。</param>
|
|
|
public void SetModel(bool isAdmin)
|
|
|
{
|
|
|
PageIndex = isAdmin ? 1 : 0;
|