dubbo文档操作接口和页面

This commit is contained in:
暮光:城中城
2019-02-15 20:58:37 +08:00
parent 4a7541d7e7
commit 4d51b48429
42 changed files with 76 additions and 3913 deletions

View File

@@ -3,6 +3,7 @@
#### 说明
1. 本项目暂时只有swagger文档服务端的接口文档、dubbo文档、数据库文档数据库表、字段文档的查看修改功能
2. 如果需要类似文件夹、目录类的在线文档、文件管理访问权限控制暂时还没有可以提交Issues或评论说明具体需求整理需求后开发已有这方面打算最近接到比较多的这种需求
3. 欢迎加群讨论QQ群号466363173
#### 项目介绍
定位为所有文档的管理项目swagger文档、dubbo文档、数据库文档....等,提供一整套的解决方案,欢迎有想法的一起来写
@@ -16,7 +17,7 @@
##### 三、zyplayer-doc-manage 可以单独部署的文档管理后台
> 后端使用spring-boot、mybatis-plus、springfox-swagger等框架前端使用[zui](http://zui.sexy/)、[Vue](https://cn.vuejs.org/)等框架
> 已集成三套优秀swagger文档前端[zyplayer-doc-swagger](https://gitee.com/zyplayer/zyplayer-doc)、[swagger-bootstrap-ui](https://gitee.com/xiaoym/swagger-bootstrap-ui)、[springfox-swagger-ui](https://github.com/springfox/springfox/tree/master/springfox-swagger-ui)
> 已集成三套优秀swagger文档前端[zyplayer-doc-swagger](https://gitee.com/zyplayer/zyplayer-doc)、[swagger-bootstrap-ui](https://gitee.com/xiaoym/swagger-bootstrap-ui)、[springfox-swagger-ui](https://github.com/springfox/springfox/tree/master/springfox-swagger-ui)、[element-ui](http://element-cn.eleme.io)
> 已集成[zyplayer-doc-db](https://gitee.com/zyplayer/zyplayer-doc)数据库文档

View File

@@ -4,17 +4,15 @@
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>dubbo文档管理系统</title>
<link rel="shortcut icon" href="webjars/doc-dubbo/img/api.ico"/>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<link rel="shortcut icon" href="webjars/doc-dubbo/img/dubbo.ico"/>
<link rel="stylesheet" href="webjars/doc-dubbo/css/element-ui.css">
<link rel="stylesheet" href="webjars/doc-dubbo/css/doc-dubbo.css" />
</head>
<body>
<div id="app">
<el-container style="height: 100%;">
<el-aside width="auto" style="height: 100%;">
<div style="background: linear-gradient(-90deg, #03DDE4 0%, #30AFED 51%, #8755FF 100%);width: 100%; height:60px;line-height:60px;font-size: 25px;color: #fff;text-align: center;">
zyplayer-doc-dubbo
</div>
<div class="logo" @click="aboutDialogVisible = true">zyplayer-doc-dubbo</div>
<div style="padding: 10px;">
<div align="center"><el-button type="primary" v-on:click="reloadService" icon="el-icon-refresh" style="width: 100%;">重新加载服务列表</el-button></div>
<!--<el-row><el-switch v-model="isCollapse"></el-switch></el-row>-->
@@ -64,13 +62,25 @@
</el-table>
</el-form-item>
<el-form-item label="参数:">
<div slot="label">
<el-tooltip placement="top">
<div slot="content">1. 顺序必须和参数的顺序一致<br/>2. 参数名意义不大,可不填<br/>3. 类型必填,可手动输入,必须是全类名</div>
<i class="el-icon-info" style="color: #aaa;"></i>
</el-tooltip>
参数:
</div>
<el-table :data="docParamList" border style="width: 100%; margin-bottom: 5px;">
<el-table-column label="顺序" width="100">
<template slot-scope="scope">{{scope.$index + 1}}</template>
</el-table-column>
<el-table-column label="类型" width="200">
<el-table-column label="参数名" width="200">
<template slot-scope="scope">
<el-select v-model="scope.row.paramType" clearable placeholder="请选择">
<el-input v-model="scope.row.paramName"></el-input>
</template>
</el-table-column>
<el-table-column label="类型" width="300">
<template slot-scope="scope">
<el-select v-model="scope.row.paramType" filterable allow-create clearable placeholder="请选择" style="width: 100%;">
<el-option v-for="item in paramTypeOptions" :key="item.value" :label="item.value" :value="item.value"></el-option>
</el-select>
</template>
@@ -81,7 +91,7 @@
</template>
</el-table-column>
</el-table>
<el-button @click.prevent="saveDocInfoParam" style="float: right;margin: 5px;">保存</el-button>
<el-button @click.prevent="saveDocInfoParam" type="primary" style="float: right;margin: 5px;">保存</el-button>
<el-button @click.prevent="addDocParam" style="float: right;margin: 5px;">添加</el-button>
</el-form-item>
<el-form-item label="结果:">
@@ -100,7 +110,7 @@
<div v-if="!dubboInfo.interface">
请先选择服务
</div>
<div v-else>
<div v-loading="onlineDebugLoading" v-else>
<el-input placeholder="请输入内容" v-model="dubboInfo.function" class="input-with-select">
<el-select v-model="requestHostValue" slot="prepend" placeholder="请选择" style="width: 200px;">
<el-option v-for="item in requestHostOptions" :key="item.value" :label="item.value" :value="item.value"></el-option>
@@ -113,6 +123,9 @@
<el-table-column label="顺序" width="100">
<template slot-scope="scope">{{scope.$index + 1}}</template>
</el-table-column>
<el-table-column label="参数名" width="200">
<template slot-scope="scope">{{scope.row.paramName}}</template>
</el-table-column>
<el-table-column label="类型" width="200">
<template slot-scope="scope">{{scope.row.paramType}}</template>
</el-table-column>
@@ -135,10 +148,24 @@
</el-tabs>
</el-container>
</el-container>
<el-dialog title="关于zyplayer-doc-dubbo" :visible.sync="aboutDialogVisible" width="600px">
<el-form>
<el-form-item label="项目地址:">
<a target="_blank" href="https://gitee.com/zyplayer/zyplayer-doc">zyplayer-doc</a>
</el-form-item>
<el-form-item label="开发人员:">
<a target="_blank" href="http://zyplayer.com">暮光:城中城</a>
</el-form-item>
<el-form-item label="">
欢迎加群讨论QQ群号466363173欢迎提交需求欢迎使用和加入开发
</el-form-item>
</el-form>
</el-dialog>
</div>
</body>
<script type="text/javascript" src="https://unpkg.com/vue/dist/vue.js"></script>
<script type="text/javascript" src="https://unpkg.com/element-ui/lib/index.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/vue/vue.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/element-ui.js"></script>
<!-- ajax 用到了jquery -->
<script type="text/javascript" src="webjars/doc-dubbo/js/jquery-3.1.0.min.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/common.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/toast.js"></script>
@@ -151,6 +178,8 @@
data() {
return {
isCollapse: false,
aboutDialogVisible: false,
onlineDebugLoading: false,
pathIndex: [],
defaultProps: {
children: 'children',
@@ -182,8 +211,6 @@
value: 'java.lang.Long'
}, {
value: 'java.lang.Integer'
}, {
value: 'other'
}],
paramTypeValue: "java.lang.String",
}
@@ -264,7 +291,7 @@
var docParamList = [];
for (var i = 0; i < app.docParamList.length; i++) {
var item = app.docParamList[i];
if (isNotEmpty(item.paramType) || isNotEmpty(item.paramDesc)) {
if (isNotEmpty(item.paramType)) {
docParamList.push(item);
}
}
@@ -311,6 +338,7 @@
}
if (leadAdd) {
app.docParamList.push({
paramName: '',
paramType: '',
paramDesc: '',
paramValue: '',
@@ -341,7 +369,10 @@
paramTypes: paramTypes,
params: params,
};
app.requestResult = "";
app.onlineDebugLoading = true;
ajaxTemp("zyplayer-doc-dubbo/doc-dubbo/request", "post", "json", param, function (json) {
app.onlineDebugLoading = false;
if (validateResult(json)) {
try {
app.requestResult = Formatjson.processObjectToHtmlPre(JSON.parse(json.data), 0, false, false, false, false);
@@ -360,6 +391,12 @@
</script>
<style>
html,body,#app {
margin: 0;
padding: 0;
height: 100%;
}
pre{margin: 0;}
.el-menu {
box-sizing: border-box;
border-right: 0;
@@ -374,12 +411,10 @@
.el-tabs--border-card>.el-tabs__content{
height: calc(100vh - 70px);overflow-y: auto;
}
html,body,#app {
margin: 0;
padding: 0;
height: 100%;
.logo{
background: linear-gradient(-90deg, #03DDE4 0%, #30AFED 51%, #8755FF 100%); cursor: pointer;
width: 100%; height:60px;line-height:60px;font-size: 25px;color: #fff;text-align: center;
}
pre{margin: 0;}
</style>
</html>

View File

@@ -1,244 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>dubbo文档管理系统</title>
<link rel="shortcut icon" href="webjars/doc-dubbo/img/api.ico"/>
<link rel="stylesheet" href="webjars/doc-dubbo/zui/css/zui.min.css" />
<link rel="stylesheet" href="webjars/doc-dubbo/zui/lib/dashboard/zui.dashboard.min.css" />
<link rel="stylesheet" href="webjars/doc-dubbo/zui/lib/tabs/zui.tabs.min.css" />
<link rel="stylesheet" href="webjars/doc-dubbo/css/doc-dubbo.css" />
</head>
<body>
<div class="left-body" id="leftContent">
<div class="left-header">
<span class="logo" id="logoText">zyplayer-doc-dubbo</span>
<i class="icon icon-bars" id="changeContentWidth"></i>
</div>
<div class="scrollbar-hover left-container">
<!-- 样式类可选tree-menu tree-folders tree-chevrons tree-angles -->
<ul class="tree tree-lines tree-menu projects" data-ride="tree">
<li>
<div class="input-group">
<input type="text" class="form-control" id="searchDocInput">
<span class="input-group-btn">
<button class="btn btn-default" type="button" id="searchDocBt">搜索</button>
</span>
</div>
</li>
<li id="homePageLi"><a href="javascript:void(0)" path=""><i class="icon-home"></i> 控制台</a></li>
<li id="tabZpagesNavigationUl">
<a href="#"><i class="icon icon-cogs"></i> 文档管理</a>
<ul>
<li id="onlineDebugLi1" class="local-storage"><a href="javascript:void(0)" path=""><i class="icon-bug"></i> 在线调试管理</a></li>
<li><a href="#" class="page-nav" data-id="docShowConfig" data-href="webjars/zpages/docShowConfig.html" data-icon="icon-cog" data-reload="0"><i class="icon-cog"></i> 文档展示配置</a></li>
<li><a href="#" class="page-nav" data-id="docUrlConfig" data-href="webjars/zpages/docUrlConfig.html" data-icon="icon-list" data-reload="1"><i class="icon-list"></i> 文档地址管理</a></li>
<li><a href="#" class="page-nav" data-id="docUrlDetailConfig" data-href="webjars/zpages/docUrlDetailConfig.html" data-icon="icon-list-alt" data-reload="1"><i class="icon-list-alt"></i> 详细地址管理</a></li>
<li><a href="#" class="page-nav" data-id="globalParamConfig" data-href="webjars/zpages/globalParamConfig.html" data-icon="icon-globe" data-reload="1"><i class="icon-globe"></i> 全局参数管理</a></li>
<li><a href="#" class="page-nav" data-id="debugDataConfig" data-href="webjars/zpages/debugDataConfig.html" data-icon="icon-bug" data-reload="1"><i class="icon-bug"></i> 调试数据管理</a></li>
</ul>
</li>
</ul>
<div id="apiPathTree">
<ul class="tree tree-lines projects"></ul>
</div>
</div>
</div>
<div id="resizableLeftRight" class="ui-resizable-handle mgresizableW"></div>
<div class="right-container" id="rightContent">
<div class="right-container" id="rightContentMask"></div>
<div class="tab-page tab-home-page">
<div id="homePageDashboard">
<div class="dashboard" data-height="320"></div>
</div>
<div id="homePageDashboardTemplate" class="hidden">
<section class="row">
<div class="col-md-6 col-sm-6">
<div class="panel" data-id="1">
<div class="panel-heading">
<div class="title">工具介绍</div>
</div>
<div class="panel-body">
<div class="content about">
zyplayer-doc-swagger是swagger文档的管理工具使用简单、解析速度快、走心的设计
支持多项目同时展示,多种文档目录的展示方案,多种自定义配置,满足各种使用习惯。
本项目是完全从头写的所以有任何属性未解析到、UI上有何建议都能及时处理得到。
使用中您有任何的意见和建议都可到源码地址处反馈哦!<br/>
源码地址:<a target="_blank" href="https://gitee.com/zyplayer/zyplayer-doc">zyplayer-doc-swagger</a>(还有其他很多功能哦),
前端框架:<a target="_blank" href="http://zui.sexy">zui</a>(很不错),
我的网站:<a target="_blank" href="http://kongjianzhou.com">空间轴</a><a target="_blank" href="http://zyplayer.com">自由发挥</a>(都已很久未维护)
</div>
</div>
</div>
</div>
</section>
</div>
</div>
<div class="tab-page tab-zpages hide">
<div class="tabs" id="rightZpages"></div>
</div>
<div class="tab-page tab-document hide">
<ul class="nav nav-tabs">
<li class="active"><a data-tab href="#tabDocInfo">接口说明</a></li>
<li><a data-tab href="#tabOnlineDebug">在线调试</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane tab-document-pane active" id="tabDocInfo">
<table class="table table-bordered doc-table">
<tr>
<td class="info">服务地址</td>
<td><span id="docUrl" class="label label-warning"></span></td>
</tr>
<tr>
<td class="info">方法</td>
<td><span id="docRequestMethod" class="label label-warning"></span></td>
</tr>
<tr>
<td class="info">说明</td>
<td id="docInfo"></td>
</tr>
<tr>
<td class="info">请求参数</td>
<td>
<div class="tab-pane tab-param-type-pane active" id="docRequestParam">
<table class="table table-bordered table-condensed">
<thead>
<tr><th>参数名</th><th>说明</th><th>类型</th><th>参数位置</th><th>是否必填</th></tr>
</thead>
<tbody></tbody>
</table>
</div>
</td>
</tr>
<tr>
<td class="info">响应Model</td>
<td>
<div class="tab-pane tab-param-type-pane active" id="docResponseModel">
<table class="table table-bordered">
<thead>
<tr><th>状态码</th><th>说明</th></tr>
</thead>
<tbody></tbody>
</table>
</div>
</td>
</tr>
</table>
</div>
<div class="tab-pane tab-document-pane" id="tabOnlineDebug">
<div class="post-url-box">
<div class="input-group">
<input type="text" class="form-control" id="postUrlInput" placeholder="请求的完整地址">
<span class="input-group-btn">
<button class="btn btn-default" type="button">保存参数到文档</button>
</span>
<span class="input-group-btn">
<button class="btn btn-default send-request" type="button">发送请求 <i class="icon icon-spin icon-spinner-snake hide"></i></button>
</span>
</div>
</div>
<div class="param-response-box">
<div class="param-box">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" href="#tabParamBody">请求参数</a>
</h4>
</div>
<div id="tabParamBody" class="panel-collapse collapse in">
<form id="requestParamForm">
<div class="tab-pane tab-param-type-pane active" id="tabParamTypeForm">
<table class="table table-bordered param-table">
<thead>
<tr><th>参数名</th><th>参数类型</th><th>参数值</th><th>说明</th><th></th></tr>
</thead>
<tbody>
<tr class="base">
<td><input type="text" class="form-control" name="paramName" placeholder=""></td>
<td>
<div style="position: relative;">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<span class="options">String</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu pull-left" role="menu">
<li><a href="javascript:void(0);">String</a></li>
<li><a href="javascript:void(0);">Integer</a></li>
<li><a href="javascript:void(0);">Double</a></li>
</ul>
</div>
</td>
<td><input type="text" class="form-control" name="paramValue" placeholder=""></td>
<td><input type="text" class="form-control" name="paramDesc" placeholder=""></td>
<td><i class="icon-times"></i></td>
</tr>
</tbody>
</table>
</div>
</form>
</div>
</div>
</div>
<div class="response-box">
<ul class="nav nav-secondary">
<li class="info"><span>结果集</span></li>
<li class="active"><a data-tab href="#tabResponseBody">Body</a></li>
<li class="local-storage"><a data-tab href="#tabResponseCookie">Cookie</a></li>
<li><a data-tab href="#tabResponseHeader">Header</a></li>
<li class="right"><span>状态:<i id="httpRequestStatus">200</i>,耗时:<i id="httpRequestTime">0ms</i></span></li>
</ul>
<div class="tab-content">
<div class="tab-pane tab-response-pane active" id="tabResponseBody">
<!-- <textarea class="form-control" id="responseBodyTextArea" rows="20" placeholder=""></textarea> -->
<div id="responseBodyJsonDiv"></div>
</div>
<div class="tab-pane tab-response-pane" id="tabResponseCookie">
<table class="table table-bordered param-table">
<thead>
<tr>
<th>名字</th>
<th></th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div class="tab-pane tab-response-pane" id="tabResponseHeader">
<table class="table table-bordered param-table">
<thead>
<tr>
<th>名字</th>
<th></th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="webjars/doc-dubbo/js/jquery-3.1.0.min.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/zui/js/zui.min.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/zui/lib/tabs/zui.tabs.min.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/zui/lib/dashboard/zui.dashboard.min.js"></script>
<!--
<script type="text/javascript" src="webjars/doc-dubbo/js/doc-dubbo.min.js"></script>
-->
<script type="text/javascript" src="webjars/doc-dubbo/js/formatjson.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/toast.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/common.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/mgResizable.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/mg-ui-tree.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/mg-ui-tag.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/mg-ui-debug.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/mg-ui-export.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/mg-ui-cache-keys.js"></script>
<script type="text/javascript" src="webjars/doc-dubbo/js/doc-dubbo.js"></script>
</html>

View File

@@ -1,91 +0,0 @@
<!doctype html>
<html xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>调试数据管理</title>
<link rel="stylesheet" type="text/css" href="../doc-dubbo/zui/css/zui.min.css">
</head>
<body>
<div id="app">
<div class="title-info">
<div class="alert alert-primary">
<div class="content">Tips每次点击在线调试的发送请求后都会默认保存一次请求的form、header、body数据以备下次使用在此页面可以管理这些数据</div>
</div>
</div>
<table class="table table-bordered" id="onlineDebugParamTable">
<thead>
<tr><th>接口地址</th><th>参数配置</th><th>操作</th></tr>
</thead>
<tbody>
<tr v-for="(item,index) in debugDataList" :key="item.id" :data-id="item.id" :data-index="index" >
<td>{{item.key}}</td>
<td>{{item.value}}</td>
<td>
<button class="btn btn-danger" type="button" v-on:click="deleteDebugData($event)">删除</button>
</td>
</tr>
<tr>
<td colspan="3" align="center">
<button class="btn" type="button" v-on:click="btnRefreshList"> 刷新 </button>
</td>
</tr>
</tbody>
</table>
</div>
</body>
<script src="../mg-ui/js/jquery-3.1.0.min.js"></script>
<script src="../doc-dubbo/zui/js/zui.min.js"></script>
<script src="../mg-ui/js/common.js"></script>
<script src="../mg-ui/js/mg-ui-cache-keys.js"></script>
<script src="../doc-dubbo/vue/vue.js"></script>
<script src="../mg-ui/js/toast.js"></script>
<script>
var urlBase = "../../";
var app = new Vue({
el: '#app',
data: {
debugDataList: [],
},
mounted: function(){
this.refreshList();
},
methods: {
btnRefreshList: function(){
this.refreshList();
Toast.success("刷新成功!");
},
deleteDebugData: function(event){
var tr = $(event.currentTarget).parents("tr");
var index = tr.data("index");
var delKey = app.debugDataList[index].key;
var newDebugList = [];
for(var i=0;i<app.debugDataList.length;i++){
if(i != index) {
newDebugList.push(app.debugDataList[i]);
}
}
deleteStorage(delKey, function(data){
app.debugDataList = newDebugList;
Toast.success("删除成功!");
});
},
refreshList: function () {
getStorageLike(cacheKeys.pRequestObjStart, function(data){
// console.log(data);
app.debugDataList = data;
});
}
}
});
</script>
<style>
#app{padding-top: 10px;}
</style>
</html>

View File

@@ -1,177 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>文档展示配置</title>
<link rel="stylesheet" type="text/css" href="../doc-dubbo/zui/css/zui.min.css">
</head>
<body>
<div id="app">
<table class="table table-bordered setting-table">
<thead>
<tr>
<td style="width: 150px;">参数名</td>
<td style="width: 300px;">参数值</td>
<td>说明</td>
</tr>
</thead>
<tbody>
<tr>
<td class="info">目录展示方式</td>
<td>
<label><input type="radio" name="catalogShowType" value="1" v-model="catalogShowType">分路径展示</label>
<label><input type="radio" name="catalogShowType" value="2" v-model="catalogShowType">分标签展示</label>
</td>
<td>分路径:/api/data/getDataList 分标签:/api└/data└/getDateList└post└get</td>
</tr>
<tr>
<td class="info">树形菜单展示方式</td>
<td>
<label><input type="radio" name="treeShowType" value="1" v-model="treeShowType">直角</label>
<label><input type="radio" name="treeShowType" value="2" v-model="treeShowType">导航</label>
<label><input type="radio" name="treeShowType" value="3" v-model="treeShowType">加减</label>
<label><input type="radio" name="treeShowType" value="4" v-model="treeShowType">文件夹</label>
<label><input type="radio" name="treeShowType" value="5" v-model="treeShowType">V型</label>
</td>
<td>请自行修改体验</td>
</tr>
<tr>
<td class="info">是否展示字段的类型</td>
<td>
<label><input type="radio" name="showParamType" value="1" v-model="showParamType"></label>
<label><input type="radio" name="showParamType" value="0" v-model="showParamType"></label>
</td>
<td>文档中是否展示类型:"reference": "(boolean)"</td>
</tr>
<tr>
<td class="info">仅使用上次请求参数</td>
<td>
<label><input type="radio" name="onlyUseLastParam" value="1" v-model="onlyUseLastParam"></label>
<label><input type="radio" name="onlyUseLastParam" value="0" v-model="onlyUseLastParam"></label>
</td>
<td>每个接口都使用最后一次请求的header、form、body参数参数列表有但上一次请求没有使用的则不会展示在请求参数里面从未请求过则展示所有参数</td>
</tr>
<tr>
<td class="info">自动填充请求参数</td>
<td>
<label><input type="radio" name="autoFillParam" value="1" v-model="autoFillParam">智能填充</label>
<label><input type="radio" name="autoFillParam" value="2" v-model="autoFillParam">全部填充</label>
<label><input type="radio" name="autoFillParam" value="0" v-model="autoFillParam"></label>
</td>
<td>不填充智能填充只填充flag、time等后缀的参数全部填充对应不上类型的使用“我是默认字符串”填充</td>
</tr>
<tr>
<td class="info">强制重写域名</td>
<td>
<label><input type="radio" name="forceRewriteDomain" value="1" v-model="forceRewriteDomain"></label>
<label><input type="radio" name="forceRewriteDomain" value="0" v-model="forceRewriteDomain"></label>
</td>
<td>文档在本地,想调试线上接口就可以勾选此参数,“在线调试”处的请求地址强制改为:“文档地址管理”处配置的重写域名+接口地址</td>
</tr>
</tbody>
</table>
</div>
</body>
<script src="../mg-ui/js/jquery-3.1.0.min.js"></script>
<script src="../doc-dubbo/zui/js/zui.min.js"></script>
<script src="../mg-ui/js/common.js"></script>
<script src="../mg-ui/js/mg-ui-cache-keys.js"></script>
<script src="../doc-dubbo/vue/vue.js"></script>
<script>
var urlBase = "../../";
var app = new Vue({
el: '#app',
data: {
initCount: 6,
catalogShowType: '',
treeShowType: '',
showParamType:'',
onlyUseLastParam: '',
autoFillParam: '',
forceRewriteDomain: '',
rewriteDomainUrl: '',
userSettings: {},
// 默认用户的配置对象
defaultUserSettings: {
autoFillParam : 0,// 自动填充参数0=否 1=智能填充 2=全部填充
onlyUseLastParam : 0,// 是否仅使用上次请求参数
showParamType : 1,// 是否展示字段的类型
catalogShowType : 2,// 目录的展示方式1=url分成一层一层的展示、2=整个url显示为一层展示
treeShowType : 1,// 树形菜单展示方式1=tree-angles、2=tree-menu、3=默认4=tree-folders、5=tree-chevrons
forceRewriteDomain: 0,// 强制重写域名 0=否 1=是
projects : [],// 所有的项目列表
removedProjects : [],// 被移除的项目列表
prevWNow : 360
}
},
methods: {
},
mounted: function(){
getStorage(cacheKeys.userSettings, function(data){
var empty = isEmpty(data) || isEmptyObject(data);
data = empty ? app.defaultUserSettings : data;
app.userSettings = data;
app.catalogShowType = data.catalogShowType;
app.treeShowType = data.treeShowType;
app.showParamType = data.showParamType;
app.onlyUseLastParam = data.onlyUseLastParam;
app.autoFillParam = data.autoFillParam;
app.forceRewriteDomain = data.forceRewriteDomain;
});
},
watch: {
catalogShowType: function(newVal, oldval){
app.userSettings.catalogShowType = newVal;
storeUserSettings(function(){
getExport().regeneratePathTree();
});
},
treeShowType: function(newVal, oldval){
app.userSettings.treeShowType = newVal;
storeUserSettings(function(){
getExport().updateTreeShowType();
});
},
showParamType: function(newVal, oldval){
app.userSettings.showParamType = newVal;
storeUserSettings();
},
onlyUseLastParam: function(newVal, oldval){
app.userSettings.onlyUseLastParam = newVal;
storeUserSettings();
},
autoFillParam: function(newVal, oldval){
app.userSettings.autoFillParam = newVal;
storeUserSettings();
},
forceRewriteDomain: function(newVal, oldval){
app.userSettings.forceRewriteDomain = newVal;
storeUserSettings();
},
}
});
// 存储用户的配置信息
function storeUserSettings(success) {
if (app.initCount-- <= 0) {
setStorage(cacheKeys.userSettings, app.userSettings, function () {
getExport().updateUserSettings(app.userSettings);
if(typeof success == "function") {
success();
}
});
}
}
</script>
<style>
#app{padding-top: 10px;}
</style>
</html>

View File

@@ -1,179 +0,0 @@
<!doctype html>
<html xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>文档地址管理</title>
<link rel="stylesheet" type="text/css" href="../doc-dubbo/zui/css/zui.min.css">
</head>
<body>
<div id="app">
<table class="table table-bordered setting-table">
<thead>
<tr>
<td style="width: 50px;">序号</td>
<td>地址</td>
<td>重写域名地址</td>
<td>持久化时间</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in swaggerResourcesList" :key="item.id" :data-id="item.id" :data-index="index" >
<td>{{index+1}}</td>
<td>{{item.url}}</td>
<td>{{item.rewriteDomainUrl}}</td>
<td>{{item.lastSync}}</td>
<td>
<button class="btn btn-danger" type="button" v-on:click="deleteDocUrl($event)">删除</button>
<button class="btn btn-info" type="button" v-on:click="editDocUrl($event)">编辑</button>
<!--<button class="btn btn-danger" type="button" v-on:click="syncDocData($event)">持久化</button>-->
</td>
</tr>
<tr>
<td colspan="5" align="center">
<button class="btn" type="button" v-on:click="btnRefreshList"> 刷新 </button>
<button class="btn btn-info" type="button" v-on:click="exportDocument">导出文档</button>
<button class="btn btn-primary" type="button" v-on:click="addNewDocument">增加文档</button>
</td>
</tr>
</tbody>
</table>
<!-- 增加文档弹出框 -->
<div class="modal fade" id="addNewDocumentModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span><span class="sr-only">关闭</span>
</button>
<h4 class="modal-title">输入文档地址</h4>
</div>
<div class="modal-body">
<div class="input-line">
地址:
<input v-model="addNewDocumentInput" type="text" class="form-control" placeholder="例http://127.0.0.1/swagger-resources 或 http://127.0.0.1/v2/api-docs">
</div>
<div class="input-line">
重写域名地址:
<input v-model="rewriteDomainUrl" type="text" name="rewriteDomainUrl" class="form-control" placeholder="文档展示配置页 勾选“重写域名”重写的地址">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" v-on:click="addNewDocumentBtn">保存</button>
</div>
</div>
</div>
</div>
</div>
</body>
<script src="../mg-ui/js/jquery-3.1.0.min.js"></script>
<script src="../doc-dubbo/zui/js/zui.min.js"></script>
<script src="../mg-ui/js/common.js"></script>
<script src="../mg-ui/js/mg-ui-cache-keys.js"></script>
<script src="../doc-dubbo/vue/vue.js"></script>
<script src="../mg-ui/js/toast.js"></script>
<script>
var urlBase = "../../";
var app = new Vue({
el: '#app',
data: {
swaggerResourcesList: [],
addNewDocumentInput: '',
rewriteDomainUrl: '',
oldUrl: ''
},
methods: {
btnRefreshList: function(){
this.refreshList();
Toast.success("刷新成功!");
},
refreshList: function(){
getStorage(cacheKeys.swaggerResourcesList, function(data){
//console.log(data);
app.swaggerResourcesList = data;
});
},
editDocUrl: function(event){
var tr = $(event.currentTarget).parents("tr");
var index = tr.data("index");
var item = app.swaggerResourcesList[index];
app.oldUrl = item.url;
app.addNewDocumentInput = item.url;
app.rewriteDomainUrl = item.rewriteDomainUrl;
$('#addNewDocumentModal').modal({moveable:true});
},
addNewDocument: function(){
app.oldUrl = '';
app.addNewDocumentInput = '';
$('#addNewDocumentModal').modal({moveable:true});
},
addNewDocumentBtn: function(){
var addNewDocumentInput = app.addNewDocumentInput;
if(isEmpty(addNewDocumentInput)) {
Toast.error("地址不可以为空");return;
}
var param = {
resourcesUrl: addNewDocumentInput,
rewriteDomainUrl: app.rewriteDomainUrl,
oldUrl: app.oldUrl
};
ajaxTemp(urlBase + "swagger-mg-ui/document/addSwaggerResources", "post", "json", param, function(json){
if(validateResult(json)) {
//window.parent.document.location.reload();
//app.swaggerResourcesList.push(addNewDocumentInput);
app.refreshList();
$('#addNewDocumentModal').modal('hide');
Toast.success("保存成功,刷新后生效!");
}
});
},
exportDocument: function(){
getExport().exportDocument();
},
deleteDocUrl: function(event){
if(!confirm("确定要删除吗?")) {
return;
}
var tr = $(event.currentTarget).parents("tr");
var index = tr.data("index");
var newDocList = [];
for(var i=0;i<app.swaggerResourcesList.length;i++){
if(i != index) {
newDocList.push(app.swaggerResourcesList[i]);
}
}
setStorage(cacheKeys.swaggerResourcesList, newDocList, function(){
app.swaggerResourcesList = newDocList;
});
},
syncDocData: function(event){
var tr = $(event.currentTarget).parents("tr");
var index = tr.data("index");
var newDocUrl = app.swaggerResourcesList[index].url;
ajaxTemp(urlBase + "swagger-mg-ui/document/syncDocData", "post", "json", {resourcesUrl: newDocUrl}, function(json){
if(validateResult(json)) {
app.refreshList();
Toast.success("持久化成功!");
}
});
}
},
mounted: function(){
this.refreshList();
},
watch: {
}
});
</script>
<style>
#app{padding-top: 10px;}
.input-line{margin-bottom: 15px;}
</style>
</html>

View File

@@ -1,211 +0,0 @@
<!doctype html>
<html xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>详细地址管理</title>
<link rel="stylesheet" type="text/css" href="../doc-dubbo/zui/css/zui.min.css">
</head>
<body>
<div id="app">
<div class="alert alert-primary">
<div class="content">Tips开放文档地址 可以不需要登录即可访问,重写域名地址 填写后需开启:文档展示配置->强制重写域名 后才生效</div>
</div>
<table class="table table-bordered setting-table">
<thead>
<tr>
<td style="width: 50px;">序号</td>
<td>地址</td>
<td>开放文档地址</td>
<td>重写域名地址</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in swaggerLocationList" :key="item.id" :data-id="item.id" :data-index="index" >
<td>{{index+1}}</td>
<td>{{item.location}}</td>
<td>
<!--未开放时即使访问这个地址也看不了-->
<a v-if="item.openVisit == 1" :href="'../../open-doc.html?doc='+item.uuid" target="_blank">{{item.uuid}}</a>
<span v-else>暂未开放</span>
</td>
<td>{{item.rewriteDomainUrl}}</td>
<td>
<button class="btn btn-danger" type="button" @click="deleteDocUrl(item.location)">删除</button>
<button class="btn btn-info" type="button" v-on:click="editDocUrl($event)">编辑</button>
<!--<button class="btn btn-danger" type="button" v-on:click="syncDocData($event)">持久化</button>-->
</td>
</tr>
<tr>
<td colspan="5" align="center">
<button class="btn" type="button" v-on:click="btnRefreshList"> 刷新 </button>
<button class="btn btn-primary" type="button" v-on:click="addNewDocument">增加文档</button>
</td>
</tr>
</tbody>
</table>
<!-- 增加文档弹出框 -->
<div class="modal fade" id="addNewDocumentModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span><span class="sr-only">关闭</span>
</button>
<h4 class="modal-title">输入文档地址</h4>
</div>
<div class="modal-body">
<div class="input-line">
地址:
<input v-model="addNewDocumentInput" type="text" class="form-control" placeholder="例http://127.0.0.1/swagger-resources 或 http://127.0.0.1/v2/api-docs">
</div>
<div class="input-line">
重写域名地址:
<input v-model="rewriteDomainUrl" type="text" name="rewriteDomainUrl" class="form-control" placeholder="文档展示配置页 勾选“重写域名”重写的地址">
</div>
<div class="input-line">
<div class="switch switch-inline">
<input type="checkbox" v-model="openVisit">
<label>是否开启开放文档</label>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" v-on:click="addNewDocumentBtn">保存</button>
</div>
</div>
</div>
</div>
</div>
</body>
<script src="../mg-ui/js/jquery-3.1.0.min.js"></script>
<script src="../doc-dubbo/zui/js/zui.min.js"></script>
<script src="../mg-ui/js/common.js"></script>
<script src="../mg-ui/js/mg-ui-cache-keys.js"></script>
<script src="../doc-dubbo/vue/vue.js"></script>
<script src="../mg-ui/js/toast.js"></script>
<script>
var urlBase = "../../";
var app = new Vue({
el: '#app',
data: {
swaggerLocationList: [],
addNewDocumentInput: '',
rewriteDomainUrl: '',
openVisit: '',
oldLocation: ''
},
methods: {
btnRefreshList: function(){
this.refreshList();
Toast.success("刷新成功!");
},
refreshList: function () {
getStorage(cacheKeys.swaggerLocationList, function (data) {
//console.log(data);
var swaggerLocationList = data;
for (var i = 0; i < swaggerLocationList.length; i++) {
swaggerLocationList[i].location = decodeURI(swaggerLocationList[i].location);
}
app.swaggerLocationList = swaggerLocationList;
});
},
editDocUrl: function (event) {
var tr = $(event.currentTarget).parents("tr");
var index = tr.data("index");
var item = app.swaggerLocationList[index];
app.oldLocation = item.location;
app.addNewDocumentInput = item.location;
app.rewriteDomainUrl = item.rewriteDomainUrl;
app.openVisit = (item.openVisit == 1);
$('#addNewDocumentModal').modal({moveable: true});
},
addNewDocument: function(){
app.openVisit = false;
app.oldLocation = '';
app.addNewDocumentInput = '';
$('#addNewDocumentModal').modal({moveable:true});
},
addNewDocumentBtn: function(){
var addNewDocumentInput = app.addNewDocumentInput;
if(isEmpty(addNewDocumentInput)) {
Toast.error("地址不可以为空");return;
}
var param = {
openVisit: app.openVisit ? 1 : 0,
resourcesUrl: addNewDocumentInput,
rewriteDomainUrl: app.rewriteDomainUrl,
oldUrl: app.oldLocation
};
ajaxTemp(urlBase + "swagger-mg-ui/document/addSwaggerResources", "post", "json", param, function(json){
if(validateResult(json)) {
//window.parent.document.location.reload();
//app.swaggerLocationList.push(addNewDocumentInput);
app.refreshList();
$('#addNewDocumentModal').modal('hide');
Toast.success("保存成功,刷新后生效!");
}
});
},
deleteDocUrl: function (location) {
if (!confirm("确定要删除吗?")) {
return;
}
ajaxTemp(urlBase + "swagger-mg-ui/document/deleteSwaggerDoc", "post", "json", {location: location}, function (json) {
if (validateResult(json)) {
app.refreshList();
}
});
},
syncDocData: function (event) {
var tr = $(event.currentTarget).parents("tr");
var index = tr.data("index");
var newDocUrl = app.swaggerLocationList[index].location;
ajaxTemp(urlBase + "swagger-mg-ui/document/syncDocData", "post", "json", {resourcesUrl: newDocUrl}, function (json) {
if (validateResult(json)) {
app.refreshList();
Toast.success("持久化成功!");
}
});
},
encodeUrlParam: function(resourcesUrl) {
var indexOf = resourcesUrl.indexOf("?");
if (indexOf < 0) {
return resourcesUrl;
}
var baseUrl = resourcesUrl.substring(0, indexOf + 1);
var paramArr = resourcesUrl.substring(indexOf + 1).split("&");
for (var i = 0; i < paramArr.length; i++) {
var param = paramArr[i];
var split = param.split("=");
if (i > 0) {
baseUrl.append("&");
}
if (split.length === 2) {
baseUrl += split[0] + "=" + encodeURI(split[1]);
} else {
baseUrl += param;
}
}
return baseUrl.toString();
}
},
mounted: function(){
this.refreshList();
},
watch: {
}
});
</script>
<style>
#app{padding-top: 10px;}
.input-line{margin-bottom: 15px;}
</style>
</html>

View File

@@ -1,138 +0,0 @@
<!doctype html>
<html xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>测试</title>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>
<body>
<div id="app">
<el-button @click="visible = true">Button</el-button>
<el-dialog :visible.sync="visible" title="Hello world" close-on-click-modal show-close>
<p>Try Element</p>
</el-dialog>
<!-- Table -->
<el-button type="text" @click="dialogTableVisible = true">打开嵌套表格的 Dialog</el-button>
<el-dialog title="收货地址" :visible.sync="dialogTableVisible">
<el-table :data="gridData">
<el-table-column property="date" label="日期" width="150"></el-table-column>
<el-table-column property="name" label="姓名" width="200"></el-table-column>
<el-table-column property="address" label="地址"></el-table-column>
</el-table>
</el-dialog>
<!-- Form -->
<el-button type="text" @click="dialogFormVisible = true">打开嵌套表单的 Dialog</el-button>
<el-dialog title="收货地址" :visible.sync="dialogFormVisible">
<el-form :model="form">
<el-form-item label="活动名称" :label-width="formLabelWidth">
<el-input v-model="form.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="活动区域" :label-width="formLabelWidth">
<el-select v-model="form.region" placeholder="请选择活动区域">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消</el-button>
<el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
</div>
</el-dialog>
<el-tooltip placement="top" >
<div slot="content">多行信息<br/>第二行信息</div>
<el-button>Top center</el-button>
</el-tooltip>
<el-row>
<el-button>默认按钮</el-button>
<el-button type="primary">主要按钮</el-button>
<el-button type="success">成功按钮</el-button>
<el-button type="info">信息按钮</el-button>
<el-button type="warning">警告按钮</el-button>
<el-button type="danger">危险按钮</el-button>
</el-row>
<el-row>
<el-button plain>朴素按钮</el-button>
<el-button type="primary" plain>主要按钮</el-button>
<el-button type="success" plain>成功按钮</el-button>
<el-button type="info" plain>信息按钮</el-button>
<el-button type="warning" plain>警告按钮</el-button>
<el-button type="danger" plain>危险按钮</el-button>
</el-row>
<el-row>
<el-button round>圆角按钮</el-button>
<el-button type="primary" round>主要按钮</el-button>
<el-button type="success" round>成功按钮</el-button>
<el-button type="info" round>信息按钮</el-button>
<el-button type="warning" round>警告按钮</el-button>
<el-button type="danger" round>危险按钮</el-button>
</el-row>
<el-row>
<el-button icon="el-icon-search" circle></el-button>
<el-button type="primary" icon="el-icon-edit" circle></el-button>
<el-button type="success" icon="el-icon-check" circle></el-button>
<el-button type="info" icon="el-icon-message" circle></el-button>
<el-button type="warning" icon="el-icon-star-off" circle></el-button>
<el-button type="danger" icon="el-icon-delete" circle></el-button>
</el-row>
</div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script>
new Vue({
el: '#app',
data: function() {
return {
visible: false,
gridData: [{
date: '2016-05-02',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-04',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-01',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}, {
date: '2016-05-03',
name: '王小虎',
address: '上海市普陀区金沙江路 1518 弄'
}],
dialogTableVisible: false,
dialogFormVisible: false,
form: {
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: ''
},
formLabelWidth: '120px'
}
}
});
</script>
<style>
#app{padding-top: 10px;}
</style>
</html>

View File

@@ -1,113 +0,0 @@
<!doctype html>
<html xmlns:v-on="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>全局参数管理</title>
<link rel="stylesheet" type="text/css" href="../doc-dubbo/zui/css/zui.min.css">
</head>
<body>
<div id="app">
<div class="alert alert-primary">
<div class="content">Tips所有接口的在线调试页面都将展示本页面配置的参数和值可统一配置会话等数据</div>
</div>
<table class="table table-bordered setting-table">
<thead>
<tr>
<td>参数位置</td>
<td>参数名</td>
<td>参数值</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in globalParamList" :key="item.id" :data-id="item.id" :data-index="index">
<td>
<select class="form-control" v-model:value="item.paramIn">
<option value="header">header</option>
<option value="form">form</option>
</select>
</td>
<td><input type="text" class="form-control" name="paramName" v-model:value="item.key" placeholder=""></td>
<td><input type="text" class="form-control" name="paramName" v-model:value="item.value" placeholder=""></td>
<td>
<button class="btn btn-danger" type="button" v-on:click="deleteParam($event)">删除</button>
</td>
</tr>
<tr>
<td colspan="3" align="center">
<button class="btn" type="button" v-on:click="btnRefreshList"> 刷新 </button>
<button class="btn btn-success" type="button" v-on:click="addGlobalParamLine()"> 新增 </button>
<button class="btn btn-info" type="button" v-on:click="saveAllGlobalParam">全部保存</button>
</td>
</tr>
</tbody>
</table>
</div>
</body>
<script src="../mg-ui/js/jquery-3.1.0.min.js"></script>
<script src="../doc-dubbo/zui/js/zui.min.js"></script>
<script src="../mg-ui/js/common.js"></script>
<script src="../mg-ui/js/mg-ui-cache-keys.js"></script>
<script src="../doc-dubbo/vue/vue.js"></script>
<script src="../mg-ui/js/toast.js"></script>
<script>
var urlBase = "../../";
var app = new Vue({
el: '#app',
data: {
globalParamList: []
},
methods: {
btnRefreshList: function () {
this.refreshList();
Toast.success("刷新成功!");
},
deleteParam: function (event) {
if (!confirm("确定要删除吗?")) {
return;
}
var tr = $(event.currentTarget).parents("tr");
var index = tr.data("index");
var newParamList = [];
for (var i = 0; i < app.globalParamList.length; i++) {
if (i != index) {
newParamList.push(app.globalParamList[i]);
}
}
app.globalParamList = newParamList;
},
addGlobalParamLine: function () {
app.globalParamList.push({
paramIn: 'header', key: '', value: ''
});
},
saveAllGlobalParam: function () {
setStorage(cacheKeys.globalParamList, app.globalParamList, function(){
getExport().updateGlobalParam(app.globalParamList);
Toast.success("保存成功!");
});
},
refreshList: function(){
getStorage(cacheKeys.globalParamList, function(data){
app.globalParamList = data || [];
});
},
},
mounted: function () {
this.refreshList();
}
});
</script>
<style>
#app {
padding-top: 10px;
}
</style>
</html>

View File

@@ -1,144 +0,0 @@
body{width: 100%;height: 100%;margin: 0;padding: 0;}
a:focus{outline:none;}
ul{list-style: none;list-style-type: none;}
.tree li a{white-space: nowrap;}
.tree-menu li > ul{background-color: #f1f1f1;}
.tree-menu li li li li a{padding-left: 68px;}
.tree-menu li li li li li a{padding-left: 88px;}
.tree-menu li li li li li li a{padding-left: 108px;}
.tree-menu li li li li li li li a{padding-left: 128px;}
.tree-menu li li li li li li li li a{padding-left: 148px;}
.tree-menu li li li li li li li li li a{padding-left: 168px;}
.tree-menu li li li li li li li li li li a{padding-left: 188px;}
.table td, .table th {vertical-align: middle;}
.dropdown-menu>li>a{max-width: 100%;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}
#tabDocInfo{position: absolute; bottom: 0;top: 60px;overflow-y: auto; right: 0; left: 10px;}
#tabOnlineDebug .param-response-box{position: absolute; bottom: 0;top: 100px;overflow-y: auto; right: 0; left: 10px;padding-right: 10px;}
#tabOnlineDebug .panel{margin-bottom: 10px;}
#requestParamForm .nav > li > a{padding: 6px 15px;}
.local-storage{display: none;}
.choice-location-list{margin-bottom: 10px; width: 100%;}
.choice-location-list .btn.dropdown-toggle{width: 100%; text-align: left;}
.choice-location-list .dropdown-menu{width: 100%;}
.choice-location-list .choice-text{max-width: calc(100% - 15px);overflow: hidden;float: left;white-space: nowrap;text-overflow: ellipsis;}
.choice-location-list .caret{float: right;margin-top: 8px;}
/**lable的覆盖样式*/
.label{font-size: 100%;}
.label-warning {background-color: #f9f5ee; color: #f1a325;}
label{font-weight: normal;}
.overwrite-label{margin-bottom: 0;}
.nav.gray{background-color: #f1f1f1;margin-bottom: 10px;}
.doc-table tr .info{text-align: right; width: 100px;}
.setting-table tr .info{text-align: right; max-width: 150px;}
.show-doc span{color: #aaa;}
.mgresizableW{z-index: 90;height: 100%; width: 10px; cursor: e-resize;}
.ui-resizable-handle {display: block;font-size: 0.1px;position: absolute;}
#resizableLeftRight{left: 360px;}
.unselect{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}
#homePageDashboard{overflow-y: auto;bottom: 0;top: 0;right: 0;left: 0;position: absolute;overflow-x: hidden;padding: 10px;}
#homePageDashboard .panel-body{padding: 10px;}
.content.about{line-height: 30px;}
#homePageLi{margin-top: 5px;}
.left-body{
width: 360px; height:100%; position: fixed; top: 0; bottom: 0; left: 0;
}
.left-header{
background: linear-gradient(-90deg, #03DDE4 0%, #30AFED 51%, #8755FF 100%);width: 100%; height:60px;line-height:60px;
position: absolute; top: 0; bottom: 0; left: 0;text-align: center;
}
.left-header .logo{
font-size: 30px;color: #fff;
}
.left-header .icon-bars{
font-size: 24px;float: right;margin: 18px 18px 0 0;color: #fff;cursor: pointer;
}
.left-container{
width: 100%;position: absolute;background: #f1f1f1;color: rgba(163, 175, 183, .9);
top: 60px; bottom: 0; left: 0; overflow-y: auto; padding: 10px;
}
.left-container .projects{border: 0px; border-radius: 0px;}
.right-container{
position: fixed;top: 0px; bottom: 0; left: 360px; right: 0;padding: 10px;
}
#docResponseModel td:first-child{width: 100px;}
#docResponseExample td:first-child{width: 100px;}
.modal-table-box{margin-top: 10px; max-height: 500px;overflow-y: auto;}
.modal-table-box{list-style: none;}
.modal-table-box ul{padding-left: 10px;}
.modal-table-box li{padding: 10px 15px; margin: 0 10px 10px 0; background-color: #f1f1f1;cursor: pointer;}
.modal-table-box li.checked{background-color: #8666b8;color:#fff;}
#exportDocumentText{height: 350px;}
#rightContentMask{background-color: rgba(0, 0, 0, 0);padding: 0;z-index:9999; height: 100%;display: none;position: absolute;top: 0;bottom: 0;left:0;right: 0;}
#rightZpages{height: 100%;position: relative;top: 0;bottom: 0;left:0;right: 0;}
/* 在线调试框样式 */
#tabParamBody .tab-content{padding-top: 10px;}
.post-url-box{padding: 10px 0;}
.post-url-box .input-group-btn:nth-child(2) button{border-left: 0;border-right: 0;border-radius: 0;}
.post-url-box .send-request .hide{display: none;}
.param-box{}
.param-box .panel-collapse{padding: 10px 10px 0 10px;}
.param-box .nav{background-color: #f1f1f1;}
.param-box .table{margin-bottom: 0;}
/* .param-box .nav > li > *{padding: 8px 25px;} */
.param-box .nav > li > span{position: relative; display: block;background-color: #ccc;padding: 9px 25px;}
.param-box .nav > .form-to-url{position: relative; display: block;padding: 8px 0 0 25px;}
.param-box .nav > .form-to-url label{margin: 0;}
.param-box .nav > .form-to-url input{margin: 0;}
.param-box .tab-content .tab-param-pane{padding: 10px 10px 0 10px;}
.param-box .table.param-table td, .param-box .table.param-table th{padding: 4px 5px;}
.param-box .param-table tbody td:nth-child(4){border-right: 0;}
.param-box .param-table tbody td:nth-child(5){border-left: 0;padding: 0 10px 0 0;width: 10px;}
.param-box .param-table tbody td:nth-child(5) i{cursor: pointer;color: #ccc;}
.param-box .param-table tbody td:nth-child(5) i:hover{color: #888;}
.param-box .param-table tbody tr.base td:last-child i{display: none;}
#bulkEditHeaderCheck{margin: 0 0 0 10px;}
#bulkEditHeader,#bulkEditForm{display: none;}
.response-box{margin-top: 10px;}
.response-box .nav > li > *{padding: 8px 25px;}
.response-box .nav > li span{position: relative; display: block;padding: 9px 25px;}
.response-box .nav > li.info span{background-color: #ccc;}
.response-box .nav > li.right{float: right;}
.response-box .nav > li.right i{color: #3280fc;}
.response-box .nav{background-color: #f1f1f1;}
.response-box .tab-content .tab-response-pane{padding: 10px;}
#responseBodyJsonIframe{width: 100%;height: 300px;border: 0;}
/* S-模拟请求 */
#tabSimulationResult{padding: 0 10px 0 0;position: absolute; bottom: 0;top: 60px;overflow-y: auto; right: 0; left: 10px;}
/* E-模拟请求 */
/* S-JSON展示的样式 */
pre.json{margin-top:0px;margin-bottom:0px;}
pre.json .canvas{font:10pt georgia;background-color:#ececec;color:#000000;border:1px solid #cecece;}
pre.json .object-brace{color:#00aa00;font-weight:bold;}
pre.json .array-brace{color:#0033ff;font-weight:bold;}
pre.json .property-name{color:#cc0000;font-weight:bold;}
pre.json .string{color:#007777;}
pre.json .number{color:#aa00aa;}
pre.json .boolean{color:#0000ff;}
pre.json .function{color:#aa6633;text-decoration:italic;}
pre.json .null{color:#0000ff;}
pre.json .comma{color:#000000;font-weight:bold;}
pre.json .annotation{color:#aaa;}
pre img{cursor: pointer;}
/* E-JSON展示的样式 */

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -281,7 +281,7 @@ String.prototype.format = function(args) {
} else {
return this;
}
}
};
String.prototype.endWith = function(str) {
if (str == null || str == "" || this.length == 0 || str.length > this.length) {
@@ -297,99 +297,6 @@ String.prototype.startWith = function(str) {
return (this.substr(0, str.length) == str);
};
/**
* 获取数据,异步的操作
*/
function getStorageLike(key, success, fail) {
var start = (typeof urlBase === 'string') ? urlBase : '';
ajaxTemp(start + "swagger-mg-ui/storage/like", "post", "json", {key: key}, function(json){
if(json.errCode == 200) {
if(typeof success == "function") {
var result = deserialize(json.data);
success(result);
}
} else {
if(typeof fail == "function") {
fail();
}
}
}, function(msg){
if(typeof fail == "function") {
fail();
}
});
}
/**
* 获取数据,异步的操作
*/
function getStorage(key, success, fail) {
var start = (typeof urlBase === 'string') ? urlBase : '';
ajaxTemp(start + "swagger-mg-ui/storage/data", "get", "json", {key: key}, function(json){
if(json.errCode == 200) {
if(typeof success == "function") {
var result = deserialize(json.data);
success(result);
}
} else {
if(typeof fail == "function") {
fail();
}
}
}, function(msg){
if(typeof fail == "function") {
fail();
}
});
}
/**
* 存储数据,异步的操作
*/
function setStorage(key, value, success, fail) {
value = $.zui.store.serialize(value);
var start = (typeof urlBase === 'string') ? urlBase : '';
ajaxTemp(start + "swagger-mg-ui/storage/data", "post", "json", {key: key, value: value}, function(json){
if(json.errCode == 200) {
if(typeof success == "function") {
success();
}
} else {
if(typeof fail == "function") {
fail(getNotEmptyStr(json.errMsg));
}
}
}, function(msg){
if(typeof fail == "function") {
fail("");
}
console.log("存储数据到服务器失败,请检查");
});
}
/**
* 删除数据
*/
function deleteStorage(key, success, fail) {
var start = (typeof urlBase === 'string') ? urlBase : '';
ajaxTemp(start + "swagger-mg-ui/storage/delete", "post", "json", {key: key}, function(json){
if(json.errCode == 200) {
if(typeof success == "function") {
success();
}
} else {
if(typeof fail == "function") {
fail(getNotEmptyStr(json.errMsg));
}
}
}, function(msg){
if(typeof fail == "function") {
fail("");
}
console.log("存储数据到服务器失败,请检查");
});
}
/**
* 获取父窗口的exports
* @returns

View File

@@ -1,424 +0,0 @@
/**
* zyplayer-doc-swagger是swagger的一个前端实现使用简单、解析速度快、走心的设计
* 支持多项目同时展示,多种文档目录的展示方案,多种自定义配置,满足各种使用习惯。
* 使用中您有任何的意见和建议都可到源码地址处反馈哦!
* git地址https://gitee.com/zyplayer/zyplayer-doc
* @author 暮光:城中城
* @since 2018年5月20日
*/
// 树的下表
var projectTreeIdIndex = 1;
// 依据目录树存储的map全局对象
var treePathDataMap = new Map();
// dubbo列表
var dubboDocList = [];
/**
* 网页加载完毕后的处理
*/
$(document).ready(function(){
globalLoadingMessager = new $.zui.Messager({type: 'primary', close: false, time: 0}).show();
showGlobalLoadingMessage('获取文档列表中,请稍候...', true);
ajaxTemp("zyplayer-doc-dubbo/doc-dubbo/getDocList", "get", "json", {}, function (json) {
if (validateResult(json)) {
dubboDocList = json.data || [];
createTreeViewByTree(dubboDocList);
initDashboard();
documentLoadFinish();
}
});
// 定义配置的标签页
var tabsArr = [
{id: 'docShowConfig', url: 'webjars/doc-dubbo-pages/docShowConfig.html', type: 'iframe', icon: 'icon-cog', forbidClose: true}
];
$('#rightZpages').tabs({tabs: tabsArr});
rightContentTabs = $('#rightZpages').data('zui.tabs');
});
/**
* 增加文档-通过服务器接口
* @returns
*/
function addDocumentByService(choiceDocList) {
// 获取原始的swagger的json对象
showGlobalLoadingMessage('通过服务器端获取文档中,请稍候...', true);
ajaxTemp("swagger-mg-ui/document/docs", "post", "json", {choiceDocList: choiceDocList}, function(json){
//console.log(json);
showGlobalLoadingMessage('文档获取成功,解析中,请稍候...', true);
if(isEmptyObject(json) || json.errCode !== 200) {
Toast.error("获取文档错误,请检查!");
return;
}
for (var i = 0; i < json.data.length; i++) {
showGlobalLoadingMessage('解析第'+(i+1)+'份文档,请稍候...', true);
var tempDoc = deserialize(json.data[i]);
console.log(tempDoc);
documentJsonArr.push(tempDoc);// 加到所有文档
addHomePageDashboard(tempDoc, tempDoc.fullUrl);
createDefinitionsMapByJson(tempDoc);
if(userSettings.catalogShowType == 1) {
createTreeViewByTree(tempDoc);// url分成一层一层的展示
} else if(userSettings.catalogShowType == 2){
createTreeViewByTag(tempDoc);// tag方式整个url显示为一层
} else {
createTreeViewByTree(tempDoc);// url分成一层一层的展示
}
}
documentLoadFinish();
}, function(msg){
Toast.error("获取文档失败,请检查!");
});
}
/**
* 增加文档-通过服务器接口
* @returns
*/
function addDocumentByLocationService(choiceDocList) {
// 获取原始的swagger的json对象
globalLoadingMessager.show();
showGlobalLoadingMessage('通过服务器端获取文档中,请稍候...', true);
ajaxTemp("swagger-mg-ui/document/docs", "post", "json", {choiceLocationList: choiceDocList}, function(json){
//console.log(json);
showGlobalLoadingMessage('文档获取成功,解析中,请稍候...', true);
if(isEmptyObject(json) || json.errCode !== 200) {
Toast.error("获取文档错误,请检查!");
return;
}
documentJsonArr = [];
initDashboard();
for (var i = 0; i < json.data.length; i++) {
showGlobalLoadingMessage('解析第' + (i + 1) + '份文档,请稍候...', true);
var tempDoc = deserialize(json.data[i]);
console.log(tempDoc);
documentJsonArr.push(tempDoc);// 加到所有文档
addHomePageDashboard(tempDoc, tempDoc.fullUrl);
createDefinitionsMapByJson(tempDoc);
if (userSettings.catalogShowType == 1) {
createTreeViewByTree(tempDoc);// url分成一层一层的展示
} else if (userSettings.catalogShowType == 2) {
createTreeViewByTag(tempDoc);// tag方式整个url显示为一层
} else {
createTreeViewByTree(tempDoc);// url分成一层一层的展示
}
}
documentLoadFinish();
}, function(msg){
Toast.error("获取文档失败,请检查!");
});
}
/**
* 自由拖动改变左右框架的宽度
*/
$("#resizableLeftRight").mgResizableWidth({
prev:"#leftContent",
prevWtMin: 120, prevWtMax: 999999,
nextWtMin: 360, nextWtMax: 999999,
onresize:function(prevWNow, nextWNow){
changeContentWidth(prevWNow);
},
onstart:function(){
$("body").addClass("unselect");
$("#rightContentMask").show();
},
onfinish:function(){
$("body").removeClass("unselect");
$("#rightContentMask").hide();
storeUserSettings();
}
});
/**
* 切换导航栏的宽度到最小或最大
*/
$("#changeContentWidth").click(function(){
var isMinWidth = ($("#leftContent").width() == 120);
changeContentWidth(isMinWidth ? 360 : 120);
});
/**
* 切换文档
*/
$("#choiceLocationList").on("click", ".dropdown-menu li", function(){
var text = $(this).find("a").text();
var location = $(this).find("a").data("location");
$("#choiceLocationList .choice-text").text(text);
// 切换文档
addDocumentByLocationService(location);
});
/**
* 搜索框回车事件
*/
$("#searchDocInput").keyup(function(e) {
if (e.keyCode == 13) {
searchDoc();
}
});
/**
* 搜索按钮点击
*/
$("#searchDocBt").click(function(){
searchDoc();
});
/**
* 切换选中和非选中样式
*/
$(".choise").on("click", "li", function(){
$(this).toggleClass("checked");
});
/**
* 页面导航切换
*/
$("#tabZpagesNavigationUl").on("click", ".page-nav", function(){
var id = $(this).data("id");
var href = $(this).data("href");
var icon = $(this).data("icon");
var reload = $(this).data("reload");
$(".tab-page").hide();
$(".tab-online-debug-page").hide();
$(".tab-zpages").show();
if(reload || $("#tab-"+id).length <= 0) {
var newTab = {id: id, url: href, type: 'iframe', icon: icon};
rightContentTabs.open(newTab);
} else {
$("#tab-nav-item-"+id+" .tab-nav-link").click();
}
});
/**
* 主页li点击事件展示主页
*/
$("#homePageLi").click(function(){
$(".tab-page,.tab-zpages").hide();
$(".tab-home-page").show();
});
/**
* api文档最后的节点点击展示文档页面
*/
$("#apiPathTree").on("click", ".show-doc", function(){
$(".tab-page").hide();
$(".tab-document").show();
var path = $(this).attr("path");
var method = $(this).attr("method");
var data = treePathDataMap.get(path);
var docInfo = "";//isNotEmpty(data.docInfo) ? getNotEmptyStr(data.docInfo.explain) : "";
var docUrl = getNotEmptyStr(data.interface);
$("#postUrlInput").val(data.interface + "#" + method + "()");
// 处理在线文档
$("#docUrl").text(docUrl);
$("#docRequestMethod").text(method);
$("#docInfo").text(docInfo);
$("#docConsumes").text(arrToString(data.consumes));
$("#docProduces").text(arrToString(data.produces));
$("#tabParamTypeBody textarea").val("");
// 遍历参数列表
$("#docRequestParam table tbody").empty();
$("#docRequestExample table tbody").empty();
requestParamObj = {};
Formatjson.annotationObject = {};
//addRequestParamObj(requestParamObj, "Content-Type", "string", "header", false, "", arrToString(data.consumes));
if(isNotEmpty(data.parameters)) {
Object.keys(data.parameters).forEach(function(key){
var tempParameters = data.parameters[key];
var htmlStr = "", htmlStrExample = "";
var required = tempParameters.required;
var paramName = getNotEmptyStr(tempParameters.name);
var paramType = getNotEmptyStr(tempParameters.type);
var paramDesc = getNotEmptyStr(tempParameters.description);
var paramIn = getNotEmptyStr(tempParameters.in);
var example = getNotEmptyStr(tempParameters.example, tempParameters.default);
$("#docRequestParam table tbody").append(
'<tr>'
+'<td>' + htmlStr + '</td>'
+'<td>' + paramDesc + '</td>'
+'<td>' + paramType + '</td>'
+'<td>' + paramIn + '</td>'
+'<td>' + required + '</td>'
+'</tr>'
);
});
}
// console.log(requestParamObj);
// var htmlStrTemp = Formatjson.processObjectToHtmlPre(requestParamObj, 0, false, false, false);
// $("#htmlStrTemp").html(htmlStrTemp);
$("#htmlStrTemp").parents("tr").hide();
//createOnlineDebugRequestParam(requestParamObj, getNotEmptyStr(data.url));
// 遍历结果集列表
$("#docResponseModel table tbody").empty();
$("#docResponseExample table tbody").empty();
Formatjson.annotationObject = {};
});
/**
* 搜索文档
* @returns
*/
function searchDoc() {
var keywords = $("#searchDocInput").val();
// 重新生成
regeneratePathTree(keywords);
if (isEmpty(keywords)){
return;
}
$('#apiPathTree .projects').tree('expand');
}
/**
* 重新生成文档
*/
function regeneratePathTree(keywords){
projectTreeIdIndex = 1;
treePathDataMap = new Map();
$('#apiPathTree').empty();
$('#apiPathTree').append('<ul class="tree tree-lines projects"></ul>');
createTreeViewByTree(dubboDocList, keywords);// url分成一层一层的展示
$('#apiPathTree .projects').tree();
updateTreeShowType();
}
function findInPathsValue(pathsValue, keywords) {
if (isEmpty(keywords)) {
return true;
}
keywords = keywords.toLowerCase();
// 找路径和说明里面包含关键字的
var interface = pathsValue.interface;
if (isNotEmpty(interface) && interface.toLowerCase().indexOf(keywords) >= 0) {
return true;
}
return false;
}
/**
* 修改左右框架的宽度
* @param width 左侧导航栏的宽度
* @returns
*/
function changeContentWidth(width) {
$("#leftContent").css("width", width + 'px');
$("#resizableLeftRight").css("left", width + 'px');
$("#rightContent").css("left", width + 'px');
var logoText = "zyplayer-doc-dubbo";
if(width < 370 && width > 290){
logoText = "zyplayer-doc";
} else if(width < 290){
logoText = "doc";
}
$("#logoText").text(logoText);
userSettings.prevWNow = width;
}
/**
* 增加项目文档
* @param json
* @returns
*/
function addHomePageDashboard(json, fullUrl) {
var info = json.info||{};
var contactName = "";
if(isNotEmpty(info.contact)) {
contactName = "昵称:" + getNotEmptyStr(info.contact.name, "-");
contactName += "<br/>邮箱:" + getNotEmptyStr(info.contact.email, "-");
contactName += "<br/>网站:" + getNotEmptyStr(info.contact.url, "-");
}
$("#homePageDashboard section").append(
'<div class="col-md-6 col-sm-6">'
+'<div class="panel" data-id="'+fullUrl+'">'
+'<div class="panel-heading">'
+'<div class="title">'+info.title+'</div>'
+'<div class="panel-actions">'
+'</div>'
+'</div>'
+'<div class="panel-body">'
+'<div class="content">'
+'<table class="table table-bordered setting-table">'
+'<tr>'
+'<td class="info">简介</td>'
+'<td>'+info.description+'</td>'
+'</tr>'
+'<tr>'
+'<td class="info">作者</td>'
+'<td>'+contactName+'</td>'
+'</tr>'
+'<tr>'
+'<td class="info">版本</td>'
+'<td>'+info.version+'</td>'
+'</tr>'
+'<tr>'
+'<td class="info">地址</td>'
+'<td>'+decodeURI(fullUrl)+'</td>'
+'</tr>'
+'</table>'
+'</div>'
+'</div>'
+'</div>'
+'</div>'
);
}
/**
* 修改树形菜单展示类型
* @param
* @returns
*/
function updateTreeShowType() {
return;
$('#apiPathTree .projects').removeClass("tree-angles tree-menu tree-folders tree-chevrons");
//tree-angles、2=tree-menu、3=默认4=tree-folders、5=tree-chevrons
$('#apiPathTree .projects').addClass("tree-lines");
var treeShowType = "tree-angles";
if(userSettings.treeShowType == 1) {
treeShowType = "tree-angles";
} else if(userSettings.treeShowType == 2) {
treeShowType = "tree-menu";
$('#apiPathTree .projects').removeClass("tree-lines");
} else if(userSettings.treeShowType == 3) {
treeShowType = "";
} else if(userSettings.treeShowType == 4) {
treeShowType = "tree-folders";
} else if(userSettings.treeShowType == 5) {
treeShowType = "tree-chevrons";
} else {
userSettings.treeShowType = 1;
}
if(isNotEmpty(treeShowType)) {
$('#apiPathTree .projects').addClass(treeShowType);
}
}
/**
* 初始化用户的设置
* @param
* @returns
*/
function documentLoadFinish() {
showGlobalLoadingMessage('文档解析完成!', false);
// 隐藏提示框
setTimeout(function() {
globalLoadingMessager.hide();
}, 1000);
regeneratePathTree();
//$('#apiPathTree .projects').tree();
$('#homePageDashboard .dashboard').dashboard({draggable: false});
}
function showGlobalLoadingMessage(text, loading) {
if(loading) {
text += '<i class="icon icon-spin icon-spinner-snake hide"></i>';
}
globalLoadingMessager.$.find(".messager-content").html(text);
}
function initDashboard(){
var template = $('#homePageDashboardTemplate').html();
$('#homePageDashboard').empty();
$('#homePageDashboard').append('<div class="dashboard" data-height="320"></div>');
$('#homePageDashboard .dashboard').append(template);
}

File diff suppressed because one or more lines are too long

View File

@@ -1,11 +0,0 @@
/**
* 页面中所有使用到的缓存key必须定义在这里
*/
var cacheKeys = {
userSettings: 'userSettings',
swaggerResourcesList: 'swagger-resources-list',
swaggerLocationList: 'swagger-location-list',
globalParamList: 'zyplayer-doc-global-param-list',
pRequestObjStart: 'p-request-obj-',
pSimulationResponse: 'p-simulation-response',
}

View File

@@ -1,648 +0,0 @@
/**
* 在线调试页面js
* @author 暮光:城中城
* @since 2018年7月20日
*/
$(document).ready(function(){
$("#debugRequstType .dropdown-menu li").click(function(){
var text = $(this).find("a").text();
$("#debugRequstType .options").text(text);
});
/**
* 保存参数模板
* @returns
*/
$(".save-request-template").click(function(){
Toast.notOpen();
});
/**
* 发送请求
* @returns
*/
$(".send-request").click(function(){
// 多行编辑状态下转成表单,下面读取表单内容
if ($("#bulkEditFormCheck").prop('checked')) {
var bulkEdit = $("#bulkEditForm").val();
bulkEditToTable("#tabParamTypeForm", bulkEdit);
}
if ($("#bulkEditHeaderCheck").prop('checked')) {
var bulkEdit = $("#bulkEditHeader").val();
bulkEditToTable("#tabParamHeader", bulkEdit);
}
$("#tabResponseHeader table tbody").empty();
$("#tabResponseCookie table tbody").empty();
$("#responseBodyTextArea").val("");
$("#responseBodyJsonDiv").html("暂无数据");
var storeRequestParam = {};
var docUrl = $("#docUrl").text();
var options = $("#debugRequstType .btn .options").text();
var postUrl = $("#postUrlInput").val();
var requestHeaderForm = $("#requestHeaderForm").serializeArray();
var requestParamForm = $("#requestParamForm").serializeArray();
var paramHeaderSend = {};
var paramFormSend = {};
var paramBodySend = $("[name=paramBody]").val();
var formToUrl = $("[name=formToUrl]").prop('checked') ? 1 : 0;
// 组装空的表单对象
var formDataToServer = new FormData();
requestHeaderForm = serializeArrayToObj(requestHeaderForm);
requestParamForm = serializeArrayToObj(requestParamForm);
storeRequestParam.formToUrl = formToUrl;
formDataToServer.append("formToUrl", formToUrl);
if (isNotEmpty(paramBodySend)) {
try {
paramBodySend = JSON.stringify(JSON.parse(paramBodySend));
} catch (e) {}
storeRequestParam.body = paramBodySend;
formDataToServer.append("body", paramBodySend);
// 替换path参数
Object.keys(requestParamForm).forEach(function (key) {
postUrl = postUrl.replace("{" + key + "}", requestParamForm[key]);
});
}
var reqParamStr = "";
Object.keys(requestParamForm).forEach(function (key) {
var value = requestParamForm[key];
if (isNotEmpty(key) && isNotEmpty(value)) {
if (isNotEmpty(reqParamStr)) {
reqParamStr += "&";
}
reqParamStr += key + "=" + value;
paramFormSend[key] = value;
// 替换path参数
postUrl = postUrl.replace("{" + key + "}", value);
}
});
storeRequestParam.form = paramFormSend;
// 显示加载中图标
$(".send-request .icon").removeClass("hide");
// 获取header
Object.keys(requestHeaderForm).forEach(function(key){
var value = requestHeaderForm[key];
if(isNotEmpty(key) && isNotEmpty(value)) {
paramHeaderSend[key] = value;
}
});
storeRequestParam.header = paramHeaderSend;
//console.log(paramBodySend);
var beforeSendTime = new Date().getTime();
// 拼装文件
var fileInput = $('#requestParamForm').find(".file-input");
for (var i = 0; i < fileInput.length; i++) {
var fileName = $(fileInput[i]).parents("tr").find("[name=paramName]").val();
for (var j = 0; j < fileInput[i].files.length; j++) {
formDataToServer.append('files', fileInput[i].files[j]);
formDataToServer.append('fileNames', fileName);
}
paramFormSend[fileName] = "-";
}
formDataToServer.append("header", JSON.stringify(paramHeaderSend));
formDataToServer.append("url", postUrl);
formDataToServer.append("method", options);
// 表单参数是否拼在url上
if(formToUrl == 1) {
postUrl += "?" + reqParamStr;
paramFormSend = "";
} else {
formDataToServer.append("form", JSON.stringify(paramFormSend));
}
// debugger;
// 模拟请求开始
postWithFile("swagger-mg-ui/http/request", formDataToServer, function(result){
if (!validateResult(result)) {
return;
}
var afterSendTime = new Date().getTime();
//console.log(result);
var requestObj = result.data;
setStorage(cacheKeys.pRequestObjStart + docUrl, storeRequestParam);
$("#httpRequestStatus").text(requestObj.status);
$("#httpRequestTime").text((afterSendTime - beforeSendTime) + "ms");
try {
var htmlStr = Formatjson.processObjectToHtmlPre(JSON.parse(requestObj.data), 0, false, false, false, false);
$("#responseBodyJsonDiv").html(htmlStr);
} catch (e) {
// 转json失败应该是个页面输出到iframe里不能影响当前页面
$("#responseBodyJsonDiv").html("<iframe id='responseBodyJsonIframe'></iframe>");
setTimeout(function () {
$("#responseBodyJsonIframe").contents().find("body").html(requestObj.data);
}, 300);
}
$("#tabResponseHeader table tbody").empty();
$("#tabResponseCookie table tbody").empty();
var headers = requestObj.header || [];
for (var i = 0; i < headers.length; i++) {
var name = getNotEmptyStr(headers[i].name);
var value = getNotEmptyStr(headers[i].value);
$("#tabResponseHeader table tbody").append(
'<tr>' + '<td>' + name + '</td>' + '<td>' + value + '</td>' + '</tr>'
);
}
var cookies = requestObj.cookie || [];
for (var i = 0; i < cookies.length; i++) {
var name = getNotEmptyStr(cookies[i].name);
var value = getNotEmptyStr(cookies[i].value);
$("#tabResponseCookie table tbody").append(
'<tr>' + '<td>' + name + '</td>' + '<td>' + value + '</td>' + '</tr>'
);
}
}, function () {
Toast.error("请求失败!");
}, function () {
$(".send-request .icon").addClass("hide");
});
});
/**
* 输入框输入之后,如果是最后一行则在增加一行
* @returns
*/
$(".param-table").on("keyup", "input[name=paramName]", function(){
var nextTr = $(this).parents("tr").next();
if(nextTr.length <= 0) {
$(this).parents(".param-table").append(getParamTableTr());
}
});
/**
* 参数删除一行
* @returns
*/
$(".param-table").on("click", ".icon-times", function(){
$(this).parents("tr").remove();
});
/**
* 在线调试管理
*/
$("#onlineDebugLi").click(function(){
$(".tab-page,.tab-zpages").hide();
$(".tab-online-debug-page").show();
createOnlineDebugParamTable();
});
/**
* 在线调试管理-刷新
*/
$(".tab-online-debug-page .refresh").click(function(){
createOnlineDebugParamTable();
});
/**
* 在线调试管理-展开所有
*/
$(".tab-online-debug-page .expand-all").click(function(){
$("#onlineDebugParamTable .option-img").attr("src", "webjars/doc-dubbo/img/expanded.png");
$("#onlineDebugParamTable .option-img").parent().next().show();
});
/**
* 在线调试管理-收起所有
*/
$(".tab-online-debug-page .collapse-all").click(function(){
$("#onlineDebugParamTable .option-img").attr("src", "webjars/doc-dubbo/img/collapsed.png");
$("#onlineDebugParamTable .option-img").parent().next().hide();
});
/**
* 在线调试-删除所有参数
*/
$(".tab-online-debug-page").on("click", ".del-all-param", function(){
$.zui.store.forEach(function(key, value) {// 遍历所有本地存储的条目
if(!key.startWith(cacheKeys.pRequestObjStart)) {
return;
}
$.zui.store.remove(key);
});
createOnlineDebugParamTable();
});
/**
* 在线调试-删除参数
*/
$(".tab-online-debug-page").on("click", ".del-param", function(){
var key = $(this).attr("key");
if(isNotEmpty(key)) {
$.zui.store.remove(key);
$(this).parents("tr").remove();
}
});
/**
* 提交模拟返回值
*/
$("#simulationResultSubmit").click(function(){
var value = $("#simulationResultText").val();
value = getNotEmptyStr(value, "");
var docUrl = $("#simulationResultUrl").text();
setStorage(cacheKeys.pSimulationResponse + docUrl, value, function() {
Toast.warn("提交成功!");
}, function(msg) {
Toast.error("提交失败!" + msg);
});
});
/**
* 获取模拟返回值
*/
$("#simulationResultGet").click(function(){
var docUrl = $("#simulationResultUrl").text();
getStorage(cacheKeys.pSimulationResponse + docUrl, function(data){
$("#simulationResultText").val(data);
});
});
});
/**
* 生成在线调试管理页面
* @returns
*/
function createOnlineDebugParamTable() {
$("#onlineDebugParamTable tbody").empty();
$.zui.store.forEach(function(key, value) {// 遍历所有本地存储的条目
if(!key.startWith(cacheKeys.pRequestObjStart)) {
return;
}
var newKey = key.substring(14, key.length);
var htmlStr = Formatjson.processObjectToHtmlPre(value, 0, false, false, false, false);
$("#onlineDebugParamTable tbody").append(
'<tr>'
+'<td>'+newKey+'</td>'
+'<td>'+htmlStr+'</td>'
+'<td><button class="btn btn-danger del-param" type="button" key="'+key+'">删除</button></td>'
+'</tr>'
);
});
}
/**
* 生成在线调试相关数据
* @param requestParamObj
* @returns
*/
function createOnlineDebugRequestParam(requestParamObj, url) {
// 查询之前的调试参数信息
getStorage(cacheKeys.pRequestObjStart + url, function(data) {
createOnlineDebugRequestParamFun(data, requestParamObj, url);
});
}
/**
* 生成在线调试相关数据
* @param oldRequestObj 之前的调试参数
* @param requestParamObj 参数列表的参数
* @param url 请求url
* @returns
*/
function createOnlineDebugRequestParamFun(oldRequestObj, requestParamObj, url) {
if(isEmptyObject(oldRequestObj)) {
oldRequestObj = {};
}
// 清空参数列表
$("#tabParamHeader table tbody .new").remove();
$("#tabParamTypeForm table tbody .new").remove();
$("#tabResponseHeader table tbody").empty();
$("#tabResponseCookie table tbody").empty();
$("#tabParamHeader .form-control").val("");
$("#tabParamTypeForm .form-control").val("");
$("#responseBodyTextArea").val("");
$("#responseBodyJsonDiv").html("暂无数据");
$("#bulkEditHeaderCheck").prop("checked", false);
$("#bulkEditFormCheck").prop("checked", false);
$("#bulkEditHeader,#bulkEditForm").hide();
$("#tabParamTypeForm table").show();
$("#requestHeaderForm table").show();
$("#tabParamTypeForm table tbody .base input[name=paramValue]")
.attr("type", "text").removeClass("file-input")
.removeAttr("multiple").attr("placeholder", "").val("");
var options = $("#debugRequstType .btn .options").text();
var formToUrl = oldRequestObj.formToUrl || 0;
var formToUrlChecked = (options != "GET" && formToUrl == 1);
$("input[name='formToUrl']").prop("checked", formToUrlChecked);
var onlyUseLastParam = (userSettings.onlyUseLastParam == 1);
var onlyUseLastHeader = onlyUseLastParam && !isEmptyObject(oldRequestObj.header);
var onlyUseLastForm = onlyUseLastParam && !isEmptyObject(oldRequestObj.form);
var onlyUseLastBody = onlyUseLastParam && !isEmptyObject(oldRequestObj.body);
var headerValueCount = 0, formValueCount = 0;
if(typeof oldRequestObj != 'object') {
oldRequestObj = {};
}
if(typeof oldRequestObj.header != 'object') {
oldRequestObj.header = {};
}
if(typeof oldRequestObj.form != 'object') {
oldRequestObj.form = {};
}
for (var i = 0; i < debugGlobalParam.length; i++) {
var item = debugGlobalParam[i];
if (item.paramIn == 'header') {
oldRequestObj.header[item.key] = item.value;
} else if (item.paramIn == 'form') {
oldRequestObj.form[item.key] = item.value;
}
}
Object.keys(requestParamObj).forEach(function(key){
var tempParam = requestParamObj[key];
if (key == "p-body-obj") {
//console.log(tempParam);
var paramObj = onlyUseLastBody ? {} : getParamBodyTransObj(tempParam);
var bodyObj = oldRequestObj.body;
try {
bodyObj = JSON.parse(bodyObj);
if(!isEmptyObject(bodyObj)) {
paramObj = $.extend(true, paramObj, bodyObj);
}
$("#tabParamTypeBody textarea").val(JSON.stringify(paramObj, null, 4));
} catch (e) {
var tempText = isEmptyObject(bodyObj) ? JSON.stringify(paramObj, null, 4) : bodyObj;
$("#tabParamTypeBody textarea").val(tempText);
}
$("#tabParamBody .nav li").eq(1).find("a").click();
} else {
if (tempParam.paramIn == "header" && !onlyUseLastHeader) {
//console.log(tempParam);
var headerVal = getNotEmptyStr(tempParam.value);
var headerObj = oldRequestObj.header;
if(!isEmptyObject(headerObj) && isNotEmpty(headerObj[key])) {
headerVal = headerObj[key];
headerObj[key] = "";// 赋值为空,后面不再使用
}
if(isEmpty(headerVal)) {
headerVal = getAutoFillValue(tempParam.paramType, key);
}
if(headerValueCount > 0) {
$("#tabParamHeader table tbody").append(getParamTableTr(key, headerVal, "", tempParam.paramDesc));
} else {
$("#tabParamHeader table tbody .base input[name=paramName]").val(key);
$("#tabParamHeader table tbody .base input[name=paramValue]").val(headerVal);
$("#tabParamHeader table tbody .base input[name=paramValue]").attr("placeholder", getNotEmptyStr(tempParam.paramDesc));
}
headerValueCount++;
} else {
// 只有这几种类型,列出来后面看单独处理不
var paramInForm = (tempParam.paramIn == "query")
|| (tempParam.paramIn == "path")
|| (tempParam.paramIn == "body")
|| (tempParam.paramIn == "form")
|| (tempParam.paramIn == "formData")
|| isNotEmpty(tempParam.paramIn);
paramInForm = paramInForm && !onlyUseLastForm;
var formObj = oldRequestObj.form;
if (onlyUseLastForm && !isEmptyObject(formObj) && isNotEmpty(formObj[key])) {
paramInForm = onlyUseLastForm || true;
}
if (paramInForm) {
//console.log(tempParam);
var formVal = getNotEmptyStr(tempParam.value);
if(!isEmptyObject(formObj) && isNotEmpty(formObj[key])) {
formVal = formObj[key];
formObj[key] = "";// 赋值为空,后面不再使用
}
if(isEmpty(formVal)) {
formVal = getAutoFillValue(tempParam.paramType, key);
}
if(formValueCount > 0) {
$("#tabParamTypeForm table tbody").append(getParamTableTr(key, formVal, "", tempParam.paramDesc, tempParam.paramType));
} else {
// 文件的input特殊处理
if(tempParam.paramType == 'file'){
$("#tabParamTypeForm table tbody .base input[name=paramValue]")
.attr("type", "file").attr("multiple", "multiple")
.addClass("file-input");
} else {
$("#tabParamTypeForm table tbody .base input[name=paramValue]").val(formVal);
}
$("#tabParamTypeForm table tbody .base input[name=paramName]").val(key);
$("#tabParamTypeForm table tbody .base input[name=paramValue]").attr("placeholder", getNotEmptyStr(tempParam.paramDesc));
}
$("#tabParamBody .nav li").eq(0).find("a").click();
formValueCount++;
}
}
}
});
// 处理参数外的header
var headerObj = oldRequestObj.header;
if(!isEmptyObject(headerObj)) {
Object.keys(headerObj).forEach(function(key){
if(isNotEmpty(headerObj[key])) {
if(headerValueCount > 0) {
$("#tabParamHeader table tbody").append(getParamTableTr(key, headerObj[key], "", ""));
} else {
$("#tabParamHeader table tbody .base input[name=paramName]").val(key);
$("#tabParamHeader table tbody .base input[name=paramValue]").val(headerObj[key]);
}
headerValueCount++;
}
});
}
// 处理参数外的form
var formObj = oldRequestObj.form;
if(!isEmptyObject(formObj)) {
Object.keys(formObj).forEach(function(key){
if(isNotEmpty(formObj[key])) {
if(formValueCount > 0) {
$("#tabParamTypeForm table tbody").append(getParamTableTr(key, formObj[key], "", ""));
} else {
$("#tabParamTypeForm table tbody .base input[name=paramName]").val(key);
$("#tabParamTypeForm table tbody .base input[name=paramValue]").val(formObj[key]);
}
formValueCount++;
}
});
}
if(headerValueCount > 0) {
$("#tabParamHeader table tbody").append(getParamTableTr("", "", "", ""));
}
if(formValueCount > 0) {
$("#tabParamTypeForm table tbody").append(getParamTableTr("", "", "", ""));
}
}
/**
* 获取测试的对象
*/
function getParamBodyTransObj(paramObj) {
var newObject = $.extend(true, {}, paramObj);
Object.keys(newObject).forEach(function(key){
var subObj = newObject[key];
if(typeof subObj == 'object') {
if (subObj.hasOwnProperty("isParamObj")) {
var value = getNotEmptyStr(subObj.value);
if(isEmpty(value) && isNotEmpty(subObj.paramType)) {
value = getAutoFillValue(subObj.paramType, key);
}
newObject[key] = value;
} else if(subObj instanceof Array) {
subObj[0] = getParamBodyTransObj(subObj[0]);
} else {
newObject[key] = getParamBodyTransObj(subObj);
}
}
});
return newObject;
}
function serializeArrayToBulkEdit(formArr) {
var formObj = serializeArrayToObj(formArr);
var formStr = "";
Object.keys(formObj).forEach(function(key){
formStr += key + ":" + formObj[key] + "\n";
});
return formStr;
}
function serializeArrayToObj(formArr) {
var paramObj = {};
for (var i = 0; i < formArr.length; i++) {
if (formArr[i].name == "paramName" && i < formArr.length) {
var key = formArr[i].value;
var value = formArr[i + 1].value;
if (isNotEmpty(key) && formArr[i + 1].name != "paramName") {
paramObj[key] = value;
}
}
}
return paramObj;
}
function bulkEditToTable(tableId, bulkEdit) {
$(tableId + " table tbody .new").remove();
var valueCount = 0;
var headerArr = bulkEdit.split("\n");
for (var i = 0; i < headerArr.length; i++) {
var index = headerArr[i].indexOf(":");
if(index < 0) {
continue;
}
var key = headerArr[i].substring(0, index);
var value = headerArr[i].substring(index+1, headerArr[i].length);
if(valueCount > 0) {
$(tableId + " table tbody").append(getParamTableTr(key, value, "", ""));
} else {
$(tableId + " table tbody .base input[name=paramName]").val(key);
$(tableId + " table tbody .base input[name=paramValue]").val(value);
}
valueCount++;
}
if(valueCount > 0) {
$(tableId + " table tbody").append(getParamTableTr("", "", "", ""));
}
}
/**
* 获取参数的tr
* @param name
* @param value
* @param namePl
* @param valuePl
* @returns
*/
function getParamTableTr(name, value, namePl, valuePl, paramType) {
name = getNotEmptyStr(name);
namePl = getNotEmptyStr(namePl);
value = getNotEmptyStr(value);
valuePl = getNotEmptyStr(valuePl);
var regExp = new RegExp("\"", "gm");
name = (typeof name === 'string') ? name.replace(regExp, "&quot;") : name;
namePl = (typeof namePl === 'string') ? namePl.replace(regExp, "&quot;") : namePl;
value = (typeof value === 'string') ? value.replace(regExp, "&quot;") : value;
valuePl = (typeof valuePl === 'string') ? valuePl.replace(regExp, "&quot;") : valuePl;
var resultStr =
'<tr class="new">'
+'<td><input type="text" class="form-control" name="paramName" value="'+name+'" placeholder="'+namePl+'"></td>';
// 文件的input特殊处理
if(paramType == 'file') {
resultStr += '<td><input type="file" multiple class="form-control file-input" name="paramValue" placeholder="'+valuePl+'"></td>';
} else {
resultStr += '<td><input type="text" class="form-control" name="paramValue" value="'+value+'" placeholder="'+valuePl+'"></td>'
}
resultStr += '<td><i class="icon-times"></i></td>'
+'</tr>';
return resultStr;
}
/**
* 获取自动填充的值
* @param paramType
* @returns
*/
function getAutoFillValue(paramType, paramName) {
if(userSettings.autoFillParam == 0 || isEmpty(paramType)) {
return "";
}
paramName = getNotEmptyStr(paramName).toLowerCase();
var isTimeColumn = (paramType.indexOf("date-time") >= 0
|| paramName.endWith("date") || paramName.endWith("time"));
var isTypeColumn = (paramName.endWith("type") || paramName.endWith("status")
|| paramName.endWith("level") || paramName.endWith("num"));
var isPriceColumn = (paramName.endWith("money") || paramName.endWith("price")
|| paramName.endWith("cash") || paramName.endWith("coin"));
var isBooleanColumn = (paramName.startWith("is"));
var resultValue = "";
if(paramType.indexOf("int") >= 0){
if(isTypeColumn) {
resultValue = Math.ceil(Math.random() * 5);
} else if(paramName.endWith("age")) {
resultValue = Math.ceil(Math.random() * 100);
} else {
resultValue = Math.ceil(Math.random() * 100);
}
} else if(paramType.indexOf("double") >= 0){
resultValue = Math.ceil(Math.random() * 1000);
} else if(paramType.indexOf("float") >= 0){
resultValue = parseFloat(Math.random() * 1000).toFixed(2);
} else if(paramType.indexOf("byte") >= 0){
if(isTypeColumn) {
resultValue = Math.ceil(Math.random() * 5);
} else {
resultValue = Math.ceil(Math.random() * 127);
}
} else if(paramType.indexOf("boolean") >= 0){
resultValue = Math.random() > 0.5;
} else if(isTimeColumn){
resultValue = getNowDateTime();
} else {
if(paramName.endWith("id")) {
resultValue = Math.ceil(Math.random() * 1000);
} else if(paramName.endWith("age")) {
resultValue = Math.ceil(Math.random() * 100);
} else if(isPriceColumn){
resultValue = parseFloat(Math.random() * 1000).toFixed(2);
} else if(isTypeColumn){
resultValue = Math.ceil(Math.random() * 5);
} else if(isBooleanColumn){
resultValue = (Math.random() > 0.5) ? 0 : 1;
} else if(paramName.endWith("phone") || paramName.endWith("mobile")){
var arr = ["15226645814", "15226645815", "15226645816", "15226645817", "15226645818"];
resultValue = arr[Math.ceil(Math.random() * 5) - 1];
} else if(paramName.endWith("ids")){
var counts = Math.ceil(Math.random() * 5);
for (var i = 0; i < counts; i++) {
if(isNotEmpty(resultValue)){resultValue += ",";}
resultValue += Math.ceil(Math.random() * 1000);
}
} else if(paramName.endWith("types")){
var counts = Math.ceil(Math.random() * 3);
for (var i = 0; i < counts; i++) {
if(isNotEmpty(resultValue)){resultValue += ",";}
resultValue += Math.ceil(Math.random() * 5);
}
} else if(paramName.endWith("md5")){
resultValue = "5082079d92a8ef985f59e001d445ff20";
} else if(paramName.endWith("photo")){
resultValue = "http://www.zyplayer.com/freeplay/img/headIcon/myhead.jpg";
} else if(paramName.endWith("url") || paramName.endWith("uri")){
var arr = ["http://www.zyplayer.com", "http://www.kongjianzhou.com"];
resultValue = arr[Math.ceil(Math.random() * 2) - 1];
} else if(paramName.endWith("username")){
var arr = ["张三", "李四", "王二", "暮光:城中城", "海贼王"];
resultValue = arr[Math.ceil(Math.random() * 5) - 1];
} else if(userSettings.autoFillParam == 2){
//var arr = ["您好!","请!","对不起。","谢谢!","再见!","您早!","晚安!","请问您贵姓?","请原谅!","不用谢!","没关系!","欢迎您光临!","请坐!","请喝茶!","请多关照!","请多指教!","谢谢您的合作!","对不起,让您久等了。","没关系,我刚到。","给您添麻烦了。","我能为您做什么?","您好,请问您需要帮助吗?","您走好。","请慢走!"];
//resultValue = arr[Math.ceil(Math.random() * 24) - 1];
resultValue = "我是默认字符串";
}
//console.log(paramType);
}
return resultValue;
}

View File

@@ -1,26 +0,0 @@
/**
* 所有需要iframe页面调用的接口必须定义在这里
* 通过getExport()来吊起父页面的这些接口
*/
var exports = {
regeneratePathTree: function(){
// 定义在mg-ui.js用于重新生成文档树目录
regeneratePathTree();
},
updateTreeShowType: function(){
// 定义在mg-ui.js用于修改树形菜单展示类型
updateTreeShowType();
},
updateUserSettings: function(setting){
// 定义在mg-ui.js用于更新用户设置
updateUserSettings(setting);
},
exportDocument: function(){
// 定义在mg-ui.js用于打开导出文档框
exportDocument();
},
updateGlobalParam: function(param){
// 更新调试的全局参数变量
debugGlobalParam = param;
}
};

View File

@@ -1,90 +0,0 @@
/**
* 以每个Tag方式生成并展示
* 核心信息控制器
* /api/data/getDataList
* /api/data/getDataDetail
* 跟进控制器
* /api/track/getTrackList
* /api/track/getTrackDetail
*
* 先把树形的写完了再写这个,,
*
* @author 暮光:城中城
* @since 2018年5月26日
*/
function createTreeViewByTag(json, keywords) {
var pathIndex = {};
var paths = json.paths;
var domain = json.domainUrl;// 服务器代理会返回此属性
var rewriteDomainUrl = json.rewriteDomainUrl;// 服务器代理会返回此属性
if(isEmpty(domain)) {
domain = "http://" + json.host + json.basePath;
}
if(domain.endWith("/")) {
domain = domain.substring(0, domain.length - 1);
}
if (isEmptyObject(paths)) {
return;
}
//console.log(paths);
Object.keys(paths).forEach(function(key){
//console.log(key, paths[key]);
if(!findInPathsValue(key, paths[key], keywords)) {
return;
}
});
//console.log(pathIndex);
var htmlStr = '<li>';
htmlStr += '<a href="#">'+json.info.title+'</a>';
htmlStr += '<ul>';
htmlStr += getTreeHtmlForTag(pathIndex, projectTreeIdIndex);
htmlStr += '</ul>';
htmlStr += '</li>';
$('#apiPathTree .projects').append(htmlStr);
projectTreeIdIndex++;
}
/**
* 将对象列表递归的方式转换成文档格式html字符串
* @param pathData 处理后的对象列表
* @returns 生成的html字符串
*/
function getTreeHtmlForTag(pathData, treeIdStr) {
var tempStr = "";
var indexNow = 1;
// get, head, post, put, patch, delete, options, trace
var actionArrays = ["get", "head", "post", "put", "patch", "delete", "options", "trace"];
Object.keys(pathData).forEach(function(key){
var tempNode = pathData[key];
var tempTreeId = treeIdStr + "_" + indexNow;
// 只有一个子元素而且有method元素说明是只有一个节点
var nodeSub = getObjectFirstAttributeIfOnly(tempNode);
if(nodeSub != null && isNotEmpty(nodeSub.method)) {
var summary = isEmpty(nodeSub.summary) ? "" : "(" + nodeSub.summary + ")";
if(summary.length > 10){
summary = summary.substring(0, 10)+"...)";// 防止被撑得太长只显示10个字
}
nodeSub.treeId = tempTreeId;
tempStr += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+nodeSub.path+'">'+key+'<span>'+summary+'</span></a></li>';
} else if(haveString(actionArrays, key)) {
//console.log(tempTreeId);
tempNode.treeId = tempTreeId;
var summary = isEmpty(tempNode.summary) ? "" : "("+tempNode.summary+")";
if(summary.length > 10){
summary = summary.substring(0, 10)+"...)";// 防止被撑得太长只显示10个字
}
tempStr += '<li m-id="'+tempTreeId+'"><a href="#" class="show-doc" path="'+tempNode.path+'">'+key+'<span>'+summary+'</span></a></li>';
} else {
tempStr += '<li>';
tempStr += '<a href="#">'+key+'</a>';
tempStr += '<ul>';
tempStr += getTreeHtmlForTag(tempNode, tempTreeId);
tempStr += '</ul>';
tempStr += '</li>';
}
indexNow++;
});
return tempStr;
}

View File

@@ -1,96 +0,0 @@
/**
* 以树形方式生成并展示:
* /api
* /data
* /getDateList
* post
* get
* @author 暮光:城中城
* @since 2018年5月26日
*/
/**
* 把原始的json字符串转换成对象列表的方式方便后续使用
* @param json swagger的原始对象
* @returns
*/
function createTreeViewByTree(json, keywords) {
var pathIndex = {};
if (isEmptyObject(json)) {
return;
}
//console.log(paths);
for (var i = 0; i < json.length; i++) {
var interface = json[i].interface;
//console.log(key, paths[key]);
if (!findInPathsValue(json[i], keywords)) {
continue;
}
if (json[i].nodeList.length <= 0) {
continue;
}
var methods = json[i].nodeList[0].methods;
for (var j = 0; j < methods.length; j++) {
var interfaceTemp = interface + "." + methods[j];
var keyArr = interfaceTemp.split(".");
var nowPathObj = null;
keyArr.forEach(function(val, index) {
//console.log(val, index);
if(isEmpty(val) && index == 0) {
return;
}
var nowPath = val;
if(nowPathObj == null) {
nowPathObj = {};
nowPathObj[nowPath] = pathIndex[nowPath];
if(nowPathObj[nowPath] == null) {
nowPathObj[nowPath] = {};
pathIndex[nowPath] = nowPathObj[nowPath];
}
}
var tempPathObj = nowPathObj[nowPath];
if(isEmpty(tempPathObj)) {
tempPathObj = nowPathObj[nowPath] = {};
}
nowPathObj = tempPathObj;
if(index == keyArr.length - 1) {
var tempPath = projectTreeIdIndex + ":" + interfaceTemp;
tempPathObj.method = methods[j];
tempPathObj.interface = tempPath;
treePathDataMap.set(tempPath, json[i]);
}
});
}
}
var htmlStr = getTreeHtmlForTree(pathIndex, projectTreeIdIndex);
$('#apiPathTree .projects').append(htmlStr);
projectTreeIdIndex++;
}
/**
* 将对象列表递归的方式转换成文档格式html字符串
* @param pathData 处理后的对象列表
* @returns 生成的html字符串
*/
function getTreeHtmlForTree(pathData, treeIdStr) {
var tempStr = "";
var indexNow = 1;
Object.keys(pathData).forEach(function (key) {
var tempNode = pathData[key];
var tempTreeId = treeIdStr + "_" + indexNow;
if (isNotEmpty(tempNode.interface)) {
tempNode.treeId = tempTreeId;
tempStr += '<li m-id="' + tempTreeId + '"><a href="#" class="show-doc" method="' + tempNode.method + '" path="' + tempNode.interface + '">' + key + '</a></li>';
} else {
tempStr += '<li>';
tempStr += '<a href="#">' + key + '</a>';
tempStr += '<ul>';
tempStr += getTreeHtmlForTree(tempNode, tempTreeId);
tempStr += '</ul>';
tempStr += '</li>';
}
indexNow++;
});
return tempStr;
}

View File

@@ -1,106 +0,0 @@
/**
* 两个元素上下、左右拖动动态改变大小
* @author 暮光:城中城
* @since 2017年5月7日
*/
(function($){
$.fn.mgResizableHeight = function(options) {
var defaults = {prev:this,next:this, prevHtMin:0, prevHtMax:999, nextHtMin:0, nextHtMax:999};
var opts = $.extend(defaults, options);
var disY = 0, prevH = 0, nextH = 0, isStart = false;
var prev, next, thisObj = this;
$(document).mousemove(function(ev){
if(!isStart){return;}
var ev = ev || window.event;
var H = ev.clientY - disY;
var prevHNow = prevH+H, nextHNow = nextH-H;
if(opts.prevHtMin >= prevHNow) {
prevHNow = opts.prevHtMin;
nextHNow = next.outerHeight();
}
if(opts.nextHtMin >= nextHNow) {
nextHNow = opts.nextHtMin;
prevHNow = prev.outerHeight();
}
if(opts.prevHtMax <= prevHNow) {
prevHNow = opts.prevHtMax;
nextHNow = next.outerHeight();
}
if(opts.nextHtMax <= nextHNow) {
nextHNow = opts.nextHtMax;
prevHNow = prev.outerHeight();
}
//prev.css("height", prevHNow + 'px');
//next.css("height", nextHNow + 'px');
if(typeof opts.onresize == 'function') {
opts.onresize(prevHNow, nextHNow);
}
}).mouseup(function(ev){
isStart = false;
});
$(this).mousedown(function(ev){
var ev = ev || window.event;
disY = ev.clientY;
prev = (opts.prev == thisObj)?$(opts.prev).prev():$(opts.prev);
next = (opts.next == thisObj)?$(opts.next).next():$(opts.next);
prevH = prev.outerHeight();
nextH = next.outerHeight();
isStart = true;
});
}
/**
* 改变宽度的功能,只是实现各种消息的通知,实际改变大小需要在回调里面自己操作
*/
$.fn.mgResizableWidth = function(options) {
var defaults = {prev:this,next:this, prevWtMin:0, prevWtMax:999, nextWtMin:0, nextWtMax:999};
var opts = $.extend(defaults, options);
var disX = 0, prevW = 0, nextW = 0, isStart = false;
var prev, next, thisObj = this;
$(document).mousemove(function(ev){
if(!isStart){return;}
var ev = ev || window.event;
var W = ev.clientX - disX;
var prevWNow = prevW+W, nextWNow = nextW-W;
if(opts.prevWtMin >= prevWNow) {
prevWNow = opts.prevWtMin;
nextWNow = next.outerWidth();
}
if(opts.nextWtMin >= nextWNow) {
nextWNow = opts.nextWtMin;
prevWNow = prev.outerWidth();
}
if(opts.prevWtMax <= prevWNow) {
prevWNow = opts.prevWtMax;
nextWNow = next.outerWidth();
}
if(opts.nextWtMax <= nextWNow) {
nextWNow = opts.nextWtMax;
prevWNow = prev.outerWidth();
}
//prev.css("width", prevWNow + 'px');
//next.css("width", nextWNow + 'px');
if(typeof opts.onresize == 'function') {
opts.onresize(prevWNow, nextWNow);
}
}).mouseup(function(ev){
if(!isStart){return;}
isStart = false;
if(typeof opts.onfinish == 'function') {
opts.onfinish();
}
});
$(this).mousedown(function(ev){
var ev = ev || window.event;
disX = ev.clientX;
prev = (opts.prev == thisObj)?$(opts.prev).prev():$(opts.prev);
next = (opts.next == thisObj)?$(opts.next).next():$(opts.next);
prevW = prev.outerWidth();
nextW = next.outerWidth();
isStart = true;
if(typeof opts.onstart == 'function') {
opts.onstart();
}
});
}
})(jQuery);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 290 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,146 +0,0 @@
/*!
* ZUI: 标签页管理器 - v1.8.1 - 2018-01-18
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2018 cnezsoft.com; Licensed MIT
*/
.tabs {
position: relative;
min-height: 400px;
}
.tabs-navbar {
padding: 4px 4px 0 4px;
}
.tabs-nav {
height: 30px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
border-bottom: none;
border-bottom: 1px solid #ddd;
}
.tab-nav-item {
width: 160px;
min-width: 0;
max-width: 160px;
padding-right: 2px;
margin-bottom: 0;
border: none;
}
.tab-nav-item:hover {
min-width: 95px;
}
.tab-nav-link {
position: relative;
height: 30px;
margin: 0;
overflow: hidden;
background-color: rgba(255, 255, 255, .65);
background-color: #e5e5e5;
border-color: #ddd;
border-bottom: none;
border-radius: 2px 2px 0 0;
}
.tab-nav-link > .title {
position: absolute;
top: 5px;
right: 5px;
left: 30px;
display: block;
overflow: hidden;
font-size: 14px;
line-height: 20px;
text-overflow: ellipsis;
white-space: nowrap;
}
.tab-nav-link > .icon {
position: absolute;
top: 5px;
left: 5px;
display: block;
width: 20px;
height: 20px;
line-height: 20px;
text-align: center;
opacity: .8;
}
.tab-nav-item.loading .tab-nav-link > .icon:before {
content: '\e97b';
-webkit-animation: spin 2s infinite linear;
-o-animation: spin 2s infinite linear;
animation: spin 2s infinite linear;
}
.tab-nav-link > .close {
position: absolute;
top: 5px;
right: 5px;
width: 20px;
height: 20px;
font-weight: 200;
line-height: 16px;
text-align: center;
text-shadow: none;
visibility: hidden;
border-radius: 4px;
opacity: 0;
-webkit-transition: all .2s;
-o-transition: all .2s;
transition: all .2s;
}
.tab-nav-link > .close:hover {
color: #fff;
background-color: #ea644a;
}
.tab-nav-link:hover > .title {
right: 25px;
}
.tab-nav-link:hover > .close {
visibility: visible;
opacity: 1;
}
.tab-nav-link.not-closable > .close {
display: none;
}
.nav-tabs.tabs-nav > li > a,
.nav-tabs.tabs-nav > li > a:hover,
.nav-tabs.tabs-nav > li > a:focus {
border-color: #ddd #ddd transparent #ddd;
}
.tab-nav-condensed .tab-nav-link > .title {
left: 5px;
text-overflow: initial;
}
.tab-nav-condensed .tab-nav-link > .icon {
display: none;
}
.tabs-container {
position: absolute;
top: 34px;
right: 0;
bottom: 0;
left: 0;
}
.tabs-container > .tab-pane {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: none;
}
.tabs-container > .tab-pane.active {
display: block;
}
.tab-iframe-cover {
display: none;
}
.tabs-show-contextmenu .tab-iframe-cover {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: block;
}

View File

@@ -1,488 +0,0 @@
/*!
* ZUI: 标签页管理器 - v1.8.1 - 2018-01-18
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2018 cnezsoft.com; Licensed MIT
*/
/* ========================================================================
* ZUI: tabs.js
* http://zui.sexy
* ========================================================================
* Copyright (c) 2017-2018 cnezsoft.com; Licensed MIT
* ======================================================================== */
(function($) {
'use strict';
/**
* Tab object
* @param {Object | String} tab
*/
var Tab = function(tab) {
var that = this;
if(typeof tab === 'string') {
that.url = tab;
} else if($.isPlainObject(tab)) {
$.extend(that, tab);
}
if(!that.id) {
that.id = $.zui.uuid();
}
if(!that.type) {
if(that.iframe) {
that.type = 'iframe';
that.url = that.url || that.iframe;
} else if(that.ajax) {
that.type = 'ajax';
that.url = that.url || ($.isPlainObject(that.ajax) ? that.ajax.url : that.ajax);
} else if(that.url) {
that.type = tab.ajax ? 'ajax' : 'iframe';
} else {
that.type = 'custom';
}
}
that.createTime = new Date().getTime();
that.openTime = 0;
that.onCreate && that.onCreate.call(that);
};
Tab.prototype.open = function() {
var that = this;
that.openTime = new Date().getTime();
that.onOpen && that.onOpen.call(that);
};
Tab.prototype.close = function() {
var that = this;
that.openTime = 0;
that.onClose && that.onClose.call(that);
};
Tab.create = function(data) {
if (data instanceof Tab) {
return data;
}
return new Tab(data);
};
var NAME = 'zui.tabs'; // model name
var DEFAULTS = {
tabs: [],
defaultTabIcon: 'icon-window',
contextMenu: true,
errorTemplate: '<div class="alert alert-block alert-danger with-icon"><i class="icon-warning-sign"></i><div class="content">{0}</div></div>',
// messagerOptions: null,
showMessage: true,
navTemplate: '<nav class="tabs-navbar"></nav>',
containerTemplate: '<div class="tabs-container"></div>'
};
var LANG = {
zh_cn: {
reload: '重新加载',
close: '关闭',
closeOthers: '关闭其他标签页',
closeRight: '关闭右侧标签页',
reopenLast: '恢复上次关闭的标签页',
errorCannotFetchFromRemote: '无法从远程服务器({0})获取内容。'
},
zh_tw: {
reload: '重新加載',
close: '關閉',
closeOthers: '關閉其他標籤頁',
closeRight: '關閉右側標籤頁',
reopenLast: '恢復上次關閉的標籤頁',
errorCannotFetchFromRemote: '無法從遠程服務器({0})獲取內容。'
},
en: {
reload: 'Reload',
close: 'Close',
closeOthers: 'Close others',
closeRight: 'Close right',
reopenLast: 'Reopen last',
errorCannotFetchFromRemote: 'Cannot fetch data from remote server {0}.'
}
};
// The tabs model class
var Tabs = function(element, options) {
var that = this;
that.name = NAME;
that.$ = $(element);
options = that.options = $.extend({}, DEFAULTS, this.$.data(), options);
var lang = options.lang || 'zh_cn';
that.lang = $.isPlainObject(lang) ? ($.extend(true, {}, LANG[lang.lang || $.zui.clientLang()], lang)) : LANG[lang];
// Initialize here
var $navbar = that.$.find('.tabs-navbar');
if (!$navbar.length) {
$navbar = $(options.navTemplate).appendTo(that.$);
}
that.$navbar = $navbar;
var $nav = $navbar.find('.tabs-nav');
if (!$nav.length) {
$nav = $('<ul class="tabs-nav nav nav-tabs"></ul>').appendTo($navbar);
}
that.$nav = $nav;
var $tabs = that.$.find('.tabs-container');
if (!$tabs.length) {
$tabs = $(options.containerTemplate).appendTo(that.$);
}
that.$tabs = $tabs;
that.activeTabId = options.defaultTab;
var tabs = options.tabs || [];
that.tabs = {};
$.each(tabs, function(index, item) {
var tab = Tab.create(item);
that.tabs[tab.id] = tab;
if (!that.activeTabId) {
that.activeTabId = tab.id;
}
that.renderTab(tab);
});
that.closedTabs = [];
that.open(that.getActiveTab());
$nav.on('click.' + NAME, '.tab-nav-link', function () {
that.open(that.getTab($(this).data('id')));
}).on('click.' + NAME, '.tab-nav-close', function (e) {
that.close($(this).closest('.tab-nav-link').data('id'));
e.stopPropagation();
}).on('resize.' + NAME, function () {
that.adjustNavs();
});
if (options.contextMenu) {
$nav.contextmenu({
selector: '.tab-nav-link',
itemsCreator: function (e) {
return that.createMenuItems(that.getTab($(this).data('id')));
},
onShow: function () {
that.$.addClass('tabs-show-contextmenu');
},
onHide: function () {
that.$.removeClass('tabs-show-contextmenu');
}
});
}
};
Tabs.prototype.createMenuItems = function (tab) {
var that = this;
var lang = that.lang;
return [{
label: lang.reload,
onClick: function () {
that.open(tab, true);
}
}, '-', {
label: lang.close,
disabled: tab.forbidClose,
onClick: function () {
that.close(tab.id);
}
}, {
label: lang.closeOthers,
disabled: that.$nav.find('.tab-nav-item:not(.hidden)').length <= 1,
onClick: function () {
that.closeOthers(tab.id);
}
}, {
label: lang.closeRight,
disabled: !$('#tab-nav-item-' + tab.id).next('.tab-nav-item:not(.hidden)').length,
onClick: function () {
that.closeRight(tab.id);
}
}, '-', {
label: lang.reopenLast,
disabled: !that.closedTabs.length,
onClick: function () {
that.reopen();
}
}];
};
Tabs.prototype.adjustNavs = function (immediately) {
var that = this;
if (!immediately) {
if (that.adjustNavsTimer) {
clearTimeout(that.adjustNavsTimer);
}
that.adjustNavsTimer = setTimeout(function() {
that.adjustNavs(true);
}, 50);
return;
}
if (that.adjustNavsTimer) {
that.adjustNavsTimer = null;
}
var $nav = that.$nav;
var $navItems = $nav.find('.tab-nav-item:not(.hidden)');
var totalWidth = $nav.width();
var totalCount = $navItems.length;
var maxWidth = Math.floor(totalWidth/totalCount);
if(maxWidth < 96) {
maxWidth = Math.floor((totalWidth-96)/(totalCount-1))
}
$nav.toggleClass('tab-nav-condensed', maxWidth <= 50);
$navItems.css('max-width', maxWidth);
};
Tabs.prototype.renderTab = function(tab, beforeTabId) {
var that = this;
var $nav = that.$nav;
var $tabNav = $('#tab-nav-item-' + tab.id);
if (!$tabNav.length) {
var $a = $('<a class="tab-nav-link"><i class="icon"></i><span class="title"></span><i class="close tab-nav-close" title="' + that.lang.close + '">&times;</i></a>').attr({
href: '#tabs-item-' + tab.id,
'data-id': tab.id
});
$tabNav = $('<li class="tab-nav-item" data-id="' + tab.id + '" id="tab-nav-item-' + tab.id + '" />').append($a).appendTo(that.$nav);
if (beforeTabId) {
var $before$nav = $('#tab-nav-item-' + beforeTabId);
if ($before$nav.length) {
$tabNav.insertAfter($before$nav);
}
}
that.adjustNavs();
}
var $a = $tabNav.find('a').attr('title', tab.desc).toggleClass('not-closable', !!tab.forbidClose);
$a.find('.icon').attr('class', 'icon ' + (tab.icon || that.options.defaultTabIcon));
$a.find('.title').text(tab.title || tab.defaultTitle || '');
return $tabNav;
};
Tabs.prototype.getActiveTab = function() {
var that = this;
return that.activeTabId ? that.tabs[that.activeTabId] : null;
};
Tabs.prototype.getTab = function(tabId) {
var that = this;
if (!tabId) {
return that.getActiveTab();
}
if (typeof tabId === 'object') {
tabId = tabId.id;
}
return that.tabs[tabId];
};
Tabs.prototype.close = function(tabId, forceClose) {
var that = this;
var tab = that.getTab(tabId);
if (tab && (forceClose || !tab.forbidClose)) {
$('#tab-nav-item-' + tab.id).remove();
$('#tab-' + tab.id).remove();
tab.close();
delete that.tabs[tab.id];
that.closedTabs.push(tab);
that.$.callComEvent(that, 'onClose', tab);
var lastTab;
$.each(that.tabs, function (tabId, tab) {
if (!lastTab || lastTab.openTime < tab.openTime) {
lastTab = tab;
}
});
lastTab && that.open(lastTab);
}
};
Tabs.prototype.open = function(tab, forceReload) {
var that = this;
if (!(tab instanceof Tab)) {
tab = Tab.create(tab);
}
var $tabNav = that.renderTab(tab);
that.$nav.find('.tab-nav-item.active').removeClass('active');
$tabNav.addClass('active');
var $tabPane = $('#tab-' + tab.id);
if (!$tabPane.length) {
$tabPane = $('<div class="tab-pane" id="tab-' + tab.id + '" />').appendTo(that.$tabs);
}
that.$tabs.find('.tab-pane.active').removeClass('active');
$tabPane.addClass('active');
tab.open();
that.activeTabId = tab.id;
that.tabs[tab.id] = tab;
if (forceReload || !tab.loaded) {
that.reload(tab);
}
that.$.callComEvent(that, 'onOpen', tab);
};
Tabs.prototype.showMessage = function (message, type) {
$.zui.messager.show(message, $.extend({
placement: 'center'
}, this.options.messagerOptions, {
type: type
}));
};
Tabs.prototype.reload = function(tab) {
var that = this;
if (typeof tab === 'string') {
tab = that.getTab(tab);
} else if (!tab) {
tab = that.getActiveTab();
}
if (!tab) {
return;
}
if (!tab.openTime) {
return that.open(tab);
}
var $tabNav = $('#tab-nav-item-' + tab.id).addClass('loading').removeClass('has-error');
var $tabPane = $('#tab-' + tab.id).addClass('loading').removeClass('has-error');
var afterRefresh = function (content, error) {
if (!tab.openTime) {
return;
}
$tabNav.removeClass('loading');
$tabPane.removeClass('loading');
that.$.callComEvent(that, 'onLoad', tab);
if(typeof content === 'string' || content instanceof $) {
if (tab.contentConverter) {
content = tab.contentConverter(content, tab);
}
$tabPane.empty().append(content);
if (!tab.title) {
content = $tabPane.text().replace(/\n/g, '');
tab.title = content.length > 10 ? content.substr(0, 10) : content;
that.renderTab(tab);
}
}
if (error) {
$tabNav.addClass('has-error');
$tabPane.addClass('has-error');
var showMessage = that.options.showMessage;
if (showMessage) {
if ($.isFunction(showMessage)) {
error = showMessage(error);
}
that.showMessage(error, 'danger');
}
if (!content) {
$tabPane.html(that.options.errorTemplate.format(error));
}
}
tab.loaded = new Date().getTime();
};
if (tab.type === 'ajax') {
var ajaxOption = {
type: 'get',
url: tab.url,
error: function(jqXHR, textStatus, errorThrown) {
afterRefresh(false, that.lang.errorCannotFetchFromRemote.format(tab.url));
},
success: function(data) {
afterRefresh(data);
}
};
if($.isPlainObject(tab.ajax)) {
ajaxOption = $.extend(ajaxOption, tab.ajax);
}
$.ajax(ajaxOption);
} else if (tab.type === 'iframe') {
try {
var iframeName = 'tab-iframe-' + tab.id;
var $iframe = $('<iframe id="' + iframeName + '" name="' + iframeName + '" src="' + (tab.url) + '" frameborder="no" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true" allowtransparency="true" scrolling="auto" style="width: 100%; height: 100%; left: 0px;"></iframe>');
$iframe.appendTo($tabPane.empty());
$('<div class="tab-iframe-cover" />').appendTo($tabPane);
var frame = document.getElementById(iframeName);
frame.onload = frame.onreadystatechange = function() {
if(this.readyState && this.readyState != 'complete') return;
afterRefresh();
var contentDocument = frame.contentDocument;
if (contentDocument && !tab.title) {
tab.title = contentDocument.title;
that.renderTab(tab);
}
};
} catch (e) {
afterRefresh();
}
} else {
var content = tab.content || tab.custom;
if (typeof content === 'function') {
content = content(tab, afterRefresh, that);
if (content !== true) {
afterRefresh(content);
}
} else {
afterRefresh(content);
}
}
};
Tabs.prototype.closeOthers = function(tabId) {
var that = this;
that.$nav.find('.tab-nav-link:not(.hidden)').each(function() {
var thisTabId = $(this).data('id');
if (thisTabId !== tabId) {
that.close(thisTabId);
}
});
};
Tabs.prototype.closeRight = function(tabId) {
var $tabNav = $('#tab-nav-item-' + tabId);
var $rightNav = $tabNav.next('.tab-nav-item:not(.hidden)');
while ($rightNav.length) {
this.close($rightNav.data('id'));
$rightNav = $tabNav.next('.tab-nav-item:not(.hidden)');
}
};
Tabs.prototype.closeAll = function() {
var that = this;
that.$nav.find('.tab-nav-link:not(.hidden)').each(function() {
that.close($(this).data('id'));
});
};
Tabs.prototype.reopen = function() {
var that = this;
if(that.closedTabs.length) {
that.open(that.closedTabs.pop());
}
};
// Extense jquery element
$.fn.tabs = function(option) {
return this.each(function() {
var $this = $(this);
var data = $this.data(NAME);
var options = typeof option == 'object' && option;
if(!data) $this.data(NAME, (data = new Tabs(this, options)));
if(typeof option == 'string') data[option]();
});
};
Tabs.NAME = NAME;
$.fn.tabs.Constructor = Tabs;
}(jQuery));

View File

@@ -1,6 +0,0 @@
/*!
* ZUI: 标签页管理器 - v1.8.1 - 2018-01-18
* http://zui.sexy
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2018 cnezsoft.com; Licensed MIT
*/.tabs{position:relative;min-height:400px}.tabs-navbar{padding:4px 4px 0 4px}.tabs-nav{height:30px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom:none;border-bottom:1px solid #ddd}.tab-nav-item{width:160px;min-width:0;max-width:160px;padding-right:2px;margin-bottom:0;border:none}.tab-nav-item:hover{min-width:95px}.tab-nav-link{position:relative;height:30px;margin:0;overflow:hidden;background-color:rgba(255,255,255,.65);background-color:#e5e5e5;border-color:#ddd;border-bottom:none;border-radius:2px 2px 0 0}.tab-nav-link>.title{position:absolute;top:5px;right:5px;left:30px;display:block;overflow:hidden;font-size:14px;line-height:20px;text-overflow:ellipsis;white-space:nowrap}.tab-nav-link>.icon{position:absolute;top:5px;left:5px;display:block;width:20px;height:20px;line-height:20px;text-align:center;opacity:.8}.tab-nav-item.loading .tab-nav-link>.icon:before{content:'\e97b';-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.tab-nav-link>.close{position:absolute;top:5px;right:5px;width:20px;height:20px;font-weight:200;line-height:16px;text-align:center;text-shadow:none;visibility:hidden;border-radius:4px;opacity:0;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.tab-nav-link>.close:hover{color:#fff;background-color:#ea644a}.tab-nav-link:hover>.title{right:25px}.tab-nav-link:hover>.close{visibility:visible;opacity:1}.tab-nav-link.not-closable>.close{display:none}.nav-tabs.tabs-nav>li>a,.nav-tabs.tabs-nav>li>a:focus,.nav-tabs.tabs-nav>li>a:hover{border-color:#ddd #ddd transparent #ddd}.tab-nav-condensed .tab-nav-link>.title{left:5px;text-overflow:initial}.tab-nav-condensed .tab-nav-link>.icon{display:none}.tabs-container{position:absolute;top:34px;right:0;bottom:0;left:0}.tabs-container>.tab-pane{position:absolute;top:0;right:0;bottom:0;left:0;display:none}.tabs-container>.tab-pane.active{display:block}.tab-iframe-cover{display:none}.tabs-show-contextmenu .tab-iframe-cover{position:absolute;top:0;right:0;bottom:0;left:0;display:block}

File diff suppressed because one or more lines are too long

View File

@@ -8,7 +8,7 @@
<packaging>war</packaging>
<name>zyplayer-doc-manage</name>
<description>定位为所有文档的管理项目swagger文档、数据库文档、、、、等</description>
<description>定位为所有文档的管理项目swagger文档、dubbo文档、数据库文档、、、、等</description>
<parent>
<groupId>org.springframework.boot</groupId>

View File

@@ -60,7 +60,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
};
// 文档页面需要具有文档权限
String[] docAntPatterns = {
"/document.html", "/doc-db.html", "/doc.html", "/swagger-ui.html",
"/document.html", "/doc-db.html", "/doc.html", "/swagger-ui.html", "/doc-dubbo.html",
"/swagger-mg-ui/document/**", "/swagger-mg-ui/storage/**", "/swagger-resources/**"
};
http.authorizeRequests()

View File

@@ -2,7 +2,6 @@ package com.zyplayer.doc.swagger.controller;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.swagger.controller.vo.LocationListVo;
@@ -136,12 +135,6 @@ public class MgDocumentController {
for (LocationListVo location : locationList) {
try {
String resourceStr = HttpRequest.get(location.getLocation()).timeout(3000).execute().body();
Map<String, Object> jsonObject = JSON.parseObject(resourceStr, new TypeReference<HashMap<String, Object>>(){});
if (jsonObject == null || jsonObject.isEmpty()) {
continue;
}
jsonObject.put("fullUrl", location);
String resourcesUrl = location.getLocation();
int indexV2 = location.getLocation().indexOf("/v2");
if (indexV2 >= 0) {
@@ -404,7 +397,17 @@ public class MgDocumentController {
*/
private boolean addSwaggerLocationList(String resourcesStr, String rewriteDomainUrl, String locationUrl, String oldUrl, Integer openVisit) {
try {
SwaggerLocationVo swaggerLocationVo = JSON.parseObject(resourcesStr, SwaggerLocationVo.class);
SwaggerLocationVo swaggerLocationVo = null;
try {
swaggerLocationVo = JSON.parseObject(resourcesStr, SwaggerLocationVo.class);
} catch (Exception e) {
logger.error("获取文档失败,尝试字符串匹配:{}", e.getMessage());
// 由于存在$ref这样的字符串JSON解析可能会失败尝试字符串匹配
if (resourcesStr.startsWith("{\"swagger\":\"")) {
swaggerLocationVo = new SwaggerLocationVo();
swaggerLocationVo.setSwagger("maybe");
}
}
if (swaggerLocationVo != null && StringUtils.isNotBlank(swaggerLocationVo.getSwagger())) {
List<LocationListVo> locationList = this.getLocationSet();
// 组装新的对象

View File

@@ -2,7 +2,6 @@ package com.zyplayer.doc.swagger.controller;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.swagger.controller.vo.LocationListVo;
import com.zyplayer.doc.swagger.framework.constant.StorageKeys;
@@ -18,7 +17,10 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
@@ -71,11 +73,6 @@ public class MgOpenDocController {
for (LocationListVo location : locationList) {
try {
String resourceStr = HttpRequest.get(location.getLocation()).timeout(3000).execute().body();
Map<String, Object> jsonObject = JSON.parseObject(resourceStr, new TypeReference<HashMap<String, Object>>(){});
if (jsonObject == null || jsonObject.isEmpty()) {
continue;
}
jsonObject.put("fullUrl", location);
String resourcesUrl = location.getLocation();
int indexV2 = location.getLocation().indexOf("/v2");
if (indexV2 >= 0) {