src/main/java/com/whyc/config/StaticResourceConfig.java
@@ -27,6 +27,8 @@ //这个是可行的,解析的时候path为*.html,校验路径admin下是否存在 registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/"); //录像视频mp4文件路径转为http url registry.addResourceHandler("/video/**").addResourceLocations("file:/battery_system/video_system/ZLMediaKit/www/record/rtp/"); super.addResourceHandlers(registry); } src/main/java/com/whyc/constant/YamlProperties.java
@@ -3,6 +3,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.List; /** * Yaml配置参数 实体类 */ @@ -56,6 +58,8 @@ public static String publicKey; public static String privateKey; public static List<String> videoStreamIds; @Value("${custom.rsa.publicKey}") public void setPublicKey(String publicKey) { @@ -172,6 +176,8 @@ public void setFtpPassword(String ftpPassword){ YamlProperties.ftpPassword=ftpPassword; }*/ @Value("${video.streamIds}") public void setVideoStreamIds(List<String> videoStreamIds) { YamlProperties.videoStreamIds = videoStreamIds; } } src/main/java/com/whyc/controller/VideoController.java
@@ -1,14 +1,22 @@ package com.whyc.controller; import com.whyc.dto.Response; import com.whyc.dto.Response4Http; import com.whyc.service.VideoService; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * 摄像头的存储逻辑分为如下步骤: * 1.程序启动时,获取所有的视频流id,并openRtpServer来开启流,执行startRecord来启动录制,自动1个小时保存一次录像. * 2.录像的保存路径映射到http url中,可通过http获取mp4 * 3.每秒钟检测所有的视频流 是否 开启状态是否异常,如果异常,重新开启流 */ @RestController @RequestMapping("video") @Api(tags = "摄像头视频") @@ -17,21 +25,24 @@ @Autowired private VideoService service; @RequestMapping("getVideoStreamIds") public Response<List> getVideoStreamIds() { List<String> videoStreamIds = service.getVideoStreamIds(); return new Response<List>().set(1, videoStreamIds, "获取摄像头视频流成功"); @GetMapping("getVideoStreamIds") public Response4Http getVideoStreamIds() { return service.getVideoStreamIds(); } @RequestMapping("startRecord") public Response<String> startRecord(String streamId) { service.startRecord(streamId); return new Response<String>().set(1, "开始录制视频流成功"); @GetMapping("startRecord") public Response4Http startRecord(String streamId) { return service.startRecord(streamId); } @RequestMapping("stopRecord") public Response<String> stopRecord(String streamId) { service.stopRecord(streamId); return new Response<String>().set(1, "停止录制视频流成功"); @GetMapping("stopRecord") public Response4Http<String> stopRecord(String streamId) { return service.stopRecord(streamId); } @GetMapping("getMp4RecordFile") public Response4Http<String> getMp4RecordFile(String streamId,String period){ return service.getMp4RecordFile(streamId,period); } } src/main/java/com/whyc/dto/Mp4FileDTO.java
New file @@ -0,0 +1,25 @@ package com.whyc.dto; import java.util.List; public class Mp4FileDTO { private List<String> paths; private String rootPath; public List<String> getPaths() { return paths; } public void setPaths(List<String> paths) { this.paths = paths; } public String getRootPath() { return rootPath; } public void setRootPath(String rootPath) { this.rootPath = rootPath; } } src/main/java/com/whyc/dto/Response4Http.java
New file @@ -0,0 +1,112 @@ package com.whyc.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.ToString; import java.io.Serializable; /** * 视频api接口数据响应对象 */ @ApiModel @ToString public class Response4Http<T> implements Serializable { private Integer code; @ApiModelProperty private T data; private T data2; private String msg; private Boolean status; private Boolean result; public Response4Http<T> setCode(Integer code) { this.code = code; return this; } public Response4Http<T> setData(T data) { this.data = data; return this; } public Response4Http<T> set(Integer code, T data) { this.code = code; this.data = data; return this; } public Response4Http<T> set(Integer code, T data, String msg) { this.code = code; this.data = data; this.msg = msg; return this; } public Response4Http<T> set(Integer code) { this.code = code; return this; } public Response4Http<T> setII(Integer code, String msg) { this.code = code; this.msg = msg; return this; } public Response4Http<T> setII(Integer code, T data, T data2, String msg) { this.code = code; this.msg = msg; this.data = data; this.data2 = data2; return this; } public Response4Http setStatus(int code, T data, Boolean status) { this.code = code; this.data = data; this.status = status; return this; } public Integer getCode() { return code; } public T getData() { return data; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData2() { return data2; } public void setData2(T data2) { this.data2 = data2; } public Boolean getStatus() { return status; } public void setStatus(Boolean status) { this.status = status; } public Boolean getResult() { return result; } public void setResult(Boolean result) { this.result = result; } } src/main/java/com/whyc/listener/ApplicationListener.java
New file @@ -0,0 +1,67 @@ //package com.whyc.listener; // //import com.whyc.constant.YamlProperties; //import com.whyc.dto.Response; //import com.whyc.service.VideoService; //import org.springframework.beans.factory.annotation.Autowired; // //import javax.servlet.ServletContext; //import javax.servlet.ServletContextEvent; //import javax.servlet.ServletContextListener; //import javax.servlet.annotation.WebListener; //import java.util.List; // //import static java.lang.Thread.sleep; // ///** // * 应用启动时初始化 // * 应用关闭时销毁 // */ //@WebListener //public class ApplicationListener implements ServletContextListener { // // @Autowired // private VideoService videoService; // // /** // * 1.初始化,开启视频流并启动录像存储 // * @param servletContextEvent // */ // @Override // public void contextInitialized(ServletContextEvent servletContextEvent) { // ServletContext application = servletContextEvent.getServletContext(); // //考虑意外情况:突然程序死机或者电脑断电重启,需要延时启动录像,因为视频推流服务还未完成. // try { // //延时20s // sleep(20000); // } catch (InterruptedException e) { // throw new RuntimeException(e); // } // // // //1.录像存储 // //获取所有的流id // List<String> videoStreamIds = YamlProperties.videoStreamIds; // //开启录像存储 // videoStreamIds.forEach(streamId -> { // //添加流 // Response<String> response = videoService.addStreamProxy(streamId); // // //TODO 判断是否在录像,不在的话,开启录像 // // Response response2 = videoService.startRecord(streamId); // if(!(response2.getCode() ==1 && ((boolean) response2.getData()))){ // System.out.println("流id为:"+streamId+"的信息:"+response2.getMsg()); // }else{ // System.out.println("流id为:"+streamId+"的信息:"+response2.getData()); // } // }); // // } // // @Override // public void contextDestroyed(ServletContextEvent servletContextEvent) { // //关闭所有流 // //videoService.closeStreams(); // } //} src/main/java/com/whyc/schedule/VideoScheduleService.java
@@ -1,11 +1,23 @@ package com.whyc.schedule; import com.whyc.constant.YamlProperties; import com.whyc.dto.Response; import com.whyc.dto.Response4Http; import com.whyc.factory.ThreadPoolExecutorFactory; import com.whyc.service.VideoService; import com.whyc.util.DateUtil; import com.whyc.util.FileUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; @EnableScheduling @Component @@ -14,19 +26,71 @@ @Autowired private VideoService service; /**凌晨0点执行一次,录制视频流*/ @Scheduled(cron = "0 0 0 * * ? ") public void getAndSaveB247(){ /** * 1.监控录制,频次为2s. * 2.视频录制的判断逻辑是: * 是否存在流 * 是否在录制 * 3.考虑意外情况:突然程序死机或者电脑断电重启,需要延时启动录像,因为视频推流服务还未完成,延时20s开始检测 * * */ //@Scheduled(cron = "0/2 * * * * ? ") @Scheduled(fixedRate = 2000,initialDelay = 20000) public void startRecordAndCheck(){ ThreadPoolExecutorFactory.getPoolExecutor().execute(()->{ //service.getAndSaveB247(); List<String> videoStreamIds = YamlProperties.videoStreamIds; Response4Http streamIdsOnlineRes = service.getVideoStreamIds(); List<String> streamIdsOnline = (List<String>) streamIdsOnlineRes.getData2()==null?new ArrayList<>():(List<String>) streamIdsOnlineRes.getData2(); if(streamIdsOnlineRes.getCode() == 1 && ((boolean) streamIdsOnlineRes.getData())){ videoStreamIds.forEach(streamId->{ if(!streamIdsOnline.contains(streamId)){ //流不存在 //添加流 Response4Http<String> response = service.addStreamProxy(streamId); Response4Http response2 = service.startRecord(streamId); if(!(response2.getCode() ==1 && ((boolean) response2.getData()))){ System.out.println("流id为:"+streamId+"的信息:"+response2.getMsg()); }else{ System.out.println("流id为:"+streamId+"的信息:"+response2.getData()); } }else{ //流存在 //检查是否在录制状态 Response4Http recordingRes = service.isRecording(streamId); if(!(boolean)recordingRes.getData()){ //不在录制,则进行录制 Response4Http response2 = service.startRecord(streamId); if(!(response2.getCode() ==1 && ((boolean) response2.getData()))){ System.out.println("流id为:"+streamId+"的信息:"+response2.getMsg()); }else{ System.out.println("流id为:"+streamId+"的信息:"+response2.getData()); } } } }); } }); } /**凌晨0点0分2秒执行一次,停止上次的录制视频流*/ @Scheduled(cron = "2 0 0 * * ? ") public void getAndSaveA250(){ ThreadPoolExecutorFactory.getPoolExecutor().execute(()->{ //service.getAndSaveA250(); /** * 录像保持3天 */ @Scheduled(cron= "0 0 3 * * ?") public void recordRecycle(){ System.out.println("-----------执行录像循环----------:"+ DateUtil.YYYY_MM_DD_HH_MM_SS.format(new Date())); //文件夹路径 /battery_system/video_system/Debug/www/record/rtp/{streamId}/{day}} List<String> videoStreamIds = YamlProperties.videoStreamIds; videoStreamIds.forEach(streamId ->{ String dirPath = "/battery_system/video_system/Debug/www/record/rtp/"+streamId; File dirFile = new File(dirPath); String[] dirList = dirFile.list(); List<String> dirList2 = Arrays.asList(dirList); for (int i = 0; i < dirList2.size()-3; i++) { //按顺序删除,保留最后3个day的视频录像文件夹 String dirPath2Remove = dirPath + File.separator + dirList2.get(i); File dir2Remove = new File(dirPath2Remove); FileUtil.deleteFile(dir2Remove); } }); } src/main/java/com/whyc/service/VideoService.java
@@ -1,13 +1,17 @@ package com.whyc.service; import com.google.gson.internal.LinkedTreeMap; import com.whyc.dto.Mp4FileDTO; import com.whyc.dto.Response; import com.whyc.util.ActionUtil; import com.whyc.dto.Response4Http; import com.whyc.util.HttpUtil; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; import static com.whyc.util.HttpUtil.urlEncode; @@ -21,70 +25,143 @@ * 获取视频流id * @return */ public List<String> getVideoStreamIds() { public Response4Http getVideoStreamIds() { Response4Http responseResult = new Response4Http<>(); Map<String, Object> params = new HashMap<>();//组合参数 params.put("pageIndex", 1); params.put("pageSize", 1); params.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj"); String queryParams = urlEncode(params); String httpUrl ="http://192.168.10.133:9092/index/api/getMediaList"; String httpUrl ="http://127.0.0.1:9092/index/api/getMediaList"; Response response = HttpUtil.doGet(httpUrl, queryParams); Integer httpResponseCode = response.getCode(); String responseJson = (String) response.getData(); if(httpResponseCode == 1) { //请求成功 Response responseHttp = HttpUtil.getGson().fromJson(responseJson, Response.class); if(responseHttp.getCode() == 1) { //TODO 需要实际调试,目前返回的数据结构未确定 return HttpUtil.getGson().fromJson(responseHttp.getData().toString(), List.class); }else{ return null; Response4Http responseHttp = HttpUtil.getGson().fromJson(responseJson, Response4Http.class); if(responseHttp.getCode() == 0 ) { //接口返回状态码为成功 if(responseHttp.getData()!=null) { List<LinkedTreeMap<String, Object>> list = (List) responseHttp.getData(); Stream<LinkedTreeMap<String, Object>> linkedTreeMapStream = list.stream().filter(item -> ((String) item.get("schema")).equals("rtsp")); return responseResult.setII(1,true,linkedTreeMapStream.map(item -> (String) item.get("stream")).collect(Collectors.toList()),null); }{ return responseResult.set(1,true,"未查询到已开启的流"); } }else{ //接口返回状态码为失败,获取msg return responseResult.set(1,false,responseHttp.getMsg()); } }else{ return null; }else{ //请求失败 return responseResult.set(0,response.getData(),response.getMsg()); } } public void startRecord(String streamId){ /** * 1个小时录制为视频录制单个时长 : * max_second = 1*60*60 * * @param streamId * @return */ public Response4Http startRecord(String streamId){ Map<String, Object> params = new HashMap<>();//组合参数 params.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj"); params.put("type", 1); params.put("vhost", "__defaultVhost__"); params.put("app", "rtp"); params.put("stream", streamId); String queryParams = urlEncode(params); String httpUrl ="http://192.168.10.133:9092/index/api/startRecord"; Response response = HttpUtil.doGet(httpUrl, queryParams); Integer code = response.getCode(); String responseJson = (String) response.getData(); if(code == 1) { //请求成功 Response responseHttp = HttpUtil.getGson().fromJson(responseJson, Response.class); if(responseHttp.getCode() == 0 && responseHttp.getMsg().equals("success")) { //请求成功 }else{ System.out.println(responseHttp.getMsg()); } } params.put("max_second",3600); String httpUrl ="http://127.0.0.1:9092/index/api/startRecord"; //Response response = HttpUtil.doGet(httpUrl, queryParams); //Integer code = response.getCode(); //String responseJson = (String) response.getData(); return HttpUtil.doGet(httpUrl,params); } public void stopRecord(String streamId){ public Response4Http stopRecord(String streamId){ Map<String, Object> params = new HashMap<>();//组合参数 params.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj"); params.put("type", 1); params.put("vhost", "__defaultVhost__"); params.put("app", "rtp"); params.put("stream", streamId); String queryParams = urlEncode(params); String httpUrl ="http://192.168.10.133:9092/index/api/stopRecord"; String httpUrl ="http://127.0.0.1:9092/index/api/stopRecord"; return HttpUtil.doGet(httpUrl,params); /*String queryParams = urlEncode(params); String httpUrl ="http://127.0.0.1:9092/index/api/stopRecord"; Response response = HttpUtil.doGet(httpUrl, queryParams); Integer code = response.getCode(); String responseJson = (String) response.getData(); if(code == 1) { //请求成功 Response responseHttp = HttpUtil.getGson().fromJson(responseJson, Response.class); Response4Http responseHttp = HttpUtil.getGson().fromJson(responseJson, Response4Http.class); if(responseHttp.getCode() == 0 && responseHttp.getMsg().equals("success")) { //请求成功 }else{ System.out.println(responseHttp.getMsg()); } } }*/ } /** * getMp4RecordFile */ public Response4Http<String> getMp4RecordFile(String streamId, String period){ Map<String, Object> params = new HashMap<>();//组合参数 params.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj"); params.put("type", 1); params.put("vhost", "__defaultVhost__"); params.put("app", "rtp"); params.put("stream", streamId); params.put("period",period); String httpUrl ="http://127.0.0.1:9092/index/api/getMp4RecordFile"; Response4Http response4Http = HttpUtil.doGet(httpUrl, params); //data格式为:"data" : { // "paths" : [ "2020-01-25", "2020-01-24" ], // "rootPath" : "/www/record/live/ss/" // } String dataStr = (String) response4Http.getData2(); Mp4FileDTO mp4FileDTO = HttpUtil.getGson().fromJson(dataStr, Mp4FileDTO.class); response4Http.setData2(mp4FileDTO); return response4Http; /*if(code == 1) { //请求成功 Response responseHttp = HttpUtil.getGson().fromJson(responseJson, Response.class); if(responseHttp.getCode() == 0 && responseHttp.getMsg().equals("success")) { //请求成功 System.out.println(responseHttp.getData()); return responseJson; }else{ System.out.println(responseHttp.getMsg()); } }*/ } public Response4Http<String> openRtpServer(String streamId) { HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("port", 0); paramMap.put("tcp_mode", 1); paramMap.put("stream_id", streamId); paramMap.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj"); return HttpUtil.doGet("http://127.0.0.1:9092/index/api/openRtpServer", paramMap); } public Response4Http<String> addStreamProxy(String streamId) { HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("vhost", "__defaultVhost__"); paramMap.put("app", "rtp"); paramMap.put("stream", streamId); paramMap.put("url", "rtsp://127.0.0.1:554/rtp/"+streamId); paramMap.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj"); return HttpUtil.doGet("http://127.0.0.1:9092/index/api/addStreamProxy", paramMap); } public Response4Http isRecording(String streamId){ Map<String, Object> params = new HashMap<>();//组合参数 params.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj"); params.put("type", 1); params.put("vhost", "__defaultVhost__"); params.put("app", "rtp"); params.put("stream", streamId); String httpUrl ="http://127.0.0.1:9092/index/api/isRecording"; return HttpUtil.doGet(httpUrl, params); } } src/main/java/com/whyc/util/FileUtil.java
New file @@ -0,0 +1,30 @@ package com.whyc.util; import java.io.File; public class FileUtil { public static Boolean deleteFile(File file) { //判断文件不为null或文件目录存在 if (file == null || !file.exists()) { System.out.println("文件删除失败,请检查文件是否存在以及文件路径是否正确"); return false; } //获取目录下子文件 File[] files = file.listFiles(); //遍历该目录下的文件对象 for (File f : files) { //判断子目录是否存在子目录,如果是文件则删除 if (f.isDirectory()) { //递归删除目录下的文件 deleteFile(f); } else { //文件删除 f.delete(); //打印文件名 } } //文件夹删除 file.delete(); return true; } } src/main/java/com/whyc/util/HttpUtil.java
@@ -4,6 +4,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonSyntaxException; import com.whyc.dto.Response; import com.whyc.dto.Response4Http; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -265,4 +266,43 @@ result = result.substring(0, result.lastIndexOf("&")); return result; } /** * 执行GET请求,传入Map参数和Url,获取响应 */ public static Response4Http doGet(String httpUrl, Map<String, ?> params) { Response4Http responseResult = new Response4Http<>(); String queryParams = urlEncode(params); Response response = HttpUtil.doGet(httpUrl, queryParams); Integer httpResponseCode = response.getCode(); String responseJson = (String) response.getData(); if(httpResponseCode == 1) { //请求成功 Response4Http responseHttp = HttpUtil.getGson().fromJson(responseJson, Response4Http.class); if(responseHttp.getCode() == 0 ) { //接口返回状态码为成功 //返回信息有 data属性 if(responseHttp.getData()!=null) { return responseResult.setII(1,true,responseHttp.getData(),null); } //返回信息有 status属性 else if(responseHttp.getStatus() !=null){ return responseResult.setStatus(1,true,responseHttp.getStatus()); } //返回信息有 result属性 else if(responseHttp.getResult() !=null){ responseResult.setResult(responseHttp.getResult()); return responseResult.set(1,true); } else{ return responseResult.set(1,true,"请求成功且返回数据正常,无数据信息"); } }else{ //接口返回状态码为失败 // 返回信息有 msg属性 return responseResult.set(1,false,responseHttp.getMsg()); } }else{ //请求失败 return responseResult.set(0,response.getData(),response.getMsg()); } } } src/main/resources/config/application-dev.yml
@@ -3,7 +3,7 @@ type: 1 #服务端口号 server: port: 8088 port: 8087 serverHeader: servlet: context-path: /br @@ -20,9 +20,14 @@ datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.highgo.jdbc.Driver url: jdbc:highgo://192.168.10.183:5866/highgo?rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8 url: jdbc:highgo://192.168.10.133:5866/highgo?rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8 username: sysdba password: Lmx&8688139 password: Fg001@HDW # type: com.alibaba.druid.pool.DruidDataSource # driver-class-name: com.mysql.cj.jdbc.Driver # url: jdbc:mysql://localhost:3360/db_user?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false # username: root # password: lmx8688139 maxIdel: 60 initialPoolSize: 2 minPoolSize: 5 @@ -86,3 +91,28 @@ defaultKey: ENC(KdXXhvt6v7BDw7MgsR4J1OgahZgjl3kEil10+147oGA=) iv: ENC(Gtzf6s+BRoC1iQsRLMswSlBDSMom0kWtx5+SMJgaVDg=) i18n: zh-CN #视频流的id video: streamIds: "34020000001110000001_34020000001320000001, 34020000001110000001_34020000001320000002, 34020000001110000001_34020000001320000003, 34020000001110000002_34020000001320000001, 34020000001110000002_34020000001320000002, 34020000001110000002_34020000001320000003, 34020000001320000001_34020000001320000001, 34020000001320000001_34020000001320000002, 34020000001320000002_34020000001320000001, 34020000001320000002_34020000001320000002, 34020000001320000003_34020000001320000001, 34020000001320000003_34020000001320000002, 34020000001320000004_34020000001320000001, 34020000001320000004_34020000001320000002, 34020000001320000005_34020000001320000001, 34020000001320000005_34020000001320000002, 34020000001320000006_34020000001320000001, 34020000001320000006_34020000001320000002, 34020000001320000007_34020000001320000001, 34020000001320000007_34020000001320000002, 34020000001320000008_34020000001320000001, 34020000001320000008_34020000001320000002" src/main/resources/config/application-prod.yml
@@ -24,15 +24,18 @@ datasource: master: type: com.alibaba.druid.pool.DruidDataSource # driver-class-name: com.mysql.cj.jdbc.Driver # url: jdbc:mysql://localhost:3360/db_user?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false # username: root # password: lmx8688139 driver-class-name: com.highgo.jdbc.Driver # url: jdbc:highgo://localhost:5866/highgo?rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8 url: jdbc:highgo://192.168.10.183:5866/highgo?rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8 url: jdbc:highgo://localhost:5866/highgo?rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8 username: sysdba password: Lmx&8688139 db2: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.sqlite.JDBC url: jdbc:sqlite:E:\2软件下载包\easydarwin\EasyDarwin-windows-8.2.2-24031216\data\db\EasyDarwin.db?date_string_format=yyyy-MM-dd HH:mm:ss password: Fg001@HDW # db2: # type: com.alibaba.druid.pool.DruidDataSource # driver-class-name: org.sqlite.JDBC # url: jdbc:sqlite:E:\2软件下载包\easydarwin\EasyDarwin-windows-8.2.2-24031216\data\db\EasyDarwin.db?date_string_format=yyyy-MM-dd HH:mm:ss # url: jdbc:sqlite:\2软件下载包\easydarwin\EasyDarwin-windows-8.2.2-24031216\data\db\EasyDarwin.db?date_string_format=yyyy-MM-dd HH:mm:ss maxIdel: 60 initialPoolSize: 2 @@ -97,4 +100,27 @@ defaultKey: ENC(KdXXhvt6v7BDw7MgsR4J1OgahZgjl3kEil10+147oGA=) iv: ENC(Gtzf6s+BRoC1iQsRLMswSlBDSMom0kWtx5+SMJgaVDg=) i18n: zh-CN video: streamIds: "34020000001110000001_34020000001320000001, 34020000001110000001_34020000001320000002, 34020000001110000001_34020000001320000003, 34020000001110000002_34020000001320000001, 34020000001110000002_34020000001320000002, 34020000001110000002_34020000001320000003, 34020000001320000001_34020000001320000001, 34020000001320000001_34020000001320000002, 34020000001320000002_34020000001320000001, 34020000001320000002_34020000001320000002, 34020000001320000003_34020000001320000001, 34020000001320000003_34020000001320000002, 34020000001320000004_34020000001320000001, 34020000001320000004_34020000001320000002, 34020000001320000005_34020000001320000001, 34020000001320000005_34020000001320000002, 34020000001320000006_34020000001320000001, 34020000001320000006_34020000001320000002, 34020000001320000007_34020000001320000001, 34020000001320000007_34020000001320000002, 34020000001320000008_34020000001320000001, 34020000001320000008_34020000001320000002" src/main/resources/config/application.yml
@@ -1,7 +1,7 @@ spring: profiles: active: dev # active: prod # active: dev active: prod # active: dev-mysql