1. 概述
1.1课题题目:学生选课系统 1.2系统的主要目标:
本系统目标是实现选课系统所需的各种基本功能,包括学生选课、退课功能和教师查看选修课程、提交课程成绩功能以及管理员添加学生、维护学生信息、成绩管理、添加教师、维护教师信息、维护选修课程,还有公用的修改密码等功能。 1.3 系统的开发环境及运行环境:
操作系统: Windows XP Pro SP2 建模工具: Rational Rose 2003 数据库系统:SQL Server2000 开发工具: Visual Studio 2005 Web 服务器:IIS+https://www.sodocs.net/doc/a012646716.html, 2.0平台
2. 系统需求分析
学生选课系统主要满足来自三方面的需求,这三个方面分别是学生用户、教师用户和管理员用户,也即是三类用户角色。
(1)学生用户是主要的需求者,主要需求功能是查询可选课程、查看自己选课情况及进行选课、退课操作等;
(2)教师用户主要需求功能是查看自己所教授的课程、课程有哪些学生选修、以及利用本系统提交学生的成绩;
(3)管理员用户的功能需求较为复杂,包括对学生信息、教师信息、课程信息进行管理。在学生信息管理子模块中,实现对学生信息的添加、修改、删除操作,还可以输入查询条件进行查询操作。在教师管理子模块中,实现对教师信息的添加、修改、删除、查询等操作。在课程管理子模块中,实现对课程信息的添加,添加时为其分配任课教师、上课时间和地点,实现对课程的修改、删除、查看某个课程的详细信息等。
本系统将管理员用户、教师用户、学生用户的身份及权限进行严格的划分,让管理员拥有最高权限,可以查看、维护系统中的所有信息,如添加学生,添加课程,修改课程信息等;让教师拥有查看自己开设的课程的信息,以及提交所开设课程成绩的权限;让学生拥有选课和退选的权限;而修改密码模块的权限每个用户都可拥有,用以修改自己的密码信息。通过进行严格的权限划分,可以更好地进行管理,也可更好地保护用户信息安全。
2.1 用例图
选课
查看选课
退课
查看学生选课提交成绩
添加学生
学生管理
<
<
教师管理
<
<
学生用户
<
教师用户
<
<
图2-1 学生选课系统用例图
用例图说明:
(1)系统的外部角色有:学生用户、教师用户和管理员。
(2)系统主要用例的文档描述:
①学生管理用例:学生用户可见的功能,包含了选课、退课和查看选课三个用例功能。
②教师管理用例:教师用户可见的功能,包含了查看学生选课和提交成绩两个用例功能。
③信息管理用例:管理员可见的功能,这个用例进一步分为三个用例:学生信息管理用例、
教师信息管理用例和课程信息管理用例。
④学生信息管理用例:信息管理用例可见的功能,实现学生信息的管理功能,包含了添加学
生、修改学生信息和删除学生三个用例。
⑤教师信息管理用例:信息管理用例可见的功能,实现教师信息的管理功能,包含了添加教
师、修改教师信息和删除教师三个用例。
⑥课程信息管理用例:信息管理用例可见的功能,实现课程信息的管理功能,包含了添加课
程、修改课程信息和删除课程三个用例。
⑦修改密码用例:所有用户都可见的功能,用于修改用户的密码信息。
(3)系统用例之间的关系:
①学生管理用例与选课、查看选课、退课三用例之间是包含关系。
②教师管理用例与查看学生选课、提交成绩两用例之间是包含关系。
③信息管理用例与学生信息管理用例、教师信息管理用例和课程信息管理用例之间是包含关
系。
④学生信息管理用例与添加学生、修改学生信息和删除学生三个用例之间是包含关系。
⑤教师信息管理用例与添加教师、修改教师信息和删除教师三个用例之间是包含关系。
⑥课程信息管理用例与添加课程、修改课程信息和删除课程三个用例之间是包含关系。(4)系统关键用例的正常事件流图和异常事件流图
表2-1 修改密码用例的正常事件流图和异常事件流图
用例名称修改密码
参与者管理员、教师、学生
描述管理员、教师、学生用户进行密码修改
启动单击“修改密码”链接
前置条件用户成功登录
主事件流
用户系统
1.进入用户修改密码界面,输入旧密码一次
,新密码两次
2.系统检查密码格式是否相符
3.系统检查旧密码是否正确
4.如果正确,进行密码修改,转入密码修改成功界
面
异常流
异常流密码检查未通过
系统返回密码修改界面,提示旧密码不正确,新密码
格式不符,两次不同等密码
异常用户旧密码错误
表2-2 提交成绩用例的正常事件流图和异常事件流图
用例名称提交成绩用例
参与者教师用户
描述提交选自己开设课程的学生的成绩
启动进入提交成绩界面
前置条件用户成功登录
后置条件尚未提交过成绩
主事件流
用户系统
1.单击提交成绩
2.系统提交成绩页面
3.填写学生成绩,单击提交成绩
5.更新学生成绩,提示提交成功
异常流
异常流用户已经提交过该门课程成绩
系统提示该课程成绩已提交,不能再次提交
2.2类图
图2-2 学生选课系统类图
类图说明:
(1)BaseUser类是一个系统角色用户的基类,主要方法有两个:modifyPWD() 用于修改用户的密码;
loginCheck() 用于用户登录验证。
(2)Admin类继承自BaseUser类。
(3)Student类继承自BaseUser类,主要方法有:
studentAdd() 用于添加学生;
studentDel() 用于删除学生;
studentUpdate() 用于更新学生信息;
getStudents() 用于获取学生列表。
(4)Teacher类继承自BaseUser类,主要方法有:
teacherAdd() 用于添加教师;
teacherDel() 用于删除教师;
teacherUpdate() 用于更新教师信息;
getTeachers() 用于获取教师列表。
(5)Course类是一个课程类,主要方法有:
courseAdd() 用于添加课程;
courseDel() 用于删除课程;
courseUpdate() 用于修改课程信息;
getCourses() 用于获取课程列表。
(6)Elect类是一个选课表类,主要方法有:
elect() 选修课程;
electDel() 退选课程;
getElectInfo() 获取选课信息;
haveSubmit() 检测是否已提交过成绩; submitScore() 提交成绩。
2.3 顺序图
(1) 管理员修改课程信息顺序图
图2-3 管理员修改课程信息顺序图
(2)
学生用户退选课的顺序图
图2-4 学生用户退选课的顺序图
(3) 教师提交成绩顺序图
: 管理员
: BaseUser
: Admin : Course
1: 登录
2: 验证登录
3: 进入管理员界面
4: 点击“修改课程”
5: 修改课程信息
6: 提示修改成功
: 学生用户
: BaseUser
: Student
: Elect
1: 登录
2: 登录验证
3: 进入学生界面
4: 点击“退课”
5: 退选课程
6: 提示退课成功
图2-5 教师提交成绩顺序图
2.4 协作图(可选)
(1) 学生用户选课协作图
图2-6 学生用户选课协作图
(2) 教师提交成绩协作图
: 教师用户
: Teacher
: BaseUser
: Elect
1: 登录
2: 验证登录
3: 进入老师界面
4: 点击“提交成绩”
5: 准备提交成绩
6: 验证是否已提交成绩
7: 提交成绩
8: 提示提交成功
: 学生用户
: Student
: BaseUser
: Elect
验证用户身份
验证是否课程时间冲突
3: 点击选课
6: 提示选课成功
1: 输入账户、密码
2: 登录成功
4: 提交选课信息
5: 选课成功
图2-7 教师提交成绩协作图
3. 系统总体设计 3.1 设计问题域子系统
学生选课系统是实现学生选课退课、教师提交成绩以及学校教务管理员维护信息的一个平台,整个学生选课系统有前台和后台两部分,共分为4个模块:管理员模块,教师模块,学生模块和公有模块,分别用于完成各自的功能。以下为学生选课系统总体设计图和各功能模块说明:
(1)总体设计图
: 教师用户 : Teacher
: Elect
: BaseUser
验证用户身份
验证是否已提交
1: 输入用户名、密码2: 登录成功
3: 点击提交成绩
6: 提示提交成功
4: 准备提交成绩
5: 提交成功
学生选课系统
前台模块
后台模块
学生登录模块
教师登录模块
学生处理模块
教师处理模块
管理员处理模块
公共模块
管理员登录模块
(2)各模块功能
表3-1 学生选课系统功能模块表
功能模块
包含子功能模块 功能
管理员模块
学生管理子模块
对学生信息的添加、修改,删除操作
教师管理子模块
对教师的添加,修改,删除,查询操作 课程管理子模块 对课程的添加,添加时为其分配任课教师,上
课时间和地点,实现对课程的修改,删除,查看某个课程的详细信息等
教师模块
实现查看自己所教授的课程,课程有哪些学生选修,以及利用本系统提交学生的成绩
学生模块 实现学生选课,查看所选课程,修改自己的选课信息 公有模块
实现用户的身份验证,密码修改,退出系统等功能
3.2 设计数据管理子系统
(1)数据库表
表3-2 数据库表
序号 数据库表
数据表存储的内容
1 Student 存储学生的信息
2 Teacher 存储教师的信息
3 Users 存储管理员的信息
4 Elect 存储选课的信息
5 Cource 存储课程的信息 6
Depart
存储学校系院信息
(2)数据表之间的关系
图3-2 数据表之间的关系图
(3)数据库表结构
①学生表Student的详细数据字段:
表3-3 Student学生用户表
序号字段名字段类型说明备注
1 stuID nvarchar(20)not null 学生学号关键字
2 stuPwd nvarchar(20)not nul 学生密码
3 stuName nvarchar(20)not nul 学生姓名
4 stuDepart Int 学生系院号
5 stuGrade int 学生年级
6 stuClass int 学生班级
②教师表Teacher的详细数据字段:
表3-4 Teacher教师用户表
序号字段名字段类型说明备注
1 teaID nvarchar(20)not null 教师编号关键字
2 teaPwd nvarchar(20)not null 教师密码
3 teaName nvarchar(100)not null 教师姓名
4 teaDepart Int(4) 教师系院号
③课程表Course的详细数据字段:
表3-5 Cource课程信息表
序号字段名字段类型说明备注
1 courseID nvarchar(20)not null 课程编号关键字
2 teaID nvarchar(20)not null 教师编号关键字
3 courseName nvarchar(100) not null 课程名称
4 courseTime nvarchar(20) 上课时间
5 courseAddress nvarchar(50) 上课地点
6 courseInfo Text 课程简介
④选课表Elect的详细数据字段:
表3-6 Elect选课信息表
序号字段名字段类型说明备注
1 stuID nvarchar(20)not null 学生学号关键字
2 courseID nvarchar(20)not null 课程编号关键字
3 teaID nvarchar(20)not null 教师编号关键字
4 Score int 课程成绩
⑤系统管理员表Users的详细数据字段:
表3-7 Users管理员表
序号字段名字段类型说明备注
1 adminName nvarchar(20)not null 系统管理员用户名关键字
2 adminPwd nvarchar(20) 系统管理员密码
⑥系院表Depart的详细数据字段:
表3-8 Depart系院表
序号 字段名 字段类型
说明
备注
1 departID Int not null 系院号 关键字 2
departName
nvarchar(100)
系院名称
3.3 设计人机交互子系统
(1)用户分类
本系统的用户可分为三类: ①管理员用户; ②教师用户; ③学生用户。 (2)用户描述
①管理员用户的描述:
管理员用户在整个选课系统中起到管理和维护的作用,对学生和教师的信息进行管理和维护以及开设课设等职责。 ②教师用户的描述:
教师用户在本系统中具有管理选修了自己开设的课程的学生的权限,查看选修了自己开设课程的学生信息有及提交学生成绩。 ③学生用户的描述:
选课系统主要是针对管理学生的,学生在本系统中具有修改自己的信息,以及选课和退选的功能。
(3)设计命令层次
①系统的人机交互子系统的内容和准则:
本学生选课系统的人机交互子系统在根据不同的用户身份登陆到不同的页面,然后按照不同的用户只能进行用户权限内的操作,其结构图如下:
②通过采用树形结构,细化命令的组织方式,如下:
主系统界面
管理员用户
学生用户
教师用户
主系统界面
学生用户界面
教师用户界面
管理员用户界面
图3-3 人机交互子系统结构图
4.详细设计
学生选课系统是实现学生网上选课、教师提交成绩以及学校教务管理员维护信息的一个平台,整个学生选课系统共分为4个大模块:管理员模块,教师模块,学生模块和公有模块,其中复杂的方法和模块的详细设计流程图如下。
4.1系统用户登录流程图
4.2 用户密码修改流程图
输入用户名、密码
验证用户名、密码
提示用户登录失败
进入相应的用户页面
选择相关管理操作
安全退出系统
验证正确 结束
是
否
图4-1 系统用户登录流程图
4.3教师提交成绩流程图
4.4管理员添加课程流程图
输入用户旧密码、新密码 验证用户密码是否合法
输入不合法,重新输入
修改用户密码
提示修改成功
是否合法? 结束
图4-2 用户密码修改流程图
是 否
开始
点击成绩提交
填写学生成绩
提示已提交,不能再提交
点击提交
提交成绩,并提示成功
检查是否已提交过 确认提交? 结束
是
否
否
是
图4-3教师提交成绩流程图
4.5学生选修课程流程图
5. 系统实现
开始
退出
转到添加课程 填写课程信息 点击添加
填写编号
提示重新填写编号
添加课程 提示添加成功
课程编号是否重复?
否
是
图4-4 管理员添加课程流程图
开始
结束
点击选修
选修成功
更新选、退课课表
提示时间冲突,不能选修
上课时间冲突
继续选课?
是
否
是
否 图4-5 学生选修课程流程图
本系统采用了三层架构来实现,即分为用户界面层(UI)、业务逻辑层(BLL)和数据访问层(DAL),用户界面层是展示给用户的界面,方便用户与系统进行交互;业务逻辑层是对系统业务实体的封装,完成系统业务功能;数据访问层直接与数据库打交道,为业务逻辑层提供底层的数据库操作。
5.1 Database类主要是与数据库连接,提供数据库操作功能,代码如下:
namespace MyElectCourse.DAL
{
public class Database
{
protected string connectionString;
protected SqlConnection connection = null;
public Database()
{
connectionString =
ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.ToString();
}
~Database()
{
if (connection != null)
{
connection = null;
}
}
protected void Open()
{
if (connection == null)
{
connection = new SqlConnection(connectionString);
}
if (connection.State.Equals(ConnectionState.Closed))
{
connection.Open();
}
}
protected void Close()
{
if (connection != null)
{
connection.Close();
}
}
public int ExecuteSQL(string sqlstr)
{
int count = -1;
this.Open();
SqlCommand cmd = new SqlCommand(sqlstr, connection);
count = cmd.ExecuteNonQuery();
this.Close();
return count;
}
public DataSet GetDataSet(string sqlstr)
{
this.Open();
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(sqlstr,connection);
adapter.Fill(ds);
this.Close();
return ds;
}
public DataTable GetDataTable(string sqlstr)
{
DataSet ds = this.GetDataSet(sqlstr);
DataTable dt = new DataTable();
if (ds.Tables.Count > 0)
{
dt = ds.Tables[0];
}
return dt;
}
public SqlDataReader GetDataReader(string sqlstr)
{
this.Open();
SqlCommand cmd = new SqlCommand(sqlstr, connection);
SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
//this.Close();
return sdr;
}
}
}
5.2 UserBase类是所有系统角色用户的基类,完成用户登录验证与修改密码的功能,代码如下:namespace MyElectCourse.BLL
{
public class UserBase
{
private string userID;
public string UserID
{
get { return userID; }
set { userID = value; }
}
private string userPSW;
public string UserPSW
{
get { return userPSW; }
set { userPSW = value; }
}
public string loginCheck(string uid, string upwd, string urole)
{
String selectStr = String.Empty;
switch (urole)
{
case"0": //身份为教师时
selectStr = "Select * from Teacher where teaID = '" + uid + "'";
break;
case"1": //身份为学生时
selectStr = "Select * from Student where stuID = '" + uid + "'";
break;
case"2": //身份为管理员时
selectStr = "Select * from Users where adminName = '" + uid + "'";
break;
default:
return null;
}
Database db = new Database();
DataTable dt = db.GetDataTable(selectStr);
if (dt.Rows.Count > 0) //如果该用户存在
{
if (dt.Rows[0][1].ToString().Equals(upwd)) //密码正确
{
switch (urole)
{
case"0": //身份为教师时
return"0";
case"1": //身份为学生时
return"1";
case"2": //身份为管理员时
return"2";
default:
return null;
}
}
else//密码错误,给出提示信息!
{
return"-1";
}
}
else//用户不存在或用户名输入错误
{
return"-2";
}
}
public string modifyPWD(String urole, String uid, String oldPwd, String newPwd)
{
String updateStr = String.Empty;
switch (urole)
{
case"0": //身份为教师时
updateStr = "update Teacher set teaPwd='" + newPwd + "' where teaID='" + uid + "'";
break;
case"1": //身份为学生时
updateStr = "update Student set stuPwd='" + newPwd + "' where stuID='" + uid + "'";
break;
case"2": //身份为管理员时
updateStr = "update Users set adminPwd='" + newPwd + "' where adminName='"
break;
}
string ucheck = this.loginCheck(uid, oldPwd, urole);
if (ucheck.Equals("0") || ucheck.Equals("1") || ucheck.Equals("2"))
{
int t = new Database().ExecuteSQL(updateStr); //根据修改后返回的结果给出提示
if (t > 0)
{
return"1";
}
else
{
return"0";
}
}
else
{
return"-1";
} } }}
5.3 系统登录页面,代码及运行效果如下: