第二章 系统分析与总体设计
在本系统中,有三类用户:系统管理员,教师和学生。三种不同的用户所具有的操作权限以及操作内容均不一样。
本选课系统给予教师很大的自主权,系统管理员只负责向系统中添加学生和教师的个人信息以及教学楼教室信息。系统管理员不参与开设课程、选择课程等,一切均由教师、学生等录网站自行完成。系统管理员设置一个选课时间段,在到达时间段以前,教师可以开设课程;到达时间段以后,学生可以登陆网站选择课程。
教师用户登陆网站后可以开设课程,为自己的课程编辑上课时间和地点,当系统中出现时间地点冲突的时候,系统向教师用户报告并推荐一个时间地点。每门课程可以是必修或则选修,教师为每门课程设置一个学分,并可以在课程结束后给予分数,如果学生及格,学生将获得该课程的学分。
对于学生用户,每个学生除了必须选择必修课程外,至少还要选择两门选修课程,学生可以对自己选课信息锁定,以免不小心被修改。当时候超过选课时段后,系统自动锁定学生的选课课程。系统可以根据学生的选课信息,生成一份学生自己的课表。课程结束后学生可登录网站查询成绩与学分。
根据上面的要求,从操作功能上可以分为两个类:一个是通用操作,主要实现用户的登录注销和修改密码等;另一种是为不同用户定制不同操作。
1。通用操作
(1)登录与注销
每个用户都可以用自己的帐号登录系统。用户操作完成后推出系统,注销后可以重新登录系统。
(2)修改密码
每个用户第一次登录都用默认密码(教师和学生与帐号一样)。
2。用户所具有功能
- 系统管理员
设置选课时间段:系统管理员通过此项功能设置选课时段,只有在选课时间段里,学生才可以选择课程,超过次时间段,学生选课信息被自动所定,不得修改。
录入学生与教师个人信息:通过此项功能可以实现对教师和学生的个人信息添加删除。
录入教学楼教室信息:通过此项功能可以把学校里所有的教学楼教室的信息录入到系统中,以便教师在开设课程时候设置上课的教室。
- 教师用户
显示和修改个人信息:教师用户登录系统后,可以查看和修改教师的个人信息,如姓名,电话,E-mail地址等。
开设课程:教师用户登录系统后,可以开设课程,可以设置该课程为必修课程或则选修课程,可以设置该课程的最大人数。教师还可以为该课程设置一个前导课程,若学生没有学习或则选择前导课程则不能选择该课程。
编辑课程上课时间:教师在开设了课程后,可以灵活地设置上课时间和地点。
给学生分数:课程结束后,教师用户登录系统,可以为学过课程的学生给予相应的成绩,若
及格,给予学生学分。
- 学生用户
显示和修改个人信息:学生登录系统后,可以查看和修改学生的个人信息,如姓名,性别,电话等。
查看必修课程:学生登录后,可以查看所有的必修课程。查看该课程的信息,上课时间地点,开课教师信息等。
选择选修课程:学生登录系统后,在所有选修课程中可以选择至少两门选修课程。同时可以查看相关信息。
锁定选课信息:学生登录系统,确定了所选课程后,可以锁定自己的选课信息,以防被别人或则自己不小心修改。
查看最终选课信息:学生登录系统后,可列出已选择的课程,若选课信息未被锁定,则可以退选,若所选课程少于两门,系统会提示选择的课程少于两门。
查看学分和成绩
课程结束后,学生登录系统可查看自己学习课程的成绩和已获的学分。
在前面的系统的系统功能分析中,将系统划分成10个模块,如图:
用户登录身份验证模块验证用户名和密码,并根据不同的用户类型,跳转到对应的页面中。设置选课时间模块提供给系统管理员修改选课时间段。录入信息模块提供给系统管理员,用来录入学生和教师信息,以及录入教学楼教室等信息。开设课程模块提供给教师用户,用来开设一门必修课程或则选修课程。编辑课程时间地点模块提供给教师用户,编辑课程的上课时间地点友好的界面和操作。评分模块用于教师用户给选修该教师开设的课程的学生评分。查看课程模块包括查看必修课程、查看选修课程、查看已选课程、查看课程成绩单。选课和锁定模块中实现选择选修课程和锁定选课信息的功能。
数据库是此类系统的核心,系统中所有的信息都存储在数据库中,在所有ASP.NET页面中通过ADO.NET与数据库连接,操作数据库中的数据,从而实现所有需要的功能。数据库软件有很多,如Microsoft SQL Server 2000等。本系统中数据库采用Microsoft SQL Server 2000作为数据库工具。数据库是网站的核心,数据库设计的合理与否对网站的建设有着至关重要的影响。一个良好的数据库开发过程一般是先系统分析,再逻辑设计,然后物理实现。系统分析中分析数据库用户需求,并画出E-R图直观地表示出数据库系统的需求。逻辑设计中根据系统分析设计的一个关系模型。物理设计为逻辑设计中的数据模型选取一个最合理的应用环境的物理结构,通常选取一个常用数据库软件,用数据库软件创建与逻辑设计中数据模型对应的数据库。
本系统的数据库实体主要有“学生”、“教师”、“教学楼”、“教室”、“课程”等。其中“教师”与“课程”存在“开设”联系,并且一个教师可以开设N门课程,即“教师”与“课程”之间是一对多的关系。同样“教学楼”与“教室”也存在一对多的关系。一个学生可以学习N门课程,一门课程可以有M个学生学习,即“学生”与“课程”之间是多对多的关系。同样“课程”与“教室”之间也是多对多的关系。整个数据库可以用一个E-R图表示,如图:
E—R图中的实体图:
数据库逻辑设计就是将E—R图转换为关系模型的过程,即将所有实体和关系转换成一系列的关系模式。转换过程中常见规则有:
(1)一个实体型转换为一个关系模式;
(2)一个一对一的联系可转换成一个独立的关系模式,也可与任意一端对应的关系模式合并;
(3)一个一对多的联系可以转换成一个独立的关系模式,也可与多的那一端对应的关系模式合并;
(4)一个多对多的关系转换成一个关系模式。
根据以上四条规则,下面将E—R图转换成关系模型。
对于“教学楼”、“教室”和两者之间的关系,就可以根据规则(3)转换成两个关系模式
教学楼(教学楼ID,教学楼名称)
教室(教室ID,教学楼ID,教室名称)
对于“学生”、“课程”和它们之间的“选修”关系就可以规则(4)转换成三个关系模式。
学生(学号,姓名,性别,年龄,登陆密码,学分,地址,电话,电子邮件)
课程(课程编码,课程名称,开课教师编号,学分,最大人数,课程简介,前导课程编号)
选课(学号,课程编号,成绩)
依次类推,剩下的关系转换成下面三个关系模式:
教师(教师编号,姓名,性别,年龄,电话,电子邮件,个人简介)
课程时间地点(课程编号,开始周次,结束周次,上课时间,上课教室ID)
管理员(帐号,密码)
经过数据库系统分析和逻辑设计后,数据库的结构已经非常清晰,剩下的就是用一种数据库软件实现这样的结构。本系统中数据库采用Microsoft SQL Server 2000作为数据库。首先我们在Microsoft SQL Server 2000的“企业管理器”创建一个数据库,我们命名为“SC”,如图3-1:
图3-1
选中SC数据库,向数据库中添加8个表:Student,Teacher,Course,SC,CourseTime,Building,Room和Admin,每个表与逻辑设计中一种的关系模式相对应。下面是每个数据表中的属性,包括属性列的名称、数据类型、长度、是否可以为空和备注说明等内容。
(1)Student表。Student表用来存储学生的个人信息,使用学号作为主键,如图3-2:
图3-2
(2)Teacher表。Teacher表用来存储教师的个人信息,用学校分配给教师的教师编号作为主键,这样可以避免重复,如图3-3:
图3-3
(3)Course表。Course表用来存储课程信息,Course表以课程编号为主键,设置课程编号自动增加1(通过建表的时候对属性列设置“标识”,并设置“标识递增量”为1)。表中开课教师Id为外键,所有“TId”的值必须是Teacher表中的“TId”值。设置外键关系可以通过在建立表的窗口中单击右键,在右键菜单中选择“关系”,在弹出的对话框中设置外键关系。如图3-4:
图3-4
(4)SC表。SC表用于存储学生的选课信息,在SC表中学号和课程编号是主键,同时也是外键。如图3-5:
图3-5
(5)CourseTime表。CourseTime表用来存放课程的上课时间和上课地点信息,其中课程编号和教室编号为外键。如图3-6:
图3-6
(6)Building表。Building表用来存放教学楼信息,Building表中教学楼编号为主键,自动增加1。如图3-7:
图3-7
(7)Room表。Room表用来存放教室信息,在Room表中,教室编号为主键,自动增加1,教学编号为外键。如图3-8:
图3-8
(8)Admin表。Admin表用来存放系统管理员信息,如图3-9:
图3-9
Web.Confi
g文件是用来保存网站的很多全局设置,代码是通过using Configuration引用,在Web.Config文件中添加数据库连接字符串。在ADO.NET中用一个字符串来表示一个数据库,一般都把这个字符串放到Web.Config文件中,在整个项目中均可使用。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<!-- 动态调试编译
设置 compilation debug="true" 以启用 ASPX 调试。否则,将此值设置为
false 将提高此应用程序的运行时性能。
设置 compilation debug="true" 以将调试符号(.pdb 信息)
插入到编译页中。因为这将创建执行起来
较慢的大文件,所以应该只在调试时将此值设置为 true,而在所有其他时候都设置为
false。有关更多信息,请参考有关
调试 ASP.NET 文件的文档。
-->
<compilation
defaultLanguage="c#"
debug="true"
/>
<!-- 自定义错误信息
设置 customErrors mode="On" 或 "RemoteOnly" 以启用自定义错误信息,或设置为 "Off" 以禁用自定义错误信息。
为每个要处理的错误添加 <error> 标记。
"On" 始终显示自定义(友好的)信息。
"Off" 始终显示详细的 ASP.NET 错误信息。
"RemoteOnly" 只对不在本地 Web 服务器上运行的
用户显示自定义(友好的)信息。出于安全目的,建议使用此设置,以便
不向远程客户端显示应用程序的详细信息。
-->
<customErrors
mode="RemoteOnly"
/>
<!-- 身份验证
此节设置应用程序的身份验证策略。可能的模式是 "Windows"、
"Forms"、 "Passport" 和 "None"
"None" 不执行身份验证。
"Windows" IIS 根据应用程序的设置执行身份验证
(基本、简要或集成 Windows)。在 IIS 中必须禁用匿名访问。
"Forms" 您为用户提供一个输入凭据的自定义窗体(Web 页),然后
在您的应用程序中验证他们的身份。用户凭据标记存储在 Cookie 中。
"Passport" 身份验证是通过 Microsoft 的集中身份验证服务执行的,
它为成员站点提供单独登录和核心配置文件服务。
-->
<authentication mode="Windows" />
<!-- 授权
此节设置应用程序的授权策略。可以允许或拒绝不同的用户或角色访问
应用程序资源。通配符: "*" 表示任何人,"?" 表示匿名
(未经身份验证的)用户。
-->
<authorization>
<allow users="*" /> <!-- 允许所有用户 -->
<!-- <allow users="[逗号分隔的用户列表]"
roles="[逗号分隔的角色列表]"/>
<deny users="[逗号分隔的用户列表]"
roles="[逗号分隔的角色列表]"/>
-->
</authorization>
<!-- 应用程序级别跟踪记录
应用程序级别跟踪为应用程序中的每一页启用跟踪日志输出。
设置 trace enabled="true" 可以启用应用程序跟踪记录。如果 pageOutput="true",则
在每一页的底部显示跟踪信息。否则,可以通过浏览 Web 应用程序
根目录中的 "trace.axd" 页来查看
应用程序跟踪日志。
-->
<trace
enabled="false"
requestLimit="10"
pageOutput="false"
traceMode="SortByTime"
localOnly="true"
/>
<!-- 会话状态设置
默认情况下,ASP.NET 使用 Cookie 来标识哪些请求属于特定的会话。
如果 Cookie 不可用,则可以通过将会话标识符添加到 URL 来跟踪会话。
若要禁用 Cookie,请设置 sessionState cookieless="true"。
-->
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
<!-- 全球化
此节设置应用程序的全球化设置。
-->
<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
/>
</system.web>
<appSettings>
<!-- 数据库连接字符串
-->
<add key="ConnectionString" value="data source=(local);initial catalog=sc;persist security info=True;user id=sa;pwd=sa;packet size=4096" />
<!-- 选课时间段
-->
<add key="SCDateTime" value="2005-06-01 00:00:00 / 2005-06-15 00:00:00" />
<add key="time.txt" value="E:\\选课系统\\time.txt" />
</appSettings>
</configuration>
在上面的代码中部分解释:
Data source:表示数据库服务器地址,可以填IP地址,若为本机数据库,则填(local)
Initial catalog:表示数据库名称。
Persist security info:表示数据库登录验证模式。SQL Server支持用户名登录验证和Windows身份验证两种模式。一般选用前一种,故这里Persist security info的值署为True。
User id:表示登录数据库的用户名。
Pwe:表示登录数据库的用户名的密码。
Packet size:表示包的大小值,此项默认配置为4096即可。
在ASP.NET中通过ADO.NET技术对数据库进行操作。ADO.NET中有许多很方便的类可用来操作数据库,例如SqlConnection类、SqlDataAdapter类、SqlCommand类、DataSet类等。由于在选课系统中,操作数据库的地方非常多,为了避免很多重复代码的编写,所以对数据库操作做了简单的封装—Db类。在Db类中有三个静态函数ExecuteSelectSql、ExecuteSql和ExecuteInsertSql,其中ExecuteSelectSql函数用来执行查询操作,ExecuteSql用来执行修改、插入和删除三类操作,ExecuteInsertSql执行需要返回刚插入记录的identity的insert语句。
通过ADO.NET执行SQL语句从而对数据库进行操作,一般顺序为:先通过SqlConnection的Open函数连接到数据库,然后再通过Sqlcommand执行指定的SQL语句,执行结束后再调用SqlConnection的Close函数关闭数据库连接。
ExecuteSelectSql函数的代码如下:
/// <summary>
/// 执行select类型的sql语句,返回select得到的数据集
/// </summary>
/// <param name="sqlSelect">select语句</param>
/// <returns>返回select得到的数据集</returns>
public static DataSet ExecuteSelectSql( string sqlSelect )
{
SqlConnection conn = new SqlConnection(connString);
SqlDataAdapter sda = new SqlDataAdapter(sqlSelect,conn);
DataSet ds = new DataSet();
try
{
sda.Fill(ds);
}
catch(SqlException e)
{
throw new Exception(e.Message);
}
return ds;
}
ExecuteSql函数代码如下:
public static int ExecuteSql( string sql )
{
int rows = -1;
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql,conn);
try
{
conn.Open();
rows = cmd.ExecuteNonQuery();
}
catch(SqlException e)
{
throw new Exception(e.Message);
}
finally
{
cmd.Dispose();
conn.Close();
}
return rows;
}
在网站的编写过程中经常会有很多公共函数调用,把它们都写在一个工具类里:MyUtility类,每个函数作为工具类的一个静态成员函数。其中包括MD5静态成员函数以及Alert静态成员函数。
MD5静态成员函数:MD5算法。MD5算法是一个不可逆的加密算法,通常用于重要信息的加密,如登录密码,在ASP.NET中,提供有MD5的算法实现函数,调用MD5算法代码如下:
public static string MD5(string str)
{
string result = "";
result = FormsAuthentication.HashPasswordForStoringInConfigFile(str,"MD5");
return result;
}
Alert静态成员函数的功能是显示一个提示对话框,在网站的运行过程中,经常需要给用户一些即时反馈,比如修改密码成功,选课成功等提示框。代码如下:
public static string Alert(string s)
{
return "<script language=\"javascript\">alert(\""+s+"\");</script>";
}
Back函数的功能是回退到某个网页,i的取值通常为负,当为-1时表示回退到上一个网页,为-2时表示回退到上上个网页,依次类推。代码如下:
public static string Back(int i)
{
return "<script language=\"javascript\">location.href=\"javascript:history.go("+i+");\";</script>";
}
在用户使用系统过程中,可能由于用户操作失败或则网络原因等,系统运行会出现一些错误,为了便于统一,本系统定义专用的错误信息类和错误显示页面。在错误信息类ErrorInfo类中,定义了所有的本系统中所出现的错误情况和函数Message。函数Message根据错误情况得到相应显示字符串。错误显示页面根据URL中错误代码参数显示不同的错误信息。
4.5登录页面
登录页面是所有用户公用的功能。不同的用户登录到系统中将转向不同的页面。解决方法运用了ASP.NET的内置对象Session记录用户登录信息,同样也可以在网站里随时判断用户是否已经登录。
第五章 系统说明书
下面是在线选课系统的预览,此处简单介绍本系统的部分功能。
1.登录页面,如图5-1:
图5-1
在用户名和密码处输入用户名和密码,在“用户类型”下拉列表框中选择“学生”,单击“登录”按钮,登录选课系统。
主要代码如下:
private void btnLogin_Click(object sender, System.EventArgs e)
{
int type = Int32.Parse(ddlType.SelectedItem.Value);
string user = txtUser.Text.Trim();
string inputkey = txtKey.Text.Trim();
string key = "";
string sql = "";
DataSet ds;
switch( type )
{
case 1://学生
//验证学生身份代码
break;
case 2://教师
//验证教师身份代码
break;
case 3://系统管理员
//验证管理员身份代码
break;
default;
break;
}
}
- 查看必修课程列表页面,如图5-2:
图5-2
登录成功后,进入学生主页,点击“必修课程”链接,得到所有必修课程的列表,在列表中可以看到所有必修课程及课程的简单信息,如授课教师姓名、课程所占学分等。
在列表中可以点课程名称,如“计算机应用基础”链接,查看课程详细信息;点教师姓名,如“李萍”链接,查看教师的详细信息;点击“查看上课时间地点”链接,查看对应课程的上课时间和地点。
在页面加载的时候从数据库读取所有必修课信息,代码如下:
string sql = "select Course.*,TName from Course,Teacher where CType like '必修' and Course.TId like Teacher.TId";//查询处所有必修课程信息
DataSet ds = Db.ExecuteSelectSql(sql);
if ( ds != null && ds.Tables.Count > 0 )
{
dgCourse.DataSource = ds.Tables[0];
dgCourse.DataBind();//将查询结果绑定到DataGrid中
}
- 查看选修课程列表页面,如图5-3:
图5-3
单击“选修课程”链接,查看所有选修课程列表,在列表中给出了比必修课程更多的信息,比如多了对应选修课程的前导课程、最大人数、当前已选人数等,对每个选修课程均有一个“选修该课程”的按钮,单击此按钮方可选择对应课程。
主要代码如下:
string sql = "select x.*,TName,(select CName from Course as y where y.CId = x.CPreCId) as CPreCName from Course as x,Teacher where x.CType like '选修' and x.TId like Teacher.TId";
//查询该学生已选修的课程
DataSet ds = Db.ExecuteSelectSql(sql);
if ( ds != null && ds.Tables.Count > 0 )
{
dgCourse.DataSource = ds.Tables[0];
dgCourse.DataBind();
for ( int i = 0; i < ds.Tables[0].Rows.Count; i++ )
{
sql = "select count(*) from SC where CId = "+ds.Tables[0].Rows[i]["CId"].ToString();
DataSet ds1 = Db.ExecuteSelectSql(sql);
if ( ds1 != null && ds1.Tables.Count > 0 && ds1.Tables[0].Rows.Count > 0 )
dgCourse.Items[i].Cells[6].Text = ds1.Tables[0].Rows[0][0].ToString();
}
}
bool locked= bool.Parse(Session["Locked"].ToString());
if ( ! locked )
{
lbLock.Text = "您尚未锁定选课信息!";
}
else
{
lbLock.Text = "选课信息已被锁定!";
dgCourse.Columns[9].Visible = false;
}
- 查看已选课程页面,如图5-4:
图5-4
在上一步查看选修课程的列表中,选择“计算机密码学”、“计算机图形学”、“线性代数”三门课程后,点击“已选课程”链接查看已经选择的课程列表,在列表中除了可以看到与上一步中相同的信息外,还可以查看到课程成绩。刚才选择的三门课程的成绩均为0,当课程结束后,教师登录本系统给所有学生评分,学生再次浏览此页面可查看到课程的成绩,若成绩合格,学生可获得对应课程的学分。
锁定课程代码如下:
string sql = "select count(*) from SC where SId like '"+Session["Id"].ToString()+"'";
DataSet ds = Db.ExecuteSelectSql(sql);
int nCourse=0;
if ( ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0 )
{
nCourse = Int32.Parse(ds.Tables[0].Rows[0][0].ToString());
}
if ( nCourse < 2 )
{
Response.Write(MyUtility.Alert("您必须选择至少两门选修课程!"));
return;
}
else
{
//先将所有必修课程加入到选课表中再锁定
sql = "select CId from Course where CType = '必修'";
DataSet ds2 = Db.ExecuteSelectSql(sql);
if ( ds2 != null && ds2.Tables.Count > 0 )
{
for ( int i = 0; i < ds2.Tables[0].Rows.Count; i++ )
{
string cid = ds2.Tables[0].Rows[i][0].ToString();
sql = "insert into SC(SId,CId,Score) values('"+Session["Id"].ToString()+"',"+cid+",0)";
Db.ExecuteSql(sql);
}
}
sql = "update Student set SLocked = 1 where SId like '"+Session["Id"].ToString()+"'";
if ( Db.ExecuteSql(sql) == 1 )
{
lbLock.Text = "选课信息已被锁定!";
Session["Locked"] = "true";
Response.Redirect("Selectedcourse.aspx");
}
}