Ver Fonte

Merge branch 'test' into prod

MengyangDuan há 4 anos atrás
pai
commit
78b097c8ae

+ 3 - 0
.gitignore

@@ -27,3 +27,6 @@ HELP.md
 
 ### VS Code ###
 .vscode/
+
+*.DS_Store
+*/.DS_Store

+ 88 - 0
src/main/java/edu/nju/controller/AnalyzeController.java

@@ -2,13 +2,16 @@ package edu.nju.controller;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.net.URLDecoder;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 import javax.servlet.http.HttpServletResponse;
 
+import edu.nju.entities.ShortToken;
 import edu.nju.model.*;
 import edu.nju.util.AESUtil;
 import edu.nju.util.BlockChainAspect;
@@ -16,6 +19,7 @@ import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.util.DigestUtils;
 import org.springframework.web.bind.annotation.*;
 
 import edu.nju.service.AnalyzeService;
@@ -527,6 +531,90 @@ public class AnalyzeController {
 		}
 	}
 
+	/**
+	 * 根据token获取众测任务具体信息
+	 * @param token
+	 * @param response
+	 */
+	@RequestMapping(value = "/tokenToDetail")
+	@ResponseBody
+	public void tokenToDetailUrl(String token ,HttpServletResponse response){
+		try {
+			JSONObject result = new JSONObject();
+			ShortToken shortToken=aservice.tokenToDetail(token);
+			if(shortToken==null){
+				result.put("result","fail");
+				result.put("cause","身份验证失败,请前往慕测官网www.mooctest.net重新进入答题页面");
+			}else {
+				//有效
+				if(shortToken.isDisabled()){
+					shortToken.setDisabled(false);
+					aservice.saveShortToken(shortToken);
+					result.put("result", "success");
+					result.put("examId",shortToken.getExamId());
+					result.put("caseId",shortToken.getCaseId());
+					result.put("userId",shortToken.getUserId());
+					result.put("beginTime",shortToken.getBeginTime());
+					result.put("endTime",shortToken.getEndTime());
+				}
+				//无效
+				else{
+					result.put("result","fail");
+					result.put("cause","身份验证失败,请前往慕测官网www.mooctest.net重新进入答题页面");
+				}
+
+			}
+			PrintWriter out = response.getWriter();
+			out.print(result);
+			out.flush();
+			out.close();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 根据众测信息获取对应token
+	 * @param examId
+	 * @param caseId
+	 * @param userId
+	 * @param beginTime
+	 * @param endTime
+	 * @return
+	 */
+	@RequestMapping(value = "/detailToToken")
+	@ResponseBody
+	public String detailToToken(String examId,String caseId,String userId,String beginTime,String endTime){
+		JSONObject result = new JSONObject();
+		try {
+			ShortToken shortToken=aservice.findTokenByDetail(examId,caseId,userId);
+			if(shortToken==null){
+//				String token=AESUtil.encrypt(examId+"/"+caseId+"/"+userId);
+				String token= DigestUtils.md5DigestAsHex((UUID.randomUUID().toString()).getBytes());
+				ShortToken newShortToken=new ShortToken(token,beginTime,endTime,caseId,examId,userId,true);
+				aservice.saveShortToken(newShortToken);
+				result.put("result","success");
+				result.put("token",token);
+			}else{
+				String token= DigestUtils.md5DigestAsHex((UUID.randomUUID().toString()).getBytes());
+				shortToken.setToken(token);
+				shortToken.setBeginTime(beginTime);
+				shortToken.setEndTime(endTime);
+				shortToken.setDisabled(true);
+				aservice.saveShortToken(shortToken);
+				result.put("result","success");
+				result.put("token",shortToken.getToken());
+			}
+			return result.toString();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		result.put("result","fail");
+		return result.toString();
+	}
+
+
+
 
 	private String [] url2decode(String str){
 		String [] res = new String[2];

+ 44 - 0
src/main/java/edu/nju/dao/ShortTokenDao.java

@@ -0,0 +1,44 @@
+package edu.nju.dao;
+
+import edu.nju.entities.ShortToken;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @Author JiaWei Xu
+ * @Date 2020-12-03 16:35
+ * @Email xjwhhh233@outlook.com
+ */
+@Repository
+public class ShortTokenDao {
+    @Autowired
+    private MongoOperations mongoOperations;
+
+    public String save(ShortToken shortToken) {
+        mongoOperations.save(shortToken);
+        return shortToken.getId();
+    }
+
+    public ShortToken findByTokenString(String token){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("token").is(token));
+        List<ShortToken> list = mongoOperations.find(query,ShortToken.class);
+        if(list.size() == 0)  {return null;}
+        return list.get(0);
+    }
+
+    public ShortToken findByDetailInfo(String examId,String caseId,String userId){
+        Query query = new Query();
+        query.addCriteria(Criteria.where("examId").is(examId).and("caseId").is(caseId).and("userId").is(userId));
+        List<ShortToken> list = mongoOperations.find(query,ShortToken.class);
+        if(list.size() == 0)  {return null;}
+        return list.get(0);
+    }
+
+
+}

+ 110 - 0
src/main/java/edu/nju/entities/ShortToken.java

@@ -0,0 +1,110 @@
+package edu.nju.entities;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.annotation.PersistenceConstructor;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.io.Serializable;
+
+/**
+ * @Author JiaWei Xu
+ * @Date 2020-12-03 15:11
+ * @Email xjwhhh233@outlook.com
+ */
+@Document
+public class ShortToken implements Serializable {
+
+    private static final long serialVersionUID = 8980368107739914394L;
+
+    @Id
+    private String id;
+
+    private String token;
+
+    private String beginTime;
+
+    private String endTime;
+
+    private String caseId;
+
+    private String examId;
+
+    private String userId;
+
+    private boolean disabled;
+
+    @PersistenceConstructor
+    public ShortToken(String token, String beginTime, String endTime, String caseId, String examId, String userId,boolean disabled) {
+        this.token = token;
+        this.beginTime = beginTime;
+        this.endTime = endTime;
+        this.caseId = caseId;
+        this.examId = examId;
+        this.userId = userId;
+        this.disabled=disabled;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public String getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(String beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getCaseId() {
+        return caseId;
+    }
+
+    public void setCaseId(String caseId) {
+        this.caseId = caseId;
+    }
+
+    public String getExamId() {
+        return examId;
+    }
+
+    public void setExamId(String examId) {
+        this.examId = examId;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public boolean isDisabled() {
+        return disabled;
+    }
+
+    public void setDisabled(boolean disabled) {
+        this.disabled = disabled;
+    }
+}

+ 38 - 7
src/main/java/edu/nju/service/AnalyzeService.java

@@ -10,6 +10,7 @@ import com.google.common.collect.Lists;
 import edu.nju.dao.*;
 import edu.nju.entities.*;
 import edu.nju.model.*;
+import edu.nju.util.DataMaskingUtil;
 import edu.nju.util.HTTP;
 import edu.nju.util.TimeUtil;
 import org.apache.commons.lang3.EnumUtils;
@@ -84,6 +85,12 @@ public class AnalyzeService {
 	@Autowired
 	ExtraService extraService;
 
+	@Autowired
+
+	ShortTokenDao shortTokenDao;
+
+	ExamDao examDao;
+
 	@Value("${server.host}")
 	private String serverHost;
 	@Value("${report.port}")
@@ -96,6 +103,8 @@ public class AnalyzeService {
 					"社交类app","江苏省南京市");
 
 
+
+
 	Logger logger= LoggerFactory.getLogger(RecommendService.class);
 	
 	//获取所有bug
@@ -586,7 +595,7 @@ public class AnalyzeService {
 		if (result != null && !result.equals("")) {
 			JSONObject json = new JSONObject(result);
 			if (json.has("name") && !json.isNull("name")) {
-				res.setName(json.getString("name"));
+				res.setName(DataMaskingUtil.nameMasking(json.getString("name")));
 			}
 			if (json.has("school") && !json.isNull("school")) {
 				res.setSchool( json.getString("school"));
@@ -600,9 +609,10 @@ public class AnalyzeService {
 			if (json.has("createTime") && !json.isNull("createTime")) {
 				res.setRegisterTime(json.getLong("createTime"));
 			}
-			if (json.has("photoUrl") && !json.isNull("photoUrl")) {
-				res.setPhotoUrl(json.getString("photoUrl"));
-			}
+			res.setPhotoUrl(DataMaskingUtil.getDefaultMooctestUrl());//使用默认的慕测头像
+//			if (json.has("photoUrl") && !json.isNull("photoUrl")) {
+//				res.setPhotoUrl(json.getString("photoUrl"));
+//			}
 		}
 		//用户lebels
 		res.setLabels(getUserLabels(workerId));
@@ -824,8 +834,11 @@ public class AnalyzeService {
 //		cache.put("word","Hello Guava Cache");
 //		System.out.println(cache.getIfPresent("word"));
 
-
+		Exam exam = examDao.findById(caseId);
 		Task task=taskDao.findById(taskId);
+
+
+
 		long startTime=0;
 		long endTime=0;
 		String taskName="";
@@ -833,9 +846,11 @@ public class AnalyzeService {
 		if(task!=null) {
 			startTime = task.getStart_time();
 			endTime = task.getEnd_time();
-			taskName = task.getName();
 			writeMins = task.getTotal_mins();
 		}
+		if(exam!=null){
+			taskName = exam.getName();
+		}
 		String caseTakeId=caseId+"-"+taskId;
 		List<Bug>bugs=bdao.findByCaseid(caseTakeId);
 		int bugNum=bugs.size();
@@ -926,7 +941,8 @@ public class AnalyzeService {
 			if (result != null && !result.equals("")) {
 				JSONObject json = new JSONObject(result);
 				if (json.has("name") && !json.isNull("name")) {
-					name = json.getString("name");
+//					name = json.getString("name");
+					name = DataMaskingUtil.nameMasking(json.getString("name"));
 				}
 				if (json.has("school") && !json.isNull("school")) {
 					school = json.getString("school");
@@ -968,6 +984,9 @@ public class AnalyzeService {
 		StringBuffer managerCheckUrl = new StringBuffer("http://");
 		managerCheckUrl.append(serverHost).append(":").append(serverPort).append("/report/managerCheck/")
 				.append(taskId).append("/").append(caseId);
+		if(reports.size()!=0)
+			managerCheckUrl.append("?identity=0&report_id=").append(reports.get(0).getId())
+					.append("&worker_id=").append(reports.get(0).getWorker_id());
 		analyseVO.setManagerCheck(managerCheckUrl.toString());
 		return analyseVO;
 	}
@@ -1062,6 +1081,18 @@ public class AnalyzeService {
 		return res;
 	}
 
+	public ShortToken tokenToDetail(String token){
+		return shortTokenDao.findByTokenString(token);
+	}
+
+	public ShortToken findTokenByDetail(String examId,String caseID,String userId){
+		return shortTokenDao.findByDetailInfo(examId,caseID,userId);
+	}
+
+	public String saveShortToken(ShortToken shortToken){
+		return shortTokenDao.save(shortToken);
+	}
+
 
 
 

+ 3 - 1
src/main/java/edu/nju/util/AESUtil.java

@@ -4,6 +4,7 @@ package edu.nju.util;
 import javax.crypto.Cipher;
 import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.SecretKeySpec;
+import java.net.URLEncoder;
 import java.util.Base64;
 
 public class AESUtil {
@@ -23,7 +24,8 @@ public class AESUtil {
             cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
             bytes = cipher.doFinal(bytes);
             bytes = Base64.getEncoder().encode(bytes);
-            return new String(bytes);
+            String res  = new String(bytes);
+            return URLEncoder.encode(res);
         } catch (Exception e) {
             e.printStackTrace();
             return null;

+ 32 - 0
src/main/java/edu/nju/util/DataMaskingUtil.java

@@ -0,0 +1,32 @@
+package edu.nju.util;
+
+import com.google.common.base.Strings;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * 数据脱敏工具类
+ */
+public class DataMaskingUtil {
+
+    public static String nameMasking(String name){
+        name  = name.trim();
+        if(name.length()<2){
+            return name;
+        }else if(name.length()==2){
+            return name.charAt(0)+"*";
+        }else{
+            int unitLength = name.length()/3;
+            return StringUtils.left(name,unitLength)
+                    .concat(Strings.repeat("*",name.length()-2*unitLength))
+                    .concat(StringUtils.right(name,unitLength));
+        }
+    }
+
+    public static String getDefaultMooctestUrl(){
+        return "http://www.mooctest.net/assets/img/mooctest.png";
+    }
+
+
+
+
+}