Mục tiêu của dự án:
- Xây dựng một hệ thống quản lý công việc với các chức năng cơ bản như thêm, sửa, xóa, và xem danh sách công việc.
- Kết hợp các kiến thức đã học trong PHP, MySQL, và HTML/CSS để tạo ứng dụng hoàn chỉnh.
1. Mô tả dự án:
Chức năng chính:
- Thêm công việc: Người dùng có thể nhập tiêu đề, mô tả, ngày bắt đầu và hạn hoàn thành của công việc.
- Xem danh sách công việc: Hiển thị tất cả công việc đã được thêm với trạng thái “Đã hoàn thành” hoặc “Chưa hoàn thành”.
- Chỉnh sửa công việc: Cho phép người dùng cập nhật thông tin công việc.
- Xóa công việc: Xóa công việc không cần thiết.
- Đánh dấu hoàn thành: Thay đổi trạng thái công việc thành “Đã hoàn thành”.
Công nghệ sử dụng:
- Backend: PHP (PDO để làm việc với MySQL).
- Database: MySQL.
- Frontend: HTML/CSS cơ bản.
2. Thiết kế cơ sở dữ liệu:
Tạo một cơ sở dữ liệu có tên là task_manager
và bảng tasks
với cấu trúc như sau:
CREATE DATABASE task_manager;
USE task_manager;
CREATE TABLE tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
start_date DATE,
due_date DATE,
status ENUM('Chưa hoàn thành', 'Đã hoàn thành') DEFAULT 'Chưa hoàn thành'
);
3. Xây dựng các chức năng chính:
a. Kết nối tới cơ sở dữ liệu
Tạo tệp db.php
để xử lý kết nối với MySQL:
<?php
$dsn = "mysql:host=localhost;dbname=task_manager";
$username = "root";
$password = "";
try {
$conn = new PDO($dsn, $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Kết nối thất bại: " . $e->getMessage());
}
?>
b. Thêm công việc
Tạo tệp add_task.php
để hiển thị form thêm công việc và xử lý dữ liệu:
<?php
require 'db.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$title = $_POST['title'];
$description = $_POST['description'];
$start_date = $_POST['start_date'];
$due_date = $_POST['due_date'];
$sql = "INSERT INTO tasks (title, description, start_date, due_date) VALUES (:title, :description, :start_date, :due_date)";
$stmt = $conn->prepare($sql);
$stmt->execute([
'title' => $title,
'description' => $description,
'start_date' => $start_date,
'due_date' => $due_date
]);
header("Location: index.php");
exit;
}
?>
<form method="post">
<label>Tiêu đề:</label>
<input type="text" name="title" required>
<label>Mô tả:</label>
<textarea name="description"></textarea>
<label>Ngày bắt đầu:</label>
<input type="date" name="start_date">
<label>Hạn hoàn thành:</label>
<input type="date" name="due_date">
<button type="submit">Thêm Công Việc</button>
</form>
c. Hiển thị danh sách công việc
Tạo tệp index.php
để hiển thị danh sách công việc:
<?php
require 'db.php';
$sql = "SELECT * FROM tasks ORDER BY id DESC";
$stmt = $conn->query($sql);
$tasks = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<h1>Danh Sách Công Việc</h1>
<a href="add_task.php">Thêm Công Việc</a>
<table border="1">
<tr>
<th>ID</th>
<th>Tiêu đề</th>
<th>Mô tả</th>
<th>Ngày bắt đầu</th>
<th>Hạn hoàn thành</th>
<th>Trạng thái</th>
<th>Hành động</th>
</tr>
<?php foreach ($tasks as $task): ?>
<tr>
<td><?= $task['id'] ?></td>
<td><?= $task['title'] ?></td>
<td><?= $task['description'] ?></td>
<td><?= $task['start_date'] ?></td>
<td><?= $task['due_date'] ?></td>
<td><?= $task['status'] ?></td>
<td>
<a href="edit_task.php?id=<?= $task['id'] ?>">Sửa</a> |
<a href="delete_task.php?id=<?= $task['id'] ?>" onclick="return confirm('Xóa công việc này?')">Xóa</a> |
<a href="mark_complete.php?id=<?= $task['id'] ?>">Hoàn thành</a>
</td>
</tr>
<?php endforeach; ?>
</table>
d. Cập nhật công việc
Tạo tệp edit_task.php
để sửa thông tin công việc (tương tự add_task.php
).
e. Xóa công việc
Tạo tệp delete_task.php
để xử lý xóa công việc.
f. Đánh dấu hoàn thành
Tạo tệp mark_complete.php
để cập nhật trạng thái công việc thành “Đã hoàn thành”.
4. Bài tập mở rộng:
- Thêm chức năng tìm kiếm công việc theo tiêu đề.
- Thêm phân trang cho danh sách công việc.
- Thêm tính năng lọc công việc theo trạng thái (“Chưa hoàn thành” hoặc “Đã hoàn thành”).