客服热线:139 1319 1678

学工管理系统

学工管理系统在线试用
学工管理系统
在线试用
学工管理系统解决方案
学工管理系统
解决方案下载
学工管理系统源码
学工管理系统
源码授权
学工管理系统报价
学工管理系统
产品报价

26-1-18 23:39

小明:嘿,李老师,我最近在做一个学生管理信息系统,想加个请假功能,您能帮我看看怎么实现吗?

李老师:当然可以。你先说说,这个请假功能需要哪些基本功能呢?

小明:嗯,用户要能提交请假申请,包括请假类型、时间、原因等信息,然后老师或管理员审核,最后系统通知学生结果。

学生管理系统

李老师:听起来不错。那你可以考虑用数据库来存储这些数据。比如,创建一个请假表,包含学生的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来实现角色管理。

小明:好的,我会继续完善这个功能。

李老师:加油!如果遇到问题,随时来找我讨论。

智慧校园一站式解决方案

产品报价   解决方案下载   视频教学系列   操作手册、安装部署  

  微信扫码,联系客服