Biểu đồ Use Case và mô tả Chức năng Quản lý thông tin cầu thủ có các giao diện tương tác với quản lý: Đăng nhập -> đề xuất UC đăng nhập Danh sách cầu thủ -> đề xuất UC xem danh sách
Biểu đồ Use Case và mô tả
Chức năng Quản lý thông tin cầu thủ có các giao diện tương tác với quản lý:
Đăng nhập -> đề xuất UC đăng nhập
Danh sách cầu thủ -> đề xuất UC xem danh sách cầu thủ
Tìm kiếm cầu thủ -> đề xuất UC tìm kiếm cầu thủ
Thông tin chi tiết cầu thủ -> đề xuất UC xem thông tin chi tiết cầu thủ
Đăng nhập, xem danh sách cầu thủ là bắt buộc mới hoàn thành được việc quản lý thông tin, do đó UC đăng kí include các UC này.
Đề xuất các use case Thêm, sửa, xóa, tìm kiếm thông tin cầu thủ, do không bắt buộc nên nó được extend từ UC.
Trong đó, các use case
Xem danh sách cầu thủ: UC cho phép quản lý xem toàn bộ danh sách thông tin của các cầu thủ trong giải đấu
Thêm, sửa, xóa, tìm kiếm: Các UC cho phép quản lý thực hiện việc thêm mới, sửa, xóa, tìm kiếm thông tin 1 cầu thủ
Kịch bản chuẩn
Use case Quản lý thông tin cầu thủ
Người quản lý đã có tài khoản, trang quản lý đang mở
Người quản lý hoàn thành quá trình sửa thông tin cầu thủ
1 Quản lý A đăng nhập tài khoản admin với tên tài khoản: admin, mật khẩu 1234, chọn login button ở trang login A muốn xem, thêm, sửa hoặc xóa thông tin cầu thủ
2 Trang giao diện dành cho admin xuất hiện với chức năng quản lý thông tin cầu thủ
3 A chọn chức năng quản lý thông tin cầu thủ
4 Giao diện hiển thị danh sách cầu thủ bao gồm
- thông tin chi tiết về các cầu thủ: tên, đội bóng, vị trí, ngày tháng năm sinh, đi kèm với nút submit sửa/xóa
- danh sách tất cả các cầu thủ đã được đăng ký
STT Mã Tên CT Tên đội bóng
Vị trí Ngày tháng năm sinh
- chức năng tìm kiếm, thêm cầu thủ
5 A chọn tính năng chỉnh sửa
6 Hệ thống hiển thị giao diện chỉnh sửa cầu thủ
STT Mã Tên CT Tên đội bóng
Vị trí Ngày tháng năm sinh
7 A tiến hành chỉnh sửa thông tin cầu thủ được chọn, giao diện mới:
STT Mã Tên CT Tên đội bóng
Văn C Sài Gòn Tiền vệ 11/11/1991
9 Thông báo cập nhật thành công
11 Hệ thống trả lại giao diện hiển thị danh sách cầu thủ
Biểu đồ lớp thực thể cho pha phân tích
Biểu đồ gồm các lớp:
ThanhVien: gồm tên đăng nhập, mật khẩu, email, họ tên, số điện thoại
QuanLy: gồm năm bắt đầu quản lý, tên giải đấu quản lý và các thuộc tính kế thừa từ bảng ThanhVien
HuanLuyenVien: số năm kinh nghiệm, quốc tịch, thành tích và các thuộc tính kế thừa từ bảng ThanhVien
DoiBong: gồm tên, ngày thành lập, tên sân nhà
CauThu: tên, ngày tháng năm sinh, vị trí
Xác định quan hệ giữa các lớp:
QuanLy và HuanLuyenVien sẽ kế thừa từ lớp ThanhVien
Lớp HuanLuyenVienDoiBong được đề xuất nhằm tạo sự kết nối giữa huấn luyện viên và đội bóng, bởi vì một đội bóng có thể có nhiều huấn luyện viên trong suốt thời gian hoạt động, và một huấn luyện viên cũng có khả năng dẫn dắt nhiều đội bóng khác nhau.
CauThu - DoiBong là một mối quan hệ quan trọng trong bóng đá, nơi mỗi cầu thủ có thể gắn bó với nhiều đội bóng trong suốt sự nghiệp của mình Đề xuất lớp CauThuDoiBong giúp kết nối rõ ràng giữa một cầu thủ và đội bóng mà họ thi đấu, từ đó tạo điều kiện thuận lợi cho việc quản lý thông tin và theo dõi sự nghiệp của cầu thủ.
Biểu đồ lớp đầy đủ cho pha phân tích
Ban đầu, giao diện đăng nhập -> đề xuất lớp GDDangNhap, cần có:
input: tên đăng nhập, mật khẩu
nút kiểu submit: đăng nhập
Bước 2, giao diện trang chủ quản lý -> đề xuất GDTrangChuQuanLy, cần có:
output: Thông tin người quản lý
nút kiểu submit: Quản lý cầu thủ
Bước 3: giao diện trang quản lý -> đề xuất GDTrangQuanLy, cần có:
output: Thông tin danh sách các cầu thủ
nút kiểu submit: thêm, sửa, xóa, quay lại Để có danh sách thông tin cầu thủ, cần xử lí dưới hệ thống:
output: danh sách các cầu thủ
đề xuất phương thức getDanhSachCauThu(), gán cho lớp CauThu
Nếu chọn thêm cầu thủ, chuyển đến giao diện thêm cầu thủ -> đề xuất TrangThemCauThu:
input: tên cầu thủ, tên đội bóng, vị trí, ngày tháng năm sinh
nút kiểu submit: Thêm, quay lại
Sau khi thêm cầu thủ, cần xử lí dưới hệ thống:
lưu cầu thủ mới đã thêm vào danh sách cầu thủ
input: thông tin cầu thủ vừa thêm
output: thành công hay không
đề xuất phương thức themCauThu() gán cho lớp CauThu
Nếu chọn chỉnh sửa cầu thủ, chuyển đến giao diện chỉnh sửa cầu thủ -> đề xuất TrangChinhSuaCauThu:
Tên cầu thủ, tên đội bóng, vị trí, ngày tháng năm sinh: vừa input vừa output
nút kiểu submit: nút lưu, quay lại
Sau khi chỉnh sửa cầu thủ, cần xử lí dưới hệ thống:
cập nhật thông tin cầu thủ mới thay thế thông tin cũ và thêm vào danh sách cầu thủ
input: thông tin cầu thủ vừa thêm
output: thành công hay không
đề xuất phương thức chinhSuaCauThu() gán cho lớp CauThu
Biểu đồ giao tiếp
1 Quản lý đăng nhập vào GDDangNhap
2 GDDangNhap gọi đến lớp ThanhVien
3 ThanhVien xử lý hàm checkDangNhap()
4 ThanhVien xử lý hàm getThongTinNguoiDung()
5 Lớp ThanhVien trả về GDDangNhap
7 GDTrangChuQuanLy hiển thị cho quản lý
8 Quản lý chọn "Quản lý thông tin cầu thủ" trong GDTrangChuQuanLy
10.GDTrangQuanLy gọi đến lớp CauThu
11.CauThu xử lý hàm getDanhSachCauThu()
13.GDTrangQuanLy hiển thị danh sách đội bóng cho quản lý
14.Quản lý chọn thêm cầu thủ trong GDTrangQuanLy
16.GDThemCauThu hiển thị cho quản lý
17.Quản lý nhập thông tin để thêm trong GDThemCauThu
18.GDThemCauThu gọi đến lớp CauThu
19.CauThu xử lý hàm themCauThu() để thêm cầu thủ mới vào CSDL 20.CauThu trả về GDThemCauThu
22.GDTrangQuanLy hiển thị cho quản lý
23.Quản lý chọn chỉnh sửa cầu thủ trong GDTrangQuanLy
25.GDChinhSuaCauThu gọi đến lớp CauThu
26.CauThu xử lý hàm getThongTinChiTietCauThu
28.GDChinhSuaCauThu hiển thị cho quản lý
29.Quản lý nhập thông tin để sửa trong GDChinhSuaCauThu
30.GDChinhSuaCauThu gọi đến lớp CauThu
31.CauThu xử lý hàm chinhSuaCauThu() để lưu cầu thủ đã sửa vào CSDL 32.CauThu trả về GDChinhSuaCauThu
34.GDTrangQuanLy hiển thị cho quản lý
Biểu đồ lớp thực thể cho pha thiết kế
Bước 1: Bổ sung thuộc tính id(mã) cho các lớp, trừ các lớp kế thừa
Bước 2: Bổ sung kiểu dữ liệu theo ngôn ngữ lập trình đã chọn cho tất cả các thuộc tính của lớp (ở đây là theo ngôn ngữ Java)
Bước 3: Chuyển các quan hệ đối tượng
Quan hệ HuanLuyenVien – DoiBong -> HuanLuyenVienDoiBong chuyển thành HuanLuyenVienDoiBong chứa HuanLuyenVien và DoiBong chứa HuanLuyenVienDoiBong
Quan hệ CauThu – DoiBong -> CauThuDoiBong chuyển thành CauThuDoiBong chứa CauThu và DoiBong chứa CauThuDoiBong
Bước 4: Bổ sung các thuộc tính thành phần của quan hệ aggregation/composition
Biểu đồ CSDL
Bước 1: Với mỗi lớp thực thể, đề xuất một bảng dữ liệu tương ứng
Bước 2: Đưa thuộc tính không phải đối tượng của lớp thực thể thành thuộc tính của bảng tương ứng
tblThanhVien có các thuộc tính: id, tenTK, matKhau, tenDayDu, email, SDT, ngaySinh
tblQuanLy có các thuộc tính: namBatDau, tenGiaiDauQuanLy
tblHuanLuyenVien có các thuộc tính: namKinhNghiem, quocTich, thanhTich
tblDoiBong có các thuộc tính: id, tenDoiBong, ngayThanhLap
tblCauThu có các thuộc tính: id, tenCauThu, ngaySinh, viTri, chieuCao, canNang
tblHuanLuyenVienDoiBong có các thuộc tính: id, ngayBatDauHD, ngayKetThucHD
tblCauThuDoiBong có các thuộc tính: id, ngayBatDauHD, ngayKetThucHD
Bước 3: Chuyến quan hệ số lượng giữa các lớp thực thể thành quan hệ số lượng giữa các bảng
Bước 4: Bổ sung các thuộc tính khóa
Khóa chính được xác định thông qua thuộc tính id của các bảng, ngoại trừ bảng tblHuanLuyenVien và tblQuanLy Hai bảng này kế thừa từ lớp ThanhVien, do đó, khóa chính của chúng sẽ là khóa chính của lớp ThanhVien.
Khóa ngoại được thiết lập cho các bảng:
1 tblHuanLuyenVien – n tblHuanLuyenVienDoiBong -> bảng tblHuanLuyenVienDoiBong có khóa ngoại tblHuanLuyenVienid
1 tblDoiBong – n tblHuanLuyenVienDoiBong -> bảng tblHuanLuyenVienDoiBong có khóa ngoại tblDoiBongid
1 tblDoiBong – n tblCauThuDoiBong -> bảng tblCauThuDoiBong có khóa ngoại tblDoiBongid
1 tblCauThu – n tblCauThuDoiBong -> bảng tblCauThuDoiBong có khóa ngoại tblCauThuid
Thiết kế giao diện và biểu đồ lớp đầy đủ cho pha thiết kế
2) Biểu đồ lớp đầy đủ cho pha phân tích
Truy cập lần đầu: gọi đến trang DangNhap.jsp
Sau khi đăng xuất: trở về trang DangNhap.jsp
Đăng nhập lỗi: gọi DangNhap.jsp?error=1
Sau khi đăng nhập thành công: chuyển đến trang TrangChuQuanLy.jsp TrangQuanLy.jsp
Call từ TrangChuQuanLy.jsp: TrangQuanLy.jsp
Chọn “Quay lại” từ TrangThemCauThu.jsp: TrangQuanLy.jsp?back=true
Chọn “Quay lại” từ TrangChinhSuaCauThu.jsp: TrangQuanLy.jsp? back=true
Chọn “Thêm” từ TrangThemCauThu.jsp: TrangQuanLy.jsp? idAddNew=true
Chọn “Lưu” từ TrangSuaCauThu.jsp: TrangQuanLy.jsp?idEditNew=x
Chọn “Không” sau khi chọn xóa cầu thủ: TrangQuanLy.jsp?back=true
Chọn “Có” sau khi chọn xóa cầu thủ: TrangQuanLy.jsp?idDelete=true TrangThemCauThu.jsp
Thêm cầu thủ thất bại: gọi TrangThemCauThu.jsp?error=1
Chỉnh sửa cầu thủ thất bại: gọi TrangChinhSuaCauThu.jsp?error=1
Biểu đồ tuần tự cho pha phân tích
1 Quản lý truy cập trang đăng nhập Tại giao diện đăng nhập, quản lý nhập tên đăng nhập và mật khẩu, sau đó chọn đăng nhập
2 Trang DangNhap.jsp gọi trang doDangNhap.jsp
3 Trang doDangNhap.jsp gọi lớp ThanhVien
5 Lớp ThanhVien trả về Trang doDangNhap.jsp
6 Trang doDangNhap.jsp gọi lớp ThanhVienDAO để kiểm tra tính hợp lệ
7 Lớp ThanhVienDAO gọi hàm checkDangNhap
8 Lớp ThanhVienDAO gọi lớp QuanLy
10.Lớp QuanLy trả về Lớp ThanhVienDAO
11.Lớp ThanhVienDAO trả về trang doDangNhap.jsp
12.Trang doDangNhap.jsp gọi lớp TrangChuQuanLy.jsp
13.TrangChuQuanLy.jsp hiển thị cho người quản lý
14.Quản lý ấn chọn chức năng Quản lý thông tin cầu thủ
15.TrangChuQuanLy.jsp gọi đến TrangQuanLy.jsp
16.TrangQuanLy.jsp gọi đến lớp CauThuDAO
17.Hàm getDanhSachCauThu được gọi để trả về danh sách thông tin các cầu thủ
18.Lớp CauThuDAO gọi đến lớp CauThu
20.Lớp CauThu trả về lớp CauThuDAO
21.Lớp CauThuDAO trả về TrangQuanLy.jsp
22.TrangQuanLy.jsp hiển thị cho người quản lý
23.Quản lý chọn cầu thủ để chỉnh sửa
24.TrangQuanLy.jsp gọi đến TrangChinhSuaCauThu.jsp
25.TrangChinhSuaCauThu.jsp gọi đến lớp CauThuDAO
26.Hàm getThongTinCauThu được gọi để trả về thông tin chi tiết của 1 cầu thủ
27.Lớp CauThuDAO gọi lớp CauThu
29.Lớp CauThu trả về lớp CauThuDAO
30.Lớp CauThuDAO trả về TrangChinhSuaCauThu.jsp
31.TrangChinhSuaCauThu.jsp hiển thị cho quản lý
32.Quản lý chỉnh sửa thông tin cầu thủ
33.TrangChinhSuaCauThu.jsp gọi doChinhSuaCauThu.jsp
35.Lớp CauThuDAO gọi hàm chinhSuaCauThu() để kiểm tra hợp lệ và lưu vào CSDL
36.Lớp CauThuDAO gọi lớp CauThu
38.Lớp CauThu trả về lớp CauThuDAO
39.Lớp CauThuDAO trả vè doLuuChinhSua.jsp
40.doLuuChinhSua.jsp trả về TrangChinhSuaCauThu.jsp 41.TrangChinhSuaCauThu.jsp trả về TrangDanhSachTranDau.jsp
42 TrangDanhSachTranDau.jsp hiển thị cho người dùng
Biểu đồ đóng gói
II/ Chức năng Đăng ký cầu thủ thi đấu
1 Biểu đồ Use Case và mô tả
Chức năng Đăng ký cầu thủ thi đấu có các giao diện tương tác với huấn luyện viên:
Đăng nhập -> UC đăng nhập
Chọn vòng đấu -> đề xuất UC chọn vòng đấu
Chọn trận đấu đăng ký -> đề xuất UC chọn trận đấu muốn đăng ký
Đăng ký cầu thủ -> đề xuất UC đăng ký cầu thủ
Đăng nhập, chọn vòng đấu, chọn trận đấu, đăng ký cầu thủ là bắt buộc nên nó được include
Đề xuất use case Tìm kiếm trận đấu, vì nó không bắt buộc nên nó được extend
Use case Đăng ký cầu thủ thi đấu
Huấn luyện viên đã có tài khoản, trang huấn luyện viên đang mở
Huấn luyện viên hoàn thành quá trình đăng ký cầu thủ
1 Huấn luyện viên A đăng nhập tài khoản user với tên tài khoản:
A, mật khẩu 1234, chọn login button ở trang login A muốn đăng ký cầu thủ cho trận đấu
2 Trang giao diện dành cho HLV xuất hiện với chức năng đăng ký cầu thủ thi đấu
3 A chọn chức năng đăng ký cầu thủ thi đấu
4 Trang chọn vòng đấu hiển thị:
thanh chọn vòng đấu (1 comboBox hiển thị danh sách các vòng đấu hợp lệ)
nút: Danh sách trận đấu
5 A chọn 1 vòng đấu từ thanh chọn và ấn nút Danh sách trận đấu
6 Giao diện hiển thị danh sách trận đấu bao gồm
- thông tin chi tiết về trận đấu: tên đội nhà, đội khách, thời gian bắt đầu, ngày bắt đầu, sân vận động
- danh sách tất cả các trận đấu
Tên đội khách Thời gian bắt đầu Thời gian bắt đầu SVD
7 A chọn 1 trận đấu và chọn chức năng đăng ký cầu thủ
8 Danh sách các cầu thủ của đội bóng hiện ra, đi kèm với trạng thái đăng ký cầu thủ
STT Mã CT Tên CT Tên đội bóng
Vị trí Ngày tháng năm sinh Đăng ký
9 A tiến hành chọn các cầu thủ (Hoàng Văn C và Nguyễn Bình D) và ấn vào tùy chọn đăng ký, giao diện mới:
STT Mã CT Tên CT Tên đội bóng
Vị trí Ngày tháng năm sinh Đăng ký
11 Thông báo đăng ký cầu thủ thành công hiện lên
13 Hệ thống trả lại giao diện hiển thị các trận đấu
3) Biểu đồ lớp thực thể cho pha phân tích
Biểu đồ gồm các lớp:
ThanhVien: gồm tên đăng nhập, mật khẩu, email, họ tên, số điện thoại
QuanLy: gồm năm bắt đầu quản lý, tên giải đấu quản lý và các thuộc tính kế thừa từ bảng ThanhVien
HuanLuyenVien: số năm kinh nghiệm, quốc tịch, thành tích và các thuộc tính kế thừa từ bảng ThanhVien
DoiBong: gồm tên, ngày thành lập, tên sân nhà
CauThu: tên, ngày tháng năm sinh, vị trí
VongDau: số thứ tự vòng đấu
TranDau: gồm tên đội nhà, tên đội khách, ngày thi đấu, nơi diễn ra Xác định quan hệ giữa các lớp:
QuanLy và HuanLuyenVien sẽ kế thừa từ lớp ThanhVien
HuanLuyenVien - DoiBong là một lớp học kết nối giữa huấn luyện viên và đội bóng, nhằm phản ánh thực tế rằng một đội bóng có thể có nhiều huấn luyện viên theo thời gian, và một huấn luyện viên cũng có thể dẫn dắt nhiều đội bóng khác nhau.
CauThu - DoiBong là một lớp kết nối giữa cầu thủ và đội bóng, nhằm phản ánh mối quan hệ giữa nhiều cầu thủ và nhiều đội bóng Điều này cho phép mỗi cầu thủ có thể thi đấu cho nhiều đội bóng trong suốt sự nghiệp của mình.
Lớp DoiBongTranDau được đề xuất nhằm kết nối giữa một đội bóng và một trận đấu, phản ánh thực tế rằng một đội bóng có thể tham gia nhiều trận đấu, trong khi mỗi trận đấu lại có sự góp mặt của nhiều đội bóng khác nhau.
TranDau - CauThuDoiBong là một lớp đề xuất kết nối giữa cầu thủ và trận đấu Trong đó, một trận đấu có thể đăng ký nhiều cầu thủ, và một cầu thủ có thể tham gia nhiều trận khác nhau Điều này giúp quản lý thông tin cầu thủ và trận đấu một cách hiệu quả.
VongDau - TranDau: 1-n Vì 1 vòng đấu có nhiều trận đấu
4) Biểu đồ lớp đầy đủ cho pha phân tích
Ban đầu, giao diện đăng nhập -> đề xuất lớp GDDangNhap, cần có:
input: tên đăng nhập, mật khẩu
nút kiểu submit: đăng nhập
Bước 2, giao diện trang chủ HLV -> đề xuất GDTrangChuHLV, cần có:
nút kiểu submit: Đăng ký cầu thủ thi đấu
Bước 3: giao diện trang chọn vòng đấu -> đề xuất GDTrangChonVongDau, cần có:
Thanh chọn vòng đấu: vừa input vừa output
Nút kiểu submit: Danh sách trận đấu Để có danh sách vòng đấu, cần xử lí dưới hệ thống:
output: danh sách vòng đấu
đề xuất phương thức getDanhSachVongDau() gán cho lớp VongDau
Bước 4: giao diện trang danh sách trận đấu -> đề xuất
output: Danh sách các trận đấu
nút kiểu submit: Đăng ký cầu thủ, quay lại, tìm kiếm Để có danh sách trận đấu, cần xử lí dưới hệ thống:
output: danh sách các trận đấu của vòng đấu
đề xuất phương thức getDanhSachTranDau() gán cho lớp TranDau Bước 5: đăng ký cầu thủ -> đề xuất GDDangKyCauThuThiDau
output: Danh sách các cầu thủ đội bóng
nút kiểu submit: Lưu, quay lại Để có danh sách cầu thủ đội bóng, cần xử lí dưới hệ thống:
output: danh sách các cầu thủ của đội
đề xuất phương thức getDanhSachCauThuDoiBong() gán cho lớp CauThuDoiBong Để hoàn thành việc lưu cầu thủ đăng ký, cần xử lí dưới hệ thống:
input: danh sách cầu thủ đội bóng + trạng thái đăng ký
output: thành công hay không
đề xuất phương thức capNhatCauThuDangKy() gán cho lớp CauThudangKyTranDau
2 GDTrangChuHLV hiển thị cho HLV
3 GDTrangChuHLV chọn "Đăng ký cầu thủ" trong GDTrangChuHLV
5 GDTrangChonVongDau hiển thị cho HLV
6 HLV chọn thanh Vòng đấu trong GDTrangChonVongDau
7 GDTrangChonVongDau gọi đến lớp VongDau
8 VongDau xử lý hàm getDanhSachVongDau()
10.GDTrangChonVongDau hiển thị danh sách vòng đấu để HLV chọn 11.HLV chọn 1 vòng đấu và ấn Danh sách trận đấu ở
14.TranDau xử lý hàm getDanhSachTranDau
16.GDDanhSachTranDau hiển thị cho HLV
17.HLV chọn 1 trận đấu và chọn Đăng ký cầu thủ thi đấu ở
20.CauThuDoiBong xử lý hàm getDanhSachCauThuDoiBong 21.CauThuDoiBong trả về GDDangKyCauThuThiDau
22.GDDangKyCauThuThiDau hiển thị cho HLV
23.HLV ấn tick chọn “Đăng ký” và ấn Lưu
25 CauThuDangKyTranDau xử lý hàm capNhatCauThuDangKy
28.GDDanhSachTranDau hiển thị cho HLV
6) Biểu đồ lớp thực thể cho pha thiết kế
Bước 1: Bổ sung thuộc tính id(mã) cho các lớp, trừ các lớp kế thừa
Các lớp được bổ sung thuộc tính id: trừ các lớp HuanLuyenVien, QuanLy
Bước 2: Bổ sung kiểu dữ liệu theo ngôn ngữ lập trình đã chọn cho tất cả các thuộc tính của lớp
Thuộc tính của các lớp được bổ sung thuộc tính theo kiểu của ngôn ngữ lập trình Java
Bước 3: Chuyển các quan hệ đối tượng
Quan hệ HuanLuyenVien – DoiBong -> HuanLuyenVienDoiBong chuyển thành HuanLuyenVienDoiBong chứa HuanLuyenVien và DoiBong chứa HuanLuyenVienDoiBong
Quan hệ CauThu – DoiBong -> CauThuDoiBong chuyển thành
CauThuDoiBong chứa CauThu và DoiBong chứa CauThuDoiBong
Quan hệ TranDau – DoiBong -> DoiBongTranDau chuyển thành DoiBongTranDau chứa DoiBong và TranDau chứa DoiBongTranDau
Quan hệ CauThuDoiBong – TranDau -> CauThuDangKyTranDau chuyển thành CauThuDangKyTranDau chứa CauThuDoiBong và TranDau chứa CauThuDangKyTranDau
Bước 4: Bổ sung các thuộc tính thành phần của quan hệ aggregation/composition
Bước 1: Với mỗi lớp thực thể, đề xuất một bảng dữ liệu tương ứng
Bước 2: Đưa thuộc tính không phải đối tượng của lớp thực thể thành thuộc tính của bảng tương ứng
tblThanhVien có các thuộc tính: id, tenTK, matKhau, tenDayDu, email, SDT, ngaySinh
tblQuanLy có các thuộc tính: namBatDau, tenGiaiDauQuanLy
tblHuanLuyenVien có các thuộc tính: namKinhNghiem, quocTich, thanhTich
tblDoiBong có các thuộc tính: id, tenDoiBong, ngayThanhLap
tblCauThu có các thuộc tính: id, tenCauThu, ngaySinh, viTri, chieuCao, canNang
tblHuanLuyenVienDoiBong có các thuộc tính: id, ngayBatDauHD, ngayKetThucHD
tblCauThuDoiBong có các thuộc tính: id, ngayBatDauHD, ngayKetThucHD
tblTranDau có các thuộc tính: id, tenDoiNha, tenDoiKhach, ngayThiDau, noiDienRa
tblDoiBongTranDau có các thuộc tính: id, vaiTro
tblCauThuDangKyTranDau có các thuộc tính: id, trangThai
Bước 3: Chuyến quan hệ số lượng giữa các lớp thực thể thành quan hệ số lượng giữa các bảng
Bước 4: Bổ sung các thuộc tính khóa
Khóa chính được xác định thông qua thuộc tính id của các bảng, ngoại trừ các bảng tblHuanLuyenVien và tblQuanLy Hai bảng này kế thừa từ lớp ThanhVien, do đó khóa chính của chúng sẽ tương ứng với khóa chính của lớp ThanhVien.
Khóa ngoại được thiết lập cho các bảng:
1 tblHuanLuyenVien – n tblHuanLuyenVienDoiBong -> bảng tblHuanLuyenVienDoiBong có khóa ngoại tblHuanLuyenVienid
1 tblDoiBong – n tblHuanLuyenVienDoiBong -> bảng tblHuanLuyenVienDoiBong có khóa ngoại tblDoiBongid
1 tblDoiBong – n tblDoiBongTranDau -> bảng tblDoiBongTranDau có khóa ngoại tblDoiBongid
1 tblDoiBong – n tblCauThuDoiBong -> bảng tblCauThuDoiBong có khóa ngoại tblDoiBongid
1 tblCauThu – n tblCauThuDoiBong -> bảng tblCauThuDoiBong có khóa ngoại tblCauThuid
1 tblTranDau – n tblDoiBongTranDau -> bảng tblDoiBongTranDau có khóa ngoại tblTranDauid
1 tblVongDau – n tblTranDau -> bảng tblTranDau có khóa ngoại tblVongDauid
1 tblCauThuDoiBong – n tblCauThuDangKyTranDau -> bảng tblCauThuDangKyTranDau có khóa ngoại tblCauThuDoiBongid
1 tblTranDau – n tblCauThuDangKyTranDau -> bảng tblCauThuDangKyTranDau có khóa ngoại tblTranDauid
8) Thiết kế giao diện và biểu đồ lớp đầy đủ cho pha thiết kế
2) Biểu đồ lớp đầy đủ cho pha phân tích
Sau khi đăng nhập thành công: chuyển đến trang TrangChuHLV.jsp TrangChonVongDau.jsp
Call từ TrangChuHLV.jsp: TrangChonVongDau.jsp
Call từ TrangChuHLV.jsp: TrangDanhSachTranDau.jsp
Chọn “Quay lại” từ TrangDangKyCauThu.jsp:
Chọn “Lưu” từ TrangDangKyCauThu.jsp: TrangDanhSachTranDau.jsp? idSave=x
Call từ TrangDanhSachTranDau.jsp: TrangDangKyCauThu
Lưu đăng ký thất bại: gọi TrangDangKyCauThu.jsp?error=1
10) Biểu đồ tuần tự cho pha phân tích
1 Huấn luyện viên ấn chọn chức năng Đăng ký cầu thủ thi đấu
2 TrangChuHLV.jsp gọi đến TrangChonVongDau.jsp
3 TrangChonVongDau.jsp hiển thị cho HLV
4 HLv chọn thanh Vòng đấu ở TrangChonVongDau.jsp
5 TrangChonVongDau.jsp gọi đến lớp VongDauDAO
6 Lớp VongDauDAO gọi hàm getDanhSachVongDau
7 lớp VongDauDAO gọi lớp VongDau
9 Lớp VongDau trả về VongDauDAO
10.VongDauDAO trả về TrangChonVongDau.jsp
11.TrangChonVongDau.jsp hiển thị cho HLV
12.HLV chọn 1 vòng đấu và ấn Danh sách trận đấu
13.TrangChonVongDau.jsp gọi đến TrangDanhSachTranDau.jsp
14.TrangDanhSachTranDau.jsp gọi lớp TranDauDAO
18.Lớp TranDau trả về TranDauDAO
19.TranDauDAO trả về TrangDanhSachTranDau.jsp
20.TrangDanhSachTranDau.jsp hiển thị cho HLV
21.HLV chọn trận đấu muốn đăng ký
22.TrangDanhSachTranDau.jsp gọi TrangDangKyCauThu.jsp
27.lớp CauThuDoiBong trả về CauThuDoiBongDAO
28.CauThuDoiBongDAO trả về TrangDangKyCauThu.jsp
29.TrangDangKyCauThu.jsp hiển thị cho HLV
30.HLV chọn cầu thủ đky
31.TrangDangKyCauThu.jsp gọi doLuuDangKyCauThu.jsp
33.CauThuDangKyTranDauDAO gọi hàm capNhatCauThuDangKy để kiểm tra xem đăng ký có hợp lệ và đủ người chưa
34.CauThuDangKyTranDauDAO gọi lớp CauThuDangKyTranDau 35.lớp CauThuDangKyTranDau đóng gói
36.lớp CauThuDangKyTranDau trả về CauThuDangKyTranDauDAO 37.CauThuDangKyTranDauDAO trả về doLuuDangKy.jsp
38.doLuuDangKy.jsp trả về TrangDangKyCauThu.jsp
39.TrangDangKyCauThu.jsp trả về TrangDanhSachTranDau.jsp 40.TrangDanhSachTranDau.jsp hiển thị cho HLV
III/ Chức năng Cập nhật kết quả trận đấu
1 Biểu đồ Use Case và mô tả
Chức năng Cập nhật kết quả trận đấu có các giao diện tương tác với quản lý:
Đăng nhập -> UC đăng nhập
Chọn vòng đấu -> đề xuất UC chọn vòng đấu
Chọn trận đấu cập nhật kết quả -> đề xuất UC chọn trận đấu muốn cập nhật kết quả
Cập nhật kết quả -> đề xuất UC cập nhật kết quả
Đăng nhập, chọn vòng đấu, chọn trận đấu, cập nhật kết quả là bắt buộc nên nó được include
Đề xuất use case Tìm kiếm trận đấu, vì nó không bắt buộc nên nó được extend
Cập nhật kết quả trận đấu
Tiền Quản lý đã có tài khoản, trang quản lý đang mở điều kiện
Quản lý hoàn thành quá trình cập nhật kết quả trận đấu
1 Quản lý A đăng nhập tài khoản admin với tên tài khoản: Nguyễn Văn A, mật khẩu 1234, chọn nút đăng nhập ở trang đăng nhập A muốn cập nhật kết quả trận đấu
2 Trang giao diện dành cho quản lý xuất hiện với chức năng xem danh sách trận đấu
3 A chọn chức năng đăng ký cầu thủ thi đấu
4 Trang chọn vòng đấu hiển thị:
thanh chọn vòng đấu (1 comboBox hiển thị danh sách các vòng đấu hợp lệ)
nút: Danh sách trận đấu
5 A chọn 1 vòng đấu từ thanh chọn và ấn nút Danh sách trận đấu
6 Giao diện hiển thị danh sách trận đấu bao gồm
- thông tin chi tiết về trận đấu: tên đội nhà, đội khách, thời gian bắt đầu, ngày bắt đầu, sân vận động
- danh sách tất cả các trận đấu
Nội Đà Nẵng 17h30 27/8/2024 Hàng Đẫy
7 A chọn 1 trận đấu (có STT 002) và chọn chức năng cập nhật kết quả
8 Trang cập nhật kết quả trận đấu hiện ra
STT Số bàn đội nhà
Cầu thủ ghi bàn đội nhà
Cầu thủ ghi bàn đội khách
9 A tiến hành cập nhật kết quả
STT Số bàn đội nhà
Cầu thủ ghi bàn đội nhà
Cầu thủ ghi bàn đội khách
11 Thông báo cập nhật kết quả trận đấu thành công hiện lên
13 Hệ thống trả lại giao diện hiển thị các trận đấu
3) Biểu đồ lớp thực thể cho pha phân tích
Biểu đồ gồm các lớp:
ThanhVien: gồm tên đăng nhập, mật khẩu, email, họ tên, số điện thoại
QuanLy: gồm năm bắt đầu quản lý, tên giải đấu quản lý và các thuộc tính kế thừa từ bảng ThanhVien
HuanLuyenVien: số năm kinh nghiệm, quốc tịch, thành tích và các thuộc tính kế thừa từ bảng ThanhVien
DoiBong: gồm tên, ngày thành lập, tên sân nhà
CauThu: tên, ngày tháng năm sinh, vị trí
VongDau: số thứ tự vòng đấu
TranDau: gồm tên đội nhà, tên đội khách, ngày thi đấu, nơi diễn ra
KetQua: số bàn đội nhà, số bàn đội khahcs
ThePhat: loại thẻ, phút nhận thẻ
Xác định quan hệ giữa các lớp:
QuanLy và HuanLuyenVien sẽ kế thừa từ lớp ThanhVien
HuanLuyenVien - DoiBong là một mối quan hệ quan trọng trong bóng đá, khi một đội bóng có thể trải qua nhiều huấn luyện viên theo thời gian, và ngược lại, một huấn luyện viên có thể dẫn dắt nhiều đội bóng khác nhau Để tối ưu hóa sự kết nối này, đề xuất lớp HuanLuyenVienDoiBong sẽ giúp xây dựng mối liên hệ chặt chẽ giữa mỗi huấn luyện viên và đội bóng mà họ dẫn dắt.
CauThu - DoiBong là một mối quan hệ quan trọng trong bóng đá, nơi một cầu thủ có thể thi đấu cho nhiều đội bóng khác nhau trong suốt sự nghiệp của mình Để quản lý và thể hiện mối liên kết này, chúng tôi đề xuất lớp CauThuDoiBong, giúp kết nối giữa từng cầu thủ và đội bóng mà họ đại diện.
Lớp DoiBongTranDau được đề xuất nhằm kết nối giữa một đội bóng và một trận đấu, vì mỗi đội bóng có thể tham gia nhiều trận đấu khác nhau, trong khi mỗi trận đấu lại có sự góp mặt của nhiều đội bóng.
TranDau - CauThuDoiBong là một lớp được đề xuất để kết nối giữa cầu thủ và trận đấu Trong hệ thống này, một trận đấu có thể đăng ký nhiều cầu thủ, và một cầu thủ có thể được đăng ký cho nhiều trận đấu khác nhau Điều này giúp quản lý thông tin cầu thủ và trận đấu một cách hiệu quả hơn.
VongDau - TranDau: 1-n Vì 1 vòng đấu có nhiều trận đấu
TranDau – KetQua: 1-1 Vì 1 trận đấu chỉ có 1 kết quả
CauThuDangKyTranDau – BanThang: 1-n Vì 1 cầu thủ thi đấu có thể ghi nhiều bàn thắng
CauThuDangKyTranDau – ThePhat: 1-n Vì 1 cầu thủ thi đấu có thể nhận nhiều thẻ phạt
4) Biểu đồ lớp đầy đủ cho pha phân tích
Ban đầu, giao diện đăng nhập -> đề xuất lớp GDDangNhap, cần có:
input: tên đăng nhập, mật khẩu
nút kiểu submit: đăng nhập
Bước 2, giao diện trang chủ quản lý -> đề xuất GDTrangChuQuanLy, cần có:
output: Thông tin quản lý
nút kiểu submit: Cập nhật kết quả trận đấu
Bước 3: giao diện trang chọn vòng đấu -> đề xuất GDTrangChonVongDau, cần có:
Thanh chọn vòng đấu: vừa input vừa output
Nút kiểu submit: Danh sách trận đấu Để có danh sách vòng đấu, cần xử lí dưới hệ thống:
output: danh sách vòng đấu
đề xuất phương thức getDanhSachVongDau() gán cho lớp VongDau
Bước 4: giao diện trang danh sách trận đấu -> đề xuất
output: Danh sách các trận đấu
nút kiểu submit: Cập nhật, quay lại, tìm kiếm Để có danh sách trận đấu, cần xử lí dưới hệ thống:
output: danh sách các trận đấu của vòng đấu
đề xuất phương thức getDanhSachTranDau() gán cho lớp TranDau Bước 5: Cập nhật kết quả -> đề xuất GDCapNhatKetQua
input: số bàn đội nhà, số bàn đội khách, số thẻ phạt
Cầu thủ ghi bàn đội nhà / đội khách: vừa input vừa output Để có danh sách cầu thủ thi đấu trong trận, cần xử lí dưới hệ thống:
output: danh sách các cầu thủ đăng ký thi đấu
đề xuất phương thức getDanhSachCauThuDangKyThiDau() gán cho lớp CauThuDangKyThiDau Để hoàn thành việc lưu cầu thủ đăng ký, cần xử lí dưới hệ thống:
input: kết quả trận đấu
output: thành công hay không
đề xuất phương thức capNhatKetQuaTranDau() gán cho lớp KetQua Sau khi cập nhật thành công, cần xử lý dưới hệ thống
cập nhật thông tin về bàn thắng và thẻ phạt
input: id cầu thủ đăng ký thi đấu
output: đối tượng sau khi được cập nhật
đề xuất phương thức capNhatBanThang() gán cho lớp BanThang và phương thức capNhatThePhat() gán cho lớp ThePhat
1 Quản lý gọi đến GDTrangChuQuanLy
2 GDTrangChuQuanLy hiển thị cho Quản lý
3 GDTrangChuQuanLy chọn "Cập nhật kết quả" trong
5 GDTrangChonVongDau hiển thị cho Quản lý
6 QuanLy chọn thanh Vòng đấu trong GDTrangChonVongDau
7 GDTrangChonVongDau gọi đến lớp VongDau
8 VongDau xử lý hàm getDanhSachVongDau()
10.GDTrangChonVongDau hiển thị danh sách vòng đấu để quản lý chọn 11.QuanLy chọn 1 vòng đấu và ấn Danh sách trận đấu ở
14.TranDau xử lý hàm getDanhSachTranDau
16.GDDanhSachTranDau hiển thị cho quản lý
17.QuanLy chọn 1 trận đấu và chọn Cập nhật kết quả
19.GDCapNhatKetQua hiển thị cho quản lý
20.Quản lý ấn vào thanh Cầu thủ ghi bàn ở GDCapNhatketQua 21.GDCapNhatKetQua gọi lớp CauThuDangKyTranDau
22.lớp CauThuDangKyTranDau xử lý hàm getDanhSachCauThudangKyTranDau
23.lớp CauThuDangKyTranDau trả về GDCapNhatKetQua
24.GDCapNhatKetQua hiển thị cho quản lý
25.Quản lý ấn tick chọn Cầu thủ ghi bàn và tiến hành Cập nhật kết quả26.GDCapNhatKetQua gọi lớp KetQua
27.Lớp KetQua xử lý hàm capNhatketQua
28.Lớp KetQua trả về GDCapnhatketQua
30.Lớp BanThang xủ lý hàm capNhatBanThang
31.Lớp BanThang trả về GDCapNhatKetQua
33.Lớp ThePhat xử lý hàm capNhatThePhat
34.Lớp ThePhat trả về GDCapNhatKetQua
36.GDDanhSachTranDau hiển thị cho Quản lý
6) Biểu đồ lớp thực thể cho pha thiết kế
Bước 1: Bổ sung thuộc tính id(mã) cho các lớp, trừ các lớp kế thừa
Bước 2: Bổ sung kiểu dữ liệu theo ngôn ngữ lập trình đã chọn cho tất cả các thuộc tính của lớp (ở đây là Java)
Bước 3: Chuyển các quan hệ đối tượng
Quan hệ HuanLuyenVien – DoiBong -> HuanLuyenVienDoiBong chuyển thành HuanLuyenVienDoiBong chứa HuanLuyenVien và DoiBong chứa HuanLuyenVienDoiBong
Quan hệ CauThu – DoiBong -> CauThuDoiBong chuyển thành CauThuDoiBong chứa CauThu và DoiBong chứa CauThuDoiBong
Quan hệ TranDau – DoiBong -> DoiBongTranDau chuyển thành DoiBongTranDau chứa DoiBong và TranDau chứa DoiBongTranDau
Quan hệ CauThuDoiBong – TranDau -> CauThuDangKyTranDau chuyển thành CauThuDangKyTranDau chứa CauThuDoiBong và TranDau chứa CauThuDangKyTranDau
Bước 4: Bổ sung các thuộc tính thành phần của quan hệ aggregation/composition
Bước 1: Với mỗi lớp thực thể, đề xuất một bảng dữ liệu tương ứng
Bước 2: Đưa thuộc tính không phải đối tượng của lớp thực thể thành thuộc tính của bảng tương ứng
tblThanhVien có các thuộc tính: id, tenTK, matKhau, tenDayDu, email, SDT, ngaySinh
tblQuanLy có các thuộc tính: namBatDau, tenGiaiDauQuanLy
tblHuanLuyenVien có các thuộc tính: namKinhNghiem, quocTich, thanhTich
tblDoiBong có các thuộc tính: id, tenDoiBong, ngayThanhLap
tblCauThu có các thuộc tính: id, tenCauThu, ngaySinh, viTri, chieuCao, canNang
tblHuanLuyenVienDoiBong có các thuộc tính: id, ngayBatDauHD, ngayKetThucHD
tblCauThuDoiBong có các thuộc tính: id, ngayBatDauHD, ngayKetThucHD
tblTranDau có các thuộc tính: id, tenDoiNha, tenDoiKhach, ngayThiDau, noiDienRa
tblDoiBongTranDau có các thuộc tính: id, vaiTro
tblCauThuDangKyTranDau có các thuộc tính: id, trangThai
tblBanThang có các thuộc tính: id, phutGhiban
tblThePhat có các thuộc tính: id, loaiThe, phutNhanThe
tblKetQua có các thuộc tính: id, soBanDoiNha, soBanDoiKhachBước 3: Chuyến quan hệ số lượng giữa các lớp thực thể thành quan hệ số lượng giữa các bảng
Bước 4: Bổ sung các thuộc tính khóa
Khóa chính được thiết lập dựa trên thuộc tính id của các bảng, ngoại trừ các bảng tblHuanLuyenVien và tblQuanLy Hai bảng này kế thừa từ lớp ThanhVien, do đó, khóa chính của chúng sẽ là khóa chính của lớp ThanhVien.
Khóa ngoại được thiết lập cho các bảng:
1 tblHuanLuyenVien – n tblHuanLuyenVienDoiBong -> bảng tblHuanLuyenVienDoiBong có khóa ngoại tblHuanLuyenVienid
1 tblDoiBong – n tblHuanLuyenVienDoiBong -> bảng tblHuanLuyenVienDoiBong có khóa ngoại tblDoiBongid
1 tblDoiBong – n tblDoiBongTranDau -> bảng tblDoiBongTranDau có khóa ngoại tblDoiBongid
1 tblDoiBong – n tblCauThuDoiBong -> bảng tblCauThuDoiBong có khóa ngoại tblDoiBongid
1 tblCauThu – n tblCauThuDoiBong -> bảng tblCauThuDoiBong có khóa ngoại tblCauThuid
1 tblTranDau – n tblDoiBongTranDau -> bảng tblDoiBongTranDau có khóa ngoại tblTranDauid
1 tblVongDau – n tblTranDau -> bảng tblTranDau có khóa ngoại tblVongDauid
1 tblCauThuDoiBong – n tblCauThuDangKyTranDau -> bảng tblCauThuDangKyTranDau có khóa ngoại tblCauThuDoiBongid
1 tblTranDau – n tblCauThuDangKyTranDau -> bảng tblCauThuDangKyTranDau có khóa ngoại tblTranDauid
1 tblCauThuDangKyTranDau – n tblBanThang -> bảng tblBanThang có khóa ngoại tblCauThuDangKyTranDauid
1 tblCauThuDangKyTranDau – n tblThePhat -> bảng tblThePhat có khóa ngoại tblCauThuDangKyTranDauid
1 tblTranDau – 1 tblKetQua -> bảng tblKetQua có khóa ngoại tblTranDauid
8) Thiết kế giao diện và biểu đồ lớp đầy đủ cho pha thiết kế
2) Biểu đồ lớp đầy đủ cho pha thiết kế
Sau khi đăng nhập thành công: chuyển đến trang TrangChuQuanLy.jsp TrangChonVongDau.jsp
Call từ TrangChuQuanLy.jsp: TrangChonVongDau.jsp
Chuyển đến trang danh sách trận đấu thất bại: TrangChonVongDau.jsp? error=1
Call từ TrangChuQuanLy.jsp: TrangDanhSachTranDau.jsp
Chọn “Quay lại” từ TrangCapNhatKetQua.jsp:
Chọn “Lưu” từ TrangCapNhatKetQua.jsp: TrangDanhSachTranDau.jsp? idSave=x
Call từ TrangDanhSachTranDau.jsp: TrangDangKyCauThu
Lưu cập nhật kết quả thất bại: TrangCapNhatKetQua.jsp?error=1
10) Biểu đồ tuần tự cho pha phân tích
1 Quản lý ấn chọn chức năng Cập nhật kết quả trận đấu
2 TrangChuQuanLy.jsp gọi đến TrangChonVongDau.jsp
3 TrangChonVongDau.jsp hiển thị cho Quản lý
4 Quản lý ấn chọn thanh Vòng đấu ở TrangChonVongDau.jsp
5 TrangChonVongDau.jsp gọi đến lớp lớp VongDauDAO
6 Lớp VongDauDAO gọi hàm getDanhSachVongDau
7 lớp VongDauDAO gọi lớp VongDau
9 Lớp VongDau trả về VongDauDAO
10.VongDauDAO trả về TrangDanhSachTranDau.jsp11.TrangDanhSachTranDau.jsp hiển thị cho HLV
12.HLV chọn 1 vòng đấy và ấn Danh sách trận đấu
13.TrangChonVongDau.jsp gọi TrangDanhSachTranDau.jsp
18.Lớp TranDau trả về TranDauDAO
19.TranDauDAO trả về TrangDanhSachTranDau.jsp
20.TrangDanhSachTranDau.jsp hiển thị cho quản lý
21.Quản lý chọn trận đấu muốn cập nhật kết quả
22.TrangDanhSachTranDau.jsp gọi TrangCapNhatKetQua.jsp
23.TrangCapNhatKetQua.jsp hiển thị cho quản lý
24.Quản lý chọn thanh Cầu thủ ghi bàn ở TrangCapNhatKetQua.jsp 25.TrangCapNhatKetQua.jsp gọi lớp CauThuDangKyTranDauDAO 26.CauThuDangKyTranDauDAO gọi hàm getDanhSachCauThuDangKy 27.CauThuDangKyTranDauDAO gọi lớp CauThuDangKyTranDau 28.CauThuDangKyTranDau đóng gói
29.CauThuDangKyTranDau trả về lớp CauThuDangKyTranDauDAO 30.CauThuDangKyTranDauDAO trả về TrangCapNhatKetQua.jsp 31.TrangCapNhatKetQua.jsp hiển thị cho Quản lý
32.Quản lý chọn nhập kết quả trận đấu
33.TrangCapNhapKetQua.jsp gọi doLuuKetQua.jsp
35.KetQuaDAO gọi hàm capNhatKetQua để lưu vào CSDL
38.lớp KetQua trả về KetQuaDAO
39.KetQuaDAO trả về doLuuKetQua.jsp
41.BanThangDAO gọi hàm capNhatBanThang để lưu thông tin bàn thắng vào CSDL
44.lớp BanThang trả về BanThangDAO
45.BanThangDAO trả về doLuuKetQua.jsp
46.doLuuKetQua.jsp gọi lớp ThePhatDAO
47.ThePhatDAO gọi hàm capNhatThePhat để lưu vào CSDL
50.lớp ThePhat trả về ThePhatDAO
51.ThePhatDAO trả về doLuuKetQua.jsp
52.doLuuKetQua.jsp trả về TrangCapNhatKetQua.jsp
53.TrangCapNhatKetQua.jsp trả về TrangDanhSachTranDau.jsp
54.TrangDanhSachTranDau.jsp hiển thị lại cho người Quản lý