From c0c6fed086f27b958ebfcba0c3ee1861feea2582 Mon Sep 17 00:00:00 2001 From: Sparkfreeman <2440444538@qq.com> Date: Thu, 4 Jul 2024 15:46:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=A4=E7=94=9F=E6=88=90=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=A4=96=E5=85=B6=E4=BB=96=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 11 ++ .../cmh/backend/Config/SecurityConfig.java | 2 +- .../controller/MeetingController.java | 133 +++++++++++++++++- .../MeetingManagement/model/Meeting.java | 4 +- .../repository/MeetingRepository.java | 10 +- .../service/MeetingService.java | 11 +- 6 files changed, 162 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 39cc9bb..00755bd 100644 --- a/pom.xml +++ b/pom.xml @@ -164,6 +164,17 @@ mysql test + + org.apache.poi + poi-ooxml + 5.2.3 + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + diff --git a/src/main/java/org/cmh/backend/Config/SecurityConfig.java b/src/main/java/org/cmh/backend/Config/SecurityConfig.java index 8f4554d..78f169e 100644 --- a/src/main/java/org/cmh/backend/Config/SecurityConfig.java +++ b/src/main/java/org/cmh/backend/Config/SecurityConfig.java @@ -17,7 +17,7 @@ public class SecurityConfig { http.csrf(AbstractHttpConfigurer::disable) // Permit all requests to specific endpoints .authorizeHttpRequests(authorize -> authorize - .requestMatchers("/users/register", "/users/login","/meetings/getMeetingById","/meetings/updateMeeting","/meetings/deleteMeeting","/meetings/addMeeting","/meetings/listAll").permitAll() // Allow these endpoints without authentication + .requestMatchers("/users/register", "/users/login","/meetings/getMeetingById","/meetings/updateMeeting","/meetings/deleteMeeting","/meetings/addMeeting","/meetings/listAll","/meetings/export","/meetings/searchMeetings").permitAll() // Allow these endpoints without authentication .anyRequest().authenticated() // All other endpoints require authentication ) // Configure form login diff --git a/src/main/java/org/cmh/backend/MeetingManagement/controller/MeetingController.java b/src/main/java/org/cmh/backend/MeetingManagement/controller/MeetingController.java index 5546982..568937d 100644 --- a/src/main/java/org/cmh/backend/MeetingManagement/controller/MeetingController.java +++ b/src/main/java/org/cmh/backend/MeetingManagement/controller/MeetingController.java @@ -8,8 +8,20 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFRow; +import javax.servlet.http.HttpServletResponse; + @RestController @RequestMapping("/meetings") @@ -18,6 +30,8 @@ public class MeetingController { @Autowired private MeetingService meetingService; + private DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + @GetMapping("/listAll") public ResponseEntity> listAll() { List data = meetingService.getAllMeetings(); @@ -33,8 +47,13 @@ public class MeetingController { } meeting.setName(credentials.get("name")); meeting.setOrganizer(credentials.get("organizer")); - meeting.setStartTime(LocalDateTime.parse(credentials.get("startTime"))); - meeting.setEndTime(LocalDateTime.parse(credentials.get("endTime"))); + + // Parse startTime and endTime to OffsetDateTime, then convert to LocalDateTime + OffsetDateTime startTime = OffsetDateTime.parse(credentials.get("startTime"), formatter); + OffsetDateTime endTime = OffsetDateTime.parse(credentials.get("endTime"), formatter); + meeting.setStartTime(startTime.toLocalDateTime()); + meeting.setEndTime(endTime.toLocalDateTime()); + meeting.setContent(credentials.get("content")); meeting.setStatus(credentials.get("status")); @@ -55,13 +74,67 @@ public class MeetingController { } } + @PostMapping("/updateMeeting") - public ResponseEntity update(@RequestBody Meeting meeting) { + public ResponseEntity update(@RequestBody Map credentials) { try { + // Validate and parse id + String idStr = credentials.get("id"); + if (idStr == null || idStr.isEmpty()) { + throw new IllegalArgumentException("ID cannot be null or empty"); + } + Long id = Long.parseLong(idStr); + + // Validate and parse other fields + String name = credentials.get("name"); + if (name == null || name.isEmpty()) { + throw new IllegalArgumentException("Name cannot be null or empty"); + } + + String organizer = credentials.get("organizer"); + if (organizer == null || organizer.isEmpty()) { + throw new IllegalArgumentException("Organizer cannot be null or empty"); + } + + String startTimeStr = credentials.get("startTime"); + if (startTimeStr == null || startTimeStr.isEmpty()) { + throw new IllegalArgumentException("Start time cannot be null or empty"); + } + LocalDateTime startTime = LocalDateTime.parse(startTimeStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + + String endTimeStr = credentials.get("endTime"); + if (endTimeStr == null || endTimeStr.isEmpty()) { + throw new IllegalArgumentException("End time cannot be null or empty"); + } + LocalDateTime endTime = LocalDateTime.parse(endTimeStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + + String content = credentials.get("content"); + if (content == null || content.isEmpty()) { + throw new IllegalArgumentException("Content cannot be null or empty"); + } + + String status = credentials.get("status"); + if (status == null || status.isEmpty()) { + throw new IllegalArgumentException("Status cannot be null or empty"); + } + + // Create and update meeting + Meeting meeting = new Meeting(); + meeting.setId(id); + meeting.setName(name); + meeting.setOrganizer(organizer); + meeting.setStartTime(startTime); + meeting.setEndTime(endTime); + meeting.setContent(content); + meeting.setStatus(status); + Meeting updatedMeeting = meetingService.updateMeeting(meeting.getId(), meeting); return new ResponseEntity<>(updatedMeeting, HttpStatus.OK); - } catch (Exception e) { + } catch (IllegalArgumentException e) { return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); + } catch (Exception e) { + e.printStackTrace(); // 打印异常信息 + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); } } @@ -74,4 +147,56 @@ public class MeetingController { return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); } } + + @PostMapping("/searchMeetings") + public ResponseEntity> searchMeetings(@RequestBody Map params) { + String name = params.get("name"); + String organizer = params.get("organizer"); + String startTimeStr = params.get("startTime"); + LocalDateTime startTime = startTimeStr != null ? LocalDateTime.parse(startTimeStr) : null; + + List meetings = meetingService.searchMeetings(name, organizer, startTime); + return new ResponseEntity<>(meetings, HttpStatus.OK); + } + + @PostMapping("/export") + public void exportMeetings(@RequestBody Map params, HttpServletResponse response) { + String name = params.get("name"); + String organizer = params.get("organizer"); + String startTimeStr = params.get("startTime"); + LocalDateTime startTime = startTimeStr != null ? LocalDateTime.parse(startTimeStr) : null; + + List meetings = meetingService.searchMeetings(name, organizer, startTime); + + // 生成Excel文件 + try (XSSFWorkbook workbook = new XSSFWorkbook()) { + XSSFSheet sheet = workbook.createSheet("Meetings"); + XSSFRow header = sheet.createRow(0); + header.createCell(0).setCellValue("会议ID"); + header.createCell(1).setCellValue("会议名称"); + header.createCell(2).setCellValue("组织者"); + header.createCell(3).setCellValue("开始时间"); + header.createCell(4).setCellValue("结束时间"); + header.createCell(5).setCellValue("状态"); + + int rowIdx = 1; + for (Meeting meeting : meetings) { + XSSFRow row = sheet.createRow(rowIdx++); + row.createCell(0).setCellValue(meeting.getId()); + row.createCell(1).setCellValue(meeting.getName()); + row.createCell(2).setCellValue(meeting.getOrganizer()); + row.createCell(3).setCellValue(meeting.getStartTime().toString()); + row.createCell(4).setCellValue(meeting.getEndTime().toString()); + row.createCell(5).setCellValue(meeting.getStatus()); + } + + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("Content-Disposition", "attachment; filename=meetings.xlsx"); + workbook.write(response.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/MeetingManagement/model/Meeting.java b/src/main/java/org/cmh/backend/MeetingManagement/model/Meeting.java index 964938c..ff06aef 100644 --- a/src/main/java/org/cmh/backend/MeetingManagement/model/Meeting.java +++ b/src/main/java/org/cmh/backend/MeetingManagement/model/Meeting.java @@ -17,8 +17,8 @@ public class Meeting { private Long id; private String name; private String organizer; - private LocalDateTime startTime; - private LocalDateTime endTime; + private LocalDateTime startTime; // Changed to LocalDateTime + private LocalDateTime endTime; // Changed to LocalDateTime private String content; private String status; diff --git a/src/main/java/org/cmh/backend/MeetingManagement/repository/MeetingRepository.java b/src/main/java/org/cmh/backend/MeetingManagement/repository/MeetingRepository.java index a51188d..20a987c 100644 --- a/src/main/java/org/cmh/backend/MeetingManagement/repository/MeetingRepository.java +++ b/src/main/java/org/cmh/backend/MeetingManagement/repository/MeetingRepository.java @@ -2,6 +2,14 @@ package org.cmh.backend.MeetingManagement.repository; import org.cmh.backend.MeetingManagement.model.Meeting; import org.springframework.data.jpa.repository.JpaRepository; +import java.time.LocalDateTime; +import java.util.List; +import org.springframework.data.jpa.repository.Query; public interface MeetingRepository extends JpaRepository { -} \ No newline at end of file + @Query("SELECT m FROM Meeting m WHERE " + + "(?1 IS NULL OR m.name LIKE %?1%) AND " + + "(?2 IS NULL OR m.organizer LIKE %?2%) AND " + + "(?3 IS NULL OR m.startTime >= ?3)") + List searchMeetings(String name, String organizer, LocalDateTime startTime); +} diff --git a/src/main/java/org/cmh/backend/MeetingManagement/service/MeetingService.java b/src/main/java/org/cmh/backend/MeetingManagement/service/MeetingService.java index ae1fadb..b9de395 100644 --- a/src/main/java/org/cmh/backend/MeetingManagement/service/MeetingService.java +++ b/src/main/java/org/cmh/backend/MeetingManagement/service/MeetingService.java @@ -5,6 +5,7 @@ import org.cmh.backend.MeetingManagement.repository.MeetingRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -62,4 +63,12 @@ public class MeetingService { throw new RuntimeException("状态不能为空"); } } -} \ No newline at end of file + + + public List searchMeetings(String name, String organizer, LocalDateTime startTime) { + // 根据条件搜索会议 + return meetingRepository.searchMeetings(name, organizer, startTime); + } + } + +