返回作品

电影评论网站

创建于 2025 年 6 月 1 日

标签
  • Spring Boot
  • MyBatis
  • MySQL
  • PageHelper
  • Hutool
  • Vue 3
  • Element Plus

项目介绍

难言之影(painful-movie)是一个仿照豆瓣电影设计理念制作的电影评论网站,采用 Spring Boot + Vue 3 的前后端分离架构。项目暂未挂载云服务器,通过内置 Tomcat 在本地运行:后端服务监听 9090 端口,前端 Vue 工程独立开发,前后端通过 REST 接口通信。

数据模型围绕”电影—评论—用户”三角关系设计:film 表承载电影详情(名称、海报、简介、导演、演员、分类、国家、语言、上映日期、时长、IMDb 编号),comment 表记录用户对某部电影的评分与文字评论,user / admin 表分别对应普通用户与管理员,另有 category(电影分类)与 notice(公告)两张辅助表,共同支撑一个完整的影评社区业务闭环。

项目架构

后端采用经典的 Controller-Service-Mapper 三层结构:8 个 @RestController(Film、Comment、User、Admin、Category、Notice、File、Web)暴露接口,Service 层承载业务逻辑,Mapper 层基于 MyBatis XML 映射与数据库交互,配合 PageHelper 实现分页查询。统一返回 Result 包装体,异常由 GlobalExceptionHandler 与自定义 CustomException 统一兜底,Hutool 提供日期与文件处理等工具能力。数据库为 MySQL(库名 film_comment_system),application.yml 开启了下划线转驼峰映射,前端上传的图片存储在本地 files/ 目录。

前端为 Vue 3 单页应用,基于 Vue Router 组织路由:/login/register 为认证页,Manager.vue 作为主框架承载后台管理页(电影、评论、用户、分类、公告、个人中心等子页面),配合 Element Plus 组件库完成表格、表单与弹窗交互。

核心功能

  • 电影信息管理Film 实体包含 13 个业务字段,管理端可增删改查;FilmMapper.xmlselectAll 通过 left join category 联表带出分类名,并用 <where> + <if> 动态 SQL 实现按电影名模糊匹配(like concat('%', #{name}, '%'))与按分类精确过滤。
  • 评论与评分聚合:评论支持评分(score)与文字内容,type 字段区分短评、长评两种形态;列表查询 left join filmleft join user 联表带出电影名与用户名,可按电影、用户、类型组合筛选。评分由 FilmService.setScore() 实时计算——selectTotal 统计评论条数、selectSum 累加总分,再用 BigDecimal 四舍五入保留一位小数得到平均分,无评论时评分为 0。
  • 排行榜与随机推荐selectRanking 对全部电影逐一计算平均分后按分数降序取前五,驱动首页排行榜;selectRecommend 先从全量电影中排除当前详情页电影,再 Collections.shuffle 打乱顺序取 3 部作为随机推荐。
  • 双角色登录与安全WebController/login 根据请求中的 role 字段将登录分发给 AdminServiceUserService,密码错误、用户不存在均抛出业务异常;同时提供注册与修改密码接口(校验原密码)。
  • 管理后台与文件上传:管理员可维护电影分类、发布公告、管理用户与评论;FileController 支持海报等图片上传,以”时间戳-原文件名”命名落盘到本地 files/ 目录,通过 /files/download/{fileName} 对外提供访问,单文件限制 100MB。

功能截图

暂无运行截图。

快速上手

项目由 springboot 后端工程与 vue 前端工程组成。后端需要本机 MySQL(默认账号 root/root),按 application.yml 中的连接串创建 film_comment_system 数据库并初始化表结构后,通过 Maven 启动 Spring Boot 服务(端口 9090);前端在 vue 目录执行 npm installnpm run dev 即可访问系统。上传的图片会写入后端工程根目录的 files/ 文件夹,可通过 fileBaseUrl 配置调整访问前缀。

总结

难言之影把影评社区最核心的”看电影、打分、写评论、看排行”流程完整落地:评分不是手动维护的静态字段,而是由评论实时聚合而来,数据自洽;排行榜与随机推荐让首页有了内容活力;USER/ADMIN 双角色的登录分发与完整管理后台则补齐了内容治理能力。项目结构清晰、分层规范,MyBatis 动态 SQL 与联表查询、PageHelper 分页、Hutool 工具集的使用都是日常后端开发的典型范式,适合作为学习 Spring Boot + Vue 全栈开发与影评类业务建模的参考案例。