
猫九
V1
2023/05/14阅读:27主题:默认主题
学生选课系统--JPA应用
学生管理
1.增删改接口
学生注册(增)
//1.1添加学生
@PostMapping("/addStudent")
public JsonResult<Void> addStudent(Student student) {
studentService.addStudent(student);
JsonResult result= new JsonResult<Void>(OK);
if(result.getState()==200) result.setMessage("添加成功");
else{
result.setMessage("添加时出现未知错误");
}
return result;
@ PostMapping("/addStudent") 注解表示当向服务器的 "/addStudent" 端点发送 HTTP POST 请求时,应触发此方法。
该方法以一个 Student 对象作为参数,该对象应包含正在添加到系统中的新学生的所有必要详细信息。
studentService.addStudent(student) 行调用一个服务层方法实际将学生记录添加到数据库或执行任何其他必要操作。
JsonResult result = new JsonResult
(OK); 行创建一个新的 JsonResult 对象,其状态值为 "OK"。该对象可以用于以 JSON 格式格式化来自服务器的响应。
然后,代码检查结果对象的状态是否等于 200(即 OK)。如果是,消息将设置为 "添加成功",否则消息将设置为 "添加时出现未知错误"。
最后,该方法返回结果对象,该对象将被转换为 JSON 格式的响应并发送回进行 POST 请求的客户端。
/* 1.1添加学生 */
public void addStudent(Student student) {
Student byCode = studentRepository.findByCode(student.getCode());
if (byCode != null) {
throw new UsernameDuplicateException("学生已存在");
}
String salt = UUID.randomUUID().toString().toUpperCase();
String md5Password = getMd5Password(student.getPassword(), salt);
student.setPassword(md5Password);
// 补全数据:盐值
student.setSalt(salt);
studentRepository.save(student);
}
首先,代码通过调用studentRepository.findByCode(student.getCode())方法来检查学生数据库中是否已经存在具有相同学号的学生记录。如果存在,则抛出一个自定义的 UsernameDuplicateException 异常,表示学生已经存在。
如果学生不存在,则生成一个随机的盐值,使用该盐值和学生密码调用 getMd5Password 方法来生成一个加密后的密码。这个方法是通过将原始密码和盐值拼接在一起,然后进行 MD5 哈希运算来实现密码加密的。接着,代码将加密后的密码设置回学生对象中
最后,代码补全了该学生的数据,即设置盐值并保存该学生记录。注意,这里假定学生对象中的其他属性已经被正确设置。
如果保存成功,学生记录将被添加到数据库中。如果保存失败,可能会抛出相关的异常,如 DataAccessException 或其他与数据库相关的异常。
private String getMd5Password(String password, String salt) {
/*
* 加密规则:
* 1、无视原始密码的强度
* 2、使用UUID作为盐值,在原始密码的左右两侧拼接
* 3、循环加密3次
*/
for (int i = 0; i < 3; i++) {
password = DigestUtils.md5DigestAsHex((salt + password + salt).getBytes()).toUpperCase();
}
return password;
}
这段代码实现了一个用于对密码进行加密的方法 getMd5Password。该方法接收两个参数,即原始密码和盐值,返回加密后的密码。
该方法的加密规则分为三步:
首先,无论原始密码的强度如何,该方法都会忽略它的强度。这是因为在密码加密过程中,强度并不重要。相反,应该使用一个随机的盐值来增加加密的强度。
然后,该方法使用 UUID 作为盐值,在原始密码的左右两侧拼接。这样做的目的是使加密更加随机化和安全。
最后,该方法将拼接后的字符串循环加密3次。每次循环都使用MD5哈希算法将字符串转换为一个128位的哈希值,并将其转换为十六进制字符串。为了增加加密的强度,循环加密过程中每次都使用上一次加密后的结果作为新的原始密码,这样可以使哈希值更加随机化和安全。
最终,该方法返回经过三次循环加密后的密码,这个密码已经将原始密码和盐值结合起来,并且经过了多次哈希运算,从而增加了密码的强度和安全性。
//1.1通过code找学生,code不能重复
Student findByCode(String code);
这段代码定义了一个接口方法 findByCode,用于根据学号从学生数据库中查找学生记录。该方法接收一个 String 类型的参数 code,表示要查找的学生的学号,返回一个 Student 类型的对象。
在实现该方法时,应该在学生数据库中查询具有指定学号的学生记录,并将其封装成一个 Student 对象返回。如果找不到具有指定学号的学生记录,则应该返回 null。
此方法的作用是确保学生的学号是唯一的,因为在添加新的学生记录时,需要先使用该方法检查学生数据库中是否已经存在具有相同学号的学生记录,以避免重复添加学生记录。
/** 用户数据不存在的异常 */
public class UserNotFoundException extends ServiceException {
public UserNotFoundException() {
super();
}
public UserNotFoundException(String message) {
super(message);
}
public UserNotFoundException(String message, Throwable cause) {
super(message, cause);
}
public UserNotFoundException(Throwable cause) {
super(cause);
}
protected UserNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
这段代码定义了一个自定义异常 UsernameDuplicateException,它继承自 ServiceException 异常。该异常用于表示当试图向学生数据库中添加已经存在的学生记录时,将抛出的异常。
该自定义异常有多个构造函数,用于在不同的情况下抛出异常并携带不同的信息。例如,当只需要传递一个异常信息时,可以使用 UsernameDuplicateException(String message) 构造函数。当需要传递更详细的信息或异常原因时,可以使用其他构造函数。
自定义异常的作用是提供更具体的异常信息,以便在发生异常时更好地处理异常。此外,它还可以帮助识别程序中的问题,从而提高代码的可读性和可维护性。在这个例子中,当试图向学生数据库中添加已经存在的学生记录时,将抛出 UsernameDuplicateException 异常,以提示用户无法添加重复的记录。
学生删除
//1.2根据id删除学生
@PostMapping("/deleteStudentById")
public JsonResult<Void> deleteStudentById(Integer id) {
studentService.deleteStudentById(id);
JsonResult result= new JsonResult<Void>(OK);
if(result.getState()==200) result.setMessage("删除成功");
else{
result.setMessage("删除时出现未知错误");
}
return result;
}
这段代码实现了根据学生ID从学生数据库中删除学生记录的功能。它是一个基于Spring MVC框架的控制器方法,使用了 @PostMapping 注解来映射 HTTP POST 请求到 "/deleteStudentById" 路径上。
该方法首先调用 studentService.deleteStudentById(id) 方法,将指定ID对应的学生记录从数据库中删除。然后,它创建一个 JsonResult
对象,并将其状态值设置为 OK(即200)。
接着,代码通过检查结果对象的状态值来判断学生记录是否成功删除。如果状态值为200,则表示学生记录已成功删除,将消息设置为 "删除成功";否则,将消息设置为 "删除时出现未知错误"。
最后,该方法返回结果对象,该对象将被转换为 JSON 格式的响应并发送回客户端。客户端可以根据返回的状态值和消息来判断是否成功删除学生记录。
学生修改个人信息
2.查询接口
(1)实现根据姓名和密码的登录接口
(2)实现根据id查询学生信息的接口
(3)实现根据code查询学生的接口
作者介绍

猫九
V1
学生