
用户E-R图如图6所示。

图6 用户E-R图
管理员E-R图,如图7所示。

公告E-R图,如图8所示。

图8公告E-R图
申报时间设置E-R图,如图9所示。

图9申报时间设置E-R图
申报信息E-R图,如图10所示。

图10申报信息E-R图
课题申报系统中所涉及到的主要实体集及属性如下。
用户﹛自动编号,用户ID,密码,密码提示问题,问题答案,Email,性别,联系地址,邮政编码,电话,注册日期,是否被锁定﹜;管理员﹛自动编号,管理员用户名,密码,权限级别,Email,QQ,联系电话﹜;申报时间设置﹛自动编号,年度,申报开始时间,申报截止时间,完成提交开始时间,完成提交截止时间﹜;申报信息﹛自动编号,课题编号,类别,课题名称,学科分类,负责人,工作单位,办公电话,家庭电话,通讯地址,邮编,成员,评审序号,是否立项,立项编号,申报年度,结项与获奖,用户名,是否已被校对﹜;系统公告﹛自动编号,公告标题,公告内容,发布时间﹜。
3.逻辑结构
E-R图向关系模型的转化要解决的问题是如何将实体和实体间的联系转换为关系模式,如何确定这些关系横式的属性和码。 可将前面的E-R图转换为关系模型。每个关系的码可以用下划线表示。
用户﹛自动编号,用户ID,密码,密码提示问题,问题答案,Email,性别,联系地址,邮政编码,电话,注册日期,是否被锁定﹜;管理员﹛自动编号,管理员用户名,密码,权限级别,Email,QQ,联系电话﹜;申报时间设置﹛自动编号,年度,申报开始时间,申报截止时间,完成提交开始时间,完成提交截止时间﹜;申报信息﹛自动编号,课题编号,类别,课题名称,学科分类,负责人,工作单位,办公电话,家庭电话,通讯地址,邮编,成员,评审序号,是否立项,立项编号,申报年度,结项与获奖,用户名,是否已被校对﹜;系统公告﹛自动编号,公告标题,公告内容,发布时间﹜。
4.物理结构
根据以上分析,系统数据库中各个表的设计结果如表1至表5所示。每个表格表示在数据库中的一个表。本系统中关于数据库表结构设计如下:普通用户信息表(User),管理员信息表(Admin),系统公告表(Announce),申报时间设置表(ExpiredTime),申报信息表(Report)。下面将具体介绍数据库中各个表的结构。
表1普通用户信息表(User)



四、系统实现
1.数据库连接的建立
本系统使用的数据库为Access2003,首先需要在系统的相应目录下建立一个Access数据库,名为LuoHe_Data#KW.mdb,然后在Web.config(系统配置文件)中的 <appSettings>节中添加数据库所在路径,如数据库在E:\KeWei\database\下,设置如下代码:
<appSettings>
<!-- 这里是系统数据库文件,可以根据实际情况修改 -->
<!--add key="data" value="database\new_baoming.asax" /-->
<add key="ConnectionStr" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\KeWei\database\LuoHe_Data#KW.mdb"/>
</appSettings>
2.系统主页面default.aspx的设计
页面结构如图1所示。此页为用户进入本系统进行申报提供了唯一的入口,用户在输入用户名、密码、图形效验码都正确后才能通过,否则将给出提示出错信息。后台代码如下:
Imports System.Data.OleDb'由于要使用到数据操作,故引入System.Data.OleDb类
Imports System.Configuration'将web.config文件中的有关数据连接的节引入
Imports System.Web.Security'由于要使用到MD5加密,因此引入Security类
Partial Class UserLogin
Inherits System.Web.UI.Page
Dim myConnection As OleDbConnection'声明一个全局的数据连接变量,供后面使用
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
myConnection=New
OleDbConnection(ConfigurationSettings.AppSettings("ConnectionStr"))
'当页面加载时,将一个数据连接实例化
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Not TextBox_CheckNum.Text = Session("vali") Then
Response.Write("<script>alert('提示:\n\n你输入的验证码错误!');</script>")
Else
Dim Loginname As String
Dim LoginPassword As String
LoginPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox_userpass.Text.ToString.Trim, "MD5")
'把用户输入的密码加密
Dim myCommand As OleDbCommand
Dim SqlStr As String
Dim myReader As OleDbDataReader
Loginname = Server.HtmlEncode(TextBox_username.Text.ToString.Trim)
'过滤用户输入HTML代码
SqlStr = "Select UserName,Password,LockUser from [user] Where UserName=@UserName"
myCommand = New OleDbCommand(SqlStr, myConnection)
yCommand.Parameters.Add(New OleDbParameter("@UserName", OleDbType.VarChar))
myCommand.Parameters("@UserName").Value = Loginname
Try
myCommand.Connection.Open()
myReader = myCommand.ExecuteReader
If myReader.Read Then
If myReader("Password") = LoginPassword Then
If myReader("LockUser") = True Then
Response.Write("<script>alert('提示:\n\n该用户已被系统管理员锁定,请与系统管理员联系!');</script>")
Else
Session("UserName") = myReader("UserName")
Session("UserType") = "CommonUser"
Response.Redirect("User/indexUser.aspx")
End If
Else
Response.Write("<script>alert('提示:\n\n你输入的密码不正确!');</script>")
End If
Else
Response.Write("<script>alert('提示:\n\n此用户不存在!');</script>")
End If
Catch ex As Exception
Response.Write(ex.Message.ToString)
Finally
myCommand.Connection.Close()
End Try
End If
End Sub
End Class
3.通用模块的设计
通用模块是系统运行时经常调用或访问的模块。它包括数据库的连接访问、页面操作数据库以及程序运行过程中的异常处理。
(1)生成随机验证码的一个类
在许多Web应用中,要求用户登录时不仅要输入用户名和密码,还要输入随机验证码,以防止非法用户进行暴力破解,在本系统中,普通用户登录和管理员登录时都要求输入随机验证码,这里将生成随机验证码的操作封装成为一个类Validate.vb,当需要更换、移植系统时,只要对代码做少量的修改即可。Validate.vb类的代码如下:
Imports System
Imports System.Drawing.Drawing2D
Imports System.Drawing.imaging
Imports System.Drawing
Imports System.Web.UI
Imports System.IO
Public Class Validate
Public Class CreatValidateNumber
'生成验证码
Public Function CreatValidateNumber(ByVal length As Integer)
Dim vchar As String =
"0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,w,x,y,z"
Dim vcarray() As String = Split(vchar, ",") '将字符串生成数组
Dim vnum As String = ""
Dim i As Byte
For i = 1 To length
Randomize()
vnum = vnum & vcarray(Int(35 * Rnd()))
'数组一般从0开始读取,所以这里为35*rnd
Next
Return vnum
End Function
'创建验证码图片
Public Sub CreatevalidateGraphic(ByVal page As Page, ByVal validatenum As String)
Dim image As Bitmap = New Bitmap(CInt(Math.Ceiling(validatenum.Length * 12.5)), 2)
Dim g As Graphics = Graphics.FromImage(image)
Try
'生成随机生成器
Dim random As New Random
'清空图片背景色
g.Clear(Color.White)
'画图片的干扰线
Dim i As Integer
For i = 0 To 24
Dim x1 As Integer = random.Next(image.Width)
Dim x2 As Integer = random.Next(image.Width)
Dim y1 As Integer = random.Next(image.Height)
Dim y2 As Integer = random.Next(image.Height)
g.DrawLine(New Pen(Color.Silver), x1, y1, x2, y2)
Next
'画验证码
Dim font As Font = New Font("Arial", 12, (FontStyle.Bold And FontStyle.Italic))
Dim brush As LinearGradientBrush = New LinearGradientBrush(New Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, True)
g.DrawString(validatenum, font, brush, 3, 2)
'画前景干扰点
For i = 0 To 24
Dim x As Integer = random.Next(image.Width)
Dim y As Integer = random.Next(image.Height)
image.SetPixel(x, y, Color.FromArgb(random.Next()))
Next
'画图片的边框线
g.DrawRectangle(New Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1)
'保存图片
Dim stream As New MemoryStream
image.Save(stream, ImageFormat.Jpeg)
'输出图片
page.Response.Clear()
page.Response.ContentType = "image/jpeg"
page.Response.BinaryWrite(stream.ToArray())
Catch ex As Exception
Finally
g.Dispose()
image.Dispose()
End Try
End Sub
End Class
End Class
当上面的类被实例化以后,我们就能使用它了,
Public validates As New Validate.CreatValidateNumber
Public vali As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
vali = validates.CreatValidateNumber(5)
validates.CreatevalidateGraphic(Me, vali)
Session("vali") = vali
End Sub
在本系统中,由于各个页面都必须是具有合法身份的用户才能有权限查看,显然不可能在各个页面里面都写一段关于用户身份检测的代码,因此,有必要建立一个简单的类来实现,然后就可以直接引用过来使用,本系统中的用户身份检测类为CheckUser.aspx.vb。其代码如下:
Public Class CheckUser
Inherits System.Web.UI.Page
#Region " Web 窗体设计器生成的代码 "
#End Region
'检查普通用户
Public Function CheckUser()
If (Session("UserName") <> "" And Session("UserType") = "CommonUser") Then
'普通用户验证
Return True
Else
Return False
End If
End Function
'检查管理员
Public Function CheckAdmin()
If (Session("AdminName") <> "") And (Session("AdminType") <> "") Then
If (Session("AdminType") = "0") Then
Return "0" '一般管理员
ElseIf (Session("AdminType") = "1") Then
Return "1" '超级管理员
End If
Else
Return "False" 'False代表没有登录
End If
End Function
End Class
4.各子模块程序设计举例
(1)项目申报管理
在本次设计中,项目申报管理模块是调研课题申报系统的核心功能部分,现在将有关部分加以介绍,其余代码参考系统源码。
1)打印校对报表(ReportCheckPrint.aspx)
打印校对报表是系统的核心功能之一,主要用于将该年度已经提交但尚未确认信息的课题申报情况打印出来,然后供用户亲笔签名确认,类似于现场确认的形式,管理员在用户确认信息之后,再进入系统管理后台,逐一进行校对,以使得通过校对的信息是真实准确的课题申报。效果如图11所示。
|