using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Timers; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Navigation; namespace WPF01.pages { using db; /// /// Логика взаимодействия для Authorization.xaml /// public partial class Authorization : Page { // Количество неверно веденного пароля int count = 0; // Таймер, который будет отсчитывать время разблокировки // кнопки Вход в случае 3 неверных попыток ввода логин и пароля Timer timer = new Timer(); // Конструктор окна авторизации public Authorization() { InitializeComponent(); // Задать время счетчику 1 минута (60000 миллисекунд) timer.Interval = 60000; // Установить событие (функция Timeout) которое // будет вызвано, когда 1 минута пройдет // (после запуска timer.Start()) timer.Elapsed += new ElapsedEventHandler(Timeout); } // Функция для вызова таймером void Timeout(object sender, ElapsedEventArgs e) { // Для доступа к кнопке необходим особый механизм // Диспетчер помещает в общую очередь задач // действие, которое будет вызвано в UI потоке. // В общем нужно просто запомнить эту запись Dispatcher.Invoke(new Action(() => { // Включить кнопку buttonLogin.IsEnabled = true; // Остановить таймер timer.Stop(); })); // Вместо записи () => {} можно было бы использовать // имя функции. // например, new Action(имяФункции) } private void ButtonClick(object sender, RoutedEventArgs e) { // Записать значение полей Логин и Пароль // в одтельные переменные для удобства использования string login = textBoxLogin.Text; string password = textBoxPassword.Password; // Проверить количество введенных символов // в поля Логин и Пароль if (login.Length < 4 || password.Length < 4) { return; } // Получить из таблицы Manager запись, которая соответствует // указанному логину и паролю (login, password) IQueryable man = Database.Context.Manager.Where( m => m.Login == login && m.Password == password); // Из полученного результата попытаться взять первую запись Database.User = man.FirstOrDefault(); if (Database.User == null) { // Если записей нет, то сказать пользователю // о неправильном вводе MessageBox.Show("Неверный логин/пароль"); // Увеличить счетчик неверно введенного пароля на единицу count++; // Если счетчик достиг значения 3, то... if (count >= 3) { // заблокировать кнопку Вход buttonLogin.IsEnabled = false; // и запустить таймер на 1 минуту // После 1 минуты таймер разблокирует кнопку timer.Start(); } return; } // Если пользователь был получен (из базы данных) // то проверить его роль, и в соответствии с ролью // открыть нужную страницу switch (Database.User.Role) { case "Директор": // Для роли Директор октрыть страницу "директор" NavigationService.Navigate(PageNavigation.director); break; case "Менеджер": NavigationService.Navigate(PageNavigation.mainPage); break; case "Администратор": NavigationService.Navigate(PageNavigation.mainPage); break; default: NavigationService.Navigate(PageNavigation.mainPage); break; } // На главном окне показать кнопку Мои данные PageNavigation.mainWindow.userInfoButton.Visibility = Visibility.Visible; } private void TextBoxInput(object sender, KeyEventArgs e) { if (textBoxLogin.Text.Length >= 4 && textBoxPassword.Password.Length >= 4) { buttonLogin.IsEnabled = true; } else { buttonLogin.IsEnabled = false; } } private void Label_MouseUp(object sender, MouseButtonEventArgs e) { NavigationService.Navigate(PageNavigation.registration); } } }