mirror of
https://github.com/YMFE/yapi.git
synced 2025-03-07 14:16:52 +08:00
Merge branch 'dev' of gitlab.corp.qunar.com:mfe/yapi into dev
This commit is contained in:
commit
0b8fa64eea
@ -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>;
|
||||
|
@ -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')
|
||||
```
|
||||
|
@ -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 的语法规范包括两部分:
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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 Definition,DTD)</a></p>
|
||||
<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
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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, '没有权限');
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user