ระบบจัดการตารางงาน (To-Do List) พร้อมหมวดหมู่และแจ้งเตือน

📌 คุณสมบัติของระบบ

  • เพิ่ม/แก้ไข/ลบ รายการงาน
  • แยกงานตามหมวดหมู่ (เช่น งานส่วนตัว, งานธุรกิจ, งานบ้าน)
  • ระบบแจ้งเตือนงานที่ครบกำหนด
  • รองรับการใช้งานบนมือถือ (Responsive Design)
  • แจ้งเตือนแบบ Popup + เสียง

📌 1. สร้างฐานข้อมูล MySQL

CREATE DATABASE todo_list;
USE todo_list;

-- ตารางหมวดหมู่
CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

-- ตารางงาน
CREATE TABLE tasks (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    description TEXT,
    category_id INT,
    due_date DATETIME,
    status ENUM('pending', 'completed') DEFAULT 'pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE SET NULL
);

📌 2. เชื่อมต่อฐานข้อมูล (db.php)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "todo_list";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("เชื่อมต่อฐานข้อมูลล้มเหลว: " . $conn->connect_error);
}
?>

📌 3. ระบบเพิ่มหมวดหมู่ (categories.php)

<?php
include 'db.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $name = $_POST['name'];
    $stmt = $conn->prepare("INSERT INTO categories (name) VALUES (?)");
    $stmt->bind_param("s", $name);
    $stmt->execute();
}

$categories = $conn->query("SELECT * FROM categories");
?>

<h2>หมวดหมู่</h2>
<form method="post">
    ชื่อหมวดหมู่: <input type="text" name="name" required>
    <button type="submit">เพิ่ม</button>
</form>

<ul>
    <?php while ($row = $categories->fetch_assoc()): ?>
        <li><?= $row['name'] ?></li>
    <?php endwhile; ?>
</ul>
<a href="tasks.php">ไปยังรายการงาน</a>

📌 4. ระบบเพิ่มงาน (tasks.php)

<?php
include 'db.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $title = $_POST['title'];
    $description = $_POST['description'];
    $category_id = $_POST['category_id'];
    $due_date = $_POST['due_date'];

    $stmt = $conn->prepare("INSERT INTO tasks (title, description, category_id, due_date) VALUES (?, ?, ?, ?)");
    $stmt->bind_param("ssis", $title, $description, $category_id, $due_date);
    $stmt->execute();
}

$tasks = $conn->query("SELECT tasks.*, categories.name as category_name FROM tasks LEFT JOIN categories ON tasks.category_id = categories.id ORDER BY due_date ASC");
$categories = $conn->query("SELECT * FROM categories");
?>

<h2>เพิ่มงานใหม่</h2>
<form method="post">
    ชื่องาน: <input type="text" name="title" required><br>
    รายละเอียด: <textarea name="description"></textarea><br>
    หมวดหมู่: 
    <select name="category_id">
        <?php while ($row = $categories->fetch_assoc()): ?>
            <option value="<?= $row['id'] ?>"><?= $row['name'] ?></option>
        <?php endwhile; ?>
    </select><br>
    วันครบกำหนด: <input type="datetime-local" name="due_date" required><br>
    <button type="submit">เพิ่มงาน</button>
</form>

<h2>รายการงาน</h2>
<table border="1">
    <tr>
        <th>ชื่องาน</th>
        <th>หมวดหมู่</th>
        <th>ครบกำหนด</th>
        <th>สถานะ</th>
        <th>จัดการ</th>
    </tr>
    <?php while ($row = $tasks->fetch_assoc()): ?>
        <tr>
            <td><?= $row['title'] ?></td>
            <td><?= $row['category_name'] ?></td>
            <td><?= $row['due_date'] ?></td>
            <td><?= $row['status'] === 'pending' ? '⏳ รอดำเนินการ' : '✅ เสร็จสิ้น' ?></td>
            <td>
                <a href="complete_task.php?id=<?= $row['id'] ?>">✅ เสร็จสิ้น</a> |
                <a href="delete_task.php?id=<?= $row['id'] ?>">❌ ลบ</a>
            </td>
        </tr>
    <?php endwhile; ?>
</table>

📌 5. อัปเดตสถานะงาน (complete_task.php)

<?php
include 'db.php';
$id = $_GET['id'];
$conn->query("UPDATE tasks SET status = 'completed' WHERE id = $id");
header("Location: tasks.php");
?>

📌 6. ลบงาน (delete_task.php)

<?php
include 'db.php';
$id = $_GET['id'];
$conn->query("DELETE FROM tasks WHERE id = $id");
header("Location: tasks.php");
?>

📌 7. ระบบแจ้งเตือนงานที่ครบกำหนด (notifications.php)

<?php
include 'db.php';

$result = $conn->query("SELECT * FROM tasks WHERE due_date <= NOW() AND status = 'pending'");
$tasks = $result->fetch_all(MYSQLI_ASSOC);

echo json_encode($tasks);
?>

แจ้งเตือนอัตโนมัติ

📄 (เพิ่มใน tasks.php หรือไฟล์ HTML อื่นๆ)

<script>
    function checkNotifications() {
        fetch('notifications.php')
            .then(response => response.json())
            .then(data => {
                if (data.length > 0) {
                    alert("📢 มีงานที่ครบกำหนด!");
                    new Audio('notification.mp3').play(); // แจ้งเตือนเสียง
                }
            });
    }
    setInterval(checkNotifications, 30000); // ตรวจสอบทุก 30 วินาที
</script>

📌 8. ทำให้รองรับมือถือ (Responsive Design)

เพิ่ม Bootstrap CSS

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">

และเพิ่ม CSS ปรับ UI

@media (max-width: 768px) {
    table {
        width: 100%;
        font-size: 14px;
    }
    input, textarea, select {
        width: 100%;
    }
}

สรุป

  • เพิ่ม/แก้ไข/ลบ งาน ได้ง่าย
  • แยกหมวดหมู่ ตามประเภทงาน
  • แจ้งเตือนงานที่ครบกำหนด (Popup + เสียง)
  • รองรับมือถือ (Bootstrap Responsive)
,


ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *