From 67ced267d890ac7d35ae5a7d1220f953bbfeb42f Mon Sep 17 00:00:00 2001 From: First <kv9.net@gmail.com> Date: Fri, 28 Mar 2025 16:38:13 +0700 Subject: [PATCH] Edit views and server.js code --- server.js | 273 -------------------------------------- views/dashboard.ejs | 56 -------- views/login.ejs | 43 ------ views/partials/footer.ejs | 5 - views/partials/header.ejs | 97 -------------- views/register.ejs | 49 ------- views/thread-create.ejs | 35 ----- views/thread-edit.ejs | 40 ------ views/thread-view.ejs | 94 ------------- 9 files changed, 692 deletions(-) delete mode 100644 server.js delete mode 100644 views/dashboard.ejs delete mode 100644 views/login.ejs delete mode 100644 views/partials/footer.ejs delete mode 100644 views/partials/header.ejs delete mode 100644 views/register.ejs delete mode 100644 views/thread-create.ejs delete mode 100644 views/thread-edit.ejs delete mode 100644 views/thread-view.ejs diff --git a/server.js b/server.js deleted file mode 100644 index e9727a1..0000000 --- a/server.js +++ /dev/null @@ -1,273 +0,0 @@ -// โหลดไฟล์ .env เพื่อดึงค่าคอนฟิกต่าง ๆ -require('dotenv').config(); -const express = require('express'); -const session = require('express-session'); -const bodyParser = require('body-parser'); -const bcrypt = require('bcryptjs'); -const mysql = require('mysql2'); - -const app = express(); -const port = process.env.PORT; - -// ตั้งค่า view engine เป็น EJS -app.set('view engine', 'ejs'); -app.use(bodyParser.urlencoded({ extended: false })); -app.use(express.static('public')); - -// ตั้งค่าระบบ session -app.use(session({ - secret: process.env.SESSION_SECRET || 'default_secret_key', - resave: false, - saveUninitialized: false -})); - -// เชื่อมต่อฐานข้อมูล MySQL -const connection = mysql.createConnection({ - host: process.env.DB_HOST || 'localhost', - user: process.env.DB_USER || 'root', - password: process.env.DB_PASS || '', - database: process.env.DB_NAME || 'cloud_db_threads', - port: process.env.DB_PORT || 3306 -}); - -connection.connect(err => { - if (err) { - console.error('Error connecting to MySQL:', err); - process.exit(1); - } - console.log('Connected to MySQL Successfully'); -}); - -// Middleware ที่ใช้เช็คว่าผู้ใช้ล็อกอินหรือยัง -function isAuthenticated(req, res, next) { - if (req.session.userId) return next(); - res.redirect('/login'); -} - -// หน้าแรก: พาไป dashboard ทันที ( User แบบ Guest สามารถเข้าได้) -app.get('/', (req, res) => { - res.redirect('/dashboard'); -}); - -// หน้า register -app.get('/register', (req, res) => { - res.render('register', { error: null }); -}); - -// ดำเนินการ register ผู้ใช้ใหม่ -app.post('/register', async (req, res) => { - const { username, email, password } = req.body; - try { - const hashedPassword = await bcrypt.hash(password, 10); - connection.query( - 'INSERT INTO users (username, email, password) VALUES (?, ?, ?)', - [username, email, hashedPassword], - (err) => { - if (err) { - console.error(err); - if (err.code === 'ER_DUP_ENTRY') { - return res.render('register', { error: 'ชื่อผู้ใช้นี้ถูกใช้ไปแล้ว' }); - } - return res.render('register', { error: 'เกิดข้อผิดพลาดในการลงทะเบียน' }); - } - res.redirect('/login'); - } - ); - } catch (error) { - console.error(error); - res.render('register', { error: 'เกิดข้อผิดพลาดระหว่างดำเนินการลงทะเบียน' }); - } -}); - -// หน้า login -app.get('/login', (req, res) => { - res.render('login', { error: null }); -}); - -// ดำเนินการ login -app.post('/login', (req, res) => { - const { userInput, password } = req.body; - connection.query( - 'SELECT * FROM users WHERE username = ? OR email = ?', - [userInput, userInput], - async (err, results) => { - if (err) return res.render('login', { error: 'เกิดข้อผิดพลาด' }); - if (results.length === 0) return res.render('login', { error: 'ไม่พบผู้ใช้งาน' }); - const user = results[0]; - const match = await bcrypt.compare(password, user.password); - if (match) { - req.session.userId = user.id; - req.session.username = user.username; - res.redirect('/dashboard'); - } else { - res.render('login', { error: 'รหัสผ่านไม่ถูกต้อง' }); - } - } - ); -}); - -// หน้า dashboard แสดงรายการ threads ทั้งหมด -app.get('/dashboard', (req, res) => { - const searchQuery = req.query.search; - let sql = ` - SELECT threads.*, users.username AS ownerName - FROM threads - JOIN users ON threads.user_id = users.id - `; - const params = []; - if (searchQuery) { - sql += `WHERE threads.thread_name LIKE ? OR threads.description LIKE ?`; - params.push(`%${searchQuery}%`, `%${searchQuery}%`); - } - sql += ' ORDER BY threads.id DESC'; - connection.query(sql, params, (err, threads) => { - if (err) return res.send('เกิดข้อผิดพลาดในการดึงข้อมูล threads'); - res.render('dashboard', { - username: req.session.username, - userId: req.session.userId, - threads, - query: searchQuery || '' - }); - }); -}); - -// หน้าเพิ่ม thread ใหม่ -app.get('/thread/create', isAuthenticated, (req, res) => { - res.render('thread-create', { username: req.session.username }); -}); - -// บันทึก thread ใหม่ลงฐานข้อมูล -app.post('/thread/create', isAuthenticated, (req, res) => { - const { thread_name, description } = req.body; - connection.query( - 'INSERT INTO threads (user_id, thread_name, description) VALUES (?, ?, ?)', - [req.session.userId, thread_name, description], - (err) => { - if (err) return res.send('เกิดข้อผิดพลาดในการสร้าง thread'); - res.redirect('/dashboard'); - } - ); -}); - -// หน้าแก้ไข thread -app.get('/thread/edit/:id', isAuthenticated, (req, res) => { - const threadId = req.params.id; - connection.query( - 'SELECT * FROM threads WHERE id = ? AND user_id = ?', - [threadId, req.session.userId], - (err, results) => { - if (err || results.length === 0) return res.send('ไม่พบ thread ที่ต้องการแก้ไข'); - res.render('thread-edit', { - username: req.session.username, - thread: results[0] - }); - } - ); -}); - -// อัปเดตข้อมูล thread ที่แก้ไข -app.post('/thread/edit/:id', isAuthenticated, (req, res) => { - const threadId = req.params.id; - const { thread_name, description } = req.body; - connection.query( - 'UPDATE threads SET thread_name = ?, description = ? WHERE id = ? AND user_id = ?', - [thread_name, description, threadId, req.session.userId], - (err) => { - if (err) return res.send('เกิดข้อผิดพลาดในการอัปเดต thread'); - res.redirect('/dashboard'); - } - ); -}); - -// ลบ thread -app.get('/thread/delete/:id', isAuthenticated, (req, res) => { - const threadId = req.params.id; - connection.query( - 'DELETE FROM threads WHERE id = ? AND user_id = ?', - [threadId, req.session.userId], - (err) => { - if (err) return res.send('เกิดข้อผิดพลาดในการลบ thread'); - res.redirect('/dashboard'); - } - ); -}); - -// หน้าแสดง thread พร้อมคอมเมนต์ -app.get('/thread/:id', (req, res) => { - const threadId = req.params.id; - - connection.query( - `SELECT threads.*, users.username AS ownerName - FROM threads - JOIN users ON threads.user_id = users.id - WHERE threads.id = ?`, - [threadId], - (err, results) => { - if (err || results.length === 0) return res.send('ไม่พบ thread ที่ต้องการ'); - - const thread = results[0]; - - connection.query( - `SELECT comments.*, users.username AS commentUser, users.email - FROM comments - JOIN users ON comments.user_id = users.id - WHERE comments.thread_id = ? - ORDER BY comments.id DESC`, - [threadId], - (err2, comments) => { - if (err2) return res.send('เกิดข้อผิดพลาดในการดึงคอมเมนต์'); - - res.render('thread-view', { - username: req.session.username, - userId: req.session.userId, - thread, - comments - }); - } - ); - } - ); -}); - - -// เพิ่มคอมเมนต์ใหม่ -app.post('/thread/:id/comment', isAuthenticated, (req, res) => { - const threadId = req.params.id; - const { comment } = req.body; - connection.query( - 'INSERT INTO comments (thread_id, user_id, comment) VALUES (?, ?, ?)', - [threadId, req.session.userId, comment], - (err) => { - if (err) return res.send('เกิดข้อผิดพลาดในการเพิ่มคอมเมนต์'); - res.redirect(`/thread/${threadId}`); - } - ); -}); - -// ลบคอมเมนต์ -app.get('/comment/delete/:id', isAuthenticated, (req, res) => { - const commentId = req.params.id; - connection.query( - 'SELECT * FROM comments WHERE id = ? AND user_id = ?', - [commentId, req.session.userId], - (err, results) => { - if (err || results.length === 0) return res.send('ไม่พบคอมเมนต์ที่ต้องการลบ'); - const comment = results[0]; - connection.query('DELETE FROM comments WHERE id = ?', [commentId], (err2) => { - if (err2) return res.send('เกิดข้อผิดพลาดในการลบคอมเมนต์'); - res.redirect(`/thread/${comment.thread_id}`); - }); - } - ); -}); - -// ออกจากระบบ -app.get('/logout', (req, res) => { - req.session.destroy(); - res.redirect('/dashboard'); -}); - -// เริ่มต้นเซิร์ฟเวอร์ -app.listen(port, '0.0.0.0', () => { - console.log(`Server เปิดอยู่ที่ http://localhost:${port}`); -}); diff --git a/views/dashboard.ejs b/views/dashboard.ejs deleted file mode 100644 index abafe86..0000000 --- a/views/dashboard.ejs +++ /dev/null @@ -1,56 +0,0 @@ -<%- include('partials/header', { username: username }) %> - -<!-- Background color --> -<div class="container my-5" style="background-color: #a86dcff5; color: #333; border-radius: 0px; padding: 30px;"> - <!-- Header with Title --> - <div class="d-flex justify-content-between align-items-center mb-4"> - <h2 class="mb-0" style="color: #000000; font-size: 30px; font-weight: 600;">THREAD TOPIC</h2> - <a href="/thread/create" class="btn" style="background-color: #000000; color: #fff; font-weight: 600; border-radius: 20px; padding: 10px 20px;"> - Create New Thread Topic - </a> - </div> - - <!-- List Group of Topics --> - <div class="list-group"> - <% threads.forEach(thread => { %> - <!-- Topic Item --> - <div class="list-group-item mb-4" style="background-color: #FFF; color: #333; border: none; border-radius: 0px; padding: 20px;"> - <div class="d-flex justify-content-between"> - <!-- Thread Title --> - <h5 class="mb-1" style="font-size: 20px; font-weight: 700;"> - <a href="/thread/<%= thread.id %>" style="color: #000000; text-decoration: none;"> - <%= thread.thread_name %> - </a> - </h5> - <!-- Thread Owner --> - <small style="color: #999; font-size: 16px;"> - <span style="color: black; font-weight: bold;">Owner: <%= thread.ownerName %> </span> - </small> - </div> - - <!-- Short Description --> - <p class="mb-3" style="font-size: 15px; line-height: 1.5;"> - <%= thread.description.length > 100 - ? thread.description.substring(0, 100) + '...' - : thread.description - %> - </p> - - <!-- Action Buttons (View/Edit/Delete) --> - <div class="mt-3"> - <a href="/thread/<%= thread.id %>" class="btn btn-sm btn-outline-info" style="border-radius: 20px;">View</a> - <% if (thread.user_id === userId) { %> - <a href="/thread/edit/<%= thread.id %>" class="btn btn-sm btn-outline-warning" style="border-radius: 20px;">Edit</a> - <a href="/thread/delete/<%= thread.id %>" - class="btn btn-sm btn-outline-danger" style="border-radius: 20px;" - onclick="return confirm('Are you sure you want to delete this thread?');"> - Delete - </a> - <% } %> - </div> - </div> - <% }) %> - </div> -</div> - -<%- include('partials/footer') %> diff --git a/views/login.ejs b/views/login.ejs deleted file mode 100644 index dc098e4..0000000 --- a/views/login.ejs +++ /dev/null @@ -1,43 +0,0 @@ -<!-- แสดง Header จาก partial/header.ejs --> -<%- include('partials/header') %> - -<!-- Container หลักของหน้า Login --> -<div class="container my-5" style="max-width: 450px;"> - <h2 class="text-center mb-4" style="color: #000000; font-weight: bold;">Login</h2> - - <!-- แสดงข้อความ error ถ้ามี error ถูกส่งมาจาก backend --> - <% if (error) { %> - <div class="alert alert-danger text-center" role="alert" style="font-size: 16px;"> - <%= error %> - </div> - <% } %> - - <!-- ฟอร์ม Login ส่งข้อมูลผ่าน POST ไปยัง /login --> - <form action="/login" method="POST" class="shadow p-4 rounded-lg" style="background-color: #F4F7FA;"> - - <!-- ช่องกรอก Username หรือ Email --> - <div class="form-group"> - <label for="userInput" style="font-weight: bold;">Username or Email:</label> - <input type="text" class="form-control" name="userInput" id="userInput" placeholder="Enter Username or Email" required> - </div> - - <!-- ช่องกรอก Password --> - <div class="form-group"> - <label for="password" style="font-weight: bold;">Password:</label> - <input type="password" class="form-control" name="password" id="password" placeholder="Enter Password" required> - </div> - - <!-- ปุ่มกดเข้าสู่ระบบ --> - <button type="submit" class="btn btn-primary btn-block" style="border-radius: 30px; padding: 12px; background-color: #000000; border-color: #000000;"> - Login - </button> - </form> - - <!-- ลิงก์ไปหน้า Register สำหรับผู้ที่ยังไม่มีบัญชี --> - <p class="text-center mt-3"> - Don't have an account yet? <a href="/register" style="color: #000000; font-weight: bold;">Register Your New Account here</a> - </p> -</div> - -<!-- แสดง Footer จาก partial/footer.ejs --> -<%- include('partials/footer') %> diff --git a/views/partials/footer.ejs b/views/partials/footer.ejs deleted file mode 100644 index a2bdb71..0000000 --- a/views/partials/footer.ejs +++ /dev/null @@ -1,5 +0,0 @@ -</div> <!-- end container --> -<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> -<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/js/bootstrap.bundle.min.js"></script> -</body> -</html> diff --git a/views/partials/header.ejs b/views/partials/header.ejs deleted file mode 100644 index f7bfe4c..0000000 --- a/views/partials/header.ejs +++ /dev/null @@ -1,97 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <title>Reddit Forum</title> - <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"> - <!-- เพิ่ม Favicon --> - <link rel="icon" href="path/to/your/favicon.ico" type="image/x-icon"> - - <style> - /* ปรับ Navbar ให้เป็นสีส้ม Shopee */ - .navbar { - background-color: #5c64f3 !important; /* สีส้ม Shopee */ - } - /* ตัวหนังสือบน Navbar ให้เป็นสีขาว */ - .navbar-brand, .nav-link { - color: #000000!important; - font-weight: bold; - } - .navbar-brand:hover, .nav-link:hover { - color: #FFD2C3 !important; /* สีส้มอ่อนลงเมื่อ hover */ - } - - /* ปรับฟอร์มค้นหาให้สวยงาม */ - .search-form { - width: 500px; - margin-left: auto; - margin-right: auto; - } - .search-form .form-control { - border-radius: 50px; - padding-left: 20px; - font-size: 16px; - } - .search-form .input-group-append .btn { - background-color: #232428; - color: white; - /* border-radius: 50px; */ - border: none; - padding-left: 20px; - padding-right: 20px; - } - .search-form .input-group-append .btn:hover { - background-color: #410445; - } - - </style> -</head> -<body> -<nav class="navbar navbar-expand-lg navbar-dark"> - <!-- ชื่อ Website --> - <a class="navbar-brand" href="/dashboard">REDDIT-FORUM</a> - <!-- ปุ่ม toggle สำหรับ mobile --> - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarContent" - aria-controls="navbarContent" aria-expanded="false" aria-label="Toggle navigation"> - <span class="navbar-toggler-icon"></span> - </button> - - <!-- ฟอร์ม Search จะปรากฏเฉพาะเมื่อผู้ใช้เข้าสู่ระบบ --> - <div class="collapse navbar-collapse" id="navbarContent"> - <% if (typeof username !== 'undefined') { %> - <!-- แสดงฟอร์มค้นหาสำหรับผู้ใช้ที่ล็อกอินแล้ว --> - <form action="/dashboard" method="GET" class="search-form d-flex"> - <div class="input-group"> - <input type="text" name="search" class="form-control" placeholder="Search Your Threds Here" - value="<%= typeof query !== 'undefined' ? query : '' %>"> - <div class="input-group-append"> - <button class="btn btn-outline-secondary" type="submit">Search</button> - <a href="/dashboard" class="btn btn-outline-secondary ml-2">Reset</a> - </div> - </div> - </form> - <% } %> - - <!-- เมนู Navbar --> - <ul class="navbar-nav ml-auto"> - <% if (typeof username !== 'undefined') { %> - <li class="nav-item"> - <a class="nav-link" href="#">Welcome, <%= username %></a> - </li> - <li class="nav-item"> - <a class="nav-link" href="/logout">Logout</a> - </li> - <% } else { %> - <li class="nav-item"> - <a class="nav-link" href="/login">Login</a> - </li> - <li class="nav-item"> - <a class="nav-link" href="/register">Register</a> - </li> - <% } %> - </ul> - </div> -</nav> - - -<div class="container mt-4"> diff --git a/views/register.ejs b/views/register.ejs deleted file mode 100644 index f3c0659..0000000 --- a/views/register.ejs +++ /dev/null @@ -1,49 +0,0 @@ -<!-- แสดง Header จาก partial/header.ejs --> -<%- include('partials/header') %> - -<!-- Container หลักของหน้าสมัครสมาชิก --> -<div class="container my-5" style="max-width: 450px;"> - <h2 class="text-center mb-4" style="color: #000000; font-weight: bold;">Register</h2> - - <!-- ถ้ามี error (จาก server) ให้แสดงข้อความแจ้งเตือนในกล่องสีแดง --> - <% if (error) { %> - <div class="alert alert-danger text-center" role="alert" style="font-size: 16px;"> - <%= error %> - </div> - <% } %> - - <!-- ฟอร์มสมัครสมาชิก ส่งข้อมูลผ่าน POST ไปยัง /register --> - <form action="/register" method="POST" class="shadow p-4 rounded-lg" style="background-color: #F4F7FA;"> - - <!-- ช่องกรอก Username --> - <div class="form-group"> - <label for="username" style="font-weight: bold;">Username:</label> - <input type="text" class="form-control" name="username" id="username" placeholder="Enter Username" required> - </div> - - <!-- ช่องกรอก Email --> - <div class="form-group"> - <label for="email" style="font-weight: bold;">Email:</label> - <input type="email" class="form-control" name="email" id="email" placeholder="Enter Email" required> - </div> - - <!-- ช่องกรอก Password --> - <div class="form-group"> - <label for="password" style="font-weight: bold;">Password:</label> - <input type="password" class="form-control" name="password" id="password" placeholder="Enter Password" required> - </div> - - <!-- ปุ่มกดสมัครสมาชิก --> - <button type="submit" class="btn btn-primary btn-block" style="border-radius: 30px; padding: 12px; background-color: #000000; border-color: #000000;"> - Register - </button> - </form> - - <!-- ลิงก์ไปหน้า Login หากผู้ใช้มีบัญชีอยู่แล้ว --> - <p class="text-center mt-3"> - Already have an account? <a href="/login" style="color: #000000; font-weight: bold;">Login here</a> - </p> -</div> - -<!-- แสดง Footer จาก partial/footer.ejs --> -<%- include('partials/footer') %> diff --git a/views/thread-create.ejs b/views/thread-create.ejs deleted file mode 100644 index 9d385c0..0000000 --- a/views/thread-create.ejs +++ /dev/null @@ -1,35 +0,0 @@ -<!-- แสดง Header พร้อมส่งค่า username ไปด้วย --> -<%- include('partials/header', { username: username }) %> - -<!-- ส่วนฟอร์มสำหรับสร้างกระทู้ --> -<div class="container my-5" style="max-width: 600px;"> - <h2 class="text-center mb-4" style="color: #000000;">Create Thread</h2> - - <!-- Card ที่ห่อหุ้มฟอร์ม --> - <div class="card shadow-sm"> - <div class="card-body"> - <!-- ฟอร์มสร้างกระทู้ใหม่ --> - <form action="/thread/create" method="POST"> - <!-- ชื่อกระทู้ --> - <div class="form-group"> - <label for="thread_name" style="color: #333;">Thread Name:</label> - <input type="text" class="form-control" name="thread_name" id="thread_name" required> - </div> - - <!-- รายละเอียดกระทู้ --> - <div class="form-group"> - <label for="description" style="color: #333;">Description:</label> - <textarea class="form-control" name="description" id="description" rows="5"></textarea> - </div> - - <!-- ปุ่มสร้างกระทู้ --> - <button type="submit" class="btn btn-block" style="background-color: #000000; color: #fff; border: none;"> - Create - </button> - </form> - </div> - </div> -</div> - -<!-- แสดง Footer --> -<%- include('partials/footer') %> diff --git a/views/thread-edit.ejs b/views/thread-edit.ejs deleted file mode 100644 index 02cd054..0000000 --- a/views/thread-edit.ejs +++ /dev/null @@ -1,40 +0,0 @@ -<!-- แสดง Header และส่งตัวแปร username ไปยัง partial --> -<%- include('partials/header', { username: username }) %> - -<!-- Container หลักที่จำกัดความกว้างไว้ไม่เกิน 600px และมีระยะห่างด้านบน/ล่าง --> -<div class="container my-5" style="max-width: 600px;"> - - <!-- หัวข้อหน้าแก้ไขกระทู้ --> - <h2 class="text-center mb-4" style="color: #000000;">Edit Thread</h2> - - <!-- การ์ดสไตล์ Bootstrap พร้อมเงาเล็กน้อย --> - <div class="card shadow-sm"> - <div class="card-body"> - - <!-- ฟอร์มสำหรับแก้ไขกระทู้ ใช้ method POST และส่งไปยัง path ที่มี id ของกระทู้ --> - <form action="/thread/edit/<%= thread.id %>" method="POST"> - - <!-- ช่องกรอกชื่อกระทู้ พร้อมเติมค่าปัจจุบันจากตัวแปร thread --> - <div class="form-group"> - <label for="thread_name" style="color: #333;">Thread Name:</label> - <input type="text" class="form-control" name="thread_name" id="thread_name" value="<%= thread.thread_name %>" required> - </div> - - <!-- ช่องกรอกรายละเอียดกระทู้ พร้อมเติมค่าปัจจุบัน --> - <div class="form-group"> - <label for="description" style="color: #333;">Description:</label> - <textarea class="form-control" name="description" id="description" rows="5"><%= thread.description %></textarea> - </div> - - <!-- ปุ่มกดยืนยันการอัปเดตกระทู้ --> - <button type="submit" class="btn btn-block" style="background-color: #000000; color: #fff; border: none;"> - Update - </button> - </form> - - </div> - </div> -</div> - -<!-- แสดง Footer จาก partial --> -<%- include('partials/footer') %> diff --git a/views/thread-view.ejs b/views/thread-view.ejs deleted file mode 100644 index 1b79313..0000000 --- a/views/thread-view.ejs +++ /dev/null @@ -1,94 +0,0 @@ -<!-- แสดง Header และส่งตัวแปร username ไปยัง partial --> -<%- include('partials/header', { username: username }) %> - -<!-- Container หลักที่จำกัดความกว้างไว้ไม่เกิน 600px พร้อมระยะห่างด้านบน/ล่าง --> -<div class="container my-5" style="max-width: 600px;"> - - <!-- หัวข้อชื่อกระทู้ (แสดงชื่อกระทู้เป็นหัวข้อใหญ่) --> - <h2 class="text-center mb-4" style="color: #000000;"> <%= thread.thread_name %> </h2> - - <!-- การ์ดหลักที่แสดงรายละเอียดกระทู้ --> - <div class="card shadow-sm"> - <div class="card-body"> - - <!-- หัวข้อย่อยของการ์ด --> - <h5 class="card-title" style="color: #000000; font-size: 1.8rem;"> - Topic: <%= thread.thread_name %> - </h5> - - <!-- คำอธิบายของกระทู้ --> - <p class="card-text"> - <strong>Description:</strong> <%= thread.description %> - </p> - - <!-- เจ้าของกระทู้ --> - <p class="card-text"> - <strong>Owner:</strong> <%= thread.ownerName %> - </p> - - <!-- ปุ่มแก้ไขและลบกระทู้ (แสดงเฉพาะเมื่อ user เป็นเจ้าของกระทู้) --> - <% if (thread.user_id === userId) { %> - <a href="/thread/edit/<%= thread.id %>" class="btn btn-sm btn-outline-warning">Edit</a> - <a href="/thread/delete/<%= thread.id %>" class="btn btn-sm btn-outline-danger" - onclick="return confirm('Are you sure you want to delete this thread?');"> - Delete - </a> - <% } %> - - <!-- ปุ่มย้อนกลับไปหน้า Dashboard --> - <div class="d-flex justify-content-end mt-2"> - <a href="/dashboard" class="btn btn-sm btn-outline-info">Back to Dashboard</a> - </div> - </div> - </div> - - <!-- ส่วนแสดงคอมเมนต์ทั้งหมด --> - <div class="mt-4"> - <h4 style="color: #000000;">Comments</h4> - - <!-- ถ้ามีคอมเมนต์ --> - <% if (comments && comments.length > 0) { %> - <ul class="list-group"> - <% comments.forEach(c => { %> - <li class="list-group-item mb-2" style="border-radius: 5px;"> - <!-- แสดงชื่อผู้คอมเมนต์และข้อความ --> - <strong><%= c.commentUser %>:</strong> <%= c.comment %> - - <!-- แสดง Email --> - <span class="text-muted" style="font-size: 0.8em;"> - <b>(User Email: <%= c.email %>)</b> - </span> - - <!-- ปุ่มลบคอมเมนต์ (เฉพาะเจ้าของคอมเมนต์) --> - <% if (c.user_id === userId) { %> - <a href="/comment/delete/<%= c.id %>" - class="btn btn-sm btn-outline-danger float-right" - onclick="return confirm('Delete this comment?');"> - Delete - </a> - <% } %> - </li> - <% }) %> - </ul> - <% } else { %> - <!-- ถ้ายังไม่มีคอมเมนต์ --> - <p>No comments yet.</p> - <% } %> - </div> - - <!-- แบบฟอร์มเพิ่มคอมเมนต์ใหม่ --> - <div class="card mt-3"> - <div class="card-body"> - <form action="/thread/<%= thread.id %>/comment" method="POST"> - <div class="form-group"> - <label for="comment">Add Comment:</label> - <textarea class="form-control" name="comment" id="comment" rows="2" required></textarea> - </div> - <button type="submit" class="btn" style="background-color: #000000; color: #fff;">Comment</button> - </form> - </div> - </div> -</div> - -<!-- แสดง Footer --> -<%- include('partials/footer') %> -- GitLab