• 基于SSM和Boostrap实现的电影评论网站设计


    目 录
    目 录 I
    摘 要 III
    Abstract IV
    1 绪 论 1
    1.1 研究目的 1
    1.2 发展概况 1
    1.3 开发工具的选择 2
    2 系统分析 6
    2.1 主要功能 6
    2.2 方案论证 6
    2.2.1 设计原理 6
    2.2.2 方案选择 6
    2.3 基本思路 7
    2.3.1 网站UI的思路 7
    2.3.2 获取资源的思路 7
    2.3.3 权限控制思路 7
    2.4 主要问题 7
    2.5 网站要求 8
    3 系统设计 9
    3.1 概要设计 9
    3.2 详细设计 10
    3.2.1 版面设计 10
    3.2.2 功能设计 11
    4 系统实现 12
    4.1 创建系统外观界面 12
    4.2 获取图片功能的实现 12
    4.3 根据条件排序和筛选功能的实现 12
    4.4 基于注解的权限认证 14
    4.5 根据权限来展示界面 16
    4.6 定时更新正在热映电影 18
    4.7 前后端认证 19
    5 系统运行 22
    结束语 27
    致谢 28
    参考文献 29

    2 系统分析
    2.1 主要功能
    1.一共有两个角色:评论人和管理员
    2.评论人可以在网站中进行账号注册
    3.评论人可以对电影进行简短评论、打分
    4.管理员上传电影的画报、各类简介信息
    5.网站根据某种规则自动统计、计算每部电影的分数情况
    6.网站自动生成电影的排行榜
    7.网站可以根据电影的年份或分数情况对电影进行自动排序

    2.2 方案论证

    2.2.1 设计原理

    1.网站界面:在界面上不追求奢华或者繁杂的功能,只追求两个字:“简洁”,通过干净的首页、功能、观看页面,让观看者体会到舒适的观看环境。
    2.功能实现:通过判断登陆权限,以不同的身份登陆到网站,分为网站管理员以及会员。管理员拥有对节目单表的增删改查等操作,并且对网站内电影有简单的处理功能,意在对网站进行管理与维护;会员则区别于游客,登陆会员之后,可以对电影进行影评或与管理员交流等操作。
    3.内容多样:通过管理员对信息的掌握程度以及采集速度的保证,每天进行更新内容的操作,并且通过挑选分类,精心的编排到各个模块。最好是用爬虫自动采集信息。

    2.2.2 方案选择

    1.资源来源:电影的信息一定要有稳定的来源,需要考察豆瓣电影API。
    2.爬取策略:由于电影资源需要定期更新,需要设定爬虫的爬取策略。
    3.自动化处理:对爬虫爬来的数据要进行自动化分类、处理,方便展示在页面上。
    4.评分规则制定:因为电影需要根据评分排序,需要制定一个评分规则。
    5.角色界定:系统需要根据用户不同的角色(访客、普通用户、管理员)来展示不同的界面。
    6.电影分类:需要根据电影年份、类别等分类。
    2.3 基本思路

    2.3.1 网站UI的思路
    UI,对于设计者来说,可以算是最简单的地方;但对于用户一个良好的用户界面非常重要,普通用户根本不会关心你的界面时怎么实现的,他所关心的是UI是否美丽、大方、好看。如果一个网站的UI不好看,本文转载自http://www.biyezuopin.vip/onews.asp?id=14551可能用户根本没有用下去的心思了。本网站使用Bootstrap作为UI框架,简单优美。

    2.3.2 获取资源的思路
    通过豆瓣电影API https://developers.douban.com/wiki/?title=movie_v2 ,制定合适的抓取策略,获得所需要的资源。

    2.3.3 权限控制思路

    网站分为管理员和前台用户,必须得根据权限来展示不同的界面和功能。可以利用Java注解来实现。注解可以看成是一个接口,注解实例就是一个实现了该接口的动态代理类。注解大多是用做对某个类、方法、字段进行说明,标识的。以便在程序运行期间我们通 过反射获得该字段或方法的注解的实例,来决定该做些什么处理或不该进行什么处理。

    package me.veryyoung.movie.web;
    
    import me.veryyoung.movie.entity.User;
    import me.veryyoung.movie.security.AdminRequired;
    import me.veryyoung.movie.security.FreeAccess;
    import me.veryyoung.movie.security.LoginRequired;
    import me.veryyoung.movie.utils.ContextUtils;
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.core.annotation.AnnotationUtils;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.net.URLEncoder;
    
    /**
     * Created by veryyoung on 2015/4/28.
     */
    public class AuthenticationFilter extends HandlerInterceptorAdapter {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            HandlerMethod method = (HandlerMethod) handler;
            FreeAccess freeAccess = method.getMethodAnnotation(FreeAccess.class);
            if (freeAccess != null) {
                return true;
            }
    
            boolean adminRequired = AnnotationUtils.findAnnotation(method.getBean().getClass(), AdminRequired.class) != null
                    || method.getMethodAnnotation(AdminRequired.class) != null;
            boolean loginRequired = AnnotationUtils.findAnnotation(method.getBean().getClass(), LoginRequired.class) != null
                    || method.getMethodAnnotation(LoginRequired.class) != null || adminRequired;
            if (loginRequired && !checkLogin(request)) {
                String url = request.getRequestURI();
                String queryString = request.getQueryString();
                if (StringUtils.isNotEmpty(queryString)) {
                    url = url + "?" + queryString;
                }
    
                url = new String(Base64.encodeBase64(url.getBytes()));
                url = URLEncoder.encode(url);
    
                //如果是ajax请求响应头会有,x-requested-with
                if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
                    response.setHeader("sessionStatus", "timeout");//在响应头设置session状态
                    return false;
                }
    
                response.setStatus(401);
                String redirectUrl = "/login?redirect=" + url;
    
                response.sendRedirect(redirectUrl);
                return false;
            }
    
            if (adminRequired && !checkAdmin(request)) {
                response.setStatus(403);
                response.sendRedirect("/403");
                return false;
            }
    
    
            return true;
        }
    
    
        public boolean checkLogin(HttpServletRequest request) {
            return ContextUtils.getSessionUtils(request).getUser() != null;
        }
    
        public boolean checkAdmin(HttpServletRequest request) {
            User user = ContextUtils.getSessionUtils(request).getUser();
            if (user == null) {
                return false;
            } else {
                return user.isAdmin();
            }
        }
    
    }
    
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类
    弘扬企业家精神!闪马智能创始人兼CEO彭垚再获殊荣
    教你用API插件开发一个AI快速处理图片小助手
    【DELM回归预测】基于matlab多元宇宙优化算法改进深度学习极限学习机数据回归预测【含Matlab源码 2230期】
    EasyExcel的简单读取操作
    基于JAVA西藏民族大学论文管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    算法---矩阵中战斗力最弱的 K 行(Kotlin)
    TiDB Lightning 快速上手
    立创EDA——PCB的布局(四)
    DeepSpeed: 大模型训练框架
  • 原文地址:https://blog.csdn.net/sheziqiong/article/details/127121358