Quellcode durchsuchen

fixed 新版本人脸算法

digital-human
yk vor 1 Jahr
Ursprung
Commit
1a75d64f3c
12 geänderte Dateien mit 861 neuen und 341 gelöschten Zeilen
  1. +6
    -6
      pom.xml
  2. +1
    -26
      src/main/java/com/lecoo/kjg/web/sys/service/support/AuthMappingItemProcessorService.java
  3. +24
    -27
      src/main/java/com/lecoo/kjg/web/sys/service/support/EmpServiceSupport.java
  4. +47
    -247
      src/main/java/com/lecoo/kjg/web/sys/service/support/FaceServiceSupport.java
  5. +14
    -1
      src/main/java/com/lecoo/kjg/web/sys/utils/ImageUtil.java
  6. +2
    -3
      src/main/java/com/lecoo/kjg/web/sys/web/Account2Controller.java
  7. +57
    -16
      src/main/java/com/lecoo/kjg/web/sys/web/api/CommonApiController.java
  8. +4
    -4
      src/main/java/com/lecoo/kjg/web/sys/web/api/FaceApiController.java
  9. +332
    -0
      src/main/java/com/lecoo/kjg/web/utils/OkHttpUtil.java
  10. +4
    -3
      src/main/resources/config/application-dev.yml
  11. +9
    -8
      src/main/resources/config/application.yml
  12. +361
    -0
      src/main/resources/views/themes/default/modules/sys/account/registerEmpTest.html

+ 6
- 6
pom.xml Datei anzeigen

@@ -293,12 +293,6 @@
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>com.auth0</groupId>
@@ -313,6 +307,12 @@
<version>3.0.0</version>
</dependency>

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.9</version>
</dependency>


</dependencies>



+ 1
- 26
src/main/java/com/lecoo/kjg/web/sys/service/support/AuthMappingItemProcessorService.java Datei anzeigen

@@ -27,14 +27,6 @@ public class AuthMappingItemProcessorService implements ItemProcessor<AuthMappin
@Autowired
private EmpDao empDao;

@Autowired
private AuthMappingDao authMappingDao;

@Autowired
private DeviceServiceSupport deviceService;

@Autowired
private RedisUtils redisUtils;

@Override
public AuthMapping process(AuthMapping authMapping) throws Exception {
@@ -52,24 +44,7 @@ public class AuthMappingItemProcessorService implements ItemProcessor<AuthMappin
int status = jsonObject.getInteger("status");

if (status == 0) {
String mis = DateUtils.getMillsSecondsDouble();
authMappingDao.updateTsByEmp(authMapping.getEmpId(), mis);

List<AuthMapping> authMappings = authMappingDao.getByEmp(authMapping.getEmpId());
List<String> list = Lists.newArrayList();
authMappings.forEach(am->{
list.add(am.getDevId());
});


deviceService.updateAuthTs(list, mis);

for (String a : list) {
if (StringUtils.isNotEmpty(a) && Emp.STATUS_NORMAL.equals(emp.getStatus())) {
redisUtils.setGroupString(a+":face-latest-ts", mis);
}
}

empService.updAuthMapping(emp);
}
}
return null;


+ 24
- 27
src/main/java/com/lecoo/kjg/web/sys/service/support/EmpServiceSupport.java Datei anzeigen

@@ -629,21 +629,18 @@ public class EmpServiceSupport
return new ResponseInfo(ResponseCode.FACE_FETCH_FAIL, hasObj.getString("errMsg"));
}
JSONObject obj = faceServiceSupport.hasface(token, id, base64Image);
JSONObject faceRectangle = obj.getJSONObject("data");
int status = obj.getInteger("status");
JSONObject obj = faceServiceSupport.getFaceExtraction(token, id, base64Image);
if (status != 0) {
return new ResponseInfo(ResponseCode.FACE_FETCH_FAIL, obj.getString("errMsg"));
}
if (!ObjectUtils.anyNotNull(faceRectangle) || faceRectangle.getJSONObject("faceRectangle").isEmpty()) {
return new ResponseInfo(ResponseCode.CW_FACE_IMG_NO_FACE, "no face");
if (!obj.containsKey("feature")) {
return new ResponseInfo(ResponseCode.FACE_FETCH_FAIL, obj.getString("errorMessage"));
}
Date date = new Date();
emp.setUpdateTime(date);
emp.setFaceImageName(newFileName);
JSONArray array = faceRectangle.getJSONArray("feature");
JSONArray array = obj.getJSONArray("feature");
EmpFaceFeature empFaceFeature = new EmpFaceFeature();
empFaceFeature.setEmpId(id);
@@ -671,8 +668,6 @@ public class EmpServiceSupport
}
this.updAuthMapping(emp);
// }
return new ResponseInfo(auditStatus);
} catch (UnsupportedFormatException e){
@@ -680,6 +675,8 @@ public class EmpServiceSupport
} catch (IOException e) {
e.printStackTrace();
return new ResponseInfo(ResponseCode.FILE_UPLOAD_FAIL);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@@ -1140,19 +1137,15 @@ public class EmpServiceSupport
faceImage = faceImage.replaceAll("data:image/jpeg;base64,", "");
JSONObject faceRectangle = faceServiceSupport.hasface("", emp.getId(), faceImage);
System.err.println("======face===REG---ssss");
System.err.println(faceRectangle.toJSONString());
System.err.println("======face===REG---eeee");
int status = faceRectangle.getInteger("status");
faceRectangle = faceRectangle.getJSONObject("data");
String userName = emp.getRealName();
if (status != 0) {
return "抱歉,您的账号 " + userName + " 注册失败,"+faceRectangle.getString("errMsg");
JSONObject faceRectangle = null;
try {
faceRectangle = faceServiceSupport.getFaceExtraction("", emp.getId(), faceImage);
} catch (Exception e) {
return e.getMessage();
}
if (!ObjectUtils.anyNotNull(faceRectangle) || faceRectangle.getJSONObject("faceRectangle").isEmpty()) {
return "抱歉,您的账号 " + userName + " 注册失败,上传的头像未找到人脸!";
String userName = emp.getRealName();
if (!faceRectangle.containsKey("feature")) {
return "抱歉,您的账号 " + userName + " 注册失败,"+faceRectangle.getString("errorMessage");
}
JSONObject json = imageUtil.base64ToStorage(faceImage, true);
@@ -1219,7 +1212,7 @@ public class EmpServiceSupport
int status = getJson.getInteger("status");
String featureStr = "";
if (0 == status) {
featureStr = getJson.getString("feature");
featureStr = getJson.getJSONArray("feature").toJSONString();
} else {
return getJson;
}
@@ -1253,11 +1246,15 @@ public class EmpServiceSupport
faceImage = faceImage.replaceAll("data:image/jpeg;base64,", "");
JSONObject faceRectangle = faceServiceSupport.hasface("", emp.getId(), faceImage);
faceRectangle = faceRectangle.getJSONObject("data");
JSONObject faceRectangle = null;
try {
faceRectangle = faceServiceSupport.getFaceExtraction("", emp.getId(), faceImage);
} catch (Exception e) {
throw new RuntimeException(e);
}
JSONObject json = imageUtil.base64ToStorage(faceImage, true);
if (json.getBoolean("ok")) {
if (faceRectangle.containsKey("feature")) {
String imgUrl = json.getString("imgUrl");
emp.setFaceImageName(imgUrl);


+ 47
- 247
src/main/java/com/lecoo/kjg/web/sys/service/support/FaceServiceSupport.java Datei anzeigen

@@ -5,7 +5,9 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jeesite.common.config.Global;
import com.jeesite.common.lang.StringUtils;
import com.lecoo.kjg.web.sys.utils.ImageUtil;
import com.lecoo.kjg.web.utils.OkHttpUtil;
import kong.unirest.HttpResponse;
import kong.unirest.Unirest;
import lombok.extern.slf4j.Slf4j;
@@ -24,6 +26,7 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.UUID;
@Slf4j
@Component
@@ -132,189 +135,55 @@ public class FaceServiceSupport {
return token;*/
}
public JSONObject getFaceExtraction(String token, String imageId, String imgBase64) {
/********CURL 请求方式********/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
String[] cmds = {"curl", "--location", "--request", "POST", faceServer + extractionPath, "--header", "Authorization: Bearer "+token, "--header", "Content-Type: application/json", "--data", content};
String res = execCurl(cmds);
log.info("----------------");
log.info(faceServer);
log.info("----------------");
log.info("Face Engine-detectFace return >> " + res);
JSONObject json = JSONObject.parseObject(res);
JSONObject data = json.getJSONArray("result").getJSONObject(0);
return data;*/
public JSONObject getFaceExtraction(String token, String imageId, String imgBase64) throws Exception {
imgBase64 = imgBase64.replace("data:image/jpeg;base64,", "");
JSONObject j1 = new JSONObject().fluentPut("faceName","faceName").fluentPut("base64Data", imgBase64).fluentPut("detect", true).fluentPut("quality", true);
JSONArray jsonArray = new JSONArray().fluentAdd(j1);
System.out.println("获取特征值地址:"+faceServer + extractionPath);
System.out.println("获取特征值地址参数:"+jsonArray.toJSONString());
String result = OkHttpUtil.postCvJson(faceServer+extractionPath, new JSONObject().fluentPut("images", jsonArray));
System.err.println("获取特征值结果:"+result);
/********restTemplate 请求方式*************/
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+token);
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("imageId", imageId);
map.add("base64Data", imgBase64);
map.add("detect", true);
map.add("quality", true);
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(map.toSingleValueMap(), headers);
// System.err.println(faceServer + extractionPath);
String emps = Global.getConfig("face.modeUpdEmps");
String path = faceServer;
System.err.println("emps==========1111");
System.err.println(emps);
System.err.println(imageId);
if (emps.contains(imageId)) {
System.err.println("---------------uuuuuuuuu");
path = updFaceServer;
}
System.err.println(faceServer);
System.err.println(updFaceServer);
System.err.println(path);
System.err.println(path + extractionPath);
System.err.println("emps==========2222");
String result = restTemplate.postForObject(path + extractionPath, entity, String.class, "face-detection");
// log.info("Face Engine-detectFace return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
if (!resultJson.containsKey("errorCode") && 0==resultJson.getInteger("status")) {
return resultJson.getJSONArray("result").getJSONObject(0).getJSONArray("faces").getJSONObject(0);
} else {
return resultJson;
}
// System.err.println(resultJson.toJSONString());
return resultJson.getJSONArray("result").getJSONObject(0);
/*****Unirest 请求方式*****/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
HttpResponse<String> response = Unirest.post(faceServer + extractionPath)
.header("Authorization", "Bearer "+token)
.header("Content-Type", "application/json")
.body(content)
.asString();
String result = response.getBody();
log.info("Face Engine-detectFace return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONArray("result").getJSONObject(0);*/
}
public JSONObject getFaceCheck(String token, String imageId, String imgBase64) throws Exception{
/********CURL 请求方式********/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
String[] cmds = {"curl", "--location", "--request", "POST", faceServer + extractionPath, "--header", "Authorization: Bearer "+token, "--header", "Content-Type: application/json", "--data", content};
String res = execCurl(cmds);
log.info("----------------");
log.info(faceServer);
log.info("----------------");
log.info("Face Engine-detectFace return >> " + res);
JSONObject json = JSONObject.parseObject(res);
JSONObject data = json.getJSONArray("result").getJSONObject(0);
return data;*/
/********restTemplate 请求方式*************/
try {
imgBase64 = imgBase64.replaceAll("data:image/jpeg;base64,", "");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+token);
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
// map.add("imageId", imageId);
// map.add("base64Data", imgBase64);
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("imageId",imageId);
jsonObject.put("base64Data",imgBase64);
jsonArray.add(jsonObject);
map.add("detect", true);
map.add("images", jsonArray);
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(map.toSingleValueMap(), headers);
System.err.println(faceServer + qualityPath);
String result = restTemplate.postForObject(faceServer + qualityPath, entity, String.class, "face-detection");
// log.info("Face Engine-detectFace return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONArray("result").getJSONObject(0);
} catch (Exception e) {
System.err.println("8888err");
e.printStackTrace();
throw e;
}
/*****Unirest 请求方式*****/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
HttpResponse<String> response = Unirest.post(faceServer + extractionPath)
.header("Authorization", "Bearer "+token)
.header("Content-Type", "application/json")
.body(content)
.asString();
String result = response.getBody();
log.info("Face Engine-detectFace return >> " + result);
imgBase64 = imgBase64.replace("data:image/jpeg;base64,", "");
JSONObject jsonObject = new JSONObject();
jsonObject.put("imageId", StringUtils.isEmpty(imageId)? UUID.randomUUID().toString():imageId);
jsonObject.put("base64Data",imgBase64);
jsonObject.put("detect", true);
JSONArray jsonArray = new JSONArray().fluentAdd(jsonObject);
System.out.println("获取特征值参数:"+jsonArray.toJSONString());
System.out.println("获取特征值地址:"+faceServer + qualityPath);
String result = OkHttpUtil.postCvJson(faceServer+qualityPath, new JSONObject().fluentPut("images", jsonArray));
System.err.println("人脸检测结果:"+result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONArray("result").getJSONObject(0);*/
return resultJson.getJSONArray("result").getJSONObject(0);
}
public JSONObject hasface(String token, String imageId, String imgBase64) {
/********CURL 请求方式********/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
String[] cmds = {"curl", "--location", "--request", "POST", faceServer + extractionPath, "--header", "Authorization: Bearer "+token, "--header", "Content-Type: application/json", "--data", content};
String res = execCurl(cmds);
log.info("----------------");
log.info(faceServer);
log.info("----------------");
log.info("Face Engine-detectFace return >> " + res);
JSONObject json = JSONObject.parseObject(res);
JSONObject data = json.getJSONArray("result").getJSONObject(0);
return data;*/
JSONObject json = new JSONObject();
try {
imgBase64 = imgBase64.replaceAll("data:image/jpeg;base64,", "");
JSONObject res = this.getFaceExtraction(token, imageId, imgBase64);
JSONObject obj = res.getJSONArray("faces").getJSONObject(0);
imgBase64 = imgBase64.replace("data:image/jpeg;base64,", "");
JSONObject res = this.getFaceCheck(token, imageId, imgBase64);
if (!obj.isEmpty()) {
if (res != null && res.getBoolean("passed")){
json.put("status", 0);
json.put("data", obj);
json.put("data", res);
return json;
} else {
json.put("status", 500);
@@ -332,62 +201,17 @@ public class FaceServiceSupport {
}
/*****Unirest 请求方式*****/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
HttpResponse<String> response = Unirest.post(faceServer + extractionPath)
.header("Authorization", "Bearer "+token)
.header("Content-Type", "application/json")
.body(content)
.asString();
String result = response.getBody();
log.info("Face Engine-detectFace return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONArray("result").getJSONObject(0);*/
}
public JSONObject regCheckFace(String token, String imageId, String imgBase64) {
/********CURL 请求方式********/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
String[] cmds = {"curl", "--location", "--request", "POST", faceServer + extractionPath, "--header", "Authorization: Bearer "+token, "--header", "Content-Type: application/json", "--data", content};
String res = execCurl(cmds);
log.info("----------------");
log.info(faceServer);
log.info("----------------");
log.info("Face Engine-detectFace return >> " + res);
JSONObject json = JSONObject.parseObject(res);
JSONObject data = json.getJSONArray("result").getJSONObject(0);
return data;*/
JSONObject json = new JSONObject();
try {
imgBase64 = imgBase64.replaceAll("data:image/jpeg;base64,", "");
imgBase64 = imgBase64.replace("data:image/jpeg;base64,", "");
JSONObject res = this.getFaceCheck(token, imageId, imgBase64);
Boolean passed = res.getBoolean("passed");
if (!ObjectUtils.anyNotNull(passed)) {
json.put("status", 500);
json.put("data", null);
json.put("errMsg", "所拍摄的照片重人脸不存在");
return json;
}
if (!passed) {
json.put("status", 500);
json.put("data", res);
if (res == null || !res.getBoolean("passed")){
json.fluentPut("status", 500).fluentPut("data", res);
double blur = res.getDouble("blur");
double pose = res.getDouble("pose");
double occ = res.getDouble("occ");
@@ -404,17 +228,12 @@ public class FaceServiceSupport {
errMsg = "人脸检测失败,光线太暗,请到明亮点的地方重新拍摄";
}
json.put("errMsg", errMsg);
json.put("data", res);
json.fluentPut("errMsg", errMsg).fluentPut("data", res);
} else {
json.put("status", 0);
json.put("data", res);
json.put("errMsg", "");
json.fluentPut("status", 0).fluentPut("data", res).fluentPut("errMsg", "");
}
return json;
} catch (Exception e) {
e.printStackTrace();
json.put("status", 500);
@@ -422,26 +241,6 @@ public class FaceServiceSupport {
json.put("errMsg", e.getMessage());
return json;
}
/*****Unirest 请求方式*****/
/*JSONObject paramJson = new JSONObject();
paramJson.put("imageId", imageId);
paramJson.put("base64Data", imgBase64);
paramJson.put("detect", 1);
String content = paramJson.toJSONString();
HttpResponse<String> response = Unirest.post(faceServer + extractionPath)
.header("Authorization", "Bearer "+token)
.header("Content-Type", "application/json")
.body(content)
.asString();
String result = response.getBody();
log.info("Face Engine-detectFace return >> " + result);
JSONObject resultJson = JSON.parseObject(result);
return resultJson.getJSONArray("result").getJSONObject(0);*/
}
@@ -456,17 +255,18 @@ public class FaceServiceSupport {
json.put("errMsg", "imagePath不能为空");
return json;
}
JSONObject faceRectangle = this.hasface("", empId, base64Image);
int status = faceRectangle.getInteger("status");
faceRectangle = faceRectangle.getJSONObject("data");
if (status != 0) {
json.put("status",status);
json.put("errMsg"," 特征值提取失败,"+faceRectangle.getString("errMsg"));
JSONObject faceRectangle = null;
try {
faceRectangle = this.getFaceExtraction("", empId, base64Image);
} catch (Exception e) {
json.put("status",504);
json.put("errMsg",e.getMessage());
return json;
}
if (!ObjectUtils.anyNotNull(faceRectangle) || faceRectangle.getJSONObject("faceRectangle").isEmpty()) {
json.put("status",504);
json.put("errMsg"," 特征值提取失败,上传的头像未找到人脸!");
if (!faceRectangle.containsKey("feature")) {
json.put("status",500);
json.put("errMsg"," 特征值提取失败,"+faceRectangle.getString("errorMessage"));
return json;
}


+ 14
- 1
src/main/java/com/lecoo/kjg/web/sys/utils/ImageUtil.java Datei anzeigen

@@ -19,6 +19,7 @@ import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.file.Files;
import java.util.Base64;
import java.util.Map;
import java.util.UUID;
@@ -200,11 +201,23 @@ public class ImageUtil {
*/
public static String convertFileToBase64(String imgPath) {
String base64Str = "";
// 读取图片字节数组
/*// 读取图片字节数组
try {
InputStream in = new FileInputStream(imgPath);
base64Str = convertToBase64(in);
in.close();
} catch (IOException e) {
e.printStackTrace();
}*/
File imageFile = new File(imgPath);
try {
// 读取图片文件
byte[] imageBytes = Files.readAllBytes(imageFile.toPath());
// 将图片数据编码为Base64
base64Str = Base64.getEncoder().encodeToString(imageBytes);
} catch (IOException e) {
e.printStackTrace();
}


+ 2
- 3
src/main/java/com/lecoo/kjg/web/sys/web/Account2Controller.java Datei anzeigen

@@ -505,7 +505,8 @@ public class Account2Controller extends WxBaseController {
response.addCookie(cookie);
return "themes/default/modules/sys/account/registerEmp";
return "themes/default/modules/sys/account/registerUser";
// return "themes/default/modules/sys/account/registerEmp";
}
@@ -980,8 +981,6 @@ public class Account2Controller extends WxBaseController {
userCode = DesUtils.decode(userCode, secretKey);
User user = UserUtils.get(userCode);
if (null == user) {
return outputError(1, "绑定失败,未找到对应账户!");
}


+ 57
- 16
src/main/java/com/lecoo/kjg/web/sys/web/api/CommonApiController.java Datei anzeigen

@@ -306,20 +306,23 @@ public class CommonApiController extends BaseController {
public Object syncFace(@RequestBody JSONObject map, HttpServletRequest request) {
String deviceId = map.getString("devId");
String timestamp = map.getString("timestamp");
String nowTs = map.getString("now_ts");
Double timestamp = map.getDouble("timestamp");
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
String formatTs = org.apache.commons.lang3.StringUtils.rightPad(nf.format(timestamp), 13, '0');
System.out.println("syncFace: timestamp==" + formatTs);
Double nowTs = map.getDouble("now_ts");
String ts = org.apache.commons.lang3.StringUtils.rightPad(nf.format(nowTs), 13, '0');
int maxCnt = map.getInteger("max_cnt");
String sign = map.getString("sign");
MyResponse myResponse = commonCheck(deviceId, timestamp, sign);
MyResponse myResponse = commonCheck(deviceId, formatTs, sign);
if (myResponse.getStatus() != 0) {
return myResponse;
}
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
System.err.println(nowTs);
String ts = nf.format(Double.parseDouble(nowTs));
AccessControl ac = accessControlDao.findAccessControlByDev(deviceId);
List<AuthMapping> list = authMappingDao.getByDevAndTime(ac.getAccessControlId(), ts, maxCnt);
@@ -379,7 +382,10 @@ public class CommonApiController extends BaseController {
String imgbase64 = map.getString("imgbase64");
String sign = map.getString("sign");
MyResponse myResponse = commonCheck(deviceId, timestamp, sign);
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
MyResponse myResponse = commonCheck(deviceId, nf.format(Double.parseDouble(timestamp)), sign);
if (myResponse.getStatus() != 0) {
return myResponse;
}
@@ -445,7 +451,11 @@ public class CommonApiController extends BaseController {
return myResponse;
}
myResponse = commonCheck(devId, timestamp, sign);
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
myResponse = commonCheck(devId, nf.format(Double.parseDouble(timestamp)), sign);
if (myResponse.getStatus() != 0) {
return myResponse;
}
@@ -1335,8 +1345,41 @@ public class CommonApiController extends BaseController {
@PostMapping(value = "remoteHandle")
@ResponseBody
@Transactional
public String remoteHandle(@RequestParam(value = "devs[]") List<String> devs, @RequestParam(value = "act") String act) {
public MyResponse remoteHandle(@RequestParam(value = "devs[]") List<String> devs, @RequestParam(value = "act") String act, HttpServletRequest request) {
//将devs拼接成字符串,按逗号分割开
String sign = request.getHeader("sign");
String ts = request.getHeader("ts");
System.err.println("----------sign check start----------");
if (ts == null || ts.isEmpty()) {
return new MyResponse(400, "ts is null");
}
if (sign == null || sign.isEmpty()) {
return new MyResponse(400, "sign is null");
}
ts.replace(".", "");
Long tsVal = Long.parseLong(ts);
if (ts.length() == 10) {
// 将10位时间戳转为13位
tsVal *= 1000;
}
Long currentTs = System.currentTimeMillis();
System.err.println(currentTs);
System.err.println(tsVal);
if (currentTs - tsVal > 1000 * 60 || tsVal - currentTs > 1000 * 60){//时间误差正负1分钟内为合法
return new MyResponse(400, "请求时间戳ts非法");
}
devs.sort(null);
String singStr = String.join("_", devs) + act + ts;
System.err.println(singStr);
String signStr = DigestUtils.md5DigestAsHex(singStr.getBytes());
System.err.println(signStr);
System.err.println(sign);
System.err.println("----------sign check end----------");
if (!sign.equals(signStr)) {
return output(ResponseCode.AUTH_NOT_PASS);
}
String act_code = "";
switch (act) {
case "enterOpen":
@@ -1362,11 +1405,11 @@ public class CommonApiController extends BaseController {
break;
}
List<String> successDev = com.google.common.collect.Lists.newArrayList();
List<String> failMsg = com.google.common.collect.Lists.newArrayList();
List<String> successDev = com.beust.jcommander.internal.Lists.newArrayList();
List<String> failMsg = com.beust.jcommander.internal.Lists.newArrayList();
for (String deviceId : devs) {
Device gate = deviceDao.findByDevId(deviceId);
List<Device> lists = Lists.newArrayList();
List<Device> lists = com.beust.jcommander.internal.Lists.newArrayList();
if (act_code.equals("netAdbOpen") || act_code.equals("netAdbClose")) {
lists = deviceService.getPads(gate);
} else {
@@ -1409,11 +1452,9 @@ public class CommonApiController extends BaseController {
}
if (StringUtils.isEmpty(endMsg)) {
return renderResult(Global.TRUE, "指令发送成功");
return outputSuccess("指令发送成功");
}
return renderResult(Global.TRUE, endMsg);
return outputSuccess(endMsg);
}
@PostMapping(value = "remoteDev")


+ 4
- 4
src/main/java/com/lecoo/kjg/web/sys/web/api/FaceApiController.java Datei anzeigen

@@ -84,7 +84,6 @@ public class FaceApiController extends BaseController {
String base64Image = "";
JSONObject json;
JSONArray obj = new JSONArray();
JSONObject faceRectangle = new JSONObject();
EmpFaceFeature empFaceFeature = emp.getEmpFaceFeature();
if (!(ObjectUtils.anyNotNull(empFaceFeature) && StringUtils.isNotEmpty(empFaceFeature.getFaceFeature()))){
@@ -103,11 +102,12 @@ public class FaceApiController extends BaseController {
json = faceServiceSupport.getFaceExtraction(token, empId, base64Image);
obj = json.getJSONArray("faces").getJSONObject(0).getJSONArray("feature");
faceRectangle = json.getJSONArray("faces").getJSONObject(0).getJSONObject("faceRectangle");
if (!faceRectangle.isEmpty()) {
if (json.containsKey("feature")) {
obj = json.getJSONArray("feature");
faceFlag = true;
} else {
return "人脸特征值提取失败!";
}
} catch (Exception e) {
e.printStackTrace();


+ 332
- 0
src/main/java/com/lecoo/kjg/web/utils/OkHttpUtil.java Datei anzeigen

@@ -0,0 +1,332 @@
package com.lecoo.kjg.web.utils;

/**
* @author yk
* @description
* @date 2024-05-07 18:08
*/

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class OkHttpUtil {
private static volatile OkHttpClient okHttpClient = null;
private static volatile Semaphore semaphore = null;
private Map<String, String> headerMap;
private Map<String, String> paramMap;
private String url;
private Request.Builder request;

/**
* 初始化okHttpClient,并且允许https访问
*/
private OkHttpUtil() {
if (okHttpClient == null) {
synchronized (OkHttpUtil.class) {
if (okHttpClient == null) {
TrustManager[] trustManagers = buildTrustManagers();
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
.hostnameVerifier((hostName, session) -> true)
.retryOnConnectionFailure(true)
.build();
addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
}
}
}
}

/**
* 用于异步请求时,控制访问线程数,返回结果
*
* @return
*/
private static Semaphore getSemaphoreInstance() {
//只能1个线程同时访问
synchronized (OkHttpUtil.class) {
if (semaphore == null) {
semaphore = new Semaphore(0);
}
}
return semaphore;
}

/**
* 创建OkHttpUtil
*
* @return
*/
public static OkHttpUtil builder() {
return new OkHttpUtil();
}

/**
* 添加url
*
* @param url
* @return
*/
public OkHttpUtil url(String url) {
this.url = url;
return this;
}

/**
* 添加参数
*
* @param key 参数名
* @param value 参数值
* @return
*/
public OkHttpUtil addParam(String key, String value) {
if (paramMap == null) {
paramMap = new LinkedHashMap<>(16);
}
paramMap.put(key, value);
return this;
}

/**
* 添加请求头
*
* @param key 参数名
* @param value 参数值
* @return
*/
public OkHttpUtil addHeader(String key, String value) {
if (headerMap == null) {
headerMap = new LinkedHashMap<>(16);
}
headerMap.put(key, value);
return this;
}

/**
* 初始化get方法
*
* @return
*/
public OkHttpUtil get() {
request = new Request.Builder().get();
StringBuilder urlBuilder = new StringBuilder(url);
if (paramMap != null) {
urlBuilder.append("?");
try {
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).
append("=").
append(URLEncoder.encode(entry.getValue(), "utf-8")).
append("&");
}
} catch (Exception e) {
e.printStackTrace();
}
urlBuilder.deleteCharAt(urlBuilder.length() - 1);
}
request.url(urlBuilder.toString());
return this;
}

/**
* 初始化post方法
*
* @param isJsonPost true等于json的方式提交数据,类似postman里post方法的raw
* false等于普通的表单提交
* @return
*/
public OkHttpUtil post(boolean isJsonPost) {
RequestBody requestBody;
if (isJsonPost) {
String json = "";
if (paramMap != null) {
json = JSON.toJSONString(paramMap);
}
requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
} else {
FormBody.Builder formBody = new FormBody.Builder();
if (paramMap != null) {
paramMap.forEach(formBody::add);
}
requestBody = formBody.build();
}
request = new Request.Builder().post(requestBody).url(url);
return this;
}

/**
* 同步请求
*
* @return
*/
public String sync() {
setHeader(request);
try {
Response response = okHttpClient.newCall(request.build()).execute();
assert response.body() != null;
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
return "请求失败:" + e.getMessage();
}
}

/**
* 异步请求,有返回值
*/
public String async() {
StringBuilder buffer = new StringBuilder("");
setHeader(request);
okHttpClient.newCall(request.build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
buffer.append("请求出错:").append(e.getMessage());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
assert response.body() != null;
buffer.append(response.body().string());
getSemaphoreInstance().release();
}
});
try {
getSemaphoreInstance().acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
return buffer.toString();
}

/**
* 异步请求,带有接口回调
*
* @param callBack
*/
public void async(ICallBack callBack) {
setHeader(request);
okHttpClient.newCall(request.build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callBack.onFailure(call, e.getMessage());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
assert response.body() != null;
callBack.onSuccessful(call, response.body().string());
}
});
}

/**
* 为request添加请求头
*
* @param request
*/
private void setHeader(Request.Builder request) {
if (headerMap != null) {
try {
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
request.addHeader(entry.getKey(), entry.getValue());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}


/**
* 生成安全套接字工厂,用于https请求的证书跳过
*
* @return
*/
private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return ssfFactory;
}

private static TrustManager[] buildTrustManagers() {
return new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}

@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}

@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
}

/**
* 自定义一个接口回调
*/
public interface ICallBack {

void onSuccessful(Call call, String data);

void onFailure(Call call, String errorMsg);

}

/**
* @Author yangkai
* @Description 联想研究院新算法,请求模版
* @Date 2024/5/8
* @Param [url, json]
* @return java.lang.String
**/
public static String postCvJson(String url, JSONObject json) throws Exception{
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, json.toJSONString());

Request request = new Request.Builder()
.url(url)
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Basic ZmFjZS1tYW5hZ2VtZW50OmZhY2UtbWFuYWdlbWVudA==")
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
}

+ 4
- 3
src/main/resources/config/application-dev.yml Datei anzeigen

@@ -202,15 +202,16 @@ mqttClient:
serverPort: 1883
clientId: mqtt_clientid_dev_2002
faceServerII:
ip: 8.131.78.156
ip: 39.105.51.226
port: 5000
user: lecooai_hw01
password: lecooai@2021
hasAuthorize: false
faceServerI:
ip: 39.105.51.226
port: 5000
ip: 123.56.73.158
port: 30306
user: lecooai_hw01
password: lecooai@2021
hasAuthorize: false

+ 9
- 8
src/main/resources/config/application.yml Datei anzeigen

@@ -36,7 +36,7 @@ spring:

devtools:
restart:
enabled: true
enabled: false
# # 缓存配置
# redis:
# # 缓存及会话共享(专业版)
@@ -48,7 +48,7 @@ spring:
redis:
#host: 39.105.85.176
host: 127.0.0.1
port: 6379
port: 6381
ssl: false
database: 0
#password: lecooai-redis
@@ -393,10 +393,12 @@ wx:
host: 127.0.0.1
port: 6379
configs:
- appId: wx80dc26b645077e97 # 第一个公众号的appid
- appId: wx225662102fc5f39a # 第一个公众号的appid
# - appId: wx80dc26b645077e97 # 第一个公众号的appid
# - appId: wxcea6b4840efb906e # 第一个公众号的appid
# - appId: ENC(5ZzYjATZAQK3mSkZKTPuHEqgIQRv8ADix8SsVZdfeAg=) # 第一个公众号的appid
secret: 5fea919f2cb1b320cebdb9896f697361 # 公众号的appsecret
# secret: 5fea919f2cb1b320cebdb9896f697361 # 公众号的appsecret
secret: ff4080ff5a16a378bd8804acd507d468 # 公众号的appsecret
# secret: ENC(XHPy8rxb7MlPaeBbmPjHZGu9bqRGWY8IKWCmG3NSwygAMXqcqcFNUksMKukd5eHH) # 公众号的appsecret
token: 83u4h # 接口配置里的Token值
templateSendUrl: http://www.hjkjg.top:49180/sendMsg
@@ -459,7 +461,7 @@ mqtt:
# 心跳
keepalive: 30

httpServer: http://39.105.85.176:8008
httpServer: http://172.17.0.1:8008

devCmdPath: /api/mqtt_dev_cmd

@@ -467,9 +469,8 @@ face:
server: http://${faceServerI.ip}:${faceServerI.port}
updServer: http://${faceServerII.ip}:${faceServerII.port}
authorizePath: /authorize
# extractionPath: /apps/v1/function/cv/face-extraction
extractionPath: /cv/feature-extraction-service/1.7
qualityPath: /cv/quality/1.7
extractionPath: /apps/v1/solution/cv/face-extraction
qualityPath: /apps/v1/solution/cv/face-quality
modeUpdate: true
modeUpdEmps: "'beeefac44ef94daca475ff85a5c720cd','65f061754e204484a955aba8154eec14','a0a0f615ec374d9bb1e1ace496e586d7','e83e30d959144a65b83beb3b841c10b5','0601b9fc00204224a671bcd47040be30','7cabfde922354b41ae66841e3d0cc4d3'"



+ 361
- 0
src/main/resources/views/themes/default/modules/sys/account/registerEmpTest.html Datei anzeigen

@@ -0,0 +1,361 @@
<% layout('/layouts/default.html', {title: '账号注册', libs: ['validate'], bodyClass: 'login-page'}){ %>
<% include('/include/upgrade.html'){} // 如果客户浏览器版本过低,则显示浏览器升级提示。 %>
<link rel="stylesheet" href="${ctxStatic}/icheck/1.0/square/blue.css?${_version}">
<link rel="stylesheet" href="${ctxStatic}/jquery-toastr/2.0/toastr.min.css?${_version}">
<link rel="stylesheet" href="${ctxStatic}/jquery-plugins/jquery.strength.css?${_version}">
<link rel="stylesheet" href="${ctxStatic}/modules/sys/sysLogin.css?${_version}">
<style>
.fa-check{
color: #0BB20C !important;
}
body .demo-class .layui-layer-btn0{
border-color: #E6E3E6;
background-color: #FFF;
color: black;
}
body .demo-class .layui-layer-btn1{
border-color: #4898d5;
background-color: #2e8ded;
color: #fff;
}
img {
object-fit: cover !important;
}


</style>
<div class="login-box">
<div class="login-logo" style="font-size: 28px;">
<b>人脸面部信息注册</b>
</div>
<div class="login-box-body">
<form id="registerForm" class="layui-form" action="${ctxPath}/account2/reg" method="post" >
<input type="hidden" id="ipt-openid" name="wxOpenid" value="${openid}"/>
<input type="hidden" id="avatarImg" name="base64" value=""/>

<div class="text-center" style="padding-top: 10px;">


<a id="upload-img" style="text-decoration: none;display: inline-grid;">
<img id="imgObj" src=${isNotEmpty(emp.faceImageName)?"/face01/compress/"+emp.faceImageName:"data:image/jpeg;base64,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"} style="width:120px;height:120px;border-radius: 120px;" onclick="" >
<% if (isEmpty(emp.faceImageName)) {%>
<div style="position:relative;display:inline-block;width: 120px;background-color: rgb(0 0 0 / 20%);color: #ff0000;top: -69px;">点击添加人脸照片</div>
<% } %>
</a>
</div>

<div class="form-group has-feedback">
<select name="officeCode" id="officeCode" class="required">
<option selected="selected" value="" style="display: none;">-----请选择所属公司-----</option>
<%
for(office in offices){
print('<option value="' + office.officeCode + '">' + office.officeName + '</option>');
}
%>
</select>
</div>

<div class="layui-form-item has-feedback">
<span class="fa fa-user form-control-feedback"></span>
<input type="text" id="reg_loginCode" name="loginCode" class="layui-input form-control required" lay-verify="" data-msg-required="请填写姓名." placeholder="姓名" />
<!-- <span class="text-red" style="font-size: 12px;">* 姓名提交后不可修改,请谨慎填写,以免无法过审</span>-->
</div>

<div class="layui-form-item has-feedback">
<span class="fa fa-phone-square form-control-feedback"></span>
<input type="text" id="mobile" name="mobile" class="layui-input form-control required isMobile isExsitPhone" lay-verify="" data-msg-required="请填写手机号." placeholder="手机号" />
</div>

<div class="layui-form-item" style="border: 1px solid #e8e8e8;display: none;">
<label class="layui-form-label" style="text-align: left;padding-left: 9px;color: #a1a1a1;">性别</label>
<div class="layui-input-block" style="text-align: right;">
<input type="radio" name="gender" checked=true id="gender" value="1" title="男" >
<input type="radio" name="gender" id="gender" value="2" title="女">
</div>
</div>


<!--<div class="form-group has-feedback">
<span class="fa fa-lock form-control-feedback"></span>
<input type="password" autocomplete="off" id="reg_password" name="password"
class="form-control required" data-msg-required="请填写登录密码."
rangelength="1,50" data-msg-rangelength="登录密码长度不能小于1并大于50个字符."
placeholder="登录密码" />
</div>
<div class="form-group has-feedback">
<span class="fa fa-lock form-control-feedback"></span>
<input type="password" autocomplete="off" id="reg_confirmPassword" name="confirmPassword"
class="form-control required" data-msg-required="请再填一次登录密码."
rangelength="3,50" data-msg-rangelength="登录密码长度不能小于3并大于50个字符."
equalTo="#reg_password" data-msg-equalTo="填写的密码与登录密码不同."
placeholder="再填一次登录密码" />
</div>-->
<div class="row">
<div class="col-xs-12">
<button type="button" class="btn btn-primary btn-block btn-flat layui-btn" lay-submit="" id="btnSubmit" onclick="checkOk();">${text('提交')}</button>
</div>

</div>
<div class="clearfix"></div>
</form>
</div>
<!--<iframe id="myFrame" name="myFrame" scrolling="yes" frameborder="0" style="width:100%;height:6.6rem;"></iframe>-->
</div>

<div id="new_person_layer" class="layui_pop" style="display: none;" >
<div class="layui-form-item layui_pop_header" style="margin-bottom: 10px !important;">
<div class="layui_header_title">确认账户</div>
<div class="layui_header_close"></div>
</div>
<form class="layui-form" action="" style="padding: 0 15px 0px 15px;">
<div class="layui-form-item text-center"><p>系统检测到您注册的部门中存在同名账户,这是您吗?</p></div>
<div class="layui-form-item text-center"><img id="avtar-img" src=${isNotEmpty(emp.faceImageName)?"/face01/compress/"+emp.faceImageName:"data:image/jpeg;base64,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"} style="width:120px;height:120px;border-radius: 120px;" onclick="" ></div>

</form>
</div>
<style>
.layui_pop_header {
margin-bottom: 10px !important;
}
.layui_pop .layui-form {
padding: 0 15px 0px 15px;
}
</style>

<% } %>
<script>var secretKey = '${@Global.getConfig("shiro.loginSubmit.secretKey")}';</script>
<script src="${ctxStatic}/js/jweixin-1.4.0.js?${_version}"></script>
<script src="${ctxStatic}/common/des.js?${_version}"></script>
<script src="${ctxStatic}/jquery-toastr/2.0/toastr.min.js?${_version}"></script>
<script src="${ctxStatic}/jquery-plugins/jquery.strength.js?${_version}"></script>
<script src="${ctxStatic}/modules/sys/registerUser.js?${_version}"></script>
<script>
function checkOk(){

var name = $("#reg_loginCode").val();
var base64 = $("#avatarImg").val();
var phone = $("#mobile").val();
var officeCode = $("#officeCode option:selected").val();
console.log(officeCode=="");

if ($("#registerForm").valid() && name && officeCode) {
$.ajax('/api/v1/emp/getByName',{
method: "get", dataType: "json",
data: {
"name": name,
"officeCode": officeCode,
},
async:false,
success: function (res) {
if(res.data.length<1) {
$("#registerForm").submit();
} else {
layerIndex = layer.open({
type: 1
,title: false
,area: ['90%', '40%']
,shade: 0.5
,maxmin: false
,scrollbar: false
,closeBtn: 0
,content: $('#new_person_layer')
,btn: ["是我", "不是我,继续注册"]

,yes: function (index) {
// if ("${openid}" != null && "${openid}" != "") {
$.ajax("/account2/updateEmp",{method: "post", dataType: "json", data: {"userCode":DesUtils.encode(res.data[0].jobNumber, secretKey), "openid":"${openid}", "phone":phone,"base64":base64}, success:function (data){
layer.closeAll();
parent.layer.closeAll();
if (data.status == 0) {
layer.msg("更新成功", {icon: 6, time: 2000});
setTimeout(function (){
window.location.reload();
}, 2000)
} else {
layer.msg(data.errMsg, {icon: 5, time: 2000});
}
},error:function (err){
console.log(err);
}},
)
/*} else {
layer.closeAll();
parent.layer.closeAll();
}*/

},
btn2: function (index){

parent.$("#registerForm").submit();
},
success:function () {
console.log(res.data);
$("#avtar-img").attr("src","/face01/compress/"+res.data[0].faceImageName)
}
});
}
},
error:function (){

}
})
} else {
layer.msg("信息填写不全或有误,请检查", {icon: 5, time: 2000});
}

// $("#registerForm").submit();
return (false);

}


function openDiv(){
var secretKey = "${@Global.getConfig('shiro.loginSubmit.secretKey')}";
var openid = DesUtils.encode($("#ipt-openid").val(), secretKey);
layer.open({
type: 2
, skin: 'demo-class'
, title: "新增人脸底库"
, area: ['100%', '100%']
, shade: 0.8
, skin: 'layui-layer-lan'
, id: 'LAY_layuipro' //设定一个id,防止重复弹出
// , btn: ['提交', '取消']
// , btnAlign: 'c'
, close : 0
, moveType: 1 //拖拽模式,0或者1
, content: "${ctxPath}/account2/photo/0/"+openid
/*, yes: function () {


}*/
});
}


function photoCompress(file, w, objDiv) {
var ready = new FileReader();
/*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
ready.readAsDataURL(file);
ready.onload = function() {
var re = this.result;
canvasDataURL(re, w, objDiv);
}
};
function canvasDataURL(path, obj, callback) {
var img = new Image();
img.src = path;
img.onload = function() {
var that = this;
// 默认按比例压缩
var w = that.width,
h = that.height,
scale = w / h;
w = obj.width || w;
h = obj.height || (w / scale);
var quality = 0.5; // 默认图片质量为0.7
//生成canvas
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
// 创建属性节点
var anw = document.createAttribute("width");
anw.nodeValue = w;
var anh = document.createAttribute("height");
anh.nodeValue = h;
canvas.setAttributeNode(anw);
canvas.setAttributeNode(anh);
ctx.drawImage(that, 0, 0, w, h);
// 图像质量
if(obj.quality && obj.quality <= 1 && obj.quality > 0) {
quality = obj.quality;
}
// quality值越小,所绘制出的图像越模糊
var base64 = canvas.toDataURL('image/jpeg', quality);
// 回调函数返回base64的值
callback(base64);
}
}
function convertBase64UrlToBlob(urlData) {
var arr = urlData.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while(n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {
type: mime
});
}

layui.use('upload', function() {
var dialog = null;
var upload = layui.upload;
//执行实例
upload.render({
elem : '#upload-img',
// url : '${ctx}/sys/emp/update-face',
url : '',
data:{},
accept: 'images',
acceptMime: 'image/*',
field : 'face',
number : 1,
size: 5100,
auto: false ,
multiple : false,
choose: function(obj){
dialog = layer.msg('正在上传',
{
icon: 16
,shade: 0.01
});
obj.preview(function (index, file, result) {
photoCompress(file, {
quality: 0.5,
}, function(base64Codes) {

$.ajax('/api/reg-check-face',{
method: "post", dataType: "json",
data: {
"faceImage": base64Codes,
},
async:false,
success: function (res) {
layer.close(dialog);
if ( 0 != res.status ) {
layer.msg('<p class="text-red">'+res.errMsg+'</p>', {icon: 5, time: 5000});
} else {
console.log(base64Codes);
$("#avatarImg").val(base64Codes);
$("#imgObj").attr("src", base64Codes);
$("#imgObj").next("div").css("display", "none");
}
},error:function (e){
layer.close(dialog);
layer.msg('<p class="text-red">'+e.message+'</p>', {icon: 5, time: 5000});
}
}
);
});
});
return;



}
});
});


$(function(){
if(2 == ${type}){
location.href = "/account2/login?type="+${type};
}

$(".layui_header_close").on('click',function(){
layer.close(layerIndex);
});
})
</script>

Laden…
Abbrechen
Speichern