Commit 3bc07178d20b909ebbd0dabe758a0b65be5c9cda
1 parent
53e55eaa
Exists in
master
and in
1 other branch
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: |
25 KB
26.3 KB
cloud/independence/src/main/resources/logback.xml
@@ -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 | + |
cloud/pom.xml
@@ -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
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> |