diff --git a/mt/src/main/java/com/ccsens/mt/api/KCPlayerController.java b/mt/src/main/java/com/ccsens/mt/api/KCPlayerController.java new file mode 100644 index 00000000..3d07b837 --- /dev/null +++ b/mt/src/main/java/com/ccsens/mt/api/KCPlayerController.java @@ -0,0 +1,48 @@ +package com.ccsens.mt.api; + +import com.ccsens.cloudutil.annotation.MustLogin; +import com.ccsens.mt.bean.dto.CompeteDto; +import com.ccsens.mt.bean.vo.CompeteVo; +import com.ccsens.mt.service.IKCPlayerService; +import com.ccsens.util.JsonResponse; +import com.ccsens.util.bean.dto.QueryDto; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@Slf4j +@Api(tags = "云点播", description = "") +@RestController +@RequestMapping("/kcPlayer") +public class KCPlayerController { + @Resource + private IKCPlayerService kcPlayerService; + + @ApiOperation(value = "查看云点播签名", notes = "从redis获取云点播签名,有则返回,没有则调用工具类查询,存入redis并返回") + @RequestMapping(value = "/get", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse getSignature(Long id) { + log.info("查看云点播签名"); + String signature = kcPlayerService.getSignature(id); + log.info("查看云点播签名:{}",signature); + return JsonResponse.newInstance().ok(signature); + } + + @ApiOperation(value = "查看云点播签名", notes = "从redis获取云点播签名,有则返回,没有则调用工具类查询,存入redis并返回") + @RequestMapping(value = "/receive", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse receive(@RequestBody Map map) { + log.info("接受文件上传通知:{}",map); + + return JsonResponse.newInstance().ok(); + } + +} diff --git a/mt/src/main/java/com/ccsens/mt/bean/vo/TableVo.java b/mt/src/main/java/com/ccsens/mt/bean/vo/TableVo.java index 0643eef7..28cabbca 100644 --- a/mt/src/main/java/com/ccsens/mt/bean/vo/TableVo.java +++ b/mt/src/main/java/com/ccsens/mt/bean/vo/TableVo.java @@ -141,7 +141,7 @@ public class TableVo { public static class CompeteProjectConfig{ @ApiModelProperty("参赛id") private Long projectId; - @ApiModelProperty("参赛项目") + @ApiModelProperty("参赛项目名字") private String projectName; @ApiModelProperty("参赛人/队伍") private int joinNum; @@ -153,9 +153,9 @@ public class TableVo { private int games; @ApiModelProperty("总时间") private int timeSum; - @ApiModelProperty("项目开始时间") + @ApiModelProperty("比赛项目开始时间") private Long startTime; - @ApiModelProperty("项目结束时间") + @ApiModelProperty("比赛项目结束时间") private Long endTime; public int getGames(){ diff --git a/mt/src/main/java/com/ccsens/mt/service/CompeteTaskService.java b/mt/src/main/java/com/ccsens/mt/service/CompeteTaskService.java index 668272fe..f250a203 100644 --- a/mt/src/main/java/com/ccsens/mt/service/CompeteTaskService.java +++ b/mt/src/main/java/com/ccsens/mt/service/CompeteTaskService.java @@ -75,7 +75,9 @@ public class CompeteTaskService implements ICompeteTaskService{ public List updateCompeteProjectConfig(ProvinceCompeteDto.UpdateCompeteProjectConfig param,String token) { //获取比赛类型 AtomicInteger type = new AtomicInteger(); - if(CollectionUtil.isNotEmpty(param.getUpdateCompeteTaskList())){ + if(CollectionUtil.isEmpty(param.getUpdateCompeteTaskList())) { + return new ArrayList<>(); + } param.getUpdateCompeteTaskList().forEach(projectConfig -> { //获取项目 CompeteProject project = competeProjectDao.selectByPrimaryKey(projectConfig.getProjectId()); @@ -109,14 +111,13 @@ public class CompeteTaskService implements ICompeteTaskService{ // 生成出场顺序表,存入数据库。在tall内添加对应的任务 setStartOrder(competeProjectConfig,param.getProjectId(),param.getTallRoleId(),token); }); - } + return projectConfigDao.queryProjectConfig(type.get()); } /** * 修改配置时生成出场顺序 */ public void setStartOrder(CompeteProjectConfig projectConfig, Long tallProjectId,Long tallRoleId,String token) { - if (ObjectUtil.isNotNull(projectConfig)) { //查找项目 CompeteProject project = competeProjectDao.selectByPrimaryKey(projectConfig.getProjectId()); @@ -156,12 +157,16 @@ public class CompeteTaskService implements ICompeteTaskService{ // 修改tall的任务 TallTaskDto.UpdateTaskInfo updateTaskInfo = new TallTaskDto.UpdateTaskInfo(); updateTaskInfo.setId(competeStartOrder.getId()); - updateTaskInfo.setBeginTime(competeStartOrder.getId()); - updateTaskInfo.setBeginTime(competeStartOrder.getEndTime()); + updateTaskInfo.setBeginTime(competeStartOrder.getStartTime()); + updateTaskInfo.setEndTime(competeStartOrder.getEndTime()); updateTaskInfo.setToken(token); log.info("修改tall的任务信息:{}",updateTaskInfo); - tallFeignClient.updataTask(updateTaskInfo); - log.info("修改tall的任务信息后返回:{}",updateTaskInfo); + JsonResponse normalTaskJsonResponse = tallFeignClient.updataTask(updateTaskInfo); + log.info("修改tall的任务信息后返回:{}",normalTaskJsonResponse); + //失败return + if (ObjectUtil.isNull(normalTaskJsonResponse) || normalTaskJsonResponse.getCode() != 200){ + return; + } } startOrderMapper.updateByPrimaryKeySelective(competeStartOrder); @@ -177,12 +182,14 @@ public class CompeteTaskService implements ICompeteTaskService{ addTask.setToken(token); log.info("在tall内添加任务:{}",addTask); JsonResponse normalTaskJsonResponse = tallFeignClient.saveTask(addTask); + //异常return log.info("添加任务后返回:{}",normalTaskJsonResponse); - if (ObjectUtil.isNotNull(normalTaskJsonResponse)) { - TaskVo.NormalTask normalTask = normalTaskJsonResponse.getData(); - if (ObjectUtil.isNotNull(normalTask)) { - taskId = normalTask.getDetailId(); - } + if (ObjectUtil.isNull(normalTaskJsonResponse) || normalTaskJsonResponse.getCode() != 200) { + return; + } + TaskVo.NormalTask normalTask = normalTaskJsonResponse.getData(); + if (ObjectUtil.isNotNull(normalTask)) { + taskId = normalTask.getDetailId(); } //添加出场顺序信息 CompeteStartOrder competeStartOrder = new CompeteStartOrder(); @@ -218,10 +225,7 @@ public class CompeteTaskService implements ICompeteTaskService{ long orderTime = 0; if(order != 0) { orderTime = (long) Math.floor((projectConfig.getEndTime() - projectStartTime) / order); - }else { - log.info("场次为0的比赛:{}------{}",project,projectConfig); } -// long orderTime = (long) Math.floor((projectConfig.getEndTime() - projectStartTime) / order); //场次 int competeOrder = 1; //场地 @@ -244,8 +248,12 @@ public class CompeteTaskService implements ICompeteTaskService{ updateTaskInfo.setBeginTime(competeStartOrder.getEndTime()); updateTaskInfo.setToken(token); log.info("修改tall的任务信息:{}",updateTaskInfo); - tallFeignClient.updataTask(updateTaskInfo); - log.info("修改tall的任务信息后返回:{}",updateTaskInfo); + JsonResponse normalTaskJsonResponse = tallFeignClient.updataTask(updateTaskInfo); + log.info("修改tall的任务信息后返回:{}",normalTaskJsonResponse); + //失败return + if (ObjectUtil.isNull(normalTaskJsonResponse) || normalTaskJsonResponse.getCode() != 200){ + return; + } } startOrderMapper.updateByPrimaryKeySelective(competeStartOrder); @@ -262,11 +270,14 @@ public class CompeteTaskService implements ICompeteTaskService{ log.info("在tall内添加任务:{}",addTask); JsonResponse normalTaskJsonResponse = tallFeignClient.saveTask(addTask); log.info("添加任务后返回:{}",normalTaskJsonResponse); - if (ObjectUtil.isNotNull(normalTaskJsonResponse)) { - TaskVo.NormalTask normalTask = normalTaskJsonResponse.getData(); - if (ObjectUtil.isNotNull(normalTask)) { - taskId = normalTask.getDetailId(); - } + //异常return + log.info("添加任务后返回:{}",normalTaskJsonResponse); + if (ObjectUtil.isNull(normalTaskJsonResponse) || normalTaskJsonResponse.getCode() != 200) { + return; + } + TaskVo.NormalTask normalTask = normalTaskJsonResponse.getData(); + if (ObjectUtil.isNotNull(normalTask)) { + taskId = normalTask.getDetailId(); } //添加出场顺序信息 CompeteStartOrder competeStartOrder = new CompeteStartOrder(); diff --git a/mt/src/main/java/com/ccsens/mt/service/IKCPlayerService.java b/mt/src/main/java/com/ccsens/mt/service/IKCPlayerService.java new file mode 100644 index 00000000..b6531324 --- /dev/null +++ b/mt/src/main/java/com/ccsens/mt/service/IKCPlayerService.java @@ -0,0 +1,5 @@ +package com.ccsens.mt.service; + +public interface IKCPlayerService { + String getSignature(Long id); +} diff --git a/mt/src/main/java/com/ccsens/mt/service/KCPlayerService.java b/mt/src/main/java/com/ccsens/mt/service/KCPlayerService.java new file mode 100644 index 00000000..d626a569 --- /dev/null +++ b/mt/src/main/java/com/ccsens/mt/service/KCPlayerService.java @@ -0,0 +1,54 @@ +package com.ccsens.mt.service; + +import cn.hutool.core.util.ObjectUtil; +import com.ccsens.mt.util.Constant; +import com.ccsens.util.CodeEnum; +import com.ccsens.util.KCPlayerSignature; +import com.ccsens.util.RedisUtil; +import com.ccsens.util.exception.BaseException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Random; +@Slf4j +@Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) +public class KCPlayerService implements IKCPlayerService{ + @Resource + private RedisUtil redisUtil; + + /** + * 获取云点播签名 + * @return 返回签名 + * @param id + */ + @Override + public String getSignature(Long id) { + String signature; + //查询redis + Object o = redisUtil.get(Constant.Redis.KC_PLAYER_SIGNATURE + id); + if(ObjectUtil.isNotNull(o)){ + return (String) o; + } + + KCPlayerSignature sign = new KCPlayerSignature(); + sign.setCurrentTime(System.currentTimeMillis() / 1000); + sign.setRandom(new Random().nextInt(java.lang.Integer.MAX_VALUE)); + // 签名有效期:2天 + sign.setSignValidDuration(3600 * 24 * 2); + try { + signature = sign.getUploadSignature(id); + log.info("获取云点播签名成功:{}",signature); + //存入redis + redisUtil.set(Constant.Redis.KC_PLAYER_SIGNATURE + id,signature,3600 * 24); + } catch (Exception e) { + log.error("获取云点播签名失败",e); + throw new BaseException(CodeEnum.SYS_ERROR); + + } + return signature; + } +} diff --git a/mt/src/main/java/com/ccsens/mt/util/Constant.java b/mt/src/main/java/com/ccsens/mt/util/Constant.java index 8e415048..ef0667ca 100644 --- a/mt/src/main/java/com/ccsens/mt/util/Constant.java +++ b/mt/src/main/java/com/ccsens/mt/util/Constant.java @@ -31,6 +31,8 @@ public class Constant { public final static long COMPETE_COMPANY_TIME = 10 * 24 * 60 * 60; // 远程比赛参赛单位 public final static String COMPETE_LEVEL = "compete_"; + //云点播签名 + public final static String KC_PLAYER_SIGNATURE = "kc_player_signature_"; } public static final int VOTE_TOTAL = 2; diff --git a/util/src/main/java/com/ccsens/util/KCPlayerSignature.java b/util/src/main/java/com/ccsens/util/KCPlayerSignature.java new file mode 100644 index 00000000..9ca43426 --- /dev/null +++ b/util/src/main/java/com/ccsens/util/KCPlayerSignature.java @@ -0,0 +1,104 @@ +package com.ccsens.util; + + +import java.util.Base64; +import java.util.Random; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + + +/** + * 签名工具类 + * @author 逗 + */ +public class KCPlayerSignature{ + private String secretId = "AKIDTr6B7uA2qCRWRDRXyeUAZpkfR2tupVFu"; + private String secretKey = "wVtKAuXEjXFpxQmz9PM6hWallNEyZ0Na"; + private long currentTime; + private int random; + private int signValidDuration; + //签名算法 + private static final String HMAC_ALGORITHM = "HmacSHA1"; + private static final String CONTENT_CHARSET = "UTF-8"; + + public static byte[] byteMerger(byte[] byte1, byte[] byte2) { + byte[] byte3 = new byte[byte1.length + byte2.length]; + System.arraycopy(byte1, 0, byte3, 0, byte1.length); + System.arraycopy(byte2, 0, byte3, byte1.length, byte2.length); + return byte3; + } + + // 获取签名 + public String getUploadSignature(Long id) throws Exception { + String strSign = ""; + String contextStr = ""; + + // 生成原始参数字符串 + long endTime = (currentTime + signValidDuration); + contextStr += "secretId=" + java.net.URLEncoder.encode(secretId, "utf8"); + contextStr += "¤tTimeStamp=" + currentTime; + contextStr += "&expireTime=" + endTime; + contextStr += "&random=" + random; + contextStr += "&sourceContext=" + id; + + + try { + Mac mac = Mac.getInstance(HMAC_ALGORITHM); + SecretKeySpec secretKey = new SecretKeySpec(this.secretKey.getBytes(CONTENT_CHARSET), mac.getAlgorithm()); + mac.init(secretKey); + + byte[] hash = mac.doFinal(contextStr.getBytes(CONTENT_CHARSET)); + byte[] sigBuf = byteMerger(hash, contextStr.getBytes("utf8")); + strSign = base64Encode(sigBuf); + strSign = strSign.replace(" ", "").replace("\n", "").replace("\r", ""); + } catch (Exception e) { + throw e; + } + return strSign; + } + + private String base64Encode(byte[] buffer) { + Base64.Encoder encoder = Base64.getEncoder(); + return encoder.encodeToString(buffer); + } + + + public void setSecretId(String secretId) { + this.secretId = secretId; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + public void setCurrentTime(long currentTime) { + this.currentTime = currentTime; + } + + public void setRandom(int random) { + this.random = random; + } + + public void setSignValidDuration(int signValidDuration) { + this.signValidDuration = signValidDuration; + } + + static void main(String[] args) { + KCPlayerSignature sign = new KCPlayerSignature(); + // 设置 App 的云 API 密钥 + sign.setSecretId("个人 API 密钥中的 Secret Id"); + sign.setSecretKey("个人 API 密钥中的 Secret Key"); + sign.setCurrentTime(System.currentTimeMillis() / 1000); + sign.setRandom(new Random().nextInt(java.lang.Integer.MAX_VALUE)); + // 签名有效期:2天 + sign.setSignValidDuration(3600 * 24 * 2); + + try { + String signature = sign.getUploadSignature(id); + System.out.println("signature : " + signature); + } catch (Exception e) { + System.out.print("获取签名失败"); + e.printStackTrace(); + } + } +} \ No newline at end of file