數據庫系統的內部構成元素與外部其他系統之間的信息關系如下圖所示: 二,需求分析此學生管理信息系統的主要功能如下圖所示: 三,數據庫邏輯設計3.1 ER圖:本系統的ER圖如下: 
該ER圖包括院系、專業、班級、教師、課程、學生、獎懲七個實體集和院系—專業、專業—班級、班級—學生、獎懲—學生、選課、教師—課程七個聯系集。
3.2 數據字典 院系表(department) 專業表 
班級表(class) 教師表(teacher) 學生表(student) 用戶表(user) 課程表(course) 從數據字典中抽取出來的聯系的描述: 選課表(scourse) 獎懲表(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) 四,數據庫物理設計建表應用Navicat premium數據庫管理工具直接進行表操作。
五,登錄界面 用戶在登錄界面輸入用戶名和密碼以及驗證碼,經過系統驗證后,通過賬戶自動判斷權限,可以進入相應角色的操作界面。 
5.1 學生用戶操作界面 學生可以修改自己的聯系方式和家庭住址,其余信息需要管理員修改。 



5.2 教師用戶操作界面 (1)修改個人信息。 
(2)查詢所授課程的信息。 
(3)查看所授課程的學生選課情況。 
(4)錄入、查看成績 
5.3 管理員用戶操作界面 (1)學生管理:查詢、添加、修改、刪除學生信息。 
(2)教師管理:查詢、添加、修改、刪除教師信息。 
(3)課程管理:查詢、添加、修改、刪除課程信息。 
(4)獎懲信息管理:查詢、添加、修改、刪除獎懲信息。 
(5)學院管理:添加、修改、刪除學院信息。 
六,學生選課 選擇課程 并在課程表里更新相應課程的學生信息,將選取的課程存到List<Course>中 然后更新數據庫。 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("課程數超出!");} else{ //更新數據庫 for(Course course:list_choose){ String sno=student.getSno(); String cno=course.getCno(); String ctno=course.getCtno(); String term=course.getTerm(); //先查詢 如果已經選過這個學期的課了就不能再選 //如果能選就加入選課信息表 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;} //已經選過這門課了 } 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("課程號"+cno+"選課重復,失敗"); } }
} catch (SQLException e2) { new MyDialog("選課失敗"); e2.printStackTrace(); } } } } } } } }); 學生注銷選課 與學生選課的事務類似,不過對數據庫的操作變為在選課表中刪除選課記錄。 ("delete from scourse where sno=? and cno=? and ctno=? and term=?",params2) 教師打分 //修改成績 并在選課表里更新相應課程的成績信息 然后更新數據庫 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("更新成功"); } });
管理員增加學生信息
因為增加學生時候不僅需要更新學生表,同需要更新用戶表,所以在進行操作的時候就需要多次對數據庫進行操作,同時因為學生的基本信息是應該一入學就確定了不能輕易改變的,因而在增加學生的時候其姓名、性別、學號等信息是必須要有的,如果填寫不完整將會提示信息不完整。 //增加學生 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("學生信息不完整!"); } 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("學生存在,插入失敗!"); } } else//沒有當前學生 { 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(); //以學生的學號作為用戶名 權限為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(); } } } }); 七、測試和運行 1、登錄時用戶名或密碼錯誤會出現提示。 2、查詢課程時若未找到相應課程會有提示。 4、注銷課程時會有相應提示。 5、沒有獎懲信息時會有提示。 6、舊密碼輸入錯誤時會有提示。 7、教師錄入成績時會有相應提示。
8、因為學生除了家庭住址和聯系方式其余的信息是在校學生必須要有的,所以當管理員添加、修改學生信息時輸入的不完整會有相應提示。 9、因為教師除了電話,其余的信息是入校任教的時候必須要有的,所以當管理員添加、修改教師信息時輸入的不完整會有相應提示。 10、管理員添加課程信息不完整時會有相應提示。 11、管理員添加院系信息不完整時會有相應提示。 13、查詢的學生沒有獎懲信息時會有相應提示。
八、經驗與收獲
首先說數據庫,簡單的說就是建表格,然后把一張一張的表格和在一起,成為一大堆的數據集合。他是依照某種數據結構組織起來并存放二級存儲器中的數據集合,基本分為三個層次,物理數據層,概念數據層和邏輯數據層。不同層次間的聯系是通過映射來轉換的。
完整的Word格式文檔51黑下載地址:
資料.doc
(1.52 MB, 下載次數: 26)
2019-11-23 23:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|