<?php
/**
* 验证司机证书
* @ApiMain => {"ApiName":"验证司机证书", "ApiDesc":"验证司机证书", "ApiUrl":"/third/yzDriverZhengShu", "ApiMethod":"POST"}
* @ApiParam => {"name":"code", "desc":"验证码","type":"string", "value":"", "required":"true"}
* @ApiParam => {"name":"user_mobile", "desc":"手机号","type":"string", "value":"", "required":"true"}
* @ApiParam => {"name":"user_card_sn", "desc":"身份证","type":"string", "value":"", "required":"true"}
* @ApiParam => {"name":"certificate_sn", "desc":"证书编号","type":"string", "value":"", "required":"true"}
* @ApiReturn => {}
* @ApiTime=> 20200728
*/
function parseApiFile($dir = '')
{
$apiDoc = [];
$rootPath = dirname(__FILE__);
$dir = $rootPath . "/../app/Http/Controllers/Api/V15/";
$arr = @scandir($dir);
foreach ($arr as $v) {
if ($v == "." || $v == "..") {
continue;
}
$file = $dir . $v;
$content = file_get_contents($file);
$preg = "/\/\*[\S\s]+?\*\//";
preg_match_all($preg, $content, $rows);
if (!!$rows) {
foreach ($rows[0] as $key => $row) {
$tmpArr = toMakeArr($row);
if ($tmpArr) {
$apiDoc[] = $tmpArr;
}
}
}
}
return $apiDoc;
}
function toMakeArr($str)
{
$info = [];
$preg_router = "/@ApiMain[\S\s]+?\\n/";
if (preg_match($preg_router, $str)) {
$arr = explode("\n", $str);
if ($arr) {
foreach ($arr as $a) {
$a = trimall($a);
if ($a == "/" || !$a) {
continue;
}
$b = explode("=>", $a);
if ($b[0] == "@ApiMain" && count($b) >= 2) {
$info = json_decode($b[1], true);
}
if ($b[0] == "@ApiParam" && count($b) >= 2) {
$info['ApiParam'][] = json_decode($b[1], true);
}
if ($b[0] == "@ApiReturn" && count($b) >= 2) {
$info['ApiReturn'] = $b[1];
}
if ($b[0] == "@ApiTime" && count($b) >= 2) {
$info['ApiTime'] = $b[1];
}
}
}
}
return $info;
}
function arraySort($array, $keys, $sort = 'asc')
{
$newArr = $valArr = array();
foreach ($array as $key => $value) {
$valArr[$key] = $value[$keys];
}
($sort == 'asc') ? asort($valArr) : arsort($valArr);
reset($valArr);
foreach ($valArr as $key => $value) {
$newArr[$key] = $array[$key];
}
return $newArr;
}
//删除空格 和 回车
function trimall($str)
{
$oldchar = array("", " ", "\t", "\n", "\r", "*");
$newchar = array("", "", "", "", "", "");
return str_replace($oldchar, $newchar, $str);
}
$list = parseApiFile();
$list = arraySort($list, 'ApiTime', $sort = 'desc');
$menuStr = '';
foreach ($list as $key => $vo) {
$menuStr .= "<li><a href='#p{$key}'>{$key}、{$vo['ApiName']}</a></li>";
}
$listStr = '';
foreach ($list as $key => $vo) {
$listStr .= '<div class="interface-item">
<div class="item-tt" id="p' . $key . '">
<span>' . $vo['ApiName'] . '</span> <span class="line"></span>
</div>
<div class="item-bd">
<div class="item-lft">功能</div>
<div class="item-rt">' . $vo['ApiDesc'] . '</div>
<div class="item-lft">HTTP请求方式</div>
<div class="item-rt">' . $vo['ApiMethod'] . '</div>
<div class="item-lft">请求URL</div>
<div class="item-rt code">' . $vo['ApiUrl'] . '</div>
<div class="item-lft">请求参数</div>
<div class="item-rt">
<table width="100%">
<tbody>
<tr>
<th width="15%">参数名称</th>
<th width="15%">类型</th>
<th width="10%">是否必须</th>
<th width="40%">描述</th>
<th width="20%">值</th>
</tr>
<form id="from_{{$vo . id}}" name="from_{{$vo . id}}">';
if ($vo['ApiParam']) {
foreach ($vo['ApiParam'] as $kk => $pp) {
$listStr .= "<tr><td>{$pp['name']}</td><td>{$pp['type']}</td><td>{$pp['required']}</td><td>{$pp['desc']}</td><td>{$pp['value']}</td></tr>";
}
}
$listStr .= '</form></tbody></table> </div>
<div class="item-lft">请求数据</div>
<pre class="item-rt code">' . $vo['ApiReturn'] . '</pre>
</div>
</div>';
}
$html = '
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="renderer" content="webkit">
<title>API接口文档</title>
<meta name="keywords" content="API接口文档">
<meta name="description" content="API接口文档">
<style>
* {
margin: 0px;
padding: 0px;
font-size: 12px;
font-family: "微软雅黑";
}
.red {
color: #ffffff;
}
body {
min-width: 1000px;
}
.contenttt {
background: #fff;
position: fixed;
right: 20px;
top: 20px;
_position: absolute;
_top: expression(offsetParent.scrollTop +20);
_left: expression(offsetParent.width);
z-index: 2000;
border: 1px solid #d7d7d7;
width: 400px;
padding-bottom: 10px;
}
.content{
margin: 5px;
width: 15%;
float: left;
background: #f8f8f8;
border: 1px dashed #d7d7d7;
border-radius: 10px;
}
.content .content-title h1 {
font-size: 14px;
height: 24px;
line-height: 24px;
padding-left: 10px;
}
.content .content-body {
padding-left: 20px;
}
.content .content-body li {
list-style: none;
height: 20px;
line-height: 20px;
width: 220px;
float: left;
}
.content .content-body li a {
font-size: 12px;
text-decoration: none;
}
.content .content-body li a:hover {
text-decoration: underline;
}
.box {
padding-left: 20px;
float:right;
width: 80%;
}
.box-title {
font-size: 14px;
font-weight: bold;
color: #555;
height: 36px;
line-height: 36px;
border-bottom: 1px solid #d0dfed
}
.box-notice {
padding-bottom: 20px;
}
.notice-title {
height: 24px;
line-height: 24px;
font-size: 13px;
font-weight: bold;
}
.notice-body {
padding-left: 24px;
line-height:22px;
}
.notice-body li {
list-style-type: square;
}
.interface-title {
height: 34px;
line-height: 34px;
background: #f6faff;
border: 1px solid #becfdd;
color: #333;
padding-left: 10px;
font-size: 13px;
font-weight: bold;
}
.item-tt {
position: relative;
height: 30px;
line-height: 30px;
margin: 10px 0px;
}
.item-tt span {
color: #0455CA;
font-size: 14px;
font-weight: bold;
background: #fff;
position: relative;
background: #fff;
z-index: 21;
padding: 0px 10px;
}
.item-tt span.line {
border-bottom: 1px dashed #666;
display: block;
position: relative;
top: -15px;
z-index: 20;
}
.item-bd {
padding-left: 30px;
overflow: hidden;
background: #d7d7d79c;
border-radius: 10px;
}
.item-bd ul li {
list-style: none;
height: 24px;
line-height: 24px;
}
.item-lft,.item-rt {
float: left;
line-height: 24px;
margin: 10px 0px;
}
.item-lft {
clear: both;
width: 140px;
font-weight: bold;
text-align: right;
}
.item-rt {
margin-left: 20px;
width: 70%;
padding-left: 10px;
}
.code {
border: 1px dashed #999;
background: #fafafa;
color: #555;
font-family: "Courier New";
margin-left: 30px;
width: 69%;
border-radius: 5px;
}
table {
border-collapse: collapse;
border: 1px solid #EDECEC;
}
table th,table td {
border: 1px solid #ccc
}
table th {
line-height: 30px;
background: #f8f8f8
}
table td {
line-height: 30px;
padding-left: 10px;
}
table tr.odd {
background: #fbfbfb
}
.interface-item {
clear: both;
}
.demolist li{float:left;margin:0px 10px;}
</style>
</head>
<body style="position:relative;">
<div class="content">
<div class="content-title">
<h1>目录</h1>
</div>
<ul class="content-body">' . $menuStr . '</ul>
</div>
<div class="box">
<div class="box-title">API接口文档</div>
' . $listStr . '
</div>
</div>
</body>
</html>';
echo $html;
php生成API文档
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 最近一直在整理公司前辈写的php后台api模块。发现api整理起来还是很麻烦的,而且很不直观,为此跟app端的开发...
- 在PHPer中,很多人听说过Swagger,部分人知道Swagger是用来做API文档的,然而只有少数人真正知道怎...
- 1.首先swagger 的认识 先说什么是Swagger, Swagger的使用目的是方便优美的呈现出接口API的...
- 需求: 为客户端同事写接口文档的各位后端同学,已经在各种场合回忆了使用自动化文档工具前手写文档的血泪史.我的故事却...