Commit a3bbd3a0 by 邓敏

视频库、经营范围

1 parent 2c9d89b2
Showing with 971 additions and 156 deletions
......@@ -32,6 +32,7 @@
<itextpdf.version>5.4.1</itextpdf.version>
<java-jwt.version>3.10.3</java-jwt.version>
<jedis.version>3.3.0</jedis.version>
<collections.version>3.2.2</collections.version>
</properties>
<dependencies>
......@@ -208,6 +209,12 @@
<version>${jedis.version}</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${collections.version}</version>
</dependency>
<!--webSocket-->
<dependency>
<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;
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.vod.ChangeOrdersDTO;
import com.subsidy.model.CourseContentDO;
import com.subsidy.service.CourseContentService;
import com.subsidy.util.ConstantUtils;
......@@ -58,6 +59,4 @@ public class CourseContentController {
public ResponseVO updateContent(@RequestBody CourseContentDO courseContentDO){
return ResponseData.generateCreatedResponse(0,courseContentService.updateContent(courseContentDO));
}
}
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.vod.ChangeOrdersDTO;
import com.subsidy.model.VodDictDO;
import com.subsidy.service.VodDictService;
......@@ -39,38 +37,35 @@ public class VodDictController {
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")
@ApiOperation("删除视频 id ")
@LoginRequired
public ResponseVO deleteVod(@RequestBody VodDictDO vodDictDO) {
return ResponseData.generateCreatedResponse(0, vodDictService.deleteVod(vodDictDO));
vodDictService.deleteVod(vodDictDO);
return ResponseData.generateCreatedResponse(0);
}
@PostMapping("addVod")
@ApiOperation("新增视频 contentId vodName vodLength vodType vodSize vodUrl vodCode")
@ApiOperation("新增视频 labelId vodName vodLength vodType vodSize vodUrl vodCode")
@LoginRequired
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")
@ApiOperation("新增视频 id contentId vodName vodLength vodType vodSize vodUrl vodCode")
@ApiOperation("新增视频 id labelId vodName vodLength vodType vodSize vodUrl vodCode")
@LoginRequired
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")
@ApiOperation("排序 vodIds [] 视频的id")
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;
@Data
public class ChangeOrdersDTO {
private Long contentId;
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 {
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;
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.vo.vod.GetContendVodsVO;
import java.util.List;
......
package com.subsidy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.dto.content.GetContendVodsDTO;
import com.subsidy.dto.vod.ChangeOrdersDTO;
import com.subsidy.model.VodDictDO;
import com.subsidy.vo.vod.GetContendVodsVO;
import com.subsidy.vo.vod.SignatureVO;
import java.util.List;
/**
* <p>
* 视频表 服务类
......@@ -22,13 +17,11 @@ public interface VodDictService extends IService<VodDictDO> {
SignatureVO signature()throws Exception;
List<GetContendVodsVO> getContendVods(GetContendVodsDTO getContendVodsDTO);
String deleteVod(VodDictDO vodDictDO);
void 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;
import com.subsidy.model.CourseContentDO;
import com.subsidy.service.CourseContentService;
import com.subsidy.util.ConstantUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.List;
/**
......@@ -23,6 +21,7 @@ import java.util.List;
@Service
public class CourseContentServiceImpl extends ServiceImpl<CourseContentMapper, CourseContentDO> implements CourseContentService {
@Override
public List<CourseContentDO> getContents(CourseContentDO courseContentDO) {
return this.baseMapper.selectList(new QueryWrapper<CourseContentDO>()
.lambda()
......@@ -31,11 +30,13 @@ public class CourseContentServiceImpl extends ServiceImpl<CourseContentMapper, C
.orderByAsc(CourseContentDO::getCreateDate));
}
@Override
public String deleteContent(CourseContentDO courseContentDO){
this.baseMapper.deleteById(courseContentDO.getId());
return ConstantUtils.DELETE_SUCCESS;
}
@Override
public String addContent(CourseContentDO courseContentDO){
Integer orderNoTmp = this.baseMapper.selectMaxOrderNo(courseContentDO.getCourseId());
......@@ -50,6 +51,7 @@ public class CourseContentServiceImpl extends ServiceImpl<CourseContentMapper, C
return ConstantUtils.ADD_SUCCESS;
}
@Override
public String updateContent(CourseContentDO courseContentDO){
int count = this.baseMapper.selectCount(new QueryWrapper<CourseContentDO>()
......
......@@ -9,23 +9,15 @@ import com.subsidy.dto.vod.ChangeOrdersDTO;
import com.subsidy.mapper.VodDictMapper;
import com.subsidy.model.VodDictDO;
import com.subsidy.service.VodDictService;
import com.subsidy.util.ConstantUtils;
import com.subsidy.util.Signature;
import com.subsidy.util.VodUtil;
import com.subsidy.vo.vod.GetContendVodsVO;
import com.subsidy.vo.vod.SignatureVO;
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.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.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Random;
......@@ -46,6 +38,7 @@ public class VodDictServiceImpl extends ServiceImpl<VodDictMapper, VodDictDO> im
@Value("${spring.profiles.active}")
private String env;
@Override
public SignatureVO signature() {
SignatureVO signatureVO = new SignatureVO();
......@@ -66,52 +59,30 @@ public class VodDictServiceImpl extends ServiceImpl<VodDictMapper, VodDictDO> im
return signatureVO;
}
public List<GetContendVodsVO> getContendVods(GetContendVodsDTO getContendVodsDTO) {
//Page pager = new Page(getContendVodsDTO.getPageNum(), getContendVodsDTO.getPageSize());
return this.baseMapper.getContendVods( getContendVodsDTO.getVodName(), getContendVodsDTO.getContentId());
}
public String deleteVod(VodDictDO vodDictDO) {
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) {
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteVod(VodDictDO vodDictDO) {
VodDictDO vod = this.baseMapper.selectById(vodDictDO.getId());
if(null == vod) {
throw new HttpException(18000);
}
this.baseMapper.deleteById(vodDictDO.getId());
return ConstantUtils.DELETE_SUCCESS;
VodUtil.deleteMedia(vodDictDO.getVodCode());
}
public String addVod(VodDictDO vodDictDO) {
//排序
int orderNo = 1;
@Override
public void addVod(VodDictDO vodDictDO) {
int orderNo = 1;//排序
List<VodDictDO> vodDictDOS = this.baseMapper.selectList(new QueryWrapper<VodDictDO>()
.lambda()
.eq(VodDictDO::getContentId,vodDictDO.getContentId())
.orderByDesc(VodDictDO::getOrderNo));
if (vodDictDOS.size()>0){
VodDictDO vodDictDO1 = vodDictDOS.get(0);
if (null!=vodDictDO1){
orderNo = vodDictDOS.get(0).getOrderNo()+1;
.lambda()
.eq(VodDictDO::getLabelId, vodDictDO.getLabelId())
.orderByDesc(VodDictDO::getOrderNo));
if (CollectionUtils.isNotEmpty(vodDictDOS)){
VodDictDO vod = vodDictDOS.get(0);
if (null != vod){
orderNo = vod.getOrderNo() + 1;
}
}
vodDictDO.setOrderNo(orderNo);
......@@ -119,49 +90,22 @@ public class VodDictServiceImpl extends ServiceImpl<VodDictMapper, VodDictDO> im
//测试环境就不转码了
if (env.equals("prod")){
//上传后直接转码
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);
}
VodUtil.processMedia(vodDictDO.getVodCode());
}
return ConstantUtils.ADD_SUCCESS;
}
public String updateVod(VodDictDO vodDictDO) {
@Override
public void updateVod(VodDictDO vodDictDO) {
this.baseMapper.updateById(vodDictDO);
return ConstantUtils.SET_SUCCESS;
}
public String changeOrders(ChangeOrdersDTO changeOrdersDTO){
@Override
public void changeOrders(ChangeOrdersDTO changeOrdersDTO){
int i = 1 ;
List<Long> longs = changeOrdersDTO.getVodIds();
for (Long lg : longs){
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;
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.model.OprMemDictDO;
import com.subsidy.util.DateFormatUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......@@ -11,8 +15,15 @@ import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
import java.util.Calendar;
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>
......@@ -32,19 +43,52 @@ public class WebSocketUtil implements WebSocketHandler {
/**
* 存放建立连接webSocket对象
*/
private static CopyOnWriteArraySet<WebSocketSession> webSocketMap = new CopyOnWriteArraySet<>();
private ConcurrentHashMap<Long, WebSocketSession> webSocketMap = new ConcurrentHashMap();
ConcurrentHashMap<String, ScheduledFuture> taskMap = new ConcurrentHashMap<>(1);
/**
* 处理成功连接WebSocket
* @param session
*/
@Override
public void afterConnectionEstablished(WebSocketSession session) {
public void afterConnectionEstablished(WebSocketSession session) throws IOException {
if(null != session) {
if(webSocketMap.contains(session)) {
webSocketMap.remove(session);
String params = session.getUri().getQuery();
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 host = session.getUri().getHost();
......@@ -67,7 +111,9 @@ public class WebSocketUtil implements WebSocketHandler {
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("error message: {}", throwable.getMessage());
}
......@@ -79,24 +125,49 @@ public class WebSocketUtil implements WebSocketHandler {
* @throws Exception
*/
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception{
if(null != session) {
webSocketMap.remove(session);
OprMemDictDO oprMemDictDO = new OprMemDictDO();
String params = session.getUri().getQuery();
String[] id = params.split("=");
oprMemDictDO.setUserId(Long.valueOf(id[1]));
oprMemDictDO.setOprType("登出");
oprMemDictDO.setIpAddress(session.getRemoteAddress().getHostName());
oprMemDictMapper.insert(oprMemDictDO);
System.out.println("<---- webSocket is close");
/*
断开连接后不会马上判断为下线状态,而是进入60秒的心跳检测机制,如果60秒内没有进行重连,则判断为下线,记录下线时间和状态
*/
if(null != webSocketMap) {
String params = session.getUri().getQuery();
Long id = Long.valueOf(params.split("=")[1]);
heartbeat(webSocketMap.get(id));
}
log.info("<---- webSocket is close");
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
* @param session
* @param message
......
......@@ -64,6 +64,7 @@ meishu.code-message[16001]=该条件已存在
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 @@
FROM
class_dict t
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
t.delete_date IS NULL
AND t2.delete_date IS NULL
AND t3.delete_date IS NULL
and t3.id is not null
and t.id = #{classId}
AND t4.delete_date IS NULL
AND t3.id IS NOT NULL
AND t.id = #{classId}
</select>
<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 @@
t4.play_record
FROM
vod_dict t
LEFT JOIN content_vod_mapping cvm ON cvm.vod_id = t.id
LEFT JOIN (
SELECT
t.vod_id,
......@@ -74,9 +75,9 @@
FROM
vod_play_history t
WHERE
t.delete_date is null
and t.member_id = #{memberId}
and t.class_id = #{classId}
t.delete_date IS NULL
AND t.member_id = #{memberId}
AND t.class_id = #{classId}
GROUP BY
t.vod_id,
t.member_id,
......@@ -109,8 +110,9 @@
AND t.create_date = t2.create_date
) t4 ON t2.vod_id = t4.vod_id
WHERE
t.delete_date is null
and t.content_id = #{contentId}
t.delete_date IS NULL
AND cvm.delete_date IS NULL
and cvm.content_id = #{contentId}
) t3
ORDER BY
t3.order_no
......
......@@ -113,10 +113,12 @@
count( t2.id )
FROM
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
t1.delete_date IS NULL
AND t2.delete_date IS NULL
AND t3.delete_date IS NULL
AND t1.course_id = #{courseId}
</select>
......@@ -125,10 +127,12 @@
sum( t2.vod_length )
FROM
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
t1.delete_date IS NULL
AND t2.delete_date IS NULL
AND t3.delete_date IS NULL
AND t1.course_id = #{courseId}
</select>
......
......@@ -93,11 +93,13 @@
count( 1 ) AS cnt
FROM
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
t.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
t.course_id
) t4 ON t3.id = t4.course_id
......
......@@ -8,7 +8,7 @@
<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="label_id" property="labelId" />
<result column="vod_name" property="vodName" />
<result column="vod_length" property="vodLength" />
<result column="vod_type" property="vodType" />
......@@ -22,13 +22,13 @@
create_date,
update_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>
<select id="getContendVods" resultType="com.subsidy.vo.vod.GetContendVodsVO">
SELECT
t.id,
t.content_id,
t.label_id,
t.vod_name,
t.vod_length,
t.vod_type,
......@@ -41,15 +41,17 @@
t.vod_code
FROM
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
t.delete_date IS NULL
AND t2.delete_date IS NULL
AND t3.delete_date IS NULL
AND t.content_id = #{contentId}
<if test="vodName != null and vodName !=''">
and vod_name like concat('%',#{vodName} ,'%')
</if>
order by t2.order_no,t.order_no
order by t3.order_no, t2.order_no, t.order_no
</select>
<select id="getCourseVods" parameterType="long" resultType="com.subsidy.model.VodDictDO">
......@@ -59,16 +61,18 @@
t2.vod_length
FROM
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
t.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}
<if test="vodName != null and vodName !=''">
and t2.vod_name like concat('%',#{vodName} ,'%')
</if>
order by t.id,t2.order_no
order by t.id, t3.order_no, t2.order_no
</select>
<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!