From 14dcc9de06c7321740f96cf1b915b84894bddf25 Mon Sep 17 00:00:00 2001 From: Sparkfreeman <2440444538@qq.com> Date: Wed, 3 Jul 2024 15:03:37 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=B8=8D=E7=9F=A5=E9=81=93=E6=9C=89?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E9=97=AE=E9=A2=98=E5=85=88=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E4=B8=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MeetingController.java | 77 +++++++++++++++++++ .../MeetingManagement/model/Meeting.java | 48 ++++++++++++ .../repository/MeetingRepository.java | 7 ++ .../service/MeetingService.java | 65 ++++++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 src/main/java/org/cmh/backend/MeetingManagement/controller/MeetingController.java create mode 100644 src/main/java/org/cmh/backend/MeetingManagement/model/Meeting.java create mode 100644 src/main/java/org/cmh/backend/MeetingManagement/repository/MeetingRepository.java create mode 100644 src/main/java/org/cmh/backend/MeetingManagement/service/MeetingService.java diff --git a/src/main/java/org/cmh/backend/MeetingManagement/controller/MeetingController.java b/src/main/java/org/cmh/backend/MeetingManagement/controller/MeetingController.java new file mode 100644 index 0000000..5546982 --- /dev/null +++ b/src/main/java/org/cmh/backend/MeetingManagement/controller/MeetingController.java @@ -0,0 +1,77 @@ +package org.cmh.backend.MeetingManagement.controller; + +import org.cmh.backend.MeetingManagement.model.Meeting; +import org.cmh.backend.MeetingManagement.service.MeetingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/meetings") +public class MeetingController { + + @Autowired + private MeetingService meetingService; + + @GetMapping("/listAll") + public ResponseEntity> listAll() { + List data = meetingService.getAllMeetings(); + return ResponseEntity.ok(data); + } + + @PostMapping("/addMeeting") + public ResponseEntity add(@RequestBody Map credentials) { + try { + Meeting meeting = new Meeting(); + if (credentials.get("id") != null) { + meeting.setId(Long.parseLong(credentials.get("id"))); + } + meeting.setName(credentials.get("name")); + meeting.setOrganizer(credentials.get("organizer")); + meeting.setStartTime(LocalDateTime.parse(credentials.get("startTime"))); + meeting.setEndTime(LocalDateTime.parse(credentials.get("endTime"))); + meeting.setContent(credentials.get("content")); + meeting.setStatus(credentials.get("status")); + + Meeting meetingAdd = meetingService.createMeeting(meeting); + return new ResponseEntity<>(meetingAdd, HttpStatus.CREATED); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); + } + } + + @PostMapping("/deleteMeeting") + public ResponseEntity delete(@RequestBody Map credentials) { + try { + meetingService.deleteMeeting(Long.valueOf(credentials.get("id"))); + return new ResponseEntity<>("success", HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>("failure", HttpStatus.BAD_REQUEST); + } + } + + @PostMapping("/updateMeeting") + public ResponseEntity update(@RequestBody Meeting meeting) { + try { + Meeting updatedMeeting = meetingService.updateMeeting(meeting.getId(), meeting); + return new ResponseEntity<>(updatedMeeting, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); + } + } + + @PostMapping("/getMeetingById") + public ResponseEntity getById(@RequestBody Map credentials) { + try { + Meeting meeting = meetingService.getMeetingById(Long.valueOf(credentials.get("id"))).orElse(null); + return new ResponseEntity<>(meeting, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); + } + } +} \ 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 new file mode 100644 index 0000000..964938c --- /dev/null +++ b/src/main/java/org/cmh/backend/MeetingManagement/model/Meeting.java @@ -0,0 +1,48 @@ +package org.cmh.backend.MeetingManagement.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Getter; +import lombok.Setter; +import java.time.LocalDateTime; + +@Setter +@Getter +@Entity +public class Meeting { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; + private String organizer; + private LocalDateTime startTime; + private LocalDateTime endTime; + private String content; + private String status; + + public Meeting() {} + + public Meeting(String name, String organizer, LocalDateTime startTime, LocalDateTime endTime, String content, String status) { + this.name = name; + this.organizer = organizer; + this.startTime = startTime; + this.endTime = endTime; + this.content = content; + this.status = status; + } + + @Override + public String toString() { + return "Meeting{" + + "id=" + id + + ", name='" + name + '\'' + + ", organizer='" + organizer + '\'' + + ", startTime=" + startTime + + ", endTime=" + endTime + + ", content='" + content + '\'' + + ", status='" + status + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/MeetingManagement/repository/MeetingRepository.java b/src/main/java/org/cmh/backend/MeetingManagement/repository/MeetingRepository.java new file mode 100644 index 0000000..a51188d --- /dev/null +++ b/src/main/java/org/cmh/backend/MeetingManagement/repository/MeetingRepository.java @@ -0,0 +1,7 @@ +package org.cmh.backend.MeetingManagement.repository; + +import org.cmh.backend.MeetingManagement.model.Meeting; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MeetingRepository extends JpaRepository { +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/MeetingManagement/service/MeetingService.java b/src/main/java/org/cmh/backend/MeetingManagement/service/MeetingService.java new file mode 100644 index 0000000..ae1fadb --- /dev/null +++ b/src/main/java/org/cmh/backend/MeetingManagement/service/MeetingService.java @@ -0,0 +1,65 @@ +package org.cmh.backend.MeetingManagement.service; + +import org.cmh.backend.MeetingManagement.model.Meeting; +import org.cmh.backend.MeetingManagement.repository.MeetingRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class MeetingService { + @Autowired + private MeetingRepository meetingRepository; + + public List getAllMeetings() { + return meetingRepository.findAll(); + } + + public Optional getMeetingById(Long id) { + return meetingRepository.findById(id); + } + + public Meeting createMeeting(Meeting meeting) { + validateMeeting(meeting); + return meetingRepository.save(meeting); + } + + public Meeting updateMeeting(Long id, Meeting meetingDetails) { + validateMeeting(meetingDetails); + Meeting meeting = meetingRepository.findById(id) + .orElseThrow(() -> new RuntimeException("Meeting not found with id " + id)); + meeting.setName(meetingDetails.getName()); + meeting.setOrganizer(meetingDetails.getOrganizer()); + meeting.setStartTime(meetingDetails.getStartTime()); + meeting.setEndTime(meetingDetails.getEndTime()); + meeting.setContent(meetingDetails.getContent()); + meeting.setStatus(meetingDetails.getStatus()); + return meetingRepository.save(meeting); + } + + public void deleteMeeting(Long id) { + Meeting meeting = meetingRepository.findById(id) + .orElseThrow(() -> new RuntimeException("Meeting not found with id " + id)); + meetingRepository.delete(meeting); + } + + private void validateMeeting(Meeting meeting) { + if (meeting.getName() == null || meeting.getName().isEmpty()) { + throw new RuntimeException("会议名称不能为空"); + } + if (meeting.getOrganizer() == null || meeting.getOrganizer().isEmpty()) { + throw new RuntimeException("组织者不能为空"); + } + if (meeting.getStartTime() == null) { + throw new RuntimeException("开始时间不能为空"); + } + if (meeting.getEndTime() == null) { + throw new RuntimeException("结束时间不能为空"); + } + if (meeting.getStatus() == null || meeting.getStatus().isEmpty()) { + throw new RuntimeException("状态不能为空"); + } + } +} \ No newline at end of file From 1e202aa8637210b51b558f467e085fae8ea3dd5e Mon Sep 17 00:00:00 2001 From: Sparkfreeman <2440444538@qq.com> Date: Wed, 3 Jul 2024 20:17:31 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=9B=9E=E6=BB=9A=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmh/backend/Config/SecurityConfig.java | 23 +++++++++++++++++-- .../controller/UserController.java | 2 +- .../repository/UserRepository.java | 2 +- .../authentication/service/UserService.java | 2 +- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cmh/backend/Config/SecurityConfig.java b/src/main/java/org/cmh/backend/Config/SecurityConfig.java index c917d0a..6ca67b9 100644 --- a/src/main/java/org/cmh/backend/Config/SecurityConfig.java +++ b/src/main/java/org/cmh/backend/Config/SecurityConfig.java @@ -4,6 +4,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration @@ -13,11 +15,28 @@ public class SecurityConfig { public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { // Use the new API to disable CSRF http.csrf(AbstractHttpConfigurer::disable) - // Permit all requests + // Permit all requests to specific endpoints .authorizeHttpRequests(authorize -> authorize - .anyRequest().permitAll() + .requestMatchers("/users/register", "/users/login").permitAll() // Allow these endpoints without authentication + .anyRequest().authenticated() // All other endpoints require authentication + ) + // Configure form login + .formLogin(form -> form + .loginPage("/login") // Custom login page (you need to create this endpoint) + .permitAll() + ) + // Configure logout + .logout(logout -> logout + .logoutUrl("/logout") + .logoutSuccessUrl("/login?logout") + .permitAll() ); return http.build(); } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } } diff --git a/src/main/java/org/cmh/backend/authentication/controller/UserController.java b/src/main/java/org/cmh/backend/authentication/controller/UserController.java index f4e6aae..0fc8dc7 100644 --- a/src/main/java/org/cmh/backend/authentication/controller/UserController.java +++ b/src/main/java/org/cmh/backend/authentication/controller/UserController.java @@ -20,4 +20,4 @@ public class UserController { User user = userService.getUserByUsername(username); return ResponseEntity.ok(user); } -} +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/authentication/repository/UserRepository.java b/src/main/java/org/cmh/backend/authentication/repository/UserRepository.java index 2c5116e..b1dae57 100644 --- a/src/main/java/org/cmh/backend/authentication/repository/UserRepository.java +++ b/src/main/java/org/cmh/backend/authentication/repository/UserRepository.java @@ -5,4 +5,4 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository { User findByUsername(String username); -} +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/authentication/service/UserService.java b/src/main/java/org/cmh/backend/authentication/service/UserService.java index 30e5134..0bdd5a0 100644 --- a/src/main/java/org/cmh/backend/authentication/service/UserService.java +++ b/src/main/java/org/cmh/backend/authentication/service/UserService.java @@ -13,4 +13,4 @@ public class UserService { public User getUserByUsername(String username) { return userRepository.findByUsername(username); } -} +} \ No newline at end of file From 2563cdbd51e1b52683bbc0bc986d9a917f9d3851 Mon Sep 17 00:00:00 2001 From: Sparkfreeman <2440444538@qq.com> Date: Thu, 4 Jul 2024 00:13:38 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=9B=9E=E6=BB=9A=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmh/backend/Config/SecurityConfig.java | 2 +- .../controller/UserController.java | 31 ++++++++++++++++--- .../authentication/service/UserService.java | 17 ++++++++++ 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cmh/backend/Config/SecurityConfig.java b/src/main/java/org/cmh/backend/Config/SecurityConfig.java index 6ca67b9..8f4554d 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").permitAll() // Allow these endpoints without authentication + .requestMatchers("/users/register", "/users/login","/meetings/getMeetingById","/meetings/updateMeeting","/meetings/deleteMeeting","/meetings/addMeeting","/meetings/listAll").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/authentication/controller/UserController.java b/src/main/java/org/cmh/backend/authentication/controller/UserController.java index 0fc8dc7..753f36e 100644 --- a/src/main/java/org/cmh/backend/authentication/controller/UserController.java +++ b/src/main/java/org/cmh/backend/authentication/controller/UserController.java @@ -4,10 +4,8 @@ import org.cmh.backend.authentication.model.User; import org.cmh.backend.authentication.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/users") @@ -15,9 +13,34 @@ public class UserController { @Autowired private UserService userService; + @Autowired + private PasswordEncoder passwordEncoder; + @GetMapping("/{username}") public ResponseEntity getUser(@PathVariable String username) { User user = userService.getUserByUsername(username); return ResponseEntity.ok(user); } + + @PostMapping("/register") + public ResponseEntity registerUser(@RequestBody User user) { + // 检查用户名是否已经存在 + if (userService.isUsernameTaken(user.getUsername())) { + return ResponseEntity.status(400).body("用户名已存在"); + } + // 保存用户信息 + userService.saveUser(user); + return ResponseEntity.ok("User registered successfully"); + } + + @PostMapping("/login") + public ResponseEntity login(@RequestBody User user) { + // 处理登录逻辑 + User existingUser = userService.getUserByUsername(user.getUsername()); + if (existingUser != null && passwordEncoder.matches(user.getPassword(), existingUser.getPassword())) { + return ResponseEntity.ok("登录成功"); + } else { + return ResponseEntity.status(401).body("用户名或密码错误"); + } + } } \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/authentication/service/UserService.java b/src/main/java/org/cmh/backend/authentication/service/UserService.java index 0bdd5a0..e6755ca 100644 --- a/src/main/java/org/cmh/backend/authentication/service/UserService.java +++ b/src/main/java/org/cmh/backend/authentication/service/UserService.java @@ -3,6 +3,7 @@ package org.cmh.backend.authentication.service; import org.cmh.backend.authentication.model.User; import org.cmh.backend.authentication.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @Service @@ -10,7 +11,23 @@ public class UserService { @Autowired private UserRepository userRepository; + @Autowired + private PasswordEncoder passwordEncoder; + + // 获取用户信息通过用户名 public User getUserByUsername(String username) { return userRepository.findByUsername(username); } + + // 保存用户信息 + public void saveUser(User user) { + // 对密码进行加密 + user.setPassword(passwordEncoder.encode(user.getPassword())); + userRepository.save(user); + } + + // 检查用户名是否已经存在 + public boolean isUsernameTaken(String username) { + return userRepository.findByUsername(username) != null; + } } \ No newline at end of file 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 4/5] =?UTF-8?q?=E9=99=A4=E7=94=9F=E6=88=90=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=8A=9F=E8=83=BD=E5=A4=96=E5=85=B6=E4=BB=96=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=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); + } + } + + From d1fa646f95aa4c5311b4730ea3e01679136600dc Mon Sep 17 00:00:00 2001 From: Sparkfreeman <2440444538@qq.com> Date: Thu, 4 Jul 2024 20:50:16 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=90=8E=E7=AB=AF=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E7=89=88=EF=BC=88=E4=B9=9F=E8=AE=B8=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmh/backend/Config/SecurityConfig.java | 22 ++++++------------- .../controller/MeetingController.java | 7 +++--- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/cmh/backend/Config/SecurityConfig.java b/src/main/java/org/cmh/backend/Config/SecurityConfig.java index 78f169e..c5a4336 100644 --- a/src/main/java/org/cmh/backend/Config/SecurityConfig.java +++ b/src/main/java/org/cmh/backend/Config/SecurityConfig.java @@ -13,24 +13,16 @@ public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - // Use the new API to disable CSRF + // Disable CSRF http.csrf(AbstractHttpConfigurer::disable) - // Permit all requests to specific endpoints + // Permit all requests to all endpoints .authorizeHttpRequests(authorize -> authorize - .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 + .anyRequest().permitAll() // Allow all requests without authentication ) - // Configure form login - .formLogin(form -> form - .loginPage("/login") // Custom login page (you need to create this endpoint) - .permitAll() - ) - // Configure logout - .logout(logout -> logout - .logoutUrl("/logout") - .logoutSuccessUrl("/login?logout") - .permitAll() - ); + // Disable form login + .formLogin(AbstractHttpConfigurer::disable) + // Disable logout + .logout(AbstractHttpConfigurer::disable); return http.build(); } 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 568937d..9da414a 100644 --- a/src/main/java/org/cmh/backend/MeetingManagement/controller/MeetingController.java +++ b/src/main/java/org/cmh/backend/MeetingManagement/controller/MeetingController.java @@ -152,10 +152,11 @@ public class MeetingController { 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; + OffsetDateTime startTimeStr = OffsetDateTime.parse(params.get("startTime"),formatter); + LocalDateTime startTime1 = (startTimeStr.toLocalDateTime()); + //LocalDateTime startTime = startTimeStr != null ? LocalDateTime.parse(startTimeStr) : null; - List meetings = meetingService.searchMeetings(name, organizer, startTime); + List meetings = meetingService.searchMeetings(name, organizer, startTime1); return new ResponseEntity<>(meetings, HttpStatus.OK); }