mirror of
https://github.com/YMFE/yapi.git
synced 2025-04-12 15:10:23 +08:00
add ydoc config and add project module
This commit is contained in:
parent
bebd11d715
commit
6343355b66
doc
api_doc.md
build
api.htmlindex.html
db_dict.mdsource
ZeroClipboard.swfapp.jscode.css
fonts
images
main.cssmain.jsshBrush-css.jsshBrush-js.jsshBrush-sass.jsshCore.jsstatic/server/controllers
server
server_dist
ydoc.json
35
doc/api_doc.md
Normal file
35
doc/api_doc.md
Normal file
@ -0,0 +1,35 @@
|
||||
### 1.User
|
||||
- /user/get //获取用户个人信息
|
||||
- /user/list //获取用户列表,需要提供分页功能
|
||||
- /user/del //删除用户
|
||||
- /user/up //更新用户个人信息
|
||||
- /uesr/login //登录
|
||||
- /user/reg //注册
|
||||
- /user/login/status //获取用户登录状态
|
||||
|
||||
### 2.Group
|
||||
- /group/list //获取项目分组列表
|
||||
- /group/add //添加
|
||||
- /group/up //更新
|
||||
- /group/del //删除
|
||||
|
||||
### 3.Project
|
||||
- /project/list/:group_id
|
||||
- /project/add //添加项目
|
||||
- /project/up //编辑项目
|
||||
- /project/del //删除项目
|
||||
- /project/add_member //添加项目成员
|
||||
- /project/del_member //删除项目成员
|
||||
- /project/get //获取一个项目详细信息
|
||||
|
||||
|
||||
|
||||
### 4.interface
|
||||
- /interface/list/:project_id
|
||||
- /interface/add
|
||||
- /interface/up
|
||||
- /interface/del
|
||||
- /interface/mock //执行用户定义的mock,返回mock结果
|
||||
|
||||
### 5. mock服务器
|
||||
用户修改host指到yapi服务器,yapi服务器收到请求后根据domain/basepath 找到相对应的项目,根据req信息,找到对应的接口,执行用户定义的mock数据,返回给用户相应的结果
|
234
doc/build/api.html
vendored
Normal file
234
doc/build/api.html
vendored
Normal file
@ -0,0 +1,234 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
|
||||
<meta name="format-detection" content="telephone=no,email=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge, chrome=1">
|
||||
<meta name="description" content="description of your site">
|
||||
<meta name="author" content="author of the site">
|
||||
<title>yapi api文档</title>
|
||||
<link rel="stylesheet" href="source/main.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="ydoc">
|
||||
<header class="ydoc-header">
|
||||
<div class="ydoc-header-area">
|
||||
|
||||
<a href="http://ued.qunar.com/ymfe/" class="navbar-brand">YMFE</a>
|
||||
|
||||
<button class="ydocIcon navbar-toggle"></button>
|
||||
<nav class="ydoc-nav">
|
||||
<ul class="navbar-left">
|
||||
|
||||
<li class="">
|
||||
|
||||
<a href="index.html">首页</a>
|
||||
</li>
|
||||
|
||||
<li class="active">
|
||||
|
||||
<a href="api.html">api文档</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- <header style="height:20px"></header> -->
|
||||
|
||||
<!-- Docs page layout -->
|
||||
|
||||
<div class="ydoc-banner-bg">
|
||||
<div class="ydoc-banner ">
|
||||
<div class="ydoc-banner-area">
|
||||
<h1 >api</h1>
|
||||
<p class="desc ">api文档</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="ydoc-container">
|
||||
|
||||
<div class="ydoc-container-content">
|
||||
|
||||
|
||||
<div class="content-left " role="complementary">
|
||||
<nav class="docs-sidebar hidden-print hidden-xs hidden-sm">
|
||||
<ul class="nav docs-sidenav">
|
||||
|
||||
<!-- <li > -->
|
||||
<li >
|
||||
|
||||
<a href="#group">group</a>
|
||||
</li>
|
||||
|
||||
<ul class="nav docs-sidenav-extend" >
|
||||
|
||||
<li >
|
||||
<a href="#-group-add">/group/add</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<div class="content-right markdown-body " role="main">
|
||||
|
||||
<div class="docs-section">
|
||||
|
||||
<h2 id="group" class="page-header subject">group<a class="hashlink" href="#group">#</a></h2>
|
||||
|
||||
<div class="con-list-item">
|
||||
<blockquote class="api">
|
||||
<h3 id="-group-add" class="page-header subject">
|
||||
/group/add
|
||||
|
||||
<span class="ui-badge">POST</span>
|
||||
|
||||
|
||||
<a class="hashlink" href="#-group-add">#</a>
|
||||
</h3>
|
||||
</blockquote>
|
||||
<p>
|
||||
<small class="text-muted">描述:</small>
|
||||
添加项目分组
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<small class="text-muted">参数:</small>
|
||||
</p>
|
||||
<div class="docs-table">
|
||||
<table class="yo-table yo-table-border">
|
||||
<colgroup>
|
||||
<col class="c1">
|
||||
<col class="c2">
|
||||
<col class="c3">
|
||||
<col class="c4">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr class="active">
|
||||
<th>参数名</th>
|
||||
<th>类型</th>
|
||||
<th>描述</th>
|
||||
<th>必选</th>
|
||||
<th>支持版本</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tr>
|
||||
<td>group_name</td>
|
||||
<td>String</td>
|
||||
<td>项目分组名称,不能为空</td>
|
||||
<td>
|
||||
|
||||
<i class="yo-ico glyphicon glyphicon-ok text-success"></i>
|
||||
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>group_desc</td>
|
||||
<td>String</td>
|
||||
<td>项目分组描述</td>
|
||||
<td>
|
||||
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
<div>返回示例:</div>
|
||||
<pre class="ydoc-example" data-foldnumber=10><code> <span class="token punctuation">{</span>
|
||||
<span class="token string">"errcode"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"errmsg"</span><span class="token punctuation">:</span> <span class="token string">'success'</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"data"</span><span class="token punctuation">:</span><span class="token punctuation">{</span>
|
||||
<span class="token string">"_id"</span><span class="token punctuation">:</span> <span class="token number">3</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_name"</span><span class="token punctuation">:</span> <span class="token string">"大数据4"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_desc"</span><span class="token punctuation">:</span> <span class="token string">"大数据4"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"uid"</span><span class="token punctuation">:</span> <span class="token string">"0"</span>
|
||||
<span class="token punctuation">}</span>
|
||||
<span class="token punctuation">}</span></code></pre>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="copyright">
|
||||
© 2016 <a href="http://ued.qunar.com/ymfe/">YMFE</a> Team. Build by <a href="http://ued.qunar.com/ydoc/">ydoc</a>.
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="open-panel"></div>
|
||||
<div class="mask"></div>
|
||||
|
||||
|
||||
<script src="source/main.js"></script>
|
||||
<script src="source/app.js"></script>
|
||||
|
||||
<script>
|
||||
var lineHeight = 17.4;
|
||||
var EXAMPLE_MAX_HEIGHT;
|
||||
|
||||
function fold() {
|
||||
// 折叠code
|
||||
$('.markdown-body pre').css({
|
||||
"line-height": lineHeight + "px"
|
||||
});
|
||||
$('.markdown-body pre').map(function(i, item) {
|
||||
var $item = $(item);
|
||||
var foldnumber = $item.data('foldnumber');
|
||||
EXAMPLE_MAX_HEIGHT = lineHeight * (foldnumber || 6);
|
||||
if ($item.height() > EXAMPLE_MAX_HEIGHT) {
|
||||
$item.css({
|
||||
"padding-bottom": 30
|
||||
});
|
||||
$item.find('code').height(EXAMPLE_MAX_HEIGHT);
|
||||
$item.append('<span class="extend">展开更多……</span>');
|
||||
};
|
||||
});
|
||||
$('.ydoc-example').delegate('.extend', 'click', function() {
|
||||
var $this = $(this);
|
||||
$this.removeClass('extend').addClass('fold');
|
||||
$this.html('折叠代码');
|
||||
$this.prev().height('auto');
|
||||
$this.prev().parent().height('auto');
|
||||
});
|
||||
$('.ydoc-example').delegate('.fold', 'click', function() {
|
||||
var $this = $(this);
|
||||
var foldnumber = $this.parent().data('foldnumber');
|
||||
EXAMPLE_MAX_HEIGHT = lineHeight * (foldnumber || 6);
|
||||
$this.removeClass('fold').addClass('extend');
|
||||
$this.parent().height(EXAMPLE_MAX_HEIGHT); // pre
|
||||
$this.prev().height(EXAMPLE_MAX_HEIGHT); // code
|
||||
$this.html("展开更多……");
|
||||
});
|
||||
}
|
||||
$(document).ready(fold);
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
125
doc/build/index.html
vendored
Normal file
125
doc/build/index.html
vendored
Normal file
@ -0,0 +1,125 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
|
||||
<meta name="format-detection" content="telephone=no,email=no" />
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge, chrome=1">
|
||||
<meta name="description" content="description of your site">
|
||||
<meta name="author" content="author of the site">
|
||||
<title>yapi 首页</title>
|
||||
<link rel="stylesheet" href="source/main.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="ydoc">
|
||||
<header class="ydoc-header">
|
||||
<div class="ydoc-header-area">
|
||||
|
||||
<a href="http://ued.qunar.com/ymfe/" class="navbar-brand">YMFE</a>
|
||||
|
||||
<button class="ydocIcon navbar-toggle"></button>
|
||||
<nav class="ydoc-nav">
|
||||
<ul class="navbar-left">
|
||||
|
||||
<li class="active">
|
||||
|
||||
<a href="index.html">首页</a>
|
||||
</li>
|
||||
|
||||
<li class="">
|
||||
|
||||
<a href="api.html">api文档</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- <header style="height:20px"></header> -->
|
||||
|
||||
<!-- Docs page layout -->
|
||||
|
||||
<div class="ydoc-banner-bg">
|
||||
<div class="ydoc-banner ">
|
||||
<div class="ydoc-banner-area">
|
||||
<h1 >index</h1>
|
||||
<p class="desc ">首页说明文字</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="ydoc-container">
|
||||
|
||||
<div class="ydoc-container-content" id="readme">
|
||||
|
||||
<article class="markdown-body">
|
||||
<h3 class="subject" id="Yapi是一个高效,易用,功能强大的api管理系统">Yapi是一个高效,易用,功能强大的api管理系统 <a class="hashlink" href="#Yapi是一个高效,易用,功能强大的api管理系统">#</a></h3><h4 class="subject" id="后台server如何启动和热更新?">后台server如何启动和热更新? <a class="hashlink" href="#后台server如何启动和热更新?">#</a></h4><ol>
|
||||
<li>npm install</li><li>npm run dev-server</li></ol>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<div class="copyright">
|
||||
© 2016 <a href="http://ued.qunar.com/ymfe/">YMFE</a> Team. Build by <a href="http://ued.qunar.com/ydoc/">ydoc</a>.
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script src="source/main.js"></script>
|
||||
<script src="source/app.js"></script>
|
||||
|
||||
<script>
|
||||
var lineHeight = 17.4;
|
||||
var EXAMPLE_MAX_HEIGHT;
|
||||
|
||||
function fold() {
|
||||
// 折叠code
|
||||
$('.markdown-body pre').css({
|
||||
"line-height": lineHeight + "px"
|
||||
});
|
||||
$('.markdown-body pre').map(function(i, item) {
|
||||
var $item = $(item);
|
||||
var foldnumber = $item.data('foldnumber');
|
||||
EXAMPLE_MAX_HEIGHT = lineHeight * (foldnumber || 6);
|
||||
if ($item.height() > EXAMPLE_MAX_HEIGHT) {
|
||||
$item.css({
|
||||
"padding-bottom": 30
|
||||
});
|
||||
$item.find('code').height(EXAMPLE_MAX_HEIGHT);
|
||||
$item.append('<span class="extend">展开更多……</span>');
|
||||
};
|
||||
});
|
||||
$('.ydoc-example').delegate('.extend', 'click', function() {
|
||||
var $this = $(this);
|
||||
$this.removeClass('extend').addClass('fold');
|
||||
$this.html('折叠代码');
|
||||
$this.prev().height('auto');
|
||||
$this.prev().parent().height('auto');
|
||||
});
|
||||
$('.ydoc-example').delegate('.fold', 'click', function() {
|
||||
var $this = $(this);
|
||||
var foldnumber = $this.parent().data('foldnumber');
|
||||
EXAMPLE_MAX_HEIGHT = lineHeight * (foldnumber || 6);
|
||||
$this.removeClass('fold').addClass('extend');
|
||||
$this.parent().height(EXAMPLE_MAX_HEIGHT); // pre
|
||||
$this.prev().height(EXAMPLE_MAX_HEIGHT); // code
|
||||
$this.html("展开更多……");
|
||||
});
|
||||
}
|
||||
$(document).ready(fold);
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
BIN
doc/build/source/ZeroClipboard.swf
vendored
Normal file
BIN
doc/build/source/ZeroClipboard.swf
vendored
Normal file
Binary file not shown.
270
doc/build/source/app.js
vendored
Normal file
270
doc/build/source/app.js
vendored
Normal file
@ -0,0 +1,270 @@
|
||||
var EXAMPLE_MAX_HEIGHT = 98,
|
||||
DEFAULT_SHOW_PARAMS = 5;
|
||||
|
||||
$(document).ready(function() {
|
||||
// 移动端导航
|
||||
var $openPanel = $('.open-panel');
|
||||
var $contentLeft = $('.content-left');
|
||||
var $contentLeftWidth = $contentLeft.width() - 1;
|
||||
var $ydoc = $('.ydoc');
|
||||
var $mask = $('.mask');
|
||||
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');
|
||||
var lis = $contentLeft.find('li');
|
||||
var titles = [];
|
||||
var menus = [];
|
||||
$ydoc.addClass('hidden');
|
||||
if (isWechat() && $contentLeft[0]) {
|
||||
$ydoc.addClass('off-webkit-scroll');
|
||||
}
|
||||
for (var i = 0; i < a.length; i++) {
|
||||
menus.push({
|
||||
name: $(a[i]).attr('href').split('#')[1],
|
||||
offsetTop: $(a[i]).offset().top - 77,
|
||||
parent: $(a[i]).parent()
|
||||
})
|
||||
}
|
||||
for (var i = 0; i < h2.length; i++) {
|
||||
titles.push({
|
||||
name: h2[i].id,
|
||||
jq: $(h2[i]),
|
||||
offsetTop: $(h2[i]).offset().top
|
||||
})
|
||||
}
|
||||
for (var i = 0; i < h3.length; i++) {
|
||||
titles.push({
|
||||
name: h3[i].id,
|
||||
jq: $(h3[i]),
|
||||
offsetTop: $(h3[i]).offset().top
|
||||
})
|
||||
}
|
||||
titles.sort(sortAsOffset('offsetTop'));
|
||||
|
||||
$openPanel.on('click', function() {
|
||||
if (isPanelHide) { // 点击弹出panel
|
||||
isPanelHide = false;
|
||||
$ydoc.addClass('hidden');
|
||||
$mask.show();
|
||||
setTimeout(function() {
|
||||
$mask.addClass('show');
|
||||
}, 50)
|
||||
$openPanel.css({
|
||||
'transform': 'translateX(-' + $contentLeftWidth + 'px)'
|
||||
})
|
||||
$contentLeft.css({
|
||||
'transform': 'translateX(-' + $contentLeftWidth + 'px)'
|
||||
})
|
||||
} else { // 点击隐藏panel
|
||||
isPanelHide = true;
|
||||
$ydoc.removeClass('hidden');
|
||||
$mask.removeClass('show');
|
||||
setTimeout(function() {
|
||||
$mask.hide();
|
||||
}, 400)
|
||||
$openPanel.css({
|
||||
'transform': 'translateX(0px)'
|
||||
})
|
||||
$contentLeft.css({
|
||||
'transform': 'translateX(0px)'
|
||||
})
|
||||
}
|
||||
var scrollTop = $ydoc.scrollTop();
|
||||
// 遍历主页面的标题,找到当前窗口顶部的标题
|
||||
for (var i = 0; i < titles.length; i++) {
|
||||
if (titles[i].offsetTop > scrollTop) {
|
||||
// 遍历侧栏,找到对应的标题
|
||||
for (var j in menus) {
|
||||
if (menus[j].name == titles[i].name) {
|
||||
lis.removeClass('active');
|
||||
menus[j].parent.addClass('active');
|
||||
$('.docs-sidenav').scrollTop(menus[j].offsetTop);
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$ydoc.removeClass('hidden');
|
||||
$ydoc.on('scroll', function() {
|
||||
sessionStorage.setItem('offsetTop', $ydoc.scrollTop());
|
||||
})
|
||||
// 待元素获获取offsetTop值之后再设置ydoc的offsetTop
|
||||
if (sessionStorage.offsetTop) {
|
||||
$ydoc.scrollTop(sessionStorage.offsetTop);
|
||||
}
|
||||
// $openPanel.trigger('click');
|
||||
$mask.on('click', function() {
|
||||
if (!isPanelHide) {
|
||||
$openPanel.click();
|
||||
}
|
||||
});
|
||||
|
||||
// PC端导航
|
||||
$('.navbar-toggle').click(function() {
|
||||
$(this).next(".ydoc-nav").toggle();
|
||||
});
|
||||
|
||||
$('.docs-sidenav li').click(function(e) {
|
||||
$('.docs-sidenav li').removeClass('active');
|
||||
$(this).addClass('active');
|
||||
if (!isPanelHide) {
|
||||
$openPanel.trigger('click');
|
||||
}
|
||||
});
|
||||
$ydoc.click(function(e) {
|
||||
if ($(e.target).data('target') !== 'version') {
|
||||
$versionMask.hide();
|
||||
}
|
||||
})
|
||||
$versionSelector.click(function(e) {
|
||||
$versionMask.show();
|
||||
console.log('e');
|
||||
});
|
||||
|
||||
$('.markdown-body pre').map(function(i, item) {
|
||||
$(item).addClass('ydoc-example');
|
||||
});
|
||||
|
||||
// $('code').each(function(i, block) {
|
||||
// if (block.innerHTML.indexOf('\n') != -1) {
|
||||
// var pn = block.parentNode;
|
||||
// if (pn.tagName.toUpperCase() == 'PRE') {
|
||||
// try {
|
||||
// hljs.highlightBlock(block);
|
||||
// } catch(e) {}
|
||||
// } else {
|
||||
// pn.innerHTML = '<pre><code>' + block.innerHTML + '</code></pre>';
|
||||
// try {
|
||||
// hljs.highlightBlock(pn.childNodes[0].childNodes[0]);
|
||||
// } catch(e) {}
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
|
||||
|
||||
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;
|
||||
|
||||
sidebar.on('mouseover', function() {
|
||||
barScroll = true;
|
||||
});
|
||||
sidebar.on('mouseout', function() {
|
||||
barScroll = false;
|
||||
});
|
||||
};
|
||||
|
||||
$(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) {
|
||||
resizeSidebar();
|
||||
$contentLeftWidth = $contentLeft.width() - 1;
|
||||
});
|
||||
|
||||
function resizeSidebar() {
|
||||
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');
|
||||
$('.docs-sidenav').css({
|
||||
'overflow-y': 'scroll',
|
||||
'overflow-x': 'hidden'
|
||||
});
|
||||
var barScroll = false;
|
||||
|
||||
sidebar.on('mouseover', function() {
|
||||
barScroll = true;
|
||||
});
|
||||
|
||||
sidebar.on('mouseout', function() {
|
||||
barScroll = false;
|
||||
});
|
||||
// scroll
|
||||
if ($(window).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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function sortAsOffset(propertyName) {
|
||||
return function(obj1, obj2) {
|
||||
var val1 = obj1[propertyName];
|
||||
var val2 = obj2[propertyName];
|
||||
if (val1 < val2) {
|
||||
return -1;
|
||||
} else if (val1 > val2) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function isWechat() {
|
||||
var ua = navigator.userAgent.toLowerCase();
|
||||
if (ua.match(/MicroMessenger/i) == "micromessenger") {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
1
doc/build/source/code.css
vendored
Normal file
1
doc/build/source/code.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
doc/build/source/fonts/ydoc.eot
vendored
Normal file
BIN
doc/build/source/fonts/ydoc.eot
vendored
Normal file
Binary file not shown.
51
doc/build/source/fonts/ydoc.svg
vendored
Normal file
51
doc/build/source/fonts/ydoc.svg
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<font id="ydoc" horiz-adv-x="1024">
|
||||
<font-face
|
||||
font-family="ydoc"
|
||||
units-per-em="1024"
|
||||
ascent="1024"
|
||||
descent="0"
|
||||
/>
|
||||
<missing-glyph horiz-adv-x="0"/>
|
||||
<glyph
|
||||
glyph-name="qunar-bars"
|
||||
unicode=""
|
||||
horiz-adv-x="1024" d=" M192,576 L832,576 L832,448 L192,448 M192,320 L832,320 L832,192 L192,192 M192,832 L832,832 L832,704 L192,704" />
|
||||
<glyph
|
||||
glyph-name="qunar-loading_error_o"
|
||||
unicode=""
|
||||
horiz-adv-x="1024" d=" M824,245 L557,512 L823,778 Q832,788 832,800 Q832,812 822.5,821.5 Q813,831 800,831.5 Q787,832 778,824 L512,557 L246,824 Q237,832 224,831.5 Q211,831 201.5,821.5 Q192,812 192,800 Q192,788 201,778 L467,512 L200,245 Q192,236 192.5,223.5 Q193,211 202.5,201.5 Q212,192 224,192 Q236,192 245,200 L512,467 L779,200 Q788,192 800,192 Q812,192 821.5,201.5 Q831,211 831.5,223.5 Q832,236 824,245" />
|
||||
<glyph
|
||||
glyph-name="qunar-loading_done_o"
|
||||
unicode=""
|
||||
horiz-adv-x="1024" d=" M887,758 Q877,767 864.5,768 Q852,769 842,760 L416,331 L182,568 Q173,576 160,575.5 Q147,575 137.5,565.5 Q128,556 128,544 Q128,532 137,522 L395,264 Q404,255 416,255 Q428,255 437,264 L888,715 Q896,724 896,736 Q896,748 887,758" />
|
||||
<glyph
|
||||
glyph-name="qunar-back_line"
|
||||
unicode=""
|
||||
horiz-adv-x="1024" d=" M335,511 L759,905 Q768,915 768,928 Q768,941 758.5,950.5 Q749,960 736,960 Q723,960 713,951 L265,533 Q256,523 256,510.5 Q256,498 265,488 L713,73 Q723,64 736,64 Q749,64 758.5,73.5 Q768,83 768,96 Q768,109 759,119" />
|
||||
<glyph
|
||||
glyph-name="qunar-next_line"
|
||||
unicode=""
|
||||
horiz-adv-x="1024" d=" M689,511 L265,905 Q256,915 256,928 Q256,941 265.5,950.5 Q275,960 288,960 Q301,960 311,951 L759,533 Q768,523 768,510.5 Q768,498 759,488 L311,73 Q301,64 288,64 Q275,64 265.5,73.5 Q256,83 256,96 Q256,109 265,119" />
|
||||
<glyph
|
||||
glyph-name="qunar-dot_medium"
|
||||
unicode=""
|
||||
horiz-adv-x="1024" d=" M512,704 Q430,702 376,648 Q322,594 320,512 Q322,431 376,376.5 Q430,322 512,320 Q594,322 648,376.5 Q702,431 704,512 Q702,594 648,648 Q594,702 512,704" />
|
||||
<glyph
|
||||
glyph-name="mob-fangxingyigouxuan-o"
|
||||
unicode=""
|
||||
horiz-adv-x="1024" d=" M752,896 L272,896 Q211,894 170.5,853.5 Q130,813 128,752 L128,272 Q130,211 170.5,170.5 Q211,130 272,128 L752,128 Q813,130 853.5,170.5 Q894,211 896,272 L896,752 Q894,813 853.5,853.5 Q813,894 752,896 M759,617 L471,329 Q461,320 448,320 Q435,320 425,329 L265,489 Q256,499 256,512 Q256,525 265.5,534.5 Q275,544 288,544 Q301,544 311,535 L448,397 L713,663 Q723,672 736,672 Q749,672 758.5,662.5 Q768,653 768,640 Q768,627 759,617" />
|
||||
<glyph
|
||||
glyph-name="mob-fangxingweigouxuan-f"
|
||||
unicode=""
|
||||
horiz-adv-x="1024" d=" M752,896 L272,896 Q211,894 170.5,853.5 Q130,813 128,752 L128,272 Q130,211 170.5,170.5 Q211,130 272,128 L752,128 Q813,130 853.5,170.5 Q894,211 896,272 L896,752 Q894,813 853.5,853.5 Q813,894 752,896 M864,272 Q863,224 831.5,192.5 Q800,161 752,160 L272,160 Q224,161 192.5,192.5 Q161,224 160,272 L160,752 Q161,800 192.5,831.5 Q224,863 272,864 L752,864 Q800,863 831.5,831.5 Q863,800 864,752" />
|
||||
<glyph
|
||||
glyph-name="mob-sanjiaoxia-o"
|
||||
unicode=""
|
||||
horiz-adv-x="1024" d=" M768,640 L512,384 L256,640" />
|
||||
</font>
|
||||
</defs>
|
||||
</svg>
|
After (image error) Size: 3.5 KiB |
BIN
doc/build/source/fonts/ydoc.ttf
vendored
Normal file
BIN
doc/build/source/fonts/ydoc.ttf
vendored
Normal file
Binary file not shown.
BIN
doc/build/source/fonts/ydoc.woff
vendored
Normal file
BIN
doc/build/source/fonts/ydoc.woff
vendored
Normal file
Binary file not shown.
BIN
doc/build/source/images/feed.png
vendored
Normal file
BIN
doc/build/source/images/feed.png
vendored
Normal file
Binary file not shown.
After ![]() (image error) Size: 72 KiB |
BIN
doc/build/source/images/grid-18px-masked.png
vendored
Normal file
BIN
doc/build/source/images/grid-18px-masked.png
vendored
Normal file
Binary file not shown.
After ![]() (image error) Size: 405 B |
1
doc/build/source/main.css
vendored
Normal file
1
doc/build/source/main.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6
doc/build/source/main.js
vendored
Normal file
6
doc/build/source/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
75
doc/build/source/shBrush-css.js
vendored
Normal file
75
doc/build/source/shBrush-css.js
vendored
Normal file
@ -0,0 +1,75 @@
|
||||
;(function()
|
||||
{
|
||||
// CommonJS
|
||||
SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
|
||||
|
||||
function Brush()
|
||||
{
|
||||
function getKeywordsCSS(str)
|
||||
{
|
||||
return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
|
||||
};
|
||||
|
||||
function getValuesCSS(str)
|
||||
{
|
||||
return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
|
||||
};
|
||||
|
||||
var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' +
|
||||
'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
|
||||
'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
|
||||
'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
|
||||
'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
|
||||
'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
|
||||
'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
|
||||
'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
|
||||
'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
|
||||
'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
|
||||
'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
|
||||
'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
|
||||
'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
|
||||
'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
|
||||
|
||||
var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
|
||||
'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
|
||||
'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+
|
||||
'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
|
||||
'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
|
||||
'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
|
||||
'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
|
||||
'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
|
||||
'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
|
||||
'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
|
||||
'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
|
||||
'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
|
||||
'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
|
||||
'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
|
||||
|
||||
var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
|
||||
|
||||
this.regexList = [
|
||||
{ regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments
|
||||
{ regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings
|
||||
{ regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings
|
||||
{ regex: /\#[a-fA-F0-9]{3,6}/g, css: 'value' }, // html colors
|
||||
{ regex: /(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)/g, css: 'value' }, // sizes
|
||||
{ regex: /!important/g, css: 'color3' }, // !important
|
||||
{ regex: new RegExp(getKeywordsCSS(keywords), 'gm'), css: 'keyword' }, // keywords
|
||||
{ regex: new RegExp(getValuesCSS(values), 'g'), css: 'value' }, // values
|
||||
{ regex: new RegExp(this.getKeywords(fonts), 'g'), css: 'color1' } // fonts
|
||||
];
|
||||
|
||||
this.forHtmlScript({
|
||||
left: /(<|<)\s*style.*?(>|>)/gi,
|
||||
right: /(<|<)\/\s*style\s*(>|>)/gi
|
||||
});
|
||||
};
|
||||
|
||||
Brush.prototype = new SyntaxHighlighter.Highlighter();
|
||||
Brush.aliases = ['css'];
|
||||
|
||||
SyntaxHighlighter.brushes.CSS = Brush;
|
||||
|
||||
// CommonJS
|
||||
typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
|
||||
})();
|
36
doc/build/source/shBrush-js.js
vendored
Normal file
36
doc/build/source/shBrush-js.js
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
;(function()
|
||||
{
|
||||
// CommonJS
|
||||
SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
|
||||
|
||||
function Brush()
|
||||
{
|
||||
var keywords = 'break case catch class continue ' +
|
||||
'default delete do else enum export extends false ' +
|
||||
'for function if implements import in instanceof ' +
|
||||
'interface let new null package private protected ' +
|
||||
'static return super switch ' +
|
||||
'this throw true try typeof var while with yield';
|
||||
|
||||
var r = SyntaxHighlighter.regexLib;
|
||||
|
||||
this.regexList = [
|
||||
{ regex: r.multiLineDoubleQuotedString, css: 'string' }, // double quoted strings
|
||||
{ regex: r.multiLineSingleQuotedString, css: 'string' }, // single quoted strings
|
||||
{ regex: r.singleLineCComments, css: 'comments' }, // one line comments
|
||||
{ regex: r.multiLineCComments, css: 'comments' }, // multiline comments
|
||||
{ regex: /\s*#.*/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion
|
||||
{ regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // keywords
|
||||
];
|
||||
|
||||
this.forHtmlScript(r.scriptScriptTags);
|
||||
};
|
||||
|
||||
Brush.prototype = new SyntaxHighlighter.Highlighter();
|
||||
Brush.aliases = ['js', 'jscript', 'javascript', 'json'];
|
||||
|
||||
SyntaxHighlighter.brushes.JScript = Brush;
|
||||
|
||||
// CommonJS
|
||||
typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
|
||||
})();
|
94
doc/build/source/shBrush-sass.js
vendored
Normal file
94
doc/build/source/shBrush-sass.js
vendored
Normal file
@ -0,0 +1,94 @@
|
||||
/**
|
||||
* SyntaxHighlighter
|
||||
* http://alexgorbatchev.com/SyntaxHighlighter
|
||||
*
|
||||
* SyntaxHighlighter is donationware. If you are using it, please donate.
|
||||
* http://alexgorbatchev.com/SyntaxHighlighter/donate.html
|
||||
*
|
||||
* @version
|
||||
* 3.0.83 (July 02 2010)
|
||||
*
|
||||
* @copyright
|
||||
* Copyright (C) 2004-2010 Alex Gorbatchev.
|
||||
*
|
||||
* @license
|
||||
* Dual licensed under the MIT and GPL licenses.
|
||||
*/
|
||||
;(function()
|
||||
{
|
||||
// CommonJS
|
||||
typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
|
||||
|
||||
function Brush()
|
||||
{
|
||||
function getKeywordsCSS(str)
|
||||
{
|
||||
return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
|
||||
};
|
||||
|
||||
function getValuesCSS(str)
|
||||
{
|
||||
return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
|
||||
};
|
||||
|
||||
var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' +
|
||||
'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
|
||||
'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
|
||||
'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
|
||||
'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
|
||||
'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
|
||||
'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
|
||||
'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
|
||||
'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
|
||||
'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
|
||||
'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
|
||||
'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
|
||||
'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
|
||||
'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
|
||||
|
||||
var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
|
||||
'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
|
||||
'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero digits disc dotted double '+
|
||||
'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
|
||||
'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
|
||||
'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
|
||||
'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
|
||||
'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
|
||||
'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
|
||||
'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
|
||||
'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
|
||||
'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
|
||||
'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
|
||||
'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
|
||||
|
||||
var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
|
||||
|
||||
var statements = '!important !default';
|
||||
var preprocessor = '@import @extend @debug @warn @if @for @while @mixin @include';
|
||||
|
||||
var r = SyntaxHighlighter.regexLib;
|
||||
|
||||
this.regexList = [
|
||||
{ regex: r.multiLineCComments, css: 'comments' }, // multiline comments
|
||||
{ regex: r.singleLineCComments, css: 'comments' }, // singleline comments
|
||||
{ regex: r.doubleQuotedString, css: 'string' }, // double quoted strings
|
||||
{ regex: r.singleQuotedString, css: 'string' }, // single quoted strings
|
||||
{ regex: /\#[a-fA-F0-9]{3,6}/g, css: 'value' }, // html colors
|
||||
{ regex: /\b(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)\b/g, css: 'value' }, // sizes
|
||||
{ regex: /\$\w+/g, css: 'variable' }, // variables
|
||||
{ regex: new RegExp(this.getKeywords(statements), 'g'), css: 'color3' }, // statements
|
||||
{ regex: new RegExp(this.getKeywords(preprocessor), 'g'), css: 'preprocessor' }, // preprocessor
|
||||
{ regex: new RegExp(getKeywordsCSS(keywords), 'gm'), css: 'keyword' }, // keywords
|
||||
{ regex: new RegExp(getValuesCSS(values), 'g'), css: 'value' }, // values
|
||||
{ regex: new RegExp(this.getKeywords(fonts), 'g'), css: 'color1' } // fonts
|
||||
];
|
||||
};
|
||||
|
||||
Brush.prototype = new SyntaxHighlighter.Highlighter();
|
||||
Brush.aliases = ['sass', 'scss'];
|
||||
|
||||
SyntaxHighlighter.brushes.Sass = Brush;
|
||||
|
||||
// CommonJS
|
||||
typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
|
||||
})();
|
17
doc/build/source/shCore.js
vendored
Normal file
17
doc/build/source/shCore.js
vendored
Normal file
File diff suppressed because one or more lines are too long
85
doc/build/static/server/controllers/base.js.html
vendored
Normal file
85
doc/build/static/server/controllers/base.js.html
vendored
Normal file
@ -0,0 +1,85 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no" />
|
||||
<title>yapi : ./server/controllers/base.js</title>
|
||||
<link type="text/css" rel="stylesheet" href="../../../source/code.css"/>
|
||||
<script type="text/javascript" src="../../../source/shCore.js"></script>
|
||||
<script type="text/javascript" src="../../../source/shBrush-js.js"></script>
|
||||
<style>
|
||||
.syntaxhighlighter .number1 .spaces,.syntaxhighlighter .toolbar{ display: none;}
|
||||
.syntaxhighlighter table td.gutter .line.highlight { background-color: #6ce26c !important; color: white; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="ydoc">
|
||||
<div class="ydoc-banner-bg">
|
||||
<div class="ydoc-banner" id="content" tabindex="-1">
|
||||
<div class="ydoc-banner-area">
|
||||
<h1>yapi : ./server/controllers/base.js</h1>
|
||||
<p>源代码</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ydoc-container">
|
||||
<div class="ydoc-container-content">
|
||||
<div class="static-code-content" role="main">
|
||||
<pre class="brush: js;">
|
||||
import yapi from '../yapi.js'
|
||||
class baseController{
|
||||
constructor(ctx){
|
||||
console.log('baseControler init...')
|
||||
}
|
||||
|
||||
getUid(){
|
||||
return 0
|
||||
}
|
||||
|
||||
getLoginStatus(){
|
||||
return true
|
||||
}
|
||||
|
||||
getRole(){
|
||||
return 'admin'
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = baseController
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="docs-header" id="content" tabindex="-1">
|
||||
<div class="container">
|
||||
<h1>yapi : ./server/controllers/base.js</h1>
|
||||
<p>源代码</p>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<footer class="docs-footer" role="contentinfo">
|
||||
<div class="container">
|
||||
<p></p>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
SyntaxHighlighter.all();
|
||||
|
||||
function getTop(node){
|
||||
return node.offsetTop + (node.offsetParent ? getTop(node.offsetParent) : 0);
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
setTimeout(function() {
|
||||
try {
|
||||
var lineNum = (parseInt(location.hash.replace(/#/g, '')) - 1) || 0,
|
||||
node = document.querySelectorAll('div.line')[lineNum];
|
||||
document.body.scrollTop = getTop(node);
|
||||
node.className += ' highlight';
|
||||
} catch(e) {}
|
||||
}, 500);
|
||||
}, false);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
169
doc/build/static/server/controllers/group.js.html
vendored
Normal file
169
doc/build/static/server/controllers/group.js.html
vendored
Normal file
@ -0,0 +1,169 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no" />
|
||||
<title>yapi : ./server/controllers/group.js</title>
|
||||
<link type="text/css" rel="stylesheet" href="../../../source/code.css"/>
|
||||
<script type="text/javascript" src="../../../source/shCore.js"></script>
|
||||
<script type="text/javascript" src="../../../source/shBrush-js.js"></script>
|
||||
<style>
|
||||
.syntaxhighlighter .number1 .spaces,.syntaxhighlighter .toolbar{ display: none;}
|
||||
.syntaxhighlighter table td.gutter .line.highlight { background-color: #6ce26c !important; color: white; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="ydoc">
|
||||
<div class="ydoc-banner-bg">
|
||||
<div class="ydoc-banner" id="content" tabindex="-1">
|
||||
<div class="ydoc-banner-area">
|
||||
<h1>yapi : ./server/controllers/group.js</h1>
|
||||
<p>源代码</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ydoc-container">
|
||||
<div class="ydoc-container-content">
|
||||
<div class="static-code-content" role="main">
|
||||
<pre class="brush: js;">
|
||||
import groupModel from '../models/group.js'
|
||||
import yapi from '../yapi.js'
|
||||
import baseController from './base.js'
|
||||
|
||||
|
||||
class groupController extends baseController{
|
||||
constructor(ctx){
|
||||
super(ctx)
|
||||
console.log('constructor....')
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 添加项目分组
|
||||
* @interface /group/add
|
||||
* @method POST
|
||||
* @category group
|
||||
* @foldnumber 10
|
||||
* @param {String} group_name 项目分组名称,不能为空
|
||||
* @param {String} [group_desc] 项目分组描述
|
||||
* @returns {Object}
|
||||
* @example
|
||||
* {
|
||||
* "errcode": 0,
|
||||
* "errmsg": 'success',
|
||||
* "data":{
|
||||
* "_id": 3,
|
||||
* "group_name": "大数据4",
|
||||
* "group_desc": "大数据4",
|
||||
* "uid": "0"
|
||||
* }
|
||||
* }
|
||||
*
|
||||
*/
|
||||
async add(ctx) {
|
||||
let params = ctx.request.body;
|
||||
if(!params.group_name){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目分组名不能为空');
|
||||
}
|
||||
var groupInst = yapi.getInst(groupModel);
|
||||
|
||||
var checkRepeat = await groupInst.checkRepeat(params.group_name);
|
||||
if(checkRepeat > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '项目分组名已存在');
|
||||
}
|
||||
let data = {
|
||||
group_name: params.group_name,
|
||||
group_desc: params.group_desc,
|
||||
uid: '0',
|
||||
add_time: yapi.commons.time(),
|
||||
up_time: yapi.commons.time()
|
||||
}
|
||||
try{
|
||||
let result = await groupInst.save(data);
|
||||
result = yapi.commons.fieldSelect(result, ['_id', 'group_name', 'group_desc', 'uid']);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
}catch(e){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async list(ctx) {
|
||||
try{
|
||||
var groupInst = yapi.getInst(groupModel);
|
||||
let result = await groupInst.list();
|
||||
ctx.body = yapi.commons.resReturn(result)
|
||||
}catch(e){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
|
||||
async del(ctx){
|
||||
try{
|
||||
var groupInst = yapi.getInst(groupModel);
|
||||
let id = ctx.request.body.id;
|
||||
let result = await groupInst.del(id);
|
||||
ctx.body = yapi.commons.resReturn(result)
|
||||
}catch(err){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
|
||||
async up(ctx){
|
||||
try{
|
||||
var groupInst = yapi.getInst(groupModel);
|
||||
let id = ctx.request.body.id;
|
||||
let data = {};
|
||||
ctx.request.body.group_name && (data.group_name = ctx.request.body.group_name)
|
||||
ctx.request.body.group_desc && (data.group_desc = ctx.request.body.group_desc)
|
||||
if(Object.keys(data).length ===0){
|
||||
ctx.body = yapi.commons.resReturn(null, 404, '分组名和分组描述不能为空');
|
||||
}
|
||||
let result = await groupInst.up(id, data);
|
||||
ctx.body = yapi.commons.resReturn(result)
|
||||
}catch(err){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = groupController
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="docs-header" id="content" tabindex="-1">
|
||||
<div class="container">
|
||||
<h1>yapi : ./server/controllers/group.js</h1>
|
||||
<p>源代码</p>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<footer class="docs-footer" role="contentinfo">
|
||||
<div class="container">
|
||||
<p></p>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
SyntaxHighlighter.all();
|
||||
|
||||
function getTop(node){
|
||||
return node.offsetTop + (node.offsetParent ? getTop(node.offsetParent) : 0);
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
setTimeout(function() {
|
||||
try {
|
||||
var lineNum = (parseInt(location.hash.replace(/#/g, '')) - 1) || 0,
|
||||
node = document.querySelectorAll('div.line')[lineNum];
|
||||
document.body.scrollTop = getTop(node);
|
||||
node.className += ' highlight';
|
||||
} catch(e) {}
|
||||
}, 500);
|
||||
}, false);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
86
doc/build/static/server/controllers/interface.js.html
vendored
Normal file
86
doc/build/static/server/controllers/interface.js.html
vendored
Normal file
@ -0,0 +1,86 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no" />
|
||||
<title>yapi : ./server/controllers/interface.js</title>
|
||||
<link type="text/css" rel="stylesheet" href="../../../source/code.css"/>
|
||||
<script type="text/javascript" src="../../../source/shCore.js"></script>
|
||||
<script type="text/javascript" src="../../../source/shBrush-js.js"></script>
|
||||
<style>
|
||||
.syntaxhighlighter .number1 .spaces,.syntaxhighlighter .toolbar{ display: none;}
|
||||
.syntaxhighlighter table td.gutter .line.highlight { background-color: #6ce26c !important; color: white; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="ydoc">
|
||||
<div class="ydoc-banner-bg">
|
||||
<div class="ydoc-banner" id="content" tabindex="-1">
|
||||
<div class="ydoc-banner-area">
|
||||
<h1>yapi : ./server/controllers/interface.js</h1>
|
||||
<p>源代码</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ydoc-container">
|
||||
<div class="ydoc-container-content">
|
||||
<div class="static-code-content" role="main">
|
||||
<pre class="brush: js;">
|
||||
import { resReturn,log } from '../utils/commons';
|
||||
import interfaceModel from '../models/interface.js'
|
||||
|
||||
module.exports = {
|
||||
async add(ctx) {
|
||||
let data = {
|
||||
title: 'yapi',
|
||||
content: 'content',
|
||||
uid: 'abc'
|
||||
}
|
||||
let result = await interfaceModel.save(data);
|
||||
log('interface err...', 'error');
|
||||
ctx.body = resReturn(result)
|
||||
},
|
||||
|
||||
async list(ctx) {
|
||||
let data = interfaceModel.find();
|
||||
ctx.body = 1;
|
||||
}
|
||||
}
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="docs-header" id="content" tabindex="-1">
|
||||
<div class="container">
|
||||
<h1>yapi : ./server/controllers/interface.js</h1>
|
||||
<p>源代码</p>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<footer class="docs-footer" role="contentinfo">
|
||||
<div class="container">
|
||||
<p></p>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
SyntaxHighlighter.all();
|
||||
|
||||
function getTop(node){
|
||||
return node.offsetTop + (node.offsetParent ? getTop(node.offsetParent) : 0);
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
setTimeout(function() {
|
||||
try {
|
||||
var lineNum = (parseInt(location.hash.replace(/#/g, '')) - 1) || 0,
|
||||
node = document.querySelectorAll('div.line')[lineNum];
|
||||
document.body.scrollTop = getTop(node);
|
||||
node.className += ' highlight';
|
||||
} catch(e) {}
|
||||
}, 500);
|
||||
}, false);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
247
doc/build/static/server/controllers/project.js.html
vendored
Normal file
247
doc/build/static/server/controllers/project.js.html
vendored
Normal file
@ -0,0 +1,247 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no" />
|
||||
<title>yapi : ./server/controllers/project.js</title>
|
||||
<link type="text/css" rel="stylesheet" href="../../../source/code.css"/>
|
||||
<script type="text/javascript" src="../../../source/shCore.js"></script>
|
||||
<script type="text/javascript" src="../../../source/shBrush-js.js"></script>
|
||||
<style>
|
||||
.syntaxhighlighter .number1 .spaces,.syntaxhighlighter .toolbar{ display: none;}
|
||||
.syntaxhighlighter table td.gutter .line.highlight { background-color: #6ce26c !important; color: white; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="ydoc">
|
||||
<div class="ydoc-banner-bg">
|
||||
<div class="ydoc-banner" id="content" tabindex="-1">
|
||||
<div class="ydoc-banner-area">
|
||||
<h1>yapi : ./server/controllers/project.js</h1>
|
||||
<p>源代码</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ydoc-container">
|
||||
<div class="ydoc-container-content">
|
||||
<div class="static-code-content" role="main">
|
||||
<pre class="brush: js;">
|
||||
import projectModel from '../models/project.js'
|
||||
import yapi from '../yapi.js'
|
||||
import baseController from './base.js'
|
||||
|
||||
class projectController extends baseController {
|
||||
|
||||
constructor(ctx){
|
||||
super(ctx)
|
||||
this.Model = yapi.getInst(projectModel);
|
||||
}
|
||||
|
||||
async jungeProjectAuth(id){
|
||||
if(this.getRole() === 'admin') return true;
|
||||
if(!id) return false;
|
||||
let result = await this.Model.get(params.id);
|
||||
if(result.uid === this.getUid()){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
async jungeMemberAuth(id, member_uid){
|
||||
if(this.getRole() === 'admin') return true;
|
||||
if(!id || !member_uid) return false;
|
||||
let result = await this.Model.checkMemberRepeat(params.id, member_uid);
|
||||
if(result > 0){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
async add(ctx) {
|
||||
let params = ctx.request.body;
|
||||
|
||||
if(!params.group_id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目分组id不能为空');
|
||||
}
|
||||
|
||||
if(!params.name){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目名不能为空');
|
||||
}
|
||||
|
||||
let checkRepeat = await this.Model.checkNameRepeat(params.name);
|
||||
if(checkRepeat > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '已存在的项目名');
|
||||
}
|
||||
|
||||
if(!params.basepath){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目basepath不能为空');
|
||||
}
|
||||
if(!params.prd_host){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目domain不能为空');
|
||||
}
|
||||
|
||||
let checkRepeatDomain = await this.Model.checkDomainRepeat(params.prd_host, params.basepath);
|
||||
if(checkRepeatDomain > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '已存在domain和basepath');
|
||||
}
|
||||
|
||||
let data = {
|
||||
name: params.name,
|
||||
desc: params.desc,
|
||||
prd_host: params.prd_host,
|
||||
basepath: params.basepath,
|
||||
members: [this.getUid()],
|
||||
uid: this.getUid(),
|
||||
group_id: params.group_id,
|
||||
add_time: yapi.commons.time(),
|
||||
up_time: yapi.commons.time()
|
||||
}
|
||||
|
||||
try{
|
||||
let result = await this.Model.save(data);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
}catch(e){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async addMember(ctx){
|
||||
let params = ctx.request.body;
|
||||
if(!params.member_uid){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目成员uid不能为空');
|
||||
}
|
||||
if(!params.id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
|
||||
}
|
||||
|
||||
var check = await this.Model.checkMemberRepeat(params.id, params.member_uid);
|
||||
if(check > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目成员已存在');
|
||||
}
|
||||
try{
|
||||
let result = await this.Model.addMember(params.id, params.member_uid);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
}catch(e){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async delMember(ctx){
|
||||
let params = ctx.request.body;
|
||||
if(!params.member_uid){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目成员uid不能为空');
|
||||
}
|
||||
if(!params.id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
|
||||
}
|
||||
var check = await this.Model.checkMemberRepeat(params.id, params.member_uid);
|
||||
if(check === 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目成员不存在');
|
||||
}
|
||||
|
||||
try{
|
||||
let result = await this.Model.delMember(params.id, params.member_uid);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
}catch(e){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
|
||||
async get(ctx){
|
||||
let params = ctx.request.query;
|
||||
if(!params.id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
|
||||
}
|
||||
try{
|
||||
let result = await this.Model.get(params.id);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
}catch(e){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
|
||||
async list(ctx) {
|
||||
if(!ctx.request.query.group_id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目分组id不能为空');
|
||||
}
|
||||
try{
|
||||
let result = await this.Model.list();
|
||||
ctx.body = yapi.commons.resReturn(result)
|
||||
}catch(err){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
|
||||
async del(ctx){
|
||||
try{
|
||||
let id = ctx.request.body.id;
|
||||
if(this.jungeProjectAuth(id) !== true){
|
||||
return ctx.body = yapi.commons.resReturn(null, 405, '没有权限');
|
||||
}
|
||||
let result = await this.Model.del(id);
|
||||
ctx.body = yapi.commons.resReturn(result)
|
||||
}catch(err){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
|
||||
async up(ctx){
|
||||
try{
|
||||
let id = ctx.request.body.id;
|
||||
if(this.jungeMemberAuth(id, this.getUid()) !== true){
|
||||
return ctx.body = yapi.commons.resReturn(null, 405, '没有权限');
|
||||
}
|
||||
let data = {};
|
||||
ctx.request.body.project_name && (data.project_name = ctx.request.body.project_name)
|
||||
ctx.request.body.project_desc && (data.project_desc = ctx.request.body.project_desc)
|
||||
if(Object.keys(data).length ===0){
|
||||
ctx.body = yapi.commons.resReturn(null, 404, '分组名和分组描述都为空');
|
||||
}
|
||||
let result = await this.Model.up(id, data);
|
||||
ctx.body = yapi.commons.resReturn(result)
|
||||
}catch(err){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = projectController;
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="docs-header" id="content" tabindex="-1">
|
||||
<div class="container">
|
||||
<h1>yapi : ./server/controllers/project.js</h1>
|
||||
<p>源代码</p>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<footer class="docs-footer" role="contentinfo">
|
||||
<div class="container">
|
||||
<p></p>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
SyntaxHighlighter.all();
|
||||
|
||||
function getTop(node){
|
||||
return node.offsetTop + (node.offsetParent ? getTop(node.offsetParent) : 0);
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
setTimeout(function() {
|
||||
try {
|
||||
var lineNum = (parseInt(location.hash.replace(/#/g, '')) - 1) || 0,
|
||||
node = document.querySelectorAll('div.line')[lineNum];
|
||||
document.body.scrollTop = getTop(node);
|
||||
node.className += ' highlight';
|
||||
} catch(e) {}
|
||||
}, 500);
|
||||
}, false);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
93
doc/db_dict.md
Normal file
93
doc/db_dict.md
Normal file
@ -0,0 +1,93 @@
|
||||
### 数据库字典
|
||||
### 数据库基于mongodb
|
||||
#### 1.User数据表,表名:user
|
||||
```json
|
||||
{
|
||||
_id: (int)
|
||||
username: (string)
|
||||
password: (sha1)
|
||||
passsalt: (string)
|
||||
email : (string)
|
||||
role : (string)
|
||||
add_time: (int)
|
||||
up_time: (int)
|
||||
}
|
||||
````
|
||||
|
||||
#### 2.Project 数据表,表名:project
|
||||
```json
|
||||
{
|
||||
_id: (int)
|
||||
uid : (int)
|
||||
name: (string)
|
||||
basepath: (string)
|
||||
desc: (string)
|
||||
group_id: (int)
|
||||
members: [
|
||||
... //成员uid
|
||||
]
|
||||
prd_host: (string)//网站上线的domain,可用来获取mock数据
|
||||
env:(object){
|
||||
'local环境' : 'http://127.0.0.1'
|
||||
}
|
||||
add_time: (int)
|
||||
up_time: (int)
|
||||
}
|
||||
````
|
||||
|
||||
#### 3.api 数据表,表名:interface
|
||||
```json
|
||||
{
|
||||
_id: (int)
|
||||
uid: (int) //负责人uid
|
||||
path: (string)
|
||||
group_id: (int)
|
||||
status: (int)
|
||||
desc : (string)
|
||||
add_time: (int)
|
||||
up_time : (int)
|
||||
req_headers:(Object){
|
||||
"header_name":(Object){
|
||||
default_value: (string),
|
||||
desc: (string),
|
||||
mock: (string)
|
||||
}
|
||||
}
|
||||
req_params_type: (form|raw)
|
||||
req_params: (Object){
|
||||
"key" : (Object){
|
||||
default_value: (string),
|
||||
desc: (string),
|
||||
mock: (string)
|
||||
}
|
||||
}
|
||||
res_header: (Object){
|
||||
"header_name":(Object){
|
||||
default_value: (string),
|
||||
desc: (string),
|
||||
mock: (string)
|
||||
}
|
||||
}
|
||||
res_body_type: (text|json),
|
||||
res_body: (Object){
|
||||
"key":(Object){
|
||||
default_value: (string),
|
||||
desc: (string),
|
||||
mock: (string)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
#### 4.项目分组,表名: group
|
||||
```json
|
||||
{
|
||||
_id: (int),
|
||||
uid: (int),
|
||||
group_name: (string),
|
||||
group_desc: (string),
|
||||
add_time: (int),
|
||||
up_time: (int)
|
||||
}
|
||||
```
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"port": "3000",
|
||||
"db": {
|
||||
"servername": "localhost",
|
||||
"servername": "127.0.0.1",
|
||||
"DATABASE": "yapi",
|
||||
"port": 27017
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"port":"80",
|
||||
"db": {
|
||||
"servername": "localhost",
|
||||
"servername": "127.0.0.1",
|
||||
"DATABASE": "yapi",
|
||||
"port": "27017"
|
||||
}
|
||||
|
@ -11,6 +11,10 @@ class baseController{
|
||||
getLoginStatus(){
|
||||
return true
|
||||
}
|
||||
|
||||
getRole(){
|
||||
return 'admin'
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = baseController
|
@ -4,21 +4,44 @@ import baseController from './base.js'
|
||||
|
||||
|
||||
class groupController extends baseController{
|
||||
constructor(){
|
||||
super()
|
||||
constructor(ctx){
|
||||
super(ctx)
|
||||
console.log('constructor....')
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 添加项目分组
|
||||
* @interface /group/add
|
||||
* @method POST
|
||||
* @category group
|
||||
* @foldnumber 10
|
||||
* @param {String} group_name 项目分组名称,不能为空
|
||||
* @param {String} [group_desc] 项目分组描述
|
||||
* @returns {Object}
|
||||
* @example
|
||||
* {
|
||||
* "errcode": 0,
|
||||
* "errmsg": 'success',
|
||||
* "data":{
|
||||
* "_id": 3,
|
||||
* "group_name": "大数据4",
|
||||
* "group_desc": "大数据4",
|
||||
* "uid": "0"
|
||||
* }
|
||||
* }
|
||||
*
|
||||
*/
|
||||
async add(ctx) {
|
||||
let params = ctx.request.body;
|
||||
if(!params.group_name){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '组名不能为空');
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目分组名不能为空');
|
||||
}
|
||||
var groupInst = yapi.getInst(groupModel);
|
||||
|
||||
var checkRepeat = await groupInst.checkRepeat(params.group_name);
|
||||
if(checkRepeat > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '组名已存在');
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '项目分组名已存在');
|
||||
}
|
||||
let data = {
|
||||
group_name: params.group_name,
|
||||
@ -66,7 +89,7 @@ class groupController extends baseController{
|
||||
ctx.request.body.group_name && (data.group_name = ctx.request.body.group_name)
|
||||
ctx.request.body.group_desc && (data.group_desc = ctx.request.body.group_desc)
|
||||
if(Object.keys(data).length ===0){
|
||||
ctx.body = yapi.commons.resReturn(null, 404, '分组名和分组描述都为空');
|
||||
ctx.body = yapi.commons.resReturn(null, 404, '分组名和分组描述不能为空');
|
||||
}
|
||||
let result = await groupInst.up(id, data);
|
||||
ctx.body = yapi.commons.resReturn(result)
|
||||
|
@ -1,65 +1,182 @@
|
||||
import projectModel from '../models/project.js'
|
||||
import yapi from '../yapi.js'
|
||||
import baseController from './base.js'
|
||||
|
||||
class projectController extends baseController {
|
||||
|
||||
constructor(ctx){
|
||||
super(ctx)
|
||||
this.Model = yapi.getInst(projectModel);
|
||||
}
|
||||
|
||||
async jungeProjectAuth(id){
|
||||
if(this.getRole() === 'admin') return true;
|
||||
if(!id) return false;
|
||||
let result = await this.Model.get(params.id);
|
||||
if(result.uid === this.getUid()){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
async jungeMemberAuth(id, member_uid){
|
||||
if(this.getRole() === 'admin') return true;
|
||||
if(!id || !member_uid) return false;
|
||||
let result = await this.Model.checkMemberRepeat(params.id, member_uid);
|
||||
if(result > 0){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
async add(ctx) {
|
||||
let params = ctx.request.body;
|
||||
if(!params.project_name){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '组名不能为空');
|
||||
|
||||
if(!params.group_id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目分组id不能为空');
|
||||
}
|
||||
var checkRepeat = await projectModel.checkRepeat(params.project_name);
|
||||
|
||||
if(!params.name){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目名不能为空');
|
||||
}
|
||||
|
||||
let checkRepeat = await this.Model.checkNameRepeat(params.name);
|
||||
if(checkRepeat > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '组名已存在');
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '已存在的项目名');
|
||||
}
|
||||
|
||||
if(!params.basepath){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目basepath不能为空');
|
||||
}
|
||||
if(!params.prd_host){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目domain不能为空');
|
||||
}
|
||||
|
||||
let checkRepeatDomain = await this.Model.checkDomainRepeat(params.prd_host, params.basepath);
|
||||
if(checkRepeatDomain > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '已存在domain和basepath');
|
||||
}
|
||||
|
||||
let data = {
|
||||
project_name: params.project_name,
|
||||
project_desc: params.project_desc,
|
||||
uid: '0',
|
||||
name: params.name,
|
||||
desc: params.desc,
|
||||
prd_host: params.prd_host,
|
||||
basepath: params.basepath,
|
||||
members: [this.getUid()],
|
||||
uid: this.getUid(),
|
||||
group_id: params.group_id,
|
||||
add_time: yapi.commons.time(),
|
||||
up_time: yapi.commons.time()
|
||||
}
|
||||
|
||||
try{
|
||||
let result = await projectModel.save(data);
|
||||
result = yapi.commons.fieldSelect(result, ['_id', 'project_name', 'project_desc', 'uid']);
|
||||
let result = await this.Model.save(data);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
}catch(e){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
async addMember(ctx){
|
||||
let params = ctx.request.body;
|
||||
if(!params.member_uid){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目成员uid不能为空');
|
||||
}
|
||||
if(!params.id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
|
||||
}
|
||||
|
||||
var check = await this.Model.checkMemberRepeat(params.id, params.member_uid);
|
||||
if(check > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目成员已存在');
|
||||
}
|
||||
try{
|
||||
let result = await this.Model.addMember(params.id, params.member_uid);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
}catch(e){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async delMember(ctx){
|
||||
let params = ctx.request.body;
|
||||
if(!params.member_uid){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目成员uid不能为空');
|
||||
}
|
||||
if(!params.id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
|
||||
}
|
||||
var check = await this.Model.checkMemberRepeat(params.id, params.member_uid);
|
||||
if(check === 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目成员不存在');
|
||||
}
|
||||
|
||||
try{
|
||||
let result = await this.Model.delMember(params.id, params.member_uid);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
}catch(e){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
|
||||
async get(ctx){
|
||||
let params = ctx.request.query;
|
||||
if(!params.id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
|
||||
}
|
||||
try{
|
||||
let result = await this.Model.get(params.id);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
}catch(e){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
|
||||
async list(ctx) {
|
||||
if(!ctx.request.query.group_id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目分组id不能为空');
|
||||
}
|
||||
try{
|
||||
let result = await projectModel.list();
|
||||
let result = await this.Model.list();
|
||||
ctx.body = yapi.commons.resReturn(result)
|
||||
}catch(err){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
async del(ctx){
|
||||
try{
|
||||
let id = ctx.request.body.id;
|
||||
let result = await projectModel.del(id);
|
||||
if(this.jungeProjectAuth(id) !== true){
|
||||
return ctx.body = yapi.commons.resReturn(null, 405, '没有权限');
|
||||
}
|
||||
let result = await this.Model.del(id);
|
||||
ctx.body = yapi.commons.resReturn(result)
|
||||
}catch(err){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
async up(ctx){
|
||||
try{
|
||||
try{
|
||||
let id = ctx.request.body.id;
|
||||
if(this.jungeMemberAuth(id, this.getUid()) !== true){
|
||||
return ctx.body = yapi.commons.resReturn(null, 405, '没有权限');
|
||||
}
|
||||
let data = {};
|
||||
ctx.request.body.project_name && (data.project_name = ctx.request.body.project_name)
|
||||
ctx.request.body.project_desc && (data.project_desc = ctx.request.body.project_desc)
|
||||
if(Object.keys(data).length ===0){
|
||||
ctx.body = yapi.commons.resReturn(null, 404, '分组名和分组描述都为空');
|
||||
}
|
||||
let result = await projectModel.up(id, data);
|
||||
let result = await this.Model.up(id, data);
|
||||
ctx.body = yapi.commons.resReturn(result)
|
||||
}catch(err){
|
||||
ctx.body = yapi.commons.resReturn(null, 402, e.message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = projectController;
|
@ -15,7 +15,7 @@ class baseModel{
|
||||
this.schema.plugin(autoIncrement.plugin, this.name)
|
||||
this.model = yapi.db(this.name, this.schema);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取collection的schema结构
|
||||
*/
|
||||
|
@ -9,7 +9,7 @@ class groupModel extends baseModel{
|
||||
|
||||
getSchema(){
|
||||
return {
|
||||
uid: String,
|
||||
uid: Number,
|
||||
group_name: String,
|
||||
group_desc: String,
|
||||
add_time: Number,
|
||||
|
@ -1,44 +1,93 @@
|
||||
import yapi from '../yapi.js'
|
||||
const projectSchema = {
|
||||
uid: Number,
|
||||
name: String,
|
||||
basepath: String,
|
||||
desc: String,
|
||||
group_id: Number,
|
||||
members: Array,
|
||||
prd_host: String,
|
||||
env: Object,
|
||||
add_time: Number,
|
||||
up_time: Number
|
||||
}
|
||||
import baseModel from './base.js'
|
||||
|
||||
class projectModel extends baseModel{
|
||||
getName(){
|
||||
return 'project'
|
||||
}
|
||||
|
||||
var projectModel = yapi.db('project', projectSchema);
|
||||
getSchema(){
|
||||
return {
|
||||
uid: {type: Number, required: true},
|
||||
name: {type: String, required: true},
|
||||
basepath: {type: String, required: true},
|
||||
desc: String,
|
||||
group_id: {type: Number, required: true},
|
||||
members: Array,
|
||||
prd_host: {type: String, required: true},
|
||||
env: Array,
|
||||
add_time: Number,
|
||||
up_time: Number
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
save: (data) => {
|
||||
let m = new projectModel(data);
|
||||
save(data) {
|
||||
let m = new this.model(data);
|
||||
return m.save();
|
||||
},
|
||||
checkRepeat: (name, basepath) => {
|
||||
return projectModel.count({
|
||||
project_name: name,
|
||||
}
|
||||
|
||||
|
||||
get(id){
|
||||
return this.model.findOne({
|
||||
_id: id
|
||||
}).exec()
|
||||
}
|
||||
|
||||
checkNameRepeat(name){
|
||||
return this.model.count({
|
||||
name: name
|
||||
})
|
||||
}
|
||||
|
||||
checkDomainRepeat(domain, basepath){
|
||||
return this.model.count({
|
||||
prd_host: domain,
|
||||
basepath: basepath
|
||||
})
|
||||
},
|
||||
list: () => {
|
||||
return projectModel.find().exec()
|
||||
},
|
||||
del: (id) => {
|
||||
return projectModel.deleteOne({
|
||||
}
|
||||
|
||||
|
||||
list (group_id){
|
||||
return this.model.find({
|
||||
group_id: group_id
|
||||
}).exec()
|
||||
}
|
||||
|
||||
del(id){
|
||||
return this.model.deleteOne({
|
||||
_id: id
|
||||
})
|
||||
},
|
||||
up: (id, data) => {
|
||||
}
|
||||
up(id, data){
|
||||
data.up_time = yapi.commons.time();
|
||||
return projectModel.update({
|
||||
return this.model.update({
|
||||
_id: id,
|
||||
}, data)
|
||||
}
|
||||
}
|
||||
|
||||
addMember(id, uid){
|
||||
return this.model.update({
|
||||
_id, id
|
||||
}, {
|
||||
$push: {members: uid}
|
||||
})
|
||||
}
|
||||
|
||||
delMember(id, uid){
|
||||
return this.model.update({
|
||||
_id: id
|
||||
}, {
|
||||
$pull: {members: uid}
|
||||
})
|
||||
}
|
||||
|
||||
checkMemberRepeat(id, uid){
|
||||
return this.model.count({
|
||||
_id: id,
|
||||
members:[uid]
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = projectModel;
|
@ -1,6 +1,8 @@
|
||||
import koaRouter from 'koa-router'
|
||||
import interfaceController from './controllers/interface.js'
|
||||
import groupController from './controllers/group.js'
|
||||
import yapi from './yapi.js'
|
||||
import projectController from './controllers/project.js'
|
||||
|
||||
const router = koaRouter();
|
||||
|
||||
@ -16,6 +18,10 @@ const INTERFACE_CONFIG = {
|
||||
group: {
|
||||
prefix: '/group/',
|
||||
controller: groupController
|
||||
},
|
||||
project: {
|
||||
prefix: '/project/',
|
||||
controller: projectController
|
||||
}
|
||||
};
|
||||
|
||||
@ -25,6 +31,12 @@ createAction('group', 'add', 'post', 'add')
|
||||
createAction('group', 'up', 'post', 'up')
|
||||
createAction('group', 'del', 'post', 'del')
|
||||
|
||||
//project
|
||||
createAction('project', 'add', 'post', 'add')
|
||||
createAction('project', 'list', 'get', 'list')
|
||||
createAction('project', 'get', 'get', 'get')
|
||||
createAction('project', 'up', 'post', 'up')
|
||||
createAction('project', 'del', 'post', 'del')
|
||||
|
||||
/**
|
||||
*
|
||||
@ -35,7 +47,7 @@ createAction('group', 'del', 'post', 'del')
|
||||
*/
|
||||
function createAction(controller, path, method, action){
|
||||
router[method](INTERFACE_CONFIG[controller].prefix + path, async (ctx) => {
|
||||
let inst = new INTERFACE_CONFIG[controller].controller(ctx);
|
||||
let inst = yapi.getInst(INTERFACE_CONFIG[controller].controller, ctx);
|
||||
await inst[action].call(inst, ctx);
|
||||
})
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"port": "3000",
|
||||
"db": {
|
||||
"servername": "localhost",
|
||||
"servername": "127.0.0.1",
|
||||
"DATABASE": "yapi",
|
||||
"port": 27017
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"port":"80",
|
||||
"db": {
|
||||
"servername": "localhost",
|
||||
"servername": "127.0.0.1",
|
||||
"DATABASE": "yapi",
|
||||
"port": "27017"
|
||||
}
|
||||
|
@ -31,6 +31,11 @@ var baseController = function () {
|
||||
value: function getLoginStatus() {
|
||||
return true;
|
||||
}
|
||||
}, {
|
||||
key: 'getRole',
|
||||
value: function getRole() {
|
||||
return 'admin';
|
||||
}
|
||||
}]);
|
||||
return baseController;
|
||||
}();
|
||||
|
@ -49,15 +49,39 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
||||
var groupController = function (_baseController) {
|
||||
(0, _inherits3.default)(groupController, _baseController);
|
||||
|
||||
function groupController() {
|
||||
function groupController(ctx) {
|
||||
(0, _classCallCheck3.default)(this, groupController);
|
||||
|
||||
var _this = (0, _possibleConstructorReturn3.default)(this, (groupController.__proto__ || (0, _getPrototypeOf2.default)(groupController)).call(this));
|
||||
var _this = (0, _possibleConstructorReturn3.default)(this, (groupController.__proto__ || (0, _getPrototypeOf2.default)(groupController)).call(this, ctx));
|
||||
|
||||
console.log('constructor....');
|
||||
return _this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加项目分组
|
||||
* @interface /group/add
|
||||
* @method POST
|
||||
* @category group
|
||||
* @foldnumber 10
|
||||
* @param {String} group_name 项目分组名称,不能为空
|
||||
* @param {String} [group_desc] 项目分组描述
|
||||
* @returns {Object}
|
||||
* @example
|
||||
* {
|
||||
* "errcode": 0,
|
||||
* "errmsg": 'success',
|
||||
* "data":{
|
||||
* "_id": 3,
|
||||
* "group_name": "大数据4",
|
||||
* "group_desc": "大数据4",
|
||||
* "uid": "0"
|
||||
* }
|
||||
* }
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
(0, _createClass3.default)(groupController, [{
|
||||
key: 'add',
|
||||
value: function () {
|
||||
@ -74,7 +98,7 @@ var groupController = function (_baseController) {
|
||||
break;
|
||||
}
|
||||
|
||||
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '组名不能为空'));
|
||||
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目分组名不能为空'));
|
||||
|
||||
case 3:
|
||||
groupInst = _yapi2.default.getInst(_group2.default);
|
||||
@ -89,7 +113,7 @@ var groupController = function (_baseController) {
|
||||
break;
|
||||
}
|
||||
|
||||
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 401, '组名已存在'));
|
||||
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 401, '项目分组名已存在'));
|
||||
|
||||
case 9:
|
||||
data = {
|
||||
@ -231,7 +255,7 @@ var groupController = function (_baseController) {
|
||||
ctx.request.body.group_name && (data.group_name = ctx.request.body.group_name);
|
||||
ctx.request.body.group_desc && (data.group_desc = ctx.request.body.group_desc);
|
||||
if ((0, _keys2.default)(data).length === 0) {
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 404, '分组名和分组描述都为空');
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 404, '分组名和分组描述不能为空');
|
||||
}
|
||||
_context4.next = 9;
|
||||
return groupInst.up(id, data);
|
||||
|
@ -12,6 +12,26 @@ var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
|
||||
|
||||
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
|
||||
|
||||
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
|
||||
|
||||
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
|
||||
|
||||
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
|
||||
|
||||
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
|
||||
|
||||
var _createClass2 = require('babel-runtime/helpers/createClass');
|
||||
|
||||
var _createClass3 = _interopRequireDefault(_createClass2);
|
||||
|
||||
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
|
||||
|
||||
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
|
||||
|
||||
var _inherits2 = require('babel-runtime/helpers/inherits');
|
||||
|
||||
var _inherits3 = _interopRequireDefault(_inherits2);
|
||||
|
||||
var _project = require('../models/project.js');
|
||||
|
||||
var _project2 = _interopRequireDefault(_project);
|
||||
@ -20,184 +40,598 @@ var _yapi = require('../yapi.js');
|
||||
|
||||
var _yapi2 = _interopRequireDefault(_yapi);
|
||||
|
||||
var _base = require('./base.js');
|
||||
|
||||
var _base2 = _interopRequireDefault(_base);
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
module.exports = {
|
||||
add: function add(ctx) {
|
||||
var _this = this;
|
||||
var projectController = function (_baseController) {
|
||||
(0, _inherits3.default)(projectController, _baseController);
|
||||
|
||||
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() {
|
||||
var params, checkRepeat, data, result;
|
||||
return _regenerator2.default.wrap(function _callee$(_context) {
|
||||
while (1) {
|
||||
switch (_context.prev = _context.next) {
|
||||
case 0:
|
||||
params = ctx.request.body;
|
||||
function projectController(ctx) {
|
||||
(0, _classCallCheck3.default)(this, projectController);
|
||||
|
||||
if (params.project_name) {
|
||||
_context.next = 3;
|
||||
break;
|
||||
}
|
||||
var _this = (0, _possibleConstructorReturn3.default)(this, (projectController.__proto__ || (0, _getPrototypeOf2.default)(projectController)).call(this, ctx));
|
||||
|
||||
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '组名不能为空'));
|
||||
|
||||
case 3:
|
||||
_context.next = 5;
|
||||
return _project2.default.checkRepeat(params.project_name);
|
||||
|
||||
case 5:
|
||||
checkRepeat = _context.sent;
|
||||
|
||||
if (!(checkRepeat > 0)) {
|
||||
_context.next = 8;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 401, '组名已存在'));
|
||||
|
||||
case 8:
|
||||
data = {
|
||||
project_name: params.project_name,
|
||||
project_desc: params.project_desc,
|
||||
uid: '0',
|
||||
add_time: _yapi2.default.commons.time(),
|
||||
up_time: _yapi2.default.commons.time()
|
||||
};
|
||||
_context.prev = 9;
|
||||
_context.next = 12;
|
||||
return _project2.default.save(data);
|
||||
|
||||
case 12:
|
||||
result = _context.sent;
|
||||
|
||||
result = _yapi2.default.commons.fieldSelect(result, ['_id', 'project_name', 'project_desc', 'uid']);
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context.next = 20;
|
||||
break;
|
||||
|
||||
case 17:
|
||||
_context.prev = 17;
|
||||
_context.t0 = _context['catch'](9);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, _context.t0.message);
|
||||
|
||||
case 20:
|
||||
case 'end':
|
||||
return _context.stop();
|
||||
}
|
||||
}
|
||||
}, _callee, _this, [[9, 17]]);
|
||||
}))();
|
||||
},
|
||||
list: function list(ctx) {
|
||||
var _this2 = this;
|
||||
|
||||
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2() {
|
||||
var result;
|
||||
return _regenerator2.default.wrap(function _callee2$(_context2) {
|
||||
while (1) {
|
||||
switch (_context2.prev = _context2.next) {
|
||||
case 0:
|
||||
_context2.prev = 0;
|
||||
_context2.next = 3;
|
||||
return _project2.default.list();
|
||||
|
||||
case 3:
|
||||
result = _context2.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context2.next = 10;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
_context2.prev = 7;
|
||||
_context2.t0 = _context2['catch'](0);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, e.message);
|
||||
|
||||
case 10:
|
||||
case 'end':
|
||||
return _context2.stop();
|
||||
}
|
||||
}
|
||||
}, _callee2, _this2, [[0, 7]]);
|
||||
}))();
|
||||
},
|
||||
del: function del(ctx) {
|
||||
var _this3 = this;
|
||||
|
||||
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3() {
|
||||
var id, result;
|
||||
return _regenerator2.default.wrap(function _callee3$(_context3) {
|
||||
while (1) {
|
||||
switch (_context3.prev = _context3.next) {
|
||||
case 0:
|
||||
_context3.prev = 0;
|
||||
id = ctx.request.body.id;
|
||||
_context3.next = 4;
|
||||
return _project2.default.del(id);
|
||||
|
||||
case 4:
|
||||
result = _context3.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context3.next = 11;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
_context3.prev = 8;
|
||||
_context3.t0 = _context3['catch'](0);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, e.message);
|
||||
|
||||
case 11:
|
||||
case 'end':
|
||||
return _context3.stop();
|
||||
}
|
||||
}
|
||||
}, _callee3, _this3, [[0, 8]]);
|
||||
}))();
|
||||
},
|
||||
up: function up(ctx) {
|
||||
var _this4 = this;
|
||||
|
||||
return (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4() {
|
||||
var id, data, result;
|
||||
return _regenerator2.default.wrap(function _callee4$(_context4) {
|
||||
while (1) {
|
||||
switch (_context4.prev = _context4.next) {
|
||||
case 0:
|
||||
_context4.prev = 0;
|
||||
id = ctx.request.body.id;
|
||||
data = {};
|
||||
|
||||
ctx.request.body.project_name && (data.project_name = ctx.request.body.project_name);
|
||||
ctx.request.body.project_desc && (data.project_desc = ctx.request.body.project_desc);
|
||||
if ((0, _keys2.default)(data).length === 0) {
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 404, '分组名和分组描述都为空');
|
||||
}
|
||||
_context4.next = 8;
|
||||
return _project2.default.up(id, data);
|
||||
|
||||
case 8:
|
||||
result = _context4.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context4.next = 15;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
_context4.prev = 12;
|
||||
_context4.t0 = _context4['catch'](0);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, e.message);
|
||||
|
||||
case 15:
|
||||
case 'end':
|
||||
return _context4.stop();
|
||||
}
|
||||
}
|
||||
}, _callee4, _this4, [[0, 12]]);
|
||||
}))();
|
||||
_this.Model = _yapi2.default.getInst(_project2.default);
|
||||
return _this;
|
||||
}
|
||||
};
|
||||
|
||||
(0, _createClass3.default)(projectController, [{
|
||||
key: 'jungeProjectAuth',
|
||||
value: function () {
|
||||
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(id) {
|
||||
var result;
|
||||
return _regenerator2.default.wrap(function _callee$(_context) {
|
||||
while (1) {
|
||||
switch (_context.prev = _context.next) {
|
||||
case 0:
|
||||
if (!(this.getRole() === 'admin')) {
|
||||
_context.next = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context.abrupt('return', true);
|
||||
|
||||
case 2:
|
||||
if (id) {
|
||||
_context.next = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context.abrupt('return', false);
|
||||
|
||||
case 4:
|
||||
_context.next = 6;
|
||||
return this.Model.get(params.id);
|
||||
|
||||
case 6:
|
||||
result = _context.sent;
|
||||
|
||||
if (!(result.uid === this.getUid())) {
|
||||
_context.next = 9;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context.abrupt('return', true);
|
||||
|
||||
case 9:
|
||||
return _context.abrupt('return', false);
|
||||
|
||||
case 10:
|
||||
case 'end':
|
||||
return _context.stop();
|
||||
}
|
||||
}
|
||||
}, _callee, this);
|
||||
}));
|
||||
|
||||
function jungeProjectAuth(_x) {
|
||||
return _ref.apply(this, arguments);
|
||||
}
|
||||
|
||||
return jungeProjectAuth;
|
||||
}()
|
||||
}, {
|
||||
key: 'jungeMemberAuth',
|
||||
value: function () {
|
||||
var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(id, member_uid) {
|
||||
var result;
|
||||
return _regenerator2.default.wrap(function _callee2$(_context2) {
|
||||
while (1) {
|
||||
switch (_context2.prev = _context2.next) {
|
||||
case 0:
|
||||
if (!(this.getRole() === 'admin')) {
|
||||
_context2.next = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context2.abrupt('return', true);
|
||||
|
||||
case 2:
|
||||
if (!(!id || !member_uid)) {
|
||||
_context2.next = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context2.abrupt('return', false);
|
||||
|
||||
case 4:
|
||||
_context2.next = 6;
|
||||
return this.Model.checkMemberRepeat(params.id, member_uid);
|
||||
|
||||
case 6:
|
||||
result = _context2.sent;
|
||||
|
||||
if (!(result > 0)) {
|
||||
_context2.next = 9;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context2.abrupt('return', true);
|
||||
|
||||
case 9:
|
||||
return _context2.abrupt('return', false);
|
||||
|
||||
case 10:
|
||||
case 'end':
|
||||
return _context2.stop();
|
||||
}
|
||||
}
|
||||
}, _callee2, this);
|
||||
}));
|
||||
|
||||
function jungeMemberAuth(_x2, _x3) {
|
||||
return _ref2.apply(this, arguments);
|
||||
}
|
||||
|
||||
return jungeMemberAuth;
|
||||
}()
|
||||
}, {
|
||||
key: 'add',
|
||||
value: function () {
|
||||
var _ref3 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3(ctx) {
|
||||
var params, checkRepeat, checkRepeatDomain, data, result;
|
||||
return _regenerator2.default.wrap(function _callee3$(_context3) {
|
||||
while (1) {
|
||||
switch (_context3.prev = _context3.next) {
|
||||
case 0:
|
||||
params = ctx.request.body;
|
||||
|
||||
if (params.group_id) {
|
||||
_context3.next = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目分组id不能为空'));
|
||||
|
||||
case 3:
|
||||
if (params.name) {
|
||||
_context3.next = 5;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目名不能为空'));
|
||||
|
||||
case 5:
|
||||
_context3.next = 7;
|
||||
return this.Model.checkNameRepeat(params.name);
|
||||
|
||||
case 7:
|
||||
checkRepeat = _context3.sent;
|
||||
|
||||
if (!(checkRepeat > 0)) {
|
||||
_context3.next = 10;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 401, '已存在的项目名'));
|
||||
|
||||
case 10:
|
||||
if (params.basepath) {
|
||||
_context3.next = 12;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目basepath不能为空'));
|
||||
|
||||
case 12:
|
||||
if (params.prd_host) {
|
||||
_context3.next = 14;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目domain不能为空'));
|
||||
|
||||
case 14:
|
||||
_context3.next = 16;
|
||||
return this.Model.checkDomainRepeat(params.prd_host, params.basepath);
|
||||
|
||||
case 16:
|
||||
checkRepeatDomain = _context3.sent;
|
||||
|
||||
if (!(checkRepeatDomain > 0)) {
|
||||
_context3.next = 19;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 401, '已存在domain和basepath'));
|
||||
|
||||
case 19:
|
||||
data = {
|
||||
name: params.name,
|
||||
desc: params.desc,
|
||||
prd_host: params.prd_host,
|
||||
basepath: params.basepath,
|
||||
members: [this.getUid()],
|
||||
uid: this.getUid(),
|
||||
group_id: params.group_id,
|
||||
add_time: _yapi2.default.commons.time(),
|
||||
up_time: _yapi2.default.commons.time()
|
||||
};
|
||||
_context3.prev = 20;
|
||||
_context3.next = 23;
|
||||
return this.Model.save(data);
|
||||
|
||||
case 23:
|
||||
result = _context3.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context3.next = 30;
|
||||
break;
|
||||
|
||||
case 27:
|
||||
_context3.prev = 27;
|
||||
_context3.t0 = _context3['catch'](20);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, _context3.t0.message);
|
||||
|
||||
case 30:
|
||||
case 'end':
|
||||
return _context3.stop();
|
||||
}
|
||||
}
|
||||
}, _callee3, this, [[20, 27]]);
|
||||
}));
|
||||
|
||||
function add(_x4) {
|
||||
return _ref3.apply(this, arguments);
|
||||
}
|
||||
|
||||
return add;
|
||||
}()
|
||||
}, {
|
||||
key: 'addMember',
|
||||
value: function () {
|
||||
var _ref4 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4(ctx) {
|
||||
var params, check, result;
|
||||
return _regenerator2.default.wrap(function _callee4$(_context4) {
|
||||
while (1) {
|
||||
switch (_context4.prev = _context4.next) {
|
||||
case 0:
|
||||
params = ctx.request.body;
|
||||
|
||||
if (params.member_uid) {
|
||||
_context4.next = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context4.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目成员uid不能为空'));
|
||||
|
||||
case 3:
|
||||
if (params.id) {
|
||||
_context4.next = 5;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context4.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目id不能为空'));
|
||||
|
||||
case 5:
|
||||
_context4.next = 7;
|
||||
return this.Model.checkMemberRepeat(params.id, params.member_uid);
|
||||
|
||||
case 7:
|
||||
check = _context4.sent;
|
||||
|
||||
if (!(check > 0)) {
|
||||
_context4.next = 10;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context4.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目成员已存在'));
|
||||
|
||||
case 10:
|
||||
_context4.prev = 10;
|
||||
_context4.next = 13;
|
||||
return this.Model.addMember(params.id, params.member_uid);
|
||||
|
||||
case 13:
|
||||
result = _context4.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context4.next = 20;
|
||||
break;
|
||||
|
||||
case 17:
|
||||
_context4.prev = 17;
|
||||
_context4.t0 = _context4['catch'](10);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, _context4.t0.message);
|
||||
|
||||
case 20:
|
||||
case 'end':
|
||||
return _context4.stop();
|
||||
}
|
||||
}
|
||||
}, _callee4, this, [[10, 17]]);
|
||||
}));
|
||||
|
||||
function addMember(_x5) {
|
||||
return _ref4.apply(this, arguments);
|
||||
}
|
||||
|
||||
return addMember;
|
||||
}()
|
||||
}, {
|
||||
key: 'delMember',
|
||||
value: function () {
|
||||
var _ref5 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee5(ctx) {
|
||||
var params, check, result;
|
||||
return _regenerator2.default.wrap(function _callee5$(_context5) {
|
||||
while (1) {
|
||||
switch (_context5.prev = _context5.next) {
|
||||
case 0:
|
||||
params = ctx.request.body;
|
||||
|
||||
if (params.member_uid) {
|
||||
_context5.next = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context5.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目成员uid不能为空'));
|
||||
|
||||
case 3:
|
||||
if (params.id) {
|
||||
_context5.next = 5;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context5.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目id不能为空'));
|
||||
|
||||
case 5:
|
||||
_context5.next = 7;
|
||||
return this.Model.checkMemberRepeat(params.id, params.member_uid);
|
||||
|
||||
case 7:
|
||||
check = _context5.sent;
|
||||
|
||||
if (!(check === 0)) {
|
||||
_context5.next = 10;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context5.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目成员不存在'));
|
||||
|
||||
case 10:
|
||||
_context5.prev = 10;
|
||||
_context5.next = 13;
|
||||
return this.Model.delMember(params.id, params.member_uid);
|
||||
|
||||
case 13:
|
||||
result = _context5.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context5.next = 20;
|
||||
break;
|
||||
|
||||
case 17:
|
||||
_context5.prev = 17;
|
||||
_context5.t0 = _context5['catch'](10);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, _context5.t0.message);
|
||||
|
||||
case 20:
|
||||
case 'end':
|
||||
return _context5.stop();
|
||||
}
|
||||
}
|
||||
}, _callee5, this, [[10, 17]]);
|
||||
}));
|
||||
|
||||
function delMember(_x6) {
|
||||
return _ref5.apply(this, arguments);
|
||||
}
|
||||
|
||||
return delMember;
|
||||
}()
|
||||
}, {
|
||||
key: 'get',
|
||||
value: function () {
|
||||
var _ref6 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee6(ctx) {
|
||||
var params, result;
|
||||
return _regenerator2.default.wrap(function _callee6$(_context6) {
|
||||
while (1) {
|
||||
switch (_context6.prev = _context6.next) {
|
||||
case 0:
|
||||
params = ctx.request.query;
|
||||
|
||||
if (params.id) {
|
||||
_context6.next = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context6.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目id不能为空'));
|
||||
|
||||
case 3:
|
||||
_context6.prev = 3;
|
||||
_context6.next = 6;
|
||||
return this.Model.get(params.id);
|
||||
|
||||
case 6:
|
||||
result = _context6.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context6.next = 13;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
_context6.prev = 10;
|
||||
_context6.t0 = _context6['catch'](3);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, _context6.t0.message);
|
||||
|
||||
case 13:
|
||||
case 'end':
|
||||
return _context6.stop();
|
||||
}
|
||||
}
|
||||
}, _callee6, this, [[3, 10]]);
|
||||
}));
|
||||
|
||||
function get(_x7) {
|
||||
return _ref6.apply(this, arguments);
|
||||
}
|
||||
|
||||
return get;
|
||||
}()
|
||||
}, {
|
||||
key: 'list',
|
||||
value: function () {
|
||||
var _ref7 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee7(ctx) {
|
||||
var result;
|
||||
return _regenerator2.default.wrap(function _callee7$(_context7) {
|
||||
while (1) {
|
||||
switch (_context7.prev = _context7.next) {
|
||||
case 0:
|
||||
if (ctx.request.query.group_id) {
|
||||
_context7.next = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context7.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目分组id不能为空'));
|
||||
|
||||
case 2:
|
||||
_context7.prev = 2;
|
||||
_context7.next = 5;
|
||||
return this.Model.list();
|
||||
|
||||
case 5:
|
||||
result = _context7.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context7.next = 12;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
_context7.prev = 9;
|
||||
_context7.t0 = _context7['catch'](2);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, e.message);
|
||||
|
||||
case 12:
|
||||
case 'end':
|
||||
return _context7.stop();
|
||||
}
|
||||
}
|
||||
}, _callee7, this, [[2, 9]]);
|
||||
}));
|
||||
|
||||
function list(_x8) {
|
||||
return _ref7.apply(this, arguments);
|
||||
}
|
||||
|
||||
return list;
|
||||
}()
|
||||
}, {
|
||||
key: 'del',
|
||||
value: function () {
|
||||
var _ref8 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee8(ctx) {
|
||||
var id, result;
|
||||
return _regenerator2.default.wrap(function _callee8$(_context8) {
|
||||
while (1) {
|
||||
switch (_context8.prev = _context8.next) {
|
||||
case 0:
|
||||
_context8.prev = 0;
|
||||
id = ctx.request.body.id;
|
||||
|
||||
if (!(this.jungeProjectAuth(id) !== true)) {
|
||||
_context8.next = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context8.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 405, '没有权限'));
|
||||
|
||||
case 4:
|
||||
_context8.next = 6;
|
||||
return this.Model.del(id);
|
||||
|
||||
case 6:
|
||||
result = _context8.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context8.next = 13;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
_context8.prev = 10;
|
||||
_context8.t0 = _context8['catch'](0);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, e.message);
|
||||
|
||||
case 13:
|
||||
case 'end':
|
||||
return _context8.stop();
|
||||
}
|
||||
}
|
||||
}, _callee8, this, [[0, 10]]);
|
||||
}));
|
||||
|
||||
function del(_x9) {
|
||||
return _ref8.apply(this, arguments);
|
||||
}
|
||||
|
||||
return del;
|
||||
}()
|
||||
}, {
|
||||
key: 'up',
|
||||
value: function () {
|
||||
var _ref9 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee9(ctx) {
|
||||
var id, data, result;
|
||||
return _regenerator2.default.wrap(function _callee9$(_context9) {
|
||||
while (1) {
|
||||
switch (_context9.prev = _context9.next) {
|
||||
case 0:
|
||||
_context9.prev = 0;
|
||||
id = ctx.request.body.id;
|
||||
|
||||
if (!(this.jungeMemberAuth(id, this.getUid()) !== true)) {
|
||||
_context9.next = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context9.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 405, '没有权限'));
|
||||
|
||||
case 4:
|
||||
data = {};
|
||||
|
||||
ctx.request.body.project_name && (data.project_name = ctx.request.body.project_name);
|
||||
ctx.request.body.project_desc && (data.project_desc = ctx.request.body.project_desc);
|
||||
if ((0, _keys2.default)(data).length === 0) {
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 404, '分组名和分组描述都为空');
|
||||
}
|
||||
_context9.next = 10;
|
||||
return this.Model.up(id, data);
|
||||
|
||||
case 10:
|
||||
result = _context9.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context9.next = 17;
|
||||
break;
|
||||
|
||||
case 14:
|
||||
_context9.prev = 14;
|
||||
_context9.t0 = _context9['catch'](0);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, e.message);
|
||||
|
||||
case 17:
|
||||
case 'end':
|
||||
return _context9.stop();
|
||||
}
|
||||
}
|
||||
}, _callee9, this, [[0, 14]]);
|
||||
}));
|
||||
|
||||
function up(_x10) {
|
||||
return _ref9.apply(this, arguments);
|
||||
}
|
||||
|
||||
return up;
|
||||
}()
|
||||
}]);
|
||||
return projectController;
|
||||
}(_base2.default);
|
||||
|
||||
module.exports = projectController;
|
@ -51,7 +51,7 @@ var groupModel = function (_baseModel) {
|
||||
key: 'getSchema',
|
||||
value: function getSchema() {
|
||||
return {
|
||||
uid: String,
|
||||
uid: Number,
|
||||
group_name: String,
|
||||
group_desc: String,
|
||||
add_time: Number,
|
||||
|
@ -1,49 +1,142 @@
|
||||
'use strict';
|
||||
|
||||
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
|
||||
|
||||
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
|
||||
|
||||
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
|
||||
|
||||
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
|
||||
|
||||
var _createClass2 = require('babel-runtime/helpers/createClass');
|
||||
|
||||
var _createClass3 = _interopRequireDefault(_createClass2);
|
||||
|
||||
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
|
||||
|
||||
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
|
||||
|
||||
var _inherits2 = require('babel-runtime/helpers/inherits');
|
||||
|
||||
var _inherits3 = _interopRequireDefault(_inherits2);
|
||||
|
||||
var _yapi = require('../yapi.js');
|
||||
|
||||
var _yapi2 = _interopRequireDefault(_yapi);
|
||||
|
||||
var _base = require('./base.js');
|
||||
|
||||
var _base2 = _interopRequireDefault(_base);
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
var projectSchema = {
|
||||
uid: Number,
|
||||
name: String,
|
||||
basepath: String,
|
||||
desc: String,
|
||||
group_id: Number,
|
||||
members: Array,
|
||||
prd_host: String,
|
||||
env: Object,
|
||||
add_time: Number,
|
||||
up_time: Number
|
||||
};
|
||||
var projectModel = function (_baseModel) {
|
||||
(0, _inherits3.default)(projectModel, _baseModel);
|
||||
|
||||
var projectModel = _yapi2.default.db('project', projectSchema);
|
||||
|
||||
module.exports = {
|
||||
save: function save(data) {
|
||||
var m = new projectModel(data);
|
||||
return m.save();
|
||||
},
|
||||
checkRepeat: function checkRepeat(name, basepath) {
|
||||
return projectModel.count({
|
||||
project_name: name,
|
||||
basepath: basepath
|
||||
});
|
||||
},
|
||||
list: function list() {
|
||||
return projectModel.find().exec();
|
||||
},
|
||||
del: function del(id) {
|
||||
return projectModel.deleteOne({
|
||||
_id: id
|
||||
});
|
||||
},
|
||||
up: function up(id, data) {
|
||||
data.up_time = _yapi2.default.commons.time();
|
||||
return projectModel.update({
|
||||
_id: id
|
||||
}, data);
|
||||
function projectModel() {
|
||||
(0, _classCallCheck3.default)(this, projectModel);
|
||||
return (0, _possibleConstructorReturn3.default)(this, (projectModel.__proto__ || (0, _getPrototypeOf2.default)(projectModel)).apply(this, arguments));
|
||||
}
|
||||
};
|
||||
|
||||
(0, _createClass3.default)(projectModel, [{
|
||||
key: 'getName',
|
||||
value: function getName() {
|
||||
return 'project';
|
||||
}
|
||||
}, {
|
||||
key: 'getSchema',
|
||||
value: function getSchema() {
|
||||
return {
|
||||
uid: { type: Number, required: true },
|
||||
name: { type: String, required: true },
|
||||
basepath: { type: String, required: true },
|
||||
desc: String,
|
||||
group_id: { type: Number, required: true },
|
||||
members: Array,
|
||||
prd_host: { type: String, required: true },
|
||||
env: Array,
|
||||
add_time: Number,
|
||||
up_time: Number
|
||||
};
|
||||
}
|
||||
}, {
|
||||
key: 'save',
|
||||
value: function save(data) {
|
||||
var m = new this.model(data);
|
||||
return m.save();
|
||||
}
|
||||
}, {
|
||||
key: 'get',
|
||||
value: function get(id) {
|
||||
return this.model.findOne({
|
||||
_id: id
|
||||
}).exec();
|
||||
}
|
||||
}, {
|
||||
key: 'checkNameRepeat',
|
||||
value: function checkNameRepeat(name) {
|
||||
return this.model.count({
|
||||
name: name
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: 'checkDomainRepeat',
|
||||
value: function checkDomainRepeat(domain, basepath) {
|
||||
return this.model.count({
|
||||
prd_host: domain,
|
||||
basepath: basepath
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: 'list',
|
||||
value: function list(group_id) {
|
||||
return this.model.find({
|
||||
group_id: group_id
|
||||
}).exec();
|
||||
}
|
||||
}, {
|
||||
key: 'del',
|
||||
value: function del(id) {
|
||||
return this.model.deleteOne({
|
||||
_id: id
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: 'up',
|
||||
value: function up(id, data) {
|
||||
data.up_time = _yapi2.default.commons.time();
|
||||
return this.model.update({
|
||||
_id: id
|
||||
}, data);
|
||||
}
|
||||
}, {
|
||||
key: 'addMember',
|
||||
value: function addMember(id, uid) {
|
||||
return this.model.update({
|
||||
_id: _id, id: id
|
||||
}, {
|
||||
$push: { members: uid }
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: 'delMember',
|
||||
value: function delMember(id, uid) {
|
||||
return this.model.update({
|
||||
_id: id
|
||||
}, {
|
||||
$pull: { members: uid }
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: 'checkMemberRepeat',
|
||||
value: function checkMemberRepeat(id, uid) {
|
||||
return this.model.count({
|
||||
_id: id,
|
||||
members: [uid]
|
||||
});
|
||||
}
|
||||
}]);
|
||||
return projectModel;
|
||||
}(_base2.default);
|
||||
|
||||
module.exports = projectModel;
|
@ -20,6 +20,14 @@ var _group = require('./controllers/group.js');
|
||||
|
||||
var _group2 = _interopRequireDefault(_group);
|
||||
|
||||
var _yapi = require('./yapi.js');
|
||||
|
||||
var _yapi2 = _interopRequireDefault(_yapi);
|
||||
|
||||
var _project = require('./controllers/project.js');
|
||||
|
||||
var _project2 = _interopRequireDefault(_project);
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
var router = (0, _koaRouter2.default)();
|
||||
@ -36,6 +44,10 @@ var INTERFACE_CONFIG = {
|
||||
group: {
|
||||
prefix: '/group/',
|
||||
controller: _group2.default
|
||||
},
|
||||
project: {
|
||||
prefix: '/project/',
|
||||
controller: _project2.default
|
||||
}
|
||||
};
|
||||
|
||||
@ -45,6 +57,13 @@ createAction('group', 'add', 'post', 'add');
|
||||
createAction('group', 'up', 'post', 'up');
|
||||
createAction('group', 'del', 'post', 'del');
|
||||
|
||||
//project
|
||||
createAction('project', 'add', 'post', 'add');
|
||||
createAction('project', 'list', 'get', 'list');
|
||||
createAction('project', 'get', 'get', 'get');
|
||||
createAction('project', 'up', 'post', 'up');
|
||||
createAction('project', 'del', 'post', 'del');
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {*} controller controller_name
|
||||
@ -62,7 +81,7 @@ function createAction(controller, path, method, action) {
|
||||
while (1) {
|
||||
switch (_context.prev = _context.next) {
|
||||
case 0:
|
||||
inst = new INTERFACE_CONFIG[controller].controller(ctx);
|
||||
inst = _yapi2.default.getInst(INTERFACE_CONFIG[controller].controller, ctx);
|
||||
_context.next = 3;
|
||||
return inst[action].call(inst, ctx);
|
||||
|
||||
|
39
ydoc.json
Normal file
39
ydoc.json
Normal file
@ -0,0 +1,39 @@
|
||||
{
|
||||
"name": "yapi",
|
||||
"dest": "doc/build",
|
||||
"examplePath": "./exampleCode",
|
||||
"defaultGrammar": "json",
|
||||
"instructionsInfoPath": "", //使用说明 内容路径 (需要配合JS-Component注释的@instructions使用)
|
||||
"instructionsUrlPath": "", //使用说明demo路径 (需要配合JS-Component注释的@instructions使用)
|
||||
"common": { // 通用默认配置,包括主页配置等
|
||||
"title": "yapi", //page title
|
||||
"footer": "© 2016 <a href=\"http://ued.qunar.com/ymfe/\">YMFE</a> Team. Build by <a href=\"http://ued.qunar.com/ydoc/\">ydoc</a>.", // 通用尾
|
||||
"home": "YMFE", // logo
|
||||
"homeUrl": "http://ued.qunar.com/ymfe/" // logourl
|
||||
},
|
||||
"options": {
|
||||
"foldcode": true
|
||||
},
|
||||
"pages": [{
|
||||
"name": "index", // Page Name 会根据他生成 html 文件,例: index.html
|
||||
"title": "首页", // Page Title
|
||||
"banner": { // Banner 配置
|
||||
"title": "index",
|
||||
"description": "首页说明文字"
|
||||
},
|
||||
"content": "./README.md" // 内容(这里以markdown文件举例)
|
||||
},{
|
||||
"name": "api",
|
||||
"title": "api文档",
|
||||
"banner": {
|
||||
"title": "api",
|
||||
"description": "api文档"
|
||||
},
|
||||
"content": "./server/controllers/*.js",
|
||||
"options": {
|
||||
"type": "interface", // 类型,可选 component 和 lib,默认 component
|
||||
"source": true, // 是否生成源文件预览,默认 false
|
||||
"categories":["group"]
|
||||
}
|
||||
}]
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user