diff --git a/pom.xml b/pom.xml index e77e588..a5d0531 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ com.github.pagehelper pagehelper-spring-boot-starter - 1.3.0 + 2.1.0 com.github.xiaoymin diff --git a/src/main/java/com/bicloud/Interceptor/RequestLogInterceptor.java b/src/main/java/com/bicloud/Interceptor/RequestLogInterceptor.java new file mode 100644 index 0000000..7047f73 --- /dev/null +++ b/src/main/java/com/bicloud/Interceptor/RequestLogInterceptor.java @@ -0,0 +1,50 @@ +package com.bicloud.Interceptor; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import java.time.LocalDateTime; + + +/* +拦截器,请求打印请求状态 + */ +@Component +public class RequestLogInterceptor implements HandlerInterceptor { + + private static final Logger log = LoggerFactory.getLogger(RequestLogInterceptor.class); + private static final String START_TIME = "REQ_START_TIME"; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + request.setAttribute(START_TIME, System.currentTimeMillis()); + + log.info("[REQ] time={}, method={}, uri={}, ip={}", + LocalDateTime.now(), + request.getMethod(), + request.getRequestURI(), + request.getRemoteAddr()); + + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, + Object handler, Exception ex) { + Long start = (Long) request.getAttribute(START_TIME); + long cost = (start == null) ? -1 : (System.currentTimeMillis() - start); + + if (ex == null) { + log.info("[RES] status={}, costMs={}, uri={}", + response.getStatus(), cost, request.getRequestURI()); + } else { + log.warn("[RES] status={}, costMs={}, uri={}, ex={}", + response.getStatus(), cost, request.getRequestURI(), ex.toString()); + } + } +} + diff --git a/src/main/java/com/bicloud/config/OpenApiConfig.java b/src/main/java/com/bicloud/config/OpenApiConfig.java index b692a9f..444ca36 100644 --- a/src/main/java/com/bicloud/config/OpenApiConfig.java +++ b/src/main/java/com/bicloud/config/OpenApiConfig.java @@ -33,7 +33,7 @@ public class OpenApiConfig { @Bean public GroupedOpenApi literatureApi() { return GroupedOpenApi.builder() - .group("文献管理接口") // 分组名称 + .group("bicloud接口") // 分组名称 .packagesToScan("com.bicloud.controller") // 匹配的接口路径 .build(); } diff --git a/src/main/java/com/bicloud/config/WebMvcConfig.java b/src/main/java/com/bicloud/config/WebMvcConfig.java new file mode 100644 index 0000000..3a1018b --- /dev/null +++ b/src/main/java/com/bicloud/config/WebMvcConfig.java @@ -0,0 +1,22 @@ +package com.bicloud.config; + +import com.bicloud.Interceptor.RequestLogInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + private final RequestLogInterceptor requestLogInterceptor; + + public WebMvcConfig(RequestLogInterceptor requestLogInterceptor) { + this.requestLogInterceptor = requestLogInterceptor; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(requestLogInterceptor) + .addPathPatterns("/**"); + } +} diff --git a/src/main/java/com/bicloud/controller/CourseController.java b/src/main/java/com/bicloud/controller/CourseController.java index 591325c..3b8ed03 100644 --- a/src/main/java/com/bicloud/controller/CourseController.java +++ b/src/main/java/com/bicloud/controller/CourseController.java @@ -1,12 +1,15 @@ package com.bicloud.controller; +import com.bicloud.common.result.PageResult; import com.bicloud.common.result.Result; +import com.bicloud.pojo.dto.CoursePageQueryDto; +import com.bicloud.pojo.vo.CourseCardVo; import com.bicloud.pojo.vo.CourseCatVo; import com.bicloud.service.CourseService; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; - import java.util.List; @CrossOrigin //跨域 @@ -23,9 +26,17 @@ public class CourseController { // 获取课程分类列表 @GetMapping("/cats") + @Operation(summary = "获取分类列表") public Result> listCourseCats() { List cats = courseService.listCourseCats(); return Result.success(cats); } + // 课程中心分页查询 + @GetMapping("/page") + @Operation(summary = "课程条件查询") + public Result> pageQuery(CoursePageQueryDto queryDTO) { + return Result.success(courseService.pageQuery(queryDTO)); + } + } diff --git a/src/main/java/com/bicloud/mapper/CourseMapper.java b/src/main/java/com/bicloud/mapper/CourseMapper.java index c54fc4d..e782b83 100644 --- a/src/main/java/com/bicloud/mapper/CourseMapper.java +++ b/src/main/java/com/bicloud/mapper/CourseMapper.java @@ -1,6 +1,9 @@ package com.bicloud.mapper; +import com.bicloud.pojo.dto.CoursePageQueryDto; +import com.bicloud.pojo.vo.CourseCardVo; import com.bicloud.pojo.vo.CourseCatVo; +import com.github.pagehelper.Page; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -10,4 +13,7 @@ public interface CourseMapper { // 课程分类列表 List listCourseCats(); + + // 分页查询课程卡片列表 + Page pageQuery(CoursePageQueryDto queryDTO); } diff --git a/src/main/java/com/bicloud/pojo/dto/CoursePageQueryDto.java b/src/main/java/com/bicloud/pojo/dto/CoursePageQueryDto.java new file mode 100644 index 0000000..e9f7866 --- /dev/null +++ b/src/main/java/com/bicloud/pojo/dto/CoursePageQueryDto.java @@ -0,0 +1,16 @@ +package com.bicloud.pojo.dto; + +import lombok.Data; + +/** + * 课程分页查询参数 + */ +@Data +public class CoursePageQueryDto { + private Integer page; // 页码(从1开始) + private Integer pageSize; // 每页条数 + + private Integer catId; // 分类ID(可空:全部) + private String keyword; // 课程名关键字(可空) + private String sort; // latest / hot(可空:默认 latest) +} diff --git a/src/main/java/com/bicloud/pojo/vo/CourseCardVo.java b/src/main/java/com/bicloud/pojo/vo/CourseCardVo.java new file mode 100644 index 0000000..6a8b12b --- /dev/null +++ b/src/main/java/com/bicloud/pojo/vo/CourseCardVo.java @@ -0,0 +1,19 @@ +package com.bicloud.pojo.vo; + +import lombok.Data; + +import java.sql.Timestamp; + +/** + * 课程卡片返回对象(列表页展示用) + */ +@Data +public class CourseCardVo { + private Integer id; // 课程ID + private String courseName; // 课程标题 + private String courseIcon; // 封面路径 + private Timestamp addtime; // 发布时间 + private Integer hot; // 热度(先用course_collect) + private Integer catId; // 分类ID + private String catName; // 分类名(用于卡片标签) +} diff --git a/src/main/java/com/bicloud/service/CourseService.java b/src/main/java/com/bicloud/service/CourseService.java index 2e79ab6..51b7eb6 100644 --- a/src/main/java/com/bicloud/service/CourseService.java +++ b/src/main/java/com/bicloud/service/CourseService.java @@ -1,5 +1,8 @@ package com.bicloud.service; +import com.bicloud.common.result.PageResult; +import com.bicloud.pojo.dto.CoursePageQueryDto; +import com.bicloud.pojo.vo.CourseCardVo; import com.bicloud.pojo.vo.CourseCatVo; import java.util.List; @@ -8,4 +11,7 @@ public interface CourseService { // 获取课程分类列表 List listCourseCats(); + + // 课程中心分页查询 + PageResult pageQuery(CoursePageQueryDto queryDTO); } diff --git a/src/main/java/com/bicloud/service/impl/CourseServiceImpl.java b/src/main/java/com/bicloud/service/impl/CourseServiceImpl.java index 102a5a1..2f544d6 100644 --- a/src/main/java/com/bicloud/service/impl/CourseServiceImpl.java +++ b/src/main/java/com/bicloud/service/impl/CourseServiceImpl.java @@ -1,8 +1,13 @@ package com.bicloud.service.impl; +import com.bicloud.common.result.PageResult; import com.bicloud.mapper.CourseMapper; +import com.bicloud.pojo.dto.CoursePageQueryDto; +import com.bicloud.pojo.vo.CourseCardVo; import com.bicloud.pojo.vo.CourseCatVo; import com.bicloud.service.CourseService; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; import org.springframework.stereotype.Service; import java.util.List; @@ -21,4 +26,20 @@ public class CourseServiceImpl implements CourseService { public List listCourseCats() { return courseMapper.listCourseCats(); } + + // 课程中心分页查询 + @Override + public PageResult pageQuery(CoursePageQueryDto queryDTO) { + + // 1) PageHelper 开始分页(兜底默认值,避免空指针) + int page = (queryDTO.getPage() == null || queryDTO.getPage() < 1) ? 1 : queryDTO.getPage(); + int pageSize = (queryDTO.getPageSize() == null || queryDTO.getPageSize() < 1) ? 12 : queryDTO.getPageSize(); + PageHelper.startPage(page, pageSize); + + // 2) 执行 mapper 查询(PageHelper 自动加 limit) + Page p = courseMapper.pageQuery(queryDTO); + + // 3) 取 total + records + return new PageResult<>(p.getTotal(), p.getResult()); + } } diff --git a/src/main/resources/mapper/CourseMapper.xml b/src/main/resources/mapper/CourseMapper.xml index 4f2b3e7..07700b6 100644 --- a/src/main/resources/mapper/CourseMapper.xml +++ b/src/main/resources/mapper/CourseMapper.xml @@ -14,4 +14,37 @@ ORDER BY position ASC, id ASC + + + +