LoginViewModel.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. using NPOI.SS.Formula.Functions;
  2. using Prism.Commands;
  3. using Prism.Common;
  4. using Prism.Events;
  5. using Prism.Ioc;
  6. using Prism.Mvvm;
  7. using Prism.Regions;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Collections.ObjectModel;
  11. using System.Data.Entity;
  12. using System.Linq;
  13. using System.Threading.Tasks;
  14. using TeamAAS_VP.Core;
  15. using TeamAAS_VP.Data;
  16. using TeamAAS_VP.Events;
  17. using TeamAAS_VP.Interfaces;
  18. using TeamAAS_VP.Models;
  19. using TeamAAS_VP.Resources.Languages;
  20. using TeamAAS_VP.Views.User;
  21. namespace TeamAAS_VP.ViewModels.User
  22. {
  23. public class LoginViewModel : BindableBase
  24. {
  25. private readonly IRegionManager _regionManager;
  26. private readonly IEventAggregator _eventAggregator;
  27. private readonly IContainerProvider _container;
  28. private readonly ISystemDatabaseService _systemDatabaseService;
  29. private List<TeamAAS_VP.Models.User> Users;
  30. #region 属性
  31. private ObservableCollection<string> _UserNameList;
  32. /// <summary>
  33. /// 用户列表
  34. /// </summary>
  35. public ObservableCollection<string> UserNameList
  36. {
  37. get { return _UserNameList; }
  38. set { _UserNameList = value; }
  39. }
  40. public string SelectedUserName { get; set; }
  41. public string UserPassword { get; set; }
  42. public bool IsRemember { get; set; }
  43. #endregion
  44. #region 命令
  45. /// <summary>
  46. /// 注册命令
  47. /// </summary>
  48. public DelegateCommand SignUpCommand { get; set; }
  49. /// <summary>
  50. /// 登录命令
  51. /// </summary>
  52. public DelegateCommand LoginCommand { get; set; }
  53. public DelegateCommand LoadedCommand { get; set; }
  54. private DelegateCommand _CardLoginCommand;
  55. public DelegateCommand CardLoginCommand =>
  56. _CardLoginCommand ?? (_CardLoginCommand = new DelegateCommand(ExecuteCardLoginCommand));
  57. #endregion
  58. #region 事件
  59. #endregion
  60. public LoginViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, ISystemDatabaseService systemDatabaseService)
  61. {
  62. _regionManager = regionManager;
  63. _eventAggregator = ea;
  64. _container = container;
  65. _systemDatabaseService = systemDatabaseService;
  66. LoadedCommand = new DelegateCommand(OnLoad);
  67. SignUpCommand = new DelegateCommand(new Action(SignUp));
  68. LoginCommand = new DelegateCommand(async () => await LoginAsync());
  69. UserNameList = new ObservableCollection<string>();
  70. // load users from system database (sync-block safe call)
  71. try
  72. {
  73. Users = _systemDatabaseService.GetAllUsersAsync().GetAwaiter().GetResult()?.ToList();
  74. }
  75. catch
  76. {
  77. Users = new List<TeamAAS_VP.Models.User>();
  78. }
  79. TeamAAS_VP.Models.User rememberUser = null;
  80. if (Users != null)
  81. {
  82. foreach (var user in Users)
  83. {
  84. UserNameList.Add(user.UserName);
  85. if (user.IsRemember)
  86. {
  87. rememberUser = user;
  88. }
  89. }
  90. }
  91. //对记住的用户界面绑定
  92. if (rememberUser != null)
  93. {
  94. SelectedUserName = rememberUser.UserName;
  95. UserPassword = rememberUser.UserPassword;
  96. IsRemember = true;
  97. }
  98. }
  99. #region 方法
  100. private async Task LoginAsync()
  101. {
  102. if (Users == null || string.IsNullOrEmpty(SelectedUserName) || UserPassword == null)
  103. return;
  104. if (_systemDatabaseService.GetCurrentUser() != null)
  105. {
  106. if (_systemDatabaseService.GetCurrentUser().UserName == SelectedUserName)
  107. {
  108. return;
  109. }
  110. }
  111. try
  112. {
  113. // authenticate via system database service
  114. var user = await _systemDatabaseService.AuthenticateUserAsync(SelectedUserName, UserPassword);
  115. if (user != null)
  116. {
  117. // set remember flag via system database service
  118. try
  119. {
  120. if (IsRemember)
  121. await _systemDatabaseService.SetRememberUserAsync(SelectedUserName);
  122. else
  123. await _systemDatabaseService.ClearRememberUserAsync();
  124. }
  125. catch
  126. {
  127. }
  128. // mark current user in system DB and record login
  129. await _systemDatabaseService.SetCurrentUserAsync(user.Id);
  130. //await _systemDatabaseService.RecordUserLoginAsync(new UserLoginRecord { UserId = user.Id, Success = true, Time = DateTime.Now, Message = "Login success" });
  131. _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"{Lang.登录成功}!", Duration = 1 });
  132. _eventAggregator.GetEvent<UserLoginNotification>().Publish(user);
  133. }
  134. }
  135. catch (Exception ex)
  136. {
  137. // authentication failed or error
  138. await _systemDatabaseService.RecordUserLoginAsync(new UserLoginRecord { UserId = 0, Success = false, Time = DateTime.Now, Message = $"Login failed for {SelectedUserName}: {ex.Message}" });
  139. _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.密码错误, Duration = 1 });
  140. }
  141. }
  142. private void SignUp()
  143. {
  144. var management = _container.Resolve<Management>();
  145. if (_systemDatabaseService.GetCurrentUser().userPart != Enums.UserPart.Administrator)
  146. {
  147. _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.当前用户权限不足, Duration = 1 });
  148. return;
  149. }
  150. _regionManager.RequestNavigate("UserRegionContext", "SignUpView");
  151. }
  152. private void OnLoad()
  153. {
  154. }
  155. /// <summary>
  156. /// 更新用户列表
  157. /// </summary>
  158. public void UpdateUserList()
  159. {
  160. UserNameList.Clear();
  161. //获取所有用户
  162. try
  163. {
  164. Users = _systemDatabaseService.GetAllUsersAsync().GetAwaiter().GetResult()?.ToList();
  165. }
  166. catch
  167. {
  168. Users = new List<TeamAAS_VP.Models.User>();
  169. }
  170. TeamAAS_VP.Models.User rememberUser = null;
  171. if (Users != null)
  172. {
  173. foreach (var user in Users)
  174. {
  175. UserNameList.Add(user.UserName);
  176. if (user.IsRemember)
  177. {
  178. rememberUser = user;
  179. }
  180. }
  181. }
  182. //对记住的用户界面绑定
  183. if (rememberUser != null)
  184. {
  185. SelectedUserName = rememberUser.UserName;
  186. UserPassword = rememberUser.UserPassword;
  187. IsRemember = true;
  188. }
  189. }
  190. /// <summary>
  191. /// 刷卡登录命令
  192. /// </summary>
  193. void ExecuteCardLoginCommand()
  194. {
  195. var cardLogin = _container.Resolve<CardLoginWindow>();
  196. var result = cardLogin.ShowDialog();
  197. if (result is bool st1 && !st1)
  198. {
  199. }
  200. }
  201. #endregion
  202. }
  203. }