using NPOI.SS.Formula.Functions; using Prism.Commands; using Prism.Common; using Prism.Events; using Prism.Ioc; using Prism.Mvvm; using Prism.Regions; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data.Entity; using System.Linq; using System.Threading.Tasks; using TeamAAS_VP.Core; using TeamAAS_VP.Data; using TeamAAS_VP.Events; using TeamAAS_VP.Interfaces; using TeamAAS_VP.Models; using TeamAAS_VP.Resources.Languages; using TeamAAS_VP.Views.User; namespace TeamAAS_VP.ViewModels.User { public class LoginViewModel : BindableBase { private readonly IRegionManager _regionManager; private readonly IEventAggregator _eventAggregator; private readonly IContainerProvider _container; private readonly ISystemDatabaseService _systemDatabaseService; private List Users; #region 属性 private ObservableCollection _UserNameList; /// /// 用户列表 /// public ObservableCollection UserNameList { get { return _UserNameList; } set { _UserNameList = value; } } public string SelectedUserName { get; set; } public string UserPassword { get; set; } public bool IsRemember { get; set; } #endregion #region 命令 /// /// 注册命令 /// public DelegateCommand SignUpCommand { get; set; } /// /// 登录命令 /// public DelegateCommand LoginCommand { get; set; } public DelegateCommand LoadedCommand { get; set; } private DelegateCommand _CardLoginCommand; public DelegateCommand CardLoginCommand => _CardLoginCommand ?? (_CardLoginCommand = new DelegateCommand(ExecuteCardLoginCommand)); #endregion #region 事件 #endregion public LoginViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, ISystemDatabaseService systemDatabaseService) { _regionManager = regionManager; _eventAggregator = ea; _container = container; _systemDatabaseService = systemDatabaseService; LoadedCommand = new DelegateCommand(OnLoad); SignUpCommand = new DelegateCommand(new Action(SignUp)); LoginCommand = new DelegateCommand(async () => await LoginAsync()); UserNameList = new ObservableCollection(); // load users from system database (sync-block safe call) try { Users = _systemDatabaseService.GetAllUsersAsync().GetAwaiter().GetResult()?.ToList(); } catch { Users = new List(); } TeamAAS_VP.Models.User rememberUser = null; if (Users != null) { foreach (var user in Users) { UserNameList.Add(user.UserName); if (user.IsRemember) { rememberUser = user; } } } //对记住的用户界面绑定 if (rememberUser != null) { SelectedUserName = rememberUser.UserName; UserPassword = rememberUser.UserPassword; IsRemember = true; } } #region 方法 private async Task LoginAsync() { if (Users == null || string.IsNullOrEmpty(SelectedUserName) || UserPassword == null) return; if (_systemDatabaseService.GetCurrentUser() != null) { if (_systemDatabaseService.GetCurrentUser().UserName == SelectedUserName) { return; } } try { // authenticate via system database service var user = await _systemDatabaseService.AuthenticateUserAsync(SelectedUserName, UserPassword); if (user != null) { // set remember flag via system database service try { if (IsRemember) await _systemDatabaseService.SetRememberUserAsync(SelectedUserName); else await _systemDatabaseService.ClearRememberUserAsync(); } catch { } // 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.UtcNow, Message = "Login success" }); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.登录成功}!", Duration = 1 }); _eventAggregator.GetEvent().Publish(user); } } catch (Exception ex) { // authentication failed or error await _systemDatabaseService.RecordUserLoginAsync(new UserLoginRecord { UserId = 0, Success = false, Time = DateTime.UtcNow, Message = $"Login failed for {SelectedUserName}: {ex.Message}" }); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.密码错误, Duration = 1 }); } } private void SignUp() { var management = _container.Resolve(); if (_systemDatabaseService.GetCurrentUser().userPart != Enums.UserPart.Administrator) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.当前用户权限不足, Duration = 1 }); return; } _regionManager.RequestNavigate("UserRegionContext", "SignUpView"); } private void OnLoad() { } /// /// 更新用户列表 /// public void UpdateUserList() { UserNameList.Clear(); //获取所有用户 try { Users = _systemDatabaseService.GetAllUsersAsync().GetAwaiter().GetResult()?.ToList(); } catch { Users = new List(); } TeamAAS_VP.Models.User rememberUser = null; if (Users != null) { foreach (var user in Users) { UserNameList.Add(user.UserName); if (user.IsRemember) { rememberUser = user; } } } //对记住的用户界面绑定 if (rememberUser != null) { SelectedUserName = rememberUser.UserName; UserPassword = rememberUser.UserPassword; IsRemember = true; } } /// /// 刷卡登录命令 /// void ExecuteCardLoginCommand() { var cardLogin = _container.Resolve(); var result = cardLogin.ShowDialog(); if (result is bool st1 && !st1) { } } #endregion } }