(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>
在 pom.xml 中添加 apijson-orm 依赖
<dependency>
<groupId>com.github.APIJSON</groupId>
<artifactId>apijson-framework</artifactId>
<version>LATEST</version>
</dependency>
参考:
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


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

前端代码参考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:删除操作需要配置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:新增操作需要配置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:更新操作还是同删除和新增一样,需要配置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);
})
更新操作
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: '更新成功'
});

server_frontend:前端模块
serverManager:后端模块
server_manager.sql:数据库脚本
后端端口:8080
前端:npm run dev 访问:http://localhost:9090/