數(shù)據(jù)庫系統(tǒng)的內(nèi)部構(gòu)成元素與外部其他系統(tǒng)之間的信息關(guān)系如下圖所示: 二,需求分析此學(xué)生管理信息系統(tǒng)的主要功能如下圖所示: 三,數(shù)據(jù)庫邏輯設(shè)計(jì)3.1 ER圖:本系統(tǒng)的ER圖如下: 
該ER圖包括院系、專業(yè)、班級(jí)、教師、課程、學(xué)生、獎(jiǎng)懲七個(gè)實(shí)體集和院系—專業(yè)、專業(yè)—班級(jí)、班級(jí)—學(xué)生、獎(jiǎng)懲—學(xué)生、選課、教師—課程七個(gè)聯(lián)系集。
3.2 數(shù)據(jù)字典 院系表(department) 專業(yè)表 
班級(jí)表(class) 教師表(teacher) 學(xué)生表(student) 用戶表(user) 課程表(course) 從數(shù)據(jù)字典中抽取出來的聯(lián)系的描述: 選課表(scourse) 獎(jiǎng)懲表(behavior) 3.3 用戶視圖中的表 (1)department(dno,dname,headno,place,phone) 主碼:dno 外碼:headno參照teacher(tno) (2)profession(pno,pname,dno,speciality,scale) 主碼:pno 外碼:dno參照department(dno) - class(classno,classname,tno,pno)
主碼:classno 外碼:tno參照teacher(tno);pno參照profession(pno) (4)teacher(tno,tname,sex,level,birthday,worktime,dno,phone) 主碼:tno 外碼:dno參照department(dno) - student(sno,sname,sex,birthday,studytime,phone,address,classno)
主碼:sno 外碼:classno參照class(classno) 主碼:uname - course(cno,ctno,term,cname,period,credit,dno,tno,place,time)
主碼:cno,ctno,term 外碼:dno參照department(dno);tno參照teacher(tno) - scourse(sno,cno,ctno,term,score)
主碼:sno,cno,ctno,term 外碼:sno參照student(sno);cno,ctno,term參照course(cno,ctno,term) - behavior(bno,sno,sname,content,category,date,detail)
主碼:bno 外碼:sno參照student(sno) 四,數(shù)據(jù)庫物理設(shè)計(jì)建表應(yīng)用Navicat premium數(shù)據(jù)庫管理工具直接進(jìn)行表操作。
五,登錄界面 用戶在登錄界面輸入用戶名和密碼以及驗(yàn)證碼,經(jīng)過系統(tǒng)驗(yàn)證后,通過賬戶自動(dòng)判斷權(quán)限,可以進(jìn)入相應(yīng)角色的操作界面。 
5.1 學(xué)生用戶操作界面 學(xué)生可以修改自己的聯(lián)系方式和家庭住址,其余信息需要管理員修改。 
- 按學(xué)院信息查詢課程,勾選想選擇的課程進(jìn)行選課。

- 查詢及刪除已選課程,通過勾選課程進(jìn)行刪除操作。


5.2 教師用戶操作界面 (1)修改個(gè)人信息。 
(2)查詢所授課程的信息。 
(3)查看所授課程的學(xué)生選課情況。 
(4)錄入、查看成績(jī) 
5.3 管理員用戶操作界面 (1)學(xué)生管理:查詢、添加、修改、刪除學(xué)生信息。 
(2)教師管理:查詢、添加、修改、刪除教師信息。 
(3)課程管理:查詢、添加、修改、刪除課程信息。 
(4)獎(jiǎng)懲信息管理:查詢、添加、修改、刪除獎(jiǎng)懲信息。 
(5)學(xué)院管理:添加、修改、刪除學(xué)院信息。 
六,學(xué)生選課 選擇課程 并在課程表里更新相應(yīng)課程的學(xué)生信息,將選取的課程存到List<Course>中 然后更新數(shù)據(jù)庫。 bt_choose.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { { list_choose=new ArrayList<Course>(); tableModel = new MyTableModel(pn_choose2_table); if(list_play!=null){ int len_list_play=list_play.size(); for(int i=0;i<len_list_play;i++) { if((boolean)tableModel.getRow(i)[0]==true) { Course course=new Course(); course.setCno((String)tableModel.getRow(i)[1]); course.setCtno((String)tableModel.getRow(i)[2]); course.setTerm((String)tableModel.getRow(i)[3]); course.setCname((String)tableModel.getRow(i)[4]); course.setPeriod((String)tableModel.getRow(i)[5]); course.setCredit((Float)tableModel.getRow(i)[6]); course.setDno((String)tableModel.getRow(i)[7]); course.setTno((String)tableModel.getRow(i)[8]); course.setPlace((String)tableModel.getRow(i)[9]); course.setTime((String)tableModel.getRow(i)[10]); list_choose.add(course); } } if(list_choose.size()==0){new MyDialog("未選擇課程!");} else{ if(list_choose.size()>COURSE_NUM){new MyDialog("課程數(shù)超出!");} else{ //更新數(shù)據(jù)庫 for(Course course:list_choose){ String sno=student.getSno(); String cno=course.getCno(); String ctno=course.getCtno(); String term=course.getTerm(); //先查詢 如果已經(jīng)選過這個(gè)學(xué)期的課了就不能再選 //如果能選就加入選課信息表 Object params3[]={cno,term}; StudentGUI.this.mf.getUm().sqlBuilde("select sno from scourse where cno=? and term=? ",params3); try { ResultSet rs=StudentGUI.this.mf.getUm().getPs().executeQuery(); int flag=2;//沒有存在 String tt=new String(); while(rs.next()) { tt=rs.getString(1); if(tt!=null) { if(tt.equals(sno)){flag=1;break;} //已經(jīng)選過這門課了 } else {flag=2;}//沒有選過這門課 } { if(flag==2){//可以選 Object params5[]={sno,cno,ctno,term}; StudentGUI.this.mf.getUm().sqlBuilde("insert into scourse (sno,cno,ctno,term,score) values(?,?,?,?,null)",params5); StudentGUI.this.mf.getUm().getPs().execute(); new MyDialog("選課成功"); } else if(flag==1) { //不能選 new MyDialog("課程號(hào)"+cno+"選課重復(fù),失敗"); } }
} catch (SQLException e2) { new MyDialog("選課失敗"); e2.printStackTrace(); } } } } } } } }); 學(xué)生注銷選課 與學(xué)生選課的事務(wù)類似,不過對(duì)數(shù)據(jù)庫的操作變?yōu)樵谶x課表中刪除選課記錄。 ("delete from scourse where sno=? and cno=? and ctno=? and term=?",params2) 教師打分 //修改成績(jī) 并在選課表里更新相應(yīng)課程的成績(jī)信息 然后更新數(shù)據(jù)庫 bt_choose.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //list_course_student=new ArrayList<Integer>(); //tableModel = new MyTableModel(pn_choose2_table); if(list_course_student!=null){ int len_list_play=list_course_student.size(); for(int i=0;i<len_list_play;i++) { synchronized(LoginFrame.class){ Object params3[]={Integer.parseInt((String)tableModel.getRow(i)[6]),(String)tableModel.getRow(i)[0],(String)tableModel.getRow(i)[1],(String)tableModel.getRow(i)[3]}; System.out.println(Integer.parseInt((String)tableModel.getRow(i)[6])); TeacherGUI.this.mf.getUm().sqlBuilde("update scourse set score=? where cno=? and ctno=? and sno=? ",params3); try { TeacherGUI.this.mf.getUm().getPs().execute(); } catch (SQLException e1) { new MyDialog("更新失敗"); e1.printStackTrace(); } }
}} new MyDialog("更新成功"); } });
管理員增加學(xué)生信息
因?yàn)樵黾訉W(xué)生時(shí)候不僅需要更新學(xué)生表,同需要更新用戶表,所以在進(jìn)行操作的時(shí)候就需要多次對(duì)數(shù)據(jù)庫進(jìn)行操作,同時(shí)因?yàn)閷W(xué)生的基本信息是應(yīng)該一入學(xué)就確定了不能輕易改變的,因而在增加學(xué)生的時(shí)候其姓名、性別、學(xué)號(hào)等信息是必須要有的,如果填寫不完整將會(huì)提示信息不完整。 //增加學(xué)生 bt_addUpdate.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String sname=text_sname.getText(); String sno=text_sno.getText(); String sex=text_sex.getText(); String birthday=text_birthday.getText(); String studytime=text_studytime.getText(); String phone=text_phone.getText(); String address=text_address.getText();//電話和家庭住址可以為空 String classno=text_classno.getText(); if("".equals(sname)||"".equals(sno)||"".equals(sex)||"".equals(birthday)||"".equals(studytime)||"".equals(classno)) { new MyDialog("學(xué)生信息不完整!"); } else { Object params[]={sno}; AdmisterGUI.this.mf.getUm().sqlBuilde("select *from student where sno=?",params); try { ResultSet rs=AdmisterGUI.this.mf.getUm().getPs().executeQuery(); if(rs.next()) { if(sno.equals(rs.getString(1))) { new MyDialog("學(xué)生存在,插入失。"); } } else//沒有當(dāng)前學(xué)生 { synchronized(LoginFrame.class){ Object params2[]={sno,sname,sex,birthday,studytime,phone,address,classno}; AdmisterGUI.this.mf.getUm().sqlBuilde("insert into student (sno,sname,sex,birthday,studytime,phone,address,classno)values(?,?,?,?,?,?,?,?)",params2); try { AdmisterGUI.this.mf.getUm().getPs().execute(); //以學(xué)生的學(xué)號(hào)作為用戶名 權(quán)限為3 更新user表 Object params5[]={sno,3}; AdmisterGUI.this.mf.getUm().sqlBuilde("insert into user(uname,uright,upwd)values(?,?,'111')",params5); AdmisterGUI.this.mf.getUm().getPs().execute(); new MyDialog("增加成功"); } catch (Exception e1) { new MyDialog("增加失敗"); e1.printStackTrace(); } } } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }); 七、測(cè)試和運(yùn)行 1、登錄時(shí)用戶名或密碼錯(cuò)誤會(huì)出現(xiàn)提示。 2、查詢課程時(shí)若未找到相應(yīng)課程會(huì)有提示。 - 重復(fù)選課時(shí)會(huì)有相應(yīng)提示。
4、注銷課程時(shí)會(huì)有相應(yīng)提示。 5、沒有獎(jiǎng)懲信息時(shí)會(huì)有提示。 6、舊密碼輸入錯(cuò)誤時(shí)會(huì)有提示。 7、教師錄入成績(jī)時(shí)會(huì)有相應(yīng)提示。
8、因?yàn)閷W(xué)生除了家庭住址和聯(lián)系方式其余的信息是在校學(xué)生必須要有的,所以當(dāng)管理員添加、修改學(xué)生信息時(shí)輸入的不完整會(huì)有相應(yīng)提示。 9、因?yàn)榻處煶穗娫挘溆嗟男畔⑹侨胄H谓痰臅r(shí)候必須要有的,所以當(dāng)管理員添加、修改教師信息時(shí)輸入的不完整會(huì)有相應(yīng)提示。 10、管理員添加課程信息不完整時(shí)會(huì)有相應(yīng)提示。 11、管理員添加院系信息不完整時(shí)會(huì)有相應(yīng)提示。 - 管理員添加獎(jiǎng)懲信息不完整時(shí)會(huì)有相應(yīng)提示。
13、查詢的學(xué)生沒有獎(jiǎng)懲信息時(shí)會(huì)有相應(yīng)提示。
八、經(jīng)驗(yàn)與收獲
首先說數(shù)據(jù)庫,簡(jiǎn)單的說就是建表格,然后把一張一張的表格和在一起,成為一大堆的數(shù)據(jù)集合。他是依照某種數(shù)據(jù)結(jié)構(gòu)組織起來并存放二級(jí)存儲(chǔ)器中的數(shù)據(jù)集合,基本分為三個(gè)層次,物理數(shù)據(jù)層,概念數(shù)據(jù)層和邏輯數(shù)據(jù)層。不同層次間的聯(lián)系是通過映射來轉(zhuǎn)換的。
完整的Word格式文檔51黑下載地址:
資料.doc
(1.52 MB, 下載次數(shù): 26)
2019-11-23 23:16 上傳
點(diǎn)擊文件名下載附件
|