完成团课查找功能

This commit is contained in:
2026-04-30 15:53:40 +08:00
parent f853cb73b5
commit ffb3f20774
20 changed files with 730 additions and 4 deletions
@@ -50,7 +50,11 @@ public class SecurityConfig {
spec.pathMatchers("/api/auth/**").permitAll()
.pathMatchers("/api/public/**").permitAll()
.pathMatchers("/ws/**").permitAll()
.pathMatchers("/actuator/**").permitAll();
.pathMatchers("/actuator/**").permitAll()
//========TODO lwt 以下是测试接口,生产时必关========
.pathMatchers("/api/users/**").permitAll()
.pathMatchers("/api/groupCourse/**").permitAll();
if (isDevOrTest) {
spec.pathMatchers("/swagger-ui.html").permitAll()
@@ -0,0 +1,146 @@
package cn.novalon.gym.manage.sys.core.domain;
/**
* @author:liwentao
* @date:2026/4/26-04-26-13:20
*/
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.data.relational.core.mapping.Column;
import java.time.LocalDateTime;
import java.util.Date;
@Schema(description = "")
public class GroupCourse extends BaseDomain{
//课程名称
@Schema(description = "团课名", example = "Push-up")
private String courseName;
//教练id
@Schema(description = "教练id", example = "1")
private Long coachId;
//课程类型
@Schema(description = "课程类型", example = "1")
private Long courseType;
//开始时间
@Schema(description = "开始时间", example = "2026-01-01")
private LocalDateTime startTime;
//结束时间
@Schema(description = "结束时间", example = "2026-01-02")
private LocalDateTime endTime;
//最大参与人数
@Schema(description = "最大参与人数", example = "20")
private Integer maxMembers;
//当前参与人数
@Schema(description = "当前参与人数", example = "2")
private Integer currentMembers;
//课程状态:0-正常,1-已取消,2-已结束
@Schema(description = "课程状态", example = "0")
private Long status;
//上课地点
@Schema(description = "上课地点", example = "龙泉驿区幸福路")
private String location;
//封面图URL
@Schema(description = "封面图URL", example = "https://12345.com")
private String coverImage;
//课程描述
@Schema(description = "课程描述", example = "从入门到入土")
private String description;
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public Long getCoachId() {
return coachId;
}
public void setCoachId(Long coachId) {
this.coachId = coachId;
}
public Long getCourseType() {
return courseType;
}
public void setCourseType(Long courseType) {
this.courseType = courseType;
}
public LocalDateTime getStartTime() {
return startTime;
}
public void setStartTime(LocalDateTime startTime) {
this.startTime = startTime;
}
public LocalDateTime getEndTime() {
return endTime;
}
public void setEndTime(LocalDateTime endTime) {
this.endTime = endTime;
}
public Integer getMaxMembers() {
return maxMembers;
}
public void setMaxMembers(Integer maxMembers) {
this.maxMembers = maxMembers;
}
public Integer getCurrentMembers() {
return currentMembers;
}
public void setCurrentMembers(Integer currentMembers) {
this.currentMembers = currentMembers;
}
public Long getStatus() {
return status;
}
public void setStatus(Long status) {
this.status = status;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getCoverImage() {
return coverImage;
}
public void setCoverImage(String coverImage) {
this.coverImage = coverImage;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
@@ -0,0 +1,14 @@
package cn.novalon.gym.manage.sys.core.repository;
import cn.novalon.gym.manage.sys.core.domain.GroupCourse;
import org.springframework.data.domain.Sort;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface IGroupCourseRepository {
Mono<GroupCourse> findByIdAndDeletedAtIsNull(Long id);
Flux<GroupCourse> findAll();
Flux<GroupCourse> findAll(Sort sort);
Flux<GroupCourse> findByDeletedAtIsNull();
Flux<GroupCourse> findByDeletedAtIsNull(Sort sort);
}
@@ -0,0 +1,11 @@
package cn.novalon.gym.manage.sys.core.service;
import cn.novalon.gym.manage.sys.core.domain.GroupCourse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface IGroupCourseService {
Mono<GroupCourse> findById(Long id);
Flux<GroupCourse> findAll();
Flux<GroupCourse> findAll(boolean includeDeleted);
}
@@ -0,0 +1,42 @@
package cn.novalon.gym.manage.sys.core.service.impl;
import cn.novalon.gym.manage.sys.audit.service.IAuditLogService;
import cn.novalon.gym.manage.sys.core.domain.GroupCourse;
import cn.novalon.gym.manage.sys.core.repository.IGroupCourseRepository;
import cn.novalon.gym.manage.sys.core.service.IGroupCourseService;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
/**
* @author:liwentao
* @date:2026/4/26-04-26-14:12
*/
@Service
public class GroupCourseService implements IGroupCourseService {
private final IGroupCourseRepository groupCourseRepository;
private final IAuditLogService auditLogService;
public GroupCourseService(IGroupCourseRepository groupCourseRepository, IAuditLogService auditLogService){
this.groupCourseRepository = groupCourseRepository;
this.auditLogService = auditLogService;
}
@Override
public Mono<GroupCourse> findById(Long id) {
return groupCourseRepository.findByIdAndDeletedAtIsNull(id);
}
@Override
public Flux<GroupCourse> findAll() {
return groupCourseRepository.findAll();
}
@Override
public Flux<GroupCourse> findAll(boolean includeDeleted) {
if(includeDeleted){
return groupCourseRepository.findAll();
}else{
return groupCourseRepository.findByDeletedAtIsNull();
}
}
}
@@ -15,6 +15,7 @@ import cn.novalon.gym.manage.sys.core.repository.IUserRoleRepository;
import cn.novalon.gym.manage.sys.core.service.ISysUserService;
import cn.novalon.gym.manage.sys.core.command.CreateUserCommand;
import cn.novalon.gym.manage.sys.core.command.UpdateUserCommand;
import cn.novalon.gym.manage.sys.dto.response.UserResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -0,0 +1,40 @@
package cn.novalon.gym.manage.sys.handler.groupCourse;
import cn.novalon.gym.manage.sys.core.domain.GroupCourse;
import cn.novalon.gym.manage.sys.core.service.IGroupCourseService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Validator;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
/**
* @author:liwentao
* @date:2026/4/26-04-26-14:30
*/
@Component
@Tag(name="团课管理",description = "团课相关操作")
public class GroupCourseHandler {
private final IGroupCourseService groupCourseService;
private final Validator validator;
public GroupCourseHandler(IGroupCourseService groupCourseService,Validator validator){
this.groupCourseService = groupCourseService;
this.validator = validator;
}
@Operation(summary = "获取所有用户", description = "获取系统中所有用户列表")
public Mono<ServerResponse> getAllGroupCourse(ServerRequest request){
boolean includeDeleted = Boolean.valueOf(request.queryParam("includeDeleted").orElse("false"));
return ServerResponse.ok()
.body(groupCourseService.findAll(includeDeleted), GroupCourse.class);
}
public Mono<ServerResponse> getGroupCourseById(ServerRequest request){
Long id = Long.valueOf(request.pathVariable("id"));
return groupCourseService.findById(id)
.flatMap(groupCourse -> ServerResponse.ok().bodyValue(groupCourse))
.switchIfEmpty(ServerResponse.notFound().build());
}
}