杰瑞科技汇

Java学籍管理系统课程设计如何实现核心功能?

下面我将为你提供一个完整、详细的 Java 学籍管理系统课程设计方案,包括项目目标、功能需求、技术选型、系统设计、代码实现步骤和项目扩展


项目概述

项目名称

Java 学籍管理系统

项目目标

  • 核心目标:开发一个能够对学生信息进行增、删、改、查等基本操作的管理系统。
  • 能力培养
    • 掌握 Java 面向对象编程思想,熟练使用类、对象、继承、封装等特性。
    • 熟练使用 Java 集合框架(如 ArrayList, HashMap)来存储和管理数据。
    • 掌握文件 I/O 流(FileReader, FileWriter, BufferedReader 等)进行数据的持久化存储。
    • (可选,但强烈推荐)学习使用 JDBC 连接 MySQL 数据库,实现数据持久化。
    • 锻炼基本的软件工程能力,包括需求分析、模块划分、代码编写和测试。
  • 最终成果:一个可运行的、具有基本功能的控制台应用程序。

功能需求分析

系统主要针对三类用户:管理员教师学生,为了简化,我们先实现管理员的核心功能,之后可以扩展其他角色。

核心功能模块

  1. 学生信息管理

    • 添加学生:输入学号、姓名、性别、年龄、班级、专业等信息,将新学生信息存入系统。
    • 删除学生:根据学号查找并删除指定学生信息。
    • 修改学生信息:根据学号查找学生,并修改其除学号外的其他信息(如姓名、班级等)。
    • 查询学生信息
      • 按学号查询:精确查找并显示一个学生的详细信息。
      • 按姓名查询:模糊查找并显示所有匹配姓名的学生信息列表。
      • 显示所有学生:以列表形式显示系统中所有学生的信息。
  2. 数据持久化

    • 系统关闭后,学生数据不能丢失。
    • 方案一(文件存储):将学生信息保存到 .txt.csv 文件中。
    • 方案二(数据库存储):将学生信息保存到 MySQL 数据库中(推荐)。
  3. 用户界面与交互

    • 提供一个清晰、友好的文本菜单界面。
    • 用户可以通过输入数字选择不同的功能。
    • 对用户的非法输入(如输入字母、超出范围的数字)进行提示和处理。

技术选型

  • 开发语言:Java 8 或更高版本
  • 开发工具
    • IDE:IntelliJ IDEA (推荐) 或 Eclipse
    • 版本控制:Git (推荐)
  • 核心技术
    • 面向对象Student 类(实体类),StudentManager 类(业务逻辑类)
    • 数据结构ArrayList<Student> 用于在内存中存储学生对象。
    • 数据持久化
      • 初级java.io 包下的文件流操作。
      • 进阶java.sql 包下的 JDBC 技术,连接 MySQL 数据库。
  • 数据库(可选):MySQL 5.7+ 或 MariaDB

系统设计

类设计

设计是项目的骨架,一个清晰的类设计能让后续编码事半功倍。

类名 职责 主要属性/方法
Student (实体类) 封装一个学生的所有属性信息。 String id, String name, String gender, int age, String className, String major
getter(), setter(), toString()
StudentManager (核心业务类) 负责管理所有的学生数据,实现所有业务逻辑(增删改查、文件读写)。 List<Student> studentList
addStudent(), deleteStudent(), updateStudent(), findStudentById(), findAllStudents()
saveToFile(), loadFromFile()
DatabaseUtil (工具类) 如果使用数据库,此类负责管理数据库连接。 Connection getConnection()
Main (程序入口) 显示主菜单,接收用户输入,调用 StudentManager 的方法。 main() 方法,showMenu() 方法

数据库表设计 (如果使用数据库)

CREATE DATABASE IF NOT EXISTS school_db;
USE school_db;
CREATE TABLE students (
    id VARCHAR(20) PRIMARY KEY COMMENT '学号',
    name VARCHAR(50) NOT NULL COMMENT '姓名',
    gender VARCHAR(10) NOT NULL COMMENT '性别',
    age INT COMMENT '年龄',
    class_name VARCHAR(50) COMMENT '班级',
    major VARCHAR(50) COMMENT '专业'
) COMMENT='学生信息表';

代码实现步骤 (以文件存储为例)

第 1 步:创建 Student 实体类

这个类是一个简单的 POJO (Plain Old Java Object)。

// Student.java
public class Student {
    private String id;
    private String name;
    private String gender;
    private int age;
    private String className;
    private String major;
    // 构造方法
    public Student(String id, String name, String gender, int age, String className, String major) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.className = className;
        this.major = major;
    }
    // Getter 和 Setter 方法
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    // ... 其他 getter 和 setter ...
    // 重写 toString() 方法,方便打印输出
    @Override
    public String toString() {
        return "Student{" +
                "学号='" + id + '\'' +
                ", 姓名='" + name + '\'' +
                ", 性别='" + gender + '\'' +
                ", 年龄=" + age +
                ", 班级='" + className + '\'' +
                ", 专业='" + major + '\'' +
                '}';
    }
}

第 2 步:创建 StudentManager 业务逻辑类

这是项目的核心,包含了所有功能的实现。

// StudentManager.java
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class StudentManager {
    private List<Student> studentList;
    private final String FILE_PATH = "students.txt"; // 数据文件路径
    public StudentManager() {
        this.studentList = new ArrayList<>();
        // 程序启动时,从文件加载数据
        loadFromFile();
    }
    // 1. 添加学生
    public void addStudent(Scanner scanner) {
        System.out.println("请输入学生信息:");
        System.out.print("学号: ");
        String id = scanner.next();
        // 检查学号是否已存在
        if (findStudentById(id) != null) {
            System.out.println("错误:该学号已存在!");
            return;
        }
        System.out.print("姓名: ");
        String name = scanner.next();
        System.out.print("性别: ");
        String gender = scanner.next();
        System.out.print("年龄: ");
        int age = scanner.nextInt();
        System.out.print("班级: ");
        String className = scanner.next();
        System.out.print("专业: ");
        String major = scanner.next();
        Student student = new Student(id, name, gender, age, className, major);
        studentList.add(student);
        System.out.println("学生信息添加成功!");
    }
    // 2. 删除学生
    public void deleteStudent(Scanner scanner) {
        System.out.print("请输入要删除的学生学号: ");
        String id = scanner.next();
        Student student = findStudentById(id);
        if (student != null) {
            studentList.remove(student);
            System.out.println("学生信息删除成功!");
        } else {
            System.out.println("未找到该学号的学生!");
        }
    }
    // 3. 修改学生信息
    public void updateStudent(Scanner scanner) {
        System.out.print("请输入要修改的学生学号: ");
        String id = scanner.next();
        Student student = findStudentById(id);
        if (student != null) {
            System.out.println("请输入新的信息(留空则不修改):");
            scanner.nextLine(); // 消费换行符
            System.out.print("新姓名 (原:" + student.getName() + "): ");
            String name = scanner.nextLine();
            if (!name.isEmpty()) student.setName(name);
            System.out.print("新性别 (原:" + student.getGender() + "): ");
            String gender = scanner.nextLine();
            if (!gender.isEmpty()) student.setGender(gender);
            // ... 其他字段的修改类似 ...
            System.out.println("学生信息修改成功!");
        } else {
            System.out.println("未找到该学号的学生!");
        }
    }
    // 4. 查询学生
    public void findStudent(Scanner scanner) {
        System.out.println("请选择查询方式:");
        System.out.println("1. 按学号查询");
        System.out.println("2. 按姓名查询");
        System.out.println("3. 显示所有学生");
        System.out.print("请选择: ");
        int choice = scanner.nextInt();
        switch (choice) {
            case 1:
                System.out.print("请输入学号: ");
                String id = scanner.next();
                Student s = findStudentById(id);
                if (s != null) {
                    System.out.println(s);
                } else {
                    System.out.println("未找到该学号的学生!");
                }
                break;
            case 2:
                System.out.print("请输入姓名: ");
                String name = scanner.next();
                boolean found = false;
                for (Student student : studentList) {
                    if (student.getName().contains(name)) {
                        System.out.println(student);
                        found = true;
                    }
                }
                if (!found) {
                    System.out.println("未找到匹配姓名的学生!");
                }
                break;
            case 3:
                if (studentList.isEmpty()) {
                    System.out.println("系统中暂无学生信息。");
                } else {
                    System.out.println("所有学生信息如下:");
                    for (Student student : studentList) {
                        System.out.println(student);
                    }
                }
                break;
            default:
                System.out.println("无效的选择!");
        }
    }
    // 辅助方法:根据学号查找学生
    private Student findStudentById(String id) {
        for (Student student : studentList) {
            if (student.getId().equals(id)) {
                return student;
            }
        }
        return null;
    }
    // 5. 保存到文件
    public void saveToFile() {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH))) {
            for (Student student : studentList) {
                // 将对象信息格式化为字符串,id,name,gender,age,className,major
                writer.write(student.getId() + "," + student.getName() + "," + student.getGender() + "," + student.getAge() + "," + student.getClassName() + "," + student.getMajor());
                writer.newLine(); // 写入一个换行符
            }
            System.out.println("数据已保存到文件!");
        } catch (IOException e) {
            System.out.println("保存文件时出错!");
            e.printStackTrace();
        }
    }
    // 6. 从文件加载
    public void loadFromFile() {
        File file = new File(FILE_PATH);
        if (!file.exists()) {
            System.out.println("数据文件不存在,将创建新文件。");
            return;
        }
        try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] parts = line.split(",");
                if (parts.length == 6) {
                    Student student = new Student(parts[0], parts[1], parts[2], Integer.parseInt(parts[3]), parts[4], parts[5]);
                    studentList.add(student);
                }
            }
            System.out.println("数据已从文件加载!");
        } catch (IOException e) {
            System.out.println("读取文件时出错!");
            e.printStackTrace();
        }
    }
}

第 3 步:创建 Main 类,启动程序

// Main.java
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("========== 学籍管理系统 ==========");
            System.out.println("          1. 添加学生");
            System.out.println("          2. 删除学生");
            System.out.println("          3. 修改学生信息");
            System.out.println("          4. 查询学生信息");
            System.out.println("          0. 退出系统");
            System.out.println("=================================");
            System.out.print("请选择操作: ");
            try {
                int choice = scanner.nextInt();
                switch (choice) {
                    case 1:
                        manager.addStudent(scanner);
                        break;
                    case 2:
                        manager.deleteStudent(scanner);
                        break;
                    case 3:
                        manager.updateStudent(scanner);
                        break;
                    case 4:
                        manager.findStudent(scanner);
                        break;
                    case 0:
                        System.out.println("感谢使用,系统数据已自动保存。");
                        manager.saveToFile(); // 退出前保存数据
                        scanner.close();
                        System.exit(0); // 退出程序
                    default:
                        System.out.println("无效的输入,请输入 0-4 之间的数字!");
                }
            } catch (Exception e) {
                System.out.println("输入格式错误,请输入数字!");
                scanner.next(); // 清除错误的输入,防止死循环
            }
            System.out.println("\n按回车键继续...");
            scanner.nextLine(); // 等待用户按回车
            scanner.nextLine(); // 真正等待回车
        }
    }
}

项目扩展与优化

完成基本功能后,你可以从以下几个方面进行扩展,让项目更完善:

  1. 使用数据库替代文件存储

    • 创建 DatabaseUtil 类管理数据库连接。
    • StudentManager 中将 loadFromFile()saveToFile() 替换为 loadFromDB()saveToDB(),使用 JDBC 执行 SQL 增删改查语句,这是最大的加分项。
  2. 增加用户角色和权限

    • 创建 User 类,包含 username, password, role (admin, teacher, student)。
    • Main 类中增加登录界面。
    • 不同角色登录后,显示不同的菜单和功能权限。
  3. 增加课程管理模块

    • 创建 Course 类(课程号、课程名、学分等)。
    • 创建 Score 类(学号、课程号、分数),用于记录学生成绩。
    • StudentManager 中增加成绩录入、查询、统计等功能。
  4. 改进用户界面

    • 虽然是控制台程序,但可以通过格式化输出(如 String.format)让界面更美观、对齐。
  5. 引入异常处理和日志

    • 使用 try-catch 块更细致地处理各种异常情况。
    • 引入 java.util.loggingLog4j 等日志框架,记录系统运行信息,方便调试。
  6. 单元测试

    • 学习使用 JUnit,为 StudentManager 中的核心方法(如 addStudent, deleteStudent)编写单元测试,确保代码质量。

项目总结与报告建议

课程设计结束后,你需要撰写一份课程设计报告,报告应包含以下内容:

  1. 引言:介绍项目背景、目的和意义。
  2. 需求分析:详细描述系统的功能需求和非功能需求。
  3. 系统设计
    • 总体设计:画出系统功能模块图。
    • 详细设计:画出类图、时序图(可选),说明核心类的职责和关系。
    • 数据库设计(如果使用):展示 E-R 图和数据表结构。
  4. 系统实现
    • 开发环境与技术栈介绍。
    • 核心代码片段及解释(不要贴所有代码,挑重点)。
    • 界面展示(截图)。
  5. 系统测试:描述测试用例和测试结果,说明系统功能的正确性。
  6. 总结与展望:总结项目完成情况、遇到的问题及解决方案,并对未来可改进的方向进行展望。
  7. 参考文献:列出参考的书籍、网站等。

这个设计方案为你提供了一个清晰的路线图,从最简单的文件版本开始,逐步迭代和完善,最终一定能完成一个优秀的课程设计项目,祝你成功!

分享:
扫描分享到社交APP
上一篇
下一篇