基于Spring Boot的成绩管理系统后台实现

下面是一个完整的成绩管理系统后台实现,使用Spring Boot框架,包含学生管理、课程管理和成绩管理功能。

1. 项目结构

src/main/java/com/example/grademanagement/
├── config/           # 配置类
├── controller/       # 控制器
├── dto/              # 数据传输对象
├── entity/           # 实体类
├── exception/        # 异常处理
├── repository/       # 数据访问层
├── service/          # 业务逻辑层
│   └── impl/         # 服务实现
└── GrademanagementApplication.java  # 启动类

2. 主要依赖 (pom.xml) 

<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 数据访问 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- 工具类 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

3. 实体类设计

3.1 学生实体 (Student.java)

package com.example.grademanagement.entity;import jakarta.persistence.*;
import lombok.Data;import java.util.List;@Entity
@Data
@Table(name = "students")
public class Student {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private String studentId;  // 学号@Column(nullable = false)private String name;@Column(nullable = false)private String gender;private String className;  // 班级@OneToMany(mappedBy = "student", cascade = CascadeType.ALL)private List<Grade> grades;
}

3.2 课程实体 (Course.java)

package com.example.grademanagement.entity;import jakarta.persistence.*;
import lombok.Data;import java.util.List;@Entity
@Data
@Table(name = "courses")
public class Course {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false, unique = true)private String courseCode;  // 课程代码@Column(nullable = false)private String courseName;private Integer credit;  // 学分@OneToMany(mappedBy = "course", cascade = CascadeType.ALL)private List<Grade> grades;
}

3.3 成绩实体 (Grade.java)

package com.example.grademanagement.entity;import jakarta.persistence.*;
import lombok.Data;@Entity
@Data
@Table(name = "grades")
public class Grade {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@ManyToOne@JoinColumn(name = "student_id", nullable = false)private Student student;@ManyToOne@JoinColumn(name = "course_id", nullable = false)private Course course;@Column(nullable = false)private Double score;  // 成绩private String semester;  // 学期
}

4. 数据访问层 (Repository)

4.1 学生仓库 (StudentRepository.java)

package com.example.grademanagement.repository;import com.example.grademanagement.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;public interface StudentRepository extends JpaRepository<Student, Long> {Student findByStudentId(String studentId);List<Student> findByNameContaining(String name);List<Student> findByClassName(String className);
}

4.2 课程仓库 (CourseRepository.java)

package com.example.grademanagement.repository;import com.example.grademanagement.entity.Course;
import org.springframework.data.jpa.repository.JpaRepository;public interface CourseRepository extends JpaRepository<Course, Long> {Course findByCourseCode(String courseCode);List<Course> findByCourseNameContaining(String courseName);
}

4.3 成绩仓库 (GradeRepository.java)

package com.example.grademanagement.repository;import com.example.grademanagement.entity.Grade;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;import java.util.List;public interface GradeRepository extends JpaRepository<Grade, Long> {List<Grade> findByStudentId(Long studentId);List<Grade> findByCourseId(Long courseId);@Query("SELECT g FROM Grade g WHERE g.student.id = ?1 AND g.course.id = ?2")Grade findByStudentAndCourse(Long studentId, Long courseId);@Query("SELECT AVG(g.score) FROM Grade g WHERE g.course.id = ?1")Double findAverageScoreByCourse(Long courseId);
}

5. 业务逻辑层 (Service)

5.1 学生服务接口 (StudentService.java)

package com.example.grademanagement.service;import com.example.grademanagement.entity.Student;import java.util.List;public interface StudentService {Student addStudent(Student student);Student updateStudent(Long id, Student student);void deleteStudent(Long id);Student getStudentById(Long id);Student getStudentByStudentId(String studentId);List<Student> getAllStudents();List<Student> searchStudents(String keyword);
}

5.2 学生服务实现 (StudentServiceImpl.java)

package com.example.grademanagement.service.impl;import com.example.grademanagement.entity.Student;
import com.example.grademanagement.repository.StudentRepository;
import com.example.grademanagement.service.StudentService;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class StudentServiceImpl implements StudentService {private final StudentRepository studentRepository;public StudentServiceImpl(StudentRepository studentRepository) {this.studentRepository = studentRepository;}@Overridepublic Student addStudent(Student student) {if (studentRepository.findByStudentId(student.getStudentId()) != null) {throw new RuntimeException("学号已存在");}return studentRepository.save(student);}@Overridepublic Student updateStudent(Long id, Student student) {Student existingStudent = studentRepository.findById(id).orElseThrow(() -> new RuntimeException("学生不存在"));existingStudent.setName(student.getName());existingStudent.setGender(student.getGender());existingStudent.setClassName(student.getClassName());return studentRepository.save(existingStudent);}@Overridepublic void deleteStudent(Long id) {studentRepository.deleteById(id);}@Overridepublic Student getStudentById(Long id) {return studentRepository.findById(id).orElseThrow(() -> new RuntimeException("学生不存在"));}@Overridepublic Student getStudentByStudentId(String studentId) {return studentRepository.findByStudentId(studentId);}@Overridepublic List<Student> getAllStudents() {return studentRepository.findAll();}@Overridepublic List<Student> searchStudents(String keyword) {return studentRepository.findByNameContaining(keyword);}
}

5.3 成绩服务接口 (GradeService.java)

package com.example.grademanagement.service;import com.example.grademanagement.entity.Grade;import java.util.List;public interface GradeService {Grade addGrade(Grade grade);Grade updateGrade(Long id, Grade grade);void deleteGrade(Long id);Grade getGradeById(Long id);List<Grade> getGradesByStudentId(Long studentId);List<Grade> getGradesByCourseId(Long courseId);Double getAverageScoreByCourse(Long courseId);Grade getGradeByStudentAndCourse(Long studentId, Long courseId);
}

6. 控制器 (Controller)

6.1 学生控制器 (StudentController.java)

package com.example.grademanagement.controller;import com.example.grademanagement.entity.Student;
import com.example.grademanagement.service.StudentService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/api/students")
public class StudentController {private final StudentService studentService;public StudentController(StudentService studentService) {this.studentService = studentService;}@PostMappingpublic ResponseEntity<Student> addStudent(@RequestBody Student student) {return ResponseEntity.ok(studentService.addStudent(student));}@PutMapping("/{id}")public ResponseEntity<Student> updateStudent(@PathVariable Long id, @RequestBody Student student) {return ResponseEntity.ok(studentService.updateStudent(id, student));}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteStudent(@PathVariable Long id) {studentService.deleteStudent(id);return ResponseEntity.noContent().build();}@GetMapping("/{id}")public ResponseEntity<Student> getStudentById(@PathVariable Long id) {return ResponseEntity.ok(studentService.getStudentById(id));}@GetMapping("/student-id/{studentId}")public ResponseEntity<Student> getStudentByStudentId(@PathVariable String studentId) {return ResponseEntity.ok(studentService.getStudentByStudentId(studentId));}@GetMappingpublic ResponseEntity<List<Student>> getAllStudents() {return ResponseEntity.ok(studentService.getAllStudents());}@GetMapping("/search")public ResponseEntity<List<Student>> searchStudents(@RequestParam String keyword) {return ResponseEntity.ok(studentService.searchStudents(keyword));}
}

6.2 成绩控制器 (GradeController.java)

package com.example.grademanagement.controller;import com.example.grademanagement.entity.Grade;
import com.example.grademanagement.service.GradeService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/api/grades")
public class GradeController {private final GradeService gradeService;public GradeController(GradeService gradeService) {this.gradeService = gradeService;}@PostMappingpublic ResponseEntity<Grade> addGrade(@RequestBody Grade grade) {return ResponseEntity.ok(gradeService.addGrade(grade));}@PutMapping("/{id}")public ResponseEntity<Grade> updateGrade(@PathVariable Long id, @RequestBody Grade grade) {return ResponseEntity.ok(gradeService.updateGrade(id, grade));}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteGrade(@PathVariable Long id) {gradeService.deleteGrade(id);return ResponseEntity.noContent().build();}@GetMapping("/{id}")public ResponseEntity<Grade> getGradeById(@PathVariable Long id) {return ResponseEntity.ok(gradeService.getGradeById(id));}@GetMapping("/student/{studentId}")public ResponseEntity<List<Grade>> getGradesByStudentId(@PathVariable Long studentId) {return ResponseEntity.ok(gradeService.getGradesByStudentId(studentId));}@GetMapping("/course/{courseId}")public ResponseEntity<List<Grade>> getGradesByCourseId(@PathVariable Long courseId) {return ResponseEntity.ok(gradeService.getGradesByCourseId(courseId));}@GetMapping("/average/{courseId}")public ResponseEntity<Double> getAverageScoreByCourse(@PathVariable Long courseId) {return ResponseEntity.ok(gradeService.getAverageScoreByCourse(courseId));}@GetMapping("/student-course")public ResponseEntity<Grade> getGradeByStudentAndCourse(@RequestParam Long studentId, @RequestParam Long courseId) {return ResponseEntity.ok(gradeService.getGradeByStudentAndCourse(studentId, courseId));}
}

7. 异常处理

7.1 全局异常处理器 (GlobalExceptionHandler.java)

package com.example.grademanagement.exception;import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(RuntimeException.class)public ResponseEntity<String> handleRuntimeException(RuntimeException e) {return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());}@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("服务器内部错误: " + e.getMessage());}
}

8. 应用配置

8.1 数据库配置 (application.properties)

# 数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/grade_management?useSSL=false
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# JPA配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true# 服务器配置
server.port=8080

9. 启动类

package com.example.grademanagement;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class GrademanagementApplication {public static void main(String[] args) {SpringApplication.run(GrademanagementApplication.class, args);}
}

10. API文档

系统提供以下主要API端点:

学生管理

  • POST /api/students - 添加学生

  • GET /api/students - 获取所有学生

  • GET /api/students/{id} - 获取指定ID的学生

  • PUT /api/students/{id} - 更新学生信息

  • DELETE /api/students/{id} - 删除学生

成绩管理

  • POST /api/grades - 添加成绩

  • GET /api/grades/student/{studentId} - 获取学生所有成绩

  • GET /api/grades/course/{courseId} - 获取课程所有成绩

  • GET /api/grades/average/{courseId} - 获取课程平均分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现极限网关(INFINI Gateway)配置动态加载

还在停机更新 Gateway 配置&#xff0c;OUT 了。 今天和大家分享一个 Gateway 的功能&#xff1a;动态加载配置&#xff08;也称热更新或热加载&#xff09;。 这个功能可以在 Gateway 不停机的情况下更新配置并使之生效。 配置样例如下&#xff1a; path.data: data path.…

Mean Shift 图像分割与 Canny 边缘检测教程

1. Mean Shift 简介 Mean Shift 是一种聚类算法&#xff0c;通过寻找图像中颜色相似的区域来实现分割。它非常适合用于场景分割或物体检测等任务。本教程将它与 Canny 边缘检测结合&#xff0c;突出分割区域的边界。 2. 图像分割流程 我们将按照以下步骤完成图像分割和边缘检…

Day15 -实例 端口扫描工具 WAF识别工具的使用

一、端口扫描工具 1、zenmap 我这里user是汉字名&#xff0c;没有解析成功。等后续换一个英文账户试一试。 魔改kali的nmap nmap -p8000-9000 8.140.159.19 2、masscan cmd启动&#xff0c;拖入exe文件。然后先写ip&#xff0c;会报错给提示 寻路犬系统 我们去找一下他的…

如何解决高并发场景下的性能瓶颈?实践分享

解决高并发性能瓶颈的核心方法包括优化系统架构、合理使用缓存技术、数据库优化及扩展策略、负载均衡设计。 其中&#xff0c;优化系统架构是根本解决性能问题的关键所在。良好的系统架构能够有效支撑业务高效稳定运行&#xff0c;避免性能瓶颈带来的损失。企业可通过微服务架构…

自动驾驶背后的数学:ReLU,Sigmoid, Leaky ReLU, PReLU,Swish等激活函数解析

随着自动驾驶技术的飞速发展&#xff0c;深度学习在其中扮演着至关重要的角色。而激活函数作为神经网络中的关键组件&#xff0c;直接影响着模型的性能和效果。前面几篇博客 自动驾驶背后的数学&#xff1a;特征提取中的线性变换与非线性激活 , 「自动驾驶背后的数学&#xff1…

性能测试、负载测试、压力测试的全面解析

在软件测试领域&#xff0c;性能测试、负载测试和压力测试是评估系统稳定性和可靠性的关键手段。​它们各自关注不同的测试目标和应用场景&#xff0c;理解这些差异对于制定有效的测试策略至关重要。 本文对性能测试、负载测试和压力测试进行深入分析&#xff0c;探讨其定义、…

责任链模式-java

1、spring依赖注入模式 @Configuration public class ChainConfig {@Beanpublic ChainSpringFactory chainSpringFactory(List<IHandler<DemoOne,Boolean>> handlerList){return new ChainSpringFactory(handlerList);}} public class DemoOne { }public abstract…

学习本地部署DeepSeek的过程(基于LM Studio)

除了使用Ollama部署DeepSeek&#xff0c;还可以使用LM Studio部署DeepSeek&#xff0c;后者是一款允许用户在本地计算机上运行大型语言模型&#xff08;LLMs&#xff09;的桌面应用程序&#xff0c;旨在简化本地模型的使用&#xff0c;无需云端连接或复杂配置即可体验 AI 功能。…

CSS 尺寸 (Dimension)

CSS 尺寸 (Dimension) 在网页设计中&#xff0c;CSS&#xff08;层叠样式表&#xff09;的尺寸属性是控制元素大小和位置的关键。本文将详细介绍CSS尺寸相关的概念、属性及其应用。 1. CSS 尺寸概述 CSS尺寸主要包括宽度和高度&#xff0c;这些属性可以应用于各种HTML元素&a…

【自学笔记】ELK基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 ELK基础知识点总览1. ELK简介2. Elasticsearch基础Elasticsearch配置示例&#xff08;elasticsearch.yml&#xff09; 3. Logstash基础Logstash配置示例&#xff08…

等差数列公式推导

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

【MySQL】用户账户、角色、口令、PAM

目录 查看用户账户设置 连接 1.本地连接 2.远程连接 账户 角色 操作用户账户和角色 配置口令和账户有效期限 手工使口令过期 配置口令有效期限 PAM身份验证插件 客户端连接&#xff1a;使用 PAM 账户登录 在连接到MySQL服务器并执行查询时&#xff0c;会验证你的身…

5种生成模型(VAE、GAN、AR、Flow 和 Diffusion)的对比梳理 + 易懂讲解 + 代码实现

目录 1 变分自编码器&#xff08;VAE&#xff09;​ 1.1 概念 1.2 训练损失 1.3 VAE 的实现 2 生成对抗网络&#xff08;GAN&#xff09;​ 2.1 概念 2.2 训练损失 a. 判别器的损失函数 b. 生成器的损失函数 c. 对抗训练的动态过程 2.3 GAN 的实现 3 自回归模型&am…

印刷电路板 (PCB) 的影响何时重要?在模拟环境中导航

我和我的同事们经常被问到关于 PCB 效应的相同问题&#xff0c;例如&#xff1a; 仿真何时需要 PCB 效果&#xff1f; 为什么时域仿真需要 PCB 效应&#xff1f; 当 PCB 效应必须包含在仿真中时&#xff0c;频率是否重要&#xff1f; 设计人员应该在多大程度上关注 VRM 模型中包…

2024跨境电商挑战:AI反检测技术在避免封号中的作用

2024跨境电商挑战&#xff1a;AI反检测技术在避免封号中的作用 跨境电商的浪潮席卷全球&#xff0c;为商家打开了通往世界各地的大门。然而&#xff0c;随着平台监管的加强&#xff0c;合规性问题成为商家不得不面对的挑战。在电商平台的严格监控下&#xff0c;任何违规行为都…

QML控件 - Text

在 QML 中&#xff0c;Text 组件是用于显示文本的核心元素&#xff0c;支持丰富的文本样式、布局和交互功能。以下是 完整指南 和常见用法示例&#xff1a; 1. 基础用法 import QtQuick 2.15Text {text: "Hello, QML!" // 显示文本内容font.pixelSize: 20 // 字体…

网络运维学习笔记(DeepSeek优化版) 024 HCIP-Datacom OSPF域内路由计算

文章目录 OSPF域内路由计算&#xff1a;单区域的路由计算一、OSPF单区域路由计算原理二、1类LSA详解2.1 1类LSA的作用与结构2.2 1类LSA的四种链路类型 三、OSPF路由表生成验证3.1 查看LSDB3.2 查看OSPF路由表3.3 查看全局路由表 四、2类LSA详解4.1 2类LSA的作用与生成条件4.2 2…

HTML5 SVG:图形绘制的现代标准

HTML5 SVG:图形绘制的现代标准 引言 随着互联网技术的发展,网页的交互性和美观性日益受到重视。HTML5 SVG作为一种强大的图形绘制技术,在网页设计中发挥着重要作用。本文将深入探讨HTML5 SVG的原理、应用场景以及如何在实际项目中运用。 一、HTML5 SVG简介 1.1 什么是SV…

多智能体融合(Multi-Agent Fusion)

多智能体融合&#xff08;Multi-Agent Fusion&#xff09;是指在多智能体系统&#xff08;MAS, Multi-Agent System&#xff09;中&#xff0c;多个智能体&#xff08;Agent&#xff09;通过协作、竞争或共享信息&#xff0c;实现全局最优的智能决策和任务执行。该方法广泛应用…

[学习笔记]NC工具安装及使用

工具简介 Netcat&#xff08;简称 nc&#xff09;是一款强大的命令行网络工具&#xff0c;被称作瑞士军刀&#xff0c;用来在两台机器之间建立 TCP/UDP 连接&#xff0c;并通过标准的输入输出进行数据的读写&#xff0c;大家也可以使用Nmap&#xff08;增强版nc工具&#xff0…