当前位置: 首页 > news >正文

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">

         &nbsp;</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所示。

学生注册页面涉及的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网络在线考试系统

摘 要 随着计算机技术的发展和互联网时代的到来&#xff0c;人们已经进入了信息时代&#xff0c;也有人称为数字化时代。数在数字化的网络环境下&#xff0c;学生希望得到个性化的满足&#xff0c;根据自己的情况进行学习&#xff0c;同时也希望能够得到科学的评价&#xff0c…...

天锐绿盾 | 办公加密系统,源代码防泄密、源代码透明加密、防止开发部门人员泄露源码

天锐绿盾作为一款专注于数据安全与防泄密的专业解决方案&#xff0c;它确实提供了针对源代码防泄密的功能&#xff0c;帮助企业保护其核心的知识产权。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是天锐绿盾可能采…...

Day1| Java基础 | 1 面向对象特性

Day1 | Java基础 | 1 面向对象特性 基础补充版Java中的开闭原则面向对象继承实现继承this和super关键字修饰符Object类和转型子父类初始化顺序 多态一个简单应用在构造方法中调用多态方法多态与向下转型 问题回答版面向对象面向对象的三大特性是什么&#xff1f;多态特性你是怎…...

Spring 事务失效的几种情况

目录 1. 事务方法不是public 2. 自调用问题 3. 异常处理不当 4. 数据源或事务管理器配置错误 5. 事务传播行为不当 6. 代理方式不正确 7. 事务同步问题 1. 事务方法不是public 在Spring中&#xff0c;默认情况下&#xff0c;只有public方法上的Transactional注解才会被代…...

【Linux 命令操作】如何在 Linux 中使用多行注释呢?

文章目录 1. 给代码进行多行注释2. 给代码取消多行注释 1. 给代码进行多行注释 &#x1f427;① 首先用 vim 打开代码&#xff0c;按 Esc进入命令模式(Normal mode)&#xff1b; &#x1f427;② 然后按住 ctrl v 进入列模式&#xff1b; &#x1f427;③ 再通过按 h(左)、j(…...

【RPC】Dubbo接口测试

关于rpc&#xff0c;推荐看看这篇 &#xff1a; 既然有HTTP协议&#xff0c;为什么还要有RPC 一、Dubbo 是一款alibaba开源的高性能服务框架&#xff1a; 分布式服务框架高性能和透明化的RPC远程服务调用方案SOA服务治理方案 二、Dubbo基础架构 三、 Dubbo接口测试 1、jme…...

PVZ2 植物克僵尸【第二期】

众所周知&#xff0c;PVZ2&#xff08;植物大战僵尸2&#xff09;中有许多恶心的僵尸&#xff0c;而我们不得不派出它们的————克星&#xff01;&#xff08;*为建议方法&#xff09; 5.战机小鬼 战机小鬼&#xff0c;恶心会发射子弹&#xff0c;所以&#xff1a; 1&…...

libcity笔记:libcity/data/batch.py

1 Batch 2 BatchPAD...

【Java EE】多线程(二)Thread 类与常用方法

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…...

AGV无人叉车 | 我们为什么要投资“智慧生产”

AGV 作为一种智能工业车辆机器人&#xff0c;无人叉车充分融合叉车技术和AGV技术&#xff0c;近年来在仓储物流领域的应用逐步扩大。在传统叉车厂商、传统AGV厂商、物流集成商及仓储机器人企业等各方力量推动下&#xff0c;无人叉车市场在竞合中快速发展&#xff0c;并促使无人…...

【C++】滑动窗口:将x减到0的最小操作数

1.题目 2.算法思路 这个题目难在要转化一下才能用滑动窗口。 题意是需要在数组的前后两段区间进行解题&#xff0c;但同时对两段区间进行操作是比较困难的&#xff0c;我们可以将中间这段区间只和与nums_sum-x&#xff08;数组总和-x&#xff09;进行比较&#xff0c;这样就可…...

运动控制“MC_MoveVelocity“功能块详细应用介绍

1、运动控制单位u/s介绍 运动控制单位[u/s]介绍-CSDN博客文章浏览阅读91次。运动控制很多手册上会写这样的单位,这里的u是英文单词unit的缩写,也就是单位的意思,所以这里的单位不是微米/秒,也不是毫米/秒,这里是一个泛指,当我们的单位选择脉冲时,它就是脉冲/秒,也就是…...

9种单片机常用的软件架构

长文预警&#xff0c;加代码5000多字&#xff0c;写了4个多小时&#xff0c;盘软件架构&#xff0c;这篇文章就够了! 可能很多工程师&#xff0c;工作了很多年&#xff0c;都不会有软件架构的概念。 因为我在做研发工程师的第6年&#xff0c;才开始意识到这个东西&#xff0c;在…...

PyQt5中重要的概念:信号与槽

PyQt中信号与槽概念定义如下&#xff08;网络上引用的&#xff09;&#xff1a; 信号&#xff08;signal&#xff09;和槽&#xff08;slot&#xff09;是Qt的核心机制&#xff0c;也是在PyQt编程中对象之间进行通信的机制。在创建事件循环之后&#xff0c;通过建立信号和槽的…...

MacOS快速安装FFmpeg,并使用FFmpeg转换视频

前言&#xff1a;目前正在接入flv视频流&#xff0c;但是没有一个合适的flv视频流地址。网上提供的flv也都不是H264AAC&#xff08;一种视频和音频编解码器组合&#xff09;&#xff0c;所以想通过fmpeg来将flv文件转换为H264AAC。 一、MacOS环境 博主的MacOS环境&#xff08;…...

docker部署nginx并配置https

1.准备SSL证书&#xff1a; 生成私钥&#xff1a;运行以下命令生成一个私钥文件。 生成证书请求&#xff08;CSR&#xff09;&#xff1a;运行以下命令生成证书请求文件。 生成自签名证书&#xff1a;使用以下命令生成自签名证书。 openssl genrsa -out example.com.key 2048 …...

五一小长假,景区智慧公厕发挥了那些作用?

五一小长假已经过去&#xff0c;在旅途中相信大家非常开心&#xff0c;其中也不乏一些细节让你有了更好的体验&#xff0c;而在您享受美景、畅游风光的同时&#xff0c;或许并未留意到那个角落里&#xff0c;默默为您服务的智慧公厕。是的&#xff0c;它们将成为您旅途中不可或…...

Spring - 9 ( 10000 字 Spring 入门级教程 )

一&#xff1a; MyBatis XML 配置文件 Mybatis 的开发有两种方式&#xff1a; 注解XML 我们已经学习了注解的方式, 接下来我们学习 XML 的方式 MyBatis XML 的方式需要以下两步: 配置数据库连接字符串和 MyBatis写持久层代码 1.1 配置连接字符串和 MyBatis 此步骤需要进…...

shpfile转GeoJSON;控制shp转GeoJSON的精度;如何获取GeoJSON;GeoJSON是什么有什么用;GeoJSON结构详解(带数据示例)

目录 一、GeoJSON是什么 二、GeoJSON的结构组成 2.1、点&#xff08;Point&#xff09;数据示例 2.2、线&#xff08;LineString&#xff09;数据示例 2.3、面&#xff08;Polygon&#xff09;数据示例 2.4、特征&#xff08;Feature&#xff09;数据示例 2.5、特征集合&…...

没有强有力的科技支撑,就没有保密工作的高质量发展。新修订的《中华人民共和国保守国家秘密法》在总则中新增保密科技创新有关内容包括()

没有强有力的科技支撑,就没有保密工作的高质量发展。新修订的《中华人民共和国保守国家秘密法》在总则中新增保密科技创新有关内容包括&#xff08;&#xff09; 点击查看答案内容&#xff1a; A.国家鼓励和支持保密科学技术研究和应用B.提升自主创新能力 C.明确依法保护保密领…...

【快速入门】数据库的增删改查与结构讲解

文章的操作都是基于小皮php study的MySQL5.7.26进行演示 what 数据库是能长期存储在计算机内&#xff0c;有组织的&#xff0c;可共享的大量数据的集合。数据库中的数据按照一定的数据模型存储&#xff0c;具有较小的冗余性&#xff0c;较高的独立性和易扩展性&#xff0c;并为…...

使用AIGC生成软件类图表

文章目录 如何使用 AI 生成软件类图表什么是 MermaidMermaid 的图片如何保存&#xff1f;mermaid.liveDraw.io Mermaid可以画什么图&#xff1f;流程图时序图 / 序列图类图状态图甘特图实体关系图 / ER图 如何使用 AI 生成软件类图表 ChatGPT 大语言模型不能直接生成各类图表。…...

机器学习实践:超市商品购买关联规则分析

第2关&#xff1a;动手实现Apriori算法 任务描述 本关任务&#xff1a;编写 Python 代码实现 Apriori 算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握 Apriori 算法流程。 Apriori 算法流程 Apriori 算法的两个输人参数分别是最小支持度和数据集。该算法首先会生成所…...

自动化图像识别:提高效率和准确性的新途径

自动化图像识别是人工智能领域中的一项关键技术&#xff0c;它通过算法自动解析图像内容&#xff0c;为各种应用提供准确的信息。随着技术的不断发展&#xff0c;自动化图像识别在提高效率和准确性方面展现出新的途径。 一、深度学习技术的应用 深度学习是自动化图像识别领域…...

根据最近拒包项目总结,详细讲解Google最新政策(上)

关于占比最多的移动垃圾软件拒审问题 移动垃圾软件(Mobile Unwanted Software)特征表现1> 具有欺骗性,承诺其无法实现的价值主张。2> 诱骗用户进行安装,或搭载在用户安装的其他程序上。3> 不向用户告知其所有主要功能和重要功能。4> 以非预期方式影响用户的系统…...

【Qt之OpenGL】01创建OpenGL窗口

1.创建子类继承QOpenGLWidget 2.重写三个虚函数 /** 设置OpenGL的资源和状态,最先调用且调用一次* brief initializeGL*/ virtual void initializeGL() override; /** 设置OpenGL视口、投影等&#xff0c;当widget调整大小(或首次显示)时调用* brief resizeGL* param w* para…...

如何判断代理IP质量?

由于各种原因&#xff08;从匿名性和安全性到绕过地理限制&#xff09;&#xff0c;代理 IP 的使用变得越来越普遍。然而&#xff0c;并非所有代理 IP 都是一样的&#xff0c;区分高质量和低质量的代理 IP 对于确保流畅、安全的浏览体验至关重要。以下是评估代理 IP 质量时需要…...

2023-2024年Web3行业报告合集(精选13份)

Web3行业报告&#xff08;精选13份&#xff09; 2023-2024年 来源&#xff1a;2023-2024年Web3行业报告合集&#xff08;精选13份&#xff09; 【以下是资料目录】 2023Web3产业发展现状分析及国内外落地实践报告 2023模块化区块链承载Web3.0应用的新模式 2023年AI应用需求…...

CSS中文本样式(详解网页文本样式)

目录 一、Text介绍 1.概念 2.特点 3.用法 4.应用 二、Text语法 1.文本格式 2.文本颜色 3.文本的对齐方式 4.文本修饰 5.文本转换 6.文本缩进 7.color&#xff1a;设置文本颜色。 8.font-family&#xff1a;设置字体系列。 9.font-size&#xff1a;设置字体大小。…...

tensorflow学习笔记(2)线性回归-20240507

通过调用Tensorflow计算梯度下降的函数tf.train.GradientDescentOptimizer来实现优化。 代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- #程序作用: #线性回归:通过调用Tensorflow计算梯度下降的函数tr.train.GradientDescentOptimizer来实现优化。import os …...

【JavaScript】作用域

作用域是指在程序中定义变量的区域&#xff0c;决定了这些变量在哪里可以被访问和使用。JavaScript 中的作用域有全局作用域、函数作用域和块级作用域。 1. 什么是作用域&#xff1f; 作用域是代码中定义变量的区域&#xff0c;它决定了变量的可见性和生命周期。作用域规定了…...

C++程序设计教案

文章目录&#xff1a; 一&#xff1a;软件安装环境 第一种&#xff1a;vc2012 第二种&#xff1a;Dev-C 第三种&#xff1a;小熊猫C 二&#xff1a;语法基础 1.相关 1.1 注释 1.2 换行符 1.3 规范 1.4 关键字 1.5 ASCll码表 1.6 转义字符 2.基本框架 2.1 第一种&…...

修改Ubuntu远程登录欢迎提示信息

无论何时登录公司的某些生产系统&#xff0c;你都会看到一些登录消息、警告或关于你已登录服务器的信息&#xff0c;如下所示。 修改方式 1.打开ubuntu终端,进入到/etc/update-motd.d目录下面 可以发现目录中的文件都是shell脚本, 用户登录时服务器会自动加载这个目录中的文件…...

暗区突围pc端下载教程 暗区突围pc端怎么下载

暗区突围pc端下载教程 暗区突围pc端怎么下载 《暗区突围》是一款刺激的第一人称射击游戏。目前pc版本要上线了&#xff0c;即将在5月正式上线。在这款游戏里&#xff0c;我们会在随机的时间、地点&#xff0c;拿着不一定的装备&#xff0c;跟其他玩家拼个高低&#xff0c;还需…...

大数据技术原理与技术简答

1、HDFS中名称节点的启动过程 名称节点在启动时&#xff0c;会将FsImage 的内容加载到内存当中&#xff0c;此时fsimage是上上次关机时的状态。然后执行 EditLog 文件中的各项操作&#xff0c;使内存中的元数据保持最新。接着创建一个新的FsImage 文件和一个空的 Editlog 文件…...

Mybatis的简介和下载安装

什么是 MyBatis &#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和 Java 的…...

大历史下的 tcp:一个松弛的传输协议

如果 tcp 是一个相对松弛的协议&#xff0c;会发生什么。 所谓松弛感&#xff0c;意思是它允许 “漏洞”&#xff0c;允许可靠传输的不封闭&#xff0c;大致就是&#xff1a;“不求 100% 可靠&#xff0c;只要 90%(或多或少) 可靠&#xff0c;另外 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项目二十一:视频动态手势识别

若该文为原创文章&#xff0c;转载请注明原文出处。 一、简介 人工智能的发展日新月异&#xff0c;也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式&#xff0c;在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是&#xff0c;当操作者做出…...

浅拷贝与深拷贝面试问题及回答

1. 浅拷贝和深拷贝的区别是什么&#xff1f; 答&#xff1a; 浅拷贝&#xff08;Shallow Copy&#xff09;仅复制对象的引用而不复制引用的对象本身&#xff0c;因此原始对象和拷贝对象会引用同一个对象。而深拷贝&#xff08;Deep Copy&#xff09;则是对对象内部的所有元素进…...

推荐算法顶会论文合集

SIGIR SIGIR 2022 | 推荐系统相关论文分类整理&#xff1a;8.74 https://mp.weixin.qq.com/s/vH0qJ-jGHL7s5wSn7Oy_Nw SIGIR2021推荐系统论文集锦 https://mp.weixin.qq.com/s/N7V_9iqLmVI9_W65IQpOtg SIGIR2020推荐系统论文聚焦&#xff1a; https://mp.weixin.qq.com/s…...

组合模式(Composite)——结构型模式

组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如一个场景…...

利用大模型提升个性化推荐的异构知识融合方法

在推荐系统中&#xff0c;分析和挖掘用户行为是至关重要的&#xff0c;尤其是在美团外卖这样的平台上&#xff0c;用户行为表现出多样性&#xff0c;包括不同的行为主体&#xff08;如商家和产品&#xff09;、内容&#xff08;如曝光、点击和订单&#xff09;和场景&#xff0…...

Dockerfile 里 ENTRYPOINT 和 CMD 的区别

ENTRYPOINT 和 CMD 的区别&#xff1a; 在 Dockerfile 中同时设计 CMD 和 ENTRYPOINT 是为了提供更灵活的容器启动方式。ENTRYPOINT 定义了容器启动时要执行的命令&#xff0c;而 CMD 则提供了默认参数。通过结合使用这两个指令&#xff0c;可以在启动容器时灵活地指定额外的参…...

腾讯的EdgeONE是什么?

腾讯的EdgeONE是一项边缘计算解决方案&#xff0c;具有一系列优势&#xff1a; 边缘计算能力强大&#xff1a;EdgeONE利用腾讯云在全球范围内的分布式基础设施&#xff0c;提供强大的边缘计算能力&#xff0c;可以实现低延迟和高可用性的服务。 智能化和自动化&#xff1a;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的定义: 支持向量机&#xff08;英语&#xff1a;su…...

Nessus 部署实验

一、下载安装https://www.tenable.com/downloads/nessus 安装好之后&#xff0c;Nessus会自动打开浏览器&#xff0c;进入到初始化选择安装界面&#xff0c;这里我们要选择 Managed Scanner 点击继续&#xff0c;下一步选择Tenable.sc 点击继续&#xff0c;设置用户名和密码 等…...

基于Springboot的水产养殖系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的水产养殖系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…...

Java性能优化(五)-多线程调优-Lock同步锁的优化

作者主页&#xff1a; &#x1f517;进朱者赤的博客 精选专栏&#xff1a;&#x1f517;经典算法 作者简介&#xff1a;阿里非典型程序员一枚 &#xff0c;记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; ❤️觉得文章还…...

WPF (Windows Presentation Foundation) 中 Attribute(属性)和 Property(属性)

在 WPF (Windows Presentation Foundation) 中&#xff0c;Attribute&#xff08;属性&#xff09;和 Property&#xff08;属性&#xff09;是两个相关但不同的概念。 Attribute&#xff08;属性&#xff09;是一种元数据&#xff0c;用于给类型、成员或其他代码元素添加附加…...