From eb19ec9caa1ec7117dcb48d4a5fa6a990abda8d1 Mon Sep 17 00:00:00 2001
From: pjj123 <1514193827@qq.com>
Date: Tue, 26 Nov 2024 19:00:16 +0800
Subject: [PATCH] back_online_pjj
---
.gitignore | 52 +++++---
pom.xml | 82 ++++++++++++
.../com/shanzhu/oe/BackendApplication.java | 28 ++++
src/main/java/com/shanzhu/oe/common/R.java | 33 +++++
.../shanzhu/oe/config/LoginInterceptor.java | 32 +++++
.../java/com/shanzhu/oe/config/MvcConfig.java | 56 ++++++++
.../shanzhu/oe/config/MybatisPlusConfig.java | 30 +++++
.../oe/controller/AdminController.java | 92 +++++++++++++
.../oe/controller/AnswerController.java | 66 ++++++++++
.../oe/controller/ExamManageController.java | 112 ++++++++++++++++
.../oe/controller/FillQuestionController.java | 65 +++++++++
.../shanzhu/oe/controller/ItemController.java | 97 ++++++++++++++
.../controller/JudgeQuestionController.java | 65 +++++++++
.../oe/controller/LoginController.java | 101 ++++++++++++++
.../oe/controller/MessageController.java | 77 +++++++++++
.../controller/MultiQuestionController.java | 66 ++++++++++
.../oe/controller/PaperController.java | 101 ++++++++++++++
.../oe/controller/ReplayController.java | 50 +++++++
.../oe/controller/ScoreController.java | 98 ++++++++++++++
.../oe/controller/StudentController.java | 124 ++++++++++++++++++
.../oe/controller/TeacherController.java | 82 ++++++++++++
.../java/com/shanzhu/oe/entity/Admin.java | 54 ++++++++
.../com/shanzhu/oe/entity/ExamManage.java | 79 +++++++++++
.../com/shanzhu/oe/entity/FillQuestion.java | 54 ++++++++
.../com/shanzhu/oe/entity/JudgeQuestion.java | 54 ++++++++
.../java/com/shanzhu/oe/entity/Login.java | 24 ++++
.../java/com/shanzhu/oe/entity/Message.java | 50 +++++++
.../com/shanzhu/oe/entity/MultiQuestion.java | 74 +++++++++++
.../com/shanzhu/oe/entity/PaperManage.java | 33 +++++
.../java/com/shanzhu/oe/entity/Replay.java | 38 ++++++
.../java/com/shanzhu/oe/entity/Score.java | 55 ++++++++
.../java/com/shanzhu/oe/entity/Student.java | 73 +++++++++++
.../java/com/shanzhu/oe/entity/Teacher.java | 64 +++++++++
.../com/shanzhu/oe/mapper/AdminMapper.java | 63 +++++++++
.../com/shanzhu/oe/mapper/AnswerMapper.java | 63 +++++++++
.../shanzhu/oe/mapper/ExamManageMapper.java | 57 ++++++++
.../shanzhu/oe/mapper/FillQuestionMapper.java | 65 +++++++++
.../oe/mapper/JudgeQuestionMapper.java | 62 +++++++++
.../com/shanzhu/oe/mapper/LoginMapper.java | 51 +++++++
.../com/shanzhu/oe/mapper/MessageMapper.java | 72 ++++++++++
.../oe/mapper/MultiQuestionMapper.java | 68 ++++++++++
.../com/shanzhu/oe/mapper/PaperMapper.java | 45 +++++++
.../com/shanzhu/oe/mapper/ReplayMapper.java | 54 ++++++++
.../com/shanzhu/oe/mapper/ScoreMapper.java | 58 ++++++++
.../com/shanzhu/oe/mapper/StudentMapper.java | 88 +++++++++++++
.../com/shanzhu/oe/mapper/TeacherMapper.java | 65 +++++++++
.../com/shanzhu/oe/service/AdminService.java | 63 +++++++++
.../com/shanzhu/oe/service/AnswerService.java | 35 +++++
.../shanzhu/oe/service/ExamManageService.java | 69 ++++++++++
.../oe/service/FillQuestionService.java | 55 ++++++++
.../oe/service/JudgeQuestionService.java | 54 ++++++++
.../com/shanzhu/oe/service/LoginService.java | 41 ++++++
.../shanzhu/oe/service/MessageService.java | 55 ++++++++
.../oe/service/MultiQuestionService.java | 54 ++++++++
.../com/shanzhu/oe/service/PaperService.java | 46 +++++++
.../com/shanzhu/oe/service/ReplayService.java | 46 +++++++
.../com/shanzhu/oe/service/ScoreService.java | 56 ++++++++
.../shanzhu/oe/service/StudentService.java | 72 ++++++++++
.../shanzhu/oe/service/TeacherService.java | 58 ++++++++
.../oe/serviceimpl/AdminServiceImpl.java | 98 ++++++++++++++
.../oe/serviceimpl/AnswerServiceImpl.java | 65 +++++++++
.../oe/serviceimpl/ExamManageServiceImpl.java | 117 +++++++++++++++++
.../serviceimpl/FillQuestionServiceImpl.java | 77 +++++++++++
.../serviceimpl/JudgeQuestionServiceImpl.java | 77 +++++++++++
.../oe/serviceimpl/LoginServiceImpl.java | 58 ++++++++
.../oe/serviceimpl/MessageServiceImpl.java | 78 +++++++++++
.../serviceimpl/MultiQuestionServiceImpl.java | 77 +++++++++++
.../oe/serviceimpl/PaperServiceImpl.java | 80 +++++++++++
.../oe/serviceimpl/ReplayServiceImpl.java | 66 ++++++++++
.../oe/serviceimpl/ScoreServiceImpl.java | 80 +++++++++++
.../oe/serviceimpl/StudentServiceImpl.java | 103 +++++++++++++++
.../oe/serviceimpl/TeacherServiceImpl.java | 86 ++++++++++++
.../com/shanzhu/oe/util/ApiResultHandler.java | 33 +++++
src/main/java/com/shanzhu/oe/vo/AnswerVO.java | 51 +++++++
src/main/java/com/shanzhu/oe/vo/Item.java | 39 ++++++
.../java/com/shanzhu/oe/vo/QuestionVO.java | 37 ++++++
src/main/resources/application.yml | 31 +++++
src/main/resources/banner.txt | 8 ++
78 files changed, 4917 insertions(+), 20 deletions(-)
create mode 100644 pom.xml
create mode 100644 src/main/java/com/shanzhu/oe/BackendApplication.java
create mode 100644 src/main/java/com/shanzhu/oe/common/R.java
create mode 100644 src/main/java/com/shanzhu/oe/config/LoginInterceptor.java
create mode 100644 src/main/java/com/shanzhu/oe/config/MvcConfig.java
create mode 100644 src/main/java/com/shanzhu/oe/config/MybatisPlusConfig.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/AdminController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/AnswerController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/ExamManageController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/FillQuestionController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/ItemController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/JudgeQuestionController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/LoginController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/MessageController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/MultiQuestionController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/PaperController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/ReplayController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/ScoreController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/StudentController.java
create mode 100644 src/main/java/com/shanzhu/oe/controller/TeacherController.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/Admin.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/ExamManage.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/FillQuestion.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/JudgeQuestion.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/Login.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/Message.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/MultiQuestion.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/PaperManage.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/Replay.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/Score.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/Student.java
create mode 100644 src/main/java/com/shanzhu/oe/entity/Teacher.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/AdminMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/AnswerMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/ExamManageMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/FillQuestionMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/JudgeQuestionMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/LoginMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/MessageMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/MultiQuestionMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/PaperMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/ReplayMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/ScoreMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/StudentMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/mapper/TeacherMapper.java
create mode 100644 src/main/java/com/shanzhu/oe/service/AdminService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/AnswerService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/ExamManageService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/FillQuestionService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/JudgeQuestionService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/LoginService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/MessageService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/MultiQuestionService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/PaperService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/ReplayService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/ScoreService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/StudentService.java
create mode 100644 src/main/java/com/shanzhu/oe/service/TeacherService.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/AdminServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/AnswerServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/ExamManageServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/FillQuestionServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/JudgeQuestionServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/LoginServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/MessageServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/MultiQuestionServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/PaperServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/ReplayServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/ScoreServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/StudentServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/serviceimpl/TeacherServiceImpl.java
create mode 100644 src/main/java/com/shanzhu/oe/util/ApiResultHandler.java
create mode 100644 src/main/java/com/shanzhu/oe/vo/AnswerVO.java
create mode 100644 src/main/java/com/shanzhu/oe/vo/Item.java
create mode 100644 src/main/java/com/shanzhu/oe/vo/QuestionVO.java
create mode 100644 src/main/resources/application.yml
create mode 100644 src/main/resources/banner.txt
diff --git a/.gitignore b/.gitignore
index 3dfac44..24062a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,25 +1,37 @@
-.DS_Store
-node_modules
-/dist
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target
+/.mvn/
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
-# local env files
-.env.local
-.env.*.local
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+*.log
+*.jar
-# Log files
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
-# Editor directories and files`
- `
-.idea
-.vscode
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
+### VS Code ###
+.vscode/
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..0b03e77
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,82 @@
+
+
+ 4.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.2.RELEASE
+
+
+
+ com.shanzhu
+ OnlineExam-backend
+ 0.0.1-SNAPSHOT
+ OnlineExam-backend
+ 在线考试系统
+
+
+ 1.8
+
+
+
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.5.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ mysql
+ mysql-connector-java
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ com.alibaba
+ druid
+ 1.1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
+
+ org.springframework
+ spring-tx
+ 4.3.9.RELEASE
+
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.10
+ provided
+
+
+
+
diff --git a/src/main/java/com/shanzhu/oe/BackendApplication.java b/src/main/java/com/shanzhu/oe/BackendApplication.java
new file mode 100644
index 0000000..27b3b26
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/BackendApplication.java
@@ -0,0 +1,28 @@
+package com.shanzhu.oe;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+/**
+ * SpringBoot 启动类
+ * 项目启动入口(点击右键 选择 "BackendApplication" 启动项目)
+ * 什么是SpringBoot?(https://www.php.cn/faq/498384.html)
+ * @author: ShanZhu
+ * @date: 2023-11-10
+ *
+ *
+ *
+ *
+ */
+@Slf4j
+@SpringBootApplication
+public class BackendApplication {
+
+ public static void main(String[] args) {
+ //SpringBoot 执行启动
+ SpringApplication.run(BackendApplication.class, args);
+
+ log.info("=====================项目后端启动成功============================");
+ }
+
+}
diff --git a/src/main/java/com/shanzhu/oe/common/R.java b/src/main/java/com/shanzhu/oe/common/R.java
new file mode 100644
index 0000000..31107ea
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/common/R.java
@@ -0,0 +1,33 @@
+package com.shanzhu.oe.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 接口返回对象包装类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class R {
+
+ /**
+ * 错误码
+ */
+ private int code;
+
+ /**
+ * 错误消息
+ */
+ private String message;
+
+ /**
+ * 结果数据
+ */
+ private T data;
+
+}
diff --git a/src/main/java/com/shanzhu/oe/config/LoginInterceptor.java b/src/main/java/com/shanzhu/oe/config/LoginInterceptor.java
new file mode 100644
index 0000000..7087c62
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/config/LoginInterceptor.java
@@ -0,0 +1,32 @@
+package com.shanzhu.oe.config;
+
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 登录检查
+ * 1.配置到拦截器要拦截哪些请求
+ * 2.把这些配置放在容器中
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public class LoginInterceptor implements HandlerInterceptor {
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+ if (request.getCookies() == null) {
+ return false;
+ }
+ for (Cookie cookie : request.getCookies()) {
+ if ("rb_token".equals(cookie.getName()) && cookie.getValue() != null && !cookie.getValue().equals("")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/shanzhu/oe/config/MvcConfig.java b/src/main/java/com/shanzhu/oe/config/MvcConfig.java
new file mode 100644
index 0000000..b509f6e
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/config/MvcConfig.java
@@ -0,0 +1,56 @@
+package com.shanzhu.oe.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * SpringMvc 配置
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Configuration
+public class MvcConfig implements WebMvcConfigurer {
+
+ /**
+ * 配置拦截器
+ *
+ * @param registry 相当于拦截器的注册中心
+ */
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new LoginInterceptor())
+ .addPathPatterns()
+ .excludePathPatterns("/login");
+ }
+
+
+ /**
+ * 跨域配置
+ *
+ * @return 跨域
+ */
+ @Bean
+ public CorsFilter corsFilter() {
+ // 1.创建 CORS 配置对象
+ CorsConfiguration config = new CorsConfiguration();
+ // 支持域
+ config.addAllowedOrigin("*");
+ // 是否发送 Cookie
+ config.setAllowCredentials(true);
+ // 支持请求方式
+ config.addAllowedMethod("*");
+ // 允许的原始请求头部信息
+ config.addAllowedHeader("*");
+ // 2.添加地址映射
+ UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
+ corsConfigurationSource.registerCorsConfiguration("/**", config);
+ // 3.返回 CorsFilter 对象
+ return new CorsFilter(corsConfigurationSource);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/config/MybatisPlusConfig.java b/src/main/java/com/shanzhu/oe/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..c7b7c81
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/config/MybatisPlusConfig.java
@@ -0,0 +1,30 @@
+package com.shanzhu.oe.config;
+
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Mybatis - plus 配置
+ *
+ * 什么是MybatisPlus? (https://blog.csdn.net/qq_52922453/article/details/127196313)
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-10
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+ /**
+ * 分页插件配置
+ *
+ * @return MybatisPlusInterceptor
+ */
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+ return interceptor;
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/AdminController.java b/src/main/java/com/shanzhu/oe/controller/AdminController.java
new file mode 100644
index 0000000..74d858f
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/AdminController.java
@@ -0,0 +1,92 @@
+package com.shanzhu.oe.controller;
+
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.Admin;
+import com.shanzhu.oe.service.AdminService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 管理员 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class AdminController {
+
+ private final AdminService adminService;
+
+ /**
+ * 查询所有管理员
+ *
+ * @return 管理员列表
+ */
+ @GetMapping("/admins")
+ public R> findAll(){
+ return ApiResultHandler.success(adminService.findAll());
+ }
+
+ /**
+ * 通过管理员id查询
+ *
+ * @param adminId 管理员id
+ * @return 管理员
+ */
+ @GetMapping("/admin/{adminId}")
+ public R findById(@PathVariable("adminId") Integer adminId){
+ return ApiResultHandler.success(adminService.findById(adminId));
+ }
+
+ /**
+ * 通过管理员id删除
+ *
+ * @param adminId 管理员id
+ * @return 结果
+ */
+ @DeleteMapping("/admin/{adminId}")
+ public R deleteById(@PathVariable("adminId") Integer adminId){
+ adminService.deleteById(adminId);
+ return ApiResultHandler.success();
+ }
+
+ /**
+ * 更新管理员
+ *
+ * @param adminId 管理员id
+ * @param admin 管理员信息
+ * @return 结果
+ */
+ @PutMapping("/admin/{adminId}")
+ public R update(@PathVariable("adminId") Integer adminId, Admin admin){
+ return ApiResultHandler.success(adminService.update(admin));
+ }
+
+ /**
+ * 添加管理员
+ *
+ * @param admin 管理员信息
+ * @return 结果
+ */
+ @PostMapping("/admin")
+ public R add(Admin admin){
+ return ApiResultHandler.success(adminService.add(admin));
+ }
+
+ /**
+ * 更新密码
+ *
+ * @param adminId 管理员id
+ * @param newPsw 新密码
+ * @param oldPsw 旧密码
+ * @return 结果
+ */
+ @GetMapping("/admin/resetPsw/{adminId}/{oldPsw}/{newPsw}")
+ public R resetPsw(@PathVariable("adminId") Integer adminId, @PathVariable("newPsw") String newPsw, @PathVariable("oldPsw") String oldPsw) {
+ return ApiResultHandler.success(adminService.resetPsw(adminId, newPsw, oldPsw));
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/AnswerController.java b/src/main/java/com/shanzhu/oe/controller/AnswerController.java
new file mode 100644
index 0000000..982f1b0
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/AnswerController.java
@@ -0,0 +1,66 @@
+package com.shanzhu.oe.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.service.AnswerService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import com.shanzhu.oe.vo.AnswerVO;
+import com.shanzhu.oe.vo.QuestionVO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 题库 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class AnswerController {
+
+ private final AnswerService answerService;
+
+ /**
+ * 查询题库 分页
+ *
+ * @param page 分页页数
+ * @param size 分页大小
+ * @param subject 学科
+ * @param section 章节
+ * @param question 问题
+ * @return 题目
+ */
+ @GetMapping("/answers/{page}/{size}/{subject}/{section}/{question}")
+ public R > findAllQuestion(
+ @PathVariable("page") Integer page,
+ @PathVariable("size") Integer size,
+ @PathVariable("subject") String subject,
+ @PathVariable("section") String section,
+ @PathVariable("question") String question
+ ){
+ IPage answerVOIPage = answerService.findAll(new Page<>(page,size), subject, section, question);
+ return ApiResultHandler.buildApiResult(200,"查询所有题库", answerVOIPage);
+ }
+
+ /**
+ * 根据类型和id获取题目
+ *
+ * @param type 类型
+ * @param questionId 题目id
+ * @return 题目信息
+ */
+ @GetMapping("/answers/{type}/{questionId}")
+ public R findByIdAndType(
+ @PathVariable("type") String type,
+ @PathVariable("questionId") Long questionId
+ ) {
+ QuestionVO questionVO = answerService.findByIdAndType(type, questionId);
+ return ApiResultHandler.buildApiResult(200, "查询题目", questionVO);
+ }
+
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/ExamManageController.java b/src/main/java/com/shanzhu/oe/controller/ExamManageController.java
new file mode 100644
index 0000000..e699b8f
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/ExamManageController.java
@@ -0,0 +1,112 @@
+package com.shanzhu.oe.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.ExamManage;
+import com.shanzhu.oe.service.ExamManageService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 考试管理 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class ExamManageController {
+
+ private final ExamManageService examManageService;
+
+ /**
+ * 查询所有考试
+ *
+ * @return 考试列表
+ */
+ @GetMapping("/exams")
+ public R> findAll() {
+ return ApiResultHandler.buildApiResult(200, "请求成功!", examManageService.findAll());
+ }
+
+ /**
+ * 查询考试 分页
+ *
+ * @param page 分页页数
+ * @param size 分页大小
+ * @return 考试列表
+ */
+ @GetMapping("/exams/{page}/{size}")
+ public R> findAll(@PathVariable("page") Integer page, @PathVariable("size") Integer size) {
+ return ApiResultHandler.buildApiResult(200, "请求成功!", examManageService.findAll(new Page<>(page, size)));
+ }
+
+ /**
+ * 根据考试编号查询考试信息
+ *
+ * @param examCode 考试编号
+ * @return 考试信息
+ */
+ @GetMapping("/exam/{examCode}")
+ public R findById(@PathVariable("examCode") Integer examCode) {
+ ExamManage res = examManageService.findById(examCode);
+ if (res == null) {
+ return ApiResultHandler.buildApiResult(10000, "考试编号不存在", null);
+ }
+ return ApiResultHandler.buildApiResult(200, "请求成功!", res);
+ }
+
+ /**
+ * 根据考试编号删除
+ *
+ * @param examCode 考试编号
+ */
+ @DeleteMapping("/exam/{examCode}")
+ public R deleteById(@PathVariable("examCode") Integer examCode) {
+ return ApiResultHandler.buildApiResult(200, "删除成功", examManageService.delete(examCode));
+ }
+
+ /**
+ * 根据考试编号更新
+ *
+ * @param examManage 考试信息
+ */
+ @PutMapping("/exam")
+ public R update(@RequestBody ExamManage examManage) {
+ return ApiResultHandler.buildApiResult(200, "更新成功", examManageService.update(examManage));
+ }
+
+ /**
+ * 添加考试信息
+ *
+ * @param examManage 考试信息
+ */
+ @PostMapping("/exam")
+ public R add(@RequestBody ExamManage examManage) {
+ int res = examManageService.add(examManage);
+ if (res == 1) {
+ return ApiResultHandler.buildApiResult(200, "添加成功", res);
+ } else {
+ return ApiResultHandler.buildApiResult(400, "添加失败", res);
+ }
+ }
+
+ /**
+ * 查询最后一条记录的paperId,返回给前端达到自增效果
+ *
+ * @return 最后一条记录
+ */
+ @GetMapping("/examManagePaperId")
+ public R findOnlyPaperId() {
+ ExamManage res = examManageService.findOnlyPaperId();
+ if (res != null) {
+ return ApiResultHandler.buildApiResult(200, "请求成功", res);
+ }
+
+ return ApiResultHandler.buildApiResult(400, "请求失败", res);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/FillQuestionController.java b/src/main/java/com/shanzhu/oe/controller/FillQuestionController.java
new file mode 100644
index 0000000..2cae08a
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/FillQuestionController.java
@@ -0,0 +1,65 @@
+package com.shanzhu.oe.controller;
+
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.FillQuestion;
+import com.shanzhu.oe.service.FillQuestionService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 填空题 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class FillQuestionController {
+
+ private final FillQuestionService fillQuestionService;
+
+ /**
+ * 添加填空题
+ *
+ * @param fillQuestion 填空题内容
+ * @return 结果
+ */
+ @PostMapping("/fillQuestion")
+ public R add(@RequestBody FillQuestion fillQuestion) {
+ int res = fillQuestionService.add(fillQuestion);
+ if (res != 0) {
+ return ApiResultHandler.buildApiResult(200, "添加成功", res);
+ }
+ return ApiResultHandler.buildApiResult(400, "添加失败", res);
+ }
+
+ /**
+ * 查询最后一条填空题
+ *
+ * @return 最后一条填空题
+ */
+ @GetMapping("/fillQuestionId")
+ public R findOnlyQuestionId() {
+ FillQuestion res = fillQuestionService.findOnlyQuestionId();
+ return ApiResultHandler.buildApiResult(200, "查询成功", res);
+ }
+
+ /**
+ * 编辑填空题
+ *
+ * @param fillQuestion 填空题内容
+ * @return 结果
+ */
+ @PostMapping("/editFillQuestion")
+ public R edit(@RequestBody FillQuestion fillQuestion) {
+ int res = fillQuestionService.edit(fillQuestion);
+ if (res != 0) {
+ return ApiResultHandler.buildApiResult(200, "修改成功", res);
+ }
+ return ApiResultHandler.buildApiResult(400, "修改失败", res);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/ItemController.java b/src/main/java/com/shanzhu/oe/controller/ItemController.java
new file mode 100644
index 0000000..9b697da
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/ItemController.java
@@ -0,0 +1,97 @@
+package com.shanzhu.oe.controller;
+
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.PaperManage;
+import com.shanzhu.oe.service.FillQuestionService;
+import com.shanzhu.oe.service.JudgeQuestionService;
+import com.shanzhu.oe.service.MultiQuestionService;
+import com.shanzhu.oe.service.PaperService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import com.shanzhu.oe.vo.Item;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 组卷 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class ItemController {
+
+ private final MultiQuestionService multiQuestionService;
+
+ private final FillQuestionService fillQuestionService;
+
+ private final JudgeQuestionService judgeQuestionService;
+
+ private final PaperService paperService;
+
+ /**
+ * 组卷
+ *
+ * @param item 题目模型
+ * @return 结果
+ */
+ @PostMapping("/item")
+ public R ItemController(@RequestBody Item item) {
+ // 选择题
+ Integer changeNumber = item.getChangeNumber();
+ // 填空题
+ Integer fillNumber = item.getFillNumber();
+ // 判断题
+ Integer judgeNumber = item.getJudgeNumber();
+ //出卷id
+ Integer paperId = item.getPaperId();
+
+ // 数据库获取数据
+ List changeNumbers = multiQuestionService.findBySubject(item.getSubject(), changeNumber);
+ List fills = fillQuestionService.findBySubject(item.getSubject(), fillNumber);
+ List judges = judgeQuestionService.findBySubject(item.getSubject(), judgeNumber);
+
+ if (changeNumbers == null || changeNumbers.size() != changeNumber) {
+ return ApiResultHandler.buildApiResult(400,
+ "科目【" + item.getSubject() + "】题库【选择题】题目数量不足【" + changeNumber + "】,组卷失败", null);
+ }
+ if (fills == null || fills.size() != fillNumber) {
+ return ApiResultHandler.buildApiResult(400, "科目【" + item.getSubject() + "】题库【填空题】题目数量不足【" + fillNumber +
+ "】,组卷失败", null);
+ }
+ if (judges == null || judges.size() != judgeNumber) {
+ return ApiResultHandler.buildApiResult(400,
+ "科目【" + item.getSubject() + "】题库【判断题】题目数量不足【" + judgeNumber + "】,组卷失败", null);
+ }
+
+ // 符合组题条件,执行组题
+ // 选择题
+ for (Integer number : changeNumbers) {
+ PaperManage paperManage = new PaperManage(paperId, 1, number);
+ int index = paperService.add(paperManage);
+ if (index == 0)
+ return ApiResultHandler.buildApiResult(400, "选择题组卷保存失败", null);
+ }
+
+ // 填空题
+ for (Integer fillNum : fills) {
+ PaperManage paperManage = new PaperManage(paperId, 2, fillNum);
+ int index = paperService.add(paperManage);
+ if (index == 0)
+ return ApiResultHandler.buildApiResult(400, "填空题题组卷保存失败", null);
+ }
+ // 判断题
+ for (Integer judge : judges) {
+ PaperManage paperManage = new PaperManage(paperId, 3, judge);
+ int index = paperService.add(paperManage);
+ if (index == 0)
+ return ApiResultHandler.buildApiResult(400, "判断题题组卷保存失败", null);
+ }
+
+ return ApiResultHandler.buildApiResult(200, "试卷组卷成功", null);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/JudgeQuestionController.java b/src/main/java/com/shanzhu/oe/controller/JudgeQuestionController.java
new file mode 100644
index 0000000..133deaf
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/JudgeQuestionController.java
@@ -0,0 +1,65 @@
+package com.shanzhu.oe.controller;
+
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.JudgeQuestion;
+import com.shanzhu.oe.service.JudgeQuestionService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 判断题 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class JudgeQuestionController {
+
+ private final JudgeQuestionService judgeQuestionService;
+
+ /**
+ * 添加判断题
+ *
+ * @param judgeQuestion 判断题信息
+ * @return 结果
+ */
+ @PostMapping("/judgeQuestion")
+ public R add(@RequestBody JudgeQuestion judgeQuestion) {
+ int res = judgeQuestionService.add(judgeQuestion);
+ if (res != 0) {
+ return ApiResultHandler.buildApiResult(200,"添加成功",res);
+ }
+ return ApiResultHandler.buildApiResult(400,"添加失败",res);
+ }
+
+ /**
+ * 查询最后一个判断题id
+ *
+ * @return 最后一个判断题
+ */
+ @GetMapping("/judgeQuestionId")
+ public R findOnlyQuestionId() {
+ JudgeQuestion res = judgeQuestionService.findOnlyQuestionId();
+ return ApiResultHandler.buildApiResult(200,"查询成功",res);
+ }
+
+ /**
+ * 编辑判断题
+ *
+ * @param judgeQuestion 判断题
+ * @return 结果
+ */
+ @PostMapping("/editJudgeQuestion")
+ public R edit(@RequestBody JudgeQuestion judgeQuestion) {
+ int res = judgeQuestionService.edit(judgeQuestion);
+ if (res != 0) {
+ return ApiResultHandler.buildApiResult(200,"修改成功",res);
+ }
+ return ApiResultHandler.buildApiResult(400,"修改失败",res);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/LoginController.java b/src/main/java/com/shanzhu/oe/controller/LoginController.java
new file mode 100644
index 0000000..13a1554
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/LoginController.java
@@ -0,0 +1,101 @@
+package com.shanzhu.oe.controller;
+
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.Admin;
+import com.shanzhu.oe.entity.Login;
+import com.shanzhu.oe.entity.Student;
+import com.shanzhu.oe.entity.Teacher;
+import com.shanzhu.oe.service.LoginService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 用户登录 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class LoginController {
+
+ private final LoginService loginService;
+
+ /**
+ * 用户登录
+ *
+ * @param login 用户信息
+ * @param response http response
+ * @return 登录用户信息
+ */
+ @PostMapping("/login")
+ public R login(@RequestBody Login login, HttpServletResponse response) {
+ Integer username = login.getUsername();
+ String password = login.getPassword();
+
+ //登录管理员
+ Admin adminRes = loginService.adminLogin(username, password);
+ if (adminRes != null) {
+ Cookie token = new Cookie("rb_token", adminRes.getCardId());
+ token.setPath("/");
+ Cookie role = new Cookie("rb_role", "0");
+ role.setPath("/");
+
+ //将cookie对象加入response响应
+ response.addCookie(token);
+ response.addCookie(role);
+
+ return ApiResultHandler.buildApiResult(200, "请求成功", adminRes);
+ }
+
+ //登录教师
+ Teacher teacherRes = loginService.teacherLogin(username, password);
+ if (teacherRes != null) {
+ Cookie token = new Cookie("rb_token", teacherRes.getCardId());
+ token.setPath("/");
+ Cookie role = new Cookie("rb_role", "1");
+ role.setPath("/");
+ response.addCookie(token);
+ response.addCookie(role);
+ return ApiResultHandler.buildApiResult(200, "请求成功", teacherRes);
+ }
+
+ //登录选
+ Student studentRes = loginService.studentLogin(username, password);
+ if (studentRes != null) {
+ Cookie token = new Cookie("rb_token", studentRes.getCardId());
+ token.setPath("/");
+ Cookie role = new Cookie("rb_role", "2");
+ role.setPath("/");
+ response.addCookie(token);
+ response.addCookie(role);
+ return ApiResultHandler.buildApiResult(200, "请求成功", studentRes);
+ }
+
+ return ApiResultHandler.buildApiResult(400, "请求失败", null);
+ }
+
+ /**
+ * 登出
+ *
+ * @param response http response
+ */
+ @PostMapping("/logout")
+ public void logout(HttpServletResponse response) {
+ //清楚cookie里的token信息
+ Cookie token = new Cookie("rb_token", null);
+ token.setPath("/");
+ token.setMaxAge(0);
+ Cookie role = new Cookie("rb_role", null);
+ role.setPath("/");
+ role.setMaxAge(0);
+ response.addCookie(token);
+ response.addCookie(role);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/MessageController.java b/src/main/java/com/shanzhu/oe/controller/MessageController.java
new file mode 100644
index 0000000..e5d8f03
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/MessageController.java
@@ -0,0 +1,77 @@
+package com.shanzhu.oe.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.Message;
+import com.shanzhu.oe.service.MessageService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 留言 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class MessageController {
+
+ private final MessageService messageService;
+
+ /**
+ * 留言查询 分页
+ *
+ * @param page 分页页数
+ * @param size 分页大小
+ * @return 留言数据
+ */
+ @GetMapping("/messages/{page}/{size}")
+ public R> findAll(@PathVariable("page") Integer page, @PathVariable("size") Integer size) {
+ Page messagePage = new Page<>(page, size);
+ IPage all = messageService.findPage(messagePage);
+ return ApiResultHandler.buildApiResult(200, "查询所有留言", all);
+ }
+
+ /**
+ * 通过id查询留言
+ *
+ * @param id 留言id
+ * @return 留言内容
+ */
+ @GetMapping("/message/{id}")
+ public R findById(@PathVariable("id") Integer id) {
+ Message res = messageService.findById(id);
+ return ApiResultHandler.buildApiResult(200, "根据Id查询", res);
+ }
+
+ /**
+ * 删除留言
+ *
+ * @param id 留言id
+ * @return 删除成功数量
+ */
+ @DeleteMapping("/message/{id}")
+ public Integer delete(@PathVariable("id") Integer id) {
+ return messageService.delete(id);
+ }
+
+ /**
+ * 添加留言
+ *
+ * @param message 留言信息
+ * @return 结果
+ */
+ @PostMapping("/message")
+ public R add(@RequestBody Message message) {
+ Integer res = messageService.add(message);
+ if (res == 0) {
+ return ApiResultHandler.buildApiResult(400, "添加失败", res);
+ } else {
+ return ApiResultHandler.buildApiResult(200, "添加成功", res);
+ }
+ }
+
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/MultiQuestionController.java b/src/main/java/com/shanzhu/oe/controller/MultiQuestionController.java
new file mode 100644
index 0000000..a6c868a
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/MultiQuestionController.java
@@ -0,0 +1,66 @@
+package com.shanzhu.oe.controller;
+
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.MultiQuestion;
+import com.shanzhu.oe.service.MultiQuestionService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 选择题 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class MultiQuestionController {
+
+ private final MultiQuestionService multiQuestionService;
+
+ /**
+ * 通过id查询选择题
+ *
+ * @return 选择题
+ */
+ @GetMapping("/multiQuestionId")
+ public R findOnlyQuestion() {
+ MultiQuestion res = multiQuestionService.findOnlyQuestionId();
+ return ApiResultHandler.buildApiResult(200,"查询成功",res);
+ }
+
+ /**
+ * 添加选择题
+ *
+ * @param multiQuestion 选择题信息
+ * @return 结果
+ */
+ @PostMapping("/MultiQuestion")
+ public R add(@RequestBody MultiQuestion multiQuestion) {
+ Integer res = multiQuestionService.add(multiQuestion);
+ if (res != 0) {
+ return ApiResultHandler.buildApiResult(200,"添加成功",res);
+ }
+ return ApiResultHandler.buildApiResult(400,"添加失败",res);
+ }
+
+ /**
+ * 编辑选择题
+ *
+ * @param multiQuestion 选择题信息
+ * @return 结果
+ */
+ @PostMapping("/editMultiQuestion")
+ public R edit(@RequestBody MultiQuestion multiQuestion) {
+ Integer res = multiQuestionService.edit(multiQuestion);
+ if (res != 0) {
+ return ApiResultHandler.buildApiResult(200,"修改成功",res);
+ }
+ return ApiResultHandler.buildApiResult(400,"修改失败",res);
+ }
+
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/PaperController.java b/src/main/java/com/shanzhu/oe/controller/PaperController.java
new file mode 100644
index 0000000..55cc805
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/PaperController.java
@@ -0,0 +1,101 @@
+package com.shanzhu.oe.controller;
+
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.FillQuestion;
+import com.shanzhu.oe.entity.JudgeQuestion;
+import com.shanzhu.oe.entity.MultiQuestion;
+import com.shanzhu.oe.entity.PaperManage;
+import com.shanzhu.oe.serviceimpl.FillQuestionServiceImpl;
+import com.shanzhu.oe.serviceimpl.JudgeQuestionServiceImpl;
+import com.shanzhu.oe.serviceimpl.MultiQuestionServiceImpl;
+import com.shanzhu.oe.serviceimpl.PaperServiceImpl;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 试卷 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class PaperController {
+
+ private final PaperServiceImpl paperService;
+
+ private final JudgeQuestionServiceImpl judgeQuestionService;
+
+ private final MultiQuestionServiceImpl multiQuestionService;
+
+ private final FillQuestionServiceImpl fillQuestionService;
+
+ /**
+ * 查询所有试卷
+ *
+ * @return 试卷
+ */
+ @GetMapping("/papers")
+ public R> findAll() {
+ return ApiResultHandler.buildApiResult(200, "请求成功", paperService.findAll());
+ }
+
+ /**
+ * 通过试卷id 查询试卷
+ *
+ * @param paperId 试卷id
+ * @return 试卷内容
+ */
+ @GetMapping("/paper/{paperId}")
+ public Map> findById(@PathVariable("paperId") Integer paperId) {
+ //选择题题库 1
+ List multiQuestionRes = multiQuestionService.findByIdAndType(paperId);
+ //填空题题库 2
+ List fillQuestionsRes = fillQuestionService.findByIdAndType(paperId);
+ //判断题题库 3
+ List judgeQuestionRes = judgeQuestionService.findByIdAndType(paperId);
+ Map> questionMap = new HashMap<>();
+ questionMap.put(1, multiQuestionRes);
+ questionMap.put(2, fillQuestionsRes);
+ questionMap.put(3, judgeQuestionRes);
+
+ return questionMap;
+ }
+
+ /**
+ * 添加试卷
+ *
+ * @param paperManage 试卷内容
+ * @return 结果
+ */
+ @PostMapping("/paperManage")
+ public R add(@RequestBody PaperManage paperManage) {
+ int res = paperService.add(paperManage);
+ if (res != 0) {
+ return ApiResultHandler.buildApiResult(200, "添加成功", res);
+ }
+ return ApiResultHandler.buildApiResult(400, "添加失败", res);
+ }
+
+ /**
+ * 删除试卷中的某条试题
+ *
+ * @param paperId 试卷id
+ * @param type 题目类型。1选择,2填空,3判断
+ * @param questionId 题目id
+ */
+ @GetMapping("/paper/delete/{paperId}/{type}/{questionId}")
+ public R delete(
+ @PathVariable("paperId") String paperId,
+ @PathVariable("type") String type,
+ @PathVariable("questionId") String questionId
+ ) {
+ paperService.delete(paperId, type, questionId);
+ return ApiResultHandler.buildApiResult(200, "删除成功", null);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/ReplayController.java b/src/main/java/com/shanzhu/oe/controller/ReplayController.java
new file mode 100644
index 0000000..f8b0251
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/ReplayController.java
@@ -0,0 +1,50 @@
+package com.shanzhu.oe.controller;
+
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.Replay;
+import com.shanzhu.oe.service.ReplayService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 回复 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class ReplayController {
+
+ private final ReplayService replayService;
+
+ /**
+ * 添加回复
+ *
+ * @param replay 回复内容
+ * @return 结果
+ */
+ @PostMapping("/replay")
+ public R add(@RequestBody Replay replay) {
+ int data = replayService.add(replay);
+ if (data != 0) {
+ return ApiResultHandler.buildApiResult(200, "添加成功!", data);
+ } else {
+ return ApiResultHandler.buildApiResult(400, "添加失败!", null);
+ }
+ }
+
+ /**
+ * 通过留言id查询回复
+ *
+ * @param messageId 留言id
+ * @return 回复
+ */
+ @GetMapping("/replay/{messageId}")
+ public R> findAllById(@PathVariable("messageId") Integer messageId) {
+ return ApiResultHandler.buildApiResult(200, "根据messageId查询", replayService.findAllById(messageId));
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/ScoreController.java b/src/main/java/com/shanzhu/oe/controller/ScoreController.java
new file mode 100644
index 0000000..ffeaf3e
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/ScoreController.java
@@ -0,0 +1,98 @@
+package com.shanzhu.oe.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.Score;
+import com.shanzhu.oe.service.ScoreService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 考试成绩 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class ScoreController {
+
+ private final ScoreService scoreService;
+
+ /**
+ * 查询所有考试成绩
+ *
+ * @return 考试成绩
+ */
+ @GetMapping("/scores")
+ public R> findAll() {
+ List res = scoreService.findAll();
+ return ApiResultHandler.buildApiResult(200, "查询所有学生成绩", res);
+ }
+
+ /**
+ * 查询考试成绩 分页
+ *
+ * @param page 分页页数
+ * @param size 分页大学
+ * @param studentId 学生id
+ * @return 考试成绩
+ */
+ @GetMapping("/score/{page}/{size}/{studentId}")
+ public R> findById(
+ @PathVariable("page") Integer page,
+ @PathVariable("size") Integer size,
+ @PathVariable("studentId") Integer studentId
+ ) {
+ IPage res = scoreService.findById(new Page<>(page, size), studentId);
+ return ApiResultHandler.buildApiResult(200, "根据ID查询成绩", res);
+ }
+
+ /**
+ * 查询考试成绩 不分页
+ *
+ * @param studentId 学生id
+ * @return 考试成绩
+ */
+ @GetMapping("/score/{studentId}")
+ public R> findById(@PathVariable("studentId") Integer studentId) {
+ List res = scoreService.findById(studentId);
+ if (!res.isEmpty()) {
+ return ApiResultHandler.buildApiResult(200, "根据ID查询成绩", res);
+ } else {
+ return ApiResultHandler.buildApiResult(400, "ID不存在", res);
+ }
+ }
+
+ /**
+ * 添加学生成绩
+ *
+ * @param score 学生成绩
+ * @return 考试成绩
+ */
+ @PostMapping("/score")
+ public R add(@RequestBody Score score) {
+ int res = scoreService.add(score);
+ if (res == 0) {
+ return ApiResultHandler.buildApiResult(400, "成绩添加失败", res);
+ } else {
+ return ApiResultHandler.buildApiResult(200, "成绩添加成功", res);
+ }
+ }
+
+ /**
+ * 通过考试编号 查询学生成绩
+ *
+ * @param examCode 考试编号
+ * @return 考试成绩
+ */
+ @GetMapping("/scores/{examCode}")
+ public R> findByExamCode(@PathVariable("examCode") Integer examCode) {
+ List scores = scoreService.findByExamCode(examCode);
+ return ApiResultHandler.buildApiResult(200, "查询成功", scores);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/StudentController.java b/src/main/java/com/shanzhu/oe/controller/StudentController.java
new file mode 100644
index 0000000..e2a39f4
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/StudentController.java
@@ -0,0 +1,124 @@
+package com.shanzhu.oe.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.Student;
+import com.shanzhu.oe.service.StudentService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 学生 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class StudentController {
+
+ private final StudentService studentService;
+
+
+ /**
+ * 查询学生 分页
+ *
+ * @param page 分页页数
+ * @param size 分页大学
+ * @param name 学生姓名
+ * @param grade 班级
+ * @param tel 电话
+ * @param institute 学院
+ * @param major 专业
+ * @param clazz 班级
+ * @return 学生列表
+ */
+ @GetMapping("/students/{page}/{size}/{name}/{grade}/{tel}/{institute}/{major}/{clazz}")
+ public R> findAll(
+ @PathVariable Integer page,
+ @PathVariable Integer size,
+ @PathVariable String name,
+ @PathVariable String grade,
+ @PathVariable String tel,
+ @PathVariable String institute,
+ @PathVariable String major,
+ @PathVariable String clazz
+ ) {
+ IPage res = studentService.findAll(
+ new Page<>(page, size), name, grade, tel, institute, major, clazz
+ );
+ return ApiResultHandler.buildApiResult(200, "分页查询所有学生", res);
+ }
+
+ /**
+ * 通过学生id查询学生
+ *
+ * @param studentId 学生id
+ * @return 学生
+ */
+ @GetMapping("/student/{studentId}")
+ public R findById(@PathVariable("studentId") Integer studentId) {
+ Student res = studentService.findById(studentId);
+ if (res != null) {
+ return ApiResultHandler.buildApiResult(200, "请求成功", res);
+ } else {
+ return ApiResultHandler.buildApiResult(404, "查询的用户不存在", null);
+ }
+ }
+
+ /**
+ * 删除学生
+ *
+ * @param studentId 学生id
+ * @return 结果
+ */
+ @DeleteMapping("/student/{studentId}")
+ public R deleteById(@PathVariable("studentId") Integer studentId) {
+ return ApiResultHandler.buildApiResult(200, "删除成功", studentService.deleteById(studentId));
+ }
+
+ /**
+ * 更新学生
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ @PutMapping("/student")
+ public R update(@RequestBody Student student) {
+ int res = studentService.update(student);
+ if (res != 0) {
+ return ApiResultHandler.buildApiResult(200, "更新成功", res);
+ }
+ return ApiResultHandler.buildApiResult(400, "更新失败", res);
+ }
+
+ /**
+ * 添加学生
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ @PostMapping("/student")
+ public R add(@RequestBody Student student) {
+ int res = studentService.add(student);
+ if (res == 1) {
+ return ApiResultHandler.buildApiResult(200, "添加成功", null);
+ } else {
+ return ApiResultHandler.buildApiResult(400, "添加失败", null);
+ }
+ }
+
+ /**
+ * 更新密码
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ @PutMapping("/studentPWD")
+ public R updatePwd(@RequestBody Student student) {
+ studentService.updatePwd(student);
+ return ApiResultHandler.buildApiResult(200, "密码更新成功", null);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/controller/TeacherController.java b/src/main/java/com/shanzhu/oe/controller/TeacherController.java
new file mode 100644
index 0000000..54b1928
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/controller/TeacherController.java
@@ -0,0 +1,82 @@
+package com.shanzhu.oe.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.common.R;
+import com.shanzhu.oe.entity.Teacher;
+import com.shanzhu.oe.service.TeacherService;
+import com.shanzhu.oe.util.ApiResultHandler;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 教师 控制层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@RestController
+@RequiredArgsConstructor
+public class TeacherController {
+
+ private final TeacherService teacherService;
+
+ /**
+ * 查询教师 分页
+ *
+ * @param page 分页页数
+ * @param size 分页大小
+ * @return 教师列表
+ */
+ @GetMapping("/teachers/{page}/{size}")
+ public R> findAll(@PathVariable Integer page, @PathVariable Integer size){
+ Page teacherPage = new Page<>(page,size);
+ IPage teacherIPage = teacherService.findAll(teacherPage);
+
+ return ApiResultHandler.buildApiResult(200,"查询所有教师",teacherIPage);
+ }
+
+ /**
+ * 通过教师id查询
+ *
+ * @param teacherId 教师id
+ * @return 教师
+ */
+ @GetMapping("/teacher/{teacherId}")
+ public R findById(@PathVariable("teacherId") Integer teacherId){
+ return ApiResultHandler.success(teacherService.findById(teacherId));
+ }
+
+ /**
+ * 删除教师
+ *
+ * @param teacherId 教师id
+ * @return 结果
+ */
+ @DeleteMapping("/teacher/{teacherId}")
+ public R deleteById(@PathVariable("teacherId") Integer teacherId){
+ return ApiResultHandler.success(teacherService.deleteById(teacherId));
+ }
+
+ /**
+ * 更新教师
+ *
+ * @param teacher 教师信息
+ * @return 结果
+ */
+ @PutMapping("/teacher")
+ public R update(@RequestBody Teacher teacher){
+ return ApiResultHandler.success(teacherService.update(teacher));
+ }
+
+ /**
+ * 添加教师
+ *
+ * @param teacher 教师信息
+ * @return 结果
+ */
+ @PostMapping("/teacher")
+ public R add(@RequestBody Teacher teacher){
+ return ApiResultHandler.success(teacherService.add(teacher));
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/entity/Admin.java b/src/main/java/com/shanzhu/oe/entity/Admin.java
new file mode 100644
index 0000000..6b11fae
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/Admin.java
@@ -0,0 +1,54 @@
+package com.shanzhu.oe.entity;
+
+import lombok.Data;
+
+/**
+ * 管理员
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class Admin {
+
+ /**
+ * 管理员id
+ */
+ private Integer adminId;
+
+ /**
+ * 管理员名字
+ */
+ private String adminName;
+
+ /**
+ * 性别
+ */
+ private String sex;
+
+ /**
+ * 电话
+ */
+ private String tel;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ /**
+ * 密码
+ */
+ private String pwd;
+
+ /**
+ * 身份证
+ */
+ private String cardId;
+
+ /**
+ * 角色
+ */
+ private String role;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/shanzhu/oe/entity/ExamManage.java b/src/main/java/com/shanzhu/oe/entity/ExamManage.java
new file mode 100644
index 0000000..8363e75
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/ExamManage.java
@@ -0,0 +1,79 @@
+package com.shanzhu.oe.entity;
+
+import lombok.Data;
+
+/**
+ * 考试管理
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class ExamManage {
+
+ /**
+ * 考试编号
+ */
+ private Integer examCode;
+
+ /**
+ * 该次考试介绍
+ */
+ private String description;
+
+ /**
+ * 课程名称
+ */
+ private String source;
+
+ /**
+ * 试卷编号
+ */
+ private Integer paperId;
+
+ /**
+ * 考试日期
+ */
+ private String examDate;
+
+ /**
+ * 持续时长
+ */
+ private Integer totalTime;
+
+ /**
+ * 年级
+ */
+ private String grade;
+
+ /**
+ * 学期
+ */
+ private String term;
+
+ /**
+ * 专业
+ */
+ private String major;
+
+ /**
+ * 学院
+ */
+ private String institute;
+
+ /**
+ * 总分
+ */
+ private Integer totalScore;
+
+ /**
+ * 考试类型
+ */
+ private String type;
+
+ /**
+ * 考生须知
+ */
+ private String tips;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/shanzhu/oe/entity/FillQuestion.java b/src/main/java/com/shanzhu/oe/entity/FillQuestion.java
new file mode 100644
index 0000000..c6cee4d
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/FillQuestion.java
@@ -0,0 +1,54 @@
+package com.shanzhu.oe.entity;
+
+import lombok.Data;
+
+/**
+ * 填空题
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class FillQuestion {
+
+ /**
+ * 试题编号
+ */
+ private Integer questionId;
+
+ /**
+ * 考试科目
+ */
+ private String subject;
+
+ /**
+ * 试题内容
+ */
+ private String question;
+
+ /**
+ * 正确答案
+ */
+ private String answer;
+
+ /**
+ * 分数
+ */
+ private Integer score;
+
+ /**
+ * 难度等级
+ */
+ private String level;
+
+ /**
+ * 难度等级
+ */
+ private String section;
+
+ /**
+ * 题目解析
+ */
+ private String analysis;
+
+}
diff --git a/src/main/java/com/shanzhu/oe/entity/JudgeQuestion.java b/src/main/java/com/shanzhu/oe/entity/JudgeQuestion.java
new file mode 100644
index 0000000..25b4593
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/JudgeQuestion.java
@@ -0,0 +1,54 @@
+package com.shanzhu.oe.entity;
+
+import lombok.Data;
+
+/**
+ * 判断题
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class JudgeQuestion {
+
+ /**
+ * 试题编号
+ */
+ private Integer questionId;
+
+ /**
+ * 考试科目
+ */
+ private String subject;
+
+ /**
+ * 试题内容
+ */
+ private String question;
+
+ /**
+ * 正确答案
+ */
+ private String answer;
+
+ /**
+ * 难度等级
+ */
+ private String level;
+
+ /**
+ * 所属章节
+ */
+ private String section;
+
+ /**
+ * 分数
+ */
+ private Integer score;
+
+ /**
+ * 题目解析
+ */
+ private String analysis;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/shanzhu/oe/entity/Login.java b/src/main/java/com/shanzhu/oe/entity/Login.java
new file mode 100644
index 0000000..15adb37
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/Login.java
@@ -0,0 +1,24 @@
+package com.shanzhu.oe.entity;
+
+import lombok.Data;
+
+/**
+ * 用户登录信息
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class Login {
+
+ /**
+ * 用户名(id)
+ */
+ private Integer username;
+
+ /**
+ * 密码
+ */
+ private String password;
+
+}
diff --git a/src/main/java/com/shanzhu/oe/entity/Message.java b/src/main/java/com/shanzhu/oe/entity/Message.java
new file mode 100644
index 0000000..c033cb2
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/Message.java
@@ -0,0 +1,50 @@
+package com.shanzhu.oe.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 留言
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class Message {
+
+ /**
+ * id主键
+ */
+ private Integer id;
+
+ /**
+ * 解决id为null创建的一个临时id
+ */
+ private Integer temp_id;
+
+ /**
+ * 标题
+ */
+ private String title;
+
+ /**
+ * 留言内容
+ */
+ private String content;
+
+ /**
+ * 留言时间
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8")
+ private Date time;
+
+ /**
+ * 一对多关系,评论信息
+ */
+ List replays;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/shanzhu/oe/entity/MultiQuestion.java b/src/main/java/com/shanzhu/oe/entity/MultiQuestion.java
new file mode 100644
index 0000000..078dcf6
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/MultiQuestion.java
@@ -0,0 +1,74 @@
+package com.shanzhu.oe.entity;
+
+import lombok.Data;
+
+/**
+ * 选择题
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class MultiQuestion {
+
+ /**
+ * 实体编号
+ */
+ private Integer questionId;
+
+ /**
+ * 考试科目
+ */
+ private String subject;
+
+ /**
+ * 所属章节
+ */
+ private String section;
+
+ /**
+ * 选项A
+ */
+ private String answerA;
+
+ /**
+ * 选项B
+ */
+ private String answerB;
+
+ /**
+ * 选项C
+ */
+ private String answerC;
+
+ /**
+ * 选项D
+ */
+ private String answerD;
+
+ /**
+ * 问题
+ */
+ private String question;
+
+ /**
+ * 难度等级
+ */
+ private String level;
+
+ /**
+ * 正确答案
+ */
+ private String rightAnswer;
+
+ /**
+ * 题目解析
+ */
+ private String analysis;
+
+ /**
+ * 分数
+ */
+ private Integer score;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/shanzhu/oe/entity/PaperManage.java b/src/main/java/com/shanzhu/oe/entity/PaperManage.java
new file mode 100644
index 0000000..da6949b
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/PaperManage.java
@@ -0,0 +1,33 @@
+package com.shanzhu.oe.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 试卷
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PaperManage {
+
+ /**
+ * 试卷id
+ */
+ private Integer paperId;
+
+ /**
+ * 题目类型
+ */
+ private Integer questionType;
+
+ /**
+ * 题目编号
+ */
+ private Integer questionId;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/shanzhu/oe/entity/Replay.java b/src/main/java/com/shanzhu/oe/entity/Replay.java
new file mode 100644
index 0000000..a4e339c
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/Replay.java
@@ -0,0 +1,38 @@
+package com.shanzhu.oe.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 回复
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class Replay {
+
+ /**
+ * 留言id
+ */
+ private Integer messageId;
+
+ /**
+ * 回复id
+ */
+ private Integer replayId;
+
+ /**
+ * 回复内容
+ */
+ private String replay;
+
+ /**
+ * 回复时间
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+ private Date replayTime;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/shanzhu/oe/entity/Score.java b/src/main/java/com/shanzhu/oe/entity/Score.java
new file mode 100644
index 0000000..e9999d2
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/Score.java
@@ -0,0 +1,55 @@
+package com.shanzhu.oe.entity;
+
+import lombok.Data;
+
+/**
+ * 考试成绩
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class Score {
+
+ /**
+ * 考试编号
+ */
+ private Integer examCode;
+
+ /**
+ * 学号
+ */
+ private Integer studentId;
+
+ /**
+ * 课程名称
+ */
+ private String subject;
+
+ /**
+ * 平时成绩
+ */
+ private Integer ptScore;
+
+ /**
+ * 期末成绩
+ */
+ private Integer etScore;
+
+ /**
+ * 成绩分数
+ */
+ private Integer score;
+
+ /**
+ * 成绩编号
+ */
+ private Integer scoreId;
+
+ /**
+ * 答题日期
+ */
+ private String answerDate;
+
+}
+
diff --git a/src/main/java/com/shanzhu/oe/entity/Student.java b/src/main/java/com/shanzhu/oe/entity/Student.java
new file mode 100644
index 0000000..6976459
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/Student.java
@@ -0,0 +1,73 @@
+package com.shanzhu.oe.entity;
+
+import lombok.Data;
+
+/**
+ * 学生
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class Student {
+
+ /**
+ * 学生id
+ */
+ private Integer studentId;
+
+ /**
+ * 学生姓名
+ */
+ private String studentName;
+
+ /**
+ * 年级
+ */
+ private String grade;
+
+ /**
+ * 专业
+ */
+ private String major;
+
+ /**
+ * 班级
+ */
+ private String clazz;
+
+ /**
+ * 学院
+ */
+ private String institute;
+
+ /**
+ * 性别
+ */
+ private String sex;
+
+ /**
+ * 电话
+ */
+ private String tel;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ /**
+ * 密码
+ */
+ private String pwd;
+
+ /**
+ * 身份证
+ */
+ private String cardId;
+
+ /**
+ * 角色
+ */
+ private String role;
+}
\ No newline at end of file
diff --git a/src/main/java/com/shanzhu/oe/entity/Teacher.java b/src/main/java/com/shanzhu/oe/entity/Teacher.java
new file mode 100644
index 0000000..3cc0932
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/entity/Teacher.java
@@ -0,0 +1,64 @@
+package com.shanzhu.oe.entity;
+
+import lombok.Data;
+
+/**
+ * 教师
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class Teacher {
+
+ /**
+ * 教师id
+ */
+ private Integer teacherId;
+
+ /**
+ * 教师名字
+ */
+ private String teacherName;
+
+ /**
+ * 学院
+ */
+ private String institute;
+
+ /**
+ * 性别
+ */
+ private String sex;
+
+ /**
+ * 电话
+ */
+ private String tel;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ /**
+ * 密码
+ */
+ private String pwd;
+
+ /**
+ * 身份证
+ */
+ private String cardId;
+
+ /**
+ * 职称
+ */
+ private String type;
+
+ /**
+ * 角色
+ */
+ private String role;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/shanzhu/oe/mapper/AdminMapper.java b/src/main/java/com/shanzhu/oe/mapper/AdminMapper.java
new file mode 100644
index 0000000..d77d170
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/AdminMapper.java
@@ -0,0 +1,63 @@
+package com.shanzhu.oe.mapper;
+
+import com.shanzhu.oe.entity.Admin;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 管理员 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface AdminMapper {
+
+ /**
+ * 查询所有管理员
+ *
+ * @return 管理员
+ */
+ @Select("select adminName,sex,tel,email,cardId,role from admin")
+ List findAll();
+
+ /**
+ * 通过管理员id查询
+ *
+ * @param adminId 管理员id
+ * @return 管理员
+ */
+ @Select("select adminId,adminName,sex,tel,email,cardId,role,pwd from admin where adminId = #{adminId}")
+ Admin findById(Integer adminId);
+
+ /**
+ * 通过管理员id删除
+ *
+ * @param adminId 管理员id
+ * @return 结果
+ */
+ @Delete("delete from admin where adminId = #{adminId}")
+ Integer deleteById(Integer adminId);
+
+ /**
+ * 更新管理员
+ *
+ * @param admin 管理员信息
+ * @return 结果
+ */
+ @Update("update admin set adminName = #{adminName},sex = #{sex}," +
+ "tel = #{tel}, email = #{email},pwd = #{pwd},cardId = #{cardId},role = #{role} where adminId = #{adminId}")
+ Integer update(Admin admin);
+
+ /**
+ * 添加管理员
+ *
+ * @param admin 管理员信息
+ * @return 结果
+ */
+ @Options(useGeneratedKeys = true, keyProperty = "adminId")
+ @Insert("insert into admin(adminName,sex,tel,email,pwd,cardId,role) " +
+ "values(#{adminName},#{sex},#{tel},#{email},#{pwd},#{cardId},#{role})")
+ Integer add(Admin admin);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/AnswerMapper.java b/src/main/java/com/shanzhu/oe/mapper/AnswerMapper.java
new file mode 100644
index 0000000..bc91541
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/AnswerMapper.java
@@ -0,0 +1,63 @@
+package com.shanzhu.oe.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.FillQuestion;
+import com.shanzhu.oe.entity.JudgeQuestion;
+import com.shanzhu.oe.entity.MultiQuestion;
+import com.shanzhu.oe.vo.AnswerVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * 题库 持久
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface AnswerMapper {
+
+ /**
+ * 查询题库 分页
+ *
+ * @param page 分页对象
+ * @param subject 学科
+ * @param section 章节
+ * @param question 问题
+ * @return 题目
+ */
+ @Select("select questionId, question, subject, score, section,level, \"选择题\" as type from multi_question where question like concat('%',#{question},'%') and subject like concat('%',#{subject},'%') and section like concat('%',#{section},'%')" +
+ "union select questionId,question, subject, score, section,level, \"判断题\" as type from judge_question where question like concat('%',#{question},'%') and subject like concat('%',#{subject},'%') and section like concat('%',#{section},'%')" +
+ "union select questionId,question, subject, score, section,level, \"填空题\" as type from fill_question where question like concat('%',#{question},'%') and subject like concat('%',#{subject},'%') and section like concat('%',#{section},'%')")
+ IPage findAll(Page page, @Param("subject") String subject, @Param("section") String section, @Param("question") String question);
+
+
+ /**
+ * 查选择题
+ *
+ * @param questionId 选择题id
+ * @return 选择题
+ */
+ @Select("select questionId, subject, question, answerA, answerB, answerC, answerD, rightAnswer, section, level, analysis from multi_question where questionId = #{questionId}")
+ MultiQuestion findMultiQuestionById(Long questionId);
+
+ /**
+ * 查填空题
+ *
+ * @param questionId 题目id
+ * @return 填空题
+ */
+ @Select("select questionId, subject, question, answer, analysis, level, section from fill_question where questionId = #{questionId}")
+ FillQuestion findFillQuestionById(Long questionId);
+
+ /**
+ * 查判断题
+ *
+ * @param questionId 题目id
+ * @return 判断题
+ */
+ @Select("select questionId, subject, question, answer, analysis, level, section from judge_question where questionId = #{questionId}")
+ JudgeQuestion findJudgeQuestionById(Long questionId);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/ExamManageMapper.java b/src/main/java/com/shanzhu/oe/mapper/ExamManageMapper.java
new file mode 100644
index 0000000..f7a14f3
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/ExamManageMapper.java
@@ -0,0 +1,57 @@
+package com.shanzhu.oe.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.ExamManage;
+import org.apache.ibatis.annotations.*;
+
+/**
+ * 考试管理 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface ExamManageMapper {
+
+ @Select("select * from exam_manage")
+ IPage findAll(Page page);
+
+ /**
+ * 通过考试编号查询
+ *
+ * @param examCode 考试编号
+ * @return 考试信息
+ */
+ @Select("select * from exam_manage where examCode = #{examCode}")
+ ExamManage findById(Integer examCode);
+
+ /**
+ * 根据考试编号删除
+ *
+ * @param examCode 考试编号
+ */
+ @Delete("delete from exam_manage where examCode = #{examCode}")
+ int delete(Integer examCode);
+
+ @Update("update exam_manage set description = #{description},source = #{source},paperId = #{paperId}," +
+ "examDate = #{examDate},totalTime = #{totalTime},grade = #{grade},term = #{term}," +
+ "major = #{major},institute = #{institute},totalScore = #{totalScore}," +
+ "type = #{type},tips = #{tips} where examCode = #{examCode}")
+ int update(ExamManage exammanage);
+
+ @Options(useGeneratedKeys = true, keyProperty = "examCode")
+ @Insert("insert into exam_manage(description,source,paperId,examDate,totalTime,grade,term,major,institute," +
+ "totalScore,type,tips)" +
+ " values(#{description},#{source},#{paperId},#{examDate},#{totalTime},#{grade},#{term},#{major}," +
+ "#{institute},#{totalScore},#{type},#{tips})")
+ int add(ExamManage exammanage);
+
+ /**
+ * 查询最后一条记录的paperId,返回给前端达到自增效果
+ *
+ * @return paperId
+ */
+ @Select("select paperId from exam_manage order by paperId desc limit 1")
+ ExamManage findOnlyPaperId();
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/FillQuestionMapper.java b/src/main/java/com/shanzhu/oe/mapper/FillQuestionMapper.java
new file mode 100644
index 0000000..5a9366c
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/FillQuestionMapper.java
@@ -0,0 +1,65 @@
+package com.shanzhu.oe.mapper;
+
+import com.shanzhu.oe.entity.FillQuestion;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 填空题 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface FillQuestionMapper {
+
+ /**
+ * 通过试卷id查询问题
+ *
+ * @param paperId 试卷id
+ * @return 问题
+ */
+ @Select("select * from fill_question where questionId in (select questionId from paper_manage where questionType " +
+ "= 2 and paperId = #{paperId})")
+ List findByIdAndType(Integer paperId);
+
+ /**
+ * 查询最后一条填空题
+ *
+ * @return 最后一条填空题
+ */
+ @Select("select questionId from fill_question order by questionId desc limit 1")
+ FillQuestion findOnlyQuestionId();
+
+ /**
+ * 添加填空题
+ *
+ * @param fillQuestion 填空题内容
+ * @return 结果
+ */
+ @Options(useGeneratedKeys = true, keyProperty = "questionId")
+ @Insert("insert into fill_question(subject,question,answer,analysis,level,section) values " +
+ "(#{subject},#{question},#{answer},#{analysis},#{level},#{section})")
+ Integer add(FillQuestion fillQuestion);
+
+ /**
+ * 通过学科查询
+ *
+ * @param subject 学科查询
+ * @param pageNo 分页数
+ * @return 题目
+ */
+ @Select("select questionId from fill_question where subject = #{subject} order by rand() desc limit #{pageNo}")
+ List findBySubject(@Param("subject") String subject, @Param("pageNo") Integer pageNo);
+
+ /**
+ * 编辑填空题
+ *
+ * @param fillQuestion 填空题内容
+ * @return 结果
+ */
+ @Update("update fill_question set section = #{section}, question = #{question}, answer = #{answer}, level = " +
+ "#{level}, analysis = #{analysis} where questionId = #{questionId}")
+ Integer edit(FillQuestion fillQuestion);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/JudgeQuestionMapper.java b/src/main/java/com/shanzhu/oe/mapper/JudgeQuestionMapper.java
new file mode 100644
index 0000000..343077a
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/JudgeQuestionMapper.java
@@ -0,0 +1,62 @@
+package com.shanzhu.oe.mapper;
+
+import com.shanzhu.oe.entity.JudgeQuestion;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 判断题 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface JudgeQuestionMapper {
+
+ /**
+ * 通过试卷id查询问题
+ *
+ * @param paperId 试卷id
+ * @return 问题
+ */
+ @Select("select * from judge_question where questionId in (select questionId from paper_manage where questionType = 3 and paperId = #{paperId})")
+ List findByIdAndType(Integer paperId);
+
+ /**
+ * 查询最后一个判断题id
+ *
+ * @return 最后一个判断题
+ */
+ @Select("select questionId from judge_question order by questionId desc limit 1")
+ JudgeQuestion findOnlyQuestionId();
+
+ /**
+ * 添加判断题
+ *
+ * @param judgeQuestion 判断题信息
+ * @return 结果
+ */
+ @Insert("insert into judge_question(subject,question,answer,analysis,level,section) values " +
+ "(#{subject},#{question},#{answer},#{analysis},#{level},#{section})")
+ int add(JudgeQuestion judgeQuestion);
+
+ /**
+ * 通过学科查询
+ *
+ * @param subject 学科
+ * @param pageNo 分页数
+ * @return 题目id
+ */
+ @Select("select questionId from judge_question where subject=#{subject} order by rand() desc limit #{pageNo}")
+ List findBySubject(@Param("subject") String subject, @Param("pageNo") Integer pageNo);
+
+ /**
+ * 编辑判断题
+ *
+ * @param judgeQuestion 判断题
+ * @return 结果
+ */
+ @Update("update judge_question set subject = #{subject}, question = #{question}, answer = #{answer}, section = #{section}, analysis = #{analysis}, level = #{level} where questionId = #{questionId}")
+ int edit(JudgeQuestion judgeQuestion);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/LoginMapper.java b/src/main/java/com/shanzhu/oe/mapper/LoginMapper.java
new file mode 100644
index 0000000..2ec57dd
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/LoginMapper.java
@@ -0,0 +1,51 @@
+package com.shanzhu.oe.mapper;
+
+import com.shanzhu.oe.entity.Admin;
+import com.shanzhu.oe.entity.Student;
+import com.shanzhu.oe.entity.Teacher;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * 用户登录 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface LoginMapper {
+
+ /**
+ * 管理员登录
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @return 登录用户信息
+ */
+ @Select("select adminId,adminName,sex,tel,email,cardId,role from admin where adminId = #{username} and pwd = " +
+ "#{password}")
+ Admin adminLogin(@Param("username") Integer username, @Param("password") String password);
+
+ /**
+ * 教师登录
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @return 登录用户信息
+ */
+ @Select("select teacherId,teacherName,institute,sex,tel,email,cardId," +
+ "type,role from teacher where teacherId = #{username} and pwd = #{password}")
+ Teacher teacherLogin(@Param("username") Integer username, @Param("password") String password);
+
+ /**
+ * 学生登录
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @return 登录用户信息
+ */
+ @Select("select studentId,studentName,grade,major,clazz,institute,tel," +
+ "email,cardId,sex,role from student where studentId = #{username} and pwd = #{password}")
+ Student studentLogin(@Param("username") Integer username, @Param("password") String password);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/MessageMapper.java b/src/main/java/com/shanzhu/oe/mapper/MessageMapper.java
new file mode 100644
index 0000000..e642326
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/MessageMapper.java
@@ -0,0 +1,72 @@
+package com.shanzhu.oe.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Message;
+import org.apache.ibatis.annotations.*;
+
+
+/**
+ * 留言 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface MessageMapper {
+
+ /**
+ * 留言查询 分页
+ *
+ * @param page 分页内容
+ * @return 留言数据
+ */
+ @Select("select id,id as temp_id,title,content,time from message order by id desc")
+ @Results({
+ @Result(property = "replays", column = "temp_id", many = @Many(select = "com.shanzhu.oe.mapper" +
+ ".ReplayMapper.findAllById"))
+ })
+ IPage findAll(Page page);
+
+ /**
+ * 通过id查询留言
+ *
+ * @param id 留言id
+ * @return 留言内容
+ */
+ @Select("select id,title,content,time from message where id = #{id}")
+ @Results({
+ @Result(property = "replays", column = "id", many = @Many(select = "com.shanzhu.oe.mapper.ReplayMapper" +
+ ".findAllById"))
+ })
+ Message findById(Integer id);
+
+ /**
+ * 删除留言
+ *
+ * @param id 留言id
+ * @return 删除成功数量
+ */
+ @Delete("delete from message where id = #{id}")
+ Integer delete(Integer id);
+
+ /**
+ * 更新留言
+ *
+ * @param message 留言信息
+ * @return 结果
+ */
+ @Update("update message set title = #{title}, content = #{content}, time = #{time} where " +
+ "id = #{id}")
+ Integer update(Message message);
+
+ /**
+ * 添加留言
+ *
+ * @param message 留言信息
+ * @return 结果
+ */
+ @Options(useGeneratedKeys = true, keyProperty = "id")
+ @Insert("insert into message(title, content, time) values(#{title},#{content},#{time})")
+ int add(Message message);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/MultiQuestionMapper.java b/src/main/java/com/shanzhu/oe/mapper/MultiQuestionMapper.java
new file mode 100644
index 0000000..69290a7
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/MultiQuestionMapper.java
@@ -0,0 +1,68 @@
+package com.shanzhu.oe.mapper;
+
+import com.shanzhu.oe.entity.MultiQuestion;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 选择题 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface MultiQuestionMapper {
+
+ /**
+ * 通过试卷id 查询试卷
+ *
+ * @param paperId 试卷id
+ * @return 问题
+ */
+ @Select("select * from multi_question where questionId in (select questionId from paper_manage where questionType" +
+ " = 1 and paperId = #{paperId})")
+ List findByIdAndType(Integer paperId);
+
+ /**
+ * 通过id查询选择题
+ *
+ * @return 选择题
+ */
+ @Select("select questionId from multi_question order by questionId desc limit 1")
+ MultiQuestion findOnlyQuestionId();
+
+ /**
+ * 添加选择题
+ *
+ * @param multiQuestion 选择题信息
+ * @return 结果
+ */
+ @Options(useGeneratedKeys = true, keyProperty = "questionId")
+ @Insert("insert into multi_question(subject,question,answerA,answerB,answerC,answerD,rightAnswer,analysis," +
+ "section,level) " +
+ "values(#{subject},#{question},#{answerA},#{answerB},#{answerC},#{answerD},#{rightAnswer},#{analysis}," +
+ "#{section},#{level})")
+ Integer add(MultiQuestion multiQuestion);
+
+ /**
+ * 通过学科查询
+ *
+ * @param subject 学科
+ * @param pageNo 分页数
+ * @return 题目id
+ */
+ @Select("select questionId from multi_question where subject =#{subject} order by rand() desc limit #{pageNo}")
+ List findBySubject(@Param("subject") String subject, @Param("pageNo") Integer pageNo);
+
+ /**
+ * 编辑选择题
+ *
+ * @param multiQuestion 选择题信息
+ * @return 结果
+ */
+ @Update("update multi_question set subject = #{subject}, question = #{question}, answerA = #{answerA}, answerB = " +
+ "#{answerB}, answerC = #{answerC}, answerD = #{answerD}, rightAnswer = #{rightAnswer}, analysis = " +
+ "#{analysis}, section = #{section}, level = #{level} where questionId = #{questionId}")
+ int edit(MultiQuestion multiQuestion);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/PaperMapper.java b/src/main/java/com/shanzhu/oe/mapper/PaperMapper.java
new file mode 100644
index 0000000..361146b
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/PaperMapper.java
@@ -0,0 +1,45 @@
+package com.shanzhu.oe.mapper;
+
+import com.shanzhu.oe.entity.PaperManage;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 试卷 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface PaperMapper {
+
+ /**
+ * 查询所有试卷
+ *
+ * @return 试卷
+ */
+ @Select("select paperId, questionType,questionId from paper_manage")
+ List findAll();
+
+ /**
+ * 添加试卷
+ *
+ * @param paperManage 试卷信息
+ * @return 结果
+ */
+ @Insert("insert into paper_manage(paperId,questionType,questionId) values " +
+ "(#{paperId},#{questionType},#{questionId})")
+ Integer add(PaperManage paperManage);
+
+ /**
+ * 删除试卷中的某条试题
+ *
+ * @param paperId 试卷id
+ * @param type 题目类型。1选择,2填空,3判断
+ * @param questionId 题目id
+ */
+ @Delete("delete from paper_manage where paperId = #{paperId} and questionType = #{type} and questionId = " +
+ "#{questionId}")
+ void delete(@Param("paperId") String paperId, @Param("type") String type, @Param("questionId") String questionId);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/ReplayMapper.java b/src/main/java/com/shanzhu/oe/mapper/ReplayMapper.java
new file mode 100644
index 0000000..52ef9fc
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/ReplayMapper.java
@@ -0,0 +1,54 @@
+package com.shanzhu.oe.mapper;
+
+import com.shanzhu.oe.entity.Replay;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 留言 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface ReplayMapper {
+
+ /**
+ * 通过留言id查询回复
+ *
+ * @param messageId 留言id
+ * @return 回复
+ */
+ @Select("select messageId,replayId,replay,replayTime from replay where messageId = #{messageId}")
+ List findAllById(Integer messageId);
+
+ /**
+ * 删除回复
+ *
+ * @param replayId 回复id
+ * @return 结果
+ */
+ @Delete("delete from replay where replayId = #{replayId}")
+ Integer delete(Integer replayId);
+
+ /**
+ * 更新回复
+ *
+ * @param replay 回复内容
+ * @return 结果
+ */
+ @Update("update replay set title = #{title}, replay = #{replay}, replayTime = #{replayTime} where replayId = " +
+ "#{replayId}")
+ Integer update(Replay replay);
+
+ /**
+ * 添加回复
+ *
+ * @param replay 回复内容
+ * @return 结果
+ */
+ @Options(useGeneratedKeys = true, keyProperty = "replayId")
+ @Insert("insert into replay(messageId,replay,replayTime) values(#{messageId}, #{replay},#{replayTime})")
+ int add(Replay replay);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/ScoreMapper.java b/src/main/java/com/shanzhu/oe/mapper/ScoreMapper.java
new file mode 100644
index 0000000..219dfc5
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/ScoreMapper.java
@@ -0,0 +1,58 @@
+package com.shanzhu.oe.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Score;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+/**
+ * 分数 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface ScoreMapper {
+
+ /**
+ * 添加学生成绩
+ *
+ * @param score 学生成绩
+ * @return 考试成绩
+ */
+ @Options(useGeneratedKeys = true, keyProperty = "scoreId")
+ @Insert("insert into score(examCode,studentId,subject,ptScore,etScore,score,answerDate) values(#{examCode}," +
+ "#{studentId},#{subject},#{ptScore},#{etScore},#{score},#{answerDate})")
+ Integer add(Score score);
+
+ /**
+ * 查询所有考试成绩
+ *
+ * @return 考试成绩
+ */
+ @Select("select scoreId,examCode,studentId,subject,ptScore,etScore,score,answerDate from score order by scoreId " +
+ "desc")
+ List findAll();
+
+ /**
+ * 查询考试成绩分页
+ *
+ * @param page 分页对象
+ * @param studentId 学生id
+ * @return 考试成绩
+ */
+ @Select("select scoreId,examCode,studentId,subject,ptScore,etScore,score,answerDate from score where studentId = " +
+ "#{studentId} order by scoreId asc")
+ IPage findById(Page> page, @Param("studentId") Integer studentId);
+
+ /**
+ * 通过考试编号 查询学生成绩
+ *
+ * @param examCode 考试编号
+ * @return 考试成绩
+ */
+ @Select("select max(etScore) as etScore from score where examCode = #{examCode} group by studentId")
+ List findByExamCode(Integer examCode);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/StudentMapper.java b/src/main/java/com/shanzhu/oe/mapper/StudentMapper.java
new file mode 100644
index 0000000..99fc6e3
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/StudentMapper.java
@@ -0,0 +1,88 @@
+package com.shanzhu.oe.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Student;
+import org.apache.ibatis.annotations.*;
+
+/**
+ * 学生 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface StudentMapper {
+
+ /**
+ * 查询学生 分页
+ *
+ * @param page 分页对象
+ * @param name 学生姓名
+ * @param grade 班级
+ * @param tel 电话
+ * @param institute 学院
+ * @param major 专业
+ * @param clazz 班级
+ * @return 学生列表
+ */
+ @Select("select * from student where " +
+ "studentName like concat('%',#{name},'%') " +
+ "and grade like concat('%',#{grade},'%') " +
+ "and tel like concat('%',#{tel},'%') " +
+ "and major like concat('%',#{major},'%') " +
+ "and institute like concat('%',#{institute},'%') " +
+ "and clazz like concat('%',#{clazz},'%')")
+ IPage findAll(Page page, @Param("name") String name, @Param("grade") String grade,
+ @Param("tel") String tel, @Param("institute") String institute,
+ @Param("major")String major, @Param("clazz") String clazz);
+
+ /**
+ * 通过学生id查询学生
+ *
+ * @param studentId 学生id
+ * @return 学生
+ */
+ @Select("select * from student where studentId = #{studentId}")
+ Student findById(Integer studentId);
+
+ /**
+ * 删除学生
+ *
+ * @param studentId 学生id
+ * @return 结果
+ */
+ @Delete("delete from student where studentId = #{studentId}")
+ Integer deleteById(Integer studentId);
+
+ /**
+ * 更新学生
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ @Update("update student set studentName = #{studentName},grade = #{grade},major = #{major},clazz = #{clazz}," +
+ "institute = #{institute},tel = #{tel},email = #{email},pwd = #{pwd},cardId = #{cardId},sex = #{sex},role = #{role} " +
+ "where studentId = #{studentId}")
+ Integer update(Student student);
+
+ /**
+ * 添加学生
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ @Options(useGeneratedKeys = true,keyProperty = "studentId")
+ @Insert("insert into student(studentName,grade,major,clazz,institute,tel,email,pwd,cardId,sex,role) values " +
+ "(#{studentName},#{grade},#{major},#{clazz},#{institute},#{tel},#{email},#{pwd},#{cardId},#{sex},#{role})")
+ Integer add(Student student);
+
+ /**
+ * 更新密码
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ @Update("update student set pwd = #{pwd} where studentId = #{studentId}")
+ Integer updatePwd(Student student);
+}
diff --git a/src/main/java/com/shanzhu/oe/mapper/TeacherMapper.java b/src/main/java/com/shanzhu/oe/mapper/TeacherMapper.java
new file mode 100644
index 0000000..fcabb23
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/mapper/TeacherMapper.java
@@ -0,0 +1,65 @@
+package com.shanzhu.oe.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Teacher;
+import org.apache.ibatis.annotations.*;
+
+/**
+ * 教师 持久层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Mapper
+public interface TeacherMapper {
+
+ /**
+ * 查询教师 分页
+ *
+ * @param page 分页对象
+ * @return 教师列表
+ */
+ @Select("select * from teacher")
+ IPage findAll(Page page);
+
+ /**
+ * 通过教师id查询
+ *
+ * @param teacherId 教师id
+ * @return 教师
+ */
+ @Select("select * from teacher where teacherId = #{teacherId}")
+ Teacher findById(Integer teacherId);
+
+ /**
+ * 删除教师
+ *
+ * @param teacherId 教师id
+ * @return 结果
+ */
+ @Delete("delete from teacher where teacherId = #{teacherId}")
+ Integer deleteById(Integer teacherId);
+
+ /**
+ * 更新教师
+ *
+ * @param teacher 教师信息
+ * @return 结果
+ */
+ @Update("update teacher set teacherName = #{teacherName},sex = #{sex}," +
+ "tel = #{tel}, email = #{email},pwd = #{pwd},cardId = #{cardId}," +
+ "role = #{role},institute = #{institute},type = #{type} where teacherId = #{teacherId}")
+ Integer update(Teacher teacher);
+
+ /**
+ * 添加教师
+ *
+ * @param teacher 教师信息
+ * @return 结果
+ */
+ @Options(useGeneratedKeys = true, keyProperty = "teacherId")
+ @Insert("insert into teacher(teacherName,sex,tel,email,pwd,cardId,role,type,institute) " +
+ "values(#{teacherName},#{sex},#{tel},#{email},#{pwd},#{cardId},#{role},#{type},#{institute})")
+ Integer add(Teacher teacher);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/AdminService.java b/src/main/java/com/shanzhu/oe/service/AdminService.java
new file mode 100644
index 0000000..df920ba
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/AdminService.java
@@ -0,0 +1,63 @@
+package com.shanzhu.oe.service;
+
+import com.shanzhu.oe.entity.Admin;
+
+import java.util.List;
+
+/**
+ * 管理员 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface AdminService {
+
+ /**
+ * 查询所有管理员
+ *
+ * @return 管理员
+ */
+ List findAll();
+
+ /**
+ * 通过管理员id查询
+ *
+ * @param adminId 管理员id
+ * @return 管理员
+ */
+ Admin findById(Integer adminId);
+
+ /**
+ * 通过管理员id删除
+ *
+ * @param adminId 管理员id
+ * @return 结果
+ */
+ Integer deleteById(Integer adminId);
+
+ /**
+ * 更新管理员
+ *
+ * @param admin 管理员信息
+ * @return 结果
+ */
+ Integer update(Admin admin);
+
+ /**
+ * 添加管理员
+ *
+ * @param admin 管理员信息
+ * @return 结果
+ */
+ Integer add(Admin admin);
+
+ /**
+ * 更新密码
+ *
+ * @param adminId 管理员id
+ * @param newPsw 新密码
+ * @param oldPsw 旧密码
+ * @return 结果
+ */
+ Object resetPsw(Integer adminId, String newPsw, String oldPsw);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/AnswerService.java b/src/main/java/com/shanzhu/oe/service/AnswerService.java
new file mode 100644
index 0000000..e9c99e4
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/AnswerService.java
@@ -0,0 +1,35 @@
+package com.shanzhu.oe.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.vo.AnswerVO;
+import com.shanzhu.oe.vo.QuestionVO;
+
+/**
+ * 题库 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface AnswerService {
+
+ /**
+ * 查询题库 分页
+ *
+ * @param page 分页对象
+ * @param subject 学科
+ * @param section 章节
+ * @param question 问题
+ * @return 题目
+ */
+ IPage findAll(Page page, String subject, String section, String question);
+
+ /**
+ * 根据类型和id获取题目
+ *
+ * @param type 类型
+ * @param questionId 题目id
+ * @return 题目信息
+ */
+ QuestionVO findByIdAndType(String type, Long questionId);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/ExamManageService.java b/src/main/java/com/shanzhu/oe/service/ExamManageService.java
new file mode 100644
index 0000000..1b8f74b
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/ExamManageService.java
@@ -0,0 +1,69 @@
+package com.shanzhu.oe.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.ExamManage;
+
+import java.util.List;
+
+/**
+ * 考试管理 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface ExamManageService {
+
+ /**
+ * 查询所有考试
+ *
+ * @return 考试列表
+ */
+ List findAll();
+
+ /**
+ * 查询考试 分页
+ *
+ * @param page 分页对象
+ * @return 考试列表
+ */
+ IPage findAll(Page page);
+
+ /**
+ * 根据考试编号查询考试信息
+ *
+ * @param examCode 考试编好
+ * @return 考试信息
+ */
+ ExamManage findById(Integer examCode);
+
+ /**
+ * 根据考试编号删除
+ *
+ * @param examCode 考试编号
+ */
+ Integer delete(Integer examCode);
+
+ /**
+ * 更新考试信息
+ *
+ * @param examManage 考试信息
+ */
+ Integer update(ExamManage examManage);
+
+ /**
+ * 添加考试信息
+ *
+ * @param examManage 考试信息
+ */
+ Integer add(ExamManage examManage);
+
+ /**
+ * 查询最后一条记录的paperId,返回给前端达到自增效果
+ *
+ * @return 最后一条记录
+ */
+ ExamManage findOnlyPaperId();
+
+
+}
diff --git a/src/main/java/com/shanzhu/oe/service/FillQuestionService.java b/src/main/java/com/shanzhu/oe/service/FillQuestionService.java
new file mode 100644
index 0000000..7d73c12
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/FillQuestionService.java
@@ -0,0 +1,55 @@
+package com.shanzhu.oe.service;
+
+import com.shanzhu.oe.entity.FillQuestion;
+
+import java.util.List;
+
+/**
+ * 填空题 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface FillQuestionService {
+
+ /**
+ * 通过试卷id查询问题
+ *
+ * @param paperId 试卷id
+ * @return 问题
+ */
+ List findByIdAndType(Integer paperId);
+
+
+ /**
+ * 查询最后一条填空题
+ *
+ * @return 最后一条填空题
+ */
+ FillQuestion findOnlyQuestionId();
+
+ /**
+ * 添加填空题
+ *
+ * @param fillQuestion 填空题内容
+ * @return 结果
+ */
+ Integer add(FillQuestion fillQuestion);
+
+ /**
+ * 通过学科查询
+ *
+ * @param subject 学科查询
+ * @param pageNo 分页数
+ * @return 题目
+ */
+ List findBySubject(String subject,Integer pageNo);
+
+ /**
+ * 编辑填空题
+ *
+ * @param fillQuestion 填空题内容
+ * @return 结果
+ */
+ Integer edit(FillQuestion fillQuestion);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/JudgeQuestionService.java b/src/main/java/com/shanzhu/oe/service/JudgeQuestionService.java
new file mode 100644
index 0000000..0d616ed
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/JudgeQuestionService.java
@@ -0,0 +1,54 @@
+package com.shanzhu.oe.service;
+
+import com.shanzhu.oe.entity.JudgeQuestion;
+
+import java.util.List;
+
+/**
+ * 判断题 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface JudgeQuestionService {
+
+ /**
+ * 通过试卷id查询问题
+ *
+ * @param paperId 试卷id
+ * @return 问题
+ */
+ List findByIdAndType(Integer paperId);
+
+ /**
+ * 查询最后一个判断题id
+ *
+ * @return 最后一个判断题
+ */
+ JudgeQuestion findOnlyQuestionId();
+
+ /**
+ * 添加判断题
+ *
+ * @param judgeQuestion 判断题信息
+ * @return 结果
+ */
+ Integer add(JudgeQuestion judgeQuestion);
+
+ /**
+ * 通过学科查询
+ *
+ * @param subject 学科
+ * @param pageNo 分页数
+ * @return 题目id
+ */
+ List findBySubject(String subject,Integer pageNo);
+
+ /**
+ * 编辑判断题
+ *
+ * @param judgeQuestion 判断题
+ * @return 结果
+ */
+ Integer edit(JudgeQuestion judgeQuestion);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/LoginService.java b/src/main/java/com/shanzhu/oe/service/LoginService.java
new file mode 100644
index 0000000..efdee1b
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/LoginService.java
@@ -0,0 +1,41 @@
+package com.shanzhu.oe.service;
+
+import com.shanzhu.oe.entity.Admin;
+import com.shanzhu.oe.entity.Student;
+import com.shanzhu.oe.entity.Teacher;
+
+/**
+ * 用户登录 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface LoginService {
+
+ /**
+ * 管理员用户登录
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @return 登录用户信息
+ */
+ Admin adminLogin(Integer username, String password);
+
+ /**
+ * 教师用户登录
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @return 登录用户信息
+ */
+ Teacher teacherLogin(Integer username, String password);
+
+ /**
+ * 学生用户登录
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @return 登录用户信息
+ */
+ Student studentLogin(Integer username, String password);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/MessageService.java b/src/main/java/com/shanzhu/oe/service/MessageService.java
new file mode 100644
index 0000000..dbb820c
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/MessageService.java
@@ -0,0 +1,55 @@
+package com.shanzhu.oe.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Message;
+
+
+/**
+ * 留言 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface MessageService {
+
+ /**
+ * 留言查询 分页
+ *
+ * @param page 分页内容
+ * @return 留言数据
+ */
+ IPage findPage(Page page);
+
+ /**
+ * 通过id查询留言
+ *
+ * @param id 留言id
+ * @return 留言内容
+ */
+ Message findById(Integer id);
+
+ /**
+ * 删除留言
+ *
+ * @param id 留言id
+ * @return 删除成功数量
+ */
+ Integer delete(Integer id);
+
+ /**
+ * 更新留言
+ *
+ * @param message 留言信息
+ * @return 结果
+ */
+ Integer update(Message message);
+
+ /**
+ * 添加留言
+ *
+ * @param message 留言信息
+ * @return 结果
+ */
+ Integer add(Message message);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/MultiQuestionService.java b/src/main/java/com/shanzhu/oe/service/MultiQuestionService.java
new file mode 100644
index 0000000..1e43eb0
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/MultiQuestionService.java
@@ -0,0 +1,54 @@
+package com.shanzhu.oe.service;
+
+import com.shanzhu.oe.entity.MultiQuestion;
+
+import java.util.List;
+
+/**
+ * 选择题 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface MultiQuestionService {
+
+ /**
+ * 通过试卷id 查询试卷
+ *
+ * @param paperId 试卷id
+ * @return 问题
+ */
+ List findByIdAndType(Integer paperId);
+
+ /**
+ * 通过id查询选择题
+ *
+ * @return 选择题
+ */
+ MultiQuestion findOnlyQuestionId();
+
+ /**
+ * 添加选择题
+ *
+ * @param multiQuestion 选择题信息
+ * @return 结果
+ */
+ Integer add(MultiQuestion multiQuestion);
+
+ /**
+ * 通过学科查询
+ *
+ * @param subject 学科
+ * @param pageNo 分页数
+ * @return 题目id
+ */
+ List findBySubject(String subject,Integer pageNo);
+
+ /**
+ * 编辑选择题
+ *
+ * @param multiQuestion 选择题信息
+ * @return 结果
+ */
+ Integer edit(MultiQuestion multiQuestion);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/PaperService.java b/src/main/java/com/shanzhu/oe/service/PaperService.java
new file mode 100644
index 0000000..6436e8c
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/PaperService.java
@@ -0,0 +1,46 @@
+package com.shanzhu.oe.service;
+
+import com.shanzhu.oe.entity.PaperManage;
+
+import java.util.List;
+
+/**
+ * 试卷 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface PaperService {
+
+ /**
+ * 查询所有试卷
+ *
+ * @return 试卷
+ */
+ List findAll();
+
+ /**
+ * 添加试卷
+ *
+ * @param paperManage 试卷信息
+ * @return 结果
+ */
+ Integer add(PaperManage paperManage);
+
+ /**
+ * 获取试卷总分
+ *
+ * @param paperId 试卷id
+ * @return 分数
+ */
+ Integer getMaxScore(Integer paperId);
+
+ /**
+ * 删除试卷中的某条试题
+ *
+ * @param paperId 试卷id
+ * @param type 题目类型。1选择,2填空,3判断
+ * @param questionId 题目id
+ */
+ void delete(String paperId, String type, String questionId);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/ReplayService.java b/src/main/java/com/shanzhu/oe/service/ReplayService.java
new file mode 100644
index 0000000..ba47e1a
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/ReplayService.java
@@ -0,0 +1,46 @@
+package com.shanzhu.oe.service;
+
+import com.shanzhu.oe.entity.Replay;
+
+import java.util.List;
+
+/**
+ * 回复 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface ReplayService {
+
+ /**
+ * 通过留言id查询回复
+ *
+ * @param messageId 留言id
+ * @return 回复
+ */
+ List findAllById(Integer messageId);
+
+ /**
+ * 删除回复
+ *
+ * @param replayId 回复id
+ * @return 结果
+ */
+ Integer delete(Integer replayId);
+
+ /**
+ * 更新回复
+ *
+ * @param replay 回复内容
+ * @return 结果
+ */
+ Integer update(Replay replay);
+
+ /**
+ * 添加回复
+ *
+ * @param replay 回复内容
+ * @return 结果
+ */
+ Integer add(Replay replay);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/ScoreService.java b/src/main/java/com/shanzhu/oe/service/ScoreService.java
new file mode 100644
index 0000000..219b782
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/ScoreService.java
@@ -0,0 +1,56 @@
+package com.shanzhu.oe.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Score;
+
+import java.util.List;
+
+/**
+ * 分数 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface ScoreService {
+
+ /**
+ * 添加学生成绩
+ *
+ * @param score 学生成绩
+ * @return 考试成绩
+ */
+ Integer add(Score score);
+
+ /**
+ * 查询所有考试成绩
+ *
+ * @return 考试分数
+ */
+ List findAll();
+
+ /**
+ * 查询考试成绩 分页
+ *
+ * @param page 分页对象
+ * @param studentId 学生id
+ * @return 结果
+ */
+ IPage findById(Page page, Integer studentId);
+
+ /**
+ * 查询考试成绩 不分页
+ *
+ * @param studentId 学生id
+ * @return 考试成绩
+ */
+ List findById(Integer studentId);
+
+ /**
+ * 通过考试编号 查询学生成绩
+ *
+ * @param examCode 考试编号
+ * @return 考试成绩
+ */
+ List findByExamCode(Integer examCode);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/StudentService.java b/src/main/java/com/shanzhu/oe/service/StudentService.java
new file mode 100644
index 0000000..489b9fb
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/StudentService.java
@@ -0,0 +1,72 @@
+package com.shanzhu.oe.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Student;
+
+/**
+ * 学生 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface StudentService {
+
+ /**
+ * 查询学生 分页
+ *
+ * @param page 分页对象
+ * @param name 学生姓名
+ * @param grade 班级
+ * @param tel 电话
+ * @param institute 学院
+ * @param major 专业
+ * @param clazz 班级
+ * @return 学生列表
+ */
+ IPage findAll(
+ Page page, String name,
+ String grade, String tel,
+ String institute, String major, String clazz
+ );
+
+ /**
+ * 通过学生id查询学生
+ *
+ * @param studentId 学生id
+ * @return 学生
+ */
+ Student findById(Integer studentId);
+
+ /**
+ * 删除学生
+ *
+ * @param studentId 学生id
+ * @return 结果
+ */
+ Integer deleteById(Integer studentId);
+
+ /**
+ * 更新学生
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ Integer update(Student student);
+
+ /**
+ * 添加学生
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ Integer add(Student student);
+
+ /**
+ * 更新密码
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ Integer updatePwd(Student student);
+}
diff --git a/src/main/java/com/shanzhu/oe/service/TeacherService.java b/src/main/java/com/shanzhu/oe/service/TeacherService.java
new file mode 100644
index 0000000..bd90080
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/service/TeacherService.java
@@ -0,0 +1,58 @@
+package com.shanzhu.oe.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Teacher;
+
+import java.util.List;
+
+/**
+ * 教师 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public interface TeacherService {
+
+ /**
+ * 查询教师 分页
+ *
+ * @param page 分页对象
+ * @return 教师列表
+ */
+ IPage findAll(Page page);
+
+ List findAll();
+
+ /**
+ * 通过教师id查询
+ *
+ * @param teacherId 教师id
+ * @return 教师
+ */
+ Teacher findById(Integer teacherId);
+
+ /**
+ * 删除教师
+ *
+ * @param teacherId 教师id
+ * @return 结果
+ */
+ Integer deleteById(Integer teacherId);
+
+ /**
+ * 更新教师
+ *
+ * @param teacher 教师信息
+ * @return 结果
+ */
+ Integer update(Teacher teacher);
+
+ /**
+ * 添加教师
+ *
+ * @param teacher 教师信息
+ * @return 结果
+ */
+ Integer add(Teacher teacher);
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/AdminServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/AdminServiceImpl.java
new file mode 100644
index 0000000..9c82284
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/AdminServiceImpl.java
@@ -0,0 +1,98 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.shanzhu.oe.entity.Admin;
+import com.shanzhu.oe.mapper.AdminMapper;
+import com.shanzhu.oe.service.AdminService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 管理员 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class AdminServiceImpl implements AdminService {
+
+ private final AdminMapper adminMapper;
+
+ /**
+ * 查询所有管理员
+ *
+ * @return 管理员
+ */
+ @Override
+ public List findAll() {
+ return adminMapper.findAll();
+ }
+
+ /**
+ * 通过管理员id查询
+ *
+ * @param adminId 管理员id
+ * @return 管理员
+ */
+ @Override
+ public Admin findById(Integer adminId) {
+ return adminMapper.findById(adminId);
+ }
+
+ /**
+ * 通过管理员id删除
+ *
+ * @param adminId 管理员id
+ * @return 结果
+ */
+ @Override
+ public Integer deleteById(Integer adminId) {
+ return adminMapper.deleteById(adminId);
+ }
+
+ /**
+ * 更新管理员
+ *
+ * @param admin 管理员信息
+ * @return 结果
+ */
+ @Override
+ public Integer update(Admin admin) {
+ return adminMapper.update(admin);
+ }
+
+ /**
+ * 添加管理员
+ *
+ * @param admin 管理员信息
+ * @return 结果
+ */
+ @Override
+ public Integer add(Admin admin) {
+ return adminMapper.add(admin);
+ }
+
+ /**
+ * 更新密码
+ *
+ * @param adminId 管理员id
+ * @param newPsw 新密码
+ * @param oldPsw 旧密码
+ * @return 结果
+ */
+ @Override
+ public Object resetPsw(Integer adminId, String newPsw, String oldPsw) {
+ Admin admin = findById(adminId);
+
+ if(!admin.getPwd().equals(oldPsw)) {
+ return "原密码错误";
+ }
+ admin.setPwd(String.valueOf(newPsw));
+ update(admin);
+ return Boolean.TRUE;
+ }
+
+
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/AnswerServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/AnswerServiceImpl.java
new file mode 100644
index 0000000..a872183
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/AnswerServiceImpl.java
@@ -0,0 +1,65 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.mapper.AnswerMapper;
+import com.shanzhu.oe.service.AnswerService;
+import com.shanzhu.oe.vo.AnswerVO;
+import com.shanzhu.oe.vo.QuestionVO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 题库 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class AnswerServiceImpl implements AnswerService {
+
+ private final AnswerMapper answerMapper;
+
+ /**
+ * 查询题库 分页
+ *
+ * @param page 分页对象
+ * @param subject 学科
+ * @param section 章节
+ * @param question 问题
+ * @return 题目
+ */
+ @Override
+ public IPage findAll(Page page, String subject, String section, String question) {
+ subject = (subject.equals("@") ? "" : subject);
+ section = (section.equals("@") ? "" : section);
+ question = (question.equals("@") ? "" : question);
+ return answerMapper.findAll(page, subject, section, question);
+ }
+
+ /**
+ * 根据类型和id获取题目
+ *
+ * @param type 类型
+ * @param questionId 题目id
+ * @return 题目信息
+ */
+ @Override
+ public QuestionVO findByIdAndType(String type, Long questionId) {
+ QuestionVO questionVO = new QuestionVO();
+ questionVO.setType(type);
+ switch (type) {
+ case "选择题":
+ questionVO.setMultiQuestion(answerMapper.findMultiQuestionById(questionId));
+ break;
+ case "判断题":
+ questionVO.setJudgeQuestion(answerMapper.findJudgeQuestionById(questionId));
+ break;
+ case "填空题":
+ questionVO.setFillQuestion(answerMapper.findFillQuestionById(questionId));
+ break;
+ }
+ return questionVO;
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/ExamManageServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/ExamManageServiceImpl.java
new file mode 100644
index 0000000..144c5a9
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/ExamManageServiceImpl.java
@@ -0,0 +1,117 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.ExamManage;
+import com.shanzhu.oe.mapper.ExamManageMapper;
+import com.shanzhu.oe.service.ExamManageService;
+import com.shanzhu.oe.service.PaperService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 考试管理 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class ExamManageServiceImpl implements ExamManageService {
+
+ private final ExamManageMapper examManageMapper;
+
+ private final PaperService paperService;
+
+ /**
+ * 查询所有考试
+ *
+ * @return 考试列表
+ */
+ @Override
+ public List findAll() {
+ Page examManage = new Page<>(0, 9999);
+ List examManageList = examManageMapper.findAll(examManage).getRecords();
+ setMaxScore(examManageList);
+ return examManageList;
+ }
+
+ /**
+ * 查询考试 分页
+ *
+ * @param page 分页对象
+ * @return 考试列表
+ */
+ @Override
+ public IPage findAll(Page page) {
+ IPage iPage = examManageMapper.findAll(page);
+ setMaxScore(iPage.getRecords());
+ return iPage;
+ }
+
+ /**
+ * 根据考试编号查询考试信息
+ *
+ * @param examCode 考试编好
+ * @return 考试信息
+ */
+ @Override
+ public ExamManage findById(Integer examCode) {
+ ExamManage examManage = examManageMapper.findById(examCode);
+ examManage.setTotalScore(paperService.getMaxScore(examManage.getPaperId()));
+ return examManage;
+ }
+
+ /**
+ * 根据考试编号删除
+ *
+ * @param examCode 考试编号
+ */
+ @Override
+ public Integer delete(Integer examCode) {
+ return examManageMapper.delete(examCode);
+ }
+
+ /**
+ * 更新考试信息
+ *
+ * @param examManage 考试信息
+ */
+ @Override
+ public Integer update(ExamManage examManage) {
+ return examManageMapper.update(examManage);
+ }
+
+ /**
+ * 添加考试信息
+ *
+ * @param examManage 考试信息
+ */
+ @Override
+ public Integer add(ExamManage examManage) {
+ return examManageMapper.add(examManage);
+ }
+
+ /**
+ * 查询最后一条记录的paperId,返回给前端达到自增效果
+ *
+ * @return 最后一条记录
+ */
+ @Override
+ public ExamManage findOnlyPaperId() {
+ return examManageMapper.findOnlyPaperId();
+ }
+
+ /**
+ * 设置最高分
+ *
+ * @param examManageList
+ */
+ private void setMaxScore(List examManageList) {
+ for (ExamManage examManage : examManageList) {
+ examManage.setTotalScore(paperService.getMaxScore(examManage.getPaperId()));
+ }
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/FillQuestionServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/FillQuestionServiceImpl.java
new file mode 100644
index 0000000..4635bbd
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/FillQuestionServiceImpl.java
@@ -0,0 +1,77 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.shanzhu.oe.entity.FillQuestion;
+import com.shanzhu.oe.mapper.FillQuestionMapper;
+import com.shanzhu.oe.service.FillQuestionService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 填空题 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class FillQuestionServiceImpl implements FillQuestionService {
+
+ private final FillQuestionMapper fillQuestionMapper;
+
+ /**
+ * 通过试卷id查询问题
+ *
+ * @param paperId 试卷id
+ * @return 问题
+ */
+ @Override
+ public List findByIdAndType(Integer paperId) {
+ return fillQuestionMapper.findByIdAndType(paperId);
+ }
+
+ /**
+ * 查询最后一条填空题
+ *
+ * @return 最后一条填空题
+ */
+ @Override
+ public FillQuestion findOnlyQuestionId() {
+ return fillQuestionMapper.findOnlyQuestionId();
+ }
+
+ /**
+ * 添加填空题
+ *
+ * @param fillQuestion 填空题内容
+ * @return 结果
+ */
+ @Override
+ public Integer add(FillQuestion fillQuestion) {
+ return fillQuestionMapper.add(fillQuestion);
+ }
+
+ /**
+ * 通过学科查询
+ *
+ * @param subject 学科查询
+ * @param pageNo 分页数
+ * @return 题目
+ */
+ @Override
+ public List findBySubject(String subject, Integer pageNo) {
+ return fillQuestionMapper.findBySubject(subject,pageNo);
+ }
+
+ /**
+ * 编辑填空题
+ *
+ * @param fillQuestion 填空题内容
+ * @return 结果
+ */
+ @Override
+ public Integer edit(FillQuestion fillQuestion) {
+ return fillQuestionMapper.edit(fillQuestion);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/JudgeQuestionServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/JudgeQuestionServiceImpl.java
new file mode 100644
index 0000000..1cccefc
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/JudgeQuestionServiceImpl.java
@@ -0,0 +1,77 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.shanzhu.oe.entity.JudgeQuestion;
+import com.shanzhu.oe.mapper.JudgeQuestionMapper;
+import com.shanzhu.oe.service.JudgeQuestionService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 判断题 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class JudgeQuestionServiceImpl implements JudgeQuestionService {
+
+ private final JudgeQuestionMapper judgeQuestionMapper;
+
+ /**
+ * 通过试卷id查询问题
+ *
+ * @param paperId 试卷id
+ * @return 问题
+ */
+ @Override
+ public List findByIdAndType(Integer paperId) {
+ return judgeQuestionMapper.findByIdAndType(paperId);
+ }
+
+ /**
+ * 查询最后一个判断题id
+ *
+ * @return 最后一个判断题
+ */
+ @Override
+ public JudgeQuestion findOnlyQuestionId() {
+ return judgeQuestionMapper.findOnlyQuestionId();
+ }
+
+ /**
+ * 添加判断题
+ *
+ * @param judgeQuestion 判断题信息
+ * @return 结果
+ */
+ @Override
+ public Integer add(JudgeQuestion judgeQuestion) {
+ return judgeQuestionMapper.add(judgeQuestion);
+ }
+
+ /**
+ *
+ * 通过学科查询
+ * @param subject 学科
+ * @param pageNo 分页数
+ * @return 题目id
+ */
+ @Override
+ public List findBySubject(String subject, Integer pageNo) {
+ return judgeQuestionMapper.findBySubject(subject,pageNo);
+ }
+
+ /**
+ * 编辑判断题
+ *
+ * @param judgeQuestion 判断题
+ * @return 结果
+ */
+ @Override
+ public Integer edit(JudgeQuestion judgeQuestion) {
+ return judgeQuestionMapper.edit(judgeQuestion);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/LoginServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/LoginServiceImpl.java
new file mode 100644
index 0000000..3053acb
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/LoginServiceImpl.java
@@ -0,0 +1,58 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.shanzhu.oe.entity.Admin;
+import com.shanzhu.oe.entity.Student;
+import com.shanzhu.oe.entity.Teacher;
+import com.shanzhu.oe.mapper.LoginMapper;
+import com.shanzhu.oe.service.LoginService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户登录 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class LoginServiceImpl implements LoginService {
+
+ private final LoginMapper loginMapper;
+
+ /**
+ * 管理员用户登录
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @return 登录用户信息
+ */
+ @Override
+ public Admin adminLogin(Integer username, String password) {
+ return loginMapper.adminLogin(username,password);
+ }
+
+ /**
+ * 教师登录
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @return 登录用户信息
+ */
+ @Override
+ public Teacher teacherLogin(Integer username, String password) {
+ return loginMapper.teacherLogin(username,password);
+ }
+
+ /**
+ * 学生登录
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @return 登录用户信息
+ */
+ @Override
+ public Student studentLogin(Integer username, String password) {
+ return loginMapper.studentLogin(username,password);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/MessageServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/MessageServiceImpl.java
new file mode 100644
index 0000000..a43bb7a
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/MessageServiceImpl.java
@@ -0,0 +1,78 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Message;
+import com.shanzhu.oe.mapper.MessageMapper;
+import com.shanzhu.oe.service.MessageService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * 留言 控制层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class MessageServiceImpl implements MessageService {
+
+ private final MessageMapper messageMapper;
+
+ /**
+ * 留言查询 分页
+ *
+ * @param page 分页内容
+ * @return 留言数据
+ */
+ @Override
+ public IPage findPage(Page page) {
+ return messageMapper.findAll(page);
+ }
+
+ /**
+ * 通过id查询留言
+ *
+ * @param id 留言id
+ * @return 留言内容
+ */
+ @Override
+ public Message findById(Integer id) {
+ return messageMapper.findById(id);
+ }
+
+ /**
+ * 删除留言
+ *
+ * @param id 留言id
+ * @return 删除成功数量
+ */
+ @Override
+ public Integer delete(Integer id) {
+ return messageMapper.delete(id);
+ }
+
+ /**
+ * 更新留言
+ *
+ * @param message 留言信息
+ * @return 结果
+ */
+ @Override
+ public Integer update(Message message) {
+ return messageMapper.update(message);
+ }
+
+ /**
+ * 添加留言
+ *
+ * @param message 留言信息
+ * @return 结果
+ */
+ @Override
+ public Integer add(Message message) {
+ return messageMapper.add(message);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/MultiQuestionServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/MultiQuestionServiceImpl.java
new file mode 100644
index 0000000..3a296c6
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/MultiQuestionServiceImpl.java
@@ -0,0 +1,77 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.shanzhu.oe.entity.MultiQuestion;
+import com.shanzhu.oe.mapper.MultiQuestionMapper;
+import com.shanzhu.oe.service.MultiQuestionService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 选择题 服务层
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class MultiQuestionServiceImpl implements MultiQuestionService {
+
+ private final MultiQuestionMapper multiQuestionMapper;
+
+ /**
+ * 通过试卷id 查询试卷
+ *
+ * @param paperId 试卷id
+ * @return 问题
+ */
+ @Override
+ public List findByIdAndType(Integer paperId) {
+ return multiQuestionMapper.findByIdAndType(paperId);
+ }
+
+ /**
+ * 通过id查询选择题
+ *
+ * @return 选择题
+ */
+ @Override
+ public MultiQuestion findOnlyQuestionId() {
+ return multiQuestionMapper.findOnlyQuestionId();
+ }
+
+ /**
+ * 添加选择题
+ *
+ * @param multiQuestion 选择题信息
+ * @return 结果
+ */
+ @Override
+ public Integer add(MultiQuestion multiQuestion) {
+ return multiQuestionMapper.add(multiQuestion);
+ }
+
+ /**
+ * 通过学科查询
+ *
+ * @param subject 学科
+ * @param pageNo 分页数
+ * @return 题目id
+ */
+ @Override
+ public List findBySubject(String subject, Integer pageNo) {
+ return multiQuestionMapper.findBySubject(subject,pageNo);
+ }
+
+ /**
+ * 编辑选择题
+ *
+ * @param multiQuestion 选择题信息
+ * @return 结果
+ */
+ @Override
+ public Integer edit(MultiQuestion multiQuestion) {
+ return multiQuestionMapper.edit(multiQuestion);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/PaperServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/PaperServiceImpl.java
new file mode 100644
index 0000000..fbec813
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/PaperServiceImpl.java
@@ -0,0 +1,80 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.shanzhu.oe.entity.FillQuestion;
+import com.shanzhu.oe.entity.JudgeQuestion;
+import com.shanzhu.oe.entity.MultiQuestion;
+import com.shanzhu.oe.entity.PaperManage;
+import com.shanzhu.oe.mapper.PaperMapper;
+import com.shanzhu.oe.service.PaperService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 试卷 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class PaperServiceImpl implements PaperService {
+
+ private final PaperMapper paperMapper;
+
+ private final JudgeQuestionServiceImpl judgeQuestionService;
+
+ private final MultiQuestionServiceImpl multiQuestionService;
+
+ private final FillQuestionServiceImpl fillQuestionService;
+
+ /**
+ * 查询所有试卷
+ *
+ * @return 试卷
+ */
+ @Override
+ public List findAll() {
+ return paperMapper.findAll();
+ }
+
+ /**
+ * 添加试卷
+ *
+ * @param paperManage 试卷信息
+ * @return 结果
+ */
+ @Override
+ public Integer add(PaperManage paperManage) {
+ return paperMapper.add(paperManage);
+ }
+
+ /**
+ * 获取试卷总分
+ *
+ * @param paperId 试卷id
+ * @return 分数
+ */
+ @Override
+ public Integer getMaxScore(Integer paperId) {
+
+ List multiQuestionRes = multiQuestionService.findByIdAndType(paperId); //选择题题库 1
+ List fillQuestionsRes = fillQuestionService.findByIdAndType(paperId); //填空题题库 2
+ List judgeQuestionRes = judgeQuestionService.findByIdAndType(paperId); //判断题题库 3
+ return 2 * (multiQuestionRes.size() + fillQuestionsRes.size() + judgeQuestionRes.size());
+ }
+
+ /**
+ * 删除试卷中的某条试题
+ *
+ * @param paperId 试卷id
+ * @param type 题目类型。1选择,2填空,3判断
+ * @param questionId 题目id
+ */
+ @Override
+ public void delete(String paperId, String type, String questionId) {
+ paperMapper.delete(paperId, type, questionId);
+ }
+
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/ReplayServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/ReplayServiceImpl.java
new file mode 100644
index 0000000..be5b7c1
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/ReplayServiceImpl.java
@@ -0,0 +1,66 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.shanzhu.oe.entity.Replay;
+import com.shanzhu.oe.mapper.ReplayMapper;
+import com.shanzhu.oe.service.ReplayService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 回复 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class ReplayServiceImpl implements ReplayService {
+
+ private final ReplayMapper replayMapper;
+
+ /**
+ * 通过留言id查询回复
+ *
+ * @param messageId 留言id
+ * @return 回复
+ */
+ @Override
+ public List findAllById(Integer messageId) {
+ return replayMapper.findAllById(messageId);
+ }
+
+ /**
+ * 删除回复
+ *
+ * @param replayId 回复id
+ * @return 结果
+ */
+ @Override
+ public Integer delete(Integer replayId) {
+ return replayMapper.delete(replayId);
+ }
+
+ /**
+ * 更新回复
+ *
+ * @param replay 回复内容
+ * @return 结果
+ */
+ @Override
+ public Integer update(Replay replay) {
+ return replayMapper.update(replay);
+ }
+
+ /**
+ * 添加回复
+ *
+ * @param replay 回复内容
+ * @return 结果
+ */
+ @Override
+ public Integer add(Replay replay) {
+ return replayMapper.add(replay);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/ScoreServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/ScoreServiceImpl.java
new file mode 100644
index 0000000..c755238
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/ScoreServiceImpl.java
@@ -0,0 +1,80 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Score;
+import com.shanzhu.oe.mapper.ScoreMapper;
+import com.shanzhu.oe.service.ScoreService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 分数 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class ScoreServiceImpl implements ScoreService {
+
+ private final ScoreMapper scoreMapper;
+
+ /**
+ * 添加学生成绩
+ *
+ * @param score 学生成绩
+ * @return 考试成绩
+ */
+ @Override
+ public Integer add(Score score) {
+ return scoreMapper.add(score);
+ }
+
+ /**
+ * 查询所有考试成绩
+ *
+ * @return 考试成绩
+ */
+ @Override
+ public List findAll() {
+ return scoreMapper.findAll();
+ }
+
+ /**
+ * 查询考试成绩 分页
+ *
+ * @param page 分页对象
+ * @param studentId 学生id
+ * @return 考试成绩
+ */
+ @Override
+ public IPage findById(Page page, Integer studentId) {
+ return scoreMapper.findById(page, studentId);
+ }
+
+ /**
+ * 查询考试成绩 不分页
+ *
+ * @param studentId 学生id
+ * @return 考试成绩
+ */
+ @Override
+ public List findById(Integer studentId) {
+ Page scorePage = new Page<>(0, 9999);
+ return scoreMapper.findById(scorePage, studentId).getRecords();
+ }
+
+ /**
+ * 通过考试编号 查询学生成绩
+ *
+ * @param examCode 考试编号
+ * @return 考试成绩
+ */
+ @Override
+ public List findByExamCode(Integer examCode) {
+ return scoreMapper.findByExamCode(examCode);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/StudentServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/StudentServiceImpl.java
new file mode 100644
index 0000000..71aa313
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/StudentServiceImpl.java
@@ -0,0 +1,103 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Student;
+import com.shanzhu.oe.mapper.StudentMapper;
+import com.shanzhu.oe.service.StudentService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 学生 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class StudentServiceImpl implements StudentService {
+
+ private final StudentMapper studentMapper;
+
+ /**
+ * 查询学生 分页
+ *
+ * @param page 分页对象
+ * @param name 学生姓名
+ * @param grade 班级
+ * @param tel 电话
+ * @param institute 学院
+ * @param major 专业
+ * @param clazz 班级
+ * @return 学生列表
+ */
+ @Override
+ public IPage findAll(
+ Page page, String name, String grade,
+ String tel, String institute, String major, String clazz
+ ) {
+ name = ("@".equals(name) ? "" : name);
+ grade = ("@".equals(grade) ? "" : grade);
+ tel = ("@".equals(tel) ? "" : tel);
+ institute = ("@".equals(institute) ? "" : institute);
+ major = ("@".equals(major) ? "" : major);
+ clazz = ("@".equals(clazz) ? "" : clazz);
+ return studentMapper.findAll(page, name, grade, tel, institute, major, clazz);
+ }
+
+ /**
+ * 通过学生id查询学生
+ *
+ * @param studentId 学生id
+ * @return 学生
+ */
+ @Override
+ public Student findById(Integer studentId) {
+ return studentMapper.findById(studentId);
+ }
+
+ /**
+ * 删除学生
+ *
+ * @param studentId 学生id
+ * @return 结果
+ */
+ @Override
+ public Integer deleteById(Integer studentId) {
+ return studentMapper.deleteById(studentId);
+ }
+
+ /**
+ * 更新学生
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ @Override
+ public Integer update(Student student) {
+ return studentMapper.update(student);
+ }
+
+ /**
+ * 添加学生
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ @Override
+ public Integer add(Student student) {
+ return studentMapper.add(student);
+ }
+
+ /**
+ * 更新密码
+ *
+ * @param student 学生信息
+ * @return 结果
+ */
+ @Override
+ public Integer updatePwd(Student student) {
+ return studentMapper.updatePwd(student);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/serviceimpl/TeacherServiceImpl.java b/src/main/java/com/shanzhu/oe/serviceimpl/TeacherServiceImpl.java
new file mode 100644
index 0000000..64c858d
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/serviceimpl/TeacherServiceImpl.java
@@ -0,0 +1,86 @@
+package com.shanzhu.oe.serviceimpl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.shanzhu.oe.entity.Teacher;
+import com.shanzhu.oe.mapper.TeacherMapper;
+import com.shanzhu.oe.service.TeacherService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 教师 服务层实现类
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Service
+@RequiredArgsConstructor
+public class TeacherServiceImpl implements TeacherService {
+
+ private final TeacherMapper teacherMapper;
+
+ /**
+ * 查询教师 分页
+ *
+ * @param page 分页对象
+ * @return 教师列表
+ */
+ @Override
+ public IPage findAll(Page page) {
+ return teacherMapper.findAll(page);
+ }
+
+ @Override
+ public List findAll() {
+ Page teacherPage = new Page<>(0,9999);
+ return teacherMapper.findAll(teacherPage).getRecords();
+ }
+
+ /**
+ * 通过教师id查询
+ *
+ * @param teacherId 教师id
+ * @return 教师
+ */
+ @Override
+ public Teacher findById(Integer teacherId) {
+ return teacherMapper.findById(teacherId);
+ }
+
+ /**
+ * 删除教师
+ *
+ * @param teacherId 教师id
+ * @return 结果
+ */
+ @Override
+ public Integer deleteById(Integer teacherId) {
+ return teacherMapper.deleteById(teacherId);
+ }
+
+ /**
+ * 更新教师
+ *
+ * @param teacher 教师信息
+ * @return 结果
+ */
+ @Override
+ public Integer update(Teacher teacher) {
+ return teacherMapper.update(teacher);
+ }
+
+ /**
+ * 添加教师
+ *
+ * @param teacher 教师信息
+ * @return 结果
+ */
+ @Override
+ public Integer add(Teacher teacher) {
+ teacher.setRole("1");
+ return teacherMapper.add(teacher);
+ }
+}
diff --git a/src/main/java/com/shanzhu/oe/util/ApiResultHandler.java b/src/main/java/com/shanzhu/oe/util/ApiResultHandler.java
new file mode 100644
index 0000000..f3785a8
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/util/ApiResultHandler.java
@@ -0,0 +1,33 @@
+package com.shanzhu.oe.util;
+
+import com.shanzhu.oe.common.R;
+
+/**
+ * 对象 {@link R} 数据处理工具
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+public class ApiResultHandler {
+
+ public static R success(Object object) {
+ R r = new R();
+ r.setData(object);
+ r.setCode(200);
+ r.setMessage("请求成功");
+ return r;
+ }
+
+ public static R success() {
+ return success(null);
+ }
+
+ public static R buildApiResult(Integer code, String message, T data) {
+ R r = new R();
+ r.setCode(code);
+ r.setMessage(message);
+ r.setData(data);
+ return r;
+ }
+
+}
diff --git a/src/main/java/com/shanzhu/oe/vo/AnswerVO.java b/src/main/java/com/shanzhu/oe/vo/AnswerVO.java
new file mode 100644
index 0000000..992b25d
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/vo/AnswerVO.java
@@ -0,0 +1,51 @@
+package com.shanzhu.oe.vo;
+
+import lombok.Data;
+
+
+/**
+ * 题库 接口返回对象
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class AnswerVO {
+
+ /**
+ * 题目id
+ */
+ private Long questionId;
+
+ /**
+ * 题目
+ */
+ private String question;
+
+ /**
+ * 科目
+ */
+ private String subject;
+
+ /**
+ * 分数
+ */
+ private String score;
+
+ /**
+ * 章节
+ */
+ private String section;
+
+ /**
+ * 难度等级
+ */
+ private String level;
+
+ /**
+ * 类型
+ */
+ private String type;
+
+
+}
diff --git a/src/main/java/com/shanzhu/oe/vo/Item.java b/src/main/java/com/shanzhu/oe/vo/Item.java
new file mode 100644
index 0000000..9d6b321
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/vo/Item.java
@@ -0,0 +1,39 @@
+package com.shanzhu.oe.vo;
+
+import lombok.Data;
+
+/**
+ * 组卷
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class Item {
+
+ /**
+ * 科目
+ */
+ private String subject;
+
+ /**
+ * 试卷编号
+ */
+ private Integer paperId;
+
+ /**
+ * 选择题数量
+ */
+ private Integer changeNumber;
+
+ /**
+ * 填空题数量
+ */
+ private Integer fillNumber;
+
+ /**
+ * 判断题数量
+ */
+ private Integer judgeNumber;
+
+}
diff --git a/src/main/java/com/shanzhu/oe/vo/QuestionVO.java b/src/main/java/com/shanzhu/oe/vo/QuestionVO.java
new file mode 100644
index 0000000..99ebf8b
--- /dev/null
+++ b/src/main/java/com/shanzhu/oe/vo/QuestionVO.java
@@ -0,0 +1,37 @@
+package com.shanzhu.oe.vo;
+
+import com.shanzhu.oe.entity.FillQuestion;
+import com.shanzhu.oe.entity.JudgeQuestion;
+import com.shanzhu.oe.entity.MultiQuestion;
+import lombok.Data;
+
+/**
+ * 题目 接口返回对象
+ *
+ * @author: ShanZhu
+ * @date: 2023-11-20
+ */
+@Data
+public class QuestionVO {
+
+ /**
+ * 题目类型
+ */
+ private String type;
+
+ /**
+ * 填空题
+ */
+ private FillQuestion fillQuestion;
+
+ /**
+ * 判断题
+ */
+ private JudgeQuestion judgeQuestion;
+
+ /**
+ * 选择题
+ */
+ private MultiQuestion multiQuestion;
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..c970634
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,31 @@
+# YML是一种文件格式,全称为YAML(YAML Ain't Markup Language),SpringBoot通常使用YML作为项目配置。
+# 它是一种人类可读的、简洁明了的数据序列化格式。YAML文件格式通常用于配置文件、数据交换、消息传递和其他应用程序。
+# 可以通过文本编辑器进行编辑,也可以通过程序进行解析。YML文件格式是一种以层级缩进的方式表示程序数据结构的格式。
+# 在数据表示方面比XML等格式更加简洁清晰易读。YML文件格式通常以“.yml”为扩展名。
+
+# 服务端口
+server:
+ port: 8087
+
+# Spring配置
+spring:
+
+ # 数据库配置
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+# url: jdbc:mysql://localhost:3306/online_eaxm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
+# username: root
+# password: 123456
+ # 线上库
+ url: jdbc:mysql://localhost:3306/online_eaxm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
+ username: root
+ password: 123456
+#mybatis配置
+mybatis:
+ configuration:
+ mapUnderscoreToCamelCase: true
+
+#mybatis-plus配置
+mybatis-plus:
+ configuration:
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt
new file mode 100644
index 0000000..b983864
--- /dev/null
+++ b/src/main/resources/banner.txt
@@ -0,0 +1,8 @@
+ ████████ ██ ████████ ██
+ ██░░░░░░ ░██ ░░░░░░██ ░██
+░██ ░██ ██████ ███████ ██ ░██ ██ ██
+░█████████░██████ ░░░░░░██ ░░██░░░██ ██ ░██████ ░██ ░██
+░░░░░░░░██░██░░░██ ███████ ░██ ░██ ██ ░██░░░██░██ ░██
+ ░██░██ ░██ ██░░░░██ ░██ ░██ ██ ░██ ░██░██ ░██
+ ████████ ░██ ░██░░████████ ███ ░██ ████████░██ ░██░░██████
+░░░░░░░░ ░░ ░░ ░░░░░░░░ ░░░ ░░ ░░░░░░░░ ░░ ░░ ░░░░░░
\ No newline at end of file