4.7 KiB
4.7 KiB
Patient Testimonial (Review) Feature Implementation Plan
Mục tiêu: Xây dựng tính năng "Cảm nhận của người bệnh" trên trang chi tiết bác sĩ, cho phép người dùng gửi đánh giá (bắt buộc kèm số điện thoại). Đánh giá sẽ không hiển thị ngay mà phải qua bước kiểm duyệt của admin. Admin phê duyệt/từ chối sẽ được lưu log lại.
User Review Required
Important
- Về việc lưu log (người duyệt/từ chối): Bạn có đồng ý với phương án thêm 2 trường
reviewedBy(lưu username của người duyệt) vàreviewedAt(lưu thời gian duyệt) trực tiếp vào bảng đánh giá thay vì tạo một bảng log riêng biệt cho đơn giản không?- Về Form đánh giá ở ngoài frontend: Sẽ sử dụng AJAX để gửi dữ liệu về server. Nếu thành công sẽ hiển thị thông báo "Đánh giá của bạn đã được gửi và đang chờ kiểm duyệt."
Proposed Changes
1. Database Entity Models
Thêm mới Entity cho tính năng Đánh giá:
[NEW] src/main/java/com/sisvietnamvn/web/domain/enumeration/ReviewStatus.java
- Tạo Enum với các trạng thái:
PENDING,APPROVED,REJECTED.
[NEW] src/main/java/com/sisvietnamvn/web/domain/PatientReview.java
- Chứa các trường:
id,doctor(ManyToOne),patientName,phoneNumber(bắt buộc),rating(1-5),content,status(mặc định PENDING). - Kế thừa
AbstractAuditingEntityđể tự động cócreatedBy,createdDate... - Bổ sung trường
reviewedBy(Lưu ai là người duyệt) vàreviewedAt(Lưu thời điểm duyệt).
2. Repository & Service Layer
[NEW] src/main/java/com/sisvietnamvn/web/repository/PatientReviewRepository.java
- Chứa các hàm query: tìm theo bác sĩ và trạng thái (
findByDoctorAndStatus), phân trang cho trang quản trị.
[NEW] src/main/java/com/sisvietnamvn/web/service/PatientReviewService.java
- Chứa logic:
submitReview: Nhận review từ frontend, validate số điện thoại, gánPENDING.approveReview: Đổi trạng thái thànhAPPROVED, lưureviewedBylà username hiện tại.rejectReview: Đổi trạng thái thànhREJECTED, lưu log.getApprovedReviewsByDoctor: Trả về danh sách review để hiển thị trên trang chi tiết bác sĩ.getReviewStats: Tính trung bình sao và tổng số review.
3. Controllers
[NEW] src/main/java/com/sisvietnamvn/web/controller/PatientReviewPublicController.java
- API
POST /api/public/reviews: Nhận form submit bằng AJAX từ trang chi tiết bác sĩ, validate dữ liệu (số điện thoại, sao đánh giá) và lưu vào database với trạng thái chờ duyệt.
[NEW] src/main/java/com/sisvietnamvn/web/controller/ManagePatientReviewController.java
- Các endpoint trang quản trị:
GET /manage/reviews: Danh sách tất cả các đánh giá.POST /manage/reviews/{id}/approve: Duyệt đánh giá.POST /manage/reviews/{id}/reject: Từ chối đánh giá.
4. Admin UI (Manage)
[MODIFY] src/main/resources/templates/fragments/manage-layout.html
- Thêm mục menu "Đánh giá người bệnh" vào sidebar.
[NEW] src/main/resources/templates/manage/reviews/list.html
- Trang hiển thị bảng danh sách các đánh giá.
- Có các nút "Approve" (Duyệt) và "Reject" (Từ chối).
- Cột log hiển thị "Người duyệt" và "Thời gian duyệt".
5. Public UI (Doctor Detail)
[MODIFY] src/main/resources/templates/doctor-detail.html
- Xoá
display: nonecủa khối "Cảm nhận của người bệnh". - Phần danh sách: Dùng Thymeleaf để loop qua danh sách
APPROVEDreviews truyền từ controller, hiển thị trung bình sao và các bình luận. - Phần Form:
- Thêm field "Số điện thoại" (Bắt buộc).
- Thêm field "Họ và tên".
- Thêm Javascript (AJAX) xử lý gửi form tới
/api/public/reviews. Khi thành công sẽ hiện thông báo popup báo chờ duyệt. Khóa nút submit tạm thời tránh spam.
Verification Plan
Automated & Manual Verification
- Truy cập vào trang chi tiết bác sĩ, thực hiện điền form đánh giá (có validate số điện thoại).
- Đảm bảo form báo thành công và đánh giá chưa xuất hiện.
- Đăng nhập vào trang quản trị Admin (
/manage/reviews), kiểm tra có đánh giá vừa gửi (trạng thái PENDING). - Nhấn "Approve", lúc này hệ thống cập nhật
reviewedBy. - Quay lại trang bác sĩ xem đánh giá đã được hiển thị công khai cùng với thay đổi về điểm đánh giá trung bình.