浏览代码

merge from release_v4.1.2

deason 3 年之前
父节点
当前提交
9c7b19e96c

+ 19 - 115
examcloud-core-examwork-api-provider/src/main/java/cn/com/qmth/examcloud/core/examwork/api/controller/ExamController.java

@@ -26,7 +26,6 @@ import cn.com.qmth.examcloud.core.basic.api.response.GetOrgResp;
 import cn.com.qmth.examcloud.core.basic.api.response.GetOrgsResp;
 import cn.com.qmth.examcloud.core.examwork.api.controller.bean.CopyExamDomain;
 import cn.com.qmth.examcloud.core.examwork.api.controller.bean.ExamDomain;
-import cn.com.qmth.examcloud.core.examwork.service.bean.ExamIpLimitInfo;
 import cn.com.qmth.examcloud.core.examwork.api.controller.bean.ExamOrgSettingsDomain;
 import cn.com.qmth.examcloud.core.examwork.api.controller.bean.StudentSpecialSettingsDomain;
 import cn.com.qmth.examcloud.core.examwork.base.enums.ExamProperty;
@@ -35,6 +34,7 @@ import cn.com.qmth.examcloud.core.examwork.dao.entity.*;
 import cn.com.qmth.examcloud.core.examwork.dao.enums.IpLimitType;
 import cn.com.qmth.examcloud.core.examwork.service.ExamService;
 import cn.com.qmth.examcloud.core.examwork.service.bean.ExamInfo;
+import cn.com.qmth.examcloud.core.examwork.service.bean.ExamIpLimitInfo;
 import cn.com.qmth.examcloud.core.examwork.service.bean.ExamSpecialSettingsInfo;
 import cn.com.qmth.examcloud.core.examwork.service.cache.ExamSettingsCache;
 import cn.com.qmth.examcloud.core.examwork.service.impl.ExamStudentServiceImpl;
@@ -43,6 +43,7 @@ import cn.com.qmth.examcloud.core.oe.admin.api.request.CheckExamIsStartedReq;
 import cn.com.qmth.examcloud.core.oe.admin.api.response.CheckExamIsStartedResp;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
 import cn.com.qmth.examcloud.support.cache.bean.*;
+import cn.com.qmth.examcloud.support.enums.ExamProperties;
 import cn.com.qmth.examcloud.support.privilege.PrivilegeDefine;
 import cn.com.qmth.examcloud.support.privilege.PrivilegeManager;
 import cn.com.qmth.examcloud.task.api.DataSyncCloudService;
@@ -315,7 +316,7 @@ public class ExamController extends ControllerSupport {
             }
 
             DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
-            DynamicEnum ipLimit = manager.getByName("IP_LIMIT");
+            DynamicEnum ipLimit = manager.getByName(ExamProperties.IP_LIMIT.name());
 
             ExamPropertyEntity propertyEntity = examPropertyRepo.findByExamIdAndKeyId(next.getId(), ipLimit.getId());
             boolean ipLimited = null != propertyEntity && StringUtils.isNotBlank(propertyEntity.getValue()) && Boolean.parseBoolean(propertyEntity.getValue());
@@ -1299,140 +1300,43 @@ public class ExamController extends ControllerSupport {
 
         examOrgPropertyRepo.deleteByExamId(examId);
 
-        examSpecialSettingsRepo
-                .deleteByExamIdAndOrgIdIsNotNullAndCourseIdIsNullAndStudentIdIsNull(examId);
-    }
-
-    /**
-     * 方法注释
-     *
-     * @param request
-     * @param examId
-     * @return
-     * @author WANGWEI
-     */
-    @ApiOperation(value = "考试IP限制", notes = "")
-    //@GetMapping("ipLimit/{examId}")
-    public Map<String, Object> ipLimit(HttpServletRequest request, @PathVariable Long examId) {
-        User accessUser = getAccessUser();
-        StudentCacheBean studentCache = CacheHelper.getStudent(accessUser.getUserId());
-        Long orgId = studentCache.getOrgId();
-        ExamPropertyCacheBean ipLimitProperty = CacheHelper.getExamProperty(examId, "IP_LIMIT");
-
-        Map<String, Object> map = Maps.newHashMap();
-
-        Boolean ipLimit = null;
-        if (null != ipLimitProperty) {
-            ipLimit = StringUtil.isTrue(ipLimitProperty.getValue());
-        }
-
-        if (null == ipLimit || !ipLimit) {
-            map.put("limited", false);
-            map.put("desc", "未配置IP限制");
-            return map;
-        }
-
-        String realIp = request.getHeader("x-forwarded-for");
-        if (StringUtils.isBlank(realIp)) {
-            realIp = request.getHeader("x-real-ip");
-        }
-        if (StringUtils.isBlank(realIp)) {
-            map.put("limited", true);
-            map.put("desc", "网络受限");
-            return map;
-        }
-        realIp = realIp.trim();
-
-        ExamPropertyCacheBean ipAddressesProperty = CacheHelper.getExamProperty(examId,
-                "IP_ADDRESSES");
-
-        String ipAddresses = null;
-        if (null != ipAddressesProperty) {
-            ipAddresses = ipAddressesProperty.getValue();
-        }
-
-        boolean limited = true;
-        if (StringUtils.isNotBlank(ipAddresses)) {
-            String[] arr = StringUtils.split(ipAddresses, ';');
-
-            for (String cur : arr) {
-                String ip = StringUtils.replace(cur.trim(), ".", "\\.");
-                ip = StringUtils.replace(ip, "*", "\\w+");
-                if (realIp.matches(ip)) {
-                    limited = false;
-                    map.put("desc", "IP段配置放行");
-                    break;
-                }
-            }
-        }
-
-        if (limited) {
-            String key = "IP_" + orgId;
-            String value = redisClient.get(key, String.class);
-            if (null == value) {
-                map.put("desc", "无机构管理员登录");
-            } else {
-                @SuppressWarnings("unchecked")
-                Set<String> userKeyList = JsonUtil.fromJson(value, Set.class);
-
-                for (String userKey : userKeyList) {
-                    User curUser = redisClient.get(userKey, User.class);
-                    if (null != curUser) {
-                        String clientIp = curUser.getClientIp();
-                        if (null != clientIp) {
-                            // IP取前三段
-                            clientIp = clientIp.substring(0, clientIp.lastIndexOf(".") + 1);
-                            if (realIp.startsWith(clientIp)) {
-                                limited = false;
-                                map.put("desc", "机构管理员[key=" + userKey + "]登录放行");
-                                break;
-                            }
-                        }
-                    }
-
-                }
-            }
-        }
-
-        map.put("limited", limited);
-
-        return map;
+        examSpecialSettingsRepo.deleteByExamIdAndOrgIdIsNotNullAndCourseIdIsNullAndStudentIdIsNull(examId);
     }
 
-    @ApiOperation(value = "ip限制分页",notes = "ip限制分页")
+    @ApiOperation(value = "ip限制分页", notes = "ip限制分页")
     @GetMapping("ipLimited/page/{curPage}/{pageSize}")
     public PageInfo<ExamIpLimitInfo> ipLimited(@PathVariable Integer curPage, @PathVariable Integer pageSize,
                                                Long examId, Integer limitType, String ip) {
         return examService.pageIpLimited(curPage, pageSize, examId, limitType, ip);
     }
 
-    @ApiOperation(value = "保存ip限制信息",notes = "保存ip限制")
+    @ApiOperation(value = "保存ip限制信息", notes = "保存ip限制")
     @PostMapping("ipLimited")
     public void save(String ids, @RequestBody ExamIpLimitEntity entity) {
         examService.saveIpLimit(ids, entity);
     }
 
-    @ApiOperation(value = "根据主键删除ip限制",notes = "删除ip限制")
+    @ApiOperation(value = "根据主键删除ip限制", notes = "删除ip限制")
     @DeleteMapping("ipLimited/{ids}")
     public void delete(@PathVariable String ids) {
         examService.deleteIpLimit(ids);
     }
 
-    @ApiOperation(value = "根据考试id批量删除ip限制",notes = "删除ip限制")
+    @ApiOperation(value = "根据考试id批量删除ip限制", notes = "删除ip限制")
     @DeleteMapping("ipLimited/all/{examId}")
     public void delete(@PathVariable Long examId) {
         examService.deleteIpLimit(examId);
     }
 
-    @ApiOperation(value = "查询整体控制和学习中心控制",notes = "查询控制")
+    @ApiOperation(value = "查询整体控制和学习中心控制", notes = "查询控制")
     @GetMapping("ipLimited/property/{examId}")
-    public Map<String,Boolean> ipLimitedProperty(@PathVariable Long examId) {
+    public Map<String, Boolean> ipLimitedProperty(@PathVariable Long examId) {
         return examService.getIpLimitedProperty(examId);
     }
 
-    @ApiOperation(value = "修改整体控制和学习中心控制",notes = "修改控制")
+    @ApiOperation(value = "修改整体控制和学习中心控制", notes = "修改控制")
     @PostMapping("ipLimited/property/{examId}")
-    public void ipLimitedProperty(@PathVariable Long examId, @RequestBody Map<String,Object> map) {
+    public void ipLimitedProperty(@PathVariable Long examId, @RequestBody Map<String, Object> map) {
         examService.updateIpLimitedProperty(examId, map);
     }
 
@@ -1446,7 +1350,7 @@ public class ExamController extends ControllerSupport {
     @ApiOperation(value = "导入考试ip限制", notes = "导入")
     @PostMapping("ipLimited/import/{examId}")
     public Map<String, Object> importExamIpLimit(@PathVariable Long examId,
-                                  @RequestParam CommonsMultipartFile file) {
+                                                 @RequestParam CommonsMultipartFile file) {
         DiskFileItem item = (DiskFileItem) file.getFileItem();
         File storeLocation = item.getStoreLocation();
         List<String[]> lineList;
@@ -1499,7 +1403,7 @@ public class ExamController extends ControllerSupport {
                 hasError = true;
             }
             IpLimitType ipLimitType = IpLimitType.formByName(line[1]);
-            if(ipLimitType==null){
+            if (ipLimitType == null) {
                 msg.append("  不符合格式的限制类型");
                 hasError = true;
             }
@@ -1511,7 +1415,7 @@ public class ExamController extends ControllerSupport {
 
             if (hasError) {
                 Map<String, Object> map = Maps.newHashMap();
-                map.put("lineNum", i+1);
+                map.put("lineNum", i + 1);
                 map.put("msg", msg);
                 failRecords.add(map);
             } else {
@@ -1533,7 +1437,7 @@ public class ExamController extends ControllerSupport {
         return map;
     }
 
-    @ApiOperation(value = "导出Ip限制",notes = "导出Ip限制")
+    @ApiOperation(value = "导出Ip限制", notes = "导出Ip限制")
     @GetMapping("ipLimited/export")
     public void export(Long examId, Integer limitType, String ip) {
         List<ExamIpLimitEntity> list = examService.findAllIpLimits(examId, limitType, ip);
@@ -1569,16 +1473,16 @@ public class ExamController extends ControllerSupport {
         return false;
     }
 
-    @ApiOperation(value = "检查是否Ip限制",notes = "检查是否Ip限制")
+    @ApiOperation(value = "检查是否Ip限制", notes = "检查是否Ip限制")
     @GetMapping("ipLimit/{examId}")
     public Map<String, Object> ipLimited(HttpServletRequest request, @PathVariable Long examId) {
         String realIp = getIp(request);
         User accessUser = getAccessUser();
         boolean ipLimited = examService.getIpLimited(realIp, examId, accessUser);
         Map<String, Object> map = new HashMap<>();
-        map.put("limited",ipLimited);
+        map.put("limited", ipLimited);
         if (ipLimited) {
-            map.put("desc","该考试当前考生受限");
+            map.put("desc", "该考试当前考生受限");
         }
         return map;
     }

+ 28 - 44
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/impl/ExamServiceImpl.java

@@ -13,22 +13,13 @@ import cn.com.qmth.examcloud.commons.util.DateUtil;
 import cn.com.qmth.examcloud.commons.util.DateUtil.DatePatterns;
 import cn.com.qmth.examcloud.commons.util.JsonUtil;
 import cn.com.qmth.examcloud.commons.util.PathUtil;
-import cn.com.qmth.examcloud.commons.util.StringUtil;
 import cn.com.qmth.examcloud.core.basic.api.OrgCloudService;
 import cn.com.qmth.examcloud.core.basic.api.bean.OrgBean;
 import cn.com.qmth.examcloud.core.basic.api.request.GetOrgReq;
 import cn.com.qmth.examcloud.core.basic.api.response.GetOrgResp;
 import cn.com.qmth.examcloud.core.examwork.base.enums.ExamProperty;
-import cn.com.qmth.examcloud.core.examwork.dao.ExamIpLimitRepo;
-import cn.com.qmth.examcloud.core.examwork.dao.ExamOrgPropertyRepo;
-import cn.com.qmth.examcloud.core.examwork.dao.ExamPropertyRepo;
-import cn.com.qmth.examcloud.core.examwork.dao.ExamRepo;
-import cn.com.qmth.examcloud.core.examwork.dao.ExamSpecialSettingsRepo;
-import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamEntity;
-import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamIpLimitEntity;
-import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamOrgPropertyEntity;
-import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamPropertyEntity;
-import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamSpecialSettingsEntity;
+import cn.com.qmth.examcloud.core.examwork.dao.*;
+import cn.com.qmth.examcloud.core.examwork.dao.entity.*;
 import cn.com.qmth.examcloud.core.examwork.dao.enums.IpLimitType;
 import cn.com.qmth.examcloud.core.examwork.service.ExamService;
 import cn.com.qmth.examcloud.core.examwork.service.ExamStudentService;
@@ -38,8 +29,8 @@ import cn.com.qmth.examcloud.core.examwork.service.bean.ExamSpecialSettingsInfo;
 import cn.com.qmth.examcloud.core.examwork.service.cache.ExamPropertyCache;
 import cn.com.qmth.examcloud.core.examwork.service.cache.ExamSettingsCache;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
-import cn.com.qmth.examcloud.support.cache.bean.ExamPropertyCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.StudentCacheBean;
+import cn.com.qmth.examcloud.support.enums.ExamProperties;
 import cn.com.qmth.examcloud.support.privilege.PrivilegeDefine;
 import cn.com.qmth.examcloud.support.privilege.PrivilegeManager;
 import cn.com.qmth.examcloud.task.api.DataSyncCloudService;
@@ -65,15 +56,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.persistence.criteria.Predicate;
 import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -856,9 +840,9 @@ public class ExamServiceImpl implements ExamService {
 
         PageInfo<ExamIpLimitInfo> pageInfo = new PageInfo<>();
         List<ExamIpLimitInfo> list = new ArrayList<>();
-        pages.getList().forEach(e->{
+        pages.getList().forEach(e -> {
             ExamIpLimitInfo domain = new ExamIpLimitInfo();
-            BeanUtils.copyProperties(e,domain);
+            BeanUtils.copyProperties(e, domain);
             domain.setLimitType(e.getLimitType() == null ? "" : e.getLimitType().getName());
             Optional<ExamEntity> byId = examRepo.findById(examId);
             byId.ifPresent(examEntity -> domain.setExamName(examEntity.getName()));
@@ -882,7 +866,7 @@ public class ExamServiceImpl implements ExamService {
     @Override
     public boolean getIpLimited(String realIp, Long examId, User accessUser) {
         DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
-        DynamicEnum ipLimit = manager.getByName("IP_LIMIT");
+        DynamicEnum ipLimit = manager.getByName(ExamProperties.IP_LIMIT.name());
 
         //是否开启Ip限制
         Boolean ipLimited = getExamLimitProperty(examId, ipLimit.getId(), false);
@@ -892,7 +876,7 @@ public class ExamServiceImpl implements ExamService {
             Boolean totalLimit = getExamLimitProperty(examId, ipTotalLimit.getId(), false);
             if (totalLimit) {
                 //在白名单中
-                int count = examIpLimitRepo.countByExamIdAndLimitTypeAndIp(examId, IpLimitType.HAS_ACCESS.name(),realIp);
+                int count = examIpLimitRepo.countByExamIdAndLimitTypeAndIp(examId, IpLimitType.HAS_ACCESS.name(), realIp);
                 if (count == 0) {
                     return true;
                 } else {
@@ -901,7 +885,7 @@ public class ExamServiceImpl implements ExamService {
             } else {
                 //在黑名单中
                 int count = examIpLimitRepo.countByExamIdAndLimitTypeAndIp(examId, IpLimitType.NO_ACCESS.name(), realIp);
-                if (count > 0){
+                if (count > 0) {
                     return true;
                 } else {
                     return getCenterLimit(manager, examId, accessUser.getUserId(), realIp);
@@ -915,7 +899,7 @@ public class ExamServiceImpl implements ExamService {
     private boolean getCenterLimit(DynamicEnumManager manager, Long examId, Long studentId, String realIp) {
         //学习中心访问控制
         DynamicEnum ipCenterLimit = manager.getByName("IP_CENTER_LIMIT");
-        Boolean centerLimit = getExamLimitProperty(examId,ipCenterLimit.getId(), false);
+        Boolean centerLimit = getExamLimitProperty(examId, ipCenterLimit.getId(), false);
         if (centerLimit) {
             StudentCacheBean studentCache = CacheHelper.getStudent(studentId);
             Long orgId = studentCache.getOrgId();
@@ -953,25 +937,25 @@ public class ExamServiceImpl implements ExamService {
         //ids不为空,说明是批量设置限制类型
         if (StringUtils.isNotBlank(ids)) {
             List<Long> ipIds = getIdsByPath(ids);
-            if(entity.getLimitType()!=null){
-                examIpLimitRepo.updateLimitType(entity.getLimitType(),entity.getExamId(),ipIds);
+            if (entity.getLimitType() != null) {
+                examIpLimitRepo.updateLimitType(entity.getLimitType(), entity.getExamId(), ipIds);
             }
         } else {
             Long id = entity.getId();
             Date now = new Date();
             //新增
-            if (id==null) {
+            if (id == null) {
                 entity.setCreationTime(now);
                 examIpLimitRepo.save(entity);
             } else {
                 //更新
                 Optional<ExamIpLimitEntity> byId = examIpLimitRepo.findById(id);
-                if (byId.isPresent()){
+                if (byId.isPresent()) {
                     ExamIpLimitEntity ipLimitEntity = byId.get();
-                    if(StringUtils.isNotBlank(entity.getIp())){
+                    if (StringUtils.isNotBlank(entity.getIp())) {
                         ipLimitEntity.setIp(entity.getIp());
                     }
-                    if(entity.getLimitType()!=null){
+                    if (entity.getLimitType() != null) {
                         ipLimitEntity.setLimitType(entity.getLimitType());
                     }
                     ipLimitEntity.setUpdateTime(now);
@@ -996,14 +980,14 @@ public class ExamServiceImpl implements ExamService {
 
     @Override
     public Map<String, Boolean> getIpLimitedProperty(Long examId) {
-        Map<String,Boolean> map = new HashMap<>();
+        Map<String, Boolean> map = new HashMap<>();
 
         DynamicEnumManager manager = ExamProperty.getDynamicEnumManager();
         DynamicEnum ipTotalLimit = manager.getByName("IP_TOTAL_LIMIT");
         DynamicEnum ipCenterLimit = manager.getByName("IP_CENTER_LIMIT");
 
-        map.put("totalLimit", getExamLimitProperty(examId,ipTotalLimit.getId(),false));
-        map.put("centerLimit",getExamLimitProperty(examId,ipCenterLimit.getId(),false));
+        map.put("totalLimit", getExamLimitProperty(examId, ipTotalLimit.getId(), false));
+        map.put("centerLimit", getExamLimitProperty(examId, ipCenterLimit.getId(), false));
         return map;
     }
 
@@ -1020,13 +1004,13 @@ public class ExamServiceImpl implements ExamService {
         String totalLimit = map.get("totalLimit").toString();
         String centerLimit = map.get("centerLimit").toString();
 
-        saveIpLimitEntity(totalEntity,totalLimit,ipTotalLimit,examId);
-        saveIpLimitEntity(centerEntity,centerLimit,ipCenterLimit,examId);
+        saveIpLimitEntity(totalEntity, totalLimit, ipTotalLimit, examId);
+        saveIpLimitEntity(centerEntity, centerLimit, ipCenterLimit, examId);
     }
 
     private void saveIpLimitEntity(ExamPropertyEntity propertyEntity, String limitValue, DynamicEnum dynamicEnum, Long examId) {
         Date now = new Date();
-        if (propertyEntity!=null) {
+        if (propertyEntity != null) {
             propertyEntity.setValue(limitValue);
             propertyEntity.setUpdateTime(now);
             examPropertyRepo.save(propertyEntity);
@@ -1051,23 +1035,23 @@ public class ExamServiceImpl implements ExamService {
                 .collect(Collectors.toList());
     }
 
-    private Boolean getExamLimitProperty(Long examId, Long keyId ,Boolean defaultValue) {
+    private Boolean getExamLimitProperty(Long examId, Long keyId, Boolean defaultValue) {
         ExamPropertyEntity propertyEntity = examPropertyRepo.findByExamIdAndKeyId(examId, keyId);
         return propertyEntity != null && StringUtils.isNotBlank(propertyEntity.getValue())
                 ? Boolean.valueOf(propertyEntity.getValue()) : defaultValue;
     }
 
-    private Specification<ExamIpLimitEntity> getSpec(Long examId, Integer limitType, String ip){
+    private Specification<ExamIpLimitEntity> getSpec(Long examId, Integer limitType, String ip) {
         Specification<ExamIpLimitEntity> spec = (root, query, cb) -> {
             List<Predicate> predicates = new ArrayList<>();
-            if(examId!=null){
+            if (examId != null) {
                 predicates.add(cb.equal(root.get("examId"), examId));
             }
-            if(limitType!=null){
+            if (limitType != null) {
                 predicates.add(cb.equal(root.get("limitType"), limitType));
             }
-            if(StringUtils.isNotBlank(ip)){
-                predicates.add(cb.like(root.get("ip"), "%"+ip+"%"));
+            if (StringUtils.isNotBlank(ip)) {
+                predicates.add(cb.like(root.get("ip"), "%" + ip + "%"));
             }
             return cb.and(predicates.toArray(new Predicate[predicates.size()]));
         };

+ 1 - 0
examcloud-core-examwork-starter/pom.xml

@@ -55,6 +55,7 @@
                 <artifactId>maven-assembly-plugin</artifactId>
                 <configuration>
                     <finalName>examcloud-core-examwork</finalName>
+                    <skipAssembly>${skipAssembly}</skipAssembly>
                     <descriptors>
                         <descriptor>assembly.xml</descriptor>
                     </descriptors>

+ 1 - 0
examcloud-core-examwork-starter/src/main/resources/log4j2.xml

@@ -36,6 +36,7 @@
 
     <Loggers>
         <logger name="springfox.documentation" level="WARN"/>
+        <logger name="org.mongodb.driver" level="WARN"/>
         <logger name="org.springframework" level="WARN"/>
         <logger name="org.hibernate" level="WARN"/>
         <logger name="org.apache" level="WARN"/>