数据库系统的内部构成元素与外部其他系统之间的信息关系如下图所示: 二,需求分析此学生管理信息系统的主要功能如下图所示: 三,数据库逻辑设计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)
|