目 录
目 录 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();
}
}
}