简易可配置的查询接口应用框架设计
2020-07-03 本文已影响0人
triplestudio
应用框架设计的目标是:使得可以无代码、全配置快速制作可供其它应用使用的数据查询接口。
![](https://img.haomeiwen.com/i17509417/cf19532a2c4dbe72.png)
1. 资源定义
应用的主要职能是查询数据,这里的终极资源就是每个查询语句
。
资源标识遵循一定的约定,如规定标识前缀等,有如 dba-test
。
查询语句可以采用xml配置的方式,或其它存储形式。要求语句可动态组成,支持动态参数。
<?xml version="1.0" encoding="utf-8" ?>
<services>
<service id="dba-test">
<![CDATA[
sql.Append(@"select * from test where id=@id");
]]>
</service>
</services>
2. 权限与鉴权
权限以资源为粒度,通过对用户可访问资源标识的配置,来控制鉴权。
可设定不受权限约束的超级管理员账号,对资源标识的配置可以采用通配符,如 dba-*
。
3. 约定
- 资源标识以 - 作为节分隔符
- 资源标识第一节用于表示连接,它表明了使用哪个数据库连接来查询
- 资源标识第一节在
api
接口的路径路由中独立出来,路由形如/{第一节连接}/{资源标识其它部分}
- 使用参数
page
表示页索引,size
表示页记录数 - 所有其它查询参数由
Query String
给出。 - 上下文参数:用户属性中可配置其相关的上下文参数值,用户标识总包含在上下文参数中
4. 数据库连接配置
数据库连接通道的相关必要属性:
- 连接标识(作为资源标识的前缀)
- 数据库类型
如sqlserver
/mysql
/postgresql
/... - 连接字符串。
5. 应用模型及其接口
5.1 模型定义
- 用户模型
CREATE TABLE acct_info(
acct_no varchar(40) NOT NULL primary key,
acct_pass varchar(40) NOT NULL,
acct_name varchar(80) NOT NULL,
is_super char(1) NOT NULL,
token varchar(255) NULL,
token_at datetime NULL,
state char](1) NOT NULL,
role_id varchar(20) NULL,
home_path varchar(255) NULL,
note varchar(255) NULL,
point int NOT NULL DEFAULT 0
)
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
acct_no | 是 | string | 用户账号 |
acct_pass | 是 | string | 密码 |
is_super | 是 | string | Y/N 是否超级管理员 |
acct_name | 是 | string | 名称 |
token | 是 | string | 登录授权码 |
token_at | 是 | string | 登录时间 |
state | 是 | string | Y/N/... |
...... | 否 | string | 其它辅助属性 |
- 用户上下文参数值配置模型
create table acct_context (
acct_no varchar(40),
k varchar(40),
v varchar(255),
state char(1) not null,
primary key (acct_no, k)
)
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
acct_no | 是 | string | 用户账号 |
k | 是 | string | 参数名 |
v | 是 | string | 参数值 |
state | 是 | string | Y/N 表示是否启用 |
- 数据库连接模型
create table link_info (
link_no varchar(40) primary key,
link_name varchar(80) not null,
db_type varchar(20) not null,
connect_string varchar(255) not null,
state char(1) not null
);
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
link_no | 是 | string | 连接标识 |
link_name | 是 | string | 连接名称 |
db_type | 是 | string |
sqlserver /mysql /postgresql /... 数据库类型 |
connect_string | 是 | string | 连接字符串 |
state | 是 | string | Y/N 表示是否启用 |
- 用户资源权限模型
create table link_info (
link_no varchar(40) primary key,
link_name varchar(80) not null,
db_type varchar(20) not null,
connect_string varchar(255) not null,
state char(1) not null
);
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
acct_no | 是 | string | 用户账号 |
service_id | 是 | string | 查询的资源标识,可使用正则表达式写法 |
state | 是 | string | Y/N 表示是否启用 |
5.2 模型数据接口化
- 取得账户信息
GetAcctInfo(string acct_no) - 判断是否有权访问
HasPermission(string acct_no, string service_id) - 取得连接信息
GetLinkInfo(string link_no)
6. API 接口定义规约
成功时
{
"err_code" : 200,
"err_msg" : "success",
"data" : [...] // 需要的相关数据
}
当分页时,增加 page
,rowcount
,pagecount
属性。
失败时
err_code 为 -1 表示未登录或登录过期无效等,101 表示失败
{
"err_code" : 101,
"err_msg" : "原因描述"
}
7. 日志
接口的调用记录日志。
- 日志模型
create table g_log
(
log_id bigint identity(1,1) NOT NULL primary key,
log_type varchar(200) NOT NULL,
log_title varchar(200) NOT NULL,
log_content varchar(max) NOT NULL,
log_at datetime NOT NULL,
log_note varchar(max),
day_string varchar(8) NOT NULL
)
- 存储接口
Log(type, title, content)
8. 具体实现
具体实现时,大体思路结构不变,细节有很多调整,后期慢慢分享。