小李:嘿,张哥,我最近在做一个关于学工管理系统的项目,想了解一下怎么实现请假功能,你有经验吗?
张哥:哦,你说的是学工管理系统吧?这个系统一般用于学校管理学生信息、考勤、请假等。请假功能是其中很重要的一部分。你是用什么语言开发的?
小李:我现在用的是Java,Spring Boot框架,数据库是MySQL。
张哥:那挺不错的,Java在企业级应用中非常常见。那请假功能要怎么设计呢?首先你需要一个请假申请表单,用户填写请假原因、时间、类型等信息。
小李:对,然后这些数据需要保存到数据库里。那具体怎么设计数据库呢?
张哥:你可以创建一个名为leave的表,字段包括id(主键)、student_id(学生ID)、start_date(开始时间)、end_date(结束时间)、reason(原因)、status(状态)等。比如:
CREATE TABLE leave (
id INT PRIMARY KEY AUTO_INCREMENT,
student_id VARCHAR(20) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
reason TEXT,
status ENUM('pending', 'approved', 'rejected') DEFAULT 'pending'
);


小李:明白了,那前端页面怎么设计呢?是不是要让用户输入这些信息?
张哥:是的,前端可以用HTML和CSS做表单,再用JavaScript进行简单的验证。比如检查日期是否合理,或者是否为空。
小李:那后端怎么处理这些请求呢?有没有具体的代码示例?
张哥:当然有。我们可以用Spring Boot来构建REST API。例如,一个提交请假申请的接口可以这样写:
@RestController
@RequestMapping("/api/leave")
public class LeaveController {
@Autowired
private LeaveService leaveService;
@PostMapping("/submit")
public ResponseEntity<String> submitLeave(@RequestBody LeaveRequest request) {
try {
leaveService.submitLeave(request);
return ResponseEntity.ok("请假申请已提交");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("提交失败");
}
}
}
小李:那服务层的逻辑是怎么写的?
张哥:服务层主要是处理业务逻辑,比如校验用户是否存在、请假时间是否合法等。下面是一个简单的例子:
@Service
public class LeaveService {
@Autowired
private LeaveRepository leaveRepository;
public void submitLeave(LeaveRequest request) {
// 校验学生是否存在
if (!studentExists(request.getStudentId())) {
throw new RuntimeException("学生不存在");
}
// 检查请假时间是否合法
if (request.getStart_date().isAfter(request.getEnd_date())) {
throw new RuntimeException("开始时间不能晚于结束时间");
}
// 保存请假记录
Leave leave = new Leave();
leave.setStudentId(request.getStudentId());
leave.setStartDate(request.getStart_date());
leave.setEndDate(request.getEnd_date());
leave.setReason(request.getReason());
leave.setStatus("pending");
leaveRepository.save(leave);
}
private boolean studentExists(String studentId) {
// 这里可以调用学生服务或直接查询数据库
return true;
}
}
小李:那数据库操作部分呢?是不是用JPA?
张哥:对,我们用JPA来操作数据库。下面是LeaveRepository的定义:
@Repository
public interface LeaveRepository extends JpaRepository {
}
小李:那请假状态怎么更新呢?比如管理员审核之后,状态变成“approved”或“rejected”。
张哥:这部分也可以通过REST API来实现。比如,提供一个审批接口:
@PutMapping("/approve/{id}")
public ResponseEntity<String> approveLeave(@PathVariable Long id) {
try {
leaveService.approveLeave(id);
return ResponseEntity.ok("审批成功");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("未找到该请假记录");
}
}
小李:服务层的approveLeave方法怎么写?
张哥:这里需要根据ID查找请假记录,然后修改状态。如下:
public void approveLeave(Long id) {
Leave leave = leaveRepository.findById(id)
.orElseThrow(() -> new RuntimeException("请假记录不存在"));
leave.setStatus("approved");
leaveRepository.save(leave);
}
小李:那如果是拒绝呢?是不是类似的方法?
张哥:是的,只需要把状态改成“rejected”即可。另外,还可以添加一个备注字段,让管理员填写拒绝理由。
小李:听起来挺完整的。那整个流程是不是就完成了?
张哥:大致如此。不过实际开发中还需要考虑权限控制、日志记录、邮件通知等功能。比如,当请假被批准后,可以自动发送一封邮件给学生。
小李:那权限控制怎么实现?是不是要用Spring Security?
张哥:没错,Spring Security可以用来管理用户的访问权限。比如,只有管理员才能审批请假,普通学生只能提交申请。
小李:明白了,那这个请假功能现在就可以运行了吧?
张哥:是的,只要前后端配合好,数据库配置正确,就能正常工作了。如果你需要更详细的代码结构或部署说明,我可以继续给你讲解。
小李:太好了,谢谢你,张哥!
张哥:不客气,有问题随时问我。
本站部分内容及素材来源于互联网,如有侵权,联系必删!



客服经理