Перейти к содержанию

FuelProcessing.Web — MVC Interface

Обзор

FuelProcessing.Web — ASP.NET Core MVC приложение, представляющее собой веб-интерфейс системы управления топливными картами и договорами.

Структура

FuelProcessing.Web/
├── Code/
│   ├── Helpers/           # Вспомогательные классы для Telerik UI
│   ├── Localizer/         # Система локализации
│   └── Security/          # Авторизация и права доступа
├── Controllers/           # Контроллеры
│   ├── Base/             # Базовые контроллеры
│   ├── CatalogData/      # Справочники
│   ├── Cards/            # Управление картами
│   ├── FuelSelling/      # Продажа топлива
│   └── OwnVehicleFleet/  # Собственный автопарк
├── Validation/           # FluentValidation валидаторы
├── ViewModel/           # ViewModels
├── Views/               # Razor представления
├── wwwroot/            # Статические файлы
├── Startup.cs
└── Program.cs

Система авторизации

Трёхуровневая модель прав

graph TD
    USER[User] --> HAS_ROLE[Has Role]
    HAS_ROLE --> ROLE[Role: Admin/SuperUser/Manager/Driver]
    USER --> BELONGS[Belongs to Company]
    BELONGS --> COMPANY[Company]
    COMPANY --> HAS_OPTIONS[Has Options]
    HAS_OPTIONS --> OPTION[Company Options]

    ROLE -->|defines| RIGHTS[Role Rights]
    OPTION -->|modifies| RIGHTS
    RIGHTS -->|controls| MODULE[Site Modules]

SiteModule — модули сайта

60+ модулей системы:

Модуль Описание
Billing Топливо онлайн
Dashboard Административная панель
Users Пользователи
CompanyBuyer Покупатели топлива
CompanySeller Поставщики топлива
Map АЗС на карте
Limits Лимиты
Reports Отчёты
VinkCards Карты ВИНК
IssuedManagerCards Выданные карты
TransactionHistory История транзакций

RoleRights — права доступа

public class RoleRights
{
    public bool Edit { get; set; }    // Право на редактирование
    public bool View { get; set; }    // Право на просмотр
    public bool Delete { get; set; }  // Право на удаление
}

AuthorizeRoleFilter — фильтр авторизации

[AuthorizeRoleFilter(SiteModule.Billing)]
public class BillingController : BaseController
{
    // Только пользователи с правом View на Billing
}

Права по ролям

Роль Описание Права
Admin Администратор Полные права на все модули
SuperUser Суперпользователь Полный доступ в зависимости от опций компании
Manager Менеджер Управление выданными картами, отчёты
CarDriver Водитель Просмотр карты, история транзакций, лимиты

CompanyOption — опции компании

public enum CompanyOption
{
    SelfDirectContarctWithWink,    // Собственные договоры с ВИНКами
    AccessToDirectContracts,       // Доступ к прямым договорам
    AccessToResale,                // Перепродажа
    HasGasStatationNetwork,        // Собственная сеть АЗС
    AccessToFuelUsing,             // Потребление топлива
    AccessToAuth                   // Доступ к авторизации
}

Контроллеры

BaseController

Базовый класс для всех контроллеров с авторизацией.

[Authorize]
public class BaseController : Controller
{
    protected int CompanyIdOrFromFilter()
    {
        // Получение ID компании из фильтра Telerik
        // или текущего пользователя
    }

    protected int CompanyId()
    {
        // ID компании текущего пользователя (не для админа)
    }
}

BaseCatalogController\

Базовый контроллер для CRUD операций справочников.

public class BaseCatalogController<T> : BaseController where T : Entity
{
    [HttpGet]
    public async Task<JsonResult> Read([DataSourceRequest] request)

    [HttpPost]
    public async Task<JsonResult> Create([DataSourceRequest] request, T model)

    [HttpPost]
    public async Task<JsonResult> Update([DataSourceRequest] request, T model)

    [HttpPost]
    public async Task<JsonResult> Destroy([DataSourceRequest] request, T model)
}

Основные контроллеры

AccountController

Endpoint HTTP Описание
/Account/Login GET/POST Форма входа / обработка
/Account/Logout POST Выход из системы
/Account/RestorePassword GET/POST Восстановление пароля
/Account/NewPassword GET/POST Установка нового пароля
/Account/AccessDenied GET Доступ запрещён

Особенности: - Блокировка после 5 неудачных попыток (10 минут) - Токен восстановления пароля действует 1 час

BillingController

Управление топливными счетами.

Endpoint HTTP Описание
/Billing/Index GET Главная страница биллинга
/Billing/Read GET Получение балансов
/Billing/ExportToExcel GET Экспорт (Admin only)

DashboardController

Административная панель.

Endpoint HTTP Описание
/Dashboard/Index GET Главная панель
/Dashboard/RemoteData GET JSON данные для панели
/Dashboard/ExportMissingContractTerms GET Экспорт проблемных контрактов

MapController

Карта АЗС с фильтрацией.

Endpoint HTTP Описание
/Map/Index GET Карта АЗС
/Map/GetGasStationsWithinRectangle GET АЗС в области
/Map/GetBrandsByCardType GET Бренды по типу карты

UserReportsController

Генерация и скачивание отчётов.

Endpoint HTTP Описание
/UserReports/Index GET Страница отчётов
/UserReports/Generate POST Создание отчёта
/UserReports/DownloadFile GET Скачать файл
/UserReports/RestoreReports GET Восстановить зависшие

Валидация (FluentValidation)

Пример валидатора

public class DirectContractValidation : AbstractValidator<DirectContractViewModel>
{
    public DirectContractValidation(...)
    {
        RuleFor(x => x.UserId).NotEqual(0).WithMessage("Необходимо заполнить");
        RuleFor(x => x.ContractNumber).NotEmpty().WithMessage("Необходимо заполнить");
        RuleFor(x => x.Inn).NotEmpty().WithMessage("Необходимо заполнить");
    }
}

Валидаторы

Валидатор Назначение
CompanyValidation Валидация компании
UserValidation Валидация пользователя
DirectContractValidation Валидация договора
ActivateCardViewModelValidation Активация карты

Startup и конфигурация

Конвейер запроса

1. HSTS + HTTPS Redirection
2. Static Files
3. Routing
4. Session (60 минут)
5. Authentication (Cookies)
6. Authorization
7. Request Localization (ru-RU)
8. MVC Endpoints

DI Container

// Scoped
services.AddDbContext<DataContext>();
services.AddIdentity<User, Role>();
services.AddAutoMapper(...);
services.AddMassTransit(...);  // RabbitMQ

// Transient
services.AddScoped<CardRepository>();
services.AddScoped<CardService>();

Безопасность

CSRF защита

Все POST методы помечены [ValidateAntiForgeryToken]

Data Protection

services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo("TempFiles/Protect/"))
    .SetApplicationName("FuelProcessing");

Lockout policy

options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;

Связанная документация