Загрузка данных
const express = require("express");
const { Pool } = require("pg");
const app = express();
app.use(express.json());
app.use(express.static("public"));
const db = new Pool({
user: "de-user10",
host: "de-db.ptk.itiscaf.ru",
database: "de-user10",
password: "fGz0uG18uK",
port: 5441
});
app.post("/register", async (req, res) => {
try {
const { login, password, name, surname, phone, email } = req.body;
await db.query(
`INSERT INTO users
(login,password,name,surname,phone,email,role)
VALUES ($1,$2,$3,$4,$5,$6,'user')`,
[login, password, name, surname, phone, email]
);
res.send("ok");
} catch {
res.send("error");
}
});
app.post("/login", async (req, res) => {
const { login, password } = req.body;
if (login === "admin" && password === "restaurant") {
return res.json({ role: "admin" });
}
const r = await db.query(
"SELECT * FROM users WHERE login=$1 AND password=$2",
[login, password]
);
res.json(r.rows[0] || {});
});
app.post("/book", async (req, res) => {
const { user_id, date_time, guests, phone } = req.body;
await db.query(
`INSERT INTO bookings
(user_id,date_time,guests,phone,status)
VALUES ($1,$2,$3,$4,'Новое')`,
[user_id, date_time, guests, phone]
);
res.send("ok");
});
app.get("/my/:id", async (req, res) => {
const r = await db.query(
"SELECT * FROM bookings WHERE user_id=$1",
[req.params.id]
);
res.json(r.rows);
});
app.get("/admin/bookings", async (_, res) => {
const r = await db.query("SELECT * FROM bookings");
res.json(r.rows);
});
app.post("/admin/status", async (req, res) => {
const { id, status } = req.body;
await db.query(
"UPDATE bookings SET status=$1 WHERE id=$2",
[status, id]
);
res.send("ok");
});
app.post("/admin/visit", async (req, res) => {
const { id } = req.body;
await db.query(
"UPDATE bookings SET status='Посещено' WHERE id=$1",
[id]
);
res.send("ok");
});
app.post("/review", async (req, res) => {
const { user_id, booking_id, text } = req.body;
const check = await db.query(
`SELECT * FROM bookings
WHERE id=$1 AND user_id=$2 AND status='Посещено'`,
[booking_id, user_id]
);
if (check.rows.length === 0) {
return res.status(403).send("not allowed");
}
await db.query(
`INSERT INTO reviews (user_id, booking_id, text)
VALUES ($1,$2,$3)`,
[user_id, booking_id, text]
);
res.send("ok");
});
app.listen(3000, () => {
console.log("http://localhost:3000");
});
const post = (url, data) =>
fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data)
});
function getUser() {
return JSON.parse(localStorage.getItem("user") || "{}");
}
async function login() {
const loginVal = document.getElementById("login").value.trim();
const passwordVal = document.getElementById("password").value.trim();
if (!loginVal || !passwordVal) {
alert("Введите логин и пароль");
return;
}
let d = await post("/login", {
login: loginVal,
password: passwordVal
}).then(r => r.json());
console.log("LOGIN:", d);
if (d && d.id) {
localStorage.setItem("user", JSON.stringify(d));
location.href = "book.html";
} else if (d.role === "admin") {
localStorage.setItem("user", JSON.stringify(d));
location.href = "admin.html";
} else {
alert("Неверный логин или пароль");
}
}
async function register() {
const loginVal = document.getElementById("login").value.trim();
const passwordVal = document.getElementById("password").value.trim();
const nameVal = document.getElementById("name").value.trim();
const surnameVal = document.getElementById("surname").value.trim();
const phoneVal = document.getElementById("phone").value.trim();
const emailVal = document.getElementById("email").value.trim();
if (!loginVal || !passwordVal) {
alert("Заполните логин и пароль");
return;
}
let r = await post("/register", {
login: loginVal,
password: passwordVal,
name: nameVal,
surname: surnameVal,
phone: phoneVal,
email: emailVal
});
if (await r.text() === "ok") {
alert("Регистрация успешна");
location.href = "login.html";
} else {
alert("Ошибка регистрации");
}
}
async function book() {
const u = getUser();
if (!u.id) {
alert("Сначала войдите");
location.href = "login.html";
return;
}
await post("/book", {
user_id: u.id,
date_time: document.getElementById("date_time").value,
guests: document.getElementById("guests").value,
phone: document.getElementById("phone").value
});
alert("Забронировано");
location.href = "my.html";
}
async function loadMy() {
const u = getUser();
if (!u.id) return;
let d = await fetch("/my/" + u.id).then(r => r.json());
document.getElementById("list").innerHTML =
d.map(x => `
<div class="card">
${x.date_time} — ${x.status}
${x.status === "Посещено" ? `
<textarea id="r${x.id}" placeholder="Ваш отзыв"></textarea>
<button onclick="review(${x.id})">Отзыв</button>
` : ""}
</div>
`).join("");
}
async function review(id) {
const u = getUser();
await post("/review", {
user_id: u.id,
booking_id: id,
text: document.getElementById("r" + id).value
});
alert("Отзыв отправлен");
}
async function loadAdmin() {
let d = await fetch("/admin/bookings").then(r => r.json());
document.getElementById("list").innerHTML =
d.map(x => `
<div class="card">
${x.date_time} — ${x.status}
<button onclick="update(${x.id},'Принято')">✔</button>
<button onclick="update(${x.id},'Отменено')">✖</button>
<button onclick="visit(${x.id})">Посещено</button>
</div>
`).join("");
}
async function update(id, status) {
await post("/admin/status", { id, status });
loadAdmin();
}
async function visit(id) {
await post("/admin/visit", { id });
loadAdmin();
}