# 开放平台总体设计文档 ### 功能模块 #### 开放平台用户管理 ##### 禁用接口 * 对于已经发布的接口,可以通过页面禁用接口。 * 接口地址:/openapi/interface/disable/{1} * 请求方式:PUT * 平台: 总部端 * 请求参数: * 响应参数:JSON格式 ```json { "code": 1000000, "msg": "操作成功", "data": null } ``` ##### 导入接口 * 可以通过excel导入其他环境已经配置好的接口。 * 接口地址:/openapi/interface/import * 请求方式:POST * 平台: 总部端 * 请求参数:multipart_file //excel文件 * 响应参数:JSON格式 * 响应示例: ```json { "code": 1000000, "msg": "操作成功", "data": null } ``` ##### 导出接口 * 可以导出当前环境的接口信息。 * 接口地址:/openapi/interface/export * 请求方式:GET * 平台: 总部端 * 请求参数: json ```json { "ids" : "1,2,3" //多个接口id用逗号隔开。 不传则导出全部 } ``` * 响应参数:JSON格式 * 响应示例: ```json { "code": 1000000, "msg": "操作成功", "data": [ { "id": 1, "name": "车场接口", "path": "/api/v1/car/parking", "method": "GET", "type": 0, "serviceType": 1, "version": "v1", "status": 1, "doc": "", "enable": 1, "limitCount": 100, "createTime": "2021-01-01 00:00:00", "updateTime": "2021-01-01 00:00:00", "createUser": "admin", "updateUser": "admin" } ] } ``` ##### 查询详情 * 接口地址:/openapi/interface/{1} * 请求方式:GET * 平台: 总部端 * 请求参数:路径参数 * 响应参数:JSON格式 * 响应示例: ```json { "code": 1000000, "msg": "操作成功", "data": { "id": 1, "name": "车场接口", "path": "/api/v1/car/parking", "method": "GET", "type": 0, "serviceType": 1, "version": "v1", "status": 1, "doc": "", "enable": 1, "limitCount": 100, "createTime": "2021-01-01 00:00:00", "updateTime": "2021-01-01 00:00:00", "createUser": "admin", "updateUser": "admin" } } ``` ##### 查询接口列表(分页) * 接口地址:/openapi/interface/page * 请求方式:GET * 平台: 总部端,开放平台 * 请求参数:分页参数 | 参数名 | 类型 | 说明 | 是否必填 | |-------------| --- |------| --- | | current | int | 页码 | 是 | | size | int | 每页条数 | 是 | | name | string | 应用名称 | 否 | | serviceType | string | 服务行业 | 否 | | status | int | 状态 | 否 | | path | string | 访问路径 | 否 | * 响应参数:JSON格式 * 响应示例: ```json { "code": 1000000, "msg": "操作成功", "data": { "total": 10, "pages": 20, "current": 1, "size": 10, "records": [ { "id": 1, "name": "车场接口", "path": "/api/v1/car/parking", "method": "GET", "type": 0, "serviceType": 1, "version": "v1", "status": 1, "doc": "", "enable": 1, "limitCount": 100, "createTime": "2021-01-01 00:00:00", "updateTime": "2021-01-01 00:00:00", "createUser": "admin", "updateUser": "admin" } ] } } ``` #### 开放平台安全管理 开放平台安全校验模块负责对接车场、人行项目的安全校验,包括接口的安全校验、数据加密、数据权限校验、数据流量监控等。 ##### token生成 * 开放平台对外提供的接口,都需要通过token进行访问。 * 开放平台用户,需要通过appId, appSecret, timestamp, sign生成token。 * token具有有效期。有效期时长可以配置。默认为两天。 * token是采用jwt生成的。 * 接口地址:/openapi/token/generate * 请求方式:POST * 请求参数:JSON格式 ```json { "appId": "123456", "appSecret": "123456", "timestamp": 1610123456789, "sign": "123456" } ``` * 响应参数:JSON格式 * 响应示例: ```json { "code": 1000000, "msg": "操作成功", "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNjEwMTIzNDU2LCJleHAiOjE2MTA1MjM0NTYsInVzZXJuYW1lIjoiYWRtaW4iLCJpYXQiOjE2MTA1MjM0NTYsImV4cCI6MTYxMDUyMzQ1NiwiaWF0IjoxNjEwMTIzNDU2LCJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" } } ``` ##### token校验 * 开放平台对外提供的接口,都需要通过token进行访问。 * 开放平台用户,需要通过token校验。 * 通过jwt解析token。对比jwt中的body数据是否正确。并获取当前应用的一些权限。 ##### 签名方式 * 所有的接口按照接口都需要参数签名。 * 对所有的加密字段,通过ascii排序后,拼接成字符串,然后用appSecret进行aes加密。 * 对于post, put请求,加密参数会在body中。 * 对于get, delete请求,加密参数会在url中。 ##### 签名校验 * 所有的接口都需要校验签名。 * 对所有的加密字段,通过ascii排序后,拼接成字符串,然后用appSecret进行aes加密。 * 对比签名是否正确。 ##### 接口权限校验 * 开放平台对外提供的接口,都需要进行权限校验。 * 查看当前应用的接口绑定关系。 * 根据当前应用的权限,判断当前接口是否有权限访问。 ##### 接口流量监控 * 开放平台对外提供的接口,都需要进行流量监控。 * 每个接口都需要记录访问次数。按照秒,分,时,天,月,年进行统计。目前只统计当前值。就是当前秒,当前分,过时的就丢弃。 * 对于接口都存在一个访问限制数。 * 限制数目前设置的是当前秒的限制数。 * 限制数达到后,接口会被禁用。 ### 数据库设计 #### 应用管理表 | 字段名 | 参数名称 | 类型 | 能否为空 | 说明 | |-----------------|-------|--------------|------|----------------| | id | 主键 | int | 否 | 应用id | | name | 应用名称 | varchar(16) | 否 | 应用名称 | | app_id | 应用id | varchar(32) | 否 | 应用id | | app_secret | 应用密钥 | varchar(32) | 否 | 应用密钥 | | status | 应用状态 | int | 否 | 应用状态 0 禁用 1 启用 | | create_time | 创建时间 | datetime | 否 | 创建时间 | | update_time | 更新时间 | datetime | 是 | 更新时间 | | user_id | 创建人 | varchar(16) | 否 | 创建人 | | expiration_time | 过期时间 | datetime | 否 | 过期时间 | | is_delete | 是否已删除 | int | 否 | 0 正常 1 已删除 | | remark | 备注 | varchar(255) | 是 | 备注 | #### 应用项目关联表 | 字段名 | 参数名称 | 类型 | 能否为空 | 说明 | |--------------|--------|-------------|-------|-----------------| | id | 主键 | int | 否 | 主键 | | app_id | 应用id | varchar(32) | 否 | 应用id 应用表的主键 | | project_id | 项目id | int | 否 | 项目id 对应项目表的主键 | #### 接口管理表 | 字段名 | 参数名称 | 类型 | 能否为空 | 说明 | |-----------------|-------|--------------|------|---------------------------| | id | 主键 | int | 否 | 接口id | | name | 接口名称 | varchar(16) | 否 | 接口名称 | | path | 接口路径 | varchar(128) | 否 | 接口路径 | | method | 请求方式 | varchar(16) | 否 | 请求方式 | | type | 接口类型 | int | 否 | 接口类型 0 上行 1下行 | | service_type | 服务类型 | int | 否 | 1 车位 2 支付 3 月卡 4 车场 5 优惠券 | | version | 版本号 | varchar(16) | 否 | 版本号 v1 v2 | | doc | 接口文档 | text | 是 | 接口文档 | | status | 接口状态 | int | 否 | 接口状态 0 禁用 1 启用 | | enable | 是否启用 | int | 否 | 是否启用 0 禁用 1 启用 | | limit_count | 限制次数 | int | 否 | 限制次数 | | create_time | 创建时间 | datetime | 否 | 创建时间 | | update_time | 更新时间 | datetime | 是 | 更新时间 | | create_user | 创建人 | varchar(16) | 否 | 创建人 | | update_user | 更新人 | varchar(16) | 是 | 更新人 | | is_delete | 是否已删除 | int | 否 | 0 正常 1 已删除 | | remark | 备注 | varchar(255) | 是 | 备注 | #### 应用接口授权关联表 | 字段名 | 参数名称 | 类型 | 能否为空 | 说明 | |--------------|--------|-------------|-------|-----------------| | id | 主键 | int | 否 | 主键 | | app_id | 应用id | varchar(32) | 否 | 应用id 应用表的主键 | | interface_id | 接口id | int | 否 | 接口id 接口表的主键 | ### 数据接口列表