Quên mật khẩu Lưu trữ Admin lấy lại thông tin tài khoản bằng email cá nhân đã dùng để đăng ký tài khoản.. Quên mật khẩu Lưu trữ Quản lý lấy lại thông tin tài khoản bằng email cá nhân đ
Trang 1BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
CƠ SỞ TẠI THÀNH PHỐ HỒ CHÍ MINH
BÁO CÁO ĐỒ ÁN MÔN: LẬP TRÌNH WEB
ĐỀ TÀI: WEB QUẢN LÝ QUÁN CAFE HIGHLANDSGiảng viên hướng dẫn: NGUYỄN TRUNG HIẾU
Trang 22 Sử dụng
- Spring MVC, MSSQL
- Hibernate, Validation, Upload File, Interceptor, Email
- HTML, CSS, Bootstrap và một vài thư viện được thiết kế sẵn
STT Công việc Loại Quy định/ Công thức liên quan
1 Đăng nhập Tra cứu Tài khoản bắt buộc tồn tại trong cơ sở dữ
liệu.
Điền đầy đủ và đúng tên đăng nhập và mật khẩu.
Quyền phân theo tài khoản truy cập.
2 Quên mật khẩu Lưu trữ Admin lấy lại thông tin tài khoản bằng email
cá nhân đã dùng để đăng ký tài khoản.
3 Quản lý tài
khoản
Lưu trữ Thêm, sửa tài khoản Khi xóa tài khoản cũng
phải xóa đi thông tin nhân viên và chỉ xóa khi nhân viên chưa thực hiện chức năng gì Khi nhân viên không còn làm ở quán nữa thì admin sẽ tiến hành khóa tài khoản nhân viên (trạng thái - Phải xác định rõ quyền hạn và email, số điện thoại cá nhân của nhân viên ngay lúc đăng ký thông tin Phải xác định rõ quyền hạn và email, số điện thoại cá nhân của nhân viên ngay lúc đăng ký thông tin.
Nếu nhân viên bị khóa tài khoản đồng nghĩa
là mất hết quyền hạn, người quản lý phải được thông báo về sự thay đổi trước khi xác
Trang 3nhận thay đổi – 1).
4 Xem, tra cứu
danh sách tài
khoản
Tra cứu Xem danh sách tài khoản Có thể tra cứu dựa
theo tên đăng nhập.
5 Quản lý bảng
quyền
Lưu trữ Thêm, xóa, sửa quyền Chỉ xóa khi quyền đó
chưa được gán cho tài khoản nào.
6 Xem bảng
quyền
Tra cứu Xem danh sách bảng quyền.
- Nhóm quản lý:
STT Công việc Loại Quy định/ Công thức liên quan
1 Đăng nhập Tra cứu Tài khoản bắt buộc tồn tại trong cơ sở dữ
liệu.
Điền đầy đủ và đúng tên đăng nhập và mật khẩu.
Quyền phân theo tài khoản truy cập.
2 Quên mật khẩu Lưu trữ Quản lý lấy lại thông tin tài khoản bằng
email cá nhân đã dùng để đăng ký tài khoản.
3 Thay đổi thông
tin cá nhân
Lưu trữ Được sửa mật khẩu, thêm/ sửa email 2 và số
điện thoại 2 Mật khẩu chỉ được đổi khi nhập đúng mật khẩu cũ.
Trang 44 Quản lý nhân
viên
Lưu trữ Thêm, xóa, sửa thông tin nhân viên Chỉ xóa
chỉ khi nhân viên chưa thực hiện chức năng gì.
5 Xem, tra cứu
danh sách nhân
viên
Tra cứu Quản lý được xem thông tin của tất cả nhân
viên Tìm kiếm dựa theo mã nhân viên, tên nhân viên.
6 Quản lý sản
phẩm, loại sản
phẩm
Lưu trữ Thêm, xóa, sửa sản phẩm Sản phẩm bắt
buộc phải thuộc loại sản phẩm nào đó Nếu
là loại mới thì phải tạo loại sản phẩm mới
Có thể sửa, xóa loại nếu chưa gán với sản phẩm nào Xóa sản phẩm khi chưa được sử dụng.
7 Quản lý size Lưu trữ Thêm, xóa, sửa size Xóa khi chưa được sử
Tra cứu Hiển thị thông tin sản phẩm ở giao diện bán
hàng phải có đủ 3 thông tin tối thiểu: tên sản phẩm, mã sản phẩm, giá.
Tra cứu công thức theo một phần nội dung công thức.
Trang 5Lưu trữ Thêm, xóa khuyến mãi.
Không cho phép áp dụng chung các chương trình khuyến mãi khác nhau tại 1 thời điểm Ghi rõ thời gian bắt đầu và thời gian kết thúc đợt khuyến mãi, không chồng thời gian lên các đợt khuyến mãi khác.
Phần trăm khuyến mãi từ 0 - 100%
12 Xem, tra cứu
danh sách
khuyến mãi
Tra cứu Xem danh sách khuyến mãi.
Tra cứu thông tin các đợt khuyến mãi theo thời gian.
13 Nhập hàng Lưu trữ Chỉ lập phiếu nhập hàng khi nhận hàng thành
công và lưu trữ biên nhận hàng để đối chiếu sau này
Trang 614 Quản lý nguyên
liệu
Lưu trữ Quản lý có thể thêm, xóa, sửa nguyên liệu
Nguyên liệu chỉ xóa khi chưa được nhập lần nào Vào cuối mỗi ngày thì sẽ có vài nhân viên phụ trách kiểm kê lại nguyên liệu và thông báo để quản lý sửa số lượng tồn Số lượng tồn sẽ tự động cộng khi nhập hàng và trừ khi bán hàng.
15 Xem, tra cứu
Hóa đơn được tạo trong lúc khách order, hân viên kiểm tra và xác nhận khách hàng đã thanh toán trước khi lưu hóa đơn.
Hóa đơn đã thanh toán không đổi trả Hóa đơn có tối thiểu các thông tin sau: tên cửa hàng, thời gian tạo hóa đơn, mã nhân viên lập, sản phẩm cùng số lượng và đơn giá tương ứng, tổng tiền, mã khuyến mãi, tổng tiền khách cần trả sau khuyến mãi.
Công thức tính tổng số tiền mà khách phải trả= tổng các (số lượng)*(đơn giá hiện thời)*(phần trăm giảm giá nếu có khuyến mãi) của sản phẩm.
Tiền thối = tiền khách trả - tổng tiền.
17 Quản lý hóa đơn Lưu trữ Cho phép hủy đơn Đơn chỉ được hủy khi:
khách hàng chưa thanh toán nhưng nhân viên
đã lưu lại hóa đơn … hoặc những trường hợp bất khả kháng khác
Trang 718 Xem danh sách
hóa đơn/ chi tiết
hóa đơn
Tra cứu Hiển thị tất cả hóa đơn theo thời gian (thời
gian mặc định theo ngày).
19 Thống kê doanh
thu
Tính toán Doanh thu là tổng tiền thu được sau một
khoảng thời gian: hôm nay, 7 ngày, 31 ngày,
STT Công việc Loại Quy định/ Công thức liên quan
1 Đăng nhập Tra cứu Tài khoản bắt buộc tồn tại trong cơ sở dữ
liệu.
Điền đầy đủ tên đăng nhập và mật khẩu Quyền phân theo tài khoản truy cập.
2 Quên mật khẩu Lưu trữ Nhân viên lấy lại thông tin tài khoản bằng
email cá nhân đã dùng để đăng ký tài khoản.
3 Thay đổi thông
tin cá nhân
Lưu trữ Được sửa mật khẩu, thêm/ sửa email 2 và
số điện thoại 2 Mật khẩu chỉ được đổi khi nhập đúng mật khẩu cũ.
Trang 84 Xem, tra cứu
danh sách sản
phẩm, loại, công
thức
Tra cứu Hiển thị thông tin sản phẩm ở giao diện
bán hàng phải có đủ 3 thông tin tối thiểu:
tên sản phẩm, mã sản phẩm, giá.
Tra cứu sản phẩm hoặc loại sản phẩm theo tên hoặc mã Tra cứu công thức theo mã công thức.
phiếu nhập hàng khi nhận hàng thành công và lưu trữ biên nhận hàng
để đối chiếu sau này.
sách nguyên liệu
Tra cứu Xem thông tin các
nguyên liệu, tra cứu theo mã.
thanh toán (bán hàng)
Lưu trữ, tính toán Tương tự như phần
bán hàng của quản lý
- TAIKHOAN (TENDANGNHAP, MATKHAU, TRANGTHAI)
- QUYEN (MAQUYEN, TENQUYEN )
- SANPHAM (MASP, TEN , HINHANH)
- LOAISP (MALOAI, TENLOAI )
- SIZE (MASIZE, TENSIZE )
- CONGTHUC (MACT, NGAYLAP, CONGTHUC)
- LICHSU (THOIGIAN, MASP, MASIZE, GIATHAYDOI)
- KHUYENMAI (MAKM, TGBD, TGKT)
- PHIEUNHAPHANG (MANH, NGAYNHAP)
- NGUYENLIEU (MANL, TEN , DONVI, SLTON)
- HOADON (ID, NGAYLAP, TONGTIEN, PHANLOAI)
Trang 9● ERD
● Mô hình dữ liệu quan hệ
- NHANVIEN ( MANV (TENDANGNHAP) , HO, TEN, GT, NGAYSINH, DIACHI, EMAIL1, EMAIL2, SDT1, SDT2)
- QUANLY (MANVQL)
- ADMIN (MAADMIN)
- TAIKHOAN ( TENDANGNHAP (MANV) , MATKHAU, MAQUYEN ,
TRANGTHAI)
- QUYEN (MAQUYEN, TENQUYEN )
- SANPHAM (MASP, TEN , HINHANH, MALOAI )
- LOAISP (MALOAI, TENLOAI )
- SIZE (MASIZE, TENSIZE )
- CONGTHUC (MACT, NGAYLAP, CONGTHUC)
- CT_SANPHAM ( MASP, MASIZE, MACT , GIAHIENTHOI)
- LICHSU (THOIGIAN, MASP, MASIZE , GIATHAYDOI)
- KHUYENMAI (MAKM, TGBD, TGKT)
- CT_KHUYENMAI ( MASP, MASIZE, MAKM , PHANTRAM)
- PHIEUNHAPHANG (MANH, NGAYNHAP, MANV )
- CT_PHIEUNHAP ( MANH, MANL , SOLUONG, DONGIA)
- NGUYENLIEU (MANL, TEN , DONVI, SLTON)
- CT_NGUYENLIEU ( MASP, MASIZE, MANL , SOLUONG)
- HOADON (ID, NGAYLAP, TONGTIEN, PHANLOAI, MANV, MAKM )
- CT_HOADON ( ID, MASP, MASIZE , SOLUONG)
Trang 114 Thống kê doanh thu
5 Quản lý hóa đơn
Trang 12III Tính Năng
1
2
3 Lọc sản phẩm trong giao diện bán hàng
- Giúp người sử dụng lọc các mặt hàng theo loại, sử dụng các data attribute và được xử
lý ngay trên view để không phải tải lại trang nhiều lần
4 Chọn sản phẩm
- Khi nhấn vào một sản phẩm bất kỳ thì ô sản phẩm sẽ chuyển thành ô lựa chọn.
- L, M, S đại diện cho size của sản phẩm đang chọn (nếu có).
- Hai nút + và – sử dụng cho việc tăng giảm số lượng sản phẩm.
- Nhấn Add sẽ đưa sản phẩm vào khu vực chọn ở phía bên phải màn hình, trong khi đó Reset sẽ đưa số lượng và size
về giá trị mặc định ban đầu.
- Phụ thuộc vào số nguyên liệu còn lại trong kho mà sản phẩm
có thể chọn được hoặc không.
Ví dụ để pha phin đen đá cần 02 “phần cà phê 25 gram” nhưng chỉ còn lại 01 trong kho thì nút + và Add sẽ không hoạt động.
5 Giỏ hàng
- Các sản phẩm sau khi được chọn sẽ xuất hiện ở đây.
- Trong từng mặt hàng cũng ghi rõ đơn giá cũng như thành tiền
để nhân viên tiện theo dõi.
- Ngoài cùng bên phải của mỗi hàng là một check-box Nếu tích vào đó thì sản phẩm
sẽ được hủy khỏi giỏ hàng (chỉ sử dụng được một lần, không thể tích chọn lại để hoàn tác, muốn chọn lại sản phẩm vừa hủy thì sử dụng chức năng chọn sản phẩm để tạo lại).
Trang 13- “Tổng cộng” sẽ được cập nhật sau mỗi lần thêm hoặc hủy chọn một mặt hàng.
- Không thể ấn nút xác nhận nếu giỏ hàng trống!
- Sau khi ấn xác nhận sẽ hiện ra một nút “Thanh Toán” Khi hoàn tất thanh toán, dựa trên chi tiết nguyên liệu để tạo ra một sản phẩm để tự động cập nhật lại số liệu của nguyên liệu.
6 Hóa đơn và Công thức
- Sau khi nhấn thanh toán, giao diện này được hiện lên Hóa đơn ở phía bên phải còn công thức cho đơn hàng nằm ở bên trái.
- Đã thực hiện căn chỉnh để khi sử dụng Ctrl + P sẽ in ra được hóa đơn phù hợp.
- Một nửa sẽ giao cho khách hàng và một nửa được mang vào trong cho nhân viên pha chế.
- Dữ liệu được lấy từ các data attribute trong giỏ hàng, đưa lên lớp overlay để hiển thị thay vì lưu xuống CSDL và đưa lên một view khác.
Trang 147 Trạng thái hóa đơn
- Trạng thái màu xanh là bình thường còn màu xám là bị hủy.
- Dựa vào data attribute của từng đơn để xác định những hóa đơn bị thay đổi trạng thái, không lưu lại toàn bộ vào CSDL.
- Khi ấn nút xác nhận, sẽ hiện thông báo và tiến hành lưu vào CSDL.
Trang 158 Thống kê doanh thu
- Khá đơn giản và chỉ có chức năng lọc doanh thu theo các mốc thời gian.
- Dữ liệu được đưa từ controller lên view và xử lý bằng JS để không tải lại trang nhiều lần.
- Doanh thu thống kê dựa vào các hóa đơn có trạng thái là bình thường.
- Mục top 5 sẽ hiển thị các sản phẩm chạy nhất trong khoảng thời gian được chọn.
IV Giải thích code
1 Đăng nhập
Phần view sử dụng Tệp “dangnhap.jps” định dạng UTF-8 Để chứa giao diện người dùng cho trang đăng nhập vào hệ thống Highlands Dưới đây là mô tả ngắn gọn về các thànhphần và chức năng chính của mã:
- Trong thẻ head, có các thẻ meta để thiết lập các thông tin meta của trang, các thẻ link
để liên kết đến các tệp CSS và thẻ title để đặt ti êu đề của trang
- Trong thẻ body, có một div chứa nội dung chính của trang đăng nhập Giao diện được chia thành hai phần: một phần hiển thị hình nền và một phần chứa biểu mẫu đăng nhập
- Biểu mẫu đăng nhập có hai trường nhập liệu: tên đăng nhập và mật khẩu Dữ liệu được gửi đến đường dẫn "/login/logininfo.htm" bằng phương thức POST khi người dùng nhấp vào nút "ĐĂNG NHẬP"
- Dưới biểu mẫu, có hai thẻ p5 để hiển thị thông báo thành công và thông báo lỗi, được truyền từ phía server thông qua các thuộc tính "message1" và "message0"
Trang 16- Cuối cùng, có các tệp JavaScript được liên kết để cung cấp các chức năng tương tác
và tạo hiệu ứng cho trang
Tệp “TaiKhoan.java” là một lớp Java được chú thích bằng @Entity, đây là một lớp tham gia vào quá trình ánh xạ đối tượng-cơ sở dữ liệu.Lớp TaiKhoan có các thuộc tính và phương thức sau:
- Thuộc tính "TENDANGNHAP": Đây là một chuỗi (String) đại diện cho tên đăng nhập của tài khoản Nó có chú thích @Id, xác định rằng đây là khóa chính của bảng Cột tương ứng trong cơ sở dữ liệu có kiểu dữ liệu "nvarchar(10)"
- Thuộc tính "MATKHAU": Đây là một chuỗi (String) đại diện cho mật khẩu của tài khoản Giá trị của thuộc tính này sẽ được lưu trữ trong cột "MATKHAU" trong cơ sở dữ liệu
- Thuộc tính "TRANGTHAI": Đây là một biến kiểu boolean đại diện cho trạng thái của tài khoản (hoạt động hay không hoạt động) Nó có chú thích @Column, chỉ định tên cột
là "TRANGTHAI" trong cơ sở dữ liệu Thuộc tính này được đánh dấu là public, nghĩa là nó
có thể truy cập trực tiếp từ bên ngoài lớp
- Thuộc tính "nhanvien": Đây là một đối tượng kiểu NhanVien Mối quan hệ giữa lớp TaiKhoan và NhanVien là một-đến-một (One-to-One) Điều này được chỉ định bằng chú thích @OneToOne và @JoinColumn Thuộc tính "TENDANGNHAP" của bảng TaiKhoan tương ứng với cột "MANV" (Mã nhân viên) của bảng NhanVien trong cơ sở dữ liệu
- Thuộc tính "quyen": Đây là một đối tượng kiểu Quyen (lớp khác trong chương trình) Mối quan hệ giữa lớp TaiKhoan và Quyen là nhiều-đến-một (Many-to-One) Điều này được chỉ định bằng chú thích @ManyToOne và @JoinColumn Thuộc tính
"MAQUYEN" của bảng TaiKhoan tương ứng với cột "MAQUYEN" (Mã quyền) của bảng Quyen trong cơ sở dữ liệu
- Phương thức getter và setter cho các thuộc tính trên
Đoạn mã định nghĩa một lớp đại diện cho bảng "TAIKHOAN" trong cơ sở dữ liệu và cung cấp các phương thức để truy cập và cập nhật dữ liệu của bảng này thông qua các đối tượng TaiKhoan
Tệp “LoginController.java” Đoạn mã này định nghĩa một lớp Java được chú thích bằng @Controller Đoạn mã xử lý các yêu cầu liên quan đến đăng nhập và quên mật khẩu trong ứng dụng
- Thuộc tính "manv": Đây là một biến static kiểu String, được sử dụng để lưu trữ mã nhân viên đăng nhập
- Thuộc tính "mailer": Đây là một đối tượng được tự động kết hợp (injected) bằng
@Autowired từ lớp Mailer Đối tượng này được sử dụng để gửi email trong quá trình đặt lại mật khẩu
Trang 17- Thuộc tính "factory": Đây là một đối tượng SessionFactory được tự động kết hợp (injected) bằng @Autowired SessionFactory được sử dụng để tạo và quản lý các phiên (session) với cơ sở dữ liệu.
- Phương thức "forget": Xử lý yêu cầu trang quên mật khẩu Trả về tên view
"Authority/forget" để hiển thị giao diện cho người dùng
- Phương thức "login": Xử lý yêu cầu đăng nhập Lấy thông tin người dùng từ request (username và password), kiểm tra xem thông tin đăng nhập có hợp lệ không Nếu hợp lệ, đăng nhập thành công và chuyển hướng người dùng đến các trang tương ứng với vai trò của tài khoản Nếu không hợp lệ, hiển thị thông báo lỗi và chuyển hướng người dùng đến trang đăng nhập
- Phương thức "logout": Xử lý yêu cầu đăng xuất Xóa thông tin đăng nhập của người dùng và chuyển hướng đến trang đăng nhập
- Phương thức "taoMatKhau": Tạo một mật khẩu ngẫu nhiên
- Phương thức "reset": Xử lý yêu cầu đặt lại mật khẩu Lấy thông tin email và tên đăngnhập từ request Kiểm tra xem email và tên đăng nhập có khớp với dữ liệu trong cơ sở dữ liệu không Nếu khớp, tạo một mật khẩu mới, cập nhật mật khẩu trong cơ sở dữ liệu và gửi email chứa mật khẩu mới đến người dùng Nếu không khớp, hiển thị thông báo lỗi.Đoạn mã định nghĩa một điều khiển (controller) để xử lý các yêu cầu liên quan đến đăng nhập và quên mật khẩu trong ứng dụng web
Tệp “QUYEN.java” định nghĩa một entity class trong Java, đại diện cho bảng
"QUYEN" trong cơ sở dữ liệu Dưới đây là mô tả ngắn gọn về các thành phần và chức năng chính của mã:
- Đối tượng `Quyen` được đánh dấu bằng annotation `@Entity`, cho biết đây là một entity class
- Annotation `@Table(name = "QUYEN")` được sử dụng để xác định tên của bảng trong cơ sở dữ liệu mà entity này tương ứng
- Thuộc tính `MaQuyen` được đánh dấu bằng annotation `@Id`, cho biết đây là khóa chính của entity
- Annotation `@Column(name = "MAQUYEN")` được sử dụng để xác định tên cột tương ứng với thuộc tính `MaQuyen`
- Thuộc tính `TENQUYEN` được đánh dấu bằng annotation `@Column(name =
"TENQUYEN")`, cho biết đây là một cột trong bảng "QUYEN"
- Mối quan hệ giữa entity `Quyen` và `TaiKhoan` được thiết lập bằng cách sử dụng annotation `@OneToMany` Mỗi đối tượng `Quyen` có một tập hợp các đối tượng
`TaiKhoan` liên quan thông qua trường `taikhoan` Mối quan hệ này được xác định qua thuộc tính `quyen` trong entity `TaiKhoan`
Trang 18- Thuộc tính `taikhoan` được đánh dấu bằng annotation `@OneToMany` và
`@JoinColumn`, xác định tên trường liên kết với mối quan hệ và cách fetch dữ liệu từ cơ sở
Đoạn mã định nghĩa entity class `Quyen`, mô tả cấu trúc và quan hệ của bảng
"QUYEN" trong cơ sở dữ liệu và cung cấp các phương thức để thao tác với dữ liệu của entity này
2 Quản lý tài khoản
Phần view và phần package entity đều khá giống nhau nên trong báo cáo này sẽ khôngtiếp tục nói rõ, chỉ phân tích các package Controller
Tệp “AccountController.java” là tệp cấu hình của quản lý tài khoản bao gồm các chức năng thêm xóa sửa tài khoản, nhân viên
1 Phương thức `LayDanhSachTaiKhoan()` lấy danh sách tất cả các tài khoản từ cơ sở
dữ liệu bằng cách sử dụng Hibernate Nó tạo một truy vấn HQL (Hibernate Query
Language) và trả về kết quả dưới dạng một danh sách `List<TaiKhoan>`
2 Phương thức `taoMatKhau()` tạo một mật khẩu ngẫu nhiên Nó sử dụng một đối tượng `Random` để tạo một số ngẫu nhiên trong khoảng từ 100000 đến 999999, sau đó chuyển số đó thành một chuỗi và trả về
3 Phương thức `getQuyen()` được chú thích bằng `@ModelAttribute("aus")` Nó lấy danh sách các quyền (loại tài khoản) từ cơ sở dữ liệu bằng cách sử dụng Hibernate và trả về kết quả dưới dạng một danh sách `List<Quyen>` Giá trị của danh sách này được thêm vào model với tên thuộc tính là `"aus"`
4 Phương thức `getTrangThai()` được chú thích bằng
`@ModelAttribute("trangthai")` Nó lấy danh sách trạng thái (status) của tài khoản từ cơ sở
dữ liệu bằng cách sử dụng Hibernate và trả về kết quả dưới dạng một danh sách
`List<TaiKhoan>` Giá trị của danh sách này được thêm vào model với tên thuộc tính là
`"trangthai"`
5 Phương thức `dstaikhoan(ModelMap model)` được chú thích bằng
`@RequestMapping("list")` Phương thức này xử lý yêu cầu hiển thị danh sách tài khoản Nóthêm các thuộc tính vào model, bao gồm `"btnStatus"` với giá trị `"btnAdd"`, `"tk"` với một