master
parent
119d3fefa9
commit
6ac7a6db1d
|
@ -7,6 +7,8 @@
|
||||||
<file url="file://$PROJECT_DIR$/community-security-common/src/main/resources" charset="UTF-8" />
|
<file url="file://$PROJECT_DIR$/community-security-common/src/main/resources" charset="UTF-8" />
|
||||||
<file url="file://$PROJECT_DIR$/community-security-gateway/src/main/java" charset="UTF-8" />
|
<file url="file://$PROJECT_DIR$/community-security-gateway/src/main/java" charset="UTF-8" />
|
||||||
<file url="file://$PROJECT_DIR$/community-security-gateway/src/main/resources" charset="UTF-8" />
|
<file url="file://$PROJECT_DIR$/community-security-gateway/src/main/resources" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/community-security-modules/community-security-modules-es/src/main/java" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/community-security-modules/community-security-modules-photo/src/main/java" charset="UTF-8" />
|
||||||
<file url="file://$PROJECT_DIR$/community-security-modules/community-security-modules-shop/src/main/java" charset="UTF-8" />
|
<file url="file://$PROJECT_DIR$/community-security-modules/community-security-modules-shop/src/main/java" charset="UTF-8" />
|
||||||
<file url="file://$PROJECT_DIR$/community-security-modules/community-security-modules-shop/src/main/resources" charset="UTF-8" />
|
<file url="file://$PROJECT_DIR$/community-security-modules/community-security-modules-shop/src/main/resources" charset="UTF-8" />
|
||||||
<file url="file://$PROJECT_DIR$/community-security-modules/community-security-modules-system/src/main/java" charset="UTF-8" />
|
<file url="file://$PROJECT_DIR$/community-security-modules/community-security-modules-system/src/main/java" charset="UTF-8" />
|
||||||
|
|
|
@ -117,6 +117,19 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.kafka</groupId>
|
||||||
|
<artifactId>spring-kafka</artifactId>
|
||||||
|
<version>2.8.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
<version>2.12.5</version> <!-- 使用你需要的版本 -->
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.zyh.common.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Camera {
|
||||||
|
private Integer id;
|
||||||
|
private String cameraId;
|
||||||
|
private Double lng;
|
||||||
|
private Double lat;
|
||||||
|
private String address;
|
||||||
|
}
|
|
@ -0,0 +1,224 @@
|
||||||
|
package com.zyh.common.domain;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
public class CompreFaceApiResponse {
|
||||||
|
|
||||||
|
private List<Result> result;
|
||||||
|
|
||||||
|
public List<Result> getResult() {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResult(List<Result> result) {
|
||||||
|
this.result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Result {
|
||||||
|
private Age age;
|
||||||
|
private Gender gender;
|
||||||
|
private Pose pose;
|
||||||
|
private Box box;
|
||||||
|
private List<Subject> subjects;
|
||||||
|
private List<List<Integer>> landmarks;
|
||||||
|
|
||||||
|
public Age getAge() {
|
||||||
|
return age;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAge(Age age) {
|
||||||
|
this.age = age;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Gender getGender() {
|
||||||
|
return gender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGender(Gender gender) {
|
||||||
|
this.gender = gender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pose getPose() {
|
||||||
|
return pose;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPose(Pose pose) {
|
||||||
|
this.pose = pose;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Box getBox() {
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBox(Box box) {
|
||||||
|
this.box = box;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Subject> getSubjects() {
|
||||||
|
return subjects;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubjects(List<Subject> subjects) {
|
||||||
|
this.subjects = subjects;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<List<Integer>> getLandmarks() {
|
||||||
|
return landmarks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLandmarks(List<List<Integer>> landmarks) {
|
||||||
|
this.landmarks = landmarks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Age {
|
||||||
|
private Double probability;
|
||||||
|
private Integer high;
|
||||||
|
private Integer low;
|
||||||
|
|
||||||
|
public Double getProbability() {
|
||||||
|
return probability;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProbability(Double probability) {
|
||||||
|
this.probability = probability;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getHigh() {
|
||||||
|
return high;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHigh(Integer high) {
|
||||||
|
this.high = high;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getLow() {
|
||||||
|
return low;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLow(Integer low) {
|
||||||
|
this.low = low;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Gender {
|
||||||
|
private Double probability;
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
public Double getProbability() {
|
||||||
|
return probability;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProbability(Double probability) {
|
||||||
|
this.probability = probability;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Pose {
|
||||||
|
private Double pitch;
|
||||||
|
private Double roll;
|
||||||
|
private Double yaw;
|
||||||
|
|
||||||
|
public Double getPitch() {
|
||||||
|
return pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPitch(Double pitch) {
|
||||||
|
this.pitch = pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getRoll() {
|
||||||
|
return roll;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRoll(Double roll) {
|
||||||
|
this.roll = roll;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getYaw() {
|
||||||
|
return yaw;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setYaw(Double yaw) {
|
||||||
|
this.yaw = yaw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Box {
|
||||||
|
private Double probability;
|
||||||
|
private Integer xMax;
|
||||||
|
private Integer yMax;
|
||||||
|
private Integer xMin;
|
||||||
|
private Integer yMin;
|
||||||
|
|
||||||
|
public Double getProbability() {
|
||||||
|
return probability;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProbability(Double probability) {
|
||||||
|
this.probability = probability;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getxMax() {
|
||||||
|
return xMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setxMax(Integer xMax) {
|
||||||
|
this.xMax = xMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getyMax() {
|
||||||
|
return yMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setyMax(Integer yMax) {
|
||||||
|
this.yMax = yMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getxMin() {
|
||||||
|
return xMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setxMin(Integer xMin) {
|
||||||
|
this.xMin = xMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getyMin() {
|
||||||
|
return yMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setyMin(Integer yMin) {
|
||||||
|
this.yMin = yMin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Subject {
|
||||||
|
private String subject;
|
||||||
|
private Double similarity;
|
||||||
|
|
||||||
|
public String getSubject() {
|
||||||
|
return subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubject(String subject) {
|
||||||
|
this.subject = subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getSimilarity() {
|
||||||
|
return similarity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSimilarity(Double similarity) {
|
||||||
|
this.similarity = similarity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package com.zyh.common.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Dataa {
|
||||||
|
private String faceId;
|
||||||
|
private Integer score;
|
||||||
|
private String iccard;
|
||||||
|
private Integer role;
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.zyh.common.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Photo {
|
||||||
|
private Integer act;
|
||||||
|
private Integer x;
|
||||||
|
private Integer y;
|
||||||
|
private Integer w;
|
||||||
|
private Integer h;
|
||||||
|
private Integer datetime;
|
||||||
|
private Integer age;
|
||||||
|
private Integer gender;
|
||||||
|
private Integer glasses;
|
||||||
|
private Integer mask;
|
||||||
|
private Integer race;
|
||||||
|
private Integer beard;
|
||||||
|
private Integer expression;
|
||||||
|
private Integer hat;
|
||||||
|
private Dataa Data;
|
||||||
|
private String extend_idcard;
|
||||||
|
private String mac;
|
||||||
|
private String ip;
|
||||||
|
private String image;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
package com.zyh.common.util;
|
||||||
|
|
||||||
|
import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
import com.zyh.common.result.Result;
|
||||||
|
import org.apache.http.HttpResponse;
|
||||||
|
import org.apache.http.client.HttpClient;
|
||||||
|
import org.apache.http.client.methods.HttpPost;
|
||||||
|
import org.apache.http.entity.ContentType;
|
||||||
|
import org.apache.http.entity.StringEntity;
|
||||||
|
import org.apache.http.impl.client.HttpClients;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.http.HttpEntity;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ComprefaceUtils {
|
||||||
|
|
||||||
|
private static final String BASE_URL = "http://100.96.85.95:8000";
|
||||||
|
private static final String VERIFICATION_API_KEY = "1596cf9c-8426-41bf-ad3e-cb3b126533ab";
|
||||||
|
|
||||||
|
// public static String verifyFace(String base64Image, String limit, String detProbThreshold, String facePlugins, String status) {
|
||||||
|
// try {
|
||||||
|
// // 对参数进行 URL 编码
|
||||||
|
// limit = URLEncoder.encode(limit, StandardCharsets.UTF_8);
|
||||||
|
// detProbThreshold = URLEncoder.encode(detProbThreshold, StandardCharsets.UTF_8);
|
||||||
|
// facePlugins = URLEncoder.encode(facePlugins, StandardCharsets.UTF_8);
|
||||||
|
// status = URLEncoder.encode(status, StandardCharsets.UTF_8);
|
||||||
|
//
|
||||||
|
// // 构建请求URL
|
||||||
|
// String apiUrl = BASE_URL + "/api/v1/verification/verify?limit=" + limit +
|
||||||
|
// "&det_prob_threshold=" + detProbThreshold + "&face_plugins=" + facePlugins +
|
||||||
|
// "&status=" + status;
|
||||||
|
//
|
||||||
|
// // 构建请求头
|
||||||
|
// HttpClient httpClient = HttpClients.createDefault();
|
||||||
|
// HttpPost httpPost = new HttpPost(apiUrl);
|
||||||
|
// httpPost.setHeader("Content-Type", "application/json");
|
||||||
|
// httpPost.setHeader("x-api-key", VERIFICATION_API_KEY);
|
||||||
|
//
|
||||||
|
// // 构建请求体
|
||||||
|
// String requestBody = "{\"base64Image\":\"" + base64Image + "\"}";
|
||||||
|
// httpPost.setEntity(new StringEntity(requestBody, ContentType.APPLICATION_JSON));
|
||||||
|
//
|
||||||
|
// // 发送请求并获取响应
|
||||||
|
// HttpResponse response = httpClient.execute(httpPost);
|
||||||
|
// HttpEntity entity = response.getEntity();
|
||||||
|
//
|
||||||
|
// // 处理响应
|
||||||
|
// if (entity != null) {
|
||||||
|
// return EntityUtils.toString(entity);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
|
||||||
|
public static Result<CompreFaceApiResponse.Result> recognizeFace(byte[] imageData) {
|
||||||
|
try {
|
||||||
|
String apiUrl = BASE_URL + "/api/v1/recognition/recognize?limit=0&det_prob_threshold=0.8&prediction_count=1&face_plugins=landmarks%2C%20gender%2C%20age%2C%20calculator%2C%20mask%2C%20pose&status=true";
|
||||||
|
|
||||||
|
// 设置请求头
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||||
|
headers.set("x-api-key", VERIFICATION_API_KEY);
|
||||||
|
|
||||||
|
// 将字节数组转换为Base64编码的字符串
|
||||||
|
String base64Image = Base64.getEncoder().encodeToString(imageData);
|
||||||
|
|
||||||
|
// 设置请求体
|
||||||
|
String requestBody = "{\"file\": \"" + base64Image + "\"}";
|
||||||
|
|
||||||
|
// 发起POST请求
|
||||||
|
HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);
|
||||||
|
RestTemplate restTemplate = new RestTemplate();
|
||||||
|
ResponseEntity<CompreFaceApiResponse> responseEntity = restTemplate.postForEntity(apiUrl, requestEntity, CompreFaceApiResponse.class);
|
||||||
|
|
||||||
|
// 处理响应
|
||||||
|
if (responseEntity.getStatusCode().is2xxSuccessful()) {
|
||||||
|
CompreFaceApiResponse response = responseEntity.getBody();
|
||||||
|
List<CompreFaceApiResponse.Result> faceResults = response.getResult();
|
||||||
|
CompreFaceApiResponse.Result result = faceResults.get(0);
|
||||||
|
System.out.println("Response: " + result);
|
||||||
|
return Result.success(result);
|
||||||
|
} else {
|
||||||
|
System.err.println("Error: " + responseEntity.getStatusCode());
|
||||||
|
return Result.error("解析失败:" + responseEntity.getStatusCode());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return Result.error("解析失败:" + e.getMessage()) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.zyh.common.util;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
public class ImageToBase64Converter {
|
||||||
|
|
||||||
|
public static String convertImageToBase64(String imagePath) {
|
||||||
|
String base64Image = "";
|
||||||
|
Path path = Paths.get(imagePath);
|
||||||
|
|
||||||
|
try {
|
||||||
|
byte[] imageBytes = Files.readAllBytes(path);
|
||||||
|
base64Image = Base64.getEncoder().encodeToString(imageBytes);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return base64Image;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String imagePath = "/path/to/your/image.jpg"; // 替换为实际的图片路径
|
||||||
|
String base64Image = convertImageToBase64(imagePath);
|
||||||
|
System.out.println(base64Image);
|
||||||
|
}
|
||||||
|
public static String convertToBase64(MultipartFile image) {
|
||||||
|
try {
|
||||||
|
byte[] bytes = image.getBytes();
|
||||||
|
return Base64.getEncoder().encodeToString(bytes);
|
||||||
|
} catch (IOException e) {
|
||||||
|
// 处理异常
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String convertBlobToBase64(byte[] blobData) {
|
||||||
|
// 使用 Base64 类将字节数组转换为 Base64 编码的字符串
|
||||||
|
return Base64.getEncoder().encodeToString(blobData);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.zyh.common.util;
|
||||||
|
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
|
||||||
|
public class RandomGenerator {
|
||||||
|
|
||||||
|
public static String generateRandomLetters(int length) {
|
||||||
|
String letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
|
StringBuilder randomString = new StringBuilder(length);
|
||||||
|
SecureRandom random = new SecureRandom();
|
||||||
|
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
int randomIndex = random.nextInt(letters.length());
|
||||||
|
char randomChar = letters.charAt(randomIndex);
|
||||||
|
randomString.append(randomChar);
|
||||||
|
}
|
||||||
|
|
||||||
|
return randomString.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String randomLetters = generateRandomLetters(5);
|
||||||
|
System.out.println("Random Letters: " + randomLetters);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>com.zyh</groupId>
|
||||||
|
<artifactId>community-security-modules</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>community-security-modules-es</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- 系统公共 依赖 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zyh</groupId>
|
||||||
|
<artifactId>community-security-common</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.elasticsearch.client</groupId>
|
||||||
|
<artifactId>elasticsearch-rest-high-level-client</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- test -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Kafka dependencies -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.kafka</groupId>
|
||||||
|
<artifactId>spring-kafka</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.zyh.es;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.kafka.annotation.EnableKafka;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableKafka
|
||||||
|
public class EsApplication {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
SpringApplication.run(EsApplication.class, args);
|
||||||
|
System.out.println("Es启动成功");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.zyh.es.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.apache.http.HttpHost;
|
||||||
|
import org.elasticsearch.client.RestClient;
|
||||||
|
import org.elasticsearch.client.RestHighLevelClient;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@ConfigurationProperties(prefix = "es")
|
||||||
|
@Data
|
||||||
|
public class InitEsRes {
|
||||||
|
private String host;
|
||||||
|
private int port;
|
||||||
|
private String scheme;
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public RestHighLevelClient restHighLevelClient(){
|
||||||
|
return new RestHighLevelClient(
|
||||||
|
RestClient.builder(new HttpHost(host,port,scheme))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package com.zyh.es.controller;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
public class EsController {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
//package com.zyh.es.kafka;
|
||||||
|
//
|
||||||
|
//import cn.hutool.core.date.DateUtil;
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerConfig;
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerRecord;
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerRecords;
|
||||||
|
//import org.apache.kafka.clients.consumer.KafkaConsumer;
|
||||||
|
//import org.apache.kafka.common.serialization.StringDeserializer;
|
||||||
|
//
|
||||||
|
//import java.time.Duration;
|
||||||
|
//import java.util.Arrays;
|
||||||
|
//import java.util.Date;
|
||||||
|
//import java.util.Properties;
|
||||||
|
//
|
||||||
|
//public class Consumer {
|
||||||
|
// public final static String groupId = "face";
|
||||||
|
// public final static String bootstrapServers = "152.136.54.230:9092";
|
||||||
|
//
|
||||||
|
// public static KafkaConsumer<String, String> kafkaConsumer() {
|
||||||
|
// Properties props = new Properties();
|
||||||
|
// //设置Kafka服务器地址
|
||||||
|
// props.put("bootstrap.servers", bootstrapServers);
|
||||||
|
// //设置消费组
|
||||||
|
// props.put("group.id", groupId);
|
||||||
|
// //设置数据key的反序列化处理类
|
||||||
|
// props.put("key.deserializer", StringDeserializer.class.getName());
|
||||||
|
// //设置数据value的反序列化处理类
|
||||||
|
// props.put("value.deserializer", StringDeserializer.class.getName());
|
||||||
|
// props.put("enable.auto.commit", "true");
|
||||||
|
// props.put("auto.commit.interval.ms", "1000");
|
||||||
|
// props.put("session.timeout.ms", "30000");
|
||||||
|
// //设置偏移量
|
||||||
|
// props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
|
||||||
|
// KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(props);
|
||||||
|
// //订阅名称为“xjx”的Topic的消息
|
||||||
|
// kafkaConsumer.subscribe(Arrays.asList("face"));
|
||||||
|
// return kafkaConsumer;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public static void main(String[] args) {
|
||||||
|
// //从Kafka服务器中的名称为“face”的Topic中消费消息
|
||||||
|
// KafkaConsumer<String,String> kafkaConsumer = kafkaConsumer();
|
||||||
|
// //List<String> messages = new ArrayList<>(records.count());
|
||||||
|
// for (;;) {
|
||||||
|
// ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofSeconds(1));
|
||||||
|
// for (ConsumerRecord<String, String> record : records.records("face")) {
|
||||||
|
// String value = record.value();
|
||||||
|
// System.out.print("time:"+DateUtil.formatDateTime(new Date(record.timestamp()))+",");
|
||||||
|
// System.out.print("value:"+value+",");
|
||||||
|
// System.out.println("offset:"+record.offset());
|
||||||
|
// }
|
||||||
|
// System.out.println("--------------------------------");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
|
@ -0,0 +1,67 @@
|
||||||
|
//package com.zyh.es.kafka;
|
||||||
|
//
|
||||||
|
//import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
//import com.zyh.es.service.EsService;
|
||||||
|
//import com.zyh.es.service.impl.EsServicempl;
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerConfig;
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerRecord;
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerRecords;
|
||||||
|
//import org.apache.kafka.clients.consumer.KafkaConsumer;
|
||||||
|
//import org.apache.kafka.common.serialization.StringDeserializer;
|
||||||
|
//import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
//import org.springframework.stereotype.Service;
|
||||||
|
//
|
||||||
|
//import javax.annotation.PostConstruct;
|
||||||
|
//import java.time.Duration;
|
||||||
|
//import java.util.Collections;
|
||||||
|
//import java.util.Properties;
|
||||||
|
//
|
||||||
|
//@Service
|
||||||
|
//public class KafkaConsumerService {
|
||||||
|
// private static final String GROUP_ID = "face";
|
||||||
|
// private final static String TOPIC = "face";
|
||||||
|
//
|
||||||
|
// @Autowired
|
||||||
|
// private EsServicempl esServicempl;
|
||||||
|
//
|
||||||
|
// @PostConstruct
|
||||||
|
// public void init() {
|
||||||
|
// Properties properties = new Properties();
|
||||||
|
// // Kafka服务器地址,多个地址用逗号分隔
|
||||||
|
// properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "152.136.54.230:9092");
|
||||||
|
// // 消费者所属的分组ID
|
||||||
|
// properties.put(ConsumerConfig.GROUP_ID_CONFIG, GROUP_ID);
|
||||||
|
// // 是否自动提交偏移量,默认为true
|
||||||
|
// properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
|
||||||
|
// // 自动提交偏移量的时间间隔
|
||||||
|
// properties.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
|
||||||
|
// // 会话超时时间
|
||||||
|
// properties.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "30000");
|
||||||
|
// // 一次最大拉取的记录数
|
||||||
|
// properties.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 1000);
|
||||||
|
// // 消费规则,默认earliest
|
||||||
|
// properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
|
||||||
|
// // 键的反序列化器
|
||||||
|
// properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
|
||||||
|
// // 值的反序列化器
|
||||||
|
// properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
|
||||||
|
//
|
||||||
|
// KafkaConsumer<String, CompreFaceApiResponse.Result> kafkaConsumer = new KafkaConsumer<>(properties);
|
||||||
|
// // 订阅主题
|
||||||
|
// kafkaConsumer.subscribe(Collections.singletonList(TOPIC));
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// while (true) {
|
||||||
|
// // 从Kafka中拉取消息
|
||||||
|
// ConsumerRecords<String, CompreFaceApiResponse.Result> records = kafkaConsumer.poll(Duration.ofMillis(100));
|
||||||
|
// for (ConsumerRecord<String, CompreFaceApiResponse.Result> record : records) {
|
||||||
|
// // 处理消息
|
||||||
|
// CompreFaceApiResponse.Result data = record.value();
|
||||||
|
// esServicempl.pushToElasticsearch(data);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } finally {
|
||||||
|
// kafkaConsumer.close();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
|
@ -0,0 +1,30 @@
|
||||||
|
//package com.zyh.es.kafka;
|
||||||
|
//
|
||||||
|
//import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
//import com.zyh.es.service.impl.EsServicempl;
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerRecord;
|
||||||
|
//import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
//import org.springframework.kafka.annotation.KafkaListener;
|
||||||
|
//import org.springframework.stereotype.Service;
|
||||||
|
//
|
||||||
|
//@Service
|
||||||
|
//public class KafkaConsumerServiceTest {
|
||||||
|
// @Autowired
|
||||||
|
// private EsServicempl esServicempl;
|
||||||
|
//
|
||||||
|
// private static final String GROUPID = "face";
|
||||||
|
// @KafkaListener(topics = "face", groupId = "face")
|
||||||
|
// public void listen(ConsumerRecord<String, CompreFaceApiResponse.Result> record) {
|
||||||
|
// try {
|
||||||
|
// // 从消息中获取数据
|
||||||
|
// CompreFaceApiResponse.Result data = record.value();
|
||||||
|
//
|
||||||
|
// // 将数据推送到 Elasticsearch
|
||||||
|
// esServicempl.pushToElasticsearch(data);
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// // 处理异常(例如,记录日志或采取适当的措施)
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
|
@ -0,0 +1,58 @@
|
||||||
|
package com.zyh.es.mq;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.rabbitmq.client.Channel;
|
||||||
|
import com.zyh.common.constants.RabbitMQQueueNameConstants;
|
||||||
|
import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
import com.zyh.es.service.impl.EsServicempl;
|
||||||
|
import lombok.extern.log4j.Log4j2;
|
||||||
|
import org.springframework.amqp.core.Message;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.Queue;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Log4j2
|
||||||
|
public class Clicknum {
|
||||||
|
@Autowired
|
||||||
|
private EsServicempl esServicempl;
|
||||||
|
@Autowired
|
||||||
|
RedisTemplate<String, String> redisTemplate;
|
||||||
|
|
||||||
|
@RabbitListener(queuesToDeclare = {@Queue(RabbitMQQueueNameConstants.SEND_SMS_QUEUE_NAME)})
|
||||||
|
public void SendCodeMq(String jsonString, Message message, Channel channel) throws JsonProcessingException {
|
||||||
|
long l = System.currentTimeMillis();
|
||||||
|
log.info("短信消费者队列开始消费...,消费内容为:{}", jsonString);
|
||||||
|
String messageId = message.getMessageProperties().getMessageId();
|
||||||
|
|
||||||
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
CompreFaceApiResponse.Result result = objectMapper.readValue(jsonString, CompreFaceApiResponse.Result.class);
|
||||||
|
|
||||||
|
esServicempl.pushToElasticsearch(result);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Long count = redisTemplate.opsForSet().add(RabbitMQQueueNameConstants.SEND_SMS_QUEUE_NAME, messageId);
|
||||||
|
if (count == 1) {
|
||||||
|
|
||||||
|
log.info("短信消费者队列消费成功,耗时:{}毫秒!", System.currentTimeMillis()-l);
|
||||||
|
}else{
|
||||||
|
log.info("短信消费者队列重复消费,消费内容为:{}", jsonString);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.info("短信消费者队列消费失败,异常内容为:{}", e.getMessage());
|
||||||
|
redisTemplate.opsForSet().remove(RabbitMQQueueNameConstants.SEND_SMS_QUEUE_NAME, messageId);
|
||||||
|
|
||||||
|
try {
|
||||||
|
channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.info("短信消费者队列回退失败,异常内容为:{}", ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
package com.zyh.es.service;
|
||||||
|
|
||||||
|
public interface EsService {
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.zyh.es.service.impl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
import com.zyh.es.service.EsService;
|
||||||
|
import org.elasticsearch.action.bulk.BulkRequest;
|
||||||
|
import org.elasticsearch.action.bulk.BulkResponse;
|
||||||
|
import org.elasticsearch.action.index.IndexRequest;
|
||||||
|
import org.elasticsearch.action.index.IndexResponse;
|
||||||
|
import org.elasticsearch.client.RequestOptions;
|
||||||
|
import org.elasticsearch.client.RestHighLevelClient;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class EsServicempl implements EsService {
|
||||||
|
@Autowired
|
||||||
|
private RestHighLevelClient restHighLevelClient;
|
||||||
|
@Autowired
|
||||||
|
private ObjectMapper objectMapper;
|
||||||
|
|
||||||
|
|
||||||
|
private final static String INDEX_NAME = "face";
|
||||||
|
|
||||||
|
|
||||||
|
public void pushToElasticsearch(CompreFaceApiResponse.Result data) {
|
||||||
|
try {
|
||||||
|
IndexRequest indexRequest = new IndexRequest(INDEX_NAME);
|
||||||
|
|
||||||
|
// 不设置文档 ID,由 Elasticsearch 自动生成一个唯一 ID
|
||||||
|
BulkRequest bulkRequest = new BulkRequest();
|
||||||
|
bulkRequest.add(
|
||||||
|
new IndexRequest(INDEX_NAME)
|
||||||
|
.source(JSONObject.toJSONString(data), XContentType.JSON)
|
||||||
|
);
|
||||||
|
|
||||||
|
BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
|
||||||
|
// 可以根据 indexResponse 获取有关索引操作的信息
|
||||||
|
System.out.println("Elasticsearch Index Response: " + bulk);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
server:
|
||||||
|
port: 9007
|
||||||
|
spring:
|
||||||
|
main:
|
||||||
|
allow-circular-references: true
|
||||||
|
jackson:
|
||||||
|
date-format: yyyy-MM-dd HH:mm:ss
|
||||||
|
time-zone: GMT+8
|
||||||
|
application:
|
||||||
|
name: community-security-modules-es
|
||||||
|
profiles:
|
||||||
|
# 环境配置
|
||||||
|
active: dev
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
discovery:
|
||||||
|
server-addr: 124.221.193.62:8848
|
||||||
|
namespace: e3afd3fd-73b0-4ac1-9f9e-aad1a8aa9f46
|
||||||
|
|
||||||
|
config:
|
||||||
|
serverAddr: 124.221.193.62:8848
|
||||||
|
namespace: e3afd3fd-73b0-4ac1-9f9e-aad1a8aa9f46
|
||||||
|
fileExtension: yml
|
||||||
|
shared-configs:
|
||||||
|
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
||||||
|
# Elasticsearch
|
||||||
|
#es:
|
||||||
|
# host: 152.136.54.230
|
||||||
|
# port: 9200
|
||||||
|
# scheme: http
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
//package com.zyh.es.service.impl;
|
||||||
|
//
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerConfig;
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerRecords;
|
||||||
|
//import org.apache.kafka.clients.consumer.KafkaConsumer;
|
||||||
|
//import org.apache.kafka.common.serialization.StringDeserializer;
|
||||||
|
//import org.junit.jupiter.api.Test;
|
||||||
|
//
|
||||||
|
//import java.time.Duration;
|
||||||
|
//import java.util.Collections;
|
||||||
|
//import java.util.Properties;
|
||||||
|
//
|
||||||
|
//import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
//
|
||||||
|
//class EsServicemplTest {
|
||||||
|
// @Test
|
||||||
|
// public void testGet() throws InterruptedException {
|
||||||
|
// // 主题
|
||||||
|
// String topic = "product_post";
|
||||||
|
//
|
||||||
|
// // 配置
|
||||||
|
// Properties properties = new Properties();
|
||||||
|
// // Kafka 服务器地址
|
||||||
|
// properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "152.136.54.230:9092");
|
||||||
|
// // k,v 的反序列化器
|
||||||
|
// properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
||||||
|
// properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
|
||||||
|
//
|
||||||
|
// // 消费者分组
|
||||||
|
// properties.put(ConsumerConfig.GROUP_ID_CONFIG, "Consumer-Group-1");
|
||||||
|
// // Offset 重置模式
|
||||||
|
// properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
|
||||||
|
//
|
||||||
|
// // 消费者
|
||||||
|
// KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);
|
||||||
|
// // 订阅(可以订阅多个主题)
|
||||||
|
// kafkaConsumer.subscribe(Collections.singletonList(topic));
|
||||||
|
//
|
||||||
|
// // 消费
|
||||||
|
// while (true) {
|
||||||
|
// // 获取信息
|
||||||
|
// ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofMillis(1000));
|
||||||
|
// // 遍历
|
||||||
|
// records.forEach(record -> {
|
||||||
|
// System.out.println(String.format("topic==%s, offset==%s, key==%s, value==%s", record.topic(), record.offset(), record.key(), record.value()));
|
||||||
|
// });
|
||||||
|
// // 睡眠
|
||||||
|
// Thread.sleep(500);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
|
@ -0,0 +1,105 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>com.zyh</groupId>
|
||||||
|
<artifactId>community-security-modules</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>community-security-modules-photo</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- 系统公共 依赖 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zyh</groupId>
|
||||||
|
<artifactId>community-security-common</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<!-- SpringBoot Web-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<!-- Druid -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>druid-spring-boot-starter</artifactId>
|
||||||
|
<version>1.2.8</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- Mysql Connector -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
|
||||||
|
</dependency>
|
||||||
|
<!-- Mybatis 依赖配置 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mybatis.spring.boot</groupId>
|
||||||
|
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||||
|
<version>2.2.2</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- Pagehelper -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.pagehelper</groupId>
|
||||||
|
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
||||||
|
<version>1.4.1</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- test -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.tobato</groupId>
|
||||||
|
<artifactId>fastdfs-client</artifactId>
|
||||||
|
<version>1.26.5</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 阿里云oss -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.aliyun.oss</groupId>
|
||||||
|
<artifactId>aliyun-sdk-oss</artifactId>
|
||||||
|
<version>3.10.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
<version>4.5.13</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.kafka</groupId>
|
||||||
|
<artifactId>spring-kafka</artifactId>
|
||||||
|
<version>2.8.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
<version>2.12.5</version> <!-- 使用你需要的版本 -->
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.elasticsearch.client</groupId>
|
||||||
|
<artifactId>elasticsearch-rest-high-level-client</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.zyh.system;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
import org.springframework.kafka.annotation.EnableKafka;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableKafka
|
||||||
|
public class PhotoApplication {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
SpringApplication.run(PhotoApplication.class, args);
|
||||||
|
System.out.println("Photo启动成功");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.zyh.system.controller;
|
||||||
|
|
||||||
|
import com.zyh.common.domain.Camera;
|
||||||
|
import com.zyh.common.result.Result;
|
||||||
|
import com.zyh.system.service.CameraService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("camera")
|
||||||
|
public class CameraController {
|
||||||
|
@Autowired
|
||||||
|
private CameraService cameraService;
|
||||||
|
|
||||||
|
//设备列表
|
||||||
|
@PostMapping("/cameraList")
|
||||||
|
public Result<List<Camera>> cameraList() {
|
||||||
|
return Result.success(cameraService.cameraList());
|
||||||
|
}
|
||||||
|
|
||||||
|
//删除设备
|
||||||
|
@PostMapping("/cameraDelete")
|
||||||
|
public Result cameraDelete(@RequestParam Integer id) {
|
||||||
|
|
||||||
|
return cameraService.cameraDelete(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
//添加设备
|
||||||
|
@PostMapping("/cameraAdd")
|
||||||
|
public Result cameraAdd(@RequestBody Camera camera) {
|
||||||
|
|
||||||
|
return cameraService.cameraAdd(camera);
|
||||||
|
}
|
||||||
|
|
||||||
|
//修改设备
|
||||||
|
@PostMapping("/cameraUpdate")
|
||||||
|
public Result cameraUpdate(@RequestBody Camera camera) {
|
||||||
|
|
||||||
|
return cameraService.cameraUpdate(camera);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.zyh.system.controller;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.C;
|
||||||
|
import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
import com.zyh.common.domain.Photo;
|
||||||
|
import com.zyh.common.result.Result;
|
||||||
|
import com.zyh.system.mapper.ComprefaceMapper;
|
||||||
|
import com.zyh.system.service.ComprefaceService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("compreFace")
|
||||||
|
|
||||||
|
public class ComprefaceController {
|
||||||
|
@Autowired
|
||||||
|
private ComprefaceService comprefaceService;
|
||||||
|
|
||||||
|
@PostMapping("/compreFace")
|
||||||
|
public Result<CompreFaceApiResponse.Result> compareFaces(@RequestParam("file") MultipartFile file) throws IOException {
|
||||||
|
|
||||||
|
// 调用Compreface服务进行人脸比对
|
||||||
|
return comprefaceService.compareWithSingleFace(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
//package com.zyh.system.kafka;
|
||||||
|
//
|
||||||
|
//import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
//import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
//import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
//import org.apache.kafka.clients.producer.ProducerConfig;
|
||||||
|
//import org.apache.kafka.clients.producer.ProducerRecord;
|
||||||
|
//import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
//import org.springframework.beans.factory.annotation.Value;
|
||||||
|
//import org.springframework.kafka.core.KafkaTemplate;
|
||||||
|
//import org.springframework.kafka.support.SendResult;
|
||||||
|
//import org.springframework.stereotype.Service;
|
||||||
|
//import org.springframework.util.concurrent.ListenableFuture;
|
||||||
|
//import org.springframework.util.concurrent.ListenableFutureCallback;
|
||||||
|
//
|
||||||
|
//import javax.annotation.PostConstruct;
|
||||||
|
//import java.util.Properties;
|
||||||
|
//
|
||||||
|
//@Service
|
||||||
|
//public class KafkaProducerService {
|
||||||
|
//
|
||||||
|
// @Autowired
|
||||||
|
// private KafkaTemplate<String, String> kafkaTemplate;
|
||||||
|
//
|
||||||
|
// private final static String topic="face";
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @PostConstruct
|
||||||
|
// public void startProducing(CompreFaceApiResponse.Result data) {
|
||||||
|
// Properties properties = new Properties();
|
||||||
|
// // 设置 Kafka 生产者配置
|
||||||
|
// properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "152.136.54.230:9092");
|
||||||
|
// properties.put("acks", "all");
|
||||||
|
// properties.put("retries", 0);
|
||||||
|
// properties.put("batch.size", 16384);
|
||||||
|
// properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
|
||||||
|
// properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// // 使用 Jackson 库将对象转换为 JSON 字符串
|
||||||
|
// ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
// String jsonString = objectMapper.writeValueAsString(data);
|
||||||
|
//
|
||||||
|
// // 发送 JSON 字符串到 Kafka
|
||||||
|
// ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topic, jsonString);
|
||||||
|
//
|
||||||
|
// // 添加回调,处理发送结果
|
||||||
|
// future.addCallback(new ListenableFutureCallback<>() {
|
||||||
|
// @Override
|
||||||
|
// public void onSuccess(SendResult<String, String> result) {
|
||||||
|
// // 处理成功的逻辑
|
||||||
|
// System.out.println("消息成功发送到主题: " + result.getRecordMetadata().topic());
|
||||||
|
// System.out.println("消息成功发送到分区: " + result.getRecordMetadata().partition());
|
||||||
|
// System.out.println("消息成功发送到偏移量: " + result.getRecordMetadata().offset());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public void onFailure(Throwable ex) {
|
||||||
|
// // 处理失败的逻辑
|
||||||
|
// System.out.println("消息发送失败: " + ex.getMessage());
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// } catch (JsonProcessingException e) {
|
||||||
|
// // 处理转换异常
|
||||||
|
// e.printStackTrace();
|
||||||
|
// System.out.println("消息发送失败: " + e.getMessage());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
|
@ -0,0 +1,53 @@
|
||||||
|
//package com.zyh.system.kafka;
|
||||||
|
//
|
||||||
|
//import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
//import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
//import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
//import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
//import org.springframework.kafka.core.KafkaTemplate;
|
||||||
|
//import org.springframework.kafka.support.SendResult;
|
||||||
|
//import org.springframework.stereotype.Service;
|
||||||
|
//import org.springframework.util.concurrent.ListenableFuture;
|
||||||
|
//import org.springframework.util.concurrent.ListenableFutureCallback;
|
||||||
|
//
|
||||||
|
//@Service
|
||||||
|
//public class KafkaProducerServiceTest {
|
||||||
|
//
|
||||||
|
// @Autowired
|
||||||
|
// private ObjectMapper objectMapper;
|
||||||
|
// @Autowired
|
||||||
|
// private KafkaTemplate<String, String> kafkaTemplate;
|
||||||
|
//
|
||||||
|
// public void sendMessage(String topic, CompreFaceApiResponse.Result data) {
|
||||||
|
// try {
|
||||||
|
// // 使用 Jackson 库将对象转换为 JSON 字符串
|
||||||
|
// ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
// String jsonString = objectMapper.writeValueAsString(data);
|
||||||
|
//
|
||||||
|
// // 发送 JSON 字符串到 Kafka
|
||||||
|
// ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topic, jsonString);
|
||||||
|
//
|
||||||
|
// // 添加回调,处理发送结果
|
||||||
|
// future.addCallback(new ListenableFutureCallback<>() {
|
||||||
|
// @Override
|
||||||
|
// public void onSuccess(SendResult<String, String> result) {
|
||||||
|
// // 处理成功的逻辑
|
||||||
|
// System.out.println("消息成功发送到主题: " + result.getRecordMetadata().topic());
|
||||||
|
// System.out.println("消息成功发送到分区: " + result.getRecordMetadata().partition());
|
||||||
|
// System.out.println("消息成功发送到偏移量: " + result.getRecordMetadata().offset());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public void onFailure(Throwable ex) {
|
||||||
|
// // 处理失败的逻辑
|
||||||
|
// System.out.println("消息发送失败: " + ex.getMessage());
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// } catch (JsonProcessingException e) {
|
||||||
|
// // 处理转换异常
|
||||||
|
// e.printStackTrace();
|
||||||
|
// System.out.println("消息发送失败: " + e.getMessage());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
|
@ -0,0 +1,61 @@
|
||||||
|
//package com.zyh.system.kafka;
|
||||||
|
//
|
||||||
|
//import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
//import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
//import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
//import org.apache.kafka.clients.producer.KafkaProducer;
|
||||||
|
//import org.apache.kafka.clients.producer.ProducerConfig;
|
||||||
|
//import org.apache.kafka.clients.producer.ProducerRecord;
|
||||||
|
//import org.springframework.stereotype.Component;
|
||||||
|
//
|
||||||
|
//import java.util.Properties;
|
||||||
|
//@Component
|
||||||
|
//public class Producer {
|
||||||
|
// private static final String brokerList = "152.136.54.230:9092";
|
||||||
|
// private static final String topic = "face";
|
||||||
|
//
|
||||||
|
// public static Properties initNewConfig() {
|
||||||
|
// Properties props = new Properties();
|
||||||
|
// props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);
|
||||||
|
// props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
|
||||||
|
// "org.apache.kafka.common.serialization.StringSerializer");
|
||||||
|
// props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
|
||||||
|
// "org.apache.kafka.common.serialization.StringSerializer");
|
||||||
|
// props.put(ProducerConfig.CLIENT_ID_CONFIG, "producer.client.id.demo");
|
||||||
|
//
|
||||||
|
// // 自定义分区器的使用
|
||||||
|
// //props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,DefinePartitioner.class.getName());
|
||||||
|
// // 自定义拦截器使用
|
||||||
|
// //props.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG,ProducerInterceptorPrefix.class.getName());
|
||||||
|
// props.put(ProducerConfig.ACKS_CONFIG, "0");
|
||||||
|
// return props;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static void send(CompreFaceApiResponse.Result data) throws InterruptedException, JsonProcessingException {
|
||||||
|
// ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
// String jsonString = objectMapper.writeValueAsString(data);
|
||||||
|
// Properties props = initNewConfig();
|
||||||
|
// KafkaProducer<String, String> producer = new KafkaProducer<>(props);
|
||||||
|
//
|
||||||
|
// //KafkaProducer<String, String> producer = new KafkaProducer<>(props,
|
||||||
|
// //new StringSerializer(), new StringSerializer());
|
||||||
|
// //生成 ProducerRecord 对象,并制定 Topic,key 以及 value
|
||||||
|
// ProducerRecord<String, String> record =
|
||||||
|
// new ProducerRecord<>(topic, jsonString);
|
||||||
|
// try {
|
||||||
|
// // 1、发送消息
|
||||||
|
// producer.send(record);
|
||||||
|
// // 打印成功发送的日志
|
||||||
|
// System.out.println("消息成功发送到主题: " + topic);
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// // 打印发送失败的日志
|
||||||
|
// System.out.println("消息发送失败: " + e.getMessage());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// producer.close();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.zyh.system.mapper;
|
||||||
|
|
||||||
|
import com.zyh.common.domain.Camera;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface CameraMapper {
|
||||||
|
List<Camera> cameraList();
|
||||||
|
|
||||||
|
Integer cameraDelete(@Param("id") Integer id);
|
||||||
|
|
||||||
|
Integer cameraAdd(Camera camera);
|
||||||
|
|
||||||
|
Integer cameraUpdate(Camera camera);
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package com.zyh.system.mapper;
|
||||||
|
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface ComprefaceMapper {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
//package com.zyh.system.mq;
|
||||||
|
//
|
||||||
|
//import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
//import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
//import com.rabbitmq.client.Channel;
|
||||||
|
//import com.zyh.common.constants.RabbitMQQueueNameConstants;
|
||||||
|
//import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
//import lombok.extern.log4j.Log4j2;
|
||||||
|
//import org.springframework.amqp.core.Message;
|
||||||
|
//import org.springframework.amqp.rabbit.annotation.Queue;
|
||||||
|
//import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
//import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
//import org.springframework.data.redis.core.RedisTemplate;
|
||||||
|
//import org.springframework.stereotype.Component;
|
||||||
|
//
|
||||||
|
//import java.util.HashMap;
|
||||||
|
//
|
||||||
|
//@Component
|
||||||
|
//@Log4j2
|
||||||
|
//public class Clicknum {
|
||||||
|
//
|
||||||
|
// @Autowired
|
||||||
|
// RedisTemplate<String, String> redisTemplate;
|
||||||
|
//
|
||||||
|
// @RabbitListener(queuesToDeclare = {@Queue(RabbitMQQueueNameConstants.SEND_SMS_QUEUE_NAME)})
|
||||||
|
// public void SendCodeMq(String jsonString, Message message, Channel channel) throws JsonProcessingException {
|
||||||
|
// long l = System.currentTimeMillis();
|
||||||
|
// log.info("短信消费者队列开始消费...,消费内容为:{}", jsonString);
|
||||||
|
// String messageId = message.getMessageProperties().getMessageId();
|
||||||
|
//
|
||||||
|
// ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
// CompreFaceApiResponse.Result result = objectMapper.readValue(jsonString, CompreFaceApiResponse.Result.class);
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// Long count = redisTemplate.opsForSet().add(RabbitMQQueueNameConstants.SEND_SMS_QUEUE_NAME, messageId);
|
||||||
|
// if (count == 1) {
|
||||||
|
//
|
||||||
|
// log.info("短信消费者队列消费成功,耗时:{}毫秒!", System.currentTimeMillis()-l);
|
||||||
|
// }else{
|
||||||
|
// log.info("短信消费者队列重复消费,消费内容为:{}", jsonString);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// log.info("短信消费者队列消费失败,异常内容为:{}", e.getMessage());
|
||||||
|
// redisTemplate.opsForSet().remove(RabbitMQQueueNameConstants.SEND_SMS_QUEUE_NAME, messageId);
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);
|
||||||
|
// } catch (Exception ex) {
|
||||||
|
// log.info("短信消费者队列回退失败,异常内容为:{}", ex.getMessage());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.zyh.system.service;
|
||||||
|
|
||||||
|
import com.zyh.common.domain.Camera;
|
||||||
|
import com.zyh.common.result.Result;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface CameraService {
|
||||||
|
List<Camera> cameraList();
|
||||||
|
|
||||||
|
Result cameraDelete(Integer id);
|
||||||
|
|
||||||
|
Result cameraAdd(Camera camera);
|
||||||
|
|
||||||
|
Result cameraUpdate(Camera camera);
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.zyh.system.service;
|
||||||
|
|
||||||
|
import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
import com.zyh.common.domain.Photo;
|
||||||
|
import com.zyh.common.result.Result;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public interface ComprefaceService {
|
||||||
|
Result<CompreFaceApiResponse.Result> compareWithSingleFace(MultipartFile targetImage) throws IOException;
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
package com.zyh.system.service;
|
||||||
|
|
||||||
|
public interface EsService {
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package com.zyh.system.service.impl;
|
||||||
|
|
||||||
|
import com.zyh.common.domain.Camera;
|
||||||
|
import com.zyh.common.result.Result;
|
||||||
|
import com.zyh.common.util.RandomGenerator;
|
||||||
|
import com.zyh.system.mapper.CameraMapper;
|
||||||
|
import com.zyh.system.service.CameraService;
|
||||||
|
import org.apache.commons.lang3.RandomUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class CameraServicempl implements CameraService {
|
||||||
|
@Autowired
|
||||||
|
private CameraMapper cameraMapper;
|
||||||
|
@Override
|
||||||
|
public List<Camera> cameraList() {
|
||||||
|
List<Camera> cameraList = cameraMapper.cameraList();
|
||||||
|
return cameraList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Result cameraDelete(Integer id) {
|
||||||
|
Integer result = cameraMapper.cameraDelete(id);
|
||||||
|
if(result>0){
|
||||||
|
return Result.success("删除成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result.error("删除失败");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Result cameraAdd(Camera camera) {
|
||||||
|
//五位字母随机
|
||||||
|
String s = RandomGenerator.generateRandomLetters(5);
|
||||||
|
camera.setCameraId(s);
|
||||||
|
|
||||||
|
Integer result = cameraMapper.cameraAdd(camera);
|
||||||
|
if(result>0){
|
||||||
|
return Result.success("添加成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result.error("添加失败");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Result cameraUpdate(Camera camera) {
|
||||||
|
|
||||||
|
Integer result = cameraMapper.cameraUpdate(camera);
|
||||||
|
if(result>0){
|
||||||
|
return Result.success("修改成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result.error("修改失败");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
package com.zyh.system.service.impl;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.zyh.common.constants.RabbitMQQueueNameConstants;
|
||||||
|
import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
import com.zyh.common.result.Result;
|
||||||
|
import com.zyh.common.util.ComprefaceUtils;
|
||||||
|
import com.zyh.system.mapper.ComprefaceMapper;
|
||||||
|
import com.zyh.system.service.ComprefaceService;
|
||||||
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ComprefaceServicempl implements ComprefaceService {
|
||||||
|
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ComprefaceMapper comprefaceMapper;
|
||||||
|
@Autowired
|
||||||
|
private EsServicempl esServicempl;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
RabbitTemplate rabbitTemplate;
|
||||||
|
@Override
|
||||||
|
public Result<CompreFaceApiResponse.Result> compareWithSingleFace(MultipartFile targetImage) throws IOException {
|
||||||
|
byte[] bytes = targetImage.getBytes();
|
||||||
|
// 将接收到的图片路径转换为 base64
|
||||||
|
Result<CompreFaceApiResponse.Result> result = ComprefaceUtils.recognizeFace(bytes);
|
||||||
|
CompreFaceApiResponse.Result data = result.getData();
|
||||||
|
|
||||||
|
// esServicempl.add(data);
|
||||||
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
String jsonString = objectMapper.writeValueAsString(data);
|
||||||
|
|
||||||
|
rabbitTemplate.convertAndSend(RabbitMQQueueNameConstants.SEND_SMS_QUEUE_NAME, jsonString,message -> {
|
||||||
|
|
||||||
|
message.getMessageProperties().setMessageId(UUID.randomUUID().toString().replaceAll("-", ""));
|
||||||
|
return message;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return Result.success(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
package com.zyh.system.service.impl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.zyh.common.domain.CompreFaceApiResponse;
|
||||||
|
import com.zyh.system.service.EsService;
|
||||||
|
import org.elasticsearch.action.index.IndexRequest;
|
||||||
|
import org.elasticsearch.action.index.IndexResponse;
|
||||||
|
import org.elasticsearch.client.RequestOptions;
|
||||||
|
import org.elasticsearch.client.RestHighLevelClient;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class EsServicempl implements EsService {
|
||||||
|
@Autowired
|
||||||
|
private RestHighLevelClient restHighLevelClient;
|
||||||
|
@Autowired
|
||||||
|
private ObjectMapper objectMapper;
|
||||||
|
|
||||||
|
|
||||||
|
private final static String INDEX_NAME = "face";
|
||||||
|
|
||||||
|
|
||||||
|
public void pushToElasticsearch(CompreFaceApiResponse.Result data) {
|
||||||
|
try {
|
||||||
|
IndexRequest indexRequest = new IndexRequest(INDEX_NAME);
|
||||||
|
|
||||||
|
// 不设置文档 ID,由 Elasticsearch 自动生成一个唯一 ID
|
||||||
|
// indexRequest.id(data.getYourId());
|
||||||
|
|
||||||
|
String jsonData = objectMapper.writeValueAsString(data);
|
||||||
|
indexRequest.source(jsonData, XContentType.JSON);
|
||||||
|
|
||||||
|
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
|
||||||
|
|
||||||
|
// 可以根据 indexResponse 获取有关索引操作的信息
|
||||||
|
System.out.println("Elasticsearch Index Response: " + indexResponse);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void add(CompreFaceApiResponse.Result data) {
|
||||||
|
try {
|
||||||
|
IndexRequest indexRequest = new IndexRequest(INDEX_NAME)
|
||||||
|
.source(JSONObject.toJSONString(data), XContentType.JSON);
|
||||||
|
|
||||||
|
restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.zyh.system.util;
|
||||||
|
|
||||||
|
import org.apache.kafka.clients.consumer.Consumer;
|
||||||
|
import org.apache.kafka.clients.consumer.ConsumerConfig;
|
||||||
|
import org.apache.kafka.clients.consumer.ConsumerRecords;
|
||||||
|
import org.apache.kafka.clients.consumer.KafkaConsumer;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
public class KafkaMessageConsumer {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// 配置 Kafka 消费者
|
||||||
|
Properties properties = new Properties();
|
||||||
|
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "152.136.54.230:9092");
|
||||||
|
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "face");
|
||||||
|
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
|
||||||
|
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
|
||||||
|
|
||||||
|
// 创建 Kafka 消费者
|
||||||
|
Consumer<String, String> consumer = new KafkaConsumer<>(properties);
|
||||||
|
|
||||||
|
// 订阅主题
|
||||||
|
consumer.subscribe(Collections.singletonList("face"));
|
||||||
|
|
||||||
|
// 持续消费消息
|
||||||
|
while (true) {
|
||||||
|
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); // 设置轮询时间
|
||||||
|
|
||||||
|
records.forEach(record -> {
|
||||||
|
// 处理消息
|
||||||
|
System.out.printf("Consumed record with key %s and value %s%n", record.key(), record.value());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
# Tomcat
|
||||||
|
server:
|
||||||
|
port: 9006
|
||||||
|
|
||||||
|
# Spring
|
||||||
|
spring:
|
||||||
|
main:
|
||||||
|
allow-circular-references: true
|
||||||
|
jackson:
|
||||||
|
date-format: yyyy-MM-dd HH:mm:ss
|
||||||
|
time-zone: GMT+8
|
||||||
|
application:
|
||||||
|
# 应用名称
|
||||||
|
name: community-security-modules-photo
|
||||||
|
profiles:
|
||||||
|
# 环境配置
|
||||||
|
active: dev
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
discovery:
|
||||||
|
# 服务注册地址
|
||||||
|
server-addr: 124.221.193.62:8848
|
||||||
|
namespace: e3afd3fd-73b0-4ac1-9f9e-aad1a8aa9f46
|
||||||
|
config:
|
||||||
|
# 配置中心地址
|
||||||
|
server-addr: 124.221.193.62:8848
|
||||||
|
namespace: e3afd3fd-73b0-4ac1-9f9e-aad1a8aa9f46
|
||||||
|
# 配置文件格式
|
||||||
|
file-extension: yml
|
||||||
|
# 共享配置
|
||||||
|
shared-configs:
|
||||||
|
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
|
||||||
|
|
||||||
|
# Elasticsearch
|
||||||
|
#es:
|
||||||
|
# host: 152.136.54.230
|
||||||
|
# port: 9200
|
||||||
|
# scheme: http
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||||
|
<mapper namespace="com.zyh.system.mapper.CameraMapper">
|
||||||
|
<insert id="cameraAdd">
|
||||||
|
insert into camera
|
||||||
|
values (0, #{cameraId}, #{lng}, #{lat}, #{address})
|
||||||
|
</insert>
|
||||||
|
<update id="cameraUpdate">
|
||||||
|
update camera
|
||||||
|
set camera_id = #{cameraId}, lng = #{lng}, lat = #{lat}, address = #{address}
|
||||||
|
where id = #{id}
|
||||||
|
</update>
|
||||||
|
<delete id="cameraDelete">
|
||||||
|
delete
|
||||||
|
from camera
|
||||||
|
where id = #{id}
|
||||||
|
</delete>
|
||||||
|
|
||||||
|
|
||||||
|
<select id="cameraList" resultType="com.zyh.common.domain.Camera">
|
||||||
|
select * from camera
|
||||||
|
</select>
|
||||||
|
</mapper>
|
|
@ -0,0 +1,44 @@
|
||||||
|
//package com.zyh.system.service.impl;
|
||||||
|
//
|
||||||
|
//import com.fasterxml.jackson.databind.ser.std.StringSerializer;
|
||||||
|
//import org.apache.kafka.clients.producer.KafkaProducer;
|
||||||
|
//import org.apache.kafka.clients.producer.ProducerConfig;
|
||||||
|
//import org.apache.kafka.clients.producer.ProducerRecord;
|
||||||
|
//import org.junit.jupiter.api.Test;
|
||||||
|
//
|
||||||
|
//import java.util.Properties;
|
||||||
|
//
|
||||||
|
//import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
//
|
||||||
|
//class CameraServicemplTest {
|
||||||
|
//
|
||||||
|
// @Test
|
||||||
|
// public void testPost(){
|
||||||
|
// //主题(当主题不存在,自动创建主题)
|
||||||
|
// String topic = "product_post";
|
||||||
|
// //配置
|
||||||
|
// Properties properties = new Properties();
|
||||||
|
// //kafka服务器地址
|
||||||
|
// properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"152.136.54.230:9092");
|
||||||
|
// //反序列化器
|
||||||
|
// properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, org.apache.kafka.common.serialization.StringSerializer.class);
|
||||||
|
// properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, org.apache.kafka.common.serialization.StringSerializer.class);
|
||||||
|
//
|
||||||
|
// //生产者
|
||||||
|
// KafkaProducer<String,String> kafkaProducer = new KafkaProducer(properties);
|
||||||
|
//
|
||||||
|
// //生产信息
|
||||||
|
// for (int i = 0; i < 11; i++) {
|
||||||
|
// String msg = String.format("hello,第%d条信息", i);
|
||||||
|
// //消息(key可以为null,key值影响消息发往哪个分区)
|
||||||
|
// ProducerRecord<String, String> producerRecord = new ProducerRecord<String, String>(topic, String.valueOf(i), msg);
|
||||||
|
// //发送
|
||||||
|
// kafkaProducer.send(producerRecord);
|
||||||
|
// System.out.println("生产者发送第"+i+"条信息");
|
||||||
|
// }
|
||||||
|
// //关闭
|
||||||
|
// kafkaProducer.close();
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
|
@ -14,6 +14,8 @@
|
||||||
<modules>
|
<modules>
|
||||||
<module>community-security-modules-shop</module>
|
<module>community-security-modules-shop</module>
|
||||||
<module>community-security-modules-system</module>
|
<module>community-security-modules-system</module>
|
||||||
|
<module>community-security-modules-photo</module>
|
||||||
|
<module>community-security-modules-es</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
|
Loading…
Reference in New Issue