From 4bc04b9088410d67960275c444e17dcb2c0c9d9c Mon Sep 17 00:00:00 2001 From: TommyLemon <1184482681@qq.com> Date: Wed, 6 Dec 2023 20:47:31 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E7=94=9F=E6=80=81=E6=96=B0=E5=A2=9E=20ap?= =?UTF-8?q?ijson-builder:=20=E7=AE=80=E5=8D=95=E5=8C=85=E8=A3=85=20APIJSON?= =?UTF-8?q?=EF=BC=8C=E7=9B=B8=E6=AF=94=E7=9B=B4=E6=8E=A5=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=20JSON=20=E6=9B=B4=E5=A5=BD=E8=AE=B0?= =?UTF-8?q?=EF=BC=8C=E6=84=9F=E8=B0=A2=20@yeli19950109=20=E7=9A=84?= =?UTF-8?q?=E8=B4=A1=E7=8C=AE~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 打开链接右上角点 ⭐Star 支持下吧~ https://github.com/yeli19950109/apijson-builder --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 76721b69..b037b1a3 100644 --- a/README.md +++ b/README.md @@ -680,7 +680,8 @@ Issue/问卷 一般解答顺序:贡献者 > 帮助他人的用户 > 提供任 [quick-boot](https://github.com/csx-bill/quick-boot) 基于 Spring Cloud 2022、Spring Boot 3、AMIS 和 APIJSON 的低代码系统。 [apijson-query-spring-boot-starter](https://gitee.com/mingbaobaba/apijson-query-spring-boot-starter) 一个快速构建 APIJSON 查询条件的插件 - + +[apijson-builder](https://github.com/yeli19950109/apijson-builder) 简单包装 APIJSON,相比直接构造查询 JSON 更好记,ts 编写,调整了一些参数和使用方式 感谢热心的作者们的贡献,点 ⭐Star 支持下他们吧~ From 886099fc07cf264076fe3bf39ed196b0625f489f Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Mon, 11 Dec 2023 00:07:22 +0800 Subject: [PATCH 02/12] =?UTF-8?q?SQLConfig=20=E5=86=85=E6=8A=8A=E6=89=80?= =?UTF-8?q?=E6=9C=89=20AbstractSQLConfig=20=E6=94=B9=E6=88=90=20SQLConfig?= =?UTF-8?q?=EF=BC=9B=E4=BC=98=E5=8C=96=20Verifier=20=E7=9A=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/apijson/orm/SQLConfig.java | 10 +++--- .../src/main/java/apijson/orm/Verifier.java | 35 ++++++++++++------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java index a453d9a8..680b8531 100755 --- a/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java +++ b/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java @@ -50,19 +50,19 @@ public interface SQLConfig { Parser getParser(); - AbstractSQLConfig setParser(Parser parser); + SQLConfig setParser(Parser parser); ObjectParser getObjectParser(); - AbstractSQLConfig setObjectParser(ObjectParser objectParser); + SQLConfig setObjectParser(ObjectParser objectParser); int getVersion(); - AbstractSQLConfig setVersion(int version); + SQLConfig setVersion(int version); String getTag(); - AbstractSQLConfig setTag(String tag); + SQLConfig setTag(String tag); boolean isMySQL(); boolean isPostgreSQL(); @@ -243,7 +243,7 @@ default int[] getDBVersionNums() { String getTablePath(); Map getKeyMap(); - AbstractSQLConfig setKeyMap(Map keyMap); + SQLConfig setKeyMap(Map keyMap); List getRaw(); SQLConfig setRaw(List raw); diff --git a/APIJSONORM/src/main/java/apijson/orm/Verifier.java b/APIJSONORM/src/main/java/apijson/orm/Verifier.java index 366adb07..a4ab7205 100755 --- a/APIJSONORM/src/main/java/apijson/orm/Verifier.java +++ b/APIJSONORM/src/main/java/apijson/orm/Verifier.java @@ -18,7 +18,6 @@ public interface Verifier { /**验证权限是否通过 * @param config - * @param visitor * @return * @throws Exception */ @@ -37,12 +36,10 @@ public interface Verifier { void verifyRole(SQLConfig config, String table, RequestMethod method, String role) throws Exception; /**登录校验 - * @param config * @throws Exception */ void verifyLogin() throws Exception; /**管理员角色校验 - * @param config * @throws Exception */ void verifyAdmin() throws Exception; @@ -67,24 +64,36 @@ public interface Verifier { void verifyRepeat(String table, String key, Object value, long exceptId) throws Exception; /**验证请求参数的数据和结构 - * @param table - * @param key - * @param value - * @param exceptId 不包含id + * @param method + * @param name + * @param target + * @param request + * @param maxUpdateCount + * @param globalDatabase + * @param globalSchema + * @param creator + * @return * @throws Exception */ JSONObject verifyRequest(RequestMethod method, String name, JSONObject target, JSONObject request, int maxUpdateCount, String globalDatabase, String globalSchema, SQLCreator creator) throws Exception; /**验证返回结果的数据和结构 - * @param table - * @param key - * @param value - * @param exceptId 不包含id + * @param method + * @param name + * @param target + * @param response + * @param database + * @param schema + * @param creator + * @param callback + * @return * @throws Exception */ - JSONObject verifyResponse(RequestMethod method, String name, JSONObject target, JSONObject response, - String database, String schema, SQLCreator creator, OnParseCallback callback) throws Exception; + JSONObject verifyResponse( + RequestMethod method, String name, JSONObject target, JSONObject response, + String database, String schema, SQLCreator creator, OnParseCallback callback + ) throws Exception; @NotNull From b57ece8b18bc282bd39666f0bcc9d96decb67571 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Mon, 11 Dec 2023 23:28:49 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=87=B3=206.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSONORM/pom.xml | 2 +- APIJSONORM/src/main/java/apijson/Log.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/APIJSONORM/pom.xml b/APIJSONORM/pom.xml index b29887e0..26ae3a8e 100644 --- a/APIJSONORM/pom.xml +++ b/APIJSONORM/pom.xml @@ -5,7 +5,7 @@ com.github.Tencent APIJSON - 6.2.0 + 6.3.0 jar APIJSONORM diff --git a/APIJSONORM/src/main/java/apijson/Log.java b/APIJSONORM/src/main/java/apijson/Log.java index a1fe3425..d51bb26e 100755 --- a/APIJSONORM/src/main/java/apijson/Log.java +++ b/APIJSONORM/src/main/java/apijson/Log.java @@ -14,7 +14,7 @@ public class Log { public static boolean DEBUG = true; - public static final String VERSION = "6.2.1"; + public static final String VERSION = "6.3.0"; public static final String KEY_SYSTEM_INFO_DIVIDER = "\n---|-----APIJSON SYSTEM INFO-----|---\n"; public static final String OS_NAME; From f1bbdf12d7efbe97da9126dd7cc6f49325efcba5 Mon Sep 17 00:00:00 2001 From: TommyLemon <1184482681@qq.com> Date: Tue, 19 Dec 2023 22:23:36 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E8=B4=A1=E7=8C=AE=E8=80=85=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=EF=BC=9A=E8=85=BE=E8=AE=AF=E5=B7=A5=E7=A8=8B=E5=B8=88?= =?UTF-8?q?=EF=BC=8C=E6=9B=BE=E5=9C=A8=E5=8D=8E=E4=B8=BA=E3=80=81=E6=81=92?= =?UTF-8?q?=E7=94=9F=E6=8B=85=E4=BB=BBC/C++=E5=BC=80=E5=8F=91=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B=E5=B8=88=EF=BC=8C=E5=9C=A8wps=E6=8B=85=E4=BB=BB?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=BB=8F=E7=90=86=EF=BC=8C=E5=9C=A8360?= =?UTF-8?q?=E6=8B=85=E4=BB=BB=E6=8A=80=E6=9C=AF=E4=B8=93=E5=AE=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://blog.csdn.net/caohao0591 --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ffcbf272..f9c33a7a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,7 +27,7 @@ - [gdjs2](https://github.com/gdjs2)(University of California, Riverside) - [Rkyzzy](https://github.com/Rkyzzy)(SUSTech, University of California, Berkeley) - [kxlv2000](https://github.com/kxlv2000)(SUSTech) -- [caohao-php](https://github.com/caohao-php)(腾讯工程师) +- [caohao-go](https://github.com/caohao-go)(腾讯工程师,曾在华为、恒生担任C/C++开发工程师,在wps担任项目经理,在360担任技术专家) - [Wscats](https://github.com/Wscats)(腾讯工程师、腾讯 AlloyTeam 成员、Tencent Creation Camp 成员、知名技术博主) - [jun0315](https://github.com/jun0315)(腾讯工程师) - [JieJo](https://github.com/JieJo) From f3dc785e120576299d8f36ca0a900e656dd02ee5 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Thu, 4 Jan 2024 00:03:09 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81=20No?= =?UTF-8?q?SQL=20=E6=95=B0=E6=8D=AE=E5=BA=93=20MongoDB=EF=BC=8C=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8D=87=E5=88=B0=206.4.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSONORM/pom.xml | 2 +- APIJSONORM/src/main/java/apijson/Log.java | 2 +- .../java/apijson/orm/AbstractSQLConfig.java | 20 ++++++++++++++++++- .../src/main/java/apijson/orm/SQLConfig.java | 10 +++++++--- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/APIJSONORM/pom.xml b/APIJSONORM/pom.xml index 26ae3a8e..7aa99c4e 100644 --- a/APIJSONORM/pom.xml +++ b/APIJSONORM/pom.xml @@ -5,7 +5,7 @@ com.github.Tencent APIJSON - 6.3.0 + 6.4.0 jar APIJSONORM diff --git a/APIJSONORM/src/main/java/apijson/Log.java b/APIJSONORM/src/main/java/apijson/Log.java index d51bb26e..bc127594 100755 --- a/APIJSONORM/src/main/java/apijson/Log.java +++ b/APIJSONORM/src/main/java/apijson/Log.java @@ -14,7 +14,7 @@ public class Log { public static boolean DEBUG = true; - public static final String VERSION = "6.3.0"; + public static final String VERSION = "6.4.0"; public static final String KEY_SYSTEM_INFO_DIVIDER = "\n---|-----APIJSON SYSTEM INFO-----|---\n"; public static final String OS_NAME; diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java index 0b8c8607..855e1226 100755 --- a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java +++ b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java @@ -198,6 +198,8 @@ public abstract class AbstractSQLConfig implements SQLConfig(); // 保证顺序,避免配置冲突等意外情况 @@ -1245,12 +1247,28 @@ public static boolean isRedis(String db) { return DATABASE_REDIS.equals(db); } + @Override + public boolean isMongoDB() { + return isMongoDB(getSQLDatabase()); + } + public static boolean isMongoDB(String db) { + return DATABASE_MONGODB.equals(db); + } + + @Override + public boolean isKafka() { + return isKafka(getSQLDatabase()); + } + public static boolean isKafka(String db) { + return DATABASE_KAFKA.equals(db); + } + @Override public boolean isMQ() { return isMQ(getSQLDatabase()); } public static boolean isMQ(String db) { - return DATABASE_MQ.equals(db); + return isKafka(db); } @Override diff --git a/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java index 680b8531..dcb6d497 100755 --- a/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java +++ b/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java @@ -36,8 +36,10 @@ public interface SQLConfig { String DATABASE_CASSANDRA = "CASSANDRA"; // https://cassandra.apache.org String DATABASE_INFLUXDB = "INFLUXDB"; // https://www.influxdata.com/products/influxdb-overview String DATABASE_TDENGINE = "TDENGINE"; // https://tdengine.com - String DATABASE_REDIS = "REDIS"; - String DATABASE_MQ = "MQ"; + String DATABASE_REDIS = "REDIS"; // https://redisql.com + String DATABASE_MONGODB = "MONGODB"; // https://www.mongodb.com/docs/atlas/data-federation/query/query-with-sql + String DATABASE_KAFKA = "KAFKA"; // https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONDemo-MultiDataSource-Kafka + String DATABASE_MQ = "MQ"; // String SCHEMA_INFORMATION = "information_schema"; //MySQL, PostgreSQL, SQL Server 都有的系统模式 String SCHEMA_SYS = "sys"; //SQL Server 系统模式 @@ -84,10 +86,12 @@ public interface SQLConfig { boolean isInfluxDB(); boolean isTDengine(); boolean isRedis(); + boolean isMongoDB(); + boolean isKafka(); boolean isMQ(); - //暂时只兼容以上几种 + // 暂时只兼容以上几种 // boolean isSQL(); // boolean isTSQL(); // boolean isPLSQL(); From 55064ee94cf81662e5b1940b0a086f23ac2e9b4b Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Thu, 4 Jan 2024 23:27:26 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81=20AI?= =?UTF-8?q?=20=E5=90=91=E9=87=8F=E6=95=B0=E6=8D=AE=E5=BA=93=20Milvus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/apijson/orm/AbstractSQLConfig.java | 37 +++++++++++++++---- .../src/main/java/apijson/orm/SQLConfig.java | 5 ++- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java index 855e1226..5527e09f 100755 --- a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java +++ b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java @@ -195,6 +195,7 @@ public abstract class AbstractSQLConfig implements SQLConfig parser = getParser(); + count = parser == null ? AbstractParser.MAX_QUERY_COUNT : parser.getMaxQueryCount(); + } + + int offset = getOffset(getPage(), count); + return " LIMIT " + offset + ", " + count; // 目前 moql-transx 的限制 + } + + if (count <= 0 || RequestMethod.isHeadMethod(getMethod(), true)) { // TODO HEAD 真的不需要 LIMIT ? return ""; } + return getLimitString( getPage() , getCount() diff --git a/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java index dcb6d497..7372630c 100755 --- a/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java +++ b/APIJSONORM/src/main/java/apijson/orm/SQLConfig.java @@ -34,6 +34,7 @@ public interface SQLConfig { String DATABASE_SNOWFLAKE = "SNOWFLAKE"; // https://www.snowflake.com String DATABASE_DATABRICKS = "DATABRICKS"; // https://www.databricks.com String DATABASE_CASSANDRA = "CASSANDRA"; // https://cassandra.apache.org + String DATABASE_MILVUS = "MILVUS"; // https://milvus.io String DATABASE_INFLUXDB = "INFLUXDB"; // https://www.influxdata.com/products/influxdb-overview String DATABASE_TDENGINE = "TDENGINE"; // https://tdengine.com String DATABASE_REDIS = "REDIS"; // https://redisql.com @@ -79,10 +80,11 @@ public interface SQLConfig { boolean isClickHouse(); boolean isHive(); boolean isPresto(); + boolean isTrino(); boolean isSnowflake(); boolean isDatabricks(); boolean isCassandra(); - boolean isTrino(); + boolean isMilvus(); boolean isInfluxDB(); boolean isTDengine(); boolean isRedis(); @@ -219,6 +221,7 @@ default int[] getDBVersionNums() { String getDatabase(); SQLConfig setDatabase(String database); + String getSQLSchema(); String getSchema(); SQLConfig setSchema(String schema); From 1636349a926ec007fd2fc16bf2f6e8470b8e34e4 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Sun, 7 Jan 2024 21:06:53 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20=20Snowflake,=20Databricks,=20Cassandra=20?= =?UTF-8?q?=E7=AD=89=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java index 5527e09f..17753553 100755 --- a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java +++ b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java @@ -198,8 +198,11 @@ public abstract class AbstractSQLConfig implements SQLConfig Date: Sun, 7 Jan 2024 21:25:35 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20Milvus,=20MongoDB,=20InfluxDB=20=E7=AD=89=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E6=94=AF=E6=8C=81=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b037b1a3..131c5644 100644 --- a/README.md +++ b/README.md @@ -24,17 +24,19 @@ This source code is licensed under the Apache License Version 2.0
- - - + - + + + + +

From 6e95be68f9a34b1370d7caabed21ae0b14147145 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Wed, 10 Jan 2024 21:33:48 +0800 Subject: [PATCH 09/12] =?UTF-8?q?SELECT=20column=20=E5=86=85=E5=8E=9F?= =?UTF-8?q?=E5=A7=8B=20SQL=20=E7=89=87=E6=AE=B5=E6=94=AF=E6=8C=81=20AS=20?= =?UTF-8?q?=E5=88=AB=E5=90=8D=20@raw:"@column",=20"@column":"(CASE=20WHEN?= =?UTF-8?q?=20length(`group`)=20>=200=20THEN=20`group`=20ELSE=20'=5F'=20EN?= =?UTF-8?q?D):name"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/apijson/orm/AbstractSQLConfig.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java index 17753553..271a2cbc 100755 --- a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java +++ b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java @@ -157,7 +157,7 @@ public abstract class AbstractSQLConfig implements SQLConfig\\|\\[\\]\\{\\} /\\.\\+\\-\\*\\^\\?\\(\\)\\$]+$"); - TABLE_KEY_MAP = new HashMap(); + TABLE_KEY_MAP = new HashMap<>(); TABLE_KEY_MAP.put(Table.class.getSimpleName(), Table.TABLE_NAME); TABLE_KEY_MAP.put(Column.class.getSimpleName(), Column.TABLE_NAME); TABLE_KEY_MAP.put(PgClass.class.getSimpleName(), PgClass.TABLE_NAME); @@ -1984,14 +1984,14 @@ public String getColumnString(boolean inSQLJoin) throws Exception { } // 简单点, 后台配置就带上 AS - // int index = expression.lastIndexOf(":"); - // String alias = expression.substring(index+1); - // boolean hasAlias = StringUtil.isName(alias); - // String pre = index > 0 && hasAlias ? expression.substring(0, index) : expression; - // if (RAW_MAP.containsValue(pre) || "".equals(RAW_MAP.get(pre))) { // newSQLConfig 提前处理好的 - // expression = pre + (hasAlias ? " AS " + alias : ""); - // continue; - // } + int index = expression.lastIndexOf(":"); + String alias = expression.substring(index+1); + boolean hasAlias = StringUtil.isName(alias); + String pre = index > 0 && hasAlias ? expression.substring(0, index) : expression; + if (RAW_MAP.containsValue(pre) || "".equals(RAW_MAP.get(pre))) { // newSQLConfig 提前处理好的 + keys[i] = pre + (hasAlias ? " AS " + alias : ""); + continue; + } } if (expression.length() > 100) { From 7c9ca1b2d538977c10bdfda6dceaa669b6d230bb Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Sat, 13 Jan 2024 17:05:12 +0800 Subject: [PATCH 10/12] =?UTF-8?q?Operation=20=E6=93=8D=E4=BD=9C=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E6=96=B0=E5=A2=9E=20IS=5FID=5FCONDITION=5FMUST?= =?UTF-8?q?=EF=BC=8C=E6=98=AF=E5=90=A6=E5=BC=BA=E5=88=B6=E8=A6=81=E6=B1=82?= =?UTF-8?q?=E5=BF=85=E9=A1=BB=E6=9C=89=20id/id{}/id{}@=20=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/apijson/RequestMethod.java | 16 ++++++++++++++++ .../main/java/apijson/orm/AbstractVerifier.java | 11 ++++++----- .../src/main/java/apijson/orm/Operation.java | 9 +++++++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/APIJSONORM/src/main/java/apijson/RequestMethod.java b/APIJSONORM/src/main/java/apijson/RequestMethod.java index 410775c1..875200b7 100755 --- a/APIJSONORM/src/main/java/apijson/RequestMethod.java +++ b/APIJSONORM/src/main/java/apijson/RequestMethod.java @@ -83,6 +83,14 @@ public static boolean isHeadMethod(RequestMethod method, boolean containPrivate) public static boolean isQueryMethod(RequestMethod method) { return isGetMethod(method, true) || isHeadMethod(method, true); } + + /**是否为更新(增删改)的请求方法 + * @param method + * @return 读操作(GET型或HEAD型) - false, 写操作(POST,PUT,DELETE) - true + */ + public static boolean isUpdateMethod(RequestMethod method) { + return ! isQueryMethod(method); + } /**是否为开放(不限制请求的结构或内容;明文,浏览器能直接访问及查看)的请求方法 * @param method @@ -92,6 +100,14 @@ public static boolean isPublicMethod(RequestMethod method) { return method == null || method == GET || method == HEAD; } + /**是否为私有(限制请求的结构或内容)的请求方法 + * @param method + * @return + */ + public static boolean isPrivateMethod(RequestMethod method) { + return ! isPublicMethod(method); + } + public static String getName(RequestMethod method) { return method == null ? GET.name() : method.name(); } diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractVerifier.java b/APIJSONORM/src/main/java/apijson/orm/AbstractVerifier.java index 79c1d119..b2eca8bc 100755 --- a/APIJSONORM/src/main/java/apijson/orm/AbstractVerifier.java +++ b/APIJSONORM/src/main/java/apijson/orm/AbstractVerifier.java @@ -80,7 +80,7 @@ public abstract class AbstractVerifier implements Verifier, IdCallback { private static final String TAG = "AbstractVerifier"; - /**为 PUT, DELETE 强制要求必须有 id/id{} 条件 + /**为 PUT, DELETE 强制要求必须有 id/id{}/id{}@ 条件 */ public static boolean IS_UPDATE_MUST_HAVE_ID_CONDITION = true; /**开启校验请求角色权限 @@ -700,8 +700,9 @@ public JSONObject onParseJSONObject(String key, JSONObject tobj, JSONObject robj throw new IllegalArgumentException(method + "请求," + name + "/" + key + " 不能传 " + finalIdKey + " !"); } } else { - if (RequestMethod.isQueryMethod(method) == false) { - verifyId(method.name(), name, key, robj, finalIdKey, maxUpdateCount, IS_UPDATE_MUST_HAVE_ID_CONDITION); + Boolean atLeastOne = tobj == null ? null : tobj.getBoolean(Operation.IS_ID_CONDITION_MUST.name()); + if (Boolean.TRUE.equals(atLeastOne) || RequestMethod.isUpdateMethod(method)) { + verifyId(method.name(), name, key, robj, finalIdKey, maxUpdateCount, atLeastOne != null ? atLeastOne : IS_UPDATE_MUST_HAVE_ID_CONDITION); String userIdKey = idCallback == null ? null : idCallback.getUserIdKey(db, sh, ds, key); String finalUserIdKey = StringUtil.isEmpty(userIdKey, false) ? apijson.JSONObject.KEY_USER_ID : userIdKey; @@ -746,7 +747,7 @@ private static void verifyId(@NotNull String method, @NotNull String name, @NotN Object id = robj.get(idKey); //如果必须传 id ,可在Request表中配置NECESSARY if (id != null && id instanceof Number == false && id instanceof String == false) { throw new IllegalArgumentException(method + "请求," + name + "/" + key - + " 里面的 " + idKey + ":value 中value的类型只能是 Long 或 String !"); + + " 里面的 " + idKey + ":value 中value的类型只能是 Long 或 String !"); } @@ -795,7 +796,7 @@ else if (o instanceof String) { } else { throw new IllegalArgumentException(method + "请求," + name + "/" + key - + " 里面的 " + idInKey + ":[] 中所有项的类型都只能是 Long 或 String !"); + + " 里面的 " + idInKey + ":[] 中所有项的类型都只能是 Long 或 String !"); } } } diff --git a/APIJSONORM/src/main/java/apijson/orm/Operation.java b/APIJSONORM/src/main/java/apijson/orm/Operation.java index 6a588a94..2976d09b 100755 --- a/APIJSONORM/src/main/java/apijson/orm/Operation.java +++ b/APIJSONORM/src/main/java/apijson/orm/Operation.java @@ -145,8 +145,13 @@ public enum Operation { /** * 允许批量增删改部分失败,结构是 * "Table[],key[],key:alias[]" - * 自动 ALLOW_PARTIAL_UPDATE_FAILED_TABLE_MAP.put + * 自动 ALLOW_PARTIAL_UPDATE_FAILED_TABLE_MAP.put,结构是 Boolean,例如 true */ - ALLOW_PARTIAL_UPDATE_FAIL; + ALLOW_PARTIAL_UPDATE_FAIL, + + /** + * 强制要求必须有 id/id{}/id{}@ 条件,结构是 Boolean,例如 true + */ + IS_ID_CONDITION_MUST; } From 5b9b34c7ebe8bfdc25f1ef2966c786d01f693447 Mon Sep 17 00:00:00 2001 From: TommyLemon Date: Sat, 13 Jan 2024 17:06:34 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=9F=90=E4=BA=9B?= =?UTF-8?q?=E6=83=85=E5=86=B5=E4=B8=8B=20@raw=20=E5=AF=B9=20@having:value?= =?UTF-8?q?=20=E4=B8=AD=20value=20=E4=B8=AD=E7=9A=84=E5=A4=96=E5=B1=82?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E4=B8=8D=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/apijson/orm/AbstractSQLConfig.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java index 271a2cbc..bfb3b1e1 100755 --- a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java +++ b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java @@ -2032,6 +2032,16 @@ public String parseSQLExpression(String key, String expression, boolean containR * @return */ public String parseSQLExpression(String key, String expression, boolean containRaw, boolean allowAlias, String example) { + if (containRaw) { + String s = RAW_MAP.get(expression); + if ("".equals(s)) { + return expression; + } + if (s != null) { + return s; + } + } + String quote = getQuote(); int start = expression.indexOf('('); if (start < 0) { From 7547cd2dec7255a920e5cd2d89e89f397f084bf7 Mon Sep 17 00:00:00 2001 From: TommyLemon <1184482681@qq.com> Date: Thu, 18 Jan 2024 21:39:04 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E7=99=BB=E8=AE=B0=E4=B8=8A=E6=B5=B7?= =?UTF-8?q?=E7=BF=8A=E4=B8=9E=E4=BA=92=E8=81=94=E7=BD=91=E7=A7=91=E6=8A=80?= =?UTF-8?q?=E6=9C=89=E9=99=90=E5=85=AC=E5=8F=B8=EF=BC=8C=E6=84=9F=E8=B0=A2?= =?UTF-8?q?=20@li-chaopeng-01=20=E7=9A=84=20Gitee=20PR#7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://gitee.com/Tencent/APIJSON/pulls/7 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 131c5644..fc9b199a 100644 --- a/README.md +++ b/README.md @@ -353,6 +353,7 @@ https://github.com/Tencent/APIJSON/issues/187 * [爱投斯智能技术(深圳)有限公司](http://www.aiotos.net) * [邻盛科技(武汉)有限公司](http://www.linksame.com) * [上海麦市信息科技有限公司](https://www.masscms.com) + * [上海翊丞互联网科技有限公司](http://www.renrencjl.com/home) ### 贡献者们 主项目 APIJSON 的贡献者们(6 个腾讯工程师、1 个微软工程师、1 个阿里云工程师、1 个字节跳动工程师、1 个网易工程师、1 个 Zoom 工程师、1 个圆通工程师、1 个知乎基础研发架构师、1 个智联招聘工程师、1 个美国加州大学学生、3 个 SUSTech 学生等):