Merge branch 'dev' of gitlab.corp.qunar.com:mfe/yapi into dev

This commit is contained in:
zwjamnsss 2017-10-25 21:44:48 +08:00
commit 0b8fa64eea
13 changed files with 210 additions and 139 deletions

View File

@ -137,21 +137,16 @@ class InterfaceColContent extends Component {
}
handleColdata = (rows) => {
let { currColEnv } = this.state;
const colEnv = this.props.currProject.env;
currColEnv = currColEnv || colEnv[0].name;
rows = rows.map((item) => {
item.id = item._id;
item._test_status = item.test_status;
item.case_env = currColEnv;
return item;
})
rows = rows.sort((n, o) => {
return n.index - o.index;
})
this.setState({
rows: rows,
currColEnv
rows: rows
})
}
@ -216,7 +211,7 @@ class InterfaceColContent extends Component {
handleTest = async (interfaceData) => {
const { currProject } = this.props;
const { case_env } = interfaceData;
let { case_env } = interfaceData;
let path = URL.resolve(currProject.basepath, interfaceData.path);
interfaceData.req_params = interfaceData.req_params || [];
interfaceData.req_params.forEach(item => {
@ -224,6 +219,9 @@ class InterfaceColContent extends Component {
path = path.replace(`:${item.name}`, val || `:${item.name}`);
});
const domains = currProject.env.concat();
case_env = this.state.currColEnv ? this.state.currColEnv : case_env ;
let currDomain = _.find(domains, item => item.name === case_env);
if (!currDomain) {
currDomain = domains[0];
@ -483,9 +481,6 @@ class InterfaceColContent extends Component {
})
}
})
}
handleAdvCancel = () => {
@ -663,7 +658,8 @@ class InterfaceColContent extends Component {
<Tooltip title="点击查看文档"><Icon type="question-circle-o" /></Tooltip>
</a></h2>
<div style={{ display: 'inline-block', margin: 0, marginBottom: '16px' }}>
<Select value={currColEnv} style={{ width: "320px" }} onChange={this.colEnvChange}>
<Select value={currColEnv} style={{ width: "320px" }} onChange={this.colEnvChange}>
<Option key="default" value="" >默认使用 case 详情页面保存的 domain</Option>
{
colEnv.map((item) => {
return <Option key={item._id} value={item.name}>{item.name + ": " + item.domain}</Option>;

View File

@ -1,5 +1,5 @@
## 介绍
<p style='text-indent:2em;line-height:1.8em'>在平时的开发过程中经常遇到的一个问题是每次调试接口都需要重新填写参数YApi测试集可以保存之前填写的参数方便下次的调试。YApi测试集还可以一次性测试所有接口每个的请求参数可以通过前面已请求的接口数据读取或填写mock随机字符串</p>
<p style='text-indent:2em;line-height:1.8em'>在平时的开发过程中经常遇到的一个问题是每次调试接口都需要重新填写参数YApi测试集不但能够保存之前填写的参数,方便下次的调试,还可以一次性测试所有接口每个的请求参数可以通过前面已请求的接口数据读取或填写mock随机字符串,通过设置断言脚本验证返回数据的正确性,</p>
## 测试列表
@ -48,3 +48,33 @@ $.{key}.{params|body}.{path}
其中 **$.** 是使用 **动态变量** 的标志,$.269.**params** 即表示 key 值为 269 用例的请求参数,$.269.**body** 即表示 key 值为 269 用例的返回值。
> Tips: 上下拖动测试集合的列表项可以调整测试的顺序。
### 高级
可通过写断言脚本,实现精准测试,支持 js 所有语法
#### 公共变量
* assert
断言函数,详细 api可查看 <a target="_blank" href="https://nodejs.org/dist/latest-v8.x/docs/api/assert.html">document</a>
* status
http 状态码
* body
返回 response body
* header
返回 response header
* records
记录的 http 请求信息,假设需要获取 key为555的接口参数或者响应数据可通过 records[555].params 或 records[555].body 获取
#### 示例
```
assert.equal(body.errcode, 0)
assert.equal(body.data.group_name, 'testGroup')
```

View File

@ -1,16 +1,16 @@
## Mock介绍
<p style='text-indent:2em;line-height:1.8em'>YApi的Mock功能可以根据用户的输入接口信息如协议、URL、接口名、请求头、请求参数、mock规则([点击到Mock规则](#mock)生成Mock接口这些接口会自动生成模拟数据创建者可以自由构造需要的数据。而且与常见的Mock方式如将Mock写在代码里和JS拦截等相比yapi的Mock在使用场景和效率和复杂度上是相差甚远的正是由于yapi的Mock是一个第三方平台那么在团队开发时任何人都可以权限许可下创建、修改接口信息等操作这对于团队开发是很有好处的。 </p>
<p style='text-indent:2em;line-height:1.8em'>YApi的 Mock 功能可以根据用户的输入接口信息如协议、URL、接口名、请求头、请求参数、mock 规则([点击到 Mock 规则](#mock))生成 Mock 接口,这些接口会自动生成模拟数据,创建者可以自由构造需要的数据。而且与常见的 Mock 方式如将 Mock 写在代码里和JS拦截等相比 yapi Mock 在使用场景和效率和复杂度上是相差甚远的,正是由于 yapi Mock 是一个第三方平台,那么在团队开发时任何人都可以权限许可下创建、修改接口信息等操作,这对于团队开发是很有好处的。 </p>
**mock地址解析**`YApi平台网址 + mock + 您的项目id + 接口实际请求path`
假设你 YApi 的部署地址为http://yapi.xxx.com 然后用这个地址作为示例
mockd地址 http://yapi.xxx.com/mock/29/api/hackathon/login
mockd 地址: http://yapi.xxx.com/mock/29/api/hackathon/login
> 注:项目 id 可以在项目设置里查看到
## 定义mock数据示例
## 定义 mock 数据示例
```
{
"status|0-1": 0, //接口状态
@ -36,7 +36,7 @@
## YApi-Mock 跟 Mockjs 区别
<a href="http://mockjs.com">Mockjs 官网</a>
<a href="http://mockjs.com/examples.html">Mockjs 官网</a>
1 因为 yapi 基于 json 定义 mock ,无法使用 mockjs 原有的函数功能,正则表达式需要基于 rule 书写,示例如下:
@ -48,7 +48,7 @@
```
2 支持替换请求的query,body参数
2 支持替换请求的 query, body 参数
```
{
@ -58,9 +58,11 @@
```
## 如何使用Mock?
### 1 在js代码直接请求yapi提供的mock地址不用担心跨域问题
在代码直接请求yapi提供的mock地址以jQuery为例
## 如何使用 Mock
### 1 在 js 代码直接请求yapi提供的 mock 地址(不用担心跨域问题)
在代码直接请求 yapi 提供的 mock 地址,以 jQuery 为例:
````javascript
let prefix = 'http://yapi.xxx.com/mock/2817'
@ -73,7 +75,7 @@ $.post(prefix+'/baseapi/path', {username: 'xxx'}, function(res){
优点:不用修改项目代码
#### 2.1 基于nginx反向代理
#### 2.1 基于 nginx 反向代理
```` nginx
location /baseapi
@ -82,7 +84,7 @@ proxy_pass http://yapi.xxx.com/mock/2817/baseapi; #baseapi后面没有"/"
}
````
#### 2.2 基于ykit mock功能
#### 2.2 基于 ykit mock功能
```javascript
{
@ -97,7 +99,7 @@ proxy_pass http://yapi.xxx.com/mock/2817/baseapi; #baseapi后面没有"/"
#### 2.3 基于ykit Jerry代理
#### 2.3 基于 ykit Jerry 代理
假设您本地服务器访问地址是: http://xxx.com
@ -107,8 +109,8 @@ proxy_pass http://yapi.xxx.com/mock/2817/baseapi; #baseapi后面没有"/"
## Mock语法规范
>了解更多Mock详情[Mock.js 官方文档](https://github.com/nuysoft/Mock/wiki/Syntax-Specification)
## Mock 语法规范
>了解更多Mock详情[Mock.js 官方文档](http://mockjs.com/examples.html)
Mock.js 的语法规范包括两部分:

View File

@ -642,7 +642,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/group.js.html#227" target="_blank">./server/controllers/group.js:227</a>
<a href="./static/server/controllers/group.js.html#213" target="_blank">./server/controllers/group.js:213</a>
</p>
@ -728,7 +728,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/group.js.html#279" target="_blank">./server/controllers/group.js:279</a>
<a href="./static/server/controllers/group.js.html#265" target="_blank">./server/controllers/group.js:265</a>
</p>
@ -790,7 +790,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/group.js.html#305" target="_blank">./server/controllers/group.js:305</a>
<a href="./static/server/controllers/group.js.html#291" target="_blank">./server/controllers/group.js:291</a>
</p>
@ -864,7 +864,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/group.js.html#356" target="_blank">./server/controllers/group.js:356</a>
<a href="./static/server/controllers/group.js.html#342" target="_blank">./server/controllers/group.js:342</a>
</p>
@ -926,7 +926,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/group.js.html#418" target="_blank">./server/controllers/group.js:418</a>
<a href="./static/server/controllers/group.js.html#404" target="_blank">./server/controllers/group.js:404</a>
</p>
@ -998,7 +998,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/group.js.html#458" target="_blank">./server/controllers/group.js:458</a>
<a href="./static/server/controllers/group.js.html#448" target="_blank">./server/controllers/group.js:448</a>
</p>
@ -3694,7 +3694,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/interface.js.html#326" target="_blank">./server/controllers/interface.js:326</a>
<a href="./static/server/controllers/interface.js.html#329" target="_blank">./server/controllers/interface.js:329</a>
</p>
@ -3927,7 +3927,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/interface.js.html#530" target="_blank">./server/controllers/interface.js:530</a>
<a href="./static/server/controllers/interface.js.html#533" target="_blank">./server/controllers/interface.js:533</a>
</p>
@ -3999,7 +3999,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/interface.js.html#729" target="_blank">./server/controllers/interface.js:729</a>
<a href="./static/server/controllers/interface.js.html#732" target="_blank">./server/controllers/interface.js:732</a>
</p>
@ -4507,7 +4507,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/interfaceCol.js.html#162" target="_blank">./server/controllers/interfaceCol.js:162</a>
<a href="./static/server/controllers/interfaceCol.js.html#164" target="_blank">./server/controllers/interfaceCol.js:164</a>
</p>
@ -4689,7 +4689,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/interfaceCol.js.html#304" target="_blank">./server/controllers/interfaceCol.js:304</a>
<a href="./static/server/controllers/interfaceCol.js.html#306" target="_blank">./server/controllers/interfaceCol.js:306</a>
</p>
@ -4859,7 +4859,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/interfaceCol.js.html#373" target="_blank">./server/controllers/interfaceCol.js:373</a>
<a href="./static/server/controllers/interfaceCol.js.html#371" target="_blank">./server/controllers/interfaceCol.js:371</a>
</p>
@ -4921,7 +4921,7 @@
<p>
<small class="text-muted">源码位置:</small>
<a href="./static/server/controllers/interfaceCol.js.html#440" target="_blank">./server/controllers/interfaceCol.js:440</a>
<a href="./static/server/controllers/interfaceCol.js.html#438" target="_blank">./server/controllers/interfaceCol.js:438</a>
</p>

View File

@ -167,7 +167,7 @@
<div class="content-right markdown-body use-sidebar" role="main">
<h2 class="subject" id="介绍">介绍 <a class="hashlink" href="#介绍">#</a></h2><p style='text-indent:2em;line-height:1.8em'>在平时的开发过程中经常遇到的一个问题是每次调试接口都需要重新填写参数YApi测试集可以保存之前填写的参数方便下次的调试。YApi测试集还可以一次性测试所有接口每个的请求参数可以通过前面已请求的接口数据读取或填写mock随机字符串</p>
<h2 class="subject" id="介绍">介绍 <a class="hashlink" href="#介绍">#</a></h2><p style='text-indent:2em;line-height:1.8em'>在平时的开发过程中经常遇到的一个问题是每次调试接口都需要重新填写参数YApi测试集不但能够保存之前填写的参数,方便下次的调试,还可以一次性测试所有接口每个的请求参数可以通过前面已请求的接口数据读取或填写mock随机字符串,通过设置断言脚本验证返回数据的正确性,</p>
<h2 class="subject" id="测试列表">测试列表 <a class="hashlink" href="#测试列表">#</a></h2><p><img class="doc-img" style="width: 618px;" src="./images/usage/case-list.gif" /></p>
<p>在测试列表可以看到每个测试用例的 key,还有 开始测试、报告等功能</p>
@ -197,7 +197,22 @@
<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>
<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>
<p>http 状态码</p>
</li><li><p>body </p>
<p>返回 response body</p>
</li><li><p>header </p>
<p>返回 response header</p>
</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>
assert.equal(body.data.group_name<span class="token punctuation">,</span> 'testGroup'<span class="token punctuation">)</span>
</code></pre>
</div>
</div>

View File

@ -142,7 +142,7 @@
</li>
<li >
<a href="#如何使用Mock?">如何使用Mock?</a>
<a href="#如何使用_Mock">如何使用 Mock</a>
</li>
<li >
@ -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>
@ -202,18 +202,18 @@
<span class="token punctuation">}</span>
<span class="token punctuation">]</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</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">Mockjs 官网</a></p>
</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>
<span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"${query.name}"</span><span class="token punctuation">,</span> //请求的url是/path?name=xiaoming<span class="token punctuation">,</span> 返回的name字段是xiaoming
<span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"${body.type}"</span> //请求的requestBody type=<span class="token number">1</span><span class="token punctuation">,</span>返回的type字段是<span class="token number">1</span>
<span class="token punctuation">}</span>
</code></pre><h2 class="subject" id="如何使用Mock?">如何使用Mock? <a class="hashlink" href="#如何使用Mock?">#</a></h2><h3 class="subject" id="1_在js代码直接请求yapi提供的mock地址不用担心跨域问题">1 在js代码直接请求yapi提供的mock地址不用担心跨域问题 <a class="hashlink" href="#1_在js代码直接请求yapi提供的mock地址不用担心跨域问题">#</a></h3><p>在代码直接请求yapi提供的mock地址以jQuery为例</p>
</code></pre><h2 class="subject" id="如何使用_Mock">如何使用 Mock <a class="hashlink" href="#如何使用_Mock">#</a></h2><h3 class="subject" id="1_在js代码直接请求yapi提供的mock地址不用担心跨域问题">1 在js代码直接请求yapi提供的mock地址不用担心跨域问题 <a class="hashlink" href="#1_在js代码直接请求yapi提供的mock地址不用担心跨域问题">#</a></h3><p>在代码直接请求yapi提供的mock地址以jQuery为例</p>
<pre><code class="lang-javascript"><span class="token keyword">let</span> prefix <span class="token operator">=</span> <span class="token string">'http://yapi.xxx.com/mock/2817'</span>
$<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span>prefix<span class="token operator">+</span><span class="token string">'/baseapi/path'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>username<span class="token punctuation">:</span> <span class="token string">'xxx'</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">{</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//返回上图预览部分的数据</span>
@ -236,16 +236,16 @@ $<span class="token punctuation">.</span><span class="token function">post</span
<p><img src="./images/ykit.jpg" /></p>
<p><span id="mock"></span></p>
<h2 class="subject" id="Mock语法规范">Mock语法规范 <a class="hashlink" href="#Mock语法规范">#</a></h2><blockquote>
<p>了解更多Mock详情<a href="https://github.com/nuysoft/Mock/wiki/Syntax-Specification">Mock.js 官方文档</a></p>
<p>了解更多Mock详情<a href="http://mockjs.com/examples.html">Mock.js 官方文档</a></p>
</blockquote>
<p>Mock.js 的语法规范包括两部分:</p>
<p><a href="#DTD">1. 数据模板定义规范Data Template DefinitionDTD</a></p>
<p><a href="#DPD">2. 数据占位符定义规范Data Placeholder DefinitionDPD</a></p>
<p><span id = "DTD"></span></p>
<h3 class="subject" id="数据模板定义规范Data_Template_DefinitionDTD">数据模板定义规范Data Template DefinitionDTD <a class="hashlink" href="#数据模板定义规范Data_Template_DefinitionDTD">#</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

View File

@ -91,6 +91,20 @@
<nav class="docs-sidebar hidden-print hidden-xs hidden-sm">
<ul class="nav docs-sidenav">
<!-- <li > -->
<li >
<a href="#1.1.3">1.1.3</a>
</li>
<ul class="nav docs-sidenav-extend" >
<li >
<a href="#Bug_Fixed">Bug Fixed</a>
</li>
</ul>
<!-- <li > -->
<li >
@ -179,7 +193,9 @@
<div class="content-right markdown-body use-sidebar" role="main">
<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>
<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>
<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>
<h3 class="subject" id="Bug_Fixed">Bug Fixed <a class="hashlink" href="#Bug_Fixed">#</a></h3><ul>
<li>修复了接口集运行功能会忽略环境配置的 domain 路径</li><li>修复了动态路由 mock 返回结果不是该接口定义返回数据</li><li>修复了日志链接错误问题</li><li>修复了添加用户 loading 问题</li><li>修复了用户名编辑,前台未更新问题</li><li>修复了复制接口导致 GET 请求显示 request-body 问题</li><li>修复了接口集页面刷新后跳转到第一个接口集问题</li><li>修复了接口用例页面修改 header 参数值没有效果 bug</li><li>修复了接口集页面导入接口会导致 reqBody 清空 bug</li></ul>

View File

@ -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

View File

@ -205,20 +205,6 @@ class groupController extends baseController {
}
}
// params.role = ['owner', 'dev', 'guest'].find(v => v === params.role) || 'dev';
// var check = await groupInst.checkMemberRepeat(params.id, params.member_uid);
// if (check > 0) {
// return ctx.body = yapi.commons.resReturn(null, 400, '成员已存在');
// }
// let groupUserdata = await this.getUserdata(params.member_uid, params.role);
// if (groupUserdata === null) {
// return ctx.body = yapi.commons.resReturn(null, 400, '组长uid不存在')
// }
// if (groupUserdata._role === 'admin') {
// return ctx.body = yapi.commons.resReturn(null, 400, '不能邀请管理员')
// }
// delete groupUserdata._role;
try {
let result = await groupInst.addMember(params.id, add_members);
let username = this.getUsername();
@ -475,10 +461,14 @@ class groupController extends baseController {
await interfaceCaseInst.delByProjectId(p._id)
await interfaceColInst.delByProjectId(p._id)
})
await projectInst.delByGroupid(id);
if(projectList.length > 0){
await projectInst.delByGroupid(id);
}
let result = await groupInst.del(id);
ctx.body = yapi.commons.resReturn(result);
} catch (err) {
console.error(err);
ctx.body = yapi.commons.resReturn(null, 402, err.message);
}
}

View File

@ -327,6 +327,9 @@ class interfaceController extends baseController {
}
let project = await this.projectModel.getBaseInfo(project_id);
if(!project){
return ctx.body = yapi.commons.resReturn(null, 406, '不存在的项目');
}
if (project.project_type === 'private') {
if (await this.checkAuth(project._id, 'project', 'view') !== true) {
return ctx.body = yapi.commons.resReturn(null, 406, '没有权限');

View File

@ -181,7 +181,9 @@ class interfaceColController extends baseController{
resultList = resultList.sort((a,b)=>{
return a.index - b.index;
});
ctx.body = yapi.commons.resReturn(resultList);
let ctxBody = yapi.commons.resReturn(resultList);
ctxBody.colData = colData;
ctx.body = ctxBody;
} catch (e) {
ctx.body = yapi.commons.resReturn(null, 402, e.message);
}
@ -361,10 +363,6 @@ class interfaceColController extends baseController{
return ctx.body = yapi.commons.resReturn(null, 400, '用例id不能为空');
}
// if(!params.casename){
// return ctx.body = yapi.commons.resReturn(null, 400, '用例名称不能为空');
// }
let caseData = await this.caseModel.get(params.id);
let auth = await this.checkAuth(caseData.project_id, 'project', 'edit');
if (!auth) {
@ -373,9 +371,9 @@ class interfaceColController extends baseController{
params.uid = this.getUid();
//不允许修改接口id和项目id
delete params.interface_id;
delete params.project_id;
// delete params.col_id;
let result = await this.caseModel.up(params.id, params);
let username = this.getUsername();
@ -481,20 +479,22 @@ class interfaceColController extends baseController{
try{
let params = ctx.request.body;
let id = params.col_id;
if(!id){
return ctx.body = yapi.commons.resReturn(null, 400, '缺少 col_id 参数');
}
let colData = await this.colModel.get(id);
if(!colData){
return ctx.body = yapi.commons.resReturn(null, 400, '不存在');
}
let auth = await this.checkAuth(colData.project_id, 'project', 'edit')
if (!auth) {
return ctx.body = yapi.commons.resReturn(null, 400, '没有权限');
}
let result = await this.colModel.up(params.col_id, {
name: params.name,
desc: params.desc,
up_time: yapi.commons.time()
});
delete params.col_id;
let result = await this.colModel.up(id, params);
let username = this.getUsername();
yapi.commons.saveLog({
contnet: `<a href="/user/profile/${this.getUid()}">${username}</a> 更新了接口集 <a href="/project/${colData.project_id}/interface/col/${params.col_id}">${params.name}</a> 的信息`,
content: `<a href="/user/profile/${this.getUid()}">${username}</a> 更新了接口集 <a href="/project/${colData.project_id}/interface/col/${id}">${colData.name}</a> 的信息`,
type: 'project',
uid: this.getUid(),
username: username,
@ -622,6 +622,28 @@ class interfaceColController extends baseController{
}
}
async runCaseScript(ctx){
let params = ctx.request.body;
let script = params.script;
if(!script){
return ctx.body = yapi.commons.resReturn('ok');
}
try{
let a = yapi.commons.sandbox({
assert: require('assert'),
status: params.response.status,
body: params.response.body,
header: params.response.header,
records: params.records
}, script);
return ctx.body = yapi.commons.resReturn('ok');
}catch(err){
let errArr = err.stack.split("\n");
return ctx.body = yapi.commons.resReturn(errArr, 400, err.message)
}
}
}