Commit 3e0bac6f authored by 李成龙's avatar 李成龙

新增视频工程

parent d472496a
package com.yeejoin.amos.boot.core.restTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
// @Bean
// public RestTemplate restTemplate(){
// SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
// factory.setConnectTimeout(15000);
// factory.setReadTimeout(5000);
// return new RestTemplate(factory);
// }
}
package com.yeejoin.amos.boot.core.restTemplate;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import java.util.ArrayList;
import java.util.List;
/**
* @program: api
* @description:
* @author: lll
* @create: 2021-09-1 18:00
*/
public class WxMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
public WxMappingJackson2HttpMessageConverter(){
List<MediaType> mediaTypes=new ArrayList<>();
//添加text/html类型的支持
mediaTypes.add(MediaType.TEXT_HTML);
//添加text/plain类型的支持.微信接口会用到
mediaTypes.add(MediaType.TEXT_PLAIN);
setSupportedMediaTypes(mediaTypes);
}
}
package com.yeejoin.amos.boot.core.utils;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.util.concurrent.ListenableFutureCallback;
import org.springframework.web.client.AsyncRestTemplate;
import org.springframework.web.client.RestTemplate;
import com.yeejoin.amos.boot.core.restTemplate.WxMappingJackson2HttpMessageConverter;
/**
* @program: api
* @description:
* @author: lll
* @create: 2021-09-1 18:00
*/
public class RestTemplateUtil {
/**
* 发送表单参数的post请求
*
* @param url 请求url
* @param param 参数
* @param respType 返回类型
* @return T
*/
public static <T> T postForm(String url, Map<String, List<Object>> param, Class<T> respType) {
return getRestInstance().postForEntity(url, getHttpEntity(param, false), respType).getBody();
}
/**
* 发送表单参数的异步post请求
*
* @param url 请求url
* @param callback 回调接口
* @param respType 返回类型
*/
public static <T> void asyncPostForm(String url, Map<String, List<Object>> param,
Class<T> respType, ListenableFutureCallback<ResponseEntity<T>> callback) {
getAsyncRestInstance().postForEntity(url, getHttpEntity(param, false), respType).addCallback(callback);
}
/**
* 发送表单有参数get请求
*
* @param url 请求url
* @param param 参数对象
* @param respType 返回类型
* @return T
*/
public static <T> T getForm(String url, Class<T> respType, Map<String,String> param) {
return getRestInstance().getForEntity(url, respType, param).getBody();
}
/**
* @Description: 发送表单无参数的get请求
* @Param: [url, param, respType]
* @return: T
* @Author: tonyzhang
* @Date: 2019-01-18 17:23
*/
public static <T> T getForm(String url, Class<T> respType) {
return getRestInstance().getForObject(url, respType);
}
/**
* 获取HttpEntity实例对象
*
* @param param 参数对象
* @param isJson true 发送json请求,false发送表单请求
* @return HttpEntity
*/
private static <P> HttpEntity<P> getHttpEntity(P param, boolean isJson) {
HttpHeaders headers = new HttpHeaders();
if (isJson) {
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
} else {
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
}
return new HttpEntity<>(param, headers);
}
/*-----------------生产单例对象,方便自定义如何构造对象------------------*/
private static RestTemplate restInit() {
//设置连接超时和读取超时时间
SimpleClientHttpRequestFactory factory=new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(5000);
factory.setReadTimeout(5000);
RestTemplate restTemplate = new RestTemplate(factory);
FormHttpMessageConverter fastConverter = new FormHttpMessageConverter();
WxMappingJackson2HttpMessageConverter wmc=new WxMappingJackson2HttpMessageConverter();
restTemplate.getMessageConverters().add(fastConverter);
restTemplate.getMessageConverters().add(wmc);
return restTemplate;
}
private static AsyncRestTemplate asyncRestInit() {
return new AsyncRestTemplate();
}
private static RestTemplate getRestInstance() {
return RestSingle.INSTANCE;
}
private static AsyncRestTemplate getAsyncRestInstance() {
return AsyncRestSingle.INSTANCE;
}
private static class RestSingle {
private static final RestTemplate INSTANCE = restInit();
}
private static class AsyncRestSingle {
private static final AsyncRestTemplate INSTANCE = asyncRestInit();
}
}
\ No newline at end of file
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名--> <!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/knowledgebase.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern> <FileNamePattern>${LOG_HOME}/jpush.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数--> <!--日志文件保留天数-->
<MaxHistory>30</MaxHistory> <MaxHistory>30</MaxHistory>
<!--日志文件大小--> <!--日志文件大小-->
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名--> <!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/knowledgebase.%d{yyyy-MM-dd}.%i.log</FileNamePattern> <FileNamePattern>${LOG_HOME}/jpush.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数--> <!--日志文件保留天数-->
<MaxHistory>30</MaxHistory> <MaxHistory>30</MaxHistory>
<!--按大小分割同一天的--> <!--按大小分割同一天的-->
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>amos-boot-utils-video</artifactId>
<parent>
<artifactId>amos-boot-utils</artifactId>
<groupId>com.amosframework.boot</groupId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.amosframework.boot</groupId>
<artifactId>amos-boot-biz-common</artifactId>
<version>${amos-biz-boot.version}</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
</dependencies>
</project>
package com.yeejoin.amos;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableConfigurationProperties
@ServletComponentScan
@EnableDiscoveryClient
@EnableFeignClients
@EnableAsync
@EnableEurekaClient
@MapperScan({"org.typroject.tyboot.demo.face.orm.dao*",
"org.typroject.tyboot.face.*.orm.dao*",
"org.typroject.tyboot.core.auth.face.orm.dao*",
"org.typroject.tyboot.component.*.face.orm.dao*",
"com.yeejoin.amos.video.mapper",
"com.yeejoin.amos.boot.biz.common.dao.mapper" })
@ComponentScan({"org.typroject","com.yeejoin.amos"})
public class VideoApplication {
private static final Logger logger = LoggerFactory.getLogger(VideoApplication.class);
public static void main(String[] args) throws UnknownHostException {
ConfigurableApplicationContext context = SpringApplication.run(VideoApplication.class, args);
// GlobalExceptionHandler.setAlwaysOk(true);
Environment env = context.getEnvironment();
String ip = InetAddress.getLocalHost().getHostAddress();
String port = env.getProperty("server.port");
String path = env.getProperty("server.servlet.context-path");
logger.info("\n----------------------------------------------------------\n\t" +
"Application Amos-Biz-Boot is running! Access URLs:\n\t" +
"Swagger文档: \thttp://" + ip + ":" + port + path + "/doc.html\n" +
"----------------------------------------------------------");
}
}
package com.yeejoin.amos.video.config;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.message.BasicHeader;
import org.apache.tomcat.util.codec.binary.Base64;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchClientConfig {
@Value("${spring.elasticsearch.rest.uris}")
private String uris;
@Bean
@Qualifier("highLevelClient")
public RestHighLevelClient restHighLevelClient() {
String auth = Base64.encodeBase64String(("elastic:es123456").getBytes());
try {
String url = uris.replace("http://", "");
final String[] parts = StringUtils.split(url, ":");
HttpHost httpHost = new HttpHost(parts[0], Integer.parseInt(parts[1]), "http");
RestClientBuilder builder = RestClient.builder(httpHost);
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic","es123456"));
builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
// 该方法接收一个RequestConfig.Builder对象,对该对象进行修改后然后返回。
@Override
public RequestConfig.Builder customizeRequestConfig(
RequestConfig.Builder requestConfigBuilder) {
return requestConfigBuilder.setConnectTimeout(5000 * 1000) // 连接超时(默认为1秒)
.setSocketTimeout(6000 * 1000);// 套接字超时(默认为30秒)//更改客户端的超时限制默认30秒现在改为100*1000分钟
}
});// 调整最大重试超时时间(默认为30秒).setMaxRetryTimeoutMillis(60000);
builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.disableAuthCaching();
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
// builder.setDefaultHeaders(new BasicHeader[] {
// new BasicHeader("Authorization","Basic"+auth)
// });
return new RestHighLevelClient(builder);
} catch (Exception e) {
throw new IllegalStateException("Invalid ES nodes " + "property '" + uris + "'", e);
}
}
}
package com.yeejoin.amos.video.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import com.yeejoin.amos.boot.biz.common.controller.BaseController;
import com.yeejoin.amos.video.dao.impl.VideoOriginalServiceImpl;
import com.yeejoin.amos.video.dto.VideoOriginalDto;
import com.yeejoin.amos.video.entity.VideoOriginal;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* 模板表
*
* @author system_generator
* @date 2021-09-01
*/
@RestController
@Api(tags = "对接视频原始数据Api")
@RequestMapping(value = "/video-original")
public class VideoOriginalController extends BaseController {
@Autowired
private VideoOriginalServiceImpl videoOriginalServiceImpl;
@GetMapping("/hk/init")
@TycloudOperation(ApiLevel = UserType.AGENCY,needAuth=false)
@ApiOperation(httpMethod = "GET", value = "构建海康原始视频数据", notes = "构建海康原始视频数据")
public ResponseModel<Boolean> hkInitData() {
return ResponseHelper.buildResponse(videoOriginalServiceImpl.initEs("", ""));
}
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@ApiOperation(httpMethod = "GET", value = "按视频名称查询视频节点", notes = "按视频名称查询视频节点")
@GetMapping(value = "/list/video/{cn}")
public ResponseModel<List<VideoOriginalDto>> videoBySimilar( @PathVariable String cn) throws Exception {
return ResponseHelper.buildResponse(videoOriginalServiceImpl.qeueryByKeys(cn));
}
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@ApiOperation(httpMethod = "GET", value = "根据indexCode获取播放URL", notes = "根据indexCode获取播放URL")
@GetMapping(value = "/url/video/{indexCode}")
public ResponseModel<String> videoUrlByIndexCode( @PathVariable String indexCode) throws Exception {
return ResponseHelper.buildResponse(videoOriginalServiceImpl.qeueryByIndexCode(indexCode));
}
}
package com.yeejoin.amos.video.dao;
import java.util.List;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import com.yeejoin.amos.video.entity.VideoOriginal;
/**
* 模板表接口类
*
* @author system_generator
* @date 2021-09-01
*/
@Repository
public interface IVideoOriginalRepository extends PagingAndSortingRepository<VideoOriginal, String> {
List<VideoOriginal> findByCnLike(String cn);
}
package com.yeejoin.amos.video.dao.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Spliterator;
import java.util.stream.StreamSupport;
import javax.annotation.PostConstruct;
import org.apache.commons.compress.utils.Lists;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.FuzzyQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson.JSONObject;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.video.dao.IVideoOriginalRepository;
import com.yeejoin.amos.video.dto.VideoOriginalDto;
import com.yeejoin.amos.video.entity.VideoOriginal;
//import net.sf.json.JSONObject;
/**
* 模板表服务实现类
*
* @author system_generator
* @date 2021-09-01
*/
@Service
public class VideoOriginalServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(VideoOriginalServiceImpl.class);
@Autowired
private RestTemplate restTemplate;
@Autowired
private IVideoOriginalRepository iVideoOriginalRepository;
@Autowired
private ElasticsearchRestTemplate elasticsearchTemplate;
@Value("${biz.hk.video.url}")
private String hkVideoUrl;
@Value("${biz.hk.video.APPkey}")
private String hkVideoAPPkey;
@Value("${biz.hk.video.APPsecret}")
private String hkVideoAPPsecret;
@Value("${biz.hk.video.csv}")
private String hkVideoCsv;
private final String protocol="hls";
@PostConstruct
public void init() {
// 初始化ES,重建索引
// initEs();
}
/**
* 重建索引
*/
public Boolean initEs(String userId,String userName) {
// iVideoOriginalRepository.deleteAll();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(30000);
factory.setReadTimeout(30000);
restTemplate.setRequestFactory(factory);
// String objectStr = "{\"httpMethod\":\"GET\",\"path\":\"/api/resource/v1/csv/downloadcsv/{csvFileName}\",\"headers\":{},\"query\":{},\"parameter\":{\"csvFileName\":\"otherDomainCameraFull_1.csv\"},\"mock\":false,\"appKey\":\"25907430\",\"appSecret\":\"RJj3WmSNdQuyX0yCR02b\"}";
String objectStr = new StringBuilder().append(
"{\"httpMethod\":\"GET\",\"path\":\"/api/resource/v1/csv/downloadcsv/{csvFileName}\",\"headers\":{},\"query\":{},\"parameter\":{\"csvFileName\":\"")
.append(hkVideoCsv).append("\"},\"mock\":false,\"appKey\":\"").append(hkVideoAPPkey)
.append("\",\"appSecret\":\"").append(hkVideoAPPsecret).append("\"}").toString();
JSONObject obj = JSONObject.parseObject(objectStr);
HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers); // 组装
logger.info("开始查询海康视频数据"+objectStr);
ResponseEntity<String> response = restTemplate.exchange(hkVideoUrl, HttpMethod.POST, request, String.class);
String ss = response.getBody();
JSONObject obj1 = JSONObject.parseObject(ss);
String sss = obj1.get("response").toString();
logger.info("完成海康视频数据查询:长度:"+sss.length());
String[] str = sss.split("\n");
List<VideoOriginal> resultData = new ArrayList<VideoOriginal>();
for (String originalStr : str) {
String[] strstr = originalStr.split(",");
String cn = strstr[0];
String indexCode = strstr[1];
if (!cn.equals("cn") && !indexCode.equals("indexCode")) {
VideoOriginal videoOriginal = new VideoOriginal();
videoOriginal.setCn(cn);
videoOriginal.setIndexCode(indexCode);
videoOriginal.setOriginalData(originalStr);
videoOriginal.setRecUserId(userId);
videoOriginal.setRecUserName(userName);
videoOriginal.setRecDate(DateUtils.getDateNowString());
resultData.add(videoOriginal);
// iVideoOriginalRepository.save(videoOriginal);
}
}
logger.info("开始搜索引擎中存储"+resultData.size());
iVideoOriginalRepository.saveAll(resultData);
logger.info("完成搜索引擎中存储");
return true;
}
public List<VideoOriginalDto> qeueryByKeys(String cn) {
// TODO Auto-generated method stub
// List<VideoOriginal> videoOriginalList = new ArrayList<VideoOriginal>();
// MatchQueryBuilder builder = QueryBuilders.matchQuery("cn", cn);
//// FuzzyQueryBuilder builder = QueryBuilders.fuzzyQuery("cn", cn);
// NativeSearchQuery searchQuery = new NativeSearchQuery(builder);
// SearchHits<VideoOriginal> searchHits = elasticsearchTemplate.search(searchQuery, VideoOriginal.class);
// BoolQueryBuilder boolMust = QueryBuilders.boolQuery();
// BoolQueryBuilder qb4 = QueryBuilders.boolQuery()
// .should(QueryBuilders.termQuery("cn", cn));
// boolMust.must(qb4);
// NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder()
// //过滤条件
// .withQuery(boolMust);
// SearchHits<VideoOriginal> searchHits = elasticsearchTemplate.search(queryBuilder.build(), VideoOriginal.class);
// for (SearchHit searchHit : searchHits.getSearchHits())
// {
// System.out.println(searchHit.getContent());
// JSONObject jsonObject = (JSONObject) JSONObject.toJSON(searchHit.getContent());
// VideoOriginal videoOriginals = (VideoOriginal) JSONObject.toJavaObject(jsonObject,VideoOriginal.class);
// videoOriginalList.add(videoOriginals);
// }
List<VideoOriginalDto> videoOriginalDtoList = new ArrayList<VideoOriginalDto>();
if(cn.equals("all")) {
Iterable<VideoOriginal> it = iVideoOriginalRepository.findAll();
for (VideoOriginal videoOriginal : it) {
videoOriginalDtoList.add(transDto(videoOriginal));
}
}else {
List<VideoOriginal> videoOriginalList = iVideoOriginalRepository.findByCnLike(cn);
for (VideoOriginal videoOriginal : videoOriginalList) {
videoOriginalDtoList.add(transDto(videoOriginal));
}
}
return videoOriginalDtoList;
}
private VideoOriginalDto transDto(VideoOriginal videoOriginal){
VideoOriginalDto videoOriginalDto = new VideoOriginalDto();
videoOriginalDto.setCn(videoOriginal.getCn());
videoOriginalDto.setIndexCode(videoOriginal.getIndexCode());
return videoOriginalDto;
}
public String qeueryByIndexCode(String indexCode) {
// TODO Auto-generated method stub
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(30000);
factory.setReadTimeout(30000);
restTemplate.setRequestFactory(factory);
String objectStr = new StringBuilder().append("{\"httpMethod\":\"POST\",\"path\":\"/api/video/v1/cameras/previewURLs\",\"headers\":{},\"query\":{},\"parameter\":{},\"body\":{\"indexCode\":\"")
.append(indexCode).append("\",\"netZoneCode\":\"0\",\"transmode\":1,\"streamType\":0,\"protocol\":\"").append(protocol).append("\"},\"contentType\":\"application/json;charset=UTF-8\",\"mock\":false,\"appKey\":\"").append(hkVideoAPPkey)
.append("\",\"appSecret\":\"").append(hkVideoAPPsecret).append("\"}").toString();
JSONObject obj = JSONObject.parseObject(objectStr);
HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers); // 组装
logger.info("开始查询海康视频数据"+objectStr);
ResponseEntity<String> response = restTemplate.exchange(hkVideoUrl, HttpMethod.POST, request, String.class);
String ss = response.getBody();
JSONObject obj1 = JSONObject.parseObject(ss);
String sss = obj1.get("response").toString();
String ssss = JSONObject.parseObject(sss).get("data").toString();
String sssss =JSONObject.parseObject(ssss).get("url").toString();
logger.info("完成海康视频数据查询:长度:"+sss.length());
return sssss;
}
}
\ No newline at end of file
package com.yeejoin.amos.video.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.yeejoin.amos.boot.biz.common.dto.BaseDto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 模板表
*
* @author system_generator
* @date 2021-09-01
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="VideoOriginalDto", description="模板表")
public class VideoOriginalDto extends BaseDto {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "视频名称")
private String cn;
@ApiModelProperty(value = "视频代码")
private String indexCode;
}
package com.yeejoin.amos.video.entity;
import java.util.Date;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 模板表
*
* @author system_generator
* @date 2021-09-01
*/
@Data
@Accessors(chain = true)
@Document(indexName = "video", type = "videoOriginal", shards = 1, replicas = 0)
public class VideoOriginal {
/** 主键 */
@Id
private String sequenceNbr;
/**
* 视频名称
*/
@Field(type = FieldType.Keyword)
private String cn;
/**
* 视频代码
*/
@Field(type = FieldType.Text)
private String indexCode;
/**
* 原始数据
*/
@Field(type = FieldType.Text, index = false)
private String originalData;
@Field(type = FieldType.Text, index = false)
private String recDate;
@Field(type = FieldType.Text, index = false)
private String recUserId;
@Field(type = FieldType.Text, index = false)
private String recUserName;
}
package com.yeejoin.amos.video.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.video.entity.VideoOriginal;
/**
* 模板表 Mapper 接口
*
* @author system_generator
* @date 2021-09-01
*/
public interface VideoOriginalMapper extends BaseMapper<VideoOriginal> {
}
## DB properties:
spring.datasource.url=jdbc:mysql://172.16.6.60:3306/amos-jcs-biz?allowMultiQueries=true&serverTimezone=GMT%2B8&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root_123
## eureka properties:
eureka.client.serviceUrl.defaultZone=http://172.16.10.72:10001/eureka/
## redis properties:
spring.redis.database=0
spring.redis.host=172.16.10.85
spring.redis.port=6379
spring.redis.password=amos2019Redis
## ES properties:
biz.elasticsearch.address=172.16.3.39
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=${biz.elasticsearch.address}:9300
spring.elasticsearch.rest.uris=http://${biz.elasticsearch.address}:9200
##biz custem properties
biz.hk.video.url=http://11.11.16.12:9017/artemis-web/debug
biz.hk.video.APPkey=25907430
biz.hk.video.APPsecret=RJj3WmSNdQuyX0yCR02b
biz.hk.video.csv=otherDomainCameraFull_1.csv
\ No newline at end of file
spring.application.name=VIDEO
server.servlet.context-path=/video
server.port=7900
spring.profiles.active=dev
## redis失效时间
redis.cache.failure.time=10800
## DB properties:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=25
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=120000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
## eureka properties:
eureka.client.registry-fetch-interval-seconds=5
eureka.instance.prefer-ip-address=true
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include=*
eureka.instance.health-check-url-path=/actuator/health
eureka.instance.lease-expiration-duration-in-seconds=10
eureka.instance.lease-renewal-interval-in-seconds=5
eureka.instance.metadata-map.management.context-path=${server.servlet.context-path}/actuator
eureka.instance.status-page-url-path=/actuator/info
eureka.instance.metadata-map.management.api-docs=http://localhost:${server.port}${server.servlet.context-path}/doc.html
## redis properties:
spring.redis.lettuce.pool.max-active=200
spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.min-idle=0
spring.redis.expire.time=300
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="log" />
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/video.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
<!--日志文件大小-->
<MaxFileSize>30mb</MaxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
-->
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="DEBUG"/>
<logger name="org.mybatis" level="DEBUG" />
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="org.springframework" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="log"/>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/video.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
<!--按大小分割同一天的-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
-->
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="INFO"/>
<logger name="org.mybatis" level="INFO"/>
<logger name="java.sql.Connection" level="INFO"/>
<logger name="java.sql.Statement" level="INFO"/>
<logger name="java.sql.PreparedStatement" level="INFO"/>
<logger name="com.baomidou.mybatisplus" level="INFO"/>
<logger name="org.typroject" level="INFO"/>
<logger name="com.yeejoin.amos" level="INFO"/>
<logger name="org.springframework" level="INFO"/>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.boot.module.common.api.mapper.VideoOriginalMapper">
</mapper>
...@@ -17,5 +17,6 @@ ...@@ -17,5 +17,6 @@
<modules> <modules>
<module>amos-boot-utils-jpush</module> <module>amos-boot-utils-jpush</module>
<module>amos-boot-utils-video</module>
</modules> </modules>
</project> </project>
\ No newline at end of file
...@@ -252,6 +252,11 @@ ...@@ -252,6 +252,11 @@
<artifactId>liquibase-core</artifactId> <artifactId>liquibase-core</artifactId>
<version>4.4.3</version> <version>4.4.3</version>
</dependency> </dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<repositories> <repositories>
......
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