• magic API构建和基础实现


    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>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <scope>runtimescope>
            dependency>
            <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>druidartifactId>
                <version>1.1.9version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.2 加入magic-api⭐

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

    <dependency>
        <groupId>org.ssssssssgroupId>
        <artifactId>magic-api-spring-boot-starterartifactId>
        <version>1.2.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    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`)
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4)启动项目,访问http://localhost:8080/magic/web,即可进入magic的管理页面

    基本用法

    添加

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

    修改

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

    删除

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

    查询

    return db.table('user'
    .where()
    .eq('id',path.id)
    .selectone();
    
    • 1
    • 2
    • 3
    • 4

    分页查询

    magic语法

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

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

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

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

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

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

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

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

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

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

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

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

    return db.page('select * from user')
    
    return db.table('user').page()
    
    • 1
    • 2
    • 3

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

    return db.update('delete from user where id=#{id}');
    
    //post
    return db.table('user').primary('id',body.id).update(body);
    
    • 1
    • 2
    • 3
    • 4

    集成Swagger

    1)导入Swagger相关依赖

    <dependency>
        <groupId>io.springfoxgroupId>
        <artifactId>springfox-swagger2artifactId>
        <version>2.9.2version>
    dependency>
    <dependency>
        <groupId>io.springfoxgroupId>
        <artifactId>springfox-swagger-uiartifactId>
        <version>2.9.2version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    还需要一个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/**");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    就可以通过修改isAllowed的值选择是否可访问。到这里,基本的接口开发已经完成,只需前端进行整合即可。

  • 相关阅读:
    10链表-单链表构造LinkedList
    jsp网上银行
    【云原生】K8S包管理(helm)
    mysql 数据库数据恢复 库被删了怎么恢复数据库
    MyBatis #{} 和 ${} 的区别
    gitlab修改项目名称
    Java+SSM+JSP实现医院预约挂号系统
    python模块之redisbloom redis布隆过滤器
    MySQL数据库(Java的数据库编程:JDBC)
    Scrapy 框架之 Item Pipeline 的使用
  • 原文地址:https://blog.csdn.net/qq_44174346/article/details/126249195