diff --git a/pom.xml b/pom.xml index 5e21b2b..ffc86d2 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,7 @@ 5.4.1 3.10.3 3.3.0 + 3.2.2 @@ -208,6 +209,12 @@ ${jedis.version} + + commons-collections + commons-collections + ${collections.version} + + org.springframework.boot diff --git a/src/main/java/com/subsidy/controller/BusinessScopeDictController.java b/src/main/java/com/subsidy/controller/BusinessScopeDictController.java new file mode 100644 index 0000000..244b9c2 --- /dev/null +++ b/src/main/java/com/subsidy/controller/BusinessScopeDictController.java @@ -0,0 +1,64 @@ +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; + +/** + *

+ * 经营范围表 前端控制器 + *

+ * + * @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)); + } + +} diff --git a/src/main/java/com/subsidy/controller/ContentVodMappingController.java b/src/main/java/com/subsidy/controller/ContentVodMappingController.java new file mode 100644 index 0000000..756352a --- /dev/null +++ b/src/main/java/com/subsidy/controller/ContentVodMappingController.java @@ -0,0 +1,65 @@ +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; + +/** + *

+ * 目录视频关系表 前端控制器 + *

+ * + * @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); + } + +} diff --git a/src/main/java/com/subsidy/controller/CourseContentController.java b/src/main/java/com/subsidy/controller/CourseContentController.java index d98275e..2e55786 100644 --- a/src/main/java/com/subsidy/controller/CourseContentController.java +++ b/src/main/java/com/subsidy/controller/CourseContentController.java @@ -1,9 +1,10 @@ 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)); } - - } diff --git a/src/main/java/com/subsidy/controller/VodDictController.java b/src/main/java/com/subsidy/controller/VodDictController.java index 4caff49..e46b725 100644 --- a/src/main/java/com/subsidy/controller/VodDictController.java +++ b/src/main/java/com/subsidy/controller/VodDictController.java @@ -1,10 +1,8 @@ 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); } } diff --git a/src/main/java/com/subsidy/controller/VodLabelDictController.java b/src/main/java/com/subsidy/controller/VodLabelDictController.java new file mode 100644 index 0000000..7525d6c --- /dev/null +++ b/src/main/java/com/subsidy/controller/VodLabelDictController.java @@ -0,0 +1,70 @@ +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; + +/** + *

+ * 视频库类目表 前端控制器 + *

+ * + * @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()); + } +} diff --git a/src/main/java/com/subsidy/dto/businessScope/BusinessScopeDTO.java b/src/main/java/com/subsidy/dto/businessScope/BusinessScopeDTO.java new file mode 100644 index 0000000..2e4491e --- /dev/null +++ b/src/main/java/com/subsidy/dto/businessScope/BusinessScopeDTO.java @@ -0,0 +1,13 @@ +package com.subsidy.dto.businessScope; + +import lombok.Data; + +@Data +public class BusinessScopeDTO { + + private String businessScopeName; + + private Integer pageNum; + + private Integer pageSize; +} diff --git a/src/main/java/com/subsidy/dto/contentVod/AddContentVod.java b/src/main/java/com/subsidy/dto/contentVod/AddContentVod.java new file mode 100644 index 0000000..8bee165 --- /dev/null +++ b/src/main/java/com/subsidy/dto/contentVod/AddContentVod.java @@ -0,0 +1,13 @@ +package com.subsidy.dto.contentVod; + +import lombok.Data; + +import java.util.List; + +@Data +public class AddContentVod { + + private List vodIds; + + private Long contentId; +} diff --git a/src/main/java/com/subsidy/dto/contentVod/ContentVodDTO.java b/src/main/java/com/subsidy/dto/contentVod/ContentVodDTO.java new file mode 100644 index 0000000..06f2edc --- /dev/null +++ b/src/main/java/com/subsidy/dto/contentVod/ContentVodDTO.java @@ -0,0 +1,11 @@ +package com.subsidy.dto.contentVod; + +import lombok.Data; + +@Data +public class ContentVodDTO { + + private Long contentId; + + private Long vodId; +} diff --git a/src/main/java/com/subsidy/dto/label/VodLabelPageDTO.java b/src/main/java/com/subsidy/dto/label/VodLabelPageDTO.java new file mode 100644 index 0000000..bf44881 --- /dev/null +++ b/src/main/java/com/subsidy/dto/label/VodLabelPageDTO.java @@ -0,0 +1,13 @@ +package com.subsidy.dto.label; + +import lombok.Data; + +@Data +public class VodLabelPageDTO { + + private String labelName; + + private Integer pageNum; + + private Integer pageSize; +} diff --git a/src/main/java/com/subsidy/dto/vod/ChangeOrdersDTO.java b/src/main/java/com/subsidy/dto/vod/ChangeOrdersDTO.java index 969eecd..3c5466b 100644 --- a/src/main/java/com/subsidy/dto/vod/ChangeOrdersDTO.java +++ b/src/main/java/com/subsidy/dto/vod/ChangeOrdersDTO.java @@ -7,6 +7,8 @@ import java.util.List; @Data public class ChangeOrdersDTO { + private Long contentId; + private List vodIds; } diff --git a/src/main/java/com/subsidy/mapper/BusinessScopeDictMapper.java b/src/main/java/com/subsidy/mapper/BusinessScopeDictMapper.java new file mode 100644 index 0000000..06045ed --- /dev/null +++ b/src/main/java/com/subsidy/mapper/BusinessScopeDictMapper.java @@ -0,0 +1,18 @@ +package com.subsidy.mapper; + +import com.subsidy.model.BusinessScopeDictDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; + +/** + *

+ * 经营范围表 Mapper 接口 + *

+ * + * @author DengMin + * @since 2022-07-25 + */ + @Repository +public interface BusinessScopeDictMapper extends BaseMapper { + +} diff --git a/src/main/java/com/subsidy/mapper/ContentVodMappingMapper.java b/src/main/java/com/subsidy/mapper/ContentVodMappingMapper.java new file mode 100644 index 0000000..45b4ae0 --- /dev/null +++ b/src/main/java/com/subsidy/mapper/ContentVodMappingMapper.java @@ -0,0 +1,18 @@ +package com.subsidy.mapper; + +import com.subsidy.model.ContentVodMappingDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; + +/** + *

+ * 目录视频关系表 Mapper 接口 + *

+ * + * @author DengMin + * @since 2022-07-19 + */ + @Repository +public interface ContentVodMappingMapper extends BaseMapper { + +} diff --git a/src/main/java/com/subsidy/mapper/VodLabelDictMapper.java b/src/main/java/com/subsidy/mapper/VodLabelDictMapper.java new file mode 100644 index 0000000..058bff9 --- /dev/null +++ b/src/main/java/com/subsidy/mapper/VodLabelDictMapper.java @@ -0,0 +1,18 @@ +package com.subsidy.mapper; + +import com.subsidy.model.VodLabelDictDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; + +/** + *

+ * 视频库类目表 Mapper 接口 + *

+ * + * @author DengMin + * @since 2022-07-19 + */ + @Repository +public interface VodLabelDictMapper extends BaseMapper { + +} diff --git a/src/main/java/com/subsidy/model/BusinessScopeDictDO.java b/src/main/java/com/subsidy/model/BusinessScopeDictDO.java new file mode 100644 index 0000000..ead9970 --- /dev/null +++ b/src/main/java/com/subsidy/model/BusinessScopeDictDO.java @@ -0,0 +1,34 @@ +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; + +/** + *

+ * 经营范围表 + *

+ * + * @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; + + +} diff --git a/src/main/java/com/subsidy/model/ContentVodMappingDO.java b/src/main/java/com/subsidy/model/ContentVodMappingDO.java new file mode 100644 index 0000000..98365e0 --- /dev/null +++ b/src/main/java/com/subsidy/model/ContentVodMappingDO.java @@ -0,0 +1,44 @@ +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; + +/** + *

+ * 目录视频关系表 + *

+ * + * @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; + + +} diff --git a/src/main/java/com/subsidy/model/VodDictDO.java b/src/main/java/com/subsidy/model/VodDictDO.java index 8f4937c..e65ed9f 100644 --- a/src/main/java/com/subsidy/model/VodDictDO.java +++ b/src/main/java/com/subsidy/model/VodDictDO.java @@ -26,9 +26,9 @@ public class VodDictDO extends BaseModel { private Long id; /** - * 目录id + * 类目id */ - private Long contentId; + private Long labelId; /** * 视频名称 diff --git a/src/main/java/com/subsidy/model/VodLabelDictDO.java b/src/main/java/com/subsidy/model/VodLabelDictDO.java new file mode 100644 index 0000000..192431a --- /dev/null +++ b/src/main/java/com/subsidy/model/VodLabelDictDO.java @@ -0,0 +1,34 @@ +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; + +/** + *

+ * 视频库类目表 + *

+ * + * @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; + + +} diff --git a/src/main/java/com/subsidy/service/BusinessScopeDictService.java b/src/main/java/com/subsidy/service/BusinessScopeDictService.java new file mode 100644 index 0000000..10b089a --- /dev/null +++ b/src/main/java/com/subsidy/service/BusinessScopeDictService.java @@ -0,0 +1,19 @@ +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; + +/** + *

+ * 经营范围表 服务类 + *

+ * + * @author DengMin + * @since 2022-07-25 + */ +public interface BusinessScopeDictService extends IService { + + IPage queryBusinessScopePage(BusinessScopeDTO businessScopeDictDO); +} diff --git a/src/main/java/com/subsidy/service/ContentVodMappingService.java b/src/main/java/com/subsidy/service/ContentVodMappingService.java new file mode 100644 index 0000000..a80b716 --- /dev/null +++ b/src/main/java/com/subsidy/service/ContentVodMappingService.java @@ -0,0 +1,30 @@ +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; + +/** + *

+ * 目录视频关系表 服务类 + *

+ * + * @author DengMin + * @since 2022-07-19 + */ +public interface ContentVodMappingService extends IService { + + List getContendVods(GetContendVodsDTO getContendVodsDTO); + + void changeContentVodOrders(ChangeOrdersDTO changeOrdersDTO); + + void deleteContentVod(ContentVodDTO contentVodDTO); + + void addContentVod(AddContentVod addContentVod); +} diff --git a/src/main/java/com/subsidy/service/CourseContentService.java b/src/main/java/com/subsidy/service/CourseContentService.java index 6bc45ca..03b2605 100644 --- a/src/main/java/com/subsidy/service/CourseContentService.java +++ b/src/main/java/com/subsidy/service/CourseContentService.java @@ -1,7 +1,10 @@ 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; diff --git a/src/main/java/com/subsidy/service/VodDictService.java b/src/main/java/com/subsidy/service/VodDictService.java index b923816..82df320 100644 --- a/src/main/java/com/subsidy/service/VodDictService.java +++ b/src/main/java/com/subsidy/service/VodDictService.java @@ -1,15 +1,10 @@ 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; - /** *

* 视频表 服务类 @@ -22,13 +17,11 @@ public interface VodDictService extends IService { SignatureVO signature()throws Exception; - List 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); } diff --git a/src/main/java/com/subsidy/service/VodLableDictService.java b/src/main/java/com/subsidy/service/VodLableDictService.java new file mode 100644 index 0000000..b0fcb56 --- /dev/null +++ b/src/main/java/com/subsidy/service/VodLableDictService.java @@ -0,0 +1,19 @@ +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; + +/** + *

+ * 视频库类目表 服务类 + *

+ * + * @author DengMin + * @since 2022-07-19 + */ +public interface VodLableDictService extends IService { + + IPage queryVodLabelPage(VodLabelPageDTO vodLabelPageDTO); +} diff --git a/src/main/java/com/subsidy/service/impl/BusinessScopeDictServiceImpl.java b/src/main/java/com/subsidy/service/impl/BusinessScopeDictServiceImpl.java new file mode 100644 index 0000000..fe8520d --- /dev/null +++ b/src/main/java/com/subsidy/service/impl/BusinessScopeDictServiceImpl.java @@ -0,0 +1,32 @@ +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; + +/** + *

+ * 经营范围表 服务实现类 + *

+ * + * @author DengMin + * @since 2022-07-25 + */ +@Service +public class BusinessScopeDictServiceImpl extends ServiceImpl implements BusinessScopeDictService { + + @Override + public IPage queryBusinessScopePage(BusinessScopeDTO businessScopeDictDO) { + Page page = new Page(businessScopeDictDO.getPageNum(), businessScopeDictDO.getPageSize()); + return this.baseMapper.selectPage(page, new QueryWrapper() + .lambda() + .like(StringUtils.isNotBlank(businessScopeDictDO.getBusinessScopeName()), BusinessScopeDictDO::getBusinessScopeName, businessScopeDictDO.getBusinessScopeName())); + } +} diff --git a/src/main/java/com/subsidy/service/impl/ContentVodMappingServiceImpl.java b/src/main/java/com/subsidy/service/impl/ContentVodMappingServiceImpl.java new file mode 100644 index 0000000..9280bf6 --- /dev/null +++ b/src/main/java/com/subsidy/service/impl/ContentVodMappingServiceImpl.java @@ -0,0 +1,88 @@ +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; + +/** + *

+ * 目录视频关系表 服务实现类 + *

+ * + * @author DengMin + * @since 2022-07-19 + */ +@Service +public class ContentVodMappingServiceImpl extends ServiceImpl implements ContentVodMappingService { + + @Autowired + private VodDictMapper vodDictMapper; + + @Override + public List 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().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() + .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 list = this.baseMapper.selectList(new QueryWrapper() + .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); + } + } + } +} diff --git a/src/main/java/com/subsidy/service/impl/CourseContentServiceImpl.java b/src/main/java/com/subsidy/service/impl/CourseContentServiceImpl.java index 2673a5d..4880d14 100644 --- a/src/main/java/com/subsidy/service/impl/CourseContentServiceImpl.java +++ b/src/main/java/com/subsidy/service/impl/CourseContentServiceImpl.java @@ -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 implements CourseContentService { + @Override public List getContents(CourseContentDO courseContentDO) { return this.baseMapper.selectList(new QueryWrapper() .lambda() @@ -31,11 +30,13 @@ public class CourseContentServiceImpl extends ServiceImpl() diff --git a/src/main/java/com/subsidy/service/impl/VodDictServiceImpl.java b/src/main/java/com/subsidy/service/impl/VodDictServiceImpl.java index c901400..efa8cd4 100644 --- a/src/main/java/com/subsidy/service/impl/VodDictServiceImpl.java +++ b/src/main/java/com/subsidy/service/impl/VodDictServiceImpl.java @@ -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 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 im return signatureVO; } - public List 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 vodDictDOS = this.baseMapper.selectList(new QueryWrapper() - .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 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 longs = changeOrdersDTO.getVodIds(); for (Long lg : longs){ this.baseMapper.updateVodOrderNo(lg,i++); } - return ConstantUtils.SET_SUCCESS; } } diff --git a/src/main/java/com/subsidy/service/impl/VodLabelDictServiceImpl.java b/src/main/java/com/subsidy/service/impl/VodLabelDictServiceImpl.java new file mode 100644 index 0000000..09e650b --- /dev/null +++ b/src/main/java/com/subsidy/service/impl/VodLabelDictServiceImpl.java @@ -0,0 +1,32 @@ +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; + +/** + *

+ * 视频库类目表 服务实现类 + *

+ * + * @author DengMin + * @since 2022-07-19 + */ +@Service +public class VodLabelDictServiceImpl extends ServiceImpl implements VodLableDictService { + + @Override + public IPage queryVodLabelPage(VodLabelPageDTO vodLabelPageDTO) { + Page page = new Page(vodLabelPageDTO.getPageNum(), vodLabelPageDTO.getPageSize()); + return this.baseMapper.selectPage(page, new QueryWrapper() + .lambda().like(StringUtils.isNotBlank(vodLabelPageDTO.getLabelName()), + VodLabelDictDO::getLabelName, vodLabelPageDTO.getLabelName())); + } +} diff --git a/src/main/java/com/subsidy/util/VodUtil.java b/src/main/java/com/subsidy/util/VodUtil.java new file mode 100644 index 0000000..9676482 --- /dev/null +++ b/src/main/java/com/subsidy/util/VodUtil.java @@ -0,0 +1,81 @@ +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) { + } + } +} diff --git a/src/main/java/com/subsidy/util/websocket/WebSocketUtil.java b/src/main/java/com/subsidy/util/websocket/WebSocketUtil.java index 0def445..f9d6cc5 100644 --- a/src/main/java/com/subsidy/util/websocket/WebSocketUtil.java +++ b/src/main/java/com/subsidy/util/websocket/WebSocketUtil.java @@ -1,8 +1,12 @@ 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; /** *

@@ -32,19 +43,52 @@ public class WebSocketUtil implements WebSocketHandler { /** * 存放建立连接webSocket对象 */ - private static CopyOnWriteArraySet webSocketMap = new CopyOnWriteArraySet<>(); + private ConcurrentHashMap webSocketMap = new ConcurrentHashMap(); + + ConcurrentHashMap 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 list = oprMemDictMapper.selectList(new QueryWrapper() + .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 diff --git a/src/main/resources/code.properties b/src/main/resources/code.properties index 7eba195..c677260 100644 --- a/src/main/resources/code.properties +++ b/src/main/resources/code.properties @@ -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]=删除失败,目录下没有该视频 diff --git a/src/main/resources/mapper/BusinessScopeDictMapper.xml b/src/main/resources/mapper/BusinessScopeDictMapper.xml new file mode 100644 index 0000000..234f87a --- /dev/null +++ b/src/main/resources/mapper/BusinessScopeDictMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + create_date, + update_date, + delete_date, + id, business_scope_name + + + diff --git a/src/main/resources/mapper/ClassDictMapper.xml b/src/main/resources/mapper/ClassDictMapper.xml index bcfdc4e..5b0726d 100644 --- a/src/main/resources/mapper/ClassDictMapper.xml +++ b/src/main/resources/mapper/ClassDictMapper.xml @@ -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} @@ -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} diff --git a/src/main/resources/mapper/MemberMapper.xml b/src/main/resources/mapper/MemberMapper.xml index 922be5d..3be171e 100644 --- a/src/main/resources/mapper/MemberMapper.xml +++ b/src/main/resources/mapper/MemberMapper.xml @@ -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 diff --git a/src/main/resources/mapper/VodDictMapper.xml b/src/main/resources/mapper/VodDictMapper.xml index c947c8f..13e12fc 100644 --- a/src/main/resources/mapper/VodDictMapper.xml +++ b/src/main/resources/mapper/VodDictMapper.xml @@ -8,7 +8,7 @@ - + @@ -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