Tải bản đầy đủ (.docx) (45 trang)

Đồ án CNTT Xây dựng website bán sách

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.18 MB, 45 trang )

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HỒ CHÍ MINH
KHOA ĐÀO TẠO CHẤT LƯỢNG CAO


ĐỒ ÁN CÔNG NGHỆ THÔNG TIN

XÂY DỰNG WEBSITE BÁN SÁCH
SỬ DỤNG FRAMEWORK DJANGO

GVHD: Trần Công Tú
SVTH: Hà Nhật Vềnh 20110599
Mã lớp học: PROJ215879_22_1_05CLC

Thành phố Hồ Chí Minh, Tháng 12 năm 2022
TRƯỜNG ĐH SƯ PHẠM KỸ THUẬT TP. HCM

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM

KHOA ĐÀO TẠO CHẤT LƯỢNG CAO

Độc lập – Tự do – Hạnh Phúc

***

ĐIỂM SỐ


TIÊU CHÍ

NỘI DUNG



TRÌNH BÀY

TỔNG

ĐIỂM

NHẬN XÉT CỦA GIÁO VIÊN:
………………………………………………………………………………………
………………………………………………………………………………………
………………………………………………………………………………………
………
………………………………………………………………………………………

………………………………………………………………………………………
………………………………………………………………………………………
……
TP. Hồ Chí Minh, ngày …, tháng 12, năm 2022
Giáo viên chấm điểm

2


MỤC LỤC

DANH MỤC HÌNH ẢNH

DANH MỤC BẢNG BIỂU

DANH MỤC CÁC TỪ VIẾT TẮT






KH: khách hàng
TK: tài khoản
SP: sản phẩm
tt: thơng tin

3


NỘI DUNG
Chương 1: Giới thiệu
1.1. Lý do chọn đề tài:
Ông Nguyễn Ngọc Dũng, Chủ tịch Hiệp hội TMĐT Việt Nam (Vecom)
nhận xét, Covid-19 như một cú hích đẩy nhanh quá trình tăng trưởng của
thương mại điện tử: “Từ khi dịch bùng phát, nhu cầu mua sắm qua sàn
thương mại điện tử tăng mạnh. Đến nay, đã có hơn 70% dân số Việt Nam tiếp
cận mạng Internet, trong đó, gần 50% người dùng Việt Nam đã mua sắm
online,....” (theo baodautu.vn).[1]

Đây là lý do em chọn đề tài “xây dựng website bán sách online”
Đáp ứng được những nhu cầu mua sắm, em sẽ thiết kế một website thương
mại điện tử nhằm phục vụ việc mua sắm online. Và để thiết kế một website
nhanh chóng và hiệu quả thì sử dụng Framework Django là một trong những lựa
chọn hàng đầu.

4



2.2. Khảo sát thị trường
Một số khảo sát về sở thích đọc sách:

Khảo sát 1: Độ tuổi trả lời khảo sát

Khảo sát 2: Thể loại (khảo sát)

5


Khảo sát 3: Hình thức thanh tốn (khảo sát)

2.3. Tìm hiểu các website bán hàng [2]
Qua quá trình tìm hiểu một số website bán hàng online, em tổng kết được
những chức năng quan trọng mà một website bán hàng cần có:
• Thiết kế giao diện đẹp, dễ nhìn được các sản phẩm (thích hợp với điện
thoại)
• Cơng cụ tiện ích (như là lọc, tìm kiếm sản phẩm)
• Hình thức thanh toán đa dạng như: Thanh toán trực tuyến, thanh toán khi
nhận hàng, được kiểm tra hàng trước khi thanh tốn,…
• Liên kết, quảng cáo bán hàng đến các mạng xã hội (facebook, google,…)
• Tính năng cho khách hàng (xem đơn hàng, đánh giá sản phẩm)

6


Chương 2: Cơng việc cần làm
Từ những tìm hiểu về website bán hàng và một số khảo sát cho thấy để thiết kết

được website có các chức năng cần thiết phải làm những công việc cụ thể sau:
Bảng 1: [Công việc]Cơng việc cần làm
Cơng việc

Tìm hiểu
cơ sở lý
thuyết

Chi tiết/ mục đích
- Ngơn ngữ lập trình: python, HTML, CSS,
JavaScript.

Hồn thành
100%

- Framework Django
 Mục đích: đây là cơ sở lý thuyết cần có để có thể
thực hiện thiết kế website
Các thực thể:

100%

- Người dùng (User): khách hàng, quản trị (admin)
- Sản phẩm (Product_book)
Thiết kế
CSDL

- Tác giả (Author)
- Hóa đơn (Invoice): trong hóa đơn sẽ có nhiều
order

- Order: chứa số lượng đặt của một khách hàng
(được sử dụng như order Item)
 Nhằm lưu trữ các dữ liệu của website

Thiết kế Gồm các giao diện chính:
giao diện,
• Trang chủ (show sản phẩm, thanh điều
chức năng
hướng)
• Giỏ hàng (chứa sản phẩm khách hàng đã đặt)
• Đặt hàng (tổng quan lại đơn hàng để KH
thanh toán)

100%

Một số giao diện khác:
• Tài khoản (cho phép khách sửa thơng tin TK)
• Xem đơn hàng (liệt kê các thơng tin đơn hàng
mà khách hàng đã đặt trước đó)
• Giao diện đăng nhập, đăng ký TK

7


 Giao diện để người dùng tương tác với website
Bảng 2: [Công việc]Các chức năng ở mỗi giao diện
Giao diện

Chức năng


Hoàn thành

Thanh điều hướng (navigation bar)

100%

Hiện thị tt sản phẩm (cả lúc KH chưa đăng
nhập)

100%

Lọc sản phẩm (theo danh mục, theo từ khóa)

100%

Thêm nhanh sản phẩm vào giỏ hàng

100%

Xem chi tiết một sản phẩm (tác giả, đánh giá,
thêm một lượng sản phẩm vào giỏ hàng)

100%

Liệt kê các sản phẩm đã được thêm vào giỏ

100%

Có nút cập nhật (tăng, giảm, xóa) số lượng


100%

Xem tổng số lượng, tổng giá

100%

Liệt kê lại các sản phẩm đã order

100%

Thanh toán

Cho phép nhập địa chỉ nhận hàng (mặc định địa
chỉ của KH)

100%

Tài khoản

Chỉnh sửa lại thông tin khách hàng

100%

Liệt kê tt các đơn hàng khách đã đặt

100%

Có thể để lại bình luận ở mỗi sản phẩm đã mua

100%


Đăng nhập

Có thể đăng nhập bằng tài khoản Google

100%

Đăng ký

Đăng ký bằng cách nhập thông tin hợp lệ

Trang chủ

Giỏ hàng

Xem đơn hàng

__

Hiện thị thông báo cho các tác vụ người dùng

100%

8


Chương 3: Cơ sở lý thuyết
3.1. Cơ sở dữ liệu quan hệ là gì?[3]
Cơ sở dữ liệu quan hệ (tiếng Anh: relational database) là một cơ sở dữ liệu
(phổ biến nhất là kỹ thuật số) dựa trên mơ hình quan hệ dữ liệu, theo đề xuất

của Edgar F. Codd vào năm 1970. Một hệ thống phần mềm sử dụng để duy trì
cơ sở dữ liệu quan hệ là một hệ quản trị cơ sở dữ liệu quan hệ (RDBMS). Nhiều
hệ thống cơ sở dữ liệu quan hệ có tùy chọn sử dụng SQL (Ngơn ngữ truy vấn có
cấu trúc) tiêu chuẩn để truy vấn và duy trì cơ sở dữ liệu.
3.2. MySQL là gì? [4]
MySQL là một hệ thống quản trị cơ
sở dữ liệu mã nguồn mở (Relational
Database Management System, viết tắt là
RDBMS) hoạt động theo mơ hình clientserver. Là một phần mềm hay dịch vụ
dùng để tạo và quản lý các cơ sở dữ liệu
(Database) theo hình thức quản lý các mối liên hệ giữa chúng.
3.2.1. Mơ hình client-server

Một hoặc nhiều thiết bị (máy khách) kết nối với máy chủ thơng qua một
mạng cụ thể. Mọi máy khách có thể đưa ra yêu cầu từ giao diện người dùng trên
màn hình của họ và máy chủ sẽ tạo ra kết quả mong muốn, miễn là cả hai đầu

9


đều hiểu hướng dẫn. Các quy trình chính diễn ra trong mơi trường MySQL đều
giống nhau, đó là:
• MySQL tạo cơ sở dữ liệu để lưu trữ và thao tác dữ liệu, xác định mối
quan hệ của từng bảng.
• Client có thể đưa ra yêu cầu bằng cách nhập các câu lệnh SQL cụ thể trên
MySQL.
• Server application sẽ phản hồi với thơng tin được u cầu và nó sẽ xuất
hiện ở phía máy khách.
Ở phía Client, sẽ để ý đến MySQL GUI (Giao diện đồ họa người dùng) sử
dụng. GUI càng nhẹ và thân thiện với người dùng, các hoạt động quản lý dữ

liệu của họ sẽ nhanh hơn và dễ dàng hơn. Một số MySQL GUI phổ biến nhất
là , SequelPro, DBVisualizer và Công cụ quản trị Navicat DB…
3.2.2. Ưu điểm và nhược điểm của MySQL
6.2.1. Ưu điểm
- An tồn: Vì MySQL sở hữu nhiều tính năng bảo mật cấp cao, mã hóa thơng tin
đăng nhập và chứng thực từ host đều khả dụng.
- Dễ sử dụng: MySQL ổn định và dễ sử dụng trên nhiều hệ điều hành và cung cấp
một hệ thống các hàm tiện ích lớn.
- Khả năng mở rộng: Với MySQL có thể xử lý rất nhiều dữ liệu và hơn thế nữa có
thể mở rộng khi cần thiết.
- Hiệu năng cao: Hỗ trợ nhiều chức năng SQL được mong chờ từ một hệ quản trị
cơ sở dữ liệu quan hệ (RDBMS).
6.2.2. Nhược điểm
- Giới hạn: Nó vẫn bị hạn chế về một số chức năng cần thiết.
- Dung lượng hạn chế: Nếu só bản khi càng lớn thì việc truy xuất dữ liệu sẽ phức
tạp và khó khăn hơn. Bạn cần phải áp dụng nhiều thủ thuật để nâng cấp tốc độ
truy xuất dữ liệu lên.
3.3. Python và Django
3.3.1 Python là gì?
Python là một ngơn ngữ lập trình được sử dụng rộng rãi trong các ứng
dụng web, phát triển phần mềm, khoa học dữ liệu và máy học (ML). Các nhà
phát triển sử dụng Python vì nó hiệu quả, dễ học và có thể chạy trên nhiều nền
tảng khác nhau. Phần mềm Python được tải xuống miễn phí, tích hợp tốt với tất

10


cả các loại hệ thống và tăng tốc độ phát
triển.
3.3.2. Những lợi ích của Python

[5]

- Các nhà phát triển có thể dễ dàng đọc và
hiểu một phần trình Python vì ngơn ngữ này có cú pháp cơ bản giống tiếng Anh.
- Python giúp cải thiện năng suất làm việc của các nhà phát triển vì so với những
ngơn ngữ khác, họ có thể sử dụng ít dịng mã hơn để viết một phần trình
Python.
- Python có một thư viện tiêu chuẩn lớn, chứa nhiều dịng mã có thể tái sử dụng
cho hầu hết mọi tác vụ. Nhờ đó, các nhà phát triển sẽ không cần phải viết mã từ
đầu.
- Các nhà phát triển có thể dễ dàng sử dụng Python với các ngơn ngữ lập trình
phổ biến khác như Java, C và C++.
- Cộng đồng Python tích cực hoạt động bao gồm hàng triệu nhà phát triển nhiệt
tình hỗ trợ trên toàn thế giới. Nếu gặp phải vấn đề, bạn sẽ có thể nhận được sự
hỗ trợ nhanh chóng từ cộng đồng.
- Trên Internet có rất nhiều tài nguyên hữu ích nếu bạn muốn học Python. Ví dụ:
bạn có thể dễ dàng tìm thấy video, chỉ dẫn, tài liệu và hướng dẫn dành cho nhà
phát triển.
- Python có thể được sử dụng trên nhiều hệ điều hành máy tính khác nhau, chẳng
hạn như Windows, macOS, Linux và Unix.
3.3.3. Django là gì? [6]
Django là 1 web framework khá nổi tiếng được viết hồn tồn bằng ngơn
ngữ Python. Nó là 1 framework với đầu đủ các thư viện, module hỗ trợ các
web-developer. Django sử dụng mơ hình MVC và được phát triển bởi Django
Software Foundation (DSF một tổ chức phi lợi nhuận độc lập) Mục tiêu chính
của Django là đơn giản hóa việc tạo các website phức tạp có sử dụng cơ sở dữ
liệu. Django tập trung vào tính năng “có thể tái sử dụng” và “có thể tự chạy”
của các component, tính năng phát triển nhanh, khơng làm lại những gì đã làm.
Một số website phổ biến được xây dựng từ Django là Pinterest, Instagram,
Mozilla, và Bitbucket.


11


Giới thiệu mơ hình MVC
Mơ hình MVC đã được phát triển trong thời gian rất dài, và nó càng phát
triển mạnh hơn nữa trong thời đại Internet, khi mà các ứng dụng Web ngày càng
phổ biến. Internet chính là một nơi lý tưởng để triển khai mơ hình client-server.
• Model (M) là mơ phỏng của dữ liệu. Nó khơng thực sự là dữ liệu, nhưng nó là
một thể hiện của dữ liệu và là nơi để chúng ta thao tác với dữ liệu thật sự.
• View (V) là những gì người dùng nhìn thấy. Nó là sự thể hiện của dữ liệu đối
với người dùng. Nói một cách văn hoa, nó là sự thể hiện của Model.
• Controller (C) dùng để điều khiển luồng thông tin dữ Model và View. Nó được
sử dụng để cài đặt các login về việc lấy dữ liệu từ DB thông qua Model và
chuyển sang View. Nó cũng là nơi xử lý những truy vấn từ người dùng thông
qua View và thực hiện các logic khác: thay đổi View, cập nhật dữ liệu thông qua
Model.
Cấu trúc của một Django project
- Để tạo một project Django cần mở Command Prompt (cmd) lên, chuyển đến thư
mục mà bạn muốn tạo, sau đó gõ đoạn lệnh django-andmin startproject mục>. Khi đặt tên project tránh đặt những tên trùng với các từ khóa có sẵn trong
Python như sys, os, django…. để tránh bị xung đột.
- Ví dụ tạo project tên testproj, thư mục được tạo ra có cấu trúc:

12


- Trong đó:
- testproj/: ngồi cùng là root directory chứa project.
- manage.py: đây là 1 command-line utility cho phép mình thao tác với

project theo nhiều cách hiện hành của mình.
- testproj/: bên trong là gói các package Python sẽ sử dụng cho project:
- testproj/__init__.py: là 1 file rỗng chỉ định việc cái đường dẫn này sẽ
được xem như là 1 Python package.
- testproj/settings.py: Settings/configuration cho project Django
- testproj/urls.py: khai báo URL cho project
- testproj/wsgi.py: entry-point cho tích hợp web server WSGI

Một số lệnh trong manage.py

Bảng 3: Một số lệnh cơ bản trong manage.py

TT

Lệnh

Mục đích

1

django-admin startproject <Tên Project> Tạo ra thư mục chứa
django project

2

py manage.py startapp <app_name>

Tạo ra thư mục, nơi để tạo
ra những trang web nằm
trong toàn bộ hệ thống

website.

3

py manage.py runserver

Chạy server

4

py manage.py makemigrations
<app_name>

Khi chỉnh sửa trong models
và cần cập nhật lại CSDL.

py manage.py migrate

3.4. HTML, CSS, JavaScript là gì? [7]
HTML là viết tắt của cụm từ Hypertext Markup Language (tạm dịch là
Ngôn ngữ đánh dấu siêu văn bản). HTML được sử dụng để tạo và cấu trúc các
thành phần trong trang web hoặc ứng dụng, phân chia các đoạn văn, heading,
titles, blockquotes… và HTML không phải là ngôn ngữ lập trình.

13


CSS là chữ viết tắt của Cascading Style Sheets, nó là một ngơn ngữ
được sử dụng để tìm và định dạng lại các phần tử được tạo ra bởi các ngơn ngữ
đánh dấu (HTML). Nói ngắn gọn hơn là ngơn ngữ tạo phong cách cho trang

web. Nếu HTML đóng vai trò định dạng các phần tử trên website như việc tạo
ra các đoạn văn bản, các tiêu đề, bảng,…thì CSS sẽ giúp chúng ta có thể thêm
style vào các phần tử HTML đó như đổi bố cục, màu sắc trang, đổi màu chữ,
font chữ, thay đổi cấu trúc…
JavaScript là ngôn ngữ lập trình website phổ biến hiện nay, nó được
tích hợp và nhúng vào HTML giúp website trở nên sống động hơn. JavaScript
đóng vai trị như là một phần của trang web, thực thi cho phép Client-side script
từ phía người dùng cũng như phía máy chủ (Nodejs) tạo ra các trang web động.
Đây là 3 ngơn ngữ chính trong lập trình web và có mối liên hệ lẫn nhau
để xây dựng một website sống động, chuyên nghiệp:
• HTML: Hỗ trợ trong việc xây dựng layout, thêm nội dung dễ dàng trên
website.
• CSS: Hỗ trợ việc định dạng thiết kế, bố cục, style, màu sắc,…
• JavaScript: Tạo nên những nội dung “động” trên website.

14


Chương 4: Thiết kế
4.1. Thiết kế CSDL
4.1.1. Mơ hình ERD: Từ những chức năng chính

Hình 1: Mơ hình ERD website bán sách bằng framework django

4.1.2. Mô tả các trường của CSDL
Bảng 4: Bảng mô tả các thực thể

T
T


Thực thể

1

Product

Các thuộc tính

Ghi chú

pID

Mã sản phẩm, để xác định sản 1
sản phẩm duy nhất

Book_name (varchar(100))

Tên sản phẩm (sách)

catID – FK (int)

Khóa ngoại tham chiếu đến bảng
Category

15


Book_img (varchar)

Chứa vị trí hình của sản phẩm


Book_price (int)

Giá của sản phẩm

Book_description (longtext) Mô tả của sản phẩm
2

Author

3
Category

4

OrderItem

5

Invoice

auID (int)

Mã tác giả, xác định duy nhất

Au_name (varchar(50))

Tên tác giả

catID (int)


Mã loại sách

Cat_name (varchar(50))

Tên loại sách (tham khảo, giáo
trình,…)

oID (int)

Mã Order

pID – FK (int)

Khóa ngoại tham chiếu đến
product

iID – FK (int)

Khóa ngoại tham chiếu đến
invoice

Quantity (smallint)

Số lượng đặt

Comment (varchar(254))

Bình luận của khách hàng về sản
phẩm


iID (int)

Mã hóa đơn

cusID - FK

Khóa ngoại tham chiếu đến bảng
khách hàng

Date (date)

Ngày hóa đơn được tạo ra

date_checkout (date)

Ngày khách hàng bấm đặt hàng

Place_status (boolean)

Kiểm tra xem đơn hàng đã đc
đặt chưa (mặc định là False

Ship_addr (varchar(150))

Địa chỉ đặt hàng (mặc định theo
địa chỉ KH)

16



4.1.3. Cơng thức tính tốn trong models
Bảng 5: Một số phương thức xử lí

TT Nội dung
1

def get_total(self):
total = self.pID.book_price *
self.quantity
return total

Vị trí

Mục đích

store/models.p
y

Tính tổng giá
của một order.

dịng 132

Vd: order 2
cuốn sách 50k
Kết quả trả về:
100k

2


def get_total_item(self):
orders = self.order_set.all()
total = sum([i.quantity for i in
orders])

store/models.p
y
dịng 109

return total

Tính tổng số
lượng sản
phẩm của đơn
hàng
Vd: 2 cuốn A,
1 cuốn B
Trả về: 3

3

def get_total_price(self):
orders = self.order_set.all()
total = sum([i.get_total for i in
orders])
return total

store/models.p
y

dịng 115

Tính tổng giá
tiền của đơn
hàng (tính tổng
lại của hàm
get_total)
Vd: 2 cuốn A
50k, 1 cuốn B
20k
Trả về: 120k

17


4.1.4. Sơ đồ luồng dữ liệu (data flow diagram - DFD)

4.2. Thiết kế giao diện
TT

Giao diện

1

Base.html

Đường dẫn

Mục đích
Để các template khác tái sử dụng (gồm có

header, và block content sẽ đưa dữ liệu vào
base)
Header sẽ có các đường dẫn:
• Home (logo) để quay về trang chủ
• Tài khoản
o Đăng nhập
o Đăng xuất
o Xêm đơn hàng đã đặt
• Thanh lọc sản phẩm
• Giỏ hàng

2

Index.html

/

• Thêm sản phẩm vào giỏ hàng
• Xem chi tiết sản phẩm

(Trang chủ)
3

Cart.html

Show các sản phẩm của cửa hàng

/cart

Show các sản phẩm mà khách hàng đã thêm


18


(Giỏ hàng)
4

Checkout.htm
l

vào giỏ, có nút “Thanh tốn” để chuyển
sang giao diện đặt hàng.
/checkout

Giao diện đặt hàng cho phép khách nhập địa
chỉ nhận hàng và xem lại tồn bộ sản phẩm
có trong giỏ hàng.

/login

Giao diện đăng nhập gồm: username - pass

/register

Giao diện đăng ký: Kế thừa lớp forms trong
django để cho phép khách hàng đăng ký.

(Đặt hàng)
5


Login|
Register

Có nút đăng nhập bằng google
Bảng 6: Bảng thiết kế giao diện

19


4.2.1. base.html
Vị trí: \store\templates\layouts\base.html
<!doctype html>
<html lang="vi">
{% load static %}
<head>
{% block title %}<title>HOME PAGE</title>{% endblock %}
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS v5.2.1 -->
integrity="sha384-iYQeCzEYFbKjA/T2uDLTpkwGzCiq6soy8tYaI1GyVh/UjpbCx/TYkiZhlZB6+fzT"
crossorigin="anonymous">
<script src=" crossorigin="anonymous"></script>
<link rel="stylesheet" href=" /><link rel="stylesheet" href="{% static 'css/mystyle.css' %}">
</head>
<body style="padding-top: 120px">
<!-- ========== Start Header ========== -->
{% include 'includes/header.html' %}
<!-- ========== End Header ========== -->

{% include 'includes/message.html' %}
<!-- ========== Start Main ========== -->
{% block content %} {% endblock content %}
<!-- ========== End Main ========== -->
<footer>
</footer>
<!-- Bootstrap JavaScript Libraries -->
<script src=" />integrity="sha384-oBqDVmMz9ATKxIep9tiCxS/Z9fNfEXiDAYTujMAeBAsjFuCZSmKbSSUnQlmh/jp3"
crossorigin="anonymous">
</script>
<script src=" />integrity="sha384-7VPbUDkoPSGFnVtYi0QogXtr74QeVeeIs99Qfg5YCF+TidwNdjvaKZX19NZ/e6oz"
crossorigin="anonymous">
</script>
<script type="text/javascript" src="{% static 'js/cart.js' %}"></script>
<script type="text/javascript">
var user = '{{request.user}}'
function getToken(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}

20



}
}
return cookieValue;
}
const csrftoken = getToken('csrftoken');
</script>
</body>
</html>

4.2.2. cart.html
{% extends 'layouts/base.html' %} {% load static %} {% load humanize %}
{% block content %}
<div class="row">
<div class="col-lg-12">
<div class="box-element">
<a class="btn btn-outline-dark" href="{% url 'store:home' %}">←Quay
lại</a>




<table class="table">
<tr>
<th>
Số lượng: <strong>{{invoice.get_total_item}}</strong>

</th>
<th>
Tổng cộng: <strong>{{invoice.get_total_price|
intcomma}}đ</strong>


</th>
<th>
Đặt hàng</a>
</th>
</tr>
</table>
</div>


<div class="box-element">
<div class="cart-row">
<div style="flex: 2"></div>
<div style="flex: 2"><strong>Sản phẩm</strong></div>
<div style="flex: 1"><strong>Giá</strong></div>
<div style="flex: 1"><strong>Số lượng</strong></div>
<div style="flex: 1"><strong>Tổng cộng</strong></div>
<div style="flex: 1"><strong>Xóa</strong></div>

21


</div>
{% for i in orders %}
<div class="cart-row">
<div style="flex: 2">
<img class="row-image" src="{{i.pID.book_img.url}}" />
</div>
<div style="flex: 2">

{{i.pID.book_name}}

</div>
<div style="flex: 1">

{{i.pID.book_price}}

</div>

<div style="flex: 1">

{{i.quantity}}


<div class="quantity">


</div>
</div>
<div style="flex: 1">

{{i.get_total}}

</div>
<div style="flex: 1">
</a>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endblock content %}

4.2.3. checkout.html
{% extends 'layouts/base.html' %} {% load static %} {% load humanize %}
{% block content %}
<div class="row">
>← Quay về giỏ hàng>
{% if user.username %} {% if orders %}
<div class="col-lg-6">

<div class="container box-element">
<form action="{% url 'store:checkout_submit' %}" method="POST">
{% csrf_token %}

Thông tin giao nhận


<div class="mb-3 mt-3">

22


<label for="ship_addr" class="form-label">Địa chỉ nhận hàng:</label>
id="ship_addr"
name="ship_addr"
value="{{invoice.cusID.cus_addr}}"
type="text"
class="form-control"
placeholder="Nhập địa chỉ nhận hàng"
/>
</div>
<input type="hidden" name="iID" value="{{invoice.iID}}" />
<button type="submit" class="btn btn-primary">Đặt hàng</button>
</form>
</div>
</div>
{% else %}
<div class="col-lg-6">
<div class="alert alert-danger" role="alert">
Giỏ hàng của bạn đang trống
<a href="{% url 'store:home' %}" class="alert-link">quay lại</a> để mua
hàng!

</div>
</div>
{% endif %}
<div class="col-lg-6">
<div class="box-element">

Số lượng sản phẩm: <strong>{{invoice.get_total_item}}</strong>


Tổng cộng: <strong>{{invoice.get_total_price|intcomma}}đ</strong>


<div class="cart-row">
<div style="flex: 2"><img class="row-image" src="" /></div>
<div style="flex: 2">

Tên sách


</div>
<div style="flex: 1">

Giá


</div>
<div style="flex: 1">

Số lượng


</div>
</div>
{% for i in orders %}
<div class="cart-row">
<div style="flex: 2">
<img class="row-image" src="{{ i.pID.book_img.url}}" />
</div>

23


<div style="flex: 2">

{{i.pID.book_name}}



</div>
<div style="flex: 1">

{{i.pID.book_price|intcomma}}đ


</div>
<div style="flex: 1">

{{i.quantity}}


</div>
</div>
{% endfor %}
</div>
</div>

{% else %}
<div class="alert alert-danger" role="alert">
Bạn cần
<a href="{% url 'store:login' %}" class="alert-link">đăng nhập</a> hoặc
<a href="{% url 'store:register' %}" class="alert-link">đăng ký</a> để mua
hàng!
</div>
{% endif %}

</div>
{% endblock content %}

4.2.4. edit_profile.html
{% extends 'layouts/base.html' %}
{% block title %}<title>EDIT ACCOUNT</title>{% endblock %}


{% block content %}
<div class="container" style="width:500px">
<form action="{% url 'store:edit_profile' %}" method="post">
{% csrf_token %}
<div class="mb-3">
<label for="cus_name" class="form-label">username</label>
id="cus_name" placeholder="Họ tên" value="{{user.username}}">
<label for="user_email" class="form-label">Email</label>

24


id="user_email" placeholder="Nhập email của bạn" value="{{user.email}}">
</div>
<div class="mb-3">
<label for="cus_name" class="form-label">Họ tên</label>
placeholder="Họ tên" value="{{cus.cus_name}}">
</div>
<div class="mb-3">
<label for="cus_addr" class="form-label">Địa chỉ</label>
placeholder="Địa chỉ" value="{{cus.cus_addr}}">
</div>
<div class="mb-3">
<label for="cus_phone" class="form-label">Số điện thoại</label>
placeholder="Số điện thoại" value="{{cus.cus_phone}}">

</div>

<button type="submit" class="btn btn-primary rounded">Sửa thông
tin</button>
</form>
</div>
{% endblock content %}

Chương 5: Cài đặt và Kiểm thử
5.1. Cài đặt models trong django project để ánh xạ đến CSDL
Vị trí: store\models.py
from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
class Category(models.Model):
catID = models.AutoField(primary_key=True)
cat_name = models.CharField(max_length=50)
def __str__(self):
return self.cat_name

25


×