Gitlab@Informatics

Skip to content
Snippets Groups Projects
Commit 267629ef authored by 65160270's avatar 65160270
Browse files

update-cart

parent deefecc1
No related branches found
No related tags found
No related merge requests found
......@@ -40,7 +40,7 @@ app.use(express.static(path.join(__dirname, "public")));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Middleware เช็ค Session User (ใช้ในทุกหน้า)
//Middlewareเช็คSessionUser
app.use((req, res, next) => {
res.locals.user = req.session.user || null;
next();
......@@ -70,9 +70,73 @@ const isLoggedIn = (req, res, next) => {
}
};
// หน้า Checkout (ต้อง Login ก่อน)
app.get('/order/checkout', isLoggedIn, (req, res) => {
res.render('checkout');
//Register
app.get('/register', (req, res) => {
res.render('register');
});
app.post("/register", async (req, res) => {
try {
const { email, password, name } = req.body;
if (!email || !password || !name) return res.status(400).json({ message: "All fields are required." });
const hashedPassword = await bcrypt.hash(password, 10);
const [existingUser] = await pool.execute("SELECT * FROM users WHERE email = ?", [email]);
if (existingUser.length > 0) return res.status(400).json({ message: "Email is already registered." });
await pool.execute("INSERT INTO users (email, password, name) VALUES (?, ?, ?)", [email, hashedPassword, name]);
res.status(201).json({ success: true, message: "Registration successful." });
} catch (error) {
res.status(500).json({ message: "Registration failed." });
}
});
app.get('/login', (req, res) => {
res.render('login');
});
app.post("/login", async (req, res) => {
try {
const { email, password } = req.body;
if (!email || !password) return res.status(400).json({ message: "All fields are required." });
const [users] = await pool.execute("SELECT * FROM users WHERE email = ?", [email]);
if (users.length === 0) return res.status(400).json({ message: "Invalid email or password." });
const user = users[0];
const passwordMatch = await bcrypt.compare(password, user.password);
if (!passwordMatch) return res.status(400).json({ message: "Invalid email or password." });
req.session.user = { id: user.id, email: user.email };
req.session.save(err => { //บันทึก Session ก่อน Redirect
if (err) {
console.error("Session save error:", err);
return res.send("Session save failed.");
}
console.log("Session after login:", req.session);
res.redirect('/');
});
} catch (error) {
res.status(500).json({ message: "Login failed." });
}
});
app.get("/search", async (req, res) => {
const searchQuery = req.query.query;
try {
const [results] = await pool.execute(
"SELECT * FROM products WHERE name LIKE ? OR description LIKE ?",
[`%${searchQuery}%`, `%${searchQuery}%`]
);
res.render("index", { products: results });
} catch (err) {
res.status(500).send("Error retrieving search results");
}
});
app.get("/cart", isLoggedIn, async (req, res) => {
......@@ -133,122 +197,26 @@ app.post("/cart/add", async (req, res) => {
}
});
//อัปเดตตะกร้าสินค้า
app.post("/cart/update", async (req, res) => {
try {
console.log("Request Body:", req.body); // Debug input
const { cartItemId, quantity } = req.body;
// เช็คว่ามีค่าครบถ้วน
if (!cartItemId || quantity === undefined) {
return res.status(400).json({ message: "Missing cartItemId or quantity" });
}
// เช็คว่า quantity เป็นค่าที่ถูกต้อง
if (quantity < 1) {
return res.status(400).json({ message: "Quantity must be at least 1" });
}
// ตรวจสอบว่ามี cartItemId อยู่ในฐานข้อมูลจริงหรือไม่
const [existingItem] = await pool.execute(
"SELECT * FROM cart_items WHERE id = ?",
[cartItemId]
);
if (existingItem.length === 0) {
return res.status(404).json({ message: "Cart item not found" });
}
// อัปเดตจำนวนสินค้าในตะกร้า
await pool.execute(
"UPDATE cart_items SET quantity = ? WHERE id = ?",
[quantity, cartItemId]
);
console.log("Updated Cart:", { cartItemId, quantity }); // Debug success
await pool.execute("UPDATE cart_items SET quantity = ? WHERE id = ?", [quantity, cartItemId]);
res.json({ success: true, message: "Cart updated" });
} catch (error) {
console.error("Update error:", error);
res.status(500).json({ message: "Update failed", error });
}
});
// Register
app.get('/register', (req, res) => {
res.render('register');
});
app.post("/register", async (req, res) => {
try {
const { email, password, name } = req.body;
if (!email || !password || !name) return res.status(400).json({ message: "All fields are required." });
const hashedPassword = await bcrypt.hash(password, 10);
const [existingUser] = await pool.execute("SELECT * FROM users WHERE email = ?", [email]);
if (existingUser.length > 0) return res.status(400).json({ message: "Email is already registered." });
await pool.execute("INSERT INTO users (email, password, name) VALUES (?, ?, ?)", [email, hashedPassword, name]);
res.status(201).json({ success: true, message: "Registration successful." });
} catch (error) {
res.status(500).json({ message: "Registration failed." });
}
});
// Login
app.get('/login', (req, res) => {
res.render('login');
});
app.post("/login", async (req, res) => {
try {
const { email, password } = req.body;
if (!email || !password) return res.status(400).json({ message: "All fields are required." });
const [users] = await pool.execute("SELECT * FROM users WHERE email = ?", [email]);
if (users.length === 0) return res.status(400).json({ message: "Invalid email or password." });
const user = users[0];
const passwordMatch = await bcrypt.compare(password, user.password);
if (!passwordMatch) return res.status(400).json({ message: "Invalid email or password." });
req.session.user = { id: user.id, email: user.email };
req.session.save(err => { //บันทึก Session ก่อน Redirect
if (err) {
console.error("Session save error:", err);
return res.send("Session save failed.");
}
console.log("Session after login:", req.session);
res.redirect('/');
});
} catch (error) {
res.status(500).json({ message: "Login failed." });
res.status(500).json({ message: "Update failed" });
}
});
// ค้นหาสินค้า
app.get("/search", async (req, res) => {
const searchQuery = req.query.query;
try {
const [results] = await pool.execute(
"SELECT * FROM products WHERE name LIKE ? OR description LIKE ?",
[`%${searchQuery}%`, `%${searchQuery}%`]
);
res.render("index", { products: results });
} catch (err) {
res.status(500).send("Error retrieving search results");
}
app.get('/order/checkout', isLoggedIn, (req, res) => {
res.render('checkout');
});
// Logout
app.get("/logout", (req, res) => {
req.session.destroy(err => {
if (err) return res.status(500).json({ message: "Logout failed." });
......@@ -257,12 +225,12 @@ app.get("/logout", (req, res) => {
});
});
// Error Handler
app.use((err, req, res, next) => {
console.error("Unhandled error:", err);
res.status(500).json({ message: "Internal Server Error" });
});
// Start Server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
......@@ -4,7 +4,6 @@ const multer = require("multer");
const path = require("path");
const fs = require("fs");
const router = express.Router();
// ตั้งค่าที่เก็บไฟล์รูป
......@@ -19,7 +18,7 @@ const storage = multer.diskStorage({
cb(null, uploadDir);
},
filename: (req, file, cb) => {
cb(null, Date.now() + path.extname(file.originalname)); // ตั้งชื่อไฟล์เป็น timestamp
cb(null, Date.now() + path.extname(file.originalname));
}
});
const upload = multer({ storage: storage });
......@@ -30,7 +29,7 @@ router.get("/", async (req, res) => {
const [products] = await pool.execute("SELECT * FROM products");
res.render("product", { products });
} catch (error) {
console.error("Error fetching products:", error);
console.error("Error fetching products:", error);
res.status(500).send("Error loading products.");
}
});
......@@ -41,31 +40,30 @@ router.get("/add", (req, res) => {
});
// เพิ่มสินค้าใหม่พร้อมรูป
router.post('/add', (req, res) => {
console.log('Request Body:', req.body); // Debug
router.post("/add", upload.single("image"), async (req, res) => {
console.log("📸 Uploaded file:", req.file);
// ดึงข้อมูลจาก req.body
const { name, price, description, stock, image_url } = req.body;
try {
const { name, price, stock, description } = req.body;
const priceNum = parseFloat(price);
const stockNum = parseInt(stock, 10);
// ตรวจสอบว่าข้อมูลสำคัญครบหรือไม่
if (!name || !price || stock === undefined) {
return res.status(400).json({ message: 'Missing required fields' });
if (isNaN(priceNum) || isNaN(stockNum)) {
return res.status(400).send("❌ Price and stock must be valid numbers.");
}
// SQL Query รองรับ stock และ image_url
const sql = 'INSERT INTO products (name, price, description, stock, image_url) VALUES (?, ?, ?, ?, ?)';
const values = [name, price, description || null, stock, image_url || null];
const imagePath = req.file ? "/uploads/" + req.file.filename : null;
console.log('SQL Query:', sql, values); // Debug SQL Query
await pool.execute(
"INSERT INTO products (name, price, stock, description, image_url) VALUES (?, ?, ?, ?, ?)",
[name, priceNum, stockNum, description, imagePath]
);
connection.query(sql, values, (err, result) => {
if (err) {
console.error('MySQL Insert Error:', err);
return res.status(500).json({ message: 'Database error', error: err });
res.redirect("/products");
} catch (error) {
console.error("❌ Error adding product:", error);
res.status(500).send("Error adding product.");
}
console.log('Product Added:', result);
res.status(201).json({ message: 'Product added successfully', result });
});
});
// ดึงข้อมูลสินค้าตาม ID และแสดงหน้าแก้ไข
......@@ -73,11 +71,11 @@ router.get("/edit/:id", async (req, res) => {
try {
const [rows] = await pool.execute("SELECT * FROM products WHERE id = ?", [req.params.id]);
if (rows.length === 0) {
return res.status(404).send("ไม่พบสินค้า");
return res.status(404).send("ไม่พบสินค้า");
}
res.render("product_edit", { product: rows[0] });
} catch (error) {
console.error("Error fetching product:", error);
console.error("Error fetching product:", error);
res.status(500).send("Error loading product.");
}
});
......@@ -85,34 +83,32 @@ router.get("/edit/:id", async (req, res) => {
// อัปเดตข้อมูลสินค้า
router.post("/edit/:id", upload.single("image"), async (req, res) => {
try {
const { name, price, stock, description } = req.body;
let imagePath = req.body.oldImage; // ใช้รูปเดิมถ้าไม่มีการอัปโหลดใหม่
const { name, price, stock, description, oldImage } = req.body;
const priceNum = parseFloat(price);
const stockNum = parseInt(stock, 10);
// ถ้ามีการอัปโหลดรูปใหม่ ให้ใช้ไฟล์ใหม่
if (isNaN(priceNum) || isNaN(stockNum)) {
return res.status(400).send("❌ Price and stock must be valid numbers.");
}
// ใช้รูปเดิม ถ้าไม่ได้อัปโหลดใหม่
let imagePath = oldImage || null;
if (req.file) {
imagePath = "/uploads/" + req.file.filename;
}
console.log("Update values:", { name, price, stock, description, imagePath, id: req.params.id });
console.log("🛠 Updating Product:", { name, priceNum, stockNum, description, imagePath, id: req.params.id });
await pool.execute(
"UPDATE products SET name=?, price=?, stock=?, description=?, image_url=? WHERE id=?",
[
name ?? null,
price ?? null,
stock ?? null,
description ?? null,
imagePath ?? null,
req.params.id ?? null
]
[name ?? null, priceNum ?? null, stockNum ?? null, description ?? null, imagePath, req.params.id]
);
res.redirect("/products"); // กลับไปยังหน้ารายการสินค้า
res.redirect("/products");
} catch (error) {
console.error("Error updating product:", error);
console.error("Error updating product:", error);
res.status(500).send("Error updating product.");
}
});
module.exports = router;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment