PyQt6
: Thư viện xây dựng giao diện đồ họa (GUI) cho ứng dụng Python (PyQt6 là phiên bản mới nhất của PyQt)hashlib
: Thư viện mã hóa mật khẩusqlite3
: Thư viện kết nối và thao tác với database SQLite3datetime
: Thư viện xử lý thời giansys
và os
: Thư viện xử lý các tác vụ liên quan đến hệ thống và hệ điều hànhshutil
: Thư viện xử lý các tác vụ liên quan đến file và thư mụcMở Terminal và chạy lệnh sau:
Mở Terminal và chạy lệnh sau:
Dưới đây là mô hình cơ sở dữ liệu của chương trình, gồm 4 bảng: NhanVien
, SanPham
, DonHang
và ChiTietDonHang
.
Mô tả các bảng:
NhanVien
: Lưu thông tin của nhân viên gồm các trường: id
, ten_nv
, dia_chi
, sdt
, email
, vai_tro
, ten_dang_nhap
, mat_khau
, quyen_han
lần lượt là mã định danh, tên nhân viên, địa chỉ, số điện thoại, email, vai trò (nhân viên, quản lý, chủ cửa hàng,…), tên đăng nhập, mật khẩu và quyền hạn trên ứng dụng (phân hệ quản trị viên và người dùng bình thuường).SanPham
: Lưu thông tin của sản phẩm gồm các trường: id
, ten_sp
, so_luong
, don_gia
, hinh_anh
, mo_ta
lần lượt là mã định danh, tên sản phẩm, số lượng, đơn giá, hình ảnh và mô tả sản phẩm.DonHang
: Lưu thông tin của đơn hàng gồm các trường: id
, nguoi_mua
, sdt_nguoi_mua
, dia_chi_giao_hang
, tong_tien
, trang_thai
, created_at
lần lượt là mã định danh, tên người mua, số điện thoại người mua, địa chỉ giao hàng, tổng tiền, trạng thái đơn hàng, thời gian tạo đơn. Ở đây trạng thái có 4 giá trị: Chờ xác nhận
, Đang giao
, Đã giao
, Đã hủy
.ChiTietDonHang
: Lưu thông tin chi tiết của đơn hàng gồm các trường: id
, id_don_hang
, id_san_pham
, so_luong
, don_gia
lần lượt là mã định danh, mã đơn hàng, mã sản phẩm, số lượng sản phẩm, đơn giá sản phẩm.main.py
: Chương trình sẽ chạy từ file này, chứa cấu hình và khởi tạo ứng dụng.db
: Thư mục chứa file db.py
để kết nối và thao tác với cơ sở dữ liệu.models
: Thư mục chứa các file *.py
để định nghĩa các lớp tương ứng với các bảng trong cơ sở dữ liệu.products
: Thư mục chứa tài nguyên ảnh cho sản phẩm.resources
: Thư mục chứa các file tài nguyên như icon, ảnh xuất hiện trong giao diện.states
: Thư mục chứa các file *.py
để định nghĩa các trạng thái của các đối tượng trong ứng dụng. Hiện tại có file UserState.py
định nghĩa trạng thái của người dùng đã đăng nhập (là thông tin đăng nhập của người dùng đó trong xuyên suốt ứng dụng).utils
: Thư mục chứa các file *.py
để định nghĩa các hàm tiện ích.dialogs
: Chứa các giao diện dạng dialog cho ứng dụng. Chia làm các thư mục con tương ứng với các màn hình cụ thể như login
(màn hình đăng nhập), main
(màn hình chính), products
(màn hình quản lý sản phẩm), orders
(màn hình quản lý đơn hàng), employees
(màn hình quản lý nhân viên).shop.db
: Tập tin CSDL SQLite3.Dưới đây ta sẽ trình bày cấu trúc các file mã nguồn trong chương trình. Tuy nhiên vì một số xử lý phức tạp, ta sẽ vắn tắt trình bày một số phần quan trọng. Đầy đủ mã nguồn có thể xem tại các file mã nguồn trong các thư mục tương ứng như đã trình bày phía trên.
Các lớp mô tả dữ liệu được định nghĩa trong thư mục models
, mỗi file *.py
tương ứng với một bảng trong cơ sở dữ liệu. Mỗi lớp mô tả dữ liệu sẽ có các phương thức để thao tác với dữ liệu trong bảng đó. Ví dụ với lớp DonHang
, ta sẽ có một số phương thức với các tính năng như sau:
Các lớp mô tả giao diện được định nghĩa trong thư mục dialogs
, mỗi file *.py
tương ứng với một màn hình cụ thể trong ứng dụng. Mỗi lớp mô tả giao diện sẽ có các phương thức để hiển thị và xử lý sự kiện của giao diện đó. Ví dụ với lớp LoginDialog
, ta sẽ có một số phương thức với các tính năng như sau:
Các hàm tiện ích được định nghĩa trong thư mục utils
, mỗi file *.py
tương ứng với một chức năng cụ thể trong ứng dụng. Các hàm tiện ích này sẽ giúp cho việc xử lý dữ liệu và giao diện trở nên dễ dàng hơn. Ví dụ với hàm hash_password
để mã hóa mật khẩu (mã hoá md5 bằng thư viện hashlib
):
Các trạng thái của ứng dụng được định nghĩa trong thư mục states
, mỗi file *.py
tương ứng với một trạng thái cụ thể của ứng dụng. Hiện tại có file UserState.py
định nghĩa trạng thái của người dùng đã đăng nhập (là thông tin đăng nhập của người dùng đó trong xuyên suốt ứng dụng):
Đây là một singleton để lưu trữ thông tin người dùng đã đăng nhập, giúp cho việc truy cập thông tin người dùng dễ dàng hơn.
Các hàm xử lý kết nối và thao tác với cơ sở dữ liệu được định nghĩa trong file db.py
trong thư mục db
. Các hàm này sẽ giúp cho việc kết nối và thao tác với cơ sở dữ liệu trở nên dễ dàng hơn. Ví dụ với hàm create_db
để tạo cơ sở dữ liệu và bảng trong cơ sở dữ liệu, lớp DbConnection
để kết nối và thao tác với cơ sở dữ liệu:
Thử với thông tin đăng nhập sai: nhận thông báo đăng nhập thất bại
Thử với thông tin đăng nhập đúng: chuyển đến màn hình chính
Bấm vào nút "Sản phẩm" tại màn hình chính, màn hình xem danh sách sản phẩm sẽ hiện ra, ta có thể tìm kiếm, lọc và di chuyển giữa các trang.
Để thêm sản phẩm mới, ta chọn vào màn hình "Sản phẩm", lựa chọn nút thêm mới (dấu cộng màu trắng nền xanh ở góc dưới bên phải của màn hình xem danh sách). Sau đó điền các thông tin.
Trong màn hình danh sách sản phẩm, ta lựa chọn một sản phẩm bất kỳ và tiến hành sửa thông tin hoặc xoá hẳn sản phẩm.
Bấm vào nút "Nhân viên" tại màn hình chính, màn hình xem danh sách nhân viên sẽ hiện ra, ta có thể tìm kiếm, lọc và di chuyển giữa các trang.
Để thêm nhân viên mới, ta chọn vào màn hình "Nhân viên", lựa chọn nút thêm mới (dấu cộng màu trắng nền xanh ở góc dưới bên phải của màn hình xem danh sách). Sau đó điền các thông tin.
Trong màn hình danh sách nhân viên, ta lựa chọn một nhân viên bất kỳ và tiến hành sửa thông tin hoặc xoá hẳn nhân viên, ngoài ra mật khẩu cho tài khoản nhân viên cũng có thể được cài lại ở đây.
Bấm vào nút "Đơn hàng" tại màn hình chính, màn hình xem danh sách sản phẩm sẽ hiện ra, ta có thể tìm kiếm, lọc và di chuyển giữa các trang. Mỗi đơn hàng có một trạng thái thể hiện thông qua icon nằm bên phải thông tin: có 4 loại trạng thái (đang chờ xử lý - icon đồng hồ màu vàng, đang vận chuyển - xe tải màu xanh lá, đã giao hàng - dấu tích màu xanh, đã huỷ - dấu X màu đỏ).
Để thêm đơn hàng mới, ta chọn vào màn hình "Đơn hàng", lựa chọn nút thêm mới (dấu cộng màu trắng nền xanh ở góc dưới bên phải của màn hình xem danh sách). Sau đó điền các thông tin.
Trong màn hình danh sách đơn hàng, ta lựa chọn một đơn hàng bất kỳ và tiến hành sửa thông tin, điều chỉnh số lượng hoặc chuyển sang trạng thái kế tiếp cho đơn hàng.
Ngoài ra, tại giao diện chính ứng dụng còn hỗ trợ thống kê số lượng và doanh thu các đơn hàng thành công cho cửa hàng:
Hoặc nếu muốn đăng xuất tài khoản hiện tại, ta chọn vào nút đỏ ở góc dưới bên trái màn hình và xác nhận đăng xuất, giao diện đăng nhập sẽ hiện ra trở lại: