3.1 功能模块设计
图2系统主要功能模块
各类用户登录模块:
●管理员登录,主要是对系统进行后台设置,具体包括对教师和学生的信息进行设置,对教评的项目进行设置,对非法数据特征进行设置,查看所有被评的教师的教评结果。
●学生登录,个人信息的修改,对自己的任课教师教评。
●教师登录,查看自己的教评结果以及学生的留言。
学生信息管理模块:添加、删除、修改学生信息。
教师信息管理模块:添加、删除、修改教师信息。
教评信息管理模块:添加、删除、修改教评信息。
非法数据设置模块:对教评结果中有可能出现的非法数据的特征进行设置。
学生教评提交模块:对教师进行教评,并把结果提交到服务器的数据库中。
教评结果查看模块:查看所有的教师的教评结果。
4.2 系统功能分析与代码实现
根据系统的主要功能模块和页面流程的设计,我们可以得出系统所具备的功能:
●其中最基本的功能是:
①管理员登录,根据实际情况添加教师和学生的信息,添加或修改教评内容,开启教评系统,允许学生登录开始教评;
②学生登录系统,根据教师上课的实际情况和所列出的教评内容,对自己的任课教师进行教评,系统对结果进行保存提交;
③教师登录,当教评过程结束后,可以查看学生对自己的教评结果,从中找出自己的优点和不足。
●智能完善的功能:
①根据管理员对教评库的设置,智能生成教评界面,使教评项目更新方便;
②根据学生的学号不同,自动列出对应的教师;点击对教师教评,甚至可以按照管理员的意愿,不同的学科,可以给出不同的评价内容;
③根据管理员的设置,智能生成非法数据特征库,作为评价提交结果是否合法的依据;
④对于非法的评价结果进行智能筛选,区别处理;
⑤智能统计出没有参与教评的学生名单;
⑥根据教评结果,对每个教师得出结论或者依据评分规则进行打分。
4.3各模块具体的设计
类是面向对象语言中很有特色的一种程序设计思想。在这里,我们正是通过一个名字为DB的类,来完成对SQL数据库的连接,它包含在系统的DB.cs页面中,具体实现代码为:
using System;
using System.Data .SqlClient ;
namespace pjtest { /// <summary>
/// DB 的摘要说明。
/// </summary>
public class DB
{ public DB()
{// TODO: 在此处添加构造函数逻辑 }
public static SqlConnection createCon()
{ SqlConnection con=new
SqlConnection ("server=.;database=test;uid=sa;pwd=sa");
return con;//.代表本地主机;test为数据库名;sa为用户名和密码}
}
}
4.3.1各类用户登录模块
此模块设计起来相对简单,是整个系统进入时第一个呈现给用户的页面,系统中命名为Index.aspx,系统使用下拉列表框控件来对三种不同的身份的用户的选择,然后用两个文本框分别接收用户输入的用户名和密码,通过一个登录按钮对输入进行确认并提交到服务器。
图4系统登录界面截图
系统根据选择用户的不同,到相应的数据库中进行检索,验证正在登录的用户的身份是否合法,具体的实现,是通过SQL的Select 语句,把用户名和密码设置为要查询的条件,在数据库中执行,如果相应的数据库中有这一条记录,则认为此用户存在,被认为是合法的用户;对于合法的用户,根据用户类型的不同,跳转到不同的页面;对于非法的用户给出错误提示,要求重新输入,直到输入正确的信息才可以登录。该模块设计的关键保证合法用户正常登录,非法用户即使通过正确的地址也不能跳转,这主要是通过Session变量来判断,以保证系统的安全性。
4.3.2学生信息管理模块
此模块的设计主要是对学生数据库的修改,该模块在系统中是通过mainStu.aspx页面来实现,页面中使用DataGrid控件和数据库中的学生信息表进行绑定,对其中记录的修改都将影响到学生数据库。包括对学生信息的添加、删除、修改等操作。
添加学生的主要代码:
private void btnADD_Click(object sender, System.EventArgs e)
{//此代码为学生信息管理页面的添加学生的单击事件
try
{//使用try语句,主要对于异常的处理
SqlConnection con=DB.createCon ();//建立数据库连接
string stuNum=this.txtNum.Text ;
string stuName=this.txtName.Text ;
string stuClass=this.txtClass.Text ;
string stuPwd=this.txtPwd .Text ;
if (stuNum=="")
{ Response.Write ("学号不能为空");//对错误的一般判断 }
else
{//记录的插入语句
SqlCommand cmd=new SqlCommand ("insert into stu values('"+stuNum+"','"+stuName+"','"+stuClass+"','"+stuPwd+"')",con);
con.Open();
cmd.ExecuteNonQuery ();//执行数据库语句
this.BindToDataGrid ();//对数据库向datagrid的绑定
con.Close ();
Response.Write ("添加学生成功"); }
}
catch
{Response.Write ("添加失败,请检查约束项!"); }
}
图5学生信息管理模块截图
4.3.3教师信息管理模块
实现方式与学生信息管理模块相同,在系统中为mainTea.aspx页面。
图6教师信息管理模块截图
对教师库的更新语句
private void dgTea_UpdateCommand
(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{ string teaNum=this.dgTea .DataKeys [e.Item .ItemIndex ].Toting ();
string teaName= ((TextBox)(e.Item .Cells [1].Controls [0])).Text ;
string teaPwd= ((TextBox)(e.Item .Cells [2].Controls [0])).Text ;
string teaItem= ((TextBox)(e.Item .Cells [3].Controls [0])).Text ;
string teaClass=((TextBox)(e.Item .Cells [4].Controls [0])).Text ;
SqlConnection con=DB.createCon ();
SqlCommand cmd=new SqlCommand ("update tea set teaName='"+teaName+"',teaPwd='"+teaPwd+"',teaItem='"+teaItem+"',teaClass='"+teaClass+
"'where teaNum='"+teaNum+"'",con);//数据库更新语句
con.Open();
cmd.ExecuteNonQuery ();
this.BindToDataGrid ();
con.Close (); } //语句结束
4.3.4教评信息管理模块
此模块为整个系统比较核心的模块,该模块只能由系统管理员来操作,通过该模块系统管理员可以很方便的设置教评选项,生成教评页面;对于已经生成的评选项目,还可以即时的修改,形成新的教评页面。
下面将重点介绍该模块的实现过程:
图7教评信息管理模块截图
对于数据库中插入语句的删除
private void dgpjItem _DeleteCommand
(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{ string pjNum=this.dgpjItem .DataKeys [e.Item .ItemIndex ].ToString ();
SqlConnection con=DB.createCon ();
SqlCommand cmd= new SqlCommand ("delete from pjItem where pjNum='"+pjNum+"'",con);
con.Open ();
cmd.ExecuteNonQuery ();
this.BindToDataGrid (); con.Close();
this.BindToddlNum ();
}
private void BindToddlNum() //自定义函数
{ SqlConnection con=DB.createCon ();
con.Open ();
SqlCommand cmd=new SqlCommand ("select * from pjItem",con);
SqlDataReader sdr=cmd.ExecuteReader ();
this.ddlNum .DataSource =sdr;
this.ddlNum .DataTextField ="pj";
this.ddlNum .DataValueField ="pjNum";
this.ddlNum .DataBind ();
sdr.Close (); con.Close ();
}
图8 教评信息管理模块的具体实现流程图
根据上面的流程图,我们从中分析:首先要判断登录的是否为合法的管理员,通过查询数据库判断的方法,前面已经说过,这里不再多说;主要是验证是否通过正确的途径跳转到本页面。在我们这个系统中,所有的跳转判断都是通过juge.aspx来实现,在juge.aspx的Page_Load事件中添加以下的代码:
If ( Session["flag"]==null ) { Response.Redirect ("loginFail.aspx"); }
然后,在各个页面中只需要调用就可以了。
进入该页面后,系统首先通过两个datagrid分别与评选类别表(pjDet)、评选项目表(pjItem)的绑定列出来;在datagrid中通过模板可以直接实现修改和删除的功能,由于表中的记录有可能过多,这里要考虑实现分页;在datagrid中实现添加的功能比较复杂,这里我们采用一种比较简单的方法,在页面上添加文本框,通过文本框的输入来添加到数据库中,这里还是使用SQL语句来实现的,当点击"确定"按钮后,更改将直接影响到数据库中的记录,在更改以后,教评界面将根据数据库的记录的不同重新生成,这样的设计可以使系统维护更加简单,大部分的工作都可以让系统智能处理,即使一点都不懂计算机语言的用户,也可以很容易生成新的教评页面。
4.3.5非法数据设置模块
此模块为整个系统实现智能性的核心,它的设计原理类似于杀毒软件中的病毒库;当计算机中存在某些文件,它的运行的特征,在杀毒软件的病毒库中被认为是病毒,则就会把该文件视为病毒来处理;而在我们的系统中也是这样的,下面我们将详细介绍一下该模块的实现过程:
图9非法数据设置模块截图
在管理员登录该模块后,展现给用户的是一组由复选框组成的设置界面,在系统中为用户提供了一些常用的设置非法的选项,比如全部选择第一项、第二项、第三项、第四项以及选择的项目包含某种顺序规律都可以在这里指定。
这里,我们假设管理员想要设置全部选择B、全部选择C以及全部选择D是不可信的教评数据,则管理员登录后,可以选中第二项、第三项、以及第四项,然后点击页面上的"提交"按钮,接下来系统先与判断表相连接,再开始从第一个复选框开始判断是否被选中,执行相应的操作;当判断第二项被选中后,系统将生成一个全为"B"的字符串,长度为教评项目表中项目的个数,然后再将该字符串插入到判断表中,接下来再判断下一个复选框是否被选中,如果被选中则会执行与前面相类似的操作;直到把所有的复选框判断完。这样即可按照管理员的意愿完成对非法数据模型的设置。
当管理员选中某种顺序规律时,系统会组成一些常见的有顺序的选项排列,如 ABCDA...D ABCA...C BCDB...D 等
除此之外,为了使系统使用起来更加灵活,更大程度上的提高系统的智能性,系统还增加了用户自定义的功能,即用户可以自己设置一些除系统所列之外但也被认为是非法或不可信的模型,当选中了页面上的自定义复选框后,页面上会显示出一个文本框,在文本框里面用户可以填写非法模型。为了方便用户使用,这里并不需要用户把整个非法排列都写出来,而是只给出局部的排列,当点击"添加"按钮后系统自动的把它循环生成相应的字符串,然后在列表框中列出来,同时把文本框清空,可以继续添加第二个自定义;同理,可以把所有你认为非法的模型都添加进来,最后整体的提交到数据库中。
举例:如果你自定义添加了"AB",则会生成"ABABA...B"的字符串,并插入到数据库中。这里字符串的长度用户不需要考虑,完全由系统根据评选项目的个数自动生成。
4.3.6用户教评提交模块
此模块为学生登录后,再选择自己的任课教师,然后展现给学生的页面,在系统中命名为mainPj.aspx,该模块为整个系统的核心模块,也是被浏览次数最多的页面,其它的所有模块的设计都是为该模块服务的,都要靠该模块来实现,所以这个模块设计的好坏,将直接影响到整个教评系统运行的好坏。
以下代码为对教评界面的优化:
Private void clear () //去掉datagrid中前面相同的列
{ string pjNum=this.dgMainPj .Items [0].Cells [0].Text ;
string pj=this.dgMainPj .Items [0].Cells [1].Text ;
for(int i=1;i<this.dgMainPj .Items .Count ;i++)
{
if(pjNum==this.dgMainPj .Items [i].Cells[0].Text )
{
this.dgMainPj .Items [i].Cells [0].Text ="";
this.dgMainPj .Items [i].Cells [1].Text ="";
}
else{
pjNum=this.dgMainPj .Items [i].Cells [0].Text ;
pj=this.dgMainPj .Items [i].Cells [1].Text ;
}
}
}
在用户进入该模块后,首选系统将检索数据库中的教评类别表和教评项目表,并按照类别将教评项目以表格的形式列出来;对于教评项目中的选项,将在选项的前面添加单选按钮,用来供用户选择。系统对教评类别和教评项目没有任何的限制,完全可以由管理员按照实际情况或自己的意愿来设置,只要是按照正常的方式添加的,都可以很好的生成美观的教评页面。(在这里,我们需要说明一点,如果还想增加系统的智能性,使系统更为合理。我们还可以在点击开始教评后,记录下来被教评的教师编号和课程编号,根据教师所属系的不同和所教课程的不同,连接不同的教评类别表和教评项目表,以便做到对不同学科的教师进行不同标准的教评,这样可以使得教评更为合理,教评结果更为真实可靠。)
以下代码为实现学生教评结果的判断并向数据库提交:
private void btnTj_Click(object sender, System.EventArgs e)
{
int a=0;
string b="";
bool flag=true;
for (int i=0;i<this.dgMainPj .Items .Count ;i++)
{ for(int j=1;j<=4;j++)
{ if(((RadioButton)(this.dgMainPj .Items [i].Cells [2+j].Controls [1])).Checked )
{a=j; break; }
}
if(a==0) flag=false;
b=b+a.ToString ();
a=0;
}
if(!flag)
{
Response. Write ("其中包含没有选择的项目!请检查,确保每一项都选择");
}
//产生教评结果,存在于字符串b中;
string teaNum=Request.QueryString ["teaNum"].ToString ();
//接受传递过来的教师编号
string str;
SqlConnection con=DB.createCon ();
SqlCommand cmd=new SqlCommand ("select count(*) from pd where pdItem='" +b+ "'" ,con );
con.Open(); //打开数据库连接
int count=Convert.ToInt32 (cmd.ExecuteScalar ());
con.Close ();
if(count==0)
{cmd.CommandText ="insert into resultA values ('"+teaNum+"','"+b+"')" ;
str="你对该教师评选的结果,提交成功!";}
else
{cmd.CommandText ="insert into resultB values ('"+teaNum+"','"+b+"')" ;
str="由于您所评的结果,被管理员认为是非法的,但还是被提交,请珍惜你的权力!"; }
con.Open ();
cmd.ExecuteNonQuery ();
//执行数据库操作
Response.Write (str);
con.Close (); //关闭数据库连接
string stuNum=Session["stuNum"].ToString ();
cmd.CommandText ="update flag set flag='1'where stuNum='"+stuNum+"'and teaNum='"+teaNum+"'";
con.Open ();
cmd.ExecuteNonQuery ();
con.Close ();
this.LinkButton1.Visible =true; //显示返回按钮
this.btnTj .Enabled =false; //提交按钮不可用
}
图10教评系统主界面截图
当用户对教评项目选择完成后,点击提交按钮后,系统将准备把用户的选择结果保存到数据库中。在保存期间,系统首选会判断一下,是否每一个教评项目用户都做出了选择,对于没有完成所有选择的情况,系统将给出智能提示,让用户做出选择。直至所有的选项用户都做出了选择。
然后,系统将把用户选择的结果与非法结果特征库相比较,以此来判断用户的选择是否可信。对于可信的结果,将给出提示,并写入合法结果数据库中,即resultA中;而对于不可信的结果,也将给出提示,告知用户要做出正确的选择,并写入非法的数据库中,即resultB中。对于可信的和不可信的教评结果系统都允许提交到数据库中,只不过所给的提示和所写入的数据库有所不同。当然也可以改为,对于不可信的教评结果不允许提交,只需对代码稍加更改即可以实现,在这里不再多说了。
向数据库提交结果时,系统只将教师编号,课程编号,教评的结果这三项进行提交,而不把学生的学号提交,这样做是为了增加教评的可信度,从根本上杜绝每个学生的教评结果被泄漏。
当结果提交成功后,页面上将显现出一个"返回"按钮,点击该按钮系统将回到选择教师开始教评的界面。在这里我们会发现系统非常智能,当一个学生对自己其中的一个任课教师完成教评回到这个界面后,系统将把已经评过教的教师隐藏起来,只把那些还没有评的教师列出来,非常方便学生的使用。这一点的实现技巧也很简单,只是在系统中增加了一个标志数据库,标志数据库是系统根据学生库和教师库的记录自动生成的,无需管理员的任何操作,随便学生库和教师库的不同,标志库也会自动的变化,随时满足系统的需要。
在标志数据库中,只有学生编号,教师编号以及一个标志位,每一个学生编号都将对应他所有的任课教师的编号。在系统初始化的时候,所有的标志位都为0,每当一个学生对自己的某个任课教师完成教评后,对应的标志位就会改为1,用来标志此学生已经对该教师进行了教评。
有了标志数据库的存在,在学生通过学号和密码登录到系统后,系统将会检索标志数据库,从中找出所有学号与登录学号相同的记录,并把其中标志位为0的记录列出来,当对一个教师完成教评后,点击"返回"按钮后,系统将重新执行上面的操作。由于标志位的变化,相应的被教评的教师列表也会发生适时的变化。另外,根据标志数据库,在教评活动结束后,系统也可以很轻松的列出没有按要求参与并完成教评的学生,方便管理员了解参与教评活动的学生的具体情况,更好的利用教评结果。
对标志数据库的说明:随着教师和学生的人数的增多,标志数据库的记录会成倍的增长。在对数据库的检索的性能,可能会有所下将,但对系统整体性能的影响是微乎其微的。由于标志数据库的存在,可以很好的解决智能列出每个学生对应的教师、适时显示每个学生还未完成教评的教师,智能统计没有参与教评的学生名单等一系列的问题,所以它的存在还是很有意义的。
4.3.7教评结果查看模块
本系统提供了两种不同方式的查询,管理员可以在教评的整个过程中,对所有教师的教评结果进行查询,实时掌握教评活动的最新进展,方便控制整个活动的进度;教师可以在整个教评活动结束后,查询教评的结果,但是只可以查看学生对自己的教评结果,不可以查看别的教师的教评结果。
图11教评结果查看截图