Java学籍管理系统 - 课程设计报告
项目概述
1 项目背景与意义
随着高校招生规模的不断扩大和学生数量的急剧增加,传统的手工管理学籍信息的方式已无法满足现代教育管理的需求,手工管理存在效率低下、容易出错、信息查询困难、数据安全性差等诸多问题,开发一个功能完善、操作便捷、安全可靠的学籍管理系统具有重要的现实意义,本系统旨在利用Java技术,实现对学籍信息的电子化管理,提高工作效率,确保数据的准确性和安全性。

2 项目目标
本系统旨在实现一个基于C/S(客户端/服务器)架构的学籍管理系统,主要目标如下:
- 信息录入与修改:能够方便地录入、修改和删除学生基本信息和成绩信息。
- 信息查询与统计:支持按多种条件(如学号、姓名、班级等)进行精确或模糊查询,并能对成绩进行简单的统计分析。
- 数据持久化:将学生信息持久化存储在数据库中,确保数据不丢失。
- 用户友好界面:提供直观、易用的图形用户界面,降低操作难度。
- 系统安全:设置登录权限,防止未授权用户访问和修改数据。
3 开发环境
- 操作系统: Windows 10 / 11
- 编程语言: Java SE 8+
- 开发工具: IntelliJ IDEA / Eclipse
- 数据库: MySQL 5.7+ / 8.0+
- 数据库连接技术: JDBC (Java Database Connectivity)
- GUI技术: Swing (Java Foundation Classes)
系统分析
1 功能需求分析
通过对学籍管理流程的分析,系统应具备以下核心功能模块:
-
登录模块
- 用户(管理员、教师)通过用户名和密码登录系统。
- 对密码进行简单的加密处理(如MD5),增强安全性。
- 登录成功后,根据用户角色显示不同的操作界面。
-
学生信息管理模块
(图片来源网络,侵删)- 添加学生:输入学号、姓名、性别、出生日期、班级、专业、联系电话等信息,保存到数据库。
- 修改学生信息:根据学号查询学生,并修改其除学号外的任意信息。
- 删除学生:根据学号删除学生记录(通常为逻辑删除,即设置一个“是否有效”字段)。
- 查询学生:
- 精确查询:按学号、姓名精确查询。
- 模糊查询:按姓名、班级、专业等关键字进行模糊查询。
- 显示所有学生:以表格形式展示所有学生的信息。
-
成绩管理模块
- 录入成绩:为学生录入指定课程的成绩(需要先选择学生和课程)。
- 修改成绩:根据学号和课程修改成绩。
- 查询成绩:按学号、课程名查询学生成绩。
- 统计与分析:计算单个学生的平均分、总学分;计算课程的平均分、最高分、最低分等。
-
课程管理模块
- 添加课程:录入课程编号、课程名称、学分等信息。
- 修改/删除课程:对已有课程信息进行维护。
-
退出系统
安全退出程序,关闭数据库连接。
(图片来源网络,侵删)
2 非功能需求分析
- 性能:系统响应时间应在用户可接受的范围内(如查询响应时间小于2秒)。
- 易用性:界面布局清晰,操作流程符合用户习惯,提供必要的提示信息。
- 可靠性:系统运行稳定,不易崩溃,具备一定的错误处理能力。
- 安全性:用户密码加密存储,不同权限用户操作范围不同。
系统设计
1 系统架构设计
本系统采用经典的 MVC (Model-View-Controller) 设计模式,以实现代码的分层解耦,提高可维护性和可扩展性。
-
Model (模型层):
- 负责业务逻辑和数据处理。
- 包括与数据库交互的DAO (Data Access Object) 类,如
StudentDAO,CourseDAO,ScoreDAO。 - 封装数据的实体类,如
Student,Course,Score。
-
View (视图层):
- 负责用户界面的显示。
- 使用Java Swing技术创建所有窗口和控件,如
LoginFrame,MainFrame,StudentPanel等。
-
Controller (控制器层):
- 负责接收用户输入(View层的事件),调用Model层处理业务逻辑,并更新View层。
- 通常在事件监听器(ActionListener)中实现,连接View和Model。
2 数据库设计
使用MySQL数据库存储数据,设计如下数据表:
-
用户表 (t_user) | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | |
id|INT|PK, AUTO_INCREMENT| 用户ID | |username|VARCHAR(20)|UNIQUE, NOT NULL| 用户名 | |password|VARCHAR(32)|NOT NULL| MD5加密后的密码 | |role|VARCHAR(10)|NOT NULL| 角色 (admin/teacher) | -
学生表 (t_student) | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | |
student_id|VARCHAR(20)|PK, NOT NULL| 学号 | |name|VARCHAR(50)|NOT NULL| 姓名 | |gender|CHAR(1)| | 性别 ('M'/'F') | |birth_date|DATE| | 出生日期 | |class_name|VARCHAR(50)| | 班级 | |major|VARCHAR(50)| | 专业 | |phone|VARCHAR(20)| | 联系电话 | |is_valid|TINYINT(1)|DEFAULT 1| 是否有效 (1-有效, 0-无效) | -
课程表 (t_course) | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | |
course_id|VARCHAR(20)|PK, NOT NULL| 课程编号 | |course_name|VARCHAR(100)|NOT NULL| 课程名称 | |credit|FLOAT| | 学分 | -
成绩表 (t_score) | 字段名 | 类型 | 约束 | 描述 | | :--- | :--- | :--- | :--- | |
id|INT|PK, AUTO_INCREMENT| 成绩ID | |student_id|VARCHAR(20)|FK (t_student)| 学号 | |course_id|VARCHAR(20)|FK (t_course)| 课程编号 | |score|FLOAT| | 分数 (0-100) | |semester|VARCHAR(20)| | 学期 |
关系说明:
- 一个学生可以有多门课程的成绩,一对多关系。
- 一门课程可以被多个学生选修,一对多关系。
- 成绩表是学生表和课程表之间的关联表。
3 数据库连接池
为了提高数据库访问效率,避免频繁创建和销毁连接,可以使用 Druid 或 C3P0 等数据库连接池技术,这里以Druid为例。
核心代码实现示例
1 项目结构
StudentManagementSystem/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── controller/ // 控制器
│ │ │ │ └── LoginController.java
│ │ │ ├── dao/ // 数据访问对象
│ │ │ │ ├── StudentDAO.java
│ │ │ │ ├── CourseDAO.java
│ │ │ │ └── ScoreDAO.java
│ │ │ ├── entity/ // 实体类
│ │ │ │ ├── Student.java
│ │ │ │ ├── Course.java
│ │ │ │ └── Score.java
│ │ │ ├── util/ // 工具类
│ │ │ │ ├── DBUtil.java // 数据库连接工具
│ │ │ │ └── MD5Util.java // MD5加密工具
│ │ │ └── view/ // 视图层
│ │ │ ├── LoginFrame.java
│ │ │ ├── MainFrame.java
│ │ │ └── StudentPanel.java
│ │ └── resources/
│ │ └── db.properties // 数据库配置文件
└── pom.xml // Maven项目文件 (如果使用Maven)
2 实体类示例 (Student.java)
// src/main/java/entity/Student.java
package entity;
import java.util.Date;
public class Student {
private String studentId;
private String name;
private String gender;
private Date birthDate;
private String className;
private String major;
private String phone;
private boolean isValid;
// 构造方法、Getter和Setter
public Student() {}
public Student(String studentId, String name) {
this.studentId = studentId;
this.name = name;
}
// 省略其他getter和setter...
@Override
public String toString() {
return "Student{" +
"studentId='" + studentId + '\'' +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", className='" + className + '\'' +
'}';
}
}
3 数据库工具类 (DBUtil.java)
// src/main/java/util/DBUtil.java
package util;
import com.alibaba.druid.pool.DruidDataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DBUtil {
private static DruidDataSource dataSource;
static {
try {
Properties props = new Properties();
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
props.load(is);
dataSource = new DruidDataSource();
dataSource.setDriverClassName(props.getProperty("jdbc.driver"));
dataSource.setUrl(props.getProperty("jdbc.url"));
dataSource.setUsername(props.getProperty("jdbc.user"));
dataSource.setPassword(props.getProperty("jdbc.password"));
dataSource.setInitialSize(Integer.parseInt(props.getProperty("db.initialSize")));
dataSource.setMaxActive(Integer.parseInt(props.getProperty("db.maxActive")));
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
public static void closeAll(Connection conn, Statement stmt, ResultSet rs) {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
4 DAO层示例 (StudentDAO.java)
// src/main/java/dao/StudentDAO.java
package dao;
import entity.Student;
import util.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class StudentDAO {
// 添加学生
public boolean addStudent(Student student) {
String sql = "INSERT INTO t_student (student_id, name, gender, birth_date, class_name, major, phone) VALUES (?, ?, ?, ?, ?, ?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBUtil.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, student.getStudentId());
pstmt.setString(2, student.getName());
pstmt.setString(3, student.getGender());
pstmt.setDate(4, new java.sql.Date(student.getBirthDate().getTime()));
pstmt.setString(5, student.getClassName());
pstmt.setString(6, student.getMajor());
pstmt.setString(7, student.getPhone());
return pstmt.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
DBUtil.closeAll(conn, pstmt, null);
}
}
// 查询所有学生
public List<Student> findAllStudents() {
List<Student> students = new ArrayList<>();
String sql = "SELECT student_id, name, gender, birth_date, class_name, major, phone FROM t_student WHERE is_valid = 1";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
Student student = new Student();
student.setStudentId(rs.getString("student_id"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setBirthDate(rs.getDate("birth_date"));
student.setClassName(rs.getString("class_name"));
student.setMajor(rs.getString("major"));
student.setPhone(rs.getString("phone"));
students.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.closeAll(conn, stmt, rs);
}
return students;
}
// 其他方法:根据ID查询、修改、删除...
}
5 视图层示例 (LoginFrame.java)
// src/main/java/view/LoginFrame.java
package view;
import controller.LoginController;
entity.User;
import util.MD5Util;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoginFrame extends JFrame {
private JTextField usernameField;
private JPasswordField passwordField;
private JButton loginButton;
private LoginController loginController;
public LoginFrame() {
this.loginController = new LoginController();
initUI();
}
private void initUI() {
setTitle("学籍管理系统 - 登录");
setSize(400, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中显示
JPanel panel = new JPanel();
placeComponents(panel);
add(panel);
}
private void placeComponents(JPanel panel) {
panel.setLayout(null);
JLabel userLabel = new JLabel("用户名:");
userLabel.setBounds(50, 50, 80, 25);
panel.add(userLabel);
usernameField = new JTextField(20);
usernameField.setBounds(150, 50, 165, 25);
panel.add(usernameField);
JLabel passwordLabel = new JLabel("密码:");
passwordLabel.setBounds(50, 90, 80, 25);
panel.add(passwordLabel);
passwordField = new JPasswordField(20);
passwordField.setBounds(150, 90, 165, 25);
panel.add(passwordField);
loginButton = new JButton("登录");
loginButton.setBounds(150, 140, 80, 25);
panel.add(loginButton);
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
String encryptedPassword = MD5Util.md5(password);
User user = loginController.login(username, encryptedPassword);
if (user != null) {
JOptionPane.showMessageDialog(LoginFrame.this, "登录成功!");
// 登录成功后,打开主界面
MainFrame mainFrame = new MainFrame(user);
mainFrame.setVisible(true);
LoginFrame.this.dispose(); // 关闭登录窗口
} else {
JOptionPane.showMessageDialog(LoginFrame.this, "用户名或密码错误!", "错误", JOptionPane.ERROR_MESSAGE);
}
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
LoginFrame loginFrame = new LoginFrame();
loginFrame.setVisible(true);
});
}
}
系统测试与部署
1 系统测试
在系统开发完成后,需要进行全面的测试,确保其功能正确性和稳定性。
- 单元测试: 对DAO层和工具类进行测试,例如测试
StudentDAO.addStudent()方法是否能正确将数据插入数据库。 - 集成测试: 测试各模块之间的接口是否正常工作,例如登录后是否能正确加载主界面。
- 系统测试: 模拟真实用户操作,测试所有功能点,如增、删、改、查、统计等,检查界面响应和数据一致性。
- 异常测试: 测试非法输入、网络中断等异常情况下的系统表现。
2 系统部署
- 打包: 使用Maven或Gradle将项目打包成一个可执行的JAR文件。
# Maven命令 mvn clean package
- 环境准备: 目标机器上需要安装Java运行环境 (JRE) 和MySQL数据库。
- 数据库配置: 在MySQL中创建数据库,并导入项目的SQL初始化脚本(包含创建表和插入初始管理员用户)。
- 运行: 双击生成的JAR文件,或在命令行中
java -jar your-app.jar启动应用程序。
总结与展望
1 项目总结
本课程设计成功实现了一个基于Java Swing和MySQL的学籍管理系统,系统遵循MVC设计模式,结构清晰,代码可维护性高,通过本次设计,不仅巩固了Java编程、数据库操作、GUI设计等核心技术,也锻炼了分析问题、解决问题和项目管理的能力。
2 不足与展望
- 不足之处:
- 界面设计较为朴素,可以进一步美化。
- 权限控制较为简单,可以设计更精细的RBAC(基于角色的访问控制)模型。
- 功能上可以增加数据导入导出(如Excel)、打印报表、图表展示等高级功能。
- 未来展望:
- 可以升级为B/S(浏览器/服务器)架构,使用Spring Boot + Vue/React等技术栈,实现跨平台访问。
- 引入缓存技术(如Redis)提升系统性能。
- 增加更复杂的数据分析和可视化功能,为教学管理提供决策支持。
希望这份详细的课程设计方案能对你有所帮助!祝你项目顺利!
