前言
此开放平台的设计文档分为上、中、下三篇来说明,分别对应概念与总体流程、关键逻辑、数据存储三部分。
存储设计
存储方面,结合前文提到的功能和需求,这里以mysql库为例子,做一个表设计,默认表不使用外键,同时使用utf8mb4作为编码存储;除非特殊说明,默认所有字段非空;除开开发者,开放平台本身运维需要一些运营、开发人员,此部分设计同大多数的后台管理系统一致,本文不涉及。
通用字段
-
status 通用状态
-
-1 = 删除 ( 不可读, 不可写 )
-
0 = 禁用 ( 可读 , 不可写 )
-
1 = 正常/ 审核通过 ( 可读 , 可写 )
-
2 = 待审核 ( 资料/申请 提交 , 待审核)
-
数据库
developer 开发者账号
- 开发者要接入开放平台,则需要成为开放平台的用户,需要注册对应的账号,等待审核通过
- 当申请成功成为开发者后就可以使用开发平台的功能,更多字段根据需要添加
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
name | varchar(20) | 用户名称 | ||
status | tinyint(4) | 1 | 用户状态 | |
created | datetime | 创建时间 | ||
updated | datetime | 更新时间 |
org (第三方)主体
保存第三方的主体信息,通常是机构、学校等。开发者创建账号成功后,登录平台创建对应的主体。
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
developer_id | bigint(20) | unique | 开发者id,此主体的超管 | |
org_code | varchar(40) | unique | 第三方主体code | |
org_name | varchar(100) | 第三方主体名称 | ||
address | varchar(255) | 联系地址 | ||
context_info | text | 上下文信息 | ||
status | 2 | btree |
字段说明:
- org_code 在整个开发平台中唯一标志第三方主体
- context_info 记录第三方的扩展信息, 方便审核时使用,例如营业执照图片、门店照片
{
"version": 1 ,
"data":{
"images":["http://abcd.jpg"]
}
}
org_app 主体应用表
主体创建的多个应用表,一个主体创建多个应用;一个应用只能属于一个主体。
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
app_key | varchar(20) | btree | 第三方应用key | |
app_secret | varchar(100) | 第三方应用密钥 | ||
org_code | varchar(40) | btree | 第三方账号code | |
name | varchar(50) | 第三方应用名称 | ||
request_frequency_limit | int(11) | 单位时间间隔访问次数限制 | ||
creator_id | bigint(20) | 创建人 | ||
update_user_id | bigint(20) | 更新人 | ||
created | datetime | 创建时间 | ||
updated | datetime | 更新时间 |
说明:
- request_frequency_limit 访问频率限制,这个是对当前应用的访问频率控制
- 例如 1000/s = 每秒最大1000次 ; 100000/m = 每分钟最大100000次;
- 建议根据实际需求自行定义格式与解析方式
- 如果要求精确到 应用-接口 级别,可以自行扩展。
developer_app 开发者关联的应用
-
应用的创建人(超管), 即主体人可以向其余的开发者授权某些应用 .
-
同时支持对这些应用的操作权限授权. 如读 / 读写 两种 .
-
是管理员则可以给普通开发者授权( 通过账号 ) , 普通开发者之间无法授权 .
-
- 默认一个应用只有一个管理员, 就是应用关联的主体账号关联的开发者 .
-
如有需要可以对权限值以及级联授权模型、甚至关联权限组来做扩展,形成复杂的授权体系 .
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
app_key | varchar(20) | btree | 第三方应用key | |
developer_id | bigint(20) | btree | 开发者账号id | |
admin | tinyint(4) | 0 | 是否是管理员 | |
permission_value | int | btree | 权限值 | |
creator_id | bigint(20) | 创建人 | ||
update_user_id | bigint(20) | 更新人 | ||
created | datetime | 创建时间 | ||
updated | datetime | 更新时间 |
字段说明:
-
admin 是否是管理员
-
- 1 = 是
- 0 = 否
-
permission_value 权限值 ( 读写 = 1 + 2 = 3)
-
- 1 = 读
- 2 = 写
app_publish 应用发布表
- 主要记录应用的上架和下架信息
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
app_key | varchar(20) | btree | 第三方应用key | |
app_version | varchar(20) | 应用的版本 | ||
open_version | varchar(20) | btree | 适用的开方平台版本 | |
file_url | varchar(255) | 文件地址 , 默认相对路径 | ||
file_size | int(11) | app大小 , 单位字节 | ||
file_name | varchar(255) | 文件名称 | ||
audit_user_id | bigint(20) | 审核人 | ||
aduit_time | datetime(3) | 审核时间 | ||
status | tinyint(4) | btree | 当前状态 | |
creator_id | bigint(20) | 创建人 | ||
update_user_id | bigint(20) | 更新人 | ||
created | datetime | 创建时间 | ||
updated | datetime | 更新时间 |
说明 :
- 这里记录所有的应用的上架和下架情况, 默认第三方上传的应用需要审核 , 审核通过的应用会上架的智慧教育开放平台.
- 一个应用默认只有一个正常状态的上架应用,保证对外提供的只有一个版本的应用。
- audit_user_id = 开放平台负责审核工作的人员
api_category api的分类
- 对api进行分类,方便管理; 通常按照业务模块 进行分类;
- 假设这是一个企业组织架构业务相关的开放平台,可以分为
- 部门接口
- 用户接口
- 职位接口
- and more
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
code | varchar(20) | unique | 分类的code | |
name | varchar(50) | 分类的名称 |
api_resource 接口资源表
- 该表包含了提供的所有可以提供功能的接口
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
uri | varchar(255) | 接口路径uri | ||
api_category_code | varchar(20) | btree | 分类的code | |
name | varchar(50) | 接口名称 | ||
status | tinyint(4) | btree | 接口状态 |
app_permission 应用权限表
- 不同的app具有不同的权限,再简略情况下可以不需要此功能,可默认具有全部权限
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
app_key | varchar(20) | 第三方应用key | ||
apply_type | tinyint(4) | 申请的类型 | ||
apply_value | varchar(30) | 申请的值 |
-
当前有权限的在表中有对应记录 , 无权限的物理删除 .
-
key、type、value 需要做三个字段的联合索引,对于接口权限建议全部缓存; 数据权限一般存储的数据量较大,建议查表。
字段说明:
-
apply_type 申请的类型 , 此为申请需要通过的权限类型
-
- 1 = api 的 url申请
- 2 = api 的category 分类批量申请
-
- 3 = 数据权限 , 例如部门id
- 4 = 数据权限 , xxxxx
-
apply_value , 申请的 apply_type 类型对应的值 ; json对象
-
- 当 apply_type = 1 , 其值为 api_resource 的id
- 当 apply_type = 2 , 其值为 api_category_code 的值
-
- 当 apply_type = 3 , 其值为 部门ID
- 当 apply_type = 4,其值为 xxxxx ID
permission_aduit_record 权限审核记录
此表主要在第三方发起 申请后 , 对申请做审核处理的记录 . 审核的结果会定期清理.
默认清理 1月前的申请 .
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
app_key | varchar(20) | btree | 第三方应用key | |
apply_type | tinyint(4) | btree | 申请的类型 | |
apply_values | text | 申请的值 | ||
developer_id | bigint(20) | -1 | btree | 开发者id |
created | datetime | 创建时间,申请的时间 |
字段说明:
-
apply_type 同 third_permission表中字段 .
-
apply_values , JSON数组 , 保存的内容为third_permission表中字段与apply_type对应的 apply_value的值.
-
developer_id 如果是系统自动生成则使用默认值 -1 .
ip_white ip白名单表
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
ip | varchar(255) | ip | ||
app_key | varchar(20) | btree | 第三方应用key |
- 第三方哪些ip可以访问平台接口 , 可以配置多个白名单 .
- 可以通过配置来限制 数量, 比如限制最多10个 .
- 可以将ip字段扩展为正则表达式,方便批量多个(但是如此键值10个就没有意义了)
access_log 访问日志表
-
考虑访问的频繁性质 , 使用异步同步的方案来实现日志的处理 .
-
- 日志在开始和结束时先保存到队列中, 最后同步到数据库(对于日志,小批量可以录入mysql,数据量很大的情况下可以根据实际情况选择数据库).
字段 | 属性 | 默认值 | 索引 | 说明 |
---|---|---|---|---|
id | bigint(20) | pk | ||
request_id | varchar(32) | 请求流水号 | ||
app_key | varchar(20) | btree | 第三方应用key | |
uri | varchar(60) | 请求资源的uri | ||
request_header | text | 请求头 | ||
request_body | text | 请求body | ||
response_body | text | 返回body | ||
access_time | bigint(13) | btree | 请求时间 | |
response_time | bigint(13) | 响应时间 | ||
expend_time | bigint(13) | 耗时 | ||
ip | varchar(255) | 访问者ip | ||
success | tinyint(4) | 是否成功(0-否,1-是) |