一款接口快速开发框架
mhr18 2024-12-24 12:24 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界面执行。
通过以上几个步骤,我们就实现了一个简单的查询功能。省去了Controller、Service、Dao、Mapper、XML、VO等模板代码的工作量。
脚本语法
#关键字
关键字 | 含义 |
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....)=>{...} |
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的一些简单功能,如果大家感兴趣的话可以自行到官方网站去学习!或者你有更好的开发框架或意见也可在评论区留言。
- 上一篇:批处理相关技术在支付业务系统中的应用
- 下一篇:上海公司大数据面试题(面经)
相关推荐
- mysql一 基本操作(mysql基础操作命令)
-
先讲数据库--mysql、redis、MongoDB爬虫今天的内容:mysql一基本操作注意事项:1.安装:自己安装,有问题可以问老师、可以自己找办法解决2.上课:先讲知识点再回答问题3....
- 香港DM德馬景泰藍文科集團20250702期《生命的收獲》LIN JING DE
-
香港DM德馬景泰藍文科集團20250702期《生命的收獲》DMSIXSEVEN/LINJINGDE/1973主編供圖:香港DM德馬數字甲骨文集團Hongkong-basedDMDelm...
- 01.Java发展历史(java发展简史)
-
1.Java发展历史Java由SunMicrosystems公司(现为Oracle公司)的JamesGosling及其团队在1991年开发,最初命名为"Oak",后改名为"...
- 月薪最高12000!看看这些宝山岗位有没有你心仪的~
-
招聘目录信息1猎上网络科技(上海)有限公司职位分析师职位分析师助理2上海祥腾金属材料有限公司商务车驾驶员3上海赋拓物联网技术有限公司软件测试工程师4上海集优标五高强度紧固件有限公司...
- 69岁的Java之父终于退休了,他竟然也经历过职场PUA
-
有些程序员不到35岁就要担心被优化,但有的程序员干到了69岁的高龄,才准备退休。就前几天,Java之父詹姆斯·高斯林,自个儿在领英上宣布以后要美美享受退休生活了。这一下子,就炸出了不少...
- ocm认证年薪多少?(ocm认证好考吗)
-
从业数据库方面的工程师待遇都很好,年薪30万都是比较平常的事。OCM认证的价值可以归纳成以下几点:1、可以全面掌握Oracle知识,专业知识完善;2、证书对于公司招投标有巨大作用,甚至可以不上班就拿钱...
- 自学java开发攻略,想做程序员的必备攻略?
-
背景现阶段,随着互联网的快速发展,程序员这个行业越来月吃香,不仅仅是因为科技先进,说出去很牛逼,让别人产生崇拜,主要原因是程序员行业薪资待遇好,相比国内其他行业,程序员的薪资待遇是羡慕了很多人呢!于是...
- SpringBoot WebFlux整合R2DBC实现数据库反应式编程
-
环境:Springboot2.4.12R2DBC简介SpringdataR2DBC是更大的Springdata系列的一部分,它使得实现基于R2DBC的存储库变得容易。R2DBC代表反应式关系数...
- AI编码工具未能代替码农:大模型的局限性揭秘
-
随着ChatGPT和GithubCopilot等AI编码工具的兴起,StackOverflow近日因流量减少宣布裁员近三分之一。这引发了一个争议的问题:ChatGPT这类AI编码工具,真的要颠覆整...
- 大模型无法替代码农!GPT-4解决GitHub编程问题成功率为0
-
编辑:编辑部【新智元导读】ChatGPT之类的AI编码工具来势汹汹,StackOverflow又裁员了!不过,普林斯顿和芝大竟发现,面对真实世界GitHub问题,GPT-4的解决率竟是0%。Stac...
- 机器人动作领域突破!UniVLA模型实现跨模态AI机器人动作统一
-
还记得《星际穿越》中那台能在无重力、尘暴甚至巨浪中切换形态、随时理解库珀指令的TARS多功能机器人吗?在银幕里,我们羡慕TARS能听懂人话、看懂环境、马上给出最合适的动作;而在现实世界的实验室里,“让...
- FEA-Bench:首个仓库级新功能实现基准,让大模型更懂软件开发
-
当前,大语言模型在代码生成领域已展现出惊人的能力,但能否胜任真实软件开发中的“新增功能实现”任务,仍是一个关键未解的问题。对此,微软亚洲研究院与北京大学联合发布了首个专注于仓库级新功能实现的基准测试...
- 基于Java的软件版本信息管理系统-2025计算机毕业设计
-
基于Java的软件版本信息管理系统-2025计算机毕业设计前言随着移动互联网的快速发展,APP已成为人们日常生活中不可或缺的一部分。为了高效地管理这些APP的信息,如版本更新、用户反馈、下载量统计等,...
- 马斯克在干嘛?抱着它现身推特 简介改为“推特老板”
-
马斯克收购推特的交易真是“没完没了”。据彭博社报道,当地时间26日,美国亿万富翁埃隆·马斯克抱着水槽走进了推特公司的旧金山总部,他还将自己在推特账号的公开自我介绍改为“推特老板”(ChiefTw...
- 福布斯公布7月全球十大富豪:马斯克成6月最大“输家”,身家缩水160亿美元
-
7月日,福布斯今日公布了2025年7月全球十大富豪榜,其中第二名迎来新面孔。软件巨头甲骨文(Oracle)联合创始人兼董事长拉里埃里森(LarryEllison)凭借公司股价飙升成功上位。由...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)