Commit 0db6e9d4 authored by 赵啸非's avatar 赵啸非

添加站点主题事项

parent b31a792f
......@@ -8,6 +8,7 @@ const CompressionWebpackPlugin = require("compression-webpack-plugin");
const productionGzipExtensions = ["js", "css"];
const isProd = process.env.NODE_ENV === "production";
const assetsCDN = {
// webpack build externals
// externals: {
......@@ -33,6 +34,17 @@ const assetsCDN = {
],
};
const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
const devPlugins = [
new HardSourceWebpackPlugin(),
new HardSourceWebpackPlugin.ExcludeModulePlugin([
{
test: /mini-css-extract-plugin[\\/]dist[\\/]loader/
}
])
];
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
module.exports = {
devServer: {
disableHostCheck: true,
......@@ -56,6 +68,13 @@ module.exports = {
},
},
configureWebpack: (config) => {
config.plugin('webpack-report').use(BundleAnalyzerPlugin, [
{
analyzerMode: 'static'
}
])
plugins: process.env.NODE_ENV === "production" ? [] : [...devPlugins];
config.entry.app = ["babel-polyfill", "whatwg-fetch", "./src/main.js"];
config.performance = {
hints: false,
......
......@@ -1577,6 +1577,275 @@ msg|String|消息|-
```
## 主题
### 查询主题列表
**请求URL:** site/theme/list
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 查询主题
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:------
page|Integer|否|当前页
size|Integer|否|每页条数,值为-1,查询所有记录
siteId|Long|否|站点id
userType|String|否|服务类型编号,字段前后添加%%模糊查询
themeCode|String|否|主题编号,字段前后添加%%模糊查询
themeName|String|否|主题名称,字段前后添加%%模糊查询
**请求样例:**
```
{
"siteId":9425,
"userType":"6mu82c",
"themeCode":"w7vxfs",
"themeName":"a9jq7j",
"page":1,
"size":10
}
```
**响应参数:**
参数名称|参数类型|描述
:---|:---|:------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|object|数据对象
 per_page|Integer|每页条数
 total|Integer|总条数
 last_page|Integer|总页数
 current_page|Integer|当前页
 data|array|结果集列表|数组
  id|Long|id号
  siteId|Long|站点id
  userType|String|服务类型编号
  themeCode|String|主题编号
  themeName|String|主题名称
  createTime|Date|创建时间
  createUserId|Long|创建用户id
  updateTime|Date|更新时间
dict|object|字典对象
**响应消息样例:**
```
{
"code":1,
"data":{
}
}
```
### 查看主题
**请求URL:** site/theme/info
**请求方式:** GET
**内容类型:** application/json;charset=utf-8
**简要描述:** 查看主题,返回实例详细信息
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:------
id|Long|是|ID
**请求样例:**
```
http://localhost/site/theme/info?id=549
```
**响应参数:**
参数名称 |参数类型|描述
:---|:---|:-------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|object|数据对象
 id|Long|id号
 siteId|Long|站点id
 userType|String|服务类型编号
 themeCode|String|主题编号
 themeName|String|主题名称
 createTime|Date|创建时间
 createUserId|Long|创建用户id
 updateTime|Date|更新时间
dict|object|字典对象
**响应消息样例:**
```
{
"code": 1,
"data": {
"id":539,
"siteId":4859,
"userType":"ewybhk",
"themeCode":"27cygo",
"themeName":"qu6dep",
"createTime":"2023-01-28",
"createUserId":1565,
"updateTime":"2023-01-28"
}
}
```
## 站点主题事项
### 查询站点主题事项列表
**请求URL:** site/theme/matter/list
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 查询站点主题事项
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:------
page|Integer|否|当前页
size|Integer|否|每页条数,值为-1,查询所有记录
siteId|Long|否|站点ID
siteName|String|否|站点名称,字段前后添加%%模糊查询
matterId|Long|否|事项ID
matterName|String|否|事项名称,字段前后添加%%模糊查询
matterCode|String|否|事项编码,字段前后添加%%模糊查询
userType|String|否|服务类型(1.公共服务,2.个人服务,3.法人服务),字段前后添加%%模糊查询
themeCode|String|否|主题编码,字段前后添加%%模糊查询
themeName|String|否|主题名称,字段前后添加%%模糊查询
source|Integer|否|事项来源
**请求样例:**
```
{
"siteId":2334,
"siteName":"j1sn8h",
"matterId":5032,
"matterName":"xnn17d",
"matterCode":"5c6fxz",
"userType":"9c8tar",
"themeCode":"ztkpff",
"themeName":"hyfa7h",
"source":3642,
"page":1,
"size":10
}
```
**响应参数:**
参数名称|参数类型|描述
:---|:---|:------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|object|数据对象
 per_page|Integer|每页条数
 total|Integer|总条数
 last_page|Integer|总页数
 current_page|Integer|当前页
 data|array|结果集列表|数组
  id|Long|序号,主键,自增长
  siteId|Long|站点ID
  siteName|String|站点名称
  matterId|Long|事项ID
  matterName|String|事项名称
  matterCode|String|事项编码
  userType|String|服务类型(1.公共服务,2.个人服务,3.法人服务)
  themeCode|String|主题编码
  themeName|String|主题名称
  source|Integer|事项来源
  createTime|Date|创建时间
  createUserId|Long|创建用户
  updateTime|Date|修改时间
dict|object|字典对象
 userType|object|字典属性对象,详见附录
**响应消息样例:**
```
{
"code":1,
"data":{
}
}
```
### 查看站点主题事项
**请求URL:** site/theme/matter/info
**请求方式:** GET
**内容类型:** application/json;charset=utf-8
**简要描述:** 查看站点主题事项,返回实例详细信息
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:------
id|Long|是|ID
**请求样例:**
```
http://localhost/site/theme/matter/info?id=549
```
**响应参数:**
参数名称 |参数类型|描述
:---|:---|:-------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|object|数据对象
 id|Long|序号,主键,自增长
 siteId|Long|站点ID
 siteName|String|站点名称
 matterId|Long|事项ID
 matterName|String|事项名称
 matterCode|String|事项编码
 userType|String|服务类型(1.公共服务,2.个人服务,3.法人服务)
 themeCode|String|主题编码
 themeName|String|主题名称
 source|Integer|事项来源
 createTime|Date|创建时间
 createUserId|Long|创建用户
 updateTime|Date|修改时间
dict|object|字典对象
 userType|object|字典属性对象,详见附录
**响应消息样例:**
```
{
"code": 1,
"data": {
"id":6517,
"siteId":8377,
"siteName":"wnnjis",
"matterId":5970,
"matterName":"b5c0l3",
"matterCode":"y3yyz4",
"userType":"sr07tk",
"themeCode":"s1az2z",
"themeName":"isyo83",
"source":7309,
"createTime":"2023-01-28",
"createUserId":2157,
"updateTime":"2023-01-28"
}
}
```
## 业务
### 查询站点业务列表
......
......@@ -88,21 +88,22 @@
<profiles.active>yibin</profiles.active>
<profiles.server.path>/base</profiles.server.path>
<profiles.publish.path>/home/publish</profiles.publish.path>
<profiles.rabbitmq.host>127.0.0.1</profiles.rabbitmq.host>
<profiles.rabbitmq.host>172.15.28.115</profiles.rabbitmq.host>
<profiles.rabbitmq.port>5672</profiles.rabbitmq.port>
<profiles.rabbitmq.username>taxi_mq</profiles.rabbitmq.username>
<profiles.rabbitmq.password>admin@2020</profiles.rabbitmq.password>
<profiles.rabbitmq.virtualhost>/</profiles.rabbitmq.virtualhost>
<profiles.nacos.server-addr>127.0.0.1:8848</profiles.nacos.server-addr>
<profiles.nacos.server-addr>172.15.28.120:8848</profiles.nacos.server-addr>
<profiles.nacos.group>DEFAULT_GROUP</profiles.nacos.group>
<profiles.nacos.namespace>smart-gov</profiles.nacos.namespace>
<profiles.log.path>/home/mortals/app/logs</profiles.log.path>
<profiles.filepath>/home/mortals/app/data</profiles.filepath>
<profiles.log.level>INFO</profiles.log.level>
<package.environment>yibin</package.environment>
<skipDeploy>false</skipDeploy>
<skipDeploy>true</skipDeploy>
</properties>
</profile>
</profiles>
<dependencies>
......@@ -190,11 +191,11 @@
</dependency>
<!-- 虹软人脸解析 -->
<dependency>
<!-- <dependency>
<groupId>com.arcsoft.face</groupId>
<artifactId>arcsoft-sdk-face</artifactId>
<version>3.0.0.0</version>
</dependency>
</dependency>-->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
......
package com.mortals.xhx.base.system.param.service.impl;
import cn.hutool.core.util.StrUtil;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.IParam;
import com.mortals.framework.service.impl.AbstractCRUDCacheServiceImpl;
import com.mortals.framework.util.DataUtil;
......@@ -32,6 +34,20 @@ public class ParamServiceImpl extends AbstractCRUDCacheServiceImpl<ParamDao, Par
return "ParamEntity.paramKey";
}
/**
* @param entity
* @param context
* @throws AppException
*/
@Override
protected void saveBefore(ParamEntity entity, Context context) throws AppException {
//过滤换行符
entity.setParamKey(StrUtil.removeAllLineBreaks(entity.getParamKey()));
entity.setParamValue(StrUtil.removeAllLineBreaks(entity.getParamValue()));
super.saveBefore(entity, context);
}
@Override
public String getValueByKey(String key) {
List<ParamEntity> list = this.getCacheList();
......
package com.mortals.xhx.common.utils;
import com.arcsoft.face.*;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import com.arcsoft.face.toolkit.ImageInfo;
import com.mortals.framework.exception.AppException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
@Slf4j
@Component
public class FaceUtil {
public FaceEngine initFace(String appId, String sdkKey) {
FaceEngine faceEngine = new FaceEngine(getClass().getResource(getOsName()).getPath());
//激活引擎
int errorCode = faceEngine.activeOnline(appId, sdkKey);
isTrue(!(errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()), "引擎激活失败");
ActiveFileInfo activeFileInfo = new ActiveFileInfo();
errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
isTrue(!(errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()), "获取激活文件信息失败");
//引擎配置
EngineConfiguration engineConfiguration = new EngineConfiguration();
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
engineConfiguration.setDetectFaceMaxNum(10);
engineConfiguration.setDetectFaceScaleVal(16);
//功能配置
FunctionConfiguration functionConfiguration = new FunctionConfiguration();
functionConfiguration.setSupportAge(true);
functionConfiguration.setSupportFace3dAngle(true);
functionConfiguration.setSupportFaceDetect(true);
functionConfiguration.setSupportFaceRecognition(true);
functionConfiguration.setSupportGender(true);
functionConfiguration.setSupportLiveness(true);
functionConfiguration.setSupportIRLiveness(true);
engineConfiguration.setFunctionConfiguration(functionConfiguration);
//初始化引擎
errorCode = faceEngine.init(engineConfiguration);
isTrue(errorCode == ErrorInfo.MOK.getValue(), "初始化引擎失败");
return faceEngine;
}
/**
* 人脸检测、特征提取
*
* @param faceEngine
* @param bytes
* @return
*/
public byte[] featureData(FaceEngine faceEngine, byte[] bytes) {
//人脸检测
ImageInfo imageInfo = getRGBData(bytes);
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
//特征提取
FaceFeature faceFeature = new FaceFeature();
faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
return faceFeature.getFeatureData();
}
/**
* 特征比对
*
* @param targeFace
* @param sourceFace
* @return
*/
public boolean featureComparison(FaceEngine faceEngine, byte[] targeFace, byte[] sourceFace) {
//特征比对
FaceFeature targetFaceFeature = new FaceFeature();
targetFaceFeature.setFeatureData(targeFace);
FaceFeature sourceFaceFeature = new FaceFeature();
sourceFaceFeature.setFeatureData(sourceFace);
FaceSimilar faceSimilar = new FaceSimilar();
faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
float score = faceSimilar.getScore();
if (score > 0.8) {
return true;
}
return false;
}
public void unInit(FaceEngine faceEngine) {
faceEngine.unInit();
}
public String getOsName() {
String os = System.getProperty("os.name");
String osName = os.toLowerCase().startsWith("win") ? "/face_lib/win64" : "/face_lib/linux";
return osName;
}
private void isTrue(boolean b, String errorMsg) {
if (!b) {
throw new AppException(errorMsg);
}
}
}
//package com.mortals.xhx.common.utils;
//
//import com.arcsoft.face.*;
//import com.arcsoft.face.enums.DetectMode;
//import com.arcsoft.face.enums.DetectOrient;
//import com.arcsoft.face.enums.ErrorInfo;
//import com.arcsoft.face.toolkit.ImageInfo;
//import com.mortals.framework.exception.AppException;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import java.util.ArrayList;
//import java.util.List;
//
//import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
//
//@Slf4j
//@Component
//public class FaceUtil {
//
// public FaceEngine initFace(String appId, String sdkKey) {
// FaceEngine faceEngine = new FaceEngine(getClass().getResource(getOsName()).getPath());
// //激活引擎
// int errorCode = faceEngine.activeOnline(appId, sdkKey);
// isTrue(!(errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()), "引擎激活失败");
// ActiveFileInfo activeFileInfo = new ActiveFileInfo();
// errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
// isTrue(!(errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()), "获取激活文件信息失败");
// //引擎配置
// EngineConfiguration engineConfiguration = new EngineConfiguration();
// engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
// engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
// engineConfiguration.setDetectFaceMaxNum(10);
// engineConfiguration.setDetectFaceScaleVal(16);
// //功能配置
// FunctionConfiguration functionConfiguration = new FunctionConfiguration();
// functionConfiguration.setSupportAge(true);
// functionConfiguration.setSupportFace3dAngle(true);
// functionConfiguration.setSupportFaceDetect(true);
// functionConfiguration.setSupportFaceRecognition(true);
// functionConfiguration.setSupportGender(true);
// functionConfiguration.setSupportLiveness(true);
// functionConfiguration.setSupportIRLiveness(true);
// engineConfiguration.setFunctionConfiguration(functionConfiguration);
// //初始化引擎
// errorCode = faceEngine.init(engineConfiguration);
// isTrue(errorCode == ErrorInfo.MOK.getValue(), "初始化引擎失败");
// return faceEngine;
// }
//
//
// /**
// * 人脸检测、特征提取
// *
// * @param faceEngine
// * @param bytes
// * @return
// */
// public byte[] featureData(FaceEngine faceEngine, byte[] bytes) {
// //人脸检测
// ImageInfo imageInfo = getRGBData(bytes);
// List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
// faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
// //特征提取
// FaceFeature faceFeature = new FaceFeature();
// faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
// return faceFeature.getFeatureData();
// }
//
//
// /**
// * 特征比对
// *
// * @param targeFace
// * @param sourceFace
// * @return
// */
// public boolean featureComparison(FaceEngine faceEngine, byte[] targeFace, byte[] sourceFace) {
// //特征比对
// FaceFeature targetFaceFeature = new FaceFeature();
// targetFaceFeature.setFeatureData(targeFace);
// FaceFeature sourceFaceFeature = new FaceFeature();
// sourceFaceFeature.setFeatureData(sourceFace);
// FaceSimilar faceSimilar = new FaceSimilar();
// faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
// float score = faceSimilar.getScore();
// if (score > 0.8) {
// return true;
// }
// return false;
// }
//
// public void unInit(FaceEngine faceEngine) {
// faceEngine.unInit();
// }
//
// public String getOsName() {
// String os = System.getProperty("os.name");
// String osName = os.toLowerCase().startsWith("win") ? "/face_lib/win64" : "/face_lib/linux";
// return osName;
// }
//
//
// private void isTrue(boolean b, String errorMsg) {
// if (!b) {
// throw new AppException(errorMsg);
// }
// }
//
//}
......@@ -55,7 +55,15 @@ public class DemoStartedService implements IApplicationStartedService {
SyncTreeSiteThread syncTreeSiteThread = new SyncTreeSiteThread(contextTemp);
ThreadPool.getInstance().execute(syncTreeSiteThread);
if(ObjectUtils.isEmpty(userFeign)){
userService.find(new UserQuery()).forEach(user->{
Context context = new Context();
context.setUser(user);
ThreadPool.getInstance().execute(new SyncTreeSiteThread(context));
});
/* if(ObjectUtils.isEmpty(userFeign)){
logger.info("userFeign未加载,加载本地用户");
userService.find(new UserQuery()).forEach(user->{
Context context = new Context();
......@@ -64,9 +72,9 @@ public class DemoStartedService implements IApplicationStartedService {
});
return;
}
}*/
userFeign.list(new UserPdu()).getData().getData().stream().forEach(userPdu->{
/* userFeign.list(new UserPdu()).getData().getData().stream().forEach(userPdu->{
Context context = new Context();
UserEntity entity = new UserEntity();
......@@ -75,7 +83,7 @@ public class DemoStartedService implements IApplicationStartedService {
context.setUser(entity);
ThreadPool.getInstance().execute(new SyncTreeSiteThread(context));
});
});*/
}
@Override
......
package com.mortals.xhx.face;
import com.arcsoft.face.*;
import com.arcsoft.face.toolkit.ImageInfo;
import com.google.common.collect.Lists;
import com.mortals.xhx.face.factory.FaceEnginePoolFactory;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.AbandonedConfig;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
@Slf4j
@Component
public class ArcsoftFaceUtil {
@Value(value = "${faceAppId}")
private String appId;
@Value(value = "${winSdkKey}")
private String winSdkKey;
@Value(value = "${linuxSdkkey}")
private String linuxSdkKey;
public Integer threadPoolSize=5;
private GenericObjectPool<FaceEngine> faceEngineGenericObjectPool;
public ArcsoftFaceUtil(){
String sdkLibPath = getClass().getResource(getOsName()).getPath();
String sdkKey = getSdkKey(sdkLibPath);
// 对象池工厂
FaceEnginePoolFactory personPoolFactory = new FaceEnginePoolFactory(appId,sdkKey,sdkLibPath);
// 对象池配置
GenericObjectPoolConfig<FaceEngine> objectPoolConfig = new GenericObjectPoolConfig<>();
objectPoolConfig.setMaxTotal(threadPoolSize);
AbandonedConfig abandonedConfig = new AbandonedConfig();
//在Maintenance的时候检查是否有泄漏
abandonedConfig.setRemoveAbandonedOnMaintenance(true);
//borrow 的时候检查泄漏
abandonedConfig.setRemoveAbandonedOnBorrow(true);
//如果一个对象borrow之后10秒还没有返还给pool,认为是泄漏的对象
abandonedConfig.setRemoveAbandonedTimeout(10);
// 对象池
faceEngineGenericObjectPool = new GenericObjectPool<>(personPoolFactory, objectPoolConfig);
faceEngineGenericObjectPool.setAbandonedConfig(abandonedConfig);
faceEngineGenericObjectPool.setTimeBetweenEvictionRunsMillis(5000); //5秒运行一次维护任务
log.info("引擎池开启成功");
}
private String getOsName() {
String os = System.getProperty("os.name");
String osName = os.toLowerCase().startsWith("win") ? "/face_lib/win64" : "/face_lib/linux";
return osName;
}
private String getSdkKey(String sdkLibPath) {
return sdkLibPath.equals("/face_lib/win64") ? winSdkKey : linuxSdkKey;
}
/**
* 人脸检测
*
* @param fileInputStream
* @return
*/
public List<FaceInfo> faceFind(InputStream fileInputStream) throws IOException {
FaceEngine faceEngine = null;
try {
faceEngine = faceEngineGenericObjectPool.borrowObject();
ImageInfo imageInfo = getRGBData(fileInputStream);
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
int errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
return faceInfoList;
} catch (Exception e) {
log.error("人脸检测出现了异常");
e.printStackTrace();
return new ArrayList<FaceInfo>();
} finally {
fileInputStream.close();
// 回收对象到对象池
if (faceEngine != null) {
faceEngineGenericObjectPool.returnObject(faceEngine);
}
}
}
/**
* 人脸截取
*
* @param fileInputStream
* @param rect
* @return
*/
public String faceCrop(InputStream fileInputStream, Rect rect) {
try {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
BufferedImage bufImage = ImageIO.read(fileInputStream);
int height = bufImage.getHeight();
int width = bufImage.getWidth();
int top = rect.getTop();
int bottom = rect.getBottom();
int left = rect.getLeft();
int right = rect.getRight();
//System.out.println(top + "-" + bottom + "-" + left + "-" + right);
try {
BufferedImage subimage = bufImage.getSubimage(left, top, right - left, bottom - left);
ImageIO.write(subimage, "png", stream);
String base64 = Base64.encode(stream.toByteArray());
return base64;
}catch (Exception e){
return null;
}finally {
stream.close();
fileInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
}
return null;
}
/**
* 人脸特征值提取
*/
public byte[] faceFeature(byte[] bytes) {
FaceEngine faceEngine = null;
try {
faceEngine = faceEngineGenericObjectPool.borrowObject();
ImageInfo imageInfo = getRGBData(bytes);
//人脸检测得到人脸列表
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
FaceFeature faceFeature = new FaceFeature();
faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
byte[] featureData = faceFeature.getFeatureData();
return featureData;
} catch (Exception e) {
log.error("人脸特征值提取出现了异常");
e.printStackTrace();
return new byte[0];
} finally {
// 回收对象到对象池
if (faceEngine != null) {
faceEngineGenericObjectPool.returnObject(faceEngine);
}
}
}
/**
* 人脸对比
*/
public float faceCompared(byte [] source,byte [] des) throws IOException {
FaceEngine faceEngine = null;
try {
faceEngine = faceEngineGenericObjectPool.borrowObject();
FaceFeature targetFaceFeature = new FaceFeature();
targetFaceFeature.setFeatureData(source);
FaceFeature sourceFaceFeature = new FaceFeature();
sourceFaceFeature.setFeatureData(des);
FaceSimilar faceSimilar = new FaceSimilar();
faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
float score = faceSimilar.getScore();
return score;
} catch (Exception e) {
log.error("人脸对比出现了异常");
e.printStackTrace();
return 0;
} finally {
// 回收对象到对象池
if (faceEngine != null) {
faceEngineGenericObjectPool.returnObject(faceEngine);
}
}
}
/**
* 人脸搜索
*/
public List<SysFaceEntity> faceSearch(FaceFeature targetFaceFeature,List<SysFaceEntity> sourceList) throws IOException {
FaceEngine faceEngine = null;
List<SysFaceEntity> resultFaceInfoList = Lists.newLinkedList();//识别到的人脸列表
try {
faceEngine = faceEngineGenericObjectPool.borrowObject();
for(SysFaceEntity faceUserInfo : sourceList) {
FaceFeature sourceFaceFeature = new FaceFeature();
sourceFaceFeature.setFeatureData(faceUserInfo.getFaceFeature());
FaceSimilar faceSimilar = new FaceSimilar();
faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
float score = faceSimilar.getScore();
if(score > 0.8){
faceUserInfo.setSimilarValue(plusHundred(score));
resultFaceInfoList.add(faceUserInfo);
}
}
} catch (Exception e) {
log.error("人脸对比出现了异常");
e.printStackTrace();
} finally {
// 回收对象到对象池
if (faceEngine != null) {
faceEngineGenericObjectPool.returnObject(faceEngine);
}
}
return resultFaceInfoList;
}
private int plusHundred(Float value) {
BigDecimal target = new BigDecimal(value);
BigDecimal hundred = new BigDecimal(100f);
return target.multiply(hundred).intValue();
}
}
//package com.mortals.xhx.face;
//
//import com.arcsoft.face.*;
//import com.arcsoft.face.toolkit.ImageInfo;
//import com.google.common.collect.Lists;
//import com.mortals.xhx.face.factory.FaceEnginePoolFactory;
//import com.mortals.xhx.module.identity.model.SysFaceEntity;
//import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.pool2.impl.AbandonedConfig;
//import org.apache.commons.pool2.impl.GenericObjectPool;
//import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//
//import javax.imageio.ImageIO;
//import java.awt.image.BufferedImage;
//import java.io.ByteArrayOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.math.BigDecimal;
//import java.util.ArrayList;
//import java.util.List;
//
//import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
//
//@Slf4j
//@Component
//public class ArcsoftFaceUtil {
//
// @Value(value = "${faceAppId}")
// private String appId;
//
// @Value(value = "${winSdkKey}")
// private String winSdkKey;
//
// @Value(value = "${linuxSdkkey}")
// private String linuxSdkKey;
//
//
// public Integer threadPoolSize=5;
//
// private GenericObjectPool<FaceEngine> faceEngineGenericObjectPool;
//
// public ArcsoftFaceUtil(){
//
// String sdkLibPath = getClass().getResource(getOsName()).getPath();
// String sdkKey = getSdkKey(sdkLibPath);
// // 对象池工厂
// FaceEnginePoolFactory personPoolFactory = new FaceEnginePoolFactory(appId,sdkKey,sdkLibPath);
// // 对象池配置
// GenericObjectPoolConfig<FaceEngine> objectPoolConfig = new GenericObjectPoolConfig<>();
// objectPoolConfig.setMaxTotal(threadPoolSize);
// AbandonedConfig abandonedConfig = new AbandonedConfig();
// //在Maintenance的时候检查是否有泄漏
// abandonedConfig.setRemoveAbandonedOnMaintenance(true);
// //borrow 的时候检查泄漏
// abandonedConfig.setRemoveAbandonedOnBorrow(true);
// //如果一个对象borrow之后10秒还没有返还给pool,认为是泄漏的对象
// abandonedConfig.setRemoveAbandonedTimeout(10);
// // 对象池
// faceEngineGenericObjectPool = new GenericObjectPool<>(personPoolFactory, objectPoolConfig);
// faceEngineGenericObjectPool.setAbandonedConfig(abandonedConfig);
// faceEngineGenericObjectPool.setTimeBetweenEvictionRunsMillis(5000); //5秒运行一次维护任务
// log.info("引擎池开启成功");
// }
//
// private String getOsName() {
// String os = System.getProperty("os.name");
// String osName = os.toLowerCase().startsWith("win") ? "/face_lib/win64" : "/face_lib/linux";
// return osName;
// }
//
// private String getSdkKey(String sdkLibPath) {
// return sdkLibPath.equals("/face_lib/win64") ? winSdkKey : linuxSdkKey;
// }
//
// /**
// * 人脸检测
// *
// * @param fileInputStream
// * @return
// */
// public List<FaceInfo> faceFind(InputStream fileInputStream) throws IOException {
// FaceEngine faceEngine = null;
// try {
// faceEngine = faceEngineGenericObjectPool.borrowObject();
// ImageInfo imageInfo = getRGBData(fileInputStream);
// List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
// int errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
// return faceInfoList;
// } catch (Exception e) {
// log.error("人脸检测出现了异常");
// e.printStackTrace();
// return new ArrayList<FaceInfo>();
// } finally {
// fileInputStream.close();
// // 回收对象到对象池
// if (faceEngine != null) {
// faceEngineGenericObjectPool.returnObject(faceEngine);
// }
// }
//
// }
//
// /**
// * 人脸截取
// *
// * @param fileInputStream
// * @param rect
// * @return
// */
// public String faceCrop(InputStream fileInputStream, Rect rect) {
// try {
// ByteArrayOutputStream stream = new ByteArrayOutputStream();
// BufferedImage bufImage = ImageIO.read(fileInputStream);
// int height = bufImage.getHeight();
// int width = bufImage.getWidth();
// int top = rect.getTop();
// int bottom = rect.getBottom();
// int left = rect.getLeft();
// int right = rect.getRight();
// //System.out.println(top + "-" + bottom + "-" + left + "-" + right);
// try {
// BufferedImage subimage = bufImage.getSubimage(left, top, right - left, bottom - left);
// ImageIO.write(subimage, "png", stream);
// String base64 = Base64.encode(stream.toByteArray());
// return base64;
// }catch (Exception e){
// return null;
// }finally {
// stream.close();
// fileInputStream.close();
// }
// } catch (IOException e) {
// e.printStackTrace();
// }finally {
//
// }
// return null;
// }
//
// /**
// * 人脸特征值提取
// */
// public byte[] faceFeature(byte[] bytes) {
// FaceEngine faceEngine = null;
//
// try {
// faceEngine = faceEngineGenericObjectPool.borrowObject();
// ImageInfo imageInfo = getRGBData(bytes);
// //人脸检测得到人脸列表
// List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
// faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
// FaceFeature faceFeature = new FaceFeature();
// faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
// byte[] featureData = faceFeature.getFeatureData();
// return featureData;
// } catch (Exception e) {
// log.error("人脸特征值提取出现了异常");
// e.printStackTrace();
// return new byte[0];
// } finally {
// // 回收对象到对象池
// if (faceEngine != null) {
// faceEngineGenericObjectPool.returnObject(faceEngine);
// }
// }
// }
//
// /**
// * 人脸对比
// */
// public float faceCompared(byte [] source,byte [] des) throws IOException {
// FaceEngine faceEngine = null;
// try {
// faceEngine = faceEngineGenericObjectPool.borrowObject();
// FaceFeature targetFaceFeature = new FaceFeature();
// targetFaceFeature.setFeatureData(source);
// FaceFeature sourceFaceFeature = new FaceFeature();
// sourceFaceFeature.setFeatureData(des);
// FaceSimilar faceSimilar = new FaceSimilar();
// faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
// float score = faceSimilar.getScore();
// return score;
// } catch (Exception e) {
// log.error("人脸对比出现了异常");
// e.printStackTrace();
// return 0;
// } finally {
// // 回收对象到对象池
// if (faceEngine != null) {
// faceEngineGenericObjectPool.returnObject(faceEngine);
// }
// }
// }
//
// /**
// * 人脸搜索
// */
// public List<SysFaceEntity> faceSearch(FaceFeature targetFaceFeature,List<SysFaceEntity> sourceList) throws IOException {
// FaceEngine faceEngine = null;
// List<SysFaceEntity> resultFaceInfoList = Lists.newLinkedList();//识别到的人脸列表
// try {
// faceEngine = faceEngineGenericObjectPool.borrowObject();
//
// for(SysFaceEntity faceUserInfo : sourceList) {
// FaceFeature sourceFaceFeature = new FaceFeature();
// sourceFaceFeature.setFeatureData(faceUserInfo.getFaceFeature());
// FaceSimilar faceSimilar = new FaceSimilar();
// faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
// float score = faceSimilar.getScore();
// if(score > 0.8){
// faceUserInfo.setSimilarValue(plusHundred(score));
// resultFaceInfoList.add(faceUserInfo);
// }
// }
// } catch (Exception e) {
// log.error("人脸对比出现了异常");
// e.printStackTrace();
// } finally {
// // 回收对象到对象池
// if (faceEngine != null) {
// faceEngineGenericObjectPool.returnObject(faceEngine);
// }
// }
// return resultFaceInfoList;
// }
//
// private int plusHundred(Float value) {
// BigDecimal target = new BigDecimal(value);
// BigDecimal hundred = new BigDecimal(100f);
// return target.multiply(hundred).intValue();
// }
//
//}
package com.mortals.xhx.face.factory;
import com.arcsoft.face.ActiveFileInfo;
import com.arcsoft.face.EngineConfiguration;
import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.FunctionConfiguration;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
@Slf4j
public class FaceEnginePoolFactory extends BasePooledObjectFactory<FaceEngine> {
private String appId;
private String sdkKey;
private String sdkLibPath;
public FaceEnginePoolFactory(String appId, String sdkKey, String sdkLibPath) {
this.appId = appId;
this.sdkKey = sdkKey;
this.sdkLibPath = sdkLibPath;
//this.sdkLibPath = "D:\\face\\win64";
}
/**
* 在对象池中创建对象
* @return
* @throws Exception
*/
@Override
public FaceEngine create() throws Exception {
FaceEngine faceEngine = new FaceEngine(sdkLibPath);
//激活引擎
int errorCode = faceEngine.activeOnline(appId, sdkKey);
if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
log.warn("引擎激活失败");
}
ActiveFileInfo activeFileInfo=new ActiveFileInfo();
errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
log.warn("获取激活文件信息失败");
}
//引擎配置
EngineConfiguration engineConfiguration = new EngineConfiguration();
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
engineConfiguration.setDetectFaceMaxNum(10);
engineConfiguration.setDetectFaceScaleVal(16);
//功能配置
FunctionConfiguration functionConfiguration = new FunctionConfiguration();
functionConfiguration.setSupportAge(true);
functionConfiguration.setSupportFace3dAngle(true);
functionConfiguration.setSupportFaceDetect(true);
functionConfiguration.setSupportFaceRecognition(true);
functionConfiguration.setSupportGender(true);
functionConfiguration.setSupportLiveness(true);
functionConfiguration.setSupportIRLiveness(true);
engineConfiguration.setFunctionConfiguration(functionConfiguration);
//初始化引擎
errorCode = faceEngine.init(engineConfiguration);
if (errorCode != ErrorInfo.MOK.getValue()) {
log.error("初始化引擎失败");
}
return faceEngine;
}
/**
* 包装对象
* @param faceEngine
* @return
*/
@Override
public PooledObject<FaceEngine> wrap(FaceEngine faceEngine) {
return new DefaultPooledObject<>(faceEngine);
}
/**
* 销毁对象
* @param faceEngine 对象池
* @throws Exception 异常
*/
@Override
public void destroyObject(PooledObject<FaceEngine> faceEngine) throws Exception {
super.destroyObject(faceEngine);
}
/**
* 校验对象是否可用
* @param faceEngine 对象池
* @return 对象是否可用结果,boolean
*/
@Override
public boolean validateObject(PooledObject<FaceEngine> faceEngine) {
return super.validateObject(faceEngine);
}
/**
* 激活钝化的对象系列操作
* @param faceEngine 对象池
* @throws Exception 异常信息
*/
@Override
public void activateObject(PooledObject<FaceEngine> faceEngine) throws Exception {
super.activateObject(faceEngine);
}
/**
* 钝化未使用的对象
* @param faceEngine 对象池
* @throws Exception 异常信息
*/
@Override
public void passivateObject(PooledObject<FaceEngine> faceEngine) throws Exception {
super.passivateObject(faceEngine);
}
}
//package com.mortals.xhx.face.factory;
//
//import com.arcsoft.face.ActiveFileInfo;
//import com.arcsoft.face.EngineConfiguration;
//import com.arcsoft.face.FaceEngine;
//import com.arcsoft.face.FunctionConfiguration;
//import com.arcsoft.face.enums.DetectMode;
//import com.arcsoft.face.enums.DetectOrient;
//import com.arcsoft.face.enums.ErrorInfo;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.pool2.BasePooledObjectFactory;
//import org.apache.commons.pool2.PooledObject;
//import org.apache.commons.pool2.impl.DefaultPooledObject;
//
//@Slf4j
//public class FaceEnginePoolFactory extends BasePooledObjectFactory<FaceEngine> {
//
// private String appId;
// private String sdkKey;
// private String sdkLibPath;
//
// public FaceEnginePoolFactory(String appId, String sdkKey, String sdkLibPath) {
// this.appId = appId;
// this.sdkKey = sdkKey;
// this.sdkLibPath = sdkLibPath;
// //this.sdkLibPath = "D:\\face\\win64";
// }
//
// /**
// * 在对象池中创建对象
// * @return
// * @throws Exception
// */
// @Override
// public FaceEngine create() throws Exception {
// FaceEngine faceEngine = new FaceEngine(sdkLibPath);
// //激活引擎
// int errorCode = faceEngine.activeOnline(appId, sdkKey);
// if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
// log.warn("引擎激活失败");
// }
// ActiveFileInfo activeFileInfo=new ActiveFileInfo();
// errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
// if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
// log.warn("获取激活文件信息失败");
// }
// //引擎配置
// EngineConfiguration engineConfiguration = new EngineConfiguration();
// engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
// engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
// engineConfiguration.setDetectFaceMaxNum(10);
// engineConfiguration.setDetectFaceScaleVal(16);
// //功能配置
// FunctionConfiguration functionConfiguration = new FunctionConfiguration();
// functionConfiguration.setSupportAge(true);
// functionConfiguration.setSupportFace3dAngle(true);
// functionConfiguration.setSupportFaceDetect(true);
// functionConfiguration.setSupportFaceRecognition(true);
// functionConfiguration.setSupportGender(true);
// functionConfiguration.setSupportLiveness(true);
// functionConfiguration.setSupportIRLiveness(true);
// engineConfiguration.setFunctionConfiguration(functionConfiguration);
// //初始化引擎
// errorCode = faceEngine.init(engineConfiguration);
//
// if (errorCode != ErrorInfo.MOK.getValue()) {
// log.error("初始化引擎失败");
// }
// return faceEngine;
// }
//
// /**
// * 包装对象
// * @param faceEngine
// * @return
// */
// @Override
// public PooledObject<FaceEngine> wrap(FaceEngine faceEngine) {
// return new DefaultPooledObject<>(faceEngine);
// }
// /**
// * 销毁对象
// * @param faceEngine 对象池
// * @throws Exception 异常
// */
// @Override
// public void destroyObject(PooledObject<FaceEngine> faceEngine) throws Exception {
// super.destroyObject(faceEngine);
// }
//
// /**
// * 校验对象是否可用
// * @param faceEngine 对象池
// * @return 对象是否可用结果,boolean
// */
// @Override
// public boolean validateObject(PooledObject<FaceEngine> faceEngine) {
// return super.validateObject(faceEngine);
// }
//
// /**
// * 激活钝化的对象系列操作
// * @param faceEngine 对象池
// * @throws Exception 异常信息
// */
// @Override
// public void activateObject(PooledObject<FaceEngine> faceEngine) throws Exception {
// super.activateObject(faceEngine);
// }
//
// /**
// * 钝化未使用的对象
// * @param faceEngine 对象池
// * @throws Exception 异常信息
// */
// @Override
// public void passivateObject(PooledObject<FaceEngine> faceEngine) throws Exception {
// super.passivateObject(faceEngine);
// }
//
//}
package com.mortals.xhx.module.identity.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.img.Img;
import cn.hutool.core.util.IdUtil;
import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.FaceFeature;
import com.arcsoft.face.FaceSimilar;
import com.google.common.collect.Lists;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.common.utils.FaceUtil;
import com.mortals.xhx.face.ArcsoftFaceUtil;
import com.mortals.xhx.module.identity.dao.SysFaceDao;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import com.mortals.xhx.module.identity.model.SysIdentityEntity;
import com.mortals.xhx.module.identity.model.vo.FaceInfoResVO;
import com.mortals.xhx.module.identity.service.SysFaceService;
import com.mortals.xhx.module.identity.service.SysIdentityService;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;
import java.util.stream.Collectors;
/**
* SysFaceService
* 人脸识别信息 service实现
*
* @author zxfei
* @date 2022-08-03
*/
@Service("sysFaceService")
public class SysFaceServiceImpl extends AbstractCRUDServiceImpl<SysFaceDao, SysFaceEntity, String> implements SysFaceService {
private Integer passRate = 80;
public static final int WIDTH = 100;
public static final int HEIGHT = 100;
@Value(value = "${faceAppId}")
private String appId;
@Value(value = "${winSdkKey}")
private String winSdkKey;
@Value(value = "${linuxSdkkey}")
private String linuxSdkKey;
public Integer threadPoolSize = 5;
@Autowired
private FaceUtil faceUtil;
@Autowired
private SysIdentityService sysIdentityService;
@Autowired
private ArcsoftFaceUtil arcsoftFaceUtil;
private ExecutorService executorService;
@PostConstruct
public void init() {
executorService = Executors.newFixedThreadPool(threadPoolSize);
}
@Override
protected void saveBefore(SysFaceEntity entity, Context context) throws AppException {
//非系统自增,需这里设置主键
entity.setId(IdUtil.fastSimpleUUID());
super.saveBefore(entity, context);
}
@Override
public FaceInfoResVO uploadImage(MultipartFile multipartFile, String name, String idCard, String placeId, String placeName) throws AppException {
String clientName = multipartFile.getOriginalFilename();
if(!(clientName.endsWith(".png") || clientName.endsWith(".jpg") || clientName.endsWith(".jpeg"))){
throw new AppException("请上传图片格式(" + clientName + ")");
}
FaceInfoResVO resVO = new FaceInfoResVO();
SysIdentityEntity idEntityReqVO = new SysIdentityEntity();
idEntityReqVO.setName(name);
idEntityReqVO.setIdCard(idCard);
String entityId = sysIdentityService.saveIdEntity(idEntityReqVO).getId();
SysFaceEntity query = new SysFaceEntity();
query.setIdCard(entityId);
List<SysFaceEntity> sysFaceList = dao.getList(query);
if(CollectionUtils.isNotEmpty(sysFaceList)){
throw new AppException("该用户(" + idEntityReqVO.getName() + "_" + idEntityReqVO.getIdCard() + ")人脸数据已存在");
}
try {
byte[] file = multipartFile.getBytes();
//激活引擎
FaceEngine faceEngine = faceUtil.initFace(appId, getSdkKey());
byte[] featureData = faceUtil.featureData(faceEngine, file);
//创建缩略图
BufferedImage image = Thumbnails.of(multipartFile.getInputStream()).size(WIDTH, HEIGHT).asBufferedImage();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//此方法会造成png图片有阴影
// ImageIO.write(image, "jpg", byteArrayOutputStream);
Img.from(image).write(byteArrayOutputStream);
byteArrayOutputStream.flush();
SysFaceEntity sysFace = new SysFaceEntity();
sysFace.setId(IdUtil.fastSimpleUUID());
sysFace.setFace(byteArrayOutputStream.toByteArray());
sysFace.setFaceFeature(featureData);
sysFace.setIdCard(entityId);
sysFace.setPlaceId(placeId);
sysFace.setPlaceName(placeName);
sysFace.setCreateTime(new Date());
sysFace.setUpdateTime(sysFace.getCreateTime());
sysFace.setDeleted(0);
dao.insert(sysFace);
resVO.setFace(Base64.getEncoder().encodeToString(file));
resVO.setFaceFeature(Base64.getEncoder().encodeToString(featureData));
resVO.setIdCard(idCard);
resVO.setName(name);
resVO.setPhone("");
resVO.setId(sysFace.getId());
} catch (IOException e) {
log.error("提取特征失败:", e);
}
return resVO;
}
@Override
public List<FaceInfoResVO> findFaceList(String placeId) throws AppException {
SysFaceEntity query = new SysFaceEntity();
query.setPlaceId(placeId);
List<SysFaceEntity> sysFaceList = dao.getList(query);
if(CollectionUtils.isEmpty(sysFaceList)){
throw new AppException("该场所无人脸数据");
}
return sysFaceList.stream().map(o -> {
FaceInfoResVO resVO = new FaceInfoResVO();
SysIdentityEntity resVO1 = sysIdentityService.findIdEntityDetail(o.getIdCard(), 1);
resVO.setId(o.getId());
resVO.setPlaceId(o.getPlaceId());
resVO.setPlaceName(o.getPlaceName());
resVO.setCardId(resVO1.getId());
resVO.setName(resVO1.getName());
resVO.setPhone(resVO1.getPhone());
resVO.setFace(Base64.getEncoder().encodeToString(o.getFace()));
resVO.setFaceFeature(Base64.getEncoder().encodeToString(o.getFaceFeature()));
return resVO;
}).collect(Collectors.toList());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void batchAddFace(List<MultipartFile> files, String placeId, String placeName) {
for (int j = 0; j < files.size(); j++) {
String fileName = files.get(j).getOriginalFilename();
if(StringUtils.isEmpty(fileName)){
throw new AppException("文件名称(" + fileName + ")不能为空!");
}
String[] info = fileName.split("/");
if(info.length != 2){
throw new AppException("(" + fileName + ")文件命名错误,请按照规定文件模版上传!");
}
String[] infos = info[1].split("\\.");
if(infos.length != 2){
throw new AppException("(" + fileName + ")文件命名错误,请按照规定文件模版上传!");
}
String[] strings = infos[0].split("_");
if(strings.length != 2){
throw new AppException("(" + fileName + ")文件命名错误,请按照规定文件模版上传!");
}
uploadImage(files.get(j), strings[0], strings[1], placeId, placeName);
}
}
private String getSdkKey() {
return faceUtil.getOsName().equals("/win") ? winSdkKey : linuxSdkKey;
}
@Override
public List<FaceInfoResVO> searchUserByFace(byte[] bytes) throws InterruptedException, ExecutionException{
List<SysFaceEntity> resultFaceInfoList = Lists.newLinkedList();//识别到的人脸列表
byte[] faceFeature = arcsoftFaceUtil.faceFeature(bytes);
FaceFeature targetFaceFeature = new FaceFeature();
targetFaceFeature.setFeatureData(faceFeature);
List<SysFaceEntity> faceInfoList = this.find(new SysFaceEntity());
List<List<SysFaceEntity>> faceUserInfoPartList = Lists.partition(faceInfoList, 1000);//分成1000一组,多线程处理
CompletionService<List<SysFaceEntity>> completionService = new ExecutorCompletionService(executorService);
for (List<SysFaceEntity> part : faceUserInfoPartList) {
completionService.submit(new CompareFaceTask(part, targetFaceFeature));
}
for (int i = 0; i < faceUserInfoPartList.size(); i++) {
List<SysFaceEntity> faceUserInfoList = completionService.take().get();
if (CollectionUtil.isNotEmpty(faceInfoList)) {
resultFaceInfoList.addAll(faceUserInfoList);
}
}
resultFaceInfoList.sort((h1, h2) -> h2.getSimilarValue().compareTo(h1.getSimilarValue()));//从大到小排序
return resultFaceInfoList.stream().map(o -> {
FaceInfoResVO resVO = new FaceInfoResVO();
SysIdentityEntity resVO1 = sysIdentityService.findIdEntityDetail(o.getIdCard(), 1);
resVO.setId(o.getId());
resVO.setPlaceId(o.getPlaceId());
resVO.setPlaceName(o.getPlaceName());
resVO.setCardId(resVO1.getId());
resVO.setName(resVO1.getName());
resVO.setPhone(resVO1.getPhone());
resVO.setFace(Base64.getEncoder().encodeToString(o.getFace()));
resVO.setFaceFeature(Base64.getEncoder().encodeToString(o.getFaceFeature()));
return resVO;
}).collect(Collectors.toList());
}
private class CompareFaceTask implements Callable<List<SysFaceEntity>> {
private List<SysFaceEntity> faceUserInfoList;
private FaceFeature targetFaceFeature;
public CompareFaceTask(List<SysFaceEntity> faceUserInfoList, FaceFeature targetFaceFeature) {
this.faceUserInfoList = faceUserInfoList;
this.targetFaceFeature = targetFaceFeature;
}
@Override
public List<SysFaceEntity> call() throws Exception {
return arcsoftFaceUtil.faceSearch(targetFaceFeature,faceUserInfoList);
}
}
}
\ No newline at end of file
//package com.mortals.xhx.module.identity.service.impl;
//
//import cn.hutool.core.collection.CollectionUtil;
//import cn.hutool.core.img.Img;
//import cn.hutool.core.util.IdUtil;
//import com.arcsoft.face.FaceEngine;
//import com.arcsoft.face.FaceFeature;
//import com.arcsoft.face.FaceSimilar;
//import com.google.common.collect.Lists;
//import com.mortals.framework.exception.AppException;
//import com.mortals.framework.model.Context;
//import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
//import com.mortals.framework.util.StringUtils;
//import com.mortals.xhx.common.utils.FaceUtil;
//import com.mortals.xhx.face.ArcsoftFaceUtil;
//import com.mortals.xhx.module.identity.dao.SysFaceDao;
//import com.mortals.xhx.module.identity.model.SysFaceEntity;
//import com.mortals.xhx.module.identity.model.SysIdentityEntity;
//import com.mortals.xhx.module.identity.model.vo.FaceInfoResVO;
//import com.mortals.xhx.module.identity.service.SysFaceService;
//import com.mortals.xhx.module.identity.service.SysIdentityService;
//import net.coobird.thumbnailator.Thumbnails;
//import org.apache.commons.collections4.CollectionUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.web.multipart.MultipartFile;
//
//import javax.annotation.PostConstruct;
//import java.awt.image.BufferedImage;
//import java.io.ByteArrayOutputStream;
//import java.io.IOException;
//import java.util.Base64;
//import java.util.Date;
//import java.util.List;
//import java.util.concurrent.*;
//import java.util.stream.Collectors;
//
///**
//* SysFaceService
//* 人脸识别信息 service实现
//*
//* @author zxfei
//* @date 2022-08-03
//*/
//@Service("sysFaceService")
//public class SysFaceServiceImpl extends AbstractCRUDServiceImpl<SysFaceDao, SysFaceEntity, String> implements SysFaceService {
//
// private Integer passRate = 80;
//
// public static final int WIDTH = 100;
// public static final int HEIGHT = 100;
//
// @Value(value = "${faceAppId}")
// private String appId;
//
// @Value(value = "${winSdkKey}")
// private String winSdkKey;
//
// @Value(value = "${linuxSdkkey}")
// private String linuxSdkKey;
//
// public Integer threadPoolSize = 5;
//
// @Autowired
// private FaceUtil faceUtil;
//
// @Autowired
// private SysIdentityService sysIdentityService;
//
// @Autowired
// private ArcsoftFaceUtil arcsoftFaceUtil;
//
// private ExecutorService executorService;
//
// @PostConstruct
// public void init() {
// executorService = Executors.newFixedThreadPool(threadPoolSize);
// }
//
// @Override
// protected void saveBefore(SysFaceEntity entity, Context context) throws AppException {
// //非系统自增,需这里设置主键
// entity.setId(IdUtil.fastSimpleUUID());
// super.saveBefore(entity, context);
// }
//
// @Override
// public FaceInfoResVO uploadImage(MultipartFile multipartFile, String name, String idCard, String placeId, String placeName) throws AppException {
// String clientName = multipartFile.getOriginalFilename();
// if(!(clientName.endsWith(".png") || clientName.endsWith(".jpg") || clientName.endsWith(".jpeg"))){
// throw new AppException("请上传图片格式(" + clientName + ")");
// }
// FaceInfoResVO resVO = new FaceInfoResVO();
// SysIdentityEntity idEntityReqVO = new SysIdentityEntity();
// idEntityReqVO.setName(name);
// idEntityReqVO.setIdCard(idCard);
// String entityId = sysIdentityService.saveIdEntity(idEntityReqVO).getId();
// SysFaceEntity query = new SysFaceEntity();
// query.setIdCard(entityId);
// List<SysFaceEntity> sysFaceList = dao.getList(query);
// if(CollectionUtils.isNotEmpty(sysFaceList)){
// throw new AppException("该用户(" + idEntityReqVO.getName() + "_" + idEntityReqVO.getIdCard() + ")人脸数据已存在");
// }
//
// try {
// byte[] file = multipartFile.getBytes();
// //激活引擎
// FaceEngine faceEngine = faceUtil.initFace(appId, getSdkKey());
// byte[] featureData = faceUtil.featureData(faceEngine, file);
// //创建缩略图
// BufferedImage image = Thumbnails.of(multipartFile.getInputStream()).size(WIDTH, HEIGHT).asBufferedImage();
// ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// //此方法会造成png图片有阴影
//// ImageIO.write(image, "jpg", byteArrayOutputStream);
// Img.from(image).write(byteArrayOutputStream);
// byteArrayOutputStream.flush();
// SysFaceEntity sysFace = new SysFaceEntity();
// sysFace.setId(IdUtil.fastSimpleUUID());
// sysFace.setFace(byteArrayOutputStream.toByteArray());
// sysFace.setFaceFeature(featureData);
// sysFace.setIdCard(entityId);
// sysFace.setPlaceId(placeId);
// sysFace.setPlaceName(placeName);
// sysFace.setCreateTime(new Date());
// sysFace.setUpdateTime(sysFace.getCreateTime());
// sysFace.setDeleted(0);
// dao.insert(sysFace);
// resVO.setFace(Base64.getEncoder().encodeToString(file));
// resVO.setFaceFeature(Base64.getEncoder().encodeToString(featureData));
// resVO.setIdCard(idCard);
// resVO.setName(name);
// resVO.setPhone("");
// resVO.setId(sysFace.getId());
// } catch (IOException e) {
// log.error("提取特征失败:", e);
// }
// return resVO;
// }
//
// @Override
// public List<FaceInfoResVO> findFaceList(String placeId) throws AppException {
// SysFaceEntity query = new SysFaceEntity();
// query.setPlaceId(placeId);
// List<SysFaceEntity> sysFaceList = dao.getList(query);
// if(CollectionUtils.isEmpty(sysFaceList)){
// throw new AppException("该场所无人脸数据");
// }
// return sysFaceList.stream().map(o -> {
// FaceInfoResVO resVO = new FaceInfoResVO();
// SysIdentityEntity resVO1 = sysIdentityService.findIdEntityDetail(o.getIdCard(), 1);
// resVO.setId(o.getId());
// resVO.setPlaceId(o.getPlaceId());
// resVO.setPlaceName(o.getPlaceName());
// resVO.setCardId(resVO1.getId());
// resVO.setName(resVO1.getName());
// resVO.setPhone(resVO1.getPhone());
// resVO.setFace(Base64.getEncoder().encodeToString(o.getFace()));
// resVO.setFaceFeature(Base64.getEncoder().encodeToString(o.getFaceFeature()));
// return resVO;
// }).collect(Collectors.toList());
// }
//
// @Override
// @Transactional(rollbackFor = Exception.class)
// public void batchAddFace(List<MultipartFile> files, String placeId, String placeName) {
// for (int j = 0; j < files.size(); j++) {
// String fileName = files.get(j).getOriginalFilename();
// if(StringUtils.isEmpty(fileName)){
// throw new AppException("文件名称(" + fileName + ")不能为空!");
// }
// String[] info = fileName.split("/");
// if(info.length != 2){
// throw new AppException("(" + fileName + ")文件命名错误,请按照规定文件模版上传!");
// }
// String[] infos = info[1].split("\\.");
// if(infos.length != 2){
// throw new AppException("(" + fileName + ")文件命名错误,请按照规定文件模版上传!");
// }
// String[] strings = infos[0].split("_");
// if(strings.length != 2){
// throw new AppException("(" + fileName + ")文件命名错误,请按照规定文件模版上传!");
// }
// uploadImage(files.get(j), strings[0], strings[1], placeId, placeName);
// }
// }
//
// private String getSdkKey() {
// return faceUtil.getOsName().equals("/win") ? winSdkKey : linuxSdkKey;
// }
//
// @Override
// public List<FaceInfoResVO> searchUserByFace(byte[] bytes) throws InterruptedException, ExecutionException{
// List<SysFaceEntity> resultFaceInfoList = Lists.newLinkedList();//识别到的人脸列表
//
// byte[] faceFeature = arcsoftFaceUtil.faceFeature(bytes);
// FaceFeature targetFaceFeature = new FaceFeature();
// targetFaceFeature.setFeatureData(faceFeature);
// List<SysFaceEntity> faceInfoList = this.find(new SysFaceEntity());
// List<List<SysFaceEntity>> faceUserInfoPartList = Lists.partition(faceInfoList, 1000);//分成1000一组,多线程处理
// CompletionService<List<SysFaceEntity>> completionService = new ExecutorCompletionService(executorService);
// for (List<SysFaceEntity> part : faceUserInfoPartList) {
// completionService.submit(new CompareFaceTask(part, targetFaceFeature));
// }
// for (int i = 0; i < faceUserInfoPartList.size(); i++) {
// List<SysFaceEntity> faceUserInfoList = completionService.take().get();
// if (CollectionUtil.isNotEmpty(faceInfoList)) {
// resultFaceInfoList.addAll(faceUserInfoList);
// }
// }
//
// resultFaceInfoList.sort((h1, h2) -> h2.getSimilarValue().compareTo(h1.getSimilarValue()));//从大到小排序
//
// return resultFaceInfoList.stream().map(o -> {
// FaceInfoResVO resVO = new FaceInfoResVO();
// SysIdentityEntity resVO1 = sysIdentityService.findIdEntityDetail(o.getIdCard(), 1);
// resVO.setId(o.getId());
// resVO.setPlaceId(o.getPlaceId());
// resVO.setPlaceName(o.getPlaceName());
// resVO.setCardId(resVO1.getId());
// resVO.setName(resVO1.getName());
// resVO.setPhone(resVO1.getPhone());
// resVO.setFace(Base64.getEncoder().encodeToString(o.getFace()));
// resVO.setFaceFeature(Base64.getEncoder().encodeToString(o.getFaceFeature()));
// return resVO;
// }).collect(Collectors.toList());
// }
//
// private class CompareFaceTask implements Callable<List<SysFaceEntity>> {
//
// private List<SysFaceEntity> faceUserInfoList;
// private FaceFeature targetFaceFeature;
//
//
// public CompareFaceTask(List<SysFaceEntity> faceUserInfoList, FaceFeature targetFaceFeature) {
// this.faceUserInfoList = faceUserInfoList;
// this.targetFaceFeature = targetFaceFeature;
// }
//
// @Override
// public List<SysFaceEntity> call() throws Exception {
//
// return arcsoftFaceUtil.faceSearch(targetFaceFeature,faceUserInfoList);
// }
//
// }
//}
\ No newline at end of file
package com.mortals.xhx.module.identity.web;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.model.Context;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import com.mortals.xhx.module.identity.model.vo.FaceInfoResVO;
import com.mortals.xhx.module.identity.service.SysFaceService;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* 人脸识别信息
*
* @author zxfei
* @date 2022-08-03
*/
@RestController
@RequestMapping("face")
public class SysFaceController extends BaseCRUDJsonBodyMappingController<SysFaceService,SysFaceEntity,String> {
public SysFaceController(){
super.setModuleDesc( "人脸识别信息");
}
@Override
protected void init(Map<String, Object> model, Context context) {
super.init(model, context);
}
@PostMapping({"uploadImage"})
@UnAuth
public String uploadImage(@RequestPart("file") MultipartFile file,
@RequestParam("name") String name,
@RequestParam("idCard") String idCard,
@RequestParam(value = "placeId") String placeId,
@RequestParam(value = "placeName") String placeName) {
Map<String, Object> model = new HashMap();
JSONObject ret = new JSONObject();
String busiDesc = "人脸特征解析";
Context context = this.getContext();
try {
FaceInfoResVO resVO = service.uploadImage(file, name, idCard, placeId, placeName);
model.put("data",resVO);
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var8) {
this.doException(this.request, busiDesc, model, var8);
Object msg = model.get("message_info");
return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
}
this.init(model, context);
ret.put("data", model.get("data"));
ret.put("code", 1);
ret.put("msg", model.remove("message_info"));
return ret.toJSONString();
}
@GetMapping({"findFaceList"})
@UnAuth
public String findFaceList(@RequestParam("placeId") String placeId) {
Map<String, Object> model = new HashMap();
JSONObject ret = new JSONObject();
String busiDesc = "下发人脸列表";
Context context = this.getContext();
try {
List<FaceInfoResVO> list = service.findFaceList(placeId);
model.put("data",list);
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var8) {
this.doException(this.request, busiDesc, model, var8);
Object msg = model.get("message_info");
return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
}
this.init(model, context);
ret.put("data", model.get("data"));
ret.put("code", 1);
ret.put("msg", model.remove("message_info"));
return ret.toJSONString();
}
@PostMapping({"batchAddFace"})
@UnAuth
public String batchAddFace(@RequestPart("files") List<MultipartFile> files,
@RequestParam("placeId") String placeId,
@RequestParam("placeName") String placeName) {
Map<String, Object> model = new HashMap();
JSONObject ret = new JSONObject();
String busiDesc = "批量上传人脸";
Context context = this.getContext();
try {
service.batchAddFace(files, placeId, placeName);
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var8) {
this.doException(this.request, busiDesc, model, var8);
Object msg = model.get("message_info");
return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
}
this.init(model, context);
ret.put("data", null);
ret.put("code", 1);
ret.put("msg", model.remove("message_info"));
return ret.toJSONString();
}
@PostMapping({"search"})
@UnAuth
public String search(@RequestPart("file") MultipartFile file) {
Map<String, Object> model = new HashMap();
JSONObject ret = new JSONObject();
String busiDesc = "人脸识别";
Context context = this.getContext();
try {
List<FaceInfoResVO> list = service.searchUserByFace(file.getBytes());
model.put("data",list);
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var8) {
this.doException(this.request, busiDesc, model, var8);
Object msg = model.get("message_info");
return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
}
this.init(model, context);
ret.put("data", model.get("data"));
ret.put("code", 1);
ret.put("msg", model.remove("message_info"));
return ret.toJSONString();
}
}
\ No newline at end of file
//package com.mortals.xhx.module.identity.web;
//
//import com.alibaba.fastjson.JSONObject;
//import com.mortals.framework.annotation.UnAuth;
//import com.mortals.framework.model.Context;
//import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
//import com.mortals.xhx.module.identity.model.SysFaceEntity;
//import com.mortals.xhx.module.identity.model.vo.FaceInfoResVO;
//import com.mortals.xhx.module.identity.service.SysFaceService;
//import org.springframework.web.bind.annotation.*;
//import org.springframework.web.multipart.MultipartFile;
//
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
///**
//*
//* 人脸识别信息
//*
//* @author zxfei
//* @date 2022-08-03
//*/
//@RestController
//@RequestMapping("face")
//public class SysFaceController extends BaseCRUDJsonBodyMappingController<SysFaceService,SysFaceEntity,String> {
//
// public SysFaceController(){
// super.setModuleDesc( "人脸识别信息");
// }
//
// @Override
// protected void init(Map<String, Object> model, Context context) {
// super.init(model, context);
// }
//
//
//
// @PostMapping({"uploadImage"})
// @UnAuth
// public String uploadImage(@RequestPart("file") MultipartFile file,
// @RequestParam("name") String name,
// @RequestParam("idCard") String idCard,
// @RequestParam(value = "placeId") String placeId,
// @RequestParam(value = "placeName") String placeName) {
// Map<String, Object> model = new HashMap();
// JSONObject ret = new JSONObject();
// String busiDesc = "人脸特征解析";
// Context context = this.getContext();
//
// try {
// FaceInfoResVO resVO = service.uploadImage(file, name, idCard, placeId, placeName);
// model.put("data",resVO);
// this.recordSysLog(this.request, busiDesc + " 【成功】");
// } catch (Exception var8) {
// this.doException(this.request, busiDesc, model, var8);
// Object msg = model.get("message_info");
// return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
// }
//
// this.init(model, context);
// ret.put("data", model.get("data"));
// ret.put("code", 1);
// ret.put("msg", model.remove("message_info"));
// return ret.toJSONString();
// }
//
// @GetMapping({"findFaceList"})
// @UnAuth
// public String findFaceList(@RequestParam("placeId") String placeId) {
// Map<String, Object> model = new HashMap();
// JSONObject ret = new JSONObject();
// String busiDesc = "下发人脸列表";
// Context context = this.getContext();
// try {
// List<FaceInfoResVO> list = service.findFaceList(placeId);
// model.put("data",list);
// this.recordSysLog(this.request, busiDesc + " 【成功】");
// } catch (Exception var8) {
// this.doException(this.request, busiDesc, model, var8);
// Object msg = model.get("message_info");
// return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
// }
//
// this.init(model, context);
// ret.put("data", model.get("data"));
// ret.put("code", 1);
// ret.put("msg", model.remove("message_info"));
// return ret.toJSONString();
// }
//
// @PostMapping({"batchAddFace"})
// @UnAuth
// public String batchAddFace(@RequestPart("files") List<MultipartFile> files,
// @RequestParam("placeId") String placeId,
// @RequestParam("placeName") String placeName) {
// Map<String, Object> model = new HashMap();
// JSONObject ret = new JSONObject();
// String busiDesc = "批量上传人脸";
// Context context = this.getContext();
//
// try {
// service.batchAddFace(files, placeId, placeName);
// this.recordSysLog(this.request, busiDesc + " 【成功】");
// } catch (Exception var8) {
// this.doException(this.request, busiDesc, model, var8);
// Object msg = model.get("message_info");
// return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
// }
//
// this.init(model, context);
// ret.put("data", null);
// ret.put("code", 1);
// ret.put("msg", model.remove("message_info"));
// return ret.toJSONString();
// }
//
// @PostMapping({"search"})
// @UnAuth
// public String search(@RequestPart("file") MultipartFile file) {
// Map<String, Object> model = new HashMap();
// JSONObject ret = new JSONObject();
// String busiDesc = "人脸识别";
// Context context = this.getContext();
// try {
// List<FaceInfoResVO> list = service.searchUserByFace(file.getBytes());
// model.put("data",list);
// this.recordSysLog(this.request, busiDesc + " 【成功】");
// } catch (Exception var8) {
// this.doException(this.request, busiDesc, model, var8);
// Object msg = model.get("message_info");
// return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
// }
//
// this.init(model, context);
// ret.put("data", model.get("data"));
// ret.put("code", 1);
// ret.put("msg", model.remove("message_info"));
// return ret.toJSONString();
// }
//}
\ No newline at end of file
package com.mortals.xhx.module.skin.service.impl;
import cn.hutool.core.util.StrUtil;
import com.mortals.framework.ap.GlobalSysInfo;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
......@@ -81,10 +82,10 @@ public class SkinBaseServiceImpl extends AbstractCRUDServiceImpl<SkinBaseDao, Sk
item.setSkinFieldList(skinFieldEntities);
if (!ObjectUtils.isEmpty(item.getPreviewImagePath())) {
item.setPreviewImagePath(GlobalSysInfo.getParamValue(Constant.DOMAIN, "http://192.168.0.98:11071/") + item.getPreviewImagePath());
item.setPreviewImagePath(StrUtil.removeAllLineBreaks(GlobalSysInfo.getParamValue(Constant.DOMAIN, "http://192.168.0.98:11071/") )+ item.getPreviewImagePath());
}
if (!ObjectUtils.isEmpty(item.getCssFilePath())) {
item.setCssFilePath(GlobalSysInfo.getParamValue(Constant.DOMAIN, "http://192.168.0.98:11071/") + item.getCssFilePath());
item.setCssFilePath(StrUtil.removeAllLineBreaks(GlobalSysInfo.getParamValue(Constant.DOMAIN, "http://192.168.0.98:11071/") )+ item.getCssFilePath());
}
});
super.findAfter(entity, pageInfo, context, list);
......@@ -92,7 +93,7 @@ public class SkinBaseServiceImpl extends AbstractCRUDServiceImpl<SkinBaseDao, Sk
private void updateUrl(SkinFieldEntity field) {
if ("2".equals(field.getFieldType())) {
field.setFieldValue(GlobalSysInfo.getParamValue(Constant.DOMAIN, "http://192.168.0.98:11071/") + field.getFieldValue());
field.setFieldValue(StrUtil.removeAllLineBreaks(GlobalSysInfo.getParamValue(Constant.DOMAIN, "http://192.168.0.98:11071/")) + field.getFieldValue());
}
}
......
package com.mortals.xhx.module.skin.web;
import cn.hutool.core.util.StrUtil;
import com.mortals.framework.ap.GlobalSysInfo;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
......@@ -89,7 +90,7 @@ public class SkinBaseController extends BaseCRUDJsonBodyMappingController<SkinBa
private void updateUrl(SkinFieldEntity field) {
if ("2".equals(field.getFieldType())) {
field.setFieldValue(GlobalSysInfo.getParamValue(Constant.DOMAIN, "http://192.168.0.98:11071/") + field.getFieldValue());
field.setFieldValue(StrUtil.removeAllLineBreaks(GlobalSysInfo.getParamValue(Constant.DOMAIN, "http://192.168.0.98:11071/")) + field.getFieldValue());
}
}
......
......@@ -25,6 +25,16 @@
<common-lib.version>0.0.1-SNAPSHOT</common-lib.version>
</properties>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<dependencyManagement>
<dependencies>
<dependency>
......@@ -93,6 +103,15 @@
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
<!-- 打包跳过测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
......@@ -19,6 +19,7 @@
"highlight.js": "^11.5.1",
"js-export-excel": "^1.1.4",
"lodash": "^4.17.21",
"moment": "^2.29.4",
"qs": "^6.10.3",
"vue": "^2.6.14",
"vue-highlightjs": "^1.3.3",
......@@ -35,7 +36,8 @@
"less": "^4.0.0",
"less-loader": "^8.0.0",
"postcss": "^8.4.12",
"vue-template-compiler": "^2.6.14"
"vue-template-compiler": "^2.6.14",
"webpack-bundle-analyzer": "^4.7.0"
}
},
"node_modules/@achrinza/node-ipc": {
......
......@@ -38,7 +38,8 @@
"less": "^4.0.0",
"less-loader": "^8.0.0",
"postcss": "^8.4.12",
"vue-template-compiler": "^2.6.14"
"vue-template-compiler": "^2.6.14",
"webpack-bundle-analyzer": "^4.7.0"
},
"browserslist": [
"> 1%",
......
......@@ -34,7 +34,7 @@
<profiles.log.level>INFO</profiles.log.level>
<profiles.log.path>/mortals/app/logs</profiles.log.path>
<package.environment>test</package.environment>
<skipDeploy>false</skipDeploy>
<skipUi>false</skipUi>
</properties>
</profile>
<profile>
......@@ -54,7 +54,7 @@
<profiles.log.level>INFO</profiles.log.level>
<profiles.log.path>/home/mortals/app/logs</profiles.log.path>
<package.environment>test</package.environment>
<skipDeploy>false</skipDeploy>
<skipUi>false</skipUi>
</properties>
</profile>
<profile>
......@@ -74,30 +74,30 @@
<profiles.log.level>INFO</profiles.log.level>
<profiles.log.path>/home/mortals/app/logs</profiles.log.path>
<package.environment>build</package.environment>
<skipDeploy>false</skipDeploy>
<skipUi>true</skipUi>
</properties>
</profile>
<profile>
<id>yibin</id>
<properties>
<profiles.active>yibin</profiles.active>
<profiles.server.path>/zwfw</profiles.server.path>
<profiles.publish.path>/home/publish</profiles.publish.path>
<profiles.rabbitmq.host>127.0.0.1</profiles.rabbitmq.host>
<profiles.rabbitmq.host>172.15.28.115</profiles.rabbitmq.host>
<profiles.rabbitmq.port>5672</profiles.rabbitmq.port>
<profiles.rabbitmq.username>root_mq</profiles.rabbitmq.username>
<profiles.rabbitmq.password>xhx@2022</profiles.rabbitmq.password>
<profiles.rabbitmq.username>taxi_mq</profiles.rabbitmq.username>
<profiles.rabbitmq.password>admin@2020</profiles.rabbitmq.password>
<profiles.rabbitmq.virtualhost>/</profiles.rabbitmq.virtualhost>
<profiles.nacos.server-addr>127.0.0.1:8848</profiles.nacos.server-addr>
<profiles.nacos.server-addr>172.15.28.120:8848</profiles.nacos.server-addr>
<profiles.nacos.group>DEFAULT_GROUP</profiles.nacos.group>
<profiles.nacos.namespace>smart-gov</profiles.nacos.namespace>
<profiles.log.level>INFO</profiles.log.level>
<profiles.log.path>/home/mortals/app/logs</profiles.log.path>
<package.environment>yibin</package.environment>
<skipDeploy>false</skipDeploy>
<skipUi>false</skipUi>
</properties>
</profile>
</profiles>
<properties>
</properties>
......@@ -246,7 +246,7 @@
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<skip>${skipDeploy}</skip>
<skip>${skipUi}</skip>
</configuration>
<executions>
<execution>
......@@ -309,7 +309,7 @@
<goal>single</goal>
</goals>
<configuration>
<skipAssembly>${skipDeploy}</skipAssembly>
<skipAssembly>${skipUi}</skipAssembly>
<finalName>${project.artifactId}-ui</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
......
......@@ -88,20 +88,20 @@
<profiles.server.ip>192.168.2.144</profiles.server.ip>
<profiles.server.port>17214</profiles.server.port>
<profiles.nginx.port>11078</profiles.nginx.port>
<profiles.rabbitmq.host>127.0.0.1</profiles.rabbitmq.host>
<profiles.rabbitmq.host>172.15.28.115</profiles.rabbitmq.host>
<profiles.rabbitmq.port>5672</profiles.rabbitmq.port>
<profiles.rabbitmq.username>taxi_mq</profiles.rabbitmq.username>
<profiles.rabbitmq.password>admin@2020</profiles.rabbitmq.password>
<profiles.rabbitmq.virtualhost>/</profiles.rabbitmq.virtualhost>
<profiles.nacos.server-addr>127.0.0.1:8848</profiles.nacos.server-addr>
<profiles.nacos.server-addr>172.15.28.120:8848</profiles.nacos.server-addr>
<profiles.nacos.group>DEFAULT_GROUP</profiles.nacos.group>
<profiles.nacos.namespace>smart-gov</profiles.nacos.namespace>
<profiles.log.level>INFO</profiles.log.level>
<profiles.log.path>/home/mortals/app/logs</profiles.log.path>
<profiles.publish.path>/home/publish</profiles.publish.path>
</properties>
</profile>
</profiles>
<properties>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment