-
Notifications
You must be signed in to change notification settings - Fork 2.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in 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: