项目名称:知新网在线视频学习网站
项目周期:一个星期
开发环境:SpringToolsuite+Mysql5+Tomcat8.5+SVN+JDK1.8+Bootstrap
项目背景:人们的物质生活快速增长,快节奏的时代下,人们的精神生活日益溃泛。于是,我们组想开发个在线学习网站,成为供大家学习、交流的心灵港湾。喻名意为:温故而知新,可以为师矣。
项目模块划分:用户模块,视频模块,论坛模块,悬赏订单模块,后台管理系统
项目组员:刘杨(组长),郭涛,王综艺,李小龙
技术选型:采用c3p0技术连接数据库,查询出的数据结果,通过service层、controller层传值到jsp页面显示,且前端页面使用Ajax技术实现异步交互
责任描述:
1、 与组员协商基本功能,完善对知新网功能的详细思维导图;
2、统一命名规范准备
3、协助组员完成视频上传的功能实现,优化前端页面的美观性,降低后端代码的冗余度
4、整合项目,调试bug,流畅运行项目所有实现的功能.最后:我们实现了知新网的登陆、注册、用户资料上传修改、在线拍照上传、视频上传播放、论坛发贴评论、悬赏订单在线解疑以及后台管理系统等,
项目系统设计:
- 模板划分
- 系统工作流程
数据库表设计:
- 采用逻辑删除,避免数据的不可恢复性
- 用户表 教师表 用户详细表 课程表 用户学习表 评论表 论坛明细表 订单悬赏表 悬赏订单记录表
课程订单明细 用户收藏表 视频库表
页面设计:
- 使用Bootstrap框架、WebStorm工具
部分页面展示:
-
首页
调用阿里云的短信验证接口,实现手机号登录 -
视频播放页面
采用了文件上传下载技术:导入了fastjson包,采用创建磁盘工厂类DiskFileItemFactory,解析器ServletFileUpload的办法。由于技术有限,上传时速率不够快。
-
后台管理系统:
①采用分页,对数据实现查询分页处理;
②采用table里的每行对应个表单,然后遍历出来,方便管理员直接客观的修改对应数据;
③采用Ajax异步技术
*
部分代码展示:
- 文件上传
// 1.创建磁盘工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
// 内存缓冲区与临时路径的关系, 加载的文件在内存缓冲区不够的情况下
// 把此文件加载进临时存放路径
factory.setSizeThreshold(20 * 1024 * 1024);
// 临时文件存放路径 如果不存在此路径,则创建
File temp = new File("D:/temp");
if (!temp.exists()) {
temp.mkdirs();
}
factory.setRepository(temp);
// 2.创建解析器
ServletFileUpload sfu = new ServletFileUpload(factory);
// 判断表单是否为multipart/form-data
boolean bl = ServletFileUpload.isMultipartContent(request);
try {
// 设置文件的最大字节数
sfu.setFileSizeMax(1024 * 1024); // 超出限定字节 触发异常FileUploadBase$FileSizeLimitExceededException
if (bl) {
// 3.解析request
List<FileItem> list = sfu.parseRequest(request);
// 遍历结果集
System.out.println(list);
for (FileItem item : list) {
// 当前对象是普通表单控件(true)还是文件表单控件(false)
if (item.isFormField()) {
// 控件名
String name = item.getFieldName();
// 得到值
String value = item.getString();
System.out.println("key:" + name + ",value:" + value);
} else {
// 控件名
String name = item.getFieldName();
// 文件名:
String fileName = item.getName();
System.out.println("key:" + name + ",filename:" + fileName);
// 保存文件数据
String path = this.getServletContext().getRealPath("/") + "images\\HeadPortrait";
System.out.println("path"+path);
File root = new File(path);
if (!root.exists()) {
// 上传的根路径不存在则新建
root.mkdirs();
}
// 文件名冲突 D:/image/页码列表处理.jpg
int lastIndex = fileName.lastIndexOf("\\");
if (lastIndex != -1) {
fileName = fileName.substring(lastIndex + 1);
}
// 文件名重写生成
fileName = UUID.randomUUID().toString().replace("-", "") + fileName;
System.out.println("新生成的文件名:" + fileName);
basePath = "images\\HeadPortrait"+"\\"+fileName;
// 开始上传
File load = new File(root, fileName);
item.write(load);
}
- 分页的jsp代码
<p>
<a href="<c:url value='/VideoServlet?method=findAll&pageSize=3'/>"
target="mainFrame">全部视频</a>
</p>
<table border="1" width="100%" cellspacing="0">
<tr>
<th>编号</th>
<th>ID</th>
<th>课程图片</th>
<th>课程名称</th>
<th>课程类型</th>
<th>课程评分</th>
<th>课程价格</th>
<th>课程状态</th>
<th>操作</th>
</tr>
<c:if test="${not empty page}">
<c:if test="${not empty page.list}">
<c:forEach items="${page.list}" var="allList" varStatus="status">
<form action="<c:url value='/VideoServlet?method=updateVideo'/>"
method="post">
<tr>
<td>${status.index+1}</td>
<td><input type="text" value="${allList.courseId}"
name="courseId"
style="border: none; width: 20px;; text-align: center;" /></td>
<td><img src="${allList.courseImage}" width="100"
height="120" /></td>
<td style="width: 20px"><input type="text"
value="${allList.courseName}" name="courseName"
style="border: none; text-align: center;" /></td>
<td><input type="text" value="${allList.courseType}"
name="courseType" style="border: none; text-align: center;" /></td>
<td><input type="text" value="${allList.courseGrade}"
name="courseGrade"
style="border: none; width: 40px; text-align: center;" /></td>
<td><input type="text" value="${allList.coursePrice}"
name="coursePrice"
style="border: none; width: 180px; text-align: center;" /></td>
<td><input type="text" value="${allList.courseStatus}"
name="courseStatus"
style="border: none; width: 10px; text-align: center;" /></td>
<td><input type="submit" value="修改" /></td>
</tr>
</form>
</c:forEach>
</c:if>
</c:if>
<c:if test="${not empty page}">
<p>
当前:${page.currentPageNo}|总${page.countPage}页 <a
href="<c:url value='/VideoServlet?method=findAll&pageSize=3¤tPageNo=1'/>">首页</a>
<c:if test="${page.currentPageNo!=1}">
<a
href="<c:url value='/VideoServlet?method=findAll&pageSize=3¤tPageNo=${page.currentPageNo-1}'/>">上一页</a>
</c:if>
<c:if test="${page.currentPageNo!=page.countPage}">
<a
href="<c:url value='/VideoServlet?method=findAll&pageSize=3¤tPageNo=${page.currentPageNo+1}'/>">下一页</a>
</c:if>
<a
href="<c:url value='/VideoServlet?method=findAll&pageSize=3¤tPageNo=${page.countPage}'/>">尾页</a>
</p>
</c:if>
</table>
dao层接口方法
/**
* 将用户输入的信息添加到个人中心的我的主页
*
* @param userDetailId用户表id
* @param userId用户明细表
* @return UserDetail用户详情表对象
*/
UserDetail addMyHomepage(int userDetailId, UserDetail userId);
/**
* 修改密码的方法
*
* @param oldPassword
* @param password
* @param userId 用户表的id
* @return 是否修改成功
*/
boolean updatePwd(String oldPassword, String password, int userId);
/**
* 根据用户表id查找明细表
*
* @param userOfId
* @return UserDetail
*/
UserDetail selectUserDetailByUId(int userOfId);
更多内容,请点击下方:
My Blog: http://coderblue.cn/
Github:https://github.com/onecoderly
My Project:http://coderblue.cn/project/