• APIJSON自动化ORM库,后端接口和文档自动化实践整理 (一)


    一、目标

    (1)了解 ApiJSON 基本的开发模式以及构建 ApiJson 开发项目案例
    (2)使用 MyBatis 和 ApiJSON 开发进行实践对比
    (3)实践 ApiJson 生态中的 APIAuto 和 UnitAuto

    在这里插入图片描述

    二、功能介绍

    (一)基本开发流程

    在这里插入图片描述

    【流程描述】:
    1:建表,即常规的构建数据库表
    2:建立Model,类似于POJO类,但是只需要一个类名以及代表权限的注解修饰即可,不需要任何的字段
    在这里插入图片描述
    3:新增实际表映射关系
    映射关系存储在: apijson.orm.AbstractSQLConfig
    在这里插入图片描述
    映射的关系是上一步构建的Model类名对应数据库的表名,前端查询使用Model进行查询,这样可以避免直接暴露数据库表名
    在这里插入图片描述
    4:注册权限
    注册权限是代表着当前用户角色以及执行权限检查
    权限关系存储在:
    apijson.orm.AbstractVerifier
    在这里插入图片描述
    5:request表配置
    注意,这一步是必须的,它的作用是确保数据执行的安全性,比如执行Delete语句必须传递一个主键值,这样会避免出现误操作带来的大面积数据丢失等等不安全行为
    在这里插入图片描述
    6:接口调用
    ApiJSON为我们提供了一个入口Controller,它的作用有如下俩个
    【1】定义标准HTTP端点,比如 /get ,/put, /gets, /post ,/delete等等
    【2】定义的端点描述的基本的执行动作,所有的执行内部行为都是通过POST方式发送JSON数据体来解析并执行的
    【3】当前控制器是负责接收通用请求,并将请求转发到APIJSONController,并进行APIJSONParser处理,从而完成JSON——>SQL的转换和执行

    (二)安装使用

    【1】根据开发语言选择下载官方提供的ApiJson-Demo,该Demo可以帮助我们快速搭建起ApiJSon骨架
    【2】通过Maven引入APIJSON ORM依赖,或者直接引入JAR包
    【3】导入数据库脚本,这些表包括了框架的权限认证和基础配置信息
    官方Demo骨架:https://github.com/APIJSON/APIJSON-Demo
    在这里插入图片描述
    详细信息,见:https://github.com/APIJSON/APIJSON-Demo

    在 APIJSON-Master/MySQL 目录下有一批 SQL 脚本,需要事先在你的数据库中执行,然后在DemoSQLConfig配置数据库配置(备注:ApiJson使用的Java代码的配置方式)

    【Maven配置】
    在 pom.xml 中添加 JitPack 仓库

    <repositories>
    		<repository>
    		    <id>jitpack.io</id>
    		    <url>https://jitpack.io</url>
    		</repository>
    	</repositories>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在 pom.xml 中添加 apijson-orm 依赖

    <dependency>
    	    <groupId>com.github.APIJSON</groupId>
    	    <artifactId>apijson-framework</artifactId>
    	    <version>LATEST</version>
    	</dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    参考:
    https://github.com/APIJSON/apijson-framework

    【测试方式】
    测试方式建议:使用API-Auto或者使用PostMan测试
    测试地址:http://apijson.org/api/
    在这里插入图片描述
    说明:本地正常启动项目后,在API-AUTO【1】位置的地址栏上填入自己的本地测试地址即可进行接口测试,该平台可以帮助开发者有效的进行接口的测试,这个会在下面的章节中说到,如果显示数据与上方相同即表示正常,此时就可以进行开发了,目前已经构建了一个完整的骨架

    (三)功能概览

    在这里插入图片描述
    在这里插入图片描述

    三、案例实践

    (一)案例说明

    为了更好的了解和分析ApiJson,这里基于ApiJson和传统的MyBatis(MyBatisPlus)框架构建了一个基础的增删改查项目,目前这俩种方式是合并在一起的
    【基本介绍】
    在这里插入图片描述

    在这里插入图片描述
    备注:上面的使用MyBatis并没有做细致的功能,构建它的目的一方面是证明目前的项目是可以APIJSON和传统方式混合开发,另一方面是为了下面的对比分析
    在这里插入图片描述
    消息管理模块是完全使用ApiJson进行的开发,使用的前后端分离的方式
    后端:SpringBoot+ApiJson+MySQL
    前端:Vue+Axios+ElementUI

    在这里插入图片描述

    (二)代码分析

    (1)后端代码构建

    在这里插入图片描述
    传统开发方式不再赘述,左侧的是ApiJson的开发代码,其中仅仅添加了一个Message,该Model就已经可以完成上面页面的消息管理增删改查的功能,后续如果有新的表添加Model即可,虽然需要一些其他的类作为辅助,但是只要在开发初期配置完成,后面对于功能扩展还是非常便捷的。

    (2)前端代码构建

    在这里插入图片描述
    前端代码参考server_frontend模块,主要在message.vue组件上

    【查询操作】

    1:查询的端点是 /get
    2:因为不涉及后端代码,所以分页需要在前端处理
    3:包括模糊查询、多表关联、指定字段、条件查询等等,这些现在都需要前端开发人员构建

     //列表查询
        queryList() {
          let this_ = this;
          //分页设置
          let page = this_.pagination.pageIndex - 1;
          page = page <= 0 ? 0 : page;
          let queryKeyword = this_.queryKeyword;
          //模糊搜索
          if (queryKeyword != null) {
            queryKeyword = '%' + queryKeyword + '%';
          }
          axios.post(url_get,
              {
                '[]': {
                  'Message': {
                    //指定查询字段
                    "@column": "id,status,content,user_id,create_time",
                    //排序
                    "content$": queryKeyword,
                    "@order": 'create_time-,id-'
                  },
                  "TUser": {
                    //当前表的user_id关联Message.user_id
                    "user_id@": "/Message/user_id",
                    //查询字段
                    "@column": "user_id,user_name"
                  },
                  //分页
                  "page": page,
                  "count": this_.pagination.pageSize,
                  //查询全部总数
                  "query": 2
                },
                //返回查询数
                "total@": "/[]/total"
              })
              .then(function (response) {
                this_.refresh(response.data)
                console.log(response.data)
              })
              .catch(function (error) {
                console.log(error);
              })
        },
    
    • 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
    【删除操作】

    1:删除操作需要配置request表信息和Model所有者权限,并且必须指定tag,其他并没有什么,整体代码看起来也很简洁
    2:删除操作目前是物理删除,如果需要逻辑删除,这个需要自己写update

       axios.post(URL_DELETE, {
                  "tag": "Message", "Message": {'id': eId}
                }
            ).then(function () {
              _this.$message({
                type: 'success',
                message: '删除成功'
              });
              _this.queryList();
            }).catch(function (error) {
              console.log(error);
            })
          }).catch(() => {
          });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    【新增操作】

    1:新增操作需要配置request表信息和Model所有者权限,并且必须指定tag
    2:由于只使用了ApiJson并没有使用其他的ORM框架,所以那些ORM框架提供的字段自动填充功能就需要自己补充了
    在这里插入图片描述

     let createDate = dateFormat(new Date());
          let params = {
            'status': this.mStatus,
            'content': this.mContent,
            'user_id': this.labelId,
            'create_time': createDate
          };
          RequestUtil.postObject("Message", params);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    【更新操作】

    1:更新操作还是同删除和新增一样,需要配置Model注解权限和request表到执行权限
    2:基本操作也就是匹配查询和更新操作

    匹配查询

    axios.post(url_get, {'Message': {'id': id}})
              .then(function (response) {
                let message = response.data.Message;
                _this.eId = message.id;
                _this.eStatus = message.status;
                _this.eContent = message.content;
                _this.eUser = message.user_id;
              })
              .catch(function (error) {
                console.log(error);
              })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    更新操作

    axios.post(URL_PUT, {
            "tag": "Message",
            "Message": {"id": eId, "status": _this.eStatus, "user_id": _this.eUser, "content": _this.eContent}
          }).then(function () {
            _this.$message({
              type: 'success',
              message: '更新成功'
            });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (三)上手测试

    在这里插入图片描述

    server_frontend:前端模块
    serverManager:后端模块
    server_manager.sql:数据库脚本

    后端端口:8080
    前端:npm run dev 访问:http://localhost:9090/

  • 相关阅读:
    MixtralForCausalLM DeepSpeed Inference节约HOST内存【最新的方案】
    【服务器 | 测试】如何在centos 7上面安装jmeter
    Unity3D学习之Lua热更新解决方案(一)AB包和LUA语法
    扫雷(蓝桥杯)
    文档向量化工具(一):Apache Tika介绍
    vue3中多层嵌套的JSON中的内容
    能源化学vr元宇宙虚拟仿真教学培训平台让学生能自主探索和实践
    Win10此设备不支持接收 Miracast 无法投影的解决方法
    Linux之手把手教你捋清楚make和makefile
    BUUCTF [BJDCTF2020]just_a_rar 1
  • 原文地址:https://blog.csdn.net/Octopus21/article/details/126441890