Parcourir la source

merge:解决冲突

liujunchi il y a 3 ans
Parent
commit
be2e991914
27 fichiers modifiés avec 873 ajouts et 51 suppressions
  1. 7 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  2. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/LiveCourseGroupDto.java
  3. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MyCourseSearch.java
  4. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CourseGroupEnum.java
  5. 6 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  6. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java
  7. 90 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  8. 49 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  9. 2 21
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  10. 158 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseStudent.java
  11. 22 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyRepliedVo.java
  12. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  13. 61 7
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  14. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRepliedMapper.xml
  15. 2 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseScheduleController.java
  16. 15 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseScheduleController.java
  17. 97 0
      cooleshow-websocket/pom.xml
  18. 26 0
      cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/WebsocketApplication.java
  19. 24 0
      cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/config/WebSocketConfig.java
  20. 39 0
      cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/enums/MsgBizTypeEnum.java
  21. 33 0
      cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/po/MSG.java
  22. 51 0
      cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/po/Message.java
  23. 34 0
      cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/po/User.java
  24. 102 0
      cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/service/WebSocketServer.java
  25. 12 0
      cooleshow-websocket/src/main/resources/bootstrap-prod.yml
  26. 2 1
      pom.xml
  27. 4 3
      toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/user/realname/provider/LinkfaceRealnameAuthenticationPlugin.java

+ 7 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java

@@ -7,14 +7,12 @@ import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
-import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
-import com.yonge.cooleshow.biz.dal.vo.StudentTotalVo;
-import com.yonge.cooleshow.biz.dal.vo.TeacherTotalVo;
-import com.yonge.cooleshow.biz.dal.vo.VideoLessonGroupVo;
+import com.yonge.cooleshow.biz.dal.vo.*;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * 老师课程表(CourseSchedule)表数据库访问层
@@ -84,12 +82,15 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
     Integer countTeacherNoDecorateHomework(@Param("param") HomeworkSearch param);
 
     //查询老师约课日历
-    List<String> queryCourseSchedule(MyCourseSearch search);
+    Set<String> queryCourseSchedule(MyCourseSearch search);
 
     //根据学生id查询老师
     List<MyCourseVo> queryStudentPracticeCourse(IPage<MyCourseVo> page, @Param("param") MyCourseSearch search);
 
     //查询学生约课日历
-    List<String> queryCourseScheduleStudent(MyCourseSearch search);
+    Set<String> queryCourseScheduleStudent(MyCourseSearch search);
+
+    //老师端-课表-日历-用户
+    List<CourseStudent> queryCourseUser(IPage<CourseStudent> page, @Param("param") MyCourseSearch search);
 }
 

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/LiveCourseGroupDto.java

@@ -28,6 +28,7 @@ public class LiveCourseGroupDto implements Serializable {
     private Long teacherId;
 
     @NotNull(message = "课程组名称不能为空")
+    @Size(max = 50, message = "课程组名称长度不能超过50个字")
     @ApiModelProperty(value = "课程组名称")
     private String name;
 

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MyCourseSearch.java

@@ -39,6 +39,28 @@ public class MyCourseSearch extends QueryInfo {
     @ApiModelProperty(value = "学生姓名")
     private String studentName;
 
+    @ApiModelProperty(value = "开始时间")
+    private String startDate;
+
+    @ApiModelProperty(value = "结束时间")
+    private String endDate;
+
+    public String getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(String startDate) {
+        this.startDate = startDate;
+    }
+
+    public String getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(String endDate) {
+        this.endDate = endDate;
+    }
+
     public Long getStudentId() {
         return studentId;
     }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CourseGroupEnum.java

@@ -1,8 +1,9 @@
 package com.yonge.cooleshow.biz.dal.enums;
 
 import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.cooleshow.common.enums.BaseEnum;
 
-public enum CourseGroupEnum{
+public enum CourseGroupEnum implements BaseEnum<String,CourseGroupEnum> {
     ING("ING", "进行中"),
     COMPLETE("COMPLETE", "已完成"),
     DISSOLVE("DISSOLVE", "未成课"),//解散课程

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

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseCalendarEntity;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.vo.CourseStudent;
 import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
 import com.yonge.cooleshow.common.page.PageInfo;
@@ -15,6 +16,7 @@ import javax.validation.Valid;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.function.Function;
 
 /**
@@ -152,7 +154,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
      */
     Integer countTeacherNoDecorateHomework(HomeworkSearch homeworkSearch);
 
-    List<String> queryCourseSchedule(MyCourseSearch search);
+    Set<String> queryCourseSchedule(MyCourseSearch search);
 
     IPage<MyCourseVo> queryStudentPracticeCourse(IPage<MyCourseVo> page, MyCourseSearch search);
 
@@ -165,7 +167,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
      */
     boolean checkTeacherCourseSchedule(Long teacherId, Long courseId);
 
-    List<String> queryCourseScheduleStudent(MyCourseSearch search);
+    Set<String> queryCourseScheduleStudent(MyCourseSearch search);
 
     /**
      * 检查学生是否购买课程
@@ -175,5 +177,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
      * @return boolean true 购买
      */
     boolean checkStudentCourseSchedule(Long studentId, Long courseId);
+
+    IPage<CourseStudent> queryCourseUser(IPage<CourseStudent> page, MyCourseSearch search);
 }
 

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/LiveRoomService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.LiveRoomDao;
+import com.yonge.cooleshow.biz.dal.entity.ImRoomMessage;
 import com.yonge.cooleshow.biz.dal.entity.LiveRoom;
 import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
 import com.yonge.cooleshow.biz.dal.entity.RoomUserInfoCache;
@@ -69,6 +70,13 @@ public interface LiveRoomService extends IService<LiveRoom> {
     List<RoomUserInfoCache> queryRoomUserInfo(String roomUid);
 
     /**
+     * 发送消息
+     *
+     * @param message
+     */
+    void publishRoomMessage(ImRoomMessage message);
+
+    /**
      * 方便测试观察房间数据的方法
      */
     Map<String, Object> test(String roomUid);

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

@@ -1,4 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
+import java.math.BigDecimal;
+import java.util.Date;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -20,6 +22,9 @@ import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
+import com.yonge.cooleshow.biz.dal.vo.CourseGroupVo;
+import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.cooleshow.common.page.PageInfo;
@@ -33,6 +38,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import rx.subjects.Subject;
 
 import java.time.LocalDate;
 import java.util.*;
@@ -259,6 +265,22 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     }
 
     /**
+     * 批量检查学生课时在数据库是否重复
+     *
+     * @param studentId 老师id
+     * @param timeList  时间集合
+     */
+    private <T> void batchCheckStudentCourseTime(Long studentId, List<T> timeList, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun) {
+        //再校验数据库中课程时间和传入时间是否有交集
+        timeList.forEach(o -> {
+            boolean checkDataTime = courseScheduleService.checkStudentCourseTime(studentId, startTimeFun.apply(o), endTimeFun.apply(o));
+            if (checkDataTime) {
+                throw new BizException("预计安排在" + DateUtil.dateToString(startTimeFun.apply(o), "yyyy年MM月dd号 HH点mm分") + "的课程时间存在冲突!");
+            }
+        });
+    }
+
+    /**
      * 自动排课
      * <p>自动排课规则及场景:总5节课,填入2节,需要自动补3节
      * <p>1.把前面2节课的时间循环+1周直到填满5节课为止
@@ -453,7 +475,75 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     public List<LiveCourseGroupPlanVo> selectAdminLivePlan(Long courseGroupId) {
 
         return baseMapper.selectAdminLivePlan(courseGroupId);
+    }
+
+    /**
+     * 学生购买直播课程组
+     *
+     * @param param 传入参数
+     *              <p> - groupId    直播课程组id
+     *              <p> - studentId    学员id
+     */
+    public void buyLiveCourse(Map<String, Object> param) {
+        Long studentId = WrapperUtil.toLong(param, "studentId", "学员id不能为空!");
+        Long groupId = WrapperUtil.toLong(param, "groupId", "课程组id不能为空!");
+        //学生信息
+        getSysUser(studentId);
+        //课程组信息
+        CourseGroup liveCourseGroup = this.getOne(Wrappers.<CourseGroup>lambdaQuery()
+                .eq(CourseGroup::getId, groupId)
+                .eq(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode())
+        );
+        if (Objects.isNull(liveCourseGroup)) {
+            throw new BizException("课程组不存在!");
+        }
+        //课程信息
+        List<CourseSchedule> courseList = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
+                .eq(CourseSchedule::getCourseGroupId, groupId)
+        );
+        if (CollectionUtils.isEmpty(courseList)) {
+            throw new BizException("课程组课程不存在!");
+        }
+        //校验购买的课程组每节课时间是否和自己的课时冲突
+        batchCheckStudentCourseTime(studentId, courseList, CourseSchedule::getStartTime, CourseSchedule::getEndTime);
+        //todo 写订单 返回订单号数据(订单号 金额 等等)
+        String orderNo = "";
+        Date now = new Date();
+        //写course_schedule_student_payment表 作为记录锁定时间用,防止重复购买,如果支付失败则删除该数据
+        List<CourseScheduleStudentPayment> studentPaymentList = new ArrayList<>();
+        courseList.forEach(course -> {
+            CourseScheduleStudentPayment studentPayment = new CourseScheduleStudentPayment();
+            studentPayment.setUserId(studentId);
+            studentPayment.setCourseGroupId(groupId);
+            studentPayment.setCourseId(course.getId());
+            studentPayment.setOrderNo(orderNo);
+            studentPayment.setOriginalPrice(liveCourseGroup.getCoursePrice());
+            studentPayment.setExpectPrice(liveCourseGroup.getCoursePrice());
+            studentPayment.setActualPrice(liveCourseGroup.getCoursePrice());
+            studentPayment.setCreatedTime(now);
+            studentPayment.setUpdatedTime(now);
+            studentPayment.setCourseType(liveCourseGroup.getType());
+            studentPaymentList.add(studentPayment);
+        });
+        courseScheduleStudentPaymentService.getDao().insertBatch(studentPaymentList);
+    }
 
+    /**
+     * 学生购买直播课程成功-回调成功
+     */
+    public void buyLiveCourseSuccess() {
+        //写course_group表 pre_student_num_(预计上课人数) +1
+        //写入课酬表计算-根据课程组总金额计算分配到每节课的金额
+        //修改订单为成功
+    }
+
+    /**
+     * 学生购买直播课失败-回调
+     */
+    public void buyLiveCourseFailed() {
+        //修改 course_group表 pre_student_num_(预计上课人数) - 1
+        //删除 course_schedule_student_payment表 数据
+        //修改订单为失败
     }
 
     private SysUser getSysUser(Long userId) {

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

@@ -17,6 +17,7 @@ import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
+import com.yonge.cooleshow.biz.dal.vo.CourseStudent;
 import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -90,7 +91,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (StringUtils.isNotBlank(status)) {
             CourseScheduleEnum.existCourseState(status, "查询条件错误,课程状态不正确");
         }
-        param.put("status",status);
+        param.put("status", status);
         String classDate = WrapperUtil.toStr(param, "classDate", "查询时间不能为空!");
         //本月的第一天
         LocalDate firstDay;
@@ -257,7 +258,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Integer month = WrapperUtil.toInt(param, "month", "日历的时间月份不能为空!");
         Integer day = WrapperUtil.toInt(param, "month", "日历的时间日期不能为空!");
         Integer singleCourseMinutes = WrapperUtil.toInt(param, "singleCourseMinutes", "单课时时长不能为空!");
-
+        if (singleCourseMinutes < 25) {
+            throw new BizException("单课时时长不能小于25分钟!");
+        }
         //传入的日期+1天开始
         LocalDate firstDay = LocalDate.of(year, month, day).plusDays(1L);
         //根据firstDay计算出该月的最后一天
@@ -628,6 +631,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * <p>
      * 老师端-课表
      * search:{"classDate":"2022-03-27"}
+     * search:{"classMonth":"2022-03"}
+     * <p>
+     * 老师端-课表-陪练课
+     * search:{"classDate":"2022-03-27"}
      *
      * @Description: 根据老师id查询购课学员
      * @Author: cy
@@ -655,7 +662,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 search.setRepliedIds(studentList);
             }
         }
-        return page.setRecords(baseMapper.queryTeacherPracticeCourse(page, search));
+        return page.setRecords(baseMapper.queryTeacherPracticeCourse(page, monthToDate(search)));
     }
 
     @Override
@@ -666,12 +673,34 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     }
 
     /**
+     * 按月份计算开始结束日期
+     *
+     * @param search
+     * @return
+     */
+    public MyCourseSearch monthToDate(MyCourseSearch search) {
+        String classMonth = search.getClassMonth();
+        String[] classDateSp = classMonth.split("-");
+        LocalDate firstDay;
+        try {
+            firstDay = LocalDate.of(Integer.parseInt(classDateSp[0]), Integer.parseInt(classDateSp[1]), 1);
+        } catch (Exception e) {
+            throw new BizException("查询时间格式不正确 [" + classMonth + "]");
+        }
+        //本月的最后一天
+        LocalDate lastDay = firstDay.with(TemporalAdjusters.lastDayOfMonth());
+        search.setStartDate(firstDay.toString());
+        search.setEndDate(lastDay.toString());
+        return search;
+    }
+
+    /**
      * @Description: 查询老师约课日历
      * @Author: cy
      * @Date: 2022/4/13
      */
-    public List<String> queryCourseSchedule(MyCourseSearch search) {
-        return baseMapper.queryCourseSchedule(search);
+    public Set<String> queryCourseSchedule(MyCourseSearch search) {
+        return baseMapper.queryCourseSchedule(monthToDate(search));
     }
 
     /**
@@ -680,7 +709,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Date: 2022/4/13
      */
     public IPage<MyCourseVo> queryStudentPracticeCourse(IPage<MyCourseVo> page, MyCourseSearch search) {
-        return page.setRecords(baseMapper.queryStudentPracticeCourse(page, search));
+        return page.setRecords(baseMapper.queryStudentPracticeCourse(page, monthToDate(search)));
     }
 
     @Override
@@ -694,8 +723,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @Author: cy
      * @Date: 2022/4/14
      */
-    public List<String> queryCourseScheduleStudent(MyCourseSearch search) {
-        return baseMapper.queryCourseScheduleStudent(search);
+    public Set<String> queryCourseScheduleStudent(MyCourseSearch search) {
+        return baseMapper.queryCourseScheduleStudent(monthToDate(search));
     }
 
     @Override
@@ -705,5 +734,17 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         return courseScheduleStudentPayment != null && studentId.equals(courseScheduleStudentPayment.getUserId());
 
     }
+
+    /**
+     * search:  {"classDate":"2022-03-27"}
+     *
+     * @Description: 老师端-课表-日历-用户
+     * @Author: cy
+     * @Date: 2022/4/18
+     */
+    @Override
+    public IPage<CourseStudent> queryCourseUser(IPage<CourseStudent> page, MyCourseSearch search) {
+        return page.setRecords(baseMapper.queryCourseUser(page, search));
+    }
 }
 

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

@@ -391,7 +391,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
      *
      * @param message
      */
-    private void publishRoomMessage(ImRoomMessage message) {
+    @Override
+    public void publishRoomMessage(ImRoomMessage message) {
         String msgStr = JSONObject.toJSONString(message);
         log.info("publishRoomMessage message : {}", msgStr);
         IMApiResultInfo resultInfo;
@@ -406,26 +407,6 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         log.info("publishRoomMessage success: {}", msgStr);
     }
 
-    /**
-     * 学生购买直播课程
-     *
-     * @param param 传入参数
-     *              <p> - groupId    直播课程组id
-     *              <p> - studentId    学员id
-     *              <p> - price 价格
-     */
-    public void buyLiveCourse(Map<String, Object> param) {
-        //锁定课程时间
-
-    }
-
-    /**
-     * 学生购买直播课程成功-回调成功
-     */
-    public void buyLiveCourseSuccess() {
-
-    }
-
     private SysUser getSysUser(Long userId) {
         return Optional.ofNullable(userId)
                 .map(sysUserFeignService::queryUserById)

+ 158 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseStudent.java

@@ -0,0 +1,158 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Author: cy
+ * @Date: 2022/4/18
+ */
+@ApiModel(value = "CourseStudent")
+public class CourseStudent implements Serializable {
+    @ApiModelProperty(value = "课程id")
+    private Integer courseId;
+
+    @ApiModelProperty(value = "课程组id")
+    private Integer courseGoupId;
+
+    @ApiModelProperty(value = "上课日期")
+    private Date classDate;
+
+    @ApiModelProperty(value = "上课时间")
+    private Date startTime;
+
+    @ApiModelProperty(value = "下课时间")
+    private Date endTime;
+
+    @ApiModelProperty(value = "课程状态(NOT_START:未开始 ING:进行中 COMPLETE:已完成 CANCEL:已取消)")
+    private String status;
+
+    @ApiModelProperty(value = "课程类型(LIVE:直播课 PRACTICE:陪练课")
+    private String courseType;
+
+    @ApiModelProperty(value = "用户id")
+    private String userId;
+
+    @ApiModelProperty(value = "陪练课:用户名,直播课:课程名")
+    private String name;
+
+    @ApiModelProperty(value = "陪练课:用户头像,直播课:直播背景图")
+    private String cover;
+
+    @ApiModelProperty(value = "直播课购课人数")
+    private String payCount;
+
+    @ApiModelProperty(value = "声部id")
+    private Integer subjectId;
+
+    @ApiModelProperty(value = "声部名称")
+    private String subjectName;
+
+    public Integer getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Integer courseId) {
+        this.courseId = courseId;
+    }
+
+    public Integer getCourseGoupId() {
+        return courseGoupId;
+    }
+
+    public void setCourseGoupId(Integer courseGoupId) {
+        this.courseGoupId = courseGoupId;
+    }
+
+    public Date getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(Date classDate) {
+        this.classDate = classDate;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(String courseType) {
+        this.courseType = courseType;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCover() {
+        return cover;
+    }
+
+    public void setCover(String cover) {
+        this.cover = cover;
+    }
+
+    public String getPayCount() {
+        return payCount;
+    }
+
+    public void setPayCount(String payCount) {
+        this.payCount = payCount;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+}
+

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyRepliedVo.java

@@ -12,6 +12,12 @@ import java.util.Date;
  */
 @ApiModel(value = "MyRepliedVo")
 public class MyRepliedVo implements Serializable {
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
+    @ApiModelProperty(value = "课程组id")
+    private Long courseGroupId;
+
     @ApiModelProperty(value = "用户id")
     private Long userId;
 
@@ -42,6 +48,22 @@ public class MyRepliedVo implements Serializable {
     @ApiModelProperty(value = "学员课后评价")
     private String studentReplied;
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
     public Long getUserId() {
         return userId;
     }

+ 2 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml

@@ -137,6 +137,7 @@
                 and #{param.courseType} = cg.type_
             </if>
         </where>
+        order by cg.id_ desc
     </select>
 
     <select id="selectCourseGroupSubject" resultType="com.yonge.cooleshow.biz.dal.vo.LiveCourseGroupVo">
@@ -192,6 +193,7 @@
                 and #{param.endTime} &gt;= cssp.created_time_
             </if>
         </where>
+        order by  cssp.id_ desc
     </select>
 
     <select id="selectAdminLivePlan" resultType="com.yonge.cooleshow.biz.dal.vo.LiveCourseGroupPlanVo">

+ 61 - 7
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -166,8 +166,11 @@
         <if test="param.classDate !=null and param.classDate !=''">
             AND cs.class_date_ = #{param.classDate}
         </if>
-        <if test="param.classMonth !=null and param.classMonth !=''">
-            AND DATE_FORMAT(cs.class_date_,'%Y-%m') = #{param.classMonth}
+        <if test="param.startDate !=null and param.startDate !=''">
+            <![CDATA[ AND cs.class_date_  >= #{param.startDate} ]]>
+        </if>
+        <if test="param.endDate !=null and param.endDate !=''">
+            <![CDATA[ AND cs.class_date_  <= #{param.endDate} ]]>
         </if>
         <if test="param.repliedIds !=null">
             AND p.user_id_ IN
@@ -216,8 +219,8 @@
         FROM course_schedule_student_payment p
         LEFT JOIN course_schedule s ON p.course_id_ = s.id_
         WHERE s.teacher_id_=#{teacherId}
-        AND p.course_type_='PRACTICE'
-        AND DATE_FORMAT(s.class_date_,'%Y-%m') = #{classMonth}
+        <![CDATA[ AND s.class_date_  >= #{startDate} ]]>
+        <![CDATA[ AND s.class_date_  <= #{endDate} ]]>
     </select>
     <select id="queryStudentPracticeCourse" resultType="com.yonge.cooleshow.biz.dal.vo.MyCourseVo">
         SELECT
@@ -248,14 +251,65 @@
         <if test="param.classDate !=null and param.classDate !=''">
             AND s.class_date_ = #{param.classDate}
         </if>
-        <if test="param.classMonth !=null and param.classMonth !=''">
-            AND DATE_FORMAT(s.class_date_,'%Y-%m') = #{param.classMonth}
+        <if test="param.startDate !=null and param.startDate !=''">
+            <![CDATA[ AND s.class_date_  >= #{param.startDate} ]]>
+        </if>
+        <if test="param.endDate !=null and param.endDate !=''">
+            <![CDATA[ AND s.class_date_  <= #{param.endDate} ]]>
         </if>
     </select>
+
+    <select id="queryCourseUser" resultType="com.yonge.cooleshow.biz.dal.vo.CourseStudent">
+        SELECT
+            cs.id_ AS courseId,
+            cs.course_group_id_ AS courseGoupId,
+            cs.class_date_ AS classDate,
+            cs.start_time_ AS startTime,
+            cs.end_time_ AS endTime,
+            cs.status_ AS `status`,
+            cs.type_ AS courseType,
+            NULL AS userId,
+            CONCAT(g.name_,'-第',cs.class_num_,'课') AS name,
+            p.payCount AS payCount,
+            g.background_pic_ AS cover,
+            g.subject_id_ AS subjectId,
+            sb.name_ AS subjectName
+        FROM course_schedule cs
+        LEFT JOIN course_group g ON cs.course_group_id_ = g.id_
+        LEFT JOIN (SELECT course_id_ AS pid,count(*) AS payCount FROM course_schedule_student_payment GROUP BY course_id_ ) p ON cs.id_=p.pid
+        LEFT JOIN `subject` sb ON g.subject_id_=sb.id_
+        WHERE cs.type_='LIVE'
+        AND cs.teacher_id_=#{param.teacherId}
+        AND cs.class_date_=#{param.classDate}
+        UNION
+        SELECT
+            p.course_id_ AS courseId,
+            p.course_group_id_ AS courseGoupId,
+            cs.class_date_ AS classDate,
+            cs.start_time_ AS startTime,
+            cs.end_time_ AS endTime,
+            cs.status_ AS `status`,
+            cs.type_ AS courseType,
+            u.id_ AS userId,
+            u.username_ AS name,
+            NULL AS payCount,
+            u.avatar_ AS cover,
+            g.subject_id_ AS subjectId,
+            sb.name_ AS subjectName
+        FROM course_schedule_student_payment p
+        LEFT JOIN sys_user u ON p.user_id_ =u.id_
+        LEFT JOIN course_schedule cs ON p.course_id_=cs.id_
+        LEFT JOIN course_group g ON p.course_group_id_ = g.id_
+        LEFT JOIN `subject` sb ON g.subject_id_=sb.id_
+        WHERE p.course_id_ IN (SELECT s.id_ FROM course_schedule s WHERE s.type_='PRACTICE' AND s.teacher_id_=#{param.teacherId})
+        AND cs.class_date_=#{param.classDate}
+        ORDER BY startTime
+    </select>
     <select id="queryCourseScheduleStudent" resultType="java.lang.String"
             parameterType="com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch">
         SELECT class_date_ FROM course_schedule
         WHERE id_ IN (SELECT course_id_ FROM course_schedule_student_payment WHERE user_id_ = #{studentId} AND course_type_ = 'PRACTICE')
-        AND DATE_FORMAT(class_date_,'%Y-%m') = #{classMonth}
+        <![CDATA[ AND class_date_  >= #{startDate} ]]>
+        <![CDATA[ AND class_date_  <= #{endDate} ]]>
     </select>
 </mapper>

+ 2 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleRepliedMapper.xml

@@ -107,6 +107,8 @@
     </update>
     <select id="myReplied" resultType="com.yonge.cooleshow.biz.dal.vo.MyRepliedVo">
         SELECT
+            r.course_schedule_id_ AS courseId,
+            r.course_group_id_ AS courseGroupId,
             r.score_ AS score,
             r.student_id_ AS studentId,
             g.subject_id_ AS subjectId,

+ 2 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseScheduleController.java

@@ -24,6 +24,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * @Author: cy
@@ -81,7 +82,7 @@ public class CourseScheduleController extends BaseController {
 
     @ApiOperation("学生端-课表-日历")
     @PostMapping("/queryCourseScheduleStudent")
-    public HttpResponseResult<List<String>> queryCourseScheduleStudent(@RequestBody MyCourseSearch search) {
+    public HttpResponseResult<Set<String>> queryCourseScheduleStudent(@RequestBody MyCourseSearch search) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");

+ 15 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseScheduleController.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseCalendarEntity;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
+import com.yonge.cooleshow.biz.dal.vo.CourseStudent;
 import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -25,6 +26,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * 老师课程表(CourseSchedule)表控制层
@@ -97,7 +99,7 @@ public class CourseScheduleController extends BaseController {
 
     @ApiOperation("老师端-课表-日历")
     @PostMapping("/queryCourseSchedule")
-    public HttpResponseResult<List<String>> queryCourseSchedule(@RequestBody MyCourseSearch search) {
+    public HttpResponseResult<Set<String>> queryCourseSchedule(@RequestBody MyCourseSearch search) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -105,5 +107,17 @@ public class CourseScheduleController extends BaseController {
         search.setTeacherId(user.getId());
         return succeed(courseScheduleService.queryCourseSchedule(search));
     }
+
+    @ApiOperation("老师端-课表-日历-用户")
+    @PostMapping("/queryCourseUser")
+    public HttpResponseResult<PageInfo<CourseStudent>> queryCourseUser(@RequestBody MyCourseSearch search) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        search.setTeacherId(user.getId());
+        IPage<CourseStudent> pages = courseScheduleService.queryCourseUser(PageUtil.getPage(search), search);
+        return succeed(PageUtil.pageInfo(pages));
+    }
 }
 

+ 97 - 0
cooleshow-websocket/pom.xml

@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>cooleshow</artifactId>
+        <groupId>com.yonge.cooleshow</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>cooleshow-websocket</artifactId>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <redisson.version>3.16.4</redisson.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+   <!--     <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-security</artifactId>
+        </dependency>-->
+
+        <!-- swagger-spring-boot -->
+        <dependency>
+            <groupId>com.spring4all</groupId>
+            <artifactId>swagger-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <!-- mybatis-plus -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.0.7.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- redisson -->
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>${redisson.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+            <version>2.1.6.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.68</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 26 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/WebsocketApplication.java

@@ -0,0 +1,26 @@
+package com.yonge.cooleshow.websocket;
+
+import com.spring4all.swagger.EnableSwagger2Doc;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/18 16:32
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableFeignClients("com.yonge.cooleshow")
+@MapperScan("com.yonge.cooleshow.websocket.dal.dao")
+@Configuration
+@EnableSwagger2Doc
+public class WebsocketApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(WebsocketApplication.class, args);
+    }
+}

+ 24 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/config/WebSocketConfig.java

@@ -0,0 +1,24 @@
+package com.yonge.cooleshow.websocket.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+ * WebScoket配置处理器
+ */
+@Configuration
+public class WebSocketConfig {
+	 /**
+     * ServerEndpointExporter 作用
+     *
+     * 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
+     *
+     * @return
+     */
+	@Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+
+}

+ 39 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/enums/MsgBizTypeEnum.java

@@ -0,0 +1,39 @@
+package com.yonge.cooleshow.websocket.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+
+/**
+ * 消息类型枚举
+ * @Author: liweifan
+ * @Data: 2022/4/7 15:48
+ */
+public enum MsgBizTypeEnum {
+    ONLINE("建立连接"),
+    OFFLINE("断开连接"),
+    PAY_END("支付结束");
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    MsgBizTypeEnum(String msg) {
+        this.code = getCode();
+        this.msg = msg;
+    }
+
+    public String getCode() {
+        return this.name();
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 33 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/po/MSG.java

@@ -0,0 +1,33 @@
+package com.yonge.cooleshow.websocket.po;
+
+import com.yonge.cooleshow.websocket.enums.MsgBizTypeEnum;
+
+public class MSG {
+
+    MsgBizTypeEnum bizType;
+
+    String msg;
+
+    public MSG(MsgBizTypeEnum bizType, String msg) {
+        super();
+        this.msg = msg;
+    }
+
+    public MsgBizTypeEnum getBizType() {
+        return bizType;
+    }
+
+    public void setBizType(MsgBizTypeEnum bizType) {
+        this.bizType = bizType;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+
+}

+ 51 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/po/Message.java

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.websocket.po;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.Date;
+
+public class Message {
+
+	//发送者name
+	public Long from;
+	//接收者name
+	public Long to;
+	//发送的文本
+	public MSG msg;
+	//发送时间
+	@JSONField(format="yyyy-MM-dd HH:mm:ss")
+	public Date date;
+
+	public Long getFrom() {
+		return from;
+	}
+
+	public void setFrom(Long from) {
+		this.from = from;
+	}
+
+	public Long getTo() {
+		return to;
+	}
+
+	public void setTo(Long to) {
+		this.to = to;
+	}
+
+	public MSG getMsg() {
+		return msg;
+	}
+
+	public void setMsg(MSG msg) {
+		this.msg = msg;
+	}
+
+	public Date getDate() {
+		return date;
+	}
+
+	public void setDate(Date date) {
+		this.date = date;
+	}
+
+}

+ 34 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/po/User.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.websocket.po;
+
+public class User {
+	Long uid;
+	
+	String name;
+	
+	public User() {
+		super();
+	}
+
+	public User(Long uid, String name) {
+		super();
+		this.uid = uid;
+		this.name = name;
+	}
+
+	public Long getUid() {
+		return uid;
+	}
+
+	public void setUid(Long uid) {
+		this.uid = uid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+}

+ 102 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/service/WebSocketServer.java

@@ -0,0 +1,102 @@
+package com.yonge.cooleshow.websocket.service;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.websocket.po.Message;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.Date;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@ServerEndpoint("/webSocket/{userId}")
+@Component
+public class WebSocketServer {
+	 //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
+    private static AtomicInteger onlineNum = new AtomicInteger();
+
+    //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
+    private static ConcurrentHashMap<Long, Session> sessionPools = new ConcurrentHashMap<>();
+
+    //发送消息
+    public void sendMessage(Session session, String message) throws IOException {
+        if(session != null){
+            synchronized (session) {
+                System.out.println("发送数据:" + message);
+                session.getBasicRemote().sendText(message);
+            }
+        }
+    }
+    //给指定用户发送信息
+    public void sendInfo(Long userId, String message){
+        Session session = sessionPools.get(userId);
+        try {
+            sendMessage(session, message);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+    // 群发消息
+    public void broadcast(String message){
+    	for (Session session: sessionPools.values()) {
+            try {
+                sendMessage(session, message);
+            } catch(Exception e){
+                e.printStackTrace();
+                continue;
+            }
+        }
+    }
+
+    //建立连接成功调用
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value = "userId") Long userId){
+        sessionPools.put(userId, session);
+        addOnlineCount();
+        System.out.println(userId + "加入webSocket!当前人数为" + onlineNum);
+    }
+
+    //关闭连接时调用
+    @OnClose
+    public void onClose(@PathParam(value = "userId") Long userId){
+        sessionPools.remove(userId);
+        subOnlineCount();
+        System.out.println(userId + "断开webSocket连接!当前人数为" + onlineNum);
+    }
+
+    //收到客户端信息后,根据接收人的userId把消息推下去或者群发
+    // to=-1群发消息
+    @OnMessage
+    public void onMessage(String message) throws IOException {
+        System.out.println("server get" + message);
+        Message msg=JSON.parseObject(message, Message.class);
+		msg.setDate(new Date());
+        sendInfo(msg.getTo(), JSON.toJSONString(msg,true));
+    }
+
+    //错误时调用
+    @OnError
+    public void onError(Session session, Throwable throwable){
+        System.out.println("发生错误");
+        throwable.printStackTrace();
+    }
+
+    public static void addOnlineCount(){
+        onlineNum.incrementAndGet();
+    }
+
+    public static void subOnlineCount() {
+        onlineNum.decrementAndGet();
+    }
+    
+    public static AtomicInteger getOnlineNumber() {
+        return onlineNum;
+    }
+    
+    public static ConcurrentHashMap<Long, Session> getSessionPools() {
+        return sessionPools;
+    }
+}

+ 12 - 0
cooleshow-websocket/src/main/resources/bootstrap-prod.yml

@@ -0,0 +1,12 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        server-addr: 47.114.1.200:8848
+        namespace: 6f8374a9-598f-4889-bb17-476070ffb8de
+        group: DEFAULT_GROUP
+        prefix: websocket
+        file-extension: yaml
+        refresh:
+          enabled: true
+        enabled: true

+ 2 - 1
pom.xml

@@ -374,5 +374,6 @@
 		<module>cooleshow-im</module>
 	    <module>cooleshow-task</module>
 		<module>cooleshow-mall</module>
-  </modules>
+        <module>cooleshow-websocket</module>
+    </modules>
 </project>

+ 4 - 3
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/user/realname/provider/LinkfaceRealnameAuthenticationPlugin.java

@@ -92,7 +92,8 @@ public class LinkfaceRealnameAuthenticationPlugin implements RealnameAuthenticat
 					msg = "查无此身份证号";
 				}
 			} else {
-				msg = reason.get(status);
+				//msg = reason.get(status);
+				msg = reason.get("身份证号和姓名不一致");
 			}
 			throw new ThirdpartyException("实名认证失败,原因:{}", msg);
 		}
@@ -110,12 +111,12 @@ public class LinkfaceRealnameAuthenticationPlugin implements RealnameAuthenticat
 		this.apisUrl = apisUrl;
 	}
 
-	public static void main(String[] args) {
+	/*public static void main(String[] args) {
 		LinkfaceRealnameAuthenticationPlugin plugin = new LinkfaceRealnameAuthenticationPlugin();
 		plugin.setAppId("2cd4937c8dbd4f6a9c70c6d3122df5f4");
 		plugin.setAppSecret("3f809f3800654780beff1ce09b780297");
 		plugin.setApisUrl("https://cloudapi.linkface.cn/data/verify_id_name");
 
 		System.out.println(plugin.verify("王武", "411526199706013217"));
-	}
+	}*/
 }