mirror of
https://github.com/YMFE/yapi.git
synced 2025-04-06 15:00:26 +08:00
fix: 测试集合运行页面bug
This commit is contained in:
parent
be4e449190
commit
88ffc90560
@ -1,12 +1,15 @@
|
||||
### v1.3.16
|
||||
|
||||
* 支持自定义域名邮箱登录
|
||||
* 测试用例支持导入不同项目接口
|
||||
|
||||
|
||||
#### Bug Fixed
|
||||
|
||||
* postman headers 为 null 时报错
|
||||
* format-data 数据解析不成功
|
||||
* 导出的接口顺序希望按照api的接口顺序
|
||||
|
||||
|
||||
|
||||
### v1.3.15
|
||||
|
122
a.markdown
122
a.markdown
@ -1,122 +1,4 @@
|
||||
|
||||
<h1 class="curproject-name"> swagger_test </h1>
|
||||
啊啊啊啊啊啊
|
||||
|
||||
|
||||
# eeeeeee
|
||||
[TOC]
|
||||
|
||||
|
||||
## 13%0A%3Ca%20id%3D13%3E%20%3C/a%3E
|
||||
[TOC]
|
||||
|
||||
### 基本信息
|
||||
|
||||
**Path:** /api/13
|
||||
|
||||
**Method:** GET
|
||||
|
||||
**接口描述:**
|
||||
|
||||
|
||||
### 请求参数
|
||||
**Query**
|
||||
|
||||
| 参数名称 | 是否必须 | 示例 | 备注 |
|
||||
| ------------ | ------------ | ------------ | ------------ |
|
||||
| qqq | 是 | | |
|
||||
| wwww | 是 | | |
|
||||
| wwwww | 是 | | |
|
||||
|
||||
### 返回数据
|
||||
|
||||
<table>
|
||||
<thead class="ant-table-thead">
|
||||
<tr>
|
||||
<th key=name>名称</th><th key=type>类型</th><th key=required>是否必须</th><th key=default>默认值</th><th key=desc>备注</th><th key=sub>其他信息</th>
|
||||
</tr>
|
||||
</thead><tbody className="ant-table-tbody"><tr key=0-0><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> id</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span>The unique identifier for product</span></td><td key=5></td></tr><tr key=0-1><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> name</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-2><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> price</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=1><span style="font-weight: '700'">最小值: </span><span>0</span></p></td></tr><tr key=0-3><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> arr</span></td><td key=1><span>string []</span></td><td key=2>非必须</td><td key=3></td><td key=4><span>sdfsdf</span></td><td key=5><p key=3><span style="font-weight: '700'">item 类型: </span><span>string</span></p></td></tr><tr key=0-4><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> tags</span></td><td key=1><span>object []</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=0><span style="font-weight: '700'">最小数量: </span><span>1</span></p><p key=1><span style="font-weight: '700'">元素是否都不同: </span><span>true</span></p><p key=3><span style="font-weight: '700'">item 类型: </span><span>object</span></p></td></tr><tr key=0-4-0><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> length</span></td><td key=1><span>number</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-4-1><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> width</span></td><td key=1><span>number</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-4-2><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> height</span></td><td key=1><span>number</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-5><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> dimensions</span></td><td key=1><span>object</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-5-0><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> length</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-5-1><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> width</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-5-2><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> height</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## 16%0A%3Ca%20id%3D16%3E%20%3C/a%3E
|
||||
[TOC]
|
||||
|
||||
### 基本信息
|
||||
|
||||
**Path:** /api/16
|
||||
|
||||
**Method:** GET
|
||||
|
||||
**接口描述:**
|
||||
|
||||
|
||||
### 请求参数
|
||||
|
||||
### 返回数据
|
||||
|
||||
<table>
|
||||
<thead class="ant-table-thead">
|
||||
<tr>
|
||||
<th key=name>名称</th><th key=type>类型</th><th key=required>是否必须</th><th key=default>默认值</th><th key=desc>备注</th><th key=sub>其他信息</th>
|
||||
</tr>
|
||||
</thead><tbody className="ant-table-tbody"><tr key=0-0><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> success</span></td><td key=1><span>boolean</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=0><span style="font-weight: '700'">枚举: </span><span>true,false</span></p></td></tr><tr key=0-1><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> data</span></td><td key=1><span>object</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-1-0><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> success</span></td><td key=1><span>boolean</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=0><span style="font-weight: '700'">枚举: </span><span>true</span></p></td></tr><tr key=0-1-1><td key=0><span style="padding-left: 20px"><span style="color: #8c8a8a">├─</span> data</span></td><td key=1><span>object</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-1-1-0><td key=0><span style="padding-left: 40px"><span style="color: #8c8a8a">├─</span> count</span></td><td key=1><span>number</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-1-1-1><td key=0><span style="padding-left: 40px"><span style="color: #8c8a8a">├─</span> rows</span></td><td key=1><span>object []</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=3><span style="font-weight: '700'">item 类型: </span><span>object</span></p></td></tr><tr key=0-1-1-1-0><td key=0><span style="padding-left: 60px"><span style="color: #8c8a8a">├─</span> name</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr><tr key=0-1-1-1-1><td key=0><span style="padding-left: 60px"><span style="color: #8c8a8a">├─</span> id</span></td><td key=1><span>string</span></td><td key=2>非必须</td><td key=3></td><td key=4><span></span></td><td key=5></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## 22%0A%3Ca%20id%3D22%3E%20%3C/a%3E
|
||||
[TOC]
|
||||
|
||||
### 基本信息
|
||||
|
||||
**Path:** /api/22
|
||||
|
||||
**Method:** POST
|
||||
|
||||
**接口描述:**
|
||||
|
||||
|
||||
### 请求参数
|
||||
**Headers**
|
||||
|
||||
| 参数名称 | 参数值 | 是否必须 | 示例 | 备注 |
|
||||
| ------------ | ------------ | ------------ | ------------ | ------------ |
|
||||
| Content-Type | application/json | 是 | | |
|
||||
**Body**
|
||||
|
||||
<table>
|
||||
<thead class="ant-table-thead">
|
||||
<tr>
|
||||
<th key=name>名称</th><th key=type>类型</th><th key=required>是否必须</th><th key=default>默认值</th><th key=desc>备注</th><th key=sub>其他信息</th>
|
||||
</tr>
|
||||
</thead><tbody className="ant-table-tbody"><tr key=0-0><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> id</span></td><td key=1><span>integer</span></td><td key=2>必须</td><td key=3></td><td key=4><span>The unique identifier for a product</span></td><td key=5></td></tr><tr key=0-1><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> name</span></td><td key=1><span>string</span></td><td key=2>必须</td><td key=3></td><td key=4><span>Name of the product</span></td><td key=5></td></tr><tr key=0-2><td key=0><span style="padding-left: 0px"><span style="color: #8c8a8a"></span> price</span></td><td key=1><span>number</span></td><td key=2>必须</td><td key=3></td><td key=4><span></span></td><td key=5><p key=1><span style="font-weight: '700'">最小值: </span><span>0</span></p></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
### 返回数据
|
||||
|
||||
```javascript
|
||||
|
||||
/**
|
||||
* 这是一个 response 事例
|
||||
*/
|
||||
{
|
||||
"errcode": 0, //错误编码
|
||||
"data": {
|
||||
"id": "uuid-xxx", //产品id
|
||||
"name": "iphone" //产品名称
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
# ee
|
||||
[TOC]
|
||||
|
||||
|
||||
# tag
|
||||
[TOC]
|
||||
|
||||
|
||||
# %u545C%u545C%u545C
|
||||
[TOC]
|
||||
<h1 class="curproject-name"> eererer </h1>
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -4,10 +4,10 @@ const projectModel = require('models/project.js');
|
||||
|
||||
const interfaceCatModel = require('models/interfaceCat.js');
|
||||
const yapi = require('yapi.js');
|
||||
const markdownIt = require("markdown-it");
|
||||
const markdownItAnchor = require("markdown-it-anchor");
|
||||
const markdownItTableOfContents = require("markdown-it-table-of-contents");
|
||||
const defaultTheme = require("./defaultTheme.js");
|
||||
const markdownIt = require('markdown-it');
|
||||
const markdownItAnchor = require('markdown-it-anchor');
|
||||
const markdownItTableOfContents = require('markdown-it-table-of-contents');
|
||||
const defaultTheme = require('./defaultTheme.js');
|
||||
const md = require('../../common/markdown');
|
||||
|
||||
// const htmlToPdf = require("html-pdf");
|
||||
@ -20,94 +20,91 @@ class exportController extends baseController {
|
||||
}
|
||||
|
||||
async handleListClass(pid, status) {
|
||||
|
||||
let result = await this.catModel.list(pid), newResult = [];
|
||||
let result = await this.catModel.list(pid),
|
||||
newResult = [];
|
||||
for (let i = 0, item, list; i < result.length; i++) {
|
||||
item = result[i].toObject()
|
||||
list = await this.interModel.listByInterStatus(item._id, status)
|
||||
for (let j = 0; j < list.length; j++) {
|
||||
list[j] = list[j].toObject()
|
||||
item = result[i].toObject();
|
||||
list = await this.interModel.listByInterStatus(item._id, status);
|
||||
list = list.sort((a, b) => {
|
||||
return a.index - b.index;
|
||||
});
|
||||
if (list.length > 0) {
|
||||
item.list = list;
|
||||
newResult[i] = item;
|
||||
}
|
||||
item.list = list;
|
||||
newResult[i] = item
|
||||
}
|
||||
|
||||
return newResult;
|
||||
}
|
||||
|
||||
handleExistId(data){
|
||||
handleExistId(data) {
|
||||
function delArrId(arr, fn) {
|
||||
if (!Array.isArray(arr)) return;
|
||||
arr.forEach(item => {
|
||||
delete item._id;
|
||||
delete item.__v;
|
||||
delete item.uid;
|
||||
delete item.edit_uid;
|
||||
delete item.catid;
|
||||
delete item.project_id;
|
||||
|
||||
function delArrId(arr, fn){
|
||||
if(!Array.isArray(arr))return;
|
||||
arr.forEach(item=>{
|
||||
delete item._id
|
||||
delete item.__v
|
||||
delete item.uid
|
||||
delete item.edit_uid
|
||||
delete item.catid
|
||||
delete item.project_id
|
||||
|
||||
if(typeof fn === 'function') fn(item)
|
||||
})
|
||||
|
||||
if (typeof fn === 'function') fn(item);
|
||||
});
|
||||
}
|
||||
|
||||
delArrId(data, function(item){
|
||||
delArrId(item.list, function(api){
|
||||
delArrId(api.req_body_form)
|
||||
delArrId(api.req_params)
|
||||
delArrId(api.req_query)
|
||||
delArrId(api.req_headers)
|
||||
if(api.query_path && typeof api.query_path === 'object'){
|
||||
delArrId(api.query_path.params)
|
||||
}
|
||||
|
||||
})
|
||||
})
|
||||
|
||||
delArrId(data, function(item) {
|
||||
delArrId(item.list, function(api) {
|
||||
delArrId(api.req_body_form);
|
||||
delArrId(api.req_params);
|
||||
delArrId(api.req_query);
|
||||
delArrId(api.req_headers);
|
||||
if (api.query_path && typeof api.query_path === 'object') {
|
||||
delArrId(api.query_path.params);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
async exportData(ctx) {
|
||||
|
||||
let pid = ctx.request.query.pid;
|
||||
let type = ctx.request.query.type;
|
||||
let status = ctx.request.query.status;
|
||||
if (!pid) {
|
||||
ctx.body = yapi.commons.resReturn(null, 200, "pid 不为空");
|
||||
ctx.body = yapi.commons.resReturn(null, 200, 'pid 不为空');
|
||||
}
|
||||
let curProject;
|
||||
let tp = "";
|
||||
let tp = '';
|
||||
try {
|
||||
curProject = await this.projectModel.get(pid);
|
||||
ctx.set("Content-Type", "application/octet-stream");
|
||||
ctx.set('Content-Type', 'application/octet-stream');
|
||||
const list = await this.handleListClass(pid, status);
|
||||
|
||||
switch (type) {
|
||||
case "markdown": {
|
||||
case 'markdown': {
|
||||
tp = await createMarkdown.bind(this)(list, false);
|
||||
ctx.set("Content-Disposition", `attachment; filename=api.md`);
|
||||
return ctx.body = tp;
|
||||
ctx.set('Content-Disposition', `attachment; filename=api.md`);
|
||||
return (ctx.body = tp);
|
||||
}
|
||||
case "json": {
|
||||
let data = this.handleExistId(list)
|
||||
tp = JSON.stringify(data, null,2);
|
||||
ctx.set("Content-Disposition", `attachment; filename=api.json`);
|
||||
return ctx.body = tp;
|
||||
case 'json': {
|
||||
let data = this.handleExistId(list);
|
||||
tp = JSON.stringify(data, null, 2);
|
||||
ctx.set('Content-Disposition', `attachment; filename=api.json`);
|
||||
return (ctx.body = tp);
|
||||
}
|
||||
default: {//默认为html
|
||||
default: {
|
||||
//默认为html
|
||||
tp = await createHtml.bind(this)(list);
|
||||
ctx.set("Content-Disposition", `attachment; filename=api.html`);
|
||||
return ctx.body = tp;
|
||||
ctx.set('Content-Disposition', `attachment; filename=api.html`);
|
||||
return (ctx.body = tp);
|
||||
}
|
||||
|
||||
}
|
||||
} catch (error) {
|
||||
yapi.commons.log(error, 'error');
|
||||
ctx.body = yapi.commons.resReturn(null, 502, "下载出错");
|
||||
ctx.body = yapi.commons.resReturn(null, 502, '下载出错');
|
||||
}
|
||||
|
||||
|
||||
async function createHtml(list) {
|
||||
let md = await createMarkdown.bind(this)(list, true);
|
||||
let markdown = markdownIt({ html: true, breaks: true });
|
||||
@ -115,21 +112,23 @@ class exportController extends baseController {
|
||||
markdown.use(markdownItTableOfContents, {
|
||||
markerPattern: /^\[toc\]/im
|
||||
});
|
||||
|
||||
require('fs').writeFileSync('./a.markdown', md)
|
||||
|
||||
require('fs').writeFileSync('./a.markdown', md);
|
||||
let tp = unescape(markdown.render(md));
|
||||
|
||||
|
||||
let left;
|
||||
// console.log('tp',tp);
|
||||
let content = tp.replace(/<div\s+?class="table-of-contents"\s*>[\s\S]*?<\/ul>\s*<\/div>/gi, function (match) {
|
||||
left = match;
|
||||
return '';
|
||||
});
|
||||
// console.log('left',left);
|
||||
return createHtml5(left, content);
|
||||
let content = tp.replace(
|
||||
/<div\s+?class="table-of-contents"\s*>[\s\S]*?<\/ul>\s*<\/div>/gi,
|
||||
function(match) {
|
||||
left = match;
|
||||
return '';
|
||||
}
|
||||
);
|
||||
console.log('left', left);
|
||||
return createHtml5(left || '', content);
|
||||
}
|
||||
|
||||
|
||||
function createHtml5(left, tp) {
|
||||
//html5模板
|
||||
let html = `<!DOCTYPE html>
|
||||
@ -162,7 +161,8 @@ class exportController extends baseController {
|
||||
return html;
|
||||
}
|
||||
|
||||
function createMarkdown(list, isToc) {//拼接markdown
|
||||
function createMarkdown(list, isToc) {
|
||||
//拼接markdown
|
||||
//模板
|
||||
let mdTemplate = ``;
|
||||
try {
|
||||
@ -173,11 +173,10 @@ class exportController extends baseController {
|
||||
return mdTemplate;
|
||||
} catch (e) {
|
||||
yapi.commons.log(e, 'error');
|
||||
ctx.body = yapi.commons.resReturn(null, 502, "下载出错");
|
||||
ctx.body = yapi.commons.resReturn(null, 502, '下载出错');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = exportController;
|
||||
module.exports = exportController;
|
||||
|
@ -442,7 +442,7 @@ class interfaceController extends baseController {
|
||||
item = result[i].toObject()
|
||||
list = await this.Model.listByCatid(item._id)
|
||||
for (let j = 0; j < list.length; j++) {
|
||||
list[j] = list[j].toObject()
|
||||
list[j] = list[j].toObject()
|
||||
}
|
||||
|
||||
item.list = list;
|
||||
@ -1020,6 +1020,7 @@ class interfaceController extends baseController {
|
||||
let res = yapi.commons.schemaToJson(schema, {
|
||||
alwaysFakeOptionals: required ? true : false
|
||||
})
|
||||
// console.log('res',res)
|
||||
return ctx.body = res;
|
||||
|
||||
}
|
||||
|
@ -333,7 +333,20 @@ class interfaceColController extends baseController {
|
||||
let interfaceData = await this.interfaceModel.get(params.interface_list[i]);
|
||||
data.interface_id = params.interface_list[i];
|
||||
data.casename = interfaceData.title;
|
||||
data.req_body_other = interfaceData.req_body_other;
|
||||
|
||||
// 处理json schema 解析
|
||||
if(interfaceData.req_body_type === 'json' && interfaceData.req_body_other && interfaceData.req_body_is_json_schema) {
|
||||
let req_body_other = yapi.commons.json_parse(interfaceData.req_body_other)
|
||||
req_body_other = yapi.commons.schemaToJson(req_body_other, {
|
||||
alwaysFakeOptionals: true
|
||||
})
|
||||
|
||||
data.req_body_other = JSON.stringify(req_body_other)
|
||||
|
||||
} else {
|
||||
data.req_body_other = interfaceData.req_body_other;
|
||||
}
|
||||
|
||||
data.req_body_type = interfaceData.req_body_type;
|
||||
let caseResultData= await this.caseModel.save(data);
|
||||
let username = this.getUsername();
|
||||
|
@ -147,8 +147,9 @@ class openController extends baseController{
|
||||
let item = caseList[i];
|
||||
|
||||
item.id = item._id;
|
||||
|
||||
item.case_env = curEnv || item.case_env;
|
||||
item.req_headers = this.handleReqHeader(item.req_headers, projectData.env, curEnv)
|
||||
item.req_headers = this.handleReqHeader(item.req_headers, projectData.env, item.case_env)
|
||||
item.pre_script = projectData.pre_script;
|
||||
item.after_script = projectData.after_script;
|
||||
item.env= projectData.env;
|
||||
|
@ -43,6 +43,7 @@ exports.schemaToJson = function(schema, options={}){
|
||||
let result
|
||||
try{
|
||||
result = jsf(schema)
|
||||
|
||||
}catch(err){
|
||||
result = err.message
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user