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