diff --git a/pom.xml b/pom.xml index 34a4ce3..12a8bae 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/ImageCheckRecordController.java b/src/main/java/com/subsidy/controller/ImageCheckRecordController.java index 0d16246..c7858a9 100644 --- a/src/main/java/com/subsidy/controller/ImageCheckRecordController.java +++ b/src/main/java/com/subsidy/controller/ImageCheckRecordController.java @@ -4,6 +4,7 @@ package com.subsidy.controller; import com.subsidy.common.ResponseData; import com.subsidy.common.ResponseVO; import com.subsidy.common.interceptor.LoginRequired; +import com.subsidy.dto.image.CheckResultDTO; import com.subsidy.dto.image.ImageCheckDTO; import com.subsidy.model.ImageCheckRecordDO; import com.subsidy.service.ImageCheckRecordService; @@ -41,11 +42,24 @@ public class ImageCheckRecordController { } @PostMapping("imageCheck") - @ApiOperation("人身核验 id 用户id nonce ") + @ApiOperation("启动人身核验 PC端 id 用户id ") public ResponseVO imageCheck(@RequestBody ImageCheckDTO imageCheckDTO) throws Exception { return ResponseData.generateCreatedResponse(0, imageCheckRecordService.imageCheck(imageCheckDTO)); } + @PostMapping("h5CheckResult") + @ApiOperation("启动人脸核验 微信浮层H5 id 用户id") + public ResponseVO h5CheckResult(@RequestBody ImageCheckDTO imageCheckDTO)throws Exception{ + return ResponseData.generateCreatedResponse(0,imageCheckRecordService.h5CheckResult(imageCheckDTO)); + } + + @PostMapping("checkResult") + @ApiOperation("人脸验证结果 memberId orderNo ") + public void checkResult(@RequestBody CheckResultDTO checkResultDTO)throws Exception{ + imageCheckRecordService.checkResult(checkResultDTO); + } + + } 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/image/CheckResultDTO.java b/src/main/java/com/subsidy/dto/image/CheckResultDTO.java new file mode 100644 index 0000000..6f69f62 --- /dev/null +++ b/src/main/java/com/subsidy/dto/image/CheckResultDTO.java @@ -0,0 +1,11 @@ +package com.subsidy.dto.image; + +import lombok.Data; + +@Data +public class CheckResultDTO { + + private String orderNo; + + private Long memberId; +} diff --git a/src/main/java/com/subsidy/dto/image/ImageCheckDTO.java b/src/main/java/com/subsidy/dto/image/ImageCheckDTO.java index 9dd4717..26bdddd 100644 --- a/src/main/java/com/subsidy/dto/image/ImageCheckDTO.java +++ b/src/main/java/com/subsidy/dto/image/ImageCheckDTO.java @@ -7,12 +7,4 @@ public class ImageCheckDTO { private Long id; - private String imageBase64; - - private Long classId; - - private Long paperId; - - private String nonce ; - } 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/ImageCheckRecordDO.java b/src/main/java/com/subsidy/model/ImageCheckRecordDO.java index 71147a2..d9b45a4 100644 --- a/src/main/java/com/subsidy/model/ImageCheckRecordDO.java +++ b/src/main/java/com/subsidy/model/ImageCheckRecordDO.java @@ -26,22 +26,39 @@ public class ImageCheckRecordDO extends BaseModel { private Long id; /** - * 班级id + * 成员id */ - private Long classId; + private Long memberId; /** - * 成员id + * 活体检测得分 */ - private Long memberId; + private String liveRate; /** - * 请求id + * 人脸检测得分 */ - private String requestId; + private String similarity; /** - * 图片地址 + * 刷脸时间 */ - private String imageUrl; + private String occurredTime; + + /** + * 图片 + */ + private String photo; + + /** + * 流水号 + */ + private String bizSeqNo; + + /** + * 检测类型 检测类型 1,权威库 0照片比对 + */ + private Integer checkType; + + } 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/ImageCheckRecordService.java b/src/main/java/com/subsidy/service/ImageCheckRecordService.java index 7448cb7..213de65 100644 --- a/src/main/java/com/subsidy/service/ImageCheckRecordService.java +++ b/src/main/java/com/subsidy/service/ImageCheckRecordService.java @@ -1,8 +1,10 @@ package com.subsidy.service; +import com.subsidy.dto.image.CheckResultDTO; import com.subsidy.dto.image.ImageCheckDTO; import com.subsidy.model.ImageCheckRecordDO; import com.baomidou.mybatisplus.extension.service.IService; +import com.subsidy.vo.token.SendIdCardInfoVO; import java.util.List; @@ -18,6 +20,10 @@ public interface ImageCheckRecordService extends IService { List getImageCheckHistory(ImageCheckRecordDO imageCheckRecordDO); - String imageCheck(ImageCheckDTO imageCheckDTO)throws Exception; + SendIdCardInfoVO imageCheck(ImageCheckDTO imageCheckDTO)throws Exception; + + SendIdCardInfoVO h5CheckResult(ImageCheckDTO imageCheckDTO) throws Exception; + + void checkResult(CheckResultDTO checkResultDTO)throws Exception; } 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/ImageCheckRecordServiceImpl.java b/src/main/java/com/subsidy/service/impl/ImageCheckRecordServiceImpl.java index 05651c3..8c7a7b9 100644 --- a/src/main/java/com/subsidy/service/impl/ImageCheckRecordServiceImpl.java +++ b/src/main/java/com/subsidy/service/impl/ImageCheckRecordServiceImpl.java @@ -1,35 +1,37 @@ package com.subsidy.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.generator.config.TemplateConfig; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.hash.Hashing; import com.subsidy.common.configure.RestTemplateConfig; import com.subsidy.common.exception.HttpException; +import com.subsidy.dto.image.CheckResultDTO; import com.subsidy.dto.image.ImageCheckDTO; +import com.subsidy.mapper.AccessTokenMapper; +import com.subsidy.mapper.ImageCheckRecordMapper; import com.subsidy.mapper.MemberMapper; +import com.subsidy.model.AccessTokenDO; import com.subsidy.model.ImageCheckRecordDO; -import com.subsidy.mapper.ImageCheckRecordMapper; import com.subsidy.model.MemberDO; import com.subsidy.service.ImageCheckRecordService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.subsidy.util.ConstantUtils; -import com.subsidy.util.DateFormatUtil; -import com.subsidy.util.ImageCheckUtil; import com.subsidy.vo.token.*; -import com.subsidy.vo.wechat.AccessTokenVO; -import com.tencentcloudapi.faceid.v20180301.models.GetFaceIdResultResponse; -import com.tencentcloudapi.faceid.v20180301.models.ImageRecognitionResponse; import org.apache.commons.codec.Charsets; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.stereotype.Service; +import sun.misc.BASE64Decoder; +//import org.apache.commons.codec.binary.Base64; +import java.io.*; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Base64; import java.util.Collections; -import java.util.Date; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** *

@@ -48,21 +50,27 @@ public class ImageCheckRecordServiceImpl extends ServiceImpl getImageCheckHistory(ImageCheckRecordDO imageCheckRecordDO) { return this.baseMapper.selectList(new QueryWrapper() .lambda() - .eq(ImageCheckRecordDO::getClassId, imageCheckRecordDO.getClassId()) .eq(ImageCheckRecordDO::getMemberId, imageCheckRecordDO.getMemberId()) .orderByDesc(ImageCheckRecordDO::getCreateDate)); } - public String imageCheck(ImageCheckDTO imageCheckDTO) throws Exception { + public SendIdCardInfoVO imageCheck(ImageCheckDTO imageCheckDTO) throws Exception { //获取这个学生的基本信息 MemberDO memberDO = memberMapper.selectById(imageCheckDTO.getId()); @@ -71,15 +79,34 @@ public class ImageCheckRecordServiceImpl extends ServiceImpl() + .lambda() + .lt(AccessTokenDO::getCreateDate, LocalDateTime.now().minusMinutes(19L))); + + //数据库没有的话 + if (null == accessTokenDO){ + accessTokenMapper.delete(null); + //获取token + IdCardAccessTokenVO idCardAccessTokenVO = this.accessToken(); + accessTokenDO = new AccessTokenDO(); + accessTokenDO.setAccessToken(idCardAccessTokenVO.getAccess_token()); + accessTokenMapper.insert(accessTokenDO); + } //获取signTicket - IdCardTicketsVO idCardTicketsVO = this.signTickets(idCardAccessTokenVO.getAccess_token()); + IdCardTicketsVO idCardTicketsVO = this.signTickets(accessTokenDO.getAccessToken()); List signList1 = new ArrayList<>(); signList1.add(WBAPPID); - signList1.add("001"); + signList1.add(imageCheckRecordDO.getId()+""); signList1.add(memberDO.getUserName()); signList1.add(memberDO.getIdCard()); signList1.add(memberDO.getId() + ""); @@ -87,48 +114,159 @@ public class ImageCheckRecordServiceImpl extends ServiceImpl signList2 = new ArrayList<>(); signList2.add(WBAPPID); signList2.add(memberDO.getId() + ""); - signList2.add(imageCheckDTO.getNonce()); + signList2.add(NONCE); signList2.add("1.0.0"); signList2.add(sendIdCardInfoVO.getResult().getH5faceId()); signList2.add(sendIdCardInfoVO.getResult().getOrderNo()); String sign2 = sign(signList2, nonceTicket.getValue()); - //启动人脸验证 - this.startCheck(imageCheckDTO.getNonce(), sendIdCardInfoVO.getResult(), memberDO.getId() + "", sign2); + sendIdCardInfoVO.getResult().setWbAppId(WBAPPID); + sendIdCardInfoVO.getResult().setNonce(NONCE); + sendIdCardInfoVO.getResult().setUserId(memberDO.getId()); + sendIdCardInfoVO.getResult().setSign(sign2); + + + return sendIdCardInfoVO; + } + + public SendIdCardInfoVO h5CheckResult(ImageCheckDTO imageCheckDTO)throws Exception{ + + //获取这个学生的基本信息 + MemberDO memberDO = memberMapper.selectById(imageCheckDTO.getId()); + + if (StringUtils.isEmpty(memberDO.getIdCard())) { + throw new HttpException(10025); + } + + AccessTokenDO accessTokenDO = accessTokenMapper.selectOne(new QueryWrapper() + .lambda() + .lt(AccessTokenDO::getCreateDate, LocalDateTime.now().minusMinutes(19L))); + + //数据库没有的话 + if (null == accessTokenDO){ + accessTokenMapper.delete(null); + //获取token + IdCardAccessTokenVO idCardAccessTokenVO = this.accessToken(); + accessTokenDO = new AccessTokenDO(); + accessTokenDO.setAccessToken(idCardAccessTokenVO.getAccess_token()); + accessTokenMapper.insert(accessTokenDO); + } + //获取signTicket + IdCardTicketsVO idCardTicketsVO = this.signTickets(accessTokenDO.getAccessToken()); + + List signList1 = new ArrayList<>(); + signList1.add(WBAPPID); + signList1.add(memberDO.getId() + ""); + signList1.add("1.0.0"); + signList1.add(NONCE); + + //生成签名 + String sign = sign(signList1, idCardTicketsVO.getValue()); + + //合作方后台上送身份信息 + SendIdCardInfoVO sendIdCardInfoVO = this.h5SendIdCardInfo("001", memberDO, sign); + if (!"0".equals(sendIdCardInfoVO.getCode())){ + throw new HttpException(10026); + } + + //获取 NONCE ticket + IdCardTicketsVO nonceTicket = this.nonceTicket(accessTokenDO.getAccessToken(), memberDO.getId() + ""); + + //签名2 + List signList2 = new ArrayList<>(); + signList2.add(WBAPPID); + signList2.add("001"); + signList2.add(memberDO.getId() + ""); + signList2.add("1.0.0"); + signList2.add(sendIdCardInfoVO.getResult().getFaceId()); + signList2.add(NONCE); + + String sign2 = sign(signList2, nonceTicket.getValue()); + System.out.println(sign2+"====================================="); + + sendIdCardInfoVO.getResult().setWbAppId(WBAPPID); + sendIdCardInfoVO.getResult().setNonce(NONCE); + sendIdCardInfoVO.getResult().setUserId(memberDO.getId()); + sendIdCardInfoVO.getResult().setSign(sign2); + return sendIdCardInfoVO; + } + + public void checkResult(CheckResultDTO checkResultDTO) throws Exception{ + + AccessTokenDO accessTokenDO = accessTokenMapper.selectOne(new QueryWrapper() + .lambda() + .gt(AccessTokenDO::getCreateDate, LocalDateTime.now().minusMinutes(19L))); + + //数据库没有的话 + if (null == accessTokenDO){ + accessTokenMapper.delete(null); + //获取token + IdCardAccessTokenVO idCardAccessTokenVO = this.accessToken(); + accessTokenDO = new AccessTokenDO(); + accessTokenDO.setAccessToken(idCardAccessTokenVO.getAccess_token()); + accessTokenMapper.insert(accessTokenDO); + } + + //获取signTicket + IdCardTicketsVO idCardTicketsVO = this.signTickets(accessTokenDO.getAccessToken()); //签名3 List signList3 = new ArrayList<>(); signList3.add(WBAPPID); signList3.add("001"); signList3.add("1.0.0"); - signList3.add(imageCheckDTO.getNonce()); + signList3.add(NONCE); - String sign3 = sign(signList3,idCardTicketsVO.getValue()); - System.out.println(sign3); + String sign3 = sign(signList3, idCardTicketsVO.getValue()); //人身核验结果 - ResultVO resultVO = this.checkResult("001", imageCheckDTO.getNonce(), sign3); + ResultVO resultVO = this.checkResult("001",sign3 ); + + //存数据库 + ImageCheckRecordDO imageCheckRecordDO = new ImageCheckRecordDO(); + BeanUtils.copyProperties(resultVO,imageCheckRecordDO); + imageCheckRecordDO.setMemberId(checkResultDTO.getMemberId()); + imageCheckRecordDO.setCheckType(1); + imageCheckRecordMapper.insert(imageCheckRecordDO); + } + /** + * 字符串转图片 + * @param base64Str + * @return + */ + public static byte[] decode(String base64Str){ + byte[] b = null; + BASE64Decoder decoder = new BASE64Decoder(); + try { + b = decoder.decodeBuffer(replaceEnter(base64Str)); + } catch (IOException e) { + e.printStackTrace(); + } + return b; + } - if (Double.valueOf(resultVO.getSimilarity()) > 80.0) { - return ConstantUtils.SUCCESS_VERIFY; - } else { - return ConstantUtils.FAIL_VERIFY; - } + + public static String replaceEnter(String str){ + String reg ="[\n-\r]"; + Pattern p = Pattern.compile(reg); + Matcher m = p.matcher(str); + return m.replaceAll(""); } + + /** * 获取accessToken */ @@ -138,9 +276,6 @@ public class ImageCheckRecordServiceImpl extends ServiceImpl response = restTemplateConfig.restTemplate() .exchange(url, HttpMethod.GET, null, IdCardAccessTokenVO.class); - - System.out.println(response.getBody().toString()); - return response.getBody(); } @@ -152,9 +287,6 @@ public class ImageCheckRecordServiceImpl extends ServiceImpl response = restTemplateConfig.restTemplate() .exchange(url, HttpMethod.GET, null, IdCardSignTicketVO.class); - - System.out.println(response.getBody().getTickets()); - return response.getBody().getTickets().get(0); } @@ -177,7 +309,7 @@ public class ImageCheckRecordServiceImpl extends ServiceImpl responseEntity = restTemplateConfig.restTemplate() + .exchange(url, HttpMethod.POST, new HttpEntity<>(input, headers), SendIdCardInfoVO.class); + return responseEntity.getBody(); + } + /** + * PC端 合作方后台上送身份信息 POST请求 + */ + public SendIdCardInfoVO h5SendIdCardInfo(String orderNo, MemberDO memberDO, String sign) { + String url = "https://kyc.qcloud.com/api/server/getAdvFaceId?orderNo=" + orderNo; + + String input = "{\n" + + " \"appId\":\"" + WBAPPID + "\",\n" + + " \"orderNo\":\"" + orderNo + "\",\n" + + " \"name\":\"" + memberDO.getUserName() + "\"," + + " \"idNo\":\"" + memberDO.getIdCard() + "\"," + + " \"userId\":\"" + memberDO.getId() + "\"," + + " \"version\":\"1.0.0\"," + + " \"sign\":\""+sign+"\"," + + " \"nonce\":\"" + NONCE + "\"" + + "}"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); ResponseEntity responseEntity = restTemplateConfig.restTemplate() .exchange(url, HttpMethod.POST, new HttpEntity<>(input, headers), SendIdCardInfoVO.class); - return responseEntity.getBody(); } @@ -216,33 +369,16 @@ public class ImageCheckRecordServiceImpl extends ServiceImpl(input.getBytes(), headers), CheckResultVO.class); - return responseEntity.getBody().getResultVO(); + return responseEntity.getBody().getResult(); } 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/java/com/subsidy/vo/token/CheckResultVO.java b/src/main/java/com/subsidy/vo/token/CheckResultVO.java index f3cd70c..d4dd6e5 100644 --- a/src/main/java/com/subsidy/vo/token/CheckResultVO.java +++ b/src/main/java/com/subsidy/vo/token/CheckResultVO.java @@ -11,7 +11,7 @@ public class CheckResultVO { private String bizSeqNo; - private ResultVO resultVO; + private ResultVO result; private String transactionTime; diff --git a/src/main/java/com/subsidy/vo/token/SendResultVO.java b/src/main/java/com/subsidy/vo/token/SendResultVO.java index ccda248..f75a4af 100644 --- a/src/main/java/com/subsidy/vo/token/SendResultVO.java +++ b/src/main/java/com/subsidy/vo/token/SendResultVO.java @@ -17,4 +17,14 @@ public class SendResultVO { private Boolean success; + private String wbAppId; + + private String nonce; + + private Long userId; + + private String sign; + + private String faceId; + } diff --git a/src/main/resources/code.properties b/src/main/resources/code.properties index df4ceed..787a4fa 100644 --- a/src/main/resources/code.properties +++ b/src/main/resources/code.properties @@ -18,6 +18,7 @@ meishu.code-message[10022]=密码输入错误,您还可以输入2次密码 meishu.code-message[10023]=密码输入错误,您还可以输入3次密码 meishu.code-message[10024]=密码输入错误,您还可以输入4次密码 meishu.code-message[10025]=身份证识别错误 +meishu.code-message[10026]=姓名或身份证号格式不正确 meishu.code-message[20001]=该课程已存在 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/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