博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了1400+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
文末有源码下载地址
系统实现预览
第4章 架构设计
4.1 系统体系结构
电影推荐系统的结构图4-1所示:
图4-1 系统结构
登录系统结构图,如图4-2所示:
图4-2 登录结构图
系统结构图,如图4-3所示:
图4-3 系统结构图
4.2 数据库实体设计
数据库的功能就是对系统中所有的数据进行存储和管理。所有的数据可以在数据库中产时间的进行存储,方便用户的使用。而且所有的数据库中的数据也应该具有一定的共享性,任何的系统可以对一些数据进行使用,同时还应该保持一定的独立性,每一个数据库中的数据都有很强的安全性,可以被很好的存放到数据库,没有进行身份的验证是不能对这些数据进行查看和使用的。数据库的设计需要明确每一个实体之间的联系,系统的E-R图如下图所示:
图4-4用户管理实体属性图
电影信息管理实体属性图如图4-5所示。
图4-5电影信息管理实体属性图
4.3 数据库表设计
当电影推荐系统在运行的时候,数据库要能确保自己的独立性,想要哪部分的数据就选择相应的设置选项,对应的数据就会以表格的形式展现出来。当对这一个功能进行设置,他就会与数据库进行连接,会在对话框中弹出相应的数据源。
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
daily_movie_id |
int |
11 |
否 |
主键 |
每日电影ID |
movie_title |
varchar |
64 |
是 |
电影名称 |
|
alias |
varchar |
64 |
是 |
别名 |
|
director |
varchar |
64 |
是 |
导演 |
|
screenwriter |
varchar |
64 |
是 |
编剧 |
|
performer |
varchar |
64 |
是 |
演员 |
|
type |
varchar |
64 |
是 |
类型 |
|
country |
varchar |
64 |
是 |
国家 |
|
language |
varchar |
64 |
是 |
语言 |
|
particular_year |
varchar |
64 |
是 |
年份 |
|
film_length |
varchar |
64 |
是 |
片长 |
|
release_time |
varchar |
64 |
是 |
上映时间 |
|
official_website |
varchar |
255 |
是 |
官方网站 |
|
idmb_link |
varchar |
255 |
是 |
IDMB链接 |
|
idmb_score |
varchar |
64 |
是 |
IDMB评分 |
|
douban_score |
varchar |
64 |
是 |
豆瓣评分 |
|
awards |
varchar |
64 |
是 |
获奖情况 |
|
movie_poster |
varchar |
255 |
是 |
影片海报 |
|
similar_film_recommendation |
varchar |
64 |
是 |
相似电影推荐 |
|
plot |
text |
0 |
是 |
剧情 |
|
hits |
int |
11 |
否 |
点击数 |
|
praise_len |
int |
11 |
否 |
点赞数 |
|
recommend |
int |
11 |
否 |
智能推荐 |
|
create_time |
datetime |
0 |
否 |
创建时间 |
|
update_time |
timestamp |
0 |
否 |
更新时间 |
|
forum |
|||||
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
forum_id |
mediumint |
8 |
否 |
主键 |
论坛id |
display |
smallint |
5 |
否 |
排序 |
|
user_id |
mediumint |
8 |
否 |
用户ID |
|
nickname |
varchar |
16 |
是 |
昵称 |
|
praise_len |
int |
10 |
是 |
点赞数 |
|
hits |
int |
10 |
否 |
访问数 |
|
title |
varchar |
125 |
否 |
标题 |
|
keywords |
varchar |
125 |
是 |
关键词 |
|
description |
varchar |
255 |
是 |
描述 |
|
url |
varchar |
255 |
是 |
来源地址 |
|
tag |
varchar |
255 |
是 |
标签 |
|
img |
text |
0 |
是 |
封面图 |
|
content |
longtext |
0 |
是 |
正文 |
|
create_time |
timestamp |
0 |
否 |
创建时间 |
|
update_time |
timestamp |
0 |
否 |
更新时间 |
|
avatar |
varchar |
255 |
是 |
发帖人头像 |
|
type |
varchar |
64 |
否 |
论坛分类 |
|
forum_type |
|||||
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
type_id |
smallint |
5 |
否 |
主键 |
分类ID |
name |
varchar |
16 |
否 |
分类名称 |
|
description |
varchar |
255 |
是 |
描述 |
|
url |
varchar |
255 |
是 |
外链地址 |
|
father_id |
smallint |
5 |
否 |
上级分类 |
|
icon |
varchar |
255 |
是 |
分类图标 |
|
create_time |
timestamp |
0 |
否 |
创建时间 |
|
update_time |
timestamp |
0 |
否 |
更新时间 |
|
high_score_film |
|||||
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
high_score_film_id |
int |
11 |
否 |
主键 |
高分电影ID |
movie_title |
varchar |
64 |
是 |
电影名称 |
|
alias |
varchar |
64 |
是 |
别名 |
|
director |
varchar |
64 |
是 |
导演 |
|
screenwriter |
varchar |
64 |
是 |
编剧 |
|
performer |
varchar |
64 |
是 |
演员 |
|
type |
varchar |
64 |
是 |
类型 |
|
country |
varchar |
64 |
是 |
国家 |
|
language |
varchar |
64 |
是 |
语言 |
|
particular_year |
varchar |
64 |
是 |
年份 |
|
film_length |
varchar |
64 |
是 |
片长 |
|
release_time |
varchar |
64 |
是 |
上映时间 |
|
official_website |
varchar |
255 |
是 |
官方网站 |
|
idmb_link |
varchar |
255 |
是 |
IDMB链接 |
|
idmb_score |
varchar |
64 |
是 |
IDMB评分 |
|
douban_score |
varchar |
64 |
是 |
豆瓣评分 |
|
awards |
varchar |
64 |
是 |
获奖情况 |
|
movie_poster |
varchar |
255 |
是 |
影片海报 |
|
similar_film_recommendation |
varchar |
64 |
是 |
相似电影推荐 |
|
plot |
text |
0 |
是 |
剧情 |
|
hits |
int |
11 |
否 |
点击数 |
|
praise_len |
int |
11 |
否 |
点赞数 |
|
recommend |
int |
11 |
否 |
智能推荐 |
|
create_time |
datetime |
0 |
否 |
创建时间 |
|
update_time |
timestamp |
0 |
否 |
更新时间 |
|
ordinary_users |
|||||
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
ordinary_users_id |
int |
11 |
否 |
主键 |
普通用户ID |
user_number |
varchar |
64 |
否 |
用户编号 |
|
user_name |
varchar |
64 |
是 |
用户姓名 |
|
user_gender |
varchar |
64 |
是 |
用户性别 |
|
examine_state |
varchar |
16 |
否 |
审核状态 |
|
recommend |
int |
11 |
否 |
智能推荐 |
|
user_id |
int |
11 |
否 |
用户ID |
|
create_time |
datetime |
0 |
否 |
创建时间 |
|
update_time |
timestamp |
0 |
否 |
更新时间 |
|
popular_movies |
|||||
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
popular_movies_id |
int |
11 |
否 |
主键 |
热门电影ID |
movie_title |
varchar |
64 |
是 |
电影名称 |
|
alias |
varchar |
64 |
是 |
别名 |
|
director |
varchar |
64 |
是 |
导演 |
|
screenwriter |
varchar |
64 |
是 |
编剧 |
|
performer |
varchar |
64 |
是 |
演员 |
|
type |
varchar |
64 |
是 |
类型 |
|
country |
varchar |
64 |
是 |
国家 |
|
language |
varchar |
64 |
是 |
语言 |
|
particular_year |
varchar |
64 |
是 |
年份 |
|
film_length |
varchar |
64 |
是 |
片长 |
|
release_time |
varchar |
64 |
是 |
上映时间 |
|
official_website |
varchar |
255 |
是 |
官方网站 |
|
idmb_link |
varchar |
255 |
是 |
IDMB链接 |
|
idmb_score |
varchar |
64 |
是 |
IDMB评分 |
|
douban_score |
varchar |
64 |
是 |
豆瓣评分 |
|
awards |
varchar |
64 |
是 |
获奖情况 |
|
movie_poster |
varchar |
255 |
是 |
影片海报 |
|
similar_film_recommendation |
varchar |
64 |
是 |
相似电影推荐 |
|
plot |
text |
0 |
是 |
剧情 |
|
hits |
int |
11 |
否 |
点击数 |
|
praise_len |
int |
11 |
否 |
点赞数 |
|
recommend |
int |
11 |
否 |
智能推荐 |
|
create_time |
datetime |
0 |
否 |
创建时间 |
|
update_time |
timestamp |
0 |
否 |
更新时间 |
|
praise |
|||||
字段名称 |
类型 |
长度 |
不是null |
主键 |
字段说明 |
praise_id |
int |
10 |
否 |
主键 |
点赞ID |
user_id |
int |
11 |
否 |
点赞人 |
|
create_time |
timestamp |
0 |
否 |
创建时间 |
|
update_time |
timestamp |
0 |
否 |
更新时间 |
|
source_table |
varchar |
255 |
是 |
来源表 |
|
source_field |
varchar |
255 |
是 |
来源字段 |
|
source_id |
int |
10 |
否 |
来源ID |
|
status |
tinyint |
1 |
否 |
点赞状态1为点赞,0已取消 |
第5章 系统实现
5.1 系统功能模块
电影推荐系统,在系统的首页可以查看首页、影片交流、公告栏、影片资讯、每日电影、高分电影、热门电影、我的跳转到后台等信息进行相关操作,如图5-1所示。
图5-1系统首页界面图
核心系统类
package com.project.demo.controller.base;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.project.demo.service.base.BaseService;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*/
@Slf4j
public class BaseController<E, S extends BaseService<E>> {
@Setter
protected S service;
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}
@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
return success(1);
}
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
Query select = service.select(service.readQuery(request), service.readConfig(request));
List resultList = select.getResultList();
if (resultList.size() > 0) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("obj",resultList.get(0));
return success(jsonObject);
} else {
return success(null);
}
}
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping("/list_group")
public Map<String, Object> listGroup(HttpServletRequest request) {
Map<String, Object> map = service.selectToList(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping("/bar_group")
public Map<String, Object> barGroup(HttpServletRequest request) {
Map<String, Object> map = service.selectBarGroup(service.readQuery(request), service.readConfig(request));
return success(map);
}
@RequestMapping(value = {"/count_group", "/count"})
public Map<String, Object> count(HttpServletRequest request) {
Query count = service.count(service.readQuery(request), service.readConfig(request));
return success(count.getResultList());
}
@RequestMapping(value = {"/sum_group", "/sum"})
public Map<String, Object> sum(HttpServletRequest request) {
Query count = service.sum(service.readQuery(request), service.readConfig(request));
return success(count.getResultList());
}
@RequestMapping(value = {"/avg_group", "/avg"})
public Map<String, Object> avg(HttpServletRequest request) {
Query count = service.avg(service.readQuery(request), service.readConfig(request));
return success(count.getResultList());
}
@PostMapping("/upload")
public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {
log.info("进入方法");
if (file.isEmpty()) {
return error(30000, "没有选择文件");
}
try {
//判断有没路径,没有则创建
String filePath = System.getProperty("user.dir") + "\\target\\classes\\static\\upload\\";
File targetDir = new File(filePath);
if (!targetDir.exists() && !targetDir.isDirectory()) {
if (targetDir.mkdirs()) {
log.info("创建目录成功");
} else {
log.error("创建目录失败");
}
}
// String path = ResourceUtils.getURL("classpath:").getPath() + "static/upload/";
// String filePath = path.replace('/', '\\').substring(1, path.length());
String fileName = file.getOriginalFilename();
File dest = new File(filePath + fileName);
log.info("文件路径:{}", dest.getPath());
log.info("文件名:{}", dest.getName());
file.transferTo(dest);
JSONObject jsonObject = new JSONObject();
jsonObject.put("url", "/api/upload/" + fileName);
return success(jsonObject);
} catch (IOException e) {
log.info("上传失败:{}", e.getMessage());
}
return error(30000, "上传失败");
}
@PostMapping("/import_db")
public Map<String, Object> importDb(@RequestParam("file") MultipartFile file) throws IOException {
service.importDb(file);
return success(1);
}
@RequestMapping("/export_db")
public void exportDb(HttpServletRequest request, HttpServletResponse response) throws IOException {
HSSFWorkbook sheets = service.exportDb(service.readQuery(request), service.readConfig(request));
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment;filename=employee.xls");
response.flushBuffer();
sheets.write(response.getOutputStream());
sheets.close();
}
public Map<String, Object> success(Object o) {
Map<String, Object> map = new HashMap<>();
if (o == null) {
map.put("result", null);
return map;
}
if (o instanceof List) {
if (((List) o).size() == 1) {
o = ((List) o).get(0);
map.put("result", o);
}else {
String jsonString = JSONObject.toJSONString(o);
JSONArray objects = service.covertArray(JSONObject.parseArray(jsonString));
map.put("result", objects);
}
} else if (o instanceof Integer || o instanceof String) {
map.put("result", o);
} else {
String jsonString = JSONObject.toJSONString(o);
JSONObject jsonObject = JSONObject.parseObject(jsonString);
JSONObject j = service.covertObject(jsonObject);
map.put("result", j);
}
return map;
}
public Map<String, Object> error(Integer code, String message) {
Map<String, Object> map = new HashMap<>();
map.put("error", new HashMap<String, Object>(4) {{
put("code", code);
put("message", message);
}});
return map;
}
}
用户注册,在用户注册页面可以填写账号、密码、姓名、昵称、手机等信息进行注册操作,如图5-2所示。在个人中心页面可以填写学号、密码、手机等信息进行更新操作,如图5-3所示。
图5-2学生注册界面图
图5-3个人中心界面图
新闻信息,在新闻信息页面中可以查看新闻信息标题、新闻信息名称、图片、新闻内容、发布时间、账号、社长姓名等信息,如图5-4所示。
图5-4新闻信息界面图
电影信息,在电影信息页面可以查看电影名称、别名、导演、编剧、演员、类型、语言、国家等信息进行添加,如图5-5所示。
图5-5电影信息界面图
5.2 用户功能模块
用户登录进入系统后台可以对首页、影片交流、公告栏、影片资讯、每日电影、高分电影、热门电影、我的等信息进行相应的操作管理,如图5-6所示。
图5-6用户功能界面图
每日电影列表,在每日电影页面中可以查看电影名称、类型、年份、豆瓣评分等信息,如图5-7所示。
图5-7每日电影界面图
大家点赞、收藏、关注、评论啦 其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者