计算机毕业设计-基于Hadoop大数据的电影推荐系统项目开发实战(附源码+论文)
电影推荐系统可以将功能划分为管理员功能和用户功能。(1)管理员关键功能包含用户管理、电影信息管理、论坛交流、系统管理、个人中心等进行管理。
大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦。
精彩专栏推荐👇🏻👇🏻👇🏻
开发环境
- 开发语言:java
- 框架:Hadoop,scrapy,springboot,vue
- 数据库:mysql
- 数据库工具:Navicat
- 浏览器:谷歌浏览器
演示视频
基于大数据技术的电影推荐系统的设计与实现-演示2024
论文目录
❤️【如需全文请按文末获取联系】
一、项目简介
电影推荐系统可以将功能划分为管理员功能和用户功能。
(1)管理员关键功能包含用户管理、电影信息管理、论坛交流、系统管理、个人中心等进行管理。
(2)用户登录系统首页可以查看到电影信息、论坛交流、公告资讯、个人中心等进行管理,在个人中心页面可以对个人中心、修改密码、我的发布、我的收藏、浏览历史等进行操作。
二、系统设计
2.1软件功能模块设计
本系统功能结构图如下所示:
2.2数据库设计
将“用户、电影信息、公告资讯、论坛交流”等作为实体,它们的局部E-R图,如图4-2所示:
三、系统项目部分截图
3.1前台功能实现
系统首页页面,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图5-1所示:
系统注册页面如图5-2所示:
电影信息:在电影信息页面的输入栏中输入导演、类型和地区进行查询,可以查看到电影详细信息,并进行评论或收藏操作;电影信息页面如图5-3所示:
个人中心
个人中心,在个人中心页面可以对个人中心、修改密码、我的发布、我的收藏、浏览历史进行详细操作;如图5-4所示:
3.2管理员功能实现
登录界面如图5-5所示。
管理员进入主页面,主要功能包括对用户管理、电影信息管理、论坛交流、系统管理、个人中心等进行操作。管理员主页面如图5-6所示:
在大数据分析方面,系统采用了Hadoop框架。Hadoop是一个能够处理大数据集的分布式存储和计算平台,它的核心是HDFS(Hadoop Distributed File System)和MapReduce计算模型。通过Hadoop,我们可以对收集到的大量数据进行存储和分析。看板页面如图5-9所示:
管理员点击系统管理,在公告资讯页面输入标题可以查询,添加或删除公告资讯列表,并对公告资讯进行查看、修改和删除等操作;还可以对轮播图管理、公告资讯分类、系统简介进行详细操作。如图5-10所示:
四、部分核心代码
package com.controller;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.utils.UserBasedCollaborativeFiltering;
import com.entity.DianyingxinxiEntity;
import com.entity.view.DianyingxinxiView;
import com.service.DianyingxinxiService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.EncryptUtil;
import com.utils.MPUtil;
import com.utils.MapUtils;
import com.utils.CommonUtil;
import java.io.IOException;
import com.service.StoreupService;
import com.entity.StoreupEntity;
/**
* 电影信息
* 后端接口
* @author
* @email
* @date 2024-04-13 15:58:41
*/
@RestController
@RequestMapping("/dianyingxinxi")
public class DianyingxinxiController {
@Autowired
private DianyingxinxiService dianyingxinxiService;
@Autowired
private StoreupService storeupService;
/**
* 后台列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,DianyingxinxiEntity dianyingxinxi,
HttpServletRequest request){
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
PageUtils page = dianyingxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, dianyingxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 前台列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,DianyingxinxiEntity dianyingxinxi,
HttpServletRequest request){
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
PageUtils page = dianyingxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, dianyingxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( DianyingxinxiEntity dianyingxinxi){
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( dianyingxinxi, "dianyingxinxi"));
return R.ok().put("data", dianyingxinxiService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(DianyingxinxiEntity dianyingxinxi){
EntityWrapper< DianyingxinxiEntity> ew = new EntityWrapper< DianyingxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( dianyingxinxi, "dianyingxinxi"));
DianyingxinxiView dianyingxinxiView = dianyingxinxiService.selectView(ew);
return R.ok("查询电影信息成功").put("data", dianyingxinxiView);
}
/**
* 后台详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
DianyingxinxiEntity dianyingxinxi = dianyingxinxiService.selectById(id);
dianyingxinxi.setClicknum(dianyingxinxi.getClicknum()+1);
dianyingxinxiService.updateById(dianyingxinxi);
dianyingxinxi = dianyingxinxiService.selectView(new EntityWrapper<DianyingxinxiEntity>().eq("id", id));
return R.ok().put("data", dianyingxinxi);
}
/**
* 前台详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
DianyingxinxiEntity dianyingxinxi = dianyingxinxiService.selectById(id);
dianyingxinxi.setClicknum(dianyingxinxi.getClicknum()+1);
dianyingxinxiService.updateById(dianyingxinxi);
dianyingxinxi = dianyingxinxiService.selectView(new EntityWrapper<DianyingxinxiEntity>().eq("id", id));
return R.ok().put("data", dianyingxinxi);
}
/**
* 后台保存
*/
@RequestMapping("/save")
public R save(@RequestBody DianyingxinxiEntity dianyingxinxi, HttpServletRequest request){
//ValidatorUtils.validateEntity(dianyingxinxi);
dianyingxinxiService.insert(dianyingxinxi);
return R.ok();
}
/**
* 前台保存
*/
@RequestMapping("/add")
public R add(@RequestBody DianyingxinxiEntity dianyingxinxi, HttpServletRequest request){
//ValidatorUtils.validateEntity(dianyingxinxi);
dianyingxinxiService.insert(dianyingxinxi);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
@Transactional
public R update(@RequestBody DianyingxinxiEntity dianyingxinxi, HttpServletRequest request){
//ValidatorUtils.validateEntity(dianyingxinxi);
dianyingxinxiService.updateById(dianyingxinxi);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
dianyingxinxiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 前台智能排序
*/
@IgnoreAuth
@RequestMapping("/autoSort")
public R autoSort(@RequestParam Map<String, Object> params,DianyingxinxiEntity dianyingxinxi, HttpServletRequest request,String pre){
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
Map<String, Object> newMap = new HashMap<String, Object>();
Map<String, Object> param = new HashMap<String, Object>();
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
String key = entry.getKey();
String newKey = entry.getKey();
if (pre.endsWith(".")) {
newMap.put(pre + newKey, entry.getValue());
} else if (StringUtils.isEmpty(pre)) {
newMap.put(newKey, entry.getValue());
} else {
newMap.put(pre + "." + newKey, entry.getValue());
}
}
params.put("sort", "clicknum");
params.put("order", "desc");
PageUtils page = dianyingxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, dianyingxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 协同算法(基于用户收藏的协同算法)
*/
@RequestMapping("/autoSort2")
public R autoSort2(@RequestParam Map<String, Object> params,DianyingxinxiEntity dianyingxinxi, HttpServletRequest request){
String userId = request.getSession().getAttribute("userId").toString();
Integer limit = params.get("limit")==null?10:Integer.parseInt(params.get("limit").toString());
List<StoreupEntity> storeups = storeupService.selectList(new EntityWrapper<StoreupEntity>().eq("type", 1).eq("tablename", "dianyingxinxi"));
Map<String, Map<String, Double>> ratings = new HashMap<>();
if(storeups!=null && storeups.size()>0) {
for(StoreupEntity storeup : storeups) {
Map<String, Double> userRatings = null;
if(ratings.containsKey(storeup.getUserid().toString())) {
userRatings = ratings.get(storeup.getUserid().toString());
} else {
userRatings = new HashMap<>();
ratings.put(storeup.getUserid().toString(), userRatings);
}
if(userRatings.containsKey(storeup.getRefid().toString())) {
userRatings.put(storeup.getRefid().toString(), userRatings.get(storeup.getRefid().toString())+1.0);
} else {
userRatings.put(storeup.getRefid().toString(), 1.0);
}
}
}
// 创建协同过滤对象
UserBasedCollaborativeFiltering filter = new UserBasedCollaborativeFiltering(ratings);
// 为指定用户推荐物品
String targetUser = userId;
int numRecommendations = limit;
List<String> recommendations = filter.recommendItems(targetUser, numRecommendations);
// 输出推荐结果
System.out.println("Recommendations for " + targetUser + ":");
for (String item : recommendations) {
System.out.println(item);
}
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
ew.in("id", String.join(",", recommendations));
if(recommendations!=null && recommendations.size()>0) {
ew.last("order by FIELD(id, "+"'"+String.join("','", recommendations)+"'"+")");
}
PageUtils page = dianyingxinxiService.queryPage(params, ew);
List<DianyingxinxiEntity> pageList = (List<DianyingxinxiEntity>)page.getList();
if(pageList.size()<limit) {
int toAddNum = limit-pageList.size();
ew = new EntityWrapper<DianyingxinxiEntity>();
ew.notIn("id", recommendations);
ew.orderBy("id", false);
ew.last("limit "+toAddNum);
pageList.addAll(dianyingxinxiService.selectList(ew));
} else if(pageList.size()>limit) {
pageList = pageList.subList(0, limit);
}
page.setList(pageList);
return R.ok().put("data", page);
}
/**
* (按值统计)
*/
@RequestMapping("/value/{xColumnName}/{yColumnName}")
public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
List<Map<String, Object>> result = dianyingxinxiService.selectValue(params, ew);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
/**
* (按值统计(多))
*/
@RequestMapping("/valueMul/{xColumnName}")
public R valueMul(@PathVariable("xColumnName") String xColumnName,@RequestParam String yColumnNameMul, HttpServletRequest request) {
String[] yColumnNames = yColumnNameMul.split(",");
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
List<List<Map<String, Object>>> result2 = new ArrayList<List<Map<String,Object>>>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
for(int i=0;i<yColumnNames.length;i++) {
params.put("yColumn", yColumnNames[i]);
List<Map<String, Object>> result = dianyingxinxiService.selectValue(params, ew);
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
result2.add(result);
}
return R.ok().put("data", result2);
}
/**
* (按值统计)时间统计类型
*/
@RequestMapping("/value/{xColumnName}/{yColumnName}/{timeStatType}")
public R valueDay(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
params.put("timeStatType", timeStatType);
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
List<Map<String, Object>> result = dianyingxinxiService.selectTimeStatValue(params, ew);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
/**
* (按值统计)时间统计类型(多)
*/
@RequestMapping("/valueMul/{xColumnName}/{timeStatType}")
public R valueMulDay(@PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,@RequestParam String yColumnNameMul,HttpServletRequest request) {
String[] yColumnNames = yColumnNameMul.split(",");
Map<String, Object> params = new HashMap<String, Object>();
params.put("xColumn", xColumnName);
params.put("timeStatType", timeStatType);
List<List<Map<String, Object>>> result2 = new ArrayList<List<Map<String,Object>>>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
for(int i=0;i<yColumnNames.length;i++) {
params.put("yColumn", yColumnNames[i]);
List<Map<String, Object>> result = dianyingxinxiService.selectTimeStatValue(params, ew);
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
result2.add(result);
}
return R.ok().put("data", result2);
}
/**
* 分组统计
*/
@RequestMapping("/group/{columnName}")
public R group(@PathVariable("columnName") String columnName,HttpServletRequest request) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("column", columnName);
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
List<Map<String, Object>> result = dianyingxinxiService.selectGroup(params, ew);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
/**
* 总数量
*/
@RequestMapping("/count")
public R count(@RequestParam Map<String, Object> params,DianyingxinxiEntity dianyingxinxi, HttpServletRequest request){
EntityWrapper<DianyingxinxiEntity> ew = new EntityWrapper<DianyingxinxiEntity>();
int count = dianyingxinxiService.selectCount(MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, dianyingxinxi), params), params));
return R.ok().put("data", count);
}
}
获取源码或论文
如需对应的论文或源码,以及其他定制需求,也可以下方微信联系我。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)