Commit ae243f73 by 涂亚平

直播版本online

1 parent 27f572f1
Showing with 2983 additions and 28 deletions
......@@ -231,6 +231,12 @@
<artifactId>ehcache</artifactId>
</dependency>
<dependency>
<groupId>net.polyv</groupId>
<artifactId>polyv-java-live-sdk</artifactId>
<version>2.0.4</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-data-mongodb</artifactId>-->
......@@ -239,7 +245,7 @@
</dependencies>
<build>
<finalName>subsidy-online</finalName>
<finalName>subsidy</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
......
package com.subsidy.common.configure;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@Data
@ConfigurationProperties(prefix = "polyv")
public class PolyvConfig {
private String userId;
private String appId;
private String appSecret;
private String secretKey;
}
......@@ -102,7 +102,7 @@ public class AdministerController {
@PostMapping("exportClassDetail")
@ApiOperation("班级管理--班级成员--导出 id 班级id userName")
// @LoginRequired
@LoginRequired
public void exportClassDetail(@RequestBody ClassDetailDTO classDetailDTO)throws Exception{
classDetailDTO.setFlag(true);
administerService.exportClassDetail(classDetailDTO);
......@@ -225,7 +225,7 @@ public class AdministerController {
@PostMapping("imageCheckDetail")
@ApiOperation("实名制验证详情 id 班级id userName pageSize pageNum")
// @LoginRequired
@LoginRequired
public ResponseVO imageCheckDetail(@RequestBody ClassDetailDTO classDetailDTO){
return ResponseData.generateCreatedResponse(0,administerService.imageCheckDetail(classDetailDTO));
}
......
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.dto.live.ClassMembersDTO;
import com.subsidy.dto.live.DataViewDTO;
import com.subsidy.model.LiveClassesDO;
import com.subsidy.model.LiveDictDO;
import com.subsidy.service.LiveClassesService;
import com.subsidy.util.excel.ExcelUtil;
import com.subsidy.vo.administer.ManageMemberVO;
import com.subsidy.vo.live.ClassMembersVO;
import com.subsidy.vo.live.ExportClassMembersVO;
import io.swagger.annotations.ApiOperation;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@RestController
@Api(tags = "直播班级表")
@RequestMapping("/liveClasses")
public class LiveClassesController {
@Autowired
private LiveClassesService liveClassesService;
@PostMapping("classMembers")
@ApiOperation("直播课程管理--直播--班级学员 pageSize pageNum userName liveId classId")
public ResponseVO classMembers(@RequestBody ClassMembersDTO classMembersDTO){
return ResponseData.generateCreatedResponse(0,liveClassesService.classMembers(classMembersDTO));
}
@PostMapping("exportClassMembers")
@ApiOperation("导出 直播课程管理--直播--班级学员 liveId classId")
public void exportClassMembers(@RequestBody ClassMembersDTO classMembersDTO){
List<ExportClassMembersVO> classMembersVOS = liveClassesService.exportClassMembers(classMembersDTO);
ExcelUtil.writeExcel(classMembersVOS, ExportClassMembersVO.class);
}
@PostMapping("dataView")
@ApiOperation("直播课程管理--数据概览 id 直播id classId")
public ResponseVO dataView(@RequestBody DataViewDTO dataViewDTO){
return ResponseData.generateCreatedResponse(0,liveClassesService.dataView(dataViewDTO));
}
@PostMapping("classLives")
@ApiOperation("企业培训项目管理--班组管理--直播课程 查看某个班级有那几个直播课 classId 班级id")
public ResponseVO classLives(@RequestBody LiveClassesDO classesDO){
return ResponseData.generateCreatedResponse(0,liveClassesService.classLives(classesDO));
}
}
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.model.LiveCoursewaresDO;
import com.subsidy.model.LiveDictDO;
import com.subsidy.service.LiveCoursewaresService;
import io.swagger.annotations.ApiOperation;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
/**
* <p>
* 直播课件 前端控制器
* </p>
*
* @author Tuyp
* @since 2022-11-29
*/
@RestController
@Api(tags = "直播课件--暂时不用了")
@RequestMapping("/liveCoursewares")
public class LiveCoursewaresController {
@Autowired
private LiveCoursewaresService liveCoursewaresService;
@PostMapping("livewares")
@ApiOperation("查看直播课件 id 直播id")
public ResponseVO livewares(@RequestBody LiveDictDO liveDictDO){
return ResponseData.generateCreatedResponse(0,liveCoursewaresService.livewares(liveDictDO));
}
@PostMapping("deleteWare")
@ApiOperation("删除直播课件 id 课件id")
public ResponseVO deleteWare(@RequestBody LiveCoursewaresDO liveCoursewaresDO){
return ResponseData.generateCreatedResponse(0,liveCoursewaresService.deleteWare(liveCoursewaresDO));
}
@PostMapping("addWare")
@ApiOperation("新增直播课件 liveId courseware wareName ")
public ResponseVO addWare(@RequestBody LiveCoursewaresDO liveCoursewaresDO){
return ResponseData.generateCreatedResponse(0,liveCoursewaresService.addWare(liveCoursewaresDO));
}
}
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.dto.cert.AddCertClassDTO;
import com.subsidy.dto.live.AddLiveDTO;
import com.subsidy.dto.live.AllLivesDTO;
import com.subsidy.model.LiveDictDO;
import com.subsidy.service.LiveDictService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
/**
* <p>
* 前端控制器
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@RestController
@Api(tags = "直播字典表")
@RequestMapping("/liveDict")
public class LiveDictController {
@Autowired
private LiveDictService liveDictService;
@PostMapping("allLives")
@ApiOperation("直播课程管理--直播管理 liveStatus 直播状态 liveName 直播名称pageSize pageNum")
public ResponseVO allLives(@RequestBody AllLivesDTO allLivesDTO) {
return ResponseData.generateCreatedResponse(0, liveDictService.allLives(allLivesDTO));
}
@PostMapping("deleteLive")
@ApiOperation("直播课程管理--直播管理--删除 id 直播id")
public ResponseVO deleteLive(@RequestBody LiveDictDO liveDictDO){
return ResponseData.generateCreatedResponse(0,liveDictService.deleteLive(liveDictDO));
}
@PostMapping("addLive")
@ApiOperation("直播课程管理--直播管理--新增 channel 频道号 startTime 开始时间 liveName 直播名称 ids[] 班级id speakUrl 主讲地址 " +
" speakPwd主讲密码 liveUrl直播地址 playStartDate 回放开始时间 playEndDate 回放结束时间 liveStatus 直播状态 playbackStatus 回放状态")
public ResponseVO addLive(@RequestBody AddLiveDTO addLiveDTO){
return ResponseData.generateCreatedResponse(0,liveDictService.addLive(addLiveDTO));
}
@PostMapping("updateLive")
@ApiOperation("直播课程管理--直播管理--修改 id channel 频道号 liveName 直播名称 ids[] 班级id liveUrl 直播地址 liveStatus 直播状态 playbackStatus 回放状态")
public ResponseVO updateLive(@RequestBody AddLiveDTO addLiveDTO){
return ResponseData.generateCreatedResponse(0,liveDictService.updateLive(addLiveDTO));
}
@PostMapping("getLive")
@ApiOperation("直播课程管理--直播管理--获取一个直播详情 id 直播id")
public ResponseVO getLive(@RequestBody LiveDictDO liveDictDO){
return ResponseData.generateCreatedResponse(0,liveDictService.getLive(liveDictDO));
}
@PostMapping("liveClasses")
@ApiOperation("直播间详情--直播--班级列表 id 直播id")
public ResponseVO liveClasses(@RequestBody LiveDictDO liveDictDO){
return ResponseData.generateCreatedResponse(0,liveDictService.liveClasses(liveDictDO));
}
@GetMapping("liveDatas")
@ApiOperation("直播结束后拉去保利威的直播数据并入库")
public void liveDatas(String channelId,String status,Long timestamp,String sign,String sessionId,Long startTime,Long endTime){
liveDictService.liveDatas(channelId,status,timestamp,sign,sessionId,startTime,endTime);
}
}
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.model.LiveDictDO;
import com.subsidy.model.LiveFilesDO;
import com.subsidy.service.LiveFilesService;
import io.swagger.annotations.ApiOperation;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
/**
* <p>
* 直播课件 前端控制器
* </p>
*
* @author Tuyp
* @since 2022-11-29
*/
@RestController
@Api(tags = "直播材料")
@RequestMapping("/liveFiles")
public class LiveFilesController {
@Autowired
private LiveFilesService liveFilesService;
@PostMapping("liveFiles")
@ApiOperation("直播材料 id直播id")
public ResponseVO liveFiles(@RequestBody LiveDictDO liveDictDO){
return ResponseData.generateCreatedResponse(0,liveFilesService.liveFiles(liveDictDO));
}
@PostMapping("deleteFile")
@ApiOperation("删除材料 id材料id")
public ResponseVO deleteFile(@RequestBody LiveFilesDO liveFilesDO){
return ResponseData.generateCreatedResponse(0,liveFilesService.deleteFile(liveFilesDO));
}
@PostMapping("addFile")
@ApiOperation("新增材料 liveId fileUrl fileName fileSize fileType")
public ResponseVO addFile(@RequestBody LiveFilesDO liveFilesDO){
return ResponseData.generateCreatedResponse(0,liveFilesService.addFile(liveFilesDO));
}
@PostMapping("updateFile")
@ApiOperation("编辑材料 id fileUrl fileName fileSize fileType")
public ResponseVO updateFile(@RequestBody LiveFilesDO liveFilesDO){
return ResponseData.generateCreatedResponse(0,liveFilesService.updateFile(liveFilesDO));
}
}
package com.subsidy.controller;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.common.interceptor.TimeRequired;
import com.subsidy.dto.live.PlaybacksDTO;
import com.subsidy.dto.vod.InsertHistoryNewDTO;
import com.subsidy.model.LiveDictDO;
import com.subsidy.model.LivePlaybackHistoryDO;
import com.subsidy.model.LiveStudyHistoryDO;
import com.subsidy.service.LivePlaybackHistoryService;
import com.subsidy.util.excel.ExcelUtil;
import com.subsidy.vo.live.ExportClassMembersVO;
import com.subsidy.vo.live.ExportPlaybacksVO;
import com.subsidy.vo.live.PlaybacksVO;
import io.swagger.annotations.ApiOperation;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import java.util.List;
/**
* <p>
* 回放播放记录表 前端控制器
* </p>
*
* @author Tuyp
* @since 2022-11-28
*/
@RestController
@Api(tags = "回放播放记录表")
@RequestMapping("/livePlaybackHistory")
public class LivePlaybackHistoryController {
@Autowired
private LivePlaybackHistoryService livePlaybackHistoryService;
@PostMapping("memberPlaybacks")
@ApiOperation("直播课程管理--回放(学生) classId liveId pageSize pageNum userName")
public ResponseVO memberPlaybacks(@RequestBody PlaybacksDTO playbacksDTO){
return ResponseData.generateCreatedResponse(0,livePlaybackHistoryService.memberPlaybacks(playbacksDTO));
}
@PostMapping("exportMemberPlaybacks")
@ApiOperation("直播课程管理--回放(学生) classId liveId ")
public void exportMemberPlaybacks(@RequestBody PlaybacksDTO playbacksDTO){
List<ExportPlaybacksVO> playbacksVOIPage = livePlaybackHistoryService.exportMemberPlaybacks(playbacksDTO);
ExcelUtil.writeExcel(playbacksVOIPage, ExportPlaybacksVO.class);
}
@PostMapping("playbacks")
@ApiOperation("直播回放列表 id 直播id")
public ResponseVO playbacks(@RequestBody LiveDictDO liveDictDO){
return ResponseData.generateCreatedResponse(0,livePlaybackHistoryService.playbacks(liveDictDO));
}
@PostMapping("insertPlayRecord")
@ApiOperation("看录播 liveVodId 录播id memberId playLength ")
public ResponseVO insertPlayRecord(@RequestBody LivePlaybackHistoryDO livePlaybackHistoryDO){
return ResponseData.generateCreatedResponse(0,livePlaybackHistoryService.insertPlayRecord(livePlaybackHistoryDO));
}
@RequestMapping("insertPlayRecordNew")
@ApiOperation("看录播 liveVodId 录播id memberId playLength")
@TimeRequired
public ResponseVO insertPlayRecordNew(@RequestBody String param){
LivePlaybackHistoryDO insertHistoryNewDTO = JSON.parseObject(param, LivePlaybackHistoryDO.class);
return ResponseData.generateCreatedResponse(0,livePlaybackHistoryService.insertPlayRecordNew(insertHistoryNewDTO));
}
}
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.dto.live.LiveSignDTO;
import com.subsidy.model.MemberDO;
import com.subsidy.service.LiveStudyHistoryService;
import io.swagger.annotations.ApiOperation;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
/**
* <p>
* 直播学习记录表 前端控制器
* </p>
*
* @author Tuyp
* @since 2022-12-01
*/
@RestController
@Api(tags = "直播学习记录表")
@RequestMapping("/liveStudyHistory")
public class LiveStudyHistoryController {
@Autowired
private LiveStudyHistoryService liveStudyHistoryService;
@PostMapping("liveSign")
@ApiOperation("签名 MD5加密 id用户id")
public ResponseVO liveSign(@RequestBody LiveSignDTO liveSignDTO){
return ResponseData.generateCreatedResponse(0,liveStudyHistoryService.liveSign(liveSignDTO));
}
}
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.model.LiveDictDO;
import com.subsidy.model.LivePlaybackHistoryDO;
import com.subsidy.model.LiveVodsDO;
import com.subsidy.service.LiveVodsService;
import io.swagger.annotations.ApiOperation;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
/**
* <p>
* 直播视频表 前端控制器
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@RestController
@Api(tags = "直播视频表")
@RequestMapping("/liveVods")
public class LiveVodsController {
@Autowired
private LiveVodsService liveVodsService;
@PostMapping("vods")
@ApiOperation("直播--视频--查看 id 直播id")
public ResponseVO vods(@RequestBody LiveDictDO liveDictDO){
return ResponseData.generateCreatedResponse(0,liveVodsService.vods(liveDictDO));
}
@PostMapping("addVod")
@ApiOperation("直播--视频--添加视频 liveId vodName vodUrl vodLength vodCode")
public ResponseVO addVod(@RequestBody LiveVodsDO liveVodsDO){
return ResponseData.generateCreatedResponse(0,liveVodsService.addVod(liveVodsDO));
}
@PostMapping("deleteVod")
@ApiOperation("直播--视频--删除视频 id")
public ResponseVO deleteVod(@RequestBody LiveVodsDO liveVodsDO){
return ResponseData.generateCreatedResponse(0,liveVodsService.deleteVod(liveVodsDO));
}
@PostMapping("updateVod")
@ApiOperation("直播--视频--更新视频 id liveId vodName vodUrl vodLength vodCode")
public ResponseVO updateVod(@RequestBody LiveVodsDO liveVodsDO){
return ResponseData.generateCreatedResponse(0,liveVodsService.updateVod(liveVodsDO));
}
@PostMapping("memberPlayback")
@ApiOperation("查看某人某个直播回放观看情况 memberId liveId")
public ResponseVO memberPlayback(@RequestBody LivePlaybackHistoryDO livePlaybackHistoryDO){
return ResponseData.generateCreatedResponse(0,liveVodsService.memberPlayback(livePlaybackHistoryDO));
}
}
......@@ -5,18 +5,17 @@ import com.subsidy.common.ResponseVO;
import com.subsidy.common.interceptor.LoginRequired;
import com.subsidy.common.interceptor.TimeRequired;
import com.subsidy.dto.administer.VerifyCodeDTO;
import com.subsidy.dto.live.PolyvInfoDTO;
import com.subsidy.dto.member.*;
import com.subsidy.mapper.MemberMapper;
import com.subsidy.model.ExerciseDoneResultDO;
import com.subsidy.model.MemberDO;
import com.subsidy.service.MemberService;
import com.subsidy.vo.live.PolyvInfoVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
/**
* <p>
......@@ -207,4 +206,18 @@ public class MemberController {
return ResponseData.generateCreatedResponse(0,memberService.register(registerDTO));
}
@PostMapping("memberLives")
@ApiOperation("获取学生的直播 id 学员id ")
public ResponseVO memberLives(@RequestBody MemberDO memberDO){
return ResponseData.generateCreatedResponse(0,memberService.memberLives(memberDO));
}
@GetMapping("polyvInfo")
@ApiOperation("保利威视回调接口获取学生用户数据")
public PolyvInfoVO polyvInfo(String userid,String channelId,
String ts,String token){
return memberService.polyvInfo(userid,channelId,ts,token);
}
}
......@@ -37,7 +37,7 @@ public class VodPlayHistoryController {
@PostMapping("insertHistory")
@ApiOperation("记录学生看视频位置 ajax请求 classId班级id vodId 视频id memberId 成员id playLength 播放时长 playRecord 位点")
// @LoginRequired
@LoginRequired
@TimeRequired
public ResponseVO insertHistory(@RequestBody VodPlayHistoryDO vodPlayHistoryDO){
return ResponseData.generateCreatedResponse(0,vodPlayHistoryService.insertHistory(vodPlayHistoryDO));
......
package com.subsidy.dto.live;
import com.subsidy.model.LiveDictDO;
import lombok.Data;
import java.util.List;
@Data
public class AddLiveDTO extends LiveDictDO {
private List<Long> ids;
}
package com.subsidy.dto.live;
import lombok.Data;
@Data
public class AllLivesDTO {
private Integer pageSize;
private Integer pageNum;
private String liveStatus;
private String liveName;
}
package com.subsidy.dto.live;
import lombok.Data;
@Data
public class ClassMembersDTO {
private Integer pageSize;
private Integer pageNum;
private Long liveId;
private Long classId;
private String userName;
}
package com.subsidy.dto.live;
import lombok.Data;
@Data
public class DataViewDTO {
private Long id;
private Long classId;
}
package com.subsidy.dto.live;
import lombok.Data;
@Data
public class LiveSignDTO {
private String channelId;
private String userId;
}
package com.subsidy.dto.live;
import lombok.Data;
@Data
public class PlaybacksDTO {
private Integer pageSize;
private Integer pageNum;
private String userName;
private Long classId;
private Long liveId;
}
package com.subsidy.dto.live;
import lombok.Data;
@Data
public class PolyvInfoDTO {
private String userid;
private String channelId;
private String ts;
private String token;
}
package com.subsidy.jobs;
import com.subsidy.mapper.LiveDictMapper;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class LiveDictJob implements Job {
@Autowired
private LiveDictMapper liveDictMapper;
@Override
public void execute(JobExecutionContext jobExecutionContext) {
Map<String, Object> map = jobExecutionContext.getJobDetail().getJobDataMap();
Map<String, Object> params = (Map<String, Object>) map.get("params");
if(params != null) {
liveDictMapper.updateStatus((Long)params.get("liveId"));
}
}
}
package com.subsidy.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.model.LiveClassesDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.subsidy.vo.live.ClassLivesVO;
import com.subsidy.vo.live.ClassMembersVO;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@Repository
public interface LiveClassesMapper extends BaseMapper<LiveClassesDO> {
//班级人员
IPage<ClassMembersVO> classMembers(IPage iPage, Long liveId, Long classId,String userName);
//直播应到人数
Integer liveMemberCounts(Long liveId,Long classId);
//直播实到人数
Integer liveActualCounts(Long liveId,Long classId);
//找到课程下的直播
List<ClassLivesVO> classLives(Long classId);
}
package com.subsidy.mapper;
import com.subsidy.model.LiveCoursewaresDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
/**
* <p>
* 直播课件 Mapper 接口
* </p>
*
* @author Tuyp
* @since 2022-11-29
*/
@Repository
public interface LiveCoursewaresMapper extends BaseMapper<LiveCoursewaresDO> {
}
package com.subsidy.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.dto.live.AllLivesDTO;
import com.subsidy.model.ClassDictDO;
import com.subsidy.model.LiveDictDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.subsidy.vo.live.AllLivesVO;
import com.subsidy.vo.live.LiveClassesVO;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@Repository
public interface LiveDictMapper extends BaseMapper<LiveDictDO> {
/**
* 查看所有直播课
*/
IPage<AllLivesVO> allLives(IPage iPage, String liveName, String liveStatus);
/**
* 查看直播课的所有班级 返回课程id_className
*/
List<LiveClassesVO> liveClasses(Long liveId);
/**
* 查看直播课的所有班级 返回课程ids
*/
List<Long> liveClassesIds(Long liveId);
/**
* 讲状态改为已开始
* @param id
*/
void updateStatus(Long id);
}
package com.subsidy.mapper;
import com.subsidy.model.LiveFilesDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
/**
* <p>
* 直播课件 Mapper 接口
* </p>
*
* @author Tuyp
* @since 2022-11-29
*/
@Repository
public interface LiveFilesMapper extends BaseMapper<LiveFilesDO> {
}
package com.subsidy.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.model.LivePlaybackHistoryDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.subsidy.vo.live.PlaybacksVO;
import org.springframework.stereotype.Repository;
/**
* <p>
* 回放播放记录表 Mapper 接口
* </p>
*
* @author Tuyp
* @since 2022-11-28
*/
@Repository
public interface LivePlaybackHistoryMapper extends BaseMapper<LivePlaybackHistoryDO> {
IPage<PlaybacksVO> livePlaybacks(IPage iPage, Long classId, Long liveId, String userName);
Integer memberPlayback(Long liveId,Long classId);
}
package com.subsidy.mapper;
import com.subsidy.model.LiveStudyHistoryDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
/**
* <p>
* 直播学习记录表 Mapper 接口
* </p>
*
* @author Tuyp
* @since 2022-12-01
*/
@Repository
public interface LiveStudyHistoryMapper extends BaseMapper<LiveStudyHistoryDO> {
}
package com.subsidy.mapper;
import com.subsidy.model.LiveVodsDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.subsidy.vo.live.MemberPlaybackVO;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* <p>
* 直播视频表 Mapper 接口
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@Repository
public interface LiveVodsMapper extends BaseMapper<LiveVodsDO> {
List<MemberPlaybackVO> memberPlayback(Long memberId,Long liveId);
}
......@@ -8,6 +8,7 @@ import com.subsidy.model.MemberDO;
import com.subsidy.vo.administer.ManageMemberVO;
import com.subsidy.vo.administer.UserRoleVO;
import com.subsidy.vo.classdict.SystemSettings;
import com.subsidy.vo.live.MemberLivesVO;
import com.subsidy.vo.member.GetAllVO;
import com.subsidy.vo.member.MyCoursesVO;
import com.subsidy.vo.member.StudyPageVO;
......@@ -87,5 +88,11 @@ public interface MemberMapper extends BaseMapper<MemberDO> {
*/
SystemSettings companySettings(Long memberId);
/**
* 查看某个学员可以看的直播
*/
List<MemberLivesVO> memberLives(Long memberId);
}
package com.subsidy.model;
import com.subsidy.util.BaseModel;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("live_classes")
public class LiveClassesDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 直播id
*/
private Long liveId;
/**
* 班级id
*/
private Long classId;
}
package com.subsidy.model;
import com.subsidy.util.BaseModel;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 直播课件
* </p>
*
* @author Tuyp
* @since 2022-11-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("live_coursewares")
public class LiveCoursewaresDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 直播id
*/
private Long liveId;
/**
* 课件地址
*/
private String courseware;
/**
* 课件名称
*/
private String wareName;
/**
* 课件大小
*/
private String wareSize;
}
package com.subsidy.model;
import com.subsidy.util.BaseModel;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("live_dict")
public class LiveDictDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 频道号
*/
private String channel;
/**
* 直播名称
*/
private String liveName;
/**
* 开播时间
*/
private String startTime;
/**
* 直播地址
*/
private String liveUrl;
/**
* 主讲
*/
private String speakUrl;
/**
* 主讲密码
*/
private String speakPwd;
/**
* 助教
*/
private String assistantUrl;
/**
* 助教
*/
private String assistantPwd;
/**
* 回放状态
*/
private String playbackStatus;
/**
* 回放开始日期
*/
private String playStartDate;
/**
* 回放结束日期
*/
private String playEndDate;
/**
* 直播状态
*/
private String liveStatus;
}
package com.subsidy.model;
import com.subsidy.util.BaseModel;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 直播课件
* </p>
*
* @author Tuyp
* @since 2022-11-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("live_files")
public class LiveFilesDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 直播id
*/
private Long liveId;
/**
* 材料地址
*/
private String fileUrl;
/**
* 材料名称
*/
private String fileName;
/**
* 材料大小
*/
private String fileSize;
/**
* 材料类型
*/
private String fileType;
}
package com.subsidy.model;
import com.subsidy.util.BaseModel;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 回放播放记录表
* </p>
*
* @author Tuyp
* @since 2022-11-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("live_playback_history")
public class LivePlaybackHistoryDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 直播id
*/
private Long liveId;
/**
* 录播视频id
*/
private Long liveVodId;
/**
* 成员id
*/
private Long memberId;
/**
* 播放时长
*/
private Integer playLength;
/**
* 进入时间
*/
private String startTime;
}
package com.subsidy.model;
import com.subsidy.util.BaseModel;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 直播学习记录表
* </p>
*
* @author Tuyp
* @since 2022-12-01
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("live_study_history")
public class LiveStudyHistoryDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 直播id
*/
private Long liveId;
/**
* 学员id
*/
private Long memberId;
/**
* 频道号
*/
private Long channelId;
/**
* 播放时长,单位秒
*/
private Integer playDuration;
/**
* 停留时长,单位秒
*/
private Integer stayDuration;
/**
* 流量大小,单位bytes
*/
private Long flowSize;
/**
* 直播场次id
*/
private String sessionId;
/**
* 使用polyv观众页的观众id
*/
private String param1;
/**
* 使用polyv观众页的观众昵称
*/
private String param2;
/**
* 观看日志类型,默认为live,vod:观看回放,live直播
*/
private String param3;
/**
* polyv系统参数
*/
private String param4;
/**
* polyv系统参数
*/
private String param5;
/**
* 国家
*/
private String country;
/**
* 城市
*/
private String city;
/**
* ISP运营商
*/
private String isp;
/**
* 播放视频页面地址
*/
private String referer;
/**
* 用户设备
*/
private String userAgent;
/**
* 操作系统
*/
private String operatingSystem;
/**
* 浏览器
*/
private String browser;
/**
* 是否为移动端
*/
private String isMobile;
/**
* 查询日期,格式:yyyy-MM-dd
*/
private String currentDay;
/**
* 创建日期 ,13位毫秒级时间戳
*/
private Long createdTime;
/**
* 更新日期 ,13位毫秒级时间戳
*/
private Long lastModified;
/**
* 0 或者不传:普通直播
1:超低延迟直播 rts (已经没有在使用)
2:PRTC直播(无延迟)
*/
private Integer ptype;
/**
* 进入页面时间,13位毫秒级时间戳,非特殊说明,请使用createdTime替代
*/
private Long firstActiveTime;
/**
* 退出页面时间,13位毫秒级时间戳,非特殊说明,请使用createdTime+stayDuration替代
*/
private Long lastActiveTime;
/**
* 省份
*/
private String province;
/**
* IP
*/
private String ipAddress;
}
package com.subsidy.model;
import com.subsidy.util.BaseModel;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 直播视频表
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("live_vods")
public class LiveVodsDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 直播id
*/
private Long liveId;
/**
* 视频名称
*/
private String vodName;
/**
* 视频地址
*/
private String vodUrl;
/**
* 视频编码
*/
private String vodCode;
/**
* 视频时长
*/
private Integer vodLength;
}
package com.subsidy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.dto.live.ClassMembersDTO;
import com.subsidy.dto.live.DataViewDTO;
import com.subsidy.model.LiveClassesDO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.model.LiveDictDO;
import com.subsidy.vo.live.ClassLivesVO;
import com.subsidy.vo.live.ClassMembersVO;
import com.subsidy.vo.live.DataViewVO;
import com.subsidy.vo.live.ExportClassMembersVO;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
public interface LiveClassesService extends IService<LiveClassesDO> {
IPage<ClassMembersVO> classMembers(ClassMembersDTO classMembersDTO);
List<ExportClassMembersVO> exportClassMembers(ClassMembersDTO classMembersDTO);
DataViewVO dataView(DataViewDTO dataViewDTO);
List<ClassLivesVO> classLives(LiveClassesDO liveClassesDO);
}
package com.subsidy.service;
import com.subsidy.model.LiveCoursewaresDO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.model.LiveDictDO;
import java.util.List;
/**
* <p>
* 直播课件 服务类
* </p>
*
* @author Tuyp
* @since 2022-11-29
*/
public interface LiveCoursewaresService extends IService<LiveCoursewaresDO> {
List<LiveCoursewaresDO> livewares(LiveDictDO liveDictDO);
String deleteWare(LiveCoursewaresDO liveCoursewaresDO);
String addWare(LiveCoursewaresDO liveCoursewaresDO);
}
package com.subsidy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.dto.live.AddLiveDTO;
import com.subsidy.dto.live.AllLivesDTO;
import com.subsidy.model.LiveDictDO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.vo.live.AllLivesVO;
import com.subsidy.vo.live.GetLiveVO;
import com.subsidy.vo.live.LiveClassesVO;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
public interface LiveDictService extends IService<LiveDictDO> {
IPage<AllLivesVO> allLives(AllLivesDTO allLivesDTO);
String deleteLive(LiveDictDO liveDictDO);
String addLive(AddLiveDTO addLiveDTO);
String updateLive(AddLiveDTO addLiveDTO);
GetLiveVO getLive(LiveDictDO liveDictDO);
List<LiveClassesVO> liveClasses(LiveDictDO liveDictDO);
void liveDatas(String channelId,String status,Long timestamp,String sign,String sessionId,Long startTime,Long endTime);
}
package com.subsidy.service;
import com.subsidy.model.LiveDictDO;
import com.subsidy.model.LiveFilesDO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 直播课件 服务类
* </p>
*
* @author Tuyp
* @since 2022-11-29
*/
public interface LiveFilesService extends IService<LiveFilesDO> {
List<LiveFilesDO> liveFiles(LiveDictDO liveDictDO);
String deleteFile(LiveFilesDO liveFilesDO);
String addFile(LiveFilesDO liveFilesDO);
String updateFile(LiveFilesDO liveFilesDO);
}
package com.subsidy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.dto.live.PlaybacksDTO;
import com.subsidy.model.LiveDictDO;
import com.subsidy.model.LivePlaybackHistoryDO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.model.LiveVodsDO;
import com.subsidy.vo.live.ExportPlaybacksVO;
import com.subsidy.vo.live.PlaybacksVO;
import java.util.List;
/**
* <p>
* 回放播放记录表 服务类
* </p>
*
* @author Tuyp
* @since 2022-11-28
*/
public interface LivePlaybackHistoryService extends IService<LivePlaybackHistoryDO> {
IPage<PlaybacksVO> memberPlaybacks(PlaybacksDTO playbacksDTO);
List<ExportPlaybacksVO> exportMemberPlaybacks(PlaybacksDTO playbacksDTO);
List<LiveVodsDO> playbacks(LiveDictDO liveDictDO);
String insertPlayRecord(LivePlaybackHistoryDO playbackHistory);
String insertPlayRecordNew(LivePlaybackHistoryDO playbackHistory);
}
package com.subsidy.service;
import com.subsidy.dto.live.LiveSignDTO;
import com.subsidy.model.LiveStudyHistoryDO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.model.MemberDO;
/**
* <p>
* 直播学习记录表 服务类
* </p>
*
* @author Tuyp
* @since 2022-12-01
*/
public interface LiveStudyHistoryService extends IService<LiveStudyHistoryDO> {
String liveSign(LiveSignDTO liveSignDTO);
}
package com.subsidy.service;
import com.subsidy.model.LiveDictDO;
import com.subsidy.model.LivePlaybackHistoryDO;
import com.subsidy.model.LiveVodsDO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.vo.live.MemberPlaybackVO;
import java.util.List;
/**
* <p>
* 直播视频表 服务类
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
public interface LiveVodsService extends IService<LiveVodsDO> {
List<LiveVodsDO> vods(LiveDictDO liveDictDO);
String addVod(LiveVodsDO liveVodsDO);
String deleteVod(LiveVodsDO liveVodsDO);
String updateVod(LiveVodsDO liveVodsDO);
List<MemberPlaybackVO> memberPlayback(LivePlaybackHistoryDO livePlaybackHistoryDO);
}
......@@ -3,11 +3,14 @@ package com.subsidy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.dto.administer.VerifyCodeDTO;
import com.subsidy.dto.live.PolyvInfoDTO;
import com.subsidy.dto.member.*;
import com.subsidy.model.ExerciseDoneResultDO;
import com.subsidy.model.FileDictDO;
import com.subsidy.model.MemberDO;
import com.subsidy.vo.administer.UserRoleVO;
import com.subsidy.vo.live.MemberLivesVO;
import com.subsidy.vo.live.PolyvInfoVO;
import com.subsidy.vo.member.*;
import com.subsidy.vo.paper.QueryPapersVO;
......@@ -70,4 +73,8 @@ public interface MemberService extends IService<MemberDO> {
QxyVO qxy(MemberDO memberDO);
UserRoleVO register(RegisterDTO registerDTO);
List<MemberLivesVO> memberLives(MemberDO memberDO);
PolyvInfoVO polyvInfo(String userid,String channelId,String ts,String token);
}
package com.subsidy.service.impl;
import com.subsidy.common.constant.CourseNotification;
import com.subsidy.common.exception.HttpException;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.dto.cert.AddCertClassDTO;
import com.subsidy.dto.classDict.AddClassDTO;
import com.subsidy.jobs.CourseNotificationJob;
import com.subsidy.mapper.CertClassMemberMappingMapper;
import com.subsidy.model.*;
import com.subsidy.mapper.CertClassMapper;
import com.subsidy.mapper.CertClassMemberMappingMapper;
import com.subsidy.model.CertClassDO;
import com.subsidy.model.CertClassMemberMappingDO;
import com.subsidy.service.CertClassService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.util.DateFormatUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
......
package com.subsidy.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.subsidy.dto.live.ClassMembersDTO;
import com.subsidy.dto.live.DataViewDTO;
import com.subsidy.mapper.LivePlaybackHistoryMapper;
import com.subsidy.mapper.LiveStudyHistoryMapper;
import com.subsidy.model.LiveClassesDO;
import com.subsidy.mapper.LiveClassesMapper;
import com.subsidy.model.LiveDictDO;
import com.subsidy.model.LiveStudyHistoryDO;
import com.subsidy.service.LiveClassesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.vo.live.ClassLivesVO;
import com.subsidy.vo.live.ClassMembersVO;
import com.subsidy.vo.live.DataViewVO;
import com.subsidy.vo.live.ExportClassMembersVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static com.subsidy.util.MyStringUtils.changeListToString;
/**
* <p>
* 服务实现类
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@Service
public class LiveClassesServiceImpl extends ServiceImpl<LiveClassesMapper, LiveClassesDO> implements LiveClassesService {
@Autowired
private LiveStudyHistoryMapper liveStudyHistoryMapper;
@Autowired
private LivePlaybackHistoryMapper livePlaybackHistoryMapper;
public IPage<ClassMembersVO> classMembers(ClassMembersDTO classMembersDTO) {
Page pager = new Page(classMembersDTO.getPageNum(), classMembersDTO.getPageSize());
IPage iPage = this.baseMapper.classMembers(pager, classMembersDTO.getLiveId(), classMembersDTO.getClassId(), classMembersDTO.getUserName());
List<ClassMembersVO> classMembersVOS = iPage.getRecords();
for (ClassMembersVO classMembersVO : classMembersVOS) {
List<String> startTimes = new ArrayList<>();
List<String> locations = new ArrayList<>();
List<String> cities = new ArrayList<>();
List<String> ipAddress = new ArrayList<>();
List<String> terminals = new ArrayList<>();
//查看某人进入直播间的时间
List<LiveStudyHistoryDO> liveStudyHistoryDOS = liveStudyHistoryMapper.selectList(new QueryWrapper<LiveStudyHistoryDO>()
.lambda()
.eq(LiveStudyHistoryDO::getLiveId, classMembersDTO.getLiveId())
.eq(LiveStudyHistoryDO::getMemberId, classMembersVO.getId()));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (LiveStudyHistoryDO lsd : liveStudyHistoryDOS) {
String date = sdf.format(new Date(lsd.getCreatedTime()));
//进入时间
if (!startTimes.contains(date)) {
startTimes.add(date);
}
//地区
if (!locations.contains(lsd.getProvince())) {
locations.add(lsd.getProvince());
}
//城市
if (!cities.contains(lsd.getCity())) {
cities.add(lsd.getCity());
}
//ip
if (!ipAddress.contains(lsd.getIpAddress())) {
ipAddress.add(lsd.getIpAddress());
}
//终端
if (!terminals.contains(lsd.getBrowser())) {
terminals.add(lsd.getBrowser());
}
}
classMembersVO.setStartTimes(startTimes);
classMembersVO.setLocations(locations);
classMembersVO.setCities(cities);
classMembersVO.setIpAddress(ipAddress);
classMembersVO.setTerminals(terminals);
if (liveStudyHistoryDOS.size() > 0) {
classMembersVO.setSignInCounts(1);
} else {
classMembersVO.setSignInCounts(0);
}
}
return iPage;
}
public List<ExportClassMembersVO> exportClassMembers(ClassMembersDTO classMembersDTO) {
Page pager = new Page(1, -1);
IPage iPage = this.baseMapper.classMembers(pager, classMembersDTO.getLiveId(), classMembersDTO.getClassId(), classMembersDTO.getUserName());
List<ClassMembersVO> classMembersVOS = iPage.getRecords();
for (ClassMembersVO classMembersVO : classMembersVOS) {
ExportClassMembersVO exportClassMembersVO = new ExportClassMembersVO();
BeanUtils.copyProperties(classMembersVO, exportClassMembersVO);
List<String> startTimes = new ArrayList<>();
List<String> locations = new ArrayList<>();
List<String> cities = new ArrayList<>();
List<String> ipAddress = new ArrayList<>();
List<String> terminals = new ArrayList<>();
//查看某人进入直播间的时间
List<LiveStudyHistoryDO> liveStudyHistoryDOS = liveStudyHistoryMapper.selectList(new QueryWrapper<LiveStudyHistoryDO>()
.lambda()
.eq(LiveStudyHistoryDO::getLiveId, classMembersDTO.getLiveId())
.eq(LiveStudyHistoryDO::getMemberId, classMembersVO.getId()));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (LiveStudyHistoryDO lsd : liveStudyHistoryDOS) {
String date = sdf.format(new Date(lsd.getCreatedTime()));
//进入时间
if (!startTimes.contains(date)) {
startTimes.add(date);
}
//地区
if (!locations.contains(lsd.getProvince())) {
startTimes.add(lsd.getProvince());
}
//城市
if (!cities.contains(lsd.getCity())) {
cities.add(lsd.getCity());
}
//ip
if (!ipAddress.contains(lsd.getIpAddress())) {
ipAddress.add(lsd.getIpAddress());
}
//终端
if (terminals.contains(lsd.getBrowser())) {
terminals.add(lsd.getBrowser());
}
}
exportClassMembersVO.setStartTimes(changeListToString(startTimes));
exportClassMembersVO.setLocations(changeListToString(locations));
exportClassMembersVO.setCities(changeListToString(cities));
exportClassMembersVO.setIpAddress(changeListToString(ipAddress));
exportClassMembersVO.setTerminals(changeListToString(terminals));
if (liveStudyHistoryDOS.size() > 0) {
classMembersVO.setSignInCounts(1);
} else {
classMembersVO.setSignInCounts(0);
}
}
return iPage.getRecords();
}
public DataViewVO dataView(DataViewDTO dataViewDTO) {
DataViewVO dataViewVO = new DataViewVO();
//直播应到人数
dataViewVO.setTotalLive(this.baseMapper.liveMemberCounts(dataViewDTO.getId(),dataViewDTO.getClassId()));
//直播实际人数
dataViewVO.setActualLive(this.baseMapper.liveActualCounts(dataViewDTO.getId(),dataViewDTO.getClassId()));
//回放应看人数
dataViewVO.setTotalPlayback(dataViewVO.getTotalLive());
//实际回看人数
dataViewVO.setActualPlayback(livePlaybackHistoryMapper.memberPlayback(dataViewDTO.getId(),dataViewDTO.getClassId()));
return dataViewVO;
}
public List<ClassLivesVO> classLives(LiveClassesDO liveClassesDO) {
return this.baseMapper.classLives(liveClassesDO.getClassId());
}
}
package com.subsidy.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.subsidy.model.LiveCoursewaresDO;
import com.subsidy.mapper.LiveCoursewaresMapper;
import com.subsidy.model.LiveDictDO;
import com.subsidy.service.LiveCoursewaresService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.util.ConstantUtils;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 直播课件 服务实现类
* </p>
*
* @author Tuyp
* @since 2022-11-29
*/
@Service
public class LiveCoursewaresServiceImpl extends ServiceImpl<LiveCoursewaresMapper, LiveCoursewaresDO> implements LiveCoursewaresService {
public List<LiveCoursewaresDO> livewares(LiveDictDO liveDictDO) {
return this.baseMapper.selectList(new QueryWrapper<LiveCoursewaresDO>()
.lambda()
.eq(LiveCoursewaresDO::getLiveId, liveDictDO.getId()));
}
public String deleteWare(LiveCoursewaresDO liveCoursewaresDO) {
this.baseMapper.deleteById(liveCoursewaresDO.getId());
return ConstantUtils.DELETE_SUCCESS;
}
public String addWare(LiveCoursewaresDO liveCoursewaresDO) {
this.baseMapper.insert(liveCoursewaresDO);
return ConstantUtils.ADD_SUCCESS;
}
}
package com.subsidy.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.subsidy.model.LiveDictDO;
import com.subsidy.model.LiveFilesDO;
import com.subsidy.mapper.LiveFilesMapper;
import com.subsidy.service.LiveFilesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.util.ConstantUtils;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 直播课件 服务实现类
* </p>
*
* @author Tuyp
* @since 2022-11-29
*/
@Service
public class LiveFilesServiceImpl extends ServiceImpl<LiveFilesMapper, LiveFilesDO> implements LiveFilesService {
public List<LiveFilesDO> liveFiles(LiveDictDO liveDictDO) {
return this.baseMapper.selectList(new QueryWrapper<LiveFilesDO>()
.lambda()
.eq(LiveFilesDO::getLiveId, liveDictDO.getId()));
}
public String deleteFile(LiveFilesDO liveFilesDO) {
this.baseMapper.deleteById(liveFilesDO.getId());
return ConstantUtils.DELETE_SUCCESS;
}
public String addFile(LiveFilesDO liveFilesDO) {
this.baseMapper.insert(liveFilesDO);
return ConstantUtils.ADD_SUCCESS;
}
public String updateFile(LiveFilesDO liveFilesDO) {
this.baseMapper.updateById(liveFilesDO);
return ConstantUtils.SUCCESS_UPDATE;
}
}
package com.subsidy.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.subsidy.common.exception.HttpException;
import com.subsidy.dto.live.PlaybacksDTO;
import com.subsidy.mapper.LiveStudyHistoryMapper;
import com.subsidy.mapper.LiveVodsMapper;
import com.subsidy.model.*;
import com.subsidy.mapper.LivePlaybackHistoryMapper;
import com.subsidy.service.LivePlaybackHistoryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.util.ConstantUtils;
import com.subsidy.vo.live.ExportPlaybacksVO;
import com.subsidy.vo.live.PlaybacksVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static com.subsidy.util.MyStringUtils.changeListToString;
/**
* <p>
* 回放播放记录表 服务实现类
* </p>
*
* @author Tuyp
* @since 2022-11-28
*/
@Service
public class LivePlaybackHistoryServiceImpl extends ServiceImpl<LivePlaybackHistoryMapper, LivePlaybackHistoryDO> implements LivePlaybackHistoryService {
@Autowired
private LiveStudyHistoryMapper liveStudyHistoryMapper;
@Autowired
private LiveVodsMapper liveVodsMapper;
public IPage<PlaybacksVO> memberPlaybacks(PlaybacksDTO playbacksDTO) {
Page pager = new Page(playbacksDTO.getPageNum(), playbacksDTO.getPageSize());
IPage iPage = this.baseMapper.livePlaybacks(pager, playbacksDTO.getClassId(), playbacksDTO.getLiveId(), playbacksDTO.getUserName());
List<PlaybacksVO> playbacksVOS = iPage.getRecords();
for (PlaybacksVO pv : playbacksVOS) {
List<String> startTimes = new ArrayList<>();
//查看某人进入直播间的时间
List<LiveStudyHistoryDO> liveStudyHistoryDOS = liveStudyHistoryMapper.selectList(new QueryWrapper<LiveStudyHistoryDO>()
.lambda()
.eq(LiveStudyHistoryDO::getLiveId, playbacksDTO.getLiveId())
.eq(LiveStudyHistoryDO::getMemberId, pv.getId()));
//直播次数
if (liveStudyHistoryDOS.size() > 0) {
pv.setSignInCounts(1);
}else {
pv.setSignInCounts(0);
}
//查看某人回放次数
List<LivePlaybackHistoryDO> livePlaybackHistoryDOS = this.baseMapper.selectList(new QueryWrapper<LivePlaybackHistoryDO>()
.lambda()
.eq(LivePlaybackHistoryDO::getMemberId, pv.getId())
.eq(LivePlaybackHistoryDO::getLiveId, playbacksDTO.getLiveId()));
//回放签到
if (livePlaybackHistoryDOS.size() > 0) {
pv.setPlaybackCounts(1);
}else {
pv.setPlaybackCounts(0);
}
//进入时间
for (LivePlaybackHistoryDO livePlaybackHistoryDO : livePlaybackHistoryDOS) {
if (!startTimes.contains(livePlaybackHistoryDO.getStartTime())) {
startTimes.add(livePlaybackHistoryDO.getStartTime());
}
}
pv.setStartTimes(startTimes);
}
return iPage;
}
public List<ExportPlaybacksVO> exportMemberPlaybacks(PlaybacksDTO playbacksDTO) {
Page pager = new Page(1,-1);
IPage iPage = this.baseMapper.livePlaybacks(pager, playbacksDTO.getClassId(), playbacksDTO.getLiveId(), playbacksDTO.getUserName());
List<PlaybacksVO> playbacksVOS = iPage.getRecords();
List<ExportPlaybacksVO> exportPlaybacksVOS = new ArrayList<>();
for (PlaybacksVO pv : playbacksVOS) {
ExportPlaybacksVO exportPlaybacksVO = new ExportPlaybacksVO();
BeanUtils.copyProperties(pv,exportPlaybacksVO);
List<String> startTimes = new ArrayList<>();
//查看某人进入直播间的时间
List<LiveStudyHistoryDO> liveStudyHistoryDOS = liveStudyHistoryMapper.selectList(new QueryWrapper<LiveStudyHistoryDO>()
.lambda()
.eq(LiveStudyHistoryDO::getLiveId, playbacksDTO.getLiveId())
.eq(LiveStudyHistoryDO::getMemberId, pv.getId()));
//直播次数
if (liveStudyHistoryDOS.size()>0){
exportPlaybacksVO.setSignInCounts(1);
}else {
exportPlaybacksVO.setSignInCounts(0);
}
//查看某人回放次数
List<LivePlaybackHistoryDO> livePlaybackHistoryDOS = this.baseMapper.selectList(new QueryWrapper<LivePlaybackHistoryDO>()
.lambda()
.eq(LivePlaybackHistoryDO::getMemberId, pv.getId())
.eq(LivePlaybackHistoryDO::getLiveId, playbacksDTO.getLiveId()));
//回放签到
if (livePlaybackHistoryDOS.size() > 0) {
pv.setPlaybackCounts(1);
}else {
pv.setPlaybackCounts(0);
}
//进入时间
for (LivePlaybackHistoryDO livePlaybackHistoryDO : livePlaybackHistoryDOS) {
if (!startTimes.contains(livePlaybackHistoryDO.getStartTime())) {
startTimes.add(livePlaybackHistoryDO.getStartTime());
}
}
exportPlaybacksVO.setStartTimes(changeListToString(startTimes));
exportPlaybacksVOS.add(exportPlaybacksVO);
}
return iPage.getRecords();
}
public List<LiveVodsDO> playbacks(LiveDictDO liveDictDO) {
return liveVodsMapper.selectList(new QueryWrapper<LiveVodsDO>()
.lambda()
.eq(LiveVodsDO::getLiveId, liveDictDO.getId()));
}
public String insertPlayRecord(LivePlaybackHistoryDO playbackHistory) {
LiveVodsDO liveVodsDO = liveVodsMapper.selectById(playbackHistory.getLiveVodId());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (playbackHistory.getPlayLength() > 5) {
playbackHistory.setLiveId(liveVodsDO.getLiveId());
Date date = new Date(System.currentTimeMillis() - playbackHistory.getPlayLength()*1000);
playbackHistory.setStartTime(simpleDateFormat.format(date));
this.baseMapper.insert(playbackHistory);
}
return ConstantUtils.ADD_SUCCESS;
}
public String insertPlayRecordNew(LivePlaybackHistoryDO playbackHistory) {
LiveVodsDO liveVodsDO = liveVodsMapper.selectById(playbackHistory.getLiveVodId());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (playbackHistory.getPlayLength() > 5) {
playbackHistory.setLiveId(liveVodsDO.getLiveId());
Date date = new Date(System.currentTimeMillis() - playbackHistory.getPlayLength()*1000);
playbackHistory.setStartTime(simpleDateFormat.format(date));
this.baseMapper.insert(playbackHistory);
}
return ConstantUtils.ADD_SUCCESS;
}
}
package com.subsidy.service.impl;
import com.subsidy.common.configure.PolyvConfig;
import com.subsidy.dto.live.LiveSignDTO;
import com.subsidy.model.LiveStudyHistoryDO;
import com.subsidy.mapper.LiveStudyHistoryMapper;
import com.subsidy.model.MemberDO;
import com.subsidy.service.LiveStudyHistoryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.util.ConstantUtils;
import com.subsidy.util.PolyvUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* <p>
* 直播学习记录表 服务实现类
* </p>
*
* @author Tuyp
* @since 2022-12-01
*/
@Service
public class LiveStudyHistoryServiceImpl extends ServiceImpl<LiveStudyHistoryMapper, LiveStudyHistoryDO> implements LiveStudyHistoryService {
public String liveSign(LiveSignDTO liveSignDTO){
return PolyvUtils.liveSign(liveSignDTO.getUserId(),liveSignDTO.getChannelId());
}
}
package com.subsidy.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.subsidy.model.LiveDictDO;
import com.subsidy.model.LivePlaybackHistoryDO;
import com.subsidy.model.LiveVodsDO;
import com.subsidy.mapper.LiveVodsMapper;
import com.subsidy.service.LiveVodsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.util.ConstantUtils;
import com.subsidy.vo.live.MemberPlaybackVO;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 直播视频表 服务实现类
* </p>
*
* @author Tuyp
* @since 2022-11-24
*/
@Service
public class LiveVodsServiceImpl extends ServiceImpl<LiveVodsMapper, LiveVodsDO> implements LiveVodsService {
public List<LiveVodsDO> vods(LiveDictDO liveDictDO) {
List<LiveVodsDO> liveVodsDOS = this.baseMapper.selectList(new QueryWrapper<LiveVodsDO>()
.lambda()
.eq(LiveVodsDO::getLiveId, liveDictDO.getId()));
return liveVodsDOS;
}
public String addVod(LiveVodsDO liveVodsDO) {
this.baseMapper.insert(liveVodsDO);
return ConstantUtils.ADD_SUCCESS;
}
public String deleteVod(LiveVodsDO liveVodsDO) {
this.baseMapper.deleteById(liveVodsDO.getId());
return ConstantUtils.DELETE_SUCCESS;
}
public String updateVod(LiveVodsDO liveVodsDO) {
this.baseMapper.updateById(liveVodsDO);
return ConstantUtils.SUCCESS_UPDATE;
}
public List<MemberPlaybackVO> memberPlayback(LivePlaybackHistoryDO livePlaybackHistoryDO) {
return this.baseMapper.memberPlayback(livePlaybackHistoryDO.getMemberId(),livePlaybackHistoryDO.getLiveId());
}
}
......@@ -8,12 +8,15 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.common.configure.QXueYouConfig;
import com.subsidy.common.exception.HttpException;
import com.subsidy.dto.administer.VerifyCodeDTO;
import com.subsidy.dto.live.PolyvInfoDTO;
import com.subsidy.dto.member.*;
import com.subsidy.mapper.*;
import com.subsidy.model.*;
import com.subsidy.service.MemberService;
import com.subsidy.util.*;
import com.subsidy.vo.administer.UserRoleVO;
import com.subsidy.vo.live.MemberLivesVO;
import com.subsidy.vo.live.PolyvInfoVO;
import com.subsidy.vo.member.*;
import com.subsidy.vo.paper.QueryPapersVO;
import net.sourceforge.pinyin4j.PinyinHelper;
......@@ -34,9 +37,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
......@@ -113,6 +118,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, MemberDO> imple
@Autowired
private QXueYouConfig qXueYouConfig;
@Autowired
private LiveDictMapper liveDictMapper;
public IPage<GetAllVO> getAll(GetAllDTO getAllDTO) {
Page pager = new Page(getAllDTO.getPageNum(), getAllDTO.getPageSize());
......@@ -1106,4 +1114,28 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, MemberDO> imple
userRoleVO.setToken(token);
return userRoleVO;
}
public List<MemberLivesVO> memberLives(MemberDO memberDO){
List<MemberLivesVO> memberLivesVOS = this.baseMapper.memberLives(memberDO.getId());
//工具类生成某个学生的直播地址
for (MemberLivesVO mlv : memberLivesVOS){
mlv.setLiveUrl(PolyvUtils.liveSign(memberDO.getId().toString(),mlv.getChannel()));
}
return memberLivesVOS;
}
public PolyvInfoVO polyvInfo(String userid,String channelId,String ts,String token){
PolyvInfoVO polyvInfoVO = new PolyvInfoVO();
MemberDO memberDO = this.baseMapper.selectById(userid);
polyvInfoVO.setStatus(1);
polyvInfoVO.setUserid(memberDO.getId().toString());
polyvInfoVO.setNickname(memberDO.getUserName());
polyvInfoVO.setAvatar("https://ykhl-bigger.oss-cn-beijing.aliyuncs.com/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20221206112738.jpg");
return polyvInfoVO;
}
}
......@@ -48,7 +48,7 @@ public class ConstantUtils {
public static final String PUBLISH_SUCCESS = "发布成功";
public static final String LOGIN_OUT ="登出成功";
public static final String LOGIN_OUT = "登出成功";
public static final String COMPRESS_SUCCESS = "压缩成功";
......@@ -103,8 +103,11 @@ public class ConstantUtils {
public static final Long BUSINESS_ID = 1L;
public static final String UTF8 = "UTF-8";
/**
* 人脸识别
* 保利威视
*/
public static final String POLYV_VIEWLOG_2 = "http://api.polyv.net/live/v1/statistics/{channelId}/viewlog";
}
package com.subsidy.util;
import java.util.List;
public class MyStringUtils {
public static String changeListToString(List<String> list) {
StringBuffer buffer = new StringBuffer();
if (list.size() > 0) {
int i= 0 ;
for (String s : list) {
buffer.append(s);
if (i != list.size()-1){
buffer.append(",");
}
}
}
return buffer.toString();
}
}
package com.subsidy.util;
import net.polyv.live.v1.util.LiveSignUtil;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
public class PolyvUtils {
/**
* 学生端--生成保利威视直播观看地址
*/
public static String liveSign(String userId, String channelId){
//根据实际情况设置userid
String ts = String.valueOf(System.currentTimeMillis());
String url = "https://live.polyv.cn/watch/"+channelId;
String signText = "03sqxr97fo"+ userId +"03sqxr97fo"+ts;
try {
String sign = LiveSignUtil.md5Hex(signText);
url += "?userid="+userId+"&ts="+ts+"&sign="+sign;
return url;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}
......@@ -52,6 +52,7 @@ public class QuartzUtil {
}
}
} catch (Exception e) {
e.printStackTrace();
throw new HttpException(70002);
}
}
......
......@@ -11,6 +11,7 @@ import java.nio.charset.StandardCharsets;
* @create: 2020-07-29 12:42
*/
public class Signature {
private String secretId;
private String secretKey;
private long currentTime;
......@@ -80,4 +81,5 @@ public class Signature {
}
public void setClassId(int classId){this.classId = classId;}
}
package com.subsidy.vo.live;
import com.subsidy.model.ClassDictDO;
import lombok.Data;
import java.util.List;
@Data
public class AllLivesVO {
private Long id;
private String channel;
private String liveName;
private String startTime;
private String playbackStatus;
private String liveStatus;
private List<LiveClassesVO> classDictDOS;
}
package com.subsidy.vo.live;
import lombok.Data;
import java.util.List;
@Data
public class BackData {
private String status;
private List<Result> result;
}
package com.subsidy.vo.live;
import lombok.Data;
@Data
public class ClassLivesVO {
private Long id;
private String liveName;
}
package com.subsidy.vo.live;
import lombok.Data;
import java.util.List;
@Data
public class ClassMembersVO {
private Long id;
private String userName;
private String telephone;
private Integer playLength;
private Integer signInCounts;
private List<String> startTimes;
private List<String> locations;
private List<String> cities;
private List<String> ipAddress;
private List<String> terminals;
}
package com.subsidy.vo.live;
import lombok.Data;
@Data
public class DataViewVO {
private Integer totalLive;
private Integer actualLive;
private Integer totalPlayback;
private Integer actualPlayback;
}
package com.subsidy.vo.live;
import com.subsidy.util.excel.ExcelColumn;
import lombok.Data;
@Data
public class ExportClassMembersVO {
private Long id;
@ExcelColumn(value = "成员名称", col = 1)
private String userName;
@ExcelColumn(value = "联系方式", col = 2)
private String telephone;
@ExcelColumn(value = "直播签到", col = 3)
private Integer signInCounts;
@ExcelColumn(value = "观看时长", col = 4)
private Integer playLength;
@ExcelColumn(value = "进入时间", col = 5)
private String startTimes;
@ExcelColumn(value = "地区", col = 6)
private String locations;
@ExcelColumn(value = "城市", col = 7)
private String cities;
@ExcelColumn(value = "IP", col = 8)
private String ipAddress;
@ExcelColumn(value = "终端", col = 9)
private String terminals;
}
package com.subsidy.vo.live;
import com.subsidy.util.excel.ExcelColumn;
import lombok.Data;
@Data
public class ExportPlaybacksVO {
private Long id;
@ExcelColumn(value = "成员名称", col = 1)
private String userName;
@ExcelColumn(value = "联系方式", col = 2)
private String telephone;
@ExcelColumn(value = "直播签到", col = 3)
private Integer signInCounts;
@ExcelColumn(value = "回放签到", col = 4)
private Integer playbackCounts;
@ExcelColumn(value = "观看时长", col = 5)
private Integer playLength;
@ExcelColumn(value = "进入时间", col = 6)
private String startTimes;
}
package com.subsidy.vo.live;
import com.subsidy.model.LiveDictDO;
import lombok.Data;
import java.util.List;
@Data
public class GetLiveVO extends LiveDictDO {
private List<LiveClassesVO> liveClassesVOS;
}
package com.subsidy.vo.live;
import lombok.Data;
@Data
public class LiveClassesVO {
private Long id;
private String className;
}
package com.subsidy.vo.live;
import lombok.Data;
@Data
public class MemberLivesVO {
private Long liveId;
private String liveName;
private String liveUrl;
private String startTime;
private String liveStatus;
private String channel;
private String playStartDate;
private String playEndDate;
}
package com.subsidy.vo.live;
import lombok.Data;
@Data
public class MemberPlaybackVO {
private Long id;
private String vodName;
private String vodUrl;
private String createDate;
private Integer playLength;
private Integer vodLength;
private String percent;
}
package com.subsidy.vo.live;
import lombok.Data;
import java.util.List;
@Data
public class PlaybacksVO {
private Long id;
private String userName;
private String telephone;
private Integer playLength;
private Integer signInCounts;
private Integer playbackCounts;
private List<String> startTimes;
}
package com.subsidy.vo.live;
import lombok.Data;
@Data
public class PolyvInfoVO {
private Integer status;
private String userid;
private String nickname;
private String avatar;
private String actor;
private String actorFColor;
private String actorBgColor;
private String param4;
}
package com.subsidy.vo.live;
import lombok.Data;
@Data
public class Result {
private String playId;
private String userId;
private String channelId;
private Integer playDuration;
private Integer stayDuration;
private Long flowSize;
private String sessionId;
private String param1;
private String param2;
private String param3;
private String param4;
private String param5;
private String ipAddress;
private String country;
private String province;
private String city;
private String isp;
private String referer;
private String userAgent;
private String operatingSystem;
private String browser;
private String isMobile;
private String currentDay;
private Long createdTime;
private Long lastModified;
private Integer ptype;
private Long firstActiveTime;
private Long lastActiveTime;
}
# 本地环境配置
spring.server.port=23462
spring.server.port=23457
# 数据源配置
spring.datasource.url=jdbc:mysql://116.62.57.92:3306/subsidy_online?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.url=jdbc:mysql://116.62.57.92:3306/subsidy_test?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
#spring.datasource.url=jdbc:mysql://rm-uf6rab73w0qg843opxo.mysql.rds.aliyuncs.com:3306/subsidy_test?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
......
# 环境配置
spring.profiles.active=prod
spring.profiles.active=dev
#和CPU数
spring.server.acceptorThreadCount=600
spring.server.minSpareThreads=100
......@@ -63,12 +63,16 @@ spring.quartz.overwrite-existing-jobs=false
# 自动建表,如果已经存在表请勿使用,会覆盖数据表
#spring.quartz.jdbc.initialize-schema=always
#spring.datasource.initialization-mode=embedded
#spring.redis.host=r-uf6m4cpkjrgpzywjm3pd.redis.rds.aliyuncs.com
#spring.redis.port=6379
#spring.redis.password=r-uf6m4cpkjrgpzywjm3:Ykhl@208
wechat=
#pro
appId= wx5e1ecb9c9bd33451
appSecret= 4f5e1abb6fb4f68f5273820b6295ec6b
appId=wx5e1ecb9c9bd33451
appSecret=4f5e1abb6fb4f68f5273820b6295ec6b
#保利威视
polyv.userId=b8f2d3bfdc
polyv.appId=g3lrxnzd75
polyv.appSecret=ef9cdcbbb9184b61aca301ba8114d570
polyv.secretKey=03sqxr97fo
<?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.subsidy.mapper.LiveClassesMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.LiveClassesDO">
<id column="id" property="id" />
<result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" />
<result column="delete_date" property="deleteDate" />
<result column="live_id" property="liveId" />
<result column="class_id" property="classId" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, live_id, class_id
</sql>
<select id="classMembers" resultType="com.subsidy.vo.live.ClassMembersVO">
SELECT
t.id,
t.telephone,
t.user_name,
t2.play_length
FROM
(
SELECT
distinct t2.id,
t2.user_name,
t2.telephone
FROM
class_member_mapping t
LEFT JOIN member t2 ON t.member_id = t2.id
LEFT JOIN live_classes t3 ON t.class_id = t3.class_id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
AND t3.delete_date IS NULL
AND t.class_id = #{classId}
AND t3.live_id = #{liveId}
<if test="userName != null and userName != ''">
and t2.user_name like concat('%',#{userName} ,'%')
</if>
) t
LEFT JOIN (
SELECT
t.live_id,
t.member_id,
sum( t.play_duration ) AS play_length
FROM
live_study_history t
WHERE
t.delete_date IS NULL
AND t.live_id = #{liveId}
GROUP BY
t.live_id,
t.member_id
) t2 ON t.id = t2.member_id
</select>
<select id="liveMemberCounts" parameterType="long" resultType="integer">
SELECT
count(
DISTINCT ( t2.member_id ))
FROM
live_classes t
LEFT JOIN class_member_mapping t2 ON t.class_id = t2.class_id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
AND t.live_id = #{liveId}
and t2.class_id = #{classId}
</select>
<select id="liveActualCounts" parameterType="long" resultType="integer">
SELECT
count(
DISTINCT ( t.member_id ))
FROM
live_study_history t
left join class_member_mapping t2 on t.member_id = t2.member_id
WHERE
t.delete_date is null
and t2.delete_date is null
AND t.live_id = #{liveId}
and t2.class_id = #{classId}
</select>
<select id="classLives" parameterType="long" resultType="com.subsidy.vo.live.ClassLivesVO">
SELECT
distinct t2.id,
t2.live_name
FROM
live_classes t
LEFT JOIN live_dict t2 ON t.live_id = t2.id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
AND t.class_id = #{classId}
</select>
</mapper>
<?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.subsidy.mapper.LiveCoursewaresMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.LiveCoursewaresDO">
<id column="id" property="id" />
<result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" />
<result column="delete_date" property="deleteDate" />
<result column="live_id" property="liveId" />
<result column="courseware" property="courseware" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, live_id, courseware
</sql>
</mapper>
<?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.subsidy.mapper.LiveDictMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.LiveDictDO">
<id column="id" property="id" />
<result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" />
<result column="delete_date" property="deleteDate" />
<result column="channel" property="channel" />
<result column="live_name" property="liveName" />
<result column="start_time" property="startTime" />
<result column="playback_status" property="playbackStatus" />
<result column="live_status" property="liveStatus" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, channel, live_name, start_time, playback_status, live_status
</sql>
<select id="allLives" resultType="com.subsidy.vo.live.AllLivesVO">
SELECT
distinct t.id,
t.channel,
t.live_name,
t.start_time,
t.live_status
FROM
live_dict t
LEFT JOIN live_classes t2 ON t.id = t2.live_id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
<if test="liveName != null and liveName != ''">
and t.live_name like concat('%',#{liveName} ,'%')
</if>
<if test="liveStatus != null and liveStatus != ''">
and t.live_status = #{liveStatus}
</if>
order by t.create_date desc
</select>
<select id="liveClasses" parameterType="long" resultType="com.subsidy.vo.live.LiveClassesVO">
SELECT
distinct t2.id,
t2.class_name
FROM
live_classes t
LEFT JOIN class_dict t2 ON t.class_id = t2.id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
and t.live_id = #{liveId}
</select>
<select id="liveClassesIds" parameterType="long" resultType="long">
SELECT
t2.id
FROM
live_classes t
LEFT JOIN class_dict t2 ON t.class_id = t2.id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
and t.id = #{liveId}
</select>
<update id="updateStatus" parameterType="long">
update live_dict set live_status = '已开始' where id = #{id}
</update>
</mapper>
<?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.subsidy.mapper.LiveFilesMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.LiveFilesDO">
<id column="id" property="id" />
<result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" />
<result column="delete_date" property="deleteDate" />
<result column="live_id" property="liveId" />
<result column="file_url" property="fileUrl" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, live_id, file_url
</sql>
</mapper>
<?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.subsidy.mapper.LivePlaybackHistoryMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.LivePlaybackHistoryDO">
<id column="id" property="id" />
<result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" />
<result column="delete_date" property="deleteDate" />
<result column="live_vod_id" property="liveVodId" />
<result column="member_id" property="memberId" />
<result column="play_length" property="playLength" />
<result column="start_time" property="startTime" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, live_vod_id, member_id, play_length, start_time
</sql>
<select id="livePlaybacks" resultType="com.subsidy.vo.live.PlaybacksVO">
SELECT
t.id,
t.user_name,
t.telephone,
t2.play_length
FROM
(
SELECT
distinct
t2.id,
t2.user_name,
t2.telephone
FROM
class_member_mapping t
LEFT JOIN member t2 ON t.member_id = t2.id
LEFT JOIN live_classes t3 ON t.class_id = t3.class_id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
AND t3.delete_date IS NULL
<if test="classId != null and classId != ''">
AND t.class_id = #{classId}
</if>
<if test="liveId != null and liveId != ''">
AND t3.live_id = #{liveId}
</if>
<if test="userName != null and userName != ''">
AND t2.user_name LIKE concat( '%', #{userName}, '%' )
</if>
)t
LEFT JOIN (
SELECT
t.live_id,
t.member_id,
sum( t.play_length ) AS play_length
FROM
live_playback_history t
WHERE
t.delete_date IS NULL
<if test="liveId != null and liveId != ''">
AND t.live_id = #{liveId}
</if>
GROUP BY
t.live_id,
t.member_id
) t2 ON t.id = t2.member_id
</select>
<select id="memberPlayback" parameterType="long" resultType="integer">
SELECT
count(
DISTINCT ( t.member_id ))
FROM
live_playback_history t
left join class_member_mapping t2 on t.member_id = t2.member_id
WHERE
t.live_id = #{liveId}
and t2.class_id = #{classId}
and t.delete_date is null
and t2.delete_date IS NULL
GROUP BY
t.live_id
</select>
</mapper>
<?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.subsidy.mapper.LiveStudyHistoryMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.LiveStudyHistoryDO">
<id column="id" property="id" />
<result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" />
<result column="delete_date" property="deleteDate" />
<result column="live_id" property="liveId" />
<result column="member_id" property="memberId" />
<result column="channel_id" property="channelId" />
<result column="play_duration" property="playDuration" />
<result column="stay_duration" property="stayDuration" />
<result column="flow_size" property="flowSize" />
<result column="session_id" property="sessionId" />
<result column="param1" property="param1" />
<result column="param2" property="param2" />
<result column="param3" property="param3" />
<result column="param4" property="param4" />
<result column="param5" property="param5" />
<result column="country" property="country" />
<result column="city" property="city" />
<result column="isp" property="isp" />
<result column="referer" property="referer" />
<result column="user_agent" property="userAgent" />
<result column="operating_system" property="operatingSystem" />
<result column="browser" property="browser" />
<result column="is_mobile" property="isMobile" />
<result column="current_day" property="currentDay" />
<result column="created_time" property="createdTime" />
<result column="last_modified" property="lastModified" />
<result column="ptype" property="ptype" />
<result column="first_active_time" property="firstActiveTime" />
<result column="last_active_time" property="lastActiveTime" />
<result column="province" property="province" />
<result column="play_length" property="playLength" />
<result column="start_time" property="startTime" />
<result column="location" property="location" />
<result column="ip_address" property="ipAddress" />
<result column="terminal" property="terminal" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, live_id, member_id, channel_id, play_duration, stay_duration, flow_size, session_id, param1, param2, param3, param4, param5, country, city, isp, referer, user_agent, operating_system, browser, is_mobile, current_day, created_time, last_modified, ptype, first_active_time, last_active_time, province, play_length, start_time, location, ip_address, terminal
</sql>
</mapper>
<?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.subsidy.mapper.LiveVodsMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.LiveVodsDO">
<id column="id" property="id" />
<result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" />
<result column="delete_date" property="deleteDate" />
<result column="live_id" property="liveId" />
<result column="vod_name" property="vodName" />
<result column="vod_url" property="vodUrl" />
<result column="vod_length" property="vodLength" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, live_id, vod_name, vod_url, vod_length
</sql>
<select id="memberPlayback" resultType="com.subsidy.vo.live.MemberPlaybackVO">
SELECT
t.id,
t.vod_name,
t.vod_url,
t2.create_date,
t2.play_length,
t.vod_length,
IF
( t.vod_length > t2.play_length, ROUND( t2.play_length * 100 / t.vod_length ), 100 ) AS percent
FROM
live_vods t
LEFT JOIN (
SELECT
t.live_id,
t.member_id,
t.live_vod_id,
IFNULL( sum( t.play_length ), 0 ) AS play_length,
MAX( t.create_date ) AS create_date
FROM
live_playback_history t
WHERE
t.delete_date IS NULL
AND t.live_id = #{liveId}
AND member_id = #{memberId}
GROUP BY
t.live_id,
t.member_id,
t.live_vod_id
) t2 ON t.id = t2.live_vod_id
</select>
</mapper>
......@@ -437,4 +437,26 @@
AND t2.delete_date IS NULL
AND t.id = #{memberId}
</select>
<select id="memberLives" parameterType="long" resultType="com.subsidy.vo.live.MemberLivesVO">
SELECT
distinct t2.live_id,
t3.live_name,
t3.live_url,
t3.start_time,
t3.live_status,
t3.channel,
t3.play_start_date,
t3.play_end_date
FROM
class_member_mapping t
LEFT JOIN live_classes t2 ON t.class_id = t2.class_id
LEFT JOIN live_dict t3 ON t2.live_id = t3.id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
AND t3.delete_date IS NULL
and t2.live_id IS not NULL
AND t.member_id = #{memberId}
</select>
</mapper>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!