• 学习数据库建模和设计
  • SQL 实战项目实践
  • 学生管理系统开发

✅ 项目目标

设计并实现一个学生选课系统,提供以下功能:

  • 学生信息管理(增、删、改、查)
  • 课程信息管理(增、删、改、查)
  • 学生选课(选课、退课、查询已选课程)
  • 管理员管理(学生、课程信息管理)

系统基于 MySQL 数据库设计,并结合 Spring Boot(可选)实现。


🧱 项目结构

student-course-system/
├── src/
│   ├── main/java/com/example/studentcourse/
│   │   ├── Controller/
│   │   │   ├── StudentController.java
│   │   │   ├── CourseController.java
│   │   └── Service/
│   │       ├── StudentService.java
│   │       ├── CourseService.java
│   └── resources/
│       ├── application.yml
├── db/
│   ├── schema.sql         # 数据库表结构
│   └── data.sql           # 测试数据
└── pom.xml                # Maven 配置

📊 数据库设计

1. 学生表 student

CREATE TABLE `student` (
    `student_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '学生ID',
    `name` VARCHAR(50) NOT NULL COMMENT '学生姓名',
    `gender` CHAR(1) NOT NULL COMMENT '性别',
    `birth_date` DATE NOT NULL COMMENT '出生日期',
    `email` VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱',
    `phone` VARCHAR(15) NOT NULL COMMENT '电话',
    `major` VARCHAR(50) NOT NULL COMMENT '专业'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 课程表 course

CREATE TABLE `course` (
    `course_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '课程ID',
    `course_name` VARCHAR(100) NOT NULL COMMENT '课程名称',
    `credit` DECIMAL(3,1) NOT NULL COMMENT '学分',
    `teacher` VARCHAR(50) NOT NULL COMMENT '授课教师',
    `max_students` INT NOT NULL COMMENT '最大选课人数',
    `semester` VARCHAR(20) NOT NULL COMMENT '学期'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. 选课表 student_course

CREATE TABLE `student_course` (
    `student_id` INT NOT NULL,
    `course_id` INT NOT NULL,
    PRIMARY KEY (`student_id`, `course_id`),
    FOREIGN KEY (`student_id`) REFERENCES `student`(`student_id`),
    FOREIGN KEY (`course_id`) REFERENCES `course`(`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

🛠️ 后端实现

1. 学生管理 Controller StudentController.java

@RestController
@RequestMapping("/students")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @PostMapping("/add")
    public ResponseEntity<String> addStudent(@RequestBody Student student) {
        studentService.addStudent(student);
        return ResponseEntity.ok("学生信息添加成功");
    }

    @GetMapping("/list")
    public List<Student> listStudents() {
        return studentService.listStudents();
    }

    @PutMapping("/update/{id}")
    public ResponseEntity<String> updateStudent(@PathVariable("id") int id, @RequestBody Student student) {
        studentService.updateStudent(id, student);
        return ResponseEntity.ok("学生信息更新成功");
    }

    @DeleteMapping("/delete/{id}")
    public ResponseEntity<String> deleteStudent(@PathVariable("id") int id) {
        studentService.deleteStudent(id);
        return ResponseEntity.ok("学生信息删除成功");
    }
}

2. 课程管理 Controller CourseController.java

@RestController
@RequestMapping("/courses")
public class CourseController {

    @Autowired
    private CourseService courseService;

    @PostMapping("/add")
    public ResponseEntity<String> addCourse(@RequestBody Course course) {
        courseService.addCourse(course);
        return ResponseEntity.ok("课程信息添加成功");
    }

    @GetMapping("/list")
    public List<Course> listCourses() {
        return courseService.listCourses();
    }

    @PutMapping("/update/{id}")
    public ResponseEntity<String> updateCourse(@PathVariable("id") int id, @RequestBody Course course) {
        courseService.updateCourse(id, course);
        return ResponseEntity.ok("课程信息更新成功");
    }

    @DeleteMapping("/delete/{id}")
    public ResponseEntity<String> deleteCourse(@PathVariable("id") int id) {
        courseService.deleteCourse(id);
        return ResponseEntity.ok("课程信息删除成功");
    }
}

3. 选课管理 StudentCourseController.java

@RestController
@RequestMapping("/student-courses")
public class StudentCourseController {

    @Autowired
    private StudentCourseService studentCourseService;

    @PostMapping("/select")
    public ResponseEntity<String> selectCourse(@RequestParam int studentId, @RequestParam int courseId) {
        studentCourseService.selectCourse(studentId, courseId);
        return ResponseEntity.ok("选课成功");
    }

    @DeleteMapping("/withdraw")
    public ResponseEntity<String> withdrawCourse(@RequestParam int studentId, @RequestParam int courseId) {
        studentCourseService.withdrawCourse(studentId, courseId);
        return ResponseEntity.ok("退课成功");
    }

    @GetMapping("/student-courses/{studentId}")
    public List<Course> getSelectedCourses(@PathVariable int studentId) {
        return studentCourseService.getSelectedCourses(studentId);
    }
}

🚀 测试数据与样例

data.sql 测试数据

INSERT INTO `student` (`name`, `gender`, `birth_date`, `email`, `phone`, `major`) VALUES
('张三', 'M', '2000-01-01', 'zhangsan@example.com', '13800000000', '计算机科学'),
('李四', 'F', '2001-02-02', 'lisi@example.com', '13900000000', '电子信息');

INSERT INTO `course` (`course_name`, `credit`, `teacher`, `max_students`, `semester`) VALUES
('数据结构', 3.0, '王老师', 50, '2023-春'),
('操作系统', 4.0, '李老师', 40, '2023-春');

INSERT INTO `student_course` (`student_id`, `course_id`) VALUES
(1, 1),
(1, 2),
(2, 1);

🔧 项目部署

  1. Spring Boot 项目
    • 使用 @SpringBootApplication 启动类运行项目。
    • 默认端口:8080,可通过 application.properties 修改。
  2. MySQL 配置
    • 在 application.yml 或 application.properties 配置数据库连接。
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/student_course_system?useSSL=false&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  1. 运行项目
    • 使用 mvn spring-boot:run 启动项目。

🎯 项目总结与建议

功能扩展

  • 课程限制人数检查(选课时检查是否已满)
  • 课程成绩管理(为每个学生记录课程成绩)
  • 用户认证与权限管理(管理员与学生权限区分)