.gitignore | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/se/simu/SimuApplication.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/se/simu/config/InitConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/se/simu/config/Knife4jConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/se/simu/controller/WaterController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/se/simu/helper/FileHelper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/se/simu/helper/StringHelper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/se/simu/helper/WebHelper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/logback-spring.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/test/java/com/se/simu/SimuApplicationTests.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
.gitignore
@@ -1,15 +1,35 @@ *.class HELP.md target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ # Mobile Tools for Java (J2ME) .mtj.tmp/ ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache # Package Files # *.jar *.war *.ear ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* ### NetBeans ### /nbproject/private/ /nbbuild/ /dist/ /nbdist/ /.nb-gradle/ build/ !**/src/main/**/build/ !**/src/test/**/build/ ### VS Code ### .vscode/ /data /logs /.idea /target pom.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,133 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> </parent> <groupId>com.se</groupId> <artifactId>simu</artifactId> <version>1.0.0</version> <name>simuserver</name> <description>å æ¶ä»¿çæå¡</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <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> <!--gdal--> <dependency> <groupId>org.gdal</groupId> <artifactId>gdal</artifactId> <version>3.9.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> src/main/java/com/se/simu/SimuApplication.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.se.simu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}, scanBasePackages = {"com.se.simu"}) public class SimuApplication { public static void main(String[] args) { SpringApplication.run(SimuApplication.class, args); } } src/main/java/com/se/simu/config/InitConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,46 @@ package com.se.simu.config; import com.se.simu.helper.WebHelper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * åå§åé 置类 * * @author WWW * @date 2024-07-16 */ @Slf4j @Component public class InitConfig implements ApplicationRunner { @Resource Environment env; @Value("${server.port}") String serverPort; @Value("${server.servlet.context-path}") String contextPath; @Override public void run(ApplicationArguments args) { // noinspection AlibabaRemoveCommentedCode try { //GdalHelper.init(env.getProperty("sys.gdal_path")); log.info("***************** ç³»ç»å¯å¨å®æ¯ *****************" + "\n"); String path = null != contextPath && contextPath.length() > 1 ? contextPath : ""; log.info("APIææ¡£:http://localhost:" + serverPort + path + "/doc.html"); log.info("APIææ¡£:http://{}:{}{}/doc.html", WebHelper.getHostIp(), serverPort, path); } catch (Exception ex) { log.error(ex.getMessage(), ex); } } } src/main/java/com/se/simu/config/Knife4jConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,69 @@ package com.se.simu.config; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; /** * Knife4jé 置类 * * @author WWW * @date 2024-07-16 */ @Configuration @EnableKnife4j public class Knife4jConfig { @Value("${server.port}") String serverPort; @Value("${knife4j.enabled}") private boolean enabled; @Value("${knife4j.pathMapping}") private String pathMapping; @Value("${server.servlet.context-path}") String contextPath; @Bean public Docket createRestApi() { return new Docket(new DocumentationType("openApi", "3.0")) // æ¯å¦å¯ç¨Swagger .enable(enabled) // ç¨æ¥å建该APIçåºæ¬ä¿¡æ¯ï¼å±ç¤ºå¨ææ¡£ç页é¢ä¸ï¼èªå®ä¹å±ç¤ºçä¿¡æ¯ï¼ .apiInfo(apiInfo()) // åç»åç§° .groupName("æå¡") // 设置åªäºæ¥å£æ´é²ç»Swaggerå±ç¤º .select() // æ«æææææ³¨è§£çapiï¼ç¨è¿ç§æ¹å¼æ´çµæ´» .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) // æ«ææå®å ä¸çswagger注解 // .apis(RequestHandlerSelectors.basePackage("com.cn.project.tool.swagger")) // æ«æææ .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build() /* 设置å®å ¨æ¨¡å¼ï¼swaggerå¯ä»¥è®¾ç½®è®¿é®token */ // .securitySchemes(securitySchemes()) .pathMapping(pathMapping); } private ApiInfo apiInfo() { return new ApiInfoBuilder() //æè¿°åæ®µæ¯æMarkdownè¯æ³ .description("æ¥å£ææ¡£") .contact(new Contact("WuWeiwei", "http://127.0.0.1:" + serverPort + contextPath + "/doc.html", "252740454@qq.com")) .version("1.0.0") .title("å æ¶ä»¿ç渲ææå¡APIæ¥å£ææ¡£") .build(); } } src/main/java/com/se/simu/controller/WaterController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.se.simu.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * å æ¶æ§å¶å¨ * * @author WWW * @date 2024-07-16 */ @Api(tags = "å æ¶ç®¡ç") @RestController @RequestMapping("/waterlogging") public class WaterController { @ApiOperation(value = "è·åå½åæ¶é´") @GetMapping("/getTime") public Object getTime() { return System.currentTimeMillis(); } } src/main/java/com/se/simu/helper/FileHelper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,444 @@ package com.se.simu.helper; import com.twmacinta.util.MD5; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.text.DecimalFormat; import java.util.List; /** * æä»¶å¸®å©ç±» * * @author WWW * @date 2024-07-16 */ @Slf4j public class FileHelper { public final static String POINT = "."; public final static int I16 = 16; public static final double D1024 = 1024.0; public static final double D1050 = 1050.0; public final static int I1000000 = 1000000; public static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; /** * è·åæä»¶å */ public static String getFileName(String file) { int idx = file.lastIndexOf(File.separator); if (idx > -1) { return file.substring(idx + 1); } return ""; } /** * è·åæä»¶åç§° */ public static String getName(String file) { String fileName = getFileName(file); int idx = fileName.lastIndexOf("."); if (idx > -1) { return fileName.substring(0, idx); } return fileName; } /** * è·åæä»¶æ©å±å */ public static String getExtension(File file) { if (file == null) { return null; } String fileName = file.getName().toLowerCase(); int idx = fileName.indexOf(POINT); if (idx == -1) { return ""; } return fileName.substring(idx); } /** * è·åæä»¶æ©å±å */ public static String getExtension(String fileName) { if (StringHelper.isEmpty(fileName)) { return ""; } int idx = fileName.lastIndexOf(POINT); if (idx == -1) { return ""; } return fileName.substring(idx).toLowerCase(); } /** * è·åå¤ç¨éäºèç½é®ä»¶æ©å±ç±»å */ 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"; } } /** * åèå使¢ç® */ public static String formatByte(long byteNumber) { double kbNumber = byteNumber / D1024; if (kbNumber < D1024) { return new DecimalFormat("#.##KB").format(kbNumber); } double mbNumber = kbNumber / D1024; if (mbNumber < D1024) { return new DecimalFormat("#.##MB").format(mbNumber); } double gbNumber = mbNumber / D1024; if (gbNumber < D1024) { return new DecimalFormat("#.##GB").format(gbNumber); } double tbNumber = gbNumber / D1024; return new DecimalFormat("#.##TB").format(tbNumber); } /** * è·åå¹³æ¹ç±³ */ public static String getSquareMeter(double num) { if (num < I1000000) { return new DecimalFormat("#.##å¹³æ¹ç±³").format(num); } double knum = num / I1000000; return new DecimalFormat("#.##å¹³æ¹åç±³").format(knum); } /** * byte转MB */ public static double sizeToMb(long size) { if (size < D1050) { return 0.001; } String str = String.format("%.3f", size / D1024 / D1024); return Double.parseDouble(str); } /** * 3.è·åæä»¶MD5ç ï¼JDKï¼ */ public static String getMd5ByJdk(String filePath) throws IOException { FileInputStream fileStream = new FileInputStream(filePath); String md5 = DigestUtils.md5Hex(fileStream); fileStream.close(); return md5; } /** * 2.è·åå¿«é MD5 ç */ public static String getFastMd5(String filePath) throws IOException { String hash = MD5.asHex(MD5.getHash(new File(filePath))); MD5 md5 = new MD5(); md5.Update(hash, null); return md5.asHex(); } /** * å 餿件夹 * * @param dir æä»¶å¤¹ */ public static void deleteDir(String dir) { File file = new File(dir); deleteFiles(file); } /** * 级èå 餿件 * * @param file æä»¶ */ public static void deleteFiles(File file) { if (null == file || !file.exists()) { return; } if (file.isDirectory()) { File[] files = file.listFiles(); if (null != files && files.length > 0) { for (File f : files) { if (f.isDirectory()) { deleteFiles(f); } else { f.delete(); } } } } file.delete(); } /** * è·åç¸å¯¹è·¯å¾ * * @param file æä»¶ * @return ç¸å¯¹è·¯å¾ */ public static String getRelativePath(String file) { if (StringHelper.isEmpty(file)) { return null; } int idx = file.lastIndexOf(File.separator); int start = file.lastIndexOf(File.separator, idx - 1); return file.substring(start + 1); } /** * è·åè·¯å¾ * * @param file æä»¶ * @return æä»¶è·¯å¾ */ public static String getPath(String file) { if (StringHelper.isEmpty(file)) { return null; } int end = file.lastIndexOf(File.separator); return file.substring(0, end); } /** * 1.è·åæä»¶çMD5 */ @SuppressWarnings("unused") public static String getFileMd5(String filePath) { FileInputStream fis = null; try { MessageDigest md = MessageDigest.getInstance("MD5"); fis = new FileInputStream(new File(filePath)); FileChannel fChannel = fis.getChannel(); ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024); while (fChannel.read(buffer) != -1) { buffer.flip(); md.update(buffer); buffer.compact(); } byte[] b = md.digest(); return byteToHexString(b); } catch (Exception ex) { ex.printStackTrace(); return null; } finally { try { if (null != fis) { fis.close(); } } catch (IOException ex) { ex.printStackTrace(); } } } /** * åèç 转16è¿å¶ */ public static String byteToHexString(byte[] tmp) { // æ¯ä¸ªåèç¨ 16 è¿å¶è¡¨ç¤ºçè¯ï¼ä½¿ç¨ä¸¤ä¸ªåç¬¦ï¼ char[] str = new char[16 * 2]; // æä»¥è¡¨ç¤ºæ 16 è¿å¶éè¦ 32 个å符ï¼è¡¨ç¤ºè½¬æ¢ç»æä¸å¯¹åºçå符ä½ç½® int k = 0; // ä»ç¬¬ä¸ä¸ªåèå¼å§ï¼å¯¹ MD5 çæ¯ä¸ä¸ªåè for (int i = 0; i < I16; i++) { // è½¬æ¢æ 16 è¿å¶å符çè½¬æ¢ byte byte0 = tmp[i]; // ååèä¸é« 4 ä½çæ°åè½¬æ¢ str[k++] = HEX_DIGITS[byte0 >>> 4 & 0xf]; // >>> 为é»è¾å³ç§»ï¼å°ç¬¦å·ä½ä¸èµ·å³ç§»ï¼ ååèä¸ä½ 4 ä½çæ°åè½¬æ¢ str[k++] = HEX_DIGITS[byte0 & 0xf]; } // æ¢åçç»æè½¬æ¢ä¸ºå符串 return new String(str); } /** * è·åå符串çMD5ç */ public static String getStringMd5(String text) { StringBuilder builder = new StringBuilder(); try { MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] bytes = md5.digest(text.getBytes(StandardCharsets.UTF_8)); for (byte aByte : bytes) { builder.append(Integer.toHexString((0x000000FF & aByte) | 0xFFFFFF00).substring(6)); } } catch (Exception ex) { log.error(ex.getMessage(), ex); } return builder.toString(); } /** * æ ¹æ®è·¯å¾è·åæä»¶ */ public static void getFilesByPath(List<String> list, String path) { File file = new File(path); if (file.isDirectory()) { File[] files = file.listFiles(); if (null == files) { return; } for (File f : files) { if (f.isDirectory()) { getFilesByPath(list, f.getPath()); } else { list.add(f.getPath()); } } } else { list.add(file.getPath()); } } /** * å¤å¶æä»¶ * * @param src æºæä»¶ * @param dest ç®å½æä»¶ */ public static void copyFile(File src, File dest) throws IOException { InputStream is = null; OutputStream os = null; try { is = new FileInputStream(src); os = new FileOutputStream(dest); byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } } finally { os.close(); is.close(); } } } src/main/java/com/se/simu/helper/StringHelper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,253 @@ package com.se.simu.helper; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * å符串帮å©ç±» * * @author WWW * @date 2024-07-16 */ public class StringHelper { public final static String COMMA = ","; public final static String PWD_REG = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W!@#$%^&*`~()\\-_+=,.?;<>]+$)(?![a-z0-9]+$)(?![a-z\\W!@#$%^&*`~()\\-_+=,.?;<>]+$)(?![0-9\\W!@#$%^&*`~()\\-_+=,.?;<>]+$)[a-zA-Z0-9\\W!@#$%^&*`~()\\-_+=,.?;<>]{12,20}$"; /** * æ°åæ£å */ public static final Pattern NUMBER_PATTERN = Pattern.compile("-?\\d+(\\.\\d+)?"); /** * æ ¼å¼åå½åç³»ç»æ¥æ 1 */ public static final SimpleDateFormat YMD_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); /** * æ ¼å¼åå½åç³»ç»æ¥æ 2 */ public static final SimpleDateFormat YMDHMS_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * æ ¼å¼åå½åç³»ç»æ¥æ 3 */ public static final SimpleDateFormat YMD2_FORMAT = new SimpleDateFormat("yyyyMMdd"); /** * æ ¼å¼åå½åç³»ç»æ¥æ 4 */ public static final SimpleDateFormat YMDHMS2_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss"); /** * 夿å符串,æ¯å¦ä¸ºæ´æ° */ public static boolean isInteger(String str) { return str != null && str.matches("[0-9]+"); } /** * 夿å符串,æ¯å¦ä¸ºæµ®ç¹æ° */ public static boolean isNumeric(String str) { return str != null && str.matches("-?\\d+(\\.\\d+)?"); } /** * 夿å符串,æ¯å¦ä¸ºæµ®ç¹æ° */ public static boolean isNumeric2(String str) { return str != null && NUMBER_PATTERN.matcher(str).matches(); } /** * æ¥ææ£å */ public static Pattern datePattern = Pattern.compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/]((((0?[13578])|(1[02]))[\\-\\/]((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/]((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/]((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/]((((0?[13578])|(1[02]))[\\-\\/]((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/]((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/]((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$"); /** * SQLæ£å */ public static Pattern sqlPattern = Pattern.compile("|and|exec|execute|insert|select|delete|update|count|drop|\\*|%|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|;|or|-|\\+|,|like"); /** * åç¬¦ä¸²è½¬ä¸ºæ¥æ */ public static Date parseDate(String str) { try { return YMD_FORMAT.parse(str); } catch (Exception ex) { return null; } } /** * åç¬¦ä¸²è½¬ä¸ºæ¥ææ¶é´ */ public static Date parseTime(String str) { try { return YMDHMS_FORMAT.parse(str); } catch (Exception e) { return null; } } /** * 夿弿¯å¦ä¸ºæ¥ææ ¼å¼ */ public static boolean isDate(String strDate) { Matcher m = datePattern.matcher(strDate); return m.matches(); } /** * åç¬¦ä¸²ï¼æ¯å¦ä¸ºnull æ "" */ public static boolean isNull(String str) { return null == str || str.length() == 0; } /** * å符串,æ¯å¦ä¸ºç©ºnullåç©ºæ ¼ */ public static boolean isEmpty(String str) { return null == str || "".equals(str.trim()); } /** * è·å like å符串 */ public static String getLikeStr(String str) { return isEmpty(str) ? null : "%" + str.trim() + "%"; } /** * è·å like å符串 */ public static String getLikeUpperStr(String str) { return isEmpty(str) ? null : "%" + str.trim().toUpperCase() + "%"; } /** * è·å å³like å符串 */ public static String getRightLike(String str) { return isEmpty(str) ? null : str.trim() + "%"; } /** * è·åå¾å½¢çWKTå符串 */ public static String getGeomWkt(String wkt) { if (isEmpty(wkt)) { return "null"; } return String.format("ST_GeomFromText('%s')", wkt); } /** * é¦åæ¯å¤§å */ public static String firstCharToUpperCase(String str) { return str.substring(0, 1).toUpperCase() + str.substring(1); } /** * é¦åæ¯å°å */ public static String firstCharToLowerCase(String str) { return str.substring(0, 1).toLowerCase() + str.substring(1); } /** * 夿弿¯å¦åå¨SQLæ³¨å ¥ * * @param str å符串 * @return æ¯/å¦ */ public static boolean isSqlInjection(String str) { if (null == str) { return false; } Matcher m = sqlPattern.matcher(str); return m.matches(); } /** * æ ¡éªå¯ç æ¯/å¦åæ³ * * @param pwd å¯ç * @return æ¯/å¦ä¸ºæ æç */ public static boolean isPwdInvalid(String pwd) { return !Pattern.matches(PWD_REG, pwd); } /** * è·åGUID */ public static String getGuid() { return UUID.randomUUID().toString(); } /** * è·ååéå·®æ° */ public static long getMinuteDifference(Timestamp ts) { return (ts.getTime() - System.currentTimeMillis()) / 1000 / 60; } /** * è¿æ¥Listéå * * @param list list æ´æ°éå * @param join join è¿æ¥å符 * @param <T> æ³åç±» * @return å符串 */ public static <T> String join(List<T> list, String join) { if (null == list || list.isEmpty()) { return ""; } StringBuilder sb = new StringBuilder(); for (T t : list) { if (null != t) { sb.append(t.toString()).append(join); } } if (sb.length() > 0 && sb.lastIndexOf(join) == sb.length() - join.length()) { // å é¤ä»ç´¢å¼ start å¼å§å° end ä¹é´çå符ï¼å³ åå æ¬ åä¸å æ¬ã sb.delete(sb.length() - join.length(), sb.length()); } return sb.toString(); } /** * åç¬¦ä¸²è½¬æ´æ°éå */ public static List<Integer> strToIntegers(String str) { if (isEmpty(str)) { return null; } List<Integer> list = new ArrayList<>(); for (String s : str.split(COMMA)) { list.add(Integer.parseInt(s)); } return list; } } src/main/java/com/se/simu/helper/WebHelper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,424 @@ package com.se.simu.helper; import lombok.extern.slf4j.Slf4j; 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.util.*; /** * Web帮å©ç±» * * @author WWW * @date 2024-07-16 */ @Slf4j public class WebHelper { private final static String COMMA = ","; private final static String UNKNOWN = "unknown"; public final static String TOKEN_KEY = "token"; public final static String TOKEN_COOKIE_KEY = "token"; public final static int COOKIE_MAX_AGE = 4 * 60 * 60; /** * è·åGUID */ public static String getGuid() { return UUID.randomUUID().toString(); } /** * è·å主æºIP * @return */ public static String getHostIp() { try { return InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { // } return "127.0.0.1"; } /** * è·åç¨æ·IP */ public static String getIpAddress(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_FORWARDED"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_VIA"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getHeader("REMOTE_ADDR"); } if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } if (ip.contains(COMMA)) { return ip.split(",")[0]; } return ip; } /** * è·åå½åæ¶é´çTimestamp */ public static Timestamp getCurrentTimestamp() { return new Timestamp(System.currentTimeMillis()); } /** * è·åå½åæ¶é´æå®åéæ°åç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() { ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); return servletRequestAttributes.getRequest(); } /** * è·åResponse */ public static HttpServletResponse getResponse() { 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); } /** * è¾åºstrè³å端 */ public static boolean writeStr2Page(HttpServletResponse res, String str) { try { res.setContentType("application/json;charset=UTF-8"); res.setHeader("Cache-Control", "no-cache"); res.setHeader("Pragma", "No-cache"); res.setDateHeader("Expires", 0); PrintWriter out = res.getWriter(); out.print(str); out.flush(); out.close(); } catch (Exception ex) { log.error(ex.getMessage(), ex); } return false; } /** * è·åéæºæ´æ° */ public static int getRandomInt(int min, int max) { return new Random().nextInt(max) % (max - min + 1) + min; } /** * ä¸è½½æä»¶ */ public static void download(String file, String fileName, HttpServletResponse res) throws Exception { download(file, fileName, false, res); } /** * ä¸è½½æä»¶ * * @param file æä»¶ * @param fileName æä»¶å * @param res ååº * @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()); } fileName = URLEncoder.encode(fileName, "UTF-8").replace("+", "%20"); String dispose = inline ? "inline" : "attachment"; // 设置ååºå¤´ä¸æä»¶çä¸è½½æ¹å¼ä¸ºéä»¶æ¹å¼ï¼ä»¥å设置æä»¶å res.setHeader("Content-Disposition", dispose + "; filename*=UTF-8''" + fileName); // 设置ååºå¤´çç¼ç æ ¼å¼ä¸º UTF-8 res.setCharacterEncoding("UTF-8"); // éè¿response对象设置ååºæ°æ®æ ¼å¼(å¦ï¼"text/plain; charset=utf-8") String ext = FileHelper.getExtension(file); String mime = FileHelper.getMime(ext); res.setContentType(mime); // éè¿response对象ï¼è·åå°è¾åºæµ ServletOutputStream outputStream = res.getOutputStream(); // å®ä¹è¾å ¥æµï¼éè¿è¾å ¥æµè¯»åæä»¶å 容 FileInputStream fileInputStream = new FileInputStream(file); int len = 0; byte[] bytes = new byte[1024]; while ((len = fileInputStream.read(bytes)) != -1) { // éè¿è¾å ¥æµè¯»åæä»¶æ°æ®ï¼ç¶åéè¿ä¸è¿°çè¾åºæµååæµè§å¨ outputStream.write(bytes, 0, len); outputStream.flush(); } // å ³éèµæº fileInputStream.close(); outputStream.close(); } /** * æ§è¡å½ä»¤ * * @param cmd å½ä»¤ */ public static void exec(String cmd) { try { Runtime.getRuntime().exec(cmd); } catch (Exception ex) { log.error(ex.getMessage(), ex); } } /** * æ§è¡å½ä»¤ * * @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; } } /** * è·å请æ±çåæ°å¼ * * @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/resources/application.yml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ server: tomcat: uri-encoding: UTF-8 max-connections: 5000 max-http-form-post-size: 50MB threads: max: 2000 port: 8079 servlet: context-path: /simuserver spring: mvc: pathmatch: # è§£å³Knife4jè¿è¡æ¥é matching-strategy: ant_path_matcher application: name: simuserver knife4j: # æ¯å¦å¼å¯ enabled: true # 请æ±åç¼ pathMapping: # æ¯å¦å¼å¯å¢å¼ºæ¨¡å¼ enable: true src/main/resources/logback-spring.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,104 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- scan é ç½®æä»¶å¦æåçæ¹åï¼å°ä¼è¢«éæ°å è½½ scanPeriod æ£æµé´éæ¶é´--> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <contextName>LFServer</contextName> <!-- æä»¶åç§° --> <property name="log.name.info" value="info" /> <property name="log.name.error" value="error" /> <!-- info å°å --> <property name="log.path.info" value="logs/" /> <property name="log.file.info" value="logs/info.log" /> <!-- error,éè¯¯è·¯å¾ --> <property name="log.path.error" value="logs/" /> <property name="log.file.error" value="logs/error.log" /> <include resource="org/springframework/boot/logging/logback/base.xml"/> <!-- æ®éæ¥å¿ --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.file.info}</file> <!-- å¾ªç¯æ¿çï¼åºäºæ¶é´å建æ¥å¿æä»¶ --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- æ¥å¿å½å:å个æä»¶å¤§äº256MB æç §æ¶é´+èªå¢i çælogæä»¶ --> <fileNamePattern>${log.path.info}${log.name.info}-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>256MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!-- æå¤§ä¿åæ¶é´ï¼30天--> <maxHistory>30</maxHistory> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- æ¥å¿çº§å«è¿æ»¤å¨ --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- è¿æ»¤ççº§å« --> <level>INFO</level> <!-- å¹é æ¶çæä½ï¼æ¥æ¶ï¼è®°å½ï¼ --> <onMatch>ACCEPT</onMatch> <!-- ä¸å¹é æ¶çæä½ï¼æç»ï¼ä¸è®°å½ï¼ --> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- é误æ¥å¿ --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.file.error}</file> <!-- å¾ªç¯æ¿çï¼åºäºæ¶é´å建æ¥å¿æä»¶ --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- æ¥å¿å½å:å个æä»¶å¤§äº128MB æç §æ¶é´+èªå¢i çælogæä»¶ --> <fileNamePattern>${log.path.error}${log.name.error}-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>128MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!-- æå¤§ä¿åæ¶é´ï¼180天--> <maxHistory>180</maxHistory> </rollingPolicy> <append>true</append> <!-- æ¥å¿æ ¼å¼ --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- æ¥å¿çº§å«è¿æ»¤å¨ --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- è¿æ»¤ççº§å« --> <level>ERROR</level> <!-- å¹é æ¶çæä½ï¼æ¥æ¶ï¼è®°å½ï¼ --> <onMatch>ACCEPT</onMatch> <!-- ä¸å¹é æ¶çæä½ï¼æç»ï¼ä¸è®°å½ï¼ --> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- æ§å¶å° --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- æ¥å¿æ ¼å¼ --> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <!--æ¤æ¥å¿appenderæ¯ä¸ºå¼å使ç¨ï¼åªé ç½®æåºçº§å«ï¼æ§å¶å°è¾åºçæ¥å¿çº§å«æ¯å¤§äºæçäºæ¤çº§å«çæ¥å¿ä¿¡æ¯--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- åªæè¿ä¸ªæ¥å¿æéæè½çï¼sqlè¯å¥ --> <level>DEBUG</level> </filter> </appender> <!-- è¾åºsqlæ¥å¿:ERROR,INFO,DEBUG --> <logger name="com.apache.ibatis" level="INFO"/> <!-- additivity:æ¯å¦å¨ç¶(è¿é为rootèç¹)è¾åº, é»è®¤ true; --> <logger name="com.se.simu" level="INFO" additivity="true"> <appender-ref ref="INFO_FILE"/> <appender-ref ref="ERROR_FILE"/> </logger> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration> src/test/java/com/se/simu/SimuApplicationTests.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.se.simu; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; @SpringBootTest @TestPropertySource(properties = "spring.datasource.initialize=false") class SimuserverApplicationTests { @Test void contextLoads() { } }