/
vaenela
/
html-css
Обзор
Документация
Войти
/
vaenela
/
html-css
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/server.js
393 строки
11 KB
vaenela
upload files
27 ноя 2025, 20:30
27 ноя 2025, 20:30
b02acf6
Код
Авторство
О чём код?
// Подключаем необходимые модули const express = require('express'); const cors = require('cors'); const bodyParser = require('body-parser'); const path = require('path'); // Подключаем базу const Database = require('./database'); // Инициализация Express и порта const app = express(); const PORT = process.env.PORT || 3000; // Middleware app.use(cors()); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use('/images', express.static(path.join(__dirname, 'images'))); // Инициализация базы данных const db = new Database(); // Middleware для обработки ошибок базы данных app.use((req, res, next) => { req.db = db; next(); }); // Регистрация пользователя app.post('/api/register', async (req, res) => { try { const { name, email, password } = req.body; const result = await db.register({ name, email, password }); res.status(201).json({ success: true, data: result }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); // Авторизация пользователя app.post('/api/login', async (req, res) => { try { const { email, password } = req.body; const result = await db.login({ email, password }); res.json({ success: true, data: result }); } catch (error) { res.status(401).json({ success: false, error: error.message }); } }); // Получение всех товаров app.get('/api/products', async (req, res) => { try { const products = await db.getAllProducts(); res.json({ success: true, data: products, count: products.length }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } }); // Получение товара по ID app.get('/api/products/:id', async (req, res) => { try { const productId = parseInt(req.params.id); const product = await db.getProductById(productId); res.json({ success: true, data: product }); } catch (error) { res.status(404).json({ success: false, error: error.message }); } }); // Получение отзывов по product_id app.get('/api/products/:id/reviews', async (req, res) => { try { const productId = parseInt(req.params.id); const reviews = await db.getReviewsByProductId(productId); res.json({ success: true, data: reviews, count: reviews.length }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); // Получение отзывов по user_id app.get('/api/users/:id/reviews', async (req, res) => { try { const userId = parseInt(req.params.id); const reviews = await db.getReviewsByUserId(userId); res.json({ success: true, data: reviews, count: reviews.length }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); // Создание отзыва app.post('/api/reviews', async (req, res) => { try { const { user_id, product_id, review, stars } = req.body; const result = await db.createReview({ user_id: parseInt(user_id), product_id: parseInt(product_id), review, stars: parseInt(stars) }); res.status(201).json({ success: true, data: result }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); // Получение всех магазинов app.get('/api/shops', async (req, res) => { try { const shops = await db.getAllShops(); res.json({ success: true, data: shops, count: shops.length }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } }); // Создание товара app.post('/api/products', async (req, res) => { try { const { name, price, description, image_url, category } = req.body; const result = await db.createProduct({ name, price: parseFloat(price), description, image_url, category }); res.status(201).json({ success: true, data: result }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); // Создание магазина app.post('/api/shops', async (req, res) => { try { const { address, phone, latitude, longitude } = req.body; const result = await db.createShop({ address, phone, latitude: latitude ? parseFloat(latitude) : null, longitude: longitude ? parseFloat(longitude) : null }); res.status(201).json({ success: true, data: result }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); app.get('/api/user/stats', (req, res) => { res.json({ success: true, data: { totalOrders: 15, totalSpent: 4250, totalReviews: 8, customerLevel: 'Постоянный клиент', orderHistory: [ { month: 'Янв', orders: 12 }, { month: 'Фев', orders: 19 }, { month: 'Мар', orders: 8 }, { month: 'Апр', orders: 15 }, { month: 'Май', orders: 12 }, { month: 'Июн', orders: 18 } ] } }); }); app.use(express.static(path.join(__dirname, '../frontend'))); // маршруты app.get('/', (req, res) => { res.sendFile(path.join(__dirname, '../frontend/index.html')); }); app.get('/menu.html', (req, res) => { res.sendFile(path.join(__dirname, '../frontend/menu.html')); }); app.get('/account.html', (req, res) => { res.sendFile(path.join(__dirname, '../frontend/account.html')); }); app.get('/contacts.html', (req, res) => { res.sendFile(path.join(__dirname, '../frontend/contacts.html')); }); app.get('/business.html', (req, res) => { res.sendFile(path.join(__dirname, '../frontend/business.html')); }); app.get('/test_api.html', (req, res) => { res.sendFile(path.join(__dirname, '../frontend/test_api.html')); }); app.get('/product.html', (req, res) => { res.sendFile(path.join(frontendRoot, 'product.html')); }); // редактирование отзыва app.put('/api/reviews/:id', async (req, res) => { try { const reviewId = parseInt(req.params.id); const { review, stars } = req.body; const result = await db.updateReview(reviewId, { review, stars }); res.json({ success: true, data: result }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); // удаление отзыва app.delete('/api/reviews/:id', async (req, res) => { try { const reviewId = parseInt(req.params.id); const result = await db.deleteReview(reviewId); res.json({ success: true, data: result }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); // добавление в избранное app.post('/api/favorites', async (req, res) => { try { const { user_id, product_id } = req.body; const result = await db.addToFavorites(parseInt(user_id), parseInt(product_id)); res.json({ success: true, data: result }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); // удаление из избранного app.delete('/api/favorites', async (req, res) => { try { const { user_id, product_id } = req.body; const result = await db.removeFromFavorites(parseInt(user_id), parseInt(product_id)); res.json({ success: true, data: result }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); // получение избранного app.get('/api/users/:id/favorites', async (req, res) => { try { const userId = parseInt(req.params.id); const favorites = await db.getUserFavorites(userId); res.json({ success: true, data: favorites, count: favorites.length }); } catch (error) { res.status(400).json({ success: false, error: error.message }); } }); // Корневой маршрут app.get('/api', (req, res) => { res.json({ success: true, message: 'API работает', endpoints: { auth: { register: 'POST /api/register', login: 'POST /api/login' }, products: { getAll: 'GET /api/products', getById: 'GET /api/products/:id', create: 'POST /api/products' }, reviews: { getByProduct: 'GET /api/products/:id/reviews', getByUser: 'GET /api/users/:id/reviews', create: 'POST /api/reviews' }, shops: { getAll: 'GET /api/shops', create: 'POST /api/shops' } } }); }); // Middleware для обработки ошибок app.use((error, req, res, next) => { console.error('Ошибка сервера:', error); res.status(500).json({ success: false, error: 'Внутренняя ошибка сервера' }); }); // Запуск сервера const startServer = async () => { app.listen(PORT, () => { console.log(`Сервер запущен на порту ${PORT}`); console.log(`API доступно по адресу: http://localhost:${PORT}/api`); }); }; // Завершение работы сервера при прерывании процесса process.on('SIGINT', async () => { console.log('\nЗавершение работы сервера...'); if (db) { await db.close(); } process.exit(0); }); startServer().catch(console.error);