Ứng dụng bán hàng cơ bản phát triển bằng WinForms (.NET Framework 4.7.2), tuân theo mô hình 3 lớp:
GUI (WinForms) – BUS (Business Logic) – DAL (Entity Framework 6).
| Thành phần | Mô tả |
|---|---|
| GUI | Giao diện WinForms (TMDT) |
| BUS | Xử lý nghiệp vụ (TMDT.BUS) |
| DAL | Truy cập dữ liệu với Entity Framework 6 (TMDT.DAL) |
| DbContext | Model1 |
| Database | SQL Server |
| Framework | .NET Framework 4.7.2 |
TMDT.sln
│
├── TMDT/ # Giao diện WinForms (Login, Register, User/*, Admin/*)
├── TMDT.BUS/ # Lớp nghiệp vụ (CustomerBUS, ProductBUS, CartBUS, …)
├── TMDT.DAL/ # Entity classes, DbContext, EF Migrations
└── Database/
└── tmdtdatabase.sql # Script tạo cơ sở dữ liệu và dữ liệu mẫu
- Sử dụng Entity Framework 6 Code-First với
DbContextlàModel1. - Mỗi bảng là một entity:
Product,ProductImage,Category,Customer,OrderTbl,OrderItem,Payment,Review,Shipment,Coupon,Inventory,Address,ProductVariant, v.v. - Migrations: quản lý thay đổi schema. Ví dụ:
AddIsAdminToCustomerthêm cộtIsAdminchoCustomer,SeedAdmintạo tài khoản admin mẫu. - Kết nối CSDL cấu hình trong
App.configcủa từng project (TMDT,TMDT.BUS,TMDT.DAL).
Vai trò: DAL chỉ chịu trách nhiệm ánh xạ CSDL ↔ đối tượng C#, không chứa logic nghiệp vụ UI.
- Đóng gói logic sử dụng DAL để phục vụ GUI.
- Các lớp tiêu biểu:
ProductBUS: đọc danh sách sản phẩm, lọc theo danh mục, lấy ảnh từProductImages.CartBUS: thêm/xóa/cập nhật số lượng sản phẩm trong giỏ; tính tổng tiền (có thể áp dụng coupon demo).CustomerBUS: đăng ký/đăng nhập, cập nhật thông tin người dùng.OrderBUS: tạoOrderTblvàOrderItemkhi checkout, cập nhật trạng thái.PaymentBUS: sinh dữ liệu QR, tạo bản ghi thanh toán, xác nhận thanh toán.
Vai trò: BUS là nơi kiểm soát quy tắc nghiệp vụ, xác thực dữ liệu đầu vào cơ bản, điều phối gọi DAL. GUI chỉ gọi BUS, không truy cập DB trực tiếp.
- WinForms ở project
TMDT, gồm các form theo bối cảnh:login/*,Use/*(người dùng),Admin/*(quản trị). - Một số form chính:
login/Login: xác thực, đặtSession.CurrentCustomer.Use/UserMain: hiển thị danh mục/sản phẩm bằng grid card; gọiProductBUSđể lấy dữ liệu.Use/CartForm,Use/CheckoutForm: thao tác giỏ hàng, tạo đơn (gọiOrderBUS).Use/QRCodePaymentForm: hiển thị QR để thanh toán (gọiPaymentBUS).Use/OrderHistoryForm: liệt kê đơn hàng của người dùng.Admin/*: quản lý sản phẩm, khách hàng, đơn hàng, thống kê.
Vai trò: GUI tập trung render giao diện, bắt sự kiện click, nhập liệu. Toàn bộ dữ liệu lấy/ghi thông qua các lớp BUS.
- Đăng nhập:
Login→ xác thực quaCustomerBUS→ lưuSession.CurrentCustomer→ điều hướng Admin/User. - Xem sản phẩm:
UserMain.LoadProductsGrid()→ gọiProductBUS.GetAllProducts()hoặcGetProductsByCategory()→ render card (ảnh từProductImages). - Giỏ hàng:
CartFormgọiCartBUSđể thêm/xóa/cập nhật, tính tổng. - Thanh toán:
CheckoutFormgọiOrderBUStạoOrderTbl/OrderItem→ mởQRCodePaymentFormnếu chọn QR.
- SQL Server (Express hoặc Developer)
- Visual Studio 2019 / 2022
- .NET Framework 4.7.2 Developer Pack
Cách 1 – Sử dụng script SQL
-- Mở Database/tmdtdatabase.sql trong SSMS và Execute toàn bộ
ALTER TABLE Customer ADD IsAdmin BIT NOT NULL DEFAULT(0);
-- Thêm tài khoản admin
INSERT INTO Customer (UserName, Password, Email, FullName, Phone, IsAdmin)
VALUES (N'admin', 'admin123', N'admin@shop.com', N'Quản trị hệ thống', N'0900000000', 1);Cách 2 – Entity Framework Migrations
# Trong Package Manager Console
# Chọn "TMDT.DAL" làm Default Project
Update-DatabaseChạy ứng dụng
- Mở
TMDT.sln - Build Solution → Start (chọn project
TMDTlàm startup)
| Loại | Tên đăng nhập | Mật khẩu |
|---|---|---|
| Admin | admin |
admin123 |
| User | user1 … user20 |
Theo script SQL |
Lưu ý: Tài khoản admin cần có
IsAdmin = 1trong bảngCustomer.
-
Đăng ký / Đăng nhập
-
Nhập thông tin: tên đăng nhập, mật khẩu, email, họ tên, điện thoại, địa chỉ
-
Tự động tạo địa chỉ mặc định sau đăng ký
-
Phân quyền đăng nhập:
- Admin →
AdminMain - User →
UserMain
- Admin →
-
-
Trang chủ: hiển thị danh sách sản phẩm (ảnh từ URL)
-
Chi tiết sản phẩm: xem thông tin, chọn số lượng, thêm vào giỏ hàng
-
Giỏ hàng: xem danh sách sản phẩm, áp dụng mã giảm giá (demo), thanh toán
-
Thanh toán: xác nhận thông tin, tạo đơn hàng, hiển thị trong
OrderHistoryForm -
Thanh toán QR: tạo mã QR cho đơn vừa tạo, xác nhận qua form QR
-
Lịch sử đơn hàng: xem chi tiết và trạng thái đơn
-
Tài khoản: xem và chỉnh sửa họ tên, số điện thoại
- Giao diện chính:
AdminMainForm(menu trái, các tab dữ liệu) - Quản lý sản phẩm: thêm, sửa, xóa, chọn danh mục
- Quản lý khách hàng: cập nhật nhanh thông tin, xóa hoặc làm mới danh sách
- Quản lý đơn hàng: xem chi tiết, cập nhật trạng thái, xóa đơn
- Thống kê: hiển thị tổng quan số lượng và doanh thu (dạng đơn giản)
-
Mặc định tải từ URL trong
ProductImage.Url -
Nếu muốn chạy offline:
-
Tạo thư mục
TMDT/Images/ -
Thêm ảnh vào thư mục
-
Đặt thuộc tính
Copy to Output Directory = Copy if newer -
Thay code tải ảnh:
Image.FromFile(Path.Combine(Application.StartupPath, "Images", "xxx.jpg"));
-
Cung cấp phương thức thanh toán bằng cách hiển thị mã QR để người dùng quét qua ứng dụng ngân hàng/ ví điện tử.
- GUI:
Use/QRCodePaymentForm - BUS:
PaymentBUSvới các hàm chính:GenerateQRData(orderId, totalAmount): sinh chuỗi dữ liệu làm nội dung QR (ví dụ: chứa thông tin đơn, số tiền, định dạng tuân theo chuẩn nội bộ).CreateQRPayment(orderId, totalAmount): tạo bản ghi/phiên thanh toán QR trong DB để theo dõi.ConfirmPayment(orderId): xác nhận thanh toán thành công (cập nhật trạng thái đơn/payments).
- Thư viện:
QRCoderđể render ảnh QR từ chuỗi dữ liệu.
- Tại
CheckoutForm, sau khi tạo đơn (OrderBUS), nếu chọn phương thức QR → mởnew QRCodePaymentForm(orderId, totalAmount). QRCodePaymentForm:- Gọi
PaymentBUS.GenerateQRData()để lấy chuỗi QR. - Dùng
QRCodertạo bitmap và hiển thị trênpictureBoxQR. - Gọi
PaymentBUS.CreateQRPayment()ghi nhận phiên thanh toán trong DB.
- Gọi
- Người dùng quét QR, thực hiện thanh toán trong app ngân hàng.
- Bấm nút “Đã thanh toán” trên form:
- Gọi
PaymentBUS.ConfirmPayment(orderId). - Nếu thành công → thông báo và đóng form (đơn ở trạng thái đã thanh toán).
- Gọi
- Nút “Hủy”: đóng form, không xác nhận thanh toán (đơn giữ trạng thái trước đó).