1.概述magic-api是⼀个基于Java的接⼝快速开发框架,编写接⼝将通过magic-api提供的UI界⾯完成,⾃动映射为HTTP接⼝,⽆需定义Controller、Service、Dao、Mapper、
XML、VO等Java对象。
只不过这种⽅式虽然简单,但⽆法处理复制的业务逻辑。对于复杂的业务逻辑,还是使⽤java代码进⾏实现。注意要保证⼆者的接⼝路径不重复。
2.实战演练2.1项⽬准备1)新建⼀个SpringBoot的项⽬,导⼊数据库需要的依赖:
2)新建数据库和表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8_bin DEFAULT NULL, `password` varchar(255) COLLATE utf8_bin DEFAULT NULL, `addr` varchar(500) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
3)在配置⽂件配置数据源
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/db2020?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root
password: zys123456
2.2 加⼊magic-api1)在pom.xml中添加magic-api相关依赖:
2)在配置⽂件配置magic-api相关信息
magic-api:
# 配置api管理页⾯⼊⼝ web: /magic/web # 配置存储⽅式 resource:
# 配置接⼝资源存储位置,可选file、database、redis type: database # 存储表名
tableName: magic_api_file
# 使⽤database、redis存储时的key前缀 prefix: /db2020 # 是否是只读模式 readonly: false # 启⽤驼峰命名转换 sql-column-case: camel # 分页配置 page-config:
# 页⼤⼩的请求参数名称 size: size
# 页码的请求参数名称 page: page
# 未传页码时的默认页码 default-page: 1
# 未传页⼤⼩时的默认页⼤⼩ default-size: 10
3)创建表magic_api_file,⽤来存储接⼝的配置信息
CREATE TABLE `magic_api_file`(
`id` bigint(255) NOT NULL AUTO_INCREMENT, `file_path` varchar(255) DEFAULT NULL, `file_content` text, PRIMARY KEY (`id`))
默认是⽩⾊,可点击⽪肤设置⿊⾊。
4.基本⽤法4.1添加操作1)在接⼝列表中添加添加按钮,添加⼀个分组并设置分组前缀
2)在创建的分组中选择右键,新建⼀个接⼝,填写接⼝的相关信息和执⾏脚本,如下图:
右侧区域是编辑框,⾥⾯主要编写magic的执⾏脚本,添加如下脚本:
return db.table('user').insert(body);
在底部的接⼝信息中进⾏如下配置,POST请求,请求路径为/create,请求参数放在请求body中,是json字符串:
{
\"username\":\"zhangsan\", \"password\":\"123\", \"addr\":\"湖北武汉\"}
点击右上⾓的执⾏按钮,在执⾏结果中看到返回了success,说明添加成功。在数据库中查询,数据已经添加进来。
4.2修改操作1)添加修改的接⼝,输⼊执⾏脚本
return db.table('user').primary('id',body.id).update(body);
2)在接⼝信息中进⾏如下配置,POST请求,请求路径为/update,请求参数放在请求body中:
修改id等于3的⽤户的密码和地址。
4.3删除操作1)添加删除的接⼝,输⼊执⾏脚本
return db.update('delete from user where id=#{id}');
2)在接⼝信息中进⾏如下配置,POST请求,请求路径为/del/{id},请求参数放在路径变量中:
3)点击执⾏按钮,会把数据删除,返回执⾏的结果。
4.4查询操作4.4.1根据id查询1)新建⼀个接⼝,添加执⾏脚本:
// 路径变量从path对象中获取return db.table('user') .where()
.eq('id',path.id) .selectOne();
2)在接⼝信息中进⾏如下配置,GET请求,请求路径为/one/{id},请求参数放在路径变量中:
3)点击执⾏按钮,若有数据,则会返回数据,没有数据则data的值是null
4.4.2 分页查询由于已在配置⽂件中配置了分页的参数信息,故这⾥直接使⽤。1)新建⼀个接⼝,添加执⾏脚本:
return db.table('user').page();
2)在接⼝信息中进⾏如下配置,GET请求,请求路径为/page,请求参数放在请求参数中:
3)点击执⾏按钮,若有数据,则会返回数据,没有数据则data的值是null。
5.magic语法详解5.1db模块(1)db是默认引⼊的模块,使⽤此模块操作数据库,需要使⽤return把结果返回。
(2)db.table()就指定了表名,可以使⽤期⾃带的⽅法进⾏查询等操作,但其只能对单表进⾏操作,多表⽆法使⽤。(3)除了使⽤⾃带的⽅法外,还可以⾃定义sql进⾏操作。具体见后⾯的章节
5.2⾃定义查询1)select()根据sql查询结果,返回的是list集合。
return db.select('select * from user')
若需要携带参数,可以使⽤#{}进⾏占位,其他查询类似:
return db.select('select * from user where id = #{id} ')
2)selectInt()根据sql查询结果,返回的是int值。
return db.selectInt('select count(*) from user')
3)selectOne()查询单个对象,其返回值必须是⼩于等于⼀条数据,不能超过⼀条。
return db.selectOne('select * from user where id = #{id} ')
使⽤db.tableI()⽅式进⾏对⽐:
return db.table('user') .where()
.eq('id',path.id) .selectOne();
两种⽅式的效果⼀样,只不过使⽤的模式不⼀样。4)selectValue()查询单个列的值。若查询结果是多条,则只会返回第⼀条数据的对应字段信息。
return db.selectValue('select username from user where id = #{id}');
5)page()分页查询。要传递分页的条件(当前页码page,每页条数size),会返回数据总条数和数据集合。
return db.page('select * from user')
使⽤db.tableI()⽅式进⾏对⽐:
return db.table('user').page()
两种⽅式的效果是⼀样的,可⾃由选择。6)update()
对于增删改操作,都可以使⽤此⽅法,不过⼀般删除会使⽤此⽅法,添加和修改均使⽤db.table()⽅式。原因是此⽅法必须使⽤get请求传递参数,不安全。
return db.update('delete from user where id=#{id}');
如根据id进⾏修改:使⽤post请求,把需要修改的字段和值使⽤json字符串⽅式传递即可,可参考4.2⼩节的说明。
return db.table('user').primary('id',body.id).update(body);
6.集成Swagger当接⼝很多时,想查询接⼝及路径,Swagger是⼀个不错的选择。⽽magic也可以和Swagger进⾏⽆缝整合。1)导⼊Swagger相关依赖
2)在配置⽂件application.yml中添加Swagger相关配置。
magic-api:
# 集成Swagger配置 swagger-config: # ⽂档名称
name: MagicAPI # ⽂档标题
title: MagicAPI Swagger Docs # ⽂档描述
description: MagicAPI # ⽂档版本号 version: 1.0 # ⽂档资源位置
location: /v2/api-docs/magic-api/swagger2.json
7.拦截器配置在开发环境,可以使⽤magic进⾏接⼝的开发,但是在正式环境中,其页⾯是不能暴露出来的,同时swagger在正式环境也不能暴露。故需要拦截器进⾏拦截,同时其⾃带SQL的拦截器,可以打印SQL的⽇志信息。新建⼀个类,进⾏配置,具体见源码:
/**
* 拦截器配置 */
@Component
public class MyInterceptor implements SQLInterceptor, HandlerInterceptor { Logger logger = LoggerFactory.getLogger(this.getClass()); @Value(\"${isAllowed}\") private Boolean isAllowed;
/***
* ⾃定义SQL拦截器,打印sql及参数 * @param boundSql * @param requestEntity */
@Override
public void preHandle(BoundSql boundSql, RequestEntity requestEntity) { logger.warn(\"执⾏的SQL===> \" + boundSql.getSql());
logger.warn(\"执⾏的SQL参数===> \" + Arrays.toString(boundSql.getParameters())); }
/**
* 配置资源拦截器,开发页⾯只能在开发中使⽤,在正式环境拦截 *
* @param request * @param response * @param handler * @return */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { if (!isAllowed) {
Map response.setCharacterEncoding(\"utf-8\"); response.setHeader(\"Content-type\", \"text/html;charset=UTF-8\"); response.getWriter().write(JSON.toJSONString(result)); return false; } return true; }} 另外还需要⼀个MVC的配置其注⼊拦截器和要拦截的资源: /** * mvc配置,注⼊拦截器 */ @Configuration public class MyWebMvcConfigurer implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //addPathPatterns表⽰拦截所有请求,excludePathPatterns表⽰不拦截的请求 registry.addInterceptor(myInterceptor).addPathPatterns(\"/swagger-ui.html\").addPathPatterns(\"/magic/**\"); }} 这样⼀来,就可以通过修改isAllowed的值选择是否可访问。到这⾥,基本的接⼝开发已经完成,只需前端进⾏整合即可。 因篇幅问题不能全部显示,请点此查看更多更全内容