Skip to content

Спринты

Спринты позволяют управлять гибкой (agile) разработкой внутри проектов. У каждого спринта есть временной диапазон, цель и набор задач из бэклога проекта.

Модель

Sprint
├── name, goal?
├── projectId (каскадное удаление)
├── startDate, endDate
├── status: planned | active | completed | cancelled
└── tasks (многие-ко-многим через Task.sprintId)

API Эндпоинты

МетодПутьОписание
GET/api/projects/:projectId/sprintsСписок спринтов проекта
GET/api/projects/:projectId/sprints/velocityДанные по velocity
GET/api/sprints/:idДетали спринта
POST/api/sprintsСоздать спринт
PATCH/api/sprints/:idОбновить спринт
DELETE/api/sprints/:idУдалить спринт
POST/api/sprints/:id/tasksДобавить задачи в спринт
DELETE/api/sprints/:sprintId/tasks/:taskIdУбрать задачу из спринта

Жизненный цикл спринта

planned ──► active ──► completed

                └──► cancelled
  • planned — спринт определён, но ещё не начат
  • active — текущий спринт в процессе
  • completed — спринт завершён
  • cancelled — спринт отменён

Фронтенд

Спринт-доска

Компонент SprintBoard.vue предоставляет доску в стиле Kanban:

  • Бэклог — задачи, не назначенные ни на один спринт
  • Активный спринт — задачи текущего спринта с drag-and-drop обновлением статуса

Спринт-бэклог

Компонент SprintBacklog.vue отображает задачи, доступные для назначения на спринт, с фильтрацией и массовым выбором.

Store спринтов

typescript
const store = useSprintsStore()
const { sprints, currentSprint } = storeToRefs(store)

await store.fetchByProject(projectId)
await store.create({ name, goal, projectId, startDate, endDate })
await store.update(id, { name, status, startDate, endDate })
await store.remove(id)
await store.addTasks(sprintId, taskIds)
await store.removeTask(sprintId, taskId)
await store.fetchVelocity(projectId)

Ключевые детали

  • В одном проекте должен быть только один спринт со статусом active
  • Velocity рассчитывается на основе завершённых спринтов (очки или количество задач)
  • Задача может принадлежать только одному спринту одновременно
  • Даты спринтов не должны пересекаться в пределах одного проекта