百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

一款接口快速开发框架 接口开发步骤

ccwgpt 2024-12-18 14:50 28 浏览 0 评论

在日常开发过程中我们总是需要写很多的CRUD接口,乏味且无聊。太多重复性的工作,会降低我们的工作热情!现在有这么一款框架,可以快速的帮助你编写这些接口,甚至包括一些复杂的逻辑处理,那么它就是magic-api。

magic-api 是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发

【已有上千家中小型公司使用,上万名开发者用于接口配置开发。上百名开发者参与提交了功能建议,接近20多名贡献者参与。已被gitee长期推荐。从首个版本开始不断优化升级,目前版本稳定,开发者交流群活跃。】

开源地址:https://gitee.com/ssssssss-team/magic-api

特性

  • 支持MySQL、MariaDB、Oracle、DB2、PostgreSQL、SQLServer 等支持jdbc规范的数据库
  • 支持非关系型数据库Redis、Mongodb
  • 支持集群部署、接口自动同步。
  • 支持分页查询以及自定义分页查询
  • 支持多数据源配置,支持在线配置数据源
  • 支持SQL缓存,以及自定义SQL缓存
  • 支持自定义JSON结果、自定义分页结果
  • 支持对接口权限配置、拦截器等功能
  • 支持运行时动态修改数据源
  • 支持Swagger接口文档生成
  • 基于magic-script脚本引擎,动态编译,无需重启,实时发布
  • 支持Linq式查询,关联、转换更简单
  • 支持数据库事务、SQL支持拼接,占位符,判断等语法
  • 支持文件上传、下载、输出图片
  • 支持脚本历史版本对比与恢复
  • 支持脚本代码自动提示、参数提示、悬浮提示、错误提示
  • 支持导入Spring中的Bean、Java中的类
  • 支持在线调试
  • 支持自定义工具类、自定义模块包、自定义类型扩展、自定义方言、自定义列名转换等自定义操作

快速开始

首先我们新建一个springboot工程,这里就不过多赘述,接下来引入magic-api依赖

<!-- 以spring-boot-starter的方式引用 -->
<dependency>
	<groupId>org.ssssssss</groupId>
    <artifactId>magic-api-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>

修改application.properties

magic-api:
  web: /magic/web # UI请求的界面以及UI服务地址
  resource: #配置存储方式
    type: database # 配置存储在数据库中
    tableName: magic_api_file_v2 # 数据库中的表名
    #datasource: magic #指定数据源(单数据源时无需配置,多数据源时默认使用主数据源,如果存在其他数据源中需要指定。)
    prefix: /magic-api # key前缀
    readonly: false # 是否是只读模式
  prefix: / # 接口前缀,可以不配置
  auto-import-module: db  # 自动导入的模块
  auto-import-package: java.lang.*,java.util.* #自动导包
  allow-override: false #禁止覆盖应用接口
  sql-column-case: camel #启用驼峰命名转换
  editor-config: classpath:./magic-editor.js #编辑器配置
  support-cross-domain: true # 跨域支持,默认开启
  #secret-key: 123456789 # 远程推送时的秘钥,未配置则不开启推送
  #push-path: /_magic-api-sync #远程推送的路径,默认为/_magic-api-sync
  show-sql: true #配置打印SQL
  compile-cache-size: 500 #配置编译缓存容量
  persistence-response-body: true #是否持久化保存ResponseBody
  date-pattern: # 配置请求参数支持的日期格式
    - yyyy-MM-dd
    - yyyy-MM-dd HH:mm:ss
    - yyyyMMddHHmmss
    - yyyyMMdd
  response: |- #配置JSON格式,格式为magic-script中的表达式
    {
      state: code == 1 ? 'success' : 'fail',
      msg: message,
      data,
      timestamp,
      requestTime,
      executeTime,
    }
  response-code:
    success: 1 #执行成功的code值
    invalid: 0 #参数验证未通过的code值
    exception: -1 #执行出现异常的code值
  banner: true # 打印banner
  thread-pool-executor-size: 8 # async语句的线程池大小
  throw-exception: false #执行出错时是否抛出异常
  backup: #备份相关配置
    enable: true #是否启用
    max-history: -1 #备份保留天数,-1为永久保留
    #datasource: magic  #指定数据源(单数据源时无需配置,多数据源时默认使用主数据源,如果存在其他数据源中需要指定。)
    table-name: magic_backup_record_v2 #使用数据库存储备份时的表名
  crud: # CRUD相关配置
    logic-delete-column: deleted #逻辑删除列
    logic-delete-value: 1 #逻辑删除值
  cache: # 缓存相关配置
    capacity: 10000 #缓存容量
    ttl: -1 # 永不过期
    enable: true # 启用缓存
  page:
    size: pageSize # 页大小的参数名称
    page: page # 页码的参数名称
    default-page: 1 # 未传页码时的默认首页
    default-size: 10 # 未传页大小时的默认页大小
  security:  # 安全配置
    username: admin # 登录用的用户名
    password: 123456 # 登录用的密码
  swagger:
    version: 1.0
    description: MagicAPI 接口信息
    title: MagicAPI Swagger Docs
    name: MagicAPI 接口
    location: /v2/api-docs/magic-api/swagger2.json
  debug:
    timeout: 60 # 断点超时时间,默认60s

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.1.197:3306/magic-api-test?allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
    username: root
    password: 123

从上面的配置文件我们可以看出magic-api支持配置存储方式数据库/磁盘,可以更好的迁移与备份;支持开始是否跨域,无需我们另外手写跨域配置;支持请求参数配置日期格式;支持配置统一的返回格式;支持在线编辑页面的登录管理;支持缓存配置;支持自定义插件引入;

启动项目

********************************************当前服务相关地址********************************************
服务启动成功,magic-api已内置启动! Access URLs:
接口本地地址: http://localhost:9999/
接口外部地址: http://192.168.57.1:9999/
接口配置平台: http://192.168.57.1:9999/magic/web/index.html
可通过配置关闭输出: magic-api.show-url=false
********************************************当前服务相关地址********************************************

项目启动成功我们可以看到输出的接口根目录与在线编辑的web地址

登录

访问http://localhost:9999/magic/web或者http://192.168.57.1:9999/magic/web/index.html进行操作


由于我们开启了登录验证,所以需要我们登录一下才能进入管理页面。magic-api也提供了登录方法的拦截器让我们自定义校验,通过这个拦截器我们可以实现和数据库的账号密码接入,实现员工一人一账号,下面是拦截器代码

#配置用户名密码
默认情况下是不配置用户名密码的。

如果需要可以通过以下配置开启用户名密码验证登录。

magic-api:
  security:
    username: admin # 登录用的用户名
    password: 123456 # 登录用的密码
#多用户登录
如果需要配置多用户登录,则需要使用自定义鉴权的方式。

/**
 * 自定义用户名密码登录
 */
@Component  //注入到Spring容器中
public class CustomAuthorizationInterceptor implements AuthorizationInterceptor {

	/**
     * 配置是否需要登录
	 */
	@Override
	public boolean requireLogin() {
		return true;
	}

	/**
     * 根据Token获取User
	 */
	@Override
	public MagicUser getUserByToken(String token) throws MagicLoginException {
		if (判断token是否有效) {
			return magicUser;   // 从token中获取MagicUser对象
		}
		throw new MagicLoginException("token无效");
	}

	@Override
	public MagicUser login(String username, String password) throws MagicLoginException {
		// 根据实际情况进行修改,如查询数据库。。
		if("admin".equals(username) && "admin".equals(password)){
			// 登录成功后 构造MagicUser对象。
			return new MagicUser("1","admin","tokenvalue......");
        }
		throw new MagicLoginException("用户名或密码不正确");
	}

}

管理页面

接下来我们输入配置的账号密码登录,进入管理页面


界面简介

整体说明

接口信息

RequestBody

ResponseBody

DEBUG


创建接口

1. 创建分组

点击创建分组按钮后,输入分组信息,点击创建。

2. 新建接口

右键分组,点击新建接口。

在编辑器输入内容后,填写接口名称和及其路径。

var sql = """
select * from test_data
"""

return db.select(sql)

ctrl+s保存后,即可访问接口。

3.访问接口

> curl http://localhost:9999/test/test

{
    "code": 1,
    "message": "success",
    "data": [
        {
            "id": 1,
            "name": "magicApi"
        },
        {
            "id": 2,
            "name": "xiaoDong"
        }
    ],
    "timestamp": 1638192442535,
    "executeTime": 9
}

? 也可以通过web界面执行。

通过以上几个步骤,我们就实现了一个简单的查询功能。省去了ControllerServiceDaoMapperXMLVO等模板代码的工作量。

脚本语法

#关键字

关键字

含义

var

定义变量

if

条件语句的引导词

else

用在条件语句中,表明当条件不成立时的分支

for

for循环语句

in

与for配合使用

while

while循环语句

continue

执行下一次循环

break

跳出循环

return

终止当前过程的执行并正常退出到上一个执行过程中

exit

终止当前脚本,并退出返回,如exit 200,'执行成功',[1,2,3]; v0.5.0中新增

assert

断言 v1.3.4中新增

instanceof

判断一个对象是否为一个类的实例 v2.0.0中新增

try

用于捕获可能发生异常的代码块

catch

与try关键字配合使用,当发生异常时执行

finally

与try关键字配合使用,finally块无论发生异常都会执行

import

导入Java类或导入已定义好的模块

as

与 import 关键字配合使用,用作将导入的 Java类或模块 命名为一个本地变量名

new

创建对象

true

基础类型之一,表示 Boolean 的:真值

false

基础类型之一,表示 Boolean 的:假值

null

基础类型之一,表示 NULL 值

async

异步调用

#运算符

数学运算

比较运算

逻辑运算

位运算

+

加法

<

小于

&&

并且

&、&=

-

减法

<=

小于等于

||

或者

|、|=

*

乘法

>

大于



^、^=

异或

/

除法

>=

大于等于



~、~=

取反

%

取模

==

等于



<<、<<=

左移

++

自增

!=

不等于



>>、>>=

右移

--

自减

===

等于



>>>、>>>=

无符号右移



!==

不等于





#类型

类型

写法

byte

123b、123B

short

123s、123S

int

123

long

123l、123L

float

123f、123F

double

123d、123D

BigDecimal

123m、123M

boolean

true、false

string

'hello'

string

"hello"

string

"""多行文本块,主要用于编写SQL"""

Pattern

/\d+/g,/pattern/gimuy 用于定义正则

lambda

()=>expr、(param1,param2....)=>{...}
()->expr、(param1,param2....)->{...}

list

[1,2,3,4,5]

map

{key : value,key1 : value}

{[key] : "value"} [key]表示动态从变量中获取key值

#一元运算符

您可以通过一元运算-符将数字取反,例如-234。要取反布尔表达式,可以使用!运算符,例如!true。 自增/自减 i++ 、 ++i、i--、--i

#算术运算符

支持常见的算术运算符,例如1 + 2 * 3 / 4 % 2,同样也支持+=、-=、*=、/=、%=

#比较运算符

23 < 34,23 <= 34,23 > 34,23 >= 34,true != false,23 == 34

比较运算符结果为boolean类型

#逻辑运算符

除了一元运算!符,您还可以使用&&和||。就像Java中一样,运算符也是一种短路运算符。如果&&左边计算为false,则不会计算右边。如果||左侧为true,则不会计算右边 在0.4.6+版本中增强了&& || 不再强制两边必须是布尔类型。作用与JS一样

#三元运算符

三元运算符是if语句的简写形式,其工作方式类似于Java中,例如true ? "yes" : "no" 在0.4.3+版本中,增强了if 和三元运算符,不再强制值必须是布尔类型,可以写if(xxx)的形式当xxx为以下情况时为fasle、其它情况为true

  • null
  • 空集合
  • 空Map
  • 空数组
  • 数值==0
  • 非空字符串
  • false

#类型转换

可使用::type(defaultValue) 的方式进行类型转换,如

var a = "123"::int; // 123
var b = "abc"::int(111); // 111
var c = "2020-01-01"::date('yyyy-MM-dd'); // 转换为date

#可选链操作符

可选链操作符(?.)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?.操作符的功能类似于.链式操作符,不同之处在于,在引用为空 的情况下不会引起错误,该表达式短路返回值是 null。

当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明。在探索一个对象的内容时,如果不能确定哪些属性必定存在,可选链操作符也是很有帮助的。

obj?.prop
obj?.method(args)

示例:

var a = null;
var b = a?.name;    // b = null;
var c = a?.getName();   // c = null;

#扩展运算符

扩展运算符,又叫展开语法(Spread syntax), 是用于将list或map在语法层面展开;

语法:

lambda 调用

var sum = (a,b,c) => a + b + c;
System.out.println(sum(...[1,2,3]))
/*
结果:6
*/

list 展开

var arr = [3,4,5];
System.out.println([1,2,...arr,6,7])
/*
结果:[1, 2, 3, 4, 5, 6, 7]
*/

list 展开到 map 中

var arr = [3,4,5];
System.out.println({key1:1,...arr})
/*
结果:{key1=1, 0=3, 1=4, 2=5}

虽然这些key看起来像数值,但其实是String类型的key,如果把它们转为JSON看起来是这样的:

{"key1":1, "0":3, "1":4, "2":5}

*/

map 展开

var map = {key2:2}
System.out.println({key1:1,...map,key3:3})
/*
结果:{key1=1, key2=2, key3=3}
*/

#for循环

当前for循环只支持两种,循环集合或Map

#循环集合

import 'java.lang.System' as System;
var list = [1,2,3];
for(index,item in list){    //如果不需要index,也可以写成for(item in list)
    System.out.println(index + ":" + item);
}
/*
结果:
0:1
1:2
2:3
*/

#循环指定次数

var sum = 0;
for(value in range(0,100)){    //包括0包括100
    sum = sum + value; //不支持+= -= *= /= ++ -- 这种运算
}
return sum;
/*
结果:5050
*/

#while循环

var count = 100;
var sum = 0;
while(count){
    sum = sum + count;
    count = count - 1;
}
return sum; // 5050

#循环map

import 'java.lang.System' as System;
var map = {
    key1 : 123,
    key2 : 456
};
for(key,value in map){    //如果不需要key,也可以写成for(value in map)
    System.out.println(key + ":" + value);
}
/*
结果:
key1:123
key2:456
*/

#Import导入

#导入Java类

import 'java.lang.System' as System;//导入静态类并赋值给system作为变量
import 'javax.sql.DataSource' as ds;//从spring中获取DataSource并将值赋值给ds作为变量
import 'org.apache.commons.lang3.StringUtils' as string;//导入静态类并赋值给ds作为变量
import 'java.text.*'    //此写法跟Java一致,在1.3.4中新增
System.out.println('调用System打印');//调用静态方法
System.out.println(ds);
System.out.println(string.isBlank('')); //调用静态方法
System.out.println(new SimpleDateFormat('yyyy-MM-dd').format(new Date())); // 2020-01-01

#new创建对象

#创建对象

import 'java.util.Date' as Date;//创建之前先导包,不支持.*的操作
return new Date();

#导入已定义的模块

import log; //导入log模块,并定义一个与模块名相同的变量名
//import log as logger; //导入log模块,并赋值给变量 logger
log.info('Hello {}','Magic API!')

#异步调用

#异步调用方法

var val = async db.select('.....'); // 异步调用,返回Future类型
return val.get();   //调用Future的get方法

#异步调用lambda

var list = [];
for(index in range(1,10)){
    list.add(async (index)=>db.selectInt('select #{index}'));
}
return list.map(item=>item.get());  // 循环获取结果

#exit

语法格式为 exit expr[,expr][,expr][,expr][,expr][,expr][,expr]....

在magic-api中只取前三个值,分别对应code、message、data

如:exit 400,'参数填写有误'

#assert

语法格式为 assert expr : expr[,expr][,expr][,expr][,expr][,expr][,expr].... 如:assert a == 1 : 400, 'a的值应为1' 相当于

if(a != 1){
    exit 400, 'a的值应为1'
}

#类型转换

通过::进行类型转换,如xxx::int、xxx::double等, 当前支持转换类型有int、double、long、byte、short、float、date

var a = "1";
return {
    v1: a::int,
    v2: a::int(0),  //转换失败时,值为0
    v3: "2020-01-01"::date('yyyy-MM-dd') //转为Date
}

? ::sql支持将数据转换为对应的sql类型, 比如:

img::sql('blob')

? 可传入的参数请参考java.sql.Types中定义的常量,不区分大小写。

#嵌入其它脚本语言

var name = "hello";
var test = ```javascript
    name + ' ~ world'
```;
return test();

文档/演示

  • 文档地址:https://ssssssss.org
  • 在线演示:https://magic-api.ssssssss.org

最后

本文仅仅演示magic-api的一些简单功能,如果大家感兴趣的话可以自行到官方网站去学习!或者你有更好的开发框架或意见也可在评论区留言。

相关推荐

团队管理“布阵术”:3招让你的团队战斗力爆表!

为何古代军队能够以一当十?为何现代企业有的团队高效似“特种部队”,有的却松散若“游击队”?**答案正隐匿于“布阵术”之中!**今时今日,让我们从古代兵法里萃取3个核心要义,助您塑造一支战斗力爆棚的...

知情人士回应字节大模型团队架构调整

【知情人士回应字节大模型团队架构调整】财联社2月21日电,针对原谷歌DeepMind副总裁吴永辉加入字节跳动后引发的团队调整问题,知情人士回应称:吴永辉博士主要负责AI基础研究探索工作,偏基础研究;A...

豆包大模型团队开源RLHF框架,训练吞吐量最高提升20倍

强化学习(RL)对大模型复杂推理能力提升有关键作用,但其复杂的计算流程对训练和部署也带来了巨大挑战。近日,字节跳动豆包大模型团队与香港大学联合提出HybridFlow。这是一个灵活高效的RL/RL...

创业团队如何设计股权架构及分配(创业团队如何设计股权架构及分配方案)

创业团队的股权架构设计,决定了公司在随后发展中呈现出的股权布局。如果最初的股权架构就存在先天不足,公司就很难顺利、稳定地成长起来。因此,创业之初,对股权设计应慎之又慎,避免留下巨大隐患和风险。两个人如...

消息称吴永辉入职后引发字节大模型团队架构大调整

2月21日,有消息称前谷歌大佬吴永辉加入字节跳动,并担任大模型团队Seed基础研究负责人后,引发了字节跳动大模型团队架构大调整。多名原本向朱文佳汇报的算法和技术负责人开始转向吴永辉汇报。简单来说,就是...

31页组织效能提升模型,经营管理团队搭建框架与权责定位

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!31页组织效能提升模型如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...

异形柱结构(异形柱结构技术规程)

下列关于混凝土异形柱结构设计的说法,其中何项正确?(A)混凝土异形柱框架结构可用于所有非抗震和抗震设防地区的一般居住建筑。(B)抗震设防烈度为6度时,对标准设防类(丙类)采用异形柱结构的建筑可不进行地...

职场干货:金字塔原理(金字塔原理实战篇)

金字塔原理的适用范围:金字塔原理适用于所有需要构建清晰逻辑框架的文章。第一篇:表达的逻辑。如何利用金字塔原理构建基本的金字塔结构受众(包括读者、听众、观众或学员)最容易理解的顺序:先了解主要的、抽象的...

底部剪力法(底部剪力法的基本原理)

某四层钢筋混凝土框架结构,计算简图如图1所示。抗震设防类别为丙类,抗震设防烈度为8度(0.2g),Ⅱ类场地,设计地震分组为第一组,第一自振周期T1=0.55s。一至四层的楼层侧向刚度依次为:K1=1...

结构等效重力荷载代表值(等效重力荷载系数)

某五层钢筋混凝土框架结构办公楼,房屋高度25.45m。抗震设防烈度8度,设防类别丙类,设计基本地震加速度0.2g,设计地震分组第二组,场地类别为Ⅱ类,混凝土强度等级C30。该结构平面和竖向均规则。假定...

体系结构已成昭告后世善莫大焉(体系构架是什么意思)

实践先行也理论已初步完成框架结构留余后人后世子孙俗话说前人栽树后人乘凉在夏商周大明大清民国共和前人栽树下吾之辈已完成结构体系又俗话说青出于蓝而胜于蓝各个时期任务不同吾辈探索框架结构体系经历有限肯定发展...

框架柱抗震构造要求(框架柱抗震设计)

某现浇钢筋混凝土框架-剪力墙结构高层办公楼,抗震设防烈度为8度(0.2g),场地类别为Ⅱ类,抗震等级:框架二级,剪力墙一级,混凝土强度等级:框架柱及剪力墙C50,框架梁及楼板C35,纵向钢筋及箍筋均采...

梁的刚度、挠度控制(钢梁挠度过大会引起什么原因)

某办公楼为现浇钢筋混凝土框架结构,r0=1.0,混凝土强度等级C35,纵向钢筋采用HRB400,箍筋采用HPB300。其二层(中间楼层)的局部平面图和次梁L-1的计算简图如图1~3(Z)所示,其中,K...

死要面子!有钱做大玻璃窗,却没有钱做“柱和梁”,不怕房塌吗?

活久见,有钱做2层落地大玻璃窗,却没有钱做“柱子和圈梁”,这样的农村自建房,安全吗?最近刷到个魔幻施工现场,如下图,这栋5开间的农村自建房,居然做了2个全景落地窗仔细观察,这2个落地窗还是飘窗,为了追...

不是承重墙,物业也不让拆?话说装修就一定要拆墙才行么

最近发现好多朋友装修时总想拆墙“爆改”空间,别以为只要避开承重墙就能随便砸!我家楼上邻居去年装修,拆了阳台矮墙想扩客厅,结果物业直接上门叫停。后来才知道,这种配重墙拆了会让阳台承重失衡,整栋楼都可能变...

取消回复欢迎 发表评论: