diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ce922c2 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +node_modules +.next +out +dist +build +*.log +.env* + diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..6261675 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "semi": true, + "trailingComma": "es5", + "singleQuote": false, + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "arrowParens": "always", + "endOfLine": "lf" +} + diff --git a/IMPROVEMENTS.md b/IMPROVEMENTS.md new file mode 100644 index 0000000..83a840f --- /dev/null +++ b/IMPROVEMENTS.md @@ -0,0 +1,89 @@ +# Рекомендации по улучшению шаблона + +## Добавленные улучшения + +### 1. Prettier для форматирования кода +- Конфигурация `.prettierrc` +- Игнорирование файлов `.prettierignore` +- Скрипты в package.json для форматирования + +**Использование:** +```powershell +npm run format # Форматировать весь код +npm run format:check # Проверить форматирование +``` + +### 2. Переменные окружения +- `.env.example` файлы для frontend и backend +- Шаблоны для быстрого старта +- Документация в файлах + +### 3. Middleware для бэкенда +- `logger.js` - логирование всех запросов +- `errorHandler.js` - централизованная обработка ошибок +- Пример использования в `server.js` + +### 4. Структура роутов +- Пример файла `routes/example.js` +- Организация API endpoints по модулям +- Готовый шаблон для новых роутов + +### 5. Пример компонента +- `ExampleComponent.tsx` с использованием API +- Демонстрация работы с состоянием +- Обработка ошибок и загрузки + +## Дополнительные рекомендации + +### Можно добавить в будущем: + +1. **Валидация запросов** (express-validator) + ```bash + npm install express-validator + ``` + +2. **Логирование** (winston или pino) + ```bash + npm install winston + ``` + +3. **Валидация окружения** (dotenv-safe) + ```bash + npm install dotenv-safe + ``` + +4. **Rate limiting** (express-rate-limit) + ```bash + npm install express-rate-limit + ``` + +5. **TypeScript для бэкенда** + - Переименовать `.js` в `.ts` + - Настроить `tsconfig.json` для backend + - Добавить типы для Express + +6. **Docker поддержка** (опционально) + - `Dockerfile` для frontend и backend + - `docker-compose.yml` + +7. **Тестирование** (опционально) + - Jest для unit тестов + - Testing Library для компонентов + +8. **CI/CD** (GitHub Actions) + - Автоматическая проверка кода + - Автоматический деплой + +## Текущая структура + +Все основные улучшения уже добавлены: +- ✅ Prettier +- ✅ Environment variables examples +- ✅ Middleware структура +- ✅ Примеры роутов +- ✅ Пример компонента +- ✅ Логирование +- ✅ Обработка ошибок + +Шаблон готов к использованию и может быть расширен по мере необходимости. + diff --git a/README.md b/README.md index 65dc41d..028e087 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,22 @@ pm2 start frontend/.next/start.js --name my-project-frontend Подробнее: [`docs/PROJECT_RULES.md`](docs/PROJECT_RULES.md) +## 🔧 Дополнительные инструменты + +### Форматирование кода (Prettier) + +```powershell +cd frontend +npm run format # Форматировать весь код +npm run format:check # Проверить форматирование +``` + +### Переменные окружения + +Скопируйте `.env.example` файлы и заполните значения: +- `frontend/.env.example` → `frontend/.env.local` +- `backend/.env.example` → `backend/.env` + ## 📝 Лицензия ISC @@ -144,3 +160,7 @@ ISC Создано на основе стандартов разработки DosAi +## 📚 Дополнительная информация + +См. [`IMPROVEMENTS.md`](IMPROVEMENTS.md) для списка улучшений и рекомендаций. + diff --git a/backend/middleware/.gitkeep b/backend/middleware/.gitkeep new file mode 100644 index 0000000..4e5a702 --- /dev/null +++ b/backend/middleware/.gitkeep @@ -0,0 +1,10 @@ +# Middleware + +Размещайте здесь middleware функции для Express. + +Примеры: +- logger.js - логирование запросов +- errorHandler.js - обработка ошибок +- auth.js - аутентификация (если нужно) +- validate.js - валидация запросов (если нужно) + diff --git a/backend/middleware/errorHandler.js b/backend/middleware/errorHandler.js new file mode 100644 index 0000000..e4ec59a --- /dev/null +++ b/backend/middleware/errorHandler.js @@ -0,0 +1,16 @@ +// Middleware для обработки ошибок +const errorHandler = (err, req, res, next) => { + console.error('Error:', err); + + const statusCode = err.statusCode || 500; + const message = err.message || 'Internal Server Error'; + + res.status(statusCode).json({ + success: false, + error: message, + ...(process.env.NODE_ENV === 'development' && { stack: err.stack }), + }); +}; + +module.exports = errorHandler; + diff --git a/backend/middleware/logger.js b/backend/middleware/logger.js new file mode 100644 index 0000000..562a962 --- /dev/null +++ b/backend/middleware/logger.js @@ -0,0 +1,21 @@ +// Middleware для логирования запросов +const logger = (req, res, next) => { + const timestamp = new Date().toISOString(); + const method = req.method; + const url = req.url; + const ip = req.ip || req.connection.remoteAddress; + + console.log(`[${timestamp}] ${method} ${url} - ${ip}`); + + // Логируем время ответа + const start = Date.now(); + res.on('finish', () => { + const duration = Date.now() - start; + console.log(`[${timestamp}] ${method} ${url} - ${res.statusCode} (${duration}ms)`); + }); + + next(); +}; + +module.exports = logger; + diff --git a/backend/routes/example.js b/backend/routes/example.js new file mode 100644 index 0000000..ba1a164 --- /dev/null +++ b/backend/routes/example.js @@ -0,0 +1,46 @@ +// Пример файла с роутами +// Используйте эту структуру для организации API endpoints + +const express = require('express'); +const router = express.Router(); + +// GET endpoint +router.get('/hello', (req, res) => { + res.json({ + success: true, + message: 'Hello from example route!', + }); +}); + +// POST endpoint с валидацией +router.post('/data', (req, res) => { + try { + const { name, value } = req.body; + + // Простая валидация + if (!name || !value) { + return res.status(400).json({ + success: false, + error: 'Name and value are required', + }); + } + + // Обработка данных + res.json({ + success: true, + data: { + name, + value, + processed: true, + }, + }); + } catch (err) { + res.status(500).json({ + success: false, + error: err.message, + }); + } +}); + +module.exports = router; + diff --git a/backend/server.js b/backend/server.js index 38db58f..6fd0174 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,10 +1,13 @@ const express = require('express'); const bodyParser = require('body-parser'); +const logger = require('./middleware/logger'); +const errorHandler = require('./middleware/errorHandler'); const app = express(); const PORT = process.env.PORT || 3001; // Middleware +app.use(logger); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); @@ -20,9 +23,13 @@ app.use((req, res, next) => { } }); -// Тестовый endpoint +// Health check endpoint app.get('/api/health', (req, res) => { - res.json({ status: 'ok', message: 'Server is running' }); + res.json({ + status: 'ok', + message: 'Server is running', + timestamp: new Date().toISOString(), + }); }); // Пример API endpoint @@ -35,6 +42,21 @@ app.post('/api/example', (req, res) => { } }); +// Подключение роутов (пример) +// const exampleRoutes = require('./routes/example'); +// app.use('/api/example', exampleRoutes); + +// Обработка 404 +app.use((req, res) => { + res.status(404).json({ + success: false, + error: 'Route not found', + }); +}); + +// Обработка ошибок (должен быть последним middleware) +app.use(errorHandler); + // Запуск сервера app.listen(PORT, () => { console.log(`🚀 Server is running on http://localhost:${PORT}`); diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index 4989e01..e43bfe1 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -1,3 +1,5 @@ +import ExampleComponent from '@/components/ExampleComponent'; + export default function Home() { return (
Name: {data.name}
+Value: {data.value}
+