使用Java开发简易的电影评分与推荐系统,核心需要完成用户管理、电影信息管理、评分记录存储、推荐逻辑计算这几个核心模块,整体可以采用Spring Boot作为后端框架,MySQL作为存储数据库,前端使用简单的静态页面完成交互。
系统核心需求梳理
简易版本的系统需要覆盖以下基础功能:
- 用户注册登录,管理个人账号信息
- 电影信息展示,支持查看电影基本详情
- 用户对看过的电影进行评分,评分范围1到5分
- 基于用户的评分记录,推荐相似偏好的电影
数据库表设计
需要设计四张核心表,分别存储用户、电影、评分、用户偏好的基础数据,表结构如下:
| 表名 | 核心字段 | 说明 |
|---|---|---|
| user | id, username, password, create_time | 存储用户基础信息 |
| movie | id, name, director, type, score, description | 存储电影基础信息,score为平均评分 |
| rating | id, user_id, movie_id, rating, create_time | 存储用户的评分记录 |
| user_preference | id, user_id, movie_type, weight | 存储用户对不同电影类型的偏好权重 |
核心功能实现
用户评分模块
用户提交评分后,需要同时更新评分表和电影的平均评分,实现代码如下:
@Service
public class RatingService {
@Autowired
private RatingMapper ratingMapper;
@Autowired
private MovieMapper movieMapper;
public void submitRating(Integer userId, Integer movieId, Integer rating) {
// 先查询用户是否已经对该电影评过分,有则更新,无则新增
Rating existRating = ratingMapper.selectByUserAndMovie(userId, movieId);
if (existRating != null) {
existRating.setRating(rating);
ratingMapper.updateById(existRating);
} else {
Rating newRating = new Rating();
newRating.setUserId(userId);
newRating.setMovieId(movieId);
newRating.setRating(rating);
newRating.setCreateTime(new Date());
ratingMapper.insert(newRating);
}
// 重新计算电影的平均评分
Double avgScore = ratingMapper.calculateAvgScoreByMovieId(movieId);
Movie movie = movieMapper.selectById(movieId);
movie.setScore(avgScore);
movieMapper.updateById(movie);
// 更新用户的类型偏好权重
updateUserPreference(userId, movieId, rating);
}
private void updateUserPreference(Integer userId, Integer movieId, Integer rating) {
Movie movie = movieMapper.selectById(movieId);
String movieType = movie.getType();
// 评分越高,对应类型的权重增加越多
double addWeight = rating * 0.2;
UserPreference preference = userPreferenceMapper.selectByUserAndType(userId, movieType);
if (preference != null) {
preference.setWeight(preference.getWeight() + addWeight);
userPreferenceMapper.updateById(preference);
} else {
UserPreference newPreference = new UserPreference();
newPreference.setUserId(userId);
newPreference.setMovieType(movieType);
newPreference.setWeight(addWeight);
userPreferenceMapper.insert(newPreference);
}
}
}
简易推荐模块
推荐逻辑采用基于内容的推荐方式,根据用户偏好的电影类型,推荐同类型中平均评分较高的未观看电影,实现代码如下:
@Service
public class RecommendService {
@Autowired
private UserPreferenceMapper userPreferenceMapper;
@Autowired
private MovieMapper movieMapper;
@Autowired
private RatingMapper ratingMapper;
public List<Movie> recommendMovies(Integer userId, Integer limit) {
// 获取用户的偏好类型,按权重倒序排列
List<UserPreference> preferences = userPreferenceMapper.selectByUserIdOrderByWeightDesc(userId);
List<Movie> recommendList = new ArrayList<>();
// 获取用户已经评分过的电影id,避免重复推荐
List<Integer> ratedMovieIds = ratingMapper.selectMovieIdsByUserId(userId);
for (UserPreference preference : preferences) {
if (recommendList.size() >= limit) {
break;
}
// 查询该类型下未观看且评分较高的电影
List<Movie> typeMovies = movieMapper.selectByTypeAndNotInIds(preference.getMovieType(), ratedMovieIds, limit - recommendList.size());
recommendList.addAll(typeMovies);
}
// 如果推荐数量不足,补充高评分的未观看电影
if (recommendList.size() < limit) {
List<Movie> hotMovies = movieMapper.selectHotMoviesNotInIds(ratedMovieIds, limit - recommendList.size());
recommendList.addAll(hotMovies);
}
return recommendList;
}
}
接口层开发
使用Spring Boot的@RestController注解开发接口,提供给前端调用,示例接口如下:
@RestController
@RequestMapping("/api/recommend")
public class RecommendController {
@Autowired
private RecommendService recommendService;
@GetMapping("/list")
public Result<List<Movie>> getRecommendList(@RequestParam Integer userId, @RequestParam(defaultValue = "10") Integer limit) {
List<Movie> movies = recommendService.recommendMovies(userId, limit);
return Result.success(movies);
}
}
总结
以上就是一个简易Java电影评分与推荐系统的完整开发流程,核心逻辑并不复杂,适合初学者用来巩固Spring Boot开发、数据库操作、简单业务逻辑实现的相关技能。如果想要提升系统能力,还可以优化推荐算法,比如加入基于用户的协同过滤逻辑,或者增加电影搜索、评论等扩展功能。
Java电影评分系统推荐算法Spring_BootMySQL修改时间:2026-06-28 21:57:37