ASP.NET网络在线考试系统
摘 要
随着计算机技术的发展和互联网时代的到来,人们已经进入了信息时代,也有人称为数字化时代。数在数字化的网络环境下,学生希望得到个性化的满足,根据自己的情况进行学习,同时也希望能够得到科学的评价,老师希望有效改进现有的考试模式,提高考试的效率,教育机构也希望给网上的学生提供更全面灵活的服务,希望全面准确地对学生进行跟踪和评价。网络考试系统正是迎合这一时常需求而开发的,它旨在探索一种以互联网为基础的考试模式。通过这种新的模式,为学校创造一种新的考试环境,使考务管理突出失控的局面,提高考试工作效果和标准水平,是学校管理者、教师和学生可以随时随地通过网络进行考试。
本系统实现了管理员的后台学生和题库管理,学生前台考试,成绩查询等功能。
关 键 字:考试系统;网络考试系统;ASP.NET; SQL SERVER2000
2.5 系统功能需求
通过对用户的调查获知:本程序实现了一个功能强大的网上考试系统,该系统基本上可以满足现代信息化学校教学的内部考试要求,管理员即使在外地出差也可以通过访问Internet轻松设置审批考试,考试结束后也不要传统的繁琐的阅卷过程,极大的提高了学校的办公效率。考试的题型都是标准化客观题目(单项选择题、多项选择题),对于其他类型的题目只要在文本的基础上稍加修改即可。
开发这个系统的目的就是帮助学校的主管考试部门提高工作效率,实现学校考试信息管理以及考试流程的系统化、规范化和自动化。系统最终实现的主要功能如下:
·题库管理设置部分:包括管理员对题库的增加、删除和修改操作。
·考试科目的设置:包括管理员对考试科目的增加、 删除和修改操作。
·试卷的信息的设置:由管理员设置考试信息,经过学校部门领导审核后通过考试。在考场上,系统将根据考试信息的设置对每个考生自动生成试卷。
·考场控制:系统控制考试时间、方刷新、考试成绩自动生成、多功能查询。
3.1、系统功能结构设计
系统的功能模块如下图所示:
网络考试系统完整功能结构,如图1所示。
图1 网络考试完整功能结构图
3.2 模块简介
网络考试系统是一个功能完善的网络应用程序,由前台学生登录考试、学生注册、找回密码和后台管理二部分组成。
- 前台功能模块
前台页面窗口主要包括登陆前台和后台的主页、选择考试课程、课程相关的套题、准备考试、开始考试、查询考试成绩和退出系统。
- 学生注册功能模块
学生注册页面只是单一的学生资料注册窗口。
- 密码找回功能模块
密码找回页面也只是单一的密码找回窗口。
- 后台功能模块
后台页面窗口主要包括系统管理员资料查询、添加、修改、删除,注册学生资料查询、删除,专业信息查询、添加、修改、删除,课程信息查询、添加、修改、删除,套题信息查询、添加、修改、删除,考生成绩查询、删除,考试题目查询、修改、删除,添加试题及退出系统管理等功能。
4.1 后台登录模块设计
后台登录模块为本网络考试系统的主要页面,操作者可从此页面登录前台学生考试页面、学生注册页面、密码找回页面或后台管理员页面。登录前台考试页面及后台管理员页面必须通过验证用户名、密码和验证码正确与否,只有合法的用户才可以进入系统。当用户没有输入用户名或密码以及验证码为空时,系统会自动弹出“不允许为空”的消息提示框。“登录”按钮左侧的复选框功能为是否选择管理员登录,选中则登录后台管理员页面,反之登录为前台学生考试页面,后台登录页面运行效果 如图1所示。
图1 后台登录模块
1.前台页面设计
网站后台登录可以通过VS2005工具箱中“登录”选项卡内的“Login”组件设计而成,也可以自定义设计登录窗口。
本系统登录窗口为自定义设计窗口,设计组件主要有“HTML”选项卡中Table组件用于布局页面、“标准”选项卡中3个TextBox控件、4个Label控件 、3个Button控件和一个CheckBox控件,这些控件具体信息及用途如表1所示。
表1 前台页面用到的控件及用途
工具箱 | 组件名称 | 数量 | 用途 |
HTML | Table | 1 | 布局页面 |
标准 | CheckBox | 1 | 验证管理员登录 |
标准 | Button | 3 | 登陆/注册/忘密 |
标准 | TextBox | 3 | 录入登陆用户名/密码/验证码 |
标准 | Label | 4 | 用户名/密码/验证码/显示验证码 |
控件的属性设置,可以通过前台代码实现,也可以在“控件属性”对话框中的设置实现,本页中使用的控件属性设置请参见如下代码:
<table>
<tr>
<td align="right" style="width: 443px; height: 233px">
</td>
<td style="width: 121px; height: 233px">
</td>
<td align="left" style="width: 114px; height: 233px">
</td>
</tr>
<tr>
<td align="right" style="width: 443px">
<ASP.NET:Label ID="labUserName" runat="server" Font-Size="9pt" Text="用户名"></ASP.NET:Label></td>
<td style="width: 121px">
<ASP.NET:TextBox ID="txtUserName" runat="server" Width="120px"></ASP.NET:TextBox></td>
<td align="left" style="width: 114px">
<ASP.NET:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtPwd" Display="Dynamic" ErrorMessage="请输入密码!"></ASP.NET:RequiredFieldValidator>
<ASP.NET:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtUserName" Display="Dynamic" ErrorMessage="请输入用户名!"></ASP.NET:RequiredFieldValidator></td>
</tr>
<tr>
<td align="right" style="width: 443px; height: 37px">
<ASP.NET:Label ID="labPwd" runat="server" Font-Size="9pt" Text="密码"></ASP.NET:Label></td>
<td style="width: 121px; height: 37px">
<ASP.NET:TextBox ID="txtPwd" runat="server" TextMode="Password" Width="120px"></ASP.NET:TextBox></td>
<td align="left" style="width: 114px; height: 37px">
</td>
</tr>
<tr>
<td align="right" style="width: 443px; height: 19px">
<ASP.NET:Label ID="Label4" runat="server" Font-Size="9pt" Text="验证码"></ASP.NET:Label></td>
<td style="width: 121px; height: 19px">
<ASP.NET:TextBox ID="txtValidate" runat="server" Width="76px"></ASP.NET:TextBox>
<ASP.NET:Label ID="labValidate" runat="server" BackColor="#C0C0FF" ForeColor="Red" Text="Label"></ASP.NET:Label></td>
<td align="left" style="width: 114px; height: 19px">
<ASP.NET:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="txtValidate" Display="Dynamic" ErrorMessage="请输入验证码!"></ASP.NET:RequiredFieldValidator></td>
</tr>
<tr>
<td align="right" style="width: 443px">
<ASP.NET:CheckBoxList ID="cblAdminLog" runat="server" Font-Size="8pt">
<ASP.NET:ListItem>管理员登陆</ASP.NET:ListItem>
</ASP.NET:CheckBoxList></td>
<td style="width: 121px">
<ASP.NET:Button ID="btnLogin" runat="server" Font-Size="9pt" Text="登录" OnClick="Button1_Click" />
<ASP.NET:Button ID="btnZhunce" runat="server" CausesValidation="False" Font-Size="9pt"
OnClick="Button2_Click" Text="注册" />
<ASP.NET:Button ID="btnPwd" runat="server" CausesValidation="False" Font-Size="9pt"
OnClick="Button3_Click" Text="忘密" /></td>
<td rowspan="1" style="width: 114px">
</td>
</tr>
</table>
2.后台功能代码
系统登录模块主要用于验证用户登录系统时输入的用户名、密码和验证码是否正确,在处理登录页面提交的数据时,首先会根据“管理员”复选框的值来判断是否登陆管理员页面,此功能代码首先if- else语句判断复选框CheckBoxList1控件是否被选中,如果被选中则执行核对用户名、密码和验证码而进入管理员页面,反之则会执行另一段代码,以验证非管理员登录信息,而进入学生考试页面,处理代码如下所示:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class Default : System.Web.UI.Page
{
Datacon dataconn = new Datacon();
protected void Page_Load(object sender, EventArgs e)
{
Session["StuName"] = this.txtUserName.Text;
if (!IsPostBack)
{
Random rnd = new Random();
//生成验证码
this.labValidate.Text = rnd.Next(1000,9999).ToString();
}
}
//==============================找回密码========================
protected void Button3_Click(object sender, EventArgs e)
{
Page.Response.Redirect("InfoPwd.ASP.NETx");
}
//==============================新学生注册=======================
protected void Button2_Click(object sender, EventArgs e)
{
Page.Response.Redirect("zhuce.ASP.NETx");
}
//==============================登录按钮=========================
protected void Button1_Click(object sender, EventArgs e)
{
if (txtValidate.Text != labValidate.Text)
{
Response.Write("<script lanuage=javascript>alert('验证码错误');location='javascript:history.go(-1)'</script>");
}
else
{
if (cblAdminLog.Items[0].Selected == true)
{
this.getcom(1);
}
else
{
this.getcom(2);
}
}
}
//=============================登录控制=====================
private void getcom(int i)
{
SqlConnection con = dataconn.getcon();
con.Open();
SqlCommand com=con.CreateCommand();
switch (i)
{
case 1:
com.CommandText = "select count(*) from tb_Administrator where Name='" + txtUserName.Text + "' and PWD='" + txtPwd.Text + "'";
int count1 = Convert.ToInt32(com.ExecuteScalar());//获取SQL语句的值 强制转换成数值类型
if (count1 > 0)
{
Application["Name"] = txtUserName.Text;//成功
Application["PWD"] = txtPwd.Text;//成功
Page.Response.Redirect("HouAdmin/admin.ASP.NETx");
}
else
{
Response.Write("<script lanuage=javascript>alert('用户名或密码有误!');location='javascript:history.go(-1)'</script>");
return;
}
break;
case 2:
com.CommandText = "select count(*) from tb_Student where ID='" + txtUserName.Text + "' and PWD='" + txtPwd.Text + "'";
int count2 = Convert.ToInt32(com.ExecuteScalar());
if (count2 > 0)
{
Application["ID"] = txtUserName.Text;
Application["PWD"] = txtPwd.Text;
Page.Response.Redirect("QianUser/zaixian_kaoshi.ASP.NETx");
}
else
{
Response.Write("<script lanuage=javascript>alert('用户名或密码有误!');location='javascript:history.go(-1)'</script>");
return;
}
break;
}
con.Close();
}
}
4.2 后台管理页面设计
本系统的后台管理主要有:管理员、学生、考试题目、专业和课程信息的添加、删除和修改等操作,由于这些信息的执行操作大致是相同的,所以我们在这里主要介绍管理员信息的各种操作。
管理员信息设置模块包括管理员信息列表、查询管理员、添加管理员、修改管理员信息和删除管理员5部分功能,要实现这些功能,运行效果如图2所示。
图2 管理员页面的设计结果
本页主要用到的控件及用途如表2所示。
表2 管理员信息设置模块用到的控件及用途
工具箱 | 组件名称 | 数量 | 用途 |
HTML | Table | 1 | 布局页面 |
标准 | DropDownList | 1 | 下拉选择(设置查询条件) |
标准 | Button | 1 | 查询 |
标准 | TextBox | 1 | 录入查询关键字 |
标准 | HyperLink | 1 | 跳转到添加管理员页面 |
标准 | Label | 2 | 查询条件/查询关键字 |
数据 | GridView | 1 | 显示管理员信息 |
控件的属性设置,可以通过前台代码实现,也可以在“控件属性”对话框中的设置实现,本页中使用的控件属性设置请参见如下代码:
<td rowspan="2" style="vertical-align: top; width: 100px; text-align: center;">
<table width="550">
<tr>
<td style="width: 2078px; height: 21px">
<ASP.NET:Label ID="Label1" runat="server" Text="查询条件" Font-Size="9pt"></ASP.NET:Label></td>
<td style="width: 120px; height: 21px">
<ASP.NET:DropDownList ID="ddlAdminName" runat="server" Width="107px" Font-Size="9pt">
<ASP.NET:ListItem Value="Name">管理员名称</ASP.NET:ListItem></ASP.NET:DropDownList></td>
<td style="width: 1080px; height: 21px">
<ASP.NET:Label ID="Label2" runat="server" Text="关键字" Font-Size="9pt"></ASP.NET:Label></td>
<td style="width: 260px; height: 21px">
<ASP.NET:TextBox ID="txtSelect" runat="server" Width="100px" Font-Size="9pt"></ASP.NET:TextBox></td>
<td style="width: 279px; height: 21px">
<ASP.NET:Button ID="btnSelect" runat="server" Text="查询" OnClick="Button1_Click" Font-Size="9pt" /></td>
<td style="width: 1977px; height: 21px">
<ASP.NET:LinkButton ID="LinkButton10" runat="server" OnClick="LinkButton10_Click" Font-Size="9pt" Font-Underline="False">添加管理员</ASP.NET:LinkButton></td>
</tr>
</table>
<br />
<ASP.NET:GridView ID="gvAdminInfo" runat="server" AutoGenerateColumns="False" BackColor="White"
BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="4" ForeColor="Black" GridLines="Horizontal" Width="550px" AllowPaging="True" OnPageIndexChanging="GridView1_PageIndexChanging" PageSize="5" OnRowDeleting="GridView1_RowDeleting" Font-Size="9pt" OnRowDataBound="GridView1_RowDataBound" HorizontalAlign="Center">
<FooterStyle BackColor="#CCCC99" ForeColor="Black" />
<Columns>
<ASP.NET:BoundField DataField="Name" HeaderText="管理员名称" ><ItemStyle HorizontalAlign="Center" />
</ASP.NET:BoundField>
<ASP.NET:BoundField DataField="PWD" HeaderText="管理员密码" />
<ASP.NET:BoundField DataField="JoinTime" HeaderText="加入时间" />
<ASP.NET:HyperLinkField DataNavigateUrlFields="ID" DataNavigateUrlFormatString="admin_update.ASP.NETx?ID={0}" HeaderText="修改" Text="修改" >
<ControlStyle Font-Underline="False" />
<FooterStyle Font-Underline="False" />
</ASP.NET:HyperLinkField>
<ASP.NET:CommandField HeaderText="删除" ShowDeleteButton="True" >
<ControlStyle Font-Underline="False" /></ASP.NET:CommandField></Columns>
<SelectedRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="White" ForeColor="Black" HorizontalAlign="Right" />
<HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White" /></ASP.NET:GridView>
</td>
1.管理员信息列表
管理员列表通过ASP.NET.NET2005提供的GridView控件把管理员的基本信息显示出来。在每条信息后设置执行修改及删除功能的超链接按钮。每次登录此页面时程序都会自动执行后台Page_Load页面加载事件中的SQL语句,将检索到的数据通过GridView控件显示在页面中。
编写此代码前,首先在命名空间区域中引用using System.Data.SqlClient命名空间,然后在Page_Load页面加载事件中定义执行需要显示在GridView控件中信息的SQL语句,通过调用公共类执行该语句完成数据显示操作,后台主要实现数据显示功能代码如下所示:
Datacon dataconn = new Datacon();
protected void Page_Load(object sender, EventArgs e)
{
dataconn.ecadabindinfostring(gvAdminInfo, "select * from tb_Administrator ORDER BY ID DESC", "ID");
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvAdminInfo.PageIndex = e.NewPageIndex;
gvAdminInfo.DataBind();
}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
dataconn.eccom("delete from tb_Administrator where ID='" + gvAdminInfo.DataKeys[e.RowIndex].Value + "'");
Page.Response.Redirect("admin.ASP.NETx");
}
protected void LinkButton10_Click(object sender, EventArgs e)
{
Page.Response.Redirect("AdminInsert.ASP.NETx");
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[2].Text = Convert.ToString(Convert.ToDateTime(e.Row.Cells[2].Text).ToShortDateString());
}
}
2.管理员信息查询
编写此代码前,双击前台“查询”按钮,同时会进入此按钮后台的Click单击事件中,然后在Click单击事件中定义执行模糊查询的SQL语句,通过调用公共类执行该语句,将结果显示在GridView控件中完成查询操作,后台主要实现查询功能代码如下所示:
Datacon dataconn = new Datacon();
protected void Button1_Click(object sender, EventArgs e)
{
dataconn.ecadabind(gvAdminInfo, "Select * From tb_Administrator Where " + ddlAdminName.SelectedValue + " Like '%" + txtSelect.Text + "%'");
}
3.添加管理员
添加管理员主要是添加管理员姓名和密码,本页主要涉及到的控件如表3所示。
表3 添加管理员页面涉及到的控件及用途
控件类型 | 控件名称 | 数量 | 用途 |
HTML | Table | 1 | 布局页面 |
标准 | Button | 2 | 添加/返回 |
标准 | TextBox | 2 | 录入管理员姓名/密码 |
编写此代码前,首先在命名空间区域中引用using System.Data.SqlClient命名空间,然后在“添加”按钮的Click单击事件中定义执行添加管理员的SQL语句,通过调用公共类执行该语句完成操作。处理添加管理员表单数据的关键代码如下:
Datacon dataconn = new Datacon();
//=========================添加管理员=======================
protected void Button1_Click(object sender, EventArgs e)
{
dataconn.eccom("insert into tb_Administrator(Name,PWD)values('" + txtAdminName.Text + "','" + txtAdminPwd.Text + "')");
Page.Response.Redirect("admin.ASP.NETx");
}
//================返回到管理员信息列表界面==================
protected void Button2_Click(object sender, EventArgs e)
{
Page.Response.Redirect("admin.ASP.NETx");
}
添加管理员页面的运行结果如图4所示。
图3 添加管理员页面运行结果
4.3 学生注册
学生注册是为了保存学生的基本信息。包括学生证号、学生姓名、密码、密码问题、问题答案、性别和所学专业。所学专业通过DropDownList控件列出,供学生选择。学生注册页面的设计页面如图5所示。
图4 学生注册
学生注册页面涉及的HTML表单元素如表4所示。
表4 学生注册页面涉及的HTML表单元素
工具箱 | 组件名称 | 数量 | 用途 |
HTML | Table | 1 | 布局页面 |
标准 | DropDownList | 2 | 注册学生选择性别和所学专业 |
标准 | Button | 3 | 注册/重置/关闭 |
标准 | TextBox | 6 | 注册学生的学生证号/姓名/密码/重复密码/密码问题/密码答案 |
验证 | RequiredFieldValidator | 4 | 验证学生ID/密码/密码问题/密码答案不能为空 |
验证 | CompareValidator | 1 | 验证密码和重复密码是否一致 |
验证 | ValidationSummary | 1 | 显示所有错误信息 |
控件的属性设置,可以通过前台代码实现,也可以在“控件属性”对话框中的设置实现,本页中使用的控件属性设置请参见如下代码:
<td colspan="4" rowspan="3">
<table style="width: 290px">
<tr>
<td colspan="2">
<ASP.NET:Label ID="labStuID" runat="server" Text="学生证号:" Font-Size="9pt"></ASP.NET:Label></td>
<td align="left" colspan="2" style="width: 154px">
<ASP.NET:TextBox ID="txtStuID" runat="server" Font-Size="9pt" Width="120px"></ASP.NET:TextBox></td>
<td style="width: 100px">
<ASP.NET:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="txtStuID"ErrorMessage="学生证号不允许为空">*</ASP.NET:RequiredFieldValidator></td>
</tr>
<tr>
<td colspan="2">
<ASP.NET:Label ID="labStuName" runat="server" Text="学生姓名:" Font-Size="9pt"></ASP.NET:Label></td>
<td align="left" colspan="2" style="width: 154px">
<ASP.NET:TextBox ID="txtStuName" runat="server" Font-Size="9pt" Width="120px"></ASP.NET:TextBox></td>
<td style="width: 100px"></td>
</tr>
<tr>
<td colspan="2">
<ASP.NET:Label ID="labStuPwd" runat="server" Text="密码:" Font-Size="9pt"></ASP.NET:Label></td>
<td align="left" colspan="2" style="width: 154px">
<ASP.NET:TextBox ID="txtStuPwd" runat="server" Font-Size="9pt" Width="120px" TextMode="Password"></ASP.NET:TextBox></td>
<td style="width: 100px">
<ASP.NET:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtStuPwd" ErrorMessage="密码不允许为空">*</ASP.NET:RequiredFieldValidator></td>
</tr>
<tr>
<td colspan="2">
<ASP.NET:Label ID="labStuFPwd" runat="server" Font-Size="9pt" Text="重复密码:"></ASP.NET:Label></td>
<td align="left" colspan="2" style="width: 154px">
<ASP.NET:TextBox ID="txtStuFPwd" runat="server" Width="120px" TextMode="Password"></ASP.NET:TextBox></td>
<td style="width: 100px">
<ASP.NET:CompareValidator ID="CompareValidator1" runat="server" ControlToCompare="txtStuPwd"
ControlToValidate="txtStuFPwd" ErrorMessage="密码不一致">*</ASP.NET:CompareValidator></td>
</tr>
<tr>
<td colspan="2">
<ASP.NET:Label ID="labQuePwd" runat="server" Text="密码问题:" Font-Size="9pt"></ASP.NET:Label></td>
<td align="left" colspan="2" style="width: 154px">
<ASP.NET:TextBox ID="txtQuePwd" runat="server" Width="145px" Font-Size="9pt"></ASP.NET:TextBox></td>
<td style="width: 100px">
<ASP.NET:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server" ControlToValidate="txtQuePwd" ErrorMessage="请输入密码提示问题">*</ASP.NET:RequiredFieldValidator></td>
</tr>
<tr>
<td colspan="2">
<ASP.NET:Label ID="labAnsPwd" runat="server" Text="问题答案:" Font-Size="9pt"></ASP.NET:Label></td>
<td align="left" colspan="2" style="width: 154px">
<ASP.NET:TextBox ID="txtAnsPwd" runat="server" Width="145px" Font-Size="9pt"></ASP.NET:TextBox></td>
<td style="width: 100px">
<ASP.NET:RequiredFieldValidator ID="RequiredFieldValidator6" runat="server" ControlToValidate="txtAnsPwd" ErrorMessage="请输入提示问题答案">*</ASP.NET:RequiredFieldValidator></td>
</tr>
<tr>
<td colspan="2">
<ASP.NET:Label ID="labSex" runat="server" Text="性别:" Font-Size="9pt"></ASP.NET:Label></td>
<td align="left" colspan="2" style="width: 154px">
<ASP.NET:DropDownList ID="ddlSex" runat="server" Width="100px" Font-Size="9pt">
<ASP.NET:ListItem>男</ASP.NET:ListItem>
<ASP.NET:ListItem>女</ASP.NET:ListItem></ASP.NET:DropDownList></td>
<td style="width: 100px"></td>
</tr>
<tr>
<td colspan="2">
<ASP.NET:Label ID="labProfession" runat="server" Text="所学专业:" Font-Size="9pt"></ASP.NET:Label></td>
<td align="left" colspan="2" style="width: 154px">
<ASP.NET:DropDownList ID="ddlProfession" runat="server" Width="130px" Font-Size="9pt">
</ASP.NET:DropDownList></td>
<td style="width: 100px"></td>
</tr>
<tr>
<td style="width: 100px"></td>
<td style="width: 100px"></td>
<td colspan="2" style="width: 154px">
<ASP.NET:Button ID="btnDeclare" runat="server" Text="注册" Width="45px" OnClick="Button1_Click" Font-Size="9pt" />
<ASP.NET:Button ID="btnClear" runat="server" Text="重置" Width="45px" OnClick="Button2_Click" Font-Size="9pt" CausesValidation="False" />
<ASP.NET:Button ID="btnClose" runat="server" Text="关闭" OnClick="Button3_Click" Width="45px" Font-Size="9pt" CausesValidation="False" /></td>
<td style="width: 100px"></td>
</tr>
</table>
<ASP.NET:ValidationSummary ID="ValidationSummary1" runat="server" Font-Size="9pt" ShowMessageBox="True" ShowSummary="False" />
</td>
编写此代码前,首先在命名空间区域中引用using System.Data.SqlClient命名空间,然后在“注册”按钮的Click单击事件中定义执行完成学生注册的SQL语句,通过调用公共类执行该语句完成操作。完成学生注册的关键代码如下:
Datacon dataconn = new Datacon();
protected void Button1_Click(object sender, EventArgs e)
{
dataconn.eccom("insert into tb_Student"
+"(ID,Name,PWD,question,answer,Sex,profession)"
+"values('" + this.txtStuID.Text + "','" + this.txtStuName.Text + "','"
+ this.txtStuPwd.Text + "','" + this.txtQuePwd.Text + "','"
+ this.txtAnsPwd.Text + "','" + this.ddlSex.Text + "','"
+ Request["DropDownList2"] + "')");
}
4.4 忘记密码
很多情况下,学生会将密码遗忘或丢失,这样就无法登录自己的学生帐号,为了避免造成不必要的损失,笔者设计了找回密码的功能。
找回密码主要分为三个页面来完成。页面一:输入已注册的学生证号;页面二:系统会根据输入学生证号把相应的密码问题列出来,然后输入问题答案;页面三,如果问题答案正确,则成功找回密码。忘记密码三个页面的设计结果分别如图6、图7、图8所示。
图5 忘记密码1
图6 忘记密码2
图7 忘记密码3
实现密码找回功能的代码很简单,主要是判断输入的学生证号是否存在,以及该学生的密码提示问题和密码答案是否正确。
在页面一中,需要输入学生证号,系统会自动核对其是否存在,实现代码如下:
Datacon dataconn = new Datacon();
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection con = dataconn.getcon();
con.Open();
SqlCommand com = new SqlCommand("select count(*) from tb_Student where ID='" + txtStuID.Text + "'", con);
int count = Convert.ToInt32(com.ExecuteScalar());
if (count > 0)
{
Session["ID"] = txtStuID.Text;
Page.Response.Redirect("InfoPwdd.ASP.NETx");
}
else
{
Response.Write("<script>alert('无此学生编号、或输入有误');location='javascript:history.go(-1)'</script>");
return;
}
con.Close();
}
单击“确定”按钮,如该学生证号存在,则进入页面二,此处需要输入该学生的密码问题和答案,如核对无误,直接进入页面三,并直接在页面三中显示出该学生的密码,实现此功能的关键代码如下:
Datacon dataconn = new Datacon();
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection con = dataconn.getcon();
con.Open();
SqlCommand mycom = new SqlCommand("select count(*) from tb_Student where answer='"
+ txtAnsPwd.Text + "' and id=" + Convert.ToString(Session["ID"]), con);
int count = Convert.ToInt32(mycom.ExecuteScalar());
if (count > 0)
{
Page.Response.Redirect("InfoPwddd.ASP.NETx");
}
else
{
Response.Write("<script>alert('提示问题答案输入有误!');location='javascript:history.go(-1)'</script>");
return;
}
con.Close();
}
相关文章:
ASP.NET网络在线考试系统
摘 要 随着计算机技术的发展和互联网时代的到来,人们已经进入了信息时代,也有人称为数字化时代。数在数字化的网络环境下,学生希望得到个性化的满足,根据自己的情况进行学习,同时也希望能够得到科学的评价,…...
天锐绿盾 | 办公加密系统,源代码防泄密、源代码透明加密、防止开发部门人员泄露源码
天锐绿盾作为一款专注于数据安全与防泄密的专业解决方案,它确实提供了针对源代码防泄密的功能,帮助企业保护其核心的知识产权。 PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是天锐绿盾可能采…...
Day1| Java基础 | 1 面向对象特性
Day1 | Java基础 | 1 面向对象特性 基础补充版Java中的开闭原则面向对象继承实现继承this和super关键字修饰符Object类和转型子父类初始化顺序 多态一个简单应用在构造方法中调用多态方法多态与向下转型 问题回答版面向对象面向对象的三大特性是什么?多态特性你是怎…...
Spring 事务失效的几种情况
目录 1. 事务方法不是public 2. 自调用问题 3. 异常处理不当 4. 数据源或事务管理器配置错误 5. 事务传播行为不当 6. 代理方式不正确 7. 事务同步问题 1. 事务方法不是public 在Spring中,默认情况下,只有public方法上的Transactional注解才会被代…...
【Linux 命令操作】如何在 Linux 中使用多行注释呢?
文章目录 1. 给代码进行多行注释2. 给代码取消多行注释 1. 给代码进行多行注释 🐧① 首先用 vim 打开代码,按 Esc进入命令模式(Normal mode); 🐧② 然后按住 ctrl v 进入列模式; 🐧③ 再通过按 h(左)、j(…...
【RPC】Dubbo接口测试
关于rpc,推荐看看这篇 : 既然有HTTP协议,为什么还要有RPC 一、Dubbo 是一款alibaba开源的高性能服务框架: 分布式服务框架高性能和透明化的RPC远程服务调用方案SOA服务治理方案 二、Dubbo基础架构 三、 Dubbo接口测试 1、jme…...
PVZ2 植物克僵尸【第二期】
众所周知,PVZ2(植物大战僵尸2)中有许多恶心的僵尸,而我们不得不派出它们的————克星!(*为建议方法) 5.战机小鬼 战机小鬼,恶心会发射子弹,所以: 1&…...
libcity笔记:libcity/data/batch.py
1 Batch 2 BatchPAD...
【Java EE】多线程(二)Thread 类与常用方法
📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更…...
AGV无人叉车 | 我们为什么要投资“智慧生产”
AGV 作为一种智能工业车辆机器人,无人叉车充分融合叉车技术和AGV技术,近年来在仓储物流领域的应用逐步扩大。在传统叉车厂商、传统AGV厂商、物流集成商及仓储机器人企业等各方力量推动下,无人叉车市场在竞合中快速发展,并促使无人…...
【C++】滑动窗口:将x减到0的最小操作数
1.题目 2.算法思路 这个题目难在要转化一下才能用滑动窗口。 题意是需要在数组的前后两段区间进行解题,但同时对两段区间进行操作是比较困难的,我们可以将中间这段区间只和与nums_sum-x(数组总和-x)进行比较,这样就可…...
运动控制“MC_MoveVelocity“功能块详细应用介绍
1、运动控制单位u/s介绍 运动控制单位[u/s]介绍-CSDN博客文章浏览阅读91次。运动控制很多手册上会写这样的单位,这里的u是英文单词unit的缩写,也就是单位的意思,所以这里的单位不是微米/秒,也不是毫米/秒,这里是一个泛指,当我们的单位选择脉冲时,它就是脉冲/秒,也就是…...
9种单片机常用的软件架构
长文预警,加代码5000多字,写了4个多小时,盘软件架构,这篇文章就够了! 可能很多工程师,工作了很多年,都不会有软件架构的概念。 因为我在做研发工程师的第6年,才开始意识到这个东西,在…...
PyQt5中重要的概念:信号与槽
PyQt中信号与槽概念定义如下(网络上引用的): 信号(signal)和槽(slot)是Qt的核心机制,也是在PyQt编程中对象之间进行通信的机制。在创建事件循环之后,通过建立信号和槽的…...
MacOS快速安装FFmpeg,并使用FFmpeg转换视频
前言:目前正在接入flv视频流,但是没有一个合适的flv视频流地址。网上提供的flv也都不是H264AAC(一种视频和音频编解码器组合),所以想通过fmpeg来将flv文件转换为H264AAC。 一、MacOS环境 博主的MacOS环境(…...
docker部署nginx并配置https
1.准备SSL证书: 生成私钥:运行以下命令生成一个私钥文件。 生成证书请求(CSR):运行以下命令生成证书请求文件。 生成自签名证书:使用以下命令生成自签名证书。 openssl genrsa -out example.com.key 2048 …...
五一小长假,景区智慧公厕发挥了那些作用?
五一小长假已经过去,在旅途中相信大家非常开心,其中也不乏一些细节让你有了更好的体验,而在您享受美景、畅游风光的同时,或许并未留意到那个角落里,默默为您服务的智慧公厕。是的,它们将成为您旅途中不可或…...
Spring - 9 ( 10000 字 Spring 入门级教程 )
一: MyBatis XML 配置文件 Mybatis 的开发有两种方式: 注解XML 我们已经学习了注解的方式, 接下来我们学习 XML 的方式 MyBatis XML 的方式需要以下两步: 配置数据库连接字符串和 MyBatis写持久层代码 1.1 配置连接字符串和 MyBatis 此步骤需要进…...
shpfile转GeoJSON;控制shp转GeoJSON的精度;如何获取GeoJSON;GeoJSON是什么有什么用;GeoJSON结构详解(带数据示例)
目录 一、GeoJSON是什么 二、GeoJSON的结构组成 2.1、点(Point)数据示例 2.2、线(LineString)数据示例 2.3、面(Polygon)数据示例 2.4、特征(Feature)数据示例 2.5、特征集合&…...
没有强有力的科技支撑,就没有保密工作的高质量发展。新修订的《中华人民共和国保守国家秘密法》在总则中新增保密科技创新有关内容包括()
没有强有力的科技支撑,就没有保密工作的高质量发展。新修订的《中华人民共和国保守国家秘密法》在总则中新增保密科技创新有关内容包括() 点击查看答案内容: A.国家鼓励和支持保密科学技术研究和应用B.提升自主创新能力 C.明确依法保护保密领…...
【快速入门】数据库的增删改查与结构讲解
文章的操作都是基于小皮php study的MySQL5.7.26进行演示 what 数据库是能长期存储在计算机内,有组织的,可共享的大量数据的集合。数据库中的数据按照一定的数据模型存储,具有较小的冗余性,较高的独立性和易扩展性,并为…...
使用AIGC生成软件类图表
文章目录 如何使用 AI 生成软件类图表什么是 MermaidMermaid 的图片如何保存?mermaid.liveDraw.io Mermaid可以画什么图?流程图时序图 / 序列图类图状态图甘特图实体关系图 / ER图 如何使用 AI 生成软件类图表 ChatGPT 大语言模型不能直接生成各类图表。…...
机器学习实践:超市商品购买关联规则分析
第2关:动手实现Apriori算法 任务描述 本关任务:编写 Python 代码实现 Apriori 算法。 相关知识 为了完成本关任务,你需要掌握 Apriori 算法流程。 Apriori 算法流程 Apriori 算法的两个输人参数分别是最小支持度和数据集。该算法首先会生成所…...
自动化图像识别:提高效率和准确性的新途径
自动化图像识别是人工智能领域中的一项关键技术,它通过算法自动解析图像内容,为各种应用提供准确的信息。随着技术的不断发展,自动化图像识别在提高效率和准确性方面展现出新的途径。 一、深度学习技术的应用 深度学习是自动化图像识别领域…...
根据最近拒包项目总结,详细讲解Google最新政策(上)
关于占比最多的移动垃圾软件拒审问题 移动垃圾软件(Mobile Unwanted Software)特征表现1> 具有欺骗性,承诺其无法实现的价值主张。2> 诱骗用户进行安装,或搭载在用户安装的其他程序上。3> 不向用户告知其所有主要功能和重要功能。4> 以非预期方式影响用户的系统…...
【Qt之OpenGL】01创建OpenGL窗口
1.创建子类继承QOpenGLWidget 2.重写三个虚函数 /** 设置OpenGL的资源和状态,最先调用且调用一次* brief initializeGL*/ virtual void initializeGL() override; /** 设置OpenGL视口、投影等,当widget调整大小(或首次显示)时调用* brief resizeGL* param w* para…...
如何判断代理IP质量?
由于各种原因(从匿名性和安全性到绕过地理限制),代理 IP 的使用变得越来越普遍。然而,并非所有代理 IP 都是一样的,区分高质量和低质量的代理 IP 对于确保流畅、安全的浏览体验至关重要。以下是评估代理 IP 质量时需要…...
2023-2024年Web3行业报告合集(精选13份)
Web3行业报告(精选13份) 2023-2024年 来源:2023-2024年Web3行业报告合集(精选13份) 【以下是资料目录】 2023Web3产业发展现状分析及国内外落地实践报告 2023模块化区块链承载Web3.0应用的新模式 2023年AI应用需求…...
CSS中文本样式(详解网页文本样式)
目录 一、Text介绍 1.概念 2.特点 3.用法 4.应用 二、Text语法 1.文本格式 2.文本颜色 3.文本的对齐方式 4.文本修饰 5.文本转换 6.文本缩进 7.color:设置文本颜色。 8.font-family:设置字体系列。 9.font-size:设置字体大小。…...
tensorflow学习笔记(2)线性回归-20240507
通过调用Tensorflow计算梯度下降的函数tf.train.GradientDescentOptimizer来实现优化。 代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- #程序作用: #线性回归:通过调用Tensorflow计算梯度下降的函数tr.train.GradientDescentOptimizer来实现优化。import os …...
【JavaScript】作用域
作用域是指在程序中定义变量的区域,决定了这些变量在哪里可以被访问和使用。JavaScript 中的作用域有全局作用域、函数作用域和块级作用域。 1. 什么是作用域? 作用域是代码中定义变量的区域,它决定了变量的可见性和生命周期。作用域规定了…...
C++程序设计教案
文章目录: 一:软件安装环境 第一种:vc2012 第二种:Dev-C 第三种:小熊猫C 二:语法基础 1.相关 1.1 注释 1.2 换行符 1.3 规范 1.4 关键字 1.5 ASCll码表 1.6 转义字符 2.基本框架 2.1 第一种&…...
修改Ubuntu远程登录欢迎提示信息
无论何时登录公司的某些生产系统,你都会看到一些登录消息、警告或关于你已登录服务器的信息,如下所示。 修改方式 1.打开ubuntu终端,进入到/etc/update-motd.d目录下面 可以发现目录中的文件都是shell脚本, 用户登录时服务器会自动加载这个目录中的文件…...
暗区突围pc端下载教程 暗区突围pc端怎么下载
暗区突围pc端下载教程 暗区突围pc端怎么下载 《暗区突围》是一款刺激的第一人称射击游戏。目前pc版本要上线了,即将在5月正式上线。在这款游戏里,我们会在随机的时间、地点,拿着不一定的装备,跟其他玩家拼个高低,还需…...
大数据技术原理与技术简答
1、HDFS中名称节点的启动过程 名称节点在启动时,会将FsImage 的内容加载到内存当中,此时fsimage是上上次关机时的状态。然后执行 EditLog 文件中的各项操作,使内存中的元数据保持最新。接着创建一个新的FsImage 文件和一个空的 Editlog 文件…...
Mybatis的简介和下载安装
什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的…...
大历史下的 tcp:一个松弛的传输协议
如果 tcp 是一个相对松弛的协议,会发生什么。 所谓松弛感,意思是它允许 “漏洞”,允许可靠传输的不封闭,大致就是:“不求 100% 可靠,只要 90%(或多或少) 可靠,另外 10% 的错误可检测到” or “…...
加州大学欧文分校英语中级语法专项课程03:Tricky English Grammar 学习笔记
Tricky English Grammar Course Certificate Course Intro 本文是学习 https://www.coursera.org/learn/tricky-english-grammar?specializationintermediate-grammar 这门课的学习笔记 文章目录 Tricky English GrammarWeek 01: Nouns, Articles, and QuantifiersLearning …...
AI项目二十一:视频动态手势识别
若该文为原创文章,转载请注明原文出处。 一、简介 人工智能的发展日新月异,也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式,在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是,当操作者做出…...
浅拷贝与深拷贝面试问题及回答
1. 浅拷贝和深拷贝的区别是什么? 答: 浅拷贝(Shallow Copy)仅复制对象的引用而不复制引用的对象本身,因此原始对象和拷贝对象会引用同一个对象。而深拷贝(Deep Copy)则是对对象内部的所有元素进…...
推荐算法顶会论文合集
SIGIR SIGIR 2022 | 推荐系统相关论文分类整理:8.74 https://mp.weixin.qq.com/s/vH0qJ-jGHL7s5wSn7Oy_Nw SIGIR2021推荐系统论文集锦 https://mp.weixin.qq.com/s/N7V_9iqLmVI9_W65IQpOtg SIGIR2020推荐系统论文聚焦: https://mp.weixin.qq.com/s…...
组合模式(Composite)——结构型模式
组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示, 在应用中使用组合模式才有价值。 例如一个场景…...
利用大模型提升个性化推荐的异构知识融合方法
在推荐系统中,分析和挖掘用户行为是至关重要的,尤其是在美团外卖这样的平台上,用户行为表现出多样性,包括不同的行为主体(如商家和产品)、内容(如曝光、点击和订单)和场景࿰…...
Dockerfile 里 ENTRYPOINT 和 CMD 的区别
ENTRYPOINT 和 CMD 的区别: 在 Dockerfile 中同时设计 CMD 和 ENTRYPOINT 是为了提供更灵活的容器启动方式。ENTRYPOINT 定义了容器启动时要执行的命令,而 CMD 则提供了默认参数。通过结合使用这两个指令,可以在启动容器时灵活地指定额外的参…...
腾讯的EdgeONE是什么?
腾讯的EdgeONE是一项边缘计算解决方案,具有一系列优势: 边缘计算能力强大:EdgeONE利用腾讯云在全球范围内的分布式基础设施,提供强大的边缘计算能力,可以实现低延迟和高可用性的服务。 智能化和自动化:Edg…...
SVM直观理解
https://tangshusen.me/2018/10/27/SVM/ https://www.bilibili.com/video/BV16T4y1y7qj/?spm_id_from333.337.search-card.all.click&vd_source8272bd48fee17396a4a1746c256ab0ae SVM是什么? 先来看看维基百科上对SVM的定义: 支持向量机(英语:su…...
Nessus 部署实验
一、下载安装https://www.tenable.com/downloads/nessus 安装好之后,Nessus会自动打开浏览器,进入到初始化选择安装界面,这里我们要选择 Managed Scanner 点击继续,下一步选择Tenable.sc 点击继续,设置用户名和密码 等…...
基于Springboot的水产养殖系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的水产养殖系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…...
Java性能优化(五)-多线程调优-Lock同步锁的优化
作者主页: 🔗进朱者赤的博客 精选专栏:🔗经典算法 作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名) ❤️觉得文章还…...
WPF (Windows Presentation Foundation) 中 Attribute(属性)和 Property(属性)
在 WPF (Windows Presentation Foundation) 中,Attribute(属性)和 Property(属性)是两个相关但不同的概念。 Attribute(属性)是一种元数据,用于给类型、成员或其他代码元素添加附加…...