diff --git a/client/components/Footer/Footer.scss b/client/components/Footer/Footer.scss index 17e34b76..bca0d18c 100644 --- a/client/components/Footer/Footer.scss +++ b/client/components/Footer/Footer.scss @@ -23,6 +23,7 @@ } } .footerMask{ + @include wrap-width-limit; position: absolute; top: 0px; height: 100%; diff --git a/client/components/Header/Header.scss b/client/components/Header/Header.scss index b05bb82f..9430d062 100644 --- a/client/components/Header/Header.scss +++ b/client/components/Header/Header.scss @@ -8,10 +8,10 @@ $color-grey-deep : #929aac; $color-black-light : #404040; /* .header-box.css */ .header-box { + @include wrap-width-limit; display: block; font-size: 0.14rem; z-index: 99; - @include wrap-width-limit; .content { @include row-width-limit; margin: 0 auto; diff --git a/client/containers/AddInterface/AddInterface.scss b/client/containers/AddInterface/AddInterface.scss index 3998491c..cb6d8d68 100644 --- a/client/containers/AddInterface/AddInterface.scss +++ b/client/containers/AddInterface/AddInterface.scss @@ -257,12 +257,12 @@ body { #req-cover { height: 330px; padding: 0 20px; - background-color: #FFF; + // background-color: #FFF; -webkit-box-flex: 1; } #res-cover { height: 330px; padding: 0 20px; - background-color: #FFF; + /*background-color: #FFF;*/ -webkit-box-flex: 1; } diff --git a/client/containers/AddInterface/ReqParams/ReqParams.js b/client/containers/AddInterface/ReqParams/ReqParams.js index 4cb85458..20e87e70 100644 --- a/client/containers/AddInterface/ReqParams/ReqParams.js +++ b/client/containers/AddInterface/ReqParams/ReqParams.js @@ -1,10 +1,10 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import { connect } from 'react-redux' -import wangEditor from 'wangeditor' +// import wangEditor from 'wangeditor' import { getReqParams } from '../../../actions/addInterface.js' -const editor = new wangEditor('#req-cover') +//const editor = new wangEditor('#req-cover') @connect( state => { @@ -27,25 +27,41 @@ class ReqParams extends Component { super(props) } - initParams () { - const { reqParams } = this.props - if (reqParams) { - editor.txt.html(reqParams) - } - } + // initParams () { + // const { reqParams } = this.props + // if (reqParams) { + // editor.txt.html(reqParams) + // } + // } componentDidMount () { - const reg = /(

)|(<\/p>)| |(
)|\s+/g - let json = '' - editor.customConfig.menus = [] - editor.customConfig.onchange = html => { - json = html.replace(reg, '') - this.props.getReqParams(json) + function json_parse(json){ + try{ + return JSON.stringify(JSON.parse(json), null, "\t"); + }catch(e){ + return json + } } - setTimeout(() => { - this.initParams() - }, 500) - editor.create() + let editor2 = this.editor = window.ace.edit("req-cover") + editor2.getSession().setMode("ace/mode/json"); + setTimeout( () => { + editor2.setValue(json_parse(this.props.reqParams)) + } ,400) + + editor2.getSession().on('change', ()=> { + this.props.getReqParams(editor2.getValue()) + }); + // const reg = /(

)|(<\/p>)| |(
)|\s+/g + // let json = '' + // editor.customConfig.menus = [] + // editor.customConfig.onchange = html => { + // json = html.replace(reg, '') + // this.props.getReqParams(json) + // } + // setTimeout(() => { + // this.initParams() + // }, 500) + // editor.create() } render () { diff --git a/client/containers/AddInterface/ResParams/ResParams.js b/client/containers/AddInterface/ResParams/ResParams.js index bf69d583..ba375e1e 100644 --- a/client/containers/AddInterface/ResParams/ResParams.js +++ b/client/containers/AddInterface/ResParams/ResParams.js @@ -1,11 +1,13 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import { connect } from 'react-redux' -import wangEditor from 'wangeditor' +//import wangEditor from 'wangeditor' import { Tabs } from 'antd' import { getResParams } from '../../../actions/addInterface.js' -const editor = new wangEditor('#res-cover') +//const editor = new wangEditor('#res-cover') + + @connect( state => { @@ -28,24 +30,41 @@ class ResParams extends Component { super(props) } - initResParams () { - const { resParams } = this.props - if (resParams) { - editor.txt.html(resParams) - } - } + // initResParams () { + // const { resParams } = this.props + // if (resParams) { + // editor.txt.html(resParams) + // } + // } componentDidMount () { - const reg = /(

)|(<\/p>)| |(
)|\s+|

|<\/div>/g - editor.customConfig.menus = [] - editor.customConfig.onchange = html => { - html = html.replace(reg, '') - this.props.getResParams(html) + //const reg = /(

)|(<\/p>)| |(
)|\s+|

|<\/div>/g + //editor.customConfig.menus = [] + // editor.customConfig.onchange = html => { + // html = html.replace(reg, '') + // this.props.getResParams(html) + // } + // setTimeout(() => { + // this.initResParams() + // }, 400) + //editor.create() + + function json_parse(json){ + try{ + return JSON.stringify(JSON.parse(json), null, "\t"); + }catch(e){ + return json + } } - setTimeout(() => { - this.initResParams() - }, 400) - editor.create() + + let editor2 = this.editor = window.ace.edit("res-cover") + editor2.getSession().setMode("ace/mode/json"); + editor2.getSession().on('change', ()=> { + this.props.getResParams(editor2.getValue()) + }); + setTimeout( () => { + editor2.setValue(json_parse(this.props.resParams)) + } ,400) } render () { diff --git a/client/containers/Home/Home.scss b/client/containers/Home/Home.scss index 5ad5c9d9..064eff06 100644 --- a/client/containers/Home/Home.scss +++ b/client/containers/Home/Home.scss @@ -52,7 +52,6 @@ $color-black-lighter: #404040; @include row-width-limit; margin: 1rem auto 0; .user-des{ - @include row-width-limit; margin: 0 auto .5rem; text-align: center; .title{ @@ -74,9 +73,9 @@ $color-black-lighter: #404040; } } .main-part{ - padding: .9rem .5rem; - height: 5.8rem; @include wrap-width-limit; + padding: .9rem 0; + height: 5.8rem; &:nth-child(odd){ background-color: $color-blue-lighter; } @@ -86,7 +85,7 @@ $color-black-lighter: #404040; } .feat-part{ @include wrap-width-limit; - padding: .9rem .5rem; + padding: .9rem 0; background-color: $color-white; p{ display: flex; diff --git a/client/containers/ProjectGroups/ProjectList/ProjectList.js b/client/containers/ProjectGroups/ProjectList/ProjectList.js index 6838b4ab..811b5e79 100644 --- a/client/containers/ProjectGroups/ProjectList/ProjectList.js +++ b/client/containers/ProjectGroups/ProjectList/ProjectList.js @@ -19,8 +19,6 @@ const deleteConfirm = (id, props) => { const { delProject, currGroup, fetchProjectList } = props; const handle = () => { delProject(id).then((res) => { - console.log(res); - console.log(fetchProjectList, currGroup._id); if (res.payload.data.errcode == 0) { message.success('删除成功!') fetchProjectList(currGroup._id).then((res) => { @@ -43,6 +41,13 @@ const getColumns = (data, props) => { render: (text, record) => { return {text} } + },{ + title: 'Mock链接', + key: 'domain', + render: (item) => { + return 'http://'+ item.prd_host + item.basepath; + } + }, { title: '创建人', dataIndex: 'owner', diff --git a/client/containers/User/LeftMenu.js b/client/containers/User/LeftMenu.js index 7b919d6d..bea84f33 100644 --- a/client/containers/User/LeftMenu.js +++ b/client/containers/User/LeftMenu.js @@ -39,7 +39,7 @@ class LeftMenu extends Component { this.interval = setInterval(() => { if (this.searchSign === this._searchSign) { this.interval = clearInterval(this.interval) - axios.get('/user/search?q=' + value).then((res) => { + axios.get('/user/search?q=' + value).then((res) => { if (res.data.errcode === 0) { this.setState({ dataSource: res.data.data @@ -103,7 +103,7 @@ class LeftMenu extends Component {
- + {content}
@@ -111,4 +111,4 @@ class LeftMenu extends Component { } } -export default LeftMenu \ No newline at end of file +export default LeftMenu diff --git a/client/containers/User/Profile.js b/client/containers/User/Profile.js index ef276f50..859a0bbf 100644 --- a/client/containers/User/Profile.js +++ b/client/containers/User/Profile.js @@ -22,7 +22,7 @@ class Profile extends Component { } } - + } componentDidMount(){ @@ -51,7 +51,7 @@ class Profile extends Component { let value = this.state._userinfo[name]; let params = {uid: state.userinfo.uid} params[name] = value; - + axios.post('/user/update', params).then( (res)=>{ let data = res.data; if(data.errcode === 0){ @@ -66,7 +66,7 @@ class Profile extends Component { }else{ message.error(data.errmsg) } - + }, (err) => { message.error(err.message) } ) @@ -104,8 +104,8 @@ class Profile extends Component { password: password, old_password: old_password } - - + + axios.post('/user/change_password', params).then( (res)=>{ let data = res.data; if(data.errcode === 0){ @@ -114,11 +114,11 @@ class Profile extends Component { }else{ message.error(data.errmsg) } - + }, (err) => { message.error(err.message) } ) - + } render() { @@ -138,8 +138,8 @@ class Profile extends Component { userNameEditHtml =
- - + +
} @@ -154,8 +154,8 @@ class Profile extends Component { emailEditHtml =
- - + +
} @@ -182,8 +182,8 @@ class Profile extends Component { - - + + } diff --git a/client/containers/User/index.scss b/client/containers/User/index.scss index d33d83ef..758ed777 100644 --- a/client/containers/User/index.scss +++ b/client/containers/User/index.scss @@ -22,7 +22,7 @@ .user-list { box-shadow: 0 2px 4px 0 rgba(0,0,0,0.20); background: #FFF; - border-radius:5px; + border-radius:4px; margin-top: 15px; .search{ padding: 5px; @@ -34,13 +34,13 @@ } } .user-name{ - padding: 24px 10px; + padding: .24rem; // text-align: center; background-color: #34495e; color: white; font-size: 16px; - border-top-left-radius:5px; - border-top-right-radius: 5px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; span{ margin-right: 5px; } @@ -51,8 +51,7 @@ .user-table { -webkit-box-flex: 1; padding: 24px; - margin-left: 15px; - border-radius:5px; + border-radius: 4px; box-shadow: 0 2px 4px 0 rgba(0,0,0,0.20); background: #FFF; margin-top: 15px; @@ -69,19 +68,18 @@ .user-profile { -webkit-box-flex: 1; margin-top: 15px; - margin-left: 15px; padding: 24px; box-shadow: 0 2px 4px 0 rgba(0,0,0,0.20); background: #FFF; - border-radius:5px; + border-radius: .04rem; .user-item { min-height:35px; line-height:35px; margin: 5px; margin-left: 0px; - margin-bottom:10px; + margin-bottom: 16px; border-bottom: 1px solid #f1f3f6; - padding-bottom: 10px; + padding-bottom: 16px; #old_password,#password,#verify_pass{ margin-top: 20px; } @@ -90,16 +88,16 @@ } .ant-col-12{ .ant-input{ - width: 70%; - margin-right: 24px; + width: 60%; + margin-right: 16px; } } .ant-col-4{ color: rgba(0,0,0,0.85); - padding: 0px 10px; + padding: 0px 16px; text-indent: .7em; // background-color: #f1f3f6; - border-left: 5px solid #f1f3f6; + border-left: 4px solid #f1f3f6; margin-right: 30px; } .text{ @@ -110,16 +108,11 @@ color: #657289; cursor: pointer } - - // .edit-buttons{ - // margin:10px; - // } - - // .edit-button{ - // margin: 5px; - // } } } - + .user-nav { + border-bottom-left-radius: .04rem; + border-bottom-right-radius: .04rem; + } } diff --git a/client/reducer/Login/login.js b/client/reducer/Login/login.js index 4cec9038..790e346d 100644 --- a/client/reducer/Login/login.js +++ b/client/reducer/Login/login.js @@ -26,7 +26,8 @@ export default (state = initialState, action) => { isLogin: (action.payload.data.errcode == 0), loginState: (action.payload.data.errcode == 0)?MEMBER_STATUS:GUEST_STATUS, userName: action.payload.data.data ? action.payload.data.data.username : null, - uid: action.payload.data.data ? action.payload.data.data._id : null + uid: action.payload.data.data ? action.payload.data.data._id : null, + server_ip: action.payload.data.data.server_ip }; } case LOGIN: { @@ -36,7 +37,8 @@ export default (state = initialState, action) => { isLogin: true, loginState: MEMBER_STATUS, uid: action.payload.data.data.uid, - userName: action.payload.data.data.username + userName: action.payload.data.data.username, + server_ip: action.payload.data.data.server_ip }; } else { return state; diff --git a/client/reducer/login/login.js b/client/reducer/login/login.js index 4cec9038..790e346d 100644 --- a/client/reducer/login/login.js +++ b/client/reducer/login/login.js @@ -26,7 +26,8 @@ export default (state = initialState, action) => { isLogin: (action.payload.data.errcode == 0), loginState: (action.payload.data.errcode == 0)?MEMBER_STATUS:GUEST_STATUS, userName: action.payload.data.data ? action.payload.data.data.username : null, - uid: action.payload.data.data ? action.payload.data.data._id : null + uid: action.payload.data.data ? action.payload.data.data._id : null, + server_ip: action.payload.data.data.server_ip }; } case LOGIN: { @@ -36,7 +37,8 @@ export default (state = initialState, action) => { isLogin: true, loginState: MEMBER_STATUS, uid: action.payload.data.data.uid, - userName: action.payload.data.data.username + userName: action.payload.data.data.username, + server_ip: action.payload.data.data.server_ip }; } else { return state; diff --git a/client/styles/mixin.scss b/client/styles/mixin.scss index c94c2eb9..f5febd88 100644 --- a/client/styles/mixin.scss +++ b/client/styles/mixin.scss @@ -4,5 +4,5 @@ } @mixin wrap-width-limit { - min-width: 10.7rem; + min-width: 9.7rem; } diff --git a/config.json b/config.json deleted file mode 100644 index be5bd2aa..00000000 --- a/config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ -"port": "3000", -"webhost": "yapi.local.qunar.com", -"adminAccount": "admin@admin.com", -"db": { -"servername": "10.86.40.194", -"DATABASE": "yapi", -"port": 27017, -"user": "test1", -"pass": "test1" -}, -"mail": { -"host": "smtp.163.com", -"port": 465, -"auth": { -"user": "hellosean1025@163.com", -"pass": "helloqunar123" -} -} -} \ No newline at end of file diff --git a/config_example.json b/config_example.json index 14164abc..cdce29c0 100644 --- a/config_example.json +++ b/config_example.json @@ -1,6 +1,7 @@ { "port": "3000", "webhost": "yapi.local.qunar.com", + "server_ip": "192.168.1.1", "adminAccount": "admin@admin.com", "db": { "servername": "127.0.0.1", diff --git a/gulpfile.js b/gulpfile.js index 196cc5c6..8f5af1bb 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -11,6 +11,8 @@ const DIST = 'server_dist/'; const SRC = 'server/**/*.js'; function generateBabel(status) { + + // 返回一个新的 babel 插件 const babelProcess = babel({ presets: ['es2015', 'stage-3'], plugins: ['transform-runtime'] @@ -43,6 +45,9 @@ function excuteCmd(cmd, args, opts) { output('log', `${NAME} ${message}`, true); + // ykit 成功编译时会输出带有 build complete 字样的 log + // 此时停止正在编译的提示 + // 换为等待文件变更的提示 if (~message.indexOf('building complete')) { waitingSpinner(); } @@ -102,14 +107,22 @@ gulp.task('initialBuild', ['removeDist'], () => { }); gulp.task('default', ['initialBuild'], () => { + + // 若 client/ 下的文件发生变动则显示正在编译的提示 + // 并在编译完成之后停止 gulp.watch('client/**/*', event => { spinner.stop(); spinner = ora(`正在编译 ${event.path}`).start(); }); gulp.watch(SRC, event => { + + // 获取变更文件相对于 server/ 的路径 + // 此路径用于 gulp.dest() 写入新文件 let originFilePath = path.relative(path.join(__dirname, 'server'), event.path); let distPath = path.resolve(DIST, path.join(originFilePath)); + + // 编译提示 spinner.text = `正在编译 ${event.path}...`; gulp.src(event.path).pipe(generateBabel()) @@ -121,12 +134,14 @@ gulp.task('default', ['initialBuild'], () => { }); }); +// 全量编译后端代码 gulp.task('buildNode', () => { return gulp.src(SRC) .pipe(generateBabel()) .pipe(gulp.dest(DIST)); }); +// 仅监测后端代码并实时编译 gulp.task('watchNode', ['buildNode'], () => { return watch(SRC, { verbose: true, @@ -136,6 +151,7 @@ gulp.task('watchNode', ['buildNode'], () => { .pipe(gulp.dest(DIST)); }); +// 编译前后端 gulp.task('build', () => { let status = { count: 0 diff --git a/server/app.js b/server/app.js index 460a461f..39d8cdbe 100644 --- a/server/app.js +++ b/server/app.js @@ -4,7 +4,6 @@ yapi.commons = commons; import dbModule from './utils/db.js'; import mockServer from './middleware/mockServer.js'; import Koa from 'koa'; -import convert from 'koa-convert'; import koaStatic from 'koa-static'; import bodyParser from 'koa-bodyparser'; import router from './router.js'; diff --git a/server/controllers/base.js b/server/controllers/base.js index 876eee35..f3dd74c0 100644 --- a/server/controllers/base.js +++ b/server/controllers/base.js @@ -60,7 +60,9 @@ class baseController { async getLoginStatus(ctx) { if (await this.checkLogin(ctx) === true) { - return ctx.body = yapi.commons.resReturn(yapi.commons.fieldSelect(this.$user, ['_id', 'username', 'email', 'up_time', 'add_time'])); + let result = yapi.commons.fieldSelect(this.$user, ['_id', 'username', 'email', 'up_time', 'add_time']); + result.server_ip = yapi.WEBCONFIG.server_ip; + return ctx.body = yapi.commons.resReturn(result); } return ctx.body = yapi.commons.resReturn(null, 300, 'Please login.'); } diff --git a/server/controllers/log.js b/server/controllers/log.js index a9e607a1..1b7d91f4 100644 --- a/server/controllers/log.js +++ b/server/controllers/log.js @@ -28,19 +28,20 @@ class logController extends baseController { page = ctx.request.query.page || 1, limit = ctx.request.query.limit || 10; - if(!uid){ + if (!uid) { return ctx.body = yapi.commons.resReturn(null, 400, '用户id不能为空'); } try { let result = await this.Model.listWithPaging(uid, page, limit); let count = await this.Model.listCount(uid); + ctx.body = yapi.commons.resReturn({ total: Math.ceil(count / limit), list: result - }) - } catch(err) { - ctx.body = yapi.commons.resReturn(null, 402, e.message) + }); + } catch (err) { + ctx.body = yapi.commons.resReturn(null, 402, err.message); } } diff --git a/server/controllers/project.js b/server/controllers/project.js index d641f3de..e2fab08b 100644 --- a/server/controllers/project.js +++ b/server/controllers/project.js @@ -1,32 +1,32 @@ -import projectModel from '../models/project.js' -import yapi from '../yapi.js' -import baseController from './base.js' -import interfaceModel from '../models/interface.js' -import groupModel from '../models/group' -import commons from '../utils/commons.js' -import userModel from '../models/user.js' +import projectModel from '../models/project.js'; +import yapi from '../yapi.js'; +import baseController from './base.js'; +import interfaceModel from '../models/interface.js'; +import groupModel from '../models/group'; +import commons from '../utils/commons.js'; +import userModel from '../models/user.js'; class projectController extends baseController { - constructor(ctx){ - super(ctx) + constructor(ctx) { + super(ctx); this.Model = yapi.getInst(projectModel); this.groupModel = yapi.getInst(groupModel); } - handleBasepath(basepath){ - if(!basepath) return false; - if(basepath[0] !== '/') basepath = '/' + basepath; - if(basepath[basepath.length -1] === '/') basepath = basepath.substr(0, basepath.length -1) - if(!yapi.commons.verifyPath(basepath)){ + handleBasepath(basepath) { + if (!basepath) return false; + if (basepath[0] !== '/') basepath = '/' + basepath; + if (basepath[basepath.length - 1] === '/') basepath = basepath.substr(0, basepath.length - 1); + if (!yapi.commons.verifyPath(basepath)) { return false; } return basepath; } - verifyDomain(domain){ - if(!domain) return false; - if(/^[a-zA-Z0-9\-_\.]+?\.[a-zA-Z0-9\-_\.]*?[a-zA-Z]{2,6}$/.test(domain)){ + verifyDomain(domain) { + if (!domain) return false; + if (/^[a-zA-Z0-9\-_\.]+?\.[a-zA-Z0-9\-_\.]*?[a-zA-Z]{2,6}$/.test(domain)) { return true; } return false; @@ -56,38 +56,40 @@ class projectController extends baseController { protocol: 'string', group_id: 'number', desc: 'string' - }) - if(!params.group_id){ + }); + if (!params.group_id) { return ctx.body = yapi.commons.resReturn(null, 400, '项目分组id不能为空'); } - if(!params.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, '已存在的项目名'); + + if (checkRepeat > 0) { + return ctx.body = yapi.commons.resReturn(null, 401, '已存在的项目名'); } - if(!params.basepath){ + if (!params.basepath) { return ctx.body = yapi.commons.resReturn(null, 400, '项目basepath不能为空'); } - if(!params.prd_host){ + if (!params.prd_host) { return ctx.body = yapi.commons.resReturn(null, 400, '项目domain不能为空'); } - if((params.basepath = this.handleBasepath(params.basepath)) === false){ - return ctx.body = yapi.commons.resReturn(null, 401, 'basepath格式有误') + if ((params.basepath = this.handleBasepath(params.basepath)) === false) { + return ctx.body = yapi.commons.resReturn(null, 401, 'basepath格式有误'); } - if(!this.verifyDomain(params.prd_host)){ - return ctx.body = yapi.commons.resReturn(null, 401, '线上域名格式有误') + if (!this.verifyDomain(params.prd_host)) { + return ctx.body = yapi.commons.resReturn(null, 401, '线上域名格式有误'); } let checkRepeatDomain = await this.Model.checkDomainRepeat(params.prd_host, params.basepath); - if(checkRepeatDomain > 0){ - return ctx.body = yapi.commons.resReturn(null, 401, '已存在domain和basepath'); + + if (checkRepeatDomain > 0) { + return ctx.body = yapi.commons.resReturn(null, 401, '已存在domain和basepath'); } let data = { @@ -101,78 +103,78 @@ class projectController extends baseController { group_id: params.group_id, add_time: yapi.commons.time(), up_time: yapi.commons.time() - } + }; - try{ + 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) + } catch (e) { + ctx.body = yapi.commons.resReturn(null, 402, e.message); } } - /** - * 添加项目 - * @interface /project/add_member - * @method POST - * @category project - * @foldnumber 10 - * @param {Number} id 项目id,不能为空 - * @param {String} member_uid 项目成员uid,不能为空 - * @returns {Object} - * @example ./api/project/add_member.json - */ - async addMember(ctx){ + /** + * 添加项目 + * @interface /project/add_member + * @method POST + * @category project + * @foldnumber 10 + * @param {Number} id 项目id,不能为空 + * @param {String} member_uid 项目成员uid,不能为空 + * @returns {Object} + * @example ./api/project/add_member.json + */ + async addMember(ctx) { let params = ctx.request.body; - if(!params.member_uid){ + if (!params.member_uid) { return ctx.body = yapi.commons.resReturn(null, 400, '项目成员uid不能为空'); } - if(!params.id){ + 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, '项目成员已存在'); + if (check > 0) { + return ctx.body = yapi.commons.resReturn(null, 400, '项目成员已存在'); } - try{ + 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) + } catch (e) { + ctx.body = yapi.commons.resReturn(null, 402, e.message); } } - /** - * 添加项目 - * @interface /project/del_member - * @method POST - * @category project - * @foldnumber 10 - * @param {Number} id 项目id,不能为空 - * @param {member_uid} uid 项目成员uid,不能为空 - * @returns {Object} - * @example ./api/project/del_member.json - */ + /** + * 添加项目 + * @interface /project/del_member + * @method POST + * @category project + * @foldnumber 10 + * @param {Number} id 项目id,不能为空 + * @param {member_uid} uid 项目成员uid,不能为空 + * @returns {Object} + * @example ./api/project/del_member.json + */ - async delMember(ctx){ + async delMember(ctx) { let params = ctx.request.body; - if(!params.member_uid){ + if (!params.member_uid) { return ctx.body = yapi.commons.resReturn(null, 400, '项目成员uid不能为空'); } - if(!params.id){ + 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, '项目成员不存在'); + if (check === 0) { + return ctx.body = yapi.commons.resReturn(null, 400, '项目成员不存在'); } - try{ + 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) + } catch (e) { + ctx.body = yapi.commons.resReturn(null, 402, e.message); } } @@ -189,7 +191,7 @@ class projectController extends baseController { async getMemberList(ctx) { let params = ctx.request.query; - if(!params.id) { + if (!params.id) { return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空'); } @@ -199,32 +201,32 @@ class projectController extends baseController { let result = await userInst.findByUids(project.members); ctx.body = yapi.commons.resReturn(result); - } catch(e) { + } catch (e) { ctx.body = yapi.commons.resReturn(null, 402, e.message); } } - /** - * 添加项目 - * @interface /project/get - * @method GET - * @category project - * @foldnumber 10 - * @param {Number} id 项目id,不能为空 - * @returns {Object} - * @example ./api/project/get.json - */ + /** + * 添加项目 + * @interface /project/get + * @method GET + * @category project + * @foldnumber 10 + * @param {Number} id 项目id,不能为空 + * @returns {Object} + * @example ./api/project/get.json + */ - async get(ctx){ + async get(ctx) { let params = ctx.request.query; - if(!params.id){ + if (!params.id) { return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空'); } - try{ + 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) + } catch (e) { + ctx.body = yapi.commons.resReturn(null, 402, e.message); } } @@ -246,31 +248,31 @@ class projectController extends baseController { page = ctx.request.query.page || 1, limit = ctx.request.query.limit || 10; - if(!group_id){ + if (!group_id) { return ctx.body = yapi.commons.resReturn(null, 400, '项目分组id不能为空'); } - try{ + try { let result = await this.Model.listWithPaging(group_id, page, limit); let count = await this.Model.listCount(group_id); let uids = []; - result.forEach( (item)=> { - if(uids.indexOf(item.uid) === -1){ - uids.push(item.uid) + result.forEach((item) => { + if (uids.indexOf(item.uid) === -1) { + uids.push(item.uid); } - } ) + }); let _users = {}, users = await yapi.getInst(userModel).findByUids(uids); - users.forEach((item)=> { + users.forEach((item) => { _users[item._id] = item; - } ) + }); ctx.body = yapi.commons.resReturn({ total: Math.ceil(count / limit), list: result, userinfo: _users - }) - }catch(e){ - ctx.body = yapi.commons.resReturn(null, 402, e.message) + }); + } catch (e) { + ctx.body = yapi.commons.resReturn(null, 402, e.message); } } @@ -285,25 +287,25 @@ class projectController extends baseController { * @example ./api/project/del.json */ - async del(ctx){ - try{ + async del(ctx) { + try { let id = ctx.request.body.id; - if(!id){ + if (!id) { return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空'); } let interfaceInst = yapi.getInst(interfaceModel); let count = await interfaceInst.countByProjectId(id); - if(count > 0){ + if (count > 0) { return ctx.body = yapi.commons.resReturn(null, 400, '请先删除该项目下所有接口'); } - if(await this.jungeProjectAuth(id) !== true){ + if (await 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) + } catch (err) { + ctx.body = yapi.commons.resReturn(null, 402, err.message); } } @@ -325,8 +327,8 @@ class projectController extends baseController { * @example ./api/project/up.json */ - async up(ctx){ - try{ + async up(ctx) { + try { let id = ctx.request.body.id; let params = ctx.request.body; params = yapi.commons.handleParams(params, { @@ -336,65 +338,65 @@ class projectController extends baseController { protocol: 'string', group_id: 'number', desc: 'string' - }) - if(!id){ + }); + if (!id) { return ctx.body = yapi.commons.resReturn(null, 405, '项目id不能为空'); } - if(await this.jungeMemberAuth(id, this.getUid()) !== true){ + if (await this.jungeMemberAuth(id, this.getUid()) !== true) { return ctx.body = yapi.commons.resReturn(null, 405, '没有权限'); } let projectData = await this.Model.get(id); - if((params.basepath = this.handleBasepath(params.basepath)) === false){ - return ctx.body = yapi.commons.resReturn(null, 401, 'basepath格式有误') + if ((params.basepath = this.handleBasepath(params.basepath)) === false) { + return ctx.body = yapi.commons.resReturn(null, 401, 'basepath格式有误'); } - if(!this.verifyDomain(params.prd_host)){ - return ctx.body = yapi.commons.resReturn(null, 401, '线上域名格式有误') + if (!this.verifyDomain(params.prd_host)) { + return ctx.body = yapi.commons.resReturn(null, 401, '线上域名格式有误'); } - if(projectData.name === params.name){ + if (projectData.name === params.name) { delete params.name; } - if(projectData.basepath === params.basepath && projectData.prd_host === params.prd_host){ - delete params.basepath - delete params.prd_host + if (projectData.basepath === params.basepath && projectData.prd_host === params.prd_host) { + delete params.basepath; + delete params.prd_host; } - if(params.name){ + if (params.name) { let checkRepeat = await this.Model.checkNameRepeat(params.name); - if(checkRepeat > 0){ - return ctx.body = yapi.commons.resReturn(null, 401, '已存在的项目名'); + if (checkRepeat > 0) { + return ctx.body = yapi.commons.resReturn(null, 401, '已存在的项目名'); } } - if(params.basepath && params.prd_host){ + if (params.basepath && params.prd_host) { let checkRepeatDomain = await this.Model.checkDomainRepeat(params.prd_host, params.basepath); - if(checkRepeatDomain > 0){ - return ctx.body = yapi.commons.resReturn(null, 401, '已存在domain和basepath'); + if (checkRepeatDomain > 0) { + return ctx.body = yapi.commons.resReturn(null, 401, '已存在domain和basepath'); } } - let data= { + let data = { uid: this.getUid(), up_time: yapi.commons.time() - } + }; - if(params.name) data.name = params.name; - if(params.desc) data.desc = params.desc; - if(params.prd_host && params.basepath){ + if (params.name) data.name = params.name; + if (params.desc) data.desc = params.desc; + if (params.prd_host && params.basepath) { data.prd_host = params.prd_host; data.basepath = params.basepath; } - if(params.protocol) data.protocol = params.protocol; - if(params.env) data.env = params.env; + if (params.protocol) data.protocol = params.protocol; + if (params.env) data.env = params.env; let result = await this.Model.up(id, data); - ctx.body = yapi.commons.resReturn(result) - }catch(e){ - ctx.body = yapi.commons.resReturn(null, 402, e.message) + ctx.body = yapi.commons.resReturn(result); + } catch (e) { + ctx.body = yapi.commons.resReturn(null, 402, e.message); } } @@ -412,11 +414,11 @@ class projectController extends baseController { const { q } = ctx.request.query; if (!q) { - return ctx.body = yapi.commons.resReturn(void 0, 400, 'No keyword.') + return ctx.body = yapi.commons.resReturn(void 0, 400, 'No keyword.'); } if (!yapi.commons.validateSearchKeyword(q)) { - return ctx.body = yapi.commons.resReturn(void 0, 400, 'Bad query.') + return ctx.body = yapi.commons.resReturn(void 0, 400, 'Bad query.'); } let projectList = await this.Model.search(q); @@ -436,7 +438,7 @@ class projectController extends baseController { let groupRules = [ '_id', 'uid', - { key: 'group_name', alias: 'groupName'}, + { key: 'group_name', alias: 'groupName' }, { key: 'group_desc', alias: 'groupDesc' }, { key: 'add_time', alias: 'addTime' }, { key: 'up_time', alias: 'upTime' } @@ -450,7 +452,7 @@ class projectController extends baseController { group: groupList }; - return ctx.body = yapi.commons.resReturn(queryList, 0, 'ok') + return ctx.body = yapi.commons.resReturn(queryList, 0, 'ok'); } } diff --git a/server/controllers/user.js b/server/controllers/user.js index ed5a638f..ab163faa 100644 --- a/server/controllers/user.js +++ b/server/controllers/user.js @@ -1,15 +1,14 @@ -import userModel from '../models/user.js' -import yapi from '../yapi.js' -import baseController from './base.js' -import mongoose from 'mongoose' -import request from 'request' -import common from '../utils/commons.js' +import userModel from '../models/user.js'; +import yapi from '../yapi.js'; +import baseController from './base.js'; +import request from 'request'; +import common from '../utils/commons.js'; const jwt = require('jsonwebtoken'); class userController extends baseController { constructor(ctx) { - super(ctx) + super(ctx); this.Model = yapi.getInst(userModel); } /** @@ -41,14 +40,15 @@ class userController extends baseController { if (!result) { return ctx.body = yapi.commons.resReturn(null, 404, '该用户不存在'); } else if (yapi.commons.generatePassword(password, result.passsalt) === result.password) { - this.setLoginCookie(result._id, result.passsalt) + this.setLoginCookie(result._id, result.passsalt); return ctx.body = yapi.commons.resReturn({ username: result.username, uid: result._id, email: result.email, add_time: result.add_time, - up_time: result.up_time + up_time: result.up_time, + server_ip: yapi.WEBCONFIG.server_ip }, 0, 'logout success...'); } else { @@ -72,7 +72,6 @@ class userController extends baseController { ctx.body = yapi.commons.resReturn('ok'); } - /** * 第三方登录需要提供一个request方法和 token字段,暂时只支持qunar第三方 * @return {email: String, username: String} @@ -88,45 +87,45 @@ class userController extends baseController { let ret = { email: result.userId + '@qunar.com', username: result.data.userInfo.name - } - resolve(ret) + }; + resolve(ret); } else { - reject(result) + reject(result); } } - reject(error) - }) - }) + reject(error); + }); + }); }, tokenField: 'token' - } + }; } - - async loginByToken(ctx) { let config = this.thirdQunarLogin(); - let token = ctx.request.body[config.tokenField] || ctx.request.query[config.tokenField]; try { let ret = await config.request(token); let login = await this.handleThirdLogin(ret.email, ret.username); + if (login === true) { yapi.commons.log('login success'); - ctx.redirect('/') + ctx.redirect('/'); } } catch (e) { - yapi.commons.log(e.message, 'error') - ctx.redirect('/') + yapi.commons.log(e.message, 'error'); + ctx.redirect('/'); } } async handleThirdLogin(email, username) { let user, data, passsalt; - var userInst = yapi.getInst(userModel); + let userInst = yapi.getInst(userModel); + try { user = await userInst.findByEmail(email); + if (!user || !user._id) { passsalt = yapi.commons.randStr(); data = { @@ -137,18 +136,18 @@ class userController extends baseController { role: 'member', add_time: yapi.commons.time(), up_time: yapi.commons.time() - } + }; user = await userInst.save(data); yapi.commons.sendMail({ to: email, contents: `

亲爱的用户:

您好,感谢使用YApi,系统检测您是第一次用Qsso账号登录YApi服务,您的Email是: ${email} ,初始化密码为:${passsalt}

` - }) + }); } - this.setLoginCookie(user._id, user.passsalt) + this.setLoginCookie(user._id, user.passsalt); return true; } catch (e) { - console.error("third_login:", e.message) + console.error('third_login:', e.message); // eslint-disable-line return false; } } @@ -205,27 +204,23 @@ class userController extends baseController { } } - async forgetPassword(ctx) { + async forgetPassword() { } - } - - async resetPassword(ctx) { - - } + async resetPassword() { } setLoginCookie(uid, passsalt) { let token = jwt.sign({ uid: uid }, passsalt, { expiresIn: '7 days' }); + this.ctx.cookies.set('_yapi_token', token, { expires: yapi.commons.expireDate(7), httpOnly: true - }) + }); this.ctx.cookies.set('_yapi_uid', uid, { expires: yapi.commons.expireDate(7), httpOnly: true - }) + }); } - /** * 用户注册接口 * @interface /user/reg @@ -239,23 +234,25 @@ class userController extends baseController { * @example ./api/user/login.json */ async reg(ctx) { //注册 - var userInst = yapi.getInst(userModel); + let userInst = yapi.getInst(userModel); let params = ctx.request.body; //获取请求的参数,检查是否存在用户名和密码 params = yapi.commons.handleParams(params, { username: 'string', password: 'string', email: 'string' - }) + }); if (!params.email) { return ctx.body = yapi.commons.resReturn(null, 400, '邮箱不能为空'); } + if (!params.password) { return ctx.body = yapi.commons.resReturn(null, 400, '密码不能为空'); } - var checkRepeat = await userInst.checkRepeat(params.email);//然后检查是否已经存在该用户 + let checkRepeat = await userInst.checkRepeat(params.email);//然后检查是否已经存在该用户 + if (checkRepeat > 0) { return ctx.body = yapi.commons.resReturn(null, 401, '该email已经注册'); } @@ -269,14 +266,16 @@ class userController extends baseController { role: 'member', add_time: yapi.commons.time(), up_time: yapi.commons.time() - } + }; + if (!data.username) { data.username = data.email.substr(0, data.email.indexOf('@')); } + try { let user = await userInst.save(data); - this.setLoginCookie(user._id, user.passsalt) + this.setLoginCookie(user._id, user.passsalt); ctx.body = yapi.commons.resReturn({ uid: user._id, email: user.email, @@ -288,13 +287,12 @@ class userController extends baseController { yapi.commons.sendMail({ to: user.email, contents: `

亲爱的用户:

您好,感谢使用YApi,您的账号 ${params.email} 已经注册成功

` - }) + }); } catch (e) { ctx.body = yapi.commons.resReturn(null, 401, e.message); } } - /** * 获取用户列表 * @interface /user/list @@ -306,11 +304,10 @@ class userController extends baseController { * @returns {Object} * @example */ - - async list(ctx){ + async list(ctx) { let page = ctx.request.query.page || 1, limit = ctx.request.query.limit || 10; - + const userInst = yapi.getInst(userModel); try { let user = await userInst.listWithPaging(page, limit); @@ -319,8 +316,8 @@ class userController extends baseController { total: Math.ceil(count / limit), list: user }); - } catch(e) { - return ctx.body = yapi.commons.resReturn(null,402,e.message); + } catch (e) { + return ctx.body = yapi.commons.resReturn(null, 402, e.message); } } @@ -334,19 +331,22 @@ class userController extends baseController { * @returns {Object} * @example */ - async findById(ctx) { //根据id获取用户信息 try { - var userInst = yapi.getInst(userModel); + let userInst = yapi.getInst(userModel); let id = ctx.request.query.id; + if (!id) { return ctx.body = yapi.commons.resReturn(null, 400, 'uid不能为空'); } + let result = await userInst.findById(id); - if(!result){ - return ctx.body = yapi.commons.resReturn(null,402,"不存在的用户"); + + if (!result) { + return ctx.body = yapi.commons.resReturn(null, 402, '不存在的用户'); } - return ctx.body = yapi.commons.resReturn({ + + return ctx.body = yapi.commons.resReturn({ uid: result._id, username: result.username, email: result.email, @@ -354,8 +354,8 @@ class userController extends baseController { add_time: result.add_time, up_time: result.up_time }); - }catch(e){ - return ctx.body = yapi.commons.resReturn(null,402,e.message); + } catch (e) { + return ctx.body = yapi.commons.resReturn(null, 402, e.message); } } @@ -370,16 +370,20 @@ class userController extends baseController { * @example */ async del(ctx) { //根据id删除一个用户 - try { + try { if (this.getRole() !== 'admin') { return ctx.body = yapi.commons.resReturn(null, 402, 'Without permission.'); } - var userInst = yapi.getInst(userModel); + + let userInst = yapi.getInst(userModel); let id = ctx.request.body.id; + if (!id) { return ctx.body = yapi.commons.resReturn(null, 400, 'uid不能为空'); } + let result = await userInst.del(id); + ctx.body = yapi.commons.resReturn(result); } catch (e) { ctx.body = yapi.commons.resReturn(null, 402, e.message); @@ -399,30 +403,36 @@ class userController extends baseController { * @returns {Object} * @example */ - async update(ctx){ //更新用户信息 - try{ + async update(ctx) { //更新用户信息 + try { let params = ctx.request.body; + params = yapi.commons.handleParams(params, { username: 'string', email: 'string' - }) - if(this.getRole() !== 'admin' && params.uid != this.getUid()){ - return ctx.body = yapi.commons.resReturn(null,401,'没有权限'); + }); + + if (this.getRole() !== 'admin' && params.uid != this.getUid()) { + return ctx.body = yapi.commons.resReturn(null, 401, '没有权限'); } - var userInst = yapi.getInst(userModel); + + let userInst = yapi.getInst(userModel); let id = params.uid; + if (!id) { return ctx.body = yapi.commons.resReturn(null, 400, 'uid不能为空'); } - let data ={ + let data = { up_time: yapi.commons.time() }; - if(this.getRole() === 'admin'){ - params.role && (data.role = params.role) + + if (this.getRole() === 'admin') { + params.role && (data.role = params.role); } - params.username && (data.username = params.username) - params.email && (data.email = params.email) + + params.username && (data.username = params.username); + params.email && (data.email = params.email); if (data.email) { var checkRepeat = await userInst.checkRepeat(data.email);//然后检查是否已经存在该用户 @@ -431,8 +441,8 @@ class userController extends baseController { } } - let result = await userInst.update(id, data); + ctx.body = yapi.commons.resReturn(result); } catch (e) { ctx.body = yapi.commons.resReturn(null, 402, e.message); @@ -480,7 +490,7 @@ class userController extends baseController { ]; let filteredRes = common.filterRes(queryList, rules); - console.log(queryList) + console.log(queryList); // eslint-disable-line return ctx.body = yapi.commons.resReturn(filteredRes, 0, 'ok'); } diff --git a/server/install.js b/server/install.js index 1ac097ce..29bdb305 100644 --- a/server/install.js +++ b/server/install.js @@ -7,7 +7,6 @@ import userModel from './models/user.js'; yapi.commons = commons; yapi.connect = dbModule.connect(); - function install() { let exist = yapi.commons.fileExist(yapi.path.join(yapi.WEBROOT_RUNTIME, 'init.lock')); @@ -34,10 +33,10 @@ function setupSql() { result.then(function () { fs.ensureFileSync(yapi.path.join(yapi.WEBROOT_RUNTIME, 'init.lock')); - console.log(`初始化管理员账号 "${yapi.WEBCONFIG.adminAccount}" 成功`); + console.log(`初始化管理员账号 "${yapi.WEBCONFIG.adminAccount}" 成功`); // eslint-disable-line process.exit(0); }, function (err) { - console.log(`初始化管理员账号 "${yapi.WEBCONFIG.adminAccount}" 失败, ${err.message}`); + console.log(`初始化管理员账号 "${yapi.WEBCONFIG.adminAccount}" 失败, ${err.message}`); // eslint-disable-line process.exit(0); }); } diff --git a/server/middleware/checkToken.js b/server/middleware/checkToken.js index 3ae01334..6926ec23 100644 --- a/server/middleware/checkToken.js +++ b/server/middleware/checkToken.js @@ -1,4 +1,4 @@ -const jwt = require('jsonwebtoken'); +// const jwt = require('jsonwebtoken'); //检查token是否过期 module.exports = async ( ctx, next ) => { @@ -14,4 +14,4 @@ module.exports = async ( ctx, next ) => { // ctx.throw(401, 'invalid token'); // } await next(); -} +}; diff --git a/server/middleware/mockServer.js b/server/middleware/mockServer.js index 461874a4..e6389063 100644 --- a/server/middleware/mockServer.js +++ b/server/middleware/mockServer.js @@ -1,66 +1,70 @@ import yapi from '../yapi.js'; -import projectModel from '../models/project.js' -import interfaceModel from '../models/interface.js' -import Mock from 'mockjs' +import projectModel from '../models/project.js'; +import interfaceModel from '../models/interface.js'; +import Mock from 'mockjs'; module.exports = async (ctx, next) => { - yapi.commons.log('Server Recevie Request...') + yapi.commons.log('Server Recevie Request...'); + let hostname = ctx.hostname; let config = yapi.WEBCONFIG; - if(ctx.hostname === config.webhost){ - if(next) await next(); + + if (ctx.hostname === config.webhost) { + if (next) await next(); return true; } - yapi.commons.log('MockServer Running...') + + yapi.commons.log('MockServer Running...'); let projectInst = yapi.getInst(projectModel), projects; - try{ + + try { projects = await projectInst.getByDomain(hostname); - }catch(e){ + } catch (e) { return ctx.body = yapi.commons.resReturn(null, 403, e.message); } - + let matchProject = [], maxBasepath = 0; - - for(let i=0, l = projects.length; i< l; i++){ + + for (let i = 0, l = projects.length; i < l; i++) { let project = projects[i]; - - if(ctx.path && ctx.path.indexOf(project.basepath) === 0){ + + if (ctx.path && ctx.path.indexOf(project.basepath) === 0) { matchProject.push(project); - if(project.basepath.length > maxBasepath){ + + if (project.basepath.length > maxBasepath) { maxBasepath = project.basepath.length; matchProject = project; } } } - if(matchProject === false){ + if (matchProject === false) { return ctx.body = yapi.commons.resReturn(null, 400, '不存在的domain'); } let project = matchProject, interfaceData; let interfaceInst = yapi.getInst(interfaceModel); - try{ - interfaceData = await interfaceInst.getByPath(project._id, ctx.path.substr(project.basepath.length)); - if(!interfaceData || interfaceData.length === 0){ + try { + interfaceData = await interfaceInst.getByPath(project._id, ctx.path.substr(project.basepath.length)); + + if (!interfaceData || interfaceData.length === 0) { return ctx.body = yapi.commons.resReturn(null, 404, '不存在的api'); } - if(interfaceData.length > 1){ + if (interfaceData.length > 1) { return ctx.body = yapi.commons.resReturn(null, 405, '存在多个api,请检查数据库'); } interfaceData = interfaceData[0]; - - if(interfaceData.res_body_type === 'json'){ + + if (interfaceData.res_body_type === 'json') { return ctx.body = Mock.mock( yapi.commons.json_parse(interfaceData.res_body) ); } return ctx.body = interfaceData.res_body; - }catch(e){ + } catch (e) { return ctx.body = yapi.commons.resReturn(null, 409, e.message); } - - -} \ No newline at end of file +}; \ No newline at end of file diff --git a/server/middleware/userauth.js b/server/middleware/userauth.js index 5e2d0a36..52fe88fa 100644 --- a/server/middleware/userauth.js +++ b/server/middleware/userauth.js @@ -1,6 +1,6 @@ module.exports = async (ctx, next) => { let path = ctx.path; - console.log(path) - console.log(ctx.hostname) - if(next) await next(); -} \ No newline at end of file + console.log(path); // eslint-disable-line + console.log(ctx.hostname); // eslint-disable-line + if (next) await next(); +}; \ No newline at end of file diff --git a/server/models/group.js b/server/models/group.js index baaadc61..8c2b8dec 100644 --- a/server/models/group.js +++ b/server/models/group.js @@ -1,5 +1,4 @@ import yapi from '../yapi.js'; -import mongoose from 'mongoose'; import baseModel from './base.js'; class groupModel extends baseModel { @@ -29,7 +28,7 @@ class groupModel extends baseModel { } list() { - return this.model.find().select("group_name _id group_desc add_time up_time").exec(); + return this.model.find().select('group_name _id group_desc add_time up_time').exec(); } del(id) { diff --git a/server/models/project.js b/server/models/project.js index 0c8851e1..e7c16305 100644 --- a/server/models/project.js +++ b/server/models/project.js @@ -96,7 +96,7 @@ class projectModel extends baseModel { up(id, data) { data.up_time = yapi.commons.time(); return this.model.update({ - _id: id, + _id: id }, data, { runValidators: true }); } diff --git a/server/router.js b/server/router.js index 2846f3bf..e5bc2a8e 100644 --- a/server/router.js +++ b/server/router.js @@ -91,8 +91,6 @@ function createAction(controller, path, method, action) { } else { ctx.body = yapi.commons.resReturn(null, 400, 'Without Permission.'); } - - }); } diff --git a/server/utils/commons.js b/server/utils/commons.js index 360d380a..1407ad8c 100644 --- a/server/utils/commons.js +++ b/server/utils/commons.js @@ -24,16 +24,16 @@ exports.log = (msg, type) => { switch (type) { case 'log': - f = console.log; + f = console.log; // eslint-disable-line break; case 'warn': - f = console.warn; + f = console.warn; // eslint-disable-line break; case 'error': - f = console.error; + f = console.error; // eslint-disable-line break; default: - f = console.log; + f = console.log; // eslint-disable-line break; } @@ -129,7 +129,7 @@ exports.sendMail = (options, cb) => { html: options.contents }, cb); } catch (e) { - console.error(e.message); + console.error(e.message); // eslint-disable-line } }; diff --git a/server/utils/initConfig.js b/server/utils/initConfig.js index bafb5980..f2eef3bd 100644 --- a/server/utils/initConfig.js +++ b/server/utils/initConfig.js @@ -3,9 +3,9 @@ import fs from 'fs-extra'; import config from '../config.js'; let runtimePath = config.runtime_path; -fs.ensureDirSync( runtimePath ); -fs.ensureDirSync( path.join(runtimePath, 'log')); -let configPath = path.join(runtimePath, 'config.json') +fs.ensureDirSync(runtimePath); +fs.ensureDirSync(path.join(runtimePath, 'log')); +let configPath = path.join(runtimePath, 'config.json'); fs.writeFileSync(configPath, JSON.stringify(config, null, '\t'), diff --git a/server/yapi.js b/server/yapi.js index a429e143..e716ab95 100644 --- a/server/yapi.js +++ b/server/yapi.js @@ -35,7 +35,7 @@ function delInst(m) { try { insts.delete(m); } catch (err) { - console.error(err); + console.error(err); // eslint-disable-line } } diff --git a/server_dist/app.js b/server_dist/app.js index 4ca33334..64645345 100644 --- a/server_dist/app.js +++ b/server_dist/app.js @@ -20,10 +20,6 @@ var _koa = require('koa'); var _koa2 = _interopRequireDefault(_koa); -var _koaConvert = require('koa-convert'); - -var _koaConvert2 = _interopRequireDefault(_koaConvert); - var _koaStatic = require('koa-static'); var _koaStatic2 = _interopRequireDefault(_koaStatic); diff --git a/server_dist/controllers/base.js b/server_dist/controllers/base.js index 9b0c96bc..fc84bf30 100644 --- a/server_dist/controllers/base.js +++ b/server_dist/controllers/base.js @@ -154,6 +154,7 @@ var baseController = function () { key: 'getLoginStatus', value: function () { var _ref3 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3(ctx) { + var result; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { @@ -165,16 +166,19 @@ var baseController = function () { _context3.t0 = _context3.sent; if (!(_context3.t0 === true)) { - _context3.next = 5; + _context3.next = 7; break; } - return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(_yapi2.default.commons.fieldSelect(this.$user, ['_id', 'username', 'email', 'up_time', 'add_time']))); + result = _yapi2.default.commons.fieldSelect(this.$user, ['_id', 'username', 'email', 'up_time', 'add_time']); - case 5: + result.server_ip = _yapi2.default.WEBCONFIG.server_ip; + return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(result)); + + case 7: return _context3.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 300, 'Please login.')); - case 6: + case 8: case 'end': return _context3.stop(); } diff --git a/server_dist/controllers/log.js b/server_dist/controllers/log.js index ae5a3024..3de4aa16 100644 --- a/server_dist/controllers/log.js +++ b/server_dist/controllers/log.js @@ -103,6 +103,7 @@ var logController = function (_baseController) { case 9: count = _context.sent; + ctx.body = _yapi2.default.commons.resReturn({ total: Math.ceil(count / limit), list: result @@ -114,7 +115,7 @@ var logController = function (_baseController) { _context.prev = 13; _context.t0 = _context['catch'](3); - ctx.body = _yapi2.default.commons.resReturn(null, 402, e.message); + ctx.body = _yapi2.default.commons.resReturn(null, 402, _context.t0.message); case 16: case 'end': diff --git a/server_dist/controllers/project.js b/server_dist/controllers/project.js index 2f337485..54270f44 100644 --- a/server_dist/controllers/project.js +++ b/server_dist/controllers/project.js @@ -711,7 +711,7 @@ var projectController = function (_baseController) { _context7.prev = 21; _context7.t1 = _context7['catch'](0); - ctx.body = _yapi2.default.commons.resReturn(null, 402, e.message); + ctx.body = _yapi2.default.commons.resReturn(null, 402, _context7.t1.message); case 24: case 'end': diff --git a/server_dist/controllers/user.js b/server_dist/controllers/user.js index bb5627a6..50cd044b 100644 --- a/server_dist/controllers/user.js +++ b/server_dist/controllers/user.js @@ -44,10 +44,6 @@ var _base = require('./base.js'); var _base2 = _interopRequireDefault(_base); -var _mongoose = require('mongoose'); - -var _mongoose2 = _interopRequireDefault(_mongoose); - var _request2 = require('request'); var _request3 = _interopRequireDefault(_request2); @@ -141,7 +137,8 @@ var userController = function (_baseController) { uid: result._id, email: result.email, add_time: result.add_time, - up_time: result.up_time + up_time: result.up_time, + server_ip: _yapi2.default.WEBCONFIG.server_ip }, 0, 'logout success...')); @@ -254,6 +251,7 @@ var userController = function (_baseController) { case 8: login = _context3.sent; + if (login === true) { _yapi2.default.commons.log('login success'); ctx.redirect('/'); @@ -335,7 +333,7 @@ var userController = function (_baseController) { _context4.prev = 17; _context4.t0 = _context4['catch'](2); - console.error("third_login:", _context4.t0.message); + console.error('third_login:', _context4.t0.message); // eslint-disable-line return _context4.abrupt('return', false); case 21: @@ -468,7 +466,7 @@ var userController = function (_baseController) { }, { key: 'forgetPassword', value: function () { - var _ref6 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee6(ctx) { + var _ref6 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee6() { return _regenerator2.default.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { @@ -480,7 +478,7 @@ var userController = function (_baseController) { }, _callee6, this); })); - function forgetPassword(_x7) { + function forgetPassword() { return _ref6.apply(this, arguments); } @@ -489,7 +487,7 @@ var userController = function (_baseController) { }, { key: 'resetPassword', value: function () { - var _ref7 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee7(ctx) { + var _ref7 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee7() { return _regenerator2.default.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { @@ -501,7 +499,7 @@ var userController = function (_baseController) { }, _callee7, this); })); - function resetPassword(_x8) { + function resetPassword() { return _ref7.apply(this, arguments); } @@ -511,6 +509,7 @@ var userController = function (_baseController) { key: 'setLoginCookie', value: function setLoginCookie(uid, passsalt) { var token = jwt.sign({ uid: uid }, passsalt, { expiresIn: '7 days' }); + this.ctx.cookies.set('_yapi_token', token, { expires: _yapi2.default.commons.expireDate(7), httpOnly: true @@ -594,9 +593,11 @@ var userController = function (_baseController) { up_time: _yapi2.default.commons.time() }; + if (!data.username) { data.username = data.email.substr(0, data.email.indexOf('@')); } + _context8.prev = 15; _context8.next = 18; return userInst.save(data); @@ -604,8 +605,8 @@ var userController = function (_baseController) { case 18: user = _context8.sent; - this.setLoginCookie(user._id, user.passsalt); + this.setLoginCookie(user._id, user.passsalt); ctx.body = _yapi2.default.commons.resReturn({ uid: user._id, email: user.email, @@ -635,7 +636,7 @@ var userController = function (_baseController) { }, _callee8, this, [[15, 24]]); })); - function reg(_x9) { + function reg(_x7) { return _ref8.apply(this, arguments); } @@ -694,7 +695,7 @@ var userController = function (_baseController) { }, _callee9, this, [[2, 12]]); })); - function list(_x10) { + function list(_x8) { return _ref9.apply(this, arguments); } @@ -744,7 +745,7 @@ var userController = function (_baseController) { break; } - return _context10.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 402, "不存在的用户")); + return _context10.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 402, '不存在的用户')); case 10: return _context10.abrupt('return', ctx.body = _yapi2.default.commons.resReturn({ @@ -769,7 +770,7 @@ var userController = function (_baseController) { }, _callee10, this, [[0, 13]]); })); - function findById(_x11) { + function findById(_x9) { return _ref10.apply(this, arguments); } @@ -823,6 +824,7 @@ var userController = function (_baseController) { case 9: result = _context11.sent; + ctx.body = _yapi2.default.commons.resReturn(result); _context11.next = 16; break; @@ -841,7 +843,7 @@ var userController = function (_baseController) { }, _callee11, this, [[0, 13]]); })); - function del(_x12) { + function del(_x10) { return _ref11.apply(this, arguments); } @@ -874,6 +876,7 @@ var userController = function (_baseController) { _context12.prev = 0; params = ctx.request.body; + params = _yapi2.default.commons.handleParams(params, { username: 'string', email: 'string' @@ -899,13 +902,14 @@ var userController = function (_baseController) { case 9: data = { - up_time: _yapi2.default.commons.time() }; + if (this.getRole() === 'admin') { params.role && (data.role = params.role); } + params.username && (data.username = params.username); params.email && (data.email = params.email); @@ -934,6 +938,7 @@ var userController = function (_baseController) { case 21: result = _context12.sent; + ctx.body = _yapi2.default.commons.resReturn(result); _context12.next = 28; break; @@ -952,7 +957,7 @@ var userController = function (_baseController) { }, _callee12, this, [[0, 25]]); })); - function update(_x13) { + function update(_x11) { return _ref12.apply(this, arguments); } @@ -1014,7 +1019,7 @@ var userController = function (_baseController) { }]; filteredRes = _commons2.default.filterRes(queryList, rules); - console.log(queryList); + console.log(queryList); // eslint-disable-line return _context13.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(filteredRes, 0, 'ok')); @@ -1026,7 +1031,7 @@ var userController = function (_baseController) { }, _callee13, this); })); - function search(_x14) { + function search(_x12) { return _ref13.apply(this, arguments); } diff --git a/server_dist/install.js b/server_dist/install.js index c466f30c..b91b03a6 100644 --- a/server_dist/install.js +++ b/server_dist/install.js @@ -51,10 +51,10 @@ function setupSql() { result.then(function () { _fsExtra2.default.ensureFileSync(_yapi2.default.path.join(_yapi2.default.WEBROOT_RUNTIME, 'init.lock')); - console.log('\u521D\u59CB\u5316\u7BA1\u7406\u5458\u8D26\u53F7 "' + _yapi2.default.WEBCONFIG.adminAccount + '" \u6210\u529F'); + console.log('\u521D\u59CB\u5316\u7BA1\u7406\u5458\u8D26\u53F7 "' + _yapi2.default.WEBCONFIG.adminAccount + '" \u6210\u529F'); // eslint-disable-line process.exit(0); }, function (err) { - console.log('\u521D\u59CB\u5316\u7BA1\u7406\u5458\u8D26\u53F7 "' + _yapi2.default.WEBCONFIG.adminAccount + '" \u5931\u8D25, ' + err.message); + console.log('\u521D\u59CB\u5316\u7BA1\u7406\u5458\u8D26\u53F7 "' + _yapi2.default.WEBCONFIG.adminAccount + '" \u5931\u8D25, ' + err.message); // eslint-disable-line process.exit(0); }); } diff --git a/server_dist/middleware/checkToken.js b/server_dist/middleware/checkToken.js index cbe316ba..0eca1c2f 100644 --- a/server_dist/middleware/checkToken.js +++ b/server_dist/middleware/checkToken.js @@ -1,16 +1,16 @@ -'use strict'; +"use strict"; -var _regenerator = require('babel-runtime/regenerator'); +var _regenerator = require("babel-runtime/regenerator"); var _regenerator2 = _interopRequireDefault(_regenerator); -var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); +var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator"); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var jwt = require('jsonwebtoken'); +// const jwt = require('jsonwebtoken'); //检查token是否过期 module.exports = function () { @@ -23,7 +23,7 @@ module.exports = function () { return next(); case 2: - case 'end': + case "end": return _context.stop(); } } diff --git a/server_dist/middleware/mockServer.js b/server_dist/middleware/mockServer.js index d9d66655..14cd95ef 100644 --- a/server_dist/middleware/mockServer.js +++ b/server_dist/middleware/mockServer.js @@ -35,6 +35,7 @@ module.exports = function () { switch (_context.prev = _context.next) { case 0: _yapi2.default.commons.log('Server Recevie Request...'); + hostname = ctx.hostname; config = _yapi2.default.WEBCONFIG; @@ -55,6 +56,7 @@ module.exports = function () { return _context.abrupt('return', true); case 8: + _yapi2.default.commons.log('MockServer Running...'); projectInst = _yapi2.default.getInst(_project3.default), projects = void 0; _context.prev = 10; @@ -81,6 +83,7 @@ module.exports = function () { if (ctx.path && ctx.path.indexOf(_project.basepath) === 0) { matchProject.push(_project); + if (_project.basepath.length > maxBasepath) { maxBasepath = _project.basepath.length; matchProject = _project; diff --git a/server_dist/middleware/userauth.js b/server_dist/middleware/userauth.js index b987d7fa..3cbed01f 100644 --- a/server_dist/middleware/userauth.js +++ b/server_dist/middleware/userauth.js @@ -19,8 +19,8 @@ module.exports = function () { case 0: path = ctx.path; - console.log(path); - console.log(ctx.hostname); + console.log(path); // eslint-disable-line + console.log(ctx.hostname); // eslint-disable-line if (!next) { _context.next = 6; diff --git a/server_dist/models/group.js b/server_dist/models/group.js index 784b27ff..5b0030f4 100644 --- a/server_dist/models/group.js +++ b/server_dist/models/group.js @@ -24,10 +24,6 @@ var _yapi = require('../yapi.js'); var _yapi2 = _interopRequireDefault(_yapi); -var _mongoose = require('mongoose'); - -var _mongoose2 = _interopRequireDefault(_mongoose); - var _base = require('./base.js'); var _base2 = _interopRequireDefault(_base); @@ -74,7 +70,7 @@ var groupModel = function (_baseModel) { }, { key: 'list', value: function list() { - return this.model.find().select("group_name _id group_desc add_time up_time").exec(); + return this.model.find().select('group_name _id group_desc add_time up_time').exec(); } }, { key: 'del', diff --git a/server_dist/utils/commons.js b/server_dist/utils/commons.js index 792f05ab..9c5137f6 100644 --- a/server_dist/utils/commons.js +++ b/server_dist/utils/commons.js @@ -47,16 +47,16 @@ exports.log = function (msg, type) { switch (type) { case 'log': - f = console.log; + f = console.log; // eslint-disable-line break; case 'warn': - f = console.warn; + f = console.warn; // eslint-disable-line break; case 'error': - f = console.error; + f = console.error; // eslint-disable-line break; default: - f = console.log; + f = console.log; // eslint-disable-line break; } @@ -151,7 +151,7 @@ exports.sendMail = function (options, cb) { html: options.contents }, cb); } catch (e) { - console.error(e.message); + console.error(e.message); // eslint-disable-line } }; diff --git a/server_dist/yapi.js b/server_dist/yapi.js index 34606718..2e38dd81 100644 --- a/server_dist/yapi.js +++ b/server_dist/yapi.js @@ -58,7 +58,7 @@ function delInst(m) { try { insts.delete(m); } catch (err) { - console.error(err); + console.error(err); // eslint-disable-line } } diff --git a/static/dev.html b/static/dev.html index 54d56854..fe862fc1 100644 --- a/static/dev.html +++ b/static/dev.html @@ -9,28 +9,12 @@
+ + + -