一款接口快速开发框架 接口开发步骤
ccwgpt 2024-12-18 14:50 27 浏览 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的一些简单功能,如果大家感兴趣的话可以自行到官方网站去学习!或者你有更好的开发框架或意见也可在评论区留言。
相关推荐
- 盲盒小程序背后的技术揭秘:如何打造个性化购物体验
-
在2025年的今天,盲盒小程序作为一种新兴的购物方式,正以其独特的魅力和个性化体验吸引着越来越多的消费者。这种将线上购物与盲盒概念相结合的应用,不仅为消费者带来了未知的惊喜,还通过一系列技术手段实现了...
- 小程序·云开发已支持单日亿级调用量,接口可用率高达99.99%
-
2019-10-1914:1210月19日,由腾讯云与微信小程序团队联合举办的“小程序·云开发”技术峰会在北京召开。会上,微信小程序团队相关负责人表示“小程序·云开发”系统架构已经支持每天亿级别的...
- 程序员副业开启模式:8个GitHub上可以赚钱的小程序
-
前言开源项目作者:JackonYang今天推荐的这个项目是「list-of-wechat-mini-program-list」,开源微信小程序列表的列表、有赚钱能力的小程序开源代码。这个项目分为两部分...
- 深度科普:盲盒小程序开发的底层逻辑
-
在当下的数字化浪潮中,盲盒小程序以其独特的趣味性和互动性,吸引着众多消费者的目光。无论是热衷于收集玩偶的年轻人,还是享受拆盒惊喜的上班族,都对盲盒小程序情有独钟。那么,这种备受欢迎的盲盒小程序,其开发...
- 微信小程序的制作步骤
-
SaaS小程序制作平台,作为数字化转型时代下的创新产物,不仅将易用性置于设计的核心位置,让非技术背景的用户也能轻松上手,快速制作出功能丰富、界面精美的小程序,更在性能和稳定性方面投入了大量精力,以确保...
- 携程开源--小程序构建工具,三分钟搞定
-
前言今天推荐的这个项目是「wean」,一个小程序构建打包工具。在wean之前,大量小程序工具使用webpack进行打包,各种loader、plugin导致整个开发链路变长。wean旨在解...
- 校园小程序的搭建以及营收模式校园外卖程序校园跑腿校园圈子系统
-
校园小程序的架构设计主要包括云端架构和本地架构两部分。云端架构方面,采用Serverless架构可以降低技术门槛,通过阿里云、腾讯云等平台提供的云服务,可以实现弹性扩容和快速部署。例如,使用云数据库、...
- 盲盒小程序开发揭秘:技术架构与实现原理全解析
-
在2025年的今天,盲盒小程序作为一种结合了线上购物与趣味性的创新应用,正受到越来越多用户的喜爱。其背后的技术架构与实现原理,对于想要了解或涉足这一领域的人来说,无疑充满了神秘与吸引力。本文将为大家科...
- 月活百万的小程序架构设计:流量暴增秘籍
-
从小程序到"大"程序的蜕变之路当你的小程序用户量从几千跃升至百万级别时,原有的架构就像一件不合身的衣服,处处紧绷。这个阶段最常遇到的噩梦就是服务器崩溃、接口超时、数据丢失。想象一下,在...
- 认知智能如何与产业结合?专家学者共探理论框架与落地实践
-
当前,以大模型为代表的生成式人工智能等前沿技术加速迭代,如何将认知智能与产业结合,成为摆在各行各业面前的一个问题。论坛现场。主办方供图7月4日,2024世界人工智能大会暨人工智能全球治理高级别会议在...
- 现代中医理论框架
-
...
- 认知行为(CBT)中的ABC情绪理论
-
情绪ABC理论是由美国心理学家阿尔伯特·艾利斯(AlbertEllis1913-2007)创建的理论,A表示诱发性事件(Activatingevent),B表示个体针对此诱发性事件产生的一些信...
- 说说卡伦霍妮的理论框架,对你调整性格和人际关系,价值很大
-
01自在今天我主要想说下霍妮的理论框架。主要说三本书,第一本是《我们时代的神经症人格》,第二本是《我们内心的冲突》,第三本是《神经症与人的成长》。根据我的经验,三本书价值巨大,但并不是每个人都能读进去...
- 供应链管理-理论框架
-
一个最佳价值的供应链,应该是一个具有敏捷性、适应性和联盟功能(3A)的供应链,其基本要素包括战略资源、物流管理、关系管理以及信息系统,目标是实现速度、质量、成本、柔性的竞争优势。篇幅有...
- 微信WeUI设计规范文件下载及使用方法
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信Web开发量身设计,可以令用户的使用感知...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- scrapy框架 (52)
- beego框架 (42)
- java框架spring (43)
- grpc框架 (55)
- 前端框架bootstrap (42)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)