Skip to content

Commit 5545ff4

Browse files
committed
add doc/query.md
1 parent 9ceb356 commit 5545ff4

File tree

15 files changed

+218
-181
lines changed

15 files changed

+218
-181
lines changed

README.md

Lines changed: 6 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -27,50 +27,17 @@
2727
- [x] get只有access中定义的才能访问
2828
- [x] 非get操作则必须与request指定一致才可请求
2929
- [x] 基于角色控制
30-
3130
- [ ] 远程函数
3231
- [ ] 错误提示
3332
- [ ] 查询节点 自定义查询数据
33+
- [ ] 字段限制
34+
- [ ] 请求结构复杂度限制
3435

36+
## 文档参考
37+
1. [Get开放查询](./doc/query.md)
38+
2. [非开放请求](./doc/action.md)
39+
3. [权限控制](./doc/access.md)
3540

36-
## 查询实现
37-
1. 根据json构造节点树, 并检查节点结构(不符合直接返回)
38-
2. parse 节点树内容, 并分析关联关系(不要求json的key顺序, 因为go的原生map不支持顺序遍历)
39-
3. 从依赖关系中逐步fetch数据
40-
4. 构造响应数据
41-
42-
43-
# 列表查询限制
44-
45-
[//]: # (1. page,count 最大值)
46-
- `[]`下只能有一个主查询表 (不依赖于列表中其他表)
47-
- 由于是应用内拼接结果处理1+n的问题, 当前以下写法total并不能获取到[]下单个节点的Todo[]的total值,也不能对Todo[]分页,所以勿使用于拔出萝卜带出泥的场景
48-
```json
49-
{
50-
"[]":{
51-
"User":{
52-
53-
},
54-
"Todo[]":{
55-
"user_id@":"/User/user_id"
56-
},
57-
"total@":"/Todo[]/total"
58-
}
59-
}
60-
```
61-
62-
63-
# 权限控制方案
64-
##
65-
- get 操作只能访问access中定义的表
66-
- 其他操作需和request中定义的结构一致方可访问
67-
68-
##
69-
- access 中定义各操作的角色权限, 角色有: 未登录用户/登录用户(OWNER/ADMIN/ 其他自定义角色)
70-
- 提供自定义函数 针对不同表不同角色添加 过滤条件
71-
72-
##
73-
- access_ext 中定义各操作的in/out字段列表, 限制各操作字段只能是此处的子集
7441

7542
# 开发指南
7643

README.zh-CN.md

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -27,50 +27,17 @@
2727
- [x] get只有access中定义的才能访问
2828
- [x] 非get操作则必须与request指定一致才可请求
2929
- [x] 基于角色控制
30-
3130
- [ ] 远程函数
3231
- [ ] 错误提示
3332
- [ ] 查询节点 自定义查询数据
33+
- [ ] 字段限制
34+
- [ ] 请求结构复杂度限制
3435

36+
## 文档参考
37+
1. [Get开放查询](./doc/query.md)
38+
2. [非开放请求](./doc/action.md)
39+
3. [权限控制](./doc/access.md)
3540

36-
## 查询实现
37-
1. 根据json构造节点树, 并检查节点结构(不符合直接返回)
38-
2. parse 节点树内容, 并分析关联关系(不要求json的key顺序, 因为go的原生map不支持顺序遍历)
39-
3. 从依赖关系中逐步fetch数据
40-
4. 构造响应数据
41-
42-
43-
# 列表查询限制
44-
45-
[//]: # (1. page,count 最大值)
46-
- `[]`下只能有一个主查询表 (不依赖于列表中其他表)
47-
- 由于是应用内拼接结果处理1+n的问题, 当前以下写法total并不能获取到[]下单个节点的Todo[]的total值,也不能对Todo[]分页,所以勿使用于拔出萝卜带出泥的场景
48-
```json
49-
{
50-
"[]":{
51-
"User":{
52-
53-
},
54-
"Todo[]":{
55-
"user_id@":"/User/user_id"
56-
},
57-
"total@":"/Todo[]/total"
58-
}
59-
}
60-
```
61-
62-
63-
# 权限控制方案
64-
##
65-
- get 操作只能访问access中定义的表
66-
- 其他操作需和request中定义的结构一致方可访问
67-
68-
##
69-
- access 中定义各操作的角色权限, 角色有: 未登录用户/登录用户(OWNER/ADMIN/ 其他自定义角色)
70-
- 提供自定义函数 针对不同表不同角色添加 过滤条件
71-
72-
##
73-
- access_ext 中定义各操作的in/out字段列表, 限制各操作字段只能是此处的子集
7441

7542
# 开发指南
7643

@@ -82,6 +49,7 @@
8249
6. 查看测试 demo/todo/todo/tests
8350

8451

52+
8553
# 感谢
8654
- [GoFrame](https://gitee.com/johng/gf)
8755
- [APIJSON](https://gitee.com/Tencent/APIJSON)

demo/todo/go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module todo
22

3-
go 1.19
3+
go 1.18
44

55
require (
66
github.com/glennliao/apijson-go v0.0.0
@@ -37,3 +37,5 @@ require (
3737
golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2 // indirect
3838
gopkg.in/yaml.v3 v3.0.1 // indirect
3939
)
40+
41+
replace github.com/glennliao/apijson-go v0.0.0 => ../..

demo/todo/go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
2020
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
2121
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
2222
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
23-
github.com/glennliao/apijson-go v0.0.0-20221028003852-4d2ed6edf46b h1:uNiGl+9/inmexE4esnj3erowRMYkwMNVJg2mXfijXmQ=
24-
github.com/glennliao/apijson-go v0.0.0-20221028003852-4d2ed6edf46b/go.mod h1:oeRAxPqpll8tH4eI7tBULPo07XaIonTxVOZm/Gciq3c=
2523
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
2624
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
2725
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=

demo/todo/go.work

Lines changed: 0 additions & 11 deletions
This file was deleted.

demo/todo/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func commonResponse(handler func(ctx context.Context, req g.Map) (res g.Map, err
8686
msg = err.Error()
8787
}
8888

89-
if config.Debug { //调试模式开启
89+
if config.Debug { //调试模式开启, 使用orderedmap输出结果
9090
reqSortMap := orderedmap.New()
9191

9292
err := json.Unmarshal(req.GetBody(), reqSortMap)
@@ -100,6 +100,7 @@ func commonResponse(handler func(ctx context.Context, req g.Map) (res g.Map, err
100100
if k == "tag" {
101101
continue
102102
}
103+
103104
if strings.HasSuffix(k, "@") {
104105
k = k[:len(k)-1]
105106
}

demo/todo/todo/todo.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ func Role(ctx context.Context, req config.RoleReq) (string, error) {
6161
func AccessCondition(ctx context.Context, req config.AccessConditionReq) (g.Map, error) {
6262

6363
user, ok := ctx.Value(config.UserIdKey).(*CurrentUser)
64+
6465
if !ok {
6566
return nil, nil
6667
}

doc/access.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# 权限控制
2+
3+
##
4+
- get 操作只能访问access中定义的表
5+
- 其他操作需和request中定义的结构一致方可访问
6+
7+
##
8+
- access 中定义各操作的角色权限, 角色有: 未登录用户/登录用户(OWNER/ADMIN/ 其他自定义角色)
9+
- 提供自定义函数 针对不同表不同角色添加 过滤条件
10+
11+
##
12+
- access_ext 中定义各操作的in/out字段列表, 限制各操作字段只能是此处的子集

doc/action.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# 非开放请求

doc/query.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
2+
# Get开放查询接口
3+
4+
### 核心思路
5+
json是可递归的, 可以将每一个json节点转换成Node对象, 最终构成节点树
6+
7+
例如
8+
```json
9+
{
10+
"[]": {
11+
"Todo": {
12+
"user_id@": "User/user_id"
13+
},
14+
"User": {
15+
"user_id@": "[]/Todo/user_id"
16+
}
17+
},
18+
"User": {
19+
"user_id": "10001"
20+
}
21+
}
22+
```
23+
可以看成最外层是一个节点, 节点请求内容即为整个json, 他具有两个子节点, `[]``User`,
24+
```json
25+
{
26+
"Todo": {
27+
"user_id@": "User/user_id"
28+
},
29+
"User": {
30+
"user_id@": "[]/Todo/user_id"
31+
}
32+
}
33+
```
34+
```json
35+
{
36+
"user_id": "10001"
37+
}
38+
```
39+
然后对于`[]`,又具有两个子节点, `Todo``User`
40+
41+
对于每一个Node, 分别有 `new->buildChild->parse->fetch->Result` 阶段
42+
43+
- new: 新建
44+
- buildChild: 构建子节点
45+
- parse: 解析当前节点的请求参数
46+
- fetch: 获取值
47+
- Result: 组装返回值
48+
49+
每一个节点还有Key和Path属性, Key 则为当前json节点中的Key,Path 则是该节点在整个json中的路径。 可以将Key看成为当前文件名, Path则为他的绝对路径
50+
51+
例如
52+
```json
53+
{
54+
"[]": {
55+
"Todo": {
56+
"user_id@": "User/user_id"
57+
},
58+
"User": {
59+
"user_id@": "[]/Todo/user_id"
60+
}
61+
}
62+
}
63+
64+
```
65+
中的User, Key为`User`, 路径则为 `[]/User`
66+
67+
68+
## 查询流程
69+
1. 创建一个`Query`
70+
2. 将原始json请求生成为一个`rootNode`
71+
3. 执行`buildChild`构建`rootNode`子节点.
72+
4. 执行`rootNode``parse` 解析请求, 并解析关联关系(不要求json的key顺序, 因为go的原生map不支持顺序遍历)
73+
5. 分析节点树的依赖关系, 获取节点执行顺序, 并依次执行 `fetch`
74+
6. 结果组装, 返回`rootNode``Result()` 完成本次查询
75+
76+
77+
78+
## 节点类型
79+
节点根据内容划分为以下类型
80+
- 查询节点: 该节点为实际查询数据库的节点, 其下面的内容可以看成是查询条件,不再往下构建子节点
81+
- 引用节点: 该节点的值引用其他节点的值 (暂只为`total@`使用)
82+
- 结构节点: 该节点仅为结构支撑 (例如: `[]`)
83+
84+
85+
查询节点的判定:
86+
- key 大写开头 (对应数据表)
87+
88+
引用节点判定:
89+
- key 为 total@
90+
91+
其他则为结构节点
92+
93+
94+
## 限制
95+
1. `[]`节点下有且只有一个主查询表(不依赖兄弟节点的查询节点)
96+
2. 由于是应用内拼接数据完成`n+1`的问题, 所以以下写法的total并不能获取到 (Todo[]是列表中主查询表User的副表)
97+
```json
98+
{
99+
"[]":{
100+
"User":{
101+
102+
},
103+
"Todo[]":{
104+
"user_id@":"/User/user_id"
105+
},
106+
"total@":"/Todo[]/total"
107+
}
108+
}
109+
```
110+
111+
112+
113+
## 待实现
114+
- [ ] 限制page的最大值,count区间
115+
- [ ] 分析节点树的复杂度, 限制最大复杂度
116+
- [ ] 增加 replace节点的sqlexecutor, 使用自定义完成数据的获取 (例如实际存储时候使用同一个表保存不同数据, 实际需要根据用户id或者其他信息来完成, 或者数据来自别的数据源)

0 commit comments

Comments
 (0)