Commit a3bbd3a0 by 邓敏

视频库、经营范围

1 parent 2c9d89b2
Showing with 971 additions and 156 deletions
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
<itextpdf.version>5.4.1</itextpdf.version> <itextpdf.version>5.4.1</itextpdf.version>
<java-jwt.version>3.10.3</java-jwt.version> <java-jwt.version>3.10.3</java-jwt.version>
<jedis.version>3.3.0</jedis.version> <jedis.version>3.3.0</jedis.version>
<collections.version>3.2.2</collections.version>
</properties> </properties>
<dependencies> <dependencies>
...@@ -208,6 +209,12 @@ ...@@ -208,6 +209,12 @@
<version>${jedis.version}</version> <version>${jedis.version}</version>
</dependency> </dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${collections.version}</version>
</dependency>
<!--webSocket--> <!--webSocket-->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
......
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.common.interceptor.LoginRequired;
import com.subsidy.dto.businessScope.BusinessScopeDTO;
import com.subsidy.model.BusinessScopeDictDO;
import com.subsidy.service.BusinessScopeDictService;
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 DengMin
* @since 2022-07-25
*/
@RestController
@Api(tags = "经营范围表")
@RequestMapping("/businessScopeDict")
public class BusinessScopeDictController {
@Autowired
private BusinessScopeDictService businessScopeDictService;
@PostMapping("addBusinessScope")
@ApiOperation("添加经营范围:businessScopeName/经营范围名称")
@LoginRequired
public ResponseVO addBusinessScope(@RequestBody BusinessScopeDictDO businessScopeDictDO) {
businessScopeDictService.save(businessScopeDictDO);
return ResponseData.generateCreatedResponse(0);
}
@PostMapping("updateBusinessScope")
@ApiOperation("修改经营范围:id/ID、businessScopeName/经营范围名称")
@LoginRequired
public ResponseVO updateBusinessScope(@RequestBody BusinessScopeDictDO businessScopeDictDO) {
businessScopeDictService.updateById(businessScopeDictDO);
return ResponseData.generateCreatedResponse(0);
}
@PostMapping("deleteBusinessScope")
@ApiOperation("删除经营范围:id/ID")
@LoginRequired
public ResponseVO deleteBusinessScope(@RequestBody BusinessScopeDictDO businessScopeDictDO) {
businessScopeDictService.removeById(businessScopeDictDO.getId());
return ResponseData.generateCreatedResponse(0);
}
@PostMapping("queryBusinessScopePage")
@ApiOperation("分页查询经营范围:businessScopeName/经营范围名称、pageNum/当前页数、pageSize/每页显示条数")
@LoginRequired
public ResponseVO queryBusinessScopePage(@RequestBody BusinessScopeDTO businessScopeDictDO) {
return ResponseData.generateCreatedResponse(0, businessScopeDictService.queryBusinessScopePage(businessScopeDictDO));
}
}
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.common.interceptor.LoginRequired;
import com.subsidy.dto.content.GetContendVodsDTO;
import com.subsidy.dto.contentVod.AddContentVod;
import com.subsidy.dto.contentVod.ContentVodDTO;
import com.subsidy.dto.vod.ChangeOrdersDTO;
import com.subsidy.service.ContentVodMappingService;
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 DengMin
* @since 2022-07-19
*/
@RestController
@Api(tags = "目录视频关系表")
@RequestMapping("/contentVodMapping")
public class ContentVodMappingController {
@Autowired
private ContentVodMappingService contentVodMappingService;
@PostMapping("getContendVods")
@ApiOperation("获取课程内容下的视频 {contentId vodName}")
@LoginRequired
public ResponseVO getContendVods(@RequestBody GetContendVodsDTO getContendVodsDTO) {
return ResponseData.generateCreatedResponse(0, contentVodMappingService.getContendVods(getContendVodsDTO));
}
@PostMapping("changeContentVodOrders")
@ApiOperation("课程内容视频排序 contentId/内容ID vodIds [] 视频的id")
public ResponseVO changeContentVodOrders(@RequestBody ChangeOrdersDTO changeOrdersDTO ){
contentVodMappingService.changeContentVodOrders(changeOrdersDTO);
return ResponseData.generateCreatedResponse(0);
}
@PostMapping("addContentVod")
@ApiOperation("添加课程内容视频:contentId/内容ID、vodIds [] /视频ID")
@LoginRequired
public ResponseVO addContentVod(@RequestBody AddContentVod addContentVod) {
contentVodMappingService.addContentVod(addContentVod);
return ResponseData.generateCreatedResponse(0);
}
@PostMapping("deleteContentVod")
@ApiOperation("删除课程内容下的视频: contentId/内容ID 、 vodId/视频ID")
@LoginRequired
public ResponseVO deleteContentVod(@RequestBody ContentVodDTO contentVodDTO) {
contentVodMappingService.deleteContentVod(contentVodDTO);
return ResponseData.generateCreatedResponse(0);
}
}
package com.subsidy.controller; package com.subsidy.controller;
import com.subsidy.common.ResponseData; import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO; import com.subsidy.common.ResponseVO;
import com.subsidy.common.interceptor.LoginRequired; import com.subsidy.common.interceptor.LoginRequired;
import com.subsidy.dto.content.GetContendVodsDTO;
import com.subsidy.dto.vod.ChangeOrdersDTO;
import com.subsidy.model.CourseContentDO; import com.subsidy.model.CourseContentDO;
import com.subsidy.service.CourseContentService; import com.subsidy.service.CourseContentService;
import com.subsidy.util.ConstantUtils; import com.subsidy.util.ConstantUtils;
...@@ -58,6 +59,4 @@ public class CourseContentController { ...@@ -58,6 +59,4 @@ public class CourseContentController {
public ResponseVO updateContent(@RequestBody CourseContentDO courseContentDO){ public ResponseVO updateContent(@RequestBody CourseContentDO courseContentDO){
return ResponseData.generateCreatedResponse(0,courseContentService.updateContent(courseContentDO)); return ResponseData.generateCreatedResponse(0,courseContentService.updateContent(courseContentDO));
} }
} }
package com.subsidy.controller; package com.subsidy.controller;
import com.subsidy.common.ResponseData; import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO; import com.subsidy.common.ResponseVO;
import com.subsidy.common.interceptor.LoginRequired; import com.subsidy.common.interceptor.LoginRequired;
import com.subsidy.dto.content.GetContendVodsDTO;
import com.subsidy.dto.vod.ChangeOrdersDTO; import com.subsidy.dto.vod.ChangeOrdersDTO;
import com.subsidy.model.VodDictDO; import com.subsidy.model.VodDictDO;
import com.subsidy.service.VodDictService; import com.subsidy.service.VodDictService;
...@@ -39,38 +37,35 @@ public class VodDictController { ...@@ -39,38 +37,35 @@ public class VodDictController {
return ResponseData.generateCreatedResponse(0, vodDictService.signature()); return ResponseData.generateCreatedResponse(0, vodDictService.signature());
} }
@PostMapping("getContendVods")
@ApiOperation("获取目录下的视频 {contentId vodName}")
@LoginRequired
public ResponseVO getContendVods(@RequestBody GetContendVodsDTO getContendVodsDTO) {
return ResponseData.generateCreatedResponse(0, vodDictService.getContendVods(getContendVodsDTO));
}
@PostMapping("deleteVod") @PostMapping("deleteVod")
@ApiOperation("删除视频 id ") @ApiOperation("删除视频 id ")
@LoginRequired @LoginRequired
public ResponseVO deleteVod(@RequestBody VodDictDO vodDictDO) { public ResponseVO deleteVod(@RequestBody VodDictDO vodDictDO) {
return ResponseData.generateCreatedResponse(0, vodDictService.deleteVod(vodDictDO)); vodDictService.deleteVod(vodDictDO);
return ResponseData.generateCreatedResponse(0);
} }
@PostMapping("addVod") @PostMapping("addVod")
@ApiOperation("新增视频 contentId vodName vodLength vodType vodSize vodUrl vodCode") @ApiOperation("新增视频 labelId vodName vodLength vodType vodSize vodUrl vodCode")
@LoginRequired @LoginRequired
public ResponseVO addVod(@RequestBody VodDictDO vodDictDO) { public ResponseVO addVod(@RequestBody VodDictDO vodDictDO) {
return ResponseData.generateCreatedResponse(0, vodDictService.addVod(vodDictDO)); vodDictService.addVod(vodDictDO);
return ResponseData.generateCreatedResponse(0, ConstantUtils.ADD_SUCCESS);
} }
@PostMapping("updateVod") @PostMapping("updateVod")
@ApiOperation("新增视频 id contentId vodName vodLength vodType vodSize vodUrl vodCode") @ApiOperation("新增视频 id labelId vodName vodLength vodType vodSize vodUrl vodCode")
@LoginRequired @LoginRequired
public ResponseVO updateVod(@RequestBody VodDictDO vodDictDO) { public ResponseVO updateVod(@RequestBody VodDictDO vodDictDO) {
return ResponseData.generateCreatedResponse(0, vodDictService.updateVod(vodDictDO)); vodDictService.updateVod(vodDictDO);
return ResponseData.generateCreatedResponse(0, ConstantUtils.SET_SUCCESS);
} }
@PostMapping("changeOrders") @PostMapping("changeOrders")
@ApiOperation("排序 vodIds [] 视频的id") @ApiOperation("排序 vodIds [] 视频的id")
public ResponseVO changeOrders(@RequestBody ChangeOrdersDTO changeOrdersDTO ){ public ResponseVO changeOrders(@RequestBody ChangeOrdersDTO changeOrdersDTO ){
return ResponseData.generateCreatedResponse(0,vodDictService.changeOrders(changeOrdersDTO)); vodDictService.changeOrders(changeOrdersDTO);
return ResponseData.generateCreatedResponse(0,ConstantUtils.SET_SUCCESS);
} }
} }
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.common.interceptor.LoginRequired;
import com.subsidy.dto.label.VodLabelPageDTO;
import com.subsidy.model.VodLabelDictDO;
import com.subsidy.service.VodLableDictService;
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 DengMin
* @since 2022-07-19
*/
@RestController
@Api(tags = "视频库类目表")
@RequestMapping("/vodLabelDict")
public class VodLabelDictController {
@Autowired
private VodLableDictService vodLableDictService;
@PostMapping(value = "addVodLabel")
@ApiOperation("添加视频类目: labelName/类目名称")
@LoginRequired
public ResponseVO addVodLabel(@RequestBody VodLabelDictDO vodLabelDictDO) {
vodLableDictService.save(vodLabelDictDO);
return ResponseData.generateCreatedResponse(0);
}
@PostMapping(value = "updateVodLabel")
@ApiOperation("添加视频类目: id/类目ID、labelName/类目名称")
@LoginRequired
public ResponseVO updateVodLabel(@RequestBody VodLabelDictDO vodLabelDictDO) {
vodLableDictService.updateById(vodLabelDictDO);
return ResponseData.generateCreatedResponse(0);
}
@PostMapping(value = "deleteVodLabel")
@ApiOperation("添加视频类目: id/类目ID")
@LoginRequired
public ResponseVO deleteVodLabel(@RequestBody VodLabelDictDO vodLabelDictDO) {
vodLableDictService.removeById(vodLabelDictDO.getId());
return ResponseData.generateCreatedResponse(0);
}
@PostMapping(value = "queryVodLabelPage")
@ApiOperation("分页查询视频类目: labelName/名称、pageNum/但前页数、pageSize/每页显示条数")
@LoginRequired
public ResponseVO queryVodLabelPage(@RequestBody VodLabelPageDTO vodLabelPageDTO) {
return ResponseData.generateCreatedResponse(0, vodLableDictService.queryVodLabelPage(vodLabelPageDTO));
}
@PostMapping(value = "queryVodLabel")
@ApiOperation("查询全部视频类目")
@LoginRequired
public ResponseVO queryVodLabel() {
return ResponseData.generateCreatedResponse(0, vodLableDictService.list());
}
}
package com.subsidy.dto.businessScope;
import lombok.Data;
@Data
public class BusinessScopeDTO {
private String businessScopeName;
private Integer pageNum;
private Integer pageSize;
}
package com.subsidy.dto.contentVod;
import lombok.Data;
import java.util.List;
@Data
public class AddContentVod {
private List<Long> vodIds;
private Long contentId;
}
package com.subsidy.dto.contentVod;
import lombok.Data;
@Data
public class ContentVodDTO {
private Long contentId;
private Long vodId;
}
package com.subsidy.dto.label;
import lombok.Data;
@Data
public class VodLabelPageDTO {
private String labelName;
private Integer pageNum;
private Integer pageSize;
}
...@@ -7,6 +7,8 @@ import java.util.List; ...@@ -7,6 +7,8 @@ import java.util.List;
@Data @Data
public class ChangeOrdersDTO { public class ChangeOrdersDTO {
private Long contentId;
private List<Long> vodIds; private List<Long> vodIds;
} }
package com.subsidy.mapper;
import com.subsidy.model.BusinessScopeDictDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
/**
* <p>
* 经营范围表 Mapper 接口
* </p>
*
* @author DengMin
* @since 2022-07-25
*/
@Repository
public interface BusinessScopeDictMapper extends BaseMapper<BusinessScopeDictDO> {
}
package com.subsidy.mapper;
import com.subsidy.model.ContentVodMappingDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
/**
* <p>
* 目录视频关系表 Mapper 接口
* </p>
*
* @author DengMin
* @since 2022-07-19
*/
@Repository
public interface ContentVodMappingMapper extends BaseMapper<ContentVodMappingDO> {
}
package com.subsidy.mapper;
import com.subsidy.model.VodLabelDictDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
/**
* <p>
* 视频库类目表 Mapper 接口
* </p>
*
* @author DengMin
* @since 2022-07-19
*/
@Repository
public interface VodLabelDictMapper extends BaseMapper<VodLabelDictDO> {
}
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 DengMin
* @since 2022-07-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("business_scope_dict")
public class BusinessScopeDictDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 经营范围名称
*/
private String businessScopeName;
}
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 DengMin
* @since 2022-07-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("content_vod_mapping")
public class ContentVodMappingDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 课程目录ID
*/
private Long contentId;
/**
* 视频ID
*/
private Long vodId;
/**
* 视频排序
*/
private Integer orderNo;
}
...@@ -26,9 +26,9 @@ public class VodDictDO extends BaseModel { ...@@ -26,9 +26,9 @@ public class VodDictDO extends BaseModel {
private Long id; private Long id;
/** /**
* 目录id * 类目id
*/ */
private Long contentId; private Long labelId;
/** /**
* 视频名称 * 视频名称
......
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 DengMin
* @since 2022-07-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("vod_label_dict")
public class VodLabelDictDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 视频类目名称
*/
private String labelName;
}
package com.subsidy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.dto.businessScope.BusinessScopeDTO;
import com.subsidy.model.BusinessScopeDictDO;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 经营范围表 服务类
* </p>
*
* @author DengMin
* @since 2022-07-25
*/
public interface BusinessScopeDictService extends IService<BusinessScopeDictDO> {
IPage queryBusinessScopePage(BusinessScopeDTO businessScopeDictDO);
}
package com.subsidy.service;
import com.subsidy.dto.content.GetContendVodsDTO;
import com.subsidy.dto.contentVod.AddContentVod;
import com.subsidy.dto.contentVod.ContentVodDTO;
import com.subsidy.dto.vod.ChangeOrdersDTO;
import com.subsidy.model.ContentVodMappingDO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.vo.vod.GetContendVodsVO;
import java.util.List;
/**
* <p>
* 目录视频关系表 服务类
* </p>
*
* @author DengMin
* @since 2022-07-19
*/
public interface ContentVodMappingService extends IService<ContentVodMappingDO> {
List<GetContendVodsVO> getContendVods(GetContendVodsDTO getContendVodsDTO);
void changeContentVodOrders(ChangeOrdersDTO changeOrdersDTO);
void deleteContentVod(ContentVodDTO contentVodDTO);
void addContentVod(AddContentVod addContentVod);
}
package com.subsidy.service; package com.subsidy.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.dto.content.GetContendVodsDTO;
import com.subsidy.dto.vod.ChangeOrdersDTO;
import com.subsidy.model.CourseContentDO; import com.subsidy.model.CourseContentDO;
import com.subsidy.vo.vod.GetContendVodsVO;
import java.util.List; import java.util.List;
......
package com.subsidy.service; package com.subsidy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.dto.content.GetContendVodsDTO;
import com.subsidy.dto.vod.ChangeOrdersDTO; import com.subsidy.dto.vod.ChangeOrdersDTO;
import com.subsidy.model.VodDictDO; import com.subsidy.model.VodDictDO;
import com.subsidy.vo.vod.GetContendVodsVO;
import com.subsidy.vo.vod.SignatureVO; import com.subsidy.vo.vod.SignatureVO;
import java.util.List;
/** /**
* <p> * <p>
* 视频表 服务类 * 视频表 服务类
...@@ -22,13 +17,11 @@ public interface VodDictService extends IService<VodDictDO> { ...@@ -22,13 +17,11 @@ public interface VodDictService extends IService<VodDictDO> {
SignatureVO signature()throws Exception; SignatureVO signature()throws Exception;
List<GetContendVodsVO> getContendVods(GetContendVodsDTO getContendVodsDTO); void deleteVod(VodDictDO vodDictDO);
String deleteVod(VodDictDO vodDictDO);
String addVod(VodDictDO vodDictDO); void addVod(VodDictDO vodDictDO);
String updateVod(VodDictDO vodDictDO); void updateVod(VodDictDO vodDictDO);
String changeOrders(ChangeOrdersDTO changeOrdersDTO); void changeOrders(ChangeOrdersDTO changeOrdersDTO);
} }
package com.subsidy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.dto.label.VodLabelPageDTO;
import com.subsidy.model.VodLabelDictDO;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 视频库类目表 服务类
* </p>
*
* @author DengMin
* @since 2022-07-19
*/
public interface VodLableDictService extends IService<VodLabelDictDO> {
IPage<VodLabelDictDO> queryVodLabelPage(VodLabelPageDTO vodLabelPageDTO);
}
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.businessScope.BusinessScopeDTO;
import com.subsidy.model.BusinessScopeDictDO;
import com.subsidy.mapper.BusinessScopeDictMapper;
import com.subsidy.service.BusinessScopeDictService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
/**
* <p>
* 经营范围表 服务实现类
* </p>
*
* @author DengMin
* @since 2022-07-25
*/
@Service
public class BusinessScopeDictServiceImpl extends ServiceImpl<BusinessScopeDictMapper, BusinessScopeDictDO> implements BusinessScopeDictService {
@Override
public IPage queryBusinessScopePage(BusinessScopeDTO businessScopeDictDO) {
Page page = new Page(businessScopeDictDO.getPageNum(), businessScopeDictDO.getPageSize());
return this.baseMapper.selectPage(page, new QueryWrapper<BusinessScopeDictDO>()
.lambda()
.like(StringUtils.isNotBlank(businessScopeDictDO.getBusinessScopeName()), BusinessScopeDictDO::getBusinessScopeName, businessScopeDictDO.getBusinessScopeName()));
}
}
package com.subsidy.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.subsidy.common.exception.HttpException;
import com.subsidy.dto.content.GetContendVodsDTO;
import com.subsidy.dto.contentVod.AddContentVod;
import com.subsidy.dto.contentVod.ContentVodDTO;
import com.subsidy.dto.vod.ChangeOrdersDTO;
import com.subsidy.mapper.VodDictMapper;
import com.subsidy.model.ContentVodMappingDO;
import com.subsidy.mapper.ContentVodMappingMapper;
import com.subsidy.service.ContentVodMappingService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.vo.vod.GetContendVodsVO;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 目录视频关系表 服务实现类
* </p>
*
* @author DengMin
* @since 2022-07-19
*/
@Service
public class ContentVodMappingServiceImpl extends ServiceImpl<ContentVodMappingMapper, ContentVodMappingDO> implements ContentVodMappingService {
@Autowired
private VodDictMapper vodDictMapper;
@Override
public List<GetContendVodsVO> getContendVods(GetContendVodsDTO getContendVodsDTO) {
return vodDictMapper.getContendVods( getContendVodsDTO.getVodName(), getContendVodsDTO.getContentId());
}
@Override
public void changeContentVodOrders(ChangeOrdersDTO changeOrdersDTO){
if(CollectionUtils.isNotEmpty(changeOrdersDTO.getVodIds())) {
for (int i = 0; i < changeOrdersDTO.getVodIds().size(); i++) {
ContentVodMappingDO contentVodMappingDO = this.baseMapper.selectOne(new QueryWrapper<ContentVodMappingDO>().lambda()
.eq(ContentVodMappingDO::getContentId, changeOrdersDTO.getContentId())
.eq(ContentVodMappingDO::getVodId, changeOrdersDTO.getVodIds().get(i)));
ContentVodMappingDO contentVodMapping = new ContentVodMappingDO();
contentVodMapping.setId(contentVodMappingDO.getId());
contentVodMapping.setOrderNo(i+1);
this.baseMapper.updateById(contentVodMapping);
}
}
}
@Override
public void deleteContentVod(ContentVodDTO contentVodDTO) {
ContentVodMappingDO contentVodMappingDO = this.baseMapper.selectOne(new QueryWrapper<ContentVodMappingDO>()
.lambda()
.eq(ContentVodMappingDO::getContentId, contentVodDTO.getContentId())
.eq(ContentVodMappingDO::getVodId, contentVodDTO.getVodId()));
if(contentVodMappingDO == null) {
throw new HttpException(18001);
}
this.baseMapper.deleteById(contentVodMappingDO.getId());
}
@Override
public void addContentVod(AddContentVod addContentVod) {
if(CollectionUtils.isNotEmpty(addContentVod.getVodIds())) {
List<ContentVodMappingDO> list = this.baseMapper.selectList(new QueryWrapper<ContentVodMappingDO>()
.lambda()
.eq(ContentVodMappingDO::getContentId, addContentVod.getContentId()));
if(CollectionUtils.isNotEmpty(list)) {
this.baseMapper.deleteBatchIds(list.stream().map(ContentVodMappingDO::getId).collect(Collectors.toList()));
}
for (int i = 0; i < addContentVod.getVodIds().size(); i++) {
ContentVodMappingDO contentVodMappingDO = new ContentVodMappingDO();
contentVodMappingDO.setContentId(addContentVod.getContentId());
contentVodMappingDO.setVodId(addContentVod.getVodIds().get(i));
contentVodMappingDO.setOrderNo(i+1);
this.baseMapper.insert(contentVodMappingDO);
}
}
}
}
...@@ -7,9 +7,7 @@ import com.subsidy.mapper.CourseContentMapper; ...@@ -7,9 +7,7 @@ import com.subsidy.mapper.CourseContentMapper;
import com.subsidy.model.CourseContentDO; import com.subsidy.model.CourseContentDO;
import com.subsidy.service.CourseContentService; import com.subsidy.service.CourseContentService;
import com.subsidy.util.ConstantUtils; import com.subsidy.util.ConstantUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
/** /**
...@@ -23,6 +21,7 @@ import java.util.List; ...@@ -23,6 +21,7 @@ import java.util.List;
@Service @Service
public class CourseContentServiceImpl extends ServiceImpl<CourseContentMapper, CourseContentDO> implements CourseContentService { public class CourseContentServiceImpl extends ServiceImpl<CourseContentMapper, CourseContentDO> implements CourseContentService {
@Override
public List<CourseContentDO> getContents(CourseContentDO courseContentDO) { public List<CourseContentDO> getContents(CourseContentDO courseContentDO) {
return this.baseMapper.selectList(new QueryWrapper<CourseContentDO>() return this.baseMapper.selectList(new QueryWrapper<CourseContentDO>()
.lambda() .lambda()
...@@ -31,11 +30,13 @@ public class CourseContentServiceImpl extends ServiceImpl<CourseContentMapper, C ...@@ -31,11 +30,13 @@ public class CourseContentServiceImpl extends ServiceImpl<CourseContentMapper, C
.orderByAsc(CourseContentDO::getCreateDate)); .orderByAsc(CourseContentDO::getCreateDate));
} }
@Override
public String deleteContent(CourseContentDO courseContentDO){ public String deleteContent(CourseContentDO courseContentDO){
this.baseMapper.deleteById(courseContentDO.getId()); this.baseMapper.deleteById(courseContentDO.getId());
return ConstantUtils.DELETE_SUCCESS; return ConstantUtils.DELETE_SUCCESS;
} }
@Override
public String addContent(CourseContentDO courseContentDO){ public String addContent(CourseContentDO courseContentDO){
Integer orderNoTmp = this.baseMapper.selectMaxOrderNo(courseContentDO.getCourseId()); Integer orderNoTmp = this.baseMapper.selectMaxOrderNo(courseContentDO.getCourseId());
...@@ -50,6 +51,7 @@ public class CourseContentServiceImpl extends ServiceImpl<CourseContentMapper, C ...@@ -50,6 +51,7 @@ public class CourseContentServiceImpl extends ServiceImpl<CourseContentMapper, C
return ConstantUtils.ADD_SUCCESS; return ConstantUtils.ADD_SUCCESS;
} }
@Override
public String updateContent(CourseContentDO courseContentDO){ public String updateContent(CourseContentDO courseContentDO){
int count = this.baseMapper.selectCount(new QueryWrapper<CourseContentDO>() int count = this.baseMapper.selectCount(new QueryWrapper<CourseContentDO>()
......
...@@ -9,23 +9,15 @@ import com.subsidy.dto.vod.ChangeOrdersDTO; ...@@ -9,23 +9,15 @@ import com.subsidy.dto.vod.ChangeOrdersDTO;
import com.subsidy.mapper.VodDictMapper; import com.subsidy.mapper.VodDictMapper;
import com.subsidy.model.VodDictDO; import com.subsidy.model.VodDictDO;
import com.subsidy.service.VodDictService; import com.subsidy.service.VodDictService;
import com.subsidy.util.ConstantUtils;
import com.subsidy.util.Signature; import com.subsidy.util.Signature;
import com.subsidy.util.VodUtil;
import com.subsidy.vo.vod.GetContendVodsVO; import com.subsidy.vo.vod.GetContendVodsVO;
import com.subsidy.vo.vod.SignatureVO; import com.subsidy.vo.vod.SignatureVO;
import com.tencentcloudapi.common.Credential; import org.apache.commons.collections.CollectionUtils;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.vod.v20180717.VodClient;
import com.tencentcloudapi.vod.v20180717.models.DeleteMediaRequest;
import com.tencentcloudapi.vod.v20180717.models.MediaProcessTaskInput;
import com.tencentcloudapi.vod.v20180717.models.ProcessMediaRequest;
import com.tencentcloudapi.vod.v20180717.models.TranscodeTaskInput;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
...@@ -46,6 +38,7 @@ public class VodDictServiceImpl extends ServiceImpl<VodDictMapper, VodDictDO> im ...@@ -46,6 +38,7 @@ public class VodDictServiceImpl extends ServiceImpl<VodDictMapper, VodDictDO> im
@Value("${spring.profiles.active}") @Value("${spring.profiles.active}")
private String env; private String env;
@Override
public SignatureVO signature() { public SignatureVO signature() {
SignatureVO signatureVO = new SignatureVO(); SignatureVO signatureVO = new SignatureVO();
...@@ -66,52 +59,30 @@ public class VodDictServiceImpl extends ServiceImpl<VodDictMapper, VodDictDO> im ...@@ -66,52 +59,30 @@ public class VodDictServiceImpl extends ServiceImpl<VodDictMapper, VodDictDO> im
return signatureVO; return signatureVO;
} }
public List<GetContendVodsVO> getContendVods(GetContendVodsDTO getContendVodsDTO) { @Override
//Page pager = new Page(getContendVodsDTO.getPageNum(), getContendVodsDTO.getPageSize()); @Transactional(rollbackFor = Exception.class)
return this.baseMapper.getContendVods( getContendVodsDTO.getVodName(), getContendVodsDTO.getContentId()); public void deleteVod(VodDictDO vodDictDO) {
} VodDictDO vod = this.baseMapper.selectById(vodDictDO.getId());
if(null == vod) {
public String deleteVod(VodDictDO vodDictDO) { throw new HttpException(18000);
VodDictDO vodDictDO1 = this.baseMapper.selectById(vodDictDO.getId());
this.baseMapper.deleteById(vodDictDO.getId());
try {
//删除原视频
Credential cred = new Credential(vodConfig.getSecretId(), vodConfig.getSecretKey());
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("vod.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
VodClient client = new VodClient(cred, "", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
DeleteMediaRequest req = new DeleteMediaRequest();
req.setFileId(vodDictDO1.getVodCode());
// 返回的resp是一个DeleteMediaResponse的实例,与请求对象对应
client.DeleteMedia(req);
} catch (TencentCloudSDKException e) {
} }
this.baseMapper.deleteById(vodDictDO.getId());
return ConstantUtils.DELETE_SUCCESS; VodUtil.deleteMedia(vodDictDO.getVodCode());
} }
public String addVod(VodDictDO vodDictDO) { @Override
public void addVod(VodDictDO vodDictDO) {
//排序 int orderNo = 1;//排序
int orderNo = 1;
List<VodDictDO> vodDictDOS = this.baseMapper.selectList(new QueryWrapper<VodDictDO>() List<VodDictDO> vodDictDOS = this.baseMapper.selectList(new QueryWrapper<VodDictDO>()
.lambda() .lambda()
.eq(VodDictDO::getContentId,vodDictDO.getContentId()) .eq(VodDictDO::getLabelId, vodDictDO.getLabelId())
.orderByDesc(VodDictDO::getOrderNo)); .orderByDesc(VodDictDO::getOrderNo));
if (vodDictDOS.size()>0){ if (CollectionUtils.isNotEmpty(vodDictDOS)){
VodDictDO vodDictDO1 = vodDictDOS.get(0); VodDictDO vod = vodDictDOS.get(0);
if (null!=vodDictDO1){ if (null != vod){
orderNo = vodDictDOS.get(0).getOrderNo()+1; orderNo = vod.getOrderNo() + 1;
} }
} }
vodDictDO.setOrderNo(orderNo); vodDictDO.setOrderNo(orderNo);
...@@ -119,49 +90,22 @@ public class VodDictServiceImpl extends ServiceImpl<VodDictMapper, VodDictDO> im ...@@ -119,49 +90,22 @@ public class VodDictServiceImpl extends ServiceImpl<VodDictMapper, VodDictDO> im
//测试环境就不转码了 //测试环境就不转码了
if (env.equals("prod")){ if (env.equals("prod")){
//上传后直接转码 VodUtil.processMedia(vodDictDO.getVodCode());
Credential cred = new Credential(vodConfig.getSecretId(), vodConfig.getSecretKey());
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("vod.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
VodClient client = new VodClient(cred, "", clientProfile);
ProcessMediaRequest processMediaRequest = new ProcessMediaRequest();
MediaProcessTaskInput mediaProcessTaskInput1 = new MediaProcessTaskInput();
TranscodeTaskInput[] transcodeTaskInputs1 = new TranscodeTaskInput[1];
TranscodeTaskInput transcodeTaskInput1 = new TranscodeTaskInput();
transcodeTaskInput1.setDefinition(ConstantUtils.TEMPLATE_VOD);
transcodeTaskInputs1[0] = transcodeTaskInput1;
mediaProcessTaskInput1.setTranscodeTaskSet(transcodeTaskInputs1);
processMediaRequest.setMediaProcessTask(mediaProcessTaskInput1);
processMediaRequest.setFileId(vodDictDO.getVodCode());
try {
client.ProcessMedia(processMediaRequest);
} catch (Exception ex) {
throw new HttpException(50001);
}
} }
return ConstantUtils.ADD_SUCCESS;
} }
public String updateVod(VodDictDO vodDictDO) { @Override
public void updateVod(VodDictDO vodDictDO) {
this.baseMapper.updateById(vodDictDO); this.baseMapper.updateById(vodDictDO);
return ConstantUtils.SET_SUCCESS;
} }
public String changeOrders(ChangeOrdersDTO changeOrdersDTO){ @Override
public void changeOrders(ChangeOrdersDTO changeOrdersDTO){
int i = 1 ; int i = 1 ;
List<Long> longs = changeOrdersDTO.getVodIds(); List<Long> longs = changeOrdersDTO.getVodIds();
for (Long lg : longs){ for (Long lg : longs){
this.baseMapper.updateVodOrderNo(lg,i++); this.baseMapper.updateVodOrderNo(lg,i++);
} }
return ConstantUtils.SET_SUCCESS;
} }
} }
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.label.VodLabelPageDTO;
import com.subsidy.model.VodLabelDictDO;
import com.subsidy.mapper.VodLabelDictMapper;
import com.subsidy.service.VodLableDictService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
/**
* <p>
* 视频库类目表 服务实现类
* </p>
*
* @author DengMin
* @since 2022-07-19
*/
@Service
public class VodLabelDictServiceImpl extends ServiceImpl<VodLabelDictMapper, VodLabelDictDO> implements VodLableDictService {
@Override
public IPage<VodLabelDictDO> queryVodLabelPage(VodLabelPageDTO vodLabelPageDTO) {
Page page = new Page(vodLabelPageDTO.getPageNum(), vodLabelPageDTO.getPageSize());
return this.baseMapper.selectPage(page, new QueryWrapper<VodLabelDictDO>()
.lambda().like(StringUtils.isNotBlank(vodLabelPageDTO.getLabelName()),
VodLabelDictDO::getLabelName, vodLabelPageDTO.getLabelName()));
}
}
package com.subsidy.util;
import com.subsidy.common.configure.VODConfig;
import com.subsidy.common.exception.HttpException;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.cvm.v20170312.models.DescribeZonesResponse;
import com.tencentcloudapi.vod.v20180717.VodClient;
import com.tencentcloudapi.vod.v20180717.models.DeleteMediaRequest;
import com.tencentcloudapi.vod.v20180717.models.MediaProcessTaskInput;
import com.tencentcloudapi.vod.v20180717.models.ProcessMediaRequest;
import com.tencentcloudapi.vod.v20180717.models.ProcessMediaResponse;
import com.tencentcloudapi.vod.v20180717.models.TranscodeTaskInput;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
public class VodUtil {
@Autowired
private static VODConfig vodConfig;
private static String endpoint = "vod.tencentcloudapi.com";
/**
* 根据视频模版进行转码
* @param vodCode
* @return
*/
public static ProcessMediaResponse processMedia(String vodCode) {
try {
//上传后直接转码
Credential cred = new Credential(vodConfig.getSecretId(), vodConfig.getSecretKey());
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint(endpoint);
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
VodClient client = new VodClient(cred, "", clientProfile);
ProcessMediaRequest processMediaRequest = new ProcessMediaRequest();
MediaProcessTaskInput mediaProcessTaskInput1 = new MediaProcessTaskInput();
TranscodeTaskInput[] transcodeTaskInputs1 = new TranscodeTaskInput[1];
TranscodeTaskInput transcodeTaskInput1 = new TranscodeTaskInput();
transcodeTaskInput1.setDefinition(ConstantUtils.TEMPLATE_VOD);
transcodeTaskInputs1[0] = transcodeTaskInput1;
mediaProcessTaskInput1.setTranscodeTaskSet(transcodeTaskInputs1);
processMediaRequest.setMediaProcessTask(mediaProcessTaskInput1);
processMediaRequest.setFileId(vodCode);
return client.ProcessMedia(processMediaRequest);
} catch (Exception ex) {
throw new HttpException(50001);
}
}
/**
* 删除腾讯云上原视频
* @param vodCode
*/
public static void deleteMedia(String vodCode) {
try {
//删除原视频
Credential cred = new Credential(vodConfig.getSecretId(), vodConfig.getSecretKey());
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint(endpoint);
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
VodClient client = new VodClient(cred, "", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
DeleteMediaRequest req = new DeleteMediaRequest();
req.setFileId(vodCode);
// 返回的resp是一个DeleteMediaResponse的实例,与请求对象对应
client.DeleteMedia(req);
} catch (TencentCloudSDKException e) {
}
}
}
package com.subsidy.util.websocket; package com.subsidy.util.websocket;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.subsidy.common.ResponseData;
import com.subsidy.mapper.OprMemDictMapper; import com.subsidy.mapper.OprMemDictMapper;
import com.subsidy.model.OprMemDictDO; import com.subsidy.model.OprMemDictDO;
import com.subsidy.util.DateFormatUtil; import com.subsidy.util.DateFormatUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -11,8 +15,15 @@ import org.springframework.web.socket.TextMessage; ...@@ -11,8 +15,15 @@ import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage; import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/** /**
* <p> * <p>
...@@ -32,19 +43,52 @@ public class WebSocketUtil implements WebSocketHandler { ...@@ -32,19 +43,52 @@ public class WebSocketUtil implements WebSocketHandler {
/** /**
* 存放建立连接webSocket对象 * 存放建立连接webSocket对象
*/ */
private static CopyOnWriteArraySet<WebSocketSession> webSocketMap = new CopyOnWriteArraySet<>(); private ConcurrentHashMap<Long, WebSocketSession> webSocketMap = new ConcurrentHashMap();
ConcurrentHashMap<String, ScheduledFuture> taskMap = new ConcurrentHashMap<>(1);
/** /**
* 处理成功连接WebSocket * 处理成功连接WebSocket
* @param session * @param session
*/ */
@Override @Override
public void afterConnectionEstablished(WebSocketSession session) { public void afterConnectionEstablished(WebSocketSession session) throws IOException {
if(null != session) { if(null != session) {
if(webSocketMap.contains(session)) { String params = session.getUri().getQuery();
webSocketMap.remove(session); Long id = Long.valueOf(params.split("=")[1]);
if(null != webSocketMap && webSocketMap.get(id) != null) {
if(webSocketMap.get(id).isOpen()) {
/*
相同账户进行挤号,发送消息给前者WebSocket通知账户已在其他地方登录
*/
webSocketMap.get(id).sendMessage(new TextMessage(JSONObject.toJSONString(ResponseData.generateCreatedResponse(1011))));
webSocketMap.get(id).close();
} else {
/*
* 如果上次连接的WebSocket状态是关闭,并且上一次记录时间大于60秒的,则判断为这次登陆是免密码登陆的重新记录上线时间
*/
List<OprMemDictDO> list = oprMemDictMapper.selectList(new QueryWrapper<OprMemDictDO>()
.lambda()
.eq(OprMemDictDO::getUserId, id)
.orderByDesc(OprMemDictDO::getCreateDate));
Calendar calendar = Calendar.getInstance();
calendar.setTime(DateFormatUtil.localDateTimeToDate(list.get(0).getCreateDate()));
calendar.add(Calendar.SECOND,60);
if(calendar.getTime().after(DateFormatUtil.localDateTimeToDate(list.get(0).getCreateDate()))) {
if(list.get(0).getOprType().equals("登出")) {
OprMemDictDO oprMemDictDO = new OprMemDictDO();
oprMemDictDO.setUserId(id);
oprMemDictDO.setResult(1);
oprMemDictDO.setOprType("登录");
oprMemDictDO.setIpAddress(session.getRemoteAddress().getHostName());
oprMemDictMapper.insert(oprMemDictDO);
}
}
}
webSocketMap.remove(id);
} }
webSocketMap.add(session); webSocketMap.put(id, session);
String httpSessionId = session.getId(); String httpSessionId = session.getId();
String host = session.getUri().getHost(); String host = session.getUri().getHost();
...@@ -67,7 +111,9 @@ public class WebSocketUtil implements WebSocketHandler { ...@@ -67,7 +111,9 @@ public class WebSocketUtil implements WebSocketHandler {
session.close(); session.close();
} }
webSocketMap.remove(session); String params = session.getUri().getQuery();
Long id = Long.valueOf(params.split("=")[1]);
webSocketMap.remove(id);
log.error("<---- webSocket transport error"); log.error("<---- webSocket transport error");
log.error("error message: {}", throwable.getMessage()); log.error("error message: {}", throwable.getMessage());
} }
...@@ -79,24 +125,49 @@ public class WebSocketUtil implements WebSocketHandler { ...@@ -79,24 +125,49 @@ public class WebSocketUtil implements WebSocketHandler {
* @throws Exception * @throws Exception
*/ */
@Override @Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception{
if(null != session) { if(null != session) {
webSocketMap.remove(session); /*
断开连接后不会马上判断为下线状态,而是进入60秒的心跳检测机制,如果60秒内没有进行重连,则判断为下线,记录下线时间和状态
OprMemDictDO oprMemDictDO = new OprMemDictDO(); */
String params = session.getUri().getQuery(); if(null != webSocketMap) {
String[] id = params.split("="); String params = session.getUri().getQuery();
oprMemDictDO.setUserId(Long.valueOf(id[1])); Long id = Long.valueOf(params.split("=")[1]);
oprMemDictDO.setOprType("登出"); heartbeat(webSocketMap.get(id));
oprMemDictDO.setIpAddress(session.getRemoteAddress().getHostName()); }
oprMemDictMapper.insert(oprMemDictDO);
System.out.println("<---- webSocket is close");
log.info("<---- webSocket is close"); log.info("<---- webSocket is close");
log.info("session {} close, status: {}", session.getId(), closeStatus); log.info("session {} close, status: {}", session.getId(), closeStatus);
} }
} }
/** /**
* 断开连接后60秒后进行判断是否重新连接了,如果没有连接成功则判断为下线
*
* @param session
*/
public void heartbeat(WebSocketSession session) {
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
ScheduledFuture scheduledFuture = service.scheduleAtFixedRate(new Runnable() {
@SneakyThrows
@Override
public void run() {
if(null != session && !session.isOpen()) {
String params = session.getUri().getQuery();
Long id = Long.valueOf(params.split("=")[1]);
OprMemDictDO oprMemDictDO = new OprMemDictDO();
oprMemDictDO.setUserId(id);
oprMemDictDO.setResult(1);
oprMemDictDO.setOprType("登出");
oprMemDictDO.setIpAddress(session.getRemoteAddress().getHostName());
oprMemDictMapper.insert(oprMemDictDO);
taskMap.get(session.getId()).cancel(true);
}
}
}, 1, 1, TimeUnit.MINUTES);
taskMap.put(session.getId(), scheduledFuture);
}
/**
* 接收WebSocket客户端Message * 接收WebSocket客户端Message
* @param session * @param session
* @param message * @param message
......
...@@ -64,6 +64,7 @@ meishu.code-message[16001]=该条件已存在 ...@@ -64,6 +64,7 @@ meishu.code-message[16001]=该条件已存在
meishu.code-message[17001]=系统不支持00:00:00~06:00:00学习 meishu.code-message[17001]=系统不支持00:00:00~06:00:00学习
meishu.code-message[18000]=视频不存在
meishu.code-message[18001]=删除失败,目录下没有该视频
<?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.BusinessScopeDictMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.BusinessScopeDictDO">
<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="business_scope_name" property="businessScopeName" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, business_scope_name
</sql>
</mapper>
...@@ -60,13 +60,15 @@ ...@@ -60,13 +60,15 @@
FROM FROM
class_dict t class_dict t
LEFT JOIN course_content t2 ON t.course_id = t2.course_id LEFT JOIN course_content t2 ON t.course_id = t2.course_id
LEFT JOIN vod_dict t3 ON t2.id = t3.content_id LEFT JOIN content_vod_mapping t4 ON t4.content_id = t2.id
LEFT JOIN vod_dict t3 ON t3.id = t4.vod_id
WHERE WHERE
t.delete_date IS NULL t.delete_date IS NULL
AND t2.delete_date IS NULL AND t2.delete_date IS NULL
AND t3.delete_date IS NULL AND t3.delete_date IS NULL
and t3.id is not null AND t4.delete_date IS NULL
and t.id = #{classId} AND t3.id IS NOT NULL
AND t.id = #{classId}
</select> </select>
<select id="getSpareMembers" parameterType="com.subsidy.dto.classDict.GetSpareMembersDTO" <select id="getSpareMembers" parameterType="com.subsidy.dto.classDict.GetSpareMembersDTO"
......
<?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.ContentVodMappingMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.ContentVodMappingDO">
<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="content_id" property="contentId" />
<result column="vod_id" property="vodId" />
<result column="order_no" property="orderNo" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, content_id, vod_id, order_no
</sql>
</mapper>
...@@ -66,6 +66,7 @@ ...@@ -66,6 +66,7 @@
t4.play_record t4.play_record
FROM FROM
vod_dict t vod_dict t
LEFT JOIN content_vod_mapping cvm ON cvm.vod_id = t.id
LEFT JOIN ( LEFT JOIN (
SELECT SELECT
t.vod_id, t.vod_id,
...@@ -74,9 +75,9 @@ ...@@ -74,9 +75,9 @@
FROM FROM
vod_play_history t vod_play_history t
WHERE WHERE
t.delete_date is null t.delete_date IS NULL
and t.member_id = #{memberId} AND t.member_id = #{memberId}
and t.class_id = #{classId} AND t.class_id = #{classId}
GROUP BY GROUP BY
t.vod_id, t.vod_id,
t.member_id, t.member_id,
...@@ -109,8 +110,9 @@ ...@@ -109,8 +110,9 @@
AND t.create_date = t2.create_date AND t.create_date = t2.create_date
) t4 ON t2.vod_id = t4.vod_id ) t4 ON t2.vod_id = t4.vod_id
WHERE WHERE
t.delete_date is null t.delete_date IS NULL
and t.content_id = #{contentId} AND cvm.delete_date IS NULL
and cvm.content_id = #{contentId}
) t3 ) t3
ORDER BY ORDER BY
t3.order_no t3.order_no
......
...@@ -113,10 +113,12 @@ ...@@ -113,10 +113,12 @@
count( t2.id ) count( t2.id )
FROM FROM
course_content t1 course_content t1
LEFT JOIN vod_dict t2 ON t1.id = t2.content_id LEFT JOIN content_vod_mapping t3 ON t3.content_id = t1.id
LEFT JOIN vod_dict t2 ON t2.id = t3.vod_id
WHERE WHERE
t1.delete_date IS NULL t1.delete_date IS NULL
AND t2.delete_date IS NULL AND t2.delete_date IS NULL
AND t3.delete_date IS NULL
AND t1.course_id = #{courseId} AND t1.course_id = #{courseId}
</select> </select>
...@@ -125,10 +127,12 @@ ...@@ -125,10 +127,12 @@
sum( t2.vod_length ) sum( t2.vod_length )
FROM FROM
course_content t1 course_content t1
LEFT JOIN vod_dict t2 ON t1.id = t2.content_id LEFT JOIN content_vod_mapping t3 ON t3.content_id = t1.id
LEFT JOIN vod_dict t2 ON t2.id = t3.content_id
WHERE WHERE
t1.delete_date IS NULL t1.delete_date IS NULL
AND t2.delete_date IS NULL AND t2.delete_date IS NULL
AND t3.delete_date IS NULL
AND t1.course_id = #{courseId} AND t1.course_id = #{courseId}
</select> </select>
......
...@@ -93,11 +93,13 @@ ...@@ -93,11 +93,13 @@
count( 1 ) AS cnt count( 1 ) AS cnt
FROM FROM
course_content t course_content t
LEFT JOIN vod_dict t2 ON t.id = t2.content_id LEFT JOIN content_vod_mapping t3 ON t3.content_id = t.id
LEFT JOIN vod_dict t2 ON t.id = t3.vod_id
WHERE WHERE
t.delete_date IS NULL t.delete_date IS NULL
AND t2.delete_date IS NULL AND t2.delete_date IS NULL
and t2.id is not null AND t3.delete_date IS NULL
AND t2.id IS NOT NULL
GROUP BY GROUP BY
t.course_id t.course_id
) t4 ON t3.id = t4.course_id ) t4 ON t3.id = t4.course_id
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<result column="create_date" property="createDate" /> <result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" /> <result column="update_date" property="updateDate" />
<result column="delete_date" property="deleteDate" /> <result column="delete_date" property="deleteDate" />
<result column="content_id" property="contentId" /> <result column="label_id" property="labelId" />
<result column="vod_name" property="vodName" /> <result column="vod_name" property="vodName" />
<result column="vod_length" property="vodLength" /> <result column="vod_length" property="vodLength" />
<result column="vod_type" property="vodType" /> <result column="vod_type" property="vodType" />
...@@ -22,13 +22,13 @@ ...@@ -22,13 +22,13 @@
create_date, create_date,
update_date, update_date,
delete_date, delete_date,
id, content_id, vod_name, vod_length, vod_type, vod_size, vod_url, vod_code id, label_id, vod_name, vod_length, vod_type, vod_size, vod_url, vod_code
</sql> </sql>
<select id="getContendVods" resultType="com.subsidy.vo.vod.GetContendVodsVO"> <select id="getContendVods" resultType="com.subsidy.vo.vod.GetContendVodsVO">
SELECT SELECT
t.id, t.id,
t.content_id, t.label_id,
t.vod_name, t.vod_name,
t.vod_length, t.vod_length,
t.vod_type, t.vod_type,
...@@ -41,15 +41,17 @@ ...@@ -41,15 +41,17 @@
t.vod_code t.vod_code
FROM FROM
vod_dict t vod_dict t
LEFT JOIN course_content t2 ON t.content_id = t2.id LEFT JOIN content_vod_mapping t3 ON t3.vod_id = t.id
LEFT JOIN course_content t2 ON t3.content_id = t2.id
WHERE WHERE
t.delete_date IS NULL t.delete_date IS NULL
AND t2.delete_date IS NULL AND t2.delete_date IS NULL
AND t3.delete_date IS NULL
AND t.content_id = #{contentId} AND t.content_id = #{contentId}
<if test="vodName != null and vodName !=''"> <if test="vodName != null and vodName !=''">
and vod_name like concat('%',#{vodName} ,'%') and vod_name like concat('%',#{vodName} ,'%')
</if> </if>
order by t2.order_no,t.order_no order by t3.order_no, t2.order_no, t.order_no
</select> </select>
<select id="getCourseVods" parameterType="long" resultType="com.subsidy.model.VodDictDO"> <select id="getCourseVods" parameterType="long" resultType="com.subsidy.model.VodDictDO">
...@@ -59,16 +61,18 @@ ...@@ -59,16 +61,18 @@
t2.vod_length t2.vod_length
FROM FROM
course_content t course_content t
LEFT JOIN vod_dict t2 ON t.id = t2.content_id LEFT JOIN content_vod_mapping t3 ON t3.content_id = t.id
LEFT JOIN vod_dict t2 ON t2.id = t3.vod_id
WHERE WHERE
t.delete_date IS NULL t.delete_date IS NULL
AND t2.delete_date IS NULL AND t2.delete_date IS NULL
and t2.id is not null AND t3.delete_date IS NULL
and t2.id IS NOT NULL
and t.course_id = #{courseId} and t.course_id = #{courseId}
<if test="vodName != null and vodName !=''"> <if test="vodName != null and vodName !=''">
and t2.vod_name like concat('%',#{vodName} ,'%') and t2.vod_name like concat('%',#{vodName} ,'%')
</if> </if>
order by t.id,t2.order_no order by t.id, t3.order_no, t2.order_no
</select> </select>
<select id="classVodCompleteInfo" resultType="com.subsidy.vo.vod.ClassVodCompleteInfoVO"> <select id="classVodCompleteInfo" resultType="com.subsidy.vo.vod.ClassVodCompleteInfoVO">
......
<?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.VodLabelDictMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.VodLabelDictDO">
<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="label_name" property="labelName" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, label_name
</sql>
</mapper>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!