https://pastein.ru/t/s1s

  скопируйте уникальную ссылку для отправки

Загрузка данных


запуск сервера node index.js   остановка ctrl+c
npm init все энтер 
npm install express pg
npm install nodemon

index js
const express = require('express');
const PORT = process.env.PORT || 8080;
const carRouter = require('./routes/car.routes.js');
const app = express();

app.use(express.json());
app.use(carRouter);
app.use(express.static(__dirname));

app.get('/', (req, res)=>{
    res.sendFile(__dirname + '/static/index.html');
})

app.listen(PORT, ()=>console.log(`Сервер запущен на порту ${PORT}...`))



db js 

const Pool = require('pg').Pool;
const pool = new Pool({
    user: "postgres",
    password: "root",
    host: "localhost",
    port: 5432,
    database: "testis31"
});
module.exports = pool;

database sql

CREATE TABLE cars (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    description VARCHAR(255),
    price VARCHAR(255),
    img VARCHAR(255)
);



заходим в sql shell и пишем create database carsdb;
\connect carsdb
и пишем это 

CREATE TABLE cars (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    description VARCHAR(255),
    price VARCHAR(255),
    img VARCHAR(255)
);



создаем папку controllers в ней car.controller.js

const db = require('../db.js');

class CarController{
    async createCar(req, res){
        const {name, description, price, img} = req.body;
        const newCar = await db.query(`INSERT INTO cars (name, description, price, img)
            VALUES ($1, $2, $3, $4) RETURNING *`, [name, description, price, img]);
        res.json(newCar.rows[0]);
    }
    async getCars(req, res){
        const cars = await db.query(`SELECT id, name, description, price, img FROM cars`);
        res.json(cars.rows);
    }
    async getCar(req, res){
        const id = req.params.id;
        const car = await db.query(`SELECT id, name, description, price, img FROM cars 
                                    WHERE id = $1`, [id]);
        res.json(car.rows[0]);
    }
    async updateCar(req, res){
        const {id, name, description, price, img} = req.body;
        const car = await db.query(`UPDATE cars SET name=$1, description=$2, price=$3, img=$4 
                                    WHERE id = $5 RETURNING *`, [name, description, price, img, id]);
        res.json(car.rows[0]);
    }
    async deleteCar(req, res){
        const id = req.params.id;
        await db.query(`DELETE FROM cars WHERE id = $1`, [id]);
    }
}
module.exports = new CarController();



создаем папку routes в ней car.routes.js
const Router = require('express');
const router = Router();
const carController = require('../controllers/car.controller.js');

router.post('/api/car', carController.createCar);
router.get('/api/car', carController.getCars);
router.get('/api/car/:id', carController.getCar);
router.delete('/api/car/:id', carController.deleteCar);
router.put('/api/car', carController.updateCar);

module.exports = router;



папку requests в ней car.requests.js

async function getAllCars(){
    const responce = await fetch('/api/car', {
        method: 'GET'
    });
    const result = await responce.json();
    return result;
}
async function getOneCar(id){
    const responce = await fetch('/api/car/' + id, {
        method: 'GET'
    });
    const result = await responce.json();
    return result;
}
async function addCar(name, description, price, img){
    await fetch('/api/car', {
        method: 'POST',
        headers: {'Content-Type':'application/json'},
        body: JSON.stringify({
            name: name,
            description: description,
            price: price,
            img: img
        })
    });
}
async function deleteCar(id){
    await fetch('/api/car/' + id, {
        method: 'DELETE'
    });
}
async function updateCar(id, name, description, price, img){
    await fetch('/api/car', {
        method: 'PUT',
        headers: {'Content-Type':'application/json'},
        body: JSON.stringify({
            id: id,
            name: name,
            description: description,
            price: price,
            img: img
        })
    });
}
export {getAllCars, getOneCar, deleteCar, updateCar, addCar}



в корне создаем index.html
const express = require('express');
const PORT = process.env.PORT || 8080;
const carRouter = require('./routes/car.routes.js');
const app = express();

app.use(express.json());
app.use(carRouter);
app.use(express.static(__dirname));

app.get('/', (req, res)=>{
    res.sendFile(__dirname + '/static/index.html');
})
app.get('/car/:id', (req, res)=>{
    res.sendFile(__dirname + '/static/singlecar.html');
})
app.get('/help', (req, res)=>{
    res.send('Hello from help');
})

app.listen(PORT, ()=>console.log(`Сервер запущен на порту ${PORT}...`))




создаем папку frontend внутри папку components внутри файл item.js

export function createItem(name, description, price, img){
    let item = document.createElement('div');
    let image = document.createElement('img');
    let body = document.createElement('div');
    let h5 = document.createElement('h5');
    let pDescription = document.createElement('p');
    let pPrice = document.createElement('p');

    let btnGroup = document.createElement('div');
    let btnDetail = document.createElement('button');
    let btnDelete = document.createElement('button');

    //зададим стили
    item.classList.add('card', 'm-3');
    item.style.width = '18rem';
    item.style.float = 'left';

    image.classList.add('card-img-top');
    image.src = img;

    body.classList.add('card-body');

    h5.classList.add('card-title');
    h5.innerText = name;

    pDescription.classList.add('card-text');
    pDescription.innerText = description;

    pPrice.innerText = price;

    btnGroup.classList.add('btn-group', 'float-end');

    btnDetail.classList.add('btn', 'btn-primary');
    btnDetail.textContent = 'Подробнее';

    btnDelete.classList.add('btn', 'btn-danger');
    btnDelete.textContent = 'Удалить';

    //вложим элемемнты друг в друга
    btnGroup.append(btnDetail, btnDelete);
    body.append(h5, pDescription, pPrice, btnGroup);
    item.append(image, body);

    //вернем результат
    return {item, btnDetail, btnDelete};
}




в папке frontend файл main.js

import { getAllCars, addCar, deleteCar } from "../requests/car.requests.js";
import { createItem } from "./components/item.js";

let list = document.getElementById('car-list');

async function elementsGenerator() {
    const cars = await getAllCars();
    for (let car of cars){
        let listItem = createItem(car.name, car.description, car.price, car.img);
        listItem.btnDetail.addEventListener('click', ()=>{
        });
        listItem.btnDelete.addEventListener('click', ()=>{
            if(confirm('Вы действительно хотите удалить?')){
                deleteCar(car.id);
                listItem.item.remove();
            }
        })
        list.appendChild(listItem.item);
    }
}

document.addEventListener('DOMContentLoaded', async ()=>{
    await elementsGenerator();

    let form = document.getElementById('add-form');
    form.addEventListener('submit', async (e)=>{
        e.preventDefault();

        let carName = document.getElementById('car-name');
        let carDescription = document.getElementById('car-description');
        let carPrice = document.getElementById('car-price');
        let carImg = document.getElementById('car-img');

        let listItem = createItem(carName.value, carDescription.value, carPrice.value, carImg.value);
        await addCar(carName.value, carDescription.value, carPrice.value, carImg.value);
        list.appendChild(listItem.item);
    })
});