在我看来,dataway是一个快速的构建接口的构件。
有了dataway,接口不需要写业务代码,可以直接快速发布。
其原理大概类似于。数据库存放url和sql的映射。到时候执行哪个url就对应执行哪条sql就是了。
dataway如果想做些一般复杂的事情的逻辑的话,是需要自己的语言dataQL的.但是由于其是弱语言,其实并不擅长做更复杂的事情。
dataway是需要挂靠在web服务器上的,所以会配置tomcat及server.port
dataway是基于数据库存储映射关系,所以也需要配置数据库
maven:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 引入依赖 -->
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-spring</artifactId>
<version>4.1.8</version><!-- 查看最新版本:https://mvnrepository.com/artifact/net.hasor/hasor-spring -->
</dependency>
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-dataway</artifactId>
<version>4.1.8</version><!-- 查看最新版本:https://mvnrepository.com/artifact/net.hasor/hasor-dataway -->
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import net.hasor.spring.boot.EnableHasor;
import net.hasor.spring.boot.EnableHasorWeb;
@EnableHasor
@EnableHasorWeb
@SpringBootApplication
public class DataWayApp {
public static void main(String[] args) {
SpringApplication.run(DataWayApp.class, args);
}
}
dataway配置类:
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.hasor.core.ApiBinder;
import net.hasor.core.DimModule;
import net.hasor.dataway.spi.ApiInfo;
import net.hasor.dataway.spi.PreExecuteChainSpi;
import net.hasor.dataway.spi.ResultProcessChainSpi;
import net.hasor.db.JdbcModule;
import net.hasor.db.Level;
import net.hasor.spring.SpringModule;
import net.hasor.utils.future.BasicFuture;
@DimModule
@Component
public class DataWayConfig implements SpringModule{
@Autowired
private DataSource dataSource;
@Override
public void loadModule(ApiBinder apiBinder) throws Throwable {
/**
* 绑定数据源
*/
apiBinder.installModule(new JdbcModule(Level.Full, dataSource));
apiBinder.bindSpiListener(PreExecuteChainSpi.class, new PreExecuteChainSpi() {
/**
* 前置过滤器,可以进行校验等操作
* 如果设置了future,该接口将直接返回future.不再继续执行.可以实现缓存.
*
*/
@Override
public void preExecute(ApiInfo apiInfo, BasicFuture<Object> future) {
Map<String, Object> parameterMap = apiInfo.getParameterMap();//参数
String apiPath = apiInfo.getApiPath();//获取url
System.out.println("===preExecute");
}
});
apiBinder.bindSpiListener(ResultProcessChainSpi.class, new ResultProcessChainSpi() {
/**
* 后置过滤器
* 可以获取到返回值.对返回值统一处理
*/
@Override
public Object callAfter(boolean formPre, ApiInfo apiInfo, Object result) {
System.out.println("=====callAfter");
Map<String, Object> optionMap = apiInfo.getOptionMap();
optionMap.put("resultStructure", false);//设置自定义返回值格式,不再拘于默认结构
apiInfo.setOptionMap(optionMap);
/**
* 返回对象
*/
Map<String,Object>map = new HashMap<>();
map.put("code", 0);
map.put("body", result);
return map;
}
/**
* 如果出现异常怎么做
*/
@Override
public Object callError(boolean formPre, ApiInfo apiInfo, Throwable e) {
return ResultProcessChainSpi.super.callError(formPre, apiInfo, e);
}
});
}
}
application.properties
server.port=8080
spring.datasource.url=jdbc:mysql://192.168.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driverClassName=com.mysql.jdbc.Driver
logging.level.root=info
# 启用 Dataway 功能(默认不启用)
HASOR_DATAQL_DATAWAY=true
# 开启 ui 管理功能(注意生产环境必须要设置为 false,否则会造成严重的生产安全事故)
HASOR_DATAQL_DATAWAY_ADMIN=true
# (可选)API工作路径
HASOR_DATAQL_DATAWAY_API_URL=/api/
# (可选)ui 的工作路径,只有开启 ui 管理功能后才有效
HASOR_DATAQL_DATAWAY_UI_URL=/admin/
数据库
CREATE TABLE `interface_info` (
`api_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`api_method` varchar(12) NOT NULL COMMENT 'HttpMethod:GET、PUT、POST',
`api_path` varchar(512) NOT NULL COMMENT '拦截路径',
`api_status` int(2) NOT NULL COMMENT '状态:0草稿,1发布,2有变更,3禁用',
`api_comment` varchar(255) NULL COMMENT '注释',
`api_type` varchar(24) NOT NULL COMMENT '脚本类型:SQL、DataQL',
`api_script` mediumtext NOT NULL COMMENT '查询脚本:xxxxxxx',
`api_schema` mediumtext NULL COMMENT '接口的请求/响应数据结构',
`api_sample` mediumtext NULL COMMENT '请求/响应/请求头样本数据',
`api_option` mediumtext NULL COMMENT '扩展配置信息',
`api_create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`api_gmt_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`api_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='Dataway 中的API';
CREATE TABLE `interface_release` (
`pub_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Publish ID',
`pub_api_id` int(11) NOT NULL COMMENT '所属API ID',
`pub_method` varchar(12) NOT NULL COMMENT 'HttpMethod:GET、PUT、POST',
`pub_path` varchar(512) NOT NULL COMMENT '拦截路径',
`pub_status` int(2) NOT NULL COMMENT '状态:0有效,1无效(可能被下线)',
`pub_type` varchar(24) NOT NULL COMMENT '脚本类型:SQL、DataQL',
`pub_script` mediumtext NOT NULL COMMENT '查询脚本:xxxxxxx',
`pub_script_ori` mediumtext NOT NULL COMMENT '原始查询脚本,仅当类型为SQL时不同',
`pub_schema` mediumtext NULL COMMENT '接口的请求/响应数据结构',
`pub_sample` mediumtext NULL COMMENT '请求/响应/请求头样本数据',
`pub_option` mediumtext NULL COMMENT '扩展配置信息',
`pub_release_time`datetime DEFAULT CURRENT_TIMESTAMP COMMENT '发布时间(下线不更新)',
PRIMARY KEY (`pub_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='Dataway API 发布历史。';
create index idx_interface_release on interface_release (pub_api_id);
interface_release是发布版本的接口信息,可以用来回滚.interface_info是存储接口信息,包括修改或者垃圾箱里等
启动main方法运行,
启动日志里面包含下面的语句
...
dataway api workAt /api/
...
...
dataway admin workAt /admin/
...
我们打开浏览器输入localhost:8080/admin/就可以看到控制台