摘 要
随着教育改革的不断深化,建立一套能够适应这些改变的教育报表管理 系统也就显得尤为重要。教育报表管理系统是根据某教育局的实际需求进行设计开发的,该报表系统主要记录了教育局其管辖范围内所有教学单位内教育情况的数据,并可进行汇总。
本论文设计采用B/S模式,利用VS2005(c#)、Dreamwear8.0、 MSSQL2000数据库等开发技术,设计与开发了包括报表四级权限管理模块、报表WEB录入页面等功能模块。通过本论文设计开发的功能模块,满足了报表系统中用户分级查询各自报表数据、并且相互不影响的功能需求,实现了报表WEB录入页面简洁直观、报表数据上传方便快捷,同时确保了报表数据的保密性和安全性。
关键词: VS2005(c#);报表管理;权限管理
3.3系统实现环境和技术
本系统在.Net Framework 2.0下实现,采用SQL Server 2000作为数据提供者。系统开发中使用的集成开发环境是和.Net Framework 2.0配套的Visual Studio 2005,使用的语言是C#2.0,它们均推出时间不久。
3.3.1 Visual Studio 2005介绍
Visual Studio 2005 是一系列高效的、智能的开发工具的统称,它拥有一个庞大的产品线,包括面向学生、爱好者、初学者的Express版,面向专家、Visual Basic 6的Standard版,面向顾问、企业开发人员的Professional版和面向架构师的Team System版本。在这些版本中,有些集成了开发软件常用到的东西,比如重构、单元测试、类设计器等等,以方便开发人员快速的设计各类软件。
3.3.2 SQL Server 2000介绍
SQL Server 2000 是一个全面的数据库平台,使用集成的商业智能工具提供了企业级的数据管理。SQL Server 2000 提供了显著增强的网络功能来构建数据库解决方案。利用这些网络特性,用户可以将企业数据以安全、快捷、高效的方式,通过Web页发布给企业内部相关部门或发布给客户群体。SQL Server 2000 具有完备的Web 功能,企业既可以将数据存储在Web 页面上 或XML 文档内,也可将其存储在数据库中,完全适合构建B2B(商业到商)业或 B2C(商业到客户)模式的电子商务,并且通过支持具有多层体系结构的客户/服务器模式为Web 应用提供高度的可扩展性和高可靠性。SQL Server 2000 与 Windows DNA 2000平台一起“融洽”地工作,从而使各种规模的企业或组织能够Web上方便地与客户和供应商进行商业贸易并可以把老式系统集成到下一代的商业解决方案中去。除此之外,SQL Server 2000 可以协助公司更好地理解客户或供应商在Web 站点上的行为,并快速发现由数字经济所提供的新的商业机会。SQL Server 2000还有其它重要的地方,例如丰富的编程接口集。扩 展了Transaction SQL(T-SQL)语言的功能,其中包含了像XPath、XML、XSL、XSLT这样的标准。
3.3.3 C#介绍
C#是一种简单的、现代的、面向对象的、类型安全的、版本控制的、兼容的、灵活的、基于组件开发的编程语言,它是作为Visual Studio中的一部分推出。C#既保持了C++中熟悉的语法,还包含了大量的高效代码和面向对象特性,它简化和革新了C++中的类、名字空间、方法重载和异常处理等领域,摒弃了C++的复杂性,更易用,更少出错。它不仅能应用于WEB服务程序的开发,并且还能开发强大的系统级程序。
C#提供了方便的功能,如垃圾收集、类型安全、版本控制等等。仅有的"代价"就是,代码操作默认是类型安全的,不允许指针。光是类型安全就可以搞定了。但是,如果我们需要指针,仍可以通过非安全码使用它们,而且当调用非安全码时,不能含有列集。
7.1配置信息管理
服务器端的配置:
Windows2000/2003 Sever
Microsoft .NET Framework2.0以上
IIS6.0以上
MSSQL2000以上
数据库连接设置
以文本方式打开Web.Config,设置连接数据库服务器的用户名、密码以及服务器的机器名。下图中以高亮形式显示为需要设置的地方。
Uid=“连接数据库服务器的用户名”;
Pwd=“连接数据库服务器的密码”;
Database=“数据库名称”;
Server=“数据库服务器的主机名”。
请按照实际的情况来设置。
图14 数据库连接图
7.2报表的制作
报表的制作采用Dreamweaver 8 专业网页制作工具制作,不仅方便,而且效率相当高。制作过程非常简单,使用Dreamweaver自带的表格工具进行制作。这里就不详细叙述了。报表是根据教育局原有报表进行排版和设计的。在制作中需要注意网页显示以及打印出的效果是否与教育局的实体表格一致,往往需要经过反复修改才能达到实体的效果。报表制作图见图15
7.3页面的制作
页面的制作我使用的是Photoshop cs 9.0和Dreamweaver 8这两种软件。Photoshop cs 9.0是专门用来进行图像处理的软件。通过它可以对图像修饰、对图形进行编辑,以及对图像的色彩处理,另外,还有绘图和输出功能等。Dreamweaver主要用来制作网页文件。网页素材主要是平时积累所得。先选择比较理想的素材,或者是通过制图软件绘制的图片,通过Photoshop图片处理器做一些必要的修改,添加文字和效果,再使用Dreamweaver软件将制作好的网站图片镶嵌到网页中去。其具体过程我就不详细叙述了。
图15 报表制作图
7.4用户登陆功能
在用户登陆后,系统自动识别用户权限,登陆界面设计如下:
图16系统登陆界面
用户登陆后系统自动识别用户的权限,并把用户权限和用户名用Session方法在服务器保存,密码在数据库里采用MD5加密保存,用户登陆成功后,用户名将在客服端用Cookie方式保存,这样避免了用户在登陆系统时重复输入用户名和密码,在其他页面初始化时,将判断客服端的保存的Cookie值,如果值为空将返回登陆界面。
主要代码如下:
string pwd;
pwd = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Password.Text, "MD5"); //密码用MD5加密
drLogin = new scReader("select userid,countyid,townid,schoolid,userpower from sysuser where username='" + UserName.Text + "' and userpwd='" + pwd + "'");//查询用户名和密码是否存在
if (Password.Text != "" && UserName.Text != "" && drLogin.Read())//如果用户名,密码都正确
{
//写入Cookies
HttpCookie MyCookie = new HttpCookie("UserName"); //新建Cookie
MyCookie.Value = UserName.Text; //保存UserName为Cookie
DateTime dt = DateTime.Now; //得到系统时间
TimeSpan ts = new TimeSpan(30, 0, 0, 0); //设置cookie的过期时间为当前时间后的10000分钟
MyCookie.Expires = dt.Add(ts); //添加Cookie的过期时间
Response.Cookies.Add(MyCookie); //保存Cookie的设置
Response.Redirect("Manage.aspx", true); //转向管理页面
}
Else //用户名和名判断失败
{
Response.Write("<script language='javascript'>alert('用户名或密码错误,请重新输入!');</script>"); //提示
UserName.Text = "";
Password.Text = "";
}
drLogin.Close(); //数据库对象关闭
}
7.5四级权限与用户添加
图17权限管理与用户模块界面
四级权限管理与用户的添加根据管理员完成,对应执行相应的代码
主要代码如下:
if (dlAddUser1.SelectedValue.ToString() == "市级权限") //添加市级用户的代码
{
drLogin = new scReader("select cityid from syscity where cityname='" + dlAddUser2.SelectedValue.ToString() + "'");//查询市级ID
if (drLogin.Read())
{
cityid= (int)drLogin["cityid"];//保存CityID
drLogin = new scReader("insert sysuser(countyid,townid,schoolid,userpower,cityid,username,userpwd) values(0,0,0,0," + cityid + ",'" + txtAddUserName.Text + "','" + System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(txtAddUserPwd.Text, "MD5") + "')");
//用户名,密码,用户权限写入数据库
Response.Write("<script language='javascript'>alert('添加成功!');</script>");//添加成功
txtAddUserName.Text = "";
txtAddUserPwd.Text = "";
}
}
if (dlAddUser1.SelectedValue.ToString() == "县级权限")//添加县级权限的代码
{
drLogin = new scReader("select countyid,cityid from syscounty where countyname='" + dlAddUser2.SelectedValue.ToString() + "'"); //查询县级ID,市级ID
if (drLogin.Read())
{
countyid = (int)drLogin["countyid"]; //保存县级ID
cityid = (int)drLogin["cityid"]; //保存市级ID
drLogin = new scReader("insert sysuser(townid,schoolid,userpower,cityid,countyid,username,userpwd) values(0,0,1," + cityid + "," + countyid + ",'" + txtAddUserName.Text + "','" + System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(txtAddUserPwd.Text, "MD5") + "')");
//写入数据库用户名,密码,权限
Response.Write("<script language='javascript'>alert('添加成功!');</script>");//添加成功
txtAddUserName.Text = "";
txtAddUserPwd.Text = "";
}
}
if (dlAddUser1.SelectedValue.ToString() == "乡镇级权限")//添加乡镇级权限ID
{
drLogin = new scReader("select countyid,townid,cityid from systown where townname='" + dlAddUser2.SelectedValue.ToString() + "'");
//查询乡镇级ID,县级ID,市级ID
if (drLogin.Read())
{
countyid = (int)drLogin["countyid"]; //保存县级IID
townid = (int)drLogin["townid"];//保存乡镇级D
cityid = (int)drLogin["cityid"]; //保存市级ID
drLogin = new scReader("insert sysuser(schoolid,userpower,cityid,townid,countyid,username,userpwd) values(0,2," + cityid +"," + townid + "," + countyid + ",'" + txtAddUserName.Text + "','" + System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(txtAddUserPwd.Text, "MD5") + "')");
//写入数据库用户名,密码,权限
Response.Write("<script language='javascript'>alert('添加成功!');</script>"); //添加成功
txtAddUserName.Text = "";
txtAddUserPwd.Text = "";
}
}
if (dlAddUser1.SelectedValue.ToString() == "学校权限")
//添加学校级权限的代码
{
drLogin = new scReader("select countyid,townid,schoolid,cityid from sysschool where schoolname='" + dlAddUser2.SelectedValue.ToString() + "'");
//查询学校级ID,乡镇级ID,县级ID,市级ID
if (drLogin.Read())
{
countyid = (int)drLogin["countyid"]; //保存县级ID
townid = (int)drLogin["townid"]; //保存乡镇级ID
schoolid = (int)drLogin["schoolid"]; //保存学校级ID
cityid = (int)drLogin["cityid"]; //保存市级ID
drLogin = new scReader("insert sysuser(userpower,cityid,schoolid,townid,countyid,username,userpwd) values(3," + cityid + "," + schoolid + "," + townid + "," + countyid + ",'" + txtAddUserName.Text + "','" + System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(txtAddUserPwd.Text, "MD5") + "')");
//写入数据库用户名,密码,权限
Response.Write("<script language='javascript'>alert('添加成功!');</script>");
//添加成功
txtAddUserName.Text = "";
txtAddUserPwd.Text = "";
}
}
}
7.6报表权限控制
在报表录入数据是,同时加入其权限控制。
Userid,CityID,CountyID,TownID,SchoolID,用户在录入报表时,同时在报表数据中写入报表与用户相对应的Userid,CityID,CountyID,TownID,SchoolID这几个值,这样可以很快查出报表数据的所属地。主要代码如下:
if (Request.QueryString["method"].ToString() == "input")
//通过Query得到报表的操作状态
{
sql1 = "insert ";
sql1 += Request.QueryString["table"] + "(";
sql2 = " values(";
try
{
while (true)
//构造sql语句
{
sql2 += "'" + Session["A" + num].ToString() + "',";
sql1 += "A" + num + ",";
num++;
}
}
catch
{
}
if (num == 1)
return;
sql1 += "datadate,cityid,countyid,townid,schoolid,userid)";
//构造sql语句
sql2 += "'" + Request.QueryString["date"].ToString() + "'," + cityid + "," + countyid + "," + townid + "," + schoolid + "," + userid + ")";
//构造sql语句,同时加入数据库表的权限与范围
sql1 = sql1 + sql2;
sql3 = "insert syslog(tablevalue,userid,logdate,property) values('" + Request.QueryString["table"].ToString() + "'," + userid + ",'" + Request.QueryString["date"].ToString() + "','添加')";
//构造数据库日志的SQL语句
Label1.Text = sql3;
}
//报表权限控制代码