star7th 7 lat temu
rodzic
commit
e1fcd025c3

+ 241 - 0
server/Application/Api/Controller/FromCommentsController.class.php

@@ -0,0 +1,241 @@
+<?php
+namespace Api\Controller;
+use Think\Controller;
+/*
+    通过注释生成api文档
+ */
+class FromCommentsController extends BaseController {
+
+    public function generate(){
+        //return ;
+        header( 'Content-Type:text/html;charset=utf-8 ');
+        $content = I("content") ;
+        $api_key = I("api_key");
+        $api_token = I("api_token");
+
+        $item_id = D("ItemToken")->check($api_key , $api_token);
+        if (!$item_id) {
+            //没验证通过
+            echo "\napi_key或者api_token不匹配\n\n";
+            return false;
+        }
+
+        $p = '/\/\*\*([\s\S])*?\*\//' ;
+        preg_match_all($p, $content , $matches) ;
+        if ($matches && $matches[0]) {
+            foreach ($matches[0] as $key => $value) {
+                if (strstr($value,"@title") && strstr($value,"showdoc")) {
+                   $ret = $this->generate_one($item_id , $value);
+                }
+            }
+        }
+        if ($ret) {
+             echo "\n 成功 \n\n ";
+        }else{
+            echo "失败";
+        }
+
+    }
+
+    private function generate_one($item_id,$content){
+        $array = $this->parse_content($content);
+        $page_content = $this->toMarkdown($array);
+        $page_title = $array['title'];
+        $page_content = $page_content;
+        $cat_name = $array['cat_name'];
+        $cat_name_sub = $array['cat_name_sub'];
+        $s_number = $array['s_number'] ? $array['s_number'] : 99;
+        $page_id = D("Page")->update_by_content($item_id,$page_title,$page_content,$cat_name,$cat_name_sub,$s_number);
+        if ($page_id) {
+            $ret = D("Page")->where(" page_id = '$page_id' ")->find();
+            return $ret;
+        }else{
+            return false;
+        }
+
+    }  
+
+    //解析content,返回数组
+    private function parse_content($content){
+        $array = array() ;
+
+        //解析标题
+        $array['title'] = $this->parse_one_line("title" , $content);
+
+        $array['method'] = $this->parse_one_line("method" , $content);
+
+        $array['description'] = $this->parse_one_line("description" , $content);
+
+        $array['url'] = $this->parse_one_line("url" , $content);
+
+        //解析目录
+        $catalog = $this->parse_one_line("catalog" , $content);
+        $catalog_array = explode('/', $catalog);
+        $array['cat_name'] = $catalog_array[0] ;
+        $array['cat_name_sub'] = !empty($catalog_array[1])? $catalog_array[1] : '';
+
+        //解析返回内容
+        $return = $this->parse_one_line("return" , $content);
+        $return = htmlspecialchars_decode($return);
+        //判断是否是json数据
+        if (!is_null(json_decode($return))) {
+            //格式化下
+            $return = $this->indent_json($return);
+        }
+        $array['return'] = $return ;  
+
+        //解析请求参数
+        $array['param'] = $this->parse_muti_line('param' , $content);
+
+        //解析返回参数
+        $array['return_param'] = $this->parse_muti_line('return_param' , $content);
+
+        $array['remark'] = $this->parse_one_line("remark" , $content);
+
+        $array['number'] = $this->parse_one_line("number" , $content);
+
+
+        return $array ;
+    }
+
+    //解析单行标签,如method、url
+    private function parse_one_line($tag , $content){
+        $p = '/@'.$tag.'.+/' ;
+        preg_match($p, $content , $matches) ;
+        //var_dump($p);
+        //var_dump($matches);
+        if ($matches && $matches[0]) {
+           return  trim(str_replace('@'.$tag, '', $matches[0]) );
+        }
+
+        return false;
+
+    }
+
+    //解析多行标签,如param
+    private function parse_muti_line($tag , $content){
+        $return =array() ;
+        $array1 = explode("@", $content);
+        foreach ($array1 as $key => $value) {
+            $array2 = preg_split("/[\s]+/", trim($value));
+            if (!empty($array2[0]) && $array2[0] == $tag) {
+                    unset($array2[0]);
+                    $return[] = array_values($array2);
+            }
+
+        }
+
+        return $return;
+
+    }
+
+
+    /**
+     * Indents a flat JSON string to make it more human-readable.
+     *
+     * @param string $json The original JSON string to process.
+     *
+     * @return string Indented version of the original JSON string.
+     */
+    private function indent_json($json) {
+
+        $result      = '';
+        $pos         = 0;
+        $strLen      = strlen($json);
+        $indentStr   = '  ';
+        $newLine     = "\n";
+        $prevChar    = '';
+        $outOfQuotes = true;
+
+        for ($i=0; $i<=$strLen; $i++) {
+
+            // Grab the next character in the string.
+            $char = substr($json, $i, 1);
+
+            // Are we inside a quoted string?
+            if ($char == '"' && $prevChar != '\\') {
+                $outOfQuotes = !$outOfQuotes;
+
+            // If this character is the end of an element,
+            // output a new line and indent the next line.
+            } else if(($char == '}' || $char == ']') && $outOfQuotes) {
+                $result .= $newLine;
+                $pos --;
+                for ($j=0; $j<$pos; $j++) {
+                    $result .= $indentStr;
+                }
+            }
+
+            // Add the character to the result string.
+            $result .= $char;
+
+            // If the last character was the beginning of an element,
+            // output a new line and indent the next line.
+            if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
+                $result .= $newLine;
+                if ($char == '{' || $char == '[') {
+                    $pos ++;
+                }
+
+                for ($j = 0; $j < $pos; $j++) {
+                    $result .= $indentStr;
+                }
+            }
+
+            $prevChar = $char;
+        }
+
+        return $result;
+    }
+
+    //生成markdown文档内容
+    private function toMarkdown($array){
+        $content = '  
+**简要描述:** 
+
+- '.$array['description'].'
+
+**请求URL:** 
+- ` '.$array['url'].' `
+  
+**请求方式:**
+- '.$array['method'].' 
+
+**参数:** 
+
+|参数名|是否必选|类型|说明|
+|:----    |:---|:----- |-----   |'."\n";
+if ($array['param']) {
+    foreach ($array['param'] as $key => $value) {
+         $content .= '|'.$value[0].' |'.$value[1].'  |'.$value[2].' |'.$value[3].' |'."\n";
+    }
+}
+
+$content .= '
+ **返回示例**
+
+``` 
+'.$array['return'].'
+```
+
+ **返回参数说明** 
+
+|参数名|类型|说明|
+|:-----  |:-----|----- |'."\n";
+
+if ($array['return_param']) {
+    foreach ($array['return_param'] as $key => $value) {
+         $content .= '|'.$value[0].' |'.$value[1].'  |'.$value[2]."\n";
+    }
+}
+
+$content .= '
+ **备注** 
+
+- '.$array['remark'].'
+
+        ';
+        return $content;
+    }
+
+}

+ 6 - 0
server/Application/Api/Controller/OpenController.class.php

@@ -66,6 +66,12 @@ class OpenController extends BaseController {
         
     }
 
+    //通过注释生成api文档
+    public function fromComments(){
+        R("FromComments/generate");
+    }
+
+    
     private function _analyze_db_structure_to_array($table_info , $table_detail){
         $tables = array();