成都东软信息技术职业学院期末项目报告项目名称:学生管理系统系别:计算机科学与技术系年级专业:xx级软件技术班级:x学号:xx学生姓名:xxxx年 xx 月 xx 日1.项目内容及知识应用1.1项目完成内容首先实现登录模块,分为教室登录和学生登录登录界面有一个下拉条分别为学生和教师,选中哪一个就会登录到相应的界面学生管理系统分为两大块:学生和教师两个模块学生登录后进入学生界面,学生界面有菜单项和按钮学生界面里面有查询自己的成绩,查询自己的详细信息,还可以修改密码,修改自己的信息,菜单项还有帮助等按钮教师界面里面可以增加学生,显示所有学生的成绩,查找学生,查询学生的详细信息,删除学生的成绩和删除学生,还有刷新和退出等功能教室界面当点击选中学生时在上面的标签面板会显示学生的详细信息,当查询学生的详细信息时会之间进入该学生的学生面板,教师就可以对学生的信息进行修改刚登录教师界面时系统启用了另外一个线程,会默认加载所有的学生成绩和信息,当教师点击“显示所有成绩”时就会马上把学生成绩的面板显示在界面上,所有教师就无需等待系统加载教师界面当老师点击刷新时,会再启动一个线程来重新把学生的信息加载到内存然后显示到界面上教师界面的成绩表中还有总分和平均分,系统加载的时候会自动计算每一个学生的总分和平均分教师还可以直接在成绩表中修改学生的成绩,用以来会很方便,修改成绩后要点击刷新按钮来刷新总分和平均分教室界面还增加了班级的分类,可以查看所有的班级,也可以查看一个班级的学生信息学生管理系统还增加了上传照片的功能,每个学生都可以上传自己的照片,老师也可以帮学生上传照片1.2知识(点)应用以及经验总结该学生管理系统采用了分层的思想而且参考了MVC设计模式,但是都做得不够完美。
该系统分为业务逻辑层、实体层和显示层:⏹业务逻辑层(niit.student.manage)有StudentManage、GradeManage、PasswordNotFountException、StduentNotFountException和GradeNotFountException。
先写了一个工具类(DBConnection),负责与数据库的连接,业务逻辑层联系数据库实体、显示层。
进行综合的控制与处理。
这里自定义了几个异常类,主要是抛出无法找到相应类的异常。
这样就可以返回多个结果。
⏹实体层(niit.student)有两个类Student和Grade,是根据数据库里面的表来实现的,字段就是实体里面的属性还有所有属性的get和set方法,也可以写几个构造方法,没有其他的方法。
业务逻辑层就操作这两个类。
⏹显示层(niit.student.view)有Login、StduentGrade、Teacher、ImagePanel、ShowImage、Uploading这六个类。
主要是负责显示给客户,用于和客户交互信息。
所有学生成绩用一个表来显示,Teacher类有另外一个线程来读取所有学生的成绩,在表中教师可以直接在表中修改学生的成绩,修改过后系统会自动修改数据库的数据,来实现动态修改。
⏹显示层主要是添加的内部匿名监听,由于会有重复监听所以大部分监听都分别写了一个方法,来调用这个方法。
⏹每个学生都可以上传自己的照片,在有照片的情况下,老师可以看到学生的照片这样可以让老师更快的认识每一个学生,点击学生的照片可以放大该学生的照片,点击别的地方该放大的照片就会消失该系统主要用到的知识有:⏹流程控制⏹类和对象⏹类的继承⏹接口和多态⏹数组⏹顺序表⏹数据库编程⏹常用的GUI组件⏹JTable⏹多线程⏹事件处理2.项目实现及关键代码(各个功能界面截图+代码说明,代码为关键代码并加入注释)系统流程图niit.student..Stduent类说明:此类是一个学生的模型类,提供了学生的属性和get、set方法,便于StudentManage 来操作还提供了几个构造方法。
niit.student.Grade类说明:此类是成绩模型类,提供了成绩的属性和get、set方法和几个构造方法,便于GradeManage来操作。
niit.student.util.DBConnection类说明:这个类的功能是与底层数据库创建连接给逻辑处理层,还有关闭连接的相关功能。
//管理与数据库的连接public class DBConnection {static {try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConn() throws SQLException { Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName = studentManage","sa", "580000");return conn;}//数据库关闭的方法public static void closePstmt(PreparedStatement pstmt) { if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}}public static ResultSet executeQuery(PreparedStatement pstmt) throws SQLException {ResultSet rs = pstmt.executeQuery();return rs;}public static void closeRs(ResultSet rs) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}}}niit.student.manage.StudentManage类说明:此类是逻辑处理层里面的学生管理类,有添加学生、删除学生、修改学生信息、检查学生是否登录成功、查找学生等方法,显示层可以直接调用这些方法来实现需要的功能。
其中查找方法是有方法的组合。
public class StudentManage {// 添加学生public static boolean add(Student s) {Connection conn = null;PreparedStatement pstmt = null;boolean flag = false;try {conn = DBConnection.getConn();String sql = "insert into student(studentID, studentName, password, sex, birth, phone, qq, homeAddr, entranceTime)values(?, ?, ?, ?, ?, ?, ?, ?, ?)";pstmt = DBConnection.getPstmt(conn, sql);pstmt.setString(1, s.getStudentID());pstmt.setString(2, s.getStudentName());pstmt.setString(3, s.getPassword());pstmt.setString(4, s.getSex());pstmt.setDate(5, s.getBirth());pstmt.setString(6, s.getPhone());pstmt.setString(7, s.getQq());pstmt.setString(8, s.getHomeAddr());pstmt.setDate(9, s.getEntranceTime());if (pstmt.executeUpdate() > 0) {flag = true;}} catch (SQLException e) {e.printStackTrace();} finally {DBConnection.closePstmt(pstmt);DBConnection.closeConn(conn);}return flag;}// 修改学生信息public static boolean update(Student s) {Connection conn = null;PreparedStatement pstmt = null;boolean flag = false;try {conn = DBConnection.getConn();String sql = "update student set studentName = ?, password = ?, sex = ?, birth = ?, phone = ?, qq = ?, homeAddr = ?, entranceTime = ? where studentID = ?";pstmt = DBConnection.getPstmt(conn, sql);pstmt.setString(1, s.getStudentName());pstmt.setString(2, s.getPassword());pstmt.setString(3, s.getSex());pstmt.setDate(4, s.getBirth());pstmt.setString(5, s.getPhone());pstmt.setString(6, s.getQq());pstmt.setString(7, s.getHomeAddr());pstmt.setDate(8, s.getEntranceTime());pstmt.setString(9, s.getStudentID());if (pstmt.executeUpdate() > 0) {flag = true;}} catch (SQLException e) {e.printStackTrace();} finally {DBConnection.closePstmt(pstmt);DBConnection.closeConn(conn);}return flag;}// 检查学生登录是否成功public static Student check(String studentID, String password) throws StudentNotFoundException, PasswordNotCorrectException {Student student = null;Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = DBConnection.getConn();String sql = "select * from student where studentID = ?";pstmt = DBConnection.getPstmt(conn, sql);pstmt.setString(1, studentID);rs = DBConnection.executeQuery(pstmt);if (!rs.next()) {throw new StudentNotFoundException();} else if(!rs.getString("password").trim().equals(password)) {// System.out.println(rs.getString("password"));// System.out.println(password);throw new PasswordNotCorrectException();} else {student = new Student(rs.getString(1), rs.getString(2),rs.getString(3), rs.getString(4), rs.getDate(5),rs.getString(6), rs.getString(7),rs.getString(8),rs.getDate(9));}} catch (SQLException e) {e.printStackTrace();} finally {DBConnection.closeRs(rs);DBConnection.closePstmt(pstmt);DBConnection.closeConn(conn);}return student;}niit.student.manage.GradeManage类说明:此类是逻辑处理层里面的成绩管理类,有添加成绩、删除成绩、修改成绩、查找成绩等方法,显示层可以直接调用这些方法来实现需要的功能。