mirror of
https://github.com/YMFE/yapi.git
synced 2025-04-06 15:00:26 +08:00
docs: opti case docs
This commit is contained in:
parent
7a4e709610
commit
d47cf79de6
10
CHANGELOG.md
10
CHANGELOG.md
@ -1,11 +1,15 @@
|
||||
## 1.1.3
|
||||
## 1.2.0
|
||||
|
||||
### Features
|
||||
* 增加高级 Mock 期望功能,根据设置的请求过滤规则,返回期望数据。
|
||||
* 增加统计功能
|
||||
* 增加自动化测试功能,写断言脚本,实现精准测试
|
||||
|
||||
### Bug Fixed
|
||||
* 修复了切换集合环境的 Bug
|
||||
* 修复了 mockServer 拿不到 Post 请求 Body
|
||||
* 修复了接口调试 pathParams 无法使用 mock 参数和变量参数
|
||||
|
||||
|
||||
|
||||
## 1.1.2
|
||||
|
||||
### Features
|
||||
|
@ -49,10 +49,10 @@ $.{key}.{params|body}.{path}
|
||||
|
||||
> Tips: 上下拖动测试集合的列表项可以调整测试的顺序。
|
||||
|
||||
### 高级
|
||||
可通过写断言脚本,实现精准测试,支持 js 所有语法
|
||||
## 自动化测试
|
||||
可通过 js 脚本写断言,实现精准测试,在测试集列表点击 “高级” 按钮使用
|
||||
|
||||
#### 公共变量
|
||||
### 公共变量
|
||||
* assert
|
||||
|
||||
断言函数,详细 api可查看 <a target="_blank" href="https://nodejs.org/dist/latest-v8.x/docs/api/assert.html">document</a>
|
||||
@ -73,7 +73,7 @@ $.{key}.{params|body}.{path}
|
||||
|
||||
记录的 http 请求信息,假设需要获取 key为555的接口参数或者响应数据,可通过 records[555].params 或 records[555].body 获取
|
||||
|
||||
#### 示例
|
||||
### 示例
|
||||
```
|
||||
assert.equal(body.errcode, 0)
|
||||
assert.equal(body.data.group_name, 'testGroup')
|
||||
|
@ -396,12 +396,12 @@
|
||||
</blockquote>
|
||||
<p>
|
||||
<small class="text-muted">描述:</small>
|
||||
添加项目分组
|
||||
查询项目分组
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/group.js.html#13" target="_blank">./server/controllers/group.js:13</a>
|
||||
<a href="./static/server/controllers/group.js.html#14" target="_blank">./server/controllers/group.js:14</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -463,7 +463,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/group.js.html#43" target="_blank">./server/controllers/group.js:43</a>
|
||||
<a href="./static/server/controllers/group.js.html#44" target="_blank">./server/controllers/group.js:44</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -556,7 +556,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/group.js.html#136" target="_blank">./server/controllers/group.js:136</a>
|
||||
<a href="./static/server/controllers/group.js.html#144" target="_blank">./server/controllers/group.js:144</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -642,7 +642,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/group.js.html#213" target="_blank">./server/controllers/group.js:213</a>
|
||||
<a href="./static/server/controllers/group.js.html#218" target="_blank">./server/controllers/group.js:218</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -728,7 +728,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/group.js.html#265" target="_blank">./server/controllers/group.js:265</a>
|
||||
<a href="./static/server/controllers/group.js.html#271" target="_blank">./server/controllers/group.js:271</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -790,7 +790,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/group.js.html#291" target="_blank">./server/controllers/group.js:291</a>
|
||||
<a href="./static/server/controllers/group.js.html#297" target="_blank">./server/controllers/group.js:297</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -864,7 +864,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/group.js.html#342" target="_blank">./server/controllers/group.js:342</a>
|
||||
<a href="./static/server/controllers/group.js.html#348" target="_blank">./server/controllers/group.js:348</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -926,7 +926,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/group.js.html#404" target="_blank">./server/controllers/group.js:404</a>
|
||||
<a href="./static/server/controllers/group.js.html#413" target="_blank">./server/controllers/group.js:413</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -998,7 +998,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/group.js.html#448" target="_blank">./server/controllers/group.js:448</a>
|
||||
<a href="./static/server/controllers/group.js.html#457" target="_blank">./server/controllers/group.js:457</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -3564,7 +3564,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/interface.js.html#188" target="_blank">./server/controllers/interface.js:188</a>
|
||||
<a href="./static/server/controllers/interface.js.html#186" target="_blank">./server/controllers/interface.js:186</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -3629,7 +3629,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/interface.js.html#231" target="_blank">./server/controllers/interface.js:231</a>
|
||||
<a href="./static/server/controllers/interface.js.html#229" target="_blank">./server/controllers/interface.js:229</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -3694,7 +3694,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/interface.js.html#329" target="_blank">./server/controllers/interface.js:329</a>
|
||||
<a href="./static/server/controllers/interface.js.html#330" target="_blank">./server/controllers/interface.js:330</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -3927,7 +3927,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/interface.js.html#533" target="_blank">./server/controllers/interface.js:533</a>
|
||||
<a href="./static/server/controllers/interface.js.html#529" target="_blank">./server/controllers/interface.js:529</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -3999,7 +3999,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/interface.js.html#732" target="_blank">./server/controllers/interface.js:732</a>
|
||||
<a href="./static/server/controllers/interface.js.html#728" target="_blank">./server/controllers/interface.js:728</a>
|
||||
</p>
|
||||
|
||||
|
||||
|
@ -152,6 +152,10 @@
|
||||
<li >
|
||||
<a href="#编辑测试用例">编辑测试用例</a>
|
||||
</li>
|
||||
|
||||
<li >
|
||||
<a href="#自动化测试">自动化测试</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
@ -197,8 +201,8 @@
|
||||
<blockquote>
|
||||
<p>Tips: 上下拖动测试集合的列表项可以调整测试的顺序。</p>
|
||||
</blockquote>
|
||||
<h3 class="subject" id="高级">高级 <a class="hashlink" href="#高级">#</a></h3><p>可通过写断言脚本,实现精准测试,支持 js 所有语法</p>
|
||||
<h4 class="subject" id="公共变量">公共变量 <a class="hashlink" href="#公共变量">#</a></h4><ul>
|
||||
<h2 class="subject" id="自动化测试">自动化测试 <a class="hashlink" href="#自动化测试">#</a></h2><p>可通过 js 脚本写断言,实现精准测试,在测试集列表点击 “高级” 按钮使用</p>
|
||||
<h3 class="subject" id="公共变量">公共变量 <a class="hashlink" href="#公共变量">#</a></h3><ul>
|
||||
<li><p>assert </p>
|
||||
<p>断言函数,详细 api可查看 <a target="_blank" href="https://nodejs.org/dist/latest-v8.x/docs/api/assert.html">document</a></p>
|
||||
</li><li><p>status</p>
|
||||
@ -210,7 +214,7 @@
|
||||
</li><li><p>records </p>
|
||||
<p>记录的 http 请求信息,假设需要获取 key为555的接口参数或者响应数据,可通过 records[555].params 或 records[555].body 获取 </p>
|
||||
</li></ul>
|
||||
<h4 class="subject" id="示例">示例 <a class="hashlink" href="#示例">#</a></h4><pre><code>assert.equal(body.errcode<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>
|
||||
<h3 class="subject" id="示例">示例 <a class="hashlink" href="#示例">#</a></h3><pre><code>assert.equal(body.errcode<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>
|
||||
assert.equal(body.data.group_name<span class="token punctuation">,</span> 'testGroup'<span class="token punctuation">)</span>
|
||||
</code></pre>
|
||||
</div>
|
||||
|
@ -184,14 +184,14 @@
|
||||
<p>注:项目 id 可以在项目设置里查看到</p>
|
||||
</blockquote>
|
||||
<h2 class="subject" id="定义_mock_数据示例">定义 mock 数据示例 <a class="hashlink" href="#定义_mock_数据示例">#</a></h2><pre><code><span class="token punctuation">{</span>
|
||||
"status|<span class="token number">0</span>-<span class="token number">1</span>"<span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span> //接口状态
|
||||
<span class="token property">"status|0-1"</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span> //接口状态
|
||||
<span class="token property">"message"</span><span class="token operator">:</span> <span class="token string">"请求完成"</span><span class="token punctuation">,</span> //消息提示
|
||||
<span class="token property">"data"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
|
||||
<span class="token property">"counts"</span><span class="token operator">:</span><span class="token string">"@integer"</span><span class="token punctuation">,</span> //统计数量
|
||||
"totalSubjectType|<span class="token number">4</span>-<span class="token number">10</span>"<span class="token operator">:</span> <span class="token punctuation">[</span> //<span class="token number">4</span>-<span class="token number">10</span>意味着可以随机生成<span class="token number">4</span>-<span class="token number">10</span>组数据
|
||||
<span class="token property">"totalSubjectType|4-10"</span><span class="token operator">:</span> <span class="token punctuation">[</span> //<span class="token number">4</span>-<span class="token number">10</span>意味着可以随机生成<span class="token number">4</span>-<span class="token number">10</span>组数据
|
||||
<span class="token punctuation">{</span>
|
||||
"subjectName|regexp"<span class="token operator">:</span> "大数据|机器学习|工具<span class="token string">", //主题名
|
||||
"</span>subjectType|+<span class="token number">1</span>"<span class="token operator">:</span> <span class="token number">1</span> //类型
|
||||
<span class="token property">"subjectName|regexp"</span><span class="token operator">:</span> <span class="token string">"大数据|机器学习|工具"</span><span class="token punctuation">,</span> //主题名
|
||||
<span class="token property">"subjectType|+1"</span><span class="token operator">:</span> <span class="token number">1</span> //类型
|
||||
<span class="token punctuation">}</span>
|
||||
<span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token property">"data"</span><span class="token operator">:</span><span class="token punctuation">[</span>
|
||||
@ -205,8 +205,8 @@
|
||||
</code></pre><h2 class="subject" id="YApi-Mock_跟_Mockjs_区别">YApi-Mock 跟 Mockjs 区别 <a class="hashlink" href="#YApi-Mock_跟_Mockjs_区别">#</a></h2><p><a href="http://mockjs.com/examples.html">Mockjs 官网</a></p>
|
||||
<p>1 因为 yapi 基于 json 定义 mock ,无法使用 mockjs 原有的函数功能,正则表达式需要基于 rule 书写,示例如下:</p>
|
||||
<pre><code><span class="token punctuation">{</span>
|
||||
"name|regexp"<span class="token operator">:</span> <span class="token string">"[a-z0-9_]+?"</span><span class="token punctuation">,</span>
|
||||
"type|regexp"<span class="token operator">:</span> "json|text|xml" //枚举数据类型可这样实现
|
||||
<span class="token property">"name|regexp"</span><span class="token operator">:</span> <span class="token string">"[a-z0-9_]+?"</span><span class="token punctuation">,</span>
|
||||
<span class="token property">"type|regexp"</span><span class="token operator">:</span> <span class="token string">"json|text|xml"</span> //枚举数据类型可这样实现
|
||||
<span class="token punctuation">}</span>
|
||||
</code></pre><p>2 支持替换请求的 query, body 参数</p>
|
||||
<pre><code><span class="token punctuation">{</span>
|
||||
@ -243,9 +243,9 @@ $<span class="token punctuation">.</span><span class="token function">post</span
|
||||
<p><a href="#DPD">2. 数据占位符定义规范(Data Placeholder Definition,DPD)</a></p>
|
||||
<p><span id = "DTD"></span></p>
|
||||
<h3 class="subject" id="数据模板定义规范(Data_Template_Definition,DTD)">数据模板定义规范(Data Template Definition,DTD) <a class="hashlink" href="#数据模板定义规范(Data_Template_Definition,DTD)">#</a></h3><p>数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值:</p>
|
||||
<pre><code>// 属性名 name (与生成规则之间用 "|<span class="token string">" 隔开)
|
||||
// 生成规则 rule(生成规则有7种详见下面的生成规则)
|
||||
// 属性值 value(可以含有 "</span>@占位符" 同时也指定了最终值的初始值和类型)
|
||||
<pre><code>// 属性名 name (与生成规则之间用 <span class="token string">"|"</span> 隔开)
|
||||
// 生成规则 rule(生成规则有<span class="token number">7</span>种详见下面的生成规则)
|
||||
// 属性值 value(可以含有 <span class="token string">"@占位符"</span> 同时也指定了最终值的初始值和类型)
|
||||
|
||||
'name|rule'<span class="token operator">:</span> value
|
||||
|
||||
|
@ -99,6 +99,10 @@
|
||||
|
||||
<ul class="nav docs-sidenav-extend" >
|
||||
|
||||
<li >
|
||||
<a href="#Features">Features</a>
|
||||
</li>
|
||||
|
||||
<li >
|
||||
<a href="#Bug_Fixed">Bug Fixed</a>
|
||||
</li>
|
||||
@ -193,7 +197,9 @@
|
||||
|
||||
<div class="content-right markdown-body use-sidebar" role="main">
|
||||
|
||||
<h2 class="subject" id="1.1.3">1.1.3 <a class="hashlink" href="#1.1.3">#</a></h2><h3 class="subject" id="Bug_Fixed">Bug Fixed <a class="hashlink" href="#Bug_Fixed">#</a></h3><ul>
|
||||
<h2 class="subject" id="1.1.3">1.1.3 <a class="hashlink" href="#1.1.3">#</a></h2><h3 class="subject" id="Features">Features <a class="hashlink" href="#Features">#</a></h3><ul>
|
||||
<li>增加高级 Mock 期望功能,根据设置的请求过滤规则,返回期望数据。</li><li>增加统计功能</li><li>增加自动化测试功能,写断言脚本,实现精准测试</li><li></li></ul>
|
||||
<h3 class="subject" id="Bug_Fixed">Bug Fixed <a class="hashlink" href="#Bug_Fixed">#</a></h3><ul>
|
||||
<li>修复了切换集合环境的 Bug</li><li>修复了 mockServer 拿不到 Post 请求 Body</li><li>修复了接口调试 pathParams 无法使用 mock 参数和变量参数</li></ul>
|
||||
<h2 class="subject" id="1.1.2">1.1.2 <a class="hashlink" href="#1.1.2">#</a></h2><h3 class="subject" id="Features">Features <a class="hashlink" href="#Features">#</a></h3><ul>
|
||||
<li>接口运行增加了 query 和 body 的 enable 选项,可选择是否请求该字段</li><li>Mock 支持了时间戳占位符 @timestamp</li><li>接口集运行页面可选择环境</li><li>接口集动态参数格式由原来的 $.{key}.{jsonPath} 改为 $.{key}.{body|params}.{jsonPath}</li></ul>
|
||||
|
@ -1,6 +1,3 @@
|
||||
var EXAMPLE_MAX_HEIGHT = 98,
|
||||
DEFAULT_SHOW_PARAMS = 5;
|
||||
|
||||
$(document).ready(function() {
|
||||
// 移动端导航
|
||||
var $openPanel = $('.open-panel');
|
||||
@ -11,7 +8,6 @@ $(document).ready(function() {
|
||||
var $versionSelector = $('.version-selector');
|
||||
var $versionMask = $('.m-version-mask');
|
||||
var isPanelHide = true;
|
||||
var winWidth = $(window).width();
|
||||
var h2 = $('.content-right').find('h2');
|
||||
var h3 = $('.content-right').find('h3');
|
||||
var a = $('.content-left').find('a');
|
||||
@ -125,7 +121,6 @@ $(document).ready(function() {
|
||||
})
|
||||
$versionSelector.click(function(e) {
|
||||
$versionMask.show();
|
||||
console.log('e');
|
||||
});
|
||||
|
||||
$('.markdown-body pre').map(function(i, item) {
|
||||
@ -133,59 +128,61 @@ $(document).ready(function() {
|
||||
$(item).children('code').addClass('js-code-'+i);
|
||||
});
|
||||
|
||||
var winHeight = $(window).height() - 44,
|
||||
sidebar = $('.docs-sidebar');
|
||||
var docSideNav = $('.docs-sidenav');
|
||||
if (winWidth > 767) {
|
||||
docSideNav.width($contentLeftWidth);
|
||||
}
|
||||
if (sidebar.height() > winHeight) {
|
||||
sidebar.css('max-height', winHeight + 'px');
|
||||
$('.docs-sidenav').css('max-height', winHeight + 'px');
|
||||
if (winWidth < 768) {
|
||||
$('.docs-sidenav').css({
|
||||
'overflow-x': 'hidden'
|
||||
});
|
||||
}
|
||||
var activeMenu,
|
||||
barScroll = false;
|
||||
// var winHeight = $(window).height() - 44,
|
||||
// sidebar = $('.docs-sidebar');
|
||||
|
||||
sidebar.on('mouseover', function() {
|
||||
barScroll = true;
|
||||
});
|
||||
sidebar.on('mouseout', function() {
|
||||
barScroll = false;
|
||||
});
|
||||
};
|
||||
// var docSideNav = $('.docs-sidenav');
|
||||
// if (winWidth > 767) {
|
||||
// docSideNav.width($contentLeftWidth);
|
||||
// }
|
||||
|
||||
$(window).on('scroll', function(e) {
|
||||
if ($(this).scrollTop() > ($('.footer').offset().top - $(window).height())) {
|
||||
winHeight = $(window).height() - $('.footer').outerHeight() - 44;
|
||||
sidebar.css('max-height', winHeight + 'px');
|
||||
$('.docs-sidenav').css('max-height', winHeight + 'px');
|
||||
} else {
|
||||
winHeight = $(window).height() - 44;
|
||||
sidebar.css('max-height', winHeight + 'px');
|
||||
$('.docs-sidenav').css('max-height', winHeight + 'px');
|
||||
}
|
||||
// if (sidebar.height() > winHeight) {
|
||||
// sidebar.css('max-height', winHeight + 'px');
|
||||
// $('.docs-sidenav').css('max-height', winHeight + 'px');
|
||||
// if (winWidth < 768) {
|
||||
// $('.docs-sidenav').css({
|
||||
// 'overflow-x': 'hidden'
|
||||
// });
|
||||
// }
|
||||
// var activeMenu,
|
||||
// barScroll = false;
|
||||
//
|
||||
// sidebar.on('mouseover', function() {
|
||||
// barScroll = true;
|
||||
// });
|
||||
// sidebar.on('mouseout', function() {
|
||||
// barScroll = false;
|
||||
// });
|
||||
// };
|
||||
|
||||
if (!barScroll) {
|
||||
var activeItem = $('.docs-sidebar li.active a');
|
||||
if (activeItem.length) {
|
||||
if (!activeMenu || (activeMenu.attr('href') != activeItem.attr('href'))) {
|
||||
activeMenu = activeItem;
|
||||
var top = activeMenu.offset().top - sidebar.offset().top;
|
||||
if (top < 0) {
|
||||
//sidebar.scrollTop(sidebar.scrollTop() + top);
|
||||
$('.docs-sidenav').scrollTop($('.docs-sidenav').scrollTop() + top);
|
||||
} else if (top > winHeight - 88) {
|
||||
//sidebar.scrollTop(sidebar.scrollTop() + top - winHeight + 44);
|
||||
$('.docs-sidenav').scrollTop($('.docs-sidenav').scrollTop() + top - winHeight + 88);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
// $(window).on('scroll', function(e) {
|
||||
// if ($(this).scrollTop() > ($('.footer').offset().top - $(window).height())) {
|
||||
// winHeight = $(window).height() - $('.footer').outerHeight() - 44;
|
||||
// sidebar.css('max-height', winHeight + 'px');
|
||||
// $('.docs-sidenav').css('max-height', winHeight + 'px');
|
||||
// } else {
|
||||
// winHeight = $(window).height() - 44;
|
||||
// sidebar.css('max-height', winHeight + 'px');
|
||||
// $('.docs-sidenav').css('max-height', winHeight + 'px');
|
||||
// }
|
||||
//
|
||||
// if (!barScroll) {
|
||||
// var activeItem = $('.docs-sidebar li.active a');
|
||||
// if (activeItem.length) {
|
||||
// if (!activeMenu || (activeMenu.attr('href') != activeItem.attr('href'))) {
|
||||
// activeMenu = activeItem;
|
||||
// var top = activeMenu.offset().top - sidebar.offset().top;
|
||||
// if (top < 0) {
|
||||
// //sidebar.scrollTop(sidebar.scrollTop() + top);
|
||||
// $('.docs-sidenav').scrollTop($('.docs-sidenav').scrollTop() + top);
|
||||
// } else if (top > winHeight - 88) {
|
||||
// //sidebar.scrollTop(sidebar.scrollTop() + top - winHeight + 44);
|
||||
// $('.docs-sidenav').scrollTop($('.docs-sidenav').scrollTop() + top - winHeight + 88);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
|
||||
// 退出全屏浏览器窗口大小改变,不触发resize
|
||||
$(window).on('resize', function(e) {
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -189,7 +189,7 @@ class baseController {
|
||||
}
|
||||
}
|
||||
/**
|
||||
*
|
||||
* 身份验证
|
||||
* @param {*} id type对应的id
|
||||
* @param {*} type enum[interface, project, group]
|
||||
* @param {*} action enum[ danger, edit, view ] danger只有owner或管理员才能操作,edit只要是dev或以上就能执行
|
||||
|
@ -38,15 +38,16 @@ class groupController extends baseController {
|
||||
constructor(ctx) {
|
||||
super(ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加项目分组
|
||||
* 查询项目分组
|
||||
* @interface /group/get
|
||||
* @method GET
|
||||
* @category group
|
||||
* @foldnumber 10
|
||||
* @param {String} id 项目分组ID
|
||||
* @returns {Object}
|
||||
* @example
|
||||
* @returns {Object}
|
||||
* @example
|
||||
*/
|
||||
async get(ctx) {
|
||||
try {
|
||||
@ -58,7 +59,7 @@ class groupController extends baseController {
|
||||
let result = await groupInst.getGroupById(params.id);
|
||||
result = result.toObject();
|
||||
result.role = await this.getProjectRole(params.id, 'group');
|
||||
if(result.type === 'private'){
|
||||
if (result.type === 'private') {
|
||||
result.group_name = '个人空间';
|
||||
}
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
@ -98,8 +99,8 @@ class groupController extends baseController {
|
||||
}
|
||||
|
||||
let owners = [];
|
||||
if(params.owner_uids){
|
||||
for(let i = 0, len = params.owner_uids.length; i < len; i++) {
|
||||
if (params.owner_uids) {
|
||||
for (let i = 0, len = params.owner_uids.length; i < len; i++) {
|
||||
let id = params.owner_uids[i]
|
||||
let groupUserdata = await this.getUserdata(id, 'owner');
|
||||
if (groupUserdata) {
|
||||
@ -107,8 +108,8 @@ class groupController extends baseController {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
let groupInst = yapi.getInst(groupModel);
|
||||
|
||||
let checkRepeat = await groupInst.checkRepeat(params.group_name);
|
||||
@ -129,7 +130,7 @@ class groupController extends baseController {
|
||||
try {
|
||||
let result = await groupInst.save(data);
|
||||
|
||||
result = yapi.commons.fieldSelect(result, ['_id', 'group_name', 'group_desc', 'uid', 'members','type']);
|
||||
result = yapi.commons.fieldSelect(result, ['_id', 'group_name', 'group_desc', 'uid', 'members', 'type']);
|
||||
let username = this.getUsername();
|
||||
yapi.commons.saveLog({
|
||||
content: `<a href="/user/profile/${this.getUid()}">${username}</a> 新增了分组 <a href="/group/${result._id}">${params.group_name}</a>`,
|
||||
@ -145,6 +146,13 @@ class groupController extends baseController {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户数据
|
||||
* @param uid
|
||||
* @param role
|
||||
* @returns {Promise.<*>}
|
||||
*/
|
||||
|
||||
async getUserdata(uid, role) {
|
||||
role = role || 'dev';
|
||||
let userInst = yapi.getInst(userModel);
|
||||
@ -173,9 +181,6 @@ class groupController extends baseController {
|
||||
* @returns {Object}
|
||||
* @example
|
||||
*/
|
||||
|
||||
|
||||
|
||||
async addMember(ctx) {
|
||||
|
||||
let params = ctx.request.body;
|
||||
@ -191,9 +196,9 @@ class groupController extends baseController {
|
||||
let add_members = [];
|
||||
let exist_members = [];
|
||||
let no_members = []
|
||||
for(let i = 0, len = params.member_uids.length; i < len; i++) {
|
||||
for (let i = 0, len = params.member_uids.length; i < len; i++) {
|
||||
let id = params.member_uids[i];
|
||||
let check = await groupInst.checkMemberRepeat(params.id, id);
|
||||
let check = await groupInst.checkMemberRepeat(params.id, id);
|
||||
let userdata = await this.getUserdata(id, params.role);
|
||||
if (check > 0) {
|
||||
exist_members.push(userdata)
|
||||
@ -213,8 +218,8 @@ class groupController extends baseController {
|
||||
dev: "开发者",
|
||||
guest: "访客"
|
||||
};
|
||||
if(add_members.length){
|
||||
let members = add_members.map((item)=>{
|
||||
if (add_members.length) {
|
||||
let members = add_members.map((item) => {
|
||||
return `<a href = "/user/profile/${item.uid}">${item.username}</a>`
|
||||
})
|
||||
members = members.join("、");
|
||||
@ -290,6 +295,7 @@ class groupController extends baseController {
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有项目成员
|
||||
* @interface /group/get_member_list
|
||||
@ -382,10 +388,13 @@ class groupController extends baseController {
|
||||
let projectInst = yapi.getInst(projectModel);
|
||||
let userInst = yapi.getInst(userModel);
|
||||
let result = await groupInst.list();
|
||||
let privateGroup = await groupInst.getByPrivateUid(this.getUid())
|
||||
// let count = await groupInst.getListCount();
|
||||
// let count = await projectInst.getProjectListCount();
|
||||
// console.log('count', count);
|
||||
let privateGroup = await groupInst.getByPrivateUid(this.getUid());
|
||||
let newResult = [];
|
||||
|
||||
if(!privateGroup){
|
||||
if (!privateGroup) {
|
||||
privateGroup = await groupInst.save({
|
||||
uid: this.getUid(),
|
||||
group_name: 'User-' + this.getUid(),
|
||||
@ -394,35 +403,35 @@ class groupController extends baseController {
|
||||
type: 'private'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
if(result && result.length > 0){
|
||||
for(let i=0; i< result.length; i++){
|
||||
|
||||
if (result && result.length > 0) {
|
||||
for (let i = 0; i < result.length; i++) {
|
||||
result[i] = result[i].toObject();
|
||||
result[i].role = await this.getProjectRole(result[i]._id, 'group');
|
||||
if(result[i].role !== 'member'){
|
||||
if (result[i].role !== 'member') {
|
||||
newResult.unshift(result[i]);
|
||||
}else{
|
||||
} else {
|
||||
let publicCount = await projectInst.countWithPublic(result[i]._id);
|
||||
if(publicCount > 0){
|
||||
if (publicCount > 0) {
|
||||
newResult.push(result[i]);
|
||||
}else{
|
||||
} else {
|
||||
let projectCountWithAuth = await projectInst.getProjectWithAuth(result[i]._id, this.getUid());
|
||||
if(projectCountWithAuth > 0){
|
||||
if (projectCountWithAuth > 0) {
|
||||
newResult.push(result[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
if(privateGroup){
|
||||
if (privateGroup) {
|
||||
privateGroup = privateGroup.toObject();
|
||||
privateGroup.group_name = '个人空间';
|
||||
privateGroup.role = 'owner';
|
||||
newResult.unshift(privateGroup);
|
||||
}
|
||||
|
||||
|
||||
ctx.body = yapi.commons.resReturn(newResult);
|
||||
} catch (e) {
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message);
|
||||
@ -461,10 +470,10 @@ class groupController extends baseController {
|
||||
await interfaceCaseInst.delByProjectId(p._id)
|
||||
await interfaceColInst.delByProjectId(p._id)
|
||||
})
|
||||
if(projectList.length > 0){
|
||||
if (projectList.length > 0) {
|
||||
await projectInst.delByGroupid(id);
|
||||
}
|
||||
|
||||
|
||||
let result = await groupInst.del(id);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
} catch (err) {
|
||||
@ -486,7 +495,7 @@ class groupController extends baseController {
|
||||
* @example ./api/group/up.json
|
||||
*/
|
||||
async up(ctx) {
|
||||
|
||||
|
||||
let groupInst = yapi.getInst(groupModel);
|
||||
let id = ctx.request.body.id;
|
||||
let data = {};
|
||||
@ -505,7 +514,7 @@ class groupController extends baseController {
|
||||
if (!id) {
|
||||
return ctx.body = yapi.commons.resReturn(null, 402, 'id不能为空');
|
||||
}
|
||||
if(!ctx.request.body.group_name){
|
||||
if (!ctx.request.body.group_name) {
|
||||
return ctx.body = yapi.commons.resReturn(null, 402, '分组名称不能为空');
|
||||
}
|
||||
|
||||
|
@ -104,7 +104,6 @@ class interfaceController extends baseController {
|
||||
params.res_body_type = params.res_body_type ? params.res_body_type.toLowerCase() : 'json';
|
||||
|
||||
|
||||
|
||||
let http_path = url.parse(params.path, true);
|
||||
|
||||
if (!yapi.commons.verifyPath(http_path.pathname)) {
|
||||
@ -123,7 +122,6 @@ class interfaceController extends baseController {
|
||||
})
|
||||
|
||||
|
||||
|
||||
let checkRepeat = await this.Model.checkRepeat(params.project_id, params.path, params.method);
|
||||
|
||||
if (checkRepeat > 0) {
|
||||
@ -161,7 +159,7 @@ class interfaceController extends baseController {
|
||||
for (i = 1; i < paths.length; i++) {
|
||||
if (paths[i][0] === ':') {
|
||||
name = paths[i].substr(1);
|
||||
if (!_.find(params.req_params, { name: name })) {
|
||||
if (!_.find(params.req_params, {name: name})) {
|
||||
params.req_params.push({
|
||||
name: name,
|
||||
desc: ''
|
||||
@ -186,7 +184,7 @@ class interfaceController extends baseController {
|
||||
this.catModel.get(params.catid).then((cate) => {
|
||||
let username = this.getUsername();
|
||||
let title = `<a href="/user/profile/${this.getUid()}">${username}</a> 为分类 <a href="/project/${params.project_id}/interface/api/cat_${params.catid}">${cate.name}</a> 添加了接口 <a href="/project/${params.project_id}/interface/api/${result._id}">${data.title}</a> `
|
||||
|
||||
|
||||
yapi.commons.saveLog({
|
||||
content: title,
|
||||
type: 'project',
|
||||
@ -194,7 +192,7 @@ class interfaceController extends baseController {
|
||||
username: username,
|
||||
typeid: params.project_id
|
||||
});
|
||||
this.projectModel.up(params.project_id,{up_time: new Date().getTime()}).then();
|
||||
this.projectModel.up(params.project_id, {up_time: new Date().getTime()}).then();
|
||||
//let project = await this.projectModel.getBaseInfo(params.project_id);
|
||||
// let interfaceUrl = `http://${ctx.request.host}/project/${params.project_id}/interface/api/${result._id}`
|
||||
// this.sendNotice(params.project_id, {
|
||||
@ -232,8 +230,8 @@ class interfaceController extends baseController {
|
||||
|
||||
try {
|
||||
let result = await this.Model.get(params.id);
|
||||
if(!result){
|
||||
return ctx.body = yapi.commons.resReturn(null, 490, '不存在的');
|
||||
if (!result) {
|
||||
return ctx.body = yapi.commons.resReturn(null, 490, '不存在的');
|
||||
}
|
||||
let userinfo = await this.userModel.findById(result.uid);
|
||||
let project = await this.projectModel.getBaseInfo(result.project_id);
|
||||
@ -246,10 +244,10 @@ class interfaceController extends baseController {
|
||||
yapi.emitHook('interface_get', params.id).then();
|
||||
|
||||
result = result.toObject();
|
||||
if(userinfo){
|
||||
if (userinfo) {
|
||||
result.username = userinfo.username;
|
||||
}
|
||||
|
||||
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
} catch (e) {
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message);
|
||||
@ -269,7 +267,10 @@ class interfaceController extends baseController {
|
||||
async list(ctx) {
|
||||
let project_id = ctx.request.query.project_id;
|
||||
let project = await this.projectModel.getBaseInfo(project_id);
|
||||
if(!project){
|
||||
// let count = await this.Model.getInterfaceListCount();
|
||||
// console.log('interfaceCount', count);
|
||||
|
||||
if (!project) {
|
||||
return ctx.body = yapi.commons.resReturn(null, 407, '不存在的项目');
|
||||
}
|
||||
if (project.project_type === 'private') {
|
||||
@ -290,7 +291,7 @@ class interfaceController extends baseController {
|
||||
}
|
||||
}
|
||||
|
||||
async downloadCrx(ctx){
|
||||
async downloadCrx(ctx) {
|
||||
let filename = 'crossRequest.zip';
|
||||
let dataBuffer = yapi.fs.readFileSync(yapi.path.join(yapi.WEBROOT, 'static/attachment/cross-request.zip'));
|
||||
ctx.set('Content-disposition', 'attachment; filename=' + filename);
|
||||
@ -327,7 +328,7 @@ class interfaceController extends baseController {
|
||||
}
|
||||
|
||||
let project = await this.projectModel.getBaseInfo(project_id);
|
||||
if(!project){
|
||||
if (!project) {
|
||||
return ctx.body = yapi.commons.resReturn(null, 406, '不存在的项目');
|
||||
}
|
||||
if (project.project_type === 'private') {
|
||||
@ -406,8 +407,8 @@ class interfaceController extends baseController {
|
||||
}
|
||||
|
||||
let interfaceData = await this.Model.get(id);
|
||||
if(!interfaceData){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '不存在的接口');
|
||||
if (!interfaceData) {
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '不存在的接口');
|
||||
}
|
||||
let auth = await this.checkAuth(interfaceData.project_id, 'project', 'edit')
|
||||
if (!auth) {
|
||||
@ -418,28 +419,25 @@ class interfaceController extends baseController {
|
||||
up_time: yapi.commons.time()
|
||||
};
|
||||
|
||||
if(params.path){
|
||||
let http_path = url.parse(params.path, true);
|
||||
if (params.path) {
|
||||
let http_path = url.parse(params.path, true);
|
||||
|
||||
if (!yapi.commons.verifyPath(http_path.pathname)) {
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '接口path第一位必须是/,最后一位不能为/');
|
||||
}
|
||||
params.query_path = {};
|
||||
params.query_path.path = http_path.pathname;
|
||||
params.query_path.params = [];
|
||||
Object.keys(http_path.query).forEach((item) => {
|
||||
params.query_path.params.push({
|
||||
name: item,
|
||||
value: http_path.query[item]
|
||||
})
|
||||
})
|
||||
data.query_path = params.query_path
|
||||
if (!yapi.commons.verifyPath(http_path.pathname)) {
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '接口path第一位必须是/,最后一位不能为/');
|
||||
}
|
||||
params.query_path = {};
|
||||
params.query_path.path = http_path.pathname;
|
||||
params.query_path.params = [];
|
||||
Object.keys(http_path.query).forEach((item) => {
|
||||
params.query_path.params.push({
|
||||
name: item,
|
||||
value: http_path.query[item]
|
||||
})
|
||||
})
|
||||
data.query_path = params.query_path
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (params.path && (params.path !== interfaceData.path || params.method !== interfaceData.method)) {
|
||||
let checkRepeat = await this.Model.checkRepeat(interfaceData.project_id, params.path, params.method);
|
||||
if (checkRepeat > 0) {
|
||||
@ -448,7 +446,6 @@ class interfaceController extends baseController {
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!_.isUndefined(params.path)) {
|
||||
data.path = params.path;
|
||||
}
|
||||
@ -474,13 +471,13 @@ class interfaceController extends baseController {
|
||||
data.req_body_form = params.req_body_form;
|
||||
}
|
||||
if (!_.isUndefined(params.req_params) && Array.isArray(params.req_params) && params.req_params.length > 0) {
|
||||
if(Array.isArray(params.req_params) && params.req_params.length > 0){
|
||||
data.type = 'var'
|
||||
data.req_params = params.req_params;
|
||||
}else{
|
||||
data.type = 'static'
|
||||
data.req_params = [];
|
||||
}
|
||||
if (Array.isArray(params.req_params) && params.req_params.length > 0) {
|
||||
data.type = 'var'
|
||||
data.req_params = params.req_params;
|
||||
} else {
|
||||
data.type = 'static'
|
||||
data.req_params = [];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -508,7 +505,6 @@ class interfaceController extends baseController {
|
||||
}
|
||||
|
||||
|
||||
|
||||
try {
|
||||
let result = await this.Model.up(id, data);
|
||||
let username = this.getUsername();
|
||||
@ -522,7 +518,7 @@ class interfaceController extends baseController {
|
||||
typeid: cate.project_id
|
||||
});
|
||||
});
|
||||
this.projectModel.up(interfaceData.project_id,{up_time: new Date().getTime()}).then();
|
||||
this.projectModel.up(interfaceData.project_id, {up_time: new Date().getTime()}).then();
|
||||
} else {
|
||||
let cateid = interfaceData.catid;
|
||||
this.catModel.get(cateid).then((cate) => {
|
||||
@ -534,7 +530,7 @@ class interfaceController extends baseController {
|
||||
typeid: cate.project_id
|
||||
});
|
||||
});
|
||||
this.projectModel.up(interfaceData.project_id,{up_time: new Date().getTime()}).then();
|
||||
this.projectModel.up(interfaceData.project_id, {up_time: new Date().getTime()}).then();
|
||||
}
|
||||
if (params.switch_notice === true) {
|
||||
let project = await this.projectModel.getBaseInfo(interfaceData.project_id);
|
||||
@ -600,7 +596,7 @@ class interfaceController extends baseController {
|
||||
typeid: cate.project_id
|
||||
});
|
||||
})
|
||||
this.projectModel.up(data.project_id,{up_time: new Date().getTime()}).then();
|
||||
this.projectModel.up(data.project_id, {up_time: new Date().getTime()}).then();
|
||||
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
} catch (err) {
|
||||
@ -619,7 +615,7 @@ class interfaceController extends baseController {
|
||||
userinfo = await userInst.findById(result.edit_uid);
|
||||
data = {
|
||||
errno: result.edit_uid,
|
||||
data: { uid: result.edit_uid, username: userinfo.username }
|
||||
data: {uid: result.edit_uid, username: userinfo.username}
|
||||
}
|
||||
} else {
|
||||
this.Model.upEditUid(id, this.getUid()).then()
|
||||
@ -739,11 +735,11 @@ class interfaceController extends baseController {
|
||||
});
|
||||
|
||||
let interfaceData = await this.Model.listByCatid(id);
|
||||
interfaceData.forEach(async item=>{
|
||||
try{
|
||||
interfaceData.forEach(async item => {
|
||||
try {
|
||||
yapi.emitHook('interface_del', item._id).then();
|
||||
await this.caseModel.delByInterfaceId(item._id);
|
||||
}catch(e){
|
||||
} catch (e) {
|
||||
yapi.commons.log(e.message, 'error');
|
||||
}
|
||||
|
||||
|
@ -1 +1 @@
|
||||
window.WEBPACK_ASSETS = {"index.js":{"js":"index@f05eca8a90a855e30321.js","css":"index@f05eca8a90a855e30321.css"},"lib":{"js":"lib.min.js"},"lib2":{"js":"lib2.min.js"},"manifest":{"js":"manifest.min.js"}}
|
||||
window.WEBPACK_ASSETS = {"index.js":{"js":"index@e64124b71fda768d216e.js","css":"index@e64124b71fda768d216e.css"},"lib":{"js":"lib@af45216b3147faeb8fca.js"},"lib2":{"js":"lib2@e75cc0925bf03d61e4b7.js"},"manifest":{"js":"manifest@b67af9f8b578904e66c5.js"}}
|
1
static/prd/index@e64124b71fda768d216e.css
Normal file
1
static/prd/index@e64124b71fda768d216e.css
Normal file
File diff suppressed because one or more lines are too long
BIN
static/prd/index@e64124b71fda768d216e.css.gz
Normal file
BIN
static/prd/index@e64124b71fda768d216e.css.gz
Normal file
Binary file not shown.
227
static/prd/index@e64124b71fda768d216e.js
Normal file
227
static/prd/index@e64124b71fda768d216e.js
Normal file
File diff suppressed because one or more lines are too long
BIN
static/prd/index@e64124b71fda768d216e.js.gz
Normal file
BIN
static/prd/index@e64124b71fda768d216e.js.gz
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
1
static/prd/lib.min.js
vendored
1
static/prd/lib.min.js
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
1
static/prd/lib2.min.js
vendored
1
static/prd/lib2.min.js
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
21
static/prd/lib2@e75cc0925bf03d61e4b7.js
Normal file
21
static/prd/lib2@e75cc0925bf03d61e4b7.js
Normal file
File diff suppressed because one or more lines are too long
BIN
static/prd/lib2@e75cc0925bf03d61e4b7.js.gz
Normal file
BIN
static/prd/lib2@e75cc0925bf03d61e4b7.js.gz
Normal file
Binary file not shown.
60
static/prd/lib@af45216b3147faeb8fca.js
Normal file
60
static/prd/lib@af45216b3147faeb8fca.js
Normal file
File diff suppressed because one or more lines are too long
BIN
static/prd/lib@af45216b3147faeb8fca.js.gz
Normal file
BIN
static/prd/lib@af45216b3147faeb8fca.js.gz
Normal file
Binary file not shown.
1
static/prd/manifest.min.js
vendored
1
static/prd/manifest.min.js
vendored
@ -1 +0,0 @@
|
||||
!function(e){function t(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return e[n].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n=window.webpackJsonp;window.webpackJsonp=function(s,o){for(var u,f,l=0,c=[];l<s.length;l++)f=s[l],i[f]&&c.push.apply(c,i[f]),i[f]=0;for(u in o)e[u]=o[u];for(n&&n(s,o);c.length;)c.shift().call(null,t);if(o[0])return r[0]=0,t(0)};var r={},i={3:0};t.e=function(e,n){if(0===i[e])return n.call(null,t);if(void 0!==i[e])i[e].push(n);else{i[e]=[n];var r=document.getElementsByTagName("head")[0],s=document.createElement("script");s.type="text/javascript",s.charset="utf-8",s.async=!0,s.src=t.p+""+e+".chunk.min.js",r.appendChild(s)}},t.m=e,t.c=r,t.p=""}([])
|
1
static/prd/manifest@b67af9f8b578904e66c5.js
Normal file
1
static/prd/manifest@b67af9f8b578904e66c5.js
Normal file
@ -0,0 +1 @@
|
||||
!function(e){function n(t){if(r[t])return r[t].exports;var a=r[t]={exports:{},id:t,loaded:!1};return e[t].call(a.exports,a,a.exports,n),a.loaded=!0,a.exports}var t=window.webpackJsonp;window.webpackJsonp=function(o,p){for(var c,l,i=0,s=[];i<o.length;i++)l=o[i],a[l]&&s.push.apply(s,a[l]),a[l]=0;for(c in p)e[c]=p[c];for(t&&t(o,p);s.length;)s.shift().call(null,n);if(p[0])return r[0]=0,n(0)};var r={},a={3:0};n.e=function(e,t){if(0===a[e])return t.call(null,n);if(void 0!==a[e])a[e].push(t);else{a[e]=[t];var r=document.getElementsByTagName("head")[0],o=document.createElement("script");o.type="text/javascript",o.charset="utf-8",o.async=!0,o.src=n.p+""+e+".chunk.min.js",r.appendChild(o)}},n.m=e,n.c=r,n.p=""}([]);
|
Loading…
x
Reference in New Issue
Block a user