基于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.rhkb.cn/news/41392.html

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

相关文章

TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“

原因&#xff1a; 初始化时处于内网环境下&#xff0c;Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复&#xff1a; vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题

【Linux】POSIX信号量与基于环形队列的生产消费者模型

目录 一、POSIX信号量&#xff1a; 接口&#xff1a; 二、基于环形队列的生产消费者模型 环形队列&#xff1a; 单生产单消费实现代码&#xff1a; RingQueue.hpp&#xff1a; main.cc&#xff1a; 多生产多消费实现代码&#xff1a; RingQueue.hpp&#xff1a; main.…

【13】Ajax爬取案例实战

目录 一、准备工作 二、爬取目标 三、初步探索&#xff1a;如何判断网页是经js渲染过的&#xff1f; 四、爬取列表页 4.1 分析Ajax接口逻辑 4.2 观察响应的数据 4.3 代码实现 &#xff08;1&#xff09;导入库 &#xff08;2&#xff09;定义一个通用的爬取方法…

嵌入式八股RTOS与Linux---网络系统篇

前言 关于计网的什么TCP三次握手 几层模型啊TCP报文啥的不在这里讲,会单独分成一个计算机网络模块   这里主要介绍介绍lwip和socket FreeRTOS下的网络接口–移植LWIP 实际上FreeRTOS并不自带网络接口,我们一般会通过移植lwip协议栈让FreeRTOS可以通过网络接口收发数据,具体可…

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练 1.2025新版懒人精灵-实战红果搜索关键词刷视频&#xff1a;https://www.bilibili.com/video/BV1eK9kY7EWV 2.懒人精灵-全分辨率节点识别&#xff08;红果看广告领金币小实战&#xff09;&#xff1a;https://www.bili…

【更新中】【React】基础版React + Redux实现教程(Vite + React + Redux + TypeScript)

本项目是一个在react中&#xff0c;使用 redux 管理状态的基础版实现教程&#xff0c;用简单的案例练习redux的使用&#xff0c;旨在帮助学习 redux 的状态管理机制&#xff0c;包括 store、action、reducer、dispatch 等核心概念。 项目地址&#xff1a;https://github.com/Yv…

【MySQL】从零开始:掌握MySQL数据库的核心概念(四)

人们之所以不愿改变&#xff0c;是因为害怕未知。但历史唯一不变的事实&#xff0c;就是一切都会改变。 前言 这是我自己学习mysql数据库的第四篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的表格约束&#xff0c;没看的同学可以…

AP 场景架构设计(一) :OceanBase 读写分离策略解析

说明&#xff1a;本文内容对应的是 OceanBase 社区版&#xff0c;架构部分不涉及企业版的仲裁副本功能。OceanBase社区版和企业版的能力区别详见&#xff1a; 官网链接。 概述​ 当两种类型的业务共同运行在同一个数据库集群上时&#xff0c;这对数据库的配置等条件提出了较高…

CPU架构和微架构

CPU架构&#xff08;CPU Architecture&#xff09; CPU架构是指处理器的整体设计框架&#xff0c;定义了处理器的指令集、寄存器、内存管理方式等。它是处理器设计的顶层规范&#xff0c;决定了软件如何与硬件交互。 主要特点&#xff1a; 指令集架构&#xff08;ISA, Instr…

6.4 模拟专题:LeetCode1419.数青蛙

1.题目链接&#xff1a;数青蛙 - LeetCode 2.题目描述 给定一个字符串 croakOfFrogs&#xff0c;表示青蛙的鸣叫声序列。每个青蛙必须按顺序发出完整的 “croak” 字符&#xff0c;且多只青蛙可以同时鸣叫。要求计算最少需要多少只青蛙才能完成该字符串&#xff0c;若无法完成…

Linux 搭建dns主域解析,和反向解析

#!/bin/bash # DNS主域名服务 # user li 20250325# 检查当前用户是否为root用户 # 因为配置DNS服务通常需要较高的权限&#xff0c;只有root用户才能进行一些关键操作 if [ "$USER" ! "root" ]; then# 如果不是root用户&#xff0c;输出错误信息echo "…

Leetcode 二进制求和

java solution class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();//首先设置2个指针, 从右往左处理int i a.length() - 1;int j b.length() - 1;int carry 0; //设置进位标志位//从2个字符串的末尾向前遍历while(…

【NLP 49、提示工程 prompt engineering】

目录 一、基本介绍 语言模型生成文本的基本特点 提示工程 prompt engineering 提示工程的优势 使用注意事项 ① 安全问题 ② 可信度问题 ③ 时效性与专业性 二、应用场景 能 ≠ 适合 应用场景 —— 百科知识 应用场景 —— 写文案 应用场景 —— 解释 / 编写…

【NLP 43、文本生成任务】

目录 一、生成式任务 二、seq2seq任务 1.模型结构 2.工作原理 3.局限性 三、自回归语言模型训练 Decoder only 四、自回归模型结构&#xff1a;文本生成任务 —— Embedding LSTM 代码示例 &#x1f680; 数据文件 代码流程 Ⅰ、模型初始化 Ⅱ、前向计算 代码运行流程 Ⅲ、加载…

vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu

vscode 通过Remote-ssh插件远程连接服务器报错 could not establish connection to ubuntu&#xff0c;并且出现下面的错误打印&#xff1a; [21:00:57.307] Log Level: 2 [21:00:57.350] SSH Resolver called for "ssh-remoteubuntu", attempt 1 [21:00:57.359] r…

Linux之编辑器vim命令

vi/vim命令&#xff1a; 终端下编辑文件的首选工具&#xff0c;号称编辑器之神 基本上分为三种模式&#xff0c;分别是 命令模式&#xff08;command mode&#xff09;>输入vi的命令和快捷键&#xff0c;默认打开文件的时候的模式插入模式&#xff08;insert mode&#x…

第一天学爬虫

阅读提示&#xff1a;我今天才开始尝试爬虫&#xff0c;写的不好请见谅。 一、准备工具 requests库&#xff1a;发送HTTP请求并获取网页内容。BeautifulSoup库&#xff1a;解析HTML页面并提取数据。pandas库&#xff1a;保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…

MySQL实战(尚硅谷)

要求 代码 # 准备数据 CREATE DATABASE IF NOT EXISTS company;USE company;CREATE TABLE IF NOT EXISTS employees(employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT );DESC employees;CREATE TABLE IF NOT EXISTS departments…

windows下安装sublime

sublime4 alpha 4098 版本 下载 可以根据待破解的版本选择下载 https://www.sublimetext.com/dev crack alpha4098 的licence 在----- BEGIN LICENSE ----- TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A37081C5 D0316412 4584D…

激光线检测算法的FPGA实现

激光线检测算法的FPGA实现 1. 常见的激光线检测算法 激光线检测中常用的三种算法 MAX&#xff08;最大值法&#xff09;、THRESH&#xff08;阈值法&#xff09;、COG&#xff08;灰度重心法&#xff09; 分别具有以下特点和工作原理&#xff1a; 1.1 MAX&#xff08;最大值法…