Files
journal/vendor/weiwei/api-doc/src/DocController.php
wangjinlei ba50974c16 20201112
2020-11-13 10:10:23 +08:00

271 lines
8.0 KiB
PHP

<?php
namespace Api\Doc;
use think\View;
use think\Request;
class DocController
{
protected $assets_path = "";
protected $view_path = "";
protected $root = "";
/**
* @var \think\Request Request实例
*/
protected $request;
/**
* @var \think\View 视图类实例
*/
protected $view;
/**
* @var Doc
*/
protected $doc;
/**
* @var array 资源类型
*/
protected $mimeType = [
'xml' => 'application/xml,text/xml,application/x-xml',
'json' => 'application/json,text/x-json,application/jsonrequest,text/json',
'js' => 'text/javascript,application/javascript,application/x-javascript',
'css' => 'text/css',
'rss' => 'application/rss+xml',
'yaml' => 'application/x-yaml,text/yaml',
'atom' => 'application/atom+xml',
'pdf' => 'application/pdf',
'text' => 'text/plain',
'png' => 'image/png',
'jpg' => 'image/jpg,image/jpeg,image/pjpeg',
'gif' => 'image/gif',
'csv' => 'text/csv',
'html' => 'text/html,application/xhtml+xml,*/*',
];
public function __construct(Request $request = null)
{
//5.1 去除常量调整导致的问题
if(!defined('THINK_VERSION')){
if(!defined('DS')) define('DS', DIRECTORY_SEPARATOR);
}
//有些程序配置了默认json问题
config('default_return_type', 'html');
if (is_null($request)) {
$request = Request::instance();
}
$this->request = $request;
$this->assets_path = __DIR__.DS.'assets'.DS;
$this->view_path = __DIR__.DS.'view'.DS;
if(!defined('THINK_VERSION')){
$this->doc = new Doc((array)\think\facade\Config::pull('doc'));
}else{
$this->doc = new Doc((array)\think\Config::get('doc'));
}
$config = [
'view_path' => $this->view_path,
'default_filter' => '',
];
$this->view = new View($config);
if(!$this->view->engine){
$this->view->init($config);
}
$this->view->assign('title',$this->doc->__get("title"));
$this->view->assign('version',$this->doc->__get("version"));
$this->view->assign('copyright',$this->doc->__get("copyright"));
$this->assets_path = $this->doc->__get("static_path");
$this->assets_path = $this->assets_path ? $this->assets_path : '/doc/assets';
$this->view->assign('static', $this->assets_path);
$this->root = $this->request->root() ? $this->request->root() : $this->request->domain();
}
/**
* 验证密码
* @return bool
*/
protected function checkLogin()
{
$pass = $this->doc->__get("password");
if($pass){
if(session('pass') === md5($pass)){
return true;
}else{
return false;
}
}else{
return true;
}
}
/**
* 显示模板
* @param $name
* @param array $vars
* @param array $replace
* @param array $config
* @return string
*/
protected function show($name, $vars = [], $config = [])
{
$vars = array_merge(['root'=>$this->root], $vars);
return $this->view->fetch($name, $vars, $config);
}
/**
* 解析资源
* @return $this
*/
public function assets()
{
$assets_path = __DIR__.DS.'assets'.DS;
$path = str_replace("doc/assets", "", $this->request->pathinfo());
$ext = $this->request->ext();
if($ext)
{
$type= "text/html";
$content = file_get_contents($assets_path.$path);
if(array_key_exists($ext, $this->mimeType))
{
$type = $this->mimeType[$ext];
}
return response($content, 200, ['Content-Length' => strlen($content)])->contentType($type);
}
}
/**
* 输入密码
* @return string
*/
public function pass()
{
return $this->show('pass');
}
/**
* 登录
* @return string
*/
public function login()
{
$pass = $this->doc->__get("password");
if($pass && $this->request->param('pass') === $pass){
session('pass', md5($pass));
$data = ['status' => '200', 'message' => '登录成功'];
}else if(!$pass){
$data = ['status' => '200', 'message' => '登录成功'];
}else{
$data = ['status' => '300', 'message' => '密码错误'];
}
return response($data, 200, [], 'json');
}
/**
* 文档首页
* @return mixed
*/
public function index()
{
if($this->checkLogin()){
return $this->show('index', ['doc' => $this->request->param('doc')]);
}else{
return redirect('doc/pass');
}
}
/**
* 文档搜素
* @return mixed|\think\Response
*/
public function search()
{
if($this->request->isAjax())
{
$data = $this->doc->searchList($this->request->param('query'));
return response($data, 200, [], 'json');
}
else
{
$module = $this->doc->getModuleList();
return $this->show('search', ['module' => $module]);
}
}
/**
* 设置目录树及图标
* @param $actions
* @return mixed
*/
protected function setIcon($actions, $num = 1)
{
foreach ($actions as $key=>$moudel){
if(isset($moudel['actions'])){
$actions[$key]['iconClose'] = $this->assets_path."/js/zTree_v3/img/zt-folder.png";
$actions[$key]['iconOpen'] = $this->assets_path."/js/zTree_v3/img/zt-folder-o.png";
$actions[$key]['open'] = true;
$actions[$key]['isParent'] = true;
$actions[$key]['actions'] = $this->setIcon($moudel['actions'], $num = 1);
}else{
$actions[$key]['icon'] = $this->assets_path."/js/zTree_v3/img/zt-file.png";
$actions[$key]['isParent'] = false;
$actions[$key]['isText'] = true;
}
}
return $actions;
}
/**
* 接口列表
* @return \think\Response
*/
public function getList()
{
$list = $this->doc->getList();
$list = $this->setIcon($list);
return response(['firstId'=>'', 'list'=>$list], 200, [], 'json');
}
/**
* 接口详情
* @param string $name
* @return mixed
*/
public function getInfo($name = "")
{
list($class, $action) = explode("::", $name);
$action_doc = $this->doc->getInfo($class, $action);
if($action_doc)
{
$return = $this->doc->formatReturn($action_doc);
$action_doc['header'] = isset($action_doc['header']) ? array_merge($this->doc->__get('public_header'), $action_doc['header']) : [];
$action_doc['param'] = isset($action_doc['param']) ? array_merge($this->doc->__get('public_param'), $action_doc['param']) : [];
return $this->show('info', ['doc'=>$action_doc, 'return'=>$return]);
}
}
/**
* 接口访问测试
* @return \think\Response
*/
public function debug()
{
$data = $this->request->param();
$api_url = $this->request->param('url');
$res['status'] = '404';
$res['meaasge'] = '接口地址无法访问!';
$res['result'] = '';
$method = $this->request->param('method_type', 'GET');
$cookie = $this->request->param('cookie');
$headers = $this->request->param('header/a', array());
unset($data['method_type']);
unset($data['url']);
unset($data['cookie']);
unset($data['header']);
$res['result'] = http_request($api_url, $cookie, $data, $method, $headers);
if($res['result']){
$res['status'] = '200';
$res['meaasge'] = 'success';
}
return response($res, 200, [], 'json');
}
}