彻底铲除OSSUtil,抽象、修改
This commit is contained in:
parent
473e7080a1
commit
201a6617ac
@ -1,7 +1,12 @@
|
|||||||
package com.ycwl.basic.config;
|
package com.ycwl.basic.config;
|
||||||
|
|
||||||
|
import com.ycwl.basic.storage.entity.AliOssStorageConfig;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -12,10 +17,10 @@ import org.springframework.stereotype.Component;
|
|||||||
@Data
|
@Data
|
||||||
@Component
|
@Component
|
||||||
public class FaceDetectConfig {
|
public class FaceDetectConfig {
|
||||||
@Value("${aliYunFace.accessKeyId}")
|
@Value("${aliFace.accessKeyId}")
|
||||||
private String accessKeyId;
|
private String accessKeyId;
|
||||||
@Value("${aliYunFace.accessKeySecret}")
|
@Value("${aliFace.accessKeySecret}")
|
||||||
private String accessKeySecret;
|
private String accessKeySecret;
|
||||||
@Value("${aliYunFace.region}")
|
@Value("${aliFace.region}")
|
||||||
private String region;
|
private String region;
|
||||||
}
|
}
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
package com.ycwl.basic.config;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 阿里云OSS配置
|
|
||||||
*
|
|
||||||
* @author songmingsong
|
|
||||||
**/
|
|
||||||
@Data
|
|
||||||
@Component
|
|
||||||
public class OssConfig {
|
|
||||||
@Value("${aliYunOss.endpoint}")
|
|
||||||
private String endPoint;
|
|
||||||
@Value("${aliYunOss.accessKeyId}")
|
|
||||||
private String accessKeyId;
|
|
||||||
@Value("${aliYunOss.accessKeySecret}")
|
|
||||||
private String accessKeySecret;
|
|
||||||
@Value("${aliYunOss.bucketName}")
|
|
||||||
private String bucketName;
|
|
||||||
@Value("${aliYunOss.objectName}")
|
|
||||||
private String objectName;
|
|
||||||
@Value("${aliYunOss.url}")
|
|
||||||
private String url;
|
|
||||||
@Value("${aliYunOss.region}")
|
|
||||||
private String region;
|
|
||||||
}
|
|
@ -3,7 +3,7 @@ package com.ycwl.basic.controller;
|
|||||||
|
|
||||||
import com.ycwl.basic.annotation.IgnoreToken;
|
import com.ycwl.basic.annotation.IgnoreToken;
|
||||||
import com.ycwl.basic.enums.BizCodeEnum;
|
import com.ycwl.basic.enums.BizCodeEnum;
|
||||||
import com.ycwl.basic.service.FileService;
|
import com.ycwl.basic.storage.StorageFactory;
|
||||||
import com.ycwl.basic.utils.ApiResponse;
|
import com.ycwl.basic.utils.ApiResponse;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: songmingsong
|
* @Author: songmingsong
|
||||||
@ -29,14 +30,13 @@ import java.io.IOException;
|
|||||||
@Api(tags = "文件接口")
|
@Api(tags = "文件接口")
|
||||||
public class FileController {
|
public class FileController {
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private FileService fileService;
|
|
||||||
|
|
||||||
@ApiOperation(value = "上传文件")
|
@ApiOperation(value = "上传文件")
|
||||||
@PostMapping("/upload")
|
@PostMapping("/upload")
|
||||||
@IgnoreToken
|
@IgnoreToken
|
||||||
public ApiResponse<?> upload(@RequestParam(value = "file") MultipartFile file) throws IOException {
|
public ApiResponse<?> upload(@RequestParam(value = "file") MultipartFile file) throws IOException {
|
||||||
String url = fileService.uploadFile(file);
|
String[] split = file.getOriginalFilename().split("\\.");
|
||||||
|
String ext = split[split.length - 1];
|
||||||
|
String url = StorageFactory.use("assets").uploadFile(file, "web", UUID.randomUUID()+"."+ext);
|
||||||
return ApiResponse.success(url);
|
return ApiResponse.success(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ public class FileController {
|
|||||||
@PostMapping("/delete")
|
@PostMapping("/delete")
|
||||||
@IgnoreToken
|
@IgnoreToken
|
||||||
public ApiResponse<?> delete(@RequestParam(value = "fileName") String fileName) throws IOException {
|
public ApiResponse<?> delete(@RequestParam(value = "fileName") String fileName) throws IOException {
|
||||||
Boolean flag = fileService.delete(fileName);
|
boolean flag = StorageFactory.use("assets").deleteFile("web", fileName);
|
||||||
return flag ? ApiResponse.success(BizCodeEnum.REQUEST_OK) : ApiResponse.fail(BizCodeEnum.FAIL.getMessage());
|
return flag ? ApiResponse.success(BizCodeEnum.REQUEST_OK) : ApiResponse.fail(BizCodeEnum.FAIL.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.ycwl.basic.controller.pc;
|
||||||
|
|
||||||
|
import com.github.pagehelper.PageHelper;
|
||||||
|
import com.github.pagehelper.PageInfo;
|
||||||
|
import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||||
|
import com.ycwl.basic.model.pc.faceDetectLog.entity.FaceDetectLog;
|
||||||
|
import com.ycwl.basic.service.pc.FaceDetectLogService;
|
||||||
|
import com.ycwl.basic.utils.ApiResponse;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/face/detect_log/v1")
|
||||||
|
public class FaceDetectLogController {
|
||||||
|
@Autowired
|
||||||
|
private FaceDetectLogService service;
|
||||||
|
|
||||||
|
@PostMapping("/page")
|
||||||
|
public ApiResponse<PageInfo<FaceDetectLog>> pageQuery(@RequestBody BaseQueryParameterReq req) {
|
||||||
|
PageHelper.startPage(req.getPageNum(), req.getPageSize());
|
||||||
|
List<FaceDetectLog> list = service.listByTimeDesc();
|
||||||
|
PageInfo<FaceDetectLog> pageInfo = new PageInfo<>(list);
|
||||||
|
return ApiResponse.success(pageInfo);
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
|
|||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.ycwl.basic.annotation.IgnoreToken;
|
import com.ycwl.basic.annotation.IgnoreToken;
|
||||||
|
import com.ycwl.basic.config.FaceDetectConfig;
|
||||||
import com.ycwl.basic.mapper.DeviceMapper;
|
import com.ycwl.basic.mapper.DeviceMapper;
|
||||||
import com.ycwl.basic.mapper.FaceSampleMapper;
|
import com.ycwl.basic.mapper.FaceSampleMapper;
|
||||||
import com.ycwl.basic.mapper.SourceMapper;
|
import com.ycwl.basic.mapper.SourceMapper;
|
||||||
@ -25,10 +26,11 @@ import com.ycwl.basic.model.viid.req.UnRegisterReq;
|
|||||||
import com.ycwl.basic.model.viid.resp.SystemTimeResp;
|
import com.ycwl.basic.model.viid.resp.SystemTimeResp;
|
||||||
import com.ycwl.basic.model.viid.resp.VIIDBaseResp;
|
import com.ycwl.basic.model.viid.resp.VIIDBaseResp;
|
||||||
import com.ycwl.basic.service.task.TaskFaceService;
|
import com.ycwl.basic.service.task.TaskFaceService;
|
||||||
import com.ycwl.basic.utils.AliFaceUtil;
|
import com.ycwl.basic.storage.StorageFactory;
|
||||||
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
|
import com.ycwl.basic.storage.enums.StorageType;
|
||||||
import com.ycwl.basic.utils.ImageUtils;
|
import com.ycwl.basic.utils.ImageUtils;
|
||||||
import com.ycwl.basic.utils.IpUtils;
|
import com.ycwl.basic.utils.IpUtils;
|
||||||
import com.ycwl.basic.utils.OssUtil;
|
|
||||||
import com.ycwl.basic.utils.SnowFlakeUtil;
|
import com.ycwl.basic.utils.SnowFlakeUtil;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -179,8 +181,6 @@ public class ViidController {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private TaskFaceService taskFaceService;
|
private TaskFaceService taskFaceService;
|
||||||
@Autowired
|
|
||||||
private OssUtil ossUtil;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -223,6 +223,7 @@ public class ViidController {
|
|||||||
if (ext.equalsIgnoreCase("jpeg")) {
|
if (ext.equalsIgnoreCase("jpeg")) {
|
||||||
ext = "jpg";
|
ext = "jpg";
|
||||||
}
|
}
|
||||||
|
IStorageAdapter adapter = StorageFactory.use("faces");
|
||||||
// Type=11 人脸
|
// Type=11 人脸
|
||||||
if (subImage.getType().equals("11")) {
|
if (subImage.getType().equals("11")) {
|
||||||
// 上传oss
|
// 上传oss
|
||||||
@ -232,13 +233,7 @@ public class ViidController {
|
|||||||
faceSample.setDeviceId(device.getId());
|
faceSample.setDeviceId(device.getId());
|
||||||
faceSample.setStatus(0);
|
faceSample.setStatus(0);
|
||||||
faceSample.setCreateAt(new Date());
|
faceSample.setCreateAt(new Date());
|
||||||
String url;
|
String url = adapter.uploadFile(file, "user-face", UUID.randomUUID() + "." + ext);
|
||||||
try {
|
|
||||||
url = ossUtil.uploadFile(file.getInputStream(), UUID.randomUUID().toString() + "." + ext);
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.error("文件上传失败!", e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
faceSample.setFaceUrl(url);
|
faceSample.setFaceUrl(url);
|
||||||
faceSampleMapper.add(faceSample);
|
faceSampleMapper.add(faceSample);
|
||||||
log.info("人脸信息入库成功!");
|
log.info("人脸信息入库成功!");
|
||||||
@ -255,13 +250,7 @@ public class ViidController {
|
|||||||
source.setFaceSampleId(newFaceSampleId);
|
source.setFaceSampleId(newFaceSampleId);
|
||||||
source.setType(2);
|
source.setType(2);
|
||||||
// 上传oss
|
// 上传oss
|
||||||
String url;
|
String url = adapter.uploadFile(file, "user-photo", UUID.randomUUID() + "." + ext);
|
||||||
try {
|
|
||||||
url = ossUtil.uploadFile(file.getInputStream(), "user-photo/", newFaceSampleId + "." + ext);
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.error("文件上传失败!", e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
source.setUrl(url);
|
source.setUrl(url);
|
||||||
source.setPosJson(JSON.toJSONString(facePosition));
|
source.setPosJson(JSON.toJSONString(facePosition));
|
||||||
sourceMapper.add(source);
|
sourceMapper.add(source);
|
||||||
|
@ -29,7 +29,7 @@ public class TemplateEntity {
|
|||||||
/**
|
/**
|
||||||
* 父模版ID
|
* 父模版ID
|
||||||
*/
|
*/
|
||||||
private Long pid;
|
private long pid = 0;
|
||||||
/**
|
/**
|
||||||
* 是否是占位素材,0不是,1是
|
* 是否是占位素材,0不是,1是
|
||||||
*/
|
*/
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
package com.ycwl.basic.service;
|
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
|
||||||
import com.ycwl.basic.exception.BaseException;
|
|
||||||
import com.ycwl.basic.utils.OssUtil;
|
|
||||||
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.Objects;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* file请求服务
|
|
||||||
*
|
|
||||||
* @author songmingsong
|
|
||||||
*/
|
|
||||||
@Service
|
|
||||||
public class FileService {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private OssUtil ossUtil;
|
|
||||||
|
|
||||||
public String uploadFile(MultipartFile file) throws IOException {
|
|
||||||
String originalFilename = file.getOriginalFilename();
|
|
||||||
if (StrUtil.isBlank(originalFilename)) {
|
|
||||||
throw new BaseException("文件上传失败,文件名不能为空");
|
|
||||||
}
|
|
||||||
String fileName=System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf("."));
|
|
||||||
return ossUtil.uploadFile(file.getInputStream(), fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Boolean delete(String fileName) {
|
|
||||||
return ossUtil.deleteFile(fileName);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.ycwl.basic.service.impl.pc;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.ycwl.basic.mapper.FaceDetectLogMapper;
|
||||||
|
import com.ycwl.basic.model.pc.faceDetectLog.entity.FaceDetectLog;
|
||||||
|
import com.ycwl.basic.service.pc.FaceDetectLogService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class FaceDetectLogServiceImpl extends ServiceImpl<FaceDetectLogMapper, FaceDetectLog> implements FaceDetectLogService {
|
||||||
|
@Override
|
||||||
|
public List<FaceDetectLog> listByTimeDesc() {
|
||||||
|
LambdaQueryWrapper<FaceDetectLog> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
queryWrapper.orderByDesc(FaceDetectLog::getCreateTime);
|
||||||
|
return list(queryWrapper);
|
||||||
|
}
|
||||||
|
}
|
@ -16,6 +16,10 @@ import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
|
|||||||
import com.ycwl.basic.service.pc.FaceService;
|
import com.ycwl.basic.service.pc.FaceService;
|
||||||
import com.ycwl.basic.service.task.TaskFaceService;
|
import com.ycwl.basic.service.task.TaskFaceService;
|
||||||
import com.ycwl.basic.service.task.TaskService;
|
import com.ycwl.basic.service.task.TaskService;
|
||||||
|
import com.ycwl.basic.storage.StorageFactory;
|
||||||
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
|
import com.ycwl.basic.storage.enums.StorageType;
|
||||||
|
import com.ycwl.basic.storage.utils.StorageUtil;
|
||||||
import com.ycwl.basic.task.FaceCleaner;
|
import com.ycwl.basic.task.FaceCleaner;
|
||||||
import com.ycwl.basic.utils.*;
|
import com.ycwl.basic.utils.*;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -31,6 +35,7 @@ import java.math.BigDecimal;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
|
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
|
||||||
@ -45,8 +50,6 @@ public class FaceServiceImpl implements FaceService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private FaceMapper faceMapper;
|
private FaceMapper faceMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private OssUtil ossUtil;
|
|
||||||
@Autowired
|
|
||||||
private TaskFaceService faceService;
|
private TaskFaceService faceService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private StatisticsMapper statisticsMapper;
|
private StatisticsMapper statisticsMapper;
|
||||||
@ -56,8 +59,6 @@ public class FaceServiceImpl implements FaceService {
|
|||||||
private float strictScore = 90F;
|
private float strictScore = 90F;
|
||||||
@Autowired
|
@Autowired
|
||||||
private TaskService taskTaskService;
|
private TaskService taskTaskService;
|
||||||
@Autowired
|
|
||||||
private FaceCleaner faceCleaner;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ApiResponse<PageInfo<FaceRespVO>> pageQuery(FaceReqQuery faceReqQuery) {
|
public ApiResponse<PageInfo<FaceRespVO>> pageQuery(FaceReqQuery faceReqQuery) {
|
||||||
@ -123,17 +124,21 @@ public class FaceServiceImpl implements FaceService {
|
|||||||
log.info("当前登录用户信息:{}",worker);
|
log.info("当前登录用户信息:{}",worker);
|
||||||
|
|
||||||
//1、上传人脸照片
|
//1、上传人脸照片
|
||||||
String faceUrl = uploadFileALiOss(file, userId);
|
IStorageAdapter adapter = StorageFactory.use("faces");
|
||||||
|
String filePath = StorageUtil.joinPath("user-faces", DateUtils.format(new Date(),"yyyy-MM-dd"));
|
||||||
|
String originalFilename = file.getOriginalFilename();
|
||||||
|
String suffix = originalFilename.split("\\.", 2)[1];
|
||||||
|
String fileName = UUID.randomUUID().toString() + "." + suffix;
|
||||||
|
String faceUrl = adapter.uploadFile(file, filePath, fileName);
|
||||||
SearchFaceRespVo scenicDbSearchResult = faceService.searchFace(scenicId, faceUrl);
|
SearchFaceRespVo scenicDbSearchResult = faceService.searchFace(scenicId, faceUrl);
|
||||||
if (scenicDbSearchResult == null) {
|
if (scenicDbSearchResult == null) {
|
||||||
ossUtil.deleteFileByUrl(faceUrl);
|
adapter.deleteFile(filePath, fileName);
|
||||||
throw new BaseException("人脸照片校验失败,请重新上传");
|
throw new BaseException("人脸照片校验失败,请重新上传");
|
||||||
}
|
}
|
||||||
float score = scenicDbSearchResult.getScore();
|
float score = scenicDbSearchResult.getScore();
|
||||||
if (score<faceScore) {
|
if (score<faceScore) {
|
||||||
//校验失败,删除,提示重新上传
|
//校验失败,删除,提示重新上传
|
||||||
ossUtil.deleteFileByUrl(faceUrl);
|
adapter.deleteFile(filePath, fileName);
|
||||||
|
|
||||||
throw new BaseException("人脸照片校验失败,请重新上传");
|
throw new BaseException("人脸照片校验失败,请重新上传");
|
||||||
}
|
}
|
||||||
// 2、通过人脸查找用户库
|
// 2、通过人脸查找用户库
|
||||||
@ -194,37 +199,4 @@ public class FaceServiceImpl implements FaceService {
|
|||||||
return ApiResponse.success(faceMapper.getByMemberId(memberId, 3928516560393736192L));
|
return ApiResponse.success(faceMapper.getByMemberId(memberId, 3928516560393736192L));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 阿里oss图片上传
|
|
||||||
*
|
|
||||||
* @param file file
|
|
||||||
* @param userId 用户id
|
|
||||||
* @return 地址
|
|
||||||
*/
|
|
||||||
private String uploadFileALiOss(MultipartFile file,Long userId) {
|
|
||||||
if (file.isEmpty()) {
|
|
||||||
throw new RuntimeException("文件不存在!");
|
|
||||||
}
|
|
||||||
String originalFilename = file.getOriginalFilename();
|
|
||||||
//获取文件名后缀
|
|
||||||
String suffix = originalFilename.split("\\.")[1];
|
|
||||||
if ("Jpeg".equals(suffix)) {
|
|
||||||
suffix = "jpg";
|
|
||||||
}
|
|
||||||
//文件储存路径
|
|
||||||
String filePath="";
|
|
||||||
String dateStr = DateUtils.format(new Date(),"yyyy-MM-dd");
|
|
||||||
|
|
||||||
filePath=filePath+dateStr+"/";
|
|
||||||
// 生成文件名
|
|
||||||
String fileName= userId+"." + suffix;
|
|
||||||
InputStream inputStream ;
|
|
||||||
try {
|
|
||||||
inputStream = file.getInputStream();
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.error("文件上传失败!", e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return ossUtil.uploadFile(inputStream,filePath+fileName) ;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,11 @@ import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
|
|||||||
import com.ycwl.basic.model.task.resp.AddFaceSampleRespVo;
|
import com.ycwl.basic.model.task.resp.AddFaceSampleRespVo;
|
||||||
import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
|
import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
|
||||||
import com.ycwl.basic.service.task.TaskFaceService;
|
import com.ycwl.basic.service.task.TaskFaceService;
|
||||||
|
import com.ycwl.basic.storage.StorageFactory;
|
||||||
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
|
import com.ycwl.basic.storage.enums.StorageType;
|
||||||
|
import com.ycwl.basic.storage.utils.StorageUtil;
|
||||||
|
import com.ycwl.basic.utils.DateUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -41,7 +46,10 @@ import org.springframework.stereotype.Service;
|
|||||||
import com.aliyuncs.DefaultAcsClient;
|
import com.aliyuncs.DefaultAcsClient;
|
||||||
import com.aliyuncs.IAcsClient;
|
import com.aliyuncs.IAcsClient;
|
||||||
import com.aliyuncs.profile.DefaultProfile;
|
import com.aliyuncs.profile.DefaultProfile;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -117,9 +125,7 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
if (matchList.get(0).getFaceItems().isEmpty()) {
|
if (matchList.get(0).getFaceItems().isEmpty()) {
|
||||||
return respVo;
|
return respVo;
|
||||||
}
|
}
|
||||||
List<SearchFaceResponse.Data.MatchListItem.FaceItemsItem> faceItems = matchList.get(0).getFaceItems().stream()
|
List<MatchLocalRecord> records = matchList.get(0).getFaceItems().stream()
|
||||||
.filter(faceItemsItem -> faceItemsItem.getConfidence() > 50).collect(Collectors.toList());
|
|
||||||
List<MatchLocalRecord> records = faceItems.stream()
|
|
||||||
.map(item -> {
|
.map(item -> {
|
||||||
MatchLocalRecord record = new MatchLocalRecord();
|
MatchLocalRecord record = new MatchLocalRecord();
|
||||||
record.setIdStr(item.getExtraData());
|
record.setIdStr(item.getExtraData());
|
||||||
@ -135,6 +141,7 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
log.matchLocalRecord(records);
|
log.matchLocalRecord(records);
|
||||||
List<Long> faceSampleIds = records.stream()
|
List<Long> faceSampleIds = records.stream()
|
||||||
|
.filter(record -> record.getConfidence() > 60)
|
||||||
.map(MatchLocalRecord::getFaceSampleId)
|
.map(MatchLocalRecord::getFaceSampleId)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
respVo.setFirstMatchRate(matchList.get(0).getFaceItems().get(0).getConfidence());
|
respVo.setFirstMatchRate(matchList.get(0).getFaceItems().get(0).getConfidence());
|
||||||
@ -310,6 +317,30 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String uploadFile(MultipartFile file, Long userId) {
|
||||||
|
if (file.isEmpty()) {
|
||||||
|
throw new RuntimeException("文件不存在!");
|
||||||
|
}
|
||||||
|
String originalFilename = file.getOriginalFilename();
|
||||||
|
//获取文件名后缀
|
||||||
|
String suffix = originalFilename.split("\\.")[1];
|
||||||
|
if ("Jpeg".equals(suffix)) {
|
||||||
|
suffix = "jpg";
|
||||||
|
}
|
||||||
|
//文件储存路径
|
||||||
|
String filePath = StorageUtil.joinPath("user-faces", DateUtils.format(new Date(),"yyyy-MM-dd"));
|
||||||
|
// 生成文件名
|
||||||
|
String fileName= userId + "." + suffix;
|
||||||
|
IStorageAdapter adapter = StorageFactory.use("faces");
|
||||||
|
try {
|
||||||
|
return adapter.uploadFile(file.getInputStream(), filePath, fileName);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("文件上传失败!", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void addFaceDBCache(String dbName) {
|
public void addFaceDBCache(String dbName) {
|
||||||
redisTemplate.opsForValue().set(FaceConstant.FACE_DB_NAME_PFX + dbName, "1");
|
redisTemplate.opsForValue().set(FaceConstant.FACE_DB_NAME_PFX + dbName, "1");
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,6 @@ package com.ycwl.basic.service.impl.task;
|
|||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.ycwl.basic.constant.TaskConstant;
|
import com.ycwl.basic.constant.TaskConstant;
|
||||||
import com.ycwl.basic.device.DeviceFactory;
|
|
||||||
import com.ycwl.basic.device.operator.IDeviceStorageOperator;
|
|
||||||
import com.ycwl.basic.mapper.DeviceMapper;
|
|
||||||
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
|
|
||||||
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
|
|
||||||
import com.ycwl.basic.mapper.FaceMapper;
|
import com.ycwl.basic.mapper.FaceMapper;
|
||||||
import com.ycwl.basic.mapper.FaceSampleMapper;
|
import com.ycwl.basic.mapper.FaceSampleMapper;
|
||||||
import com.ycwl.basic.mapper.RenderWorkerMapper;
|
import com.ycwl.basic.mapper.RenderWorkerMapper;
|
||||||
@ -31,8 +26,10 @@ import com.ycwl.basic.model.task.req.TaskReqVo;
|
|||||||
import com.ycwl.basic.model.task.req.WorkerAuthReqVo;
|
import com.ycwl.basic.model.task.req.WorkerAuthReqVo;
|
||||||
import com.ycwl.basic.model.task.resp.TaskSyncRespVo;
|
import com.ycwl.basic.model.task.resp.TaskSyncRespVo;
|
||||||
import com.ycwl.basic.service.task.TaskService;
|
import com.ycwl.basic.service.task.TaskService;
|
||||||
|
import com.ycwl.basic.storage.StorageFactory;
|
||||||
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
|
import com.ycwl.basic.storage.enums.StorageType;
|
||||||
import com.ycwl.basic.task.VideoPieceGetter;
|
import com.ycwl.basic.task.VideoPieceGetter;
|
||||||
import com.ycwl.basic.utils.OssUtil;
|
|
||||||
import com.ycwl.basic.utils.SnowFlakeUtil;
|
import com.ycwl.basic.utils.SnowFlakeUtil;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
@ -68,8 +65,6 @@ public class TaskTaskServiceImpl implements TaskService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private SourceMapper sourceMapper;
|
private SourceMapper sourceMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private OssUtil ossUtil;
|
|
||||||
@Autowired
|
|
||||||
private VideoMapper videoMapper;
|
private VideoMapper videoMapper;
|
||||||
|
|
||||||
private RenderWorkerEntity getWorker(@NonNull WorkerAuthReqVo req) {
|
private RenderWorkerEntity getWorker(@NonNull WorkerAuthReqVo req) {
|
||||||
@ -334,15 +329,16 @@ public class TaskTaskServiceImpl implements TaskService {
|
|||||||
if (task == null) {
|
if (task == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
IStorageAdapter adapter = StorageFactory.use("faces");
|
||||||
String filename = task.getId() + "_" + task.getScenicId() + ".mp4";
|
String filename = task.getId() + "_" + task.getScenicId() + ".mp4";
|
||||||
if (StringUtils.isBlank(task.getVideoUrl())) {
|
if (StringUtils.isBlank(task.getVideoUrl())) {
|
||||||
// 生成
|
// 生成
|
||||||
String url = ossUtil.generateUrlOfFile("user-video/", filename);
|
String url = adapter.getUrl("user-video", filename);
|
||||||
TaskEntity updateTask = new TaskEntity();
|
TaskEntity updateTask = new TaskEntity();
|
||||||
updateTask.setId(taskId);
|
updateTask.setId(taskId);
|
||||||
updateTask.setVideoUrl(url);
|
updateTask.setVideoUrl(url);
|
||||||
taskMapper.update(updateTask);
|
taskMapper.update(updateTask);
|
||||||
}
|
}
|
||||||
return ossUtil.generateSignedUrlForUpload("user-video/", filename);
|
return adapter.getUrlForUpload("user-video", filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.ycwl.basic.service.pc;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.ycwl.basic.model.pc.faceDetectLog.entity.FaceDetectLog;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface FaceDetectLogService extends IService<FaceDetectLog> {
|
||||||
|
List<FaceDetectLog> listByTimeDesc();
|
||||||
|
}
|
@ -2,6 +2,7 @@ package com.ycwl.basic.service.task;
|
|||||||
|
|
||||||
import com.ycwl.basic.model.task.resp.AddFaceSampleRespVo;
|
import com.ycwl.basic.model.task.resp.AddFaceSampleRespVo;
|
||||||
import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
|
import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
public interface TaskFaceService {
|
public interface TaskFaceService {
|
||||||
|
|
||||||
@ -22,4 +23,6 @@ public interface TaskFaceService {
|
|||||||
void createFaceDB(String scenicId);
|
void createFaceDB(String scenicId);
|
||||||
|
|
||||||
void assureFaceDB(String scenicId);
|
void assureFaceDB(String scenicId);
|
||||||
|
|
||||||
|
String uploadFile(MultipartFile file, Long userId);
|
||||||
}
|
}
|
||||||
|
53
src/main/java/com/ycwl/basic/storage/StorageFactory.java
Normal file
53
src/main/java/com/ycwl/basic/storage/StorageFactory.java
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package com.ycwl.basic.storage;
|
||||||
|
|
||||||
|
import com.ycwl.basic.storage.adapters.AliOssAdapter;
|
||||||
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
|
import com.ycwl.basic.storage.adapters.LocalStorageAdapter;
|
||||||
|
import com.ycwl.basic.storage.entity.StorageConfig;
|
||||||
|
import com.ycwl.basic.storage.enums.StorageType;
|
||||||
|
import com.ycwl.basic.storage.exceptions.StorageUndefinedException;
|
||||||
|
import com.ycwl.basic.storage.exceptions.StorageUnsupportedException;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class StorageFactory {
|
||||||
|
public static IStorageAdapter get(StorageType storageType, StorageConfig config) {
|
||||||
|
IStorageAdapter adapter = get(storageType);
|
||||||
|
adapter.setConfig(config);
|
||||||
|
return adapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IStorageAdapter get(StorageType storageType) {
|
||||||
|
switch (storageType) {
|
||||||
|
case LOCAL:
|
||||||
|
return new LocalStorageAdapter();
|
||||||
|
case ALI_OSS:
|
||||||
|
return new AliOssAdapter();
|
||||||
|
default:
|
||||||
|
throw new StorageUnsupportedException(storageType.getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IStorageAdapter get(String type) {
|
||||||
|
StorageType storageType = StorageType.getStorageType(type);
|
||||||
|
if (storageType == null) {
|
||||||
|
throw new StorageUnsupportedException(type);
|
||||||
|
}
|
||||||
|
return get(storageType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, IStorageAdapter> definedName = new HashMap<>();
|
||||||
|
|
||||||
|
public static void register(String name, IStorageAdapter adapter) {
|
||||||
|
definedName.put(name, adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IStorageAdapter use(String name) {
|
||||||
|
IStorageAdapter adapter = definedName.get(name);
|
||||||
|
if (adapter == null) {
|
||||||
|
throw new StorageUndefinedException(name);
|
||||||
|
}
|
||||||
|
return adapter;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
package com.ycwl.basic.storage.adapters;
|
||||||
|
|
||||||
|
import com.ycwl.basic.storage.entity.StorageConfig;
|
||||||
|
import com.ycwl.basic.storage.exceptions.UploadFileFailedException;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public abstract class AStorageAdapter implements IStorageAdapter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String uploadFile(File file, String path, String filename) {
|
||||||
|
if (file == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
InputStream inputStream = new FileInputStream(file);
|
||||||
|
return uploadFile(inputStream, path, filename);
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
throw new UploadFileFailedException("文件不存在");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String uploadFile(MultipartFile file, String path, String filename) {
|
||||||
|
if (file == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
InputStream inputStream = file.getInputStream();
|
||||||
|
return uploadFile(inputStream, path, filename);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new UploadFileFailedException("文件上传失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUrlForUpload(String path, String filename) {
|
||||||
|
return getUrlForUpload(path, filename, new Date(System.currentTimeMillis() + 1000 * 60 * 60));
|
||||||
|
}
|
||||||
|
}
|
102
src/main/java/com/ycwl/basic/storage/adapters/AliOssAdapter.java
Normal file
102
src/main/java/com/ycwl/basic/storage/adapters/AliOssAdapter.java
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
package com.ycwl.basic.storage.adapters;
|
||||||
|
|
||||||
|
|
||||||
|
import com.aliyun.oss.ClientException;
|
||||||
|
import com.aliyun.oss.HttpMethod;
|
||||||
|
import com.aliyun.oss.OSS;
|
||||||
|
import com.aliyun.oss.OSSClientBuilder;
|
||||||
|
import com.aliyun.oss.model.PutObjectRequest;
|
||||||
|
import com.ycwl.basic.storage.entity.AliOssStorageConfig;
|
||||||
|
import com.ycwl.basic.storage.entity.StorageConfig;
|
||||||
|
import com.ycwl.basic.storage.exceptions.StorageConfigException;
|
||||||
|
import com.ycwl.basic.storage.exceptions.UploadFileFailedException;
|
||||||
|
import com.ycwl.basic.storage.utils.StorageUtil;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class AliOssAdapter extends AStorageAdapter {
|
||||||
|
private AliOssStorageConfig config;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loadConfig(Map<String, String> _config) {
|
||||||
|
AliOssStorageConfig config = new AliOssStorageConfig();
|
||||||
|
config.setAccessKeyId(_config.get("accessKeyId"));
|
||||||
|
config.setAccessKeySecret(_config.get("accessKeySecret"));
|
||||||
|
config.setBucketName(_config.get("bucketName"));
|
||||||
|
config.setEndpoint(_config.get("endpoint"));
|
||||||
|
config.setRegion(_config.get("region"));
|
||||||
|
config.setUrl(_config.get("url"));
|
||||||
|
config.setPrefix(_config.get("prefix"));
|
||||||
|
config.checkEverythingOK();
|
||||||
|
this.config = config;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setConfig(StorageConfig config) {
|
||||||
|
if (config == null) {
|
||||||
|
throw new StorageConfigException("配置为空");
|
||||||
|
}
|
||||||
|
if (config instanceof AliOssStorageConfig) {
|
||||||
|
this.config = (AliOssStorageConfig) config;
|
||||||
|
} else {
|
||||||
|
throw new StorageConfigException("配置类型错误,传入的类为:" + config.getClass().getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String uploadFile(InputStream inputStream, String path, String filename) {
|
||||||
|
if (inputStream == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String fullPath = buildPath(path, filename);
|
||||||
|
OSS ossClient = getOssClient();
|
||||||
|
try {
|
||||||
|
PutObjectRequest putObjectRequest = new PutObjectRequest(config.getBucketName(), fullPath, inputStream);
|
||||||
|
ossClient.putObject(putObjectRequest);
|
||||||
|
return getUrl(path, filename);
|
||||||
|
} catch (ClientException e) {
|
||||||
|
throw new UploadFileFailedException("上传文件失败:" + e.getErrorMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean deleteFile(String path, String filename) {
|
||||||
|
OSS ossClient = getOssClient();
|
||||||
|
try {
|
||||||
|
ossClient.deleteObject(config.getBucketName(), buildPath(path, filename));
|
||||||
|
return true;
|
||||||
|
} catch (ClientException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUrl(String path, String filename) {
|
||||||
|
return config.getUrl() + buildPath(path, filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUrlForUpload(String path, String filename, Date expireDate) {
|
||||||
|
OSS ossClient = getOssClient();
|
||||||
|
URL url = ossClient.generatePresignedUrl(config.getBucketName(), buildPath(path, filename), expireDate, HttpMethod.PUT);
|
||||||
|
return url.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private OSS getOssClient() {
|
||||||
|
OSS ossClient = new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
|
||||||
|
return ossClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildPath(String ...paths) {
|
||||||
|
if (StringUtils.isNotBlank(config.getPrefix())) {
|
||||||
|
return StorageUtil.joinPath(config.getPrefix(), paths);
|
||||||
|
} else {
|
||||||
|
return StorageUtil.joinPath(paths);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.ycwl.basic.storage.adapters;
|
||||||
|
|
||||||
|
import com.ycwl.basic.storage.entity.StorageConfig;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface IStorageAdapter {
|
||||||
|
void loadConfig(Map<String, String> config);
|
||||||
|
void setConfig(StorageConfig config);
|
||||||
|
String uploadFile(InputStream inputStream, String path, String filename);
|
||||||
|
String uploadFile(File file, String path, String filename);
|
||||||
|
String uploadFile(MultipartFile file, String path, String filename);
|
||||||
|
boolean deleteFile(String path, String filename);
|
||||||
|
String getUrl(String path, String filename);
|
||||||
|
String getUrlForUpload(String path, String filename);
|
||||||
|
String getUrlForUpload(String path, String filename, Date expireDate);
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.ycwl.basic.storage.adapters;
|
||||||
|
|
||||||
|
import com.ycwl.basic.storage.entity.StorageConfig;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class LocalStorageAdapter extends AStorageAdapter{
|
||||||
|
@Override
|
||||||
|
public void loadConfig(Map<String, String> config) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setConfig(StorageConfig config) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String uploadFile(InputStream inputStream, String path, String filename) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean deleteFile(String path, String filename) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUrl(String path, String filename) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUrlForUpload(String path, String filename, Date expireDate) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.ycwl.basic.storage.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class AliOssStorageConfig extends StorageConfig {
|
||||||
|
private String endpoint;
|
||||||
|
private String accessKeyId;
|
||||||
|
private String accessKeySecret;
|
||||||
|
private String bucketName;
|
||||||
|
private String url;
|
||||||
|
private String region;
|
||||||
|
private String prefix;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkEverythingOK() {
|
||||||
|
// TODO: 检查配置是否正确
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.ycwl.basic.storage.entity;
|
||||||
|
|
||||||
|
public abstract class StorageConfig {
|
||||||
|
public abstract void checkEverythingOK();
|
||||||
|
}
|
27
src/main/java/com/ycwl/basic/storage/enums/StorageType.java
Normal file
27
src/main/java/com/ycwl/basic/storage/enums/StorageType.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package com.ycwl.basic.storage.enums;
|
||||||
|
|
||||||
|
import com.ycwl.basic.storage.adapters.AliOssAdapter;
|
||||||
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
|
import com.ycwl.basic.storage.adapters.LocalStorageAdapter;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
public enum StorageType {
|
||||||
|
LOCAL("LOCAL"),
|
||||||
|
ALI_OSS("ALI_OSS");
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final String type;
|
||||||
|
|
||||||
|
StorageType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static StorageType getStorageType(String type) {
|
||||||
|
for (StorageType storageType : StorageType.values()) {
|
||||||
|
if (storageType.getType().equals(type)) {
|
||||||
|
return storageType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.ycwl.basic.storage.exceptions;
|
||||||
|
|
||||||
|
public class StorageConfigException extends StorageException {
|
||||||
|
public StorageConfigException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.ycwl.basic.storage.exceptions;
|
||||||
|
|
||||||
|
public class StorageException extends RuntimeException {
|
||||||
|
public StorageException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.ycwl.basic.storage.exceptions;
|
||||||
|
|
||||||
|
public class StorageUndefinedException extends StorageException {
|
||||||
|
public StorageUndefinedException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.ycwl.basic.storage.exceptions;
|
||||||
|
|
||||||
|
public class StorageUnsupportedException extends StorageException {
|
||||||
|
public StorageUnsupportedException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.ycwl.basic.storage.exceptions;
|
||||||
|
|
||||||
|
public class UploadFileFailedException extends StorageException {
|
||||||
|
public UploadFileFailedException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.ycwl.basic.storage.starter;
|
||||||
|
|
||||||
|
import com.ycwl.basic.storage.StorageFactory;
|
||||||
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
|
import com.ycwl.basic.storage.starter.config.OverallStorageConfig;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class StorageAutoConfiguration {
|
||||||
|
private final OverallStorageConfig config;
|
||||||
|
public StorageAutoConfiguration(OverallStorageConfig config) {
|
||||||
|
this.config = config;
|
||||||
|
if (config != null) {
|
||||||
|
loadConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadConfig() {
|
||||||
|
config.getConfigs().forEach(item -> {
|
||||||
|
String name = item.getName();
|
||||||
|
String type = item.getType();
|
||||||
|
IStorageAdapter adapter = StorageFactory.get(type);
|
||||||
|
Map<String, String> config = item.getConfig();
|
||||||
|
adapter.loadConfig(config);
|
||||||
|
StorageFactory.register(name, adapter);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.ycwl.basic.storage.starter.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@ConfigurationProperties(prefix = "storage")
|
||||||
|
@Data
|
||||||
|
public class OverallStorageConfig {
|
||||||
|
private List<StorageConfigItem> configs;
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.ycwl.basic.storage.starter.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class StorageConfigItem {
|
||||||
|
private String name;
|
||||||
|
private String type;
|
||||||
|
private Map<String, String> config;
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.ycwl.basic.storage.tests;
|
||||||
|
|
||||||
|
import com.ycwl.basic.storage.StorageFactory;
|
||||||
|
import com.ycwl.basic.storage.adapters.AliOssAdapter;
|
||||||
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
|
import com.ycwl.basic.storage.enums.StorageType;
|
||||||
|
|
||||||
|
public class TestInitializationSpeed {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int i = 0;
|
||||||
|
long currentTimestamp = System.currentTimeMillis();
|
||||||
|
System.out.println("开始测试");
|
||||||
|
while (i++ < 100000000) {
|
||||||
|
// IStorageAdapter adapter = new AliOssAdapter();
|
||||||
|
StorageFactory.get(StorageType.ALI_OSS);
|
||||||
|
}
|
||||||
|
System.out.println("结束测试,耗时:" + (System.currentTimeMillis() - currentTimestamp) + "ms");
|
||||||
|
}
|
||||||
|
}
|
41
src/main/java/com/ycwl/basic/storage/utils/StorageUtil.java
Normal file
41
src/main/java/com/ycwl/basic/storage/utils/StorageUtil.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package com.ycwl.basic.storage.utils;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
public class StorageUtil {
|
||||||
|
public static String joinPath(String path, String subPath) {
|
||||||
|
if (StringUtils.isBlank(path)) {
|
||||||
|
return subPath;
|
||||||
|
}
|
||||||
|
if (subPath.startsWith("/")) {
|
||||||
|
subPath = subPath.substring(1);
|
||||||
|
}
|
||||||
|
if (path.endsWith("/")) {
|
||||||
|
path = path.substring(0, path.length() - 1);
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(subPath)) {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
if (path.endsWith("/")) {
|
||||||
|
return path + subPath;
|
||||||
|
} else {
|
||||||
|
return path + "/" + subPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String joinPath(String ...names) {
|
||||||
|
String name = names[0];
|
||||||
|
for (int i = 1; i < names.length; i++) {
|
||||||
|
name = joinPath(name, names[i]);
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String joinPath(String name, String ...names) {
|
||||||
|
for (String s : names) {
|
||||||
|
name = joinPath(name, s);
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
@ -78,6 +78,7 @@ public class DynamicTaskGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Integer minimalPlaceholderFill = templateConfig.getMinimalPlaceholderFill();
|
Integer minimalPlaceholderFill = templateConfig.getMinimalPlaceholderFill();
|
||||||
|
int maxPlaceholder = 0;
|
||||||
List<String> placeholderList = new ArrayList<>();
|
List<String> placeholderList = new ArrayList<>();
|
||||||
if (minimalPlaceholderFill == null) {
|
if (minimalPlaceholderFill == null) {
|
||||||
minimalPlaceholderFill = 0;
|
minimalPlaceholderFill = 0;
|
||||||
@ -90,6 +91,7 @@ public class DynamicTaskGenerator {
|
|||||||
}
|
}
|
||||||
if (minimalPlaceholderFill == 0) {
|
if (minimalPlaceholderFill == 0) {
|
||||||
for (TemplateRespVO subTemplate : subTemplateList) {
|
for (TemplateRespVO subTemplate : subTemplateList) {
|
||||||
|
maxPlaceholder += 1;
|
||||||
if (subTemplate.getIsPlaceholder() == 1) {
|
if (subTemplate.getIsPlaceholder() == 1) {
|
||||||
minimalPlaceholderFill += 1;
|
minimalPlaceholderFill += 1;
|
||||||
}
|
}
|
||||||
@ -127,7 +129,11 @@ public class DynamicTaskGenerator {
|
|||||||
matchedPlaceholder += 1;
|
matchedPlaceholder += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (matchedPlaceholder >= minimalPlaceholderFill) {
|
if (matchedPlaceholder >= maxPlaceholder) {
|
||||||
|
log.info("当前人脸样本{}已超过最大占位素材{},自动创建任务", face.getFaceUrl(), maxPlaceholder);
|
||||||
|
taskService.createRenderTask(scenic.getId(), template.getId(), face.getId());
|
||||||
|
faceMapper.finishedJourney(face.getId());
|
||||||
|
} else if (matchedPlaceholder >= minimalPlaceholderFill) {
|
||||||
log.info("当前人脸样本{}已超过最小占位素材{},自动创建任务", face.getFaceUrl(), minimalPlaceholderFill);
|
log.info("当前人脸样本{}已超过最小占位素材{},自动创建任务", face.getFaceUrl(), minimalPlaceholderFill);
|
||||||
taskService.createRenderTask(scenic.getId(), template.getId(), face.getId());
|
taskService.createRenderTask(scenic.getId(), template.getId(), face.getId());
|
||||||
faceMapper.finishedJourney(face.getId());
|
faceMapper.finishedJourney(face.getId());
|
||||||
|
@ -10,7 +10,9 @@ import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
|
|||||||
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
|
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
|
||||||
import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO;
|
import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO;
|
||||||
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
|
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
|
||||||
import com.ycwl.basic.utils.OssUtil;
|
import com.ycwl.basic.storage.StorageFactory;
|
||||||
|
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||||
|
import com.ycwl.basic.storage.enums.StorageType;
|
||||||
import com.ycwl.basic.utils.SnowFlakeUtil;
|
import com.ycwl.basic.utils.SnowFlakeUtil;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -44,8 +46,6 @@ public class VideoPieceGetter {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private DeviceMapper deviceMapper;
|
private DeviceMapper deviceMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private OssUtil ossUtil;
|
|
||||||
@Autowired
|
|
||||||
private SourceMapper sourceMapper;
|
private SourceMapper sourceMapper;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -123,27 +123,23 @@ public class VideoPieceGetter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log.info("视频裁切成功");
|
log.info("视频裁切成功");
|
||||||
try {
|
IStorageAdapter adapter = StorageFactory.use("assets");
|
||||||
InputStream inputStream = new FileInputStream(outFile);
|
String url = adapter.uploadFile(outFile, "video-source", outFile.getName());
|
||||||
String url = ossUtil.uploadFile(inputStream, "user-video-source/", outFile.getName());
|
SourceEntity imgSource = sourceMapper.findBySampleId(faceSample.getId());
|
||||||
SourceEntity imgSource = sourceMapper.findBySampleId(faceSample.getId());
|
SourceEntity sourceEntity = new SourceEntity();
|
||||||
SourceEntity sourceEntity = new SourceEntity();
|
sourceEntity.setId(SnowFlakeUtil.getLongId());
|
||||||
sourceEntity.setId(SnowFlakeUtil.getLongId());
|
if (imgSource != null) {
|
||||||
if (imgSource != null) {
|
sourceEntity.setUrl(imgSource.getUrl());
|
||||||
sourceEntity.setUrl(imgSource.getUrl());
|
sourceEntity.setPosJson(imgSource.getPosJson());
|
||||||
sourceEntity.setPosJson(imgSource.getPosJson());
|
sourceEntity.setMemberId(imgSource.getMemberId());
|
||||||
sourceEntity.setMemberId(imgSource.getMemberId());
|
|
||||||
}
|
|
||||||
sourceEntity.setVideoUrl(url);
|
|
||||||
sourceEntity.setFaceSampleId(faceSample.getId());
|
|
||||||
sourceEntity.setMemberId(task.getMemberId());
|
|
||||||
sourceEntity.setScenicId(faceSample.getScenicId());
|
|
||||||
sourceEntity.setDeviceId(faceSample.getDeviceId());
|
|
||||||
sourceEntity.setType(1);
|
|
||||||
sourceMapper.add(sourceEntity);
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
|
sourceEntity.setVideoUrl(url);
|
||||||
|
sourceEntity.setFaceSampleId(faceSample.getId());
|
||||||
|
sourceEntity.setMemberId(task.getMemberId());
|
||||||
|
sourceEntity.setScenicId(faceSample.getScenicId());
|
||||||
|
sourceEntity.setDeviceId(faceSample.getDeviceId());
|
||||||
|
sourceEntity.setType(1);
|
||||||
|
sourceMapper.add(sourceEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean startFfmpegTask(FfmpegTask task) {
|
public boolean startFfmpegTask(FfmpegTask task) {
|
||||||
|
@ -1,126 +0,0 @@
|
|||||||
package com.ycwl.basic.utils;
|
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
|
||||||
import com.aliyun.oss.ClientException;
|
|
||||||
import com.aliyun.oss.HttpMethod;
|
|
||||||
import com.aliyun.oss.OSS;
|
|
||||||
import com.aliyun.oss.OSSClientBuilder;
|
|
||||||
import com.aliyun.oss.OSSException;
|
|
||||||
import com.aliyun.oss.model.PutObjectRequest;
|
|
||||||
import com.ycwl.basic.config.OssConfig;
|
|
||||||
import com.ycwl.basic.enums.BizCodeEnum;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
public class OssUtil {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private OssConfig ossConfig;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 上传文件到oss
|
|
||||||
* @param inputStream 文件数据流
|
|
||||||
* @param filename 文件全路径名称
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public String uploadFile(InputStream inputStream, String filename) {
|
|
||||||
return uploadFile(inputStream, ossConfig.getObjectName(), filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String uploadAssetFile(InputStream inputStream, String filename) {
|
|
||||||
return uploadFile(inputStream, "assets/", filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String uploadFile(InputStream inputStream, String path, String filename) {
|
|
||||||
String uploadFileName = path + filename;
|
|
||||||
OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndPoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
|
|
||||||
try {
|
|
||||||
PutObjectRequest putObjectRequest = new PutObjectRequest(ossConfig.getBucketName(), uploadFileName, inputStream);
|
|
||||||
ossClient.putObject(putObjectRequest);
|
|
||||||
String fileUrl = ossConfig.getUrl() + uploadFileName;
|
|
||||||
return fileUrl;
|
|
||||||
} catch (OSSException oe) {
|
|
||||||
log.error("Caught an OSSException, which means your request made it to OSS, "
|
|
||||||
+ "but was rejected with an error response for some reason."
|
|
||||||
+ " \n Error Message:" + oe.getErrorMessage()
|
|
||||||
+ " \n Error Code:" + oe.getErrorCode()
|
|
||||||
+ " \n Request ID:" + oe.getRequestId()
|
|
||||||
+ " \n Host ID:" + oe.getHostId()
|
|
||||||
);
|
|
||||||
|
|
||||||
} catch (ClientException ce) {
|
|
||||||
log.error("Caught an ClientException, which means the client encountered "
|
|
||||||
+ "a serious internal problem while trying to communicate with OSS, "
|
|
||||||
+ "such as not being able to access the network."
|
|
||||||
+ "Error Message:" + ce.getMessage());
|
|
||||||
} finally {
|
|
||||||
if (ossClient != null) {
|
|
||||||
ossClient.shutdown();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return BizCodeEnum.UPLOAD_FAILED.getMessage();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String generateSignedUrlForDownload(String path, String filename) {
|
|
||||||
String downloadFile = path + filename;
|
|
||||||
return generateSignedUrl(downloadFile, HttpMethod.GET);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String generateSignedUrlForUpload(String path, String filename) {
|
|
||||||
String uploadFileName = path + filename;
|
|
||||||
return generateSignedUrl(uploadFileName, HttpMethod.PUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String generateSignedUrl(String objectName, HttpMethod method) {
|
|
||||||
OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndPoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
|
|
||||||
return ossClient.generatePresignedUrl(ossConfig.getBucketName(), objectName, DateUtil.offsetHour(new Date(), 1), method).toString();
|
|
||||||
}
|
|
||||||
public String generateUrlOfFile(String path, String filename) {
|
|
||||||
String objectName = path + filename;
|
|
||||||
return ossConfig.getUrl() + objectName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean deleteFile(String filename) {
|
|
||||||
// 填写文件完整路径。文件完整路径中不能包含Bucket名称。
|
|
||||||
String objectName = filename;
|
|
||||||
|
|
||||||
OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndPoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
|
|
||||||
try {
|
|
||||||
// 删除文件或目录。如果要删除目录,目录必须为空。
|
|
||||||
ossClient.deleteObject(ossConfig.getBucketName(), objectName);
|
|
||||||
return true;
|
|
||||||
} catch (OSSException oe) {
|
|
||||||
log.error("Caught an OSSException, which means your request made it to OSS, "
|
|
||||||
+ "but was rejected with an error response for some reason."
|
|
||||||
+ " \n Error Message:" + oe.getErrorMessage()
|
|
||||||
+ " \n Error Code:" + oe.getErrorCode()
|
|
||||||
+ " \n Request ID:" + oe.getRequestId()
|
|
||||||
+ " \n Host ID:" + oe.getHostId()
|
|
||||||
);
|
|
||||||
} catch (ClientException ce) {
|
|
||||||
log.error("Caught an ClientException, which means the client encountered "
|
|
||||||
+ "a serious internal problem while trying to communicate with OSS, "
|
|
||||||
+ "such as not being able to access the network."
|
|
||||||
+ "Error Message:" + ce.getMessage());
|
|
||||||
} finally {
|
|
||||||
if (ossClient != null) {
|
|
||||||
ossClient.shutdown();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deleteFileByUrl(String faceUrl) {
|
|
||||||
URI uri = URI.create(faceUrl);
|
|
||||||
String objectName = uri.getPath();
|
|
||||||
deleteFile(objectName);
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.ycwl.basic.videoTask;
|
||||||
|
|
||||||
|
public class VideoTaskFactory {
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.ycwl.basic.videoTask.adapters;
|
||||||
|
|
||||||
|
public class DefaultAdapter implements IAdapter {
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.ycwl.basic.videoTask.adapters;
|
||||||
|
|
||||||
|
public interface IAdapter {
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.ycwl.basic.videoTask.chains;
|
||||||
|
|
||||||
|
import com.ycwl.basic.videoTask.chains.interceptor.IVidTaskGenChainInterceptor;
|
||||||
|
import com.ycwl.basic.videoTask.entity.VideoTaskGeneratorContext;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class VideoTaskGeneratorChain {
|
||||||
|
private final List<IVidTaskGenChainInterceptor> interceptors = new ArrayList<>();
|
||||||
|
private int index = 0;
|
||||||
|
|
||||||
|
public void addInterceptor(IVidTaskGenChainInterceptor interceptor) {
|
||||||
|
interceptors.add(interceptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void process(VideoTaskGeneratorContext context) {
|
||||||
|
if (index < interceptors.size()) {
|
||||||
|
interceptors.get(index++).process(context, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.ycwl.basic.videoTask.chains.interceptor;
|
||||||
|
|
||||||
|
import com.ycwl.basic.videoTask.chains.VideoTaskGeneratorChain;
|
||||||
|
import com.ycwl.basic.videoTask.entity.VideoTaskGeneratorContext;
|
||||||
|
|
||||||
|
public class CheckFaceCountInterceptor implements IVidTaskGenChainInterceptor {
|
||||||
|
@Override
|
||||||
|
public void process(VideoTaskGeneratorContext ctx, VideoTaskGeneratorChain chain) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.ycwl.basic.videoTask.chains.interceptor;
|
||||||
|
|
||||||
|
import com.ycwl.basic.videoTask.chains.VideoTaskGeneratorChain;
|
||||||
|
import com.ycwl.basic.videoTask.entity.VideoTaskGeneratorContext;
|
||||||
|
|
||||||
|
public interface IVidTaskGenChainInterceptor {
|
||||||
|
void process(VideoTaskGeneratorContext ctx, VideoTaskGeneratorChain chain);
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.ycwl.basic.videoTask.daos;
|
||||||
|
|
||||||
|
public class TemplateDao {
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.ycwl.basic.videoTask.entity;
|
||||||
|
|
||||||
|
public class VideoTaskGeneratorContext {
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.ycwl.basic.videoTask.enums;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
public enum VideoTaskTriggerReason {
|
||||||
|
DEVICE_UPLOAD("设备检测人脸"),
|
||||||
|
USER_MANUAL("用户手动触发"),
|
||||||
|
ADMIN_MANUAL("后台手动触发"),
|
||||||
|
SCHEDULE("定时触发"),
|
||||||
|
USER_FACE_UPLOAD("用户上传人脸触发");
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final String desc;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private String extData;
|
||||||
|
VideoTaskTriggerReason(String desc) {
|
||||||
|
this.desc = desc;
|
||||||
|
}
|
||||||
|
}
|
@ -119,17 +119,32 @@ YfkdFNxtYLdVAwuylMoV3fKI
|
|||||||
face:
|
face:
|
||||||
score: 80
|
score: 80
|
||||||
|
|
||||||
#阿里云OSS
|
# 存储
|
||||||
aliYunOss:
|
storage:
|
||||||
endpoint: "https://oss-cn-shanghai.aliyuncs.com"
|
configs:
|
||||||
accessKeyId: "LTAI5tCa641QdNHH9Ybg9u7V"
|
- name: "faces"
|
||||||
accessKeySecret: "RRVIgekoqx96Fgm2Gs7eQshMShcEpk"
|
type: "ALI_OSS"
|
||||||
bucketName: "frametour-assets"
|
config:
|
||||||
objectName: "user-faces/"
|
endpoint: "https://oss-cn-shanghai.aliyuncs.com"
|
||||||
url: "https://frametour-assets.oss-cn-shanghai.aliyuncs.com/"
|
accessKeyId: "LTAI5tCa641QdNHH9Ybg9u7V"
|
||||||
region: "cn-shanghai"
|
accessKeySecret: "RRVIgekoqx96Fgm2Gs7eQshMShcEpk"
|
||||||
|
bucketName: "frametour-assets"
|
||||||
|
prefix: "user-faces/"
|
||||||
|
url: "https://frametour-assets.oss-cn-shanghai.aliyuncs.com/"
|
||||||
|
region: "cn-shanghai"
|
||||||
|
- name: "assets"
|
||||||
|
type: "ALI_OSS"
|
||||||
|
config:
|
||||||
|
endpoint: "https://oss-cn-shanghai.aliyuncs.com"
|
||||||
|
accessKeyId: "LTAI5tCa641QdNHH9Ybg9u7V"
|
||||||
|
accessKeySecret: "RRVIgekoqx96Fgm2Gs7eQshMShcEpk"
|
||||||
|
bucketName: "frametour-assets"
|
||||||
|
prefix: "user-assets/"
|
||||||
|
url: "https://oss.zhentuai.com"
|
||||||
|
region: "cn-shanghai"
|
||||||
|
|
||||||
#阿里云人脸检测
|
#阿里云人脸检测
|
||||||
aliYunFace:
|
aliFace:
|
||||||
accessKeyId: "LTAI5tMwrmxVcUEKoH5QzLHx"
|
accessKeyId: "LTAI5tMwrmxVcUEKoH5QzLHx"
|
||||||
accessKeySecret: "ZCIP8aKx1jwX1wkeYIPQEDZ8fPtN1c"
|
accessKeySecret: "ZCIP8aKx1jwX1wkeYIPQEDZ8fPtN1c"
|
||||||
region: "cn-shanghai"
|
region: "cn-shanghai"
|
@ -117,17 +117,32 @@ YfkdFNxtYLdVAwuylMoV3fKI
|
|||||||
face:
|
face:
|
||||||
score: 80
|
score: 80
|
||||||
|
|
||||||
#阿里云OSS
|
# 存储
|
||||||
aliYunOss:
|
storage:
|
||||||
endpoint: "https://oss-cn-shanghai.aliyuncs.com"
|
configs:
|
||||||
accessKeyId: "LTAI5tCa641QdNHH9Ybg9u7V"
|
- name: "faces"
|
||||||
accessKeySecret: "RRVIgekoqx96Fgm2Gs7eQshMShcEpk"
|
type: "ALI_OSS"
|
||||||
bucketName: "frametour-assets"
|
config:
|
||||||
objectName: "user-faces/"
|
endpoint: "https://oss-cn-shanghai-internal.aliyuncs.com"
|
||||||
url: "https://frametour-assets.oss-cn-shanghai.aliyuncs.com/"
|
accessKeyId: "LTAI5tCa641QdNHH9Ybg9u7V"
|
||||||
region: "cn-shanghai"
|
accessKeySecret: "RRVIgekoqx96Fgm2Gs7eQshMShcEpk"
|
||||||
|
bucketName: "frametour-assets"
|
||||||
|
prefix: "user-faces/"
|
||||||
|
url: "https://frametour-assets.oss-cn-shanghai.aliyuncs.com/"
|
||||||
|
region: "cn-shanghai"
|
||||||
|
- name: "assets"
|
||||||
|
type: "ALI_OSS"
|
||||||
|
config:
|
||||||
|
endpoint: "https://oss-cn-shanghai-internal.aliyuncs.com"
|
||||||
|
accessKeyId: "LTAI5tCa641QdNHH9Ybg9u7V"
|
||||||
|
accessKeySecret: "RRVIgekoqx96Fgm2Gs7eQshMShcEpk"
|
||||||
|
bucketName: "frametour-assets"
|
||||||
|
prefix: "user-assets/"
|
||||||
|
url: "https://oss.zhentuai.com"
|
||||||
|
region: "cn-shanghai"
|
||||||
|
|
||||||
#阿里云人脸检测
|
#阿里云人脸检测
|
||||||
aliYunFace:
|
aliFace:
|
||||||
accessKeyId: "LTAI5tMwrmxVcUEKoH5QzLHx"
|
accessKeyId: "LTAI5tMwrmxVcUEKoH5QzLHx"
|
||||||
accessKeySecret: "ZCIP8aKx1jwX1wkeYIPQEDZ8fPtN1c"
|
accessKeySecret: "ZCIP8aKx1jwX1wkeYIPQEDZ8fPtN1c"
|
||||||
region: "cn-shanghai"
|
region: "cn-shanghai"
|
Loading…
x
Reference in New Issue
Block a user