答案:Java可通过定义课程、用户和评价实体类实现评分功能,核心逻辑包括提交评价时校验评分范围和防止重复提交,通过流式处理计算平均分并查询评价列表,结合数据库持久化与Spring Data JPA简化操作,同时需加强身份认证、输入过滤等安全措施以保障系统稳定。
课程评分和评价功能是教育类系统中的常见需求,Java可以很好地支持这类功能的实现。核心包括用户提交评分、保存评价内容、查询课程平均分以及防止重复评价等逻辑。下面从设计思路到代码示例逐步说明。
需要定义几个关键实体类来支撑功能:
public class Review {
private Long id;
private Long courseId;
private Long userId;
private int rating; // 1-5 分
private String comment;
private LocalDateTime createTime;
// 构造函数、getter/setter 省略
}
主要功能包括提交评价、计算平均分、检查是否已评价等。
提交评价接口确保用户只能对同一门课程评价一次,避免刷分。
public class ReviewService {
private List reviews = new ArrayList<>();
public boolean submitReview(Long userId, Long courseId, int rating, String comment) {
// 检查评分范围
if (rating < 1 || rating > 5) {
throw new IllegalArgumentException("评分必须在1-5之间");
}
// 检查是否已评价
boolean hasReviewed = reviews.stream()
.anyMatch(r -> r.getUserId().equals(userId) && r.getCourseId().equals(courseId));
if (hasReviewed) {
return false; // 已评价,不能重复提交
}
Review review = new Review(null, courseId, userId, rating, comment, LocalDateTime.now());
reviews.add(review);
return true;
}
}
获取课程平均评分
根据所有对该课程的评分计算平均值。
public double getAverageRating(Long courseId) {
return reviews.stream()
.filter(r -> r.getCourseId().equals(courseId))
.mapToInt(Review::getRating)
.average()
.orElse(0.0); // 若无评分,返回 0
}
获取某课程的所有评价列表
public ListgetReviewsByCourse(Long courseId) { return reviews.stream() .filter(r -> r.getCourseId().equals(courseId)) .collect(Collectors.toList()); }
实际项目中应使用数据库存储数据。可以结合 JDBC 或 JPA/Hibernate 实现持久化。
public interface ReviewRepository extends JpaRepository{ List findByCourseId(Long courseId); boolean existsByUserIdAndCourseId(Long userId, Long courseId); }
上线前需补充以下保护措施: