Browse Source

support runapi-client

star7th 5 years ago
parent
commit
b3140c62af

+ 7 - 0
server/Application/Api/Controller/ItemController.class.php

@@ -108,6 +108,12 @@ class ItemController extends BaseController {
         if($item['is_archived']){
             $ItemPermn = $ItemCreator = false; 
         }
+
+        //如果项目类型为runapi,则获取看看有没有全局参数
+        $global_param = array() ;
+        if($item['item_type'] == 3){
+            $global_param = D("RunApi")->getGlobalParam($item_id);
+        }
         
         $return = array(
             "item_id"=>$item_id ,
@@ -125,6 +131,7 @@ class ItemController extends BaseController {
             "ItemPermn"=>$ItemPermn ,
             "ItemCreator"=>$ItemCreator ,
             "current_page_id"=>$current_page_id ,
+            "global_param"=>$global_param ,
 
             );
         $this->sendResult($return);

+ 9 - 2
server/Application/Api/Controller/ItemVariableController.class.php

@@ -7,6 +7,7 @@ class ItemVariableController extends BaseController {
     //保存
     public function save(){ 
         $item_id = I("item_id/d");  
+        $env_id = I("env_id/d"); 
         $var_name = I("var_name");  
         $var_value = I("var_value");  
         $login_user = $this->checkLogin();
@@ -18,6 +19,7 @@ class ItemVariableController extends BaseController {
         $data = array() ;
         $data['var_name'] = $var_name ;
         $data['uid'] = $uid ;
+        $data['env_id'] = $env_id ;
         $data['var_value'] = $var_value ;
         $data['item_id'] = $item_id ;
         $data['addtime'] = time() ;
@@ -34,7 +36,8 @@ class ItemVariableController extends BaseController {
 
     //获取列表
     public function getList(){
-        $item_id = I("item_id/d");  
+        $item_id = I("item_id/d");
+        $env_id = I("env_id/d");
         $login_user = $this->checkLogin();
         $uid = $login_user['uid'] ;
         if(!$this->checkItemPermn($uid , $item_id)){
@@ -42,7 +45,11 @@ class ItemVariableController extends BaseController {
             return ;
         } 
         if ($item_id > 0 ) {
-            $ret = D("ItemVariable")->where(" item_id = '$item_id' ")->order(" addtime asc  ")->select();
+            $where = "item_id = '$item_id'";
+            if($env_id){
+                $where .= " and env_id = '$env_id'";
+            }
+            $ret = D("ItemVariable")->where($where)->order(" addtime asc  ")->select();
         }
         if ($ret) {
             foreach ($ret as $key => &$value) {

+ 176 - 0
server/Application/Api/Controller/RunapiController.class.php

@@ -0,0 +1,176 @@
+<?php
+namespace Api\Controller;
+use Think\Controller;
+class RunapiController extends BaseController {
+
+
+    //添加环境
+    public function addEnv(){
+      $login_user = $this->checkLogin();
+      $env_id = I("env_id/d");
+      $env_name = I("env_name");
+      $item_id = I("item_id/d");
+      $uid = $login_user['uid'] ;
+      if(!$this->checkItemPermn($uid , $item_id)){
+          $this->sendError(10303);
+          return ;
+      } 
+      $res = false; 
+      if($env_id){
+        $res = D("RunapiEnv")->where("id = {$env_id} and item_id = {$item_id} ")->save(array(
+          "env_name" => $env_name ,
+          "uid" => $uid ,
+          "last_update_time" => date("Y-m-d H:i:s") ,
+        ));
+        $this->sendResult(array("env_id"=>$env_id));
+      }else{
+        $env_id = D("RunapiEnv")->add(array(
+          "env_name" => $env_name ,
+          "item_id" => $item_id ,
+          "uid" => $uid ,
+          "addtime" => date("Y-m-d H:i:s") ,
+          "last_update_time" => date("Y-m-d H:i:s") ,
+        ));
+        $this->sendResult(array("env_id"=>$env_id));
+      }
+      
+    }
+
+    //更新环境
+    public function updateEnv(){
+      $this->addEnv();
+    }
+
+    //获取环境列表
+    public function getEnvList(){
+      $item_id = I("item_id/d");
+      $login_user = $this->checkLogin();
+      $uid = $login_user['uid'] ;
+      if(!$this->checkItemPermn($uid , $item_id)){
+        $this->sendError(10303);
+        return ;
+      }
+      $res = D("RunapiEnv")->where("item_id = {$item_id} ")->select();
+      if($res){
+        $this->sendResult($res);
+      }else{
+        //如果尚未有环境,则帮其创建一个默认环境
+        $env_id = D("RunapiEnv")->add(array(
+          "env_name" => '默认环境' ,
+          "item_id" => $item_id ,
+          "uid" => $uid ,
+          "addtime" => date("Y-m-d H:i:s") ,
+          "last_update_time" => date("Y-m-d H:i:s") ,
+        ));
+        //并且把项目变量都绑定到该默认环境中
+        D("ItemVariable")->where(" item_id = '$item_id'")->save(array(
+          "env_id"=>$env_id
+        ));
+        sleep(1);
+        $this->getEnvList();
+
+      }
+    }
+    //删除环境
+    public function delEnv(){
+      $env_id = I("env_id/d");
+      $login_user = $this->checkLogin();
+      $uid = $login_user['uid'] ;
+      $res = D("RunapiEnv")->where("id = {$env_id}")->find();
+      $item_id = $res['item_id'] ;
+      if(!$this->checkItemPermn($uid , $item_id)){
+        $this->sendError(10303);
+        return ;
+      }
+      $res = D("RunapiEnvSelectd")->where("id = {$env_id} ")->delete();
+      $res = D("RunapiEnv")->where("id = {$env_id} ")->delete();
+      $res = D("ItemVariable")->where("env_id = {$env_id}")->delete();
+      if($res){
+        $this->sendResult($res);
+      }else{
+        $this->sendResult(array());
+      }
+    }
+
+    //设置某个环境变量为选中
+    public function selectEnv(){
+      $env_id = I("env_id/d");
+      $login_user = $this->checkLogin();
+      $uid = $login_user['uid'] ;
+      $res = D("RunapiEnv")->where("id = {$env_id}")->find();
+      $item_id = $res['item_id'] ;
+      if(!$this->checkItemPermn($uid , $item_id)){
+        $this->sendError(10303);
+        return ;
+      }
+      D("RunapiEnvSelectd")->where("item_id = {$item_id} and uid = '$uid' ")->delete();
+      $res = D("RunapiEnvSelectd")->add(array(
+        "item_id" => $item_id ,
+        "uid" => $uid ,
+        "env_id" => $env_id ,
+      ));
+      if($res){
+        $this->sendResult($res);
+      }else{
+        $this->sendResult(array());
+      }
+    }
+
+    //获取用户选中的环境
+    public function getSelectEnv(){
+      $item_id = I("item_id/d");
+      $login_user = $this->checkLogin();
+      $uid = $login_user['uid'] ;
+      if(!$this->checkItemPermn($uid , $item_id)){
+        $this->sendError(10303);
+        return ;
+      }
+      $res = D("RunapiEnvSelectd")->where("item_id = {$item_id} and uid = '$uid' ")->find();
+      if($res){
+        $this->sendResult($res);
+      }else{
+        $this->sendResult(array(
+          "env_id" => 0 ,
+        ));
+      }
+    }  
+
+    //获取全局参数
+    public function getGlobalParam(){
+      $item_id = I("item_id/d");
+      $login_user = $this->checkLogin();
+      $uid = $login_user['uid'] ;
+      if(!$this->checkItemPermn($uid , $item_id)){
+        $this->sendError(10303);
+        return ;
+      }
+      $return = D("RunApi")->getGlobalParam($item_id);
+      $this->sendResult($return);
+    }
+
+    //修改全局参数
+    public function updateGlobalParam(){
+      $item_id = I("item_id/d");
+      $param_type = I("param_type");
+      $content_json_str = I("content_json_str");
+      $login_user = $this->checkLogin();
+      $uid = $login_user['uid'] ;
+      if(!$this->checkItemPermn($uid , $item_id)){
+        $this->sendError(10303);
+        return ;
+      }
+      $res = D("RunapiGlobalParam")->where("param_type = '%s' and item_id = {$item_id} ",array($param_type))->save(array(
+        "content_json_str" => $content_json_str ,
+        "last_update_time" => date("Y-m-d H:i:s") ,
+      ));
+      if($res){
+        $this->sendResult($res);
+      }else{
+        $this->sendResult(array());
+      }
+
+    }
+
+
+
+}

+ 35 - 1
server/Application/Api/Controller/UpdateController.class.php

@@ -5,7 +5,7 @@ class UpdateController extends BaseController {
 
     //检测数据库并更新
     public function checkDb(){
-        $version_num = 2 ;
+        $version_num = 3 ;
         $db_version_num = D("Options")->get("db_version_num");
         if(!$db_version_num || $db_version_num < $version_num ){
             $r = $this->updateSqlite();
@@ -282,6 +282,40 @@ class UpdateController extends BaseController {
             `date_month` CHAR(2000) NOT NULL DEFAULT ''
             )";
         D("User")->execute($sql);
+
+        //item_variable表增加env_id字段
+        if (!$this->_is_column_exist("item_variable","env_id")) {
+            $sql = "ALTER TABLE ".C('DB_PREFIX')."item_variable ADD env_id INT( 10 ) NOT NULL DEFAULT '0'  ;";
+            D("User")->execute($sql);
+        }
+        //创建runapi_env表
+        $sql = "CREATE TABLE IF NOT EXISTS `runapi_env` (
+            `id`  INTEGER PRIMARY KEY ,
+            `env_name` CHAR(2000) NOT NULL DEFAULT '',
+            `item_id` int(11) NOT NULL DEFAULT '0',
+            `uid` int(11) NOT NULL DEFAULT '0',
+            `addtime` CHAR(2000) NOT NULL DEFAULT '',
+            `last_update_time` CHAR(2000) NOT NULL DEFAULT ''
+            )";
+        D("User")->execute($sql);
+        //创建runapi_env_selectd表
+        $sql = "CREATE TABLE IF NOT EXISTS `runapi_env_selectd` (
+            `id`  INTEGER PRIMARY KEY ,
+            `item_id` int(11) NOT NULL DEFAULT '0',
+            `uid` int(11) NOT NULL DEFAULT '0',
+            `env_id` int(11) NOT NULL DEFAULT '0'
+            )";
+        D("User")->execute($sql);
+        //创建runapi_global_param表
+        $sql = "CREATE TABLE IF NOT EXISTS `runapi_global_param` (
+            `id`  INTEGER PRIMARY KEY ,
+            `item_id` int(11) NOT NULL DEFAULT '0',
+            `param_type` CHAR(2000) NOT NULL DEFAULT '',
+            `content_json_str` CHAR(2000) NOT NULL DEFAULT '',
+            `addtime` CHAR(2000) NOT NULL DEFAULT '',
+            `last_update_time` CHAR(2000) NOT NULL DEFAULT ''
+            )";
+        D("User")->execute($sql);
         //留个注释提醒自己,如果更新数据库结构,务必更改上面的$version_num
         //留个注释提醒自己,如果更新数据库结构,务必更改上面的$version_num
         //留个注释提醒自己,如果更新数据库结构,务必更改上面的$version_num

+ 62 - 0
server/Application/Api/Model/RunapiModel.class.php

@@ -0,0 +1,62 @@
+<?php
+namespace Api\Model;
+use Api\Model\BaseModel;
+/**
+ * 
+ * @author star7th      
+ */
+class RunapiModel  {
+
+    Protected $autoCheckFields = false;
+    
+    //获取全局参数
+    public function getGlobalParam($item_id){
+        $return = array(
+            'query'=>array(),
+            'body'=>array(),
+            'header'=>array(),
+          );
+    
+          $res = D("RunapiGlobalParam")->where(" param_type = 'query' and item_id = {$item_id} ")->find();
+          if($res){
+            $return['query'] = json_decode( htmlspecialchars_decode($res['content_json_str']) ,true);
+            $return['query'] = $return['query'] ? $return['query'] : array() ;
+          }else{
+            D("RunapiGlobalParam")->add(array(
+              "param_type"=>"query",
+              "item_id"=>$item_id,
+              "content_json_str"=>'[]',
+              "addtime" => date("Y-m-d H:i:s") ,
+              "last_update_time" => date("Y-m-d H:i:s") ,
+            ));
+          }
+          $res = D("RunapiGlobalParam")->where(" param_type = 'body' and item_id = {$item_id} ")->find();
+          if($res){
+            $return['body'] = json_decode( htmlspecialchars_decode($res['content_json_str']) ,true);
+            $return['body'] = $return['body'] ? $return['body'] : array() ;
+          }else{
+            D("RunapiGlobalParam")->add(array(
+              "param_type"=>"body",
+              "item_id"=>$item_id,
+              "content_json_str"=>'[]',
+              "addtime" => date("Y-m-d H:i:s") ,
+              "last_update_time" => date("Y-m-d H:i:s") ,
+            ));
+          }
+          $res = D("RunapiGlobalParam")->where(" param_type = 'header' and item_id = {$item_id} ")->find();
+          if($res){
+            $return['header'] = json_decode( htmlspecialchars_decode($res['content_json_str']) ,true);
+            $return['header'] = $return['header'] ? $return['header'] : array() ;
+          }else{
+            D("RunapiGlobalParam")->add(array(
+              "param_type"=>"header",
+              "item_id"=>$item_id,
+              "content_json_str"=>'[]',
+              "addtime" => date("Y-m-d H:i:s") ,
+              "last_update_time" => date("Y-m-d H:i:s") ,
+            ));
+          }
+        return $return ;
+    }
+
+}

+ 2 - 0
web_src/src/components/item/show/Index.vue

@@ -70,6 +70,7 @@ export default {
             json.ItemCreator = json.ItemPermn = false
           }
           that.item_info = json
+          that.$store.dispatch('changeItemInfo', json)
           document.title = that.item_info.item_name + '--ShowDoc'
           if (json.unread_count > 0) {
             that.$message({
@@ -103,6 +104,7 @@ export default {
     },
     search_item(keyword) {
       this.item_info = ''
+      this.$store.dispatch('changeItemInfo', '')
       this.keyword = keyword
       this.get_item_menu(keyword)
     },

+ 1 - 1
web_src/src/components/item/show/show_regular_item/Index.vue

@@ -127,7 +127,7 @@ export default {
       }, 'post', false).then((data) => {
         // loading.close();
         if (data.error_code === 0) {
-          that.content = rederPageContent(data.data.page_content)
+          that.content = rederPageContent(data.data.page_content, that.$store.state.item_info.global_param)
 
           that.page_title = data.data.page_title
           that.page_info = data.data

+ 87 - 48
web_src/src/models/page.js

@@ -1,36 +1,69 @@
 // 处理页面数据相关的逻辑
 
 // 渲染来自runapi的文档
-const rederPageContent = page_content => {
-  let obj;
+const rederPageContent = (page_content, globalParams = {}) => {
+  let obj
   // 先定义一个html反转义的函数
   const unescapeHTML = str =>
     str.replace(
       /&amp;|&lt;|&gt;|&#39;|&quot;/g,
       tag =>
         ({
-          "&amp;": "&",
-          "&lt;": "<",
-          "&gt;": ">",
-          "&#39;": "'",
-          "&quot;": '"'
+          '&amp;': '&',
+          '&lt;': '<',
+          '&gt;': '>',
+          '&#39;': "'",
+          '&quot;': '"'
         }[tag] || tag)
-    );
-  page_content = unescapeHTML(page_content);
+    )
+  page_content = unescapeHTML(page_content)
   try {
-    obj = JSON.parse(page_content);
+    obj = JSON.parse(page_content)
   } catch (e) {
     // console.log(`不支持解析的页面内容:${page_content}`);
   }
   if (!obj || !obj.info || !obj.info.url) {
-    return page_content;
+    return page_content
   }
-  console.log(obj);
+  // console.log(obj)
+
+  // 判断有没有全局参数,有的话加上。
+  if (globalParams) {
+    // 全局query
+    if (
+      obj.info.method == 'get' &&
+      globalParams.query &&
+      globalParams.query[0] &&
+      globalParams.query[0].name
+    ) {
+      globalParams.query.map((element) => {
+        obj.request.params[obj.request.params.mode].unshift(element)
+      })
+    }
+    // 全局body
+    if (
+      obj.info.method != 'get' &&
+      obj.request.params.mode != 'json' &&
+      globalParams.body &&
+      globalParams.body[0] &&
+      globalParams.body[0].name
+    ) {
+      globalParams.body.map((element) => {
+        obj.request.params[obj.request.params.mode].unshift(element)
+      })
+    }
+    // 全局header
+    if (globalParams.header && globalParams.header[0] && globalParams.header[0].name) {
+      globalParams.header.map((element) => {
+        obj.request.headers.unshift(element)
+      })
+    }
+  } // 全局参数处理完毕
   let newContent = `
 [TOC]
 
 ##### 简要描述
-  - ${obj.info.description ? obj.info.description : "无"}
+  - ${obj.info.description ? obj.info.description : '无'}
 
 ##### 请求URL
 
@@ -38,7 +71,7 @@ const rederPageContent = page_content => {
 
 ##### 请求方式
   - ${obj.info.method}
- `;
+ `
 
   if (
     obj.request.headers &&
@@ -46,20 +79,22 @@ const rederPageContent = page_content => {
     obj.request.headers[0].name
   ) {
     newContent += `
-##### Header
+##### Header 
 
 |header|必选|类型|说明|
 |:-----  |:-----|-----|
-`;
-    const headers = obj.request.headers;
+`
+    const headers = obj.request.headers
     headers.map(one => {
-      newContent += `|${one.name} |${one.require > 0 ? "是" : "否"} |${
+      //如果名字为空,或者存在禁用的key且禁用状态生效中,则终止本条参数
+      if (!one.name || (one.disable && one.disable >= 1 ) ) return ;
+      newContent += `|${one.name} |${one.require > 0 ? '是' : '否'} |${
         one.type
-      } |${one.remark ? one.remark : "无"}   |
-`;
-    });
+      } |${one.remark ? one.remark : '无'}   |
+`
+    })
   }
-  const params = obj.request.params[obj.request.params.mode];
+  const params = obj.request.params[obj.request.params.mode]
 
   if (params && params[0] && params[0].name) {
     newContent += `
@@ -67,40 +102,43 @@ const rederPageContent = page_content => {
 
 |参数名|必选|类型|说明|
 |:-----  |:-----|-----|
-`;
+`
     params.map(one => {
-      newContent += `|${one.name} |${one.require > 0 ? "是" : "否"} |${
+      //如果名字为空,或者存在禁用的key且禁用状态生效中,则终止本条参数
+      if (!one.name || (one.disable && one.disable >= 1 ) ) return ;
+      newContent += `|${one.name} |${one.require > 0 ? '是' : '否'} |${
         one.type
-      } |${one.remark ? one.remark : "无"}   |
-`;
-    });
+      } |${one.remark ? one.remark : '无'}   |
+`
+    })
   }
 
-  if (obj.request.params.mode == "json" && params) {
+  if (obj.request.params.mode == 'json' && params) {
     newContent += `
-##### 请求参数示例
+##### 请求参数示例 
 \`\`\`
 ${params}
 \`\`\`
 
-`;
+`
   }
 
-  const jsonDesc = obj.request.params.jsonDesc;
+  const jsonDesc = obj.request.params.jsonDesc
 
-  if ( obj.request.params.mode == "json" && jsonDesc && jsonDesc[0] && jsonDesc[0].name) {
+  if (obj.request.params.mode == 'json' && jsonDesc && jsonDesc[0] && jsonDesc[0].name) {
     newContent += `
 ##### json字段说明
 
 |字段名|必选|类型|说明|
 |:-----  |:-----|-----|
-`;
+`
     jsonDesc.map(one => {
-      newContent += `|${one.name} |${one.require > 0 ? "是" : "否"} |${
+      if (!one.name) return
+      newContent += `|${one.name} |${one.require > 0 ? '是' : '否'} |${
         one.type
-      } |${one.remark ? one.remark : "无"}   |
-`;
-    });
+      } |${one.remark ? one.remark : '无'}   |
+`
+    })
   }
 
   if (obj.response.responseExample) {
@@ -109,7 +147,7 @@ ${params}
 \`\`\`
 ${obj.response.responseExample}
    \`\`\`
-   `;
+   `
   }
 
   if (
@@ -118,18 +156,19 @@ ${obj.response.responseExample}
     obj.response.responseParamsDesc[0].name
   ) {
     newContent += `
-##### 返回参数说明
+##### 返回参数说明 
 
 |参数名|类型|说明|
 |:-----  |:-----|-----|
-`;
-    const returnParams = obj.response.responseParamsDesc;
+`
+    const returnParams = obj.response.responseParamsDesc
     returnParams.map(one => {
+      if (!one.name) return
       newContent += `|${one.name} |${one.type} |${
-        one.remark ? one.remark : "无"
+        one.remark ? one.remark : '无'
       }   |
-`;
-    });
+`
+    })
   }
 
   newContent += `
@@ -137,9 +176,9 @@ ${obj.response.responseExample}
 
   ${obj.info.remark}
 
-`;
+`
 
-  return newContent;
-};
+  return newContent
+}
 
-export { rederPageContent };
+export { rederPageContent }

+ 7 - 1
web_src/src/store/actions.js

@@ -1,8 +1,14 @@
-// action比mutation的好处是可以任意异步
+// action比mutation的好处是可以任意异步。本来mutation只能同步。现在通过action封装,可以任意异步操作数据
+
 export default {
   incrementAsync({ commit }) {
     setTimeout(() => {
       commit('increment')
     }, 1000)
+  },
+  changeItemInfo(ctx, val) {
+    // console.log(val)  //val是dispatch派发传递过来的值
+    // console.log(ctx)  //ctx是上下文,必传
+    ctx.commit('changeItemInfo', val)// commit到mutation
   }
 }

+ 1 - 4
web_src/src/store/index.js

@@ -2,13 +2,10 @@ import Vue from 'vue'
 import Vuex from 'vuex'
 import mutations from './mutations'
 import actions from './actions'
+import state from './state'
 
 Vue.use(Vuex)
 
-const state = {
-  count: '1'
-}
-
 export default new Vuex.Store({
   state,
   actions,

+ 3 - 0
web_src/src/store/mutations.js

@@ -5,6 +5,9 @@ export default {
   increment(state, payload) {
     state.count++
   },
+  changeItemInfo(state, val) {
+    state.item_info = val
+  },
   [SOME_MUTATION](state) {
     // mutate state
   }

+ 7 - 0
web_src/src/store/state.js

@@ -0,0 +1,7 @@
+
+const state = {
+  count: '1',
+  item_info: {}
+}
+
+export default state