小明:嘿,小李,最近我在做一个关于师范大学学生工作管理系统的项目,你对这个系统有了解吗?
小李:哦,学生工作管理系统啊,我之前也接触过一些。你是用什么技术做的呢?
小明:目前是用Spring Boot来开发的,感觉挺适合做这种管理系统。不过现在遇到了一个难题,就是请假模块怎么设计比较好。
小李:请假模块?那应该是一个比较基础的功能吧。你要考虑用户提交请假申请、老师审批、系统记录这些流程。
小明:没错,而且还要考虑到不同角色的权限问题,比如学生只能提交请假,老师可以审批,管理员可能需要查看所有记录。
小李:那你可以先从数据库设计开始。请假信息通常包括学生ID、姓名、课程名称、请假类型(事假、病假等)、时间、原因、状态(待审批、已批准、已拒绝)等字段。
小明:嗯,那我应该怎么设计表结构呢?有没有具体的代码示例?
小李:当然有,我可以给你写一个简单的例子。首先,创建一个请假表,比如叫leave_request。
小明:好的,那我来写一下SQL语句。
小李:你可以这样写:
CREATE TABLE leave_request (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
student_id VARCHAR(20) NOT NULL,
name VARCHAR(50) NOT NULL,
course_name VARCHAR(100) NOT NULL,
leave_type ENUM('事假', '病假', '其他') NOT NULL,
start_time DATETIME NOT NULL,
end_time DATETIME NOT NULL,
reason TEXT,
status ENUM('待审批', '已批准', '已拒绝') DEFAULT '待审批',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
小明:这看起来很清晰。那接下来是后端逻辑部分,你怎么处理呢?
小李:Spring Boot的话,可以用RESTful API来实现。比如,学生提交请假请求时,调用一个POST接口,将数据传入。
小明:那具体的Java类怎么写呢?
小李:我们可以创建一个LeaveRequest实体类,对应数据库表。
小明:那具体代码是怎样的?
小李:如下所示:
@Entity
@Table(name = "leave_request")
public class LeaveRequest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String studentId;
private String name;
private String courseName;
private String leaveType;
private LocalDateTime startTime;
private LocalDateTime endTime;
private String reason;
private String status;
private LocalDateTime createTime;
// Getters and Setters
}
小明:明白了,那接下来是Service层,负责处理业务逻辑,比如保存请假请求。
小李:对的,你可以写一个LeaveService类,里面包含save方法。
小明:那具体怎么写呢?
小李:例如:
@Service
public class LeaveService {
@Autowired
private LeaveRepository leaveRepository;
public LeaveRequest saveLeaveRequest(LeaveRequest leaveRequest) {
return leaveRepository.save(leaveRequest);
}
}
小明:那Controller层呢?是不是要处理HTTP请求?
小李:没错,你可以写一个LeaveController,接收POST请求,把参数封装成LeaveRequest对象,然后调用Service保存。
小明:那具体代码是怎样的?
小李:如下所示:
@RestController
@RequestMapping("/api/leave")
public class LeaveController {
@Autowired
private LeaveService leaveService;
@PostMapping("/submit")
public ResponseEntity submitLeave(@RequestBody LeaveRequest request) {
return ResponseEntity.ok(leaveService.saveLeaveRequest(request));
}
}
小明:看来这个流程已经很清晰了。那审批功能怎么实现呢?
小李:审批功能需要老师登录后查看待审批的请假请求,并进行操作。这时候你可以设计一个查询接口,返回状态为“待审批”的记录。
小明:那怎么在Controller里实现呢?
小李:比如,可以添加一个GET接口,根据status查询:
@GetMapping("/pending")
public ResponseEntity> getPendingRequests() {
List requests = leaveService.findPendingRequests();
return ResponseEntity.ok(requests);
}
小明:那Service层需要怎么实现呢?
小李:在LeaveService中,可以写一个方法,调用Repository查询状态为“待审批”的记录:
public ListfindPendingRequests() { return leaveRepository.findByStatus("待审批"); }
小明:那Repository层呢?是不是要定义一个自定义查询方法?
小李:是的,可以在LeaveRepository接口中添加如下方法:
public interface LeaveRepository extends JpaRepository{ List findByStatus(String status); }

小明:明白了。那审批功能还需要更新状态,比如老师点击批准或拒绝,该怎么处理呢?
小李:你可以再写一个PUT接口,用来更新请假记录的状态。
小明:那具体代码是怎样的?
小李:比如:
@PutMapping("/update-status/{id}")
public ResponseEntity updateStatus(@PathVariable Long id, @RequestParam String status) {
return ResponseEntity.ok(leaveService.updateStatus(id, status));
}
小明:那Service层怎么处理呢?
小李:在LeaveService中,可以写一个方法,根据ID查找记录,然后更新状态:
public LeaveRequest updateStatus(Long id, String status) {
LeaveRequest request = leaveRepository.findById(id).orElseThrow(() -> new RuntimeException("请假记录不存在"));
request.setStatus(status);
return leaveRepository.save(request);
}
小明:听起来不错。那前端怎么调用这些API呢?
小李:前端可以通过AJAX或者Fetch API发送请求,比如提交请假请求时使用POST,审批时使用PUT。
小明:那权限控制方面呢?比如只有老师才能审批,学生只能提交。
小李:这个就需要用到Spring Security来实现权限控制。你可以配置不同的角色,比如Student和Teacher,分别赋予不同的访问权限。
小明:那具体怎么配置呢?
小李:可以定义一个SecurityConfig类,继承WebSecurityConfigurerAdapter,并配置权限规则。
小明:那具体代码是怎样的?
小李:比如:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/leave/**").hasRole("STUDENT")
.antMatchers("/api/leave/update-status/**").hasRole("TEACHER")
.anyRequest().authenticated()
.and()
.formLogin();
}
}
小明:这样就能限制不同角色的访问权限了。
小李:没错,这就是一个基本的请假模块的实现思路。当然,还可以进一步优化,比如添加通知功能、请假记录导出、审批历史查看等。
小明:太好了,谢谢你!我现在对这个系统有了更清晰的认识。
小李:不客气,如果你还有其他问题,随时问我!
