標(biāo)題: 數(shù)據(jù)庫學(xué)生管理系統(tǒng)設(shè)計(jì)文檔 [打印本頁]
作者: zxj230504 時(shí)間: 2019-11-19 11:22
標(biāo)題: 數(shù)據(jù)庫學(xué)生管理系統(tǒng)設(shè)計(jì)文檔
數(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è)、班級、教師、課程、學(xué)生、獎懲七個(gè)實(shí)體集和院系—專業(yè)、專業(yè)—班級、班級—學(xué)生、獎懲—學(xué)生、選課、教師—課程七個(gè)聯(lián)系集。
3.2 數(shù)據(jù)字典
院系表(department)
專業(yè)表

班級表(class)
教師表(teacher)
學(xué)生表(student)
用戶表(user)
課程表(course)
從數(shù)據(jù)字典中抽取出來的聯(lián)系的描述:
選課表(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)
四,數(shù)據(jù)庫物理設(shè)計(jì)建表應(yīng)用Navicat premium數(shù)據(jù)庫管理工具直接進(jìn)行表操作。
五,登錄界面
用戶在登錄界面輸入用戶名和密碼以及驗(yàn)證碼,經(jīng)過系統(tǒng)驗(yàn)證后,通過賬戶自動判斷權(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)錄入、查看成績

5.3 管理員用戶操作界面
(1)學(xué)生管理:查詢、添加、修改、刪除學(xué)生信息。

(2)教師管理:查詢、添加、修改、刪除教師信息。

(3)課程管理:查詢、添加、修改、刪除課程信息。

(4)獎懲信息管理:查詢、添加、修改、刪除獎懲信息。

(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("課程號"+cno+"選課重復(fù),失敗");
}
}
} catch (SQLException e2) {
new MyDialog("選課失敗");
e2.printStackTrace();
}
}
}
}
}
}
}
});
學(xué)生注銷選課
與學(xué)生選課的事務(wù)類似,不過對數(shù)據(jù)庫的操作變?yōu)樵谶x課表中刪除選課記錄。
("delete from scourse where sno=? and cno=? and ctno=? and term=?",params2)
教師打分
//修改成績 并在選課表里更新相應(yīng)課程的成績信息 然后更新數(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í)候就需要多次對數(shù)據(jù)庫進(jìn)行操作,同時(shí)因?yàn)閷W(xué)生的基本信息是應(yīng)該一入學(xué)就確定了不能輕易改變的,因而在增加學(xué)生的時(shí)候其姓名、性別、學(xué)號等信息是必須要有的,如果填寫不完整將會提示信息不完整。
//增加學(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é)號作為用戶名 權(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();
}
}
}
});
七、測試和運(yùn)行
1、登錄時(shí)用戶名或密碼錯(cuò)誤會出現(xiàn)提示。
2、查詢課程時(shí)若未找到相應(yīng)課程會有提示。
- 重復(fù)選課時(shí)會有相應(yīng)提示。
4、注銷課程時(shí)會有相應(yīng)提示。
5、沒有獎懲信息時(shí)會有提示。
6、舊密碼輸入錯(cuò)誤時(shí)會有提示。
7、教師錄入成績時(shí)會有相應(yīng)提示。
8、因?yàn)閷W(xué)生除了家庭住址和聯(lián)系方式其余的信息是在校學(xué)生必須要有的,所以當(dāng)管理員添加、修改學(xué)生信息時(shí)輸入的不完整會有相應(yīng)提示。
9、因?yàn)榻處煶穗娫,其余的信息是入校任教的時(shí)候必須要有的,所以當(dāng)管理員添加、修改教師信息時(shí)輸入的不完整會有相應(yīng)提示。
10、管理員添加課程信息不完整時(shí)會有相應(yīng)提示。
11、管理員添加院系信息不完整時(shí)會有相應(yīng)提示。
- 管理員添加獎懲信息不完整時(shí)會有相應(yīng)提示。
13、查詢的學(xué)生沒有獎懲信息時(shí)會有相應(yīng)提示。
八、經(jīng)驗(yàn)與收獲
首先說數(shù)據(jù)庫,簡單的說就是建表格,然后把一張一張的表格和在一起,成為一大堆的數(shù)據(jù)集合。他是依照某種數(shù)據(jù)結(jié)構(gòu)組織起來并存放二級存儲器中的數(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)擊文件名下載附件
下載積分: 黑幣 -5
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |