Website cũng có các chức năng cho người quản trị để họ có thể quản lý sản phẩm, phân loại sản phẩm, quản lý khách hàng, quản lý các bình luận từ khác hàng về các sản phẩm cũng như thống
Trang 2GIỚI THIỆU ĐỀ TÀI
1 GIỚI THIỆU ĐỀ TÀI
- Hiện nay tại Việt Nam, có rất nhiều nhà hàng, quán ăn nổi tiếng ở nhiều
tỉnh thành, và do sự phát triển mạnh mẽ của internet, nhu cầu mua sắm
online ngày càng cao nên việc phát triển một trang web để quảng bá ẩm
thực thật sự rất cần thiết Vì vậy chúng tôi sẽ thiết kế một website quảng
bá về ẩm thực tại Hội An Quảng Nam
2 PHÂN TÍCH HỆ THỐNG
Yêu cầu hệ thống
- Mục đích
- Hiện nay, có rất nhiều khách du lich đến Phố Cổ Hội An nhưng chưa
thật sự biết nhiều ẩm thực tại đây nên mục đích của website là giúp cho
du khách biết nhiều món ăn hơn, có nhiều sự lựa chọn hơn và dể dàng
để đặt hàng và thanh toán online trên website Website cũng có các chức
năng cho người quản trị để họ có thể quản lý sản phẩm, phân loại sản
phẩm, quản lý khách hàng, quản lý các bình luận từ khác hàng về các
sản phẩm cũng như thống kê món ăn theo loại…
- Phạm vi
Website dành cho người tiêu dùng
+ Cấu trúc chúng của tất cả các trang web trong website
phải:
+ Chứa danh mục loại món ăn để khách hàng dễ dàng tìm kiếm món
ăn theo từng loại
+ Tìm kiếm món ăn theo tên
+ Hiển thị danh sách các món ăn được quan tâm nhiều nhất (xem
nhiều nhất)
+ Đăng nhập/thông tin người tiêu dùng sau khi đã đăng nhập
+ Trang chính của website
Trưng bày các món ăn đặc biệt được nhân viên quản trị chỉ định
+ Trang trưng bày món ăn
Khi người dùng chọn loại món hoặc tìm kiếm theo tên thì danh sách món ăn thỏa mãn yêu cầu được hiện ra Mỗi món ăn cần hiển thị hình ảnh, tên, đơn giá và giảm giá nếu
có Khi người dùng nhấp vào hình của món ăn thì sẽ
Trang 3chuyển đến trang hiển thị chi tiết món ăn đồng thời tăng số lần xem
+ Chi tiết món ăn
Yêu cầu của trang web này như sau:
Thông tin chi tiết của món ăn được chọn
Danh sách các món ăn cùng loại với món ăn được chọn
Cho phép khách hàng gửi bình luận về sản phẩm
Các trang quản lý tài khoản sử dụng
Đăng nhập
Đăng ký
Quên mật khẩu
Đổi mật khẩu
Cập nhật thông tin tài khoản
Website dành cho người quản trị
+ Thống kê món ăn theo loại, cho phép hiển thị dưới dạng biểu đồ
+ Thống kê bình luận theo món ăn
Yêu cầu về bảo mật
+ Tất cả các form nhập phải được kiểm soát dữ liệu một cách hợp lý
+ Khách hàng chưa đăng nhập không được phép gửi bình luận về
món ăn cũng như đổi mật khẩu, cập nhật thông tin tài khoản
+ Chỉ có các nhân viên quản trị mới được phép thực hiện các chức
năng quản trị
Yêu cầu về môi trường công nghệ
+ Website phải được xây dựng với PHP và MySQL
Trang 43 VẼ SƠ ĐỒ USE CASE
Image 1
Trang 54 ĐẶT TẢ CHỨC NĂNG
- Chức năng dành cho khách hàng
+ Cấu trúc chung của các trang web
+ Hiển thị danh mục loại món ăn, form tìm kiếm theo tên, 10 món ăn
được xem nhiều nhất và form đăng nhập hoặc thông tin khách hàng sau khi
đã đăng nhập Nếu người đăng nhập có vai trò là nhân viên thì hiển thị liên
kết đến trang quản trị
+ Tìm hàng theo loại
+ Liệt kê các món ăn theo loại được chọn bởi khách hàng Thông tin mỗi
món ăn gồm tên, ảnh và đơn giá Liên kết đến trang chi tiết món ăn
+ Tìm hàng theo tên
+ Liệt kê các món ăn theo tên hàng hoặc tên loại theo yêu cầu tìm kiếm
của khách hàng Thông tin mỗi món ăn gồm tên, ảnh và đơn giá Liên kết
đến trang chi tiết món ăn
+ Xem thông tin chi tiết
+ Hiển thị thông tin chi tiết của món ăn được chọn bởi khách hàng và các
món ăn cùng loại có gắn liên kết đến trang chi tiết món ăn để khách hàng
có thể xem luôn mà không cần phải trở lại trang liệt kê món ăn
+ Gửi bình luận
+ Gửi bình luận về món ăn đang xem, chức năng này chỉ được thực hiện
sau khi khách hàng đã đăng nhập Các bình luận về món ăn cũng được liệt
Đổi mật khẩu
Thay đổi mật khẩu khi cần thiết để đảm bảo độ bảo mật của mình
Trang 6 Tìm lại mật khẩu dựa vào tên đăng nhập và email_users
Sau khi xác minh đúng sẽ gửi mật khẩu qua email_users
đã đăng ký trước đó để đảm bảo độ bảo mật
Cập nhật thông tin tài khoản
Cập nhật lại thông tin tài khoản của mình (không cho phép cập nhật tên đăng nhập)
- Dành cho quản trị
+ Quản lý món ăn
Thực hiện được các chức năng xem, thêm, xóa, sửa và phân
trang
+ Quản lý loại món ăn
Thực hiện được các chức năng xem, thêm, xóa, sửa
+ Quản lý khách hàng
Thực hiện được các chức năng xem, thêm, xóa, sửa Nhân viên
quản trị không được phép xóa chính mình
Tổng hợp thông tin món ăn từng loại món ăn Thông tin tổng
hợp cần được trình bày có cấu trúc sau
Loại món ăn Số món ăn Giá trung
bình
Giá thấp nhất Giá cao
nhất
Trang 7+ Trình duyệt thông dụng: FireFox, chrome, Safari
- Công cụ: Vim, visual studio code
Khách hàng Bình luậ
Trang 8THIẾT KẾ HỆ THỐNG WEBSITE:
1 Mô hình hệ thống:
Image 3
2 Thiết kế cơ sở dữ liệu:
a Liệt kê thực thể, thuộc tính và mối quan hệ:
Trang 9+ Hình ảnh
+ Ngày nhập
+ Mô tả
+ Trạng thái đặc biệt ( là mặt hàng đặc biệt được hiện ở trang chủ)
+ Số lượt xem ( ghi nhận số lượt xem để đánh giá độ quan tâm của khách
+ Mã món ăn được bình luận
+ Nội dung bình luận
+ Thời gian bình luận
- type:
+ Mã loại món ăn
+ Tên loại món ăn
- Yêu cầu ràng buộc quan hệ:
Trang 10users
pk ma_users
Ten_user Mat_khau_users_us
ers Hinh_pro_users
Noi_dung_cmt_cmt Ngay_cmt
Products
Ten_pro Gia_pro Dia_chi_pro Giam_gia_pro_pro Hinh_pro_pro Ngay_nhap_pro_pro Mo_ta_pro_pro Dac_biet_pro_pro So_luot_xem_pro_pro
Type
Pk Ma_type
Ten_type
Trang 11- Bảng users:
Ma_users varchar(10) Pk, not null Mã khách hàng
Ten_users Varchar(255) Not null Tên khách hàng
Mat_khau_users_
users
Varchar(50) Not null Mật khẩu
Hinh_pro_users Varchar(255) Not null Hình ảnh users
Ma_pro Int(30) Tu tang, pk, not
null
Mã món ăn
Ten_pro Varchar(255) not null Tên món ăn
Dia_chi_pro Varchar(255) not null Địa chỉ món ăn
Giam_gia_pro_pr
o
Int(30) not null Giảm giá
Hinh_pro_pro Varchar(255) not null Hình ảnh
Ngay_nhap_pro_
pro
Mo_ta_pro_pro Varchar(2000) not null Miêu tả món ăn
Dac_biet_pro_pro Bit(1) not null Trạng thái đặc
biệt So_luot_xem_pro Int(11) Default 0 Số lượt xem
Trang 12Ma_type Int(30) not null, fk Mã loại
- type:
Tên cột Kiểu Ràng buộc Ghi chú
Ma_type Int(30) Tu tang, pk, not
null
Mã loại món Ten_type Varchar(255) Not null Tên loại món
- comments:
Tên cột Kiểu Ràng buộc Ghi chú
Ma_cmt Int(30) Tu tang, pk, not
null
Mã bình luận
Ma_users_cmt Varchar(30) Fk, not null Mã khách hàng
bình luận Ma_pro_cmt Int(30) Fk, not null Mã món ăn đươc
bình luận Noi_dung_cmt_c
Trang 133 Thiết kế giao diện:
a Sitemap:
Image 4
b Giao diện quản trị website:
Image 5
Trang 14c Giao diện customer:
1 Trang chu:
Image 6
2 Mon an chi tiet:
Trang 15Image 7
3 Contact:
Trang 16Image 8
Trang 174 About us:
Image 9
Trang 18I THỰC HIỆN VIẾT MÃ
1 ĐẶT TẢ CHỨC NĂNG
- Tạo CSDL
+ Sử dụng công cụ MySQL hoặc viết mã SQL để tạo CSDL có
hoi_an_street_foods và các bảng có cấu trúc và ràng buộc như mô tả ở phần
cấu trúc bảng Cụ thể cần tại một CSDL như sơ đồ sau:
Image 10
- SQL truy vấn và thao tác bảng
+ Viết các câu lệnh thực hiện truy vấn và thao tác dữ liệu cần thiết cho mỗi
bảng Các câu lệnh này được sử dụng trong lập trình php sau này để làm việc
với cơ sở dữ liệu
UPDATE type SET ten_type=? WHERE ma_type=?
Xóa theo mã DELETE FROM type WHERE ma_type=?
Truy vấn tất cả SELECT * FROM type
Truy vấn theo
mã
SELECT * FROM type WHERE ma_type=?
Trang 19Đếm số lượng SELECT count(*) FROM type WHERE ma_type=?
Món ăn
Hành động Câu lệnh SQL
Thêm mới INSERT INTO products(ten_pro, gia_pro, giam_gia_pro,
hinh_pro, ma_type, dac_biet_pro, so_luot_xem_pro, ngay_nhap_pro, mo_ta_pro) VALUES (?,?,?,?,?,?,?,?,?)
Cập nhật theo
mã
UPDATE products SET ten_pro=?, gia_pro=?, giam_gia_pro=?, hinh_pro=?, ma_type=?, dac_biet_pro=?, so_luot_xem_pro=?, ngay_nhap_pro=?, mo_ta_pro=?
SELECT count(*) FROM products WHERE ma_pro=?
Phân trang SELECT * FROM products ORDER BY ma_pro LIMIT 0, 10
Tìm kiếm
hàng đặc biệt
SELECT * FROM products WHERE dac_biet_pro=1
Tìm kiếm SELECT * FROM products WHERE ma_type=?
Trang 20Tìm kiếm
hàng theo tên
SELECT * FROM products hh
JOIN type lo ON lo.ma_type=hh.ma_type WHERE ten_pro LIKE ? OR ten_type LIKE ?
Khách hàng
Hành động Câu lệnh SQL
Thêm mới INSERT INTO users(ma_users, mat_khau_users, ten_users,
email_users, hinh_pro, kich_hoat, vai_tro_users) VALUES (?, ?, ?, ?, ?, ?, ?)
SELECT count(*) FROM users WHERE ma_users=?
Đổi mật khẩu UPDATE users SET mat_khau_users=? WHERE ma_users=?
Trang 21mã noi_dung_cmt=?, ngay_cmt=? WHERE ma_cmt=?
Xóa theo mã DELETE FROM comments WHERE ma_cmt=?
JOIN products h ON h.ma_pro=b.ma_pro WHERE b.ma_pro=?
ORDER BY ngay_cmt DESC
JOIN type lo ON lo.ma_type=hh.ma_type GROUP BY lo.ma_type, lo.ten_type
Thống kê bình
luận theo hàng
SELECT hh.ma_pro, hh.ten_pro,
COUNT(*) so_luong,
Trang 22MIN(bl.ngay_cmt) cu_nhat, MAX(bl.ngay_cmt) moi_nhat FROM comments bl
JOIN products hh ON hh.ma_pro=bl.ma_pro GROUP BY hh.ma_pro, hh.ten_pro
HAVING so_luong > 0
- Lập trình CSDL
Trong dự án này chúng ta chọn mô hình lập trình với CSDL như hình sau
Image 11 Trong đó:
Controller: là các php điều khiển hành vi người dùng để thực hiện các
chức năng nghiệp vụ
Database: cơ sở dữ liệu hoi_an_street_foods
PDO: là php cung cấp các hàm tiện ích chung thực hiện truy vấn và thao
tác CSDL sử dụng cơ chế PDO
DAO: là các php chứa các hàm thực hiện các thao tác và truy vấn dữ
liệu đối với mỗi bảng Nó cũng chứa các hàm thực hiện thao tác tổng
hợp thống kê dữ liệu
Như vậy khi một trang php (controller) muốn thực hiện thao tác hoặc truy vấn
dữ liệu liên quan đến một bảng nào đó thì chỉ việc include dao tương ứng và
gọi hàm trong dao đó để thực hiện
Việc tách thành các phần riêng biết giúp quản lý dự án tốt hơn, dễ bảo trì nâng
cấp hơn và đặc biệt là khả năng tái sử dụng rất cao, nghĩa là một đoạn mã
được viết một lần nhưng được sử dụng ở nhiều nơi
+ Xây dựng thư viện PDO
PDO là file php chứa các hàm tiện ích chúng hỗ trợ thao tác và truy vấn dữ liệu,
nó sẽ được sử dụng trong các DAO sau này
Trang 23Tổ chức thư viện Tạo file pdo.php với tổ chức mã như sau
* Thực thi câu lệnh sql thao tác dữ liệu (INSERT, UPDATE, DELETE)
* @param string $sql câu lệnh sql
* @param array $args mảng giá trị cung cấp cho các tham số của $sql
* @throws PDOException lỗi thực thi câu lệnh
*/
function pdo_execute($sql){…}
/**
* Thực thi câu lệnh sql truy vấn dữ liệu (SELECT)
* @param string $sql câu lệnh sql
* @param array $args mảng giá trị cung cấp cho các tham số của $sql
* @return array mảng các bản ghi
* @throws PDOException lỗi thực thi câu lệnh
*/
function pdo_query($sql){…}
/**
* Thực thi câu lệnh sql truy vấn một bản ghi
* @param string $sql câu lệnh sql
* @param array $args mảng giá trị cung cấp cho các tham số của $sql
Trang 24* @return array mảng chứa bản ghi
* @throws PDOException lỗi thực thi câu lệnh
*/
function pdo_query_one($sql){…}
/**
* Thực thi câu lệnh sql truy vấn một giá trị
* @param string $sql câu lệnh sql
* @param array $args mảng giá trị cung cấp cho các tham số của $sql
* @return giá trị
* @throws PDOException lỗi thực thi câu lệnh
*/
function pdo_query_value($sql){…}
Trang 25+ Xây dựng các lớp DAO
DAO (Data Access Object) là các file php chứa các hàm hỗ trợ làm việc với
các bảng trong CSDL Vì vậy các thao tác hay truy vấn liên quan đến bảng nào
sẽ được định nghĩa trong file dao của bảng đó
Trong hoi_an_street_foods có 4 bảng nên chúng ta tổ chức thành 4 file dao
khác nhau đồng thời có file thống kê chứa các truy vấn tổng hợp thống kê
Image 12 Mỗi file DAO tối thiểu chứa các hàm thao tác và truy vấn sau
_insert(): thêm mới
_update(): cập nhật
_delete(): xóa
_select_all(): truy vấn tất cả
_select_by_id(): truy vấn theo mã
_exist(): kiểm tra tồn tại
Trang 262 VIẾT MÃ TẠO CSDL
- Tổ chức website
Hãy tổ chức dự án của bạn có cấu trúc thư mục như sau
Trong đó:
Index.php: là trang bắt đầu
Global.php: là thư viện chứa các hàm hỗ trợ dùng chung cho cả website
Content: là thư mục chứa hình, js, css, fonts
Dao: là thư mục chứa các DAO
Admin: chứa php thực hiện các chức năng quản trị
Site: chứa các php dành cho khách hàng
- Thư viện tiện ích Global.php
Global.php chứa các biến toàn cục và các hàng hỗ trợ dùng chung cho tất cả
các php trong website
- Mô hình tổ chức giao diện
Sau khi đã xây dựng xong các DAO và global.php việc các lại là viết mã php
cho 2 phần là admin và site Mã trong 2 phần này được tổ chức theo mô hình
sau
Trang 27Image 13 Theo mô hình tổ chức này thì tất cả các yêu cầu từ người dùng được chuyển
đến Controller (file php điều khiển) Controller sẽ thực hiện chức năng nghiệp
vụ được yêu cầu sau đó chia sẽ dữ liệu và chuyển sang layout Trong số dữ liệu
chia sẽ có biến $VIEW_NAME (trang giao diện php) chứa đường dẫn trang
php sinh giao diện Layout dựa vào biến này để include giao diện tương ứng
vào đúng vị trí đã dành sãn trong layout
Trên mô hình chúng ta còn nhìn thấy global.php và dao/xyz.php là 2 file php
cần được include vào Controller Trong đó:
Global.php: chứa các biến toàn cục và các hàng dùng chung cho tất cả
các php trong website
Dao/xyz.php: là các dao cần thiết để Controller làm việc với CSDL
- Xây dựng admin
Trang 28Tổ chức thư mục của phần admin
Layout.php là template dùng chung cho các giao diện của phần admin
Memu-admin.php là các liên kết dẫn đên các trang quản lý trong admin menu này sẽ được nhúng vào layout.php của phần admin
Mỗi thư mục chứa php xử lý và giao diện quản lý của mỗi chức năng tương ứng
Tổ chức layout và menu
Tổ chức layout.phpTrong layout.php này có include 2 php là menu-admin.php
và một php chứa nội dung do biến $VIEW_NAME chỉ định
Trang 31data-toggle="modal" data-target="#myModal" style="cursor: pointer;">
<i class="fas fa-user-circle
Trang 32Tất cả các liên kết điều gọi đến các trang index.php trong các thư mục tương
ứng của admin ngoại trừ liên kết trang chủ gọi đến index.php trong thư mục
trang-chinh của phần site (dành cho khách hàng)
Trang chủ của phần admin
Do trong thư mục trang-chinh có chứa index.php nên khi gọi url đến thư mục này thì index.php sẽ chạy
Cuối cùng index.php đặt biến
$VIEW_NAME=”home.php” và include layout.php nên layout.php sẽ chạy và include home.php vào layout.php
Như vậy index.php là controller còn home.php là view
Trang 33Trong trang này có sử dụng css, nhưng mã nguồn trình bày ở trên thì đã lược
bỏ để đơn giản trong việc đọc mã Bạn có thể design giao diện tùy thích
Quản lý loại món ăn
Tổ chức các file php quản lý loại món ăn như hình sau
Tổ chức
Index.php là controller
New.php là giao diện thêm mới
Edit.php là giao diện cập nhật
List.php là giao diện liệt kê
Tổ chức thư mục và Mô hình hoạt động: tương tự khach-hang
Sự khác biệt lớn nhất ở bài này so với khach-hang là có phần mã xử lý phân
trang và select-box đó là đổ danh mục loại món ăn vào select-box và chọn loại
món ăn khi edit một mặt hàng
Tổng hợp và quản lý bình luận
Tổ chức thư mục