From 315de42228f46679e3c54bec2ae9992bbbc82be4 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Tue, 4 Mar 2025 00:18:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=9F=BA=E6=9C=AC=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 84 +++++++++ .idea/.gitignore | 8 + .idea/compiler.xml | 14 ++ .idea/dataSources.xml | 17 ++ .idea/encodings.xml | 7 + .idea/jarRepositories.xml | 30 ++++ .idea/misc.xml | 14 ++ .idea/vcs.xml | 4 + pom.xml | 94 ++++++++++ .../server/ServerApplication.java | 34 ++++ .../server/api/ApiController.java | 31 ++++ .../lanyuanxiaoyao/server/api/ApiParser.java | 168 ++++++++++++++++++ src/main/resources/application.yml | 0 test.http | 14 ++ 14 files changed, 519 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/dataSources.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 pom.xml create mode 100644 src/main/java/com/lanyuanxiaoyao/server/ServerApplication.java create mode 100644 src/main/java/com/lanyuanxiaoyao/server/api/ApiController.java create mode 100644 src/main/java/com/lanyuanxiaoyao/server/api/ApiParser.java create mode 100644 src/main/resources/application.yml create mode 100644 test.http diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45a53ea --- /dev/null +++ b/.gitignore @@ -0,0 +1,84 @@ +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf +.idea/**/aws.xml +.idea/**/contentModel.xml +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml +.idea/**/gradle.xml +.idea/**/libraries +cmake-build-*/ +.idea/**/mongoSettings.xml +*.iws +out/ +.idea_modules/ +atlassian-ide-plugin.xml +.idea/replstate.xml +.idea/sonarlint/ +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties +.idea/httpRequests +.idea/caches/build_file_checksums.ser +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar +.project +.classpath +*~ +.fuse_hidden* +.directory +.Trash-* +.nfs* +.gradle +**/build/ +!src/**/build/ +gradle-app.setting +!gradle-wrapper.jar +!gradle-wrapper.properties +.gradletasknamecache +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db +*.stackdump +[Dd]esktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msix +*.msm +*.msp +*.lnk +.DS_Store +.AppleDouble +.LSOverride +Icon +._* +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..f8f502f --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..45b0fd7 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,17 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://192.168.100.140:3307/main?useSSL=false&allowPublicKeyRetrieval=true + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..88eac1e --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..463551f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..d843f34 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..0068521 --- /dev/null +++ b/pom.xml @@ -0,0 +1,94 @@ + + + 4.0.0 + + com.lanyuanxiaoyao + spring-boot-apijson-server + 1.0.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + 3.4.0 + 2024.0.0 + 5.8.32 + + + + + central + https://repo1.maven.org/maven2/ + + + jitpack.io + https://jitpack.io + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-configuration-processor + + + + cn.hutool + hutool-all + ${hutool.version} + + + + com.github.Tencent + APIJSON + 7.7.0 + + + + com.mysql + mysql-connector-j + + + org.projectlombok + lombok + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + + org.springframework.boot + spring-boot-build + ${spring-boot.version} + + + + + \ No newline at end of file diff --git a/src/main/java/com/lanyuanxiaoyao/server/ServerApplication.java b/src/main/java/com/lanyuanxiaoyao/server/ServerApplication.java new file mode 100644 index 0000000..75f542a --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/ServerApplication.java @@ -0,0 +1,34 @@ +package com.lanyuanxiaoyao.server; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author lanyuanxiaoyao + * @since 2025-03-03 + */ +@Slf4j +@SpringBootApplication +public class ServerApplication { + public static void main(String[] args) { + SpringApplication.run(ServerApplication.class, args); + } + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOriginPatterns("*") + .allowedMethods("*") + .allowCredentials(true) + .maxAge(3600); + } + }; + } +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/api/ApiController.java b/src/main/java/com/lanyuanxiaoyao/server/api/ApiController.java new file mode 100644 index 0000000..515eab8 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/api/ApiController.java @@ -0,0 +1,31 @@ +package com.lanyuanxiaoyao.server.api; + +import apijson.RequestMethod; +import apijson.StringUtil; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author lanyuanxiaoyao + * @since 2025-03-03 + */ +@Slf4j +@RestController +@RequestMapping("api") +public class ApiController { + private String parse(RequestMethod method, String request) { + return new ApiParser(method) + .setNeedVerify(false) + .parse(request); + } + + @RequestMapping("{method}") + public String crud(@PathVariable("method") String method, @RequestBody String request) { + return parse(RequestMethod.valueOf(StringUtil.toUpperCase(method)), request); + } +} diff --git a/src/main/java/com/lanyuanxiaoyao/server/api/ApiParser.java b/src/main/java/com/lanyuanxiaoyao/server/api/ApiParser.java new file mode 100644 index 0000000..e6f1636 --- /dev/null +++ b/src/main/java/com/lanyuanxiaoyao/server/api/ApiParser.java @@ -0,0 +1,168 @@ +package com.lanyuanxiaoyao.server.api; + +import apijson.NotNull; +import apijson.RequestMethod; +import apijson.orm.AbstractFunctionParser; +import apijson.orm.AbstractObjectParser; +import apijson.orm.AbstractParser; +import apijson.orm.AbstractSQLConfig; +import apijson.orm.AbstractSQLExecutor; +import apijson.orm.AbstractVerifier; +import apijson.orm.FunctionParser; +import apijson.orm.Join; +import apijson.orm.ObjectParser; +import apijson.orm.Parser; +import apijson.orm.SQLConfig; +import apijson.orm.SQLExecutor; +import apijson.orm.Verifier; +import com.alibaba.fastjson.JSONObject; +import java.util.List; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +/** + * @author lanyuanxiaoyao + * @since 2025-03-03 + */ +@SuppressWarnings("LombokGetterMayBeUsed") +@Slf4j +public class ApiParser extends AbstractParser { + @Getter + private FunctionParser functionParser; + + public ApiParser() { + super(); + } + + public ApiParser(RequestMethod method) { + super(method); + } + + @Override + public Object onFunctionParse(String key, String function, String parentPath, String currentName, JSONObject currentObject, boolean containRaw) throws Exception { + if (functionParser == null) { + functionParser = createFunctionParser(); + functionParser.setMethod(getMethod()); + functionParser.setTag(getTag()); + functionParser.setVersion(getVersion()); + functionParser.setRequest(requestObject); + } + functionParser.setKey(key); + functionParser.setParentPath(parentPath); + functionParser.setCurrentName(currentName); + functionParser.setCurrentObject(currentObject); + + return functionParser.invoke(function, currentObject, containRaw); + } + + @Override + public ObjectParser createObjectParser(JSONObject request, String parentPath, SQLConfig arrayConfig, boolean isSubquery, boolean isTable, boolean isArrayMainTable) throws Exception { + return new ApiObjectParser(request, parentPath, arrayConfig, isSubquery, isTable, isArrayMainTable).setParser(this); + } + + @Override + public Parser createParser() { + return new ApiParser(); + } + + @Override + public FunctionParser createFunctionParser() { + return new ApiFunctionParser(); + } + + @Override + public SQLConfig createSQLConfig() { + return new ApiSQLConfig(); + } + + @Override + public SQLExecutor createSQLExecutor() { + return new ApiSQLExecutor(); + } + + @Override + public Verifier createVerifier() { + return new ApiVerifier(); + } + + public static final class ApiVerifier extends AbstractVerifier { + @Override + public Parser createParser() { + return new ApiParser(); + } + } + + public static final class ApiSQLConfig extends AbstractSQLConfig { + static { + DEFAULT_DATABASE = DATABASE_MYSQL; + DEFAULT_SCHEMA = "main"; + + TABLE_KEY_MAP.put("HostAssets", "host_assets"); + } + + public ApiSQLConfig() { + super(RequestMethod.GET); + } + + public ApiSQLConfig(RequestMethod method) { + super(method); + } + + public ApiSQLConfig(RequestMethod method, String table) { + super(method, table); + } + + public static SQLConfig newSQLConfig(RequestMethod method, String table, String alias, com.alibaba.fastjson.JSONObject request, List joinList, boolean isProcedure) throws Exception { + return AbstractSQLConfig.newSQLConfig(method, table, alias, request, joinList, isProcedure, new SimpleCallback<>() { + @Override + public SQLConfig getSQLConfig(RequestMethod method, String database, String schema, String datasource, String table) { + return new ApiSQLConfig(method, table); + } + }); + } + + @Override + public String getDBVersion() { + return "8.4.4"; + } + + @Override + public String getDBUri() { + return "jdbc:mysql://192.168.100.140:3307/main?useSSL=false&allowPublicKeyRetrieval=true"; + } + + @Override + public String getDBAccount() { + return "test"; + } + + @Override + public String getDBPassword() { + return "test"; + } + } + + public static final class ApiFunctionParser extends AbstractFunctionParser { + } + + public static final class ApiSQLExecutor extends AbstractSQLExecutor { + static { + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + } catch (ClassNotFoundException e) { + log.error(e.getMessage(), e); + } + } + } + + public static final class ApiObjectParser extends AbstractObjectParser { + public ApiObjectParser(@NotNull JSONObject request, String parentPath, SQLConfig arrayConfig, boolean isSubquery, boolean isTable, boolean isArrayMainTable) throws Exception { + super(request, parentPath, arrayConfig, isSubquery, isTable, isArrayMainTable); + } + + @Override + public SQLConfig newSQLConfig(RequestMethod method, String table, String alias, JSONObject request, List joinList, boolean isProcedure) throws Exception { + return ApiSQLConfig.newSQLConfig(method, table, alias, request, joinList, isProcedure); + } + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..e69de29 diff --git a/test.http b/test.http new file mode 100644 index 0000000..048e19d --- /dev/null +++ b/test.http @@ -0,0 +1,14 @@ +### Query +POST http://localhost:8080/get +Content-Type: application/json +Accept: application/json + +{ + "results[]": { + "HostAssets": { + "manufacturer": "华为" + }, + "page": 0, + "count": 2 + } +}