diff --git a/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/pom.xml b/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/pom.xml index 6053ca80..b224f252 100755 --- a/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/pom.xml +++ b/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/pom.xml @@ -4,7 +4,7 @@ 4.0.0 apijson.boot - apijson-boot + apijson-boot-multi-datasource 5.1.0 diff --git a/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/boot/DemoController.java b/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/boot/DemoController.java index 12134bf2..895c3162 100644 --- a/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/boot/DemoController.java +++ b/APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/boot/DemoController.java @@ -228,12 +228,13 @@ public String delete(@RequestBody String request, HttpSession session) { // 以上接口对应的简版接口,格式为 {method}/{tag}?format=true&@explain=true.. <<<<<<<<<<<<<<<<<<<<<<<<< - - /**增删改查统一入口,这个一个方法可替代以下 7 个方法,牺牲一些路由解析性能来提升一点开发效率 - * @param request 只用String,避免encode后未decode + /**增删改查统一接口,这个一个接口可替代 7 个万能通用接口,牺牲一些路由解析性能来提升一点开发效率 + * @param method + * @param tag + * @param params + * @param request * @param session * @return - * @see {@link RequestMethod#DELETE} */ @PostMapping("crud/{method}/{tag}") // 直接 {method}/{tag} 或 apijson/{method}/{tag} 会和内置网页的路由有冲突 @Override diff --git a/APIJSON-Java-Server/APIJSONBoot/libs/apijson-column-1.2.0.jar b/APIJSON-Java-Server/APIJSONBoot/libs/apijson-column-1.2.2.jar similarity index 64% rename from APIJSON-Java-Server/APIJSONBoot/libs/apijson-column-1.2.0.jar rename to APIJSON-Java-Server/APIJSONBoot/libs/apijson-column-1.2.2.jar index 09fb1b5b..072102ff 100644 Binary files a/APIJSON-Java-Server/APIJSONBoot/libs/apijson-column-1.2.0.jar and b/APIJSON-Java-Server/APIJSONBoot/libs/apijson-column-1.2.2.jar differ diff --git a/APIJSON-Java-Server/APIJSONBoot/libs/apijson-framework-5.0.0.jar b/APIJSON-Java-Server/APIJSONBoot/libs/apijson-framework-5.0.0.jar deleted file mode 100644 index 11fcb90d..00000000 Binary files a/APIJSON-Java-Server/APIJSONBoot/libs/apijson-framework-5.0.0.jar and /dev/null differ diff --git a/APIJSON-Java-Server/APIJSONBoot/libs/apijson-framework-5.1.0.jar b/APIJSON-Java-Server/APIJSONBoot/libs/apijson-framework-5.1.0.jar new file mode 100644 index 00000000..c82bd678 Binary files /dev/null and b/APIJSON-Java-Server/APIJSONBoot/libs/apijson-framework-5.1.0.jar differ diff --git a/APIJSON-Java-Server/APIJSONBoot/libs/apijson-orm-5.0.0.jar b/APIJSON-Java-Server/APIJSONBoot/libs/apijson-orm-5.0.0.jar deleted file mode 100644 index 848d173b..00000000 Binary files a/APIJSON-Java-Server/APIJSONBoot/libs/apijson-orm-5.0.0.jar and /dev/null differ diff --git a/APIJSON-Java-Server/APIJSONBoot/libs/apijson-orm-5.1.0.jar b/APIJSON-Java-Server/APIJSONBoot/libs/apijson-orm-5.1.0.jar new file mode 100644 index 00000000..73a1fc97 Binary files /dev/null and b/APIJSON-Java-Server/APIJSONBoot/libs/apijson-orm-5.1.0.jar differ diff --git a/APIJSON-Java-Server/APIJSONBoot/libs/unitauto-2.6.4.jar b/APIJSON-Java-Server/APIJSONBoot/libs/unitauto-2.6.4.jar deleted file mode 100644 index 4bc8a8b3..00000000 Binary files a/APIJSON-Java-Server/APIJSONBoot/libs/unitauto-2.6.4.jar and /dev/null differ diff --git a/APIJSON-Java-Server/APIJSONBoot/libs/unitauto-2.7.2.jar b/APIJSON-Java-Server/APIJSONBoot/libs/unitauto-2.7.2.jar new file mode 100644 index 00000000..c654d2b1 Binary files /dev/null and b/APIJSON-Java-Server/APIJSONBoot/libs/unitauto-2.7.2.jar differ diff --git a/APIJSON-Java-Server/APIJSONBoot/libs/unitauto-jar-2.6.4.jar b/APIJSON-Java-Server/APIJSONBoot/libs/unitauto-jar-2.7.2.jar similarity index 92% rename from APIJSON-Java-Server/APIJSONBoot/libs/unitauto-jar-2.6.4.jar rename to APIJSON-Java-Server/APIJSONBoot/libs/unitauto-jar-2.7.2.jar index 0d06df99..16266533 100644 Binary files a/APIJSON-Java-Server/APIJSONBoot/libs/unitauto-jar-2.6.4.jar and b/APIJSON-Java-Server/APIJSONBoot/libs/unitauto-jar-2.7.2.jar differ diff --git a/APIJSON-Java-Server/APIJSONBoot/pom.xml b/APIJSON-Java-Server/APIJSONBoot/pom.xml index 5eece566..6899bbc3 100755 --- a/APIJSON-Java-Server/APIJSONBoot/pom.xml +++ b/APIJSON-Java-Server/APIJSONBoot/pom.xml @@ -5,7 +5,7 @@ apijson.boot apijson-boot - 5.0.0 + 5.1.0 APIJSONBoot @@ -32,17 +32,16 @@ 4.0.1 - + com.github.TommyLemon unitauto-java - 2.6.4 + 2.7.2 com.github.TommyLemon unitauto-jar - 2.6.4 + 2.7.2 io.github.classgraph @@ -56,17 +55,17 @@ com.github.Tencent APIJSON - 5.0.0 + 5.1.0 com.github.APIJSON apijson-framework - 5.0.0 + 5.1.0 com.github.APIJSON apijson-column - 1.2.0 + 1.2.2 diff --git a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/boot/DemoApplication.java b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/boot/DemoApplication.java index 6ba1a0e2..f6254b22 100755 --- a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/boot/DemoApplication.java +++ b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/boot/DemoApplication.java @@ -72,6 +72,23 @@ public class DemoApplication implements ApplicationContextAware, WebServerFactoryCustomizer { private static final String TAG = "DemoApplication"; + public static void main(String[] args) throws Exception { + SpringApplication.run(DemoApplication.class, args); + + // FIXME 不要开放给项目组后端之外的任何人使用 UnitAuto(强制登录鉴权)!!!如果不需要单元测试则移除相关代码或 unitauto.Log.DEBUG = false; + // 上线生产环境前改为 false,可不输出 APIJSONORM 的日志 以及 SQLException 的原始(敏感)信息 + unitauto.Log.DEBUG = Log.DEBUG = true; + APIJSONParser.IS_PRINT_BIG_LOG = true; + APIJSONApplication.init(); + } + + // SpringBoot 2.x 自定义端口方式 + @Override + public void customize(ConfigurableServletWebServerFactory server) { + server.setPort(8080); + } + + static { // APIJSON 配置 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @@ -81,7 +98,7 @@ public class DemoApplication implements ApplicationContextAware, WebServerFactor COMPILE_MAP.put("ID_CARD", StringUtil.PATTERN_ID_CARD); // 使用本项目的自定义处理类 - APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() { + APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() { @Override public Parser createParser() { @@ -242,21 +259,6 @@ public boolean apply(Object object, String name, Object value) { } - public static void main(String[] args) throws Exception { - SpringApplication.run(DemoApplication.class, args); - - // FIXME 不要开放给项目组后端之外的任何人使用 UnitAuto(强制登录鉴权)!!!如果不需要单元测试则移除相关代码或 unitauto.Log.DEBUG = false; - // 上线生产环境前改为 false,可不输出 APIJSONORM 的日志 以及 SQLException 的原始(敏感)信息 - unitauto.Log.DEBUG = Log.DEBUG = true; - APIJSONParser.IS_PRINT_BIG_LOG = true; - APIJSONApplication.init(); - } - - // SpringBoot 2.x 自定义端口方式 - @Override - public void customize(ConfigurableServletWebServerFactory server) { - server.setPort(8080); - } // 全局 ApplicationContext 实例,方便 getBean 拿到 Spring/SpringBoot 注入的类实例 private static ApplicationContext APPLICATION_CONTEXT; diff --git a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/boot/DemoController.java b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/boot/DemoController.java index 0862f631..e6d70aa2 100644 --- a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/boot/DemoController.java +++ b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/boot/DemoController.java @@ -101,7 +101,7 @@ @Service @RestController @RequestMapping("") -public class DemoController extends APIJSONController { +public class DemoController extends APIJSONController { private static final String TAG = "DemoController"; // 可以更方便地通过日志排查错误 @@ -109,8 +109,23 @@ public class DemoController extends APIJSONController { public String getRequestURL() { return httpServletRequest.getRequestURL().toString(); } + - //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + // 通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + /**增删改查统一入口,这个一个方法可替代以下 7 个方法,牺牲一些路由解析性能来提升一点开发效率 + * @param method + * @param tag + * @param params + * @param request + * @param session + * @return + */ + @PostMapping(value = "crud/{method}") // 直接 {method} 或 apijson/{method} 会和内置网页的路由有冲突 + @Override + public String crud(@PathVariable String method, @RequestBody String request, HttpSession session) { + return super.crud(method, request, session); + } /**获取 * @param request 只用String,避免encode后未decode @@ -196,8 +211,23 @@ public String delete(@RequestBody String request, HttpSession session) { return super.delete(request, session); } + // 通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - //以上接口对应的简版接口,格式为 {method}/{tag}?format=true&@explain=true.. <<<<<<<<<<<<<<<<<<<<<<<<< + // 以上接口对应的简版接口,格式为 {method}/{tag}?format=true&@explain=true.. <<<<<<<<<<<<<<<<<<<<<<<<< + + /**增删改查统一接口,这个一个接口可替代 7 个万能通用接口,牺牲一些路由解析性能来提升一点开发效率 + * @param method + * @param tag + * @param params + * @param request + * @param session + * @return + */ + @PostMapping("crud/{method}/{tag}") // 直接 {method}/{tag} 或 apijson/{method}/{tag} 会和内置网页的路由有冲突 + @Override + public String crudByTag(@PathVariable String method, @PathVariable String tag, @RequestParam Map params, @RequestBody String request, HttpSession session) { + return super.crudByTag(method, tag, params, request, session); + } /**获取 * @param request 只用String,避免encode后未decode @@ -283,7 +313,7 @@ public String deleteByTag(@PathVariable String tag, @RequestParam Map>>>>>>>>>>>>>>>>>>>>>>>> + // 以上接口对应的简版接口,格式为 {method}/{tag}?format=true&@explain=true.. >>>>>>>>>>>>>>>>>>>>>>>>> @@ -1231,6 +1261,7 @@ else if (APIJSON_DELEGATE_ID.toLowerCase().equals(name.toLowerCase())) { map.remove("$_type"); map.remove("$_except_headers"); map.remove("$_delegate_url"); + map.remove("$_delegate_id"); Set> set = map == null ? null : map.entrySet(); diff --git a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoFunctionParser.java b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoFunctionParser.java index f38fad9e..c2d75054 100644 --- a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoFunctionParser.java +++ b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoFunctionParser.java @@ -57,7 +57,9 @@ public Long getCurrentUserId(@NotNull JSONObject current) { } public List getCurrentUserIdAsList(@NotNull JSONObject current) { - return Arrays.asList(DemoVerifier.getVisitorId(getSession())); + List list = new ArrayList<>(1); + list.add(DemoVerifier.getVisitorId(getSession())); + return list; } public List getCurrentContactIdList(@NotNull JSONObject current) { @@ -235,17 +237,14 @@ public JSONArray getIdList(@NotNull JSONObject current) { * @return * @throws Exception */ - @Override public Object verifyAccess(@NotNull JSONObject current) throws Exception { long userId = current.getLongValue(JSONRequest.KEY_USER_ID); String role = current.getString(JSONRequest.KEY_ROLE); - if (AbstractVerifier.OWNER.equals(role) && userId != DemoVerifier.getVisitorId(getSession())) { + if (AbstractVerifier.OWNER.equals(role) && userId != (Long) DemoVerifier.getVisitorId(getSession())) { throw new IllegalAccessException("登录用户与角色OWNER不匹配!"); } return null; } - - } \ No newline at end of file diff --git a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoParser.java b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoParser.java index 17453989..08103166 100644 --- a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoParser.java +++ b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoParser.java @@ -26,7 +26,7 @@ * 具体见 https://github.com/Tencent/APIJSON/issues/38 * @author Lemon */ -public class DemoParser extends APIJSONParser { +public class DemoParser extends APIJSONParser { public DemoParser() { super(); diff --git a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java index 6e32a689..42e05562 100755 --- a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java +++ b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java @@ -65,10 +65,10 @@ public DemoSQLConfig(RequestMethod method, String table) { // TABLE_KEY_MAP.put(Privacy.class.getSimpleName(), "apijson_privacy"); //主键名映射 - SIMPLE_CALLBACK = new SimpleCallback() { + SIMPLE_CALLBACK = new SimpleCallback() { @Override - public AbstractSQLConfig getSQLConfig(RequestMethod method, String database, String schema, String table) { + public AbstractSQLConfig getSQLConfig(RequestMethod method, String database, String schema, String datasource, String table) { return new DemoSQLConfig(method, table); } @@ -81,13 +81,13 @@ public AbstractSQLConfig getSQLConfig(RequestMethod method, String database, Str // } @Override - public String getUserIdKey(String database, String schema,String datasource, String table) { + public String getUserIdKey(String database, String schema, String datasource, String table) { return USER_.equals(table) || PRIVACY_.equals(table) ? ID : USER_ID; // id / userId } //取消注释来实现数据库自增 id // @Override - // public Object newId(RequestMethod method, String database, String schema, String datasource, String table) { + // public Long newId(RequestMethod method, String database, String schema, String datasource, String table) { // return null; // return null 则不生成 id,一般用于数据库自增 id // } diff --git a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoVerifier.java b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoVerifier.java index 25493a6d..97b39129 100644 --- a/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoVerifier.java +++ b/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoVerifier.java @@ -21,7 +21,7 @@ * 具体见 https://github.com/Tencent/APIJSON/issues/12 * @author Lemon */ -public class DemoVerifier extends APIJSONVerifier { +public class DemoVerifier extends APIJSONVerifier { public static final String TAG = "DemoVerifier"; // 重写方法来自定义字段名等 diff --git a/APIJSON-Java-Server/APIJSONDemo-Druid/pom.xml b/APIJSON-Java-Server/APIJSONDemo-Druid/pom.xml index ad4a2c20..4841a50a 100755 --- a/APIJSON-Java-Server/APIJSONDemo-Druid/pom.xml +++ b/APIJSON-Java-Server/APIJSONDemo-Druid/pom.xml @@ -5,7 +5,7 @@ apijson.demo apijson-demo-druid - 5.0.0 + 5.1.0 jar APIJSONDemo-Druid @@ -22,7 +22,7 @@ com.github.APIJSON apijson-framework - LATEST + 5.1.0 @@ -83,6 +83,15 @@ + + + jitpack.io + https://jitpack.io + + true + + + spring-snapshots https://repo.spring.io/snapshot @@ -94,10 +103,6 @@ spring-milestones https://repo.spring.io/milestone - - jitpack.io - https://jitpack.io - diff --git a/APIJSON-Java-Server/APIJSONDemo-Druid/src/main/java/apijson/demo/DemoApplication.java b/APIJSON-Java-Server/APIJSONDemo-Druid/src/main/java/apijson/demo/DemoApplication.java index 8ddb8ad4..e0aa2908 100755 --- a/APIJSON-Java-Server/APIJSONDemo-Druid/src/main/java/apijson/demo/DemoApplication.java +++ b/APIJSON-Java-Server/APIJSONDemo-Druid/src/main/java/apijson/demo/DemoApplication.java @@ -32,7 +32,6 @@ import apijson.framework.APIJSONApplication; import apijson.framework.APIJSONCreator; import apijson.orm.SQLConfig; -import apijson.orm.SQLExecutor; /**Demo SpringBoot Application 主应用程序启动类 @@ -63,15 +62,11 @@ public void customize(ConfigurableServletWebServerFactory server) { static { // 使用本项目的自定义处理类 - APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() { + APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() { @Override public SQLConfig createSQLConfig() { return new DemoSQLConfig(); } - @Override - public SQLExecutor createSQLExecutor() { - return new DemoSQLExecutor(); - } }; // 把以下需要用到的数据库驱动取消注释即可,如果这里没有可以自己新增 diff --git a/APIJSON-Java-Server/APIJSONDemo-Druid/src/main/java/apijson/demo/DemoController.java b/APIJSON-Java-Server/APIJSONDemo-Druid/src/main/java/apijson/demo/DemoController.java index 1ba9ea1e..2e5f213a 100644 --- a/APIJSON-Java-Server/APIJSONDemo-Druid/src/main/java/apijson/demo/DemoController.java +++ b/APIJSON-Java-Server/APIJSONDemo-Druid/src/main/java/apijson/demo/DemoController.java @@ -46,25 +46,39 @@ */ @RestController @RequestMapping("") -public class DemoController extends APIJSONController { - +public class DemoController extends APIJSONController { + @Override public Parser newParser(HttpSession session, RequestMethod method) { return super.newParser(session, method).setNeedVerify(false); // TODO 这里关闭校验,方便新手快速测试,实际线上项目建议开启 } - - @PostMapping(value = "get") + + /**增删改查统一接口,这个一个接口可替代 7 个万能通用接口,牺牲一些路由解析性能来提升一点开发效率 + * @param method + * @param request + * @param session + * @return + */ + @PostMapping(value = "{method}") // 如果和其它的接口 URL 冲突,可以加前缀,例如改为 crud/{method} 或 Controller 注解 @RequestMapping("crud") @Override - public String get(@RequestBody String request, HttpSession session) { - return super.get(request, session); + public String crud(@PathVariable String method, @RequestBody String request, HttpSession session) { + return super.crud(method, request, session); } - - @PostMapping("get/{tag}") + + /**增删改查统一接口,这个一个接口可替代 7 个万能通用接口,牺牲一些路由解析性能来提升一点开发效率 + * @param method + * @param tag + * @param params + * @param request + * @param session + * @return + */ + @PostMapping("{method}/{tag}") // 如果和其它的接口 URL 冲突,可以加前缀,例如改为 crud/{method}/{tag} 或 Controller 注解 @RequestMapping("crud") @Override - public String getByTag(@PathVariable String tag, @RequestParam Map params, @RequestBody String request, HttpSession session) { - return super.getByTag(tag, params, request, session); + public String crudByTag(@PathVariable String method, @PathVariable String tag, @RequestParam Map params, @RequestBody String request, HttpSession session) { + return super.crudByTag(method, tag, params, request, session); } - + /**获取 * 只为兼容HTTP GET请求,推荐用HTTP POST,可删除 * @param request 只用String,避免encode后未decode @@ -81,5 +95,5 @@ public String openGet(@PathVariable String request, HttpSession session) { } return get(request, session); } - + } \ No newline at end of file diff --git a/APIJSON-Java-Server/APIJSONDemo-HikariCP/pom.xml b/APIJSON-Java-Server/APIJSONDemo-HikariCP/pom.xml index 87828223..5ab154e7 100755 --- a/APIJSON-Java-Server/APIJSONDemo-HikariCP/pom.xml +++ b/APIJSON-Java-Server/APIJSONDemo-HikariCP/pom.xml @@ -5,7 +5,7 @@ apijson.demo apijson-demo-hikaricp - 5.0.0 + 5.1.0 jar APIJSONDemo @@ -22,7 +22,7 @@ com.github.APIJSON apijson-framework - LATEST + 5.1.0 @@ -83,6 +83,15 @@ + + + jitpack.io + https://jitpack.io + + true + + + spring-snapshots https://repo.spring.io/snapshot @@ -94,10 +103,6 @@ spring-milestones https://repo.spring.io/milestone - - jitpack.io - https://jitpack.io - diff --git a/APIJSON-Java-Server/APIJSONDemo-HikariCP/src/main/java/apijson/demo/DemoApplication.java b/APIJSON-Java-Server/APIJSONDemo-HikariCP/src/main/java/apijson/demo/DemoApplication.java index 8ddb8ad4..e0aa2908 100755 --- a/APIJSON-Java-Server/APIJSONDemo-HikariCP/src/main/java/apijson/demo/DemoApplication.java +++ b/APIJSON-Java-Server/APIJSONDemo-HikariCP/src/main/java/apijson/demo/DemoApplication.java @@ -32,7 +32,6 @@ import apijson.framework.APIJSONApplication; import apijson.framework.APIJSONCreator; import apijson.orm.SQLConfig; -import apijson.orm.SQLExecutor; /**Demo SpringBoot Application 主应用程序启动类 @@ -63,15 +62,11 @@ public void customize(ConfigurableServletWebServerFactory server) { static { // 使用本项目的自定义处理类 - APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() { + APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() { @Override public SQLConfig createSQLConfig() { return new DemoSQLConfig(); } - @Override - public SQLExecutor createSQLExecutor() { - return new DemoSQLExecutor(); - } }; // 把以下需要用到的数据库驱动取消注释即可,如果这里没有可以自己新增 diff --git a/APIJSON-Java-Server/APIJSONDemo-HikariCP/src/main/java/apijson/demo/DemoController.java b/APIJSON-Java-Server/APIJSONDemo-HikariCP/src/main/java/apijson/demo/DemoController.java index 1ba9ea1e..2e5f213a 100644 --- a/APIJSON-Java-Server/APIJSONDemo-HikariCP/src/main/java/apijson/demo/DemoController.java +++ b/APIJSON-Java-Server/APIJSONDemo-HikariCP/src/main/java/apijson/demo/DemoController.java @@ -46,25 +46,39 @@ */ @RestController @RequestMapping("") -public class DemoController extends APIJSONController { - +public class DemoController extends APIJSONController { + @Override public Parser newParser(HttpSession session, RequestMethod method) { return super.newParser(session, method).setNeedVerify(false); // TODO 这里关闭校验,方便新手快速测试,实际线上项目建议开启 } - - @PostMapping(value = "get") + + /**增删改查统一接口,这个一个接口可替代 7 个万能通用接口,牺牲一些路由解析性能来提升一点开发效率 + * @param method + * @param request + * @param session + * @return + */ + @PostMapping(value = "{method}") // 如果和其它的接口 URL 冲突,可以加前缀,例如改为 crud/{method} 或 Controller 注解 @RequestMapping("crud") @Override - public String get(@RequestBody String request, HttpSession session) { - return super.get(request, session); + public String crud(@PathVariable String method, @RequestBody String request, HttpSession session) { + return super.crud(method, request, session); } - - @PostMapping("get/{tag}") + + /**增删改查统一接口,这个一个接口可替代 7 个万能通用接口,牺牲一些路由解析性能来提升一点开发效率 + * @param method + * @param tag + * @param params + * @param request + * @param session + * @return + */ + @PostMapping("{method}/{tag}") // 如果和其它的接口 URL 冲突,可以加前缀,例如改为 crud/{method}/{tag} 或 Controller 注解 @RequestMapping("crud") @Override - public String getByTag(@PathVariable String tag, @RequestParam Map params, @RequestBody String request, HttpSession session) { - return super.getByTag(tag, params, request, session); + public String crudByTag(@PathVariable String method, @PathVariable String tag, @RequestParam Map params, @RequestBody String request, HttpSession session) { + return super.crudByTag(method, tag, params, request, session); } - + /**获取 * 只为兼容HTTP GET请求,推荐用HTTP POST,可删除 * @param request 只用String,避免encode后未decode @@ -81,5 +95,5 @@ public String openGet(@PathVariable String request, HttpSession session) { } return get(request, session); } - + } \ No newline at end of file diff --git a/APIJSON-Java-Server/APIJSONDemo/pom.xml b/APIJSON-Java-Server/APIJSONDemo/pom.xml index 00841b37..4e425958 100755 --- a/APIJSON-Java-Server/APIJSONDemo/pom.xml +++ b/APIJSON-Java-Server/APIJSONDemo/pom.xml @@ -5,7 +5,7 @@ apijson.demo apijson-demo - 5.0.0 + 5.1.0 jar APIJSONDemo @@ -22,7 +22,7 @@ com.github.APIJSON apijson-framework - LATEST + 5.1.0 @@ -76,6 +76,15 @@ + + + jitpack.io + https://jitpack.io + + true + + + spring-snapshots https://repo.spring.io/snapshot @@ -87,10 +96,6 @@ spring-milestones https://repo.spring.io/milestone - - jitpack.io - https://jitpack.io - diff --git a/APIJSON-Java-Server/APIJSONDemo/src/main/java/apijson/demo/DemoApplication.java b/APIJSON-Java-Server/APIJSONDemo/src/main/java/apijson/demo/DemoApplication.java index fd0b2a4c..e0aa2908 100755 --- a/APIJSON-Java-Server/APIJSONDemo/src/main/java/apijson/demo/DemoApplication.java +++ b/APIJSON-Java-Server/APIJSONDemo/src/main/java/apijson/demo/DemoApplication.java @@ -62,7 +62,7 @@ public void customize(ConfigurableServletWebServerFactory server) { static { // 使用本项目的自定义处理类 - APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() { + APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() { @Override public SQLConfig createSQLConfig() { return new DemoSQLConfig(); diff --git a/APIJSON-Java-Server/APIJSONDemo/src/main/java/apijson/demo/DemoController.java b/APIJSON-Java-Server/APIJSONDemo/src/main/java/apijson/demo/DemoController.java index 6afc94ae..2e5f213a 100644 --- a/APIJSON-Java-Server/APIJSONDemo/src/main/java/apijson/demo/DemoController.java +++ b/APIJSON-Java-Server/APIJSONDemo/src/main/java/apijson/demo/DemoController.java @@ -46,30 +46,37 @@ */ @RestController @RequestMapping("") -public class DemoController extends APIJSONController { +public class DemoController extends APIJSONController { @Override public Parser newParser(HttpSession session, RequestMethod method) { return super.newParser(session, method).setNeedVerify(false); // TODO 这里关闭校验,方便新手快速测试,实际线上项目建议开启 } - - @PostMapping(value = "get") + + /**增删改查统一接口,这个一个接口可替代 7 个万能通用接口,牺牲一些路由解析性能来提升一点开发效率 + * @param method + * @param request + * @param session + * @return + */ + @PostMapping(value = "{method}") // 如果和其它的接口 URL 冲突,可以加前缀,例如改为 crud/{method} 或 Controller 注解 @RequestMapping("crud") @Override - public String get(@RequestBody String request, HttpSession session) { - return super.get(request, session); + public String crud(@PathVariable String method, @RequestBody String request, HttpSession session) { + return super.crud(method, request, session); } - - // @PostMapping(value = "{method}") // 如果和其它的接口 URL 冲突,可以加前缀,例如改为 apijson/{method} 或 Controller 注解 @RequestMapping("apijson") - // @Override - // public String crud(@PathVariable String method, @RequestBody String request, HttpSession session) { - // return super.crud(method, request, session); - // } - - @PostMapping("get/{tag}") + /**增删改查统一接口,这个一个接口可替代 7 个万能通用接口,牺牲一些路由解析性能来提升一点开发效率 + * @param method + * @param tag + * @param params + * @param request + * @param session + * @return + */ + @PostMapping("{method}/{tag}") // 如果和其它的接口 URL 冲突,可以加前缀,例如改为 crud/{method}/{tag} 或 Controller 注解 @RequestMapping("crud") @Override - public String getByTag(@PathVariable String tag, @RequestParam Map params, @RequestBody String request, HttpSession session) { - return super.getByTag(tag, params, request, session); + public String crudByTag(@PathVariable String method, @PathVariable String tag, @RequestParam Map params, @RequestBody String request, HttpSession session) { + return super.crudByTag(method, tag, params, request, session); } /**获取 diff --git a/APIJSON-Java-Server/APIJSONFinal/pom.xml b/APIJSON-Java-Server/APIJSONFinal/pom.xml index 7501e320..bb146db4 100755 --- a/APIJSON-Java-Server/APIJSONFinal/pom.xml +++ b/APIJSON-Java-Server/APIJSONFinal/pom.xml @@ -4,7 +4,7 @@ apijson.jfinal apijson-final jar - 5.0.0 + 5.1.0 Demo project for APIJSON Server based on JFinal http://maven.apache.org @@ -26,12 +26,12 @@ com.github.Tencent APIJSON - 5.0.0 + 5.1.0 com.github.APIJSON apijson-framework - 5.0.0 + 5.1.0 diff --git a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoFunctionParser.java b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoFunctionParser.java index 4de57d03..c2d75054 100644 --- a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoFunctionParser.java +++ b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoFunctionParser.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; import javax.servlet.http.HttpSession; @@ -30,6 +31,7 @@ import apijson.framework.APIJSONFunctionParser; import apijson.orm.AbstractVerifier; import apijson.orm.JSONRequest; +import apijson.orm.Visitor; /**可远程调用的函数类,用于自定义业务逻辑处理 @@ -45,6 +47,26 @@ public DemoFunctionParser() { public DemoFunctionParser(RequestMethod method, String tag, int version, JSONObject request, HttpSession session) { super(method, tag, version, request, session); } + + public Visitor getCurrentUser(@NotNull JSONObject current) { + return DemoVerifier.getVisitor(getSession()); + } + + public Long getCurrentUserId(@NotNull JSONObject current) { + return DemoVerifier.getVisitorId(getSession()); + } + + public List getCurrentUserIdAsList(@NotNull JSONObject current) { + List list = new ArrayList<>(1); + list.add(DemoVerifier.getVisitorId(getSession())); + return list; + } + + public List getCurrentContactIdList(@NotNull JSONObject current) { + Visitor user = getCurrentUser(current); + return user == null ? null : user.getContactIdList(); + } + /** * @param current @@ -52,24 +74,26 @@ public DemoFunctionParser(RequestMethod method, String tag, int version, JSONObj * @return * @throws Exception */ - public Object verifyIdList(@NotNull JSONObject current, @NotNull String idList) throws Exception { + public void verifyIdList(@NotNull JSONObject current, @NotNull String idList) throws Exception { Object obj = current.get(idList); if (obj == null) { - return null; + return; } if (obj instanceof Collection == false) { - throw new IllegalArgumentException(idList + " 不符合 Array 类型! 结构必须是 [] !"); + throw new IllegalArgumentException(idList + " 不符合 Array 数组类型! 结构必须是 [] !"); } - JSONArray array = (JSONArray) obj; - if (array != null) { - for (int i = 0; i < array.size(); i++) { - if (array.get(i) instanceof Long == false && array.get(i) instanceof Integer == false) { - throw new IllegalArgumentException(idList + " 内字符 " + array.getString(i) + " 不符合 Long 类型!"); + + Collection collection = (Collection) obj; + if (collection != null) { + int i = -1; + for (Object item : collection) { + i ++; + if (item instanceof Long == false && item instanceof Integer == false) { + throw new IllegalArgumentException(idList + "/" + i + ": " + item + " 不符合 Long 数字类型!"); } } } - return null; } @@ -79,24 +103,26 @@ public Object verifyIdList(@NotNull JSONObject current, @NotNull String idList) * @return * @throws Exception */ - public Object verifyURLList(@NotNull JSONObject current, @NotNull String urlList) throws Exception { + public void verifyURLList(@NotNull JSONObject current, @NotNull String urlList) throws Exception { Object obj = current.get(urlList); if (obj == null) { - return null; + return; } if (obj instanceof Collection == false) { - throw new IllegalArgumentException(urlList + " 不符合 Array 类型! 结构必须是 [] !"); + throw new IllegalArgumentException(urlList + " 不符合 Array 数组类型! 结构必须是 [] !"); } - JSONArray array = (JSONArray) obj; - if (array != null) { - for (int i = 0; i < array.size(); i++) { - if (StringUtil.isUrl(array.getString(i)) == false) { - throw new IllegalArgumentException(urlList + " 内字符 " + array.getString(i) + " 不符合 URL 格式!"); + + Collection collection = (Collection) obj; + if (collection != null) { + int i = -1; + for (Object item : collection) { + i ++; + if (item instanceof String == false || StringUtil.isUrl((String) item) == false) { + throw new IllegalArgumentException(urlList + "/" + i + ": " + item + " 不符合 URL 字符串格式!"); } } } - return null; } @@ -214,13 +240,11 @@ public JSONArray getIdList(@NotNull JSONObject current) { public Object verifyAccess(@NotNull JSONObject current) throws Exception { long userId = current.getLongValue(JSONRequest.KEY_USER_ID); String role = current.getString(JSONRequest.KEY_ROLE); - if (AbstractVerifier.OWNER.equals(role) && userId != DemoVerifier.getVisitorId(getSession())) { + if (AbstractVerifier.OWNER.equals(role) && userId != (Long) DemoVerifier.getVisitorId(getSession())) { throw new IllegalAccessException("登录用户与角色OWNER不匹配!"); } return null; } - - } \ No newline at end of file diff --git a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoParser.java b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoParser.java index 37ce9b17..0fbc9c81 100644 --- a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoParser.java +++ b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoParser.java @@ -22,22 +22,22 @@ * 具体见 https://github.com/Tencent/APIJSON/issues/38 * @author Lemon */ -public class DemoParser extends APIJSONParser { - - public DemoParser() { - super(); - } - public DemoParser(RequestMethod method) { - super(method); - } - public DemoParser(RequestMethod method, boolean needVerify) { - super(method, needVerify); - } - - // 可重写来设置最大查询数量 - // @Override - // public int getMaxQueryCount() { - // return 50; - // } +public class DemoParser extends APIJSONParser { + + public DemoParser() { + super(); + } + public DemoParser(RequestMethod method) { + super(method); + } + public DemoParser(RequestMethod method, boolean needVerify) { + super(method, needVerify); + } + + // 可重写来设置最大查询数量 + // @Override + // public int getMaxQueryCount() { + // return 50; + // } } diff --git a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoSQLConfig.java b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoSQLConfig.java index 3210dd07..965be8be 100755 --- a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoSQLConfig.java +++ b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoSQLConfig.java @@ -19,14 +19,18 @@ import static apijson.framework.APIJSONConstant.USER_; import static apijson.framework.APIJSONConstant.USER_ID; +import java.util.List; + import com.alibaba.fastjson.annotation.JSONField; import apijson.RequestMethod; import apijson.framework.APIJSONSQLConfig; import apijson.orm.AbstractSQLConfig; +import apijson.orm.Join; +import apijson.orm.Join.On; -/**SQL 配置,这里不配置数据库账号密码等信息,改为使用 DemoDataSourceConfig 来配置 +/**SQL配置 * TiDB 用法和 MySQL 一致 * 具体见详细的说明文档 C.开发说明 C-1-1.修改数据库链接 * https://github.com/Tencent/APIJSON/blob/master/%E8%AF%A6%E7%BB%86%E7%9A%84%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3.md#c-1-1%E4%BF%AE%E6%94%B9%E6%95%B0%E6%8D%AE%E5%BA%93%E9%93%BE%E6%8E%A5 @@ -56,10 +60,10 @@ public DemoSQLConfig(RequestMethod method, String table) { // TABLE_KEY_MAP.put(Privacy.class.getSimpleName(), "apijson_privacy"); //主键名映射 - SIMPLE_CALLBACK = new SimpleCallback() { + SIMPLE_CALLBACK = new SimpleCallback() { @Override - public AbstractSQLConfig getSQLConfig(RequestMethod method, String database, String schema, String table) { + public AbstractSQLConfig getSQLConfig(RequestMethod method, String database, String schema, String datasource, String table) { return new DemoSQLConfig(method, table); } @@ -78,7 +82,7 @@ public String getUserIdKey(String database, String schema, String datasource, St //取消注释来实现数据库自增 id // @Override - // public Object newId(RequestMethod method, String database, String schema, String datasource, String table) { + // public Long newId(RequestMethod method, String database, String schema, String datasource, String table) { // return null; // return null 则不生成 id,一般用于数据库自增 id // } @@ -98,6 +102,7 @@ public String getUserIdKey(String database, String schema, String datasource, St RAW_MAP.put("substring_index(substring_index(content,'.',1),'.',-1) AS subContent", ""); // APIAuto 不支持 ',可以用 Postman 测 RAW_MAP.put("commentWhereItem1","(`Comment`.`userId` = 38710 AND `Comment`.`momentId` = 470)"); RAW_MAP.put("to_days(now())-to_days(`date`)<=7",""); // 给 @having 使用 + RAW_MAP.put("sexShowStr","CASE sex WHEN 0 THEN '男' WHEN 1 THEN '女' ELSE '其它' END"); // 给 @having 使用 } @@ -238,7 +243,7 @@ public String getDBPassword() { // public String getKey(String key) { // return super.getKey(ColumnUtil.compatInputKey(key, getTable(), getMethod())); // } - + // 取消注释来兼容 Oracle DATETIME, TIMESTAMP 等日期时间类型的值来写库 // public Object getValue(@NotNull Object value) { // if (isOracle() && RequestMethod.isQueryMethod(getMethod()) == false && value instanceof String) { @@ -258,5 +263,19 @@ public String getDBPassword() { // } // return super.getValue(value); // } + + + @Override + protected void onGetCrossJoinString(Join j) throws UnsupportedOperationException { + // 开启 CROSS JOIN 笛卡尔积联表 super.onGetCrossJoinString(j); + } + @Override + protected void onJoinNotRelation(String sql, String quote, Join j, String jt, List onList, On on) { + // 开启 JOIN ON t1.c1 != t2.c2 等不等式关联 super.onJoinNotRelation(sql, quote, j, jt, onList, on); + } + @Override + protected void onJoinComplextRelation(String sql, String quote, Join j, String jt, List onList, On on) { + // 开启 JOIN ON t1.c1 LIKE concat('%', t2.c2, '%') 等复杂关联 super.onJoinComplextRelation(sql, quote, j, jt, onList, on); + } } diff --git a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoVerifier.java b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoVerifier.java index 25493a6d..621a8f07 100644 --- a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoVerifier.java +++ b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/demo/DemoVerifier.java @@ -16,12 +16,11 @@ import apijson.framework.APIJSONVerifier; - /**安全校验器,校验请求参数、角色与权限等 * 具体见 https://github.com/Tencent/APIJSON/issues/12 * @author Lemon */ -public class DemoVerifier extends APIJSONVerifier { +public class DemoVerifier extends APIJSONVerifier { public static final String TAG = "DemoVerifier"; // 重写方法来自定义字段名等 diff --git a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/jfinal/DemoAppConfig.java b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/jfinal/DemoAppConfig.java index 1f04c205..afa74fc2 100755 --- a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/jfinal/DemoAppConfig.java +++ b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/jfinal/DemoAppConfig.java @@ -72,7 +72,7 @@ public static void main(String[] args) throws Exception { COMPILE_MAP.put("ID_CARD", StringUtil.PATTERN_ID_CARD); // 使用本项目的自定义处理类 - APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() { + APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() { @Override public Parser createParser() { diff --git a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/jfinal/DemoController.java b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/jfinal/DemoController.java index d37a2002..aa026205 100755 --- a/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/jfinal/DemoController.java +++ b/APIJSON-Java-Server/APIJSONFinal/src/main/java/apijson/jfinal/DemoController.java @@ -89,25 +89,26 @@ public class DemoController extends Controller { private static final String TAG = "DemoController"; public Parser newParser(HttpSession session, RequestMethod method) { - Parser parser = APIJSONController.APIJSON_CREATOR.createParser(); + @SuppressWarnings("unchecked") + Parser parser = (Parser) APIJSONController.APIJSON_CREATOR.createParser(); parser.setMethod(method); if (parser instanceof APIJSONParser) { - ((APIJSONParser) parser).setSession(session); + ((APIJSONParser) parser).setSession(session); + } + // 可以更方便地通过日志排查错误 + if (parser instanceof AbstractParser) { + ((AbstractParser) parser).setRequestURL(getRequest().getRequestURL().toString()); } - // // 取消注释可以更方便地通过日志排查错误 - // if (parser instanceof AbstractParser) { - // ((AbstractParser) parser).setRequestURL(getRequest().getRequestURL().toString()); - // } return parser; } - + /**处理万能通用接口 * @param method * @see https://github.com/Tencent/APIJSON/blob/master/Document.md#3.1 */ public void parseAndResponse(RequestMethod method) { String tag = getPara(); - + if (StringUtil.isEmpty(tag, true) == false) { try { tag = URLDecoder.decode(tag, "UTF-8"); @@ -115,19 +116,19 @@ public void parseAndResponse(RequestMethod method) { e.printStackTrace(); } } - + if (StringUtil.isEmpty(tag, true)) { // /get, /gets, /head, /heads, /post, /put, /delete 等万能通用接口 renderJson(newParser(getSession(), method).parse(getRawData())); return; } - + // /get/User, /gets/Moment[], /put/Comment:[] 等简版接口,APIJSON 4.8.0+ 可用,对不兼容的低版本需要注释以下代码 JSONObject req = AbstractParser.wrapRequest(method, tag, JSON.parseObject(getRawData()), false); if (req == null) { req = new JSONObject(true); } - + Map paraMap = getParaMap(); Set> set = paraMap == null ? null : paraMap.entrySet(); if (set != null) { // 最外层的全局参数 @@ -137,11 +138,11 @@ public void parseAndResponse(RequestMethod method) { if (StringUtil.isEmpty(tag, false)) { continue; } - + req.put(entry.getKey(), value); } } - + renderJson(newParser(getSession(), method).parse(req)); } @@ -210,8 +211,8 @@ public void delete() { parseAndResponse(DELETE); } - - + + //通用接口,非事务型操作 和 简单事务型操作 都可通过这些接口自动化实现>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -275,8 +276,8 @@ public void reload() { phone = requestObject.getString(PHONE); verify = requestObject.getString(VERIFY); } catch (Exception e) { - renderJson(DemoParser.extendErrorResult(requestObject, e)); - return; + renderJson(DemoParser.extendErrorResult(requestObject, e)); + return; } JSONResponse response = new JSONResponse(headVerify(Verify.TYPE_RELOAD, phone, verify));