1
13693261870
2024-07-17 a06e2ee872f15d747069645243341bd81c36e236
1
已修改6个文件
已删除8个文件
1539 ■■■■■ 文件已修改
pom.xml 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/SimuApplication.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/config/InitConfig.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/config/Knife4jConfig.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/controller/WaterController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/helper/FileHelper.java 444 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/helper/GdalHelper.java 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/helper/StringHelper.java 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/helper/WebHelper.java 328 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/service/WaterService.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/se/simu/SimuApplicationTests.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -34,78 +34,11 @@
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!--mybatis-plus
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.7</version>
        </dependency>-->
        <!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--postgresql
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>-->
        <!--整合druid数据源
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.22</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>-->
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>3.3.1</version>
            <scope>test</scope>
        </dependency>
        <!--text-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-text</artifactId>
            <version>1.12.0</version>
        </dependency>
        <!--hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.29</version>
        </dependency>
        <!--httpclient-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <!--knife4j-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
        <!--fast-md5-->
        <dependency>
            <groupId>com.joyent.util</groupId>
            <artifactId>fast-md5</artifactId>
            <version>2.7.1</version>
        </dependency>
        <!--fastjson2-->
        <dependency>
@@ -113,32 +46,7 @@
            <artifactId>fastjson2</artifactId>
            <version>2.0.52</version>
        </dependency>
        <!--gdal-->
        <dependency>
            <groupId>org.gdal</groupId>
            <artifactId>gdal</artifactId>
            <!--<version>3.9.0</version>-->
            <version>3.2.0</version>
        </dependency>
    </dependencies>
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <activatedProperties>dev</activatedProperties>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <activatedProperties>prod</activatedProperties>
            </properties>
        </profile>
    </profiles>
    <build>
        <finalName>SimuServer</finalName>
src/main/java/com/se/simu/SimuApplication.java
@@ -3,8 +3,6 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
 * å¯åŠ¨ç¨‹åºç±»
@@ -13,13 +11,8 @@
 * @date 2024-07-16
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}, scanBasePackages = {"com.se.simu"})
public class SimuApplication  extends SpringBootServletInitializer {
public class SimuApplication {
    public static void main(String[] args) {
        SpringApplication.run(SimuApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
        return springApplicationBuilder.sources(SimuApplication.class);
    }
}
src/main/java/com/se/simu/config/InitConfig.java
ÎļþÒÑɾ³ý
src/main/java/com/se/simu/config/Knife4jConfig.java
ÎļþÒÑɾ³ý
src/main/java/com/se/simu/controller/WaterController.java
@@ -1,11 +1,8 @@
package com.se.simu.controller;
import com.se.simu.domain.LayerVo;
import com.se.simu.helper.StringHelper;
import com.se.simu.helper.WebHelper;
import com.se.simu.service.WaterService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
@@ -23,7 +20,6 @@
 * @author WWW
 * @date   2024-07-16
 */
@Api(tags = "内涝管理")
@Slf4j
@RestController
@RequestMapping("/waterlogging")
@@ -37,13 +33,11 @@
    private final static long Y2000 = 949334400000L;
    @ApiOperation(value = "获取当前时间")
    @GetMapping("/getTime")
    public Object getTime() {
        return System.currentTimeMillis();
    }
    @ApiOperation(value = "获取元数据信息")
    @GetMapping("/{serviceName}/layer.json")
    public void getLayer(@PathVariable String serviceName, HttpServletResponse res) {
        try {
@@ -60,7 +54,6 @@
        }
    }
    @ApiOperation(value = "获取地形高度图")
    @GetMapping("/{serviceName}/terrain")
    public void getTerraMap(@PathVariable String serviceName, Integer width, Integer height, HttpServletResponse res) {
        try {
@@ -76,7 +69,6 @@
        }
    }
    @ApiOperation(value = "获取水面高度图")
    @GetMapping("/{serviceName}/waterMap")
    public void getWaterMap(@PathVariable String serviceName, Integer width, Integer height, Long timestamp, HttpServletResponse res) {
        try {
@@ -92,7 +84,6 @@
        }
    }
    @ApiOperation(value = "获取水流向流速图")
    @GetMapping("/{serviceName}/flowMap")
    public void getFlowMap(@PathVariable String serviceName, Integer width, Integer height, Long timestamp, HttpServletResponse res) {
        try {
@@ -109,7 +100,7 @@
    }
    private boolean validate(String serviceName, HttpServletResponse res) {
        if (StringHelper.isEmpty(serviceName)) {
        if (WebHelper.isEmpty(serviceName)) {
            return WebHelper.writeJson2Page(res, HttpStatus.BAD_REQUEST, "服务名不能为空");
        }
@@ -124,7 +115,7 @@
     * éªŒè¯
     */
    private boolean validate(String serviceName, Integer width, Integer height, Long timestamp, HttpServletResponse res) {
        if (StringHelper.isEmpty(serviceName)) {
        if (WebHelper.isEmpty(serviceName)) {
            return WebHelper.writeJson2Page(res, HttpStatus.BAD_REQUEST, "服务名不能为空");
        }
        if (null == width || width < MIN_SIZE || width > MAX_SIZE) {
@@ -144,7 +135,7 @@
     * å†™æ–‡ä»¶
     */
    private boolean writeFile(String path, HttpServletResponse res) throws Exception {
        if (StringHelper.isEmpty(path)) {
        if (WebHelper.isEmpty(path)) {
            return WebHelper.writeJson2Page(res, HttpStatus.INTERNAL_SERVER_ERROR, "生成PNG失败");
        }
        File file = new File(path);
src/main/java/com/se/simu/helper/FileHelper.java
ÎļþÒÑɾ³ý
src/main/java/com/se/simu/helper/GdalHelper.java
ÎļþÒÑɾ³ý
src/main/java/com/se/simu/helper/StringHelper.java
ÎļþÒÑɾ³ý
src/main/java/com/se/simu/helper/WebHelper.java
@@ -6,20 +6,16 @@
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.URLEncoder;
import java.net.UnknownHostException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;
/**
@@ -30,15 +26,23 @@
 */
@Slf4j
public class WebHelper {
    public final static String POINT = ".";
    private final static String COMMA = ",";
    private final static String UNKNOWN = "unknown";
    public final static String TOKEN_KEY = "token";
    /**
     * æ ¼å¼åŒ–当前系统日期 4
     */
    public static final SimpleDateFormat YMDHMS = new SimpleDateFormat("yyyyMMddHHmmss");
    public final static String TOKEN_COOKIE_KEY = "token";
    public final static int COOKIE_MAX_AGE = 4 * 60 * 60;
    /**
     * å­—符串,是否为空null和空格
     */
    public static boolean isEmpty(String str) {
        return null == str || "".equals(str.trim());
    }
    /**
     * èŽ·å–GUID
@@ -114,131 +118,6 @@
    }
    /**
     * èŽ·å–å½“å‰æ—¶é—´æŒ‡å®šåˆ†é’Ÿæ•°åŽçš„Timestamp
     */
    public static Timestamp getTimestamp(int min) {
        Calendar now = Calendar.getInstance();
        now.add(Calendar.MINUTE, min);
        return new Timestamp(now.getTimeInMillis());
    }
    /**
     * ä»ŽCookie中获取token
     */
    public static String getTokenFromCookie(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies == null || cookies.length == 0) {
            return null;
        }
        for (Cookie cookie : cookies) {
            switch (cookie.getName()) {
                case TOKEN_COOKIE_KEY:
                    return cookie.getValue();
                default:
                    break;
            }
        }
        return null;
    }
    /**
     * å‘Cookie中添加token
     */
    public static void saveToken2Cookie(String token, HttpServletRequest request, HttpServletResponse response) {
        // å…ˆåˆ é™¤
        deleteCookies(request, response);
        // å†ä¿å­˜
        saveCookie(TOKEN_COOKIE_KEY, token, response);
    }
    /**
     * ä¿å­˜Cookie
     */
    public static void saveCookie(String key, String value, HttpServletResponse response) {
        Cookie cookie = new Cookie(key, value);
        // è®¾ç½®cookie失效时间,单位为秒
        cookie.setMaxAge(COOKIE_MAX_AGE);
        cookie.setHttpOnly(false);
        cookie.setPath("/");
        //cookie.setDomain("*")
        response.setHeader("P3P", "CP=CAO PSA OUR");
        response.addCookie(cookie);
    }
    /**
     * åˆ é™¤cookie中的值
     */
    public static void deleteCookie(String cookieKey, HttpServletRequest request, HttpServletResponse response) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie c : cookies) {
                if (cookieKey.equalsIgnoreCase(c.getName())) {
                    c.setMaxAge(0);
                    c.setPath("/");
                    response.addCookie(c);
                }
            }
        }
    }
    /**
     * åˆ é™¤æ‰€æœ‰Cookie
     */
    public static void deleteCookies(HttpServletRequest request, HttpServletResponse response) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie c : cookies) {
                c.setMaxAge(0);
                c.setPath("/");
                response.addCookie(c);
            }
        }
    }
    /**
     * æ ¹æ®é”®èŽ·å–Cookie值
     */
    public static String getCookieByKey(String key, HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies == null || cookies.length == 0) {
            return null;
        }
        for (Cookie c : cookies) {
            if (key.equals(c.getName())) {
                return c.getValue();
            }
        }
        return null;
    }
    /**
     * èŽ·å–Token
     */
    public static String getToken(HttpServletRequest request) {
        // 1.从url参数中,获取token
        String token = request.getParameter(TOKEN_KEY);
        // 2.为空,则从header里获取
        if (token == null) {
            token = request.getHeader(TOKEN_KEY);
        }
        // 3.还为空,则从cookie里获取
        if (token == null) {
            token = getTokenFromCookie(request);
        }
        return token;
    }
    /**
     * èŽ·å–Request
     */
    public static HttpServletRequest getRequest() {
@@ -254,23 +133,6 @@
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return servletRequestAttributes.getResponse();
    }
    /**
     * èŽ·å–Session
     */
    public static HttpSession getSession() {
        return getRequest().getSession();
    }
    /**
     * èŽ·å–çœŸå®žè·¯å¾„
     */
    public static String getRealPath(String path) {
        HttpServletRequest req = getRequest();
        ServletContext ctx = req.getSession().getServletContext();
        return ctx.getRealPath("/" + path);
    }
    /**
@@ -349,8 +211,8 @@
     * @throws Exception å¼‚常
     */
    public static void download(String file, String fileName, boolean inline, HttpServletResponse res) throws Exception {
        if (StringHelper.isEmpty(fileName)) {
            fileName = StringHelper.YMDHMS2_FORMAT.format(new Date());
        if (isEmpty(fileName)) {
            fileName = YMDHMS.format(new Date());
        }
        fileName = URLEncoder.encode(fileName, "UTF-8").replace("+", "%20");
        String dispose = inline ? "inline" : "attachment";
@@ -361,8 +223,8 @@
        res.setCharacterEncoding("UTF-8");
        // é€šè¿‡response对象设置响应数据格式(如:"text/plain; charset=utf-8")
        String ext = FileHelper.getExtension(file);
        String mime = FileHelper.getMime(ext);
        String ext = getExtension(file);
        String mime = getMime(ext);
        res.setContentType(mime);
        // é€šè¿‡response对象,获取到输出流
@@ -384,75 +246,105 @@
    }
    /**
     * æ‰§è¡Œå‘½ä»¤
     *
     * @param cmd å‘½ä»¤
     * èŽ·å–æ–‡ä»¶æ‰©å±•å
     */
    public static void exec(String cmd) {
        try {
            Runtime.getRuntime().exec(cmd);
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
    public static String getExtension(String fileName) {
        if (isEmpty(fileName)) {
            return "";
        }
        int idx = fileName.lastIndexOf(POINT);
        if (idx == -1) {
            return "";
        }
        return fileName.substring(idx).toLowerCase();
    }
    /**
     * æ‰§è¡Œå‘½ä»¤
     *
     * @param cmd å‘½ä»¤
     * èŽ·å–å¤šç”¨é€”äº’è”ç½‘é‚®ä»¶æ‰©å±•ç±»åž‹
     */
    public static String exec2(String cmd) {
        try {
            StringBuilder sb = new StringBuilder();
            Process process = Runtime.getRuntime().exec(cmd);
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
            reader.close();
            return sb.toString();
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
            return null;
    public static String getMime(String ext) {
        switch (ext) {
            // å›¾ç‰‡
            case ".tif":
            case ".tiff":
                return "image/tiff";
            case ".img":
                return "application/x-img";
            case ".gif":
                return "image/gif";
            case ".jpg":
            case ".jpeg":
                return "image/jpeg";
            case ".png":
                return "image/png";
            // éŸ³/视频
            case ".mp3":
                return "audio/mp3";
            case ".mp4":
                return "video/mpeg4";
            case ".avi":
                return "video/avi";
            case ".mpg":
            case ".mpeg":
                return "video/mpg";
            case ".wav":
                return "audio/wav";
            case ".wma":
                return "audio/x-ms-wma";
            case ".swf":
                return "application/x-shockwave-flash";
            case ".wmv":
                return "video/x-ms-wmv";
            case ".rm":
                return "application/vnd.rn-realmedia";
            case ".rmvb":
                return "application/vnd.rn-realmedia-vbr";
            // ç½‘页
            case ".js":
                return "application/x-javascript";
            case ".css":
                return "text/css";
            case ".asp":
                return "text/asp";
            case ".mht":
                return "message/rfc822";
            case ".jsp":
            case ".htm":
            case ".html":
            case ".xhtml":
                return "text/html";
            case ".xml":
            case ".svg":
                return "text/xml";
            // æ–‡ä»¶
            case ".txt":
                return "text/plain";
            case ".dbf":
                return "application/x-dbf";
            case ".mdb":
                return "application/msaccess";
            case ".pdf":
                return "application/pdf";
            case ".ppt":
            case ".pptx":
                return "application/x-ppt";
            case ".doc":
            case ".docx":
                return "application/msword";
            case ".xls":
            case ".xlsx":
                return "application/vnd.ms-excel";
            case ".dgn":
                return "application/x-dgn";
            case ".dwg":
                return "application/x-dwg";
            case ".ext":
                return "application/x-msdownload";
            // é»˜è®¤
            default:
                return "application/octet-stream";
        }
    }
    /**
     * èŽ·å–è¯·æ±‚çš„å‚æ•°å€¼
     *
     * @param req è¯·æ±‚
     * @param key å‚数名
     * @return å‚数值
     */
    public static String getReqParamVal(HttpServletRequest req, String key) {
        Map<String, String[]> maps = req.getParameterMap();
        for (Map.Entry<String, String[]> entry : maps.entrySet()) {
            if (entry.getKey().equalsIgnoreCase(key)) {
                return null == entry.getValue() || 0 == entry.getValue().length ? null : entry.getValue()[0];
            }
        }
        return null;
    }
    /**
     * èŽ·å–è¯·æ±‚çš„å‚æ•°å€¼
     *
     * @param req è¯·æ±‚
     * @param key å‚数名
     * @return å‚数值
     */
    public static String[] getReqParamVals(HttpServletRequest req, String key) {
        Map<String, String[]> maps = req.getParameterMap();
        for (Map.Entry<String, String[]> entry : maps.entrySet()) {
            if (entry.getKey().equalsIgnoreCase(key)) {
                return entry.getValue();
            }
        }
        return null;
    }
}
src/main/java/com/se/simu/service/WaterService.java
@@ -1,7 +1,6 @@
package com.se.simu.service;
import com.se.simu.domain.LayerVo;
import com.se.simu.helper.GdalHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -29,23 +28,14 @@
    String dataPath;
    public LayerVo getLayer(String serviceName) {
        String file = "D:/simu/test/DEM_M.tif";
        GdalHelper.createPyramid(file);
        String file2 = "D:/simu/test/DOM_M.tif";
        GdalHelper.createPyramid(file2);
        LayerVo layer = GdalHelper.readDemExtent(file);
        if (null == layer) {
            return null;
        }
        LayerVo layer = new LayerVo();
        layer.setVer(ver);
        //layer.setDuration(new LayerVo.Duration(1719812810225L, 1719812810225L));
        //layer.setExtension(new LayerVo.Extension(2.11062743358, 0.53812160220, 2.11070827834, 0.53819799453, 1.151, 38.83));
        //layer.setTerrain(new LayerVo.Terrain(10000, 10000));
        layer.setDuration(new LayerVo.Duration(1719812810225L, 1719812810225L));
        layer.setExtension(new LayerVo.Extension(2.11062743358, 0.53812160220, 2.11070827834, 0.53819799453, 1.151, 38.83));
        layer.setTerrain(new LayerVo.Terrain(10000, 10000));
        //List<Long> data = new ArrayList<>(Arrays.asList(1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L));
        //layer.setWater(new LayerVo.Water(10000, 10000, data));
        List<Long> data = new ArrayList<>(Arrays.asList(1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L, 1719812812225L));
        layer.setWater(new LayerVo.Water(10000, 10000, data));
        return layer;
    }
src/main/resources/application-dev.yml
ÎļþÒÑɾ³ý
src/main/resources/application-prod.yml
ÎļþÒÑɾ³ý
src/main/resources/application.yml
@@ -1,26 +1,16 @@
server:
  tomcat:
    uri-encoding: UTF-8
    max-connections: 5000
    max-http-form-post-size: 50MB
    threads:
      max: 2000
  port: 8079
  servlet:
    context-path: /simuserver
    context-path: /
spring:
  mvc:
    pathmatch:
      # è§£å†³Knife4j运行报错
      matching-strategy: ant_path_matcher
  application:
    name: simuserver
    name: SimuServer
knife4j:
  # æ˜¯å¦å¼€å¯
  enabled: true
  # è¯·æ±‚前缀
  pathMapping:
  # æ˜¯å¦å¼€å¯å¢žå¼ºæ¨¡å¼
  enable: true
sys:
  ver: 0.1
  path:
    data: D:/simu/
src/test/java/com/se/simu/SimuApplicationTests.java
ÎļþÒÑɾ³ý