APIJSON/Roadmap.md

398 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<h1 align="center" style="text-align:center;">
APIJSON 规划及路线图
</h1>
### 新增功能
部分功能描述可在 [APIAuto](https://github.com/TommyLemon/APIAuto) 上查看 <br />
账号 13000002020 密码 123456 <br />
http://apijson.cn/api <br />
##### 基本原则
1.一定要有相关的应用场景,不能是伪需求,最好举例说明 <br />
2.能用 远程函数 或者 @raw 等现有功能很好地实现的,都不新增,避免冗余 <br />
3.不影响现有功能的使用,不能让现有功能不可用或者使用更复杂 <br />
#### 新增支持假删除
20230106 更新:已支持,感谢 @cloudAndMonkey 的贡献 <br />
https://github.com/Tencent/APIJSON/pull/493
一般对于互联网项目,数据非常重要,基本不会物理删除, <br />
只是用 is_deleted 等字段来标记已删除,然后 CRUD 时默认过滤已标记的记录。 <br />
这个功能非常必要,可以通过重写 SQLConfig.isFakeDelete() 来标记, <br />
然后如果 true则把 DELETE 改为 PUT 并且通过重写 <br />
SQLConfig.onFakeDelete(Map<String, Object> map) 来新增条件: <br />
GET: map.put("deleted", 0) <br />
PUT: map.put("deleted", 0) <br />
DELETE: map.put("deleted", 1) <br />
POST: 用不上,不处理 <br />
当然也可以再加一个删除时间 deletedTime 之类的。 <br />
<br />
还可以在 apijson-framework 层支持 Access 表新增字段 deletedKey, deletedValue, notDeletedValue <br />
然后读表自动配置是否为假删除 StringUtil.isNotEmpty(deletedKey, true) ,是假删除时 put 相应键值对。 <br />
#### 新增支持 @having&
20220328 更新5.0.0 已支持 <br />
https://github.com/Tencent/APIJSON/releases/tag/5.0.0
来实现内部条件 AND 连接,原来的 @having 由 AND 连接变为 OR 连接,保持 横或纵与 的统一规则。<br />
@having! 必须性不大,可通过反转内部条件来实现,但如果实现简单、且不影响原来的功能,则可以顺便加上。<br />
#### 新增支持 @column!
20210415 更新:已提供字段插件 [apijson-column](https://github.com/APIJSON/apijson-column),支持 字段名映射 和 !key 反选字段。
这个只在 [apijson-framework](https://github.com/APIJSON/apijson-framework) 支持,需要配置每个接口版本、每张表所拥有的全部字段,然后排除掉 @column! 的。<br />
可新增一个 VersionedColumn 表记录来代替 HashMap 代码配置。<br />
需要注意的是,可能前端传参里既有 @column 又有 @column! ,碰到这种情况:<br />
如果没有重合字段就忽略 @column! ,只让 @column 生效;<br />
如果有有重合字段,则抛异常,转为错误码和错误信息返回。<br />
#### 新增支持 TSQL 的 @explain
20220809 更新:已支持 Oracle 的 EXPLAIN感谢 @ifooling 的贡献 <br />
https://github.com/Tencent/APIJSON/pull/434
目前 APIJSON 支持 [Oracle](https://github.com/APIJSON/APIJSON-Demo/tree/master/Oracle), [SQL Server](https://github.com/APIJSON/APIJSON-Demo/tree/master/SQLServer), DB2 这 3 种 TSQL 数据库。<br />
但是 "@explain": true 使用的是 SET STATISTICS PROFILE ON(具体见 [AbstractSQLConfig](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java) 和 [AbstrctSQLExecutor](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstrctSQLExecutor.java)) <br />
执行后居然是 SELECT 查到的放在默认的 ResultSet性能分析放在 moreResult<br />
因为这个问题目前以上两个数据库的性能分析 @explain 实际并不可用,需要改用其它方式或解决现有方式的 bug。<br />
#### 新增支持 page 从 1 开始
目前只能从 0 开始,实际使用 1 更广泛,而且这方面用户习惯很强,支持它成本也不高。 <br />
[Parser](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/Parser.java) 新增 DEFAULT_QUERY_PAGE 和 getDefaultQueryPage <br />
与 DEFAULT_QUERY_COUNT 和 getDefaultQueryCount 统一, <br />
方便前端直接用页码的值传参,以及 info.page 的值来渲染页码。 <br />
建议在 [AbstractParser](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractParser.java)[AbstractSQLConfig](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java) 用到 page 的地方判断 getDefaultQueryPage做兼容处理。 <br />
#### 新增支持分布式
"@url": "http://apijson.cn:8080/get"
```js
{
"User": {
"@url": "http://apijson.cn:8080/get" //转发给其它服务器执行
},
"[]": {
"Comment": {
"userId@": "User/id"
}
},
"@explain": true
}
```
考虑到引用赋值的依赖关系要保持先后顺序,必须同步阻塞处理。<br />
或许可以加一个 ~ 前缀表示异步?例如 "@url": "\~http://apijson.cn:8080/get",由调用方保证没有被下方对象依赖。<br />
#### 新增支持 Union
虽然可以通过 INNER JOIN + 条件 OR 连接来替代它的功能,但没法达到它能用索引的性能。<br />
支持 UNION 很有必要,但 UNION ALL 几乎没有需求,如果实现简单、且不影响原来的功能,则可以顺便加上。 <br />
"@union": Integer // 0 - 不使用1 - UNION2 - UNION ALL
```js
{
"[]": {
"User": {
"name~": "a",
"tag~": "a",
"@combine": "name~,tag~",
"@union": 1 //将 @combine 中的 N 个 OR 连接字段用 UNION 替换,原本一条 SQL 需要拆分成 N 条 SQL 来 UNION
}
},
"@explain": true
}
```
生成的 SQL
```sql
SELECT * FROM `sys`.`apijson_user` WHERE ( (`name` REGEXP BINARY 'a') OR (`tag` REGEXP BINARY 'a') ) LIMIT 10 OFFSET 0
```
需要变为
```sql
SELECT * FROM `sys`.`apijson_user` WHERE ( (`name` REGEXP BINARY 'a') )
UNION
SELECT * FROM `sys`.`apijson_user` WHERE ( (`tag` REGEXP BINARY 'a') )
LIMIT 10 OFFSET 0
```
#### 新增支持 With
20221126 更新:已支持,感谢 @cloudAndMonkey 的贡献 <br />
https://github.com/Tencent/APIJSON/pull/481
可以减少子查询执行次数,提高性能。
```js
{ //看看关注的人最近有什么动态(分享、评论)
"sql@": {
"with": true, //生成 WITH(SELECT id ...) AS `sql`
"from": "User",
"User": {
"@column": "id",
"@role": "CONTACT"
}
},
"Moment[]": {
"Moment": {
"userId{}@": "sql",
"@order": "date-"
}
},
"Comment[]": {
"Comment": {
"userId{}@": "sql",
"@order": "date-"
}
},
"@explain": true
}
```
生成的 SQL
```sql
SELECT * FROM `sys`.`Moment` WHERE ( (`userId` IN (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
```
```sql
SELECT * FROM `sys`.`Moment` WHERE ( (`userId` IN (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
```
需要变为
```sql
WITH (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) AS `sql`
SELECT * FROM `sys`.`Moment` WHERE ( (`userId` IN `sql` ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
```
```sql
WITH (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) AS `sql`
SELECT * FROM `sys`.`Comment` WHERE ( (`userId` IN `sql` ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
```
#### 新增支持 Case
【更新:不用实现了,直接按 SQL 的语法写 CASE WHEN然后用 @raw
实现远程函数也不方便的 SQL 内字段转换 CASE WHEN THEN <br />
暂时还没有想好如何设计。如果是 SQL 原来的写法,则有点繁琐。<br />
#### 新增支持 id 与其它字段同时作为增删改条件
AbstractVerifier.IS_UPDATE_MUST_HAVE_ID_CONDITION = false <br />
就同时支持 id、其它条件删除 <br />
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractVerifier.java#L84-L86
但因为 Operation 没有 AT_LEAST_ONE/ANY_ONE 这样的操作, <br />
所以如果只配置一条规则,只能允许 MUST 配置传一种条件,不能单独传 id/其它字段。 <br />
<br />
如果都传了,因为 id 强制作为 AND 条件,所以不能和其它条件 OR <br />
可以配置两条不同规则,用不同的 tag 对应使用不同的条件。 <br />
<br />
method: DELETE <br />
通过 id 删除
```
tag: Comment-by-id // 当然写成 Comment:id 等其它任何不符合表名格式的名称都可
structure: ... "MUST":"id" ...
```
<br />
通过 date 条件删除
```
tag: Comment-by-date
structure: ... "MUST":"date" ...
```
<br />
如果想只配置一条规则,则 Operation 加上 AT_LEAST_ONE/ANY_ONE ,然后配置
```
tag: Comment
structure: ... "AT_LEAST_ONE":"id,date" ... // 至少传其中一个
```
```
tag: Comment
structure: ... "ANY_ONE":"id,date" ... // 必须传其中一个,不能同时传 2 个以上
```
<br />
AT_LEAST_ONE/ANY_ONE 其中一个也可以通过扩展 MUST 来实现(目前看这种方式更好) <br />
"MUST":"id | date,其它" 通过 | 或来表示其中任何一个,注意左右一定要各有一个空格,因为可能有 "name|$" "id|{}" 等包含 "|" 的 key <br />
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/Operation.java
<br />
还可以设置更复杂的表达方式
```
"MUST":"1:id | date,其它" // id, date 必须传其中一个,且不能多传 <br />
"MUST":">=2:id | momentId|{} | date>=,其它" // id, momentId|{}, date>= 必须至少其中 2 个
"MUST":"2+:id | momentId|{} | date>=,其它" // id, momentId|{}, date>= 必须至少其中 2 个,替代 >= 2更方便解析并且不用考虑 >1, != 2 等其它各种不等式
"MUST":"2-:id | momentId|{} | date>=,其它" // id, momentId|{}, date>= 最多传其中 2 个,替代 <= 2
```
<br />
这样的话就不用加 Operation 了,不过 AbstractVerifier 仍然要处理下 REFUSE 和 MUST 的互斥关系 <br />
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractVerifier.java#L1012-L1042
<img width="1117" alt="image" src="https://user-images.githubusercontent.com/5738175/211016885-9e752b6c-94e5-46c0-b87d-a7be68387a9f.png">
##### 需求来源及具体讨论
https://github.com/Tencent/APIJSON/pull/493#issuecomment-1373376359
#### ... //欢迎补充
### 强化安全
APIJSON 提供了各种安全机制,可在目前的基础上新增或改进。
20220504 更新:新增插件 apijson-router可控地对公网暴露类 RESTful 简单接口,内部转成 APIJSON 格式请求来执行。 <br />
https://github.com/APIJSON/apijson-router
#### 防越权操作
目前有 RBAC 自动化权限管理。<br />
APIJSONORM 提供 [@MethodAccess](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/MethodAccess.java) 注解来配置 <br />
[apijson-framework](https://github.com/APIJSON/apijson-framework) 则使用 [Access 表](https://github.com/APIJSON/APIJSON-Demo/blob/master/MySQL/single/sys_Access.sql) 记录来配置 <br />
在 [AbstractVerifier](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractVerifier.java) 中,假定真实、强制匹配。 <br />
#### 防 SQL 注入
目前有 预编译 + 白名单 校验机制。具体见 [AbstractSQLExecutor](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java) 和 [AbstractSQLConfig](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java) 。 <br />
#### 防恶意请求
目前有限流机制getMaxQueryCount, getMaxUpdateCount, getMaxObjectCount, getMaxSQLCount, getMaxQueryDepth 等。 <br />
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/Parser.java <br />
#### ... //欢迎补充
### 提高性能
20200205 更新:最近的及次大幅提升性能相关优化及 Release <br />
[新增支持 ClickHouse、窗口函数 OVER、反引号 `key`、单引号 'value';大幅提升单表数组查询性能](https://github.com/Tencent/APIJSON/releases/tag/4.8.0) <br />
[4.6.0【性能】大幅提升数组内主表查询性能](https://github.com/Tencent/APIJSON/releases/tag/4.6.0) <br />
[4.4.5【性能】大幅提升增删改的性能](https://github.com/Tencent/APIJSON/releases/tag/4.4.5) <br />
#### 解析 JSON
优化 [AbstractParser](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractParser.java) 和 [AbstractObjectParser](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractObjectParser.java) 解析 JSON 性能。 <br />
#### 封装 JSON
优化 [AbstractSQLExecutor](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java) 封装 JSON 性能。 <br />
#### 拼接 SQL
优化 [AbstractSQLConfig](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java) 拼接 SQL 性能。<br />
[完善功能](https://github.com/Tencent/APIJSON/blob/master/Roadmap.md#%E5%AE%8C%E5%96%84%E5%8A%9F%E8%83%BD) 中 Union 和 With 也是优化 SQL 性能的方式。 <br />
#### 读写缓存
20230105 更新:新增 Redis 缓存 Demo
https://github.com/APIJSON/APIJSON-Demo/commit/060a10e56818b31ab332770815467af9f052c261
在 [AbstractParser](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractParser.java) 使用了 HashMap<String, JSONObject> queryResultMap 存已解析的对象、总数等数据。<br />
在 [AbstractSQLExecutor](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java) 使用了 HashMap<String, JSONObject> cacheMap 存已通过 SQL 查出的结果集。<br />
#### ... //欢迎补充
### 增强稳定
APIJSON 代码经过商业分析软件 [源伞Pinpoint](https://www.sourcebrella.com/) 的质检,报告说明 APIJSON 非常可靠。<br />
https://github.com/Tencent/APIJSON/issues/48 <br />
但我们需要再接再厉,尽可能做到 99.999% 可靠度,降低使用风险,让用户放心和安心。 <br />
20200205 更新:已经解决了 [源伞科技](https://www.sourcebrella.com) 以上报告中的大部分问题 及 [奇安信代码卫士](https://github.com/QiAnXinCodeSafe) 发现的部分问题
https://github.com/Tencent/APIJSON/issues/created_by/QiAnXinCodeSafe
#### 减少 Bug
##### [APIAuto](https://github.com/TommyLemon/APIAuto) 上统计的 bug
账号 13000002000 密码 123456 <br />
http://apijson.cn/api <br />
##### 其它发现的 Bug
https://github.com/Tencent/APIJSON/issues?q=is%3Aissue+is%3Aopen+label%3Abug <br />
#### 完善测试
##### 在 APIAuto-机器学习自动化接口管理平台 上传更多、更全面、更细致的测试用例、动态参数等
http://apijson.cn/api <br />
##### 在 UnitAuto-机器学习自动化单元测试平台 上传更多、更全面、更细致的测试用例、动态参数等
http://apijson.cn/unit <br />
### 完善文档
20211112 更新:已在官网部署文档 http://apijson.cn/doc/zh
20200205 更新:最近完善及更新了通用文档、上手文档、图文入门文档等,还对首页引导文档加了导航目录
https://github.com/Tencent/APIJSON/blob/master/Navigation.md
#### 中文文档
##### 通用文档
https://github.com/Tencent/APIJSON/blob/master/Document.md <br />
##### 配置与部署
https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server <br />
##### ... //欢迎补充
#### English Document
Translation for Chinese document. <br />
https://github.com/Tencent/APIJSON/blob/master/README-English.md <br />
https://github.com/Tencent/APIJSON/blob/master/Document-English.md <br />
https://github.com/ruoranw/APIJSONdocs <br />
### 丰富周边
#### 新增或完善各种语言 ORM 库
Go, Node(js/ts), C#, PHP, Kotlin, Ruby 等。<br />
https://github.com/Tencent/APIJSON#%E7%94%9F%E6%80%81%E9%A1%B9%E7%9B%AE <br />
#### 新增或完善 Demo
JavaScript 前端TypeScript 前端,微信等小程序,<br />
Android 客户端iOS 客户端C# 游戏客户端等。<br />
Java, C#, PHP, Node, Python 等后端 Demo 及数据。<br />
https://github.com/APIJSON/APIJSON-Demo <br />
#### 新增扩展
目前官方有 apijson-column, apijson-router 两个插件
##### 1.基于或整合 [APIJSONORM](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM) 或 [apijson-framework](https://github.com/APIJSON/apijson-framework) 来实现的库/框架
##### 2.扩展 [APIJSONORM](https://github.com/Tencent/APIJSON/blob/master/APIJSONORM) 或 [apijson-framework](https://github.com/APIJSON/apijson-framework) 功能的插件
可以通过扩展对象关键词 @key,数组关键词 key远程函数重写部分方法等来实现。<br />
##### 3.前端/客户端 封装/解析 APIJSON 的库/框架
因为 APIJSON 基于 JSON大部分情况下都可以直接用 fastjson 等 JSON 封装/解析库或其它工具等,<br />
只是 APIJSON 有部分功能需要在 key 里放 [], @ 等特殊符号,返回 [] 在某些情况下不方便解析,<br />
目前可使用 "format": true 让后端格式化后返回,但也会对服务器性能有一些损耗,<br />
如果 前端/客户端 有对应的格式化工具等(例如 [apijson-orm](https://github.com/APIJSON/apijson-orm) 可供 Android 使用 format选择就会更多一些。<br />
##### ... //欢迎补充
### 推广使用
#### 为 APIJSON 编写/发表 博客/文章/资讯 等
https://github.com/Tencent/APIJSON#%E7%9B%B8%E5%85%B3%E6%8E%A8%E8%8D%90
20200205 更新:最近首页相关推荐新增了 1 篇官方发的文章和 6 篇用户发的文章
https://github.com/Tencent/APIJSON/blob/master/README.md#%E7%9B%B8%E5%85%B3%E6%8E%A8%E8%8D%90
#### 登记正在使用 APIJSON 的公司或项目
https://github.com/Tencent/APIJSON/issues/73
#### 在社交技术群、论坛等聊天或评论时推荐 APIJSON
#### ... //欢迎补充