使用magic-api ,让你的开发效率蹭蹭提升

注意看目录

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.ssssssss</groupId>
    <artifactId>magic-api-spring-boot-starter</artifactId>
    <version>2.0.2</version>
</dependency>

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中

<!--        swagger配置  start-->
<dependency>
    <groupId>org.ssssssss</groupId>
    <artifactId>magic-api-plugin-swagger</artifactId>
    <version>2.0.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>swagger-bootstrap-ui</artifactId>
    <version>1.8.1</version>
</dependency>

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);
// 调用函数
Map<String, Object> params = 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

猜你喜欢

转载自blog.csdn.net/perfect2011/article/details/129808744