Skip to content

Commit 62e48c3

Browse files
committed
新增 APIJSON 规划及路线图 文档
1 parent f8f5cad commit 62e48c3

File tree

1 file changed

+215
-0
lines changed

1 file changed

+215
-0
lines changed

Roadmap.md

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
2+
<h1 align="center" style="text-align:center;">
3+
APIJSON 规划及路线图
4+
</h1>
5+
6+
7+
### 完善功能
8+
* 新增支持 Case
9+
实现远程函数也不方便的 SQL 内字段转换 CASE WHEN THEN ,<br />
10+
暂时还没有想好如何设计。如果是 SQL 原来的写法,则有点繁琐。<br />
11+
12+
* 新增支持 @having&
13+
来实现内部条件 AND 连接,原来的 @having 由 AND 连接变为 OR 连接,保持 横或纵与 的统一规则。<br />
14+
@having! 必须性不大,可通过反转内部条件来实现,但如果实现简单、且不影响原来的功能,则可以顺便加上。<br />
15+
16+
* 新增支持 @column!
17+
这个只在 APIJSONFramework 支持,需要配置每个接口版本、每张表所拥有的全部字段,然后排除掉 @column! 的。<br />
18+
需要注意的是,可能前端传参里既有 @column 又有 @column! ,碰到这种情况:<br />
19+
如果没有重合字段就忽略 @column! ,只让 @column 生效;<br />
20+
如果有有重合字段,则抛异常,转为错误码和错误信息返回。<br />
21+
22+
23+
* 新增支持分布式
24+
"@url": "http://apijson.cn:8080/get"
25+
```js
26+
{
27+
"User": {
28+
"@url": "http://apijson.cn:8080/get" //转发给其它服务器执行
29+
},
30+
"[]": {
31+
"Comment": {
32+
"userId@": "User/id"
33+
}
34+
},
35+
"@explain": true
36+
}
37+
```
38+
考虑到引用赋值的依赖关系要保持先后顺序,必须同步阻塞处理。<br />
39+
或许可以加一个 ~ 前缀表示异步?例如 "@url": "\~http://apijson.cn:8080/get",由调用方保证没有被下方对象依赖。<br />
40+
41+
42+
* 新增支持 Union
43+
虽然可以通过 INNER JOIN + 条件 OR 连接来替代它的功能,但没法达到它能用索引的性能。<br />
44+
支持 UNION 很有必要,但 UNION ALL 几乎没有需求,如果实现简单、且不影响原来的功能,则可以顺便加上。
45+
46+
"@union": Integer // 0 - 不使用,1 - UNION,2 - UNION ALL
47+
```js
48+
{
49+
"[]": {
50+
"User": {
51+
"name~": "a",
52+
"tag~": "a",
53+
"@combine": "name~,tag~",
54+
"@union": 1 //将 @combine 中的 N 个 OR 连接字段用 UNION 替换,原本一条 SQL 需要拆分成 N 条 SQL 来 UNION
55+
}
56+
},
57+
"@explain": true
58+
}
59+
```
60+
生成的 SQL
61+
```sql
62+
SELECT * FROM `sys`.`apijson_user` WHERE ( (`name` REGEXP BINARY 'a') OR (`tag` REGEXP BINARY 'a') ) LIMIT 10 OFFSET 0
63+
```
64+
需要变为
65+
```sql
66+
SELECT * FROM `sys`.`apijson_user` WHERE ( (`name` REGEXP BINARY 'a') )
67+
UNION
68+
SELECT * FROM `sys`.`apijson_user` WHERE ( (`tag` REGEXP BINARY 'a') )
69+
LIMIT 10 OFFSET 0
70+
```
71+
72+
73+
* 新增支持 With
74+
可以减少子查询执行次数,提高性能。
75+
```js
76+
{ //看看关注的人最近有什么动态(分享、评论)
77+
"sql@": {
78+
"with": true, //生成 WITH(SELECT id ...) AS `sql`
79+
"from": "User",
80+
"User": {
81+
"@column": "id",
82+
"@role": "CONTACT"
83+
}
84+
},
85+
"Moment[]": {
86+
"Moment": {
87+
"userId{}@": "sql",
88+
"@order": "date-"
89+
}
90+
},
91+
"Comment[]": {
92+
"Comment": {
93+
"userId{}@": "sql",
94+
"@order": "date-"
95+
}
96+
},
97+
"@explain": true
98+
}
99+
```
100+
生成的 SQL
101+
```sql
102+
SELECT * FROM `sys`.`Moment` WHERE ( (`userId` IN (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
103+
```
104+
105+
```sql
106+
SELECT * FROM `sys`.`Moment` WHERE ( (`userId` IN (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
107+
```
108+
109+
需要变为
110+
```sql
111+
WITH (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) AS `sql`
112+
SELECT * FROM `sys`.`Moment` WHERE ( (`userId` IN `sql` ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
113+
```
114+
115+
```sql
116+
WITH (SELECT `id` FROM `sys`.`User` WHERE `id` IN($contactIdList)) AS `sql`
117+
SELECT * FROM `sys`.`Comment` WHERE ( (`userId` IN `sql` ) ) ORDER BY `date` DESC LIMIT 10 OFFSET 0
118+
```
119+
120+
121+
122+
### 保障安全
123+
* 防越权操作
124+
目前有 RBAC 自动化权限管理。
125+
126+
* 防 SQL 注入
127+
目前有 预编译 + 白名单 校验机制。
128+
129+
* 防恶意复杂请求
130+
目前有限流机制,getMaxQueryCount, getMaxUpdateCount, getMaxObjectCount, getMaxSQLCount 等。
131+
132+
133+
134+
### 优化性能
135+
* 解析 JSON
136+
优化 AbstractParser 和 AbstractObjectParser 解析 JSON 性能。
137+
138+
* 封装 JSON
139+
优化 AbstractSQLExecutor 封装 JSON 性能。
140+
141+
* 拼接 SQL
142+
优化 AbstractSQLConfig 拼接 SQL 性能。<br />
143+
#完善功能 中 Union 和 With 也是优化 SQL 性能的方式。
144+
145+
* 读写缓存
146+
在 AbstractParser 使用了 HashMap<String, JSONObject> queryResultMap 存已解析的对象、总数等数据。<br />
147+
在 AbstractSQLExecutor 使用了 HashMap<String, JSONObject> cacheMap 存已通过 SQL 查出的结果集。<br />
148+
149+
* ... //欢迎补充
150+
151+
152+
153+
### 增强稳定
154+
155+
* 减少 Bug
156+
#### 1.APIAuto 上统计的 bug
157+
http://apijson.org:8000/auto/
158+
159+
#### 2.其它发现的 Bug
160+
https://github.com/APIJSON/APIJSON/issues?q=is%3Aissue+is%3Aopen+label%3Abug
161+
162+
* 完善测试
163+
1.在 APIAuto-机器学习自动化接口管理平台 上传更多、更全面、更细致的测试用例、动态参数等
164+
165+
2.接入 UnitAuto-机器学习自动化单元测试平台,每次启动都自动测试所有可测方法并输出报告
166+
167+
168+
169+
### 完善文档
170+
* 中文文档
171+
172+
#### 1.设计规范
173+
174+
#### 2.配置与部署
175+
176+
#### ... //欢迎补充
177+
178+
* English Document
179+
Translation for Chinese document.
180+
181+
182+
183+
### 丰富周边
184+
* Go, Kotlin, Ruby 等其它语言 ORM 库
185+
186+
187+
* Demo
188+
JavaScript 前端,TypeScript 前端,微信等小程序,<br />
189+
Android 客户端,iOS 客户端,C# 游戏客户端等。<br />
190+
191+
* 扩展
192+
193+
#### 1.基于或整合 APIJSONORM 或 APIJSONFramework 来实现的库/框架
194+
195+
#### 2.扩展 APIJSONORM 或 APIJSONFramework 功能的插件
196+
可以通过扩展对象关键词 @key,数组关键词 key,远程函数,重写部分方法等来实现。<br />
197+
198+
#### 3.前端/客户端 封装/解析 APIJSON 的库/框架
199+
因为 APIJSON 基于 JSON,大部分情况下都可以直接用 fastjson 等 JSON 封装/解析库或其它工具等,<br />
200+
只是 APIJSON 有部分功能需要在 key 里放 [], @ 等特殊符号,返回 [] 在某些情况下不方便解析,<br />
201+
目前可使用 "format": true 让后端格式化后返回,但也会对服务器性能有一些损耗,<br />
202+
如果 前端/客户端 有对应的格式化工具等(例如 APIJSONORM 可供 Android 使用 format),选择就会更多一些。<br />
203+
204+
205+
206+
### 推广使用
207+
* 为 APIJSON 编写/发表 博客/文章/资讯 等
208+
209+
* 登记正在使用 APIJSON 的公司或项目
210+
211+
* 在社交技术群、论坛等聊天或评论时提及 APIJSON
212+
213+
* ... //欢迎补充
214+
215+

0 commit comments

Comments
 (0)