Browse Source

Merge branch 'master' of http://git.dayaedu.com/yonge/cooleshow

liujunchi 2 years ago
parent
commit
5b9031d1dd
27 changed files with 309 additions and 165 deletions
  1. 16 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/UserSetReq.java
  2. 16 0
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/vo/UserSetVo.java
  3. 4 0
      cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  4. 9 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UploadFileController.java
  5. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/CourseConstant.java
  6. 1 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java
  7. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImGroupMemberAudit.java
  8. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  9. 2 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  10. 25 15
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  11. 10 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  12. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  13. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  14. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java
  15. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonPurchaseStudent.java
  16. 9 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonStudentVo.java
  17. 58 59
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  18. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupDetailMapper.xml
  19. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  20. 46 24
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UploadFileController.java
  21. 10 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  22. 0 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/VideoLessonController.java
  23. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/config/ResourceServerConfig.java
  24. 6 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java
  25. 0 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java
  26. 46 24
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UploadFileController.java
  27. 16 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java

+ 16 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/dto/UserSetReq.java

@@ -1,8 +1,12 @@
 package com.yonge.cooleshow.auth.api.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.common.enums.UserGenderEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
 
 /**
  * @Author: liweifan
@@ -16,6 +20,10 @@ public class UserSetReq {
     private String username;
     @ApiModelProperty(value = "性别 0女 1男")
     private Integer gender;
+    @ApiModelProperty(value = "出生日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date birthdate;
 
     public String getAvatar() {
         return avatar;
@@ -40,4 +48,12 @@ public class UserSetReq {
     public void setGender(Integer gender) {
         this.gender = gender;
     }
+
+    public Date getBirthdate() {
+        return birthdate;
+    }
+
+    public void setBirthdate(Date birthdate) {
+        this.birthdate = birthdate;
+    }
 }

+ 16 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/vo/UserSetVo.java

@@ -1,7 +1,11 @@
 package com.yonge.cooleshow.auth.api.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
 
 /**
  *
@@ -20,6 +24,10 @@ public class UserSetVo {
     private String phone;
     @ApiModelProperty(value = "是否实名")
     private Boolean real;
+    @ApiModelProperty(value = "出生日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date birthdate;
 
     public String getAvatar() {
         return avatar;
@@ -60,4 +68,12 @@ public class UserSetVo {
     public void setReal(Boolean real) {
         this.real = real;
     }
+
+    public Date getBirthdate() {
+        return birthdate;
+    }
+
+    public void setBirthdate(Date birthdate) {
+        this.birthdate = birthdate;
+    }
 }

+ 4 - 0
cooleshow-auth/auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -233,6 +233,7 @@
             u.username_ as username,
             u.gender_ as gender,
             u.phone_ as phone,
+            u.birthdate_ as birthdate,
             (case when isnull(u.id_card_no_) then 0 else 1 end) as isReal
         FROM sys_user u
         where u.id_ = #{id}
@@ -250,6 +251,9 @@
         <if test="param.gender != null">
             gender_ = #{param.gender},
         </if>
+        <if test="param.birthdate != null">
+            birthdate_ = #{param.birthdate},
+        </if>
         update_time_ = now()
         WHERE id_ = #{id}
     </update>

+ 9 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UploadFileController.java

@@ -32,7 +32,7 @@ public class UploadFileController extends BaseController {
     @Autowired
     private UploadFileService uploadFileService;
 
-    @PostMapping(value = "uploadFile")
+    @PostMapping("/uploadFile")
     public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
         try {
             if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
@@ -55,7 +55,14 @@ public class UploadFileController extends BaseController {
                     "2.提供js sdk中的key值,例\"key\":\"20150115/中文/${filename}\""),
             @ApiImplicitParam(name = "unknowValueField", dataType = "List", value = "对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)"),
     })
-    @ApiOperation("获取上传文件签名")
+    @ApiOperation(value = "获取上传文件签名", notes = "{\n" +
+            "    \"fileName\":\"aa\",\n" +
+            "    \"postData\":{\n" +
+            "        \"acl\":\"public-read\",\n" +
+            "        \"key\":\"20150115/中文/${filename}\"\n" +
+            "    },\n" +
+            "    \"unknowValueField\":[\"test\"]\n" +
+            "}")
     @PostMapping("/getUploadSign")
     public HttpResponseResult<PostObjectFormFields> getUploadSign(@RequestBody UploadSign uploadSign) {
         return succeed(uploadFileService.getUploadSign(uploadSign));

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/constant/CourseConstant.java

@@ -9,5 +9,5 @@ public interface CourseConstant {
      * <p>用途将未写入数据库的排课数据写入缓存,然后生成日历及陪练课买课时校验课时将缓存时间拿出来比对
      * <p>返回结果 List<CourseTimeEntity>
      */
-    String LOCK_COURSE_TIME_INFO = String.join(":", LiveRoomConstant.COOLESHOW, CourseConstant.LOCK_COURSE_TIME_INFO, TEACHER_ID);
+    String LOCK_COURSE_TIME_INFO = String.join(":", LiveRoomConstant.COOLESHOW, "LOCK_COURSE_TIME_INFO", TEACHER_ID);
 }

+ 1 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java

@@ -27,9 +27,7 @@ public class TeacherWithdrawalSearch extends QueryInfo{
 	@ApiModelProperty(value = "申请结束时间")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private LocalDateTime endTime;
-
-
-	@ApiModelProperty("查询时间(yyyy-mm) ")
+	@ApiModelProperty("查询时间(yyyy-MM) ")
 	private String searchDate;
 
 	private Long userId;

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImGroupMemberAudit.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -44,6 +45,7 @@ public class ImGroupMemberAudit implements Serializable {
 
     @TableField("audit_status_")
     @ApiModelProperty(value = "审核状态")
+    @EnumValue
     private AuditStatusEnum auditStatus = AuditStatusEnum.AUDITING;
 
     @TableField("create_time_")

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java

@@ -98,8 +98,8 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
      *              <p> - teacherId 老师id
      *              <p> - year 年
      *              <p> - month 月
-     *              <p> - day 日
-     *              <p> - singleCourseMinutes 单课时时长(包含休息时间)
+     *              <p> - singleCourseMinutes 单课时时长(不包含休息时间)
+     *              <p> - freeCourseMinutes 单课时休息时长
      * @return 返回传入时间当月每日的剩余时间段
      */
     List<CourseCalendarEntity> createLiveCourseCalendar(Map<String, Object> param);

+ 2 - 11
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -1,9 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
-
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -11,7 +8,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.constant.CourseConstant;
-import com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant;
 import com.yonge.cooleshow.biz.dal.dao.CourseGroupDao;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
@@ -21,12 +17,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.CourseGroupEnum;
-import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
-
-import com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum;
-
-import com.yonge.cooleshow.biz.dal.enums.TeacherSalaryEnum;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
@@ -310,7 +301,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      * @return 自动排课后的全部课时
      */
     private List<CourseTimeEntity> autoPlanningLiveCourseTime(Long teacherId, int totalCourseNum, List<CourseTimeEntity> paramTimeList, CourseScheduleEnum courseType) {
-        //是否跳过节假日  0:不跳过 1跳过
+        //是否跳过节假日
         boolean skipHoliday = false;
         //true 陪练课
         boolean courseTypeFlag = courseType.equals(CourseScheduleEnum.PRACTICE);

+ 25 - 15
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -46,6 +47,7 @@ import java.time.LocalDate;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -443,31 +445,37 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      */
     private List<CourseCalendarEntity> generatePracticeCalendar(TeacherFreeTime teacherTime, LocalDate firstDay, LocalDate lastDay) {
         //将老师设置的陪练课时间结构化   key::数字周几 1~7  value:具体的时间 开始时间-结束时间
-        Map<Integer, List<CourseTimeEntity>> teacherPracticeTime = getTeacherPracticeTime(teacherTime);
+        Map<Integer, JSONArray> teacherPracticeTime = getTeacherPracticeTime(teacherTime);
         //每日日期数据
         List<CourseCalendarEntity> list = new ArrayList<>();
-        //添加的天数
-        int addDay = 0;
+
         //获取每日日期数据
         while (firstDay.isBefore(lastDay) || firstDay.isEqual(lastDay)) {
             CourseCalendarEntity entity = new CourseCalendarEntity();
-            List<CourseTimeEntity> times = new ArrayList<>();
             //获取当前日期
             entity.setDate(firstDay.toString());
             //获取当前日期周几
             int weekNum = firstDay.getDayOfWeek().getValue();
-            List<CourseTimeEntity> timeEntities = teacherPracticeTime.get(weekNum);
-            if (CollectionUtils.isNotEmpty(timeEntities)) {
-                //将每日上课时间时间添加到日历中
-                opsCourseDayTime(addDay, entity, times, timeEntities);
-            }
+            JSONArray jsonArray = teacherPracticeTime.get(weekNum);
+            List<CourseTimeEntity> timeEntities = jsonArray.stream()
+                    .map(t -> getCourseTimeEntity(entity, (JSONObject) t))
+                    .collect(Collectors.toList());
+            entity.setCourseTime(timeEntities);
             list.add(entity);
             firstDay = firstDay.plusDays(1L);
-            addDay++;
         }
         return list;
     }
 
+    private CourseTimeEntity getCourseTimeEntity(CourseCalendarEntity entity, JSONObject t) {
+        //拼接时间
+        BiFunction<String, String, Date> canCatTime = (date, time) -> DateUtil.toDateTime(date + " " + time);
+        CourseTimeEntity timeEntity = new CourseTimeEntity();
+        timeEntity.setStartTime(canCatTime.apply(entity.getDate(), t.getString("startTime")));
+        timeEntity.setEndTime(canCatTime.apply(entity.getDate(), t.getString("endTime")));
+        return timeEntity;
+    }
+
     /**
      * 将每日上课时间时间添加到日历中
      *
@@ -491,15 +499,17 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      *
      * @return key::数字周几 1~7  value:具体的时间 开始时间-结束时间
      */
-    private Map<Integer, List<CourseTimeEntity>> getTeacherPracticeTime(TeacherFreeTime teacherTime) {
-        Map<Integer, List<CourseTimeEntity>> teacherPracticeTime = new HashMap<>();
+    private Map<Integer, JSONArray> getTeacherPracticeTime(TeacherFreeTime teacherTime) {
+        Map<Integer, JSONArray> teacherPracticeTime = new HashMap<>();
         //将老师设置的陪练课时间放入map中
         BiConsumer<String, Integer> timeCon = (timeStr, weekNum) -> {
             if (StringUtils.isBlank(timeStr)) {
                 return;
             }
-            List<CourseTimeEntity> timeEntityList = new ArrayList<>(JSONObject.parseArray(timeStr, CourseTimeEntity.class));
-            teacherPracticeTime.put(weekNum, timeEntityList);
+            JSONArray objects = JSONObject.parseArray(timeStr);
+            if (CollectionUtils.isNotEmpty(objects)) {
+                teacherPracticeTime.put(weekNum, objects);
+            }
         };
         timeCon.accept(teacherTime.getMonday(), 1);
         timeCon.accept(teacherTime.getTuesday(), 2);
@@ -983,7 +993,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Author: cy
      * @Date: 2022/4/26
      */
-    public List<TeacherSubjectPrice> teacherSubjectPrice(Long teacherId){
+    public List<TeacherSubjectPrice> teacherSubjectPrice(Long teacherId) {
         return teacherFreeTimeDao.selectPriceByTeacherId(teacherId);
     }
 }

+ 10 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java

@@ -576,14 +576,16 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         //result
         Map<String, Object> result = new HashMap<>();
         //{"day":"01","month":"05","year":"2022","singleCourseMinutes":60,"teacherId":4}
-        Map<String, Object> param = new HashMap<>();
-        param.put("day", "01");
-        param.put("month", "05");
-        param.put("year", "2022");
-        param.put("singleCourseMinutes", 60);
-        param.put("teacherId", 4);
-        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createLiveCourseCalendar(param);
-        result.put("自动生成课时", courseTimeEntities);
+//        Map<String, Object> param = new HashMap<>();
+//        param.put("day", "01");
+//        param.put("month", "04");
+//        param.put("year", "2022");
+//        param.put("singleCourseMinutes", 60);
+//        param.put("teacherId", "4");
+//        param.put("studentId", 143);
+//        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createPracticeCourseCalender(param);
+//        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createLiveCourseCalendar(param);
+//        result.put("自动生成课时", courseTimeEntities);
 
         //获取房间信息
         RBucket<RoomInfoCache> speakerCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java

@@ -52,6 +52,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         }
         studentHomeVo.setHeardUrl(user.getAvatar());
         studentHomeVo.setUsername(user.getUsername());
+        studentHomeVo.setBirthdate(user.getBirthdate());
         int num = DateUtil.daysBetween(new Date(), detail.getMembershipEndTime());
         studentHomeVo.setMembershipDays(num < 0 ? 0 : num);
         StudentTotal total = (StudentTotal) redissonClient.getBucket(CacheNameEnum.STUDENT_TOTAL.getRedisKey(user.getId()))
@@ -70,6 +71,6 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 
     @Override
     public Integer setSubject(Long id, String subjectIds) {
-        return baseMapper.setSubject(id,subjectIds);
+        return baseMapper.setSubject(id, subjectIds);
     }
 }

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -145,9 +145,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Override
     public UserOrderVo detailApp(UserOrder param) {
         UserOrderVo userOrderVo = baseMapper.detailApp(param);
-        userOrderVo.setFeeAmt(null);
-        userOrderVo.setPlantformFee(null);
         if (null != userOrderVo) {
+            userOrderVo.setFeeAmt(null);
+            userOrderVo.setPlantformFee(null);
             List<UserOrderDetailVo> orderDetilList = orderDetailService.getOrderDetilListByOrderNo(userOrderVo.getOrderNo());
             orderDetilList.forEach(o -> {
                 o.setPlantformFee(null);

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomeVo.java

@@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.models.auth.In;
 
+import java.util.Date;
+
 /**
  * @Author: liweifan
  * @Data: 2022/3/21 18:37
@@ -16,6 +18,8 @@ public class StudentHomeVo extends Student {
     private String heardUrl;
     @ApiModelProperty("学员昵称")
     private String username;
+    @ApiModelProperty(value = "生日")
+    private Date birthdate;
     @ApiModelProperty("会员剩余有效期天数")
     private Integer membershipDays;
     @ApiModelProperty("累计练习天数")
@@ -49,6 +53,14 @@ public class StudentHomeVo extends Student {
         this.username = username;
     }
 
+    public Date getBirthdate() {
+        return birthdate;
+    }
+
+    public void setBirthdate(Date birthdate) {
+        this.birthdate = birthdate;
+    }
+
     public Integer getExerciseDays() {
         return exerciseDays;
     }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonPurchaseStudent.java

@@ -12,6 +12,9 @@ import java.util.Date;
  */
 @ApiModel(value = "VideoLessonPurchaseStudent对象")
 public class VideoLessonPurchaseStudent extends BaseEntity {
+    @ApiModelProperty("用户id")
+    private Long userId;
+
     @ApiModelProperty("头像地址")
     private String avatar;
 
@@ -21,6 +24,14 @@ public class VideoLessonPurchaseStudent extends BaseEntity {
     @ApiModelProperty(value = "性别 0女 1男")
     private Integer gender;
 
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
     private java.util.Date createTime;
 
     public String getAvatar() {

+ 9 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/VideoLessonStudentVo.java

@@ -18,15 +18,7 @@ public class VideoLessonStudentVo extends BaseEntity {
     private List<VideoLessonGroupDetail> detailList;
 
     @ApiModelProperty(value = "true已买,false未买")
-    private Boolean isAlreadyBuy;
-
-    public Boolean getAlreadyBuy() {
-        return isAlreadyBuy;
-    }
-
-    public void setAlreadyBuy(Boolean alreadyBuy) {
-        isAlreadyBuy = alreadyBuy;
-    }
+    private Boolean alreadyBuy;
 
     public VideoLessonGroupVo getLessonGroup() {
         return lessonGroup;
@@ -43,4 +35,12 @@ public class VideoLessonStudentVo extends BaseEntity {
     public void setDetailList(List<VideoLessonGroupDetail> detailList) {
         this.detailList = detailList;
     }
+
+    public Boolean getAlreadyBuy() {
+        return alreadyBuy;
+    }
+
+    public void setAlreadyBuy(Boolean alreadyBuy) {
+        this.alreadyBuy = alreadyBuy;
+    }
 }

+ 58 - 59
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -1,25 +1,25 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.UserOrderDao">
-	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.UserOrder">
-            <result column="id_" property="id" />
-	        <result column="order_no_" property="orderNo" />
-	        <result column="user_id_" property="userId" />
-	        <result column="order_name_" property="orderName" />
-            <result column="order_type_" property="orderType" />
-            <result column="order_desc_" property="orderDesc" />
-	        <result column="status_" property="status" />
-	        <result column="original_price_" property="originalPrice" />
-	        <result column="expect_price_" property="expectPrice" />
-	        <result column="actual_price_" property="actualPrice" />
-	        <result column="coupon_amount_" property="couponAmount" />
-	        <result column="plantform_fee_" property="plantformFee" />
-	        <result column="user_note_" property="userNote" />
-	        <result column="create_time_" property="createTime" />
-	        <result column="pay_time_" property="payTime" />
-	        <result column="update_time_" property="updateTime" />
-		</resultMap>  
-    
+    <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.UserOrder">
+        <result column="id_" property="id"/>
+        <result column="order_no_" property="orderNo"/>
+        <result column="user_id_" property="userId"/>
+        <result column="order_name_" property="orderName"/>
+        <result column="order_type_" property="orderType"/>
+        <result column="order_desc_" property="orderDesc"/>
+        <result column="status_" property="status"/>
+        <result column="original_price_" property="originalPrice"/>
+        <result column="expect_price_" property="expectPrice"/>
+        <result column="actual_price_" property="actualPrice"/>
+        <result column="coupon_amount_" property="couponAmount"/>
+        <result column="plantform_fee_" property="plantformFee"/>
+        <result column="user_note_" property="userNote"/>
+        <result column="create_time_" property="createTime"/>
+        <result column="pay_time_" property="payTime"/>
+        <result column="update_time_" property="updateTime"/>
+    </resultMap>
+
     <!-- 表字段 -->
     <sql id="baseColumns">
          t.id_ as id
@@ -42,11 +42,11 @@
 
     <select id="detailById" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
-            <include refid="baseColumns"/>,
-            p.trans_no_ as transNo,
-            p.fee_amt_ as feeAmt,
-            u.username_ as username,
-            u.phone_ as phone
+        <include refid="baseColumns"/>,
+        p.trans_no_ as transNo,
+        p.fee_amt_ as feeAmt,
+        u.username_ as username,
+        u.phone_ as phone
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         left join sys_user u on t.user_id_ = u.id_
@@ -56,27 +56,26 @@
     <select id="detailApp" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
             <include refid="baseColumns"/>,
-            , p.trans_no_ as transNo
-            , p.pay_channel_ as payChannel
+            p.trans_no_ as transNo,
+            p.pay_channel_ as payChannel
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
-        <where>
-            <if test="param.id != null">
-                and t.id_ = #{param.id}
-            </if>
-            <if test="param.orderNo != null and param.orderNo != ''">
-                and t.order_no_ = #{param.orderNo}
-            </if>
-        </where>
+        where t.user_id_ = #{param.userId}
+        <if test="param.id != null">
+            and t.id_ = #{param.id}
+        </if>
+        <if test="param.orderNo != null and param.orderNo != ''">
+            and t.order_no_ = #{param.orderNo}
+        </if>
     </select>
 
     <select id="detailByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
-            <include refid="baseColumns"/>,
-            p.trans_no_ as transNo,
-            p.fee_amt_ as feeAmt,
-            u.username_ as username,
-            u.phone_ as phone
+        <include refid="baseColumns"/>,
+        p.trans_no_ as transNo,
+        p.fee_amt_ as feeAmt,
+        u.username_ as username,
+        u.phone_ as phone
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         left join sys_user u on t.user_id_ = u.id_
@@ -86,11 +85,11 @@
 
     <sql id="selectSql">
         SELECT
-            <include refid="baseColumns" />,
-            p.trans_no_ as transNo,
-            p.fee_amt_ as feeAmt,
-            u.username_ as username,
-            u.phone_ as phone
+        <include refid="baseColumns"/>,
+        p.trans_no_ as transNo,
+        p.fee_amt_ as feeAmt,
+        u.username_ as username,
+        u.phone_ as phone
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         left join sys_user u on t.user_id_ = u.id_
@@ -125,11 +124,11 @@
             </if>
         </where>
         order by t.create_time_ desc
-        </sql>
+    </sql>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         <include refid="selectSql"/>
-	</select>
+    </select>
     <select id="selectList" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         <include refid="selectSql"/>
     </select>
@@ -142,24 +141,24 @@
     </select>
     <select id="getPendingOrder" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
-            <include refid="baseColumns"/>,
-            p.trans_no_ as transNo,
-            p.pay_channel_ as payChannel
+        <include refid="baseColumns"/>,
+        p.trans_no_ as transNo,
+        p.pay_channel_ as payChannel
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         where t.status_ in ('WAIT_PAY','PAYING')
         and t.user_id_ = #{param.userId}
         and exists (
-            select 1 from user_order_detail d where t.order_no_ = d.order_no_
-            and d.good_type_ = #{param.goodType}
-            <choose>
-                <when test="param.goodType != null and param.goodType == 'PRACTICE'">
-                    and d.merch_id_ = #{param.bizId}
-                </when>
-                <otherwise>
-                    and d.biz_id_ = #{param.bizId}
-                </otherwise>
-            </choose>
+        select 1 from user_order_detail d where t.order_no_ = d.order_no_
+        and d.good_type_ = #{param.goodType}
+        <choose>
+            <when test="param.goodType != null and param.goodType == 'PRACTICE'">
+                and d.merch_id_ = #{param.bizId}
+            </when>
+            <otherwise>
+                and d.biz_id_ = #{param.bizId}
+            </otherwise>
+        </choose>
         )
     </select>
 

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupDetailMapper.xml

@@ -64,6 +64,7 @@
 	</select>
 	<select id="selectPageStudent" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonPurchaseStudent">
 		SELECT
+		id_ AS userId,
 		<include refid="userDetail"/>
 		FROM sys_user
 		WHERE id_ IN

+ 1 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml

@@ -247,6 +247,7 @@
 				(SELECT video_lesson_group_id_ FROM video_lesson_purchase_record WHERE student_id_=#{param.studentId} AND order_status_=1)
 			</if>
 		</where>
+		ORDER BY g.create_time_ DESC
 	</select>
 	<select id="queryGroupList" resultType="com.yonge.cooleshow.biz.dal.vo.VideoLessonAuthGroup">
 		SELECT

+ 46 - 24
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UploadFileController.java

@@ -1,13 +1,16 @@
 package com.yonge.cooleshow.student.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiParam;
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
+import io.swagger.annotations.*;
 
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
@@ -17,32 +20,51 @@ import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.UploadReturnBean;
 import com.yonge.toolset.utils.upload.UploadUtil;
 
-/** 
+/**
  * 上传控制层
  */
 @RestController
 @Api(tags = "文件上传服务")
 public class UploadFileController extends BaseController {
 
-	private final static Logger LOGGER = LoggerFactory.getLogger(UploadFileController.class);
-
-	@Autowired
-	private UploadFileService uploadFileService;
-
-	@PostMapping(value = "uploadFile")
-	public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
-		try {
-			if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
-				UploadReturnBean bean = uploadFileService.uploadFile(file.getInputStream(), UploadUtil.getExtension(file.getOriginalFilename()));
-				bean.setName(file.getOriginalFilename());
-				if (bean.isStatus()) {
-					return succeed(bean);
-				}
-				return failed(bean.getMessage());
-			}
-		} catch (Exception e) {
-			LOGGER.error("上传失败", e);
-		}
-		return failed("上传失败");
-	}
+    private final static Logger LOGGER = LoggerFactory.getLogger(UploadFileController.class);
+
+    @Autowired
+    private UploadFileService uploadFileService;
+
+    @PostMapping("/uploadFile")
+    public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
+        try {
+            if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
+                UploadReturnBean bean = uploadFileService.uploadFile(file.getInputStream(), UploadUtil.getExtension(file.getOriginalFilename()));
+                bean.setName(file.getOriginalFilename());
+                if (bean.isStatus()) {
+                    return succeed(bean);
+                }
+                return failed(bean.getMessage());
+            }
+        } catch (Exception e) {
+            LOGGER.error("上传失败", e);
+        }
+        return failed("上传失败");
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "fileName", dataType = "String", value = "要上传的文件名称,不包含路径信息"),
+            @ApiImplicitParam(name = "postData", dataType = "Map", value = "1.如果使用js sdk上传的时候设置了ACL请设置,例\"acl\":\"public-read\"值要与SDK中一致,没有则删除该项</br>" +
+                    "2.提供js sdk中的key值,例\"key\":\"20150115/中文/${filename}\""),
+            @ApiImplicitParam(name = "unknowValueField", dataType = "List", value = "对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)"),
+    })
+    @ApiOperation(value = "获取上传文件签名", notes = "{\n" +
+            "    \"fileName\":\"aa\",\n" +
+            "    \"postData\":{\n" +
+            "        \"acl\":\"public-read\",\n" +
+            "        \"key\":\"20150115/中文/${filename}\"\n" +
+            "    },\n" +
+            "    \"unknowValueField\":[\"test\"]\n" +
+            "}")
+    @PostMapping("/getUploadSign")
+    public HttpResponseResult<PostObjectFormFields> getUploadSign(@RequestBody UploadSign uploadSign) {
+        return succeed(uploadFileService.getUploadSign(uploadSign));
+    }
 }

+ 10 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -216,7 +216,12 @@ public class UserOrderController extends BaseController {
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "通过id查询详情", notes = "传入id")
     public HttpResponseResult<UserOrderVo> detail(@PathVariable("id") Long id) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
         UserOrder param = new UserOrder();
+        param.setUserId(user.getId());
         param.setId(id);
         UserOrderVo detail = userOrderService.detailApp(param);
         return succeed(detail);
@@ -228,7 +233,12 @@ public class UserOrderController extends BaseController {
     @GetMapping("/detailByOrderNo/{orderNo}")
     @ApiOperation(value = "通过订单号查询详情", notes = "传入orderNo")
     public HttpResponseResult<UserOrderVo> detailByOrderNo(@PathVariable("orderNo") String orderNo) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
         UserOrder param = new UserOrder();
+        param.setUserId(user.getId());
         param.setOrderNo(orderNo);
         UserOrderVo detail = userOrderService.detailApp(param);
         return succeed(detail);

+ 0 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/VideoLessonController.java

@@ -12,7 +12,6 @@ import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.LessonGroupVo;
 import com.yonge.cooleshow.biz.dal.vo.VideoLessonEvaluateVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
 import com.yonge.cooleshow.biz.dal.vo.VideoLessonStudentVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;

+ 1 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/config/ResourceServerConfig.java

@@ -33,7 +33,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 				.authorizeRequests()
 				.antMatchers("/task/**").hasIpAddress("0.0.0.0/0")
 				.antMatchers("/v2/api-docs", "/code/*","/payment/callback",
-                        "/liveRoom/test","/liveRoom/syncUserStatus")
+                        "/liveRoom/test","/liveRoom/syncUserStatus","/courseGroup/getLockCache")
                 .permitAll().anyRequest().authenticated().and().httpBasic();
 	}
 

+ 6 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java

@@ -72,5 +72,11 @@ public class TeacherCourseGroupController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation("获取老师排直播课时锁定的课时")
+    @GetMapping("/getLockCache")
+    public HttpResponseResult<Object> getLockCache(@RequestParam("teacherId") Long teacherId) {
+        return succeed(courseGroupService.getLiveLockTimeCache(teacherId).get(teacherId));
+    }
+
 }
 

+ 0 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java

@@ -63,7 +63,6 @@ public class TeacherCourseScheduleController extends BaseController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "year", dataType = "Integer", value = "年"),
             @ApiImplicitParam(name = "month", dataType = "Integer", value = "月"),
-            @ApiImplicitParam(name = "day", dataType = "Integer", value = "日"),
             @ApiImplicitParam(name = "singleCourseMinutes", dataType = "Integer", value = "单课时时长(不包含休息时间)"),
             @ApiImplicitParam(name = "freeCourseMinutes", dataType = "Integer", value = "单课时休息时长)"),
             @ApiImplicitParam(name = "teacherId", dataType = "Long", value = "老师id"),

+ 46 - 24
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UploadFileController.java

@@ -1,13 +1,16 @@
 package com.yonge.cooleshow.teacher.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiParam;
+import com.ksyun.ks3.dto.PostObjectFormFields;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.thirdparty.entity.UploadSign;
+import io.swagger.annotations.*;
 
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
@@ -17,32 +20,51 @@ import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.UploadReturnBean;
 import com.yonge.toolset.utils.upload.UploadUtil;
 
-/** 
+/**
  * 上传控制层
  */
 @RestController
 @Api(tags = "文件上传服务")
 public class UploadFileController extends BaseController {
 
-	private final static Logger LOGGER = LoggerFactory.getLogger(UploadFileController.class);
-
-	@Autowired
-	private UploadFileService uploadFileService;
-
-	@PostMapping(value = "uploadFile")
-	public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
-		try {
-			if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
-				UploadReturnBean bean = uploadFileService.uploadFile(file.getInputStream(), UploadUtil.getExtension(file.getOriginalFilename()));
-				bean.setName(file.getOriginalFilename());
-				if (bean.isStatus()) {
-					return succeed(bean);
-				}
-				return failed(bean.getMessage());
-			}
-		} catch (Exception e) {
-			LOGGER.error("上传失败", e);
-		}
-		return failed("上传失败");
-	}
+    private final static Logger LOGGER = LoggerFactory.getLogger(UploadFileController.class);
+
+    @Autowired
+    private UploadFileService uploadFileService;
+
+    @PostMapping("/uploadFile")
+    public Object uploadFile(@ApiParam(value = "上传的文件", required = true) @RequestParam("file") MultipartFile file) {
+        try {
+            if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
+                UploadReturnBean bean = uploadFileService.uploadFile(file.getInputStream(), UploadUtil.getExtension(file.getOriginalFilename()));
+                bean.setName(file.getOriginalFilename());
+                if (bean.isStatus()) {
+                    return succeed(bean);
+                }
+                return failed(bean.getMessage());
+            }
+        } catch (Exception e) {
+            LOGGER.error("上传失败", e);
+        }
+        return failed("上传失败");
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "fileName", dataType = "String", value = "要上传的文件名称,不包含路径信息"),
+            @ApiImplicitParam(name = "postData", dataType = "Map", value = "1.如果使用js sdk上传的时候设置了ACL请设置,例\"acl\":\"public-read\"值要与SDK中一致,没有则删除该项</br>" +
+                    "2.提供js sdk中的key值,例\"key\":\"20150115/中文/${filename}\""),
+            @ApiImplicitParam(name = "unknowValueField", dataType = "List", value = "对于用户无法确定表单值的放在unknownValueField中(比如有的上传控件会添加一些表单项,但表单项的值可能是随机的)"),
+    })
+    @ApiOperation(value = "获取上传文件签名", notes = "{\n" +
+            "    \"fileName\":\"aa\",\n" +
+            "    \"postData\":{\n" +
+            "        \"acl\":\"public-read\",\n" +
+            "        \"key\":\"20150115/中文/${filename}\"\n" +
+            "    },\n" +
+            "    \"unknowValueField\":[\"test\"]\n" +
+            "}")
+    @PostMapping("/getUploadSign")
+    public HttpResponseResult<PostObjectFormFields> getUploadSign(@RequestBody UploadSign uploadSign) {
+        return succeed(uploadFileService.getUploadSign(uploadSign));
+    }
 }

+ 16 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java

@@ -16,10 +16,13 @@ import com.yonge.cooleshow.common.page.PageInfo;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.validation.Valid;
 import java.time.LocalDate;
@@ -59,7 +62,19 @@ public class UserWithdrawalController extends BaseController {
 
     @PostMapping("/withdrawalPage")
     @ApiOperation(value = "提现记录")
-    public HttpResponseResult<PageInfo<UserWithdrawalVo>> withdrawalPage(@RequestBody TeacherWithdrawalSearch query) {
+    @ApiImplicitParams({
+            @ApiImplicitParam(
+                    name = "status",
+                    value = "状态 DOING、审核中 PASS、通过 UNPASS、不通过",
+                    paramType = "query", dataType = "String"
+            ),
+            @ApiImplicitParam(
+                    name = "searchDate",
+                    value = "查询时间(yyyy-mm)",
+                    paramType = "query", dataType = "String"
+            )
+    })
+    public HttpResponseResult<PageInfo<UserWithdrawalVo>> withdrawalPage(@ApiIgnore @RequestBody TeacherWithdrawalSearch query) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");