diff --git a/pom.xml b/pom.xml index 6c0c137..616f2f1 100644 --- a/pom.xml +++ b/pom.xml @@ -93,11 +93,6 @@ runtime true - - - - - com.mysql mysql-connector-j diff --git a/src/main/java/org/cmh/backend/CourseManagement/controller/CourseController.java b/src/main/java/org/cmh/backend/CourseManagement/controller/CourseController.java new file mode 100644 index 0000000..a386572 --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/controller/CourseController.java @@ -0,0 +1,138 @@ +package org.cmh.backend.CourseManagement.controller; + +import org.cmh.backend.CourseManagement.dto.GetCourseListResponse; +import org.cmh.backend.CourseManagement.dto.MessageResponse; +import org.cmh.backend.CourseManagement.dto.CourseRequest; +import org.cmh.backend.CourseManagement.dto.SearchCourseRequest; +import org.cmh.backend.CourseManagement.model.Course; +import org.cmh.backend.CourseManagement.service.CourseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import jakarta.persistence.EntityNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@RestController +@RequestMapping("/courses") +public class CourseController { + + private static final Logger logger = LoggerFactory.getLogger(CourseController.class); + + @Autowired + private CourseService courseService; + + @GetMapping + public ResponseEntity getCoursesByRange(@RequestParam Integer start, @RequestParam Integer end, @RequestParam String token) { + if (start >= end) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + long courseCount = courseService.getCourseCount(); + return new ResponseEntity<>(new GetCourseListResponse(courseCount, courseService.getCoursesByRange(start, end)), HttpStatus.OK); + } + + @GetMapping("/{id}") + public ResponseEntity getCoursePage(@PathVariable Long id, @RequestParam String token) { + try { + return new ResponseEntity<>(courseService.getCourseById(id), HttpStatus.OK); + } catch (EntityNotFoundException e) { + logger.error("Course not found with id: {}", id, e); + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + @PostMapping + public ResponseEntity createCourse(@RequestBody CourseRequest request) { + try { + courseService.createCourse(request); + } catch (DataIntegrityViolationException e) { + logger.error("Create course failed: Data integrity violation", e); + return new ResponseEntity<>(new MessageResponse("创建失败,课程已存在或缺少字段"), HttpStatus.BAD_REQUEST); + } catch (Exception e) { + logger.error("Create course failed: {}", e.getMessage(), e); + return new ResponseEntity<>(new MessageResponse("创建失败:" + e.getMessage()), HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(new MessageResponse("创建成功"), HttpStatus.CREATED); + } + + @PutMapping("/{id}") + public ResponseEntity updateCourse(@PathVariable Long id, @RequestBody CourseRequest request) { + try { + courseService.updateCourse(id, request); + } catch (DataIntegrityViolationException e) { + logger.error("Update course failed: Data integrity violation", e); + return new ResponseEntity<>(new MessageResponse("修改失败,新标题已存在或缺少字段"), HttpStatus.BAD_REQUEST); + } catch (EntityNotFoundException e) { + logger.error("Course not found with id: {}", id, e); + return new ResponseEntity<>(new MessageResponse("修改失败: 课程不存在"), HttpStatus.NOT_FOUND); + } catch (Exception e) { + logger.error("Update course failed: {}", e.getMessage(), e); + return new ResponseEntity<>(new MessageResponse("修改失败:" + e.getMessage()), HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(new MessageResponse("修改成功"), HttpStatus.OK); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteCourse(@PathVariable Long id, @RequestParam String token) { + try { + courseService.deleteCourse(id); + } catch (EntityNotFoundException e) { + logger.error("Course not found with id: {}", id, e); + return new ResponseEntity<>(new MessageResponse("删除失败,课程不存在"), HttpStatus.BAD_REQUEST); + } catch (Exception e) { + logger.error("Delete course failed: {}", e.getMessage(), e); + return new ResponseEntity<>(new MessageResponse("删除失败:" + e.getMessage()), HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(new MessageResponse("删除成功"), HttpStatus.OK); + } + + @GetMapping("/search") + public ResponseEntity searchCourses(@RequestParam String token, + @RequestParam(required = false) String title, + @RequestParam(required = false) String author, + @RequestParam(required = false) String description, + @RequestParam(required = false) String sortOrder, + @RequestParam Integer start, + @RequestParam Integer end) { + if (start >= end) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + + try { + SearchCourseRequest request = new SearchCourseRequest(token, title, author, description, sortOrder, start, end); + List courses = courseService.searchCourses(request); + long courseCount = courseService.getCourseCountByCriteria(title, author, description, sortOrder); + + return new ResponseEntity<>(new GetCourseListResponse(courseCount, courses), HttpStatus.OK); + } catch (Exception e) { + logger.error("Search courses failed with parameters: title={}, author={}, description={}, sortOrder={}, start={}, end={}", + title, author, description, sortOrder, start, end, e); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + @GetMapping("/sort") + public ResponseEntity sortCourses(@RequestParam String token, + @RequestParam String sortField, + @RequestParam String sortDirection, + @RequestParam Integer start, + @RequestParam Integer end) { + if (start >= end) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + + try { + long courseCount = courseService.getCourseCount(); + List sortedCourses = courseService.sortCourses(sortField, sortDirection, start, end); + + return new ResponseEntity<>(new GetCourseListResponse(courseCount, sortedCourses), HttpStatus.OK); + } catch (Exception e) { + logger.error("Sort courses failed with parameters: sortField={}, sortDirection={}, start={}, end={}", + sortField, sortDirection, start, end, e); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/CourseManagement/controller/FileController.java b/src/main/java/org/cmh/backend/CourseManagement/controller/FileController.java new file mode 100644 index 0000000..7c488b0 --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/controller/FileController.java @@ -0,0 +1,64 @@ +package org.cmh.backend.CourseManagement.controller; + +import org.cmh.backend.CourseManagement.dto.UploadFileResponse; +import org.springframework.core.io.UrlResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.core.io.Resource; +import org.springframework.web.multipart.MultipartFile; + + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +@RestController +@RequestMapping("/courses") +public class FileController { + private static final String UPLOAD_DIR = "uploads/"; + + @PostMapping("/upload") + public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { + if (file.isEmpty()) { + return new ResponseEntity<>(new UploadFileResponse("文件不能为空", null), HttpStatus.BAD_REQUEST); + } + + try { + // 确保上传目录存在 + Path uploadDirPath = Paths.get(UPLOAD_DIR); + if (!Files.exists(uploadDirPath)) { + Files.createDirectories(uploadDirPath); + } + + // 生成文件路径 + byte[] bytes = file.getBytes(); + Path path = Paths.get(UPLOAD_DIR + file.getOriginalFilename()); + Files.write(path, bytes); + + // 返回成功信息 + return new ResponseEntity<>(new UploadFileResponse("文件上传成功", "/api/courses/files/" + file.getOriginalFilename()), HttpStatus.OK); + } catch (IOException e) { + return new ResponseEntity<>(new UploadFileResponse("文件上传失败", null), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + @GetMapping("/files/{filename}") + public ResponseEntity getFile(@PathVariable String filename) { + try { + Path filePath = Paths.get(UPLOAD_DIR).resolve(filename).normalize(); + Resource resource = new UrlResource(filePath.toUri()); + + if (resource.exists() && resource.isReadable()) { + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") + .body(resource); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } +} diff --git a/src/main/java/org/cmh/backend/CourseManagement/dto/CourseRequest.java b/src/main/java/org/cmh/backend/CourseManagement/dto/CourseRequest.java new file mode 100644 index 0000000..86b1ff7 --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/dto/CourseRequest.java @@ -0,0 +1,16 @@ +package org.cmh.backend.CourseManagement.dto; + +import lombok.Getter; +import lombok.Setter; +import org.cmh.backend.Utils.JwtRequest; + +@Getter +@Setter +public class CourseRequest extends JwtRequest { + private String title; + private String description; + private String orderNo; + private String author; + private String videoPath; + private String imagePath; +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/CourseManagement/dto/GetCourseListResponse.java b/src/main/java/org/cmh/backend/CourseManagement/dto/GetCourseListResponse.java new file mode 100644 index 0000000..8e9d3d9 --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/dto/GetCourseListResponse.java @@ -0,0 +1,16 @@ +package org.cmh.backend.CourseManagement.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.cmh.backend.CourseManagement.model.Course; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +public class GetCourseListResponse { + Long courseCount; + List courseList; +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/CourseManagement/dto/MessageResponse.java b/src/main/java/org/cmh/backend/CourseManagement/dto/MessageResponse.java new file mode 100644 index 0000000..92a14fa --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/dto/MessageResponse.java @@ -0,0 +1,12 @@ +package org.cmh.backend.CourseManagement.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class MessageResponse { + String message; +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/CourseManagement/dto/SearchCourseRequest.java b/src/main/java/org/cmh/backend/CourseManagement/dto/SearchCourseRequest.java new file mode 100644 index 0000000..aac0c93 --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/dto/SearchCourseRequest.java @@ -0,0 +1,18 @@ +package org.cmh.backend.CourseManagement.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class SearchCourseRequest { + private String token; + private String title; + private String author; + private String description; + private String sortOrder; + private int start; + private int end; +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/CourseManagement/dto/UploadFileResponse.java b/src/main/java/org/cmh/backend/CourseManagement/dto/UploadFileResponse.java new file mode 100644 index 0000000..2a8edb3 --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/dto/UploadFileResponse.java @@ -0,0 +1,15 @@ +package org.cmh.backend.CourseManagement.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UploadFileResponse extends MessageResponse { + private String url; + + public UploadFileResponse(String message, String url) { + super(message); + this.url = url; + } +} diff --git a/src/main/java/org/cmh/backend/CourseManagement/model/Course.java b/src/main/java/org/cmh/backend/CourseManagement/model/Course.java new file mode 100644 index 0000000..137fae8 --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/model/Course.java @@ -0,0 +1,21 @@ +package org.cmh.backend.CourseManagement.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +public class Course { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String title; + private String description; + private String orderNo; + private String author; + private String videoPath; + private String imagePath; +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/CourseManagement/repository/CourseRepository.java b/src/main/java/org/cmh/backend/CourseManagement/repository/CourseRepository.java new file mode 100644 index 0000000..40e0281 --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/repository/CourseRepository.java @@ -0,0 +1,13 @@ +package org.cmh.backend.CourseManagement.repository; + +import org.cmh.backend.CourseManagement.model.Course; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +@Repository +public interface CourseRepository extends JpaRepository, JpaSpecificationExecutor { + Page findAllByOrderByIdDesc(Pageable pageable); +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/CourseManagement/service/CourseService.java b/src/main/java/org/cmh/backend/CourseManagement/service/CourseService.java new file mode 100644 index 0000000..3e00d0f --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/service/CourseService.java @@ -0,0 +1,82 @@ +package org.cmh.backend.CourseManagement.service; + +import org.cmh.backend.CourseManagement.dto.CourseRequest; +import org.cmh.backend.CourseManagement.dto.SearchCourseRequest; +import org.cmh.backend.CourseManagement.model.Course; +import org.cmh.backend.CourseManagement.repository.CourseRepository; +import org.cmh.backend.CourseManagement.specification.CourseSpecification; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import jakarta.persistence.EntityNotFoundException; +import java.util.List; + +@Service +public class CourseService { + + @Autowired + private CourseRepository courseRepository; + + public long getCourseCount() { + return courseRepository.count(); + } + + public List getCoursesByRange(int start, int end) { + Pageable pageable = PageRequest.of(start, end - start); + return courseRepository.findAll(pageable).getContent(); + } + + public Course getCourseById(Long id) { + return courseRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("Course not found")); + } + + public void createCourse(CourseRequest request) { + Course course = new Course(); + course.setTitle(request.getTitle()); + course.setAuthor(request.getAuthor()); + course.setDescription(request.getDescription()); + course.setOrderNo(request.getOrderNo()); + course.setVideoPath(request.getVideoPath()); // 确保保存视频路径 + course.setImagePath(request.getImagePath()); // 确保保存图片路径 + courseRepository.save(course); + } + + public void updateCourse(Long id, CourseRequest request) { + Course course = courseRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("Course not found")); + course.setTitle(request.getTitle()); + course.setAuthor(request.getAuthor()); + course.setDescription(request.getDescription()); + course.setOrderNo(request.getOrderNo()); + course.setVideoPath(request.getVideoPath()); // 确保更新视频路径 + course.setImagePath(request.getImagePath()); // 确保更新图片路径 + courseRepository.save(course); + } + + public void deleteCourse(Long id) { + courseRepository.deleteById(id); + } + + public List searchCourses(SearchCourseRequest request) { + Pageable pageable = PageRequest.of(request.getStart(), request.getEnd() - request.getStart()); + return courseRepository.findAll( + CourseSpecification.searchCourses( + request.getTitle(), + request.getAuthor(), + request.getDescription(), + request.getSortOrder() + ), + pageable + ).getContent(); + } + public long getCourseCountByCriteria(String title, String author, String description, String sortOrder) { + return courseRepository.count(CourseSpecification.searchCourses(title, author, description, sortOrder)); + } + public List sortCourses(String sortField, String sortDirection, int start, int end) { + Pageable pageable = PageRequest.of(start, end - start); + return courseRepository.findAll( + CourseSpecification.sortCourses(sortField, sortDirection), + pageable + ).getContent(); + } +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/CourseManagement/specification/CourseSpecification.java b/src/main/java/org/cmh/backend/CourseManagement/specification/CourseSpecification.java new file mode 100644 index 0000000..23411a4 --- /dev/null +++ b/src/main/java/org/cmh/backend/CourseManagement/specification/CourseSpecification.java @@ -0,0 +1,44 @@ +package org.cmh.backend.CourseManagement.specification; + +import org.cmh.backend.CourseManagement.model.Course; +import org.springframework.data.jpa.domain.Specification; + +import jakarta.persistence.criteria.Predicate; +import java.util.ArrayList; +import java.util.List; + +public class CourseSpecification { + + public static Specification searchCourses( + String title, String author, String description, String sortOrder) { + + return (root, query, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + + if (title != null && !title.isEmpty()) { + predicates.add(criteriaBuilder.like(root.get("title"), "%" + title + "%")); + } + if (author != null && !author.isEmpty()) { + predicates.add(criteriaBuilder.like(root.get("author"), "%" + author + "%")); + } + if (description != null && !description.isEmpty()) { + predicates.add(criteriaBuilder.like(root.get("description"), "%" + description + "%")); + } + if (sortOrder != null && !sortOrder.isEmpty()) { + predicates.add(criteriaBuilder.like(root.get("orderNo"), "%" + sortOrder+ "%")); + } + + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }; + } + public static Specification sortCourses(String sortField, String sortDirection) { + return (root, query, cb) -> { + if ("asc".equalsIgnoreCase(sortDirection)) { + query.orderBy(cb.asc(root.get(sortField))); + } else if ("desc".equalsIgnoreCase(sortDirection)) { + query.orderBy(cb.desc(root.get(sortField))); + } + return cb.conjunction(); + }; + } +} \ No newline at end of file diff --git a/src/main/java/org/cmh/backend/authentication/dto/ProfileResponse.java b/src/main/java/org/cmh/backend/authentication/dto/ProfileResponse.java new file mode 100644 index 0000000..d60fed8 --- /dev/null +++ b/src/main/java/org/cmh/backend/authentication/dto/ProfileResponse.java @@ -0,0 +1,19 @@ +package org.cmh.backend.authentication.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +@AllArgsConstructor +public class ProfileResponse { + private String username; + private String email; + private String role; + private String phoneNumber; + private String company; + private LocalDateTime createdDate; +} diff --git a/src/main/java/org/cmh/backend/authentication/dto/UpdateRequest.java b/src/main/java/org/cmh/backend/authentication/dto/UpdateRequest.java new file mode 100644 index 0000000..9ba3ea3 --- /dev/null +++ b/src/main/java/org/cmh/backend/authentication/dto/UpdateRequest.java @@ -0,0 +1,15 @@ +package org.cmh.backend.authentication.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class UpdateRequest { + private String username; + private String email; + private String phoneNumber; + private String company; +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2a38a12..3cd6354 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -23,7 +23,8 @@ server.servlet.encoding.charset=utf-8 # verificationCode verification.code.images.path=src/main/resources/static/verificationCodeImages # set the max size of a single file -spring.servlet.multipart.max-file-size=50MB +spring.servlet.multipart.max-file-size=500MB # set the max size of the total request -spring.servlet.multipart.max-request-size=50MB +spring.servlet.multipart.max-request-size=500MB + diff --git a/src/test/java/org/cmh/backend/BackendApplicationTests.java b/src/test/java/org/cmh/backend/BackendApplicationTests.java deleted file mode 100644 index 8bc26ca..0000000 --- a/src/test/java/org/cmh/backend/BackendApplicationTests.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.cmh.backend; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; - -@Import(TestcontainersConfiguration.class) -@SpringBootTest -class BackendApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/org/cmh/backend/TestBackendApplication.java b/src/test/java/org/cmh/backend/TestBackendApplication.java deleted file mode 100644 index a752147..0000000 --- a/src/test/java/org/cmh/backend/TestBackendApplication.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.cmh.backend; - -import org.springframework.boot.SpringApplication; - -public class TestBackendApplication { - - public static void main(String[] args) { - SpringApplication.from(BackendApplication::main).with(TestcontainersConfiguration.class).run(args); - } - -} diff --git a/src/test/java/org/cmh/backend/TestcontainersConfiguration.java b/src/test/java/org/cmh/backend/TestcontainersConfiguration.java deleted file mode 100644 index 27f9122..0000000 --- a/src/test/java/org/cmh/backend/TestcontainersConfiguration.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.cmh.backend; - -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.boot.testcontainers.service.connection.ServiceConnection; -import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MariaDBContainer; -import org.testcontainers.containers.MySQLContainer; -import org.testcontainers.utility.DockerImageName; - -@TestConfiguration(proxyBeanMethods = false) -class TestcontainersConfiguration { - - @Bean - @ServiceConnection - MariaDBContainer mariaDbContainer() { - return new MariaDBContainer<>(DockerImageName.parse("mariadb:latest")); - } - - @Bean - @ServiceConnection - MySQLContainer mysqlContainer() { - return new MySQLContainer<>(DockerImageName.parse("mysql:latest")); - } - -} diff --git a/src/test/java/org/cmh/backend/Utils/JwtVerifyAspectTest.java b/src/test/java/org/cmh/backend/Utils/JwtVerifyAspectTest.java deleted file mode 100644 index 22b12e1..0000000 --- a/src/test/java/org/cmh/backend/Utils/JwtVerifyAspectTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.cmh.backend.Utils; - -import org.cmh.backend.authentication.service.UserService; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mockito; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.EnableAspectJAutoProxy; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -public class JwtVerifyAspectTest { - - @Configuration - @EnableAspectJAutoProxy - @Import({JwtVerifyAspect.class}) - static class Config { - @Bean - public JwtUtil jwtUtil() { - return Mockito.mock(JwtUtil.class); - } - - @Bean - public UserService userService() { - return Mockito.mock(UserService.class); - } - } - - private JwtUtil jwtUtil = new JwtUtil(); - - @InjectMocks - private JwtVerifyAspect jwtVerifyAspect; - - @BeforeClass - public static void setUpClass() { - // Static setup if needed - } - - @Before - public void setUp() { - Mockito.when(jwtUtil.isTokenValid("validToken")).thenReturn(true); - Mockito.when(jwtUtil.isTokenValid("invalidToken")).thenReturn(false); - } - - // TODO:这个测试跑不动,有问题,先取消掉 -// @Test -// public void testVerify() { -// SomeController validTokenController = new SomeController("validToken"); -// SomeController invalidTokenController = new SomeController("invalidToken"); -// -// Assert.assertTrue("Valid token should pass verification", validTokenController.run()); -// Assert.assertFalse("Invalid token should fail verification", invalidTokenController.run()); -// } -} - -class SomeController { - private SomeJwtRequest request; - - SomeController(String token) { - this.request = new SomeJwtRequest(token, "test"); - } - - public boolean run() { - try { - return verify(request); - } catch (JwtValidationException e) { - return false; - } - } - - @JwtVerify - public boolean verify(SomeJwtRequest request) { - return true; - } -} - -class SomeJwtRequest extends JwtRequest { - String msg; - - public SomeJwtRequest(String token, String msg) { - super.setToken(token); - this.msg = msg; - } -} \ No newline at end of file