基于 Java 和 MySQL 的精品课程网站

基于 Java 和 MySQL 的精品课程网站设计与实现

一、 毕业设计(论文)任务书

摘要:近年来,教育信息化发展十分迅猛,人们的教育观念、教育手段、学习方法、学习渠道等等都发生了重大的变化。知识性人才也已经日益成为了一个国家繁荣昌盛和民族伟大振兴的决定性因素和强大资源后盾。

远程教育这一基于日益发达的计算机技术和早已大规模普及的通讯技术的现代教育方式,正以其自身强大优势,成为现代教育的一个亮点和重点。在传统的教育教学模式中,授课老师通过面授,直接进行教学活动,学生只能在课堂上学习知识。然而教学活动不仅受到了时间的限制同时也受到了空间束缚,师生之间不能及时的进行交流、问题得不到及时的解决,甚至还存在教育资源紧缺不能共享等问题。得益于信息技术的支持与发展及问题急于解决的紧迫性,在线学习类系统的开发与实现成为了必要趋势。

基于与 Java 和 MySQL 的精品课程网站以 JSP、Servlet 和 Java Bean 为基础,采用 MySQL 数据库及 Tomcat 服务器技术进行网站设计和开发。首先对相关的 Java Web 成功案例进行学习,再根据师生的使用需求,对精品课程网进行详细的系统需求分析,然后根据分析结果设计功能、处理逻辑、编写模块代码。

经过多次分析及测试,最终表明基于与 Java 和 MySQL 的精品课程网站可稳定运行,符合师生的使用需求,且用户体验良好,具有一定的价值效益。

关键词:Java Web  课程网  在线学习

二、前言

背景

人类自从进入 21 世纪,科学技术飞速发展,知识经济初见端倪。一个国家综合国力的竞争更主要地体现在了国民素质和人才资源上,而人才的培养,关键在于教育。当下的社会将对劳动者们有着前所未有的高要求,这讲使得教育目标发生了本质上的变化。终身学习和继续教育成为了社会生活中必不可少的需求。在任何时间任何地点都可以接受所需的教育是未来教育的根本目标。

在市场日益繁荣,经济文化空前发展的今天,现有的教育模式根本无法满足人们教育学习的需求。因此,培养现代化建设的高素质人才,使有限的教育资源得到充分合理利用的任务刻不容缓。

在这种现状下,我国迫切需要采取某种技术手段,充分利用各种资源,增强教育普及、缩小城乡差距,培育现代化创新性人才,从而构建一个终身学习的体系。

国内外研究概况及发展趋势

在国外,网络教学的发展较国内更加迅速,除了普及广泛外,已经向更高层次的应用和标准化方面发展。信息化的网络教学和学习方式已经成为了一种趋势,并即将成为教学教育活动的主流。

以美国为例,美国是目前通过网络进行教育规模最大的国家。近年来,美国高校通过网络进行远程教育,课程建设快速发展,达到了十多万种。其中本科课程 3.5 万种,研究生课程 1.4 万种,非学历学位课程包括各种知识普及课程 6 万多种。所有的教学活动和教育管理都是通过网络教学技术实现的,网络教学技术几乎成为了广大学员获取知识和相关技能的主要途径。

在国内,关于教学信息化我国已有一些网络教学平台,如:软酷网、尔雅课程网、网易公开课等,它们都为我们提供了良好的学习平台。如今,网络已基本普及到全国各大中小城市,而网络教育资源仍不是很丰富,因此在未来,我国的网上教育平台的建设将有很大的前景。要提高我国网络教学水平,必须注重网络教育的教学设计,提供更多在线教育平台,加强适应个性化教学,加强资源库的标准化建设。

研究意义

由于现有教学资源的复杂多样,各种不同属性教学资源纷繁复杂,不易于管理与利用。为了更加有效地建设教学资源库,使得各项教育资源可以得到充分的利用和有效地管理,增强师生之间的交流,提高学生的自我学习能力,在线教育系统的探索与研究十分必要。

基于 Java 和 MySQL 的精品课程网站,其主要目的是为了提供一个全新的学习、教育、交流平台。它服务于不同层次的需求者和使用者。用户可反复观看视频进行深入学习;学生可以通过登录网站进行相应课程的学习,可以在线进行测试,且能立即查看分数与错题,及时复习并提高学习效率,还可以在网上进行留言提问,跟大家一起交流。教师可以让同学们直接在网上提交作业,还可以通过该平台直接获取作业的提交情况。

这样的网站为教师教学、学生自学及普通浏览的游客提供了优质、高效的服务。在提高教育质量、扩大教育规模、缓解教育资源紧张等方面存在重大意义。

可行性分析

基于 Java 和 MySQL 的精品课程网站,使用上满足了教育资源共享、在线测试、在线提交作业等各项需求,实现了教师和学生之间的信息交流;管理上,管理员可发布公告方便于让登入网站的用户及时了解到公布的重要信息,也可以对用户帐号进行相应管理,操作简单便于维护;技术上,使用 JSP、servlet、AJAX、jstl、jQuery 等开源技术进行实现,资料丰富,编写相对简单。

需求分析

功能分析

在传统的学习过程中很都学生都反应枯燥无味,课堂上学习的知识很快就会忘记,问题也得不到及时的解决。同学们总是推迟提交作业,学生越多老师越难统计作业提交情况。因此,基于 Java 和 MySQL 的精品课程网站应帮助用户提高学习兴趣,实现高效率的教育教学。

综上所述,为满足所需人群的要求,可将角色分为普通游客、学生、教师、管理员四种,不同的角色有不同的使用权限。普通游客只能浏览网站中的视频,学生用户则还可以在此平台进行测试、下载资料、留言讨论、提交作业等,教师用户可在线出题、上传资料等,管理员可以对用户进行管理,也可以发布公告。

模块分析

  • 用户注册模块:普通游客只能浏览首页或进入课程中心观看视,但可通过此功能注册成为本站的学生用户,获得更多使用权限。
  • 用户登录模块:登录用户可进入其他内置页面,通过判断角色来显示相应的功能。管理员登录与其他用户登录页面分开。
  • 在线测试模块:只有学生用户可进入,实现试卷查询(根据试卷关键字查询试卷)、生成试卷(题库中随机抽取题目自动生成试卷)、试题批改(提交答案后显示相应分数)等功能。
  • 师生互动模块:实现主题查询(根据主题关键字查询留言)、科目查询(根据科目类型查询留言)、创建留言、回复留言等功能。
  • 今日作业模块:学生用户进入模块,实现作业查询(根据科目及作业布置日期查询提交过的作业)、作业下载(下载之前已提交过的作业)、提交作业(选择完科目、任课教师、布置日期信息后上传作业文档)等功能。教师用户进入模块,显示最近一次布置日期的作业提交情况(展示科目、提交人数、未提交人姓名),可根据科目及具体布置日期查询详细作业提交情况,可下载相应的作业。
  • 资料下载模块:学生用户进入模块,实现资料查询(根据关键词查询相应资料)、资料下载等功能。教师用户进入模块,实现资料查询、资料下载、我的上传(显示本人已上传文件列表,可进行删除或下载操作)、上传文件等功能。
  • 在线出题模块:只有教师用户可进入,实现题目查询(根据关键字查询自己所出的题目)、题目修改、题目删除、题目添加功能。
  • 用户管理模块:只有管理员用户可进入,实现查询用户(根据用户名查询)、冻结用户、初始化密码、添加教师用户等功能。
  • 公告管理模块:只有管理员用户可进入,实现发布公告、查询公告、删除公告等功能。

概要设计

结构模块图描述

数据库结构设计

  • 关系模型
  • 用户表(用户 id、帐号、密码、姓名、科目、学校、角色、删除标识、注册时间)
  • 题目表(题目 id、科目、题目标题、选项 A、选项 B、选项 C、选项 D、正确答案、困难度、更新时间、用户 id)
  • 用户答案表(答案 id、用户 id、试卷 id、用户答案、创建时间)
  • 试卷表(试卷 id、试卷题目、题目答案、用户 id、科目、困难度、创建时间)
  • 作业表(作业 id、科目、布置时间、提交时间、用户 id、接受人姓名、作业文件名字)
  • 留言表(留言 id、留言主题、科目、内容、用户 id、创建时间)
  • 回复表(回复 id、留言 id、用户 id、回复内容、回复时间)
  • 上传表(上传 id、用户 id、科目、标题、大小、存储路径、上传时间、文件后缀、删除标记)
    数据字典

字段名称

数据类型

长度

允许为空

默认值

描述

u_id

int

11

N

用户 id,主键自增

username

varchar

20

Y

NULL

帐号

password

varcahr

20

Y

NULL

密码

name

varchar

20

Y

NULL

姓名

subject

varchar

30

Y

NULL

科目

school

varchar

30

Y

NULL

学校

role

int

11

Y

NULL

角色   管理员:1 教师:2;学生:3

del

int

2

Y

1

删除标识 冻结:0 正常:1

create_time

varchar

20

Y

NULL

注册时间

表 3-2-1 用户表(user)

字段名称

数据类型

长度

允许为空

默认值

描述

t_id

int

11

N

题目 id,主键自增

subject

varchar

30

Y

NULL

科目

title

varcahr

500

Y

NULL

题目标题

optiona

varchar

200

Y

NULL

选项 a

optionb

varchar

200

Y

NULL

选项 b

optionc

varchar

200

Y

NULL

选项 c

optiond

varchar

200

Y

NULL

选项 d

answer

varchar

10

Y

NULL

正确答案

difficulty

varchar

10

Y

NULL

困难度

update_time

varchar

20

Y

NULL

更新时间

u_id

int

11

Y

NULL

用户 id,对应用户表(user)

表 3-2-2 题目表(topic)

字段名称

数据类型

长度

允许为空

默认值

描述

upload_id

int

11

N

上传 id,主键自增

u_id

int

11

N

NULL

用户 id,对应用户表(user)

subject

varchar

30

Y

NULL

资料相关科目

title

varchar

100

Y

NULL

资料标题

size

varchar

10

Y

NULL

文件大小

path

varchar

200

Y

NULL

文件存储路径

upload_time

varchar

20

Y

NULL

上传时间

ext

varchar

5

Y

NULL

文件后缀

del

int

2

Y

1

删除标记  正常:1 删除:0

表 3-2-3 上传表(upload)

字段名称

数据类型

长度

允许为空

默认值

描述

test_id

varchar

100

N

试卷 id,主键自增

alltopic

varchar

100

Y

NULL

该试卷的全部题目

allanswer

varcahr

100

Y

NULL

该试卷全部题目的答案

u_id

int

11

Y

NULL

用户 id,对应用户表(user)

subject

varchar

30

Y

NULL

科目

difficulty

varchar

10

Y

NULL

困难度

create_time

varchar

20

Y

NULL

创建时间

表 3-2-4 试卷表(test)

字段名称

数据类型

长度

允许为空

默认值

描述

h_id

int

11

N

作业 id,主键自增

subject

varchar

30

Y

NULL

科目

give_time

varcahr

20

Y

NULL

作业布置时间

submit_time

varchar

20

Y

NULL

提交时间

u_id

int

11

Y

NULL

用户 id,对应用户表(user)

consignee

varchar

20

Y

NULL

接收人姓名

filename

varchar

100

Y

NULL

作业存储后的名字

表 3-2-5 作业表(homework)

字段名称

数据类型

长度

允许为空

默认值

描述

a_id

int

11

N

答案 id,主键自增

u_id

int

11

Y

NULL

用户 id,对应用户表(user)

test_id

varcahr

100

Y

NULL

试卷 id,对应试卷表(test)

myanswer

varchar

100

Y

NULL

用户的答案

create_time

varchar

200

Y

NULL

创建时间

表 3-2-6 用户答案表(answer)

字段名称

数据类型

长度

允许为空

默认值

描述

bbs_id

int

11

N

留言 id,主键自增

title

varchar

100

Y

NULL

留言主题

subject

varcahr

30

Y

NULL

科目

content

varchar

2000

Y

NULL

内容

u_id

int

11

Y

NULL

用户 id,对应用户表(user)

create_time

varchar

20

Y

NULL

创建时间

表 3-2-7 留言表(bbs)

字段名称

数据类型

长度

允许为空

默认值

描述

reply_id

int

11

N

回复 id,主键自增

bbs_id

int

11

Y

NULL

留言 id,对应留言表(bbs)

u_id

int

11

Y

NULL

用户 id,对应用户表(user)

content

varchar

500

Y

NULL

回复内容

create_time

varchar

20

Y

NULL

回复时间

表 3-2-8 回复表(reply)

模块流程图

登录与注册

题目管理

师生互动

在线测试

我的上传

收取作业

详细设计

任务概述

基于 Java 和 MySQL 的精品课程网站设计与实现由两位同学共同完成。程序的实现主要可分为数据库设计、前端页面设计、后台模块数据提取、前后台数据交互四个部分。其中数据库设计及前后台数据交互由两人共同讨论完成,本人则主要负责后台代码块的实现,从数据库中提取所需数据。

开发环境

  • 操作系统:Windows 7
  • 开发平台:MyEclipse10
  • 数据库:MySQL
  • Java Web 服务器:apache-tomcat-6.0.29
  • Java 语言的软件开发工具包:jdk1.7.0_45

代码模式结构

业务逻辑层(biz)

类名

描述

IBbsBiz

留言业务逻辑接口类

IHomeWorkBiz

作业业务逻辑接口类

IPostBiz

公告业务逻辑接口类

ITestBiz

试卷业务逻辑接口类

ITopicBiz

试题业务逻辑接口类

IUpDownBiz

上传下载业务逻辑接口类

IUserBiz

用户业务逻辑接口类

impl

包(用来存储对应的业务逻辑实现类)

  • IBbsBiz(留言业务逻辑接口类):

创建新帖:

public boolean createBbs(String title, String subject, String content, 	 int u_id) ;

查询单条留言内容:

public Bbs selDanBbs(int bbs_id);

添加回复:

public boolean addReply( int u_id,int bbs_id,String content);

查询多条留言:

public List<Bbs> selBbs(String sql);

查询留言下所有回复:

public List<Reply> selReply(int bbs_id);

查询留言个数:

public int countBbs(String sql);
  • IHomeWorkBiz(作业业务逻辑接口类):

查询作业列表:

public List<HomeWork> selHomeWork(String sql);

提交作业:

public boolean addHomeWork(String subject, String give_time, int u_id,String consignee, String filename);

提交作业人数:

public int countCollect(String sql);

未提交人列表:

public List<User> weiUsers(String sql);
  • IPostBiz(公告业务逻辑接口类):

发布公告:

public boolean fbPost(String title, String content);

删除公告:

public boolean delPost(int post_id);

查询公告列表:

public List<Post> selPost(String sql);

查询单个公告详情:

public Post selPost(int post_id);
  • ITestBiz(试卷业务逻辑接口类):

查询试卷科目:

public List<Topic> selTopic(String sql);

生成试卷,存入试卷表:

public boolean createTest( String test_id,int u_id,List<Topic> 	topicLists);

将我的答案插入答案表:

public boolean addAnswer( String test_id,String myanswer,int u_id);

查找单个试卷对象:

public Test selDanTest(String sql);
  • ITopicBiz(公告业务逻辑接口类):

添加题目:

public boolean addTopic(String subject, String title, String optiona,String optionb, String optionc, String optiond, String answer,String difficulty, int u_id);

删除题目:

public boolean delTopic(int t_id);

修改题目:

public boolean updateTopic(int t_id, String subject, String title,String optiona, String optionb, String optionc, String optiond,String answer, String difficulty) ;

根据题目关键字,查询题目:

public List<Topic> selTopic(String sql,String title) ;

查询所有题目:

public List<Topic> selTopic(String sql,int u_id,int pageIndex,int 	pageSize);

查询题目个数:

public int countTopic(String sql) ;

按查询单个题目:

public Topic selOneTopic(String sql,int t_id);
  • IUpDownBiz(上传下载业务逻辑接口类):

上传文件:

public boolean upFile(String subject, String title, String path,String ext, int u_id, String size) ;

查询所有文件:

public List<Upload> selUpload(String sql) ;

删除文件:

public boolean delUpload(int upload_id);

查询文件个数:

public int countUpload(String sql);
  • IUserBiz(用户业务逻辑接口类):

用户注册:

public boolean register(String userName, String password, String name,String school);

根据帐号密码查询用户,返回用户(判断登录):

public User login(String sql);

添加教师用户:

public boolean addTeacher(String username, String password, String 	 name,String school, String subject);

根据查询单个用户:

public User selUser(String sql);

冻结用户:

public boolean delUser(String userName, int d);

初始化密码:

public boolean cshPassword(String userName);

查询帐号是否已存在:

public boolean cxzh(String userName);

修改密码:

public boolean updatepsw(String userName, String yuan,String xinpsw);

数据访问层(dao)

类名

描述

IBbsDao

留言数据访问接口类

IHomeWorkDao

作业数据访问接口类

IPostDao

公告数据访问接口类

ITestDao

试卷数据访问接口类

ITopicDao

试题数据访问接口类

IUpDownDao

上传下载数据访问接口类

IUserDao

用户数据访问接口类

impl

包(用来存储对应的数据访问实现类)

数据实体层(model)

类名

描述

Answer

答案实体类

Bbs

留言实体类

HomeWork

作业实体类

Post

公告实体类

Reply

回复实体类

Test

试卷实体类

Topic

试题实体类

Upload

上传文件实体类

User

用户实体类

控制层(servlet)

类名

描述

BbsServlet

师生互动模块逻辑控制

CollectWorkServlet

收集作业模块逻辑控制

HomeWorkServlet

今日作业模块逻辑控制

LoginServlet

登录注册模块逻辑控制

PostServlet

公告管理模块逻辑控制

TestServlet

在线测试模块逻辑控制

TopicServlet

在线出题模块逻辑控制

UploadServlet

上传下载模块逻辑控制

UserServlet

用户管理模块逻辑控制

过滤器(filter)

类名

描述

BackFilter

后台管理页面过滤

LoginFilter

精品课程网页面过滤

工具包(util)

类名

描述

DBUtils

数据库操作工具类

DownFile

下载文件方法类

获得连接:

public static Connection getConn();

关闭链接释放资源:

private static void close(ResultSet rs, PreparedStatement pst,Connection conn);

增删改:

public static int update(String sql, Object... objs);

查询结果为一条:

public static <T> T query(String sql,Class<T> t,Object...objs);

查询一个字段的数据:

public static Object selOne(String sql,Object...objs);

查询数量:

public static int count(String sql,Object...objs);

查询结果为多条:

public static <T> List<T> queryList(String sql,Class<T>t,Object...objs);

resultset 转换 MAP:

private static Map<String,Object> rsToMap(ResultSet rs);

把 Map 转化为 bean 对象:

private static <T> T mapToBean(Class<T> t,Map<String,Object> map);

模块功能的实现

登录与注册

  • 用户注册:
String userName=request.getParameter("userName");
String school=request.getParameter("school");
String name=request.getParameter("name");
String password=request.getParameter("psd");
if(ub.register(userName, password, name, school)) {u.setUserName(userName);setPassword(password);setSchool(school);setName(name);setRole(3);session.setAttribute("user", u);//把名字存入sessionresponse.sendRedirect("/course/index.jsp");
}
  • 用户登录:
int role=Integer.parseInt(request.getParameter("role"));
String userName=request.getParameter("userName");
String password=request.getParameter("password");
if(role==1) { //管理员登录String sql="select * from user where userName='"+userName+"' 							and password='"+password+"' and role=1";=ub.login(sql);//查找用户,返回用户信息if(u!=null) { //存在此用户session.setAttribute("user", u);//用户信息存于session}response.sendRedirect("/course/backindex.jsp");
} else { //不是管理员String sql="select * from user where userName='"+userName+"' 						and password='"+password+"' and role!=1 and del=1";=ub.login(sql);//查找用户,返回用户信息if(u!=null) { //存在此用户session.setAttribute("user", u);//用户信息存于session}response.sendRedirect("/course/index.jsp");
}
  • 检测帐号:
if("zh".equals(p)) { //检测帐号是否可用String userName=request.getParameter("userName");if(ub.cxzh(userName)) { //帐号可用out.print(1);} else {out.print(0);}out.flush();out.close();
} else if("cslogin".equals(p)) { //超时后登录String userName=request.getParameter("userName");String password=request.getParameter("password");String sql="select * from user where userName='"+userName+"' and 						password ='"+password+"'";u=ub.login(sql);if(u!=null) {session.setAttribute("user", u);//用户信息存于session}out.flush();out.close();
}

在线出题

  • 添加与修改题目:
if ("add".equals(type)||"update".equals(type)) {String subject = request.getParameter("subject");String title = request.getParameter("title");String optiona = request.getParameter("optiona");String optionb = request.getParameter("optionb");String optionc = request.getParameter("optionc");String optiond = request.getParameter("optiond");String answer = request.getParameter("answer");String difficulty = request.getParameter("difficulty");if("add".equals(type)) {if (tb.addTopic(subject, title, optiona, optionb, optionc, 						optiond,answer, difficulty, u_id)) {// 添加成功out.print(1);} else {out.print(0);}} else {int t_id=Integer.parseInt(request.getParameter("id"));System.out.println(t_id);if (tb.updateTopic(t_id, subject, title, optiona, optionb, 						optionc, optiond, answer, difficulty)) {// 修改成功out.print(1);} else {out.print(0);}}out.flush();out.close();
}
  • 按条件搜索与删除题目:
if("search".equals(type)) {int pageIndex=Integer.parseInt(request.getParameter("index"));int  pageSize=10;//一页5条String searchTitle = request.getParameter("searchTitle");String title = new String(searchTitle.getBytes("iso8859-1"), 											"utf-8");String sql="select * from topic where title like ?";List<Topic> topicLists=tb.selTopic(sql,"%"+title+"%");sql="select count(1) from topic where title like '%"+title+"%'";int length=tb.countTopic(sql);//总共多少条int 			count=length%pageSize>0?(length/pageSize+1):length/pageSize;request.setAttribute("topicLists", topicLists);request.setAttribute("count", coun);request.setAttribute("pageIndex", pageIndex);request.getRequestDispatcher("/jsp/topicmanager.jsp?type=search&title				="+searchTitle).forward(request, response);
} else if("clickUpdate".equals(type)) { //点击修改int t_id=Integer.parseInt(request.getParameter("id"));String sql="select * from topic where t_id=?";Topic topic=tb.selOneTopic(sql,t_id);request.setAttribute("topic",topic);request.getRequestDispatcher("/jsp/addtopic.jsp?type=update").forward			(request, response);
} else if("lie".equals(type)) {int pageIndex=Integer.parseInt(request.getParameter("index"));String sql="select * from topic where u_id=? limit ?,?";int  pageSize=10;//一页5条List<Topic> topicLists=tb.selTopic(sql,u_id,(pageIndex-1)*pageSize,pageSize);System.out.println(topicLists);sql="select count(1) from topic where u_id="+u_id;int length=tb.countTopic(sql);//总共多少条int count=length%pageSize>0?(length/pageSize+1):length/pageSize;request.setAttribute("topicLists", topicLists);request.setAttribute("count", count);request.setAttribute("pageIndex", pageIndex);request.getRequestDispatcher("/jsp/topicmanager.jsp?type=lie").forward(request, response);
} else if("del".equals(type)) {int t_id=Integer.parseInt(request.getParameter("id"));if(tb.delTopic(t_id)) {out.print(1);} else {out.print(0);}out.flush();out.close();
}
}

在线测试

  • 随机产生 10 道题目生产试卷:
String subject = new String(request.getParameter("subject").getBytes("iso8859-1"), "utf-8");
int nd=Integer.parseInt(request.getParameter("nd"));
Map<Integer,String> map=new HashMap<Integer, String>();
map.put(1, "简单");
map.put(2, "一般");
map.put(3, "困难");
Map<Integer,String> map2=new HashMap<Integer, String>();
map2.put(1, "基础题");
map2.put(2, "练习题");
map2.put(3, "竞赛题");
request.setAttribute("testTop", subject+map2.get(nd));// 试卷标题
sql="select * from topic where subject ='"+subject+"' and 					difficulty='"+map.get(nd)+"'";
List<Topic> allTopics=tb.selTopic(sql);//查询所有符合的题目
System.out.println(allTopics);
List<Topic> topicLists=new ArrayList<Topic>();
//随机产生题目
int sj=allTopics.size();
if(sj>10) { //如果题目足够int index=0;boolean flag=true;do {index=(int)(Math.random()*sj-1);//随机产生一个数Topic t=allTopics.get(index);//拿到相应的对象if(topicLists.size()<1) { //才产生一个随机对象topicLists.add(t);//把随机产生的这个对象放入集合中} else {for(int i=0; i<topicLists.size(); i++) { //循环所有题目int stid=topicLists.get(i).getT_id();if(t.getT_id()==stid) { //已存在此题flag=false;break;} else {flag=true;}}if(flag) {topicLists.add(t);//把随机产生的这个对象放入集合中}}} while(topicLists.size()!=10);//循环收取10个题目//把该试卷存入试卷表String test_id = UUID.randomUUID().toString();//生成唯一idtb.createTest(test_id, u_id,topicLists);request.setAttribute("test_id", test_id);
}
request.setAttribute("topicLists", topicLists);
request.getRequestDispatcher("/jsp/test.jsp").forward(request, response);
}
  • 批改试卷(学生答案与正确答案相比较):
String myanswer=request.getParameter("myanswer");
String test_id=request.getParameter("test_id");
tb.addAnswer(test_id, myanswer, u_id);//将自己的答案存入答案表
sql="select * from test where test_id='"+test_id+"'";
Test test=tb.selDanTest(sql);
String myAnswerList[]=myanswer.split(",");
String rightAnswerList[]=test.getAllanswer().split(",");
//装错误了的题的答案,正确的赋值1
List<String> worryList=new ArrayList<String>();
for(int i=0; i<rightAnswerList.length; i++) {System.out.println(myAnswerList[i]+"----"+rightAnswerList[i]);if(myAnswerList[i].equals(rightAnswerList[i])) { //答案正确worryList.add("1");} else {worryList.add(rightAnswerList[i]);}
}
String json =  JSONArray.fromObject(worryList).toString();
System.out.println(json);
out.write(json);
out.flush();
out.close();
}

资料下载

  • 文件上传关键代码:
try {// 创建文件项工厂DiskFileItemFactory factory = new DiskFileItemFactory();// 创建解析请求数据的ServletFileUpload对象ServletFileUpload upload = new ServletFileUpload(factory);// 解析request请求把流装入到list中List<FileItem> list = upload.parseRequest(request);HashMap<String, String> map = new HashMap<String, String>();for (int i = 0; i < list.size(); i++) {// 把各个流装入到item中FileItem item = list.get(i);if (item.isFormField()) {// 判断当前fileitem是否是表单中的字段String key = item.getFieldName();map.put(key,new String(item.getString().getBytes("iso-8859-1"),"utf-8"));} else {// 当fileitem是文件流时// 文件后缀String filename = item.getName();ext =filename.substring(filename.lastIndexOf(".")+1);String newname= map.get("title")+"."+ext;String newpath = request.getRealPath("/upload") + "/" +newname;size=convertFileSize(item.getSize());item.write(new File(newpath));path = request.getContextPath()+"/upload/"+newname;}}//存储信息if(ub.upFile(map.get("subject"),map.get("title"),path,ext,u_id,size)) {request.getRequestDispatcher("/jsp/success.jsp").forward(request, response);}
} catch (Exception e) {printStackTrace();
}
}
  • 文件大小格式换算:
public static String convertFileSize(long size) {
long kb = 1024;
long mb = kb * 1024;
long gb = mb * 1024;
if (size >= gb) {return String.format("%.1f GB", (float) size / gb);
} else if (size >= mb) {float f = (float) size / mb;return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
} else if (size >= kb) {float f = (float) size / kb;return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
} elsereturn String.format("%d B", size);
}

师生互动

  • 按条件查询讨论留言:
if("search".equals(type)) { //查询String  countsql=null;int pageIndex=Integer.parseInt(request.getParameter("index"));//页面传来的页码int  pageSize=5;//一页5条String p=request.getParameter("p");if("title".equals(p)) { //按主题查询String title = new String(request.getParameter("title").getBytes("iso8859-1"), "utf-8");sql="select b.*,u.name from bbs b,user u where  title like '%"+title+"%' and u.u_id=b.u_id order by b.create_time desc  limit "+(pageIndex-1)*pageSize+","+pageSize;countsql="select count(1) from bbs  where  title like '%"+title+"%' " ;request.setAttribute("title", title);} else if("subject".equals(p)) { //按科目查询String subject = new String(request.getParameter("subject").getBytes("iso8859-1"), "utf-8");sql="select b.*,u.name from bbs b,user u where  b.subject like '%"+subject+"%' and u.u_id=b.u_id order by b.create_time desc  limit "+(pageIndex-1)*pageSize+","+pageSize;countsql="select count(1)  from bbs  where  subject like '%"+subject+"%' " ;request.setAttribute("subject", subject);} else if("all".equals(p)) { //查询所有sql="select b.*,u.name from bbs b,user u where b.u_id=u.u_id order by b.create_time desc  limit "+(pageIndex-1)*pageSize+","+pageSize;countsql="select count(1)  from bbs   " ;}List<Bbs> bbsLists=bbiz.selBbs(sql);int length=bbiz.countBbs(countsql);//总条数request.setAttribute("bbsLists", bbsLists);int count=length%pageSize>0?(length/pageSize+1):length/pageSize;request.setAttribute("count", count);request.setAttribute("pageIndex", pageIndex);request.getRequestDispatcher("/jsp/bbs.jsp?p="+p).forward(request, response);
} else if("addbbs".equals(type)) {String subject =request.getParameter("subject");String title = request.getParameter("title");String content = request.getParameter("content");if(bbiz.createBbs(title, subject, content, u_id)) {out.print(1);}out.flush();out.close();
}
  • 查询单个留言页面,添加留言:
if("dan".equals(type)) { //点击进入单个页面int bbs_id=Integer.parseInt(request.getParameter("id"));sql="select b.*,u.name from bbs b,user u where b.u_id=u.u_id and bbs_id="+bbs_id;Bbs bbs=bbiz.selDanBbs(bbs_id);request.setAttribute("bbs", bbs);List<Reply> replyLists=bbiz.selReply(bbs_id);request.setAttribute("replyLists", replyLists);request.getRequestDispatcher("/jsp/bbsdan.jsp").forward(request, 	response);
} else if("addreply".equals(type)) {String content = request.getParameter("content");int bbs_id=Integer.parseInt(request.getParameter("id"));if(bbiz.addReply(u_id, bbs_id, content)) {out.print(1);}out.flush();out.close();
}
}

我的作业

  • 查询该用户所提交的作业:
if("all".equals(type)) {sql="select * from homework where u_id="+u_id+" order by 					submit_time desc";
} else if("search".equals(type)) {String subject = new String(request.getParameter("subject").getBytes("iso8859-1"), "utf-8");String start_time=request.getParameter("start_time");String end_time=request.getParameter("end_time");sql="select * from homework where u_id="+u_id+" and subject ='"+subject+"' and give_time between '"+start_time+"' and '"+end_time+"' order by give_time desc ";
}
List<HomeWork> homeWorkList=hb.selHomeWork(sql);
request.setAttribute("homeWorkList", homeWorkList);
request.getRequestDispatcher("/jsp/tijiaohomework.jsp").forward(request, response);
}

收取作业

  • 批量下载学生作业:
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");String subject=request.getParameter("subject");String give_time=request.getParameter("give_time");byte[] buffer = new byte[1024];String path=this.getServletConfig().getServletContext().getRealPath("/");// 生成的ZIP文件名String strZipName = "【"+subject+"】"+give_time+".zip";System.out.println(strZipName);ZipOutputStream out = new ZipOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\"+strZipName));//解决中文乱码问题String filenames=request.getParameter("filenames");System.out.println("filenames-------------"+filenames);String filename[]=filenames.split(",");// 需要同时下载的几个文件File[] file1 = new File[filename.length];for(int j=0; j<filename.length; j++) {file1[j]=new File(path+"//upload//"+filename[j]);}for (int i = 0; i < file1.length; i++){FileInputStream fis = new FileInputStream(file1[i]);out.putNextEntry(new ZipEntry(file1[i].getName()));int len;// 读入需要下载的文件的内容,打包到zip文件while ((len = fis.read(buffer)) > 0){out.write(buffer, 0, len);}out.closeEntry();fis.close();}out.flush();out.close();System.out.println("生成.zip成功");
}

用户管理

  • 查询用户:
if("search".equals(type)) {String userName=request.getParameter("userName");System.out.println(userName);String sql="select * from user where userName='"+userName+"'";User seluser=ub.selUser(sql);request.setAttribute("seluser", seluser);request.getRequestDispatcher("/backstage/usermanager.jsp").forward(r	equest, response);
}
}
  • 冻结与初始化密码:
if("del".equals(type)||"csh".equals(type)) {String userName=request.getParameter("userName");if("del".equals(type)) {int d=Integer.parseInt(request.getParameter("d"));//解冻:1 冻结 0if(ub.delUser(userName,d))out.print(1);} else if("csh".equals(type)) {if(ub.cshPassword(userName))out.print(1);}out.flush();out.close();
}
  • 增加教师用户:
if("add".equals(type)) {String userName=request.getParameter("userName");String name=request.getParameter("name");String school=request.getParameter("school");String[] subjects=request.getParameterValues("subject");String subject="";for(int i=0; i<subjects.length; i++) {subject=subject+subjects[i]+",";}ub.addTeacher(userName, "000000", name, school, subject);request.getRequestDispatcher("/backstage/success.jsp").forward(request, response);
} else if("updatepsw".equals(type)) {String yuanpsw=request.getParameter("yuanpsw");String xinpsw=request.getParameter("xinpsw");User user=(User) session.getAttribute("user");String userName=user.getUserName();if(ub.updatepsw(userName, yuanpsw, xinpsw)) {out.print(1);} else {out.print(0);}
}
}

公告管理

  • 展示公告列表:
if ("lie".equals(b)) {// 获取公告列表String sql = "select * from post order by create_time desc";List<Post> plist = postBiz.selPost(sql);request.setAttribute("plist", plist);request.getRequestDispatcher("/backstage/post.jsp").forward(request, 	response);
} else if("dan".equals(b)) {int post_id=Integer.parseInt(request.getParameter("id"));Post post=postBiz.selPost(post_id);request.setAttribute("post", post);request.getRequestDispatcher("/jsp/postdetail.jsp").forward(request, response);
}
}
  • 发布删除公告:
if ("fb".equals(type)) {// 发布公告String title = request.getParameter("title");String content = request.getParameter("content");System.out.println(title + "-----" + content);System.out.println(postBiz.fbPost(title, content));
} else if ("all".equals(type)) {String sql = "select * from post order by create_time desc limit 0,5";List<Post> plist = postBiz.selPost(sql);String json = null;if (plist != null) {json = JSONArray.fromObject(plist).toString();}out.write(json);
} else if ("del".equals(type)) {// 删除公告int post_id = Integer.parseInt(request.getParameter("id"));if(postBiz.delPost(post_id)) {out.print(1);} else {out.print(0);}
}

用户使用说明

本程序 Java Web 程序,在 MySQL 中建立相应表插入适当数据后,更改数据库配置文件 database.properties,将程序源代码导入相应的开发工具或将编译后的程序直接放在 Tomcat 下,运行即可。

  • 精品课程网首页:localhost:8080/course/index.jsp
  • 测试登录学生用户:   帐号:student    密码:123456
  • 测试登录教师用户:   帐号:teacher    密码:123456

  • 图 5-1 精品课程网首页
  • 学生用户权限:首页、课程中心、资料下载、师生互动、在线测试、提交作业(如图 5-2)
  • 教师用户权限:首页、课程中心、资料下载、师生互动、在线出题、收集作业(如图 5-3)

图 5-2 精品课程网在线测试模块

图 5-3 精品课程网在线出题模块

精品课程网后台管理:localhost:8080/course/backindex.jsp

  • 测试登录管理员用户:   帐号:admin    密码:admin
  • 图 5-4 精品课程网后台管理系统登陆页面
  • 管理员用户权限:用户管理、公告管理(如图 5-5)

图 5-5 精品课程网后台管理系统用户管理模块

三、结论

基于 Java 和 MySQL 的精品课程网站设计与实现由我和同组同学合作完成。它是根据当下教育资源紧缺和广大教育需求而分析设计的,初步确定了网站系统具有的解决当下教务模式与需求之间的矛盾的功能,包括数据库设计、网页界面设计、Web 应用层设计等,是一个具有实际应用意义和使用价值的资源共享网站。

在此次设计中,我主要负责的是后台代码的编写。从一起分析讨论到各自完成所负责部分的代码再到前后台的数据交互,期间反反复复遇到了很多问题,不过通过在网上查阅资料和相互交流,最终都得以解决。

这次的程序编写使我对网站设计的开发步骤和思路有了一个全新的认识,也更加熟练的掌握了 Java 基础代码,我体会到了代码规范化的重要性:写代码之前要设计好文案,操作步骤、流程图、数据结构等都要想好,命名规范,尽量多的思考需要什么,将整个流程都构思好后,与大家一起讨论。编写时思路要清晰,尽量避免重复代码,多加注释,等等。

由于毕业设计的时间有限,该网站在功能需求和用户体验方面仍不完善,还有待进一步改进和提高。

四、参考文献

  • 蔡剑,景楠.JavaWeb 应用开发:J2EE 和 Tomcat[M].北京:清华大学出版社,2004
  • 孙鑫编著.JavaWeb 开发详解[M].电子工业出版社,2006
  • 张志峰,朱颢东.Java Web 技术整合应用与项目实战.清华大学出版社,2013
  • 王飞飞,崔洋.MySQL 数据库应用.中国铁道出版社,2007
  • 鲍格斯坦.JSP 设计第一版.中国电力出版社,2008
  • 孙更新.Java 毕业设计指南与项目实践.北京科海电子出版社,2008

五、致   谢

本次毕业设计能够顺利完成离不开我的导师的指点和帮助。从选题、程序分析、程序设计、程序调试到最终论文的撰写,其中遇到了不少问题,但在老师的悉心教导下都得以解决,在此由衷的感谢导师对我的帮助及支持。

本次设计也是我和同学第一次搭档的作品,以前在班上交流不算多,这次的合作使我们更加熟悉加深了友谊,这也再次让我体会到齐心协力的重要性,我们一起相互讨论,研究出相对合适的解决方法,虽然设计还有很多不足,但是我们还会慢慢完善做到更好!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94012.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球首款 8K 全景无人机影翎 A1 发布解读:航拍进入“先飞行后取景”时代

全球首款 8K 全景无人机影翎 A1 发布解读&#xff1a;航拍进入“先飞行后取景”时代 特别说明&#xff1a;本文所有图片素材来源于影翎官网 影翎官方介绍称&#xff1a;“全球首款”是指截至 2025 年&#xff0c;A1 是首台全面整合的全景无人机&#xff1a;无需外挂全景相机配件…

androidstudio内存大小配置

help->Edit Custom Vm option-Xmx8096m或者其他数值 改成-Xmx10240m然后设置里面的内存大小也要修改一下

vue3和elementPlus中的el-dropdown-menu中的背景样式修改

1. 效果展示2. 代码展示在el-dropdown-menu下加载类名,class"my-dropdown-menu"<el-dropdown-menu class"my-dropdown-menu"><el-dropdown-item :command"{ action: upgrade, data }">升级</el-dropdown-item><el-dropdown…

计算机网络--HTTP协议

1. 什么是 HTTP 协议全称&#xff1a;Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;作用&#xff1a;用于在服务器与客户端&#xff08;通常是浏览器&#xff09;之间传输超文本数据&#xff08;如文字、图片、视频、音频&#xff09;的应用层协议。工作…

Bee1.17.25更新Bug,完善功能.不支持NOSQL,分库分表Sharding(2.X版有)

Bee 1.17.25 正常的ORM功能都有,但不支持NOSQL, 分库分表Sharding; 若需要可使用2.X版. Bee, 接口简单&#xff0c;功能齐全&#xff0c;性能好&#xff0c;支持原生分页性能更高&#xff1b;还有分库分表 (Sharding 分片) 功能&#xff0c;也支持 MongoDB ORM. Bee Hiberna…

RAG流程全解析:从数据到精准答案

Rag流程分析第一部分&#xff1a;数据处理与向量化 原始文档进入系统&#xff0c;先经过格式识别&#xff0c;把 pdf、docx、pptx、扫描图片等统一转成文字流。文字流丢进分段器&#xff0c;按固定长度或语义边界切成若干文本块&#xff0c;每个块再生成唯一 id。如果文档里有表…

Matplotlib数据可视化实战:Matplotlib图表注释与美化入门

图表注释与标签&#xff1a;提升数据可视化效果 学习目标 通过本课程的学习&#xff0c;学员将掌握如何使用Matplotlib在图表中添加文本注释、图例、标题和轴标签&#xff0c;从而提高图表的可读性和信息传达能力。本课程将通过实际案例&#xff0c;帮助学员理解每个元素的作用…

GitLab 安全漏洞 CVE-2025-7739 解决方案

本分分享极狐GitLab 补丁版本 18.2.2, 18.1.4, 18.0.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码&#xff0c;我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS&#xff0c;技术团队已经进行了升级&#xff0c;无需用户采取任何…

C端高并发项目都有哪些

C端&#xff08;用户端&#xff09;高并发项目通常涉及大规模用户直接访问的服务&#xff0c;其核心挑战是如何在海量用户同时请求下&#xff0c;保证系统的稳定性、高性能、高可用和一致性。以下是一些典型的C端高并发项目类型和具体案例&#xff1a;​核心类型与典型案例&…

OSCP - Proving Grounds - Shenzi

主要知识点 路径爆破小技巧 windows AlwaysInstallElevated 提权 具体步骤 依旧是nmap开始&#xff0c;其中80/443/139/445端口值得关注一下 Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-01-01 15:06 UTC Nmap scan report for 192.168.53.55 Host is up (0.0008…

结合BI多维度异常分析(日期-> 商家/渠道->日期(商家/渠道))

技术手段&#xff1a; BI工具&#xff08;finereport &#xff09;、python、sql 数据更新&#xff1a; 每日零点更新数据。&#xff08;独立开发&#xff09; 商业智能分析平台 | Python/FineReport/SQLAlchemy 项目描述 业务价值 &#xff1a;解决原有系统无法快速定位佣金异…

计算机毕设Spark项目实战:基于大数据技术的就业数据分析系统Django+Vue开发指南

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

如何让FastAPI任务系统在失败时自动告警并自我修复?

url: /posts/2f104637ecc916e906c002fa79ab8c80/ title: 如何让FastAPI任务系统在失败时自动告警并自我修复? date: 2025-08-20T08:18:42+08:00 lastmod: 2025-08-20T08:18:42+08:00 author: cmdragon summary: FastAPI 和 Celery 结合提供了强大的异步任务处理能力,但在分布…

Gitee仓库 日常操作详细步骤

新建仓库 → 上传代码 步骤1、打开Gitee仓库网站&#xff1a;开源软件 - Gitee.com 步骤2、点击右上角加号 点击新建仓库。 步骤3、设置仓库名 &#xff0c;选择是否开源 &#xff0c;点击创建。 步骤4、记住远程仓库URL 步骤5、本地新建文件夹&#xff0c;然后进行上传代码…

Python采集易贝(eBay)商品详情API接口,json数据返回

Python采集易贝(eBay)商品详情API接口要采集eBay商品详情&#xff0c;你可以使用eBay官方提供的API。以下是使用Python通过eBay Finding API获取商品详情的完整示例&#xff1a;准备工作注册账号并获取API密钥&#xff1a;选择适合的API&#xff08;如Finding API、Shopping AP…

如何将任意文件一键转为PDF?

无论你用什么软件打开文件&#xff08;Word、Excel、网页、CAD图纸、图片等&#xff09;&#xff0c;只要能打印&#xff0c;就可以通过虚拟打印机将其转为PDF&#xff0c;确保对方收到的文件看起来和你看到的一模一样。它是小巧实用的PDF虚拟打印工具&#xff0c;采用安装包形…

迁移学习+多模态融合破解跨域难题,解锁视觉感知新范式

在近期的顶会顶刊中&#xff0c;迁移学习与多模态融合的热度居高不下&#xff0c;相关成果频出&#xff0c;部分模型在特定任务里性能提升极为显著。登上顶刊 TPAMI 2025 的某篇研究&#xff0c;借助语言引导的关系迁移&#xff0c;大幅提升了少样本类增量学习中模型的泛化能力…

C语言---分隔符、常量、注释、标识符、关键字、空格

文章目录分隔符注释注意标识符标识符的定义标识符的命名要求合法与非法标识符示例关键字关键字定义关键字一览(按功能分类)空格一、空格的作用&#xff1a;分隔令牌 (Tokens)空格的使用场景必须用空格分隔的情况不能有空格的情况分隔符 分隔符名称主要用途;分号语句结束符,逗号…

创建Vue项目的不同方式及项目规范化配置

1 项目的创建与运行 1.1 基于webpack构建工具——vue-cli脚手架 1. 安装脚手架 &#xff1a;npm i -g vue/cli # 安装一次即可&#xff0c;之前安装过则无需重复安装 2. 切换到项目所在目录 &#xff1a;cd 项目所在目录 3. 创建项目 &#xff1a;vue create 项目名 4. 自定…

K距离间隔重排字符串 (LeetCode 358) — Swift解法 + 可运行Demo

文章目录摘要描述解决方法分析问题和解决代码代码要点详解示例测试和结果时间复杂度空间复杂度总结摘要 这道题的核心是&#xff1a;把字符串里的字符重新排一下顺序&#xff0c;让相同字符之间至少隔开 k 个位置。如果做不到&#xff0c;就返回空串。看上去像“排座位”&…