From 9f388da5c76f96baf02ffe8b4b063dfc7f4e363d Mon Sep 17 00:00:00 2001 From: awinx Date: Sun, 14 Dec 2025 20:48:45 +0800 Subject: [PATCH] =?UTF-8?q?stu01:=E8=80=81=E5=B8=88=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stu01/prompt.txt | 13 +- .../stu01/controller/TeacherController.java | 56 +++++++++ .../top/awinx/stu01/dto/TeacherAddDTO.java | 24 ++++ .../top/awinx/stu01/dto/TeacherUpdateDTO.java | 19 +++ .../java/top/awinx/stu01/entity/Course.java | 36 ++++++ .../java/top/awinx/stu01/entity/Teacher.java | 41 ++++++ .../top/awinx/stu01/mapper/CourseMapper.java | 12 ++ .../top/awinx/stu01/mapper/TeacherMapper.java | 12 ++ .../awinx/stu01/service/TeacherService.java | 26 ++++ .../service/impl/TeacherServiceImpl.java | 117 ++++++++++++++++++ .../compile/default-compile/inputFiles.lst | 7 ++ 11 files changed, 354 insertions(+), 9 deletions(-) create mode 100644 stu01/src/main/java/top/awinx/stu01/controller/TeacherController.java create mode 100644 stu01/src/main/java/top/awinx/stu01/dto/TeacherAddDTO.java create mode 100644 stu01/src/main/java/top/awinx/stu01/dto/TeacherUpdateDTO.java create mode 100644 stu01/src/main/java/top/awinx/stu01/entity/Course.java create mode 100644 stu01/src/main/java/top/awinx/stu01/entity/Teacher.java create mode 100644 stu01/src/main/java/top/awinx/stu01/mapper/CourseMapper.java create mode 100644 stu01/src/main/java/top/awinx/stu01/mapper/TeacherMapper.java create mode 100644 stu01/src/main/java/top/awinx/stu01/service/TeacherService.java create mode 100644 stu01/src/main/java/top/awinx/stu01/service/impl/TeacherServiceImpl.java diff --git a/stu01/prompt.txt b/stu01/prompt.txt index 7b711bc..89cd351 100644 --- a/stu01/prompt.txt +++ b/stu01/prompt.txt @@ -12,17 +12,17 @@ 所有操作均基于下方《学生管理系统(测试用例适配)开发任务计划表》,每次会话需携带该计划表的最新版本(含已完成任务标注): 阶段 任务 ID 任务名称 核心目标 关键提示词 完成状态 备注(仅保留执行结果和后续影响) 1. 项目初始化与环境搭建 1.1 创建 SpringBoot 后端基础项目 搭建后端工程骨架,引入核心依赖 SpringBoot、MySQL 驱动、MyBatis、JWT、lombok 已完成 Spring Boot 3.4.12,包名 top.awinx.stu01,Java 25;依赖:MyBatis-Plus 3.5.15、JJWT 0.13.0;启动方式:./mvnw spring-boot:run -1. 项目初始化与环境搭建 1.3 设计 MySQL 数据库表结构 设计核心实体表 用户表、学生表、教师表、课程表、学分表 已完成 数据库 stu01_db(MariaDB),用户 stu01/123456;核心表含 sys_user(预置 admin/stu001/tea001,密码 123456);字段约束:学号 / 教师编号 8 位纯数字,专业限 3 类,课程名 2-20 字符,分数 0-100 +1. 项目初始化与环境搭建 1.3 设计 MySQL 数据库表结构 设计核心实体表 用户表、学生表、教师表、课程表、学分表 已完成 数据库 stu01_db(MariaDB),用户 stu01/123456;核心表结构更新:teacher 表移除 major/title,仅保留 tea_no/name/user_id,外键关联 sys_user.id;预置测试数据:teacher 表 tea001 关联 user_id=3(tea001) 1. 项目初始化与环境搭建 1.4 后端基础配置 配置数据库、跨域、JWT 参数 application.yml、跨域、JWT 密钥 已完成 数据库连接正常;跨域允许 5173 端口(独立 CorsConfig);JWT:32 位密钥、1 小时过期;context-path=/api,端口 8080;MyBatis-Plus 开启下划线转驼峰、SQL 日志 2. 用户登录模块开发 2.1 后端用户登录核心逻辑 实现账号密码校验 合法账号、缺少账号 / 密码、错误账号密码 已完成 接口:POST /api/login;校验逻辑:空值 + 存在性 + 密码匹配;返回格式:Result(code/message/data) 2. 用户登录模块开发 2.2 JWT 令牌生成与校验 生成 token、校验 token、令牌刷新 合法 token、token 拦截、令牌刷新 已完成 接口:① POST /api/login(返回 token+user);② GET /api/login/refresh(刷新 token);JWT 拦截器放行登录 / 刷新接口,拦截其他 /api/**;token 载荷含 user_type(1 - 学生 / 2 - 教师 / 3 - 管理员) 2. 用户登录模块开发 2.4 登录异常处理 统一异常返回格式,明确异常信息 缺少账号 / 密码、错误账号密码、token 无效 / 过期 已完成 全局异常处理器捕获业务 / 参数 / 系统异常;返回统一 Result 格式:业务异常 code=400、系统异常 code=500;支持空参数、账号密码错误、token 异常等场景,提示信息简洁 2. 用户登录模块开发 2.5 多用户登录性能基础支持 支持高并发请求 多用户登陆性能测试 已完成 依赖 Spring Boot 3.x 默认线程池 3. 学生信息模块开发 3.1 后端学生基础 CRUD 实现学生添加 / 查询接口(支持模糊查询) 学生添加、学生查询(学号 / 姓名 / 专业筛选) 已完成 1. 接口:① POST /api/student/add(添加,校验学号唯一);② GET/POST/api/student/query(查询,学号精确、姓名 / 专业模糊);2. 依赖 JWT 拦截器,需携带合法 token;3. 返回格式统一为 Result,兼容全局异常处理;4. 支持组合条件筛选 -3. 学生信息模块开发 3.2 学生添加参数校验 校验学号、专业合法性 缺少学号、不合法学号、非法专业 已完成 学号规则:8 位纯数字、非空、唯一;专业限计算机 / 数学 / 英语;用 3.x 参数校验注解 -3. 学生信息模块开发 3.3 学生查询参数校验 校验 ID 合法性、防 SQL 注入 合法 ID、非法 ID、SQL 注入拦截 未完成 防注入:MyBatis-Plus 参数绑定;ID 校验:非负整数 + 存在性 +3. 学生信息模块开发 3.2 学生添加参数校验 校验学号、专业合法性 缺少学号、不合法学号、非法专业 已完成 学号规则:8 位纯数字、非空、唯一;专业限计算机 / 数学 / 英语;用 3.x 参数校验注解;添加 spring-boot-starter-validation 依赖,修复 Long 类型 @Pattern 注解误用问题,校验正常触发 +3. 学生信息模块开发 3.3 学生查询参数校验 校验 ID 合法性、防 SQL 注入 合法 ID、非法 ID、SQL 注入拦截 已完成 1. 跳过分组校验设计(留作软件测试工程实践报告素材,后续忽略);2. 仅保留基础校验:ID 非负整数 + 存在性、MyBatis-Plus 参数预编译防 SQL 注入;3. 简化代码,无分组相关逻辑 3. 学生信息模块开发 3.5 学生并发测试基础支持 支持添加 / 查询接口并发请求 学生查询 / 添加并发测试 未完成 依赖 3.x 默认配置 -4. 教师信息模块开发 4.1 后端教师基础 CRUD 实现教师添加 / 更新 / 删除接口 教师添加、更新、删除 未完成 接口路径:POST /api/teacher/add、PUT /api/teacher/update、DELETE /api/teacher/delete +4. 教师信息模块开发 4.1 后端教师基础 CRUD 实现教师添加 / 更新 / 删除接口 教师添加、更新、删除 已完成 1. 适配新数据库结构:teacher 表移除 major/title,仅保留 tea_no/name/user_id,外键关联 sys_user.id;2. 校验逻辑:教师编号 8 位纯数字 + 唯一、姓名非空、关联 userId 存在且为教师类型(user_type=2);3. 仅支持更新教师姓名;4. 接口路径:POST /api/teacher/add、PUT /api/teacher/update、DELETE /api/teacher/delete/{id};5. 依赖 JWT 拦截器,需携带合法 token 4. 教师信息模块开发 4.2 教师删除关联拦截 教师关联课程 / 学分时拦截删除 删除关联拦截 未完成 校验逻辑:查询 course 表关联关系,存在则拦截;可选 @Transactional 事务处理 4. 教师信息模块开发 4.3 教师查询防 SQL 注入 校验查询参数、防 SQL 注入 教师查询、SQL 注入拦截 未完成 接口:/api/teacher/query;防注入:MyBatis-Plus 参数绑定 4. 教师信息模块开发 4.5 教师查询并发基础支持 确保教师查询接口支持并发请求 老师查询接口并发测试 未完成 依赖 3.x 默认配置 @@ -32,10 +32,5 @@ 5. 课程与学分模块开发 5.5 课程查询并发基础支持 确保课程查询接口支持并发请求 课程查询并发测试 未完成 依赖 3.x 默认配置 6. 权限控制模块开发 6.1 JWT 权限标识 令牌中添加用户类型 访问权限 - 未登录、权限标识 已完成 用户类型:1 - 学生、2 - 教师、3 - 管理员;JWT 载荷已包含 user_type 6. 权限控制模块开发 6.2 后端接口权限拦截 拦截未登录请求、越权访问请求 越权访问 - 学生 - 老师、学生 - 管理员、老师 - 管理员 未完成 基于 JWT 的 user_type 判断权限;拦截器扩展:学生禁访 /api/teacher/、/api/admin/,教师禁访 /api/admin/** -7. 测试适配与代码精简 7.1 测试用例全覆盖核对 逐一核对测试用例,确保功能点无遗漏 用例全覆盖、功能校验 未完成 核对类别:登录 / 学生 / 教师 / 课程学分 / 权限 / 并发 / 注入;适配 3.x、MariaDB -7. 测试适配与代码精简 7.2 代码精简 移除冗余逻辑,仅保留测试必需功能 代码简洁、无冗余 未完成 删除冗余代码,简化逻辑;移除无用配置依赖;统一异常处理逻辑 -7. 测试适配与代码精简 7.3 基础联调 确保后端接口通信正常,核心功能可运行 联调、接口通联 未完成 测试核心接口(登录、增删改查、权限、刷新);前后端跨域正常;数据库读写正常 三、执行反馈模块(每次会话必填) -问题解决:核心是添加了一个springboot的关于validation的starter依赖。 -确认3.2完成,开始3.3 \ No newline at end of file diff --git a/stu01/src/main/java/top/awinx/stu01/controller/TeacherController.java b/stu01/src/main/java/top/awinx/stu01/controller/TeacherController.java new file mode 100644 index 0000000..a70cb54 --- /dev/null +++ b/stu01/src/main/java/top/awinx/stu01/controller/TeacherController.java @@ -0,0 +1,56 @@ +package top.awinx.stu01.controller; + +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import top.awinx.stu01.common.Result; +import top.awinx.stu01.dto.TeacherAddDTO; +import top.awinx.stu01.dto.TeacherUpdateDTO; +import top.awinx.stu01.entity.Teacher; +import top.awinx.stu01.service.TeacherService; + +/** + * 教师CRUD控制器 + */ +@RestController +@RequestMapping("/teacher") +public class TeacherController { + + @Resource + private TeacherService teacherService; + + /** + * 添加教师 + * POST /api/teacher/add + */ + @PostMapping("/add") + public Result addTeacher(@RequestBody TeacherAddDTO addDTO) { + Teacher teacher = teacherService.addTeacher(addDTO); + return Result.success("添加教师成功", teacher); + } + + /** + * 更新教师 + * PUT /api/teacher/update + */ + @PutMapping("/update") + public Result updateTeacher(@RequestBody TeacherUpdateDTO updateDTO) { + boolean success = teacherService.updateTeacher(updateDTO); + return Result.success("更新教师成功", success); + } + + /** + * 删除教师 + * DELETE /api/teacher/delete/{id} + */ + @DeleteMapping("/delete/{id}") + public Result deleteTeacher(@PathVariable Long id) { + boolean success = teacherService.deleteTeacher(id); + return Result.success("删除教师成功", success); + } +} diff --git a/stu01/src/main/java/top/awinx/stu01/dto/TeacherAddDTO.java b/stu01/src/main/java/top/awinx/stu01/dto/TeacherAddDTO.java new file mode 100644 index 0000000..de035f5 --- /dev/null +++ b/stu01/src/main/java/top/awinx/stu01/dto/TeacherAddDTO.java @@ -0,0 +1,24 @@ +package top.awinx.stu01.dto; + +import lombok.Data; + +/** + * 教师添加请求DTO(适配新数据库结构) + */ +@Data +public class TeacherAddDTO { + /** + * 教师编号(8位纯数字) + */ + private String teaNo; + + /** + * 教师姓名(非空) + */ + private String name; + + /** + * 关联用户ID(外键关联sys_user.id,非空且存在) + */ + private Long userId; +} diff --git a/stu01/src/main/java/top/awinx/stu01/dto/TeacherUpdateDTO.java b/stu01/src/main/java/top/awinx/stu01/dto/TeacherUpdateDTO.java new file mode 100644 index 0000000..c3652b3 --- /dev/null +++ b/stu01/src/main/java/top/awinx/stu01/dto/TeacherUpdateDTO.java @@ -0,0 +1,19 @@ +package top.awinx.stu01.dto; + +import lombok.Data; + +/** + * 教师更新请求DTO(仅支持更新姓名) + */ +@Data +public class TeacherUpdateDTO { + /** + * 教师ID(必传,非空且存在) + */ + private Long id; + + /** + * 教师姓名(可选,非空) + */ + private String name; +} diff --git a/stu01/src/main/java/top/awinx/stu01/entity/Course.java b/stu01/src/main/java/top/awinx/stu01/entity/Course.java new file mode 100644 index 0000000..919abcb --- /dev/null +++ b/stu01/src/main/java/top/awinx/stu01/entity/Course.java @@ -0,0 +1,36 @@ +package top.awinx.stu01.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 课程实体类(匹配stu01_db.course表结构,用于教师删除关联校验) + */ +@Data +@TableName("course") +public class Course { + /** + * 课程ID(主键自增) + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 课程名称(2-20字符,中文/数字/字母) + */ + private String courseName; + + /** + * 关联教师ID(外键关联teacher.id) + */ + private Long teaId; + + /** + * 创建时间(数据库默认CURRENT_TIMESTAMP) + */ + private LocalDateTime createTime; +} diff --git a/stu01/src/main/java/top/awinx/stu01/entity/Teacher.java b/stu01/src/main/java/top/awinx/stu01/entity/Teacher.java new file mode 100644 index 0000000..5c01697 --- /dev/null +++ b/stu01/src/main/java/top/awinx/stu01/entity/Teacher.java @@ -0,0 +1,41 @@ +package top.awinx.stu01.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 教师实体类(严格匹配stu01_db.teacher表结构) + */ +@Data +@TableName("teacher") +public class Teacher { + /** + * 主键ID(自增) + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 教师编号(8位纯数字,唯一) + */ + private String teaNo; + + /** + * 教师姓名 + */ + private String name; + + /** + * 关联用户ID(外键关联sys_user.id) + */ + private Long userId; + + /** + * 创建时间(数据库默认CURRENT_TIMESTAMP) + */ + private LocalDateTime createTime; +} diff --git a/stu01/src/main/java/top/awinx/stu01/mapper/CourseMapper.java b/stu01/src/main/java/top/awinx/stu01/mapper/CourseMapper.java new file mode 100644 index 0000000..cce9b89 --- /dev/null +++ b/stu01/src/main/java/top/awinx/stu01/mapper/CourseMapper.java @@ -0,0 +1,12 @@ +package top.awinx.stu01.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import top.awinx.stu01.entity.Course; + +/** + * 课程Mapper(仅用于查询教师关联的课程记录) + */ +@Mapper +public interface CourseMapper extends BaseMapper { +} diff --git a/stu01/src/main/java/top/awinx/stu01/mapper/TeacherMapper.java b/stu01/src/main/java/top/awinx/stu01/mapper/TeacherMapper.java new file mode 100644 index 0000000..15ca0c1 --- /dev/null +++ b/stu01/src/main/java/top/awinx/stu01/mapper/TeacherMapper.java @@ -0,0 +1,12 @@ +package top.awinx.stu01.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import top.awinx.stu01.entity.Teacher; + +/** + * 教师Mapper(MyBatis-Plus基础CRUD) + */ +@Mapper +public interface TeacherMapper extends BaseMapper { +} diff --git a/stu01/src/main/java/top/awinx/stu01/service/TeacherService.java b/stu01/src/main/java/top/awinx/stu01/service/TeacherService.java new file mode 100644 index 0000000..4f84314 --- /dev/null +++ b/stu01/src/main/java/top/awinx/stu01/service/TeacherService.java @@ -0,0 +1,26 @@ +package top.awinx.stu01.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import top.awinx.stu01.dto.TeacherAddDTO; +import top.awinx.stu01.dto.TeacherUpdateDTO; +import top.awinx.stu01.entity.Teacher; + +/** + * 教师Service接口 + */ +public interface TeacherService extends IService { + /** + * 添加教师 + */ + Teacher addTeacher(TeacherAddDTO addDTO); + + /** + * 更新教师 + */ + boolean updateTeacher(TeacherUpdateDTO updateDTO); + + /** + * 删除教师 + */ + boolean deleteTeacher(Long id); +} diff --git a/stu01/src/main/java/top/awinx/stu01/service/impl/TeacherServiceImpl.java b/stu01/src/main/java/top/awinx/stu01/service/impl/TeacherServiceImpl.java new file mode 100644 index 0000000..6b89a9c --- /dev/null +++ b/stu01/src/main/java/top/awinx/stu01/service/impl/TeacherServiceImpl.java @@ -0,0 +1,117 @@ +package top.awinx.stu01.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import top.awinx.stu01.dto.TeacherAddDTO; +import top.awinx.stu01.dto.TeacherUpdateDTO; +import top.awinx.stu01.entity.Course; +import top.awinx.stu01.entity.SysUser; +import top.awinx.stu01.entity.Teacher; +import top.awinx.stu01.exception.BusinessException; +import top.awinx.stu01.mapper.CourseMapper; +import top.awinx.stu01.mapper.SysUserMapper; +import top.awinx.stu01.mapper.TeacherMapper; +import top.awinx.stu01.service.TeacherService; + +import java.time.LocalDateTime; + +/** + * 教师Service实现类(新增删除关联拦截逻辑) + */ +@Service +public class TeacherServiceImpl extends ServiceImpl implements TeacherService { + + @Resource + private SysUserMapper sysUserMapper; + // 新增:注入CourseMapper用于关联校验 + @Resource + private CourseMapper courseMapper; + + @Override + public Teacher addTeacher(TeacherAddDTO addDTO) { + // 1. 基础参数非空+格式校验 + if (addDTO.getTeaNo() == null || !addDTO.getTeaNo().matches("^\\d{8}$")) { + throw new BusinessException("教师编号必须为8位纯数字"); + } + if (addDTO.getName() == null || addDTO.getName().trim().isEmpty()) { + throw new BusinessException("教师姓名不能为空"); + } + if (addDTO.getUserId() == null || addDTO.getUserId() < 0) { + throw new BusinessException("关联用户ID不能为空且为非负整数"); + } + + // 2. 教师编号唯一性校验 + LambdaQueryWrapper teaWrapper = new LambdaQueryWrapper<>(); + teaWrapper.eq(Teacher::getTeaNo, addDTO.getTeaNo()); + if (this.count(teaWrapper) > 0) { + throw new BusinessException("教师编号" + addDTO.getTeaNo() + "已存在"); + } + + // 3. 关联用户ID存在性校验(外键约束前置校验) + SysUser sysUser = sysUserMapper.selectById(addDTO.getUserId()); + if (sysUser == null) { + throw new BusinessException("关联的用户ID" + addDTO.getUserId() + "不存在(sys_user表无此记录)"); + } + // 额外校验:关联用户类型必须是教师(user_type=2) + if (sysUser.getUserType() != 2) { + throw new BusinessException("关联的用户ID" + addDTO.getUserId() + "不是教师类型(user_type必须为2)"); + } + + // 4. DTO转实体(createTime由数据库默认值填充,也可手动设置) + Teacher teacher = new Teacher(); + teacher.setTeaNo(addDTO.getTeaNo()); + teacher.setName(addDTO.getName()); + teacher.setUserId(addDTO.getUserId()); + teacher.setCreateTime(LocalDateTime.now()); // 与数据库CURRENT_TIMESTAMP保持一致 + + this.save(teacher); + return teacher; + } + + @Override + public boolean updateTeacher(TeacherUpdateDTO updateDTO) { + // 1. 校验教师ID存在性 + if (updateDTO.getId() == null || !this.existsById(updateDTO.getId())) { + throw new BusinessException("教师ID不存在,更新失败"); + } + + // 2. 校验更新的姓名非空 + if (updateDTO.getName() != null && updateDTO.getName().trim().isEmpty()) { + throw new BusinessException("教师姓名不能为空"); + } + + // 3. 构建更新实体(仅更新姓名) + Teacher teacher = new Teacher(); + teacher.setId(updateDTO.getId()); + if (updateDTO.getName() != null) { + teacher.setName(updateDTO.getName()); + } + + return this.updateById(teacher); + } + + @Override + public boolean deleteTeacher(Long id) { + // 1. 基础校验:教师ID存在性 + if (id == null || !this.existsById(id)) { + throw new BusinessException("教师ID不存在,删除失败"); + } + + // 2. 新增:关联课程校验(核心拦截逻辑) + LambdaQueryWrapper courseWrapper = new LambdaQueryWrapper<>(); + courseWrapper.eq(Course::getTeaId, id); // 匹配course表中关联的教师ID + long relatedCourseCount = courseMapper.selectCount(courseWrapper); + if (relatedCourseCount > 0) { + throw new BusinessException("教师ID" + id + "关联了" + relatedCourseCount + "门课程,禁止删除"); + } + + // 3. 无关联课程时执行物理删除 + return this.removeById(id); + } + + private boolean existsById(Long id) { + return this.count(new LambdaQueryWrapper().eq(Teacher::getId, id)) > 0; + } +} diff --git a/stu01/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/stu01/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index b350bb0..814f9f2 100644 --- a/stu01/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/stu01/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -5,19 +5,26 @@ /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/config/WebMvcConfig.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/controller/LoginController.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/controller/StudentController.java +/home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/controller/TeacherController.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/controller/TestController.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/dto/LoginRequest.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/dto/StudentAddDTO.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/dto/StudentQueryDTO.java +/home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/dto/TeacherAddDTO.java +/home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/dto/TeacherUpdateDTO.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/entity/Student.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/entity/SysUser.java +/home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/entity/Teacher.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/exception/BusinessException.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/exception/GlobalExceptionHandler.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/interceptor/JwtInterceptor.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/mapper/StudentMapper.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/mapper/SysUserMapper.java +/home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/mapper/TeacherMapper.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/service/StudentService.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/service/SysUserService.java +/home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/service/TeacherService.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/service/impl/StudentServiceImpl.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/service/impl/SysUserServiceImpl.java +/home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/service/impl/TeacherServiceImpl.java /home/awinx/code/java/lerning/java_web/stu01/src/main/java/top/awinx/stu01/utils/JwtUtil.java