注意看目录

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 加入依赖

mysqlmysql-connector-javaorg.ssssssssmagic-api-spring-boot-starter2.0.2

3.2 application.yaml 配置

magic-api:web: /magic/webresource: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.ssssssssmagic-api-plugin-swagger2.0.2io.springfoxspringfox-swagger22.9.2io.springfoxspringfox-swagger-ui2.9.2com.github.xiaoyminswagger-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_matcherdatasource:realtime:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSourcejdbc-url: jdbc:mysql://172.36.2.121:3306/realtime" />@Configurationpublic 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 */@Beanpublic MagicDynamicDataSource magicDynamicDataSource(DataSource realtimeDs, DataSource historyDs) {MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource();// 设置默认数据源dynamicDataSource.setDefault(realtimeDs);dynamicDataSource.add("history", historyDs);return dynamicDataSource;}}

在脚本中使用

// 默认数据源 ->realtimeDsdb.select(sql)// 使用其他数据源db.history.select(finalSql)

9、java代码中调用脚本代码

9.1 java代码

//注入服务@AutowiredMagicAPIService magicAPIService;// 调用http接口magicAPIService.execute("get", "/state/road/event/type/count", null);// 调用函数Map params = new HashMap(1);params.put("data", cacheList);Object invoke = magicAPIService.invoke("/save_road_event", params);

9.2 脚本定义

函数定义如下,

var tableSql = """SELECTTABLE_NAME FROMINFORMATION_SCHEMA.TABLES WHERETABLE_SCHEMA = '${dbName}'AND TABLE_NAME in (#{tableNameList})"""var existTableListif (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_NAMEresultList.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 = """SELECTsubdistrict,speed,degree,b.max_time FROMsubdistrict_speed_${fullDayStr}_realtime a,( SELECT max( computedate ) max_time FROM subdistrict_speed_${fullDayStr}_realtime where district = #{district} ) b WHEREa.computedate = b.max_time AND district = #{district}ORDER BYdegree"""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