Skip to content

Commit ce6d016

Browse files
doc: add embedded docs
1 parent e969eef commit ce6d016

20 files changed

Lines changed: 203 additions & 0 deletions

docs/embedding_integration.md

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
!!! Abstract ""
2+
嵌入式对接分为三类,分别是:
3+
4+
- 小助手-基础应用
5+
- 小助手-高级应用
6+
- 页面嵌入
7+
8+
其中小助手分为两小类,分别是:浮窗嵌入、全屏嵌入。
9+
10+
嵌入式 Demo 地址:https://github.com/dataease/sqlbot-embedded-demo
11+
12+
三类方式的区别主要按照权限划分,请对照选择合适的嵌入方式:
13+
14+
| 类别 | 权限 | 数据源 | 场景 |
15+
|------|---|------|----------|
16+
| 基础应用 | 游客/员工 | SQLBot | 数据源 | 简单嵌入,无权限要求 |
17+
| 高级应用 | 宿主权限 | 宿主数据源(api 接口) | 有权限要求,有自己的权限体系 |
18+
| 页面嵌入 | SQLBot 权限 | SQLBot 数据源 | 有权限要求,无自己的权限体系 |
19+
20+
## 新建应用
21+
22+
### 小助手-基础应用
23+
24+
!!! Abstract ""
25+
使用 admin 账号登录 SQLBot,切到系统设置菜单-嵌入式管理,新建对应的应用。
26+
![示例](../img/embedding/sqlbot_basic_assistant.png)
27+
28+
填写名称、描述、以及跨域设置
29+
![示例](../img/embedding/sqlbot_basic_info.png)
30+
31+
选择对应的工作空间并设置数据源权限
32+
![示例](../img/embedding/sqlbot_basic_datasource.png)
33+
小助手-基础应用有“游客/员工”简单权限模式,游客只能访问“公共”数据源
34+
35+
### 小助手-高级应用
36+
37+
!!! Abstract ""
38+
高级应用在新建环节和基础应用的区别就是数据源,通过 API 接口的方式获取。
39+
![示例](../img/embedding/sqlbot_advanced_info.png)
40+
![示例](../img/embedding/sqlbot_advanced_interface.png)
41+
42+
开启 AES 加密,那么宿主系统提供的 API 接口中需要对相应的字段进行 AES 加密。
43+
一般场景下宿主 API 接口会有认证机制,例如 token、cookie 等。这些凭证信息一般情况下会存储在前端页面,填写接口凭证,SQLBot 会在宿主页面上根据填写的凭证信息去获取凭证但不存储,获取的时机是在每次“问数”。SQLBot 根据获取到的凭证去调用宿主系统的 API 接口。有些基于 httpOnly 的 cookie 凭证,SQLBot 无法获取,可以为数据源接口额外定义一个认证凭证。
44+
![示例](../img/embedding/sqlbot_advanced_interface2.png)
45+
46+
注意:目标凭证字段(非必填)支持 js 表达式。
47+
48+
以 Demo 系统为例:
49+
![示例](../img/embedding/sqlbot_advanced_demo.png)
50+
51+
分别解释接口凭证的字段
52+
53+
源系统凭证类型 localStorage,凭证名称 sqlbot-embedded-token。
54+
55+
解释:从 localStirage 中获取 key 为 sqlbot-embedded-token 的信息。代码:
56+
57+
```
58+
var source_val = localStorage.getItem('sqlbot-embedded-token')
59+
```
60+
61+
目标凭证`Bearer ${JSON.parse(JSON.parse(source_val).v)}`。
62+
63+
解释:根据上一步获取到的 source_val 进一步拼接凭证,代码:
64+
```
65+
source_val = `Bearer ${JSON.parse(JSON.parse(source_val).v)}`
66+
```
67+
68+
目标凭证位置 header,名称 sqlbot-embedded-token。
69+
70+
解释:把上一部获取到的凭证放在请求头的 sqlbot-embedded-token 中去调 API。
71+
72+
### 页面嵌入
73+
74+
!!! Abstract ""
75+
填写名称、跨域设置
76+
![示例](../img/embedding/sqlbot_page.png)
77+
78+
记录 APP ID 以及 APP Secret,后面编码环节用得到。
79+
80+
## 宿主系统实现
81+
82+
!!! Abstract ""
83+
下载 Demo 代码 https://github.com/dataease/sqlbot-embedded-demo
84+
85+
配置数据库信息
86+
![示例](../img/embedding/project_config.png)
87+
88+
在 frontend 目录执行
89+
```
90+
npm install;npm run build
91+
```
92+
93+
在 backend 目录执行
94+
```
95+
npm install;npm run dev
96+
```
97+
98+
访问 http://localhost:3000,如下图即运行正常
99+
![示例](../img/embedding/project_demo.png)
100+
101+
根据 SQLBot 中填写的信息填写系统设置表单,保存。当前是游客模式,登录后是 online 模式。
102+
103+
代码层面基础应用和高级应用嵌入方式基本没有区别。
104+
105+
### 浮窗模式
106+
107+
!!! Abstract ""
108+
参考 assistan/float.vue 文件
109+
![示例](../img/embedding/project_float.png)
110+
111+
把 sqlbot 提供的嵌入 js 加载到宿主系统。
112+
113+
如果是高级应用,必须登录才可以,因为要从页面获取凭证信息.
114+
115+
注意:
116+
117+
- online 参数用来区别是否是游客;
118+
- userFlag 参数用来区分问数记录归属,userFlag 是大于 1 的数字;加载 js 资源最好判断一下是否已经加载过。
119+
120+
如接入成功,访问小助手浮窗宿主页面,右下角会出现浮动图标,如下图:
121+
![示例](../img/embedding/project_float_demo.png)
122+
123+
### 全屏模式
124+
125+
!!! Abstract ""
126+
参考 assistant/full.vue 文件
127+
![示例](../img/embedding/project_fullscreen.png)
128+
129+
如果是高级应用,必须登录才可以,因为要从页面获取凭证信息
130+
131+
接入成功页面如下
132+
![示例](../img/embedding/project_fullscreen_demo.png)
133+
134+
### 页面嵌入
135+
136+
!!! Abstract ""
137+
参考 embedded/index.vue 文件
138+
![示例](../img/embedding/project_page.png)
139+
140+
核心代码与全屏接入一样,只是调用 mounted 方法参数有区别。这里的 token 请在后端生成,避免泄漏 app secret。token 生成的逻辑是把 appId 和 account 作为 payload,appSecret 作为 secret。
141+
142+
接入成功页面如下
143+
![示例](../img/embedding/project_page_demo.png)
144+
145+
问数需要先选择数据源,与 SQLBot 页面一致
146+
![示例](../img/embedding/project_page_demo2.png)
147+
148+
### 高级应用 API 接口
149+
150+
!!! Abstract ""
151+
接口基本信息
152+
153+
|项目 |描述|
154+
|---|---|
155+
|接口名称 |获取数据源信息|
156+
|接口地址 |自定义(例如:/datasource)|
157+
|请求方法 |GET|
158+
|Content-Type |application/json|
159+
|权限要求 |根据宿主系统|
160+
161+
响应
162+
163+
成功响应 http 200
164+
165+
响应体
166+
167+
|名称 |类型 |示例值 |描述|
168+
|---|---|---|---|
169+
|code |Integer |200 |状态码,200 或者 0 成功|
170+
|data |Array[ds] |[{...}, ...] |数据源信息|
171+
|ds.name |String |demo-ds |名称,require|
172+
|ds.type |String |pg |类型,require|
173+
|ds.host |String |localhost |require|
174+
|ds.port |Integer |5432 |require|
175+
|ds.dataBase |String |sqlbot_demo |require|
176+
|ds.user |String |root |require|
177+
|ds.password |String |xxxx |require|
178+
|ds.schema |String |public| |
179+
|ds.comment |String |sqlbot-test-ds |描述,require|
180+
|ds.tables |Array[table] |[{...},{...},...] |require|
181+
|table.name |String |categories |require|
182+
|table.sql |String | |sql 优先级高于 table.name|
183+
|table.comment |String |商品品类表 |表描述,requre|
184+
|table.fields |Array[field] |[{...},{...},...] |require|
185+
|field.name |String |category_name |require|
186+
|field.comment |String |品类名称 |require|
187+
|field.type |String |TEXT |db 字段类型 requre|
188+
189+
api 接口可以考虑预留参数 dsId 以及 tableId,以限定数据源和表进行问数。在多数据源场景下,对提升执行速度以及准确率都有明显效果。
190+
191+
问数之前,SQLBot 会在宿主页面获取凭证信息调用 API,可以利用 param 类型的凭证作为参数,但是要保证实时更新页面中的凭证。比如设置一个限定数据源 ID 的参数。
192+
![示例](../img/embedding/advanced_interface.png)
193+
194+
前端代码执行 localStorage.setItem(‘dsId’, xxx)
195+
196+
使用问数功能时,SQLBot 会获取存储在 localStorage 中的 dsId 拼接到 API 接口地址中 http://localhost:3000/api/datasource?dsId=xxx
197+
198+
如此 , 我想精确到某个表进行问数时,只需要在宿主页面前端执行
199+
200+
```
201+
localStorage.setItem(‘dsId’, xxx);localStorage.setItem(‘tableId’, xxx)
202+
```
82 KB
Loading
272 KB
Loading
144 KB
Loading
406 KB
Loading
619 KB
Loading
484 KB
Loading
157 KB
Loading
565 KB
Loading
222 KB
Loading

0 commit comments

Comments
 (0)