Browse Source

util移动 单点登录

S0025136190 1 year ago
parent
commit
5d20826b7b
17 changed files with 416 additions and 127 deletions
  1. 13 0
      Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementCircleGeometry.java
  2. 169 0
      Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementLineStringGeometry.java
  3. 52 0
      Backend/cloud-sdk/src/main/java/com/dji/sdk/common/AMap.java
  4. 46 51
      Backend/cloud-sdk/src/main/java/com/dji/sdk/common/CoordinateUtil.java
  5. 8 31
      Backend/sample/src/main/java/com/dji/sample/common/util/PicExifUtil.java
  6. 99 0
      Backend/sample/src/main/java/com/dji/sample/component/AuthInterceptor.java
  7. 10 0
      Backend/sample/src/main/java/com/dji/sample/configuration/CustomConfiguration.java
  8. 0 29
      Backend/sample/src/main/java/com/dji/sample/manage/model/common/AMap.java
  9. 1 1
      Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceRedisService.java
  10. 1 1
      Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceService.java
  11. 3 0
      Backend/sample/src/main/java/com/dji/sample/manage/service/IUserService.java
  12. 1 1
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceRedisServiceImpl.java
  13. 1 1
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
  14. 5 8
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java
  15. 4 3
      Backend/sample/src/main/java/com/dji/sample/manage/service/impl/UserServiceImpl.java
  16. 1 0
      Backend/sample/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
  17. 2 1
      Backend/sample/src/main/resources/application.yml

+ 13 - 0
Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementCircleGeometry.java

@@ -61,4 +61,17 @@ public class ElementCircleGeometry extends ElementPointGeometry {
         this.radius = radius;
         return this;
     }
+
+    /**
+     * Calculates the area of the circle.
+     *
+     * @return The area of the circle in square units.
+     */
+    public double calculateArea() {
+        if (radius != null) {
+            return Math.PI * Math.pow(radius, 2);
+        } else {
+            throw new IllegalStateException("Radius is not set.");
+        }
+    }
 }

+ 169 - 0
Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/map/ElementLineStringGeometry.java

@@ -1,5 +1,7 @@
 package com.dji.sdk.cloudapi.map;
 
+import com.dji.sdk.common.AMap;
+import com.dji.sdk.common.CoordinateUtil;
 import com.dji.sdk.exception.CloudSDKErrorEnum;
 import com.dji.sdk.exception.CloudSDKException;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -78,4 +80,171 @@ public class ElementLineStringGeometry extends ElementGeometryType {
     public String getType() {
         return type;
     }
+
+    /**
+     * Calculates the distance between two points on Earth using the Haversine formula.
+     *
+     * @return The distance in meters.
+     */
+    public double getCalculateSegmentLength() {
+        List<ElementCoordinate> list = convertToList();
+        ElementCoordinate coord1 = list.get(0);
+        ElementCoordinate coord2 = list.get(1);
+        final double EARTH_RADIUS = 6371000; // Earth radius in meters
+        double lat1 = Math.toRadians(coord1.getLatitude());
+        double lon1 = Math.toRadians(coord1.getLongitude());
+        double lat2 = Math.toRadians(coord2.getLatitude());
+        double lon2 = Math.toRadians(coord2.getLongitude());
+
+        double dLat = lat2 - lat1;
+        double dLon = lon2 - lon1;
+
+        double a = Math.pow(Math.sin(dLat / 2), 2) +
+                Math.cos(lat1) * Math.cos(lat2) *
+                        Math.pow(Math.sin(dLon / 2), 2);
+        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+
+        return EARTH_RADIUS * c;
+    }
+
+    public double calculateSegmentLength(ElementCoordinate coord1, ElementCoordinate coord2) {
+        final double EARTH_RADIUS = 6371000; // Earth radius in meters
+        double lat1 = Math.toRadians(coord1.getLatitude());
+        double lon1 = Math.toRadians(coord1.getLongitude());
+        double lat2 = Math.toRadians(coord2.getLatitude());
+        double lon2 = Math.toRadians(coord2.getLongitude());
+
+        double dLat = lat2 - lat1;
+        double dLon = lon2 - lon1;
+
+        double a = Math.pow(Math.sin(dLat / 2), 2) +
+                Math.cos(lat1) * Math.cos(lat2) *
+                        Math.pow(Math.sin(dLon / 2), 2);
+        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+
+        return EARTH_RADIUS * c;
+    }
+
+    /**
+     * Calculates the distance between two points on Earth using Vincenty's formula.
+     *
+     * @param coord1 The first coordinate.
+     * @param coord2 The second coordinate.
+     * @return The distance in meters.
+     */
+    private double calculateSegmentLengthVincenty(ElementCoordinate coord1, ElementCoordinate coord2) {
+        final double EARTH_RADIUS_EQUATOR = 6378137; // Semi-major axis of the WGS84 ellipsoid
+        final double EARTH_RADIUS_POLE = 6356752.314245; // Semi-minor axis of the WGS84 ellipsoid
+        final double FLATTENING = (EARTH_RADIUS_EQUATOR - EARTH_RADIUS_POLE) / EARTH_RADIUS_EQUATOR; // Flattening factor
+        final double EARTH_RADIUS = (EARTH_RADIUS_EQUATOR + EARTH_RADIUS_POLE) / 2.0;
+
+        double lat1 = Math.toRadians(coord1.getLatitude());
+        double lon1 = Math.toRadians(coord1.getLongitude());
+        double lat2 = Math.toRadians(coord2.getLatitude());
+        double lon2 = Math.toRadians(coord2.getLongitude());
+
+        double U1 = Math.atan((1 - FLATTENING) * Math.tan(lat1));
+        double U2 = Math.atan((1 - FLATTENING) * Math.tan(lat2));
+        double L = lon2 - lon1;
+        double lambda = L;
+        double lambdaP = 0.0;
+        double iterLimit = 100;
+        double sinLambda = 0.0;
+        double cosLambda = 0.0;
+        double sinSigma = 0.0;
+        double cosSigma = 0.0;
+        double sigma = 0.0;
+        double sinAlpha = 0.0;
+        double cosSqAlpha = 0.0;
+        double cos2SigmaM = 0.0;
+        double uSquared = 0.0;
+        double A = 0.0;
+        double B = 0.0;
+        double deltaSigma = 0.0;
+        double sinU1 = Math.sin(U1);
+        double cosU1 = Math.cos(U1);
+        double sinU2 = Math.sin(U2);
+        double cosU2 = Math.cos(U2);
+
+        do {
+            sinLambda = Math.sin(lambda);
+            cosLambda = Math.cos(lambda);
+            sinSigma = Math.sqrt((cosU2 * sinLambda) * (cosU2 * sinLambda) +
+                    (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda));
+            if (sinSigma == 0.0) {
+                return 0.0; // coincident points
+            }
+            cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;
+            sigma = Math.atan2(sinSigma, cosSigma);
+            sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
+            cosSqAlpha = 1 - sinAlpha * sinAlpha;
+            cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha;
+            if (Double.isNaN(cos2SigmaM)) {
+                cos2SigmaM = 0; // equatorial line: cosSqAlpha = 0 (§6)
+            }
+            uSquared = cosSqAlpha * (EARTH_RADIUS_EQUATOR * EARTH_RADIUS_EQUATOR - EARTH_RADIUS_POLE * EARTH_RADIUS_POLE) / (EARTH_RADIUS_POLE * EARTH_RADIUS_POLE);
+            A = 1 + uSquared / 16384 * (4096 + uSquared * (-768 + uSquared * (320 - 175 * uSquared)));
+            B = uSquared / 1024 * (256 + uSquared * (-128 + uSquared * (74 - 47 * uSquared)));
+            deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) -
+                    B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)));
+            lambdaP = lambda;
+            lambda = L + (1 - B) * FLATTENING * sinAlpha * (sigma + deltaSigma); // Use the flattening factor here
+        } while (Math.abs(lambda - lambdaP) > 1e-12 && --iterLimit > 0);
+
+        if (iterLimit == 0) {
+            return 0.0; // formula failed to converge
+        }
+
+        double s = EARTH_RADIUS * (sigma - deltaSigma);
+
+        return s;
+    }
+
+    /**
+     * Calculates the total length of the line string.
+     *
+     * @return The total length in meters.
+     */
+    public double getCalculateTotalLength() {
+        double totalLength = 0.0;
+        List<ElementCoordinate> coordinateList = convertToList();
+
+        for (int i = 0; i < coordinateList.size() - 1; i++) {
+            ElementCoordinate coord1 = coordinateList.get(i);
+            AMap aMap = CoordinateUtil.transform(coord1.getLongitude(),coord1.getLatitude());
+            coord1.setLongitude(aMap.getLongitude());
+            coord1.setLatitude(aMap.getLatitude());
+
+            ElementCoordinate coord2 = coordinateList.get(i + 1);
+            aMap = CoordinateUtil.transform(coord2.getLongitude(),coord2.getLatitude());
+            coord2.setLongitude(aMap.getLongitude());
+            coord2.setLatitude(aMap.getLatitude());
+
+            totalLength += calculateSegmentLengthVincenty(coord1, coord2);
+        }
+
+        return totalLength;
+    }
+
+    public static void main(String[] args) {
+        ElementLineStringGeometry lineStringGeometry = new ElementLineStringGeometry();
+        AMap aMap = CoordinateUtil.transform(121.59529228016724, 31.2771648028396);
+        AMap aMap2 = CoordinateUtil.transform(121.55949257988347, 31.27563389661576);
+        AMap aMap3 = CoordinateUtil.transform(121.55866186357967, 31.27687211836336);
+        Double[][] coordinates = new Double[][]{
+                {aMap.getLongitude(),aMap.getLatitude()},
+                {aMap2.getLongitude(),aMap2.getLatitude()},
+                {aMap3.getLongitude(),aMap3.getLatitude()}
+//                {121.59529228016724, 31.2771648028396},
+//                {121.55949257988347, 31.27563389661576},
+//                {121.55866186357967, 31.27687211836336}
+
+
+        };
+        lineStringGeometry.setCoordinates(coordinates);
+
+        double totalLength = lineStringGeometry.getCalculateTotalLength();
+        System.out.println("The total length of the line string is: " + totalLength + " meters");
+    }
+
 }

+ 52 - 0
Backend/cloud-sdk/src/main/java/com/dji/sdk/common/AMap.java

@@ -0,0 +1,52 @@
+package com.dji.sdk.common;
+
+
+/**
+ * 高德经纬度类
+ * @author hqjiang
+ * @version 1.0
+ * @date 2024/7/2
+ */
+public class AMap {
+    /**
+     * 经度
+     */
+    private double longitude;
+
+    /**
+     * 维度
+     */
+    private double latitude;
+
+    public AMap(double wgLon, double wgLat) {
+        this.longitude = wgLon;
+        this.latitude = wgLat;
+    }
+
+
+
+
+    @Override
+    public String toString() {
+        return "AMap{" +
+                "longitude=" + longitude +
+                ", latitude=" + latitude +
+                '}';
+    }
+
+    public double getLongitude() {
+        return longitude;
+    }
+
+    public void setLongitude(double longitude) {
+        this.longitude = longitude;
+    }
+
+    public void setLatitude(double latitude) {
+        this.latitude = latitude;
+    }
+
+    public double getLatitude() {
+        return latitude;
+    }
+}

+ 46 - 51
Backend/sample/src/main/java/com/dji/sample/common/util/CoordinateUtil.java → Backend/cloud-sdk/src/main/java/com/dji/sdk/common/CoordinateUtil.java

@@ -1,14 +1,6 @@
-package com.dji.sample.common.util;
+package com.dji.sdk.common;
 
 
-import com.dji.sample.manage.model.common.AMap;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
 import org.springframework.stereotype.Component;
 
 import java.text.DecimalFormat;
@@ -19,56 +11,59 @@ import java.text.DecimalFormat;
  * @date 2024/7/2
  */
 
-@Slf4j
 @Component
 public class CoordinateUtil {
     private static final String GAODE_API_URL = "https://restapi.amap.com/v3/assistant/coordinate/convert?locations=经度,纬度&coordsys=gps&key=96d7df07675b274a4078b107e56b2a4a";// + AMapProperties.key;
 
     public static void main(String[] args) {
-        double lon = 116.481499;
-        double lat = 39.990475;
-        log.info("GPS转高德之前:" + lon + "," + lat);
-        AMap aMap = CoordinateUtil.convertToAMapCoord(lon,lat);
-        log.info("GPS转高德之后(WEBAPI):" + aMap.getLongitude() + "," + aMap.getLatitude());
-        aMap = transform(lon,lat);
-        log.info("GPS转高德之后:" + aMap.getLongitude() + "," + aMap.getLatitude());
+
+//        {121.59529228016724, 31.2771648028396},
+//        {121.55949257988347, 31.27563389661576},
+//        {121.55866186357967, 31.27687211836336}
+        double lon = 121.55866186357967;
+        double lat = 31.27687211836336;
+//        log.info("GPS转高德之前:" + lon + "," + lat);
+//        AMap aMap = CoordinateUtil.convertToAMapCoord(lon,lat);
+//        log.info("GPS转高德之后(WEBAPI):" + aMap.getLongitude() + "," + aMap.getLatitude());
+        AMap aMap = transform(lon,lat);
+        //log.info("GPS转高德之后:" + aMap.getLongitude() + "," + aMap.getLatitude());
         /**
          * 高德API(https://lbs.amap.com/api/webservice/guide/api/convert)经纬度转换之后.
          * 两者误差不是很大
          */
     }
 
-    public static AMap convertToAMapCoord(double originalLng, double originalLat) {
-        String response = sendRequest(originalLng,originalLat);
-        log.info("GPS转高德之后(WEBAPI):" + response);
-        JsonElement element = JsonParser.parseString(response);
-        String status = element.getAsJsonObject().get("status").getAsString();
-        if("1".equals(status)) {
-            String locations = element.getAsJsonObject().get("locations").getAsString();
-            String[] locArray =  locations.split(",");
-            double lon = Double.parseDouble(String.format("%.5f", Double.parseDouble(locArray[0])));
-            double lat = Double.parseDouble(String.format("%.5f", Double.parseDouble(locArray[1])));
-            return new AMap(lon, lat);
-        }
-
-        return null;
-
-    }
-
-    private static String sendRequest(double longitude, double latitude) {
-        HttpGet request = new HttpGet(GAODE_API_URL
-                .replace("经度", Double.toString(longitude))
-                .replace("纬度", Double.toString(latitude)));
-
-        try {
-            org.apache.http.client.HttpClient client = HttpClients.createDefault();
-            HttpResponse httpResponse = client.execute(request);
-            return EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
-        } catch (Exception e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
+//    public static AMap convertToAMapCoord(double originalLng, double originalLat) {
+//        String response = sendRequest(originalLng,originalLat);
+//        log.info("GPS转高德之后(WEBAPI):" + response);
+//        JsonElement element = JsonParser.parseString(response);
+//        String status = element.getAsJsonObject().get("status").getAsString();
+//        if("1".equals(status)) {
+//            String locations = element.getAsJsonObject().get("locations").getAsString();
+//            String[] locArray =  locations.split(",");
+//            double lon = Double.parseDouble(String.format("%.5f", Double.parseDouble(locArray[0])));
+//            double lat = Double.parseDouble(String.format("%.5f", Double.parseDouble(locArray[1])));
+//            return new AMap(lon, lat);
+//        }
+//
+//        return null;
+//
+//    }
+
+//    private static String sendRequest(double longitude, double latitude) {
+//        HttpGet request = new HttpGet(GAODE_API_URL
+//                .replace("经度", Double.toString(longitude))
+//                .replace("纬度", Double.toString(latitude)));
+//
+//        try {
+//            org.apache.http.client.HttpClient client = HttpClients.createDefault();
+//            HttpResponse httpResponse = client.execute(request);
+//            return EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            return null;
+//        }
+//    }
 
     /**
      * 椭球参数
@@ -117,9 +112,9 @@ public class CoordinateUtil {
         double transLat = wgLat + dLat;
         double transLon = wgLon + dLon;
 
-        DecimalFormat df = new DecimalFormat("#.000000");
-        transLon = Double.parseDouble(df.format(transLon));
-        transLat = Double.parseDouble(df.format(transLat));
+//        DecimalFormat df = new DecimalFormat("#.000000");
+//        transLon = Double.parseDouble(df.format(transLon));
+//        transLat = Double.parseDouble(df.format(transLat));
 
 
         return new AMap(transLon, transLat);

+ 8 - 31
Backend/sample/src/main/java/com/dji/sample/common/util/PicExifUtil.java

@@ -3,10 +3,8 @@ package com.dji.sample.common.util;
 
 import com.dji.sample.component.oss.model.OssConfiguration;
 import com.dji.sample.component.oss.service.impl.OssServiceContext;
-import com.dji.sample.manage.model.common.AMap;
 import com.dji.sample.media.model.MediaExifDTO;
 import com.drew.imaging.ImageMetadataReader;
-import com.drew.imaging.mp4.Mp4MetadataReader;
 import com.drew.metadata.Metadata;
 import com.drew.metadata.exif.*;
 import com.drew.metadata.file.FileTypeDirectory;
@@ -24,7 +22,9 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import org.springframework.stereotype.Component;
 
-import java.io.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.text.DecimalFormat;
 
 /**
@@ -56,28 +56,12 @@ public class PicExifUtil {
         return getPicExif(inputStream,objectKey.endsWith(MP4));
     }
 
-    public static void main(String[] args) {
-        //全景图
-//        File file = new File("C:\\Users\\86139\\Desktop\\DJI_20240709132723_0001_V.JPG");
-        File file = new File("C:\\Users\\86139\\Desktop\\DJI_20231011154344_0003_V.jpg");
-
-
-//        File file = new File("C:\\Users\\86139\\Desktop\\DJI_20240711181155_0001_V.JPG");
-        try {
-            InputStream inputStream = new FileInputStream(file);
-            MediaExifDTO mediaExifDTO = getPicExif(inputStream,false);
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        }
-    }
-
     public static MediaExifDTO getPicExif(InputStream inputStream,boolean isVideo) {
         try {
             MediaExifDTO.MediaExifDTOBuilder builder = MediaExifDTO.builder();
-
+            Metadata metadata = ImageMetadataReader.readMetadata(inputStream);
             //视频
             if(isVideo) {
-                Metadata metadata = Mp4MetadataReader.readMetadata(inputStream);
                 //视频宽高
                 Mp4VideoDirectory mp4VideoDirectory = metadata.getFirstDirectoryOfType(Mp4VideoDirectory.class);
                 builder.imageWidth(mp4VideoDirectory.getInteger(Mp4VideoDirectory.TAG_WIDTH));
@@ -90,13 +74,7 @@ public class PicExifUtil {
                 builder.durationSeconds(mp4Directory.getInteger(Mp4Directory.TAG_DURATION_SECONDS));
                 builder.createTime(mp4Directory.getDate(Mp4Directory.TAG_CREATION_TIME).getTime());
 
-                //媒体类型
-                FileTypeDirectory fileTypeDirectory = metadata.getFirstDirectoryOfType(FileTypeDirectory.class);
-                builder.mediaType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE));
-                builder.pictureType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_TYPE_NAME));
-
             } else {
-                Metadata metadata = ImageMetadataReader.readMetadata(inputStream);
                 //经纬度
                 GpsDirectory gpsDirectory = metadata.getFirstDirectoryOfType(GpsDirectory.class);
                 builder.absoluteAltitude(gpsDirectory.getDouble(GpsDirectory.TAG_ALTITUDE));
@@ -112,12 +90,11 @@ public class PicExifUtil {
                 ExifSubIFDDirectory exifSubIFDDirectory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
                 builder.imageWidth(exifSubIFDDirectory.getInteger(ExifSubIFDDirectory.TAG_EXIF_IMAGE_WIDTH));
                 builder.imageHeight(exifSubIFDDirectory.getInteger(ExifSubIFDDirectory.TAG_EXIF_IMAGE_HEIGHT));
-                //媒体类型
-                FileTypeDirectory fileTypeDirectory = metadata.getFirstDirectoryOfType(FileTypeDirectory.class);
-                builder.mediaType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE));
-                builder.pictureType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_TYPE_NAME));
             }
-
+            //媒体类型
+            FileTypeDirectory fileTypeDirectory = metadata.getFirstDirectoryOfType(FileTypeDirectory.class);
+            builder.mediaType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE));
+            builder.pictureType(fileTypeDirectory.getString(FileTypeDirectory.TAG_DETECTED_FILE_TYPE_NAME));
             return builder.build();
         } catch (Exception e) {
             e.printStackTrace();

+ 99 - 0
Backend/sample/src/main/java/com/dji/sample/component/AuthInterceptor.java

@@ -1,9 +1,17 @@
 package com.dji.sample.component;
 
+import cn.hutool.Hutool;
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.digest.DigestUtil;
 import com.dji.sample.common.error.CommonErrorEnum;
 import com.dji.sample.common.model.CustomClaim;
 import com.dji.sample.common.util.JwtUtil;
+import com.dji.sample.configuration.CustomConfiguration;
+import com.dji.sample.manage.model.entity.UserEntity;
+import com.dji.sample.manage.service.IUserService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
@@ -13,7 +21,14 @@ import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 
 @Slf4j
 @Component
@@ -23,6 +38,16 @@ public class AuthInterceptor implements HandlerInterceptor {
 
     public static final String TOKEN_CLAIM = "customClaim";
 
+    public static final String SIGN = "sign";
+
+    public static final String KEY = "key";
+
+    public static final String USER_CODE = "userCode";
+
+    @Autowired
+    private IUserService userService;
+
+
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         String uri = request.getRequestURI();
@@ -33,6 +58,46 @@ public class AuthInterceptor implements HandlerInterceptor {
             return false;
         }
         String token = request.getHeader(PARAM_TOKEN);
+        String sign = request.getHeader(SIGN);
+        if (StringUtils.hasText(sign)) {
+            if ("GET".equalsIgnoreCase(request.getMethod())) {
+                // Get sign from the query string
+                String key = request.getHeader(KEY);
+                String userCode = request.getHeader(USER_CODE);
+                UserEntity userEntity = userService.getUserByUsername(userCode);
+                if (userEntity == null) {
+                    response.setStatus(HttpStatus.UNAUTHORIZED.value());
+                    log.error(CommonErrorEnum.NO_TOKEN.getMessage());
+                    return false;
+                }
+                byte[] decodedBytes = Base64.decode(key);
+                String decodedString = new String(decodedBytes);
+                // Step 1: Parse the date-time string
+                String dateTimeString = extractDateTime(decodedString,userCode);
+                // Step 2: Convert the date-time string to LocalDateTime
+                LocalDateTime dateTime = parseTimestamp(dateTimeString);
+                // Step 3: Calculate the difference between the current time and the extracted time
+                LocalDateTime currentTime = LocalDateTime.now();
+                Duration duration = Duration.between(dateTime, currentTime);
+
+                // Step 4: Check if the difference is greater than 5 minutes
+                boolean isMoreThanFiveMinutes = duration.toMinutes() > 5;
+                if (isMoreThanFiveMinutes) {
+                    response.setStatus(HttpStatus.UNAUTHORIZED.value());
+                    log.error(CommonErrorEnum.NO_TOKEN.getMessage());
+                    return false;
+                }
+                String generatedHash = DigestUtil.sha256Hex(userCode+decodedString+ CustomConfiguration.signKey);
+                // Verify the hash
+                boolean isMatch = StrUtil.equals(generatedHash, sign);
+                if(!isMatch) {
+                    response.setStatus(HttpStatus.UNAUTHORIZED.value());
+                    log.error(CommonErrorEnum.NO_TOKEN.getMessage());
+                    return false;
+                }
+                return true;
+            }
+        }
         // Check if the token exists.
         if (!StringUtils.hasText(token)) {
             response.setStatus(HttpStatus.UNAUTHORIZED.value());
@@ -57,4 +122,38 @@ public class AuthInterceptor implements HandlerInterceptor {
         // Delete the custom data in the request after the request ends.
         request.removeAttribute(TOKEN_CLAIM);
     }
+
+    private static String extractDateTime(String inputString,String userCode) {
+        // Step 1: Define the pattern
+        Pattern pattern = Pattern.compile(userCode+"(\\d+)"+userCode);
+        // Step 2: Create a matcher for the input string
+        Matcher matcher = pattern.matcher(inputString);
+        // Step 3: Check if the pattern matches
+        if (matcher.find()) {
+            // Step 4: Extract the number
+            String number = matcher.group(1); // group(1) refers to the first capturing group
+            return number;
+        } else {
+            return null;
+        }
+    }
+
+    private static LocalDateTime parseTimestamp(String timestampString) {
+        // Convert the timestamp to LocalDateTime
+        long timestamp = Long.parseLong(timestampString);
+        return LocalDateTime.ofInstant(
+                Instant.ofEpochSecond(timestamp),
+                ZoneId.systemDefault()
+        );
+    }
+
+    public static void main(String[] args) {
+        String aa = "adminPC1722596411adminPC";
+        String ab = Base64.encode(aa);
+        String ac =DigestUtil.sha256Hex("adminPC"+aa+CustomConfiguration.signKey);
+        System.out.println("base:"+ab+"ac"+ac);
+        System.out.println("adminPC"+aa+CustomConfiguration.signKey);
+        System.out.println("adminPC"+aa+CustomConfiguration.signKey);
+        System.out.println(DigestUtil.sha256Hex("adminPCadminPC1722596411adminPC7e92430eb1f949e9a750fadf68777c44"));
+    }
 }

+ 10 - 0
Backend/sample/src/main/java/com/dji/sample/configuration/CustomConfiguration.java

@@ -24,6 +24,16 @@ public class CustomConfiguration {
      */
     public static String key;
 
+    public void setSignKey(String signKey) {
+        CustomConfiguration.signKey = signKey;
+    }
+
+    /**
+     * 加密密钥
+     * @param frequency
+     */
+    public static String signKey;
+
     public void setFrequency(int frequency) {
         CustomConfiguration.frequency = frequency;
     }

+ 0 - 29
Backend/sample/src/main/java/com/dji/sample/manage/model/common/AMap.java

@@ -1,29 +0,0 @@
-package com.dji.sample.manage.model.common;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * 高德经纬度类
- * @author hqjiang
- * @version 1.0
- * @date 2024/7/2
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-public class AMap {
-    /**
-     * 经度
-     */
-    private double longitude;
-
-    /**
-     * 维度
-     */
-    private double latitude;
-
-}

+ 1 - 1
Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceRedisService.java

@@ -1,7 +1,7 @@
 package com.dji.sample.manage.service;
 
 import com.dji.sample.component.mqtt.model.EventsReceiver;
-import com.dji.sample.manage.model.common.AMap;
+import com.dji.sdk.common.AMap;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.map.model.dto.FlightTaskDTO;
 import com.dji.sample.map.model.dto.FlightTrackDTO;

+ 1 - 1
Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceService.java

@@ -2,7 +2,7 @@ package com.dji.sample.manage.service;
 
 import com.dji.sample.common.model.CustomClaim;
 import com.dji.sample.component.websocket.model.BizCodeEnum;
-import com.dji.sample.manage.model.common.AMap;
+import com.dji.sdk.common.AMap;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
 import com.dji.sample.manage.model.dto.TopologyDeviceDTO;

+ 3 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/IUserService.java

@@ -2,6 +2,7 @@ package com.dji.sample.manage.service;
 
 import com.dji.sample.manage.model.dto.UserDTO;
 import com.dji.sample.manage.model.dto.UserListDTO;
+import com.dji.sample.manage.model.entity.UserEntity;
 import com.dji.sdk.common.HttpResultResponse;
 import com.dji.sdk.common.PaginationData;
 
@@ -53,4 +54,6 @@ public interface IUserService {
      * @return
      */
     Boolean updateUserWorkspace(String newWorkspaceId, String userId);
+
+    UserEntity getUserByUsername(String username);
 }

+ 1 - 1
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceRedisServiceImpl.java

@@ -3,7 +3,7 @@ package com.dji.sample.manage.service.impl;
 import com.dji.sample.component.mqtt.model.EventsReceiver;
 import com.dji.sample.component.redis.RedisConst;
 import com.dji.sample.component.redis.RedisOpsUtils;
-import com.dji.sample.manage.model.common.AMap;
+import com.dji.sdk.common.AMap;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.service.ICapacityCameraService;
 import com.dji.sample.manage.service.IDeviceRedisService;

+ 1 - 1
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java

@@ -10,7 +10,7 @@ import com.dji.sample.component.websocket.model.BizCodeEnum;
 import com.dji.sample.component.websocket.service.IWebSocketMessageService;
 import com.dji.sample.control.model.enums.DroneAuthorityEnum;
 import com.dji.sample.manage.dao.IDeviceMapper;
-import com.dji.sample.manage.model.common.AMap;
+import com.dji.sdk.common.AMap;
 import com.dji.sample.manage.model.dto.*;
 import com.dji.sample.manage.model.entity.DeviceEntity;
 import com.dji.sample.manage.model.enums.DeviceFirmwareStatusEnum;

+ 5 - 8
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java

@@ -1,12 +1,13 @@
 package com.dji.sample.manage.service.impl;
 
 import cn.hutool.core.date.DateUtil;
-import com.dji.sample.common.util.CoordinateUtil;
+import com.dji.sample.map.model.dto.FlightTrackDTO;
+import com.dji.sdk.common.CoordinateUtil;
 import com.dji.sample.common.util.UserRequest;
 import com.dji.sample.component.websocket.model.BizCodeEnum;
 import com.dji.sample.component.websocket.service.IWebSocketMessageService;
 import com.dji.sample.configuration.CustomConfiguration;
-import com.dji.sample.manage.model.common.AMap;
+import com.dji.sdk.common.AMap;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.dto.DevicePayloadReceiver;
 import com.dji.sample.manage.model.enums.DeviceFirmwareStatusEnum;
@@ -16,7 +17,6 @@ import com.dji.sample.manage.service.IDevicePayloadService;
 import com.dji.sample.manage.service.IDeviceRedisService;
 import com.dji.sample.manage.service.IDeviceService;
 import com.dji.sample.map.model.dto.FlightTaskDTO;
-import com.dji.sample.map.model.dto.FlightTrackDTO;
 import com.dji.sample.map.model.entity.FlightTaskEntity;
 import com.dji.sample.map.model.entity.FlightTrackEntity;
 import com.dji.sample.map.model.enums.FlightPointTypeEnum;
@@ -34,7 +34,6 @@ import com.dji.sdk.mqtt.status.TopicStatusRequest;
 import com.dji.sdk.mqtt.status.TopicStatusResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cache.support.AbstractCacheManager;
 import org.springframework.messaging.MessageHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -546,11 +545,9 @@ public class SDKDeviceService extends AbstractDeviceService {
             return;
         }
 
+        AMap aMap = new AMap(CoordinateUtil.checkValidVal(request.getData().getHomeLongitude()),CoordinateUtil.checkValidVal(request.getData().getHomeLatitude()));
         //home点更新
-        deviceService.updateHome(deviceOpt.get(), AMap.builder()
-                .longitude(CoordinateUtil.checkValidVal(request.getData().getHomeLongitude()))
-                .latitude(CoordinateUtil.checkValidVal(request.getData().getHomeLatitude()))
-                .build());
+        deviceService.updateHome(deviceOpt.get(), aMap);
         deviceService.updateFlightControl(rcOpt.get(), request.getData().getControlSource());
         devicePayloadService.updatePayloadControl(deviceOpt.get(),
                 request.getData().getPayloads().stream()

+ 4 - 3
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/UserServiceImpl.java

@@ -142,8 +142,8 @@ public class UserServiceImpl implements IUserService {
         }
 
         //密码加密
-        String encryptPsw = DesUtil.getEncryptData(password,userEntity.getSalt());
-        if (!encryptPsw.equals(userEntity.getPassword()) || !username.equals(userEntity.getUsername())) {
+        //String encryptPsw = DesUtil.getEncryptData(password,userEntity.getSalt());
+        if (!password.equals(userEntity.getPassword()) || !username.equals(userEntity.getUsername())) {
             return new HttpResultResponse()
                     .setCode(HttpStatus.UNAUTHORIZED.value())
                     .setMessage("用户名或密码不匹配");
@@ -317,7 +317,8 @@ public class UserServiceImpl implements IUserService {
      * @param username
      * @return
      */
-    private UserEntity getUserByUsername(String username) {
+    @Override
+    public UserEntity getUserByUsername(String username) {
         return mapper.selectOne(new QueryWrapper<UserEntity>()
                 .eq("username", username));
     }

+ 1 - 0
Backend/sample/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java

@@ -25,6 +25,7 @@ import com.dji.sdk.cloudapi.map.*;
 import com.dji.sdk.cloudapi.media.MediaSubFileTypeEnum;
 import com.dji.sdk.cloudapi.media.MediaUploadCallbackRequest;
 import com.dji.sdk.cloudapi.wayline.GetWaylineListResponse;
+import com.dji.sdk.common.CoordinateUtil;
 import com.dji.sdk.common.Pagination;
 import com.dji.sdk.common.PaginationData;
 import lombok.extern.slf4j.Slf4j;

+ 2 - 1
Backend/sample/src/main/resources/application.yml

@@ -181,4 +181,5 @@ livestream:
 custom-config:
   #航点采集频次(秒)
   frequency: 3
-  key: b1uruk98vuk40cdego6jw5yv9tygjm3s
+  key: b1uruk98vuk40cdego6jw5yv9tygjm3s
+  signKey: 7e92430eb1f949e9a750fadf68777c44