Техническое задание: Система управления мероприятиями (Event Manager)
1. Описание проекта
Веб-платформа для создания и продвижения мероприятий с регистрацией участников, расписанием и обсуждениями. Проект закрепляет навыки CRUD, валидации дат и вместимости, разграничения прав и совместной работы через Git.
Команда: 2–3 человека
2. Функциональные требования
2.1. Аутентификация и регистрация
- Регистрация, вход, выход (Laravel Breeze)
2.2. Каталог мероприятий
- Просмотр списка мероприятий с пагинацией
- Фильтрация по категориям (конференции, воркшопы, вебинары, митапы)
- Фильтрация по дате (сегодня, неделя, месяц, будущие)
- Поиск по названию и описанию
- Детальная страница мероприятия (обложка, описание, место, дата, организатор, список участников, комментарии)
2.3. Управление мероприятиями (организатор/админ)
- CRUD мероприятий: название, описание, обложка, категория, дата начала/окончания, место (адрес или онлайн-ссылка), вместимость, стоимость (бесплатно/платно)
- Загрузка обложки мероприятия (валидация: jpg/png, макс. 2MB)
- Управление участниками (просмотр списка, отмена регистрации участника)
2.4. Регистрация на мероприятие
- Кнопка «Зарегистрироваться» на странице мероприятия
- Валидация: проверка на наличие свободных мест (если вместимость ограничена)
- Валидация: пользователь не может зарегистрироваться дважды
- Отмена регистрации (пользователь — до начала мероприятия)
- Список участников мероприятия (публичный)
2.5. Комментарии и обсуждения
- Добавление комментариев к мероприятию
- Удаление своего комментария
- Удаление любого комментария (админ/организатор)
- Пагинация комментариев
2.6. Панель организатора
- Мои мероприятия (созданные мной)
- Статистика по каждому: количество зарегистрированных, свободные места
- Список участников с возможностью экспорта
- Управление комментариями
2.7. Панель участника
- Мои мероприятия (на которые зарегистрирован)
- Прошедшие мероприятия (история)
- Рекомендации (похожие мероприятия)
2.8. Панель администратора
- Управление пользователями и ролями
- Модерация мероприятий (скрыть/показать)
- Общая статистика платформы
3. Структура базы данных
Таблица users
| Поле |
Тип |
Описание |
| id |
BIGINT UNSIGNED |
Первичный ключ |
| name |
VARCHAR(255) |
Имя |
| email |
VARCHAR(255) |
Email (unique) |
| password |
VARCHAR(255) |
Хеш пароля |
| role |
ENUM('admin', 'organizer', 'participant') |
Роль |
| avatar |
VARCHAR(255) | NULL |
Аватар |
| created_at |
TIMESTAMP |
|
| updated_at |
TIMESTAMP |
|
Таблица categories
| Поле |
Тип |
Описание |
| id |
BIGINT UNSIGNED |
Первичный ключ |
| name |
VARCHAR(255) |
Название категории |
| slug |
VARCHAR(255) |
URL-идентификатор (unique) |
| created_at |
TIMESTAMP |
|
| updated_at |
TIMESTAMP |
|
Таблица events
| Поле |
Тип |
Описание |
| id |
BIGINT UNSIGNED |
Первичный ключ |
| title |
VARCHAR(255) |
Название мероприятия |
| slug |
VARCHAR(255) |
URL-идентификатор (unique) |
| description |
TEXT |
Описание |
| cover_image |
VARCHAR(255) | NULL |
Обложка |
| category_id |
BIGINT UNSIGNED |
Категория (FK → categories) |
| organizer_id |
BIGINT UNSIGNED |
Организатор (FK → users) |
| start_datetime |
DATETIME |
Дата и время начала |
| end_datetime |
DATETIME |
Дата и время окончания |
| location |
VARCHAR(255) |
Место проведения (адрес или «Онлайн») |
| location_url |
VARCHAR(255) | NULL |
Ссылка для онлайн-мероприятий |
| capacity |
INT | NULL |
Вместимость (NULL = без ограничений) |
| price |
DECIMAL(10, 2) | NULL |
Стоимость (NULL = бесплатно) |
| is_published |
BOOLEAN |
Опубликован ли |
| created_at |
TIMESTAMP |
|
| updated_at |
TIMESTAMP |
|
Таблица event_user (регистрация на мероприятие)
| Поле |
Тип |
Описание |
| id |
BIGINT UNSIGNED |
Первичный ключ |
| event_id |
BIGINT UNSIGNED |
FK → events |
| user_id |
BIGINT UNSIGNED |
FK → users |
| registered_at |
TIMESTAMP |
Дата регистрации |
| attended |
BOOLEAN |
Присутствовал ли |
| Поле |
Тип |
Описание |
| id |
BIGINT UNSIGNED |
Первичный ключ |
| body |
TEXT |
Текст комментария |
| user_id |
BIGINT UNSIGNED |
Автор (FK → users) |
| event_id |
BIGINT UNSIGNED |
Мероприятие (FK → events) |
| created_at |
TIMESTAMP |
|
| updated_at |
TIMESTAMP |
|
4. Маршруты и контроллеры
// Публичные маршруты
Route::get('/', [EventController::class, 'index'])->name('events.index');
Route::get('/events/{event:slug}', [EventController::class, 'show'])->name('events.show');
// Аутентифицированные маршруты
Route::middleware('auth')->group(function () {
// Регистрация на мероприятие
Route::post('/events/{event}/register', [EventController::class, 'register'])->name('events.register');
Route::post('/events/{event}/unregister', [EventController::class, 'unregister'])->name('events.unregister');
// Комментарии
Route::resource('events.comments', CommentController::class)->scoped(['events' => 'event'])->only(['store', 'destroy']);
// Мои мероприятия (участник)
Route::get('/my-events', [ParticipantController::class, 'index'])->name('participant.events');
// Панель организатора
Route::prefix('organizer')->name('organizer.')->middleware('can:be-organizer')->group(function () {
Route::resource('events', OrganizerEventController::class);
Route::get('events/{event}/attendees', [OrganizerEventController::class, 'attendees'])->name('events.attendees');
Route::post('events/{event}/attendees/{user}/remove', [OrganizerEventController::class, 'removeAttendee'])->name('events.attendees.remove');
Route::get('dashboard', [OrganizerDashboardController::class, 'index'])->name('dashboard');
});
// Админка
Route::prefix('admin')->name('admin.')->middleware('can:access-admin-panel')->group(function () {
Route::resource('users', AdminUserController::class);
Route::patch('events/{event}/toggle-publish', [AdminEventController::class, 'togglePublish'])->name('events.publish');
Route::get('dashboard', [AdminDashboardController::class, 'index'])->name('dashboard');
});
});
Контроллеры
EventController — публичный каталог, регистрация/отмена
CommentController — создание/удаление комментариев
ParticipantController — мои мероприятия (участник)
OrganizerEventController — CRUD мероприятий организатором
OrganizerDashboardController — панель организатора
AdminUserController, AdminEventController, AdminDashboardController — админка
5. Роли, Gates и Policies
Роли
| Роль |
Описание |
admin |
Полный доступ, модерация мероприятий, управление пользователями |
organizer |
Создание/редактирование своих мероприятий, просмотр участников |
participant |
Регистрация на мероприятия, комментарии, просмотр расписания |
Gates
Gate::define('be-organizer', function (User $user) {
return in_array($user->role, ['admin', 'organizer']);
});
Gate::define('access-admin-panel', function (User $user) {
return $user->role === 'admin';
});
Policies
EventPolicy:
view — все (если опубликован), организатор/admin (если не опубликован)
create — organizer или admin
update, delete — организатор мероприятия или admin
register — participant (не зарегистрирован на это мероприятие, есть свободные места)
CommentPolicy:
create — все аутентифицированные
delete — автор комментария, организатор мероприятия или admin
6. Требования к интерфейсу (Bootstrap 5)
Компоненты
- Навбар — логотип, каталог, «Мои мероприятия», профиль
- Карточки мероприятий — обложка, название, дата (бейдж), категория (бейдж), вместимость
- Страница мероприятия — большая обложка, описание, место, дата, кнопка регистрации, список участников, комментарии
- Модальное окно — быстрая регистрация (подтверждение)
- Таблица участников — имя, email, дата регистрации, кнопка удаления (организатор)
- Форма мероприятия — Bootstrap-форма с загрузкой обложки, datetime-local для дат
- Дашборд организатора — статистика (карточки), таблица мероприятий
- Адаптивная сетка —
col-md-4 для карточек, col-md-8 + col-md-4 для основного контента и сайдбара
Цветовая схема категорий
- Конференция —
bg-primary
- Воркшоп —
bg-success
- Вебинар —
bg-info
- Митап —
bg-warning
7. Git-workflow для команды
Распределение модулей (для 2 человек)
| Участник |
Модуль |
Ветки |
| Участник A |
Мероприятия, категории, обложки, регистрация |
feature/events-crud, feature/categories, feature-event-covers |
| Участник B |
Участники, комментарии, панель организатора, UI |
feature/event-registration, feature-attendees, feature-capacity-validation |
Распределение модулей (для 3 человек)
| Участник |
Модуль |
Ветки |
| Участник A |
Мероприятия, категории, загрузка обложек |
feature/events-crud, feature/categories, feature-event-covers |
| Участник B |
Регистрация, участники, валидация вместимости |
feature/event-registration, feature-attendees, feature-capacity-validation |
| Участник C |
Комментарии, панель организатора, каталог, UI |
feature/comments, feature-organizer-panel, feature-event-catalog-ui |
Правила
- Ветка
develop — основная ветка разработки
- Каждый участник создаёт фич-ветки от
develop
- Минимум 3 PR на участника
- Обязательный код-ревью перед мёржем
- Conventional Commits
Визуализация workflow (2 участника)
gitGraph
commit id: "init" tag: "v1.0"
branch develop
checkout develop
branch feature/events-crud
checkout develop
branch feature/event-registration
checkout feature/events-crud
commit id: "feat: add events CRUD"
commit id: "feat: add event categories"
checkout feature/event-registration
commit id: "feat: add event registration"
commit id: "feat: add attendees management"
checkout develop
merge feature/events-crud tag: "PR + review"
merge feature/event-registration tag: "PR + review"
checkout main
merge develop tag: "release v1.1"
Визуализация workflow (3 участника)
gitGraph
commit id: "init" tag: "v1.0"
branch develop
checkout develop
branch feature/events-crud
checkout develop
branch feature/event-registration
checkout develop
branch feature/comments
checkout feature/events-crud
commit id: "feat: add events CRUD"
commit id: "feat: add event covers"
checkout feature/event-registration
commit id: "feat: add event registration"
commit id: "feat: add attendees management"
checkout feature/comments
commit id: "feat: add event comments"
commit id: "feat: add organizer panel"
checkout develop
merge feature/events-crud tag: "PR + review"
merge feature/event-registration tag: "PR + review"
merge feature/comments tag: "PR + review"
checkout main
merge develop tag: "release v1.1"
8. Критерии приёмки
Обязательно
Дополнительно (бонусные баллы)
9. Дополнительные задания (для продвинутых)
- Билеты: генерация PDF-билета с QR-кодом при регистрации
- Уведомления: email при регистрации и напоминание за день до мероприятия
- Онлайн-мероприятия: интеграция с Zoom/Jitsi (сохранение ссылки, автоматическая отправка)
- Тесты: PHPUnit Feature-тесты для EventController (регистрация, валидация вместимости)
- API: RESTful API для каталога мероприятий
- Queue: асинхронная отправка email-уведомлений
- Events & Listeners: событие «регистрация на мероприятие» → отправка email
10. Рекомендуемые материалы