摘? 要
本設計就很好的解決了上面的問題,它不但能實現畢業生論文的在線提交;還能給教師一定的權限,以在線的方式對自己指導的學生的論文進行審核;并且管理員還可以方便的將每個學生的論文信息按統一的論文排版本格式導出成word文檔等。
本論文共分為五大部分,分別是:一、介紹選題背景及意義和相關系統的發展現狀;二、介紹數據庫技術、面向對象技術和基于B/S結構的WEB程序設計技術;三、對系統進行需求分析并提出解決方案;四、根據解決方案對系統進行設計;五、對畢業論文提交系統進行測試并得到測試結果。
關鍵詞:在線提交;審核;導出;Word文檔;B/S結構
4.1? 系統總體架構
在線畢業論文提交系統的基本功能主要有論文提交、論文查詢、論文審核及后臺數據管理五大部分,其功能模塊圖如圖1所示:

圖1 ?畢業論文提交系統功能模塊圖
4.3? 系統功能模塊設計
4.3.1??首頁
畢業論文提交系統的首頁,實際上是一個本系統的使用幫助頁面,實現非常簡單,不會用到數據庫方面的信息,其界面如圖3所示:

圖3 ?首頁
由于這個頁面只是一個簡單的靜態頁面,這里就不對它的代碼進行詳細的分析,我們只對頁面上乃至以后系統工程每個頁面都會用到的兩個用戶自定義控件加以說明,這兩個控件文件分別是用于頁面頭部的top.ascx和用于頁面底部的bottom.ascx,其定義的方法很簡單,前面也已經講過,這里我們來看一下在每個頁面中怎么使用它們。
在每個頁面中調用top.ascx的語句:
<%@Register TagPrefix="Top" TagName="myTop" Src="top.ascx" %> //TagPrefix用來標記前綴,定義控件的命名空間;TagName 標記名指向所使用控件的名字(這里指向myTop);Src 指向控件的資源文件 ; <Top:myTop runat="server"/> //調用為名myTop的用戶控件 |
4.3.2? 論文提交
本頁面主要實現將學生正確輸入到textBox中的學生信息與論文信息提交到SQL數據庫中的lwtj表,當用戶輸入的信息不正確時,頁面上為提示“輸入信息不正確”的錯誤信息,并以在每個出錯的textbox后面給出錯誤的提示,若學生重復的提交以前已經提交了的信息,頁面就會發生跳轉并提示“你不能重復提交你的論文”的提示信息。在檢查用戶輸入的信息是否合法時,用到的是asp.net中的“驗證控件”,在判斷用戶是否已經提交過論文的方法是,在每個學生在單擊“提交”按鈕后,就先在lwtj表中查詢是否已經有了該學生的號,如果有了就表示已經提交過了。
當完整的輸入了學生的基本信息及論文信息后,單擊“論文提交”頁面中的“提交”按鈕后,要觸發到的submit_Click()函數:
|
| private void submit_Click(object sender, System.EventArgs e) {if(IsValid==true) //判斷頁面上所有控件是否都合乎輸入要求 {// 定義連接字符串 string SqlConn="data Source=127.0.0.1;Database=lwtjdb;User Id=sa;pwd="; SqlConnection Conn=new SqlConnection(SqlConn); // 創建一個名為Conn的新連接 Conn.Open(); //打開連接 //下面的插入語句是將所有在前臺textbox中輸入的值和一個“未審核”的初始值插入到lwtj表 ????string SqlStr="insert into lwtj(stuName,stuNo,password,stuZy,stuTel,email,teacherName,teacherNo,…,lwT ite,lwText,isPass) values('"+this.stuName.Text+"', …………,'"+this.stuNo.Text+"','"+ this.Text.Text.Replace("\r\n" , "<br>").Replace(" "," ")+"','未審核')";? // lwBody.Text.Replace("\r\n" , "<br>").Replace(" "," "):表示將lwBody 內容中的回車換行替換為“<br>”,將空格替換為“ ”一并存入到數據表中 ………… |
|
4.3.3??論文查詢
本頁面主要實現當學生成功提交論文后對自己論文審核情況的查詢;若還未審核,學生便可以看到類似論文提交時的那個頁面,并顯示出學生提交到數據庫的信息,學生可以在這里進行相應的編輯,并點擊“更新”按鈕進行更新;若已經審核,學生登錄后看到的將是“已審核”的提示頁面.本頁主要用到的數據表還是lwtj表,界面如圖4所示:

圖4 提交查詢界面
當用戶單擊了“查詢”按鈕后調用下面的查詢語句:
|
| ………… string SqlStr="select * from lwtj where stuNo='"+stuNo.Text+"' and password='"+password.Text+"'";? //查詢lwtj表上是否有用戶剛才輸入的賬號和密碼 SqlCommand Comm=new SqlCommand(SqlStr,Conn); SqlDataReader dr=Comm.ExecuteReader(); ?//執行查詢 // 下面的if語句判斷是否查找到,若找到,則將記錄中的每個值賦給一個相應的Session變量 if(dr.Read()) { dr.Close(); Conn.Close(); Response.Redirect("cxjg.aspx"); ?//轉到查詢結果頁 } else message.Text="輸入不正確!"; ………… |
|
當用戶輸入正確的學號和密碼后,執行下面的頁面事件:
|
| private void Page_Load(object sender, System.EventArgs e) ?? { ???? if(IsPostBack==false) //如果是第一次加載本頁面,就執行下面的語句 ?????? { ??????? ?………… string SqlStr="select * from lwtj where isPass='未審核' and stuNo='"+Session["theno"].ToString()+"'";? //查詢此學號的論文是否已經審核 ?????? ??SqlCommand Comm=new SqlCommand(SqlStr,Conn); ???? ?? ?SqlDataReader dr=Comm.ExecuteReader(); ??????? if(dr.Read())? //如果上面的條件成立,則將上個頁面保存的所有的Session的值傳到相應的textbox中,若不成立,就自動跳轉到“已審核”提示頁 ?????? ?????{ ???????? ?????stuName.Text=Session["thename"].ToString(); ???????? ?????stuNo.Text=Session["theno"].ToString(); ???????? ?????password1.Text=Session["thepwd"].ToString(); ???????? ?????………… ???????? } ??????? else ????????? Response.Redirect("isPass.aspx");? // 轉到“已審核”提示頁面 ?????? } ??? } |
|
當用戶單擊了頁面中的“更新”按鈕后調用下面的update_Click()函數:
|
| private void update_Click(object sender, System.EventArgs e) ?? { ???? ?if(IsValid==true)? //判斷頁面上所有控件是否都合乎輸入要求 ???? ??? { ??????????? ………… ?????????? string SqlStr="Update lwtj set stuNo='"+stuNo.Tex +"',stuName='"+ stuName.Text+"',password='"+password 1 .Text+"',stuZy='"+stuZy.T ext+"',stuTel='"+stuTel.Text+"',email='"+mail. Text+"',teacher Name='"+teacherName.Text+"',teacherNo='"+teacherNo.Text+"',lwTitle='"+lwTitle.Text+"',lwBody='"+lwBody.Text.Replace("\r\n" , "<br>").Replace(" "," ")+"' where stuNo="+Sessi on["theno"];? ?//更新學生的基本信息 ???? ?? ?????SqlCommand Comm=new SqlCommand(SqlStr,Conn); Comm.ExecuteNonQuery();? //執行UpDate語句 ?????????? ???Conn.Close(); ???????? ??? message.Text="恭喜你!更新成功!";? //提示更新成功 ?????????? } ???? else ???? ?? {message.Text="發生錯誤,請按照文本框后的提示信息重新輸入正確信息!";} ………… |
|
4.3.4??論文審核
老師首先進入“教師”登錄頁面,當輸入正確的teacherNo與teacherPassword后,進入“教師審核論文頁面”(界面如圖5),在這個頁面主要顯示的是該老師所帶的所以學生的學生及論文信息,老師可以在這里審閱學生的論文,若合格,可點出“審核”按鈕進行審核,還可以點擊“導出”按鈕導出學生的論文信息到word文檔,該頁面上方還有個“教師修改個人信息”的功能選項,在老師首次登錄后使用它來修改自己的密碼及個人信息(界面如圖6)。

圖5 老師審核論文界面

圖6 教師信息修改界面
老師登錄的主要源碼如下:
|
| public void jsdl_Click(object sender, System.EventArgs e) ?{ ………… string SqlStr="select * from teacher where teacherNo='"+teacherNo.Text+"' and teacherpassword='"+password.Text+"'"; //查詢teacher中是否有該老師的信息 ?? ??SqlCommand Comm=new SqlCommand(SqlStr,Conn); ??? SqlDataReader dr=Comm.ExecuteReader();? 執行查詢 if (dr.Read())? //如查詢到,將該教師的工號與姓名存分別暫存到Session變量中 ????? { ?????? Session["teano"]=teacherNo.Text; ?????? Session["teaname"]=dr["teacherName"].ToString(); ?????? Response.Redirect("lwsh.aspx"); //跳轉到論文審核主頁面 ????? } ?? else ?????? message.Text="輸入不正確!"; //密碼不正確的提示 ………… |
|
老師成功登錄后,下面是datagrid中的Click_Grid()事件:
|
| public void Click_Grid(object sender,? DataGridCommandEventArgs E) ? { ??? if(E.CommandName=="daochu")? //判斷是否單擊了“導出”按鈕 ???? ??{ ?????? //前面利用DataKeyField=stuNo設置了學號關鍵字段,所以下面的語句可以獲取 某行的stuNo,并把結果傳給Session["stuno"] ????? ???Session["stuno"]=dg1.DataKeys[(int)E.Item.ItemIndex]; ????? ???Response.Redirect("tealwdc.aspx"); //轉到教師導出論文的頁面 ???? ???} ???? Else? //若單擊了“審核”按鈕 ????? ?{ ????? ???????………… ???????? string SqlUpDate="Update lwtj Set isPass='已審核' where stuNo="+dg1.DataKeys[(int)E.Item.ItemIndex];? //只更新當前行 ????? ???SqlCommand Comm=new SqlCommand(SqlUpDate,Conn); ?? ??????Comm.ExecuteNonQuery(); //執行更新語句 ????? ???BindData();?? //重新調用綁定數據函數 ???? ?} } |
|
老師導出論文的代碼與后面管理員導出論文的代碼差不多,這里就不給出,后面將有詳細的介紹。
4.3.5??論文導出
管理員頁面所實現的主要功能是對學生及論文信息的管理,以及論文的導出,還有對老師基本信息的初始添加(界面如圖8)和對老師信息的管理,其中在登錄管理員首頁的時候有個管理員的身份驗證,若輸入正確才能登錄到管理平臺,進入這個平臺后便會看到“學生信息及論文信息的管理”( 界面如圖7)和“老師信息管理”這兩個子功能,我們可以單擊它進行相應的管理,下分別介紹各個頁面的界面及主要實現價碼。

圖7 學生信息管理界面

圖8 添加老師信息界面
管理登錄,當用戶單擊登錄按鈕的時候調用gldl_Click()處理方法,用來進行管理員的身份驗證:如果用戶存在,則讓用戶進入管理頁面;如果用戶不存在,則給出錯誤提示信息。
管理員登錄的源碼與教師登錄的源碼差不多一樣,僅僅是它們所要用到的數據表不同而已,這里不再給出管理員登錄的源碼。
學生信息管理,Sort_Grid()方法的作用是,當用戶單擊DataGrid控件中的stuNo關鍵字后,按這些關鍵字進行排序,以方便管理的查詢。
|
| public void Sort_Grid(object sender, DataGridSortCommandEventArgs E) ?{ ? ??………… //按學號升棄排序,并將結果綁定到DataSet控件上 ?? string SqlStr="select * from lwtj? order by stuNo"; ??? SqlDataAdapter da=new SqlDataAdapter(SqlStr,Conn); DataSet ds=new DataSet(); //創建DataSet控件ds ?? da.Fill(ds,"lwtj"); //調用Fill方法將表lwtj放在DataSetc對象中 dg1.DataSource=ds.Tables["lwtj"].DefaultView; ?? dg1.DataBind(); //綁定數據 } |
|
ChangePage()方法,實現分頁的功能用:
|
| public void ChangePage(object sender,DataGridPageChangedEventArgs E) ?? { //利用E.NewPageIndex獲得新的頁數 ??? dg1.CurrentPageIndex=E.NewPageIndex; ??? BindData();//重新綁定數據 ?? } |
|
。
|
| public void Click_Grid(object sender, DataGridCommandEventArgs E) ?{? if (E.CommandName=="daochu") //判斷是否單擊了“導出”按鈕 ???? ?{ Session["stuno"]=dg1.DataKeys[(int)E.Item.ItemIndex]; //取當前行的學號,并存到Session["stuno"]中 ??????? Response.Redirect("adminlwdc.aspx"); //跳轉到管理員導出論文頁面 } else if(E.CommandName=="delete")? //是否單擊了“刪除”按鈕,若是,先建立數據庫連接,然后執行刪除操作 ???? { ………… string Sqldel="delete from lwtj where stuNo="+dg1.DataKeys[(int)E.Item.ItemIndex]; //定義刪除語句 ?????? SqlCommand Comm=new SqlCommand(Sqldel,Conn); ?????? Comm.ExecuteNonQuery(); //執行 ???? ? BindData(); ?//重新綁定數據?? …………????????? ????? ??}?? ………… ? ???}????? |
|
當管理員進入了添加教師頁面并單擊了“添加”按鈕后,調用下面的處理方法,將新的教師信息入庫:
private void submit_Click(object sender, System.EventArgs e) { ? ………… ? //定義插入教師信息的Insert語句 StringSqlStr="insert into teacher(teacherNo,teacherName,teacherPassword,teacherZc,teacherTel,teacherEmail) values('"+this.teacherNo.Text+"','"+this.teacherName.Text+"','"+this.password1.Text+"','"+this.teacherZc.Text+"','"+this.teacherTel.Text+"','"+this.email.Text+"')"; ? SqlCommand Comm=new SqlCommand(SqlStr,Conn); ? Comm.ExecuteNonQuery(); //執行insert語句 ? Conn.Close();? //關閉連接 ? message.Text="恭喜你!添加成功!若不再繼續添加,請單擊<返回上頁>返回!"; ?} |
|
刪除教師信息的實現方法與刪除學生及論文信息的方法一樣,前面已經介紹過,這里不在給出相關代碼。
導出學生論文信息到word文檔的主要實現原理是:當用戶單擊 “導出”按鈕后,系統轉到導出論文的頁面,建立數據庫的連接,并把數據庫中合乎條件的記錄的值取出傳給相應的label,而前臺的Html頁中已經以論文模板的形式設置好了各個label的位置,最后調用一個將html頁轉換成word文檔的方法即可。
|
| private?? void?? Page_Load(object sender,System.EventArgs?? e)???? ? {………… ?? BindData(); //調用數據綁定函數 ???? ?? Response.Charset="GB2312";//設置輸出流為簡體中文??? Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");//設置輸出文件類型為 word類型 ????? ?? Response.ContentType="application/ms-word? "; //用來保存為word文件的文件名?? Response.AddHeader(? "Content-Disposition","inline;filename="+stuNo.Text+”.doc");?? //"filename="+stuNo.Text+”.doc",表示以學號為文件名保存為word文檔 ? } |
|
BindData()方法,它首先連接到lwtj表,然后查詢出用戶要導出的學生的信息,并把這些信息的值傳給對應的Label,主要代碼如下:
|
| private?? void?? BindData()???? { ?//定義連接字符串,建立數據庫連接 string SqlConn="data Source=127.0.0.1;Database=lwtjdb;User Id=sa;pwd="; SqlConnection Conn=new SqlConnection(SqlConn); Conn.Open(); //定義查詢語句 string SqlStr="select * from lwtj where stuNo="+Session["stuno"]; ? ?SqlCommand Comm=new SqlCommand(SqlStr,Conn); SqlDataReader dr=Comm.ExecuteReader(); //執行 //如果查找到,將記錄中的各個值賦相應的給label if (dr.Read()) ??? ?{ stuno.Text=dr["stuNo"].ToString(); ????? ?stuname.Text=dr["stuName"].ToString(); ?????? stuzy.Text=dr["stuZy"].ToString(); ????? ?teaname.Text=dr["teacherName"].ToString(); ??? ???lwtitle.Text=dr["lwTitle"].ToString(); ????? ?lwbody.Text=dr["lwBody"].ToString(); ?????? ………… ???? ?} } |
|