ソースを参照

新增二维码失效时间

wangliang 3 年 前
コミット
b3694c3b6a

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -217,7 +217,7 @@ public class SystemConstant {
     //二维码过期时间(秒)
 //        private final static int qrExpireTime = 120;
 //    public final static Long QR_EXPIRE_TIME = 86400L;
-    public final static Long QR_EXPIRE_TIME = 30L;
+//    public final static Long QR_EXPIRE_TIME = 30L;
 
     /**
      * redis分布式锁

+ 34 - 0
themis-business/src/main/java/com/qmth/themis/business/domain/SysDomain.java

@@ -33,6 +33,40 @@ public class SysDomain implements Serializable {
      */
     private String tempDataDir;
 
+    private Integer qrExpireTime;
+
+    public SysDomain(){
+
+    }
+
+    public SysDomain(int datacenterId,
+                     boolean oss,
+                     List<String> attachmentType,
+                     String serverUpload,
+                     String fileHost,
+                     String serverHost,
+                     String adminLogoUrl,
+                     String tempDataDir,
+                     Integer qrExpireTime){
+        this.datacenterId = datacenterId;
+        this.oss = oss;
+        this.attachmentType = attachmentType;
+        this.serverUpload = serverUpload;
+        this.fileHost = fileHost;
+        this.serverHost = serverHost;
+        this.adminLogoUrl = adminLogoUrl;
+        this.tempDataDir = tempDataDir;
+        this.qrExpireTime = qrExpireTime;
+    }
+
+    public Integer getQrExpireTime() {
+        return qrExpireTime;
+    }
+
+    public void setQrExpireTime(Integer qrExpireTime) {
+        this.qrExpireTime = qrExpireTime;
+    }
+
     public int getDatacenterId() {
         return datacenterId;
     }

+ 22 - 9
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEQrcodeServiceImpl.java

@@ -5,21 +5,19 @@ import com.qmth.themis.business.bean.exam.QrResponseBean;
 import com.qmth.themis.business.bean.exam.QrUploadParamBean;
 import com.qmth.themis.business.cache.MobileAuthCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
-import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.enums.MobileModeEnum;
 import com.qmth.themis.business.enums.RoleEnum;
 import com.qmth.themis.business.service.TEQrcodeService;
+import com.qmth.themis.business.util.QrCodeUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.WxappUtil;
+import com.qmth.themis.common.exception.BusinessException;
 import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.security.NoSuchAlgorithmException;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
+import java.util.*;
 
 @Service
 public class TEQrcodeServiceImpl implements TEQrcodeService {
@@ -30,6 +28,9 @@ public class TEQrcodeServiceImpl implements TEQrcodeService {
     @Resource
     WxappUtil wxappUtil;
 
+    @Resource
+    QrCodeUtil qrCodeUtil;
+
     @Override
     public QrResponseBean mobileMonitor(QrMobileMonitorParamBean param) throws NoSuchAlgorithmException {
         String domain = wxappUtil.getWxappDomain().getUrl();
@@ -42,8 +43,14 @@ public class TEQrcodeServiceImpl implements TEQrcodeService {
         MobileAuthCacheUtil.setCode(mode, code);
         MobileAuthCacheUtil.setRecordId(mode, code, param.getRecordId());
         MobileAuthCacheUtil.setMonitorVideoSource(mode, code, param.getSource());
-        Long expireTime = DateUtils.addSeconds(new Date(), SystemConstant.QR_EXPIRE_TIME.intValue()).getTime();
-        redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), SystemConstant.QR_EXPIRE_TIME.intValue());
+        if (Objects.isNull(qrCodeUtil.getSysDomain().getQrExpireTime())) {
+            throw new BusinessException("未设置二维码失效时间");
+        }
+        Long expireTime = -1L;
+        if (qrCodeUtil.getSysDomain().getQrExpireTime() > 0) {
+            expireTime = DateUtils.addSeconds(new Date(), qrCodeUtil.getSysDomain().getQrExpireTime()).getTime();
+            redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), qrCodeUtil.getSysDomain().getQrExpireTime());
+        }
         QrResponseBean ret = new QrResponseBean();
         ret.setExpireTime(expireTime);
         ret.setContent(domain + "/" + mode.name().toLowerCase() + "/" + code);
@@ -67,8 +74,14 @@ public class TEQrcodeServiceImpl implements TEQrcodeService {
         if (param.getSubIndex() != null) {
             MobileAuthCacheUtil.setSubIndex(mode, code, param.getSubIndex());
         }
-        Long expireTime = DateUtils.addSeconds(new Date(), SystemConstant.QR_EXPIRE_TIME.intValue()).getTime();
-        redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), SystemConstant.QR_EXPIRE_TIME.intValue());
+        if (Objects.isNull(qrCodeUtil.getSysDomain().getQrExpireTime())) {
+            throw new BusinessException("未设置二维码失效时间");
+        }
+        Long expireTime = -1L;
+        if (qrCodeUtil.getSysDomain().getQrExpireTime() > 0) {
+            expireTime = DateUtils.addSeconds(new Date(), qrCodeUtil.getSysDomain().getQrExpireTime()).getTime();
+            redisUtil.expire(RedisKeyHelper.mobileAuthCacheKey(mode, code), qrCodeUtil.getSysDomain().getQrExpireTime());
+        }
         QrResponseBean ret = new QrResponseBean();
         ret.setExpireTime(expireTime);
         ret.setContent(domain + "/" + mode.name().toLowerCase() + "/" + code);

+ 41 - 43
themis-business/src/main/java/com/qmth/themis/business/util/QrCodeUtil.java

@@ -1,45 +1,43 @@
-//package com.qmth.themis.business.util;
-//
-//import com.alibaba.fastjson.JSONObject;
-//import com.aliyun.oss.common.utils.BinaryUtil;
-//import com.google.zxing.BarcodeFormat;
-//import com.google.zxing.EncodeHintType;
-//import com.google.zxing.MultiFormatWriter;
-//import com.google.zxing.WriterException;
-//import com.google.zxing.common.BitMatrix;
-//import com.qmth.themis.business.constant.SystemConstant;
-//
-//import javax.imageio.ImageIO;
-//import java.awt.image.BufferedImage;
-//import java.io.*;
-//import java.time.LocalDateTime;
-//import java.util.*;
-//import java.io.IOException;
-//import java.io.OutputStream;
-//
-//import com.google.zxing.BarcodeFormat;
-//import com.google.zxing.EncodeHintType;
-//import com.google.zxing.MultiFormatWriter;
-//import com.google.zxing.WriterException;
-//import com.google.zxing.client.j2se.MatrixToImageWriter;
-//import com.google.zxing.common.BitMatrix;
-//import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
-//import com.qmth.themis.business.domain.AliYunOssPublicDomain;
-//import com.qmth.themis.business.enums.UploadFileEnum;
-//import com.qmth.themis.common.util.HexUtils;
-//import org.apache.commons.codec.digest.DigestUtils;
-//import org.apache.commons.io.FileUtils;
-//
-///**
-// * @Description: Qrcode
-// * @Param:
-// * @return:
-// * @Author: wangliang
-// * @Date: 2022/3/30
-// */
-//public class QrCodeUtil {
-//
-//    /**
+package com.qmth.themis.business.util;
+
+import com.qmth.themis.business.domain.SysDomain;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: Qrcode
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/3/30
+ */
+@Component
+public class QrCodeUtil {
+    private final static Logger log = LoggerFactory.getLogger(QrCodeUtil.class);
+
+    private SysDomain sysDomain;
+
+    @Bean
+    public SysDomain sysDomainEnv(SysDomain sysDomain) {
+        this.sysDomain = new SysDomain(sysDomain.getDatacenterId(),
+                sysDomain.isOss(),
+                sysDomain.getAttachmentType(),
+                sysDomain.getServerUpload(),
+                sysDomain.getFileHost(),
+                sysDomain.getServerHost(),
+                sysDomain.getAdminLogoUrl(),
+                sysDomain.getTempDataDir(),
+                sysDomain.getQrExpireTime());
+        return this.sysDomain;
+    }
+
+    public SysDomain getSysDomain() {
+        return sysDomain;
+    }
+
+    //    /**
 //     * 生成一个二维码图片
 //     *
 //     * @param width
@@ -82,4 +80,4 @@
 //        os.close();
 //        inputStream.close();
 //    }
-//}
+}

+ 10 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TEMobileController.java

@@ -18,6 +18,7 @@ import com.qmth.themis.business.enums.MobileModeEnum;
 import com.qmth.themis.business.enums.MqTagEnum;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.MqUtil;
+import com.qmth.themis.business.util.QrCodeUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
@@ -61,6 +62,9 @@ public class TEMobileController {
     @Resource
     TOeExamRecordService tOeExamRecordService;
 
+    @Resource
+    QrCodeUtil qrCodeUtil;
+
     @ApiOperation(value = "获取登录详细信息")
     @RequestMapping(value = "/authorization", method = RequestMethod.POST)
     public Result authorization(@RequestBody MobileAuthorizationParamBean param) throws NoSuchAlgorithmException {
@@ -79,7 +83,12 @@ public class TEMobileController {
             MobileAuthorizationBean mobileAuthorizationBean = mobileService.authorization(param);
             MobileModeEnum mode = MobileModeEnum.valueOf(param.getMode().toUpperCase());
             if (Objects.nonNull(mode) && MobileModeEnum.MOBILE_MONITOR.equals(mode)) {
-                MobileAuthCacheUtil.deleteMode(MobileModeEnum.valueOf(param.getMode().toUpperCase()), param.getCode());
+                if (Objects.isNull(qrCodeUtil.getSysDomain().getQrExpireTime())) {
+                    throw new BusinessException("未设置二维码失效时间");
+                }
+                if (qrCodeUtil.getSysDomain().getQrExpireTime() > 0) {
+                    MobileAuthCacheUtil.deleteMode(MobileModeEnum.valueOf(param.getMode().toUpperCase()), param.getCode());
+                }
             }
             return ResultUtil.ok(mobileAuthorizationBean);
         } finally {

+ 36 - 10
themis-exam/src/main/java/com/qmth/themis/exam/listener/service/impl/MqOeLogicServiceImpl.java

@@ -94,6 +94,12 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                         webSocketOeServer.sendMessage(websocketDto);
                         TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, mqDto.getType().getCode());
                         teExamStudentLogService.save(teExamStudentLog);
+
+                        mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                        TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                        tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                        tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                        redisUtil.delete(key, mqDto.getId());
                     }
                 }
             });
@@ -119,6 +125,11 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                         webSocketOeServer.sendMessage(websocketDto);
                         TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, mqDto.getType().getCode());
                         teExamStudentLogService.save(teExamStudentLog);
+                        mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                        TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                        tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                        tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                        redisUtil.delete(key, mqDto.getId());
                     }
                 }
             });
@@ -146,6 +157,11 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                     webSocketOeServer.sendMessage(websocketDto);
                     TIeExamInvigilateNotice tIeExamInvigilateNotice = new TIeExamInvigilateNotice(examId, examActivityId, recordId, Long.parseLong(String.valueOf(prop.get("formUserId"))), examStudentId, MessageTypeEnum.valueOf(String.valueOf(prop.get("type")).toUpperCase()), String.valueOf(prop.get("content")));
                     tIeExamInvigilateNoticeService.saveOrUpdate(tIeExamInvigilateNotice);
+                    mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                    TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                    tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                    tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                    redisUtil.delete(key, mqDto.getId());
                 }
             }
         } else if (Objects.equals(MqTagEnum.OE_IM_BROADCASTING.name(), tag)) {//广播消息
@@ -171,6 +187,11 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                     webSocketOeServer.sendMessage(websocketDto);
                     TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, mqDto.getType().getCode());
                     teExamStudentLogService.save(teExamStudentLog);
+                    mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                    TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                    tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                    tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                    redisUtil.delete(key, mqDto.getId());
                 }
             }
         } else if (Objects.equals(MqTagEnum.OE_WEBSOCKET_MOBILE_ANSWER_READY.name(), tag)//移动端拍照/录音扫描完成
@@ -265,14 +286,14 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                             break;
                     }
                     webSocketOeServer.sendMessage(websocketDto);
+                    mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                    TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                    tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                    tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                    redisUtil.delete(key, mqDto.getId());
                 }
             }
         }
-        mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
-        TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
-        tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
-        tmRocketMessageService.saveOrUpdate(tmRocketMessage);
-        redisUtil.delete(key, mqDto.getId());
     }
 
     /**
@@ -336,6 +357,11 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                             break;
                     }
                     webSocketFirstMobileServer.sendMessage(websocketDto);
+                    mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                    TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                    tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                    tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                    redisUtil.delete(key, mqDto.getId());
                 }
             }
             String mobileSecondWebsocketId = ExamRecordCacheUtil.getMobileSecondWebsocketId(recordId);
@@ -369,13 +395,13 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                             break;
                     }
                     webSocketSecondMobileServer.sendMessage(websocketDto);
+                    mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
+                    TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+                    tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+                    tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+                    redisUtil.delete(key, mqDto.getId());
                 }
             }
         }
-        mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
-        TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
-        tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
-        tmRocketMessageService.saveOrUpdate(tmRocketMessage);
-        redisUtil.delete(key, mqDto.getId());
     }
 }

+ 1 - 0
themis-exam/src/main/resources/application.properties

@@ -181,6 +181,7 @@ sys.config.serverUpload=/Users/king/git/themis-files/
 sys.config.fileHost=localhost:6002
 sys.config.serverHost=localhost:6002
 sys.config.tempDataDir=/home/project/themis/exam/files/
+sys.config.qrExpireTime=30
 spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
 
 #api\u524D\u7F00