项目背景:
在大学四年里,在老师和同学的帮助下学到了很多的知识,但是有时候发现校园的学习氛围不够浓厚,还有时候不知道该学习什么,没有学习方向和目标,期末考试前比较慌,往往没办法做到充足的复习,遇到不会的不知道该问谁,老师不可能只给你一个人解答,也可能不是每次都有时间。学习资料、课件等有时候老师可能忘记上传,或者分散在好几个群不好找,想参加一些学习活动不知道在哪报名。
因此做这样的一个网站就是为了尝试解决上述的一些问题。
需求分析:
毕设最终目标主要包含以下需求:(之后还会有改进和完善)
(1)学习的讨论交流功能。(类似贴吧可以自由讨论)
(2)学习资料等的上传下载、查询和删除。(上传服务已完成)
(3)学习活动的创建、修改、查询和删除。(已完成)
(4)学生外借自己看过的书、借自己需要的书的功能。(已完成)
(5)管理员对普通用户的管理,可以删除不当言论、不当资料,
可以对恶意用户的进行封号等功能。
详述:
活动的创建、图书的借出、资料的上传、问题的发布都会在对应的主页以时间降序排列
且都支持模糊查询等基本功能。支持增删改查,支持表单数据回显。
学习活动是指学生自由组织的线下与学习相关的活动,包括分析、交流、比赛、
复习、答疑、模拟考试等等。
图书的借出采取线上结合线下的形式:书的拥有者在线上把要借出去的书发布出来。
需要的同学在书未借出的状态下可以点击借书,后面2者交换联系方式并进行线下借书。
平台起到图书信息集中的作用,且作为第三方监督的作用。
资料的上传和下载,比如说课件,学习资料,各种文档统一管理,实现全校资源共享。
人人为我,我为人人。
问题的发布这一块就是做一个类似贴吧的简易版,实现其发帖回帖的部分功能。
同学可以在上面自由的讨论学习。
FastDFS简单介绍
FastDFS是一个高性能的分布式文件系统
可以帮助我们存储海量文件,
fastDFS非常适合存储图片等那些小文件,
不像HDFS需要对文件分片存储,
fastDFS不对文件进行分块,所以它就没有分块合并的开销
可以利用FastDFS写上传下载服务,文件上传后会返回一个文件在服务器上的唯一标识符fileId
这样我在便利书的列表时,封面图片的src直接调用http请求
<img src="http://${fileurl}/${book.coverPath}" >
但是这样调用的前提是为FastDFS配置nginx
考虑到服务器成本和现有项目的规模,我只在一台linux服务器上部署配置FastDFS,Tracker和Storage部署在一台机器上
java客户端maven引入FastDFS的依赖,并编写FastDFS的配置文件,指定FastDFS的Tracker的ip:port
nginx 配置:
在项目中关于FastDFS部分代码展示
public String uploadDFS(MultipartFile file) throws IOException, MyException {
//创建TrackerClient
TrackerClient trackerClient = new TrackerClient();
//连接tracker
TrackerServer trackerServer = trackerClient.getConnection();
//获取storage
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
//创建TrackerClient
StorageClient1 storageClient1 = new StorageClient1(trackerServer,storageServer);
byte[] bytes = file.getBytes();
//文件名
String fileName = file.getOriginalFilename();
//文件扩展名
String extName = fileName.substring(fileName.lastIndexOf(".") + 1);
//上传文件
String fileId = storageClient1.upload_file1(bytes, extName, null); //上传成功后得到的id
System.out.println("fileId : "+fileId);
return fileId;
}
上图中的拦截器
是做一层拦截:除了主页,其他页面的访问必须要登陆,如果没有登陆不放行,强制跳转到登陆页面
部分代码展示:
@Configuration
public class SessionConfiguration implements WebMvcConfigurer {
@Autowired
SessionInterceptor sessionInterceptor;
/*
* 注册拦截器
* */
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry
.addInterceptor(sessionInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/")
.excludePathPatterns("/login")
.excludePathPatterns("/toLogin")
.excludePathPatterns("/registry")
.excludePathPatterns("/toRegistry")
.excludePathPatterns("/css/**")
.excludePathPatterns("/js/**")
.excludePathPatterns("/images/**");
}
}
package pers.wmx.learningcenter.web;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author: wang ming xin
* @create: 2019-04-12 10:50
*/
/*
* 登陆拦截器
* */
@Component
public class SessionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object object = request.getSession().getAttribute("nowuser");
if (null == object) {
response.sendRedirect("/login"); //session没值直接跳转至登陆页面
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
成果展示(界面截图)略
说点什么
您将是第一位评论人!