博主介绍:专注于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每日电影界面图
大家点赞、收藏、关注、评论啦 其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者