# procjson **Repository Path**: cnsonkwl/procjson ## Basic Information - **Project Name**: procjson - **Description**: 后端自动化,前端完成API的设计及运行测试 - **Primary Language**: PHP - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-30 - **Last Updated**: 2022-10-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: API, PHP, JSON ## README # procJSON,自动化后端 ## 特别注意 该项目纯属自娱自乐,请勿在生产环境中使用。 > 更新于2022/4/18 测试了4,5个小项目,框架是可行的,确实能大量节省全栈开发人员的时间,但安全性和并发性堪忧,极不建议在生产环境中使用。 **主要问题:** - 无法应对并发项目,加锁麻烦; - 基本无法通过代码安全扫描,由于存在大量的sql拼接,无法有效防范sql injection - 程序中若需要用户验证,会产生大量冗余的sql查询 ## 前言 受到腾讯APIJSON项目启发,重新的定义的自动化后端项目——procJSON。后端只是需要少量的配置,可以实现自动CRUD,实现前端直接操作数据库的表。 ## 现状与未来 现行常用的项目开发流程: > 需求分析 -> 数据库设计 -> 接口设计 -> 接口实现(前端/后边) -> 集成测试 接口实现,一般分成前端和后端,分别去实现。开发效率不同,彼此直接的沟通极端依赖接口设计,一旦接口发生改变,互相“打架”,推诿之事层出不穷。我们去研究一下后端的工作,发现大多都是在单个表后者2个表之间增删改。所以,我们常常可以在市场看到模板型的系统和软件,好像只有如此才能最大的化后端的价值。 如何让后端从CRUD的复制粘贴中释放出来,腾讯的项目给你我们一个比较“COOL”的想法,用JSON去定义接口并且执行数据库DML。这里我不做APIJSON的具体介绍,有兴趣的去github看一下。本质上procJSON并未使用APIJSON的接口定义,procJSON重新定义了一套接口方法,并设计“事件处理”的执行逻辑。 procJSON的项目开发流程: > 需求分析 -> 数据库设计 -> 后端项目配置 -> 前端的定义接口并运测 procJSON不需要去写大量的逻辑处理,只是提供一套通用的数据库DML(select/insert/update/delete),我们只需要一些简单的配置,就可以让前端用接口定义的方式去操作数据库。 procJSON现在只支持PHP语言,等我用几个项目验证后,再开发Go/Python版本,DOTNET和JAVE的就不搞了,毕竟都是被我放弃的语言。不是他们不好,而是我个人不喜欢。 ## 示例 ### 1.数据请求 > POST:content-type/JSON /index.php ### 2.接口配置表 |项目|类型|示例值|描述|备注| |-|-|-|-|-| |step(x)|json|step1|操作步骤,x为整数|| |step(x).command|string|login|登录操作|必带step(x).table,step(x).clause,返回step(x).token| |step(x).command|string|jwt|接口验证|必带step(x).token| |step(x).command|string|query|单笔查询操作|必带step(x).table,step(x).clause| |step(x).command|string|select|查询操作|必带step(x).table,step(x).clause| |step(x).command|string|insert|新增操作|必带step(x).table,step(x).clause| |step(x).command|string|update|新增操作|必带step(x).table,step(x).clause,step(x).update| |step(x).command|string|delete|删除操作|必带step(x).table,step(x).clause| |step(x).table|string|user|表名|| |step(x).clause|json|{"s_no":"123"}|query/select/update/delete为DML的where部分,insert为DML的table(clause.keys)和values(cluase.values)|| |step(x).update|json|{"s_name":"test"}|update的set部门|| |step(x).column|string|"s_no,s_name"|query/select的返回栏位|| |step(x).order|string|"s_no desc,s_name"|select的order by|| |step(x).page|int|1|查询的第几页||select| |step(x).pages|int|1|查询的总页数|select| |step(x).rows|int|1|查询的总条数|select| |step(x).rows|int|10|查询的分页切片数|| |step(x).list|json|[{...}]|查询结果|select| |res|string|OK|OK为成功,NG为失败|| |message|string|操作成功|返回提示信息|| ### 4.示例 #### 4.1.配置项目(后端) ```php include $_SERVER['DOCUMENT_ROOT'].'/procjson/php/autoload.php'; //前端table与db.table映射 \procjson\app::$db_tables=array("user"=>"xczx.wh_user_t"); //配置开放模型 \procjson\app::$model_open=array( "user"=>array( "login"=>array( "command"=>"login", "table"=>"user", "clause"=>array("s_no","s_pwd"), "id"=>"s_no", ) ) ); //token绑定app //procJSON::$apps=array("100","2"); //procJSON::$app_table=array( // "table"=>"xczx.wh_level_t", // "id"=>"s_no", // "priv"=>"i_type", //); //PDO配置 //procJSON::$PDO=''; \procjson\app::$user='whhr'; \procjson\app::$pwd='test'; //JWT的有效期 \procjson\app::$exp=strtotime("+4 hours",time()); //JWT的加密值 \procjson\app::$keystr="WHSS"; \procjson\app::$keyint="1"; //运行procJSON \procjson\app::Run(); ``` #### 4.2.登录 ```json { "step1":{ "command":"login", "table":"user", "clause":{ "s_no":"F6987445", "s_pwd":"123" } } } //返回 { "step1": { "command": "login", "table": "user", "clause": { "s_no": "F6987445", "s_pwd": "xk952700" }, "token": "8229706b2941294d3d403f3e3b3b3c2933296c7f77294129383d3b373f3d383c3939293329746b3c294129383a3e40396a3c393b396b3a3f686d376c403a6a386c3e6c6b6d693a3a403a682984752143002" }, "res": "OK", "message": "操作成功" } ``` #### 4.3.单笔查询 ```json { "step1":{ "command":"jwt", "token":"8229706b2941294d3d403f3e3b3b3c2933296c7f77294129383d3b373f3a4040383c293329746b3c2941296c3837403a376a3a69686c3d3c373a6d6c6b6c40693f3c68696c403d3d6a3d6c2984751083055" }, "step2":{ "command":"query", "table":"user", "clause":{ "s_no":"%F1000%" }, "column":"s_no,s_name,s_mail,i_level" } } //返回 { "step1": { "command": "jwt", "token": "8229706b2941294d3d403f3e3b3b3c2933296c7f77294129383d3b373f3d383c3939293329746b3c294129383a3e40396a3c393b396b3a3f686d376c403a6a386c3e6c6b6d693a3a403a682984752143002" }, "step2": { "command": "query", "table": "user", "clause": { "s_no": "F1000001", "s_name": "测试1", "s_mail": "test1@foxconn.com", "i_level": "0" }, "column": "s_no,s_name,s_mail,i_level" }, "res": "OK", "message": "操作成功" } ``` #### 4.4.多笔查询 ```json { "step1":{ "command":"jwt", "token":"8229706b2941294d3d403f3e3b3b3c2933296c7f77294129383d3b373f3d383c3939293329746b3c294129383a3e40396a3c393b396b3a3f686d376c403a6a386c3e6c6b6d693a3a403a682984752143002" }, "step2":{ "command":"select", "table":"user", "clause":{ "s_no":"%F6%" }, "column":"s_no,s_name,s_mail,i_level" } } //返回 { "step1": { "command": "jwt", "token": "8229706b2941294d3d403f3e3b3b3c2933296c7f77294129383d3b373f3d383c3939293329746b3c294129383a3e40396a3c393b396b3a3f686d376c403a6a386c3e6c6b6d693a3a403a682984752143002" }, "step2": { "command": "select", "table": "user", "clause": { "s_no": "%F6%" }, "column": "s_no,s_name,s_mail,i_level", "list": [ { "s_no": "F6145913", "s_name": "程麗華", "s_mail": "", "i_level": "0" }, { "s_no": "F6146897", "s_name": "郑飞", "s_mail": "", "i_level": "0" }, { "s_no": "F6148779", "s_name": "劉培", "s_mail": "", "i_level": "0" }, { "s_no": "F6173599", "s_name": "李小雄", "s_mail": "", "i_level": "0" }, { "s_no": "F6901013", "s_name": "胡偉言", "s_mail": "", "i_level": "0" }, { "s_no": "F6987444", "s_name": "xiongkui", "s_mail": "", "i_level": "0" }, { "s_no": "F6987445", "s_name": "熊魁", "s_mail": "sonkwl.k.xiong@mail.foxconn.com", "i_level": "1" } ], "rows": "7", "pages": 1, "page": 1 }, "res": "OK", "message": "操作成功" } ``` #### 4.5.新增&更新(事件处理) ```json { "step1":{ "command":"jwt", "token":"8229706b2941294d3d403f3e3b3b3c2933296c7f77294129383d3b373f3d383c3939293329746b3c294129383a3e40396a3c393b396b3a3f686d376c403a6a386c3e6c6b6d693a3a403a682984752143002" }, "step2": { "command": "insert", "table": "user", "clause": { "s_no": "apitest", "s_name": "apitest", "s_pwd": "apitest" } }, "step3":{ "command":"update", "table":"user", "clause":{ "s_no":"apitest" }, "update":{ "s_mail":"sonkwl@foxconn.com" } } } //返回 { "step1": { "command": "jwt", "token": "8229706b2941294d3d403f3e3b3b3c2933296c7f77294129383d3b373f3d383c3939293329746b3c294129383a3e40396a3c393b396b3a3f686d376c403a6a386c3e6c6b6d693a3a403a682984752143002" }, "step2": { "command": "insert", "table": "user", "clause": { "s_no": "apitest", "s_name": "apitest", "s_pwd": "apitest" } }, "step3": { "command": "update", "table": "user", "clause": { "s_no": "apitest" }, "update": { "s_mail": "sonkwl@foxconn.com" } }, "res": "OK", "message": "操作成功" } ``` #### 4.6.删除 ```json { "step1":{ "command":"jwt", "token":"8229706b2941294d3d403f3e3b3b3c2933296c7f77294129383d3b373f3a4040383c293329746b3c2941296c3837403a376a3a69686c3d3c373a6d6c6b6c40693f3c68696c403d3d6a3d6c2984751083055" }, "step2":{ "command":"delete", "table":"user", "clause":{ "s_no":"apitest" } } } //返回 { "step1": { "command": "jwt", "token": "8229706b2941294d3d403f3e3b3b3c2933296c7f77294129383d3b373f3d383c3939293329746b3c294129383a3e40396a3c393b396b3a3f686d376c403a6a386c3e6c6b6d693a3a403a682984752143002" }, "step2": { "command": "delete", "table": "user", "clause": { "s_no": "apitest" } }, "res": "OK", "message": "操作成功" } ```