-
Notifications
You must be signed in to change notification settings - Fork 2.2k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
一个json(事务)同时支持新增、修改、删除、查询、别名 #468
Comments
赞,感谢分享~ |
把增删改查不同操作放在一个请求 JSON 中,需要额外字段来标记,例如可以是 {
"Moment": {
"@method": "POST",
// TODO 其它字段
},
"Comment[]": [
{
"@method": "PUT",
// TODO 其它字段
}
]
} 或者这样更好一些,可以提前知道那些片段属于哪种操作,方便解析,性能也更好: {
"@post": "Moment,Comment[]", // 分发到 POST 请求对应的解析处理
"Moment": {
// TODO 其它字段
},
"Comment[]": [
{
// TODO 其它字段
}
],
"@get": "User", // 分发到 GET 请求对应的解析处理
"User": {
// TODO 其它字段
},
"Privacy": { // 按 URL 对应的默认方法处理
// TODO 其它字段
}
} 对于没有显式声明操作方法的,直接用 URL(/get, /post 等) 对应的默认操作方法 |
@TommyLemon > 流程要处理几个地方(还没有细化): |
还有一种方法, 通过request structure 字段来支持,通过json格式匹配 |
对同一张表可以用别名来区分不同记录,例如: {
"User": {
//TODO 其它字段
},
"User:owner": {
"@role": "OWNER",
//TODO 其它字段
},
"User:count": {
"@column": "count(1)",
//TODO 其它字段
}
} 具体见 通用文档 > 3.设计规范 > 3.2 功能符 > 新建别名 |
@TommyLemon > {"User:aa":{"username":"test","password":"233223","state":1},"format":true} |
以前没有这样的需求,现在可以新增支持。 |
嗯嗯,功能我基本调通了,一些细节我还要调整一下,比如 第一条语句 查询 如果没有结果,将会直接返回 等等 |
|
@TommyLemon
4、修改 AbstractParser |
赞,感谢分享~ |
@TommyLemon json解析每一条语句执行,只会改变自己的 transactionIsolation {
"sql@": {
"@method": "GET",
"with": true,
"from": "User",
"User": {
"@column": "id",
"id{}": ["c692d9d1-2e23-4055-99fb-66461bda33c3"]
}
},
"User_address:uad[]": {
"@method": "GET",
"User_address": {
"user_id{}@": "sql"
},
"page": 0,
"count": 10,
"query": 2
},
"total@": "/User_address:uad[]/total",
"User:aa":{
"@method": "POST",
"username":"test1",
"password": "123456",
"state": 1
},
"User_address:uad1[]": [
{
"@method": "POST",
"user_id@": "User:aa/id",
"addr": "ddd",
"count": 1
},
{
"@method": "POST",
"user_id@": "User:aa/id",
"addr": "ddd1",
"count": 2
}
],
"@explain": true
} |
你把 WITH(SELECT ...) AS `sql` 也实现了嘛? |
好的,我先看看 |
我还要稍微调一下 @TommyLemon 修改源码: AbstractSQLConfig |
起码 GET 和 GETS 都支持,可以用 RequestMethod.isGetMethod(method, true) 判断; 至于 PUT, DELETE 也可以支持,那就是只要 method != RequestMethod.POST 就都支持, |
我再测一下, 确认没啥问题, 再提PR 目前已经完成的功能点: |
@cloudAndMonkey 赞,感谢,期待 PR~ |
@TommyLemon |
赞,可以先提 PR,不用一开始就完美。 done is better than perfect. |
@TommyLemon 等我空了看看啥原因 |
建议先提个 PR 把功能提交上去,后面再提 PR 修改 bug,一次提交量太大的话往往不好 code review,bug 风险比较高,也不好定位 |
嗯, 我先记下来 |
全能crud method , APIJSON6.0 已经支持这些功能, 直接使用 比如如下格式, 你可以配置不同数据源, 相同数据源 非public method 支持事物 {
"@datasource": "master",
"@post": {
"Access": {
"tag": "Access"
},
"Request[]": {
"tag": "Request[]"
}
},
"Access": {
"name": "Iinterface_list",
"get": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"head": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"gets": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"heads": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"post": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"put": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"delete": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"detail": "接口表"
},
"Request[]": [
{
"method": "POST",
"tag": "Iinterface_list",
"structure": "{\"MUST\": \"name,url,method,appId\", \"UPDATE\": {\"@role\": \"OWNER\"}, \"REFUSE\": \"id\"}",
"detail": "新增"
},
{
"method": "POST",
"tag": "Iinterface_list[]",
"structure": "{\"Iinterface_list[]\": [{\"MUST\": \"name,url,method,appId\", \"REFUSE\": \"id\"}], \"UPDATE\": {\"@role\": \"OWNER,ADMIN\"}}",
"detail": "批量新增"
},
{
"method": "PUT",
"tag": "Iinterface_list",
"structure": "{\"Iinterface_list\":{ \"MUST\":\"id\",\"REFUSE\": \"userId\", \"UPDATE\": {\"@role\": \"OWNER,ADMIN\"}} }",
"detail": "修改"
},
{
"method": "DELETE",
"tag": "Iinterface_list",
"structure": "{\"Iinterface_list\":{ \"MUST\":\"id\",\"REFUSE\": \"!\", \"INSERT\": {\"@role\": \"OWNER,ADMIN\"}} }",
"detail": "批量删除"
}
],
"@explain": true
} |
您好 我的请求示例: 请求结果为什么是查询 ,我写的是post请求类型,为什么查询结果是 select? { |
@Alleyq |
我想问下请求地址是用 /crud 这个方法吗 还是用别的什么方法 ,文档里面没有详细说明这一块 谢谢老哥 |
/crud 这个方法 autoapi 使用示例 和 官网使用示例 要等我空了再加 |
我最后改的传值:
是不是要重写下源码里面这段代码还是怎么滴,我很郁闷 大哥帮忙解惑 |
你的修改能正常, 改一个post示例测一下呀 {
"@datasource": "master",
"@post": {
"Access": {
"tag": "Access"
},
"Request[]": {
"tag": "Request[]"
}
},
"Access": {
"name": "Iinterface_list",
"get": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"head": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"gets": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"heads": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"post": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"put": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"delete": "[\"OWNER\", \"ADMIN\",\"LOGIN\"]",
"detail": "接口表"
},
"Request[]": [
{
"method": "POST",
"tag": "Iinterface_list",
"structure": "{\"MUST\": \"name,url,method,appId\", \"UPDATE\": {\"@role\": \"OWNER\"}, \"REFUSE\": \"id\"}",
"detail": "新增"
},
{
"method": "POST",
"tag": "Iinterface_list[]",
"structure": "{\"Iinterface_list[]\": [{\"MUST\": \"name,url,method,appId\", \"REFUSE\": \"id\"}], \"UPDATE\": {\"@role\": \"OWNER,ADMIN\"}}",
"detail": "批量新增"
},
{
"method": "PUT",
"tag": "Iinterface_list",
"structure": "{\"Iinterface_list\":{ \"MUST\":\"id\",\"REFUSE\": \"userId\", \"UPDATE\": {\"@role\": \"OWNER,ADMIN\"}} }",
"detail": "修改"
},
{
"method": "DELETE",
"tag": "Iinterface_list",
"structure": "{\"Iinterface_list\":{ \"MUST\":\"id\",\"REFUSE\": \"!\", \"INSERT\": {\"@role\": \"OWNER,ADMIN\"}} }",
"detail": "批量删除"
}
],
"@explain": true
} |
看到啦 , 感谢感谢 ~ |
老哥,如果同时新增两张表,第二个表的某个字段引用第一个表的新增主键,这个要怎么写呢?下面是我的代码 |
1、引用主表id, 配置 id 由应用生成,比如uuid "User:aa":{
"username":"test-3",
"password": "233223",
"state": 1
},
"User_address[]": [
{
"user_id@": "User:aa/id",
"addr": "ddd"
}
] 至于 数据库生成id 引用, 看看官网文档, 测一下 |
老哥 批量新增这个条数限制,如果改源码的话会有性能的问题吗 ? |
不用改源码,子类实现方法即可 |
这里不应该只 requestItem.put(_key, obj),丢了 "Request":{} 对象导致 objectVerify 抛异常, 可以改下源码试试,如果可以麻烦提 PR 贡献下代码哦,开源要大家一起参与贡献才会更美好~ |
我来看看 |
为啥每个 JSONObject 进行解析, 一方面是为了解决别名 {
"Access:a":{
"id": "1"
},
"Request:b":{
"id@": "/Access/id"
},
"tag": "Request"
} |
@cloudAndMonkey {
"Access:a":{
"MUST": "id"
},
"Request:b":{
"UPDATE": {
"id@": "/Access/id"
}
}
} |
那我测一下, crud 和其他方法都统一这么做 |
@cloudAndMonkey |
嗯嗯, 看到了, 需要删除tag 、JSONObject 别名判断的代码 , 今天晚上我好好梳理一下 |
@TommyLemon 差不多改好了, 我拉通测一下,需要覆盖各种场景, 把 function 事物一起完善,再提交 INSERT INTO `apijson`.`Request` (`id`, `debug`, `version`, `method`, `tag`, `structure`, `detail`, `date`) VALUES (45, 0, 2, 'POST', 'Comment:[]', '{\"TYPE\": {\"Comment[]\": \"OBJECT[]\"}, \"INSERT\": {\"@role\": \"OWNER\"}, \"Comment[]\": []}', NULL, '2020-03-01 13:40:04'); 最近有点忙, 不好意思😄 |
@TommyLemon |
通过 @method: "POST", @gets: { "Privacy":"Privacy-CIRCLE", "User": { "@ROLE":"LOGIN", "tag":"User" } } 等关键词指定。具体文档见: Tencent/APIJSON#468
完善同一个请求内多种不同操作的关键词,新增支持 @post: "User", // 相当于 "User": { "tag": "User" }
@gets: {
"Privacy": "Privacy-phone" // 相当于 "Privacy": { "tag": "Privacy-phone" }
} 等简化写法 |
求助两位大佬,请问主键非id情况下需要单另外配置什么信息,目前主键为xxx_id,增删改均报错Unknown column 'id' in 'field list' |
版本5.2.0







1、业务表-插入不同表1:1、1:n、n:n
2、业务表-修改不同表1:1、1:n、n:n
3、业务表-批量删除不同表
实现流程:
1、继承APIJSONParser
2、重载 parseCorrectRequest方法
User__User 通过__分割, tag 和 structure的类名
新增, tag和 structure的类名一样, 更多示例请参见postman
该方法,是参数校验入口
特定tag,则走分支流程
修改引用关系
postman测试示例:
业务表-插入不同表1:1-源码实现
业务表-插入不同表1:n-源码实现
业务表-插入不同表n:n-源码实现
业务表-批量修改不同表1:n-源码实现
业务表-批量修改不同表n:n-源码实现
业务表-批量删除不同表-源码实现
后续我再研究一下
1、支持不同的操作类型,比如 GET、POST、DELETE, 在一个json里面, 才能保证事物
2、function函数 执行语句, 加入事物
框架能支持数组, 把数组拆解为一条一条语句执行, 只要把相关引用 传递进 function应该能搞定,空了研究一下,哈哈
The text was updated successfully, but these errors were encountered: