feat: add student page
fix: resolve login issues
This commit is contained in:
		
							parent
							
								
									b8f3ca130b
								
							
						
					
					
						commit
						5877055879
					
				| @ -15,7 +15,7 @@ public class StudentDAOImpl implements StudentDAO { | ||||
|      | ||||
|     @Override | ||||
|     public int insert(Student student) { | ||||
|         String sql = "INSERT INTO students (student_id, name, class_name, contact, college, major, is_graduating) VALUES (?, ?, ?, ?, ?, ?, ?)"; | ||||
|         String sql = "INSERT INTO students (student_id, name, class_name, contact, college, major, is_graduating, password) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; | ||||
|         try (Connection conn = DatabaseUtil.getConnection(); | ||||
|              PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { | ||||
|              | ||||
| @ -26,6 +26,7 @@ public class StudentDAOImpl implements StudentDAO { | ||||
|             stmt.setString(5, student.getCollege()); | ||||
|             stmt.setString(6, student.getMajor()); | ||||
|             stmt.setBoolean(7, student.isGraduating()); | ||||
|             stmt.setString(8, student.getPassword()); | ||||
|              | ||||
|             int affectedRows = stmt.executeUpdate(); | ||||
|             if (affectedRows == 0) { | ||||
| @ -60,7 +61,7 @@ public class StudentDAOImpl implements StudentDAO { | ||||
| 
 | ||||
|     @Override | ||||
|     public int update(Student student) { | ||||
|         String sql = "UPDATE students SET student_id = ?, name = ?, class_name = ?, contact = ?, college = ?, major = ?, is_graduating = ? WHERE id = ?"; | ||||
|         String sql = "UPDATE students SET student_id = ?, name = ?, class_name = ?, contact = ?, college = ?, major = ?, is_graduating = ?, password = ? WHERE id = ?"; | ||||
|         try (Connection conn = DatabaseUtil.getConnection(); | ||||
|              PreparedStatement stmt = conn.prepareStatement(sql)) { | ||||
|              | ||||
| @ -71,7 +72,8 @@ public class StudentDAOImpl implements StudentDAO { | ||||
|             stmt.setString(5, student.getCollege()); | ||||
|             stmt.setString(6, student.getMajor()); | ||||
|             stmt.setBoolean(7, student.isGraduating()); | ||||
|             stmt.setInt(8, student.getId()); | ||||
|             stmt.setString(8, student.getPassword()); | ||||
|             stmt.setInt(9, student.getId()); | ||||
|              | ||||
|             return stmt.executeUpdate(); | ||||
|         } catch (SQLException e) { | ||||
| @ -184,6 +186,7 @@ public class StudentDAOImpl implements StudentDAO { | ||||
|         student.setCollege(rs.getString("college")); | ||||
|         student.setMajor(rs.getString("major")); | ||||
|         student.setGraduating(rs.getBoolean("is_graduating")); | ||||
|         student.setPassword(rs.getString("password")); | ||||
|         return student; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -15,7 +15,7 @@ public class TeacherDAOImpl implements TeacherDAO { | ||||
| 
 | ||||
|     @Override | ||||
|     public int insert(Teacher teacher) { | ||||
|         String sql = "INSERT INTO teachers (teacher_id, name, department, contact) VALUES (?, ?, ?, ?)"; | ||||
|         String sql = "INSERT INTO teachers (teacher_id, name, department, contact, password) VALUES (?, ?, ?, ?, ?)"; | ||||
|         try (Connection conn = DatabaseUtil.getConnection(); | ||||
|              PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { | ||||
|              | ||||
| @ -23,6 +23,7 @@ public class TeacherDAOImpl implements TeacherDAO { | ||||
|             stmt.setString(2, teacher.getName()); | ||||
|             stmt.setString(3, teacher.getDepartment()); | ||||
|             stmt.setString(4, teacher.getContact()); | ||||
|             stmt.setString(5, teacher.getPassword()); | ||||
|              | ||||
|             int affectedRows = stmt.executeUpdate(); | ||||
|             if (affectedRows == 0) { | ||||
| @ -57,7 +58,7 @@ public class TeacherDAOImpl implements TeacherDAO { | ||||
| 
 | ||||
|     @Override | ||||
|     public int update(Teacher teacher) { | ||||
|         String sql = "UPDATE teachers SET teacher_id = ?, name = ?, department = ?, contact = ? WHERE id = ?"; | ||||
|         String sql = "UPDATE teachers SET teacher_id = ?, name = ?, department = ?, contact = ?, password = ? WHERE id = ?"; | ||||
|         try (Connection conn = DatabaseUtil.getConnection(); | ||||
|              PreparedStatement stmt = conn.prepareStatement(sql)) { | ||||
|              | ||||
| @ -65,7 +66,8 @@ public class TeacherDAOImpl implements TeacherDAO { | ||||
|             stmt.setString(2, teacher.getName()); | ||||
|             stmt.setString(3, teacher.getDepartment()); | ||||
|             stmt.setString(4, teacher.getContact()); | ||||
|             stmt.setInt(5, teacher.getId()); | ||||
|             stmt.setString(5, teacher.getPassword()); | ||||
|             stmt.setInt(6, teacher.getId()); | ||||
|              | ||||
|             return stmt.executeUpdate(); | ||||
|         } catch (SQLException e) { | ||||
| @ -175,6 +177,7 @@ public class TeacherDAOImpl implements TeacherDAO { | ||||
|         teacher.setName(rs.getString("name")); | ||||
|         teacher.setDepartment(rs.getString("department")); | ||||
|         teacher.setContact(rs.getString("contact")); | ||||
|         teacher.setPassword(rs.getString("password")); | ||||
|         return teacher; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,91 +1,144 @@ | ||||
| package gui; | ||||
| 
 | ||||
| import model.Student; | ||||
| import model.Teacher; | ||||
| import service.StudentService; | ||||
| import service.TeacherService; | ||||
| import service.ServiceFactory; | ||||
| 
 | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
| import java.awt.event.ActionEvent; | ||||
| import java.awt.event.ActionListener; | ||||
| import java.sql.Connection; | ||||
| import java.sql.PreparedStatement; | ||||
| import java.sql.ResultSet; | ||||
| import java.sql.SQLException; | ||||
| import util.DatabaseUtil; | ||||
| 
 | ||||
| public class LoginFrame extends JFrame { | ||||
|     private JComboBox<String> userTypeComboBox; | ||||
|     private JTextField idField; | ||||
|     private JPasswordField passwordField; | ||||
|     private JButton loginButton; | ||||
|      | ||||
|     private final StudentService studentService = ServiceFactory.getStudentService(); | ||||
|     private final TeacherService teacherService = ServiceFactory.getTeacherService(); | ||||
| 
 | ||||
|     public LoginFrame() { | ||||
|         setTitle("登录"); | ||||
|         setSize(300, 200); | ||||
|         setTitle("平安校园 - 登录"); | ||||
|         setSize(350, 300); | ||||
|         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||||
|         setLocationRelativeTo(null); | ||||
| 
 | ||||
|         JPanel panel = new JPanel(); | ||||
|         panel.setLayout(new GridLayout(4, 2)); | ||||
|         // 创建主面板,使用BorderLayout | ||||
|         JPanel mainPanel = new JPanel(new BorderLayout(20, 20)); | ||||
|         mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 30, 20, 30)); | ||||
| 
 | ||||
|         panel.add(new JLabel("用户类型:")); | ||||
|         // 标题面板 | ||||
|         JPanel titlePanel = new JPanel(); | ||||
|         JLabel titleLabel = new JLabel("日常出校申请系统"); | ||||
|         titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 20)); | ||||
|         titlePanel.add(titleLabel); | ||||
| 
 | ||||
|         // 登录表单面板 | ||||
|         JPanel formPanel = new JPanel(new GridBagLayout()); | ||||
|         GridBagConstraints gbc = new GridBagConstraints(); | ||||
|         gbc.fill = GridBagConstraints.HORIZONTAL; | ||||
|         gbc.insets = new Insets(8, 8, 8, 8); | ||||
|         gbc.weightx = 1.0; | ||||
| 
 | ||||
|         // 用户类型 | ||||
|         gbc.gridx = 0; | ||||
|         gbc.gridy = 0; | ||||
|         JLabel userTypeLabel = new JLabel("用户类型:"); | ||||
|         userTypeLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); | ||||
|         formPanel.add(userTypeLabel, gbc); | ||||
| 
 | ||||
|         gbc.gridx = 1; | ||||
|         userTypeComboBox = new JComboBox<>(new String[]{"学生", "教师"}); | ||||
|         panel.add(userTypeComboBox); | ||||
|         userTypeComboBox.setFont(new Font("微软雅黑", Font.PLAIN, 14)); | ||||
|         formPanel.add(userTypeComboBox, gbc); | ||||
| 
 | ||||
|         panel.add(new JLabel("ID:")); | ||||
|         idField = new JTextField(); | ||||
|         panel.add(idField); | ||||
|         // ID输入框 | ||||
|         gbc.gridx = 0; | ||||
|         gbc.gridy = 1; | ||||
|         JLabel idLabel = new JLabel("ID:"); | ||||
|         idLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); | ||||
|         formPanel.add(idLabel, gbc); | ||||
| 
 | ||||
|         panel.add(new JLabel("密码:")); | ||||
|         passwordField = new JPasswordField(); | ||||
|         panel.add(passwordField); | ||||
|         gbc.gridx = 1; | ||||
|         idField = new JTextField(20); | ||||
|         idField.setFont(new Font("微软雅黑", Font.PLAIN, 14)); | ||||
|         formPanel.add(idField, gbc); | ||||
| 
 | ||||
|         // 密码输入框 | ||||
|         gbc.gridx = 0; | ||||
|         gbc.gridy = 2; | ||||
|         JLabel passwordLabel = new JLabel("密码:"); | ||||
|         passwordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); | ||||
|         formPanel.add(passwordLabel, gbc); | ||||
| 
 | ||||
|         gbc.gridx = 1; | ||||
|         passwordField = new JPasswordField(20); | ||||
|         passwordField.setFont(new Font("微软雅黑", Font.PLAIN, 14)); | ||||
|         formPanel.add(passwordField, gbc); | ||||
| 
 | ||||
|         // 登录按钮面板 | ||||
|         JPanel buttonPanel = new JPanel(); | ||||
|         buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); | ||||
|         loginButton = new JButton("登录"); | ||||
|         panel.add(loginButton); | ||||
|         loginButton.setFont(new Font("微软雅黑", Font.PLAIN, 14)); | ||||
|         loginButton.setPreferredSize(new Dimension(100, 35)); | ||||
|         loginButton.setBackground(new Color(52, 152, 219)); | ||||
| //        loginButton.setForeground(Color.WHITE); | ||||
|         loginButton.setFocusPainted(false); | ||||
|         buttonPanel.add(loginButton); | ||||
| 
 | ||||
|         loginButton.addActionListener(new ActionListener() { | ||||
|             @Override | ||||
|             public void actionPerformed(ActionEvent e) { | ||||
|                 handleLogin(); | ||||
|             } | ||||
|         }); | ||||
|         // 添加事件监听 | ||||
|         loginButton.addActionListener(e -> handleLogin()); | ||||
| 
 | ||||
|         add(panel); | ||||
|         // 组装界面 | ||||
|         mainPanel.add(titlePanel, BorderLayout.NORTH); | ||||
|         mainPanel.add(formPanel, BorderLayout.CENTER); | ||||
|         mainPanel.add(buttonPanel, BorderLayout.SOUTH); | ||||
| 
 | ||||
|         add(mainPanel); | ||||
|     } | ||||
| 
 | ||||
|     private void handleLogin() { | ||||
|         String userType = (String) userTypeComboBox.getSelectedItem(); | ||||
|         String id = idField.getText(); | ||||
|         String id = idField.getText().trim(); | ||||
|         String password = new String(passwordField.getPassword()); | ||||
| 
 | ||||
|         String tableName = "学生".equals(userType) ? "students" : "teachers"; | ||||
|         String idColumnName = "学生".equals(userType) ? "student_id" : "teacher_id"; | ||||
|         String sql = "SELECT * FROM " + tableName + " WHERE " + idColumnName + " = ? AND password = ?"; | ||||
|         if (id.isEmpty() || password.isEmpty()) { | ||||
|             JOptionPane.showMessageDialog(this, "请输入ID和密码", "提示", JOptionPane.WARNING_MESSAGE); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         try (Connection conn = DatabaseUtil.getConnection(); | ||||
|              PreparedStatement stmt = conn.prepareStatement(sql)) { | ||||
| 
 | ||||
|             stmt.setString(1, id); | ||||
|             stmt.setString(2, password); | ||||
| 
 | ||||
|             ResultSet rs = stmt.executeQuery(); | ||||
| 
 | ||||
|             if (rs.next()) { | ||||
|                 if ("教师".equals(userType)) { | ||||
|                     TeacherMainFrame teacherMainFrame = new TeacherMainFrame(); | ||||
|                     teacherMainFrame.setVisible(true); | ||||
|                 } else { | ||||
|                     // TODO: 打开学生主界面 | ||||
|                     JOptionPane.showMessageDialog(this, "学生登录成功!", "提示", JOptionPane.INFORMATION_MESSAGE); | ||||
|                 } | ||||
|         if ("学生".equals(userType)) { | ||||
|             Student student = studentService.login(id, password); | ||||
|             if (student != null) { | ||||
|                 StudentMainFrame studentMainFrame = new StudentMainFrame(student); | ||||
|                 studentMainFrame.setVisible(true); | ||||
|                 dispose(); | ||||
|             } else { | ||||
|                 JOptionPane.showMessageDialog(this, "无效的ID或密码", "错误", JOptionPane.ERROR_MESSAGE); | ||||
|                 JOptionPane.showMessageDialog(this, "无效的学号或密码", "错误", JOptionPane.ERROR_MESSAGE); | ||||
|             } | ||||
|         } else { | ||||
|             Teacher teacher = teacherService.login(id, password); | ||||
|             if (teacher != null) { | ||||
|                 TeacherMainFrame teacherMainFrame = new TeacherMainFrame(); | ||||
|                 teacherMainFrame.setVisible(true); | ||||
|                 dispose(); | ||||
|             } else { | ||||
|                 JOptionPane.showMessageDialog(this, "无效的教师ID或密码", "错误", JOptionPane.ERROR_MESSAGE); | ||||
|             } | ||||
|         } catch (SQLException e) { | ||||
|             e.printStackTrace(); | ||||
|             JOptionPane.showMessageDialog(this, "数据库错误:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static void main(String[] args) { | ||||
|         try { | ||||
|             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|          | ||||
|         SwingUtilities.invokeLater(() -> { | ||||
|             LoginFrame loginFrame = new LoginFrame(); | ||||
|             loginFrame.setVisible(true); | ||||
|  | ||||
| @ -14,11 +14,13 @@ public class RequestDetailDialog extends JDialog { | ||||
|     private final LeaveRequestService leaveRequestService; | ||||
|     private LeaveRequest currentRequest; | ||||
|     private Runnable onApprovalComplete;  // 添加回调接口 | ||||
|     private boolean isStudent;  // 添加标识是否为学生 | ||||
| 
 | ||||
|     public RequestDetailDialog(JFrame parent, int requestId, Runnable onApprovalComplete) { | ||||
|     public RequestDetailDialog(JFrame parent, int requestId, Runnable onApprovalComplete, boolean isStudent) { | ||||
|         super(parent, "请假详情", true); | ||||
|         this.leaveRequestService = ServiceFactory.getLeaveRequestService(); | ||||
|         this.onApprovalComplete = onApprovalComplete; | ||||
|         this.isStudent = isStudent; | ||||
|          | ||||
|         // 根据ID获取请假信息 | ||||
|         this.currentRequest = leaveRequestService.getLeaveRequestById(requestId); | ||||
| @ -78,130 +80,155 @@ public class RequestDetailDialog extends JDialog { | ||||
| 
 | ||||
|         // 审批按钮 | ||||
|         JPanel actionButtonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 10)); | ||||
|         JButton approveButton = new JButton("通过"); | ||||
|         JButton rejectButton = new JButton("驳回"); | ||||
|          | ||||
|         // 如果已经审批过,禁用按钮 | ||||
|         if (currentRequest.getStatus() != ApprovalStatus.PENDING) { | ||||
|             approveButton.setEnabled(false); | ||||
|             rejectButton.setEnabled(false); | ||||
|         if (isStudent) { | ||||
|             // 学生只能看到撤销按钮,且仅在待审批状态下可用 | ||||
|             if (currentRequest.getStatus() == ApprovalStatus.PENDING) { | ||||
|                 JButton cancelButton = new JButton("撤销申请"); | ||||
|                 cancelButton.setPreferredSize(new Dimension(100, 30)); | ||||
|                 cancelButton.setBackground(new Color(231, 76, 60)); | ||||
|                 cancelButton.addActionListener(e -> { | ||||
|                     int confirm = JOptionPane.showConfirmDialog( | ||||
|                         this, | ||||
|                         "确定要撤销这条请假申请吗?", | ||||
|                         "确认撤销", | ||||
|                         JOptionPane.YES_NO_OPTION | ||||
|                     ); | ||||
|                     if (confirm == JOptionPane.YES_OPTION) { | ||||
|                         leaveRequestService.cancelLeaveRequest(currentRequest.getId()); | ||||
|                         dispose(); | ||||
|                         if (onApprovalComplete != null) { | ||||
|                             onApprovalComplete.run(); | ||||
|                         } | ||||
|                         JOptionPane.showMessageDialog(getParent(), "申请已撤销", "提示", JOptionPane.INFORMATION_MESSAGE); | ||||
|                     } | ||||
|                 }); | ||||
|                 actionButtonPanel.add(cancelButton); | ||||
|             } | ||||
|         } else { | ||||
|             // 教师可以看到通过和驳回按钮 | ||||
|             JButton approveButton = new JButton("通过"); | ||||
|             JButton rejectButton = new JButton("驳回"); | ||||
|              | ||||
|             // 如果已经审批过,禁用按钮 | ||||
|             if (currentRequest.getStatus() != ApprovalStatus.PENDING) { | ||||
|                 approveButton.setEnabled(false); | ||||
|                 rejectButton.setEnabled(false); | ||||
|             } | ||||
|              | ||||
|             approveButton.setPreferredSize(new Dimension(100, 30)); | ||||
|             rejectButton.setPreferredSize(new Dimension(100, 30)); | ||||
|              | ||||
|             // 设置按钮样式 | ||||
|             approveButton.setBackground(new Color(39, 174, 96)); | ||||
|             rejectButton.setBackground(new Color(231, 76, 60)); | ||||
|              | ||||
|             actionButtonPanel.add(approveButton); | ||||
|             actionButtonPanel.add(rejectButton); | ||||
| 
 | ||||
|             // 添加教师审批按钮的事件监听 | ||||
|             approveButton.addActionListener(e -> { | ||||
|                 // 创建一个自定义对话框 | ||||
|                 JDialog approveDialog = new JDialog(this, "审批意见", true); | ||||
|                 approveDialog.setLayout(new BorderLayout()); | ||||
|                 approveDialog.setSize(300, 200); | ||||
|                 approveDialog.setLocationRelativeTo(this); | ||||
| 
 | ||||
|                 JPanel inputPanel = new JPanel(new BorderLayout(10, 10)); | ||||
|                 inputPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); | ||||
| 
 | ||||
|                 JLabel label = new JLabel("请输入审批意见:"); | ||||
|                 JTextArea commentArea = new JTextArea(4, 20); | ||||
|                 commentArea.setLineWrap(true); | ||||
|                 commentArea.setWrapStyleWord(true); | ||||
|                 commentArea.setText("同意"); | ||||
| 
 | ||||
|                 JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); | ||||
|                 JButton confirmButton = new JButton("确定"); | ||||
|                 JButton cancelButton = new JButton("取消"); | ||||
| 
 | ||||
|                 confirmButton.addActionListener(event -> { | ||||
|                     String comment = commentArea.getText().trim(); | ||||
|                     if (!comment.isEmpty()) { | ||||
|                         leaveRequestService.approveLeaveRequest( | ||||
|                             currentRequest.getId(), | ||||
|                             ApprovalStatus.APPROVED, | ||||
|                             comment | ||||
|                         ); | ||||
|                         approveDialog.dispose(); | ||||
|                         dispose(); | ||||
|                         if (onApprovalComplete != null) { | ||||
|                             onApprovalComplete.run(); | ||||
|                         } | ||||
|                     } | ||||
|                 }); | ||||
| 
 | ||||
|                 cancelButton.addActionListener(event -> approveDialog.dispose()); | ||||
| 
 | ||||
|                 buttonPanel.add(confirmButton); | ||||
|                 buttonPanel.add(cancelButton); | ||||
| 
 | ||||
|                 inputPanel.add(label, BorderLayout.NORTH); | ||||
|                 inputPanel.add(new JScrollPane(commentArea), BorderLayout.CENTER); | ||||
|                 inputPanel.add(buttonPanel, BorderLayout.SOUTH); | ||||
| 
 | ||||
|                 approveDialog.add(inputPanel); | ||||
|                 approveDialog.setVisible(true); | ||||
|             }); | ||||
| 
 | ||||
|             rejectButton.addActionListener(e -> { | ||||
|                 // 创建一个自定义对话框 | ||||
|                 JDialog rejectDialog = new JDialog(this, "驳回原因", true); | ||||
|                 rejectDialog.setLayout(new BorderLayout()); | ||||
|                 rejectDialog.setSize(300, 200); | ||||
|                 rejectDialog.setLocationRelativeTo(this); | ||||
| 
 | ||||
|                 JPanel inputPanel = new JPanel(new BorderLayout(10, 10)); | ||||
|                 inputPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); | ||||
| 
 | ||||
|                 JLabel label = new JLabel("请输入驳回原因:"); | ||||
|                 JTextArea commentArea = new JTextArea(4, 20); | ||||
|                 commentArea.setLineWrap(true); | ||||
|                 commentArea.setWrapStyleWord(true); | ||||
| 
 | ||||
|                 JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); | ||||
|                 JButton confirmButton = new JButton("确定"); | ||||
|                 JButton cancelButton = new JButton("取消"); | ||||
| 
 | ||||
|                 confirmButton.addActionListener(event -> { | ||||
|                     String comment = commentArea.getText().trim(); | ||||
|                     if (!comment.isEmpty()) { | ||||
|                         leaveRequestService.approveLeaveRequest( | ||||
|                             currentRequest.getId(), | ||||
|                             ApprovalStatus.REJECTED, | ||||
|                             comment | ||||
|                         ); | ||||
|                         rejectDialog.dispose(); | ||||
|                         dispose(); | ||||
|                         if (onApprovalComplete != null) { | ||||
|                             onApprovalComplete.run(); | ||||
|                         } | ||||
|                     } | ||||
|                 }); | ||||
| 
 | ||||
|                 cancelButton.addActionListener(event -> rejectDialog.dispose()); | ||||
| 
 | ||||
|                 buttonPanel.add(confirmButton); | ||||
|                 buttonPanel.add(cancelButton); | ||||
| 
 | ||||
|                 inputPanel.add(label, BorderLayout.NORTH); | ||||
|                 inputPanel.add(new JScrollPane(commentArea), BorderLayout.CENTER); | ||||
|                 inputPanel.add(buttonPanel, BorderLayout.SOUTH); | ||||
| 
 | ||||
|                 rejectDialog.add(inputPanel); | ||||
|                 rejectDialog.setVisible(true); | ||||
|             }); | ||||
|         } | ||||
|          | ||||
|         approveButton.setPreferredSize(new Dimension(100, 30)); | ||||
|         rejectButton.setPreferredSize(new Dimension(100, 30)); | ||||
|          | ||||
|         // 设置按钮样式 | ||||
|         approveButton.setBackground(new Color(39, 174, 96)); | ||||
|         // approveButton.setForeground(Color.WHITE); | ||||
|          | ||||
|         rejectButton.setBackground(new Color(231, 76, 60)); | ||||
|         // rejectButton.setForeground(Color.WHITE); | ||||
|          | ||||
|         actionButtonPanel.add(approveButton); | ||||
|         actionButtonPanel.add(rejectButton); | ||||
| 
 | ||||
|         // 添加按钮面板 | ||||
|         gbc.insets = new Insets(20, 10, 10, 10); | ||||
|         mainPanel.add(actionButtonPanel, gbc); | ||||
| 
 | ||||
|         // 添加事件监听 | ||||
|         approveButton.addActionListener(e -> { | ||||
|             // 创建一个自定义对话框 | ||||
|             JDialog approveDialog = new JDialog(this, "审批意见", true); | ||||
|             approveDialog.setLayout(new BorderLayout()); | ||||
|             approveDialog.setSize(300, 200); | ||||
|             approveDialog.setLocationRelativeTo(this); | ||||
| 
 | ||||
|             JPanel inputPanel = new JPanel(new BorderLayout(10, 10)); | ||||
|             inputPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); | ||||
| 
 | ||||
|             JLabel label = new JLabel("请输入审批意见:"); | ||||
|             JTextArea commentArea = new JTextArea(4, 20); | ||||
|             commentArea.setLineWrap(true); | ||||
|             commentArea.setWrapStyleWord(true); | ||||
|             commentArea.setText("同意"); | ||||
| 
 | ||||
|             JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); | ||||
|             JButton confirmButton = new JButton("确定"); | ||||
|             JButton cancelButton = new JButton("取消"); | ||||
| 
 | ||||
|             confirmButton.addActionListener(event -> { | ||||
|                 String comment = commentArea.getText().trim(); | ||||
|                 if (!comment.isEmpty()) { | ||||
|                     leaveRequestService.approveLeaveRequest( | ||||
|                         currentRequest.getId(), | ||||
|                         ApprovalStatus.APPROVED, | ||||
|                         comment | ||||
|                     ); | ||||
|                     approveDialog.dispose(); | ||||
|                     dispose(); | ||||
|                     if (onApprovalComplete != null) { | ||||
|                         onApprovalComplete.run(); | ||||
|                     } | ||||
|                 } | ||||
|             }); | ||||
| 
 | ||||
|             cancelButton.addActionListener(event -> approveDialog.dispose()); | ||||
| 
 | ||||
|             buttonPanel.add(confirmButton); | ||||
|             buttonPanel.add(cancelButton); | ||||
| 
 | ||||
|             inputPanel.add(label, BorderLayout.NORTH); | ||||
|             inputPanel.add(new JScrollPane(commentArea), BorderLayout.CENTER); | ||||
|             inputPanel.add(buttonPanel, BorderLayout.SOUTH); | ||||
| 
 | ||||
|             approveDialog.add(inputPanel); | ||||
|             approveDialog.setVisible(true); | ||||
|         }); | ||||
| 
 | ||||
|         rejectButton.addActionListener(e -> { | ||||
|             // 创建一个自定义对话框 | ||||
|             JDialog rejectDialog = new JDialog(this, "驳回原因", true); | ||||
|             rejectDialog.setLayout(new BorderLayout()); | ||||
|             rejectDialog.setSize(300, 200); | ||||
|             rejectDialog.setLocationRelativeTo(this); | ||||
| 
 | ||||
|             JPanel inputPanel = new JPanel(new BorderLayout(10, 10)); | ||||
|             inputPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); | ||||
| 
 | ||||
|             JLabel label = new JLabel("请输入驳回原因:"); | ||||
|             JTextArea commentArea = new JTextArea(4, 20); | ||||
|             commentArea.setLineWrap(true); | ||||
|             commentArea.setWrapStyleWord(true); | ||||
| 
 | ||||
|             JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); | ||||
|             JButton confirmButton = new JButton("确定"); | ||||
|             JButton cancelButton = new JButton("取消"); | ||||
| 
 | ||||
|             confirmButton.addActionListener(event -> { | ||||
|                 String comment = commentArea.getText().trim(); | ||||
|                 if (!comment.isEmpty()) { | ||||
|                     leaveRequestService.approveLeaveRequest( | ||||
|                         currentRequest.getId(), | ||||
|                         ApprovalStatus.REJECTED, | ||||
|                         comment | ||||
|                     ); | ||||
|                     rejectDialog.dispose(); | ||||
|                     dispose(); | ||||
|                     if (onApprovalComplete != null) { | ||||
|                         onApprovalComplete.run(); | ||||
|                     } | ||||
|                 } | ||||
|             }); | ||||
| 
 | ||||
|             cancelButton.addActionListener(event -> rejectDialog.dispose()); | ||||
| 
 | ||||
|             buttonPanel.add(confirmButton); | ||||
|             buttonPanel.add(cancelButton); | ||||
| 
 | ||||
|             inputPanel.add(label, BorderLayout.NORTH); | ||||
|             inputPanel.add(new JScrollPane(commentArea), BorderLayout.CENTER); | ||||
|             inputPanel.add(buttonPanel, BorderLayout.SOUTH); | ||||
| 
 | ||||
|             rejectDialog.add(inputPanel); | ||||
|             rejectDialog.setVisible(true); | ||||
|         }); | ||||
| 
 | ||||
|         // 添加滚动面板 | ||||
|         JScrollPane scrollPane = new JScrollPane(mainPanel); | ||||
|         scrollPane.setBorder(null); | ||||
|  | ||||
							
								
								
									
										344
									
								
								src/gui/StudentMainFrame.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								src/gui/StudentMainFrame.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,344 @@ | ||||
| package gui; | ||||
| 
 | ||||
| import model.ApprovalStatus; | ||||
| import model.LeaveRequest; | ||||
| import model.Student; | ||||
| import service.LeaveRequestService; | ||||
| import service.ServiceFactory; | ||||
| 
 | ||||
| import javax.swing.*; | ||||
| import javax.swing.table.DefaultTableModel; | ||||
| import javax.swing.table.TableColumnModel; | ||||
| import java.awt.*; | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class StudentMainFrame extends JFrame { | ||||
|     private final LeaveRequestService leaveRequestService; | ||||
|     private final Student currentStudent; | ||||
|     private JTable requestTable; | ||||
|     private DefaultTableModel tableModel; | ||||
|     private int currentPage = 1; | ||||
|     private static final int PAGE_SIZE = 10; | ||||
| 
 | ||||
|     public StudentMainFrame(Student student) { | ||||
|         this.currentStudent = student; | ||||
|         leaveRequestService = ServiceFactory.getLeaveRequestService(); | ||||
|         initComponents(); | ||||
|         loadLeaveRequests(); | ||||
|     } | ||||
| 
 | ||||
|     private void initComponents() { | ||||
|         setTitle("平安校园 - 日常出校申请"); | ||||
|         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||||
|         setSize(400, 600); | ||||
|         setLocationRelativeTo(null); | ||||
| 
 | ||||
|         // 主面板 | ||||
|         JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); | ||||
|         mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); | ||||
| 
 | ||||
|         // 顶部面板 | ||||
|         JPanel topPanel = new JPanel(new BorderLayout()); | ||||
|          | ||||
|         // 标题 | ||||
|         JLabel titleLabel = new JLabel("日常出校申请记录", SwingConstants.CENTER); | ||||
|         titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 18)); | ||||
|         topPanel.add(titleLabel, BorderLayout.CENTER); | ||||
| 
 | ||||
|         // 学生信息和申请按钮面板 | ||||
|         JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 20, 5)); | ||||
|          | ||||
|         // 添加学生信息 | ||||
|         JLabel studentInfoLabel = new JLabel(String.format("%s - %s", currentStudent.getClassName(), currentStudent.getName())); | ||||
|         studentInfoLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); | ||||
|         buttonPanel.add(studentInfoLabel); | ||||
| 
 | ||||
|         // 申请按钮 | ||||
|         JButton newRequestButton = new JButton("日常出校申请"); | ||||
|         newRequestButton.setFont(new Font("微软雅黑", Font.PLAIN, 14)); | ||||
|         newRequestButton.setBackground(new Color(52, 152, 219)); | ||||
|         // newRequestButton.setForeground(Color.WHITE); | ||||
|         newRequestButton.setFocusPainted(false); | ||||
|         newRequestButton.addActionListener(e -> showNewRequestDialog()); | ||||
|          | ||||
|         buttonPanel.add(newRequestButton); | ||||
|         topPanel.add(buttonPanel, BorderLayout.NORTH); | ||||
| 
 | ||||
|         // 表格 | ||||
|         String[] columnNames = {"ID", "状态", "申请时间", "外出开始时间", "外出结束时间", "外出事由"}; | ||||
|         tableModel = new DefaultTableModel(columnNames, 0) { | ||||
|             @Override | ||||
|             public boolean isCellEditable(int row, int column) { | ||||
|                 return false; | ||||
|             } | ||||
|         }; | ||||
|         requestTable = new JTable(tableModel); | ||||
|         requestTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); | ||||
|          | ||||
|         // 设置表格样式 | ||||
|         requestTable.setRowHeight(30); | ||||
|         requestTable.getTableHeader().setFont(new Font("微软雅黑", Font.BOLD, 12)); | ||||
|         requestTable.setFont(new Font("微软雅黑", Font.PLAIN, 12)); | ||||
| 
 | ||||
|         // 设置列宽 | ||||
|         TableColumnModel columnModel = requestTable.getColumnModel(); | ||||
|         columnModel.getColumn(0).setPreferredWidth(40);   // ID | ||||
|         columnModel.getColumn(1).setPreferredWidth(60);   // 状态 | ||||
|         columnModel.getColumn(2).setPreferredWidth(100);  // 申请时间 | ||||
|         columnModel.getColumn(3).setPreferredWidth(100);  // 开始时间 | ||||
|         columnModel.getColumn(4).setPreferredWidth(100);  // 结束时间 | ||||
|         columnModel.getColumn(5).setPreferredWidth(100);  // 外出事由 | ||||
| 
 | ||||
|         // 添加表格点击事件 | ||||
|         requestTable.addMouseListener(new java.awt.event.MouseAdapter() { | ||||
|             @Override | ||||
|             public void mouseClicked(java.awt.event.MouseEvent evt) { | ||||
|                 if (evt.getClickCount() == 2) { | ||||
|                     int row = requestTable.getSelectedRow(); | ||||
|                     if (row != -1) { | ||||
|                         showRequestDetails(row); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         // 分页控制 | ||||
|         JPanel pagePanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); | ||||
|         JButton prevButton = new JButton("上一页"); | ||||
|         JButton nextButton = new JButton("下一页"); | ||||
|         JLabel pageLabel = new JLabel("1/1"); | ||||
|         pagePanel.add(prevButton); | ||||
|         pagePanel.add(pageLabel); | ||||
|         pagePanel.add(nextButton); | ||||
| 
 | ||||
|         // 分页按钮事件 | ||||
|         prevButton.addActionListener(e -> { | ||||
|             if (currentPage > 1) { | ||||
|                 currentPage--; | ||||
|                 loadLeaveRequests(); | ||||
|             } | ||||
|         }); | ||||
|          | ||||
|         nextButton.addActionListener(e -> { | ||||
|             List<LeaveRequest> requests = leaveRequestService.getStudentLeaveRequests(currentStudent.getId()); | ||||
|             int totalPages = (requests.size() + PAGE_SIZE - 1) / PAGE_SIZE; | ||||
|             if (currentPage < totalPages) { | ||||
|                 currentPage++; | ||||
|                 loadLeaveRequests(); | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         // 布局 | ||||
|         mainPanel.add(topPanel, BorderLayout.NORTH); | ||||
|         mainPanel.add(new JScrollPane(requestTable), BorderLayout.CENTER); | ||||
|         mainPanel.add(pagePanel, BorderLayout.SOUTH); | ||||
| 
 | ||||
|         add(mainPanel); | ||||
|     } | ||||
| 
 | ||||
|     private void showNewRequestDialog() { | ||||
|         JDialog dialog = new JDialog(this, "新建日常出校申请", true); | ||||
|         dialog.setSize(400, 500); | ||||
|         dialog.setLocationRelativeTo(this); | ||||
| 
 | ||||
|         JPanel panel = new JPanel(new GridBagLayout()); | ||||
|         panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); | ||||
|         GridBagConstraints gbc = new GridBagConstraints(); | ||||
|         gbc.fill = GridBagConstraints.HORIZONTAL; | ||||
|         gbc.insets = new Insets(5, 5, 5, 5); | ||||
| 
 | ||||
|         // 开始时间 | ||||
|         gbc.gridx = 0; | ||||
|         gbc.gridy = 0; | ||||
|         panel.add(new JLabel("开始时间:"), gbc); | ||||
| 
 | ||||
|         gbc.gridx = 1; | ||||
|         SpinnerDateModel startModel = new SpinnerDateModel(); | ||||
|         JSpinner startTimeSpinner = new JSpinner(startModel); | ||||
|         startTimeSpinner.setEditor(new JSpinner.DateEditor(startTimeSpinner, "yyyy-MM-dd HH:mm")); | ||||
|         panel.add(startTimeSpinner, gbc); | ||||
| 
 | ||||
|         // 结束时间 | ||||
|         gbc.gridx = 0; | ||||
|         gbc.gridy = 1; | ||||
|         panel.add(new JLabel("结束时间:"), gbc); | ||||
| 
 | ||||
|         gbc.gridx = 1; | ||||
|         SpinnerDateModel endModel = new SpinnerDateModel(); | ||||
|         JSpinner endTimeSpinner = new JSpinner(endModel); | ||||
|         endTimeSpinner.setEditor(new JSpinner.DateEditor(endTimeSpinner, "yyyy-MM-dd HH:mm")); | ||||
|         panel.add(endTimeSpinner, gbc); | ||||
| 
 | ||||
|         // 外出地址 | ||||
|         gbc.gridx = 0; | ||||
|         gbc.gridy = 2; | ||||
|         panel.add(new JLabel("外出地址:"), gbc); | ||||
| 
 | ||||
|         gbc.gridx = 1; | ||||
|         JTextField locationField = new JTextField(20); | ||||
|         panel.add(locationField, gbc); | ||||
| 
 | ||||
|         // 事由类型 | ||||
|         gbc.gridx = 0; | ||||
|         gbc.gridy = 3; | ||||
|         panel.add(new JLabel("事由类型:"), gbc); | ||||
| 
 | ||||
|         gbc.gridx = 1; | ||||
|         String[] reasonTypes = {"学习", "就医", "办事", "活动", "返乡", "实习", "其他"}; | ||||
|         JComboBox<String> reasonTypeCombo = new JComboBox<>(reasonTypes); | ||||
|         panel.add(reasonTypeCombo, gbc); | ||||
| 
 | ||||
|         // 详细事由 | ||||
|         gbc.gridx = 0; | ||||
|         gbc.gridy = 4; | ||||
|         panel.add(new JLabel("详细事由:"), gbc); | ||||
| 
 | ||||
|         gbc.gridx = 1; | ||||
|         JTextArea reasonArea = new JTextArea(4, 20); | ||||
|         reasonArea.setLineWrap(true); | ||||
|         reasonArea.setWrapStyleWord(true); | ||||
|         JScrollPane scrollPane = new JScrollPane(reasonArea); | ||||
|         panel.add(scrollPane, gbc); | ||||
| 
 | ||||
|         // 是否离津 | ||||
|         gbc.gridx = 0; | ||||
|         gbc.gridy = 5; | ||||
|         panel.add(new JLabel("是否离津:"), gbc); | ||||
| 
 | ||||
|         gbc.gridx = 1; | ||||
|         JCheckBox leavingCityCheckBox = new JCheckBox(); | ||||
|         panel.add(leavingCityCheckBox, gbc); | ||||
| 
 | ||||
|         // 按钮面板 | ||||
|         gbc.gridx = 0; | ||||
|         gbc.gridy = 6; | ||||
|         gbc.gridwidth = 2; | ||||
|         JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); | ||||
|         JButton submitButton = new JButton("提交"); | ||||
|         JButton cancelButton = new JButton("取消"); | ||||
| 
 | ||||
|         submitButton.addActionListener(e -> { | ||||
|             Date startTime = (Date) startTimeSpinner.getValue(); | ||||
|             Date endTime = (Date) endTimeSpinner.getValue(); | ||||
|             String location = locationField.getText().trim(); | ||||
|             String reasonType = (String) reasonTypeCombo.getSelectedItem(); | ||||
|             String reasonDetail = reasonArea.getText().trim(); | ||||
|             boolean isLeavingCity = leavingCityCheckBox.isSelected(); | ||||
| 
 | ||||
|             if (location.isEmpty()) { | ||||
|                 JOptionPane.showMessageDialog(dialog, "请填写外出地址", "提示", JOptionPane.WARNING_MESSAGE); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (reasonDetail.isEmpty()) { | ||||
|                 JOptionPane.showMessageDialog(dialog, "请填写详细事由", "提示", JOptionPane.WARNING_MESSAGE); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (startTime.after(endTime)) { | ||||
|                 JOptionPane.showMessageDialog(dialog, "开始时间不能晚于结束时间", "提示", JOptionPane.WARNING_MESSAGE); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             LeaveRequest request = new LeaveRequest(); | ||||
|             request.setStudent(currentStudent); | ||||
|             request.setStartTime(startTime); | ||||
|             request.setEndTime(endTime); | ||||
|             request.setLocation(location); | ||||
|             request.setReasonType(reasonType); | ||||
|             request.setReasonDetail(reasonDetail); | ||||
|             request.setLeavingCity(isLeavingCity); | ||||
|             request.setStatus(ApprovalStatus.PENDING); | ||||
|             request.setRequestTime(new Date()); | ||||
| 
 | ||||
|             // 计算请假时长(小时) | ||||
|             double duration = (endTime.getTime() - startTime.getTime()) / (1000.0 * 60 * 60); | ||||
|             request.setDuration(duration); | ||||
| 
 | ||||
|             if (leaveRequestService.submitLeaveRequest(request)) { | ||||
|                 loadLeaveRequests(); | ||||
|                 dialog.dispose(); | ||||
|                 JOptionPane.showMessageDialog(this, "申请提交成功", "提示", JOptionPane.INFORMATION_MESSAGE); | ||||
|             } else { | ||||
|                 JOptionPane.showMessageDialog(this, "申请提交失败,请稍后重试", "错误", JOptionPane.ERROR_MESSAGE); | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         cancelButton.addActionListener(e -> dialog.dispose()); | ||||
| 
 | ||||
|         buttonPanel.add(submitButton); | ||||
|         buttonPanel.add(cancelButton); | ||||
|         panel.add(buttonPanel, gbc); | ||||
| 
 | ||||
|         dialog.add(panel); | ||||
|         dialog.setVisible(true); | ||||
|     } | ||||
| 
 | ||||
|     private void showRequestDetails(int row) { | ||||
|         Long requestId = (Long) tableModel.getValueAt(row, 0); | ||||
|         RequestDetailDialog dialog = new RequestDetailDialog(this, requestId.intValue(), this::loadLeaveRequests, true); | ||||
|         dialog.setVisible(true); | ||||
|     } | ||||
| 
 | ||||
|     private void loadLeaveRequests() { | ||||
|         tableModel.setRowCount(0); | ||||
|         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); | ||||
|          | ||||
|         List<LeaveRequest> requests = leaveRequestService.getStudentLeaveRequests(currentStudent.getId()); | ||||
|          | ||||
|         // Calculate total pages | ||||
|         int totalRequests = requests.size(); | ||||
|         int totalPages = (totalRequests + PAGE_SIZE - 1) / PAGE_SIZE; | ||||
|          | ||||
|         // Update page label | ||||
|         Component[] components = getContentPane().getComponents(); | ||||
|         for (Component comp : components) { | ||||
|             if (comp instanceof JPanel) { | ||||
|                 JPanel panel = (JPanel) comp; | ||||
|                 for (Component innerComp : panel.getComponents()) { | ||||
|                     if (innerComp instanceof JPanel && ((JPanel) innerComp).getComponentCount() == 3) { | ||||
|                         JPanel pagePanel = (JPanel) innerComp; | ||||
|                         JLabel pageLabel = (JLabel) pagePanel.getComponent(1); | ||||
|                         pageLabel.setText(currentPage + "/" + totalPages); | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         // Get current page's requests | ||||
|         int fromIndex = (currentPage - 1) * PAGE_SIZE; | ||||
|         int toIndex = Math.min(fromIndex + PAGE_SIZE, totalRequests); | ||||
|         List<LeaveRequest> pageRequests = fromIndex < totalRequests ? requests.subList(fromIndex, toIndex) : requests; | ||||
|          | ||||
|         for (LeaveRequest request : pageRequests) { | ||||
|             tableModel.addRow(new Object[]{ | ||||
|                 Long.valueOf(request.getId()),   | ||||
|                 request.getStatus().getDescription(), | ||||
|                 sdf.format(request.getRequestTime()), | ||||
|                 sdf.format(request.getStartTime()), | ||||
|                 sdf.format(request.getEndTime()), | ||||
|                 request.getReasonDetail() | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static void main(String[] args) { | ||||
|         SwingUtilities.invokeLater(() -> { | ||||
|             try { | ||||
|                 // 使用实际学生数据 | ||||
|                 Student student = ServiceFactory.getStudentService().login("2023208145", "123456"); | ||||
|                 if (student != null) { | ||||
|                     new StudentMainFrame(student).setVisible(true); | ||||
|                 } else { | ||||
|                     JOptionPane.showMessageDialog(null, "无法加载学生信息", "错误", JOptionPane.ERROR_MESSAGE); | ||||
|                 } | ||||
|             } catch (Exception e) { | ||||
|                 e.printStackTrace(); | ||||
|                 JOptionPane.showMessageDialog(null, "系统错误: " + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| @ -229,7 +229,8 @@ public class TeacherMainFrame extends JFrame { | ||||
|         RequestDetailDialog dialog = new RequestDetailDialog( | ||||
|             this,  | ||||
|             ((Number)tableModel.getValueAt(row, 0)).intValue(),  // 获取ID | ||||
|             () -> loadLeaveRequests()  // 添加刷新列表的回调 | ||||
|             () -> loadLeaveRequests(),  // 添加刷新列表的回调 | ||||
|             false  // 教师视角 | ||||
|         ); | ||||
|         dialog.setVisible(true); | ||||
|     } | ||||
|  | ||||
| @ -12,6 +12,7 @@ public class Student { | ||||
|     private String college;      // 学院 | ||||
|     private String major;        // 专业 | ||||
|     private boolean isGraduating; // 是否毕业班 | ||||
|     private String password;      // 登录密码 | ||||
| 
 | ||||
|     // Constructors | ||||
|     public Student() {} | ||||
| @ -26,6 +27,17 @@ public class Student { | ||||
|         this.isGraduating = isGraduating; | ||||
|     } | ||||
| 
 | ||||
|     public Student(String studentId, String name, String className, String contact, String college, String major, boolean isGraduating, String password) { | ||||
|         this.studentId = studentId; | ||||
|         this.name = name; | ||||
|         this.className = className; | ||||
|         this.contact = contact; | ||||
|         this.college = college; | ||||
|         this.major = major; | ||||
|         this.isGraduating = isGraduating; | ||||
|         this.password = password; | ||||
|     } | ||||
| 
 | ||||
|     // Getters and Setters | ||||
|     public int getId() { | ||||
|         return id; | ||||
| @ -90,4 +102,12 @@ public class Student { | ||||
|     public void setGraduating(boolean graduating) { | ||||
|         isGraduating = graduating; | ||||
|     } | ||||
| 
 | ||||
|     public String getPassword() { | ||||
|         return password; | ||||
|     } | ||||
| 
 | ||||
|     public void setPassword(String password) { | ||||
|         this.password = password; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -9,6 +9,7 @@ public class Teacher { | ||||
|     private String name;         // 教师姓名 | ||||
|     private String department;   // 所属部门 | ||||
|     private String contact;      // 联系方式 | ||||
|     private String password;     // 登录密码 | ||||
| 
 | ||||
|     // Constructors | ||||
|     public Teacher() {} | ||||
| @ -20,6 +21,14 @@ public class Teacher { | ||||
|         this.contact = contact; | ||||
|     } | ||||
| 
 | ||||
|     public Teacher(String teacherId, String name, String department, String contact, String password) { | ||||
|         this.teacherId = teacherId; | ||||
|         this.name = name; | ||||
|         this.department = department; | ||||
|         this.contact = contact; | ||||
|         this.password = password; | ||||
|     } | ||||
| 
 | ||||
|     // Getters and Setters | ||||
|     public int getId() { | ||||
|         return id; | ||||
| @ -60,4 +69,12 @@ public class Teacher { | ||||
|     public void setContact(String contact) { | ||||
|         this.contact = contact; | ||||
|     } | ||||
| 
 | ||||
|     public String getPassword() { | ||||
|         return password; | ||||
|     } | ||||
| 
 | ||||
|     public void setPassword(String password) { | ||||
|         this.password = password; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -7,6 +7,7 @@ import model.Student; | ||||
| import model.ApprovalStatus; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| import java.util.Calendar; | ||||
| 
 | ||||
| /** | ||||
|  * 请假申请服务类 | ||||
| @ -24,11 +25,13 @@ public class LeaveRequestService { | ||||
|         // 检查学生是否存在 | ||||
|         Student student = studentService.getStudentById(request.getStudent().getId()); | ||||
|         if (student == null) { | ||||
|             System.out.println("提交请假失败:学生不存在,ID=" + request.getStudent().getId()); | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         // 检查请假时间是否合理 | ||||
|         if (!isValidLeaveTime(request.getStartTime(), request.getEndTime())) { | ||||
|             System.out.println("提交请假失败:请假时间不合理,开始时间=" + request.getStartTime() + ",结束时间=" + request.getEndTime()); | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
| @ -36,7 +39,13 @@ public class LeaveRequestService { | ||||
|         request.setStatus(ApprovalStatus.PENDING); | ||||
|         request.setRequestTime(new Date()); | ||||
| 
 | ||||
|         return leaveRequestDAO.insert(request) > 0; | ||||
|         int result = leaveRequestDAO.insert(request); | ||||
|         if (result == 0) { | ||||
|             System.out.println("提交请假失败:数据库插入失败"); | ||||
|             return false; | ||||
|         } | ||||
|         System.out.println("提交请假成功:ID=" + request.getId()); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -96,6 +105,27 @@ public class LeaveRequestService { | ||||
|         return leaveRequestDAO.findById(requestId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 撤销请假申请 | ||||
|      * @param requestId 请假申请ID | ||||
|      * @return 是否撤销成功 | ||||
|      */ | ||||
|     public boolean cancelLeaveRequest(int requestId) { | ||||
|         // 检查请假申请是否存在 | ||||
|         LeaveRequest request = leaveRequestDAO.findById(requestId); | ||||
|         if (request == null) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         // 检查是否可以撤销(只有待审批状态可以撤销) | ||||
|         if (request.getStatus() != ApprovalStatus.PENDING) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         // 删除请假申请 | ||||
|         return leaveRequestDAO.deleteById(requestId) > 0; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 检查请假时间是否合理 | ||||
|      * @param startTime 开始时间 | ||||
| @ -103,19 +133,28 @@ public class LeaveRequestService { | ||||
|      * @return 是否合理 | ||||
|      */ | ||||
|     private boolean isValidLeaveTime(Date startTime, Date endTime) { | ||||
|         // 开始时间不能为空 | ||||
|         // 开始时间和结束时间不能为空 | ||||
|         if (startTime == null || endTime == null) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         // 结束时间必须在开始时间之后 | ||||
|         if (endTime.before(startTime)) { | ||||
|         if (endTime.before(startTime) || endTime.equals(startTime)) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         // 开始时间不能是过去的时间 | ||||
|         Date now = new Date(); | ||||
|         if (startTime.before(now)) { | ||||
|         // 开始时间不能是过去24小时以前的时间 | ||||
|         Calendar cal = Calendar.getInstance(); | ||||
|         cal.add(Calendar.HOUR, -24); | ||||
|         Date oneDayAgo = cal.getTime(); | ||||
|          | ||||
|         if (startTime.before(oneDayAgo)) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         // 请假时长不能超过30天 | ||||
|         long durationInDays = (endTime.getTime() - startTime.getTime()) / (1000 * 60 * 60 * 24); | ||||
|         if (durationInDays > 30) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|  | ||||
| @ -95,4 +95,25 @@ public class StudentService { | ||||
|     public List<Student> searchStudentsByName(String name) { | ||||
|         return studentDAO.findByNameLike(name); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 学生登录 | ||||
|      * @param studentId 学号 | ||||
|      * @param password 密码 | ||||
|      * @return 登录成功返回学生信息,失败返回null | ||||
|      */ | ||||
|     public Student login(String studentId, String password) { | ||||
|         Student student = studentDAO.findByStudentId(studentId); | ||||
|         System.out.println("Login attempt - StudentID: " + studentId); | ||||
|         System.out.println("Student found: " + (student != null)); | ||||
|         if (student != null) { | ||||
|             System.out.println("Stored password: " + student.getPassword()); | ||||
|             System.out.println("Input password: " + password); | ||||
|             System.out.println("Password match: " + password.equals(student.getPassword())); | ||||
|         } | ||||
|         if (student != null && password.equals(student.getPassword())) { | ||||
|             return student; | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -95,4 +95,25 @@ public class TeacherService { | ||||
|     public List<Teacher> searchTeachersByName(String name) { | ||||
|         return teacherDAO.findByNameLike(name); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 教师登录 | ||||
|      * @param teacherId 教师工号 | ||||
|      * @param password 密码 | ||||
|      * @return 登录成功返回教师信息,失败返回null | ||||
|      */ | ||||
|     public Teacher login(String teacherId, String password) { | ||||
|         Teacher teacher = teacherDAO.findByTeacherId(teacherId); | ||||
|         System.out.println("Login attempt - TeacherID: " + teacherId); | ||||
|         System.out.println("Teacher found: " + (teacher != null)); | ||||
|         if (teacher != null) { | ||||
|             System.out.println("Stored password: " + teacher.getPassword()); | ||||
|             System.out.println("Input password: " + password); | ||||
|             System.out.println("Password match: " + password.equals(teacher.getPassword())); | ||||
|         } | ||||
|         if (teacher != null && password.equals(teacher.getPassword())) { | ||||
|             return teacher; | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user