Commit 3bc07178d20b909ebbd0dabe758a0b65be5c9cda

Authored by 陶汉栋
1 parent 53e55eaa
Exists in master and in 1 other branch cloud_copy

no message

Showing 31 changed files with 577 additions and 525 deletions   Show diff stats
cloud/common/pom.xml
@@ -84,6 +84,12 @@ @@ -84,6 +84,12 @@
84 <artifactId>commons-lang3</artifactId> 84 <artifactId>commons-lang3</artifactId>
85 <version>3.3.2</version> 85 <version>3.3.2</version>
86 </dependency> 86 </dependency>
  87 + <dependency>
  88 + <groupId>com.vaadin.external.google</groupId>
  89 + <artifactId>android-json</artifactId>
  90 + <version>0.0.20131108.vaadin1</version>
  91 + <scope>compile</scope>
  92 + </dependency>
87 </dependencies> 93 </dependencies>
88 94
89 <build> 95 <build>
cloud/common/src/main/java/com/sincere/common/dto/smartCampus/SZ_AttendanceDto.java 0 → 100644
@@ -0,0 +1,102 @@ @@ -0,0 +1,102 @@
  1 +package com.sincere.common.dto.smartCampus;
  2 +
  3 +/**
  4 + * 数据库设备表对象
  5 + */
  6 +public class SZ_AttendanceDto {
  7 +
  8 + private String clint_id;
  9 +
  10 + private String name;
  11 +
  12 + private String clint_type;
  13 +
  14 + private String intime;
  15 +
  16 + private String school_id;
  17 +
  18 + private int isConnection;
  19 +
  20 + private int state;
  21 +
  22 + private int IsKaoqin;
  23 +
  24 + public int getIsKaoqin() {
  25 + return IsKaoqin;
  26 + }
  27 +
  28 + public void setIsKaoqin(int isKaoqin) {
  29 + IsKaoqin = isKaoqin;
  30 + }
  31 +
  32 + public String getClint_id() {
  33 + return clint_id;
  34 + }
  35 +
  36 + public void setClint_id(String clint_id) {
  37 + this.clint_id = clint_id;
  38 + }
  39 +
  40 + public String getName() {
  41 + return name;
  42 + }
  43 +
  44 + public void setName(String name) {
  45 + this.name = name;
  46 + }
  47 +
  48 + public String getClint_type() {
  49 + return clint_type;
  50 + }
  51 +
  52 + public void setClint_type(String clint_type) {
  53 + this.clint_type = clint_type;
  54 + }
  55 +
  56 + public int getIsConnection() {
  57 + return isConnection;
  58 + }
  59 +
  60 + public void setIsConnection(int isConnection) {
  61 + this.isConnection = isConnection;
  62 + }
  63 +
  64 + public int getState() {
  65 + return state;
  66 + }
  67 +
  68 + public void setState(int state) {
  69 + this.state = state;
  70 + }
  71 +
  72 + public String getIntime() {
  73 + return intime;
  74 + }
  75 +
  76 + public void setIntime(String intime) {
  77 + this.intime = intime;
  78 + }
  79 +
  80 + public String getSchool_id() {
  81 + return school_id;
  82 + }
  83 +
  84 + public void setSchool_id(String school_id) {
  85 + this.school_id = school_id;
  86 + }
  87 +
  88 + @Override
  89 + public String toString() {
  90 + return "SZ_AttendanceDto{" +
  91 + "clint_id='" + clint_id + '\'' +
  92 + ", name='" + name + '\'' +
  93 + ", clint_type='" + clint_type + '\'' +
  94 + ", intime='" + intime + '\'' +
  95 + ", school_id='" + school_id + '\'' +
  96 + ", isConnection=" + isConnection +
  97 + ", state=" + state +
  98 + ", IsKaoqin=" + IsKaoqin +
  99 + '}';
  100 + }
  101 +
  102 +}
cloud/common/src/main/java/com/sincere/common/util/AuthService.java 0 → 100644
@@ -0,0 +1,93 @@ @@ -0,0 +1,93 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import org.json.JSONObject;
  4 +
  5 +import java.io.BufferedReader;
  6 +import java.io.InputStreamReader;
  7 +import java.net.HttpURLConnection;
  8 +import java.net.URL;
  9 +
  10 +/**
  11 + * 获取token类
  12 + */
  13 +public class AuthService {
  14 + //设置APPID/AK/SK
  15 + public static final String APP_ID = "15990462";
  16 + public static final String API_KEY = "t70Rzr6SGmfU9S6MrqAkspsY";
  17 + public static final String SECRET_KEY = "nSqpqtrf7cCjo8vOB9knL85nwWNoxwvS ";
  18 + /**
  19 + * 获取权限token
  20 + * @return 返回示例:
  21 + * {
  22 + * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
  23 + * "expires_in": 2592000
  24 + * }
  25 + */
  26 + //获取文字识别id
  27 + public static String getAuth() {
  28 + // 官网获取的 API Key 更新为你注册的
  29 + String clientId = "t70Rzr6SGmfU9S6MrqAkspsY";
  30 + // 官网获取的 Secret Key 更新为你注册的
  31 + String clientSecret = "nSqpqtrf7cCjo8vOB9knL85nwWNoxwvS";
  32 + return getAuth(clientId, clientSecret);
  33 + }
  34 +
  35 + public static String getFaceAuthToken() {
  36 + // 官网获取的 API Key 更新为你注册的
  37 + String clientId = "u6rV4YxRZmwzKj56N0DCW8eO";
  38 + // 官网获取的 Secret Key 更新为你注册的
  39 + String clientSecret = "Krp3KhmIBdnNEsRa1LavMHuZl0KhQGVm";
  40 + return getAuth(clientId, clientSecret);
  41 + }
  42 +
  43 + /**
  44 + * 获取API访问token
  45 + * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
  46 + * @param ak - 百度云官网获取的 API Key
  47 + * @param sk - 百度云官网获取的 Securet Key
  48 + * @return assess_token 示例:
  49 + * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
  50 + */
  51 + public static String getAuth(String ak, String sk) {
  52 + // 获取token地址
  53 + String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
  54 + String getAccessTokenUrl = authHost
  55 + // 1. grant_type为固定参数
  56 + + "grant_type=client_credentials"
  57 + // 2. 官网获取的 API Key
  58 + + "&client_id=" + ak
  59 + // 3. 官网获取的 Secret Key
  60 + + "&client_secret=" + sk;
  61 + try {
  62 + URL realUrl = new URL(getAccessTokenUrl);
  63 + // 打开和URL之间的连接
  64 + HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
  65 + connection.setRequestMethod("GET");
  66 + connection.connect();
  67 + // 获取所有响应头字段
  68 +// Map<String, List<String>> map = connection.getHeaderFields();
  69 +// // 遍历所有的响应头字段
  70 +// for (String key : map.keySet()) {
  71 +// System.err.println(key + "--->" + map.get(key));
  72 +// }
  73 + // 定义 BufferedReader输入流来读取URL的响应
  74 + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
  75 + String result = "";
  76 + String line;
  77 + while ((line = in.readLine()) != null) {
  78 + result += line;
  79 + }
  80 + /**
  81 + * 返回结果示例
  82 + */
  83 +// System.err.println("result:" + result);
  84 + JSONObject jsonObject = new JSONObject(result);
  85 + String access_token = jsonObject.getString("access_token");
  86 + return access_token;
  87 + } catch (Exception e) {
  88 + System.err.printf("获取token失败!");
  89 + e.printStackTrace(System.err);
  90 + }
  91 + return null;
  92 + }
  93 +}
cloud/common/src/main/java/com/sincere/common/util/BaiduApiUtiols.java 0 → 100644
@@ -0,0 +1,84 @@ @@ -0,0 +1,84 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import org.springframework.http.HttpEntity;
  4 +import org.springframework.http.HttpHeaders;
  5 +import org.springframework.http.MediaType;
  6 +import org.springframework.http.ResponseEntity;
  7 +import org.springframework.util.LinkedMultiValueMap;
  8 +import org.springframework.util.MultiValueMap;
  9 +import org.springframework.web.client.RestTemplate;
  10 +
  11 +public class BaiduApiUtiols {
  12 +
  13 + public static BaiduApiUtiols baiduApiUtiols;
  14 +
  15 + public static BaiduApiUtiols getInstance() {
  16 +
  17 + if (null == baiduApiUtiols) {
  18 + synchronized (BaiduApiUtiols.class) {
  19 + baiduApiUtiols = new BaiduApiUtiols();
  20 + }
  21 + }
  22 + return baiduApiUtiols;
  23 + }
  24 +
  25 +
  26 + /**
  27 + * @param imgPath 图片路径
  28 + * @param group_id 学校id
  29 + * @param user_id 用户id
  30 + * @param user_info 用户名字
  31 + * @return
  32 + */
  33 + public String registerFace(String imgPath, String group_id, String user_id, String user_info) {
  34 +
  35 + String registUrl = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=" + AuthService.getFaceAuthToken();
  36 + long time = System.currentTimeMillis();
  37 + System.out.println("starttime:"+time);
  38 + RestTemplate restTemplate = new RestTemplate();
  39 + MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
  40 + multiValueMap.add("image", Base64Util.imageencode(imgPath));
  41 + multiValueMap.add("image_type", "BASE64");
  42 + multiValueMap.add("group_id", group_id);
  43 + multiValueMap.add("user_id", user_id);
  44 + multiValueMap.add("user_info", user_info);
  45 +// multiValueMap.add("quality_control", "NORMAL");
  46 + System.out.println("multiValueMap:" + multiValueMap.toString());
  47 + HttpHeaders headers = new HttpHeaders();
  48 + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
  49 + HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(multiValueMap,
  50 + headers);
  51 + System.out.println("midddle:"+(System.currentTimeMillis()-time));
  52 + time = System.currentTimeMillis();
  53 + ResponseEntity<String> result = restTemplate.postForEntity(registUrl, requestEntity, String.class);
  54 + System.out.println("end:"+(System.currentTimeMillis()-time));
  55 + System.out.println("result:" + result.getBody());
  56 + return result.getBody();
  57 +
  58 + }
  59 +
  60 + public String searchFace(String imgPath,String group_id, String user_id){
  61 + String searchFace = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token="+AuthService.getFaceAuthToken();
  62 + long time = System.currentTimeMillis();
  63 + RestTemplate restTemplate = new RestTemplate();
  64 + MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
  65 + multiValueMap.add("image", Base64Util.imageencode(imgPath));
  66 + multiValueMap.add("image_type", "BASE64");
  67 + multiValueMap.add("group_id_list", group_id);//从指定的group中进行查找 用逗号分隔,上限10个
  68 + multiValueMap.add("user_id", user_id);//当需要对特定用户进行比对时,指定user_id进行比对。即人脸认证功能。
  69 +// multiValueMap.add("quality_control", "NORMAL");
  70 + System.out.println("multiValueMap:" + multiValueMap.toString());
  71 + HttpHeaders headers = new HttpHeaders();
  72 + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
  73 + HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(multiValueMap,
  74 + headers);
  75 + System.out.println("midddle:"+(System.currentTimeMillis()-time));
  76 + time = System.currentTimeMillis();
  77 + ResponseEntity<String> result = restTemplate.postForEntity(searchFace, requestEntity, String.class);
  78 + System.out.println("end:"+(System.currentTimeMillis()-time));
  79 + System.out.println("result:" + result.getBody());
  80 + return result.getBody();
  81 +
  82 + }
  83 +
  84 +}
cloud/common/src/main/java/com/sincere/common/util/Base64Util.java 0 → 100644
@@ -0,0 +1,95 @@ @@ -0,0 +1,95 @@
  1 +package com.sincere.common.util;
  2 +
  3 +import javax.imageio.stream.FileImageInputStream;
  4 +import java.io.ByteArrayOutputStream;
  5 +import java.io.File;
  6 +import java.io.FileNotFoundException;
  7 +import java.io.IOException;
  8 +
  9 +/**
  10 + * Base64 工具类
  11 + */
  12 +public class Base64Util {
  13 + private static final char last2byte = (char) Integer.parseInt("00000011", 2);
  14 + private static final char last4byte = (char) Integer.parseInt("00001111", 2);
  15 + private static final char last6byte = (char) Integer.parseInt("00111111", 2);
  16 + private static final char lead6byte = (char) Integer.parseInt("11111100", 2);
  17 + private static final char lead4byte = (char) Integer.parseInt("11110000", 2);
  18 + private static final char lead2byte = (char) Integer.parseInt("11000000", 2);
  19 + private static final char[] encodeTable = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
  20 +
  21 + public Base64Util() {
  22 + }
  23 +
  24 + public static String encode(byte[] from) {
  25 + StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3);
  26 + int num = 0;
  27 + char currentByte = 0;
  28 +
  29 + int i;
  30 + for (i = 0; i < from.length; ++i) {
  31 + for (num %= 8; num < 8; num += 6) {
  32 + switch (num) {
  33 + case 0:
  34 + currentByte = (char) (from[i] & lead6byte);
  35 + currentByte = (char) (currentByte >>> 2);
  36 + case 1:
  37 + case 3:
  38 + case 5:
  39 + default:
  40 + break;
  41 + case 2:
  42 + currentByte = (char) (from[i] & last6byte);
  43 + break;
  44 + case 4:
  45 + currentByte = (char) (from[i] & last4byte);
  46 + currentByte = (char) (currentByte << 2);
  47 + if (i + 1 < from.length) {
  48 + currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);
  49 + }
  50 + break;
  51 + case 6:
  52 + currentByte = (char) (from[i] & last2byte);
  53 + currentByte = (char) (currentByte << 4);
  54 + if (i + 1 < from.length) {
  55 + currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);
  56 + }
  57 + }
  58 +
  59 + to.append(encodeTable[currentByte]);
  60 + }
  61 + }
  62 +
  63 + if (to.length() % 4 != 0) {
  64 + for (i = 4 - to.length() % 4; i > 0; --i) {
  65 + to.append("=");
  66 + }
  67 + }
  68 +
  69 + return to.toString();
  70 + }
  71 +
  72 +
  73 + public static String imageencode(String path) {
  74 + byte[] data = null;
  75 + FileImageInputStream input = null;
  76 + try {
  77 + input = new FileImageInputStream(new File(path));
  78 + ByteArrayOutputStream output = new ByteArrayOutputStream();
  79 + byte[] buf = new byte[1024];
  80 + int numBytesRead = 0;
  81 + while ((numBytesRead = input.read(buf)) != -1) {
  82 + output.write(buf, 0, numBytesRead);
  83 + }
  84 + data = output.toByteArray();
  85 + output.close();
  86 + input.close();
  87 + return encode(data);
  88 + } catch (FileNotFoundException ex1) {
  89 + ex1.printStackTrace();
  90 + } catch (IOException ex1) {
  91 + ex1.printStackTrace();
  92 + }
  93 + return "";
  94 + }
  95 +}
cloud/haikangface/pom.xml
@@ -31,6 +31,12 @@ @@ -31,6 +31,12 @@
31 </dependency> 31 </dependency>
32 32
33 <dependency> 33 <dependency>
  34 + <groupId>com.sincere</groupId>
  35 + <artifactId>common</artifactId>
  36 + <version>1.0.0</version>
  37 + </dependency>
  38 +
  39 + <dependency>
34 <groupId>org.slf4j</groupId> 40 <groupId>org.slf4j</groupId>
35 <artifactId>slf4j-log4j12</artifactId> 41 <artifactId>slf4j-log4j12</artifactId>
36 <version>1.7.25</version> 42 <version>1.7.25</version>
@@ -138,6 +144,18 @@ @@ -138,6 +144,18 @@
138 <version>1.1.0</version> 144 <version>1.1.0</version>
139 </dependency> 145 </dependency>
140 146
  147 + <dependency>
  148 + <groupId>org.springframework.cloud</groupId>
  149 + <artifactId>spring-cloud-starter-feign</artifactId>
  150 + <version>1.3.6.RELEASE</version>
  151 + </dependency>
  152 +
  153 + <dependency>
  154 + <groupId>org.springframework.cloud</groupId>
  155 + <artifactId>spring-cloud-openfeign-core</artifactId>
  156 + <version>2.1.2.RELEASE</version>
  157 + </dependency>
  158 +
141 </dependencies> 159 </dependencies>
142 160
143 <dependencyManagement> 161 <dependencyManagement>
cloud/haikangface/src/main/java/com/sincere/haikangface/HaikangfaceApplication.java
@@ -9,11 +9,13 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -9,11 +9,13 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
9 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 9 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
10 import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; 10 import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
11 import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 11 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  12 +import org.springframework.cloud.openfeign.EnableFeignClients;
12 import org.springframework.context.annotation.ComponentScan; 13 import org.springframework.context.annotation.ComponentScan;
13 14
14 @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class}) 15 @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})
15 @SpringBootApplication 16 @SpringBootApplication
16 @EnableDiscoveryClient 17 @EnableDiscoveryClient
  18 +@EnableFeignClients(basePackages = "com.sincere.haikangface.fegin")
17 public class HaikangfaceApplication { 19 public class HaikangfaceApplication {
18 20
19 public static void main(String[] args) { 21 public static void main(String[] args) {
cloud/haikangface/src/main/java/com/sincere/haikangface/async/SendUserAsync.java
@@ -2,8 +2,6 @@ package com.sincere.haikangface.async; @@ -2,8 +2,6 @@ package com.sincere.haikangface.async;
2 2
3 3
4 import com.sincere.haikangface.CMSServer; 4 import com.sincere.haikangface.CMSServer;
5 -import com.sincere.haikangface.bean.AttendanceBean;  
6 -import com.sincere.haikangface.bean.StudentBean;  
7 import com.sincere.haikangface.dao.DeviceDao; 5 import com.sincere.haikangface.dao.DeviceDao;
8 import com.sincere.haikangface.dao.UserDao; 6 import com.sincere.haikangface.dao.UserDao;
9 import com.sincere.haikangface.utils.*; 7 import com.sincere.haikangface.utils.*;
@@ -11,25 +9,18 @@ import com.sincere.haikangface.xiananDao.SendRecordDao; @@ -11,25 +9,18 @@ import com.sincere.haikangface.xiananDao.SendRecordDao;
11 import org.json.JSONArray; 9 import org.json.JSONArray;
12 import org.json.JSONObject; 10 import org.json.JSONObject;
13 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
14 -import org.springframework.beans.factory.annotation.Value;  
15 -import org.springframework.scheduling.annotation.Async;  
16 import org.springframework.stereotype.Component; 12 import org.springframework.stereotype.Component;
17 -import org.springframework.util.StringUtils;  
18 13
19 import javax.imageio.stream.FileImageInputStream; 14 import javax.imageio.stream.FileImageInputStream;
20 import java.io.*; 15 import java.io.*;
21 import java.net.HttpURLConnection; 16 import java.net.HttpURLConnection;
22 import java.net.URL; 17 import java.net.URL;
23 -import java.text.SimpleDateFormat;  
24 import java.util.*; 18 import java.util.*;
25 19
26 @Component 20 @Component
27 public class SendUserAsync { 21 public class SendUserAsync {
28 22
29 23
30 - // @Value("${clint_type}")  
31 - private String clint_type = "18";  
32 -  
33 @Autowired 24 @Autowired
34 CMSServer cmsServer; 25 CMSServer cmsServer;
35 26
@@ -50,11 +41,7 @@ public class SendUserAsync { @@ -50,11 +41,7 @@ public class SendUserAsync {
50 if (null == sendRecoderUtils) sendRecoderUtils = new SendRecoderUtils(); 41 if (null == sendRecoderUtils) sendRecoderUtils = new SendRecoderUtils();
51 //1、检测图片是否合格 42 //1、检测图片是否合格
52 boolean check = true; 43 boolean check = true;
53 -// if (isPiliang == 1) {  
54 -// check = checkFace(picUrl);  
55 -// }  
56 if (check) {//合格 44 if (check) {//合格
57 -// cmsServer.deleteCard(deviceId,card);//删除人脸  
58 try { 45 try {
59 CompressPic.CompressPic(srcFile, picUrl); 46 CompressPic.CompressPic(srcFile, picUrl);
60 } catch (Exception e) { 47 } catch (Exception e) {
@@ -73,198 +60,10 @@ public class SendUserAsync { @@ -73,198 +60,10 @@ public class SendUserAsync {
73 } 60 }
74 61
75 boolean result = cmsServer.createImgPath(srcFile, picUrl, card, startTime, endTime, validTimeEnabled, name, deviceId, userType,employeeNo); 62 boolean result = cmsServer.createImgPath(srcFile, picUrl, card, startTime, endTime, validTimeEnabled, name, deviceId, userType,employeeNo);
76 -// if (result) {  
77 -// if (isPiliang == 0) {  
78 -// new File(srcFile).deleteOnExit();  
79 -// }  
80 -// }  
81 } else {//不合格 63 } else {//不合格
82 sendRecoderUtils.sendFail(sendRecordDao, card, srcFile, deviceId, userDao, "人脸照片不合格", userType); 64 sendRecoderUtils.sendFail(sendRecordDao, card, srcFile, deviceId, userDao, "人脸照片不合格", userType);
83 } 65 }
84 66
85 } 67 }
86 68
87 - private String getCard(String card) {  
88 -  
89 - if (card.length() == 8) {  
90 - int length = card.length();  
91 - String result = card.substring(length - 2, length) + card.substring(length - 4, length - 2) + card.substring(length - 6, length - 4)  
92 - + card.substring(length - 8, length - 6);  
93 - return result;  
94 -  
95 - } else {  
96 - System.out.println("卡号位数不对:" + card);  
97 - return "";  
98 - }  
99 -  
100 - }  
101 -  
102 -  
103 - private boolean checkFace(String filePath) {  
104 - // 请求url  
105 - String url = "https://aip.baidubce.com/rest/2.0/face/v3/faceverify";  
106 - try {  
107 -  
108 - List list = new ArrayList();  
109 - Map<String, String> map = new HashMap<>();  
110 - String image_type = "";  
111 - String imgFilePath = filePath;  
112 - image_type = "BASE64";  
113 - filePath = Base64Util.encode(image2byte(filePath));  
114 - map.put("image", filePath);  
115 - map.put("image_type", image_type);  
116 -// map.put("face_field","");  
117 -// map.put("option","GATE");  
118 - list.add(map);  
119 - String param = GsonUtils.toJson(list);  
120 - // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。  
121 - String accessToken = getAuth();  
122 -  
123 - String result1 = HttpUtil.post(url, accessToken, "application/json", param);  
124 - JSONObject jsonObject = new JSONObject(result1);  
125 - String error_msg = jsonObject.optString("error_msg");  
126 - JSONObject result = jsonObject.optJSONObject("result");  
127 - if (error_msg.equals("SUCCESS")) {  
128 - double face_liveness = result.optDouble("face_liveness", 0.00);//活体分数值  
129 - JSONArray face_list = result.optJSONArray("face_list");  
130 - JSONObject location = face_list.optJSONObject(0).optJSONObject("location");  
131 - double rotation = location.optDouble("rotation", 0.0);//竖直方向旋转角度  
132 - System.out.println("rotation:" + rotation + " face_liveness:" + face_liveness);  
133 - if (face_liveness > 0.4) {  
134 - int angel = 0;  
135 - if (45 < rotation && rotation < 135) {//右向横图,需要旋转270度  
136 - System.out.println("旋转270度");  
137 - angel = 270;  
138 - } else if (rotation > -135 && rotation < -45) {//左向横图,需要旋转90度  
139 - System.out.println("旋转90度");  
140 - angel = 90;  
141 - } else if (rotation >= -180 && rotation <= -135 || rotation >= 135 && rotation <= 180) {//倒向图片,需要旋转180度  
142 - System.out.println("旋转180度");  
143 - angel = 180;  
144 - }  
145 - //E:\wwwhtdocs\SmartCampus\face17e50\School  
146 - //http://campus.myjxt.com//face17e5/School861/Student/GBZX20171134.jpg  
147 - //F:\wwwroot\smartcampus\face17e5  
148 -// imgFilePath =httpurl.replace("http://campus.myjxt.com","E:\\wwwhtdocs\\SmartCampus");  
149 -// imgFilePath = httpurl.replace("http://60.190.202.57:1000","F:\\wwwroot\\smartcampus");  
150 -// System.out.println("图片是否存在"+new File(imgFilePath).exists());  
151 -// System.out.println("imgFilePath:"+imgFilePath);  
152 - ImageUtils.rotatePhonePhoto(imgFilePath, angel);  
153 - return true;  
154 - } else {  
155 -// deleteImgFile(imgFilePath);  
156 -  
157 - return false;  
158 - }  
159 - } else {  
160 -// deleteImgFile(imgFilePath);  
161 - return false;  
162 - }  
163 -  
164 - } catch (Exception e) {  
165 - e.printStackTrace();  
166 - }  
167 - return false;  
168 - }  
169 -  
170 - private boolean deleteImgFile(String imgFilePath) {  
171 - File file = new File(imgFilePath);  
172 - if (file.exists()) {  
173 - return file.delete();  
174 - }  
175 - return false;  
176 - }  
177 -  
178 - //图片到byte数组  
179 - public byte[] image2byte(String path) {  
180 - byte[] data = null;  
181 - FileImageInputStream input = null;  
182 - try {  
183 - input = new FileImageInputStream(new File(path));  
184 - ByteArrayOutputStream output = new ByteArrayOutputStream();  
185 - byte[] buf = new byte[1024];  
186 - int numBytesRead = 0;  
187 - while ((numBytesRead = input.read(buf)) != -1) {  
188 - output.write(buf, 0, numBytesRead);  
189 - }  
190 - data = output.toByteArray();  
191 - output.close();  
192 - input.close();  
193 - } catch (FileNotFoundException ex1) {  
194 - ex1.printStackTrace();  
195 - } catch (IOException ex1) {  
196 - ex1.printStackTrace();  
197 - }  
198 - return data;  
199 - }  
200 -  
201 - /**  
202 - * 获取权限token  
203 - *  
204 - * @return 返回示例:  
205 - * {  
206 - * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",  
207 - * "expires_in": 2592000  
208 - * }  
209 - */  
210 - public String getAuth() {  
211 - // 官网获取的 API Key 更新为你注册的  
212 - String clientId = "u6rV4YxRZmwzKj56N0DCW8eO";  
213 - // 官网获取的 Secret Key 更新为你注册的  
214 - String clientSecret = "Krp3KhmIBdnNEsRa1LavMHuZl0KhQGVm";  
215 - return getAuth(clientId, clientSecret);  
216 - }  
217 -  
218 - /**  
219 - * 获取API访问token  
220 - * 该token有一定的有效期,需要自行管理,当失效时需重新获取.  
221 - *  
222 - * @param ak - 百度云官网获取的 API Key  
223 - * @param sk - 百度云官网获取的 Securet Key  
224 - * @return assess_token 示例:  
225 - * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"  
226 - */  
227 - public static String getAuth(String ak, String sk) {  
228 - // 获取token地址  
229 - String authHost = "https://aip.baidubce.com/oauth/2.0/token?";  
230 - String getAccessTokenUrl = authHost  
231 - // 1. grant_type为固定参数  
232 - + "grant_type=client_credentials"  
233 - // 2. 官网获取的 API Key  
234 - + "&client_id=" + ak  
235 - // 3. 官网获取的 Secret Key  
236 - + "&client_secret=" + sk;  
237 - try {  
238 - URL realUrl = new URL(getAccessTokenUrl);  
239 - // 打开和URL之间的连接  
240 - HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();  
241 - connection.setRequestMethod("GET");  
242 - connection.connect();  
243 - // 获取所有响应头字段  
244 -// Map<String, List<String>> map = connection.getHeaderFields();  
245 - // 遍历所有的响应头字段  
246 -// for (String key : map.keySet()) {  
247 -// System.err.println(key + "--->" + map.get(key));  
248 -// }  
249 - // 定义 BufferedReader输入流来读取URL的响应  
250 - BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));  
251 - String result = "";  
252 - String line;  
253 - while ((line = in.readLine()) != null) {  
254 - result += line;  
255 - }  
256 - /**  
257 - * 返回结果示例  
258 - */  
259 -// System.err.println("result:" + result);  
260 - JSONObject jsonObject = new JSONObject(result);  
261 - String access_token = jsonObject.getString("access_token");  
262 - return access_token;  
263 - } catch (Exception e) {  
264 - System.err.printf("获取token失败!");  
265 - e.printStackTrace(System.err);  
266 - }  
267 - return null;  
268 - }  
269 -  
270 } 69 }
cloud/haikangface/src/main/java/com/sincere/haikangface/control/UserControl.java
1 package com.sincere.haikangface.control; 1 package com.sincere.haikangface.control;
2 2
  3 +import com.sincere.common.dto.smartCampus.SZ_AttendanceDto;
  4 +import com.sincere.common.util.BaiduApiUtiols;
3 import com.sincere.haikangface.CMSServer; 5 import com.sincere.haikangface.CMSServer;
4 import com.sincere.haikangface.async.SendUserAsync; 6 import com.sincere.haikangface.async.SendUserAsync;
5 -import com.sincere.haikangface.bean.AttendanceBean;  
6 -import com.sincere.haikangface.bean.StudentBean;  
7 import com.sincere.haikangface.bean.StudentInfo; 7 import com.sincere.haikangface.bean.StudentInfo;
8 -import com.sincere.haikangface.dao.DeviceDao;  
9 import com.sincere.haikangface.dao.UserDao; 8 import com.sincere.haikangface.dao.UserDao;
  9 +import com.sincere.haikangface.fegin.HaikangfaceFegin;
10 import com.sincere.haikangface.utils.*; 10 import com.sincere.haikangface.utils.*;
11 import com.sincere.haikangface.xiananDao.SendRecordDao; 11 import com.sincere.haikangface.xiananDao.SendRecordDao;
12 import io.swagger.annotations.Api; 12 import io.swagger.annotations.Api;
13 import io.swagger.annotations.ApiOperation; 13 import io.swagger.annotations.ApiOperation;
14 -import org.json.JSONArray;  
15 -import org.json.JSONObject;  
16 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
17 -import org.springframework.http.ResponseEntity;  
18 import org.springframework.util.StringUtils; 15 import org.springframework.util.StringUtils;
19 import org.springframework.web.bind.annotation.RequestMapping; 16 import org.springframework.web.bind.annotation.RequestMapping;
20 import org.springframework.web.bind.annotation.RequestMethod; 17 import org.springframework.web.bind.annotation.RequestMethod;
@@ -22,15 +19,9 @@ import org.springframework.web.bind.annotation.RequestParam; @@ -22,15 +19,9 @@ import org.springframework.web.bind.annotation.RequestParam;
22 import org.springframework.web.bind.annotation.RestController; 19 import org.springframework.web.bind.annotation.RestController;
23 import org.springframework.web.multipart.MultipartFile; 20 import org.springframework.web.multipart.MultipartFile;
24 21
25 -import javax.imageio.stream.FileImageInputStream;  
26 import java.io.*; 22 import java.io.*;
27 import java.math.BigInteger; 23 import java.math.BigInteger;
28 -import java.net.HttpURLConnection;  
29 -import java.net.URL;  
30 -import java.util.ArrayList;  
31 -import java.util.HashMap;  
32 import java.util.List; 24 import java.util.List;
33 -import java.util.Map;  
34 25
35 @RestController 26 @RestController
36 @RequestMapping("/facereco/*") 27 @RequestMapping("/facereco/*")
@@ -44,13 +35,15 @@ public class UserControl { @@ -44,13 +35,15 @@ public class UserControl {
44 UserDao userDao; 35 UserDao userDao;
45 36
46 @Autowired 37 @Autowired
47 - DeviceDao deviceDao; 38 + HaikangfaceFegin haikangfaceFegin;
  39 +// DeviceDao deviceDao;
48 40
49 @Autowired 41 @Autowired
50 CMSServer cmsServer; 42 CMSServer cmsServer;
51 43
52 @Autowired 44 @Autowired
53 SendRecordDao sendRecordDao; 45 SendRecordDao sendRecordDao;
  46 +
54 SendRecoderUtils sendRecoderUtils; 47 SendRecoderUtils sendRecoderUtils;
55 48
56 @RequestMapping(value = "sendStuCardAndImg", method = RequestMethod.GET) 49 @RequestMapping(value = "sendStuCardAndImg", method = RequestMethod.GET)
@@ -95,24 +88,6 @@ public class UserControl { @@ -95,24 +88,6 @@ public class UserControl {
95 return true; 88 return true;
96 } 89 }
97 90
98 - /*@RequestMapping(value = "sendParentCardAndImg", method = RequestMethod.GET)  
99 - @ApiOperation("下发家长人脸给设备")  
100 - public boolean sendParentCardAndImg(@RequestParam("filePath") String filePath, @RequestParam("card") String card  
101 - , @RequestParam("name") String name, @RequestParam("deviceId") String deviceId, @RequestParam("startTime") String startTime,  
102 - @RequestParam("endTime") String endTime, @RequestParam("validTimeEnabled") int validTimeEnabled) {  
103 - String targetPath = FileUtils.picPathComp + new File(filePath).getName();  
104 - try {  
105 - System.out.println("targetPath:" + targetPath + " targetPath:" + new File(targetPath).exists());  
106 - CompressPic.CompressPic(filePath, targetPath);  
107 -// System.out.println("exit:" + new File(targetPath).exists() + " targetPath:" + targetPath);  
108 - sendUserAsync.sendStuToHaiKang(targetPath, Long.parseLong(getCard(card), 16) + "", startTime, endTime, validTimeEnabled, name, deviceId);  
109 - } catch (Exception e) {  
110 - e.printStackTrace();  
111 - return false;  
112 - }  
113 - return true;  
114 - }*/  
115 -  
116 @RequestMapping(value = "DeleteCard", method = RequestMethod.GET) 91 @RequestMapping(value = "DeleteCard", method = RequestMethod.GET)
117 @ApiOperation("删除人脸") 92 @ApiOperation("删除人脸")
118 public boolean deleteCard(@RequestParam("deviceId") String deviceId, @RequestParam("card") String card) { 93 public boolean deleteCard(@RequestParam("deviceId") String deviceId, @RequestParam("card") String card) {
@@ -136,7 +111,6 @@ public class UserControl { @@ -136,7 +111,6 @@ public class UserControl {
136 } else { 111 } else {
137 return false; 112 return false;
138 } 113 }
139 -// return cmsServer.getIsDeviceOnline(deviceId);  
140 } 114 }
141 115
142 @RequestMapping(value = "FaceUploadFile", method = RequestMethod.POST) 116 @RequestMapping(value = "FaceUploadFile", method = RequestMethod.POST)
@@ -153,9 +127,10 @@ public class UserControl { @@ -153,9 +127,10 @@ public class UserControl {
153 @RequestMapping(value = "getKaoqinTem", method = RequestMethod.GET) 127 @RequestMapping(value = "getKaoqinTem", method = RequestMethod.GET)
154 @ApiOperation("根据设备获取考勤模板") 128 @ApiOperation("根据设备获取考勤模板")
155 public String getKaoqinTem(@RequestParam("deviceId") String deviceId) { 129 public String getKaoqinTem(@RequestParam("deviceId") String deviceId) {
156 - AttendanceBean attendanceBean = deviceDao.selectDevice(deviceId); 130 + SZ_AttendanceDto attendanceBean = haikangfaceFegin.selectAttendaceWithId(deviceId);
157 int isKaoqin = attendanceBean.getIsKaoqin();//获取考勤模板id 131 int isKaoqin = attendanceBean.getIsKaoqin();//获取考勤模板id
158 - List<AttendanceBean> attendanceBeans = deviceDao.getAttens(isKaoqin);//获取同一模板下的设备 132 + System.out.println("isKaoqin:"+attendanceBean.toString());
  133 + List<SZ_AttendanceDto> attendanceBeans = haikangfaceFegin.getAttensWithIsKaoqin(isKaoqin);//获取同一模板下的设备
159 String content = ""; 134 String content = "";
160 135
161 for (int i = 0; i < attendanceBeans.size(); i++) { 136 for (int i = 0; i < attendanceBeans.size(); i++) {
cloud/haikangface/src/main/java/com/sincere/haikangface/dao/DeviceDao.java
1 package com.sincere.haikangface.dao; 1 package com.sincere.haikangface.dao;
2 2
  3 +import com.sincere.common.dto.smartCampus.SZ_AttendanceDto;
3 import com.sincere.haikangface.bean.AttendanceBean; 4 import com.sincere.haikangface.bean.AttendanceBean;
4 import com.sincere.haikangface.bean.FaceWaterRecoder; 5 import com.sincere.haikangface.bean.FaceWaterRecoder;
5 import com.sincere.haikangface.bean.PlaceAttendance; 6 import com.sincere.haikangface.bean.PlaceAttendance;
@@ -23,7 +24,7 @@ public interface DeviceDao { @@ -23,7 +24,7 @@ public interface DeviceDao {
23 AttendanceBean selectDevice(@Param("clint_id") String clint_id); 24 AttendanceBean selectDevice(@Param("clint_id") String clint_id);
24 25
25 @Select("select * from SZ_Attendance where IsKaoqin = #{IsKaoqin}") 26 @Select("select * from SZ_Attendance where IsKaoqin = #{IsKaoqin}")
26 - List<AttendanceBean> getAttens(@Param("IsKaoqin")int IsKaoqin); 27 + List<SZ_AttendanceDto> getAttensWithIsKaoqin(@Param("IsKaoqin")int IsKaoqin);
27 28
28 @Update("update SZ_Attendance set isConnection = #{isConnection} where clint_id = #{clint_id}") 29 @Update("update SZ_Attendance set isConnection = #{isConnection} where clint_id = #{clint_id}")
29 int updateDeviceStatu(@Param("isConnection") int isConnection, @Param("clint_id") String clint_id); 30 int updateDeviceStatu(@Param("isConnection") int isConnection, @Param("clint_id") String clint_id);
cloud/haikangface/src/main/java/com/sincere/haikangface/dao/UserDao.java
@@ -183,6 +183,6 @@ public interface UserDao { @@ -183,6 +183,6 @@ public interface UserDao {
183 @Select("select class_id from SZ_V_School_Student where school_id = 479 and student_id = #{customerId} ") 183 @Select("select class_id from SZ_V_School_Student where school_id = 479 and student_id = #{customerId} ")
184 String getClassName(@Param("customerId") String customerId); 184 String getClassName(@Param("customerId") String customerId);
185 185
186 - @Select("select clint_id from SZ_Attendance where school_id = #{schoolId} and clint_type=18") 186 + @Select("select clint_id from SZ_AttendanceDto where school_id = #{schoolId} and clint_type=18")
187 List<String> getDeviceIdsWidthSchoolId(@Param("schoolId") int schoolId); 187 List<String> getDeviceIdsWidthSchoolId(@Param("schoolId") int schoolId);
188 } 188 }
cloud/haikangface/src/main/java/com/sincere/haikangface/fegin/HaikangfaceFegin.java 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +package com.sincere.haikangface.fegin;
  2 +
  3 +import com.sincere.common.dto.smartCampus.SZ_AttendanceDto;
  4 +import org.springframework.cloud.openfeign.FeignClient;
  5 +import org.springframework.web.bind.annotation.RequestBody;
  6 +import org.springframework.web.bind.annotation.RequestMapping;
  7 +import org.springframework.web.bind.annotation.RequestMethod;
  8 +import org.springframework.web.bind.annotation.RequestParam;
  9 +
  10 +import java.util.List;
  11 +
  12 +@FeignClient("smartCampusSearch")
  13 +public interface HaikangfaceFegin {
  14 +
  15 + @RequestMapping(method = RequestMethod.GET,value = "attendance/selectAttendaceWithId")
  16 + SZ_AttendanceDto selectAttendaceWithId(@RequestParam("clint_id") String clint_id);
  17 +
  18 + @RequestMapping(method = RequestMethod.GET,value = "attendance/getAttensWithIsKaoqin")
  19 + List<SZ_AttendanceDto> getAttensWithIsKaoqin(@RequestParam("IsKaoqin") int isKaoqin);
  20 +
  21 +}
cloud/haikangface/src/main/java/com/sincere/haikangface/utils/AuthService.java
@@ -1,95 +0,0 @@ @@ -1,95 +0,0 @@
1 -package com.sincere.haikangface.utils;  
2 -  
3 -import org.json.JSONObject;  
4 -  
5 -import java.io.BufferedReader;  
6 -import java.io.InputStreamReader;  
7 -import java.net.HttpURLConnection;  
8 -import java.net.URL;  
9 -import java.util.List;  
10 -import java.util.Map;  
11 -  
12 -/**  
13 - * 获取token类  
14 - */  
15 -public class AuthService {  
16 - //设置APPID/AK/SK  
17 - public static final String APP_ID = "15990462";  
18 - public static final String API_KEY = "t70Rzr6SGmfU9S6MrqAkspsY";  
19 - public static final String SECRET_KEY = "nSqpqtrf7cCjo8vOB9knL85nwWNoxwvS ";  
20 - /**  
21 - * 获取权限token  
22 - * @return 返回示例:  
23 - * {  
24 - * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",  
25 - * "expires_in": 2592000  
26 - * }  
27 - */  
28 - //获取文字识别id  
29 - public static String getAuth() {  
30 - // 官网获取的 API Key 更新为你注册的  
31 - String clientId = "t70Rzr6SGmfU9S6MrqAkspsY";  
32 - // 官网获取的 Secret Key 更新为你注册的  
33 - String clientSecret = "nSqpqtrf7cCjo8vOB9knL85nwWNoxwvS";  
34 - return getAuth(clientId, clientSecret);  
35 - }  
36 -  
37 - public static String getFaceAuthToken() {  
38 - // 官网获取的 API Key 更新为你注册的  
39 - String clientId = "u6rV4YxRZmwzKj56N0DCW8eO";  
40 - // 官网获取的 Secret Key 更新为你注册的  
41 - String clientSecret = "Krp3KhmIBdnNEsRa1LavMHuZl0KhQGVm";  
42 - return getAuth(clientId, clientSecret);  
43 - }  
44 -  
45 - /**  
46 - * 获取API访问token  
47 - * 该token有一定的有效期,需要自行管理,当失效时需重新获取.  
48 - * @param ak - 百度云官网获取的 API Key  
49 - * @param sk - 百度云官网获取的 Securet Key  
50 - * @return assess_token 示例:  
51 - * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"  
52 - */  
53 - public static String getAuth(String ak, String sk) {  
54 - // 获取token地址  
55 - String authHost = "https://aip.baidubce.com/oauth/2.0/token?";  
56 - String getAccessTokenUrl = authHost  
57 - // 1. grant_type为固定参数  
58 - + "grant_type=client_credentials"  
59 - // 2. 官网获取的 API Key  
60 - + "&client_id=" + ak  
61 - // 3. 官网获取的 Secret Key  
62 - + "&client_secret=" + sk;  
63 - try {  
64 - URL realUrl = new URL(getAccessTokenUrl);  
65 - // 打开和URL之间的连接  
66 - HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();  
67 - connection.setRequestMethod("GET");  
68 - connection.connect();  
69 - // 获取所有响应头字段  
70 -// Map<String, List<String>> map = connection.getHeaderFields();  
71 -// // 遍历所有的响应头字段  
72 -// for (String key : map.keySet()) {  
73 -// System.err.println(key + "--->" + map.get(key));  
74 -// }  
75 - // 定义 BufferedReader输入流来读取URL的响应  
76 - BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));  
77 - String result = "";  
78 - String line;  
79 - while ((line = in.readLine()) != null) {  
80 - result += line;  
81 - }  
82 - /**  
83 - * 返回结果示例  
84 - */  
85 -// System.err.println("result:" + result);  
86 - JSONObject jsonObject = new JSONObject(result);  
87 - String access_token = jsonObject.getString("access_token");  
88 - return access_token;  
89 - } catch (Exception e) {  
90 - System.err.printf("获取token失败!");  
91 - e.printStackTrace(System.err);  
92 - }  
93 - return null;  
94 - }  
95 -}  
cloud/haikangface/src/main/java/com/sincere/haikangface/utils/BaiduApiUtiols.java
@@ -1,87 +0,0 @@ @@ -1,87 +0,0 @@
1 -package com.sincere.haikangface.utils;  
2 -  
3 -import org.json.JSONObject;  
4 -import org.springframework.http.HttpEntity;  
5 -import org.springframework.http.HttpHeaders;  
6 -import org.springframework.http.MediaType;  
7 -import org.springframework.http.ResponseEntity;  
8 -import org.springframework.util.LinkedMultiValueMap;  
9 -import org.springframework.util.MultiValueMap;  
10 -import org.springframework.web.client.RestTemplate;  
11 -  
12 -import java.io.File;  
13 -  
14 -public class BaiduApiUtiols {  
15 -  
16 - public static BaiduApiUtiols baiduApiUtiols;  
17 -  
18 - public static BaiduApiUtiols getInstance() {  
19 -  
20 - if (null == baiduApiUtiols) {  
21 - synchronized (BaiduApiUtiols.class) {  
22 - baiduApiUtiols = new BaiduApiUtiols();  
23 - }  
24 - }  
25 - return baiduApiUtiols;  
26 - }  
27 -  
28 -  
29 - /**  
30 - * @param imgPath 图片路径  
31 - * @param group_id 学校id  
32 - * @param user_id 用户id  
33 - * @param user_info 用户名字  
34 - * @return  
35 - */  
36 - public String registerFace(String imgPath, String group_id, String user_id, String user_info) {  
37 -  
38 - String registUrl = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=" + AuthService.getFaceAuthToken();  
39 - long time = System.currentTimeMillis();  
40 - System.out.println("starttime:"+time);  
41 - RestTemplate restTemplate = new RestTemplate();  
42 - MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();  
43 - multiValueMap.add("image", Base64Util.imageencode(imgPath));  
44 - multiValueMap.add("image_type", "BASE64");  
45 - multiValueMap.add("group_id", group_id);  
46 - multiValueMap.add("user_id", user_id);  
47 - multiValueMap.add("user_info", user_info);  
48 -// multiValueMap.add("quality_control", "NORMAL");  
49 - System.out.println("multiValueMap:" + multiValueMap.toString());  
50 - HttpHeaders headers = new HttpHeaders();  
51 - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);  
52 - HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(multiValueMap,  
53 - headers);  
54 - System.out.println("midddle:"+(System.currentTimeMillis()-time));  
55 - time = System.currentTimeMillis();  
56 - ResponseEntity<String> result = restTemplate.postForEntity(registUrl, requestEntity, String.class);  
57 - System.out.println("end:"+(System.currentTimeMillis()-time));  
58 - System.out.println("result:" + result.getBody());  
59 - return result.getBody();  
60 -  
61 - }  
62 -  
63 - public String searchFace(String imgPath,String group_id, String user_id){  
64 - String searchFace = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token="+AuthService.getFaceAuthToken();  
65 - long time = System.currentTimeMillis();  
66 - RestTemplate restTemplate = new RestTemplate();  
67 - MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();  
68 - multiValueMap.add("image", Base64Util.imageencode(imgPath));  
69 - multiValueMap.add("image_type", "BASE64");  
70 - multiValueMap.add("group_id_list", group_id);//从指定的group中进行查找 用逗号分隔,上限10个  
71 - multiValueMap.add("user_id", user_id);//当需要对特定用户进行比对时,指定user_id进行比对。即人脸认证功能。  
72 -// multiValueMap.add("quality_control", "NORMAL");  
73 - System.out.println("multiValueMap:" + multiValueMap.toString());  
74 - HttpHeaders headers = new HttpHeaders();  
75 - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);  
76 - HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(multiValueMap,  
77 - headers);  
78 - System.out.println("midddle:"+(System.currentTimeMillis()-time));  
79 - time = System.currentTimeMillis();  
80 - ResponseEntity<String> result = restTemplate.postForEntity(searchFace, requestEntity, String.class);  
81 - System.out.println("end:"+(System.currentTimeMillis()-time));  
82 - System.out.println("result:" + result.getBody());  
83 - return result.getBody();  
84 -  
85 - }  
86 -  
87 -}  
cloud/haikangface/src/main/java/com/sincere/haikangface/utils/Base64Util.java
@@ -1,95 +0,0 @@ @@ -1,95 +0,0 @@
1 -package com.sincere.haikangface.utils;  
2 -  
3 -import javax.imageio.stream.FileImageInputStream;  
4 -import java.io.ByteArrayOutputStream;  
5 -import java.io.File;  
6 -import java.io.FileNotFoundException;  
7 -import java.io.IOException;  
8 -  
9 -/**  
10 - * Base64 工具类  
11 - */  
12 -public class Base64Util {  
13 - private static final char last2byte = (char) Integer.parseInt("00000011", 2);  
14 - private static final char last4byte = (char) Integer.parseInt("00001111", 2);  
15 - private static final char last6byte = (char) Integer.parseInt("00111111", 2);  
16 - private static final char lead6byte = (char) Integer.parseInt("11111100", 2);  
17 - private static final char lead4byte = (char) Integer.parseInt("11110000", 2);  
18 - private static final char lead2byte = (char) Integer.parseInt("11000000", 2);  
19 - private static final char[] encodeTable = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};  
20 -  
21 - public Base64Util() {  
22 - }  
23 -  
24 - public static String encode(byte[] from) {  
25 - StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3);  
26 - int num = 0;  
27 - char currentByte = 0;  
28 -  
29 - int i;  
30 - for (i = 0; i < from.length; ++i) {  
31 - for (num %= 8; num < 8; num += 6) {  
32 - switch (num) {  
33 - case 0:  
34 - currentByte = (char) (from[i] & lead6byte);  
35 - currentByte = (char) (currentByte >>> 2);  
36 - case 1:  
37 - case 3:  
38 - case 5:  
39 - default:  
40 - break;  
41 - case 2:  
42 - currentByte = (char) (from[i] & last6byte);  
43 - break;  
44 - case 4:  
45 - currentByte = (char) (from[i] & last4byte);  
46 - currentByte = (char) (currentByte << 2);  
47 - if (i + 1 < from.length) {  
48 - currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);  
49 - }  
50 - break;  
51 - case 6:  
52 - currentByte = (char) (from[i] & last2byte);  
53 - currentByte = (char) (currentByte << 4);  
54 - if (i + 1 < from.length) {  
55 - currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);  
56 - }  
57 - }  
58 -  
59 - to.append(encodeTable[currentByte]);  
60 - }  
61 - }  
62 -  
63 - if (to.length() % 4 != 0) {  
64 - for (i = 4 - to.length() % 4; i > 0; --i) {  
65 - to.append("=");  
66 - }  
67 - }  
68 -  
69 - return to.toString();  
70 - }  
71 -  
72 -  
73 - public static String imageencode(String path) {  
74 - byte[] data = null;  
75 - FileImageInputStream input = null;  
76 - try {  
77 - input = new FileImageInputStream(new File(path));  
78 - ByteArrayOutputStream output = new ByteArrayOutputStream();  
79 - byte[] buf = new byte[1024];  
80 - int numBytesRead = 0;  
81 - while ((numBytesRead = input.read(buf)) != -1) {  
82 - output.write(buf, 0, numBytesRead);  
83 - }  
84 - data = output.toByteArray();  
85 - output.close();  
86 - input.close();  
87 - return encode(data);  
88 - } catch (FileNotFoundException ex1) {  
89 - ex1.printStackTrace();  
90 - } catch (IOException ex1) {  
91 - ex1.printStackTrace();  
92 - }  
93 - return "";  
94 - }  
95 -}  
cloud/haikangface/src/main/java/com/sincere/haikangface/xiananDao/SendRecordDao.java
@@ -45,7 +45,7 @@ public interface SendRecordDao { @@ -45,7 +45,7 @@ public interface SendRecordDao {
45 List<SendRecordBean> getSenFail(@Param("schoolId")String schoolId,@Param("usertype")int usertype); 45 List<SendRecordBean> getSenFail(@Param("schoolId")String schoolId,@Param("usertype")int usertype);
46 46
47 47
48 - @Select("select a.customerID from [dbo].[WG_SendFail] a inner join DBlan137.smartcampus.dbo.SZ_Attendance b on a.deviceID=b.clint_id and b.isConnection=1 order by createTime desc") 48 + @Select("select a.customerID from [dbo].[WG_SendFail] a inner join DBlan137.smartcampus.dbo.SZ_AttendanceDto b on a.deviceID=b.clint_id and b.isConnection=1 order by createTime desc")
49 List<String> getWGFail(); 49 List<String> getWGFail();
50 50
51 @Delete("delete Face_SendFail where deviceID = #{deviceID} and Num = #{Num}") 51 @Delete("delete Face_SendFail where deviceID = #{deviceID} and Num = #{Num}")
cloud/haikangface/src/main/resources/application.yaml
@@ -35,7 +35,8 @@ eureka: @@ -35,7 +35,8 @@ eureka:
35 lease-renewal-interval-in-seconds: 10 35 lease-renewal-interval-in-seconds: 10
36 client: 36 client:
37 service-url: 37 service-url:
38 - defaultZone: http://121.40.109.21:8761/eureka/,http://121.40.109.21:8762/eureka/ 38 +# defaultZone: http://121.40.109.21:8761/eureka/,http://121.40.109.21:8762/eureka/
  39 + defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
39 40
40 mybatis: 41 mybatis:
41 campus: 42 campus:
cloud/huoti/1111.jpg 0 → 100644

25 KB

cloud/huoti/22222.jpg 0 → 100644

26.3 KB

cloud/independence/src/main/resources/logback.xml
@@ -58,4 +58,4 @@ @@ -58,4 +58,4 @@
58         <appender-ref ref="SYSTEM_FILE" /> 58         <appender-ref ref="SYSTEM_FILE" />
59     </root> 59     </root>
60 60
61 -</configuration>  
62 \ No newline at end of file 61 \ No newline at end of file
  62 +</configuration>
cloud/log/2019-11-25/下发指令.txt 0 → 100644
@@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
  1 +2019-11-25 17:32:49 2019-11-25 17:32:49 30
  2 +
cloud/log/2019-11-25/检测成功.txt 0 → 100644
@@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
  1 +2019-11-25 17:33:59 检测成功:/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCALQAhwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1qiiimAtFGKKYBRRRQWOooooAWiiigBaKKKACiiigB9FFFADKKKPwoJCjvR+FAHNAh9FFFABRRRQAUUUUAFFFFABRRRQAtFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACUUUUAFFFFABRRRQAUUUUAFFFFADKKKPwoAKKKKACiiigBKKKKAExRS0UAJRRRQAUUUUAMo70UUAP7UUdqKACilopjCiiikULRRRQA+iiigAooooAKKKKCQooooEFFFFABRRRQAUUUUAFFFFAC0UUUAFFFFABRRRQAUUUUAFFFFAC0UUUAFFFFABRRRQAlFFFABRRRQAUUUUAFFFFABRRRQAlFFFABRRRQAyiij8KACij8KPwoAKKKKAEooooAKKKKAEopaSgBtLSUtAC0UUUALRRRTGLRRRSKCij8KUUAOooooAKKKKCQooooEFFFFAC0UUUAFFFFABRRRQAUUUUAFFFFAC0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACUUUUAFFFFABRRRQAlFFFABRRRQAyiij8KACiiigAooooASkpaSgAoo7UUALRRRQAUUUUxi0d6PwoA5pAPooopgFFFFIQUUUUALRRRQAUUUUAFFFFABRRRQAtFFFABRRRQAUUUUAFFFFABRRiigBaKKKAEop1FADaKdRQA2inUUANop1FADaKdRQAlFFFACUUUUAFFFFABRRRQAUUUUAJRRRQAUUUUAJRRRQAUUUUAMooo/CgAooooAKMUUUAJRRSigAooooASgdaKB1pjJKKKKACiiigAooooAWiiikMKKKKACiiigBaKKKCQooooAKKKKAFooooASimFxTZZ0iTJPbigCWiuR1X4haTpjmKNzdS+kfT6ZrkL/4m6sz5t4IoUxxuQu1TzIdj13zcVz93400K0cCS/jPGRsy38hj9a8Q1nxlq+o5jubmSUZyqqNoz7461z8t7ctubcqfWjmHynul78VdFgYrbRyz46sSEH61gz/F25B3QWEWO5kcvn6YArx57p4+HbduOTg44/OlW6B5BK+mRxRcVj2K0+Lsgcm8sYyh6eVJtx+YOf0rqNO+ImjXzbWkELdlkbk/ieP1r52aU43YPrkf40JeSKMqcChXA+pV8T6K+ANStc/3RKCT+tWYdTtZzhLiA9/8AWgkCvlpbzGGGT9OanF/K4GJG45GGwR+tO4j6m86MdZAfxp+7NfNOkeLdT0hybW7mUE5KMwKn8D1rv9F+L4O1NVthtAwZYFwc+4z/ACoTA9Yp1ZWl6/p2swiWyuUlXuAeR9RWnvpgOooooAKKKKACiiigApD0paD0oAjooooAKKKKACiiigBKKKKACiiigBKKKKACiiigAph60+mkc0AJRR+FFABRRRQAUUUUAJQOtFA60xklFFFABRRRQAtFFFIYUUUUDCiiigBaKKKZIUUUUALRRRSATFGKfgUYoEMz/s1VuLtUIUcsTjHTJpmp38djZzTuwCRqWNeV6z4/eMlYUHmnOXl5AB/ujoPypDSuega1r1no0KvdTDLA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
  2 +
  3 +2019-11-25 17:34:21 检测成功:/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCALQAhwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1UUtIKWqJCiiigBaKKKACiiigAoxT8UYoAKKKKBBRRRQAmKMU6igY3FGKdRQA3FGKdRQA3FGKdRQAYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFADMUYp1FADcUYp1FADcUYp1FADcUYp1FADcUYp1FADcUYp2KMUANxRinYoxQA3FGKdijFADMUYp1FBQ3FGKWigBmKMUtFADSKQ0+mkUANxRilooAZijFOooAZRRRQA3FGKWigCOinUmKALVLS4ooJCinHpTaACiiimA6iiikIKKKKAFooooGGKMUtFACYoxS0UAGKMUtFACYoxS0UAJijFLRQAYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAmKMUtFACYoxS0UAJijFLRQAyinYoxQA2inYoxQA3FGKWigBKKKKBiUUUUDG4oxTqKAGYoxTsUYoAZRRRQAzFFOoxQBHijFOIoxQBHRT8UYoAjoxS0UAW6KKKCAooooAXFFFFAwxRRRQAUtFFABS0UUAGKKWigBKWiigAop2KMUANop2KMUAJRS4oxQAlFPxRigBlFPxRigBlFPxRigBlFPxRigBlFPxRigBlFPxRigBlFPxRigBlFPxRigBtFLijFMBKKKKACiiigBtFOxRikA2inYoxQAzFGKWigBtFOxRigY3FJS0UANopcUlABRRRQA3FGKdRQAyiiigBpFNxUhppFADcUYpaKBjMUYp9GKAJ6KKKCQooooAKWiigAooooAWinYoxQAYopcUmKAFxRS4oxQAmKTFOxSUAFFOooAbRTqKAG0U6igAopaKAEopaKACilooASilooASilooASilooASilooASilooASilooAbRS0UAJRS0UAJRS0UAMop1FADaKKKYBRRRSGNpKdikIoASkxTqSgBuKMUtFACUUUUANooooAbRS4oxQA3FGKWigY2kp1GKAJqKKKCRKcBQBTqAG0U7FGKAEooooAXFGKWigAooopgOooopAFFFFAC0UUUAGKMUtFABijFLRQAmKMUtFABijFLRQAmKMUtFACUUUUALRRRQAYoxS0UAJRRRQAUUUUAJRRRQAUUUUAFFFFACUUUUAJRRRQAlFFFAwooooASiiigBKD0oooAZijFLRQA2iiigBKKKKAEooooASiiigBtFOptAyeiiigkBS9qAKcBxQA2iiigBaKKKYBSjrRigDmkAtFOxRigBKKKKAFooooAWiiigAooooAWiiigAooooAMUYpaKAExRilooAKKKKYBRRRQAUUUUAFFFFABRRRQAUUUUAJijFLRSAQjikxzTyOKbQAlFFFABRRRQAlFFFAxKKKKAEooooASiiigBKKKKAG4pMU/FGKAI8UYpaKAG0UUUAJRRRQAUYoooGTUUUUyQooooAdRRRSAbTqKKAHUUUUALRRRQAUUUUALRRRQAUUUUAGKMUtFABRS4oxTASilxRikAtFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFADaKXFGKYDaKfijFIBmKMU7FGKBjcUYp2KMUAR0UUUAJijFLRQA2iiigBKKKKAEooooAYRSVIRkUygBKKKKAEpKdSUDJaKKKZIuKAOadiikAUtFFABRS0UAFFFFAC0UUUALRRRTAKKKKAHUUUUgCiiigBaKKKACiiigAooooAKKKKAFooooAKKKKACiiigAooooAKKKKACiiigBKKKKACiiigAooooASiiigAooooGFFFFADMUYp1FADKKKKAEooooASiiigBveijHNFACUmKWigBlFFFACUlLSUDJ6KKKCR1FFFABS0UUAFLRRQAUUtFABTqKKACiiigAooooAWiiigAooooAWiiigAooooAKKKKACiiigBaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBKKKKAEooooAKKKKBhRRRQA2iiigBKKdijFADaKKKAG0UUUANooooAbijFLRQA2iiigBtJT6ZQMmooooJHUUUUAFLRRQAUtFFABTqQCloAKKKWgAooooAWiiigAooooAKKKKAFooooAKKKKAFooooAKKKKACiiigAooooAKKKKACiiigBaKKKYBRRRQAlFFFIAooooASiiigAooooASiiigYUUUUAJRRRQAlFFFAAelNPWndqaaACiiigBtFFFADaKKKAEooooASm06m0DJaKKKCRaKKKAHUUUUwHUUUUgFooooAWiiigApaKKAEpaKKACiiigAooooAKKKKAFooooAKKKKAFooopgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABijFOxRikAyiiigAooooASiiigYUUUUAJRRRQAlFFFACUUUUAB6U09ad2ppoATFGKdRQBHRRRQAlFFFADaKWkoGSUUUUEjqKKKYDqKKKQC0UUUALRRRQAtFFFACUtFFAC0UUUAFFFFABRRRQAUUUUALRRRTAKKKMUAFFFFABRRRQAUUUUAOooopAIOtO7U0dad2oASiiigAooooAKKKKACiiigBtFLijFMBKKKKAEopcUYpDEooooASiiigBKKKKAEooooASiiigBKKKKAGnpTT1p56Uw0ABpKWkoASkpaSgZJ3pwpvenDpQSFKOtJSjrTAdRRRSAWiiigBaKKKACiiigBaKKKAFooopgFFFFABRRRQAUoFAFLSAbSgUtFACAU4UYooAaRQOtKaaBmgBcDOCetN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
  4 +
@@ -20,14 +20,14 @@ @@ -20,14 +20,14 @@
20 <!-- <module>autho</module>--> 20 <!-- <module>autho</module>-->
21 <module>common</module> 21 <module>common</module>
22 <!-- <module>geteway</module>--> 22 <!-- <module>geteway</module>-->
23 -<!-- <module>haikang</module>-->  
24 -<!-- <module>dahua</module>--> 23 + <module>haikang</module>
  24 + <module>dahua</module>
25 <!-- <module>consumer</module>--> 25 <!-- <module>consumer</module>-->
26 -<!-- <module>haikangface</module>--> 26 + <module>haikangface</module>
27 <module>search_independence</module> 27 <module>search_independence</module>
28 <module>search_smartCampus</module> 28 <module>search_smartCampus</module>
29 <module>search_xiaoan</module> 29 <module>search_xiaoan</module>
30 -<!-- <module>mypulsar</module>--> 30 + <module>mypulsar</module>
31 <module>weigeng</module> 31 <module>weigeng</module>
32 <module>independence</module> 32 <module>independence</module>
33 <!-- <module>test</module>--> 33 <!-- <module>test</module>-->
cloud/search_independence/src/main/resources/logback.xml
@@ -58,4 +58,4 @@ @@ -58,4 +58,4 @@
58         <appender-ref ref="SYSTEM_FILE" /> 58         <appender-ref ref="SYSTEM_FILE" />
59     </root> 59     </root>
60 60
61 -</configuration>  
62 \ No newline at end of file 61 \ No newline at end of file
  62 +</configuration>
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/AttendanceController.java 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +package com.sincere.smartSearch.controller;
  2 +
  3 +import com.sincere.common.dto.smartCampus.SZ_AttendanceDto;
  4 +import com.sincere.smartSearch.service.AttendacenService;
  5 +import io.swagger.annotations.Api;
  6 +import io.swagger.annotations.ApiOperation;
  7 +import org.apache.ibatis.annotations.Param;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.web.bind.annotation.*;
  10 +
  11 +import java.util.List;
  12 +
  13 +@RestController
  14 +@Api("获取设备相关信息")
  15 +@RequestMapping("attendance/*")
  16 +public class AttendanceController {
  17 +
  18 + @Autowired
  19 + AttendacenService attendacenService;
  20 +
  21 + @RequestMapping(method = RequestMethod.GET, value = "selectAttendaceWithId")
  22 + public SZ_AttendanceDto selectAttendaceWithId(@RequestParam("clint_id") String clint_id) {
  23 + return attendacenService.selectDevice(clint_id);
  24 + }
  25 +
  26 + @RequestMapping(value = "getAttensWithIsKaoqin", method = RequestMethod.GET)
  27 + @ApiOperation("根据设备获取考勤模板")
  28 + public List<SZ_AttendanceDto> getAttensWithIsKaoqin(@RequestParam("IsKaoqin") int IsKaoqin) {
  29 +
  30 + return attendacenService.getAttensWithIsKaoqin(IsKaoqin);
  31 +
  32 + }
  33 +
  34 +
  35 +}
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/AttendaceMapper.java 0 → 100644
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
  1 +package com.sincere.smartSearch.mapper;
  2 +
  3 +import com.sincere.common.dto.smartCampus.SZ_AttendanceDto;
  4 +import org.apache.ibatis.annotations.Param;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +import java.util.List;
  8 +
  9 +//@Repository
  10 +public interface AttendaceMapper {
  11 +
  12 + SZ_AttendanceDto selectDevice( String clint_id);
  13 +
  14 + List<SZ_AttendanceDto> getAttensWithIsKaoqin(int IsKaoqin);
  15 +
  16 +}
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/AttendacenService.java 0 → 100644
@@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
  1 +package com.sincere.smartSearch.service;
  2 +
  3 +import com.sincere.common.dto.smartCampus.SZ_AttendanceDto;
  4 +import org.apache.ibatis.annotations.Param;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +import java.util.List;
  8 +
  9 +//@Repository
  10 +public interface AttendacenService {
  11 +
  12 + SZ_AttendanceDto selectDevice(String clint_id);
  13 +
  14 + List<SZ_AttendanceDto> getAttensWithIsKaoqin(int IsKaoqin);
  15 +
  16 +}
cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/AttendacenServiceImp.java 0 → 100644
@@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
  1 +package com.sincere.smartSearch.service.impl;
  2 +
  3 +import com.sincere.common.dto.smartCampus.SZ_AttendanceDto;
  4 +import com.sincere.smartSearch.mapper.AttendaceMapper;
  5 +import com.sincere.smartSearch.service.AttendacenService;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.stereotype.Service;
  8 +
  9 +import java.util.List;
  10 +
  11 +@Service("AttendacenService")
  12 +public class AttendacenServiceImp implements AttendacenService {
  13 +
  14 + @Autowired
  15 + AttendaceMapper attendaceMapper;
  16 +
  17 + @Override
  18 + public SZ_AttendanceDto selectDevice(String clint_id) {
  19 + return attendaceMapper.selectDevice(clint_id);
  20 + }
  21 +
  22 + @Override
  23 + public List<SZ_AttendanceDto> getAttensWithIsKaoqin(int IsKaoqin) {
  24 +
  25 + return attendaceMapper.getAttensWithIsKaoqin(IsKaoqin);
  26 + }
  27 +}
cloud/search_smartCampus/src/main/resources/application.yml
@@ -11,7 +11,8 @@ spring: @@ -11,7 +11,8 @@ spring:
11 ##mybatis 11 ##mybatis
12 mybatis: 12 mybatis:
13 mapper-locations: classpath:mapper/*.xml 13 mapper-locations: classpath:mapper/*.xml
14 - type-aliases-package: com.sincere.smartSearch.model 14 +# type-aliases-package: com.sincere.smartSearch.model
  15 + type-aliases-package: com.sincere.smartSearch.mapper
15 check-config-location: true 16 check-config-location: true
16 17
17 eureka: 18 eureka:
cloud/search_smartCampus/src/main/resources/logback.xml
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 5
6     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> 6     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
7 <!--    <property name="LOG_HOME" value="/opt/web/log/" />--> 7 <!--    <property name="LOG_HOME" value="/opt/web/log/" />-->
8 - <property name="LOG_HOME" value="D://smartCampus_java//log"/> 8 + <property name="LOG_HOME" value="C://smartCampus_java//log"/>
9 9
10     <!-- 控制台输出 --> 10     <!-- 控制台输出 -->
11     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 11     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
@@ -58,4 +58,4 @@ @@ -58,4 +58,4 @@
58         <appender-ref ref="SYSTEM_FILE" /> 58         <appender-ref ref="SYSTEM_FILE" />
59     </root> 59     </root>
60 60
61 -</configuration>  
62 \ No newline at end of file 61 \ No newline at end of file
  62 +</configuration>
cloud/search_smartCampus/src/main/resources/mapper/AttendanceMapper.xml 0 → 100644
@@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3 +<mapper namespace="com.sincere.smartSearch.mapper.AttendaceMapper">
  4 +
  5 + <resultMap id="BaseResultMap" type="com.sincere.common.dto.smartCampus.SZ_AttendanceDto">
  6 +
  7 + <id column="clint_id" property="clint_id"/>
  8 + <result column="name" property="name"/>
  9 + <result column="clint_type" property="clint_type"/>
  10 + <result column="intime" property="intime"/>
  11 + <result column="school_id" property="school_id"/>
  12 + <result column="isConnection" property="isConnection"/>
  13 + <result column="state" property="state"/>
  14 + <result column="IsKaoqin" property="IsKaoqin"/>
  15 +
  16 + </resultMap>
  17 +
  18 + <select id="selectDevice" resultMap="BaseResultMap">
  19 +
  20 + select * from SZ_Attendance where clint_id = #{client_id}
  21 +
  22 + </select>
  23 +
  24 +
  25 + <select id="getAttensWithIsKaoqin" resultMap="BaseResultMap">
  26 +
  27 + select * from SZ_Attendance where IsKaoqin = #{IsKaoqin}
  28 +
  29 + </select>
  30 +
  31 +</mapper>