资源描述
《虚拟校园》软件系统架构说明
我们小组致力于开发一个功能齐全的、易用的、人性化的校园虚拟学习系统。该系统是用纯java语言开发的WEB应用程序。该系统的用户分为三类,分别是学生、教师、管理员。
l 1 需求分析
1.1 系统需求
学生用户的需求是与老师和同学进行交流、参加模拟考试 、展示自己和浏览别人的作品;教师用户的需求是批改作业、发布学习资源和对同学们进行答疑等;管理员的需求是对所有后台信息的管理。
虚拟校园系统是集学习、信息交流、信息发布、资料管理与查询、信息管理与查询、作业管理与提交等等学生与教师的日常活动于一体的复杂系统。经过不断的调查和访问,虚拟校园学习系统开发时应满足以下具体需求:
1.满足教师和学生基本信息的管理的需求。
2.满足学生和教师对学习资源的便捷查找与管理的需求。
3.满足学生和教师对各种信息的发布与管理的需求。
4.满足学生作业的提交与管理的需求。
5.由于涉及多种信息与资源,系统要具有优良的存储结构,满足系统容易扩充和维护的需求。
6.提供友好的用户和管理员界面,满足该系统的易于使用和管理的需求。
7.具有完整的系统接口,满足可灵活的导入与导出数据的需求。
系统
1.2 功能需求
基于系统需求分析,该系统需要实现以下基本功能:
1) 用户管理:设置操作人员口令和权限,添加/删除用户。
2)各种信息的管理:学生发布的信息、教师发布的信息以及管理员发布的信息的发布/删除。
3)各种学习资源库的管理:教师发布的资源,管理员发布的资源等的添加/删除/备份/导入。
4)作业的管理:作业的提交/删除/备份/导入。
5)提供便捷地对各种信息和资源进行检索的功能。
5)数据库的管理包括数据的备份和恢复。
1.3 性能要求
1)最佳主机配置:内存512M以上,硬盘1000G以上,cpu在Intel4以上;
2)搜索时间最大不超过10秒,平均时间在1~5秒以内;
3)数据库容量:1G
4)系统用户容量的需求:静态用户(注册用户):5000以上,动态用户(在线用
户):500以上,并发数:100以上
5)系统运行时间,7×24小时不间断运行
l 2 系统采用的相关协议、技术和理论
2.1 软件涉及的协议、技术和理论
开发一个系统仅仅有了好的创意,对于整个系统的成功还远远不够。开发语言和环境的选择也是至关重要的。开发环境的特点和运行方式能否很好的满足系统功能需求,能否为整个系统的资源提供最优化解决方案,是程序开发人员必须解决的问题。它是决定整个系统性能好坏的重要因素之一。除此之外,程序采用的模块化结构和程序的具体算法对于系统也是至关重要。本系统中我们小组选择ECHO2+MYSQL+TOMCAT组合开发环境。
2.1.1 关于echo2
Echo2( Ajax 技术的开
框架用它做出的系统是一个单页面系统,所有的界面更新都是通过不停的更
新DOM来实现,而且系统只有一个URL,用户很难通过URL来非法进去系统
内部。
它通过一个强大的基于Ajax的展现(rendering)引擎,将程序员用
Java编写的代码转换成浏览器需要的 HTML。这个强大引擎包括两个部分:
服务器端和客户端。
服务器端引擎主要功能如下:
1. 接收并处理客户端数据;
2. 将服务器端组件和数据转换成 XML
客户端引擎主要功能如下:
1. 向服务器端发送相关数据;
2. 解析服务器端返回的 XML;
3. 根据解析结果更新页面 DOM 节点;
Echo2 包括其扩展组件库 Echo Point NG 和 Echo2 Extras,提供了非常丰富和非常绚丽的基本组件和扩展组件,使开发者基本不需要开发自己的组件就能非常出色的构建炫丽的客户端效果。另外,Echo2 还提供了Server Push 的一种模式,可以模拟 C/S 系统中的 Server Push 的效果。为了让开发者方便的看到服务器和客户端的通信情况,以及客户端 DOM 节点的状态,Echo2 还提供了一个Debug 模式。这对我们开发 B/S 系统非常方便。Echo2是Echo Web框架的下一代版本。一个可以用于开发基于Web胖客户端应用程序的框架。
图1,Echo2
2.1.2Ajax技术原理
Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。Ajax 不仅仅 是一种时尚,它是一种构建网站的强大方法,而且不像学习一种全新的语言那样困难。AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快 的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
Ajax 应用程序的优势在于:
1. 通过异步模式,提升了用户体验
2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
2.1.3 MYSQL数据库软件
MYSQL是一个真正的多用户、多线程SQL数据库服务器。SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言。MYSQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序MYSQLD和很多不同的客户程序和库组成。
2.1.4 APACHE TOMCAT服务器程序
Tomcat 是一个免费的开源的SERVLET容器,它是Apache基金会的Jakarta项目中的 一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的SERVLET和JSP规范总能在Tomcat中得到体现。Tomcat被JAVAWORLD杂志的编辑选为2001年度最具创新的java产品,可见其在业界的地位。与传统的桌面应用程序不同,Tomcat中的应用程序是一个WAR(Web Archive)文件。在Tomcat中,应用程序的部署很简单,你只需将你的WAR 放到Tomcat的WEBAPP目录下,Tomcat会自动检测到这个文件,并将其解压。
2.2 开发工具
在本系统的开发过程中,采用了如下工具及软件:
△ MySQL5.0
△ Apache Tomcat 5.5 + JDK 1.5
△ Eclipse j2ee 版
△ JDBC for MYSQL
l 3 虚拟校园学习系统的总体设计框架
本系统采用ECHO2/Ajax技术实现的,用户的操作几乎是立即更新的。因为我们按桌面程序的思维设计Web应用,我们不愿意让用户总是等待。
系统是一个基于WEB的应用程序,这就注定了本系统必须要以B/S架构为主要架构。本系统采用Echo2框架,Echo2 还提供了 Server Push 的一种模式,可以模拟 C/S 系统中的 Server Push 效果,当服务器收到外部事件以后更新客户端数据;特定时间间隔更新客户端数据。 服务器发送功能具体的实现包括多用户交互程序。 它保持程序的用户们根据状态信息或者新闻来更新数据,并且当长时间运行时提供反馈。因此可以说本系统就是一个应用程序,不是传统意义上的网站。
教师接口
学生接口
教师接口
学生接口
精品展示模块
作品展示模块
网络硬盘模块
作业系统模块
注册/登陆模块
论坛模块
聊天室模块
邮件模块
数据库
教研室系统
学习室系统
管理员接口
3.1.1系统功能的模块化设计
1)作品展示
学生用户可以将自己的作品发布到平台上,提供大家评论参考以及互相学习,可展示的作品比如自己写的文章、做的FLASH、写的算法或者程序等等。
用户可以管理自己发布的作品,包括对作品的删除和修改。
2)精品库
教师可以通过查看展示作品里的优秀作品,把它们放到精品库里,让所有的教师或者学生下载。
3)自我测试
用户选择一些考试,评定下自己的实力,测试自己。
4)注册登陆
用户应当能够方便注册成为学生,能够方便登陆系统,登陆后能方便修改自己的密码以及个人信息,登陆后能够退出登陆(注销登陆信息)。
5)网络硬盘
提供给用户空间,让他们上传资料。
6)邮件系统
用户之间可以互相发送站内信息,比如学生请教教师或者教师回复学生等。
7)聊天室模块
当前所有在线用户可以在聊天室中讨论问题
8)论坛模块
学生可以在论坛中发帖寻求帮助或者回答别人提出的问题
9)管理员系统
管理员对系统涉及的所有基础信息进行管理
10)教研室系统
老师在教研室中对涉及自身的所有信息进行管理,例如管理自己班级的学生信息、查看本班学生的作业和考试情况、上传学习资料供本班学生下载等等。
学生在教研室中进入自己老师的空间查看老师布置的作业,答疑,下载老师上传的课件等等。
11)学习室系统
此模块只有学生才能进入,学生对设计自身的所有信息进行管理,例如发布自己的作品、发送邮件、使用网络硬盘等等。
3.1.2 用户功能的接口描述
该系统的主要用户分为教师、学生和管理员,他们对系统中的不同模块具有不相同的操作及其权限,设计的教师接口为教研室,其中集成了教师对系统所有模块的操作及其权限。学生接口为学习室,其中集成了学生对系统模块的操作及其权限。管理员接口为管理员后台,可以维护系统干净和进行数据库的操作。
1)教研室系统
个人信息系统:显示及修改教师的所有基本信息。
作业系统:教师可以查看、下载已经提交的作业以及布置新的作业。
信息发布:教师给系统注册的所有用户可以发送站内信息。
考试安排:教师可以安排考试。
学习资源:教师可以上传学习资源到公共资源库。
学生作品管理:教师可以将自己学生中的比较优秀的展示作品添加到精品库。
精品库:教师可以下载或者删除精品库里的资料。
网络硬盘: 教师可以上传或者下载个人资料。
2)学习室系统
个人信息系统:显示及修改该学生的所有基本信息。
作业系统:学生可以上传、查看、下载自己已提交的作业。
信息发布:学生可以给系统注册的所有用户发送站内信息。
自我测试:学生进行自我测试。
教师空间:学生可以进入教师空间,在系统的公共资源库中查找并下载资料、给老师发送邮件等。
作品展示:学生可浏览大家已展示的作品,并展示自己的作品和删除自己已展出的作品。
网络硬盘:学生可上传或者下载个人资料。
3)管理员系统
在此系统中管理员对所有设计系统的基本信息进行管理
学生用户管理:
教师用户管理:
作品,精品管理:
系统公告管理:
论坛管理:
3.1.3系统主要界面功能和一致性风格的设计
根据用户需求,需要对系统中大量的数据进行添加、删除、检索、显示等操作,设计中将信息管理技术引入WEB系统。根据检索数据的特征,系统设计了两种可以进行重复检索的界面:一种是需要输入关键字的检索界面,如:学习资源模块中的资源搜索,另一种是不需要输入关键字,需要建立下拉列表,用户从中选择关键词的检索界面,如作品展示、精品库等。另外,对于系统中各模块内容的显示,统一设计了可进行多种选择排序的显示方式。
3.1.4 系统数据库设计
系统核心数据库如下所示
发送
编号
内容
1
作业号
得分
M
M
1
M
1
1
M
学生
发布
编号
描述
o
学生姓名
内容
邮件
邮件
发送
姓名
1
M
教师
作业
批改
评语
姓名
教师
提交
作业号
资源
编号
发布
描述
教师姓名
1
M
姓名
系统核心部分数据库E-R图
时间
帖子
回帖
时间
发帖人
最后回复人
编号ID
回复
回帖人
内容
内容
编号ID
论坛数据库E-R 图
系统的最终关系模型主要有
1)教师(帐号,密码,姓名,性别,简介,学院,教研室,上次登陆时间,代课班级)
2)学生(学号,密码,姓名,性别,出生年月,学院,班级,上次登陆时间,指导老师账号)
3)作品(作品号,作品名,关键字,作者学号,作品种类,上传时间,存储路径,文件大小,描述,作者姓名,指导老师姓名)
4)作业(作业号,作业标题,附件路径,批语,学生,教师,班级,状态,日期)
5)论坛帖子(发帖编号,主题,内容,发帖人,发帖时间,最后回复人,浏览次数,回复次数,附件存储路径)
由于关系模型太多,只列出较为典型的集中关系模型,恕不一一列出。如果想看具体的数据库内容,请查看数据库文件。
l 4 主要模块的设计与实现
4.1 数据库连接方式和数据编码格式
在本系统中,系统对数据库的操作主要是通过JDBC for MYSQL驱动程序进行连接操作。JDBC, 全称为Java Database Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库。JDBC也是java核心类库的一部分。
数据库的访问流程:
JDBC Driver Manager->局部JDBC驱动->客户端数据库->数据库服务器->返回查询结果,这种访问事实上是转换JDBC调用为相应的数据库的客户端API调用,这种方式的访问需要相应的数据库提供商提供相应的JDBC驱动程序,但是有一种好处,可以独立于ODBC,方便性就大大提高了。
private ConnectionFactory()
{ dbconfig=new DataBaseConfig();
dbconfig.setDbName(Res.get("dbname"));
dbconfig.setDriverName(Res.get("dbdriver"));
dbconfig.setPassword(Res.get("dbpwd"));
dbconfig.setUser(Res.get("dbuser"));
dbconfig.setType(DataBaseConfig.CONNECT_TYPE_NORMAL);
dbconfig.setUrl(Res.get("dburl"));
}
{
Class.forName("com.myql.jdbc.Driver ").newInstance();
String url="jdbc:mysql://localhost:3306/campus";
String user="username";
String password="password";
Connection conn= DriverManager.getConnection(url,user,password);
}
在数据库的操作中,本系统主要用到了Statement类和ResultSet类对数据库进行插入、查询、删除等操作。相关定义的代码如下:
Statement stmt=conn.createStatement();
String sql="select * from tablename where table_id = 5";
ResultSet rs=stmt.executeQuery(sql);
在数据编码方面,通常使用的编码格式有许多,比如说:UTF-8,GBK,gb2312,iso8859-1,Unicode,等等。每个编码格式的编码方式都不同,支持的字符集也有较大的区别。在本系统中,客户端采用gb2312规范的编码格式,是考虑到几乎所有的用户均使用windows操作系统和IE浏览器,对gb2312的支持最好;而服务器端和数据库采用UTF-8编码格式,这是因为,UTF-8在兼容性方面有出色表现,同时,Tomcat和MYSQL数据库的默认编码格式也是UTF-8,它能使系统运行在一个稳定的环境下。编码格式的声明,以及编码的转换等
在数据的传输和存储中,通常有一些涉及到文本格式的内容需要存储,比如:个人笔记的内容,专题讨论的内容,都是需要保留诸如回车、空格等控制文本格式的元素的。在本系统中采用了如下代码进行转换:
public String turn(String str)
{while(str.indexOf("\n")!=-1){ //替换回车为<br>
str = str.substring(0,str.indexOf("\n"))+"<br>"+str.substring(str.indexOf("\n")+1);
}
while(str.indexOf(" ")!=-1){ //替换空格为
str = str.substring(0,str.indexOf(" "))+" "+str.substring(str.indexOf(" ")+1);
}
return str;
}
4.2 登陆注册模块的设计与实现
在基于B/S架构的WEB程序中,用户注册、登陆以及用户个人信息的管理构成了整个系统最为基本的模块,一切其它的模块和功能,无一不是建立在用户注册、登陆等身份验证的基础上的。在本系统中,此模块起到了关键性的作用,因为一切的权限,教师和学生的身份识别,登陆用户的资料管理等等,都通过这个模块来实现。
本模块的结构图如图所示。
学生用户
教师用户
注册
登陆验证
修改/编辑个人信息
通过验证
实例化用户对象,登陆系统
错误信息提示
N
Y
注: 教师信息因为更新频率很低,故教师信息由管理员在数据库中直接添加。
4.2.1 学生注册模块
学生注册界面为
学生用户提交注册信息后,系统根据学生所提交的信息进行验证,比如学号格式,邮箱地址格式是否正确、信息是否完整等等。通过验证后在数据库中添加该学生用户。代码核心部分如下所示
protected void register() {
String id = idTf.getText();
String pwd = pwdTf.getText();
String pwdr = confirmpwdTf.getText();
String name = nameTf.getText();
Boolean sex = sexCombox.getSelectedIndex () == 0 ? true : false;
int school = schoolCombox.getSelectedIndex() + 1;
if(classCombox.getSelectedItem()!=null)
{
cla= classCombox.getSelectedItem().toString();
}
String email = emailTf.getText();
boolean agreement = agreementCb.isSelected();
if (agreement) {
String idregx = Util.getIdRegx();
String pwdregx = Util.getPasswordRegx();
String nameregx = Util.getNameRegx();
String classregx = Util.getClassRegx();
String emailregx = Util.getEmailRegx();
boolean ok = true;
if (!Util.match(idregx, id)) {
ok = false;
idInfoLabel.setForeground(Color.RED);
idInfoLabel.setText(Res.get("reg.iderr"));
} else {
idInfoLabel.setForeground(Color.BLACK);
idInfoLabel.setText(Res.get("reg.idok"));
}
// pwd
if (!pwd.equals(pwdr)) {
ok = false;
pwdInfoLabel.setForeground(Color.RED);
pwdInfoLabel.setText(Res.get("ferr"));
} else {
//
if (!Util.match(pwdregx, pwd)) {
ok = false;
pwdInfoLabel.setForeground(Color.RED);
pwdInfoLabel.setText(Res.get("reg.pwderr"));
} else {
pwdInfoLabel.setForeground(Color.BLACK);
pwdInfoLabel.setText(Res.get("reg.pwdok"));
}
}
// name
if (!Util.match(nameregx, name)) {
ok = false;
nameInfoLabel.setForeground(Color.RED);
nameInfoLabel.setText(Res.get("reg.nameerr"));
} else {
nameInfoLabel.setForeground(Color.BLACK);
nameInfoLabel.setText(Res.get("reg.nameok"));
}
// class
if (!Util.match(classregx, cla)) {
ok = false;
classInfoLabel.setForeground(Color.RED);
classInfoLabel.setText(Res.get("reg.classerr"));
} else {
classInfoLabel.setForeground(Color.BLACK);
classInfoLabel.setText(Res.get("reg.classok"));
}
// email
if (!Util.match(emailregx, email)) {
ok = false;
emailInfoLabel.setForeground(Color.RED);
emailInfoLabel.setText(Res.get("reg.emailerr"));
} else {
emailInfoLabel.setForeground(Color.BLACK);
emailInfoLabel.setText(Res.get("reg.emailok"));
}
if(teaName.length()<3)
{
ok=false;
teaCheck.setForeground(Color.RED);
teaCheck.setText("请选择老师");
} else
{
teaCheck.setForeground(Color.BLACK);
teaCheck.setText("成功");
}
// ok
if (ok) {
StudentDataBase db = StudentDataBase.Instance();
int d = Integer.parseInt(id);
if (db.contain(d)) {
idInfoLabel.setForeground(Color.RED);
idInfoLabel.setText(Res.get("reg.idexist"));
} else {
Student s = new Student();
s.setId(Integer.parseInt(id));
s.setName(name);
s.setPassword(pwd);
s.setClassNumber(Integer.parseInt(cla));
s.setEmail(email);
s.setSchoolNumber((short) school);
s.setIsmale(sex);
s.setRegisterTeacher(teaName);
s.setIsregistertoteacher(true);
db.add(s);
File f=new File(SysConfig.getInstance().getHomeworkPath(s.getId()));
f.mkdir();
//homework file path
f=new File(SysConfig.getInstance().getNetDiskPath(s.getId()));
//System.out.println(f);
f.mkdir();
//net disk file path
//
Logger.Instance().logEvent(s.getId()+" register");
submitButton.setText(Res.get("reg.submitsuc"));
submitButton.setEnabled(false);
s=db.get(d);
app.login(s);
}
}
}// not agreement
else {
submitButton.setText(Res.get("reg.submiterr"));
}
}
4.2.2 用户登陆模块实现
本系统中,登陆时学生采用真实学号和密码登陆,教师采用管理员提供的账号和密码登陆。系统在验证用户身份时,直接从数据表里以该用户名和密码为条件进行检索,如果找到记录则登陆成功,如果找不到记录则登陆失败。
当登陆成功时,系统将该教师的个人资料(包括账号、密码、其他信息)记录在用户变量中,写入Teacher中。类图和相关代码如下:
Teacher类:教师类。
TeacherDataBase类:教师和数据库处理的类
Teacher t=new Teacher();//新建教师对象
try{
statement=c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
//数据库的查询
rs=statement.executeQuery(sql);
if(!rs.next())
{
return null;
}
t.setId(id);
t.setName(rs.getString(2));
t.setSchoolNumber(rs.getShort(3));
t.setDepartment(rs.getShort(4));
t.setSummary(rs.getString(5));
t.setPassword(rs.getString(6));
t.setIsmale(rs.getBoolean(7));
t.setEmail(rs.getString(8));
t.setLastLoginTime(rs.getLong(9));
t.setAdminclass(rs.getString(10));
t.setWeb(rs.getBoolean(11));
t.setOpenToAll((rs.getBoolean(12)));
这样,当用户进行其他操作时,就可以进行登陆与否的验证了,以教师为例,点击某个需要教师权限的页面时,系统会进行如下的身份验证:
if(tdb.contain(id))
{//得到id
Teacher t=tdb.get(id);
if(t.getPassword().equals(pwd))
{//密码一样,登录成功
app.login(t);
setVisible(false);
return;
}else
{//密码不一样,登录不成功
loginButton.setForeground(Color.RED);
loginButton.setText(Res.get("login.pwderr"));
return;
}
}
4.3 作品展示模块
4.3.1 作品展示模块设计与实现
学生将其比较优秀的作品展示给大家。展示时,必须标明名称、作品分类、关键字、描述和文件。展示作品界面如图所示:
算法流程图如下:
用户登录
选择作品展示
填写作品基本信息
文件合法
是
上传至服务器
否
提示错误
选择作品文件
客户端发布作品流程图
发送成功失败信息
发送失败信息
操作成功
接收上传文件并存放到相应目录中
将基本信息写入数据库
接收作品基本信息
收到用户请求
否
是
服务器发布作品流程图
系统会对作品信息进行二次处理,将作品信息添加到数据库中
处理核心代码如下所示:
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(event.getInputStream(), out);
event.getInputStream().close();
//验证提交的作品其他信息是否完整
if(nametf.getText()==null||nametf.getText().trim().equals(""))
{
System.out.println("作品名称不能为空");
return;
}
String tempFilename=event.getFileName();
String filename=Util.getFilename(new String(tempFilename.getBytes("GBK"),"UTF-8"));
String SavePath;
String suff=Util.getSuffix(filename);
SavePath=Util.getWorkShowAttachPath(student.getId(),suff);
File f=new File(SavePath);
f.createNewFile();
FileOutputStream fop=new FileOutputStream(f);
fop.write(out.toByteArray());
fop.close();
//将作品信息添加到数据库中
String name=n
展开阅读全文