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;
Связанная документация¶
- Domain Layer (Core) — доменные модели
- ClientApi — REST API
- Справочник: Роли — подробнее о ролях