注意看目录
1、magic-api 是什么
一个基于Java的接口快速开发框架,通过magic-api提供的UI界面完成编写接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发
2、magic-api 相关资料
官网:https://ssssssss.org
示例:ssssssss-team/magic-api-example
demo:https://magic-api.ssssssss.org
源码:magic-api: magic-api 是一个基于Java的接口快速开发框架,通过magic-api提供的UI界面完成编写接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发
quickstart:简介 | magic-api
3、入门
3.1 加入依赖
mysql mysql-connector-javaorg.ssssssss magic-api-spring-boot-starter2.0.2
3.2 application.yaml 配置
magic-api: web: /magic/web resource: location: classpath:magic-api # type: database # 存到数据库 # table-name: magic_api_file # 表名 # prefix: /magic-api # ?? response-code: success: 200 #执行成功的code值 invalid: 400 #参数验证未通过的code值 exception: 500 #执行出现异常的code值 backup: #备份相关配置 enable: true #是否启用 max-history: -1 #备份保留天数,-1为永久保留 table-name: magic_backup_record_v2 #使用数据库存储备份时的表名 swagger-config: # 文档名称 name: MagicAPI # 文档标题 title: MagicAPI Swagger Docs # 文档描述 description: MagicAPI # 文档版本号 version: 1.0 # 文档资源位置 location: /v2/api-docs/magic-api/swagger2.json
在服务启动后,在控制台可以看到访问地址。
4、数据库建表语句
最初的时候将配置文件放在mysql中,数据库建表语句如下。
CREATE TABLE `magic_api_file` ( `file_path` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `file_content` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, PRIMARY KEY (`file_path`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
看到上面配置中备份开启了相关的配置,注:在每次修改的时候增量备份
CREATE TABLE `magic_backup_record_v2` ( `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '原对象ID', `create_date` bigint NOT NULL COMMENT '备份时间', `tag` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签', `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类型', `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '原名称', `content` blob COMMENT '备份内容', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '操作人', PRIMARY KEY (`id`,`create_date`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
5、swagger配置
接口的对接使用swagger,官方也提供了方案。
pom中增加依赖,application中的配置在3.2中
org.ssssssss magic-api-plugin-swagger2.0.2 io.springfox springfox-swagger22.9.2 io.springfox springfox-swagger-ui2.9.2 com.github.xiaoymin swagger-bootstrap-ui1.8.1
application.yml中配置
spring: mvc: pathmatch: matching-strategy: ant_path_matcher
注:这里加了两个UI,springfox-swagger-ui 是自带的,没有搜索功能,界面不怎么好
swagger-bootstrap-ui 界面比较友好,有搜索功能,也可以替换自己喜欢的其他UI
http://172.26.8.17:8080/swagger-ui.html
http://172.26.8.17:8080/doc.html
6、访问请求变量
request模块 | magic-api一个基于VuePress的 知识管理&博客 主题https://www.ssssssss.org/magic-api/pages/module/request/#%E5%BC%95%E7%94%A8%E6%A8%A1%E5%9D%97直接上文档
request模块 | magic-api一个基于VuePress的 知识管理&博客 主题https://www.ssssssss.org/magic-api/pages/module/request/#%E5%BC%95%E7%94%A8%E6%A8%A1%E5%9D%97
7、脚本中怎么使用java类
先导入,然后正常使用
import com.xin.util.DateUtil; var shortDayStr = DateUtil.getShortDayStr(new Date());
8、多数据源配置
8.1 application.yml
spring: mvc: pathmatch: matching-strategy: ant_path_matcher datasource: realtime: driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource jdbc-url: jdbc:mysql://172.36.2.121:3306/realtime?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai username: xxx password: xxx history: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://172.36.2.121:3306/history?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai username: xxx password: xxx
8.2 注册数据源到magic-api
主要是将数据源注册到MagicDynamicDataSource ,设置一个作为默认数据源
@Configuration public class DataSourceConfig { /** * 实时数据库 */ @Bean(name = "realtimeDs") @ConfigurationProperties(prefix = "spring.datasource.realtime") public DataSource dataSourceRealtime() { return DataSourceBuilder.create().build(); } /** * 历史数据库 */ @Bean(name = "historyDs") @ConfigurationProperties(prefix = "spring.datasource.history") public DataSource dataSourceHistory() { return DataSourceBuilder.create().build(); } /** * 注入数据库到magic */ @Bean public MagicDynamicDataSource magicDynamicDataSource(DataSource realtimeDs, DataSource historyDs) { MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource(); // 设置默认数据源 dynamicDataSource.setDefault(realtimeDs); dynamicDataSource.add("history", historyDs); return dynamicDataSource; } }
在脚本中使用
// 默认数据源 ->realtimeDs db.select(sql) // 使用其他数据源 db.history.select(finalSql)
9、java代码中调用脚本代码
9.1 java代码
//注入服务 @Autowired MagicAPIService magicAPIService; // 调用http接口 magicAPIService.execute("get", "/state/road/event/type/count", null); // 调用函数 Mapparams = new HashMap<>(1); params.put("data", cacheList); Object invoke = magicAPIService.invoke("/save_road_event", params);
9.2 脚本定义
函数定义如下,
var tableSql = """ SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '${dbName}' AND TABLE_NAME in (#{tableNameList}) """ var existTableList if (dbName =='history'){ existTableList = db.history.select(tableSql) }else if (dbName =='trans_road_net'){ existTableList = db.road.select(tableSql) }else{ existTableList = db.select(tableSql) } var resultList = [] for (index,obj in existTableList){ var tableName = obj.TABLE_NAME resultList.add(tableName) } return resultList
http接口正常定义,在传递参数的时候注意包装成map,参数的key为需要传递的参数名,作为上下文
10、脚本之间互相调用
10.1函数调用
函数定义见9.2
//引入函数 import '@/check_table' as check_table; // 调用函数 var existTableList = check_table(inStr,DBEnum.TRANS_ROAD_NET.dbName)
10.2 接口间互相调用
import '@get:testtb' as testtb; var tableNameList = "bz_map" var dbName = "road_state_dev" var l = testtb() return l
可以看到函数和接口之间的区别在于接口前增加了请求方式
11、字符串替代
主要区别在于${}用于拼接SQL(会产生SQL注入问题),#{}会替换成占位符(不会产生SQL注入问题),这里的区别与Mybatis一致
因为我在开发中使用的表示动态表,在表名的替换上使用$,在参数上使用#
import request; var fullDayStr = DateUtil.getFullDayStr(new Date()); var sql = """ SELECT subdistrict, speed, degree, b.max_time FROM subdistrict_speed_${fullDayStr}_realtime a, ( SELECT max( computedate ) max_time FROM subdistrict_speed_${fullDayStr}_realtime where district = #{district} ) b WHERE a.computedate = b.max_time AND district = #{district} ORDER BY degree """ return db.road.select(sql);
12、生产环境的发布
主要是为了避免被修改,而且避免数据库的导入导出,所以直接打包到jar中
12.1 接口导出
右上角点击导出按钮,会导出一个压缩包
12.2 解压后放到resources目录下
在resource目录下创建一个magic-api目录,将解压后的文件放到下面
12.3 修改配置
magic-api: web: /magic/web resource: location: classpath:magic-api
注意:官网上抄的classpath后会有空格,导致报错,中间没有空格
总结
magic-api 总体来说还是非常方便,在做一些中小型项目的时候可以轻易的解决问题,但是在一些对代码性能要求比较高,对代码自由度比较高的场景不太适合。
magic-api还有很多特性,因为在项目中没有使用,这次就没做探索
推荐书了:
19个新媒体大类(视频、音频、直播、社群、微博、社区团购、行业垂直、知识付费、信息资讯、传统电商、社交交友、运动健身、资讯搜索、地图导航、旅游、网站、浏览器、本地生活、其他热门App),引导新媒体全网运营;17个章带你打通全网数字化营销。
一本新媒体百科全书,让你用一本书实现新媒体全网运营一本通!
京东自营购买链接:https://item.jd.com/13808176.html