Задание
Необходимо разработать программное средство для автоматизация приема и анализа заявок технической поддержки.
Программа должна включать в себя возможность авторизации пользователя с последующей работой с заявками системы.
Технологии: C#, WPF (.NET 6) + MVVM, SQL Server 2019.
Для симпатичного интерфейса подключен пакет HandyControl, обеспечивающий современный вид элементов управления на интерфейсе пользователя.
Функционал программы
Для решения задачи были реализованы следующие функциональные возможности:
- Авторизации пользователя;
- Управление пользователями;
- Управления категориями заявок;
- Управление отделами технической поддержки;
- Создание заявок технической поддержки;
- Управление заявками;
Каждая функциональная возможность также требует наличия окна редактирования сущности.
Управление системой разделено на Администратора и Специалиста технической поддержки.
Фрагмент программного кода
/// <summary> /// Класс авторизации пользователя в системе с UI /// </summary> public sealed class AuthViewModel : BaseViewModel { private readonly IAuthorizationService _authService; private readonly IServiceProvider _serviceProvider; public override string Title => "Авторизация"; // Логин пользователя public string Login { get => GetValue<string>(nameof(Login)); set => SetValue(value, nameof(Login)); } public ICommand LoginCommand { get; } public AuthViewModel(IAuthorizationService authSerivce, IServiceProvider serviceProvider) { _authService = authSerivce; _serviceProvider = serviceProvider; LoginCommand = new AsyncCommand<object>(TryLogin, x => !string.IsNullOrWhiteSpace(Login)); } // Метод авторизации пользователя public async Task TryLogin(object passwordControl) { await Execute(async () => { var pswrdBox = (PasswordBox)passwordControl; // Проверка полей if (string.IsNullOrWhiteSpace(Login) || string.IsNullOrWhiteSpace(pswrdBox.Password)) { MessageBox.Error("Заполните все поля.", "Ошибка авторизации"); return; } try { // Попытка авторизовать пользователя var user = await _authService.Authorize(Login, pswrdBox.Password); // Установка текущего пользователя App.CurrentUser = user; // Отображение окна с меню _serviceProvider.GetRequiredService<MainView>().Show(); // Закрыть окно авторизации App.Current.Windows[0].Close(); } catch (AuthorizeException) { MessageBox.Error("Неверный логин или пароль.", "Ошибка авторизации"); } catch (UserNotFoundAuthorizeException) { MessageBox.Error("Пользователь с таким логином и паролем не существует.", "Ошибка авторизации"); } catch (Exception e) { MessageBox.Error(e.Message, "Внутренняя ошибка"); } }); } }
/// <summary> /// Сервис для авторизации пользователей в системе /// </summary> internal class AuthorizationService : IAuthorizationService { private readonly TechSupportContext _context; public AuthorizationService(TechSupportContext context) { _context = context; } /// <summary> /// Метод авторизации пользователя /// </summary> /// <param name="nickname">Логин</param> /// <param name="password">Пароль</param> public async Task<CurrentUser> Authorize(string nickname, string password) { // Преобразование пароля в хэш var passwordHash = PasswordGenerator.Generate(password); // Поиск пользователя в базе var user = await _context.Users.FirstOrDefaultAsync(x => x.Login == nickname); if (user is null) { // Выбросить исключение, если пользователь не найден throw new UserNotFoundAuthorizeException(); } if (user.PasswordHash != passwordHash) { // Выбросить исключение, если пароль не совпадает throw new AuthorizeException(); } // Преобразование модели return user.ToCurrentUser(); } }
Скриншот архива с проектом
Пояснения по запуску программы
Для запуска программы должны быть установлены следующие компоненты:
- Visual Studio 2019;
- .NET 6;
- SQL Server (Local Db).
Всё это можно установить в установщике Visual Studio Installer при установке Visual Studio 2019.
После просто открыть проект и запустить программу. База автоматически создастся с пользователем admin для входа в программу.
Структура проекта
kostyaLem