ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java
@@ -46,7 +46,8 @@ private IArdAppPositionService ardAppPositionService; @Autowired private ISysUserService sysUserService; @Autowired private MinioUtils minioUtil; /** * 查询app位置列表 @@ -200,7 +201,7 @@ @ApiOperation("上传文件") public AjaxResult uploadFile(MultipartFile file,String type) { String url = MinioUtils.putObjectAndGetUrl("app",type, file); String url = minioUtil.putObjectAndGetUrl("app",type, file); return AjaxResult.success(url); } } ard-work/src/main/java/com/ruoyi/app/position/service/impl/ArdAppPositionServiceImpl.java
@@ -146,9 +146,10 @@ SysUser user = new SysUser(); user.setDeptId(deptId); List<SysUser> appUserList = iSysUserService.selectAllAppUserList(user); //过滤在线 //过滤在线和单兵端 List<SysUser> onLineList = appUserList.stream() .filter(sysUser -> (sysUser.getAppOnlineState().equals("1"))) .filter(sysUser -> (sysUser.getAppUserType().equals("1"))) .collect(Collectors.toList()); //过滤范围 for (SysUser sysUser : onLineList) { @@ -192,6 +193,7 @@ //过滤在线 List<SysUser> onLineList = appUserList.stream() .filter(sysUser -> (sysUser.getAppOnlineState().equals("1"))) .filter(sysUser -> (sysUser.getAppUserType().equals("1"))) .collect(Collectors.toList()); //过滤范围 for (SysUser sysUser : onLineList) { @@ -202,9 +204,7 @@ if (lon == null || lat == null) { continue; } Point point2D=new Point(); point2D.setLongitude(lon); point2D.setLatitude(lat); Point point2D=new Point(lon,lat); boolean inPolygon = GisTool.isInPolygon(point2D, partitionLocation); if (inPolygon) { Map<String, Object> params = new HashMap<>(); ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
@@ -1,7 +1,5 @@ package com.ruoyi.device.camera.service.impl; import java.awt.geom.Point2D; import java.time.LocalTime; import java.util.*; import java.util.stream.Collectors; @@ -14,11 +12,7 @@ import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.channel.domain.ArdChannel; import com.ruoyi.device.channel.mapper.ArdChannelMapper; import com.ruoyi.device.channel.service.IArdChannelService; import com.ruoyi.device.hiksdk.common.GlobalVariable; import com.ruoyi.device.hiksdk.service.IHikClientService; import com.ruoyi.scheduling.domian.SchedulingParam; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.utils.tools.ArdTool; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.mapper.ArdCamerasMapper; @@ -27,7 +21,6 @@ import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.utils.tools.GisTool; import com.ruoyi.utils.tools.Point; import com.sun.org.apache.bcel.internal.generic.NEW; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -120,20 +113,7 @@ ardCameras.setCreateTime(DateUtils.getNowDate()); ardCameras.setUserId(SecurityUtils.getUserId()); redisCache.setCacheObject(getCacheKey(ardCameras.getId()), ardCameras); int i = ardCamerasMapper.insertArdCameras(ardCameras); if (i > 0) { // //删除当前相机的所有通道 // ardChannelMapper.deleteArdChannelByDeviceId(ardCameras.getId()); // //获取相机通道 // List<ArdChannel> ipChannelList = hikClientService.getCameraChannelList(ardCameras); // if (ipChannelList.size() > 0) { // for (ArdChannel channel : ipChannelList) { // channel.setId(IdUtils.simpleUUID()); // ardChannelMapper.insertArdChannel(channel); // } // } } return i; return ardCamerasMapper.insertArdCameras(ardCameras); } /** @@ -375,9 +355,7 @@ continue; } /*判断坐标是否在多边形范围内*/ Point camPosition=new Point(); camPosition.setLongitude(camera.getLongitude()); camPosition.setLatitude(camera.getLatitude()); Point camPosition=new Point(camera.getLongitude(),camera.getLatitude()); boolean inPolygon = GisTool.isInPolygon(camPosition, partitionLocation); if (inPolygon) { /*获取通道列表*/ ard-work/src/main/java/com/ruoyi/device/hiksdk/config/MinioClientSingleton.java
File was deleted ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -1,15 +1,13 @@ package com.ruoyi.device.hiksdk.service.impl; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.annotation.SdkOperate; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.camera.service.IArdCamerasService; import com.ruoyi.device.channel.domain.ArdChannel; import com.ruoyi.device.channel.service.IArdChannelService; import com.ruoyi.device.hiksdk.common.GlobalVariable; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.hiksdk.config.MinioClientSingleton; import com.ruoyi.device.hiksdk.util.hikSdkUtil.GisUtil; import com.ruoyi.device.hiksdk.util.hikSdkUtil.HCNetSDK; import com.ruoyi.device.hiksdk.service.IHikClientService; @@ -21,7 +19,7 @@ import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.Base64; @@ -32,7 +30,6 @@ import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; import static com.ruoyi.device.hiksdk.util.hikSdkUtil.HCNetSDK.*; @@ -47,8 +44,12 @@ @Service public class HikClientServiceImpl implements IHikClientService { @Value("${minio.endpoint}") private static String endpoint; @Resource IArdCamerasService ardCamerasService; private IArdCamerasService ardCamerasService; @Resource private MinioUtils minioUtil; private static HCNetSDK hCNetSDK; @@ -1149,16 +1150,14 @@ byte[] array = jpegBuffer.array(); //存储到minio String BucketName = "pic"; String uuid = UUID.randomUUID().toString().replace("-", ""); String time = new SimpleDateFormat("yyyyMMdd").format(new Date()); String ObjectName = time + "/" + uuid + ".jpeg"; String ObjectName = "capture/" + IdUtils.simpleUUID() + ".jpeg"; String ContentType = "image/JPEG"; InputStream input = new ByteArrayInputStream(array); String url = ""; try { boolean b = MinioUtils.uploadObject(BucketName, ObjectName, input, input.available(), ContentType); boolean b = minioUtil.uploadObject(BucketName, ObjectName, input, input.available(), ContentType); if (b) { url = MinioUtils.getBucketObjectUrl(BucketName, ObjectName); url = minioUtil.getBucketObjectUrl(BucketName, ObjectName); log.debug("上传文件成功!" + url); } } catch (IOException ex) { @@ -1342,9 +1341,9 @@ FileInputStream stream = new FileInputStream(path); String time = new SimpleDateFormat("yyyyMMdd").format(new Date()); String recordName = cameraId + "/" + time + "/" + ObjectName + ".mp4"; boolean b = MinioUtils.uploadObject(BucketName, recordName, stream, stream.available(), ContentType); boolean b = minioUtil.uploadObject(BucketName, recordName, stream, stream.available(), ContentType); if (b) { url = MinioClientSingleton.domainUrl + "/" + BucketName + "/" + recordName; url = endpoint + "/" + BucketName + "/" + recordName; log.debug("上传文件成功!" + url); } return url; ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
@@ -31,7 +31,7 @@ * @date 2023-05-30 */ @Service @Slf4j(topic = "PatrolInspectionTask") @Slf4j(topic = "patrolInspectionTask") public class ArdVideoInspectTaskServiceImpl implements IArdVideoInspectTaskService { @Resource private ArdVideoInspectTaskMapper ardVideoInspectTaskMapper; ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTask.java
@@ -12,7 +12,7 @@ * @Date: 2023年06月01日8:57 * @Version: 1.0 **/ @Slf4j(topic = "PatrolInspectionTask") @Slf4j(topic = "patrolInspectionTask") class InspectionTask implements Runnable { private String taskId; ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java
@@ -22,7 +22,7 @@ **/ @Component @Slf4j(topic = "PatrolInspectionTask") @Slf4j(topic = "patrolInspectionTask") public class InspectionTaskManager { @Resource ard-work/src/main/java/com/ruoyi/media/service/impl/WebrtcService.java
ard-work/src/main/java/com/ruoyi/storage/minio/utils/MinioConfig.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.storage.minio.utils; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; /** * @Description: * @ClassName: MinioClientSingleton * @Author: 刘苏义 * @Date: 2023年05月18日9:32 * @Version: 1.0 **/ @Slf4j(topic = "minio") @Component public class MinioConfig { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; @Bean public MinioClient getMinioClient() { return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } } ard-work/src/main/java/com/ruoyi/storage/minio/utils/MinioUtils.java
@@ -2,13 +2,14 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.device.hiksdk.config.MinioClientSingleton; import io.minio.*; import io.minio.http.Method; import io.minio.messages.*; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.*; import java.util.*; import java.util.concurrent.TimeUnit; @@ -22,19 +23,23 @@ **/ @SuppressWarnings("ALL") @Slf4j(topic = "minio") @Component public class MinioUtils { @Resource MinioClient minioClient; /** * 判断桶是否存在 */ public static boolean exitsBucket(String bucketName) { public boolean exitsBucket(String bucketName) { boolean found = false; try { if (StringUtils.isEmpty(bucketName)) { return false; } BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(bucketName).build(); found = MinioClientSingleton.getMinioClient().bucketExists(bucketExistsArgs); found = minioClient.bucketExists(bucketExistsArgs); } catch (Exception ex) { log.error("minio判断桶存在异常:", ex.getMessage()); @@ -45,14 +50,14 @@ /** * 创建桶,并设置桶策略为公共 */ public static boolean createBucket(String bucketName) { public boolean createBucket(String bucketName) { try { if (StringUtils.isEmpty(bucketName)) { return false; } /*创建桶*/ MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build(); MinioClientSingleton.getMinioClient().makeBucket(makeBucketArgs); minioClient.makeBucket(makeBucketArgs); /*设置策略*/ String sb = "{\"Version\":\"2012-10-17\"," + "\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" + @@ -82,8 +87,8 @@ SetBucketNotificationArgs setBucketNotificationArgs = SetBucketNotificationArgs.builder() .bucket(bucketName) .config(config).build(); MinioClientSingleton.getMinioClient().setBucketPolicy(setBucketPolicyArgs); MinioClientSingleton.getMinioClient().setBucketNotification(setBucketNotificationArgs); minioClient.setBucketPolicy(setBucketPolicyArgs); minioClient.setBucketNotification(setBucketNotificationArgs); return true; } catch (Exception ex) { @@ -97,11 +102,11 @@ * * @param bucket 桶名称 */ public static boolean removeBucket(String bucket) { public boolean removeBucket(String bucket) { try { boolean found = exitsBucket(bucket); if (found) { Iterable<Result<Item>> myObjects = MinioClientSingleton.getMinioClient().listObjects(ListObjectsArgs.builder().bucket(bucket).build()); Iterable<Result<Item>> myObjects = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucket).build()); for (Result<Item> result : myObjects) { Item item = result.get(); //有对象文件,则删除失败 @@ -110,7 +115,7 @@ } } // 删除`bucketName`存储桶,注意,只有存储桶为空时才能删除成功。 MinioClientSingleton.getMinioClient().removeBucket(RemoveBucketArgs.builder().bucket(bucket).build()); minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build()); found = exitsBucket(bucket); return !found; } @@ -125,9 +130,9 @@ * * @return */ public static List<Bucket> getListBuckets() { public List<Bucket> getListBuckets() { try { return MinioClientSingleton.getMinioClient().listBuckets(); return minioClient.listBuckets(); } catch (Exception e) { e.printStackTrace(); } @@ -143,7 +148,7 @@ * @param expires 失效时间(以秒为单位),默认是7天,不得大于七天 * @return */ public static String getObjectWithExpired(String bucketName, String objectName, Integer expires, TimeUnit timeUnit) { public String getObjectWithExpired(String bucketName, String objectName, Integer expires, TimeUnit timeUnit) { String url = ""; if (exitsBucket(bucketName)) { try { @@ -153,7 +158,7 @@ .object(objectName) .expiry(expires, timeUnit) .build(); url = MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); url = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs); } catch (Exception ex) { log.error("minio生成失效url异常", ex.getMessage()); } @@ -171,7 +176,7 @@ * @创建时间 2023/5/18 12:16 * @修改人和其它信息 */ public static String putObjectAndGetUrl(String bucketName, MultipartFile file) { public String putObjectAndGetUrl(String bucketName, MultipartFile file) { if (!exitsBucket(bucketName)) { createBucket(bucketName); } @@ -200,7 +205,7 @@ .stream(inputStream, file.getSize(), -1) .contentType(file.getContentType()) .build(); MinioClientSingleton.getMinioClient().putObject(putObjectArgs); minioClient.putObject(putObjectArgs); inputStream.close(); /*获取url*/ GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs @@ -209,7 +214,7 @@ .object(fileName) .method(Method.GET) .build(); String presignedObjectUrl = MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); String presignedObjectUrl = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs); String ObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.indexOf("?")); return ObjectUrl; } catch (Exception ex) { @@ -226,7 +231,7 @@ * @创建时间 2023/5/18 12:16 * @修改人和其它信息 */ public static String putObjectAndGetUrl(String bucketName, String folder, MultipartFile file) { public String putObjectAndGetUrl(String bucketName, String folder, MultipartFile file) { if (!exitsBucket(bucketName)) { createBucket(bucketName); } @@ -255,7 +260,7 @@ .stream(inputStream, file.getSize(), -1) .contentType(file.getContentType()) .build(); MinioClientSingleton.getMinioClient().putObject(putObjectArgs); minioClient.putObject(putObjectArgs); inputStream.close(); /*获取url*/ GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs @@ -264,7 +269,7 @@ .object(fileName) .method(Method.GET) .build(); String presignedObjectUrl = MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); String presignedObjectUrl = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs); String ObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.indexOf("?")); return ObjectUrl; } catch (Exception ex) { @@ -280,12 +285,12 @@ * @param objectName 对象名称 * @return boolean */ public static boolean removeObject(String bucket, String objectName) { public boolean removeObject(String bucket, String objectName) { try { boolean exsit = exitsBucket(bucket); if (exsit) { RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(objectName).build(); MinioClientSingleton.getMinioClient().removeObject(removeObjectArgs); minioClient.removeObject(removeObjectArgs); return true; } } catch (Exception e) { @@ -300,7 +305,7 @@ * @param objectNames 对象名称 * @return boolean */ public static boolean removeObjects(String bucket, List<String> objectNames) { public boolean removeObjects(String bucket, List<String> objectNames) { if (exitsBucket(bucket)) { try { List<DeleteObject> objects = new LinkedList<>(); @@ -308,7 +313,7 @@ objects.add(new DeleteObject(str)); } RemoveObjectsArgs removeObjectsArgs = RemoveObjectsArgs.builder().bucket(bucket).objects(objects).build(); Iterable<Result<DeleteError>> results = MinioClientSingleton.getMinioClient().removeObjects(removeObjectsArgs); Iterable<Result<DeleteError>> results = minioClient.removeObjects(removeObjectsArgs); /*删除完遍历结果,否则删不掉*/ for (Result<DeleteError> result : results) { DeleteError error = result.get(); @@ -329,13 +334,38 @@ * @param bucket 桶名称 * @return {@link List}<{@link String}> */ public static List<String> getBucketObjectName(String bucket) { public List<String> getBucketObjectName(String bucket) { boolean exsit = exitsBucket(bucket); if (exsit) { List<String> listObjetcName = new ArrayList<>(); try { ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().bucket(bucket).build(); Iterable<Result<Item>> myObjects = MinioClientSingleton.getMinioClient().listObjects(listObjectsArgs); Iterable<Result<Item>> myObjects = minioClient.listObjects(listObjectsArgs); for (Result<Item> result : myObjects) { Item item = result.get(); listObjetcName.add(item.objectName()); } return listObjetcName; } catch (Exception ex) { log.error("minio获取桶下对象异常:" + ex.getMessage()); } } return null; } /** * 获取单个桶中的所有文件对象名称 * * @param [bucket,prefix] * @return {@link List}<{@link String}> */ public List<String> getBucketObjectName(String bucket, String prefix) { boolean exsit = exitsBucket(bucket); if (exsit) { List<String> listObjetcName = new ArrayList<>(); try { ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().prefix(prefix).bucket(bucket).build(); Iterable<Result<Item>> myObjects = minioClient.listObjects(listObjectsArgs); for (Result<Item> result : myObjects) { Item item = result.get(); listObjetcName.add(item.objectName()); @@ -355,7 +385,7 @@ * @param objectName 对象名 (文件夹名 + 文件名) * @return */ public static String getBucketObjectUrl(String bucketName, String objectName) { public String getBucketObjectUrl(String bucketName, String objectName) { try { if (!exitsBucket(bucketName)) { return ""; @@ -366,7 +396,9 @@ .object(objectName) .method(Method.GET) .build(); return MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); String presignedObjectUrl = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs); String ObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.indexOf("?")); return ObjectUrl; } catch (Exception ex) { log.error("minio获取对象URL异常" + ex.getMessage()); } @@ -382,7 +414,7 @@ * @param size ⼤⼩ * @param contextType 类型 Image/jpeg 浏览器可以直接打开,否则下载 */ public static boolean uploadObject(String bucketName, String objectName, InputStream stream, long size, String contextType) { public boolean uploadObject(String bucketName, String objectName, InputStream stream, long size, String contextType) { try { if (!exitsBucket(bucketName)) { createBucket(bucketName); @@ -393,7 +425,7 @@ .stream(stream, size, -1) .contentType(contextType) .build(); ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().putObject(putObjectArgs); ObjectWriteResponse objectWriteResponse = minioClient.putObject(putObjectArgs); return true; } catch (Exception ex) { log.error("minio上传文件(通过stream)异常" + ex.getMessage()); @@ -409,7 +441,7 @@ * @param file ⽂件 * @param contextType 类型 Image/jpeg 浏览器可以直接打开,否则下载 */ public static boolean uploadObject(String bucketName, String objectName, File file, String contextType) { public boolean uploadObject(String bucketName, String objectName, File file, String contextType) { try { if (!exitsBucket(bucketName)) { createBucket(bucketName); @@ -421,7 +453,7 @@ .stream(fileInputStream, file.length(), -1) .contentType(contextType) .build(); ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().putObject(putObjectArgs); ObjectWriteResponse objectWriteResponse = minioClient.putObject(putObjectArgs); return true; } catch (Exception ex) { log.error("minio上传文件(通过File)异常" + ex.getMessage()); @@ -437,7 +469,7 @@ * @param MultipartFile ⽂件 * @param contextType 类型 Image/jpeg 浏览器可以直接打开,否则下载 */ public static boolean uploadObject(String bucketName, String objectName, MultipartFile multipartFile, String contextType) { public boolean uploadObject(String bucketName, String objectName, MultipartFile multipartFile, String contextType) { try { if (!exitsBucket(bucketName)) { createBucket(bucketName); @@ -449,7 +481,7 @@ .stream(inputStream, multipartFile.getSize(), -1) .contentType(contextType) .build(); ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().putObject(putObjectArgs); ObjectWriteResponse objectWriteResponse = minioClient.putObject(putObjectArgs); return true; } catch (Exception ex) { log.error("minio上传文件(通过File)异常" + ex.getMessage()); @@ -465,7 +497,7 @@ * @param MultipartFile ⽂件 * @param contextType 类型 Image/jpeg 浏览器可以直接打开,否则下载 */ public static boolean uploadObject(String bucketName, MultipartFile multipartFile, String contextType) { public boolean uploadObject(String bucketName, MultipartFile multipartFile, String contextType) { try { if (!exitsBucket(bucketName)) { createBucket(bucketName); @@ -482,7 +514,7 @@ .stream(inputStream, multipartFile.getSize(), -1) .contentType(contextType) .build(); MinioClientSingleton.getMinioClient().putObject(putObjectArgs); minioClient.putObject(putObjectArgs); return true; } catch (Exception ex) { log.error("minio上传文件(通过File)异常" + ex.getMessage()); @@ -498,7 +530,7 @@ * @param localFilePathName * @return */ public static boolean uploadObject(String bucketName, String objectName, String localFilePathName, String contextType) { public boolean uploadObject(String bucketName, String objectName, String localFilePathName, String contextType) { try { if (!exitsBucket(bucketName)) { createBucket(bucketName); @@ -514,7 +546,7 @@ .filename(localFilePathName) .contentType(contextType) .build(); ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().uploadObject(uploadObjectArgs); ObjectWriteResponse objectWriteResponse = minioClient.uploadObject(uploadObjectArgs); return true; } catch (Exception e) { log.error("minio upload object file error " + e.getMessage()); @@ -530,42 +562,28 @@ * @创建时间 2023/2/6 10:32 * @修改人和其它信息 */ public static Iterable<Result<Item>> getObjectsByBucket(String bucketName) { Iterable<Result<Item>> listObjects = MinioClientSingleton.getMinioClient().listObjects(ListObjectsArgs.builder() public Iterable<Result<Item>> getObjectsByBucket(String bucketName) { Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder() .bucket(bucketName) .recursive(true) .build()); return listObjects; } public static void main(String[] args) { // /*删除桶*/ // boolean b = removeBucket("lsy"); // log.info(String.valueOf(b)); // /*创建桶*/ // boolean lsy = createBucket("lsy"); // log.info(String.valueOf(lsy)); // /*判断桶是否存在*/ // boolean pic = exitsBucket("lsy"); // log.info(String.valueOf(pic)); /*查询所有桶*/ // List<Bucket> listBuckets = getListBuckets(); // for (Bucket bucket : listBuckets) { // log.info(bucket.name()); // } String bucket = "lsy"; String filename = UUID.randomUUID().toString().replace("-", "") + "pic.jpeg"; String fileFullPath = "C:\\Users\\Administrator\\Desktop\\微信截图_20230518102605.png"; // uploadObject(bucket, filename, fileFullPath, "Image/jpeg"); // String url = getObjectWithExpired(bucket, filename, 10, SECONDS); // System.out.println(url); boolean b = removeBucket(bucket); System.out.println(b); // boolean b = uploadObjectBylocalPath(bucket, filename, fileFullPath); // System.out.println(b); //String url = getObjectWithExpired(bucket, filename, 10000); // //String url = getBucketObject(bucket, filename); // System.out.println(url); package com.example.minio; /** * @描述 获取桶中所有对象 * @参数 [bucketName, prefix] * @返回值 java.lang.Iterable<io.minio.Result < io.minio.messages.Item>> * @创建人 刘苏义 * @创建时间 2023/2/6 10:32 * @修改人和其它信息 */ public Iterable<Result<Item>> getObjectsByBucket(String bucketName, String prefix) { Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder() .bucket(bucketName) .prefix(prefix) .recursive(true) .build()); return listObjects; } } ard-work/src/main/java/com/ruoyi/sy/controller/ArdSyCarController.java
@@ -13,7 +13,7 @@ import com.ruoyi.sy.gps31.PushClientImplAlarm; import com.ruoyi.sy.gps31.PushClientImplPosition; import com.ruoyi.sy.service.IArdSyUserService; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.common.core.domain.entity.SysConfig; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysUserService; ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java
@@ -1,6 +1,5 @@ package com.ruoyi.sy.service.impl; import java.awt.geom.Point2D; import java.io.IOException; import java.io.InputStream; import java.text.ParseException; @@ -24,19 +23,16 @@ import com.ruoyi.sy.mapper.ArdSyCarDayMapper; import com.ruoyi.utils.tools.GisTool; import com.ruoyi.utils.websocket.util.WebSocketUtils; import com.ruoyi.device.hiksdk.config.MinioClientSingleton; import com.ruoyi.storage.minio.utils.MinioUtils; import com.ruoyi.sy.domain.ArdSyUser; import com.ruoyi.sy.gps31.PositionContainer; import com.ruoyi.sy.mapper.ArdSyUserMapper; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.common.core.domain.entity.SysConfig; import com.ruoyi.system.mapper.SysConfigMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.utils.forest.SYClient; import com.ruoyi.utils.result.Results; import io.minio.GetPresignedObjectUrlArgs; import io.minio.ListObjectsArgs; import io.minio.PutObjectArgs; import io.minio.Result; import io.minio.http.Method; import io.minio.messages.Item; @@ -83,7 +79,8 @@ RedisCache redisCache; @Resource private ArdSyCarDayMapper ardSyCarDayMapper; @Resource private MinioUtils minioUtil; private Map<Integer, Map<String, String>> logInMap = new HashMap(); private Map<String, Timer> userCarTimerMap = new HashMap(); @@ -147,7 +144,7 @@ objectNames.add(ardSyCar.getCarPicture().split("/sycar/")[1]); } } MinioUtils.removeObjects("sycar", objectNames); minioUtil.removeObjects("sycar", objectNames); return ardSyCarMapper.deleteArdSyCarByIds(ids); } @@ -264,12 +261,12 @@ @Override public List<Map<String, String>> getAllCarModel() { boolean exsit = MinioUtils.exitsBucket("sycar"); boolean exsit = minioUtil.exitsBucket("sycar"); if (exsit) { List<Map<String, String>> listObjetcName = new ArrayList<>(); try { ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().prefix("carmodel/").bucket("sycar").build(); Iterable<Result<Item>> myObjects = MinioClientSingleton.getMinioClient().listObjects(listObjectsArgs); // ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().prefix("carmodel/").bucket("sycar").build(); Iterable<Result<Item>> myObjects = minioUtil.getObjectsByBucket("sycar","carmodel"); for (Result<Item> result : myObjects) { Item item = result.get(); Map<String, String> map = new HashMap(); @@ -332,16 +329,16 @@ if (ardSyCarr.getCarPicture() != null || !ardSyCarr.getCarPicture().equals("")) { String objectName = ardSyCarr.getCarPicture().split("/sycar/")[1]; objectNames.add(objectName); MinioUtils.removeObjects("sycar", objectNames); minioUtil.removeObjects("sycar", objectNames); } } //判断文件是否为空 if (null == carPicture || 0 == carPicture.getSize()) { return ""; } boolean exsit = MinioUtils.exitsBucket("sycar"); boolean exsit = minioUtil.exitsBucket("sycar"); if (!exsit) { boolean bucket = MinioUtils.createBucket("sycar"); boolean bucket = minioUtil.createBucket("sycar"); } //文件名 String originalFilename = carPicture.getOriginalFilename(); @@ -350,14 +347,15 @@ try { InputStream inputStream = carPicture.getInputStream(); /*上传对象*/ PutObjectArgs putObjectArgs = PutObjectArgs .builder() .bucket("sycar") .object(fileName) .stream(inputStream, carPicture.getSize(), -1) .contentType(carPicture.getContentType()) .build(); MinioClientSingleton.getMinioClient().putObject(putObjectArgs); // PutObjectArgs putObjectArgs = PutObjectArgs // .builder() // .bucket("sycar") // .object(fileName) // .stream(inputStream, carPicture.getSize(), -1) // .contentType(carPicture.getContentType()) // .build(); // MinioConfig.getMinioClient().putObject(putObjectArgs); minioUtil.uploadObject("sycar",fileName,inputStream,carPicture.getSize(),carPicture.getContentType()); inputStream.close(); /*获取url*/ GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs @@ -366,8 +364,8 @@ .object(fileName) .method(Method.GET) .build(); String presignedObjectUrl = MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); String ObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.indexOf("?")); //String presignedObjectUrl = MinioConfig.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); String ObjectUrl = minioUtil.getBucketObjectUrl("sycar", fileName); if (id != null && !id.equals("")) {//id为非必要 ArdSyCar ardSyCar = new ArdSyCar(); ardSyCar.setId(id); @@ -1143,9 +1141,7 @@ List<Map<String, Object>> carGPSMap = (List<Map<String, Object>>) carGPSTrack.get("list"); Double lng = Double.valueOf((String) carGPSMap.get(0).get("lng")); Double lat = Double.valueOf((String) carGPSMap.get(0).get("lat")); Point point = new Point(); point.setLongitude(lng); point.setLatitude(lat); Point point = new Point(lng,lat); boolean inPolygon = GisTool.isInPolygon(point, partitionLocation); if (inPolygon) { carMap.put("longitude", lng); ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java
@@ -8,32 +8,34 @@ * @Version: 1.0 **/ import com.ruoyi.app.position.domain.ArdAppPosition; import com.ruoyi.utils.websocket.util.WebSocketUtils; import com.ruoyi.common.utils.ConfigUtils; import com.ruoyi.common.utils.DictUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import javax.annotation.PostConstruct; import java.sql.*; import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; @Slf4j @Component public class ReadAccessDatabase { public static void main(String[] args) { // // 多个数据库文件路径 // String[] dbPaths = { // "D:\\mdb\\道路中心线.mdb", // "D:\\mdb\\防风林-灌木.mdb", // // 添加更多的数据库文件路径 // }; // // // 遍历每个数据库文件 // for (String dbPath : dbPaths) { // readDataFromAccessDatabase(dbPath); // } // 多个数据库文件路径 String[] dbPaths = { "D:\\Workspaces\\ard\\安瑞达工作资料\\mdb\\道路中心线.mdb" // "D:\\Workspaces\\ard\\安瑞达工作资料\\mdb\\防风林-灌木.mdb", // 添加更多的数据库文件路径 }; // 遍历每个数据库文件 for (String dbPath : dbPaths) { readDataFromAccessDatabase(dbPath); } } public static void readDataFromAccessDatabase(String dbPath) { @@ -54,16 +56,16 @@ if (!tableName.equals("道路中心线")) { continue; } System.out.println("表名: " + tableName); log.info("表名: " + tableName); // 获取表的字段元数据 // ResultSet column = metaData.getColumns(null, null, tableName, null); ResultSet column = metaData.getColumns(null, null, tableName, null); // 遍历字段 // while (column.next()) { // String columnName = column.getString("COLUMN_NAME"); // System.out.println("字段名: " + columnName); // } // column.close(); while (column.next()) { String columnName = column.getString("COLUMN_NAME"); log.info("字段名: " + columnName); } column.close(); // 执行查询操作 String sql = "SELECT * FROM " + tableName; // 替换为你要查询的表名 Statement statement = connection.createStatement(); @@ -72,12 +74,12 @@ while (resultSet.next()) { // 读取每一行数据 String id = resultSet.getString(1); // 根据表中的列名获取数据 String name = resultSet.getString("编号"); String no = resultSet.getString("编号"); String name = resultSet.getString("道路名称"); // 可以根据具体的表结构继续获取其他字段的数据 // 在这里处理获取到的数据,例如输出到控制台或保存到集合中 System.out.println("ID: " + id + ", Name: " + name); log.info("ID: " + id + ", No: " + no+ ", Name: " + name); } // 关闭连接 resultSet.close(); @@ -89,5 +91,7 @@ e.printStackTrace(); } } } ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumer.java
@@ -3,6 +3,7 @@ import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; @@ -18,12 +19,30 @@ @Slf4j(topic = "mqtt") public class MqttConsumer implements ApplicationRunner { @Value("${mqtt.enabled}") private Boolean MQTT_ENABLED; @Value("${mqtt.topic}") private String MQTT_TOPIC; @Value("${mqtt.host}") private String MQTT_HOST; @Value("${mqtt.clientId}") private String MQTT_CLIENT_ID; @Value("${mqtt.username}") private String MQTT_USER_NAME; @Value("${mqtt.password}") private String MQTT_PASSWORD; @Value("${mqtt.timeout}") private int MQTT_TIMEOUT; @Value("${mqtt.keepalive}") private int MQTT_KEEP_ALIVE; private static MqttClient client; @Override public void run(ApplicationArguments args) { log.debug("初始化并启动mqtt......"); if(PropertiesUtil.MQTT_ENABLED) if(MQTT_ENABLED) { this.connect(); } @@ -38,7 +57,7 @@ getClient(); // 2 设置配置 MqttConnectOptions options = getOptions(); String[] topic = PropertiesUtil.MQTT_TOPIC.split(","); String[] topic = MQTT_TOPIC.split(","); // 3 消息发布质量 int[] qos = getQos(topic.length); // 4 最后设置 @@ -54,7 +73,7 @@ public void getClient() { try { if (null == client) { client = new MqttClient(PropertiesUtil.MQTT_HOST, PropertiesUtil.MQTT_CLIENT_ID, new MemoryPersistence()); client = new MqttClient(MQTT_HOST, MQTT_CLIENT_ID, new MemoryPersistence()); } log.debug("--创建mqtt客户端"); } catch (Exception e) { @@ -68,12 +87,12 @@ public MqttConnectOptions getOptions() { MqttConnectOptions options = new MqttConnectOptions(); //设置用户名密码 options.setUserName(PropertiesUtil.MQTT_USER_NAME); options.setPassword(PropertiesUtil.MQTT_PASSWORD.toCharArray()); options.setUserName(MQTT_USER_NAME); options.setPassword(MQTT_PASSWORD.toCharArray()); // 设置超时时间 options.setConnectionTimeout(PropertiesUtil.MQTT_TIMEOUT); options.setConnectionTimeout(MQTT_TIMEOUT); // 设置会话心跳时间 options.setKeepAliveInterval(PropertiesUtil.MQTT_KEEP_ALIVE); options.setKeepAliveInterval(MQTT_KEEP_ALIVE); // 是否清除session options.setCleanSession(true); log.debug("--生成mqtt配置对象"); ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumerCallback.java
@@ -92,10 +92,10 @@ if (null != topic && null != qos) { if (client.isConnected()) { client.subscribe(topic, qos); log.info("mqtt连接成功,客户端ID:" + PropertiesUtil.MQTT_CLIENT_ID); log.info("mqtt连接成功" ); log.info("--订阅主题::" + Arrays.toString(topic)); } else { log.info("mqtt连接失败,客户端ID:" + PropertiesUtil.MQTT_CLIENT_ID); log.info("mqtt连接失败"); } } } catch (Exception e) { ard-work/src/main/java/com/ruoyi/utils/mqtt/PropertiesUtil.java
File was deleted ard-work/src/main/java/com/ruoyi/utils/tools/GisTool.java
@@ -35,15 +35,15 @@ } public static void main(String[] args) { // // 被检测的经纬度点 // Point point= new Point(126.649261,45.687377); // // 商业区域(百度多边形区域经纬度集合) // List<Point> partitionLocation = new ArrayList<>(); // partitionLocation.add(new Point(126.64459,45.688548)); // partitionLocation.add(new Point(126.653376,45.68938)); // partitionLocation.add(new Point(126.645776,45.685048)); // partitionLocation.add(new Point(126.654184,45.685778)); // System.out.println(isInPolygon(point,partitionLocation)); // 被检测的经纬度点 Point point= new Point(126.649261,45.687377); // 商业区域(百度多边形区域经纬度集合) List<Point> partitionLocation = new ArrayList<>(); partitionLocation.add(new Point(126.64459,45.688548)); partitionLocation.add(new Point(126.653376,45.68938)); partitionLocation.add(new Point(126.645776,45.685048)); partitionLocation.add(new Point(126.654184,45.685778)); System.out.println(isInPolygon(point,partitionLocation)); } /** ard-work/src/main/java/com/ruoyi/utils/tools/Point.java
@@ -1,7 +1,10 @@ package com.ruoyi.utils.tools; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @Description: @@ -11,8 +14,15 @@ * @Version: 1.0 **/ @Data @NoArgsConstructor public class Point{ private static final long serialVersionUID = 1L; private Double longitude; private Double latitude; @JsonCreator public Point(@JsonProperty("longitude") Double longitude,@JsonProperty("latitude")Double latitude) { this.longitude = longitude; this.latitude = latitude; } } ard-work/src/main/resources/mapper/minio/StorageMinioEventMapper.xml
@@ -28,6 +28,7 @@ <if test="eventType != null and eventType != ''"> and event_type = #{eventType}</if> <if test="host != null and host != ''"> and host = #{host}</if> </where> order by create_time desc </select> <select id="selectStorageMinioEventById" parameterType="String" resultMap="StorageMinioEventResult"> ard-work/src/main/resources/templates/test.html
@@ -162,7 +162,7 @@ } }) opt = {"username": "liusuyi", "password": "5959932"}; opt = {"username": "admin", "password": "admin123"}; $.ajax({ headers: { 'Accept': 'application/json', ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
@@ -23,7 +23,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.common.core.domain.entity.SysConfig; import com.ruoyi.system.service.ISysConfigService; /** ruoyi-admin/src/main/resources/application-ard.yml
File was deleted ruoyi-admin/src/main/resources/application-dev-druid.yml
New file @@ -0,0 +1,58 @@ # 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource druid: # 主库数据源 master: driverClassName: org.postgresql.Driver url: jdbc:postgresql://192.168.1.15:5432/ry-vue?stringtype=unspecified username: postgres password: postgres # 从库数据源 slave: # 从数据源开关/默认关闭 # enabled: true # driverClassName: org.postgresql.Driver # url: jdbc:postgresql://112.98.126.2:35432/ard732 # username: postgres # password: Yykj.2017 # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置白名单,不填则允许所有访问 allow: url-pattern: /druid/* # 控制台管理用户名和密码 login-username: ruoyi login-password: 123456 filter: stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 10000 merge-sql: true wall: config: multi-statement-allow: true ruoyi-admin/src/main/resources/application-dev.yml
New file @@ -0,0 +1,101 @@ # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # Spring配置 spring: # redis 配置 redis: # 地址 host: 192.168.1.15 # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 password: # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # 日志配置 logging: level: authorize: info minio: info hikSdk: info stealAlarm: info websocket: info patrolInspectionTask: info mqtt: info guideQueue: info rongCloud: info cmd: info uav: info sy: info # webrtc-streamer配置 webrtc: enabled: true host: 127.0.0.1:8000 # minio配置 minio: enabled: false endpoint: http://192.168.1.15:9001 accessKey: admin secretKey: xzx12345 path: G:/DATA # forest配置 forest: backend: okhttp3 # 后端HTTP框架(默认为 okhttp3) max-connections: 1000 # 连接池最大连接数(默认为 500) max-route-connections: 500 # 每个路由的最大连接数(默认为 500) max-request-queue-size: 100 # [自v1.5.22版本起可用] 最大请求等待队列大小 max-async-thread-size: 300 # [自v1.5.21版本起可用] 最大异步线程数 max-async-queue-size: 16 # [自v1.5.22版本起可用] 最大异步线程池队列大小 timeout: 3000 # [已不推荐使用] 请求超时时间,单位为毫秒(默认为 3000) connect-timeout: 3000 # 连接超时时间,单位为毫秒(默认为 timeout) read-timeout: 3000 # 数据读取超时时间,单位为毫秒(默认为 timeout) max-retry-count: 0 # 请求失败后重试次数(默认为 0 次不重试) ssl-protocol: TLS # 单向验证的HTTPS的默认TLS协议(默认为 TLS) log-enabled: true # 打开或关闭日志(默认为 true) log-request: true # 打开/关闭Forest请求日志(默认为 true) log-response-status: true # 打开/关闭Forest响应状态日志(默认为 true) log-response-content: true # 打开/关闭Forest响应内容日志(默认为 false) async-mode: platform # [自v1.5.27版本起可用] 异步模式(默认为 platform) #流媒体转码服务器 mediamtx: enabled: true host: 127.0.0.1 #mqtt mqtt: host: tcp://192.168.1.15:1883 clientId: m227 username: admin password: xzx12345 topic: minioEvent timeout: 100 keepalive: 60 enabled: true ruoyi-admin/src/main/resources/application-druid.yml
File was deleted ruoyi-admin/src/main/resources/application-prod-druid.yml
New file @@ -0,0 +1,58 @@ # 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource druid: # 主库数据源 master: driverClassName: org.postgresql.Driver url: jdbc:postgresql://112.98.126.2:35432/ry-vue?stringtype=unspecified username: postgres password: Yykj.2017 # 从库数据源 slave: # 从数据源开关/默认关闭 # enabled: true # driverClassName: org.postgresql.Driver # url: jdbc:postgresql://112.98.126.2:35432/ard732 # username: postgres # password: Yykj.2017 # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置白名单,不填则允许所有访问 allow: url-pattern: /druid/* # 控制台管理用户名和密码 login-username: ruoyi login-password: 123456 filter: stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 10000 merge-sql: true wall: config: multi-statement-allow: true ruoyi-admin/src/main/resources/application-prod.yml
New file @@ -0,0 +1,101 @@ # 生产环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # Spring配置 spring: # redis 配置 redis: # 地址 host: 192.168.5.229 # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 password: # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # 日志配置 logging: level: authorize: info minio: info hikSdk: info stealAlarm: info websocket: info patrolInspectionTask: info mqtt: info guideQueue: info rongCloud: info cmd: info uav: info sy: info # webrtc-streamer配置 webrtc: enabled: false host: 192.168.5.229:8000 # minio配置 minio: enabled: false endpoint: http://192.168.5.229:9001 accessKey: admin secretKey: xzx12345 path: F:/DATA # forest配置 forest: backend: okhttp3 # 后端HTTP框架(默认为 okhttp3) max-connections: 1000 # 连接池最大连接数(默认为 500) max-route-connections: 500 # 每个路由的最大连接数(默认为 500) max-request-queue-size: 100 # [自v1.5.22版本起可用] 最大请求等待队列大小 max-async-thread-size: 300 # [自v1.5.21版本起可用] 最大异步线程数 max-async-queue-size: 16 # [自v1.5.22版本起可用] 最大异步线程池队列大小 timeout: 3000 # [已不推荐使用] 请求超时时间,单位为毫秒(默认为 3000) connect-timeout: 3000 # 连接超时时间,单位为毫秒(默认为 timeout) read-timeout: 3000 # 数据读取超时时间,单位为毫秒(默认为 timeout) max-retry-count: 0 # 请求失败后重试次数(默认为 0 次不重试) ssl-protocol: TLS # 单向验证的HTTPS的默认TLS协议(默认为 TLS) log-enabled: true # 打开或关闭日志(默认为 true) log-request: true # 打开/关闭Forest请求日志(默认为 true) log-response-status: true # 打开/关闭Forest响应状态日志(默认为 true) log-response-content: true # 打开/关闭Forest响应内容日志(默认为 false) async-mode: platform # [自v1.5.27版本起可用] 异步模式(默认为 platform) #流媒体转码服务器 mediamtx: enabled: true host: 192.168.5.229 #mqtt mqtt: host: tcp://192.168.5.229:1883 clientId: server229 username: admin password: xzx12345 topic: minioEvent,apponekey,camera,external timeout: 100 keepalive: 60 enabled: true ruoyi-admin/src/main/resources/application.yml
@@ -14,33 +14,6 @@ addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: char # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi.utils.tube: debug com.ruoyi.inspect: info org.springframework: warn com.example.mapper: debug # 用户配置 user: password: @@ -48,51 +21,6 @@ maxRetryCount: 5 # 密码锁定时间(默认10分钟) lockTime: 10 # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid,ard # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: false # redis 配置 redis: # 地址 host: 192.168.1.15 # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 password: # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms thymeleaf: cache: false # token配置 token: # 令牌自定义标识 @@ -101,7 +29,6 @@ secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 30 # MyBatis配置 #mybatis: # # 搜索指定包别名 @@ -114,6 +41,10 @@ type-Aliases-Package: com.ruoyi.**.domain mapper-Locations: classpath*:mapper/**/*Mapper.xml config-Location: classpath:mybatis/mybatis-config.xml global-config: banner: off # 关闭mybatisplus启动图标 db-config: #主键不用MyBatis plus的雪花算法,用数据库的主键自增 id-type: auto # configuration: # # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射 # map-underscore-to-camel-case: true @@ -121,25 +52,20 @@ # call-setters-on-nulls: true # # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # PageHelper分页插件 pagehelper: helperDialect: postgresql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: / # knife4j增强功能 knife4j: enable: true # 防止XSS攻击 xss: # 过滤开关 @@ -148,3 +74,32 @@ excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* #异步线程池配置 ThreadPoolTask: corePoolSize: 20 maxPoolSize: 40 keepAliveSeconds: 300 queueCapacity: 50 # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: false thymeleaf: cache: false profiles: active: prod-druid,prod ruoyi-admin/src/main/resources/banner.txt
@@ -1,13 +1,3 @@ Application Version: ${ard.version} Spring Boot Version: ${spring-boot.version} ___ ___ ___ /\ \ /\ \ /\ \ /::\ \ /::\ \ /::\ \ /:/\:\ \ /:/\:\ \ /:/\:\ \ /::\~\:\ \ /::\~\:\ \ /:/ \:\__\ /:/\:\ \:\__/:/\:\ \:\__/:/__/ \:|__| \/__\:\/:/ \/_|::\/:/ \:\ \ /:/ / \::/ / |:|::/ / \:\ /:/ / /:/ / |:|\/__/ \:\/:/ / /:/ / |:| | \::/__/ \/__/ \|__| ~~ 安瑞达4.0平台开始启动 ruoyi-admin/src/main/resources/logback.xml
@@ -69,11 +69,11 @@ </encoder> </appender> <!-- Authorize日志输出 --> <appender name="Authorize" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/Authorize.log</file> <appender name="authorize" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/authorize.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 按天回滚 daily --> <fileNamePattern>${log.path}/Authorize.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/authorize.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 日志最大的历史 60天 --> <maxHistory>60</maxHistory> </rollingPolicy> @@ -160,11 +160,11 @@ </encoder> </appender> <!--PatrolInspectionTask日志输出--> <appender name="PatrolInspectionTask" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/PatrolInspectionTask.log</file> <appender name="patrolInspectionTask" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/patrolInspectionTask.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--按天回滚daily--> <fileNamePattern>${log.path}/PatrolInspectionTask.%d{yyyy-MM-dd}.log</fileNamePattern> <fileNamePattern>${log.path}/patrolInspectionTask.%d{yyyy-MM-dd}.log</fileNamePattern> <!--日志最大的历史60天--> <maxHistory>60</maxHistory> </rollingPolicy> @@ -241,53 +241,5 @@ <!--系统用户操作日志--> <logger name="sys-user" level="INFO"> <appender-ref ref="sys-user"/> </logger> <!--Authorize日志--> <logger name="Authorize" level="INFO"> <appender-ref ref="Authorize"/> </logger> <!--minio日志打印等级--> <logger name="minio" level="INFO"> <appender-ref ref="minio"/> </logger> <!--hiksdk日志打印等级--> <logger name="hikSdk" level="debug"> <appender-ref ref="hikSdk"/> </logger> <!--盗电报警日志打印等级--> <logger name="stealAlarm" level="INFO"> <appender-ref ref="stealAlarm"/> </logger> <!--websocket日志打印等级--> <logger name="websocket" level="INFO"> <appender-ref ref="websocket"/> </logger> <!--光电巡检日志打印等级--> <logger name="PatrolInspectionTask" level="INFO"> <appender-ref ref="PatrolInspectionTask"/> </logger> <!--mqtt日志打印等级--> <logger name="mqtt" level="debug"> <appender-ref ref="mqtt"/> </logger> <!--guideQueue日志打印等级--> <logger name="guideQueue" level="INFO"> <appender-ref ref="guideQueue"/> </logger> <!--rongCloud日志打印等级--> <logger name="rongCloud" level="INFO"> <appender-ref ref="rongCloud"/> </logger> <!--cmd日志打印等级--> <logger name="cmd" level="INFO"> <appender-ref ref="cmd"/> </logger> <!--无人机日志打印等级--> <logger name="uav" level="INFO"> <appender-ref ref="uav"/> </logger> <!--三一车辆日志打印等级--> <logger name="sy" level="INFO"> <appender-ref ref="sy"/> </logger> </configuration> ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysConfig.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java @@ -1,4 +1,4 @@ package com.ruoyi.system.domain; package com.ruoyi.common.core.domain.entity; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
@@ -1,10 +1,6 @@ package com.ruoyi.common.core.redis; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.*; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; @@ -253,4 +249,18 @@ List<Object> values = redisTemplate.opsForValue().multiGet(keys); return values; } /** * 根据前缀获取所有的key* 例如:pro_ */ public HashMap<String, Object> getMapKey(String prefix) { HashMap<String, Object> map = new HashMap<>(); Set<String> keys = redisTemplate.keys(prefix + "*"); for (String key : keys) { Object value = redisTemplate.opsForValue().get(key); String nKey = key.replace(prefix, ""); map.put(nKey, value); } return map; } } ruoyi-common/src/main/java/com/ruoyi/common/utils/ConfigUtils.java
New file @@ -0,0 +1,55 @@ package com.ruoyi.common.utils; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.spring.SpringUtils; import java.util.Map; /** * @Description: 配置工具类 * @ClassName: ConfigUtils * @Author: 刘苏义 * @Date: 2023年08月23日16:12:09 * @Version: 1.0 **/ public class ConfigUtils { /** * 根据配置key获取配置value值 * * @param key 配置key * @return configValue 配置value值 */ public static String getConfigValue(String key) { String configValue = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); if (StringUtils.isNotNull(configValue)) { return configValue; } return null; } /** * 获取所有配置信息 * * @return configMap 配置信息map */ public static Map<String, Object> getConfigMap() { Map<String, Object> configMap = SpringUtils.getBean(RedisCache.class).getMapKey(CacheConstants.SYS_CONFIG_KEY); if (StringUtils.isNotNull(configMap)) { return configMap; } return null; } /** * 设置cache key * * @param configKey 参数键 * @return 缓存键key */ public static String getCacheKey(String configKey) { return CacheConstants.SYS_CONFIG_KEY + configKey; } } ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MinioTask.java
@@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -21,6 +22,8 @@ @Component("MinioTask") @Slf4j(topic = "minio") public class MinioTask { @Resource MinioUtils minioUtil; public void delHistoryTask(Integer saveDays) { log.debug("执行历史数据删除"); @@ -30,7 +33,7 @@ buckets.add("pic"); buckets.add("record"); for (String name : buckets) { Iterable<Result<Item>> listObjectsPic = MinioUtils.getObjectsByBucket(name); Iterable<Result<Item>> listObjectsPic = minioUtil.getObjectsByBucket(name); for (Result<Item> result : listObjectsPic) { Item item = result.get(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Shanghai")); @@ -48,7 +51,7 @@ log.debug("objectTime : " + objectTime); log.debug("expireTime : " + expireTime); log.debug("objectTime 时间在 expireTime 之前,执行删除"); boolean b = MinioUtils.removeObject(name, item.objectName()); boolean b = minioUtil.removeObject(name, item.objectName()); if (b) { log.debug("成功删除过期数据:" + item.objectName() + "---" + item.lastModified()); } ruoyi-system/src/main/java/com/ruoyi/authorize/common/AuthorizeUtil.java
@@ -19,7 +19,7 @@ import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; @Slf4j(topic="Authorize") @Slf4j(topic="authorize") public class AuthorizeUtil { public static String MachineCode=""; @@ -36,9 +36,9 @@ public static void main(String[] args) { AuthorizeUtil ss = new AuthorizeUtil(); System.out.println("sysStr " + ss.parsLicense()); System.out.println("MachineCode " + ss.getMachineCode()); System.out.println("CPUCode " + ss.getCPUCode()); log.debug("sysStr " + ss.parsLicense()); log.debug("MachineCode " + ss.getMachineCode()); log.debug("CPUCode " + ss.getCPUCode()); //String codeString=ss.parsLicense("b1db709f19d9769e536e2e29888e38b2"); //System.out.println(codeString); //ss.makeTempLicense(); @@ -103,7 +103,9 @@ } catch (Exception e) { log.error("获取机器码异常:"+e.getMessage()); } return Md5Utils.hash(sb.toString().toUpperCase()); String code = Md5Utils.hash(sb.toString().toUpperCase()); log.debug("机器码:"+code); return code; } public static String getCPUCode() { ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java
@@ -1,7 +1,7 @@ package com.ruoyi.system.mapper; import java.util.List; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.common.core.domain.entity.SysConfig; /** * 参数配置 数据层 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java
@@ -1,7 +1,7 @@ package com.ruoyi.system.service; import java.util.List; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.common.core.domain.entity.SysConfig; /** * 参数配置 服务层 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
@@ -5,7 +5,6 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.constant.CacheConstants; @@ -15,7 +14,7 @@ import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysConfig; import com.ruoyi.common.core.domain.entity.SysConfig; import com.ruoyi.system.mapper.SysConfigMapper; import com.ruoyi.system.service.ISysConfigService;