学工管理系统
小明:嘿,李老师,我最近在做一个学生管理信息系统,想加个请假功能,您能帮我看看怎么实现吗?
李老师:当然可以。你先说说,这个请假功能需要哪些基本功能呢?
小明:嗯,用户要能提交请假申请,包括请假类型、时间、原因等信息,然后老师或管理员审核,最后系统通知学生结果。

李老师:听起来不错。那你可以考虑用数据库来存储这些数据。比如,创建一个请假表,包含学生的ID、请假开始时间、结束时间、类型、状态、原因等字段。
小明:明白了。那具体怎么设计数据库呢?
李老师:我们可以使用MySQL或者PostgreSQL这样的关系型数据库。例如,创建一个名为“leave_request”的表,结构如下:
CREATE TABLE leave_request (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
leave_type VARCHAR(50) NOT NULL,
reason TEXT,
status ENUM('pending', 'approved', 'rejected') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
小明:这个表结构很清晰。那接下来我要怎么在系统中实现这个功能呢?
李老师:如果你是用Java语言开发,建议使用Spring Boot框架,这样开发效率高,而且易于维护。你可以用Spring Data JPA来操作数据库。
小明:那我可以写一个实体类来映射这个表吗?
李老师:对的。你可以创建一个LeaveRequest实体类,代码如下:
@Entity
public class LeaveRequest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long studentId;
private LocalDate startDate;
private LocalDate endDate;
private String leaveType;
private String reason;
@Enumerated(EnumType.STRING)
private LeaveStatus status;
private LocalDateTime createdAt;
// getters and setters
}
小明:这样就可以和数据库直接交互了。那如何实现请假申请的提交呢?
李老师:你可以创建一个REST API,比如一个POST接口,接收前端传来的请假信息。然后保存到数据库中。
小明:那具体的Controller代码是怎样的呢?
李老师:下面是一个简单的例子:
@RestController
@RequestMapping("/api/leave")
public class LeaveController {
@Autowired
private LeaveService leaveService;
@PostMapping("/submit")
public ResponseEntity submitLeave(@RequestBody LeaveRequest request) {
return ResponseEntity.ok(leaveService.submitLeave(request));
}
@GetMapping("/student/{studentId}")
public ResponseEntity> getLeavesByStudent(@PathVariable Long studentId) {
return ResponseEntity.ok(leaveService.getLeavesByStudent(studentId));
}
}
小明:这看起来很合理。那服务层的逻辑应该怎么写呢?
李老师:服务层负责业务逻辑,比如检查请假时间是否合法,是否有冲突等。这里是一个简单的示例:
@Service
public class LeaveService {
@Autowired
private LeaveRepository leaveRepository;
public LeaveRequest submitLeave(LeaveRequest request) {
// 检查请假时间是否有效
if (request.getStartDate().isAfter(request.getEndDate())) {
throw new IllegalArgumentException("请假开始时间不能晚于结束时间");
}
// 检查是否有重复请假
List existingRequests = leaveRepository.findByStudentIdAndDateBetween(
request.getStudentId(), request.getStartDate(), request.getEndDate()
);
if (!existingRequests.isEmpty()) {
throw new IllegalArgumentException("该时间段已有请假记录");
}
request.setStatus(LeaveStatus.PENDING);
request.setCreatedAt(LocalDateTime.now());
return leaveRepository.save(request);
}
public List getLeavesByStudent(Long studentId) {
return leaveRepository.findByStudentId(studentId);
}
}
小明:这样就完成了请假的提交和查询功能。那审核功能该怎么实现呢?
李老师:审核功能通常由老师或管理员完成。你可以添加一个更新状态的接口,比如PUT方法,用来修改请假的状态。
小明:那具体的代码是怎样的呢?
李老师:你可以这样写:
@PutMapping("/approve/{id}")
public ResponseEntity approveLeave(@PathVariable Long id) {
return ResponseEntity.ok(leaveService.approveLeave(id));
}
@PutMapping("/reject/{id}")
public ResponseEntity rejectLeave(@PathVariable Long id) {
return ResponseEntity.ok(leaveService.rejectLeave(id));
}
小明:那服务层的approve和reject方法应该怎么写呢?
李老师:服务层代码如下:
public LeaveRequest approveLeave(Long id) {
LeaveRequest request = leaveRepository.findById(id).orElseThrow(() -> new RuntimeException("请假记录不存在"));
request.setStatus(LeaveStatus.APPROVED);
return leaveRepository.save(request);
}
public LeaveRequest rejectLeave(Long id) {
LeaveRequest request = leaveRepository.findById(id).orElseThrow(() -> new RuntimeException("请假记录不存在"));
request.setStatus(LeaveStatus.REJECTED);
return leaveRepository.save(request);
}
小明:这样就完成了审批功能。那系统还需要通知学生吗?
李老师:是的,可以通过邮件或短信通知学生。你可以集成第三方API,比如发送邮件时使用JavaMail,或者调用短信平台接口。
小明:那我可以把通知功能放在服务层里吗?
李老师:可以,但要注意异步处理,避免阻塞主线程。你可以使用Spring的@Async注解,将通知任务放到后台线程执行。
小明:明白了。那现在整个请假功能的大致流程已经清晰了。
李老师:没错。你还得注意权限控制,确保只有老师或管理员才能审核请假。你可以用Spring Security来实现角色管理。
小明:好的,我会继续完善这个功能。
李老师:加油!如果遇到问题,随时来找我讨论。