Спасибо за интерес к проекту! Этот гайд поможет тебе начать разработку.
- Node.js >= 18
- npm >= 9
- Git
- Базовые знания Vue 3, TypeScript
# Клонируй оба репозитория
git clone https://github.com/IPodymov/pd-projects-backend.git
git clone https://github.com/IPodymov/pd-projects-front.git
# Установи зависимости
cd pd-projects-front
npm install
# Установи backend зависимости
cd ../pd-projects-backend
npm install
# Заполни БД тестовыми данными
npm run seedTerminal 1 — Backend:
cd pd-projects-backend
npm run start:dev
# Запустится на http://localhost:3000Terminal 2 — Frontend:
cd pd-projects-front
npm run dev
# Запустится на http://localhost:5173Всегда сначала почитай соответствующий гайд:
- Новый компонент? → COMPONENTS.md
- Новый эндпоинт? → SERVICES.md
- Новое состояние? → STORES.md
- Архитектурные вопросы? → ARCHITECTURE.md
git checkout -b feature/название-фичиПримеры названий:
feature/add-search— новая фичкаfix/project-loading-error— исправление баговdocs/update-readme— документация
Код должен:
- Быть типизирован (TypeScript)
- Иметь понятные имена переменных
- Следовать структуре проекта
- Использовать существующие компоненты/сервисы
Примеры:
✅ Хорошо:
const isUserAdmin = auth.roles.includes("ADMIN");
if (isUserAdmin) {
showAdminPanel();
}❌ Плохо:
if (u?.r?.i("A")) {
// непонятные имена
s(); // непонятно что это
}Пиши понятные commit сообщения:
git add .
git commit -m "feat: добавлена фильтрация проектов по типу учреждения"Формат: type: description
Types:
feat— новая фичкаfix— исправлениеdocs— документацияrefactor— переделка кодаtest— добавление тестовchore— мелкие изменения
git push origin feature/название-фичиЗатем создай Pull Request на GitHub с описанием:
- Что изменилось?
- Почему это нужно?
- Как тестировать?
// ✅ Типизируй всё
interface User {
id: number;
email: string;
name?: string;
}
// ❌ Не используй any
const user: any = { id: 1 };<script setup lang="ts">
// ✅ Используй Composition API с setup
import { ref, computed } from "vue";
const count = ref(0);
const doubled = computed(() => count.value * 2);
// ❌ Не используй Options API
// export default {
// data() { return { count: 0 } }
// }
</script>// ✅ Понятные имена
const isLoading = ref(false);
const projectList = ref<Project[]>([]);
const getUserEmail = () => user.value?.email;
// ❌ Сокращения
const isL = ref(false);
const pl = ref([]);
const gUE = () => u?.e;/* ✅ BEM нотация */
.project-card {
}
.project-card__title {
}
.project-card__title_size_large {
}
/* ✅ Используй CSS переменные */
.component {
gap: var(--space-4);
color: var(--text);
}
/* ❌ Жёсткие значения */
.component {
gap: 16px;
color: #333;
}// ✅ Логи с префиксом
console.log("[ProjectsStore] Проекты загружены:", data.length);
// ❌ Без контекста
console.log("done");- Открой F12 → Console
- Ищи логи с твоим префиксом
- Смотри Pinia tab для состояния
- Смотри Network tab для запросов
# Очисти хранилище и перезагрузись
localStorage.clear()
location.reload()
# В консоли проверь состояние
useAuthStore().user
useProjectsStore().items.length- Создай страницу
src/pages/MyPage.vue - Добавь в router
src/router/index.ts:
{
path: '/my-page',
name: 'my-page',
component: () => import('@/pages/MyPage.vue')
}- Используй в навигации:
<router-link :to="{ name: 'my-page' }">My Page</router-link>- Добавь в сервис
src/services/projects.ts:
async searchProjects(query: string): Promise<Project[]> {
const { data } = await api.get('/projects/search', {
params: { q: query }
})
return data
}- Используй в store
src/stores/projects.ts:
async search(query: string) {
this.items = await projectsService.searchProjects(query)
}- Используй в компоненте:
await projects.search("React");- Создай
src/components/MyComponent.vue:
<script setup lang="ts">
interface Props {
title: string;
}
defineProps<Props>();
</script>
<template>
<div class="my-component">
<h1>{{ title }}</h1>
</div>
</template>
<style scoped>
.my-component {
}
</style>- Используй в другом компоненте:
<script setup lang="ts">
import MyComponent from "@/components/MyComponent.vue";
</script>
<template>
<MyComponent title="Hello" />
</template># Убедись, что нет ошибок TypeScript
npx tsc --noEmit
# Запусти приложение и проверь в браузере
npm run dev
# Открой http://localhost:5173 и протестируйЕсли при pull request возникают конфликты:
# Обнови локальную ветку
git fetch origin
git rebase origin/main
# Если конфликты, открой файлы и разреши их
# (VSCode покажет конфликты с << и >>)
# Заверши rebase
git rebase --continue
git push -f origin feature/название-фичиПри добавлении нового функционала обнови документацию:
- Новый компонент? → обнови COMPONENTS.md
- Новый сервис? → обнови SERVICES.md
- Новый store? → обнови STORES.md
- Большие изменения? → обнови ARCHITECTURE.md
Хотя автоматических тестов нет, вручную проверь:
- ✅ Компонент отрендерился правильно
- ✅ API запрос прошёл (смотри Network tab)
- ✅ Состояние обновилось (смотри Pinia tab)
- ✅ Нет ошибок в console
- ✅ Тесто работает на mobile (DevTools → Responsive Design Mode)
- Посмотри документацию — возможно ответ там
- Посмотри логи — console.log и Network tab
- Посмотри похожий код — как это сделано в других компонентах
- Открой issue — опиши проблему и что ты уже попробовал
PR будет рассмотрена если:
- ✅ Код следует стилю проекта
- ✅ Компилируется без ошибок (TypeScript)
- ✅ Работает локально
- ✅ Документация обновлена
- ✅ Коммит сообщения понятные
Спасибо за вклад! 🙏