Java完整的學(xué)生選課系統(tǒng)源碼11_第1頁
Java完整的學(xué)生選課系統(tǒng)源碼11_第2頁
Java完整的學(xué)生選課系統(tǒng)源碼11_第3頁
Java完整的學(xué)生選課系統(tǒng)源碼11_第4頁
Java完整的學(xué)生選課系統(tǒng)源碼11_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第頁Java完整的學(xué)生選課系統(tǒng)源碼需求分析:寫一個(gè)較為嚴(yán)謹(jǐn)?shù)膶W(xué)生選課系統(tǒng),實(shí)現(xiàn)學(xué)生可以選擇多門選課課程,并將有效選課結(jié)果保存到數(shù)據(jù)庫。學(xué)生需要登錄后,才能選課。讓學(xué)生可以在選課系統(tǒng)通過多種方式查詢到要選的課程信息。//選課規(guī)則:1、每個(gè)學(xué)生可以選多門課程,多次選課的總學(xué)分不能超過6學(xué)分;2、不能重復(fù)選擇一門課程;3、每一門課程的選課人數(shù)都有數(shù)量限制,當(dāng)某門課程的選課名額滿時(shí),則應(yīng)另選課程。4、憑用戶名和密碼登錄,通過提交某一課程號(hào)來選課//總體設(shè)計(jì)方案:建立三個(gè)類:登錄類register,選課類studentChooseCourse,數(shù)據(jù)庫工具類JDBCUtil;一個(gè)SQL腳本文件用于生成數(shù)據(jù)庫表結(jié)構(gòu)和初始記錄,以搭建數(shù)據(jù)庫環(huán)境。登錄類register類,負(fù)責(zé)對(duì)用戶的身份進(jìn)行驗(yàn)證;工具類JDBCUtil用于實(shí)現(xiàn)連接,你可調(diào)用JDBCUtil的getConnection()方法等到鏈接。選課類studentChooseCourse用于,實(shí)現(xiàn)選課功能。其中包括幾個(gè)主要方法:1、actionPerformed(ActionEvent)用于監(jiān)聽用戶“查詢”和“提交”操作,并負(fù)責(zé)調(diào)用各種方法對(duì)其進(jìn)行處理2、createSearchCourse()用于產(chǎn)生圖形用戶界面3、processBeforeCommit()用于對(duì)用戶的“提交”查找進(jìn)行驗(yàn)證,剔除無效的用戶操作4、tryCommit()負(fù)責(zé)對(duì)有效的“提交”操作,進(jìn)一步處理,并將有效的操作結(jié)果時(shí)時(shí)保存到數(shù)據(jù)庫,并更新數(shù)據(jù)庫原有信息//本程序用到的知識(shí)點(diǎn):數(shù)據(jù)庫連接JDBC;SQL建表、插入輸入、動(dòng)態(tài)查詢;圖形用戶界面的產(chǎn)生以及處理查詢結(jié)果集并較好顯示;程序設(shè)計(jì)基礎(chǔ)知識(shí)。//代碼如下:importjava.awt.GridLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.sql.*;importjavax.swing.*;importjavax.swing.table.DefaultTableModel;importschool.schoolPicture.JdbcUtil;publicclassStudentChooseCourseextendsJFrameimplementsActionListener{JTextFieldjtfSearch=newJTextField(11);String[]columnNames=newString[]{"課程ID","課程名","學(xué)時(shí)","學(xué)分","學(xué)期","性質(zhì)"};DefaultTableModeldtmSearch=newDefaultTableModel(columnNames,27);JTablejtSearch=newJTable(dtmSearch);JScrollPanejspSearch=newJScrollPane(jtSearch);JComboBoxjcbSearch=newJComboBox();JTextFieldjtfSelectedCourse=newJTextField(10);Connectioncon=null;PreparedStatementps=null;ResultSetrs=null;privatestaticStringusrName;privatestaticStringpasswrd;//在構(gòu)造方法中添加兩個(gè)參數(shù)。以便在"提交"時(shí),將學(xué)生的身份連同所選的課程,一同記錄在學(xué)生選課表中。publicStudentChooseCourse(StringusrName,Stringpasswrd){createSearchCourse();this.usrName=usrName;this.passwrd=passwrd;publicStringgetUsrName(){returnusrName;publicvoidsetUsrName(StringusrName){this.usrName=usrName;publicStringgetPasswrd(){returnpasswrd;publicvoidsetPasswrd(Stringpasswrd){this.passwrd=passwrd;//根據(jù)用戶的時(shí)間,做出相應(yīng)的反映publicvoidactionPerformed(ActionEvente){Stringstr=e.getActionCommand();//清空結(jié)果顯示區(qū)中的內(nèi)容,如果有的話。if("查詢".trim().equals(str)){intk=1;while(k<10){for(inti=1;i<7;i++){jtSearch.setValueAt(null,k-1,i-1);k++;//調(diào)用下面的這個(gè)方法,在數(shù)據(jù)庫中進(jìn)行查找,并將結(jié)果顯示在表格中。searchAvailableCourse();}elseif("提交".equals(str)){//processBeforeCommit()對(duì)用戶選課操作進(jìn)行有效性檢驗(yàn);//剔除無效操作:如輸入無效的課程號(hào),或已經(jīng)選擇了某一課程,已經(jīng)選滿的6學(xué)分等各種情況booleaneffect=processBeforeCommit();//如果課程存在,且該學(xué)生具有選擇該課程的資格,即effect為true,進(jìn)入正式提交程序(tryCommit())if(effect==true){tryCommit();}//對(duì)用戶選課操作進(jìn)行有效性檢驗(yàn);publicbooleanprocessBeforeCommit(){//清空原結(jié)果顯示區(qū)中的內(nèi)容,如果有的話。intk=1;while(k<10){for(inti=1;i<7;i++){jtSearch.setValueAt(null,k-1,i-1);k++;//取得用戶輸入的課程號(hào)StringuserInput=jtfSelectedCourse.getText().toString().trim().toLowerCase();//無效操作1:在數(shù)據(jù)庫中的coursexx表中查詢?cè)撜n程號(hào)。如果不存在該課程,給出提示。Stringsql="selectcnofromcoursexxwherecno=?";booleanflagCourseExist=false;try{ps=con.prepareStatement(sql);ps.setString(1,userInput);rs=ps.executeQuery();flagCourseExist=rs.next();}catch(ExceptioneC){eC.printStackTrace();if(!flagCourseExist){JOptionPane.showMessageDialog(null,"該課程不存在,請(qǐng)重新輸入");returnfalse;//判斷該學(xué)生選修課已選課程的總學(xué)分是否小于6;//無效操作2:如果已有選課記錄,并且總學(xué)分大于6學(xué)分,該學(xué)生不能在選了。PreparedStatementps=null;sql="selectsum(grade)"+"from(selectx.sname,xo,k.gradegrade"+"fromcoursexxkjoinchoicesxxx"+"onko=xoandx.sname=?)result";Stringgrade=null;try{ps=con.prepareStatement(sql);ps.setString(1,usrName);rs=ps.executeQuery();while(rs.next()){grade=rs.getString(1);if(grade==null){grade="0";}}catch(Exceptionrrr){rrr.printStackTrace();System.out.println("總學(xué)分:"+grade);if(Integer.parseInt(grade)>6){JOptionPane.showMessageDialog(null,"你已經(jīng)選滿6學(xué)分,系統(tǒng)將退出");this.setVisible(false);returnfalse;//無效操作3:課程該學(xué)生已經(jīng)選擇了某課程,則不能再選該課程了。sql="select*fromchoicesxxwheresname=?andcno=?";booleanflag=false;try{ps=con.prepareStatement(sql);ps.setString(1,this.getUsrName());ps.setString(2,userInput);rs=ps.executeQuery();flag=rs.next();}catch(Exceptioneaa){eaa.printStackTrace();if(flag){JOptionPane.showMessageDialog(null,"你已經(jīng)選擇了該課程。請(qǐng)另選課程");returnfalse;}//如果以上無效操作都不存在,則返回true,意為這是一個(gè)準(zhǔn)有效操作returntrue;//對(duì)有效的提交操作的進(jìn)行處理publicvoidtryCommit(){//userInput為用戶輸入的課程ID.StringuserInput=jtfSelectedCourse.getText().toString().trim().toLowerCase();//ifcoursestillavailable(count<MAX_STUDENT),saveresult.//elseifcoursenotavailable,showMessagetostudent.PreparedStatementps;Stringsql="select(Max-selectedCount)asRemainedCount"+"fromCoursexxwherecno=?";try{ps=con.prepareStatement(sql);//取得學(xué)生ID或名字,將課程ID存入學(xué)生選課表choicesxxps.setString(1,userInput);rs=ps.executeQuery();ResultSetMetaDatameta=rs.getMetaData();intcols=meta.getColumnCount();intRemainedCount=-1;while(rs.next()){RemainedCount=rs.getInt(1);System.out.println("RemainedCount:"+RemainedCount);//如果該課程還有選擇的名額,提示單項(xiàng)選課操作成功。if(RemainedCount>0){//savestudentIdandcourseIdtostudent-coursetable.//this.getUsrName();userInputsql="insertintochoicesxxvalues(?,?)";ps=con.prepareStatement(sql);ps.setString(1,this.getUsrName());ps.setString(2,userInput);ps.executeUpdate();JOptionPane.showMessageDialog(null,"選課成功:"+this.getUsrName()+"選了"+userInput+"."+""+"還有"+RemainedCount+"人可以選該課程。");//更新課程中已選該課程的人數(shù):即將可選該課程的人數(shù)減去1個(gè)人。sql="updateCourseXXsetselectedCount=selectedCount+1wherecno=?";ps=con.prepareStatement(sql);ps.setString(1,userInput);ps.executeUpdate();conmit();//如果該課程已經(jīng)沒有選擇名額,提示重新選課}catch(Exceptiones){es.printStackTrace();try{con.rollback();}catch(Exceptioney){ey.printStackTrace();//對(duì)用戶查詢課程信息,進(jìn)行處理,并顯示查詢結(jié)果publicvoidsearchAvailableCourse(){//讓程序自動(dòng)選擇連接的是Oracle或SqlServer.if(JDBCUtil.getConnection()!=null){System.out.println(JDBCUtil.getConnection());con=JDBCUtil.getConnection();}else{con=JdbcUtil.getConnection();//userInput取得用戶輸入的信息,selectedItem取得用戶選擇的查詢方式StringuserInput=jtfSearch.getText().toString().trim().toLowerCase();StringselectedItem=jcbSearch.getSelectedItem().toString().trim();System.out.println("Usersearch:"+userInput);System.out.println("selectedItem:"+selectedItem);Stringsql=null;//按用戶查詢方式,如按課程名,課程ID或?qū)W時(shí)的查詢進(jìn)行處理;并在表格中實(shí)現(xiàn)結(jié)果try{if("課程名".equals(selectedItem)){sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwherecname=?";ps=con.prepareStatement(sql);ps.setString(1,userInput);}elseif("課程ID".equals(selectedItem)){sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwherecno=?";ps=con.prepareStatement(sql);ps.setString(1,userInput);}elseif("學(xué)時(shí)".equals(selectedItem)){sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwherehour=?";ps=con.prepareStatement(sql);ps.setInt(1,Integer.parseInt(userInput));}elseif("學(xué)分".equals(selectedItem)){sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwheregrade=?";ps=con.prepareStatement(sql);ps.setInt(1,Integer.parseInt(userInput));}elseif("學(xué)期".equals(selectedItem)){sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwhereterm=?";ps=con.prepareStatement(sql);ps.setString(1,userInput);System.out.println(sql);rs=ps.executeQuery();conmit();ResultSetMetaDatameta=rs.getMetaData();intcols=meta.getColumnCount();Stringresult=null;intk=1;booleanflag=false;//將查詢結(jié)果以表格的形式顯示出來while(rs.next()){for(inti=1;i<=cols;i++){result=rs.getString(i);System.out.println(result);jtSearch.setValueAt(result,k-1,i-1);k++;flag=true;//如果查詢結(jié)果集為空,提示用戶沒有該課程if(flag==false){JOptionPane.showMessageDialog(null,"該課程不存在,請(qǐng)重新輸入");return;}catch(Exceptionex){ex.printStackTrace();try{con.rollback();}catch(Exceptioner){er.printStackTrace();//產(chǎn)生圖形用戶界面,以便用戶操作

publicvoidcreateSearchCourse(){

this.setLayout(newGridLayout(3,1));

JPaneljp1=newJPanel();

jp1.setLayout(newGridLayout(4,1));

JPaneljp2=newJPanel();

JPaneljp3=newJPanel();

JPaneljp10=newJPanel();

JPaneljp11=newJPanel();

JPaneljp12=newJPanel();

JPaneljp13=newJPanel();

JLabeljlSearch=newJLabel("學(xué)生選課系統(tǒng)");

jp11.add(jlSearch);

jcbSearch.addItem(newString("課程名"));

jcbSearch.addItem(newString("課程ID"));

jcbSearch.addItem(newString("學(xué)時(shí)"));

jcbSearch.addItem(newString("學(xué)分"));

jcbSearch.addItem(newString("學(xué)期"));

jp12.add(jtfSearch);

jp12.add(jcbSearch);

JButtonjbOK=newJButton("查詢");

jbOK.addActionListener(this);

jbOK.setSize(90,20);

jp13.add(jbOK);

jp1.add(jp10);

jp1.add(jp11);

jp1.add(jp12);

jp1.add(jp13);

jp2.add(jspSearch);

JLabeljlSelectedCourse=newJLabel("請(qǐng)輸入課程ID:");

JButtonjbSelectedCourse=newJButton("提交");

jbSelectedCourse.addActionListener(this);

jp3.add(jlSelectedCourse);

jp3.add(jtfSelectedCourse);

jp3.add(jbSelectedCourse);

this.add(jp1);

this.add(jp2);

this.add(jp3);

this.setVisible(true);

this.setSize(485,600);

}

//當(dāng)某學(xué)生有效登錄后,啟動(dòng)程序(將學(xué)生的登錄信息也傳過來,以便保存選課操作時(shí)使用)

publicstaticvoidmain(String[]args){

//StringusrName="xuliang";

//Stringpasswrd="123";

newStudentChooseCourse(usrName,passwrd);

}

}//以下為搭建學(xué)生選課系統(tǒng)的SQL腳本文件。只需運(yùn)行一次,就可有完整的數(shù)據(jù)庫表結(jié)構(gòu)和初始記錄。//該腳本針對(duì)SQLserver;Oracle的SQL腳本類似,只需將將數(shù)據(jù)類型如varchar改為varchar2,int改為number等--table1:registerXU登錄表

droptableregisterXu;

createtableregisterXu(idvarchar(20),userNamevarchar(20),passWordvarchar(20),identifyvarchar(20));

insertintoregisterXuvalues('s001','xuliang','123','學(xué)生');

insertintoregisterXuvalues('s002','xuliang2','1234','學(xué)生');

insertintoregisterXuvalues('j001','jack','12345','學(xué)生');

insertintoregisterXuvalues('001','user','user','學(xué)生');

insertintoregisterXuvalues('z001','zlm','corejava','老師');

--Stringsql="select*fromregisterXu"

--+"whereuserName=?andpassWord=?andidentify=?";--table2:Coursexx課程表

droptableCoursexx;

createtableCoursexx(cnovarchar(20)primarykey,cnamevarchar(20),hourInt,

gradeInt,termvarchar(20),isNeedvarchar(20),selectedCountInt,MaxInt);

insertintoCoursexxvalues('c001','CoreJava',50,5,'201907','NoNecessary',0,50);

insertintoCoursexxvalues('c002','XML',20,2,'201908','NoNecessary',0,40);

insertintoCoursexxvalues('c003','HIBERNATE',20,4,'201908','NoNecessary',0,30);

insertintoCoursexxvalues('c004','SQL',20,4,'201906','NoNecessary',0,5);

insertintoCoursexxvalues('c005','JDBC',20,2,'201908','NoNecessary',0,3);

insertintoCoursexxvalues('c006','AJAX',20,2,'201910','NoNecessary',0,1);

insertintoCoursexxvalues('c007','JSP',100,8,'201909','NoNecessary',0,1

--sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwherecname=?";

--table3:學(xué)生表--

droptablestudentxx;

createtablestudentxx(sidvarchar(20),snamevarchar(20)primarykey,sexvarchar(20),birthdayvarchar(20),

classNamevarchar(20),imagevarchar(20));

insertintostudentxxvalues('s001','xuliang','male','19901124','sd1003','good');

insertintostudentxxvalues('s002','xuliang2','male','19851124','sd0910','good');

insertintostudentxxvalues('j001','jack','male','19881124','sd1003','good');

insertintostudentxxvalues('001','user','male','19901124','sd1005','good');

insertintostudentxxvalues('s003','sisi','female','19880124','sd1007','good');

insertintostudentxxvalues('as003','crystal','female','19880124','asd1007','good');--table4:choices學(xué)生選課表

droptablechoicesxx;

createtablechoicesxx(

snamevarchar(20)referencesstudentxx(sname),cnovarchar(20)referencescoursexx(cno));

--判斷某一個(gè)學(xué)生已經(jīng)選的課程的總學(xué)分是否小于6分//用戶登錄類//用途:驗(yàn)證用戶是否具有登錄系統(tǒng)的資格packageschool;importjavax.swing.*;importschool.schoolPicture.JdbcUtil;importjava.sql.*;importjava.awt.*;importjava.awt.event.*;publicclassRegisterimplementsActionListener{JFramejf=newJFrame("學(xué)生成績管理及選課系統(tǒng)");JTextFieldjtfUserName=newJTextField(10);JPasswordFieldjpfPassWord=newJPasswordField(10);JComboBoxidentify=newJComboBox();//constructorpublicRegister(){CreateRegisterGUI();//dealwithuseraction,whenusercheck:"登錄","取消"or"注冊(cè)"publicvoidactionPerformed(ActionEvente){Stringstr=e.getActionCommand();if(str.equalsIgnoreCase("登錄")){//當(dāng)用戶點(diǎn)擊登錄時(shí),調(diào)用以下方法去數(shù)據(jù)庫做匹配processLogin();}elseif(str.equalsIgnoreCase("取消")){jtfUserName.setText("");jpfPassWord.setText("");}elseif(str.equalsIgnoreCase("注冊(cè)")){newCreateLogin();//當(dāng)用戶點(diǎn)擊登錄時(shí),調(diào)用以下方法去數(shù)據(jù)庫做匹配

publicvoidprocessLogin(){

//createconnectiontothedatabase.

Connectioncon=null;

//Connectioncon=JDBCUtil.getConnection();

//讓程序自動(dòng)連接相應(yīng)的數(shù)據(jù)庫,以避免連接數(shù)據(jù)庫時(shí)頻繁改動(dòng)連接程序

if(JdbcUtil.class==null){

//連接達(dá)內(nèi)Oracle數(shù)據(jù)庫

con=JdbcUtil.getConnection();

}else{

//連接本地SQLSERVER數(shù)據(jù)庫

con=JDBCUtil.getConnection();

}

//writesqlsentence

StringusrName=jtfUserName.getText().trim();

Stringpasswrd=newString(jpfPassWord.getPassword()).trim();

Stringident=identify.getSelectedItem().toString().trim();

Stringsql="select*fromregisterXu"

+"whereuserName=?andpassWord=?andidentify=?";

System.out.println(usrName+":"+passwrd+":"+ident);

//createobjectofPreparedStatement

try{

PreparedStatementps=con.prepareStatement(sql);

//Prepareparameterforthesql

ps.setString(1,usrName);

ps.setString(2,passwrd);

ps.setString(3,ident);

//sendparametertocompilertocompile.

ResultSetrs=ps.executeQuery();

StringBuffersb=newStringBuffer("");

ResultSetMetaDatameta=rs.getMetaData();

intcols=meta.getColumnCount();

//youcanuseanothersimplewaytocheckwhetherthepeoplehasrecordsindatabase:

//defineabooleanflag=false,ifhasrecordchangeit

//totrue;otherwise,ifflag=flase,showMessage("InputERROR")

while(rs.next()){

for(inti=1;i<cols;i++){

sb.append(meta.getColumnName(i));

sb.append(rs.getString(i));

}

}if(sb.length()<1){

JOptionPane.showMessageDialog(null,"用戶名或密碼錯(cuò)誤");

}elseif(sb.length()>=1){

if(ident.equals("student")){

//ifheorsheisastudent,andusrName-passwrdalright,thengoto學(xué)生選課系統(tǒng)

newStudentChooseCourse(usrName,passwrd);

jf.setVisible(false);

//newStudentEntered();

}elseif(ident.equals("teacher")){

//newTeacherEntered(usrName,passwrd);

newTeacherEntered();

jf.setVisible(false);

}elseif(ident.equals("admin")){

//gotoadministratorpages.

}}

}catch(Exceptioner){

er.printStackTrace();

}//當(dāng)用戶點(diǎn)擊登錄時(shí),調(diào)用以下方法去數(shù)據(jù)庫做匹配

publicvoidprocessLogin(){

//createconnectiontothedatabase.

Connectioncon=null;

//Connectioncon=JDBCUtil.getConnection();

//讓程序自動(dòng)連接相應(yīng)的數(shù)據(jù)庫,以避免連接數(shù)據(jù)庫時(shí)頻繁改動(dòng)連接程序

if(JdbcUtil.class==null){

//連接達(dá)內(nèi)Oracle數(shù)據(jù)庫

con=JdbcUtil.getConnection();

}else{

//連接本地SQLSERVER數(shù)據(jù)庫

con=JDBCUtil.getConnection();

}

//writesqlsentence

StringusrName=jtfUserName.getText().trim();

Stringpasswrd=newString(jpfPassWord.getPassword()).trim();

Stringident=identify.getSelectedItem().toString().trim();

Stringsql="select*fromregisterXu"

+"whereuserName=?andpassWord=?andidentify=?";

System.out.println(usrName+":"+passwrd+":"+ident);

//createobjectofPreparedStatement

try{

PreparedStatementps=con.prepareStatement(sql);

//Prepareparameterforthesql

ps.setString(1,usrName);

ps.setString(2,passwrd);

ps.setString(3,ident);

//sendparametertocompilertocompile.

ResultSetrs=ps.executeQuery();

StringBuffersb=newStringBuffer("");

ResultSetMetaDatameta=rs.getMetaData();

intcols=meta.getColumnCount();

//youcanuseanothersim

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論