Task Manager — это современная система управления задачами, разработанная с упором на производительность, масштабируемость и строгую типизацию.
Проект решает две главные задачи:
- Продуктовая: Предоставление пользователям интуитивного интерфейса для трекинга задач, управления статусами и совместной работы.
- Инженерная: Создание эталонной архитектуры на базе Nuxt 4, которая позволяет команде разработчиков безопасно масштабировать функционал, избегая проблемы "спагетти-кода" (Spaghetti Code) и сильной связности (Tight Coupling).
- 🔐 Безопасность: Полный цикл аутентификации (JWT, Cookies, Auto-refresh) и защита роутов.
- ⚡️ Реактивность: Мгновенный отклик интерфейса благодаря оптимистичным обновлениям.
- 🧩 Модульность: Каждая фича (например, "Создание задачи") изолирована, что позволяет легко менять или удалять функционал без регрессии.
- 🛡 Надежность: Единый слой обработки ошибок API — пользователь всегда получает понятную обратную связь, а разработчик — типизированные логи.
- Runtime & PM: Bun (v1.0+)
- Framework: Nuxt 4 (compatibilityVersion: 5)
- Architecture: Granular Vertical Slice Architecture
- HTTP Client: Custom Typed Wrapper (over
ofetch) - State: Pinia + Persistence
- UI: Nuxt UI Pro + Tailwind CSS
- Validation: Zod
В проекте реализован мощный архитектурный слой для работы с сетью: app/shared/services/api.
Это не просто fetch, а типизированная надстройка, которая стандартизирует все запросы.
- Строгая типизация ответов (
<T>): Вы всегда знаете, что вернет сервер. - Автоматическая авторизация: Токен (
access) автоматически подставляется в заголовки из кук. - Гибкая конфигурация (
RequestConfig): Полный контроль над query-параметрами, body и опциямиofetch. - Нормализация ошибок: Преобразование любых ответов (RFC 7807, plain text, network error) в единый интерфейс
ApiError.
Обертка экспортирует методы api.get, api.post, api.put, api.delete, api.patch.
// 1. Простой GET запрос с типизацией ответа
const _user = await api.get<UserProfile>('/users/me')
// 2. POST запрос с типизированным Body и Query
// <Response, Body, Query>
const _task = await api.post<TaskDto, CreateTaskDto>('/tasks', {
title: 'Fix bugs'
}, {
query: { priority: 'high' }
})
// 3. Обработка ошибок (try/catch не обязателен для типизации, но нужен для логики)
try {
await api.delete('/tasks/1')
}
catch (e) {
const error = e as ApiError // { message: string, details: ..., status: number }
console.error(error.message) // "Task not found"
}fetch.ts: Ядро. СодержитperformRequestи интерцепторы (onRequest,onResponseError).fetch.type.ts: Глобальные типы (ApiError,BackendErrorDetail,RequestConfig).*.repo.ts: Репозитории сущностей, использующиеapi(например,auth.repo.ts).
Мы следуем принципу: "Зависимости только сверху вниз".
01.kit(UI Atoms)- Базовые компоненты без бизнес-логики (
kit-button,kit-input).
- Базовые компоненты без бизнес-логики (
02.shared(Widgets)- Глобальные виджеты (
theme-toggle,lang-switcher).
- Глобальные виджеты (
03.domain(Entities)- Бизнес-сущности и их логика (
task-card,user-avatar).
- Бизнес-сущности и их логика (
04.features(Use Cases)- Конкретные сценарии использования (
auth-login-form,task-create-modal). - Здесь происходит связывание UI и Store.
- Конкретные сценарии использования (
05.modules(Pages Composition)- Сборка страницы из фич и виджетов.
06.layouts(App Shell)- Глобальные шаблоны (
default,auth).
- Глобальные шаблоны (
Проект использует Bun для максимальной производительности.
# Установка зависимостей
bun installСоздайте .env файл:
VITE_API_URL=https://api.your-backend.com# Запуск dev-сервера
bun dev
# Сборка для продакшена
bun run build
# Проверка типов
bun run typecheck- Импорты: Используйте алиас
~(напр.~/shared/services/api). - Composables: Вся логика выносится из
.vueвuse[Name].ts. - Типы: Никаких
any. Если тип неизвестен — используйтеunknown+ валидацию. - Формы: Используем
u-form+zodсхемы во всех формах.