路径参数:
diff --git a/client/containers/Project/Interface/InterfaceList/View.scss b/client/containers/Project/Interface/InterfaceList/View.scss
index cb029284..034cd390 100755
--- a/client/containers/Project/Interface/InterfaceList/View.scss
+++ b/client/containers/Project/Interface/InterfaceList/View.scss
@@ -21,7 +21,7 @@
margin: 0px;
.colKey{
padding-bottom: 0px;
-
+
}
}
.ace_print-margin{
@@ -37,12 +37,19 @@
}
}
.colBody{
- .ant-table-row{
- span{
- i{
- margin-right: 4px;
- }
- }
+ .query-icon {
+ display: inline-block;
+ width: .12rem;
+ margin-right: 4px;
+ position: relative;
+ &.text:after {
+ content: 'T';
+ display: block;
+ position: absolute;
+ right: 2px;
+ bottom: -2px;
+ transform: scale(.7);
+ }
}
}
.colDesc{
@@ -108,4 +115,4 @@
// margin-left: 50px;
// overflow:visible;
// }
-}
\ No newline at end of file
+}
diff --git a/client/containers/Project/Interface/interface.scss b/client/containers/Project/Interface/interface.scss
index 5b93f045..5ee7b73e 100755
--- a/client/containers/Project/Interface/interface.scss
+++ b/client/containers/Project/Interface/interface.scss
@@ -42,13 +42,23 @@
height: 40px;
line-height: 31px;
}
-
+ .ant-input {
+ width: 100%;
+ }
.interface-filter{
+ padding-top:7px;
padding-left: 10px;
+ padding-right: 50px;
height:45px;
line-height: 32px;
- padding-top:7px;
- background-color: #efefef
+ background-color: #efefef;
+ position: relative;
+ }
+ .btn-filter {
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
}
.interface-list{
.cat_switch_hidden{
@@ -56,7 +66,7 @@
visibility: hidden;
}
}
-
+
a{
color: #333
@@ -71,7 +81,6 @@
}
.interface-item{
display: inline-block;
- width: 180px;
overflow: hidden;
top: 0px;
line-height: 100%;
@@ -94,7 +103,7 @@
}
}
}
-
+
.right-content{
margin:3px;
min-height: 5rem;
diff --git a/client/containers/Project/Setting/ProjectMember/ProjectMember.js b/client/containers/Project/Setting/ProjectMember/ProjectMember.js
index 92ed6053..663133cc 100755
--- a/client/containers/Project/Setting/ProjectMember/ProjectMember.js
+++ b/client/containers/Project/Setting/ProjectMember/ProjectMember.js
@@ -162,7 +162,7 @@ class ProjectMember extends Component {
render () {
const columns = [{
- title: ' 项目成员 ('+this.state.projectMemberList.length + ') 人',
+ title: this.props.projectMsg.name + ' 项目成员 ('+this.state.projectMemberList.length + ') 人',
dataIndex: 'username',
key: 'username',
render: (text, record) => {
diff --git a/client/containers/Project/Setting/ProjectMessage/ProjectMessage.js b/client/containers/Project/Setting/ProjectMessage/ProjectMessage.js
index ac940a45..b1551f79 100755
--- a/client/containers/Project/Setting/ProjectMessage/ProjectMessage.js
+++ b/client/containers/Project/Setting/ProjectMessage/ProjectMessage.js
@@ -231,14 +231,14 @@ class ProjectMessage extends Component {
validator(rule, value, callback) {
if (value) {
if (value.length === 0) {
- callback('请输入环境域名');
+ callback('请输入环境名称');
} else if (!/\S/.test(value)) {
- callback('请输入环境域名');
+ callback('请输入环境名称');
} else {
return callback();
}
} else {
- callback('请输入环境域名');
+ callback('请输入环境名称');
}
}
}]
@@ -266,8 +266,6 @@ class ProjectMessage extends Component {
callback('请输入环境域名!');
} else if (/\s/.test(value)) {
callback('环境域名不允许出现空格!');
- } else if (/\//.test(value)) {
- callback('环境域名不允许出现‘\/’!');
} else {
return callback();
}
@@ -328,7 +326,7 @@ class ProjectMessage extends Component {
{this.state.currGroup + ' / ' + projectMsg.name}
-
{projectMsg.desc}
+ {/*
{projectMsg.desc}
*/}
@@ -403,10 +401,10 @@ class ProjectMessage extends Component {
{getFieldDecorator('desc', {
initialValue: initFormValues.desc,
rules: [{
- required: false, message: '描述不超过100字!', max: 100
+ required: false
}]
})(
-
+
)}
diff --git a/client/index.js b/client/index.js
index 8a76bdb5..43af5e06 100755
--- a/client/index.js
+++ b/client/index.js
@@ -5,6 +5,7 @@ import App from './Application'
import { Provider } from 'react-redux'
import createStore from './reducer/create';
import './styles/theme.less'
+import './styles/common.scss';
const store = createStore();
if (process.env.NODE_ENV === 'production') {
ReactDOM.render(
diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
index 939b4638..e401890d 100755
--- a/npm-shrinkwrap.json
+++ b/npm-shrinkwrap.json
@@ -240,7 +240,7 @@
},
"are-we-there-yet": {
"version": "1.1.4",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
"integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
"requires": {
"delegates": "1.0.0",
@@ -428,7 +428,7 @@
},
"async-foreach": {
"version": "0.1.3",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/async-foreach/-/async-foreach-0.1.3.tgz",
+ "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
"integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI="
},
"async-validator": {
@@ -1664,7 +1664,7 @@
},
"block-stream": {
"version": "0.0.9",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/block-stream/-/block-stream-0.0.9.tgz",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
"integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
"requires": {
"inherits": "2.0.3"
@@ -2168,7 +2168,7 @@
},
"cli-source-preview": {
"version": "1.1.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/cli-source-preview/-/cli-source-preview-1.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/cli-source-preview/-/cli-source-preview-1.1.0.tgz",
"integrity": "sha1-BTA6sSeakJPq0aODez7iMfMAZUQ=",
"requires": {
"chalk": "1.1.3"
@@ -2176,7 +2176,7 @@
"dependencies": {
"chalk": {
"version": "1.1.3",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"requires": {
"ansi-styles": "2.2.1",
@@ -2492,7 +2492,7 @@
},
"console-control-strings": {
"version": "1.1.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
},
"consolidate": {
@@ -2707,7 +2707,7 @@
},
"cross-spawn": {
"version": "3.0.1",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/cross-spawn/-/cross-spawn-3.0.1.tgz",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
"integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
"requires": {
"lru-cache": "4.1.1",
@@ -4495,7 +4495,7 @@
},
"fs-promise": {
"version": "0.5.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/fs-promise/-/fs-promise-0.5.0.tgz",
+ "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-0.5.0.tgz",
"integrity": "sha1-Q0fWv2JGVacGGkMZITw5MnatPvM=",
"requires": {
"any-promise": "1.3.0",
@@ -4506,7 +4506,7 @@
"dependencies": {
"fs-extra": {
"version": "0.26.7",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/fs-extra/-/fs-extra-0.26.7.tgz",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz",
"integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=",
"requires": {
"graceful-fs": "4.1.11",
@@ -5428,7 +5428,7 @@
},
"fstream": {
"version": "1.0.11",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/fstream/-/fstream-1.0.11.tgz",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
"integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
"requires": {
"graceful-fs": "4.1.11",
@@ -5444,7 +5444,7 @@
},
"gauge": {
"version": "2.7.4",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/gauge/-/gauge-2.7.4.tgz",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"requires": {
"aproba": "1.1.2",
@@ -6111,7 +6111,7 @@
},
"has-unicode": {
"version": "2.0.1",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/has-unicode/-/has-unicode-2.0.1.tgz",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
},
"hash-base": {
@@ -6464,7 +6464,7 @@
},
"in-publish": {
"version": "2.0.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/in-publish/-/in-publish-2.0.0.tgz",
+ "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
"integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E="
},
"indent-string": {
@@ -8190,7 +8190,7 @@
},
"lodash.clonedeep": {
"version": "4.5.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
},
"lodash.cond": {
@@ -8312,7 +8312,7 @@
},
"lodash.mergewith": {
"version": "4.6.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz",
"integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU="
},
"lodash.once": {
@@ -8948,7 +8948,7 @@
},
"node-gyp": {
"version": "3.6.2",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/node-gyp/-/node-gyp-3.6.2.tgz",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz",
"integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=",
"requires": {
"fstream": "1.0.11",
@@ -8968,7 +8968,7 @@
"dependencies": {
"semver": {
"version": "5.3.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/semver/-/semver-5.3.0.tgz",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
"integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
}
}
@@ -9028,7 +9028,7 @@
},
"node-sass-china": {
"version": "4.5.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/node-sass-china/-/node-sass-china-4.5.0.tgz",
+ "resolved": "https://registry.npmjs.org/node-sass-china/-/node-sass-china-4.5.0.tgz",
"integrity": "sha1-YnbBcNzqWBz14lwC/sqjUPcyx1Q=",
"requires": {
"async-foreach": "0.1.3",
@@ -9053,7 +9053,7 @@
"dependencies": {
"chalk": {
"version": "1.1.3",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"requires": {
"ansi-styles": "2.2.1",
@@ -9065,7 +9065,7 @@
},
"gaze": {
"version": "1.1.2",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/gaze/-/gaze-1.1.2.tgz",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz",
"integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=",
"requires": {
"globule": "1.2.0"
@@ -9073,7 +9073,7 @@
},
"globule": {
"version": "1.2.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/globule/-/globule-1.2.0.tgz",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz",
"integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=",
"requires": {
"glob": "7.1.2",
@@ -9083,7 +9083,7 @@
},
"lodash.assign": {
"version": "4.2.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
}
}
@@ -9240,7 +9240,7 @@
},
"nopt": {
"version": "3.0.6",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/nopt/-/nopt-3.0.6.tgz",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
"integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
"requires": {
"abbrev": "1.1.0"
@@ -12785,7 +12785,7 @@
},
"sass-graph": {
"version": "2.2.4",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/sass-graph/-/sass-graph-2.2.4.tgz",
+ "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
"integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
"requires": {
"glob": "7.1.2",
@@ -12827,7 +12827,7 @@
},
"scss-tokenizer": {
"version": "0.2.3",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+ "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
"integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
"requires": {
"js-base64": "2.1.9",
@@ -12836,7 +12836,7 @@
"dependencies": {
"source-map": {
"version": "0.4.4",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/source-map/-/source-map-0.4.4.tgz",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
"requires": {
"amdefine": "1.0.1"
@@ -13244,7 +13244,7 @@
},
"stdout-stream": {
"version": "1.4.0",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/stdout-stream/-/stdout-stream-1.4.0.tgz",
+ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz",
"integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=",
"requires": {
"readable-stream": "2.3.3"
@@ -13651,7 +13651,7 @@
},
"tar": {
"version": "2.2.1",
- "resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/tar/-/tar-2.2.1.tgz",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
"integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
"requires": {
"block-stream": "0.0.9",
@@ -14436,6 +14436,11 @@
"makeerror": "1.0.11"
}
},
+ "wangeditor": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/wangeditor/-/wangeditor-3.0.8.tgz",
+ "integrity": "sha1-qm5FetXmDiFbwuYE7uIB2TFdAXY="
+ },
"warning": {
"version": "3.0.0",
"resolved": "https://repo.corp.qunar.com/artifactory/api/npm/npm-qunar/warning/-/warning-3.0.0.tgz",
diff --git a/package.json b/package.json
index c1437082..2245163a 100755
--- a/package.json
+++ b/package.json
@@ -93,6 +93,7 @@
"universal-cookie": "^2.0.8",
"url": "^0.11.0",
"validate-commit-msg": "^2.12.2",
+ "wangeditor": "^3.0.8",
"webpack": "^3.5.5",
"webpack-dev-middleware": "^1.12.0",
"ykit-config-antd": "^0.1.3",
diff --git a/plugins/yapi-plugin-demo/client.js b/plugins/yapi-plugin-demo/client.js
index 0188be40..7d62c908 100755
--- a/plugins/yapi-plugin-demo/client.js
+++ b/plugins/yapi-plugin-demo/client.js
@@ -1,3 +1,3 @@
module.exports = function(){
-
-}
\ No newline at end of file
+ return null;
+};
\ No newline at end of file
diff --git a/server/controllers/group.js b/server/controllers/group.js
index 4013098b..b4c3a7de 100755
--- a/server/controllers/group.js
+++ b/server/controllers/group.js
@@ -282,7 +282,20 @@ class groupController extends baseController {
try {
var groupInst = yapi.getInst(groupModel);
let result = await groupInst.list();
- ctx.body = yapi.commons.resReturn(result);
+ let newResult = [];
+ if(result && result.length > 0){
+ for(let i=0; i< result.length; i++){
+ result[i] = result[i].toObject();
+ result[i].role = await this.checkAuth(result[i]._id, 'group', 'edit');
+ if(result[i].role){
+ newResult.unshift(result[i]);
+ }else{
+ newResult.push(result[i]);
+ }
+ }
+ }
+
+ ctx.body = yapi.commons.resReturn(newResult);
} catch (e) {
ctx.body = yapi.commons.resReturn(null, 402, e.message);
}
diff --git a/server/controllers/interface.js b/server/controllers/interface.js
index 0cdaa16f..f2e01464 100755
--- a/server/controllers/interface.js
+++ b/server/controllers/interface.js
@@ -76,10 +76,23 @@ class interfaceController extends baseController {
return ctx.body = yapi.commons.resReturn(null, 400, '接口请求路径不能为空');
}
- if (!yapi.commons.verifyPath(params.path)) {
+ let http_path = url.parse(params.path, true);
+ params.path = http_path.pathname;
+
+ if (!yapi.commons.verifyPath(http_path.pathname)) {
return ctx.body = yapi.commons.resReturn(null, 400, '接口path第一位必须是/,最后一位不能为/');
}
+ if (!params.req_query) {
+ params.req_query = [];
+ Object.keys(http_path.query).forEach((item) => {
+ params.req_query.push({
+ name: item
+ })
+ })
+ }
+
+
let checkRepeat = await this.Model.checkRepeat(params.project_id, params.path, params.method);
if (checkRepeat > 0) {
@@ -178,13 +191,19 @@ class interfaceController extends baseController {
*/
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);
+ let project = await this.projectModel.getBaseInfo(result.project_id);
+ if (project.project_type === 'private') {
+ if (await this.checkAuth(project._id, 'project', 'edit') !== true) {
+ return ctx.body = yapi.commons.resReturn(null, 406, '没有权限');
+ }
+ }
ctx.body = yapi.commons.resReturn(result);
} catch (e) {
ctx.body = yapi.commons.resReturn(null, 402, e.message);
@@ -203,7 +222,12 @@ class interfaceController extends baseController {
*/
async list(ctx) {
let project_id = ctx.request.query.project_id;
-
+ let project = await this.projectModel.getBaseInfo(project_id);
+ if (project.project_type === 'private') {
+ if (await this.checkAuth(project._id, 'project', 'edit') !== true) {
+ return ctx.body = yapi.commons.resReturn(null, 406, '没有权限');
+ }
+ }
if (!project_id) {
return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
}
@@ -222,7 +246,15 @@ class interfaceController extends baseController {
return ctx.body = yapi.commons.resReturn(null, 400, 'catid不能为空');
}
try {
+ let catdata = await this.catModel.get(catid);
+ let project = await this.projectModel.getBaseInfo(catdata.project_id);
+ if (project.project_type === 'private') {
+ if (await this.checkAuth(project._id, 'project', 'edit') !== true) {
+ return ctx.body = yapi.commons.resReturn(null, 406, '没有权限');
+ }
+ }
let result = await this.Model.listByCatid(catid)
+
ctx.body = yapi.commons.resReturn(result);
} catch (err) {
ctx.body = yapi.commons.resReturn(null, 402, err.message);
@@ -235,6 +267,14 @@ class interfaceController extends baseController {
if (!project_id) {
return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
}
+
+ let project = await this.projectModel.getBaseInfo(project_id);
+ if (project.project_type === 'private') {
+ if (await this.checkAuth(project._id, 'project', 'edit') !== true) {
+ return ctx.body = yapi.commons.resReturn(null, 406, '没有权限');
+ }
+ }
+
try {
let result = await this.catModel.list(project_id), newResult = [];
for (let i = 0, item, list; i < result.length; i++) {
@@ -613,26 +653,32 @@ class interfaceController extends baseController {
}
- /**
- * 获取分类列表
- * @interface /interface/getCatMenu
- * @method GET
- * @category interface
- * @foldnumber 10
- * @param {Number} project_id 项目id,不能为空
- * @returns {Object}
- * @example ./api/interface/getCatMenu
- */
+ /**
+ * 获取分类列表
+ * @interface /interface/getCatMenu
+ * @method GET
+ * @category interface
+ * @foldnumber 10
+ * @param {Number} project_id 项目id,不能为空
+ * @returns {Object}
+ * @example ./api/interface/getCatMenu
+ */
async getCatMenu(ctx) {
let project_id = ctx.request.query.project_id;
- if(!project_id){
+ if (!project_id) {
return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
}
- try{
+ let project = await this.projectModel.getBaseInfo(project_id);
+ if (project.project_type === 'private') {
+ if (await this.checkAuth(project._id, 'project', 'edit') !== true) {
+ return ctx.body = yapi.commons.resReturn(null, 406, '没有权限');
+ }
+ }
+ try {
let res = await this.catModel.list(project_id);
return ctx.body = yapi.commons.resReturn(res);
- }catch(e){
+ } catch (e) {
yapi.commons.resReturn(null, 400, e.message);
}
}
diff --git a/server/controllers/interfaceCol.js b/server/controllers/interfaceCol.js
index 19129aca..629bc3f6 100755
--- a/server/controllers/interfaceCol.js
+++ b/server/controllers/interfaceCol.js
@@ -27,6 +27,12 @@ class interfaceColController extends baseController{
async list(ctx){
try {
let id = ctx.query.project_id;
+ let project = await this.projectModel.getBaseInfo(id);
+ if (project.project_type === 'private') {
+ if (await this.checkAuth(project._id, 'project', 'edit') !== true) {
+ return ctx.body = yapi.commons.resReturn(null, 406, '没有权限');
+ }
+ }
let result = await this.colModel.list(id);
for(let i=0; i< result.length;i++){
@@ -110,8 +116,19 @@ class interfaceColController extends baseController{
async getCaseList(ctx){
try {
let id = ctx.query.col_id;
- let inst = yapi.getInst(interfaceCaseModel);
- let result = await inst.list(id, 'all');
+ if(!id || id == 0){
+ return ctx.body = yapi.commons.resReturn(null, 407, 'col_id不能为空')
+ }
+ let result = await this.caseModel.list(id, 'all');
+ let colData = await this.colModel.get(id);
+ let project = await this.projectModel.getBaseInfo(colData.project_id);
+
+ if (project.project_type === 'private') {
+ if (await this.checkAuth(project._id, 'project', 'edit') !== true) {
+ return ctx.body = yapi.commons.resReturn(null, 406, '没有权限');
+ }
+ }
+
for(let index=0; index< result.length; index++){
result[index] = result[index].toObject();
@@ -120,7 +137,7 @@ class interfaceColController extends baseController{
await this.caseModel.del(result[index]._id);
result[index] = undefined;
continue;
- }
+ }
let projectData = await this.projectModel.getBaseInfo(interfaceData.project_id);
result[index].path = projectData.basepath + interfaceData.path;
result[index].method = interfaceData.method;
diff --git a/server/controllers/project.js b/server/controllers/project.js
index e1bd60e0..69157945 100755
--- a/server/controllers/project.js
+++ b/server/controllers/project.js
@@ -308,6 +308,11 @@ class projectController extends baseController {
if (!result) {
return ctx.body = yapi.commons.resReturn(null, 400, '不存在的项目');
}
+ if (result.project_type === 'private') {
+ if (await this.checkAuth(result._id, 'project', 'edit') !== true) {
+ return ctx.body = yapi.commons.resReturn(null, 406, '没有权限');
+ }
+ }
result = result.toObject();
let catInst = yapi.getInst(interfaceCatModel);
let cat = await catInst.list(params.id);
diff --git a/static/doc/api.html b/static/doc/api.html
index 39101a4c..51555d49 100755
--- a/static/doc/api.html
+++ b/static/doc/api.html
@@ -899,7 +899,7 @@
源码位置:
- ./server/controllers/group.js:290
+ ./server/controllers/group.js:303
@@ -971,7 +971,7 @@
源码位置:
- ./server/controllers/group.js:330
+ ./server/controllers/group.js:343
@@ -3511,7 +3511,7 @@
源码位置:
- ./server/controllers/interface.js:168
+ ./server/controllers/interface.js:181
@@ -3576,7 +3576,7 @@
源码位置:
- ./server/controllers/interface.js:193
+ ./server/controllers/interface.js:206
@@ -3641,7 +3641,7 @@
源码位置:
- ./server/controllers/interface.js:255
+ ./server/controllers/interface.js:268
@@ -3874,7 +3874,7 @@
源码位置:
- ./server/controllers/interface.js:427
+ ./server/controllers/interface.js:440
@@ -3946,7 +3946,7 @@
源码位置:
- ./server/controllers/interface.js:615
+ ./server/controllers/interface.js:628
diff --git a/static/doc/index-使用mock功能.html b/static/doc/index-使用mock功能.html
index ba442ea5..67a097cf 100755
--- a/static/doc/index-使用mock功能.html
+++ b/static/doc/index-使用mock功能.html
@@ -144,14 +144,14 @@
mockd地址: http://yapi.corp.qunar.com/mock/29/api/hackathon/login
注:项目id可以在项目设置里查看到
定义mock数据示例 #
{
- "status|0-1": 0, //接口状态
+ "status|0-1": 0, //接口状态
"message": "请求完成", //消息提示
"data": {
"counts":"@integer", //统计数量
- "totalSubjectType|4-10": [
+ "totalSubjectType|4-10": [
{
- "subjectName|regexp": "大数据|机器学习|工具", //主题名
- "subjectType|+1": 1 //类型
+ "subjectName|regexp": "大数据|机器学习|工具", //主题名
+ "subjectType|+1": 1 //类型
}
],
"data":[
@@ -164,8 +164,8 @@
}
yapiMock跟mockjs区别 #
因为yapi基于json定义mock,无法使用mockjs原有的函数功能,正则表达式需要基于rule书写,示例如下:
{
- "name|regexp": "[a-z0-9_]+?",
- "type|regexp": "json|text|xml" //枚举数据类型可这样实现
+ "name|regexp": "[a-z0-9_]+?",
+ "type|regexp": "json|text|xml" //枚举数据类型可这样实现
}
如何使用Mock? #
1 在js代码直接请求yapi提供的mock地址(不用担心跨域问题) #
在代码直接请求yapi提供的mock地址,以jQuery为例:
let prefix = 'http://yapi.local.qunar.com:3000/mock/2817'
@@ -196,9 +196,9 @@ $.post2. 数据占位符定义规范(Data Placeholder Definition,DPD)
数据模板定义规范(Data Template Definition,DTD) #
数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值:
-// 属性名 name (与生成规则之间用 "|" 隔开)
-// 生成规则 rule(生成规则有7种详见下面的生成规则)
-// 属性值 value(可以含有 "@占位符" 同时也指定了最终值的初始值和类型)
+// 属性名 name (与生成规则之间用 "|" 隔开)
+// 生成规则 rule(生成规则有7种详见下面的生成规则)
+// 属性值 value(可以含有 "@占位符" 同时也指定了最终值的初始值和类型)
'name|rule': value
diff --git a/static/doc/source/app.js b/static/doc/source/app.js
index 2a53b85a..24b1b76c 100755
--- a/static/doc/source/app.js
+++ b/static/doc/source/app.js
@@ -8,7 +8,6 @@ $(document).ready(function() {
var $versionSelector = $('.version-selector');
var $versionMask = $('.m-version-mask');
var isPanelHide = true;
- var winWidth = $(window).width();
var h2 = $('.content-right').find('h2');
var h3 = $('.content-right').find('h3');
var a = $('.content-left').find('a');
diff --git a/static/doc/static/server/controllers/group.js.html b/static/doc/static/server/controllers/group.js.html
index afde93c7..792a32e1 100755
--- a/static/doc/static/server/controllers/group.js.html
+++ b/static/doc/static/server/controllers/group.js.html
@@ -309,7 +309,20 @@ class groupController extends baseController {
try {
var groupInst = yapi.getInst(groupModel);
let result = await groupInst.list();
- ctx.body = yapi.commons.resReturn(result);
+ let newResult = [];
+ if(result && result.length > 0){
+ for(let i=0; i< result.length; i++){
+ result[i] = result[i].toObject();
+ result[i].role = await this.checkAuth(result[i]._id, 'group', 'edit');
+ if(result[i].role){
+ newResult.unshift(result[i]);
+ }else{
+ newResult.push(result[i]);
+ }
+ }
+ }
+
+ ctx.body = yapi.commons.resReturn(newResult);
} catch (e) {
ctx.body = yapi.commons.resReturn(null, 402, e.message);
}
diff --git a/static/doc/static/server/controllers/interface.js.html b/static/doc/static/server/controllers/interface.js.html
index b6e75131..ab322515 100755
--- a/static/doc/static/server/controllers/interface.js.html
+++ b/static/doc/static/server/controllers/interface.js.html
@@ -103,9 +103,22 @@ class interfaceController extends baseController {
return ctx.body = yapi.commons.resReturn(null, 400, '接口请求路径不能为空');
}
- if (!yapi.commons.verifyPath(params.path)) {
+ let http_path = url.parse(params.path, true);
+ params.path = http_path.pathname;
+
+ if (!yapi.commons.verifyPath(http_path.pathname)) {
return ctx.body = yapi.commons.resReturn(null, 400, '接口path第一位必须是/,最后一位不能为/');
}
+
+ if(!params.req_query){
+ params.req_query = [];
+ Object.keys(http_path.query).forEach((item)=>{
+ params.req_query.push({
+ name: item
+ })
+ })
+ }
+
let checkRepeat = await this.Model.checkRepeat(params.project_id, params.path, params.method);
diff --git a/ykit.js b/ykit.js
index 4f7a3f54..629cb327 100755
--- a/ykit.js
+++ b/ykit.js
@@ -36,69 +36,6 @@ function initPlugins(){
initPlugins();
-function handleCommonsChunk(webpackConfig) {
- var commonsChunk = {
- vendors: {
- lib: ['react', 'redux',
- 'redux-thunk',
- 'react-dom',
- 'redux-promise',
- 'react-router',
- 'react-router-dom',
- 'prop-types',
- 'axios',
- 'moment'
-
- ],
- lib2: [
- 'brace',
- 'mockjs',
- 'json5'
- ]
- }
- },
- chunks = [],
- filenameTpl = webpackConfig.output[this.env],
- vendors;
-
-
-
- if (typeof commonsChunk === 'object' && commonsChunk !== undefined) {
- if (typeof commonsChunk.name === 'string' && commonsChunk) {
- chunks.push(commonsChunk.name);
- }
- vendors = commonsChunk.vendors;
- if (typeof vendors === 'object' && vendors !== undefined) {
- var i = 0;
- for (var name in vendors) {
- if (vendors.hasOwnProperty(name) && vendors[name]) {
- i++;
- chunks.push(name);
- webpackConfig.entry[name] = Array.isArray(vendors[name]) ? vendors[name] : [vendors[name]];
- }
- }
- if (i > 0) {
- chunks.push('manifest');
- }
-
- }
-
- if (chunks.length > 0) {
- let chunkFilename = filenameTpl.filename
- chunkFilename = chunkFilename.replace("[ext]", '.js')
- webpackConfig.plugins.push(
- new this.webpack.optimize.CommonsChunkPlugin({
- name: chunks,
- filename: chunkFilename,
- minChunks: commonsChunk.minChunks ? commonsChunk.minChunks : 2
- })
- );
-
- }
- }
-}
-
-
module.exports = {
plugins: [{
name: 'antd',
@@ -122,6 +59,26 @@ module.exports = {
exports: [
'./index.js'
],
+ commonsChunk: {
+ vendors: {
+ lib: ['react', 'redux',
+ 'redux-thunk',
+ 'react-dom',
+ 'redux-promise',
+ 'react-router',
+ 'react-router-dom',
+ 'prop-types',
+ 'axios',
+ 'moment'
+
+ ],
+ lib2: [
+ 'brace',
+ 'mockjs',
+ 'json5'
+ ]
+ }
+ },
modifyWebpackConfig: function (baseConfig) {
var ENV_PARAMS = {};
@@ -152,8 +109,8 @@ module.exports = {
baseConfig.output.prd.publicPath = '';
baseConfig.output.prd.filename = '[name]@[chunkhash][ext]'
- //commonsChunk
- handleCommonsChunk.call(this, baseConfig)
+
+
baseConfig.module.loaders.push({
test: /\.less$/,
loader: ykit.ExtractTextPlugin.extract(