张伟:你好,李娜,最近我在研究学校学工管理系统,特别是关于请假功能的实现,你有没有相关经验?
李娜:你好,张伟。是啊,我们学校现在用的是一个基于Java的学工管理系统,其中请假功能确实是一个核心模块。你想了解哪方面的内容?
张伟:我想知道这个请假功能是怎么设计的,特别是如何处理学生的请假申请和审批流程。
李娜:好的,那我们就从系统架构开始聊起吧。我们学校的系统是采用Spring Boot框架开发的,数据库使用的是MySQL,前端则是用Vue.js来实现的。
张伟:听起来挺现代化的。那请假功能是如何实现数据存储的呢?
李娜:我们有一个名为“leave_request”的表,用来保存学生的请假信息。字段包括学生ID、姓名、请假类型(比如事假、病假)、开始时间、结束时间、请假原因、状态(待审批、已批准、已拒绝)等。
张伟:明白了。那在后端,你是怎么处理这些数据的呢?有没有具体的代码示例?
李娜:当然有。我们使用了一个RESTful API来处理请假请求。下面是一个简单的控制器类代码:
package com.example.leave.controller;
import com.example.leave.model.LeaveRequest;
import com.example.leave.service.LeaveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/leave")
public class LeaveController {
@Autowired
private LeaveService leaveService;
@PostMapping("/submit")
public LeaveRequest submitLeave(@RequestBody LeaveRequest request) {
return leaveService.submitLeave(request);
}
@GetMapping("/list")
public List
return leaveService.getAllLeaves();
}
@PutMapping("/update-status/{id}")
public LeaveRequest updateStatus(@PathVariable Long id, @RequestParam String status) {
return leaveService.updateStatus(id, status);
}
}
张伟:这段代码看起来很清晰。那服务层是怎么实现的呢?
李娜:服务层主要负责业务逻辑的处理。比如,当学生提交请假申请时,我们需要验证请假时间是否合法,是否超过规定天数等。下面是服务层的一个示例代码:
package com.example.leave.service;
import com.example.leave.model.LeaveRequest;
import com.example.leave.repository.LeaveRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class LeaveService {
@Autowired
private LeaveRepository leaveRepository;
public LeaveRequest submitLeave(LeaveRequest request) {
// 验证请假时间是否合法
if (request.getStartDate().isAfter(request.getEndDate())) {
throw new IllegalArgumentException("请假开始时间不能晚于结束时间");
}
// 检查是否超过最大请假天数
long days = java.time.temporal.ChronoUnit.DAYS.between(request.getStartDate(), request.getEndDate());
if (days > 3) {
throw new IllegalArgumentException("最多只能请假3天");
}
request.setStatus("待审批");
return leaveRepository.save(request);
}
public List
return leaveRepository.findAll();
}
public LeaveRequest updateStatus(Long id, String status) {
LeaveRequest request = leaveRepository.findById(id).orElseThrow(() -> new RuntimeException("请假记录不存在"));
request.setStatus(status);
return leaveRepository.save(request);
}
}
张伟:看来你们的系统已经考虑到了很多边界条件。那数据库表结构是怎样的?
李娜:我们使用的是MySQL数据库,表结构如下:
CREATE TABLE `leave_request` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`student_id` VARCHAR(20) NOT NULL,
`name` VARCHAR(50) NOT NULL,
`leave_type` VARCHAR(20) NOT NULL,
`start_date` DATE NOT NULL,
`end_date` DATE NOT NULL,
`reason` TEXT,
`status` VARCHAR(20) DEFAULT '待审批',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
);
张伟:这表结构设计得非常合理。那前端是怎么调用这些接口的?
李娜:前端使用Vue.js来构建界面,通过Axios发送HTTP请求到后端API。例如,当学生提交请假申请时,前端会调用POST /api/leave/submit接口,并将请假信息作为JSON发送。
张伟:那审批人怎么查看和处理这些请假申请呢?
李娜:审批人可以通过一个专门的页面访问所有待审批的请假请求。他们可以点击“批准”或“拒绝”按钮,系统会调用PUT /api/leave/update-status接口来更新请假状态。
张伟:听起来整个流程非常流畅。那有没有什么安全措施?比如防止恶意提交或越权操作?
李娜:是的,我们使用了Spring Security来进行权限控制。每个用户都有不同的角色,如学生、辅导员、管理员。只有特定角色才能执行相应的操作。
张伟:那具体是怎么实现的呢?有没有相关的代码示例?
李娜:我们可以配置一个简单的权限控制机制,比如在控制器中添加注解来限制访问权限。例如:
@RestController
@RequestMapping("/api/leave")
public class LeaveController {
@PostMapping("/submit")
public LeaveRequest submitLeave(@RequestBody LeaveRequest request) {
// 只允许学生提交请假申请
if (!SecurityContextHolder.getContext().getAuthentication().getAuthorities().contains(new SimpleGrantedAuthority("ROLE_STUDENT"))) {
throw new AccessDeniedException("您没有权限提交请假申请");
}
return leaveService.submitLeave(request);
}
@GetMapping("/list")
public List
// 只允许辅导员和管理员查看请假列表
if (!SecurityContextHolder.getContext().getAuthentication().getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN")) &&
!SecurityContextHolder.getContext().getAuthentication().getAuthorities().contains(new SimpleGrantedAuthority("ROLE_COUNSELOR"))) {
throw new AccessDeniedException("您没有权限查看请假列表");
}
return leaveService.getAllLeaves();
}
@PutMapping("/update-status/{id}")
public LeaveRequest updateStatus(@PathVariable Long id, @RequestParam String status) {
// 只允许管理员或辅导员修改状态
if (!SecurityContextHolder.getContext().getAuthentication().getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN")) &&
!SecurityContextHolder.getContext().getAuthentication().getAuthorities().contains(new SimpleGrantedAuthority("ROLE_COUNSELOR"))) {
throw new AccessDeniedException("您没有权限修改请假状态");
}
return leaveService.updateStatus(id, status);
}
}
张伟:这个权限控制机制非常实用。那你们有没有考虑过请假系统的扩展性?比如未来增加更多类型的请假或者与其他系统集成?
李娜:是的,我们在设计时就考虑了扩展性。比如,我们使用了策略模式来处理不同类型的请假,这样以后如果需要新增请假类型,只需要添加新的策略类即可,而不需要修改现有代码。
张伟:听起来很有前瞻性。那你们有没有使用任何第三方服务或者工具来增强请假系统的功能?
李娜:我们目前主要是自研,但我们也集成了一些外部服务,比如短信通知。当请假申请被批准后,系统会自动发送一条短信给学生,提醒他们请假结果。
张伟:这很贴心。那整个系统部署在哪个城市?
李娜:我们的系统部署在沈阳,由本地的一家云服务商提供支持。这也是为什么我们选择沈阳作为讨论地点的原因之一。

张伟:明白了。感谢你的分享,我对请假系统的实现有了更深入的理解。
李娜:不客气,如果你有兴趣,我可以给你一些参考资料或者推荐一些学习资源。
张伟:太好了,我一定会去看看的。
