diff --git a/client/containers/Project/Interface/InterfaceList/AddInterfaceForm.js b/client/containers/Project/Interface/InterfaceList/AddInterfaceForm.js index 70d7e32c..e8052916 100644 --- a/client/containers/Project/Interface/InterfaceList/AddInterfaceForm.js +++ b/client/containers/Project/Interface/InterfaceList/AddInterfaceForm.js @@ -19,7 +19,8 @@ class AddInterfaceForm extends Component { form: PropTypes.object, onSubmit: PropTypes.func, onCancel: PropTypes.func, - catid: PropTypes.number + catid: PropTypes.number, + catdata: PropTypes.array } handleSubmit = (e) => { e.preventDefault(); @@ -31,7 +32,7 @@ class AddInterfaceForm extends Component { }); } - handlePath = (e)=>{ + handlePath = (e) => { let val = e.target.value this.props.form.setFieldsValue({ path: handlePath(val) @@ -64,6 +65,20 @@ class AddInterfaceForm extends Component { return (
+ + {getFieldDecorator('catid', { + initialValue: this.props.catid ? this.props.catid + '' : this.props.catdata[0]._id + '' + })( + + )} + + )} @@ -564,7 +564,7 @@ class InterfaceEditForm extends Component { initialValue: this.state.res_body_type })( - json + json(mock) raw @@ -574,6 +574,7 @@ class InterfaceEditForm extends Component { +

基于mockjs和json5,可直接写mock模板和注释,具体使用方法请查看文档

@@ -584,7 +585,7 @@ class InterfaceEditForm extends Component { {...formItemLayout} label="mock地址" > - { }} value={this.state.mockUrl} /> + { }} value={this.state.mockUrl} />
+ + {getFieldDecorator('switch_notice', { valuePropName: 'checked', initialValue: false })( + + )} + + + + {getFieldDecorator('message', { initialValue: "" })( + + )} + + { return { curProject: state.project.currProject } + },{ + fetchInterfaceList }) class InterfaceList extends Component { constructor(props) { super(props) this.state = { + visible: false, data: [], sortedInfo: { order: 'ascend', columnKey: 'title' - } + }, + catid: null } } static propTypes = { match: PropTypes.object, - curProject: PropTypes.object + curProject: PropTypes.object, + history: PropTypes.object, + fetchInterfaceList: PropTypes.func } handleRequest = async (props) => { const { params } = props.match; if (!params.actionId) { let projectId = params.id; + this.setState({ + catid: null + }) let r = await axios.get('/api/interface/list?project_id=' + projectId); this.setState({ data: r.data.data }) } else if (isNaN(params.actionId)) { let catid = params.actionId.substr(4) + this.setState({ catid: +catid }) let r = await axios.get('/api/interface/list_cat?catid=' + catid); this.setState({ data: r.data.data @@ -47,6 +58,8 @@ class InterfaceList extends Component { } } + + handleChange = (pagination, filters, sorter) => { this.setState({ sortedInfo: sorter @@ -66,6 +79,19 @@ class InterfaceList extends Component { } } + handleAddInterface =(data)=> { + data.project_id = this.props.curProject._id; + axios.post('/api/interface/add', data).then((res) => { + if (res.data.errcode !== 0) { + return message.error(res.data.errmsg); + } + message.success('接口添加成功') + let interfaceId = res.data.data._id; + this.props.history.push("/project/" + data.project_id + "/interface/api/" + interfaceId) + this.props.fetchInterfaceList(data.project_id) + }) + } + render() { let { sortedInfo } = this.state; sortedInfo = sortedInfo || {}; @@ -81,7 +107,7 @@ class InterfaceList extends Component { title: '接口路径', dataIndex: 'path', key: 'path', - render: (item)=>{ + render: (item) => { return {this.props.curProject.basepath + item} } }, { @@ -122,9 +148,18 @@ class InterfaceList extends Component { }); return ( -
-

接口列表

- +
+

接口列表

+ +
+ this.setState({ 'visible': false })} + footer={null} + > + this.setState({ 'visible': false })} onSubmit={this.handleAddInterface} /> + ) } diff --git a/client/containers/Project/Interface/InterfaceList/InterfaceMenu.js b/client/containers/Project/Interface/InterfaceList/InterfaceMenu.js index efe4dd5a..cd3db121 100644 --- a/client/containers/Project/Interface/InterfaceList/InterfaceMenu.js +++ b/client/containers/Project/Interface/InterfaceList/InterfaceMenu.js @@ -299,14 +299,16 @@ class InterfaceMenu extends Component { this.changeModal('visible', false)} footer={null} > - this.changeModal('visible', false)} onSubmit={this.handleAddInterface} /> + this.changeModal('visible', false)} onSubmit={this.handleAddInterface} /> this.changeModal('add_cat_modal_visible', false)} footer={null} > this.changeModal('add_cat_modal_visible', false)} onSubmit={this.handleAddInterfaceCat} /> @@ -315,6 +317,7 @@ class InterfaceMenu extends Component { this.changeModal('change_cat_modal_visible', false)} footer={null} > this.changeModal('change_cat_modal_visible', false)} onSubmit={this.handleChangeInterfaceCat} /> @@ -325,7 +328,6 @@ class InterfaceMenu extends Component { className="interface-list" defaultExpandedKeys={currentKes.expands} defaultSelectedKeys={currentKes.selects} - selectedKeys={currentKes.selects} onSelect={this.onSelect} > 全部接口} key="root" /> @@ -335,7 +337,10 @@ class InterfaceMenu extends Component { - } key={'cat_' + item._id} > + } + key={'cat_' + item._id} + className="interface-item-nav" + > {item.list.map(item_interface_create)} diff --git a/client/containers/Project/Interface/interface.scss b/client/containers/Project/Interface/interface.scss index 2e855a4c..e1bebb9e 100644 --- a/client/containers/Project/Interface/interface.scss +++ b/client/containers/Project/Interface/interface.scss @@ -65,6 +65,9 @@ .interface-item{ display: inline } + .interface-item-nav{ + line-height:25px; + } .ant-tree-node-content-wrapper{ width: 100% @@ -72,9 +75,11 @@ .interface-delete-icon{ position: relative; - right: 31px; - top: 6px; - float: right + right: 21px; + top: 2px; + float: right; + line-height: 25px; + width: 30px; } } } diff --git a/doc/manage/admin.md b/doc/manage/admin.md new file mode 100644 index 00000000..f71d4524 --- /dev/null +++ b/doc/manage/admin.md @@ -0,0 +1,5 @@ +## 用户管理 + +## 分配组长 + +## 维护数据库 diff --git a/doc/manage/build.md b/doc/manage/build.md new file mode 100644 index 00000000..c33f11bf --- /dev/null +++ b/doc/manage/build.md @@ -0,0 +1,3 @@ +## 快速部署 + +## 配置说明 diff --git a/doc/manage/intro.md b/doc/manage/intro.md new file mode 100644 index 00000000..e69de29b diff --git a/doc/manage/update.md b/doc/manage/update.md new file mode 100644 index 00000000..f4646f8e --- /dev/null +++ b/doc/manage/update.md @@ -0,0 +1 @@ +版本升级 diff --git a/doc/usage/authority.md b/doc/usage/authority.md new file mode 100644 index 00000000..e69de29b diff --git a/doc/usage/case.md b/doc/usage/case.md new file mode 100644 index 00000000..db7845cd --- /dev/null +++ b/doc/usage/case.md @@ -0,0 +1,3 @@ +## 介绍 + +## 使用说明 diff --git a/doc/usage/getfamiliar.md b/doc/usage/getfamiliar.md new file mode 100644 index 00000000..23aeb470 --- /dev/null +++ b/doc/usage/getfamiliar.md @@ -0,0 +1,7 @@ +## 登录与注册 + +## 首页 + +## 项目页 + +## 个人信息 diff --git a/doc/usage/interface.md b/doc/usage/interface.md new file mode 100644 index 00000000..26877c43 --- /dev/null +++ b/doc/usage/interface.md @@ -0,0 +1,3 @@ +## 介绍 + +## 配置说明 diff --git a/doc/usage/leader.md b/doc/usage/leader.md new file mode 100644 index 00000000..6322d692 --- /dev/null +++ b/doc/usage/leader.md @@ -0,0 +1,3 @@ +## 什么是组长 + +## 组长职责 diff --git a/doc/usage/mock.md b/doc/usage/mock.md new file mode 100644 index 00000000..a22b6aef --- /dev/null +++ b/doc/usage/mock.md @@ -0,0 +1,5 @@ +## 介绍 + +## 使用说明 + +## 模板语法 diff --git a/doc/interface.md b/doc/usage/quickstart.md similarity index 80% rename from doc/interface.md rename to doc/usage/quickstart.md index 4c209545..ef222a3e 100644 --- a/doc/interface.md +++ b/doc/usage/quickstart.md @@ -1,31 +1,34 @@ -## 快速开始 -### 1 创建项目分组 +## 起步 +### 创建API +注册新用户或使用 QSSO 登录。 + +新用户进入 YApi 时没有任何权限,只能浏览公开项目,想要创建 API 应联系 `组长` 将你添加到某分组或某项目中。 登录之后进到项目首页,左边侧边栏显示的即分组列表。 图片名称 -联系管理员添加分组并且把你设置为组长或让组长邀请你加入到某项目分组 -#### 2 项目列表 + +#### 项目列表 选中不同的分组,右边会显示该分组下的项目列表。 图片名称 -### 3 添加项目 +### 添加项目 -#### 3.1 点击右上角的“+“号进入添加项目页面 +- 点击右上角的“+“号进入添加项目页面 图片名称 -#### 3.2 添加项目页面 +- 添加项目页面 图片名称 添加完成后进去项目详情页面 -### 4 项目详情页面 +### 项目详情页面 -#### 4.1 添加接口分类 +#### 添加接口分类 图片名称 @@ -42,4 +45,4 @@ #### 4.4 测试接口 点击运行tab,可进入到接口测试页面,首先安装chrome crossRequest扩展,才可正常使用此功能 图片名称 -点击保存按钮可把当前测试保存到测试集,方便下次调试 \ No newline at end of file +点击保存按钮可把当前测试保存到测试集,方便下次调试 diff --git a/server/controllers/interface.js b/server/controllers/interface.js index f02d2b05..5629f58c 100644 --- a/server/controllers/interface.js +++ b/server/controllers/interface.js @@ -1,7 +1,7 @@ import interfaceModel from '../models/interface.js'; import interfaceCatModel from '../models/interfaceCat.js'; import interfaceCaseModel from '../models/interfaceCase.js' - +import followModel from '../models/follow.js' import _ from 'underscore'; import baseController from './base.js'; import yapi from '../yapi.js'; @@ -15,6 +15,8 @@ class interfaceController extends baseController { this.catModel = yapi.getInst(interfaceCatModel); this.projectModel = yapi.getInst(projectModel); this.caseModel = yapi.getInst(interfaceCaseModel); + this.followModel = yapi.getInst(followModel); + this.userModel = yapi.getInst(userModel); } /** @@ -109,7 +111,7 @@ class interfaceController extends baseController { } if (params.path.indexOf(":") > 0) { - let paths = params.path.split("/"), name, i; + let paths = params.path.split("/"), name, i; for (i = 1; i < paths.length; i++) { if (paths[i][0] === ':') { name = paths[i].substr(1); @@ -123,7 +125,7 @@ class interfaceController extends baseController { } } - if ( params.req_params.length > 0) { + if (params.req_params.length > 0) { data.type = 'var' data.req_params = params.req_params; } else { @@ -135,16 +137,26 @@ class interfaceController extends baseController { let result = await this.Model.save(data); - // let project = await this.projectModel.get(params.project_id); this.catModel.get(params.catid).then((cate) => { let username = this.getUsername(); + let title = `用户 "${username}" 为分类 "${cate.name}" 添加了接口 "${data.title}"` yapi.commons.saveLog({ - content: `用户 "${username}" 为分类 "${cate.name}" 添加了接口 "${data.title}"`, + content: title, type: 'project', uid: this.getUid(), username: username, typeid: params.project_id }); + //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, { + // title: `${username} 新增了接口 ${data.title}`, + // content: `

${username}新增了接口(${data.title})

+ //

项目名:${project.name}

+ //

修改用户: "${username}"

+ //

接口名: ${data.title}

+ //

接口路径: [${data.method}]${data.path}

` + // }) }); ctx.body = yapi.commons.resReturn(result); @@ -282,6 +294,9 @@ class interfaceController extends baseController { let id = ctx.request.body.id; + params.message = params.message || ''; + params.message = params.message.replace(/\n/g, "
") + if (!id) { return ctx.body = yapi.commons.resReturn(null, 400, '接口id不能为空'); } @@ -360,6 +375,8 @@ class interfaceController extends baseController { data.status = params.status; } + + try { let result = await this.Model.up(id, data); let username = this.getUsername(); @@ -385,7 +402,19 @@ class interfaceController extends baseController { }); }); } - + if (params.switch_notice === true) { + let project = await this.projectModel.getBaseInfo(interfaceData.project_id); + let interfaceUrl = `http://${ctx.request.host}/project/${interfaceData.project_id}/interface/api/${id}` + this.sendNotice(interfaceData.project_id, { + title: `${username} 更新了接口`, + content: `

${username}更新了接口(${data.title})

+

项目名:${project.name}

+

修改用户: ${username}

+

接口名: ${data.title}

+

接口路径: [${data.method}]${data.path}

+

详细改动日志: ${params.message}

` + }) + } ctx.body = yapi.commons.resReturn(result); } catch (e) { @@ -580,6 +609,26 @@ class interfaceController extends baseController { } } + sendNotice(projectId, data) { + this.followModel.listByProjectId(projectId).then(list => { + let users = []; + list.forEach(item => { + users.push(item.uid) + }) + this.userModel.findByUids(users).then(list => { + list.forEach(item => { + yapi.commons.sendMail({ + to: item.email, + contents: data.content, + subject: data.title + }); + }) + + }) + + }); + + } } diff --git a/server/middleware/mockServer.js b/server/middleware/mockServer.js index 2a293f55..b3dd8e52 100644 --- a/server/middleware/mockServer.js +++ b/server/middleware/mockServer.js @@ -23,7 +23,6 @@ function matchApi(apiPath, apiRule) { module.exports = async (ctx, next) => { yapi.commons.log('Server Recevie Request...'); - let hostname = ctx.hostname; let config = yapi.WEBCONFIG; let path = ctx.path; diff --git a/server/models/follow.js b/server/models/follow.js index f14127cb..3e9ea673 100644 --- a/server/models/follow.js +++ b/server/models/follow.js @@ -47,6 +47,12 @@ class followModel extends baseModel { }).exec(); } + listByProjectId(projectid){ + return this.model.find({ + projectid: projectid + }) + } + checkProjectRepeat(uid,projectid){ return this.model.count({ diff --git a/server/utils/commons.js b/server/utils/commons.js index e9ba972d..bd00f56b 100644 --- a/server/utils/commons.js +++ b/server/utils/commons.js @@ -127,10 +127,11 @@ exports.sendMail = (options, cb) => { yapi.mail.sendMail({ from: yapi.WEBCONFIG.mail.from, to: options.to, - subject: 'yapi平台', + subject: options.subject, html: options.contents }, cb); } catch (e) { + yapi.commons.log(e.message, 'error') console.error(e.message); // eslint-disable-line } }; diff --git a/server_dist/controllers/interface.js b/server_dist/controllers/interface.js index 6768c8da..a16357cc 100644 --- a/server_dist/controllers/interface.js +++ b/server_dist/controllers/interface.js @@ -44,6 +44,10 @@ var _interfaceCase = require('../models/interfaceCase.js'); var _interfaceCase2 = _interopRequireDefault(_interfaceCase); +var _follow = require('../models/follow.js'); + +var _follow2 = _interopRequireDefault(_follow); + var _underscore = require('underscore'); var _underscore2 = _interopRequireDefault(_underscore); @@ -78,6 +82,8 @@ var interfaceController = function (_baseController) { _this.catModel = _yapi2.default.getInst(_interfaceCat2.default); _this.projectModel = _yapi2.default.getInst(_project2.default); _this.caseModel = _yapi2.default.getInst(_interfaceCase2.default); + _this.followModel = _yapi2.default.getInst(_follow2.default); + _this.userModel = _yapi2.default.getInst(_user2.default); return _this; } @@ -249,16 +255,26 @@ var interfaceController = function (_baseController) { result = _context.sent; - // let project = await this.projectModel.get(params.project_id); this.catModel.get(params.catid).then(function (cate) { var username = _this2.getUsername(); + var title = '\u7528\u6237 "' + username + '" \u4E3A\u5206\u7C7B "' + cate.name + '" \u6DFB\u52A0\u4E86\u63A5\u53E3 "' + data.title + '"'; _yapi2.default.commons.saveLog({ - content: '\u7528\u6237 "' + username + '" \u4E3A\u5206\u7C7B "' + cate.name + '" \u6DFB\u52A0\u4E86\u63A5\u53E3 "' + data.title + '"', + content: title, type: 'project', uid: _this2.getUid(), username: username, typeid: params.project_id }); + //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, { + // title: `${username} 新增了接口 ${data.title}`, + // content: `

${username}新增了接口(${data.title})

+ //

项目名:${project.name}

+ //

修改用户: "${username}"

+ //

接口名: ${data.title}

+ //

接口路径: [${data.method}]${data.path}

` + // }) }); ctx.body = _yapi2.default.commons.resReturn(result); @@ -570,7 +586,7 @@ var interfaceController = function (_baseController) { var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(ctx) { var _this3 = this; - var params, id, interfaceData, auth, checkRepeat, data, result, username, cateid; + var params, id, interfaceData, auth, checkRepeat, data, result, username, cateid, project, interfaceUrl; return _regenerator2.default.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { @@ -590,60 +606,64 @@ var interfaceController = function (_baseController) { id = ctx.request.body.id; + + params.message = params.message || ''; + params.message = params.message.replace(/\n/g, "
"); + if (id) { - _context6.next = 7; + _context6.next = 9; break; } return _context6.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '接口id不能为空')); - case 7: - _context6.next = 9; + case 9: + _context6.next = 11; return this.Model.get(id); - case 9: + case 11: interfaceData = _context6.sent; - _context6.next = 12; + _context6.next = 14; return this.checkAuth(interfaceData.project_id, 'project', 'edit'); - case 12: + case 14: auth = _context6.sent; if (auth) { - _context6.next = 15; + _context6.next = 17; break; } return _context6.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '没有权限')); - case 15: + case 17: if (!(params.path && !_yapi2.default.commons.verifyPath(params.path))) { - _context6.next = 17; + _context6.next = 19; break; } return _context6.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '接口path第一位必须是/,最后一位不能为/')); - case 17: + case 19: if (!(params.path && (params.path !== interfaceData.path || params.method !== interfaceData.method))) { - _context6.next = 23; + _context6.next = 25; break; } - _context6.next = 20; + _context6.next = 22; return this.Model.checkRepeat(interfaceData.project_id, params.path, params.method); - case 20: + case 22: checkRepeat = _context6.sent; if (!(checkRepeat > 0)) { - _context6.next = 23; + _context6.next = 25; break; } return _context6.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 401, '已存在的接口:' + params.path + '[' + params.method + ']')); - case 23: + case 25: data = { up_time: _yapi2.default.commons.time() }; @@ -702,11 +722,11 @@ var interfaceController = function (_baseController) { data.status = params.status; } - _context6.prev = 38; - _context6.next = 41; + _context6.prev = 40; + _context6.next = 43; return this.Model.up(id, data); - case 41: + case 43: result = _context6.sent; username = this.getUsername(); @@ -734,22 +754,41 @@ var interfaceController = function (_baseController) { }); } + if (!(params.switch_notice === true)) { + _context6.next = 52; + break; + } + + _context6.next = 49; + return this.projectModel.getBaseInfo(interfaceData.project_id); + + case 49: + project = _context6.sent; + interfaceUrl = 'http://' + ctx.request.host + '/project/' + interfaceData.project_id + '/interface/api/' + id; + + this.sendNotice(interfaceData.project_id, { + title: username + ' \u66F4\u65B0\u4E86\u63A5\u53E3', + content: '

' + username + '\u66F4\u65B0\u4E86\u63A5\u53E3(' + data.title + ')

\n

\u9879\u76EE\u540D\uFF1A' + project.name + '

\n

\u4FEE\u6539\u7528\u6237: ' + username + '

\n

\u63A5\u53E3\u540D: ' + data.title + '

\n

\u63A5\u53E3\u8DEF\u5F84: [' + data.method + ']' + data.path + '

\n

\u8BE6\u7EC6\u6539\u52A8\u65E5\u5FD7: ' + params.message + '

' + }); + + case 52: + ctx.body = _yapi2.default.commons.resReturn(result); - _context6.next = 50; + _context6.next = 58; break; - case 47: - _context6.prev = 47; - _context6.t0 = _context6['catch'](38); + case 55: + _context6.prev = 55; + _context6.t0 = _context6['catch'](40); ctx.body = _yapi2.default.commons.resReturn(null, 402, _context6.t0.message); - case 50: + case 58: case 'end': return _context6.stop(); } } - }, _callee6, this, [[38, 47]]); + }, _callee6, this, [[40, 55]]); })); function up(_x6) { @@ -1199,6 +1238,27 @@ var interfaceController = function (_baseController) { return delCat; }() + }, { + key: 'sendNotice', + value: function sendNotice(projectId, data) { + var _this6 = this; + + this.followModel.listByProjectId(projectId).then(function (list) { + var users = []; + list.forEach(function (item) { + users.push(item.uid); + }); + _this6.userModel.findByUids(users).then(function (list) { + list.forEach(function (item) { + _yapi2.default.commons.sendMail({ + to: item.email, + contents: data.content, + subject: data.title + }); + }); + }); + }); + } }]); return interfaceController; }(_base2.default); diff --git a/server_dist/middleware/mockServer.js b/server_dist/middleware/mockServer.js index e4092267..31f2aad9 100644 --- a/server_dist/middleware/mockServer.js +++ b/server_dist/middleware/mockServer.js @@ -55,7 +55,6 @@ module.exports = function () { switch (_context.prev = _context.next) { case 0: _yapi2.default.commons.log('Server Recevie Request...'); - hostname = ctx.hostname; config = _yapi2.default.WEBCONFIG; path = ctx.path; diff --git a/server_dist/models/follow.js b/server_dist/models/follow.js index c72608bb..bb7246c4 100644 --- a/server_dist/models/follow.js +++ b/server_dist/models/follow.js @@ -87,6 +87,13 @@ var followModel = function (_baseModel) { uid: uid }).exec(); } + }, { + key: 'listByProjectId', + value: function listByProjectId(projectid) { + return this.model.find({ + projectid: projectid + }); + } }, { key: 'checkProjectRepeat', value: function checkProjectRepeat(uid, projectid) { diff --git a/server_dist/utils/commons.js b/server_dist/utils/commons.js index 54d74431..94ad35c7 100644 --- a/server_dist/utils/commons.js +++ b/server_dist/utils/commons.js @@ -155,10 +155,11 @@ exports.sendMail = function (options, cb) { _yapi2.default.mail.sendMail({ from: _yapi2.default.WEBCONFIG.mail.from, to: options.to, - subject: 'yapi平台', + subject: options.subject, html: options.contents }, cb); } catch (e) { + _yapi2.default.commons.log(e.message, 'error'); console.error(e.message); // eslint-disable-line } }; diff --git a/static/doc/api.html b/static/doc/api.html index 57d44d75..e9e8471c 100644 --- a/static/doc/api.html +++ b/static/doc/api.html @@ -31,7 +31,12 @@
  • - 快速开始 + 使用手册 +
  • + +
  • + + 管理学院
  • diff --git a/static/doc/index.html b/static/doc/index.html index 1e6ca67d..a2acc71d 100644 --- a/static/doc/index.html +++ b/static/doc/index.html @@ -31,7 +31,12 @@
  • - 快速开始 + 使用手册 +
  • + +
  • + + 管理学院
  • diff --git a/static/doc/manage-介绍.html b/static/doc/manage-介绍.html new file mode 100644 index 00000000..ee39bc2a --- /dev/null +++ b/static/doc/manage-介绍.html @@ -0,0 +1,177 @@ + + + + + + + + + + + YApi 管理学院 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    管理学院

    +

    超级管理员、分组/项目组长的学院。

    + +
    +
    + + +
    + +
    + + + + +
    + + +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/manage-版本升级.html b/static/doc/manage-版本升级.html new file mode 100644 index 00000000..0cbccc05 --- /dev/null +++ b/static/doc/manage-版本升级.html @@ -0,0 +1,178 @@ + + + + + + + + + + + YApi 管理学院 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    管理学院

    +

    超级管理员、分组/项目组长的学院。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    版本升级

    + +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/manage-超管职责.html b/static/doc/manage-超管职责.html new file mode 100644 index 00000000..6a00684e --- /dev/null +++ b/static/doc/manage-超管职责.html @@ -0,0 +1,193 @@ + + + + + + + + + + + YApi 管理学院 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    管理学院

    +

    超级管理员、分组/项目组长的学院。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    用户管理 #

    分配组长 #

    维护数据库 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/manage-部署.html b/static/doc/manage-部署.html new file mode 100644 index 00000000..17f474af --- /dev/null +++ b/static/doc/manage-部署.html @@ -0,0 +1,189 @@ + + + + + + + + + + + YApi 管理学院 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    管理学院

    +

    超级管理员、分组/项目组长的学院。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    快速部署 #

    配置说明 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/manage.html b/static/doc/manage.html new file mode 100644 index 00000000..03c90b91 --- /dev/null +++ b/static/doc/manage.html @@ -0,0 +1,177 @@ + + + + + + + + + + + YApi 管理学院 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    管理学院

    +

    超级管理员、分组/项目组长的学院。

    + +
    +
    + + +
    + +
    + + + + +
    + + +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/mock-使用mock功能.html b/static/doc/mock-使用mock功能.html new file mode 100644 index 00000000..12bd540d --- /dev/null +++ b/static/doc/mock-使用mock功能.html @@ -0,0 +1,211 @@ + + + + + + + + + + + YApi Mock功能 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    介绍 #

    使用说明 #

    模板语法 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/mock-使用测试集.html b/static/doc/mock-使用测试集.html new file mode 100644 index 00000000..c0f003c8 --- /dev/null +++ b/static/doc/mock-使用测试集.html @@ -0,0 +1,207 @@ + + + + + + + + + + + YApi Mock功能 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    介绍 #

    使用说明 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/start.html b/static/doc/mock-创建第一个API.html similarity index 66% rename from static/doc/start.html rename to static/doc/mock-创建第一个API.html index d57d88ae..33c3b295 100644 --- a/static/doc/start.html +++ b/static/doc/mock-创建第一个API.html @@ -8,7 +8,7 @@ - YApi 快速开始 + YApi Mock功能 @@ -29,13 +29,18 @@ 首页
  • -
  • +
  • - 快速开始 + 使用手册
  • + 管理学院 +
  • + +
  • + Mock功能
  • @@ -75,40 +80,73 @@
  • - 快速开始 + 认识 YApi +
  • + + +
  • + + 创建第一个API
  • + + +
  • + + 接口配置 +
  • + +
  • + + 使用mock功能 +
  • + + +
  • + + 使用测试集 +
  • + + +
  • + + 成为组长 +
  • + + +
  • + + 权限列表 +
  • +
    -

    快速开始 #

    1 创建项目分组 #

    登录之后进到项目首页,左边侧边栏显示的即分组列表。

    +

    起步 #

    创建API #

    注册新用户或使用 QSSO 登录。

    +

    新用户进入 YApi 时没有任何权限,只能浏览公开项目,想要创建 API 应联系 组长 将你添加到某分组或某项目中。 +登录之后进到项目首页,左边侧边栏显示的即分组列表。

    图片名称

    -

    联系管理员添加分组并且把你设置为组长或让组长邀请你加入到某项目分组

    -

    2 项目列表 #

    选中不同的分组,右边会显示该分组下的项目列表。

    +

    项目列表 #

    选中不同的分组,右边会显示该分组下的项目列表。

    图片名称

    -

    3 添加项目 #

    3.1 点击右上角的“+“号进入添加项目页面 #

    图片名称

    -

    3.2 添加项目页面 #

    图片名称 +

    添加项目 #

      +
    • 点击右上角的“+“号进入添加项目页面 +图片名称

      +
    • 添加项目页面 +图片名称 添加完成后进去项目详情页面

      -

      4 项目详情页面 #

      4.1 添加接口分类 #

      图片名称

      +
    +

    项目详情页面 #

    添加接口分类 #

    图片名称

    添加完成后可以在左侧列表看到新添加的接口分类

    4.2 添加接口 #

    鼠标移动到接口分类的菜单icon,点击添加接口

    图片名称

    diff --git a/static/doc/mock-成为组长.html b/static/doc/mock-成为组长.html new file mode 100644 index 00000000..15d83207 --- /dev/null +++ b/static/doc/mock-成为组长.html @@ -0,0 +1,207 @@ + + + + + + + + + + + YApi Mock功能 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    什么是组长 #

    组长职责 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/mock-接口配置.html b/static/doc/mock-接口配置.html new file mode 100644 index 00000000..84754bd2 --- /dev/null +++ b/static/doc/mock-接口配置.html @@ -0,0 +1,207 @@ + + + + + + + + + + + YApi Mock功能 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    介绍 #

    配置说明 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/mock-权限列表.html b/static/doc/mock-权限列表.html new file mode 100644 index 00000000..0e729702 --- /dev/null +++ b/static/doc/mock-权限列表.html @@ -0,0 +1,195 @@ + + + + + + + + + + + YApi Mock功能 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + + +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/mock-认识 YApi.html b/static/doc/mock-认识 YApi.html new file mode 100644 index 00000000..9b9851e1 --- /dev/null +++ b/static/doc/mock-认识 YApi.html @@ -0,0 +1,215 @@ + + + + + + + + + + + YApi Mock功能 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    登录与注册 #

    首页 #

    项目页 #

    个人信息 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/mock.html b/static/doc/mock.html index acae36ed..f5f6f3bd 100644 --- a/static/doc/mock.html +++ b/static/doc/mock.html @@ -31,7 +31,12 @@
  • - 快速开始 + 使用手册 +
  • + +
  • + + 管理学院
  • @@ -75,173 +80,52 @@
  • - Mock介绍 + 认识 YApi
  • - - + +
  • + + 创建第一个API +
  • + + +
  • + + 接口配置 +
  • + + +
  • + + 使用mock功能 +
  • + + +
  • + + 使用测试集 +
  • + + +
  • + + 成为组长 +
  • + + +
  • + + 权限列表 +
  • +
    -

    Mock介绍 #

    yapi的Mock功能可以根据用户的输入接口信息如协议、URL、接口名、请求头、请求参数、mock规则(点击到Mock规则)生成Mock接口,这些接口会自动生成模拟数据,创建者可以自由构造需要的数据。而且与常见的Mock方式如将Mock写在代码里和JS拦截等相比yapi的Mock在使用场景和效率和复杂度上是相差甚远的,正是由于yapi的Mock是一个第三方平台,那么在团队开发时任何人都可以权限许可下创建、修改接口信息等操作,这对于团队开发是很有好处的。

    -

    mock地址解析:yapi平台网址+mock+您的项目id+接口实际请求path

    -

    注:项目id可以在项目设置里查看到

    -

    -

    -

    1 如何使用Mock? #

    1.1 最简单最直接的方式 #

    在代码直接请求yapi提供的mock地址,以jQuery为例:

    -
    let prefix = 'http://yapi.local.qunar.com:3000/mock/2817'
    -$.post(prefix+'/baseapi/path', {username: 'xxx'}, function(res){
    -    console.log(res) //返回上图预览部分的数据
    -})
    -
    -

    1.2 基于本地服务器反向代理 #

    优点:不用修改项目代码

    -

    1.2.1 基于nginx反向代理 #

    location /baseapi
    -{
    -proxy_pass   http://yapi.local.qunar.com:3000/mock/2817/baseapi; #baseapi后面没有"/"
    -}
    -
    -

    1.2.2 基于ykit Jerry代理 #

    假设您本地服务器访问地址是: http://xxx.com

    -

    -

    -

    2.1 Mock语法规范 #

    -

    了解更多Mock详情:Mock.js 官方文档

    -
    -

    Mock.js 的语法规范包括两部分:

    -

    1. 数据模板定义规范(Data Template Definition,DTD)

    -

    2. 数据占位符定义规范(Data Placeholder Definition,DPD)

    -

    -

    数据模板定义规范(Data Template Definition,DTD) #

    数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值:

    -
    // 属性名   name (与生成规则之间用 "|" 隔开)
    -// 生成规则 rule(生成规则有7种详见下面的生成规则)
    -// 属性值   value(可以含有 "@占位符" 同时也指定了最终值的初始值和类型)
    -
    -'name|rule': value
    -
    -生成规则:
    -'name|min-max': value
    -'name|count': value
    -'name|min-max.dmin-dmax': value
    -'name|min-max.dcount': value
    -'name|count.dmin-dmax': value
    -'name|count.dcount': value
    -'name|+step': value
    -

    下面提供了6种生成规则以及示例包括 String、Number、Boolean、Object、Array:

    -

    1. 属性值是字符串 String #

    1. 'name|min-max': string
    -
    -通过重复 string 生成一个字符串,重复次数大于等于 min,小于等于 max。
    -
    -2. 'name|count': string
    -
    -通过重复 string 生成一个字符串,重复次数等于 count。
    -

    2. 属性值是数字 Number #

    1. 'name|+1': number
    -
    -属性值自动加 1,初始值为 number。
    -
    -2. 'name|min-max': number
    -
    -生成一个大于等于 min、小于等于 max 的整数,属性值 number 只是用来确定类型。
    -
    -3. 'name|min-max.dmin-dmax': number
    -
    -生成一个浮点数,整数部分大于等于 min、小于等于 max,小数部分保留 dmin 到 dmax 位。
    -
    -例如:
    -Mock.mock({
    -    'number1|1-100.1-10': 1,
    -    'number2|123.1-10': 1,
    -    'number3|123.3': 1,
    -    'number4|123.10': 1.123
    -})
    -// =>
    -{
    -    "number1": 12.92,
    -    "number2": 123.51,
    -    "number3": 123.777,
    -    "number4": 123.1231091814
    -}
    -

    3. 属性值是布尔型 Boolean #

    1. 'name|1': boolean
    -
    -随机生成一个布尔值,值为 true 的概率是 1/2,值为 false 的概率同样是 1/2。
    -
    -2. 'name|min-max': value
    -
    -随机生成一个布尔值,值为 value 的概率是 min / (min + max),值为 !value 的概率是 max / (min + max)。
    -

    4. 属性值是对象 Object #

    1. 'name|count': object
    -
    -从属性值 object 中随机选取 count 个属性。
    -
    -2. 'name|min-max': object
    -
    -从属性值 object 中随机选取 min 到 max 个属性。
    -

    5. 属性值是数组 Array #

    1. 'name|1': array
    -
    -从属性值 array 中随机选取 1 个元素,作为最终值。
    -
    -2. 'name|+1': array
    -
    -从属性值 array 中顺序选取 1 个元素,作为最终值。
    -
    -3. 'name|min-max': array
    -
    -通过重复属性值 array 生成一个新数组,重复次数大于等于 min,小于等于 max。
    -
    -4. 'name|count': array
    -
    -通过重复属性值 array 生成一个新数组,重复次数为 count。
    -

    -

    数据占位符定义规范(Data Placeholder Definition,DPD) #

    占位符 只是在属性值字符串中占个位置,并不出现在最终的属性值中。
    -
    -占位符 的格式为:
    -
    -@占位符
    -
    -说明:
    -1. 用 @ 来标识其后的字符串是 占位符,在YApi提供的Mock输入框在输入“@”后会自动提示占位符。
    -
    -例如:
    -name: {
    -    first: '@FIRST',
    -    middle: '@FIRST',
    -    last: '@LAST',
    -    full: '@first @middle @last'
    -}
    -// 上面的示例可以得到如下结果:
    -"name": {
    -    "first": "Charles",
    -    "middle": "Brenda",
    -    "last": "Lopez",
    -    "full": "Charles Brenda Lopez"
    -}
    -
    +

    登录与注册 #

    首页 #

    项目页 #

    个人信息 #

    diff --git a/static/doc/usage-使用mock功能.html b/static/doc/usage-使用mock功能.html new file mode 100644 index 00000000..c4f51718 --- /dev/null +++ b/static/doc/usage-使用mock功能.html @@ -0,0 +1,211 @@ + + + + + + + + + + + YApi 使用手册 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    介绍 #

    使用说明 #

    模板语法 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/usage-使用测试集.html b/static/doc/usage-使用测试集.html new file mode 100644 index 00000000..a707ed9e --- /dev/null +++ b/static/doc/usage-使用测试集.html @@ -0,0 +1,207 @@ + + + + + + + + + + + YApi 使用手册 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    介绍 #

    使用说明 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/usage-创建第一个API.html b/static/doc/usage-创建第一个API.html new file mode 100644 index 00000000..9b7e1be3 --- /dev/null +++ b/static/doc/usage-创建第一个API.html @@ -0,0 +1,224 @@ + + + + + + + + + + + YApi 使用手册 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    起步 #

    创建API #

    注册新用户或使用 QSSO 登录。

    +

    新用户进入 YApi 时没有任何权限,只能浏览公开项目,想要创建 API 应联系 组长 将你添加到某分组或某项目中。 +登录之后进到项目首页,左边侧边栏显示的即分组列表。

    +

    图片名称

    +

    项目列表 #

    选中不同的分组,右边会显示该分组下的项目列表。

    +

    图片名称

    +

    添加项目 #

      +
    • 点击右上角的“+“号进入添加项目页面 +图片名称

      +
    • 添加项目页面 +图片名称 +添加完成后进去项目详情页面

      +
    +

    项目详情页面 #

    添加接口分类 #

    图片名称

    +

    添加完成后可以在左侧列表看到新添加的接口分类

    +

    4.2 添加接口 #

    鼠标移动到接口分类的菜单icon,点击添加接口

    +

    图片名称

    +

    4.3 接口编辑 #

    添加完接口点击新添加的接口,跳转到接口预览页面,可看到刚才填写的信息。接口的详细信息点击编辑功能进行添加

    +

    4.4 测试接口 #

    点击运行tab,可进入到接口测试页面,首先安装chrome crossRequest扩展,才可正常使用此功能 +图片名称 +点击保存按钮可把当前测试保存到测试集,方便下次调试

    + +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/usage-成为组长.html b/static/doc/usage-成为组长.html new file mode 100644 index 00000000..51639dc9 --- /dev/null +++ b/static/doc/usage-成为组长.html @@ -0,0 +1,207 @@ + + + + + + + + + + + YApi 使用手册 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    什么是组长 #

    组长职责 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/usage-接口配置.html b/static/doc/usage-接口配置.html new file mode 100644 index 00000000..afa285fd --- /dev/null +++ b/static/doc/usage-接口配置.html @@ -0,0 +1,207 @@ + + + + + + + + + + + YApi 使用手册 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    介绍 #

    配置说明 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/usage-权限列表.html b/static/doc/usage-权限列表.html new file mode 100644 index 00000000..0e35493f --- /dev/null +++ b/static/doc/usage-权限列表.html @@ -0,0 +1,195 @@ + + + + + + + + + + + YApi 使用手册 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + + +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/usage-认识 YApi.html b/static/doc/usage-认识 YApi.html new file mode 100644 index 00000000..010aa290 --- /dev/null +++ b/static/doc/usage-认识 YApi.html @@ -0,0 +1,215 @@ + + + + + + + + + + + YApi 使用手册 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    登录与注册 #

    首页 #

    项目页 #

    个人信息 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/static/doc/usage.html b/static/doc/usage.html new file mode 100644 index 00000000..24068d38 --- /dev/null +++ b/static/doc/usage.html @@ -0,0 +1,195 @@ + + + + + + + + + + + YApi 使用手册 + + + + + +
    +
    +
    + + YMFE + + + +
    +
    + + + + + +
    +
    +
    +

    YApi

    +

    高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

    + +
    +
    + + +
    + +
    + + + + +
    + +

    登录与注册 #

    首页 #

    项目页 #

    个人信息 #

    +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + + + diff --git a/ydoc.json b/ydoc.json index a1974321..4ddd44f8 100644 --- a/ydoc.json +++ b/ydoc.json @@ -58,13 +58,64 @@ }, "content": "./doc/home.md" // 内容(这里以markdown文件举例) },{ - "name": "start", // Page Name 会根据他生成 html 文件,例: index.html - "title": "快速开始", // Page Title + "name": "usage", // Page Name 会根据他生成 html 文件,例: index.html + "title": "使用手册", // Page Title "banner": { // Banner 配置 "title": "YApi", "description": "高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。" }, - "content": "./doc/interface.md" // 内容(这里以markdown文件举例) + "content": { + "sidebar": true, + "multi": true, + "index": "./doc/usage/getfamiliar.md", + "pages": [{ + "name": "认识 YApi", + "content": "./doc/usage/getfamiliar.md" + }, { + "name": "创建第一个API", + "content": "./doc/usage/quickstart.md" + }, { + "name": "接口配置", + "content": "./doc/usage/interface.md" + }, { + "name": "使用mock功能", + "content": "./doc/usage/mock.md" + }, { + "name": "使用测试集", + "content": "./doc/usage/case.md" + }, { + "name": "成为组长", + "content": "./doc/usage/leader.md" + }, { + "name": "权限列表", + "content": "./doc/usage/authority.md" + }] + } + },{ + "name": "manage", + "title": "管理学院", + "banner": { + "title": "管理学院", + "description": "超级管理员、分组/项目组长的学院。" + }, + "content": { + "sidebar": true, + "multi": true, + "index": "./doc/manage/intro.md", + "pages": [{ + "name": "介绍", + "content": "./doc/manage/intro.md" + }, { + "name": "部署", + "content": "./doc/manage/build.md" + }, { + "name": "超管职责", + "content": "./doc/manage/admin.md" + }, { + "name": "版本升级", + "content": "./doc/manage/update.md" + }] + } },{ "name": "mock", // Page Name 会根据他生成 html 文件,例: index.html "title": "Mock功能", // Page Title @@ -72,8 +123,33 @@ "title": "YApi", "description": "高效、易用、功能强大、的api管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。" }, - "content": "./doc/mock.md" // 内容(这里以markdown文件举例) - + "content": { + "sidebar": true, + "multi": true, + "index": "./doc/usage/getfamiliar.md", + "pages": [{ + "name": "认识 YApi", + "content": "./doc/usage/getfamiliar.md" + }, { + "name": "创建第一个API", + "content": "./doc/usage/quickstart.md" + }, { + "name": "接口配置", + "content": "./doc/usage/interface.md" + }, { + "name": "使用mock功能", + "content": "./doc/usage/mock.md" + }, { + "name": "使用测试集", + "content": "./doc/usage/case.md" + }, { + "name": "成为组长", + "content": "./doc/usage/leader.md" + }, { + "name": "权限列表", + "content": "./doc/usage/authority.md" + }] + } },{ "name": "api", "title": "",