laravel-12-tech-specs/task01-task-manager.md

337 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Техническое задание: Система управления задачами (Task Manager)
## 1. Описание проекта
Веб-приложение для управления личными и командными задачами с возможностью назначения исполнителей, отслеживания статусаов и приоритетов. Проект закрепляет навыки CRUD, разграничения прав через Roles/Gates/Policies, совместной работы через Git.
**Команда:** 23 человека
---
## 2. Функциональные требования
### 2.1. Аутентификация и регистрация
- Регистрация, вход, выход (Laravel Breeze)
- Восстановление пароля (опционально)
### 2.2. Управление задачами
- Создание, просмотр, редактирование, удаление задач
- Поля задачи: название, описание, статус (новая, в работе, завершена), приоритет (низкий, средний, высокий, критический), дедлайн, исполнитель, автор
- Назначение исполнителя из списка пользователей
- Добавление комментариев к задаче
- Фильтрация по статусу, приоритету, исполнителю
- Сортировка по дате создания, приоритету, дедлайну
- Пагинация списка задач
### 2.3. Управление проектами
- Создание проектов (группировка задач)
- Привязка задач к проекту
- CRUD проектов
### 2.4. Панель администратора
- Управление пользователями (просмотр, блокировка, назначение ролей)
- Просмотр статистики (количество задач, проектов, пользователей)
### 2.5. Дашборд пользователя
- Мои задачи (назначенные мне)
- Созданные мной задачи
- Просроченные задачи
- Быстрая смена статуса
---
## 3. Структура базы данных
### Таблица `users`
| Поле | Тип | Описание |
|---|---|---|
| id | BIGINT UNSIGNED | Первичный ключ |
| name | VARCHAR(255) | Имя |
| email | VARCHAR(255) | Email (unique) |
| password | VARCHAR(255) | Хеш пароля |
| role | ENUM('admin', 'manager', 'executor') | Роль |
| is_blocked | BOOLEAN | Заблокирован ли |
| created_at | TIMESTAMP | Дата создания |
| updated_at | TIMESTAMP | Дата обновления |
### Таблица `projects`
| Поле | Тип | Описание |
|---|---|---|
| id | BIGINT UNSIGNED | Первичный ключ |
| name | VARCHAR(255) | Название проекта |
| description | TEXT | Описание |
| user_id | BIGINT UNSIGNED | Автор проекта (FK → users) |
| created_at | TIMESTAMP | |
| updated_at | TIMESTAMP | |
### Таблица `tasks`
| Поле | Тип | Описание |
|---|---|---|
| id | BIGINT UNSIGNED | Первичный ключ |
| title | VARCHAR(255) | Название задачи |
| description | TEXT | Описание |
| status | ENUM('new', 'in_progress', 'completed', 'cancelled') | Статус |
| priority | ENUM('low', 'medium', 'high', 'critical') | Приоритет |
| due_date | DATE | Дедлайн |
| author_id | BIGINT UNSIGNED | Автор (FK → users) |
| assignee_id | BIGINT UNSIGNED \| NULL | Исполнитель (FK → users) |
| project_id | BIGINT UNSIGNED \| NULL | Проект (FK → projects) |
| created_at | TIMESTAMP | |
| updated_at | TIMESTAMP | |
### Таблица `comments`
| Поле | Тип | Описание |
|---|---|---|
| id | BIGINT UNSIGNED | Первичный ключ |
| body | TEXT | Текст комментария |
| user_id | BIGINT UNSIGNED | Автор комментария (FK → users) |
| task_id | BIGINT UNSIGNED | Задача (FK → tasks) |
| created_at | TIMESTAMP | |
| updated_at | TIMESTAMP | |
---
## 4. Маршруты и контроллеры
### Route группы
```php
// Публичные маршруты
Route::get('/', [DashboardController::class, 'index'])->name('dashboard');
// Аутентифицированные маршруты
Route::middleware('auth')->group(function () {
// Задачи
Route::resource('tasks', TaskController::class);
Route::patch('tasks/{task}/status', [TaskController::class, 'updateStatus'])->name('tasks.status');
// Комментарии
Route::resource('tasks.comments', CommentController::class)->scoped(['tasks' => 'task']);
// Проекты
Route::resource('projects', ProjectController::class);
// Админка
Route::prefix('admin')->name('admin.')->group(function () {
Route::resource('users', AdminUserController::class);
Route::patch('users/{user}/block', [AdminUserController::class, 'toggleBlock'])->name('users.block');
Route::patch('users/{user}/role', [AdminUserController::class, 'changeRole'])->name('users.role');
});
});
```
### Контроллеры
- `TaskController` — CRUD задач + обновление статуса
- `CommentController` — CRUD комментариев (только создание и удаление)
- `ProjectController` — CRUD проектов
- `AdminUserController` — управление пользователями (только admin)
- `DashboardController` — дашборд с фильтрами
---
## 5. Роли, Gates и Policies
### Роли
| Роль | Описание |
|---|---|
| `admin` | Полный доступ ко всему |
| `manager` | Создание/редактирование проектов и задач, назначение исполнителей |
| `executor` | Просмотр назначенных задач, изменение статуса, комментарии |
### Gates (в `AuthServiceProvider`)
```php
Gate::define('access-admin-panel', function (User $user) {
return $user->role === 'admin';
});
Gate::define('assign-tasks', function (User $user) {
return in_array($user->role, ['admin', 'manager']);
});
Gate::define('manage-projects', function (User $user) {
return in_array($user->role, ['admin', 'manager']);
});
```
### Policies
**TaskPolicy:**
- `view` — может видеть задачу, если автор или исполнитель, или имеет роль admin/manager
- `update` — автор, назначенный исполнитель (только статус), admin, manager
- `delete` — только автор задачи или admin
- `assign` — только admin или manager
**ProjectPolicy:**
- `view` — все аутентифицированные
- `update`, `delete` — автор проекта или admin
**CommentPolicy:**
- `create` — все аутентифицированные
- `delete` — автор комментария или admin
---
## 6. Требования к интерфейсу (Bootstrap 5)
### Компоненты
- **Навбар** — логотип, навигация, профиль пользователя
- **Карточки задач** — заголовок, бейджи статуса/приоритета, дедлайн, исполнитель
- **Таблица списка задач** — с сортировкой, фильтрами, пагинацией
- **Модальное окно** — быстрое создание/редактирование задачи
- **Формы** — валидация на клиенте и сервере, Bootstrap-классы `is-invalid`
- **Алерты** — flash-сообщения об успехе/ошибке (`alert-success`, `alert-danger`)
- **Дашборд** — сетка Bootstrap (`row`, `col-md-*`) с карточками статистики
- **Бейджи** — цветные индикаторы статуса и приоритета
### Цветовая схема статусов
- Новая — `bg-info`
- В работе — `bg-warning`
- Завершена — `bg-success`
- Отменена — `bg-secondary`
### Цветовая схема приоритетов
- Низкий — `bg-light text-dark`
- Средний — `bg-primary`
- Высокий — `bg-warning`
- Критический — `bg-danger`
---
## 7. Git-workflow для команды
### Распределение модулей (для 2 человек)
| Участник | Модуль | Ветки |
|---|---|---|
| **Участник A** | Аутентификация, пользователи, админка, задачи | `feature/auth-users`, `feature/tasks-crud` |
| **Участник B** | Проекты, комментарии, дашборд, UI | `feature/projects-crud`, `feature-task-comments` |
### Распределение модулей (для 3 человек)
| Участник | Модуль | Ветки |
|---|---|---|
| **Участник A** | Аутентификация, пользователи, админка | `feature/auth-users`, `feature/admin-panel` |
| **Участник B** | Задачи, комментарии, фильтры | `feature/tasks-crud`, `feature/task-comments` |
| **Участник C** | Проекты, дашборд, UI | `feature/projects-crud`, `feature/dashboard-ui` |
### Правила
1. Каждый участник работает в своей фич-ветке от `develop`
2. Перед мёржем в `develop` — Pull Request с код-ревью от другого участника
3. Минимум 3 PR на каждого участника за проект
4. Коммиты по Conventional Commits: `feat:`, `fix:`, `refactor:`, `docs:`
5. `main` — защищённая ветка, мёрж только из `develop`
### Визуализация workflow (2 участника)
```mermaid
gitGraph
commit id: "init" tag: "v1.0"
branch develop
checkout develop
branch feature/auth-users
checkout develop
branch feature/projects-crud
checkout feature/auth-users
commit id: "feat: add registration and login"
commit id: "feat: add admin panel"
checkout feature/projects-crud
commit id: "feat: add projects CRUD"
commit id: "feat: add comments to tasks"
checkout develop
merge feature/auth-users tag: "PR + review"
merge feature/projects-crud tag: "PR + review"
checkout main
merge develop tag: "release v1.1"
```
### Визуализация workflow (3 участника)
```mermaid
gitGraph
commit id: "init" tag: "v1.0"
branch develop
checkout develop
branch feature/auth-users
checkout develop
branch feature/tasks-crud
checkout develop
branch feature/projects-crud
checkout feature/auth-users
commit id: "feat: add auth + admin panel"
commit id: "feat: add user management"
checkout feature/tasks-crud
commit id: "feat: add task CRUD"
commit id: "feat: add task filters"
checkout feature/projects-crud
commit id: "feat: add projects CRUD"
commit id: "feat: add dashboard UI"
checkout develop
merge feature/auth-users tag: "PR + review"
merge feature/tasks-crud tag: "PR + review"
merge feature/projects-crud tag: "PR + review"
checkout main
merge develop tag: "release v1.1"
```
### Пример командной работы
```bash
# Создание фич-ветки
git checkout develop
git checkout -b feature/tasks-crud
# После разработки
git add .
git commit -m "feat: add task CRUD with validation"
git push origin feature/tasks-crud
# Создание Pull Request через GitHub/GitLab
# Код-ревью от другого участника → Approve → Merge
```
---
## 8. Критерии приёмки
### Обязательно
- [ ] Регистрация и вход работают
- [ ] CRUD задач с валидацией (название обязательно, дедлайн — дата)
- [ ] CRUD проектов
- [ ] Комментарии к задачам (создание + удаление)
- [ ] Фильтрация задач по статусу и приоритету
- [ ] Роли работают: executor не может удалять чужие задачи
- [ ] Policies корректно ограничивают доступ
- [ ] Admin-панель доступна только admin
- [ ] Bootstrap-вёрстка адаптивная (проверка на мобильном)
- [ ] Flash-сообщения при создании/редактировании/удалении
- [ ] Пагинация списка задач
- [ ] Git-история: минимум 3 ветки от каждого участника, слитые через PR
### Дополнительно (бонусные баллы)
- [ ] Drag-and-drop для смены статуса задач (kanban-доска)
- [ ] Уведомления (email при назначении задачи)
- [ ] Экспорт задач в CSV
- [ ] Поиск задач по названию/описанию
- [ ] Прикрепление файлов к задачам
---
## 9. Дополнительные задания (для продвинутых)
1. **Kanban-доска:** визуальное отображение задач по колонкам (новая, в работе, завершена) с drag-and-drop
2. **Уведомления:** отправка email при назначении задачи или изменении статуса
3. **API:** RESTful API для задач (resource-маршруты с JSON-ответами)
4. **Тесты:** PHPUnit Feature-тесты для TaskController (минимум 5 тестов)
5. **Queues:** асинхронная отправка уведомлений через очереди Laravel
6. **Soft Deletes:** мягкое удаление задач и проектов
---
## 10. Рекомендуемые материалы
- Laravel Docs: https://laravel.com/docs/12.x
- Laravel Authorization (Gates & Policies): https://laravel.com/docs/12.x/authorization
- Bootstrap 5 Documentation: https://getbootstrap.com/docs/5.3
- Git Flow: https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
- Conventional Commits: https://www.conventionalcommits.org/