博主介绍:专注于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 数据库表设计
当电影推荐系统在运行的时候,数据库要能确保自己的独立性,想要哪部分的数据就选择相应的设置选项,对应的数据就会以表格的形式展现出来。当对这一个功能进行设置,他就会与数据库进行连接,会在对话框中弹出相应的数据源。
| daily_movie | |||||
| 字段名称 | 类型 | 长度 | 不是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每日电影界面图
大家点赞、收藏、关注、评论啦 其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者










![[Go语言快速上手]初识Go语言](https://i-blog.csdnimg.cn/direct/4f8f65315de74021b6520bcac49affca.png)








