Документация ЛК
Модули

Администраторы

Модуль "Администраторы"

Версия: 1.0
Дата: 2025-11-24
Статус: Реализован


Содержание

  1. Общее описание
  2. Текущая реализация
  3. Права доступа
  4. Описание полей
  5. UI/UX
  6. Бизнес-логика
  7. Выявленные проблемы
  8. Рекомендации

1. Общее описание

1.1 Предназначение модуля

Модуль "Администраторы" предназначен для управления пользователями с административными правами (group_id = 1). Администраторы имеют полный или частичный доступ ко всем функциям системы.

Основные функции:

  • Создание и редактирование учётных записей администраторов
  • Назначение индивидуальных прав (политик) доступа
  • Авторизация под учётной записью администратора (impersonate)
  • Управление статусом активности
  • Флаг "Суперадминистратор"

1.2 Связь с другими модулями

МодульСвязь
Политики доступаИндивидуальные права через user_policies
ЗаказыАдминистратор может управлять всеми заказами
Все модулиДоступ определяется политиками

1.3 Статистика

МетрикаЗначение
Всего администраторов6
Активных6
Суперадминов6
С Telegram2

2. Текущая реализация

2.1 Архитектура

┌─────────────────────────────────────────────────────────────────────────────┐
│                        МОДУЛЬ "АДМИНИСТРАТОРЫ"                               │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  РОУТЫ (routes/web.php)                                                      │
│  ├── GET /admins           → AdminController@index  → Список                 │
│  ├── GET /admins/add       → AdminController@create → Создание               │
│  └── GET /admins/edit/{id} → AdminController@show   → Редактирование         │
│                                                                              │
│  КОНТРОЛЛЕР (AdminController.php)                                            │
│  └── Проверка прав: admin_can_view, admin_can_add                            │
│                                                                              │
│  LIVEWIRE КОМПОНЕНТЫ                                                         │
│  ├── Admins/Listing.php  — Таблица администраторов                          │
│  ├── Admins/Add.php      — Форма создания                                   │
│  ├── Admins/Edit.php     — Форма редактирования с вкладками                 │
│  └── Admins/Policies.php — Таблица политик на вкладке "Права"               │
│                                                                              │
│  МОДЕЛЬ                                                                      │
│  └── User (group_id = 1) — администраторы в общей таблице users             │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘

2.2 Структура данных

Администраторы хранятся в таблице users с group_id = 1.

Поля администратора в таблице users

ПолеТипОписание
idbigintPK
group_idint1 для администраторов
emailstringEmail (уникальный)
passwordstringХэш пароля
namestringИмя
lastnamestringФамилия
middlenamestringОтчество
positionstringДолжность
phonestringТелефон
tg_idstringID Telegram
imagestringАватар
activebooleanАктивен
superadminbooleanСуперадминистратор
last_authdatetimeПоследняя авторизация
created_attimestamp
updated_attimestamp

Таблица user_policies (индивидуальные права)

ПолеТипОписание
user_idFKПользователь
policy_idFKПолитика
valuebooleanВключена / выключена

2.3 Файлы модуля

app/
├── Http/Controllers/
│   └── AdminController.php
├── Livewire/Admins/
│   ├── Add.php       — Форма создания
│   ├── Edit.php      — Форма редактирования (с вкладками)
│   ├── Listing.php   — Таблица списка
│   └── Policies.php  — Таблица политик
└── Models/
    ├── User.php (group_id = 1)
    ├── Policy.php
    └── UserPolicy.php

resources/views/templates/admins/
├── table.blade.php
├── add.blade.php
├── edit.blade.php
└── policies.blade.php

3. Права доступа

3.1 Политики модуля

ПолитикаОписание
admin_can_viewПросмотр списка администраторов
admin_can_addСоздание администратора
admin_can_editРедактирование данных администратора
admin_can_deleteУдаление администратора
admin_can_authАвторизация под администратором (impersonate)
admin_can_edit_policyРедактирование прав администратора

3.2 Проверка в контроллере

// AdminController.php
public function index(Request $request)
{
    if (!$user->check_access('admin_can_view'))
        abort(403);
}

public function create(Request $request)
{
    if (!$user->check_access('admin_can_add'))
        abort(403);
}

3.3 Матрица доступа по ролям

РольПросмотрСозданиеРедактир.УдалениеImpersonateПрава
Администратор✅*✅*✅*✅*✅*✅*
Менеджер
Производство
Дилер

*Зависит от индивидуальных политик пользователя


4. Описание полей

4.1 Форма создания (Add.php)

ПолеТипОбязательноеОписание
emailTextInputEmail (unique)
passwordPasswordПароль
lastnameTextInputФамилия
nameTextInputИмя
middlenameTextInputОтчество
positionTextInputДолжность
phoneTextInputТелефон (маска +7)
activeToggleАктивен (по умолчанию true)
imageFileUploadАватар (1:1, crop)

При создании автоматически: group_id = 1

4.2 Форма редактирования (Edit.php)

Вкладка "Данные"

ПолеТипОсобенности
emailTextInputDisabled если нет прав
passwordPasswordHidden если нет прав, хэшируется
lastnameTextInput
nameTextInput
middlenameTextInput
positionTextInput
phoneTextInputМаска +7(999) 999 99 99
tg_idTextInputID Telegram
last_authTextInputТолько чтение
activeToggle
superadminToggleФлаг суперадмина
imageFileUploadАватар

Вкладка "Права"

Доступна только при наличии admin_can_edit_policy.

Содержит таблицу политик (Policies.php):

  • Группировка по категориям
  • ToggleColumn для включения/выключения
  • Фильтр по категориям
  • Поиск по ключу, названию, описанию

4.3 Колонки таблицы списка

КолонкаОписаниеОсобенности
imageАватарImageColumn
emailEmailПоиск
nameИмяПоиск
lastnameФамилияПоиск
phoneТелефонПоиск
tg_idID TelegramПоиск
activeАктивенToggleColumn

5. UI/UX

5.1 Список администраторов

┌─────────────────────────────────────────────────────────────────────────────┐
│ Администраторы                                              [+ Создать]     │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                    [Поиск...] [Столбцы ▾]   │
├──────┬──────┬────────────────────┬─────────┬──────────┬──────────┬──────────┤
│ ☐    │ Фото │ Email              │ Имя     │ Фамилия  │ Телефон  │ Активен  │
├──────┼──────┼────────────────────┼─────────┼──────────┼──────────┼──────────┤
│ ☐    │ [📷] │ admin@company.ru   │ Админ   │ Главный  │ +7(999)..│ [●]      │
│ ☐    │ [📷] │ manager@company.ru │ Иван    │ Петров   │ +7(916)..│ [●]      │
└──────┴──────┴────────────────────┴─────────┴──────────┴──────────┴──────────┘

Действия:
✅ [Авторизоваться] — войти под учёткой (impersonate)
✅ [Удалить] — с подтверждением

Особенности:
- Кнопка "Создать" ведёт на отдельную страницу
- Клик по строке → карточка редактирования
- Массовое удаление

5.2 Карточка редактирования

┌─────────────────────────────────────────────────────────────────────────────┐
│ [← Назад]  Редактирование администратора        [Удалить]     [Сохранить]   │
├─────────────────────────────────────────────────────────────────────────────┤
│  [Данные]  [Права]                                                          │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│ ┌─────────────────────────────────────────────┐  ┌────────────────────────┐ │
│ │ Email        [admin@company.ru          ]   │  │ Изображение            │ │
│ │                                             │  │ ┌────────────────────┐ │ │
│ │ Пароль       [••••••••              ] [👁]  │  │ │                    │ │ │
│ │                                             │  │ │   [📷 Аватар]      │ │ │
│ │ Фамилия      [Главный                   ]   │  │ │                    │ │ │
│ │                                             │  │ └────────────────────┘ │ │
│ │ Имя          [Админ                     ]   │  │                        │ │
│ │                                             │  └────────────────────────┘ │
│ │ Отчество     [                          ]   │                             │
│ │                                             │                             │
│ │ Должность    [Руководитель              ]   │                             │
│ │                                             │                             │
│ │ Телефон      [+7(999) 123-45-67         ]   │                             │
│ │                                             │                             │
│ │ ID телеграмма [123456789                ]   │                             │
│ │                                             │                             │
│ │ Посл. авторизация  [2025-11-24 10:30:00]   │                             │
│ │                                             │                             │
│ │ Активен           [●]    Суперадмин  [●]   │                             │
│ └─────────────────────────────────────────────┘                             │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘

5.3 Вкладка "Права"

┌─────────────────────────────────────────────────────────────────────────────┐
│  [Данные]  [Права]                                                          │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                    [Поиск...] [Фильтр ▾]    │
│                                                                              │
│  ▼ Категория: Администраторы                                                │
│  ┌──────────────────────┬───────────────────────────┬──────────────┬───────┐│
│  │ Ключ                 │ Название                  │ Категория    │       ││
│  ├──────────────────────┼───────────────────────────┼──────────────┼───────┤│
│  │ admin_can_view       │ Может просматривать       │Администраторы│ [ ]   ││
│  │ admin_can_add        │ Может добавлять           │Администраторы│ [ ]   ││
│  │ admin_can_edit       │ Может редактировать       │Администраторы│ [●]   ││
│  │ admin_can_delete     │ Может удалять             │Администраторы│ [ ]   ││
│  │ admin_can_auth       │ Может авторизовываться    │Администраторы│ [●]   ││
│  │ admin_can_edit_policy│ Может редактировать права │Администраторы│ [ ]   ││
│  └──────────────────────┴───────────────────────────┴──────────────┴───────┘│
│                                                                              │
│  ▼ Категория: Дилеры (Компании)                                             │
│  ┌──────────────────────┬───────────────────────────┬──────────────┬───────┐│
│  │ company_can_view     │ Может видеть все компании │Дилеры (Комп.)│ [●]   ││
│  │ company_can_add      │ Может добавлять компании  │Дилеры (Комп.)│ [●]   ││
│  │ ...                  │ ...                       │ ...          │ ...   ││
│  └──────────────────────┴───────────────────────────┴──────────────┴───────┘│
│                                                                              │
│  Показано с 1 по 10 из 57                        [10][50][100][Все]         │
└─────────────────────────────────────────────────────────────────────────────┘

6. Бизнес-логика

6.1 Автоматическое создание UserPolicy при редактировании

При открытии карточки редактирования для администратора автоматически создаются записи в user_policies для всех существующих политик:

// Edit.php — mount()
$policies = Policy::all();
foreach ($policies as $policy) {
    UserPolicy::firstOrCreate(
        [
            'user_id' => $this->record->id,
            'policy_id' => $policy->id,
        ],
        ['value' => false]  // По умолчанию выключено
    );
}

6.2 Проверка прав (check_access)

Метод check_access() в модели User проверяет права:

  1. Если пользователь — суперадмин → все права разрешены
  2. Иначе проверяет user_policies.value для данной политики

6.3 Impersonate (авторизация под администратором)

Позволяет войти в систему под другим администратором:

// Listing.php
Action::make('auth')
    ->label('Авторизоваться')
    ->icon('heroicon-o-user')
    ->url(fn (User $record): string => route('impersonate', $record->id))

Требует право: admin_can_auth

6.4 Хэширование пароля

// Edit.php
TextInput::make('password')
    ->dehydrateStateUsing(fn ($state) => $state ? Hash::make($state) : null)
    ->dehydrated(fn ($state) => filled($state))  // Только если заполнен

6.5 Флаг Superadmin

Поле superadmin даёт полные права без проверки индивидуальных политик.


7. Выявленные проблемы

7.1 Критические

#ПроблемаФайлВлияние
Критических проблем не обнаружено

7.2 Средние

#ПроблемаОписаниеРешение
1Ошибка в проверке save()Проверяется manager_can_edit вместо admin_can_editИсправить на admin_can_edit
2Инверсия логики $can_edit$can_edit = !check_access() — инвертированная логикаПереименовать в $disableEdit
3Нет валидации email на уникальность при редактированииМожно сохранить дублирующийся emailДобавить unique(ignoreRecord: true)
4Разные маски телефонаВ Add: +7 (999)..., в Edit: +7(999)...Унифицировать

7.3 Низкие

#ПроблемаОписание
5Нет истории изменений правНе видно кто и когда менял политики
6Нет экспортаНельзя выгрузить список администраторов
7Policies рендерит неправильный view'livewire.news.listing' вместо своего

8. Рекомендации

8.1 Приоритет: Высокий

Исправить проверку прав при сохранении

// Edit.php:70 — было:
if ($this->authUser->check_access('manager_can_edit')) {

// Стало:
if ($this->authUser->check_access('admin_can_edit')) {

8.2 Приоритет: Средний

Исправить инверсию логики

// Listing.php:28-29 — было:
$can_edit = !$this->auth_user->check_access('admin_can_edit');
$can_delete = !$this->auth_user->check_access('admin_can_delete');

// Стало (переименовать для ясности):
$disableEdit = !$this->auth_user->check_access('admin_can_edit');
$disableDelete = !$this->auth_user->check_access('admin_can_delete');

Добавить уникальность email

// Edit.php — editData()
TextInput::make('email')
    ->unique(table: User::class, ignoreRecord: true)

8.3 Приоритет: Низкий

Исправить view в Policies

// Policies.php:61 — было:
return view('livewire.news.listing');

// Стало:
return view('livewire.base.listing');

Приложение: SQL для аналитики

Администраторы с их правами

SELECT 
    u.id,
    u.email,
    u.name,
    u.lastname,
    u.superadmin,
    COUNT(CASE WHEN up.value = 1 THEN 1 END) as enabled_policies
FROM users u
LEFT JOIN user_policies up ON u.id = up.user_id
WHERE u.group_id = 1
GROUP BY u.id, u.email, u.name, u.lastname, u.superadmin;

Неактивные администраторы

SELECT id, email, name, lastname, last_auth
FROM users
WHERE group_id = 1 AND active = 0;

Все политики конкретного администратора

SELECT 
    p.key,
    p.name,
    p.category,
    up.value
FROM user_policies up
JOIN policies p ON up.policy_id = p.id
WHERE up.user_id = :admin_id
ORDER BY p.category, p.name;

Документ подготовлен на основе анализа исходного кода проекта

On this page

Модуль "Администраторы"Содержание1. Общее описание1.1 Предназначение модуля1.2 Связь с другими модулями1.3 Статистика2. Текущая реализация2.1 Архитектура2.2 Структура данныхПоля администратора в таблице usersТаблица user_policies (индивидуальные права)2.3 Файлы модуля3. Права доступа3.1 Политики модуля3.2 Проверка в контроллере3.3 Матрица доступа по ролям4. Описание полей4.1 Форма создания (Add.php)4.2 Форма редактирования (Edit.php)Вкладка "Данные"Вкладка "Права"4.3 Колонки таблицы списка5. UI/UX5.1 Список администраторов5.2 Карточка редактирования5.3 Вкладка "Права"6. Бизнес-логика6.1 Автоматическое создание UserPolicy при редактировании6.2 Проверка прав (check_access)6.3 Impersonate (авторизация под администратором)6.4 Хэширование пароля6.5 Флаг Superadmin7. Выявленные проблемы7.1 Критические7.2 Средние7.3 Низкие8. Рекомендации8.1 Приоритет: ВысокийИсправить проверку прав при сохранении8.2 Приоритет: СреднийИсправить инверсию логикиДобавить уникальность email8.3 Приоритет: НизкийИсправить view в PoliciesПриложение: SQL для аналитикиАдминистраторы с их правамиНеактивные администраторыВсе политики конкретного администратора