magic-api简介

  • magic-api 是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发。
  • 之前我们开发一个接口,至少需要Controller,Service,Dao,Mapper文件,还需要各种配置,搭建启动springboot项目,发布完成,接口才能访问,接口才算完成。

项目准备

1)新建一个SpringBoot的项目,导入数据库需要的依赖:

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>

2)新建数据库和表

3)在配置文件配置数据源

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root

2.2 加入magic-api⭐

1)在pom.xml中添加magic-api相关依赖:

<dependency>
    <groupId>org.ssssssss</groupId>
    <artifactId>magic-api-spring-boot-starter</artifactId>
    <version>1.2.1</version>
</dependency>

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)启动项目,访问http://localhost:8080/magic/web,即可进入magic的管理页面

基本用法

添加

return db.table('user').insert(body);

修改

return db.table('user').primary('id',body.id).update(body);

删除

return db.update('delete from user where id=#{id}');

查询

return db.table('user'
.where()
.eq('id',path.id)
.selectone();

分页查询

magic语法

  1. db模块
    (1)db是默认引入的模块,使用此模块操作数据库,需要使用return把结果返回。
    (2)db.table()就指定了表名,可以使用期自带的方法进行查询等操作,但其只能对单表进行操作,多表无法使用。
  2. 自定义查询

根据sql查询结果,返回的是list集合。select()

return db.select('select * from user')

若需要携带参数,可以使用#{}进行占位,其他查询类似。select()

return db.select('select * from user where id = #{id} ')

根据sql查询结果,返回的是int值。selectInt()

return db.selectInt('select count(*) from user')

查询单个对象,其返回值必须是小于等于一条数据,不能超过一条。selectOne()

return db.selectOne('select * from user where id = #{id} ')

查询单个列的值。若查询结果是多条,则只会返回第一条数据的对应字段信息。selectValue()

return db.selectValue('select username from user where id = #{id}'); 

分页查询。要传递分页的条件(当前页码page,每页条数size),会返回数据总条数和数据集合。page()

return db.page('select * from user')

return db.table('user').page()

对于增删改操作,都可以使用此方法,不过一般删除会使用此方法,添加和修改均使用db.table()方式。原因是此方法必须使用get请求传递参数,不安全。update()

return db.update('delete from user where id=#{id}');

//post
return db.table('user').primary('id',body.id).update(body);

集成Swagger⭐

1)导入Swagger相关依赖

<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>

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

3)重启项目,访问Swagger界面http://localhost:8080/swagger-ui.html,即可查看我们在magic-api中写的接口

拦截器配置

在开发环境,可以使用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<String, Object> result = new HashMap<>();
            result.put("msg", "抱歉,未找到可访问资源!");
            result.put("status", false);
            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的值选择是否可访问。到这里,基本的接口开发已经完成,只需前端进行整合即可。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐