整个系统的使用简单易懂,系统采用GUI布局使得界面拥有比较友好的交互,同时采用MVC设计模式将应用的输入、处理、输出流程按照Model、View、Controller的方式进行几次分离,即,将一个应用分成模型层、视图层、控制层这三个层,确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换,最重要是的低耦合,将视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。并且整个系统的运行配置要求也很低,基本运行环境要求:
1.数据库 MySQL 5.4
2.开发工具 Eclipse
3.GUI辅助开发工具 windowbuilder
该学生信息管理系统涉及到学生、教师、系统管理员、班级、学生信息、老师信息。设置一个系统管理员对系统进行管理。所有用户需输入账号、密码登录进入系统;管理员进入系统后可对学生、老师、班级、进行增删改查操作,同时管理员还可以修改密码、添加用户;学生进入系统,可以查看自己的信息和修改密码;老师进入系统后,可以查看自己所带的班级信息、查看和添加学生的信息,查看自己的信息、以及修改密码;老师可以查看其他老师的信息(可以当成是老师的通讯录),查看学生的信息,学生可以查看班级的信息。
在这个高速发展的时代,人们的生活水平有了显著的提高,计算机已经涉及到各个领域。现在的大学越来越多,以后的大学生也就越来越多,同时学校的人数也会越来越多,为了帮助学校加强对班级和学生的管理,以此为动机开发一套学生信息管理系统,以便于帮助学校的教师和管理人员更高效的对学生信息的管理,同时该管理系统的后台管理就体现对学生信息的录入工作,实现了学生信息的可查询化,对学生信息实时变更的可操作化。
根据学生信息管理系统的需求一共分为三个模块,分别是管理员模块、教师模块和学生模块。
1)管理员模块的功能主要是添加教师、添加班级、添加学生和修改密码,管理员用例图下图所示:
2) 教师模块的功能主要是添加班级,添加学生,修改自己的密码和查看信息,教师用例图下图所示:
3)学生模块的功能主要是查看自己的信息和修改密码,学生用例图下图所示:
本次设计的学生信息管理系统包含了管理员模块、教师模块以及学生模块,然后根据管理员模块、教师模块以及学生模块这三个模块的功能分析,主要由以下几个功能:
管理员模块包含:添加用户功能、添加班级功能、添加学生功能、修改密码功能、添加用户功能。
教师模块包含:添加学生功能、查看信息功能、添加班级功能、修改密码。
学生模块包含:查看信息功能、修改密码。
在学生信息管理系统的数据库设计中,包含了管理员、教师、学生、班级四个实体,每个实体都有自己的的属性,管理员实体的属性有:管理员编号、管理员姓名、登录密码,教师实体的属性有:教师编号,教师姓名,登录密码,性别,班级,学生实体的属性有:学生编号,学生姓名,登录密码,性别,所在班级。而各个实体之间有一定的关系,具体的描述由下方E-R图表现:
学生信息管理系统一共包含四张表,它们分别是:管理员表、教师表、学生表、班级表,具体的数据库表设计如下描述:
1、管理员表(s_admin):用来存储管理员的信息。它包含的字段有:adminID、adminName、adminPassword。管理员实体图如下图所示:
管理员表具体设计如下表所示:
2、学生表(s_student):用来查看和存储学生的信息。它包含的字段有:ID、Name、 Password、sex、classId。学生实体图如下图所示:
学生表具体设计如下表所示:
3、教师表(s_teacher):用来查看信息以及添加学生。它包含的字段有:ID、Name、 Password、sex、classId。房间实体图如下图所示:
教师表具体设计如下表所示:
4、班级表(s_class):用来存储班级的信息。它包含的字段有:ID、Name、Info。班级实体图如下图所示:
班级表具体设计如下表所示:
输入用户名、密码以及用户类型,点击“登录”按钮,则跳转到LoginFrame类中的loginAct方法中,如果用户名、密码以及用户类型输入正确,即可正常登录同时会弹出“欢迎您登录”界面:
输入要登录的信息,点击登录按钮“loginButton ”会调用LoginFrame类中的loginAct方法,进一步调用AdminDao类中的login方法下的数据库,并根据Admin中的配置进行加载,然后将其登录的用户名、密码以及用户类型与数据库进行匹配,若数据库中不存在此信息则显示用户名或密码错误,然后返回登录界面重新登录。若在输入信息时输入错误可以点击重置按钮“resetButton”,清空输入的信息。若数据库中已经存才此用户名、密码以及用户类型,且登录时输出的信息都正确,则显示“欢迎登录”。即调用了管理员表(s_admin)中的adminID、adminName、adminPassword三个字段,与之登录的进行匹配。代码如下:
重置代码:
protected void restValue(ActionEvent ae) {
userNameTextField.setText("");
passwordTextField.setText("");
userTypeComboBox.setSelectedIndex(0);
}
}
登录代码:
String sql="select * from s_admin where name=? and password=?";
Admin adminRst=null;//登录现实对象
try{
PreparedStatement prat=con.prepareStatement(sql);//把sql语句传给数据库
prat.setString(1,admin.getName());
prat.setString(2,admin.getPassword());
ResultSet executeQuery = prat.executeQuery();
if(executeQuery.next()){
adminRst =new Admin();
adminRst.setId(executeQuery.getInt("id"));
adminRst.setName(executeQuery.getString("name"));
adminRst.setPassword(executeQuery.getString("password"));
adminRst.setCreateDate(executeQuery.getString("createDate"));
}
}
登陆成功后会从登录界面面跳转到主界面,在此界面点击系统设置下拉框的修改密码,输入旧密码以及要修改的新密码即可:
输入旧密码以及要修改的密码,点击确认按钮“submiButton ”会调用ChangePawordFrame类中的actionPerFormde方法,进一步调用数据库,如果旧密码输入错误,则回调用数据库中的配置,进行检验,若两次输入的密码不一致,则调用ChangePawordFrame类中的actionPerFormde方法,如密码修改成功则根据Admin中的配置进行加载,然后将其修改的密码写入数据库,若在输入信息时输入错误可以点击重置按钮“resetButton”,清空输入的信息。代码如下:
默认用户名代码:
if("系统管理员".equals(MainFrame.userType.getName())){
Admin admin=(Admin)MainFrame.userObject;
currentUserLabel.setText("【系统管理员】"+admin.getName());
}
重置代码:
protected void resetValue(ActionEvent ae) {
oldPasswordTextField.setText("");
newPasswordTextField.setText("");
confirmPasswordTextField.setText("");
}
修改密码代码:
protected void subjectCh(ActionEvent ae) {
String oldPassword=oldPasswordTextField.getText().toString();
String newPassword=newPasswordTextField.getText().toString();
String confirmPassword=confirmPasswordTextField.getText().toString();
if(StringUtil.isEmpty(oldPassword)){
JOptionPane.showMessageDialog(this, "请填写旧密码");
return;
}
if(StringUtil.isEmpty(newPassword)){
JOptionPane.showMessageDialog(this, "请填写新密码");
return;
}
if(StringUtil.isEmpty(confirmPassword)){
JOptionPane.showMessageDialog(this, "请确认新密码");
return;
}
if(!newPassword.equals(confirmPassword)){
JOptionPane.showMessageDialog(this, "两次密码输入不一致,请重新输入!");
return;
}
if("系统管理员".equals(MainFrame.userType.getName())){
AdminDao adminDao=new AdminDao();
Admin adminTmp=new Admin();
Admin admin=(Admin)MainFrame.userObject;
adminTmp.setName(admin.getName());
adminTmp.setPassword(oldPassword);
JOptionPane.showMessageDialog(this, adminDao.changePassword(adminTmp,newPassword));
return;
}
}
调用代码:
public String changePassword(Admin admin,String newPassword){
String sql="select * from s_admin where name=? and password=?";
PreparedStatement prat=null;
int id=0;
try{
prat=con.prepareStatement(sql); //把sql语句传给数据
prat.setString(1,admin.getName());
prat.setString(2,admin.getPassword());
ResultSet executeQuery = prat.executeQuery();
if(!executeQuery.next()){
String retString="旧密码错误!";
return retString;
}
id=executeQuery.getInt("id");
}catch(Exception e){
e.printStackTrace();
}
String retString="修改失败";
String sqlString="update s_admin set password= ? where id=? ";
try {
prat=con.prepareStatement(sqlString); //把sql语句传给数据库
prat.setString(1,newPassword);
prat.setInt(2, id);
int rst = prat.executeUpdate();
if(rst >0){
retString="密码修改成功!";
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return retString;
}
登陆成功后会从登录界面面跳转到主界面,在此界面点击学生管理下拉框的添加学生,输入要添加的学生即可:
在姓名后的文本框“studentTextField”输入要添加的学生姓名,在所属班级下拉框“studentClassComboBox”选择学生所在的班级,然后在登录密码(第一次登录系统默认的密码)“studentPasswordTextField”输入登录时的密码,然后点击学生性别“JRadioButton”,选择学生的性别,最后点击确认按钮“submiButton ”会调用studentDao类中的addStudent方法,进一步调用数据库,若添加成功会跳出“添加成功”界面,若添加失败则会跳出“添加失败”界面,最后把添加的学生信息写入数据库,若在输入信息时输入错误可以点击重置按钮“resetButton”,清空输入的信息。代码如下:
添加学生代码
protected void studentAddAct(ActionEvent ae) {
String studentName= studentNameTextField.getText().toString();
String studentPassword= studentPasswordTextField.getText().toString();
if(StringUtil.isEmpty(studentName)){
JOptionPane.showMessageDialog(this, "请填写学生的名字");
return;
}
if(StringUtil.isEmpty(studentPassword)){
JOptionPane.showMessageDialog(this, "请填写密码");
return;
}
Student sc=(Student) studentClassComboBox.getSelectedItem();
String sex=studentSexManRadioButton.isSelected() ? studentSexManRadioButton.getText() :(studentSexFemalRadioButton.isSelected() ? studentSexFemalRadioButton.getText():studentSexUnkownRadioButton.getText());
Student student = new Student();
student.setName(studentName);
student.setClassId(sc.getId());
student.setPassword(studentPassword);
student.setSex(sex);
StudentDao studentDao =new StudentDao();
if(studentDao.addStudent(student)){
JOptionPane.showMessageDialog(this, "添加成功");
}else{
JOptionPane.showMessageDialog(this, "添加失败");
}
resetValue(ae);
}
调用数据库代码:
public class StudentDao extends BaseDao {
public boolean addStudent(Student student){
String sql="insert into s_class values(null,?,?,?,?)";
try {
java.sql.PreparedStatement pre=con.prepareStatement(sql);
pre.setString(1, student.getName());
pre.setInt(2, student.getId());
pre.setString(3, student.getPassword());
pre.setString(4, student.getSex());
if(pre.executeUpdate() >0)
return true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
}
重置代码:
protected void resetValue(ActionEvent ae) {
// TODO Auto-generated method stub
studentNameTextField.setText("");
studentPasswordTextField.setText("");
}
登陆成功后会从登录界面面跳转到主界面,在此界面点击班级管理下拉框的添加班级,输入要添加的班级即可:
输入要添加班级的信息,点击登录按钮“submitButton ”会调用StudentClassStudent类中的submitClass()方法,进一步调用ClassDao类中的addClass方法下的数据库,并根据StudentClass中的配置进行加载,若添加成功会跳出“添加成功”界面,若添加失败则会跳出“添加失败”界面,然后将其班级名、班级信息写入数据库,若在输入信息时输入错误可以点击重置按钮“resetButton”,清空输入的信息。即调用了学生班级表(s_class)中的ID、Name、Info三个字段。代码如下:
添加班级代码:
public class ClassDao extends BaseDao {
public boolean addClass(StudentClass cl){
String sql="insert into s_class values(null,?,?)";
try {
java.sql.PreparedStatement pre=con.prepareStatement(sql);
pre.setString(1, cl.getName());
pre.setString(2, cl.getInfo());
if(pre.executeUpdate() >0)
return true;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
adminRst.setId(executeQuery.getInt("id"));
adminRst.setName(executeQuery.getString("name"));
adminRst.setPassword(executeQuery.getString("password"));
adminRst.setCreateDate(executeQuery.getString("createDate"));
}
}
弹出界面代码:
protected void submitClass(ActionEvent ae) {
// TODO Auto-generated method stub
String className=classNameTextField.getText().toString();
String classInfo=classInfoTextArea.getText().toString();
if(StringUtil.isEmpty(className)){
JOptionPane.showMessageDialog(this, "班级名称不能为空!");
return;
}
StudentClass sc=new StudentClass();
sc.setName(className);
sc.setInfo(classInfo);
ClassDao classDao=new ClassDao();
if(classDao.addClass(sc)){
JOptionPane.showMessageDialog(this, "班级添加成功!");
}else{
JOptionPane.showMessageDialog(this, "班级添加失败 !");
}
resetValue(ae);
}
重置代码:
protected void resetValue(ActionEvent ae) {
// TODO Auto-generated method stub
classNameTextField.setText("");
classInfoTextArea.setText("");
}
}
登陆成功后会从登录界面面跳转到主界面,在此界面点击班级管理下拉框的班级管理,输入要查询的班级即可:
输入要查询班级的信息,点击登录按钮“searchButton ”会调用ClassMangerStudent类中的actionPerformed()方法,进一步调用ClassDao类中的getClasList方法下的数据库,并即调用了学生班级表(s_class)中的ID、Name、Info三个字段。代码如下
查询班级代码:
protected void selectedTable(MouseEvent me) {
DefaultTableModel dft = (DefaultTableModel) classListTable.getModel();
editClassNameTextField.setText(dft.getValueAt(classListTable.getSelectedRow(), 1).toString());
editClassInfoTextArea.setText(dft.getValueAt(classListTable.getSelectedRow(), 2).toString());
}
private void setTable(StudentClass studentClass){
DefaultTableModel dft=(DefaultTableModel) classListTable.getModel();
dft.setRowCount(0);
ClassDao classDao=new ClassDao();
List<StudentClass> classList = classDao.getClassList(new StudentClass());
for( StudentClass sc:classList){
Vector v = new Vector();
v.add(sc.getId());
v.add(sc.getName());
v.add(sc.getInfo());
dft.addRow(v);
}
}
调用数据库代码:
public List<StudentClass> getClassList(StudentClass studentClass){
List<StudentClass> re=new ArrayList<StudentClass>();
String sqlString="select * from s_class";
if(!StringUtil.isEmpty(studentClass.getName())){
sqlString += "where name like '%"+studentClass.getName()+"%'";
}
try {
PreparedStatement pre= con.prepareStatement(sqlString);
ResultSet executeQuery = pre.executeQuery();
while(executeQuery.next()){
StudentClass sc=new StudentClass();
sc.setId(executeQuery.getInt("id"));
sc.setName(executeQuery.getString("name"));
sc.setInfo(executeQuery.getString("info"));
re.add(sc);
}
} catch (SQLException e) {
e.printStackTrace();
}
return re;
}
登陆成功后会从登录界面面跳转到主界面,在此界面点击班级管理下拉框的班级管理,输入要删除或者修改信息的班级即可:
输入要更改班级的信息,点击确认修改按钮“sudmitEditButton ”会调用ClassMangerStudent类中的subminEidAct()方法,进一步调用ClassDao类中的update方法下的数据库,并根据StudentClass中的配置进行加载,如更新成功则会弹出“更新成功”界面若更新失败,则会弹出“更新失败”界面。若想删除某个班级,输入要上班的班级,点击删除按钮“submitDeleteButton”会调用ClassMangerStudent类中的deleteClassAct()方法,进一步调用ClassDao类中的delete()方法下的数据库,并根据StudentClass中的配置进行加载,然后弹出“你是确定删除”界面,并即调用了学生班级表(s_class)中的ID、Name、Info三个字段。代码如下
修改班级代码:
protected void submitEidAct(ActionEvent ae) {
ClassDao classDao=new ClassDao();
int index = classListTable.getSelectedRow();
if(index == -1){
JOptionPane.showMessageDialog(this, "请选中要修改的数据&&");
return;
}
DefaultTableModel dft = (DefaultTableModel) classListTable.getModel();
String className=dft.getValueAt(classListTable.getSelectedRow(), 1).toString();
String classInfo=dft.getValueAt(classListTable.getSelectedRow(), 2).toString();
String editClassName=editClassNameTextField.getText().toString();
String editClassInfo = editClassInfoTextArea.getText().toString();
if(StringUtil.isEmpty(editClassName)){
JOptionPane.showMessageDialog(this, "请填写修改的名称");
return;
}
if(className.equals(editClassName) && classInfo.equals(editClassInfo)){
JOptionPane.showMessageDialog(this, "您还没有做任何修改");
return;
}
int id =Integer.parseInt(dft.getValueAt(classListTable.getSelectedRow(), 0).toString());
StudentClass sc=new StudentClass();
sc.setId(id);
sc.setName(editClassName);
sc.setInfo(editClassInfo);
if(classDao.update(sc)){
JOptionPane.showMessageDialog(this, "更新成功!");
}else{
JOptionPane.showMessageDialog(this, "更新失败");
}
setTable(new StudentClass());
}
修改班级调用数据库代码:
public boolean update(StudentClass sc){
String sql="update s_class set name=? , info=? where id=? ";
try{
PreparedStatement pre= con.prepareStatement(sql); pre.setString(1,sc.getName());
pre.setString(1, sc.getInfo());
pre.setInt(3, sc.getId());
if(pre.executeUpdate() > 0){
return true;
}
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
删除班级代码:
protected void deleteClassAct(ActionEvent ae) {
if(JOptionPane.showConfirmDialog(this, "您确定删除吗?") != JOptionPane.OK_CANCEL_OPTION){
return;
}
int index = classListTable.getSelectedRow();
if(index == -1){
JOptionPane.showMessageDialog(this, "请选中要删除的数据&&");
return;
}
DefaultTableModel dft = (DefaultTableModel) classListTable.getModel();
int id =Integer.parseInt(dft.getValueAt(classListTable.getSelectedRow(), 0).toString());
ClassDao classDao=new ClassDao();
if(classDao.delete(id)){
JOptionPane.showMessageDialog(this, "删除成功!");
}else{
JOptionPane.showMessageDialog(this, "删除失败");
}
setTable(new StudentClass());
}
删除班级调用数据库代码:
public boolean delete(int id){
String sql="delete from s_class where id=? ";
try {
PreparedStatement pre= con.prepareStatement(sql);
pre.setInt(1,id);
if(pre.executeUpdate() > 0){
return true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
以上代码均为核心代码
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程,通过本次课程设计,我感受颇多,尽管上课时也认真听了老师的讲课,但是刚开始面对自己的所选的题目时,还是有些不知所措,后来查看了自己以前学习的笔记新的,然后去博客查了些相关的只是,心里在感觉有了一些底。经过这差不多快一周来的学习与写代码,总算还是收获不少,对Act和数据库的认识也更加的深刻了。
这次课程设计让我学习到很多东西,大多数都是课本上没有接触到的知识,我运用到的框架虽然是简单的框架,但是也是我一步步去查实,一步步去写的。在这个过程中除了查阅书籍,也很感谢同学们对我的帮助,在我遇到困难同学帮助了我,在我思维混乱的时候是同学给我建议。在以后的学习生活中我会继续将这段时间学到的知识运用下去。同时也在老师的身上我学得到很多实用的知识,在次我表示感谢!
这只是一个简单的信息管理系统,还可以在此基础上添加其他功能,也可以为今后学习java Web提供一些基础