mirror of
https://github.com/YMFE/yapi.git
synced 2025-02-23 13:59:28 +08:00
Merge branch 'dev' of gitlab.corp.qunar.com:mfe/yapi into dev
This commit is contained in:
commit
3d46e72106
@ -1,87 +0,0 @@
|
||||
import React, { Component } from 'react'
|
||||
import axios from 'axios';
|
||||
import { Route, HashRouter, Redirect } from 'react-router-dom'
|
||||
import { Header, Home, ProjectGroups, Interface, News, AddInterface } from './containers/index'
|
||||
import User from './containers/User/User.js'
|
||||
|
||||
const LOADING_STATUS = 0;
|
||||
const GUEST_STATUS = 1;
|
||||
const MEMBER_STATUS = 2;
|
||||
|
||||
class App extends Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props)
|
||||
this.state = {
|
||||
login: LOADING_STATUS
|
||||
}
|
||||
}
|
||||
|
||||
route = (status) => {
|
||||
let r;
|
||||
if (status === LOADING_STATUS) {
|
||||
return <span>loading...</span>
|
||||
} else if (status === GUEST_STATUS) {
|
||||
r = (
|
||||
<HashRouter>
|
||||
|
||||
<div className="router-main">
|
||||
<Header />
|
||||
<Route path="/" component={Home} exact />
|
||||
<Redirect to="/" />
|
||||
</div>
|
||||
|
||||
|
||||
</HashRouter>
|
||||
)
|
||||
} else {
|
||||
r = (
|
||||
<HashRouter>
|
||||
<div className="router-main">
|
||||
<Header />
|
||||
<Route path="/" component={ProjectGroups} exact />
|
||||
<Route path="/ProjectGroups" component={ProjectGroups} />
|
||||
<Route path="/Interface" component={Interface} />
|
||||
<Route path="/user" component={User} />
|
||||
<Route path="/News" component={News} />
|
||||
<Route path="/AddInterface" component={ AddInterface } />
|
||||
</div>
|
||||
|
||||
</HashRouter>
|
||||
)
|
||||
}
|
||||
return r
|
||||
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
console.log('app.js init')
|
||||
axios.get('/user/status').then((res) => {
|
||||
if (res.data.errcode === 0 && res.data.data._id > 0) {
|
||||
this.setState({
|
||||
login: MEMBER_STATUS
|
||||
})
|
||||
} else {
|
||||
this.setState({
|
||||
login: GUEST_STATUS
|
||||
})
|
||||
}
|
||||
}, (err) => {
|
||||
this.setState({
|
||||
login: GUEST_STATUS
|
||||
})
|
||||
console.log(err.message)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
render() {
|
||||
console.log(MEMBER_STATUS)
|
||||
console.log(this.route(this.state.login))
|
||||
return this.route(this.state.login)
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
export default App
|
62
client/Application.js
Normal file
62
client/Application.js
Normal file
@ -0,0 +1,62 @@
|
||||
import React, { Component } from 'react'
|
||||
import { connect } from 'react-redux'
|
||||
import PropTypes from 'prop-types'
|
||||
import { Route, HashRouter } from 'react-router-dom'
|
||||
import { Home, ProjectGroups, Interface, News, AddInterface } from './containers/index'
|
||||
import User from './containers/User/User.js'
|
||||
import Header from './components/Header/Header'
|
||||
import { checkLoginState } from './actions/login'
|
||||
import { requireAuthentication } from './components/AuthenticatedComponent';
|
||||
|
||||
const LOADING_STATUS = 0;
|
||||
|
||||
@connect(
|
||||
state => {
|
||||
return{
|
||||
loginState:state.login.loginState
|
||||
}
|
||||
},
|
||||
{
|
||||
checkLoginState
|
||||
}
|
||||
)
|
||||
export default class App extends Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
login: LOADING_STATUS
|
||||
}
|
||||
}
|
||||
static propTypes = {
|
||||
checkLoginState:PropTypes.func,
|
||||
loginState:PropTypes.number
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.props.checkLoginState();
|
||||
}
|
||||
route = (status) => {
|
||||
let r;
|
||||
if (status === LOADING_STATUS) {
|
||||
return <span>loading...</span>
|
||||
} else {
|
||||
r = (
|
||||
<HashRouter>
|
||||
<div className="router-main">
|
||||
<Header />
|
||||
<Route path="/" component={Home} exact />
|
||||
<Route path="/ProjectGroups" component={requireAuthentication(ProjectGroups)} />
|
||||
<Route path="/Interface" component={requireAuthentication(Interface)} />
|
||||
<Route path="/user" component={requireAuthentication(User)} />
|
||||
<Route path="/News" component={requireAuthentication(News)} />
|
||||
<Route path="/AddInterface" component={ requireAuthentication(AddInterface) } />
|
||||
</div>
|
||||
</HashRouter>
|
||||
)
|
||||
}
|
||||
return r
|
||||
}
|
||||
render() {
|
||||
return this.route(this.props.loginState);
|
||||
}
|
||||
}
|
@ -1,4 +1,3 @@
|
||||
import LoginRedux from './reducer/Login/Login_redux.js'
|
||||
import login from './reducer/Login/login.js'
|
||||
import group from './reducer/group/group.js'
|
||||
import project from './reducer/group/project.js'
|
||||
@ -6,14 +5,15 @@ import Interface from './reducer/Interface/InterfaceReducer.js'
|
||||
import news from './reducer/news/news.js'
|
||||
import addInterface from './reducer/addInterface/addInterface.js'
|
||||
import user from './reducer/user/user.js'
|
||||
import menu from './reducer/menu/menu.js'
|
||||
|
||||
export default {
|
||||
group,
|
||||
login,
|
||||
LoginRedux,
|
||||
Interface,
|
||||
user,
|
||||
project,
|
||||
news,
|
||||
addInterface
|
||||
addInterface,
|
||||
menu
|
||||
}
|
||||
|
@ -2,68 +2,53 @@ import {
|
||||
LOGIN,
|
||||
LOGIN_OUT,
|
||||
LOGIN_TYPE,
|
||||
GET_LOGIN_STATE
|
||||
GET_LOGIN_STATE,
|
||||
REGISTER
|
||||
} from '../constants/action-types.js';
|
||||
import axios from 'axios';
|
||||
|
||||
|
||||
const checkLoginState = () => {
|
||||
return {
|
||||
type: GET_LOGIN_STATE,
|
||||
// payload 可以返回 Promise,异步请求使用 axios 即可
|
||||
payload: axios.get('/user/status')
|
||||
};
|
||||
}
|
||||
|
||||
const loginActions = (data) => {
|
||||
return (dispatch) => {
|
||||
axios.post('/user/login', data).then((res) => {
|
||||
if (res.data.errcode === 0) {
|
||||
dispatch({
|
||||
type: LOGIN,
|
||||
payload: {
|
||||
data: res
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.log('登录失败,errcode不为0');
|
||||
}
|
||||
}).catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const regActions = (data) => {
|
||||
console.log(data);
|
||||
const param = {
|
||||
email: data.email,
|
||||
password: data.password,
|
||||
username: data.userName
|
||||
}
|
||||
return () => {
|
||||
axios.post('/user/login', param).then((res) => {
|
||||
return(dispatch)=> {
|
||||
axios.get('/user/status').then((res) => {
|
||||
console.log(res);
|
||||
}).catch((err) => {
|
||||
console.log(err);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const logoutActions = () => {
|
||||
return(dispatch)=>{
|
||||
axios.get('./user/logout').then((res) => {
|
||||
console.log(res);
|
||||
if(res.data.errcode === 0){
|
||||
dispatch({
|
||||
type: LOGIN_OUT
|
||||
})
|
||||
}
|
||||
dispatch({
|
||||
type: GET_LOGIN_STATE,
|
||||
payload: res
|
||||
});
|
||||
}).catch((err) => {
|
||||
console.log(err);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const loginActions = (data) => {
|
||||
return {
|
||||
type: LOGIN,
|
||||
payload: axios.post('/user/login', data)
|
||||
};
|
||||
};
|
||||
|
||||
const regActions = (data) => {
|
||||
const { email, password, userName } = data;
|
||||
const param = {
|
||||
email,
|
||||
password,
|
||||
username: userName
|
||||
};
|
||||
return {
|
||||
type: REGISTER,
|
||||
payload: axios.post('/user/reg', param)
|
||||
};
|
||||
};
|
||||
|
||||
const logoutActions = () => {
|
||||
return {
|
||||
type: LOGIN_OUT,
|
||||
payload: axios.get('./user/logout')
|
||||
}
|
||||
}
|
||||
|
||||
const loginTypeAction = (index) => {
|
||||
return{
|
||||
type: LOGIN_TYPE,
|
||||
|
10
client/actions/menu.js
Normal file
10
client/actions/menu.js
Normal file
@ -0,0 +1,10 @@
|
||||
import {
|
||||
CHANGE_MENU_ITEM
|
||||
} from '../constants/action-types.js'
|
||||
|
||||
export function changeMenuItem(curKey) {
|
||||
return {
|
||||
type: CHANGE_MENU_ITEM,
|
||||
data: curKey
|
||||
}
|
||||
}
|
@ -15,7 +15,7 @@ const fetchProjectList = (id, pageNum) => {
|
||||
payload: axios.get('/project/list', {
|
||||
params: {
|
||||
group_id: id,
|
||||
page: pageNum,
|
||||
page: pageNum || 1,
|
||||
limit: variable.PAGE_LIMIT
|
||||
}
|
||||
})
|
||||
@ -37,10 +37,11 @@ const changeTableLoading = (data) => {
|
||||
};
|
||||
|
||||
const addProject = (data) => {
|
||||
const { name, prd_host, basepath, desc, group_id } = data;
|
||||
const { name, prd_host, basepath, desc, group_id, protocol } = data;
|
||||
const param = {
|
||||
name,
|
||||
prd_host,
|
||||
protocol,
|
||||
basepath,
|
||||
desc,
|
||||
group_id
|
||||
@ -53,13 +54,15 @@ const addProject = (data) => {
|
||||
};
|
||||
|
||||
const updateProject = (data) => {
|
||||
const { name, prd_host, basepath, desc, group_id } = data;
|
||||
const { name, prd_host, basepath, desc, _id, protocol, env } = data;
|
||||
const param = {
|
||||
name,
|
||||
prd_host,
|
||||
protocol,
|
||||
basepath,
|
||||
desc,
|
||||
group_id
|
||||
id: _id,
|
||||
env
|
||||
};
|
||||
return {
|
||||
type: PROJECT_UPDATE,
|
||||
|
@ -1,87 +0,0 @@
|
||||
import React, { Component } from 'react'
|
||||
import axios from 'axios';
|
||||
import { Route, HashRouter, Redirect } from 'react-router-dom'
|
||||
import { Header, Home, ProjectGroups, Interface, News, AddInterface } from './containers/index'
|
||||
import User from './containers/User/User.js'
|
||||
|
||||
const LOADING_STATUS = 0;
|
||||
const GUEST_STATUS = 1;
|
||||
const MEMBER_STATUS = 2;
|
||||
|
||||
class App extends Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props)
|
||||
this.state = {
|
||||
login: LOADING_STATUS
|
||||
}
|
||||
}
|
||||
|
||||
route = (status) => {
|
||||
let r;
|
||||
if (status === LOADING_STATUS) {
|
||||
return <span>loading...</span>
|
||||
} else if (status === GUEST_STATUS) {
|
||||
r = (
|
||||
<HashRouter>
|
||||
|
||||
<div className="router-main">
|
||||
<Header />
|
||||
<Route path="/" component={Home} exact />
|
||||
<Redirect to="/" />
|
||||
</div>
|
||||
|
||||
|
||||
</HashRouter>
|
||||
)
|
||||
} else {
|
||||
r = (
|
||||
<HashRouter>
|
||||
<div className="router-main">
|
||||
<Header />
|
||||
<Route path="/" component={ProjectGroups} exact />
|
||||
<Route path="/ProjectGroups" component={ProjectGroups} />
|
||||
<Route path="/Interface" component={Interface} />
|
||||
<Route path="/user" component={User} />
|
||||
<Route path="/News" component={News} />
|
||||
<Route path="/AddInterface" component={ AddInterface } />
|
||||
</div>
|
||||
|
||||
</HashRouter>
|
||||
)
|
||||
}
|
||||
return r
|
||||
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
console.log('app.js init')
|
||||
axios.get('/user/status').then((res) => {
|
||||
if (res.data.errcode === 0 && res.data.data._id > 0) {
|
||||
this.setState({
|
||||
login: MEMBER_STATUS
|
||||
})
|
||||
} else {
|
||||
this.setState({
|
||||
login: GUEST_STATUS
|
||||
})
|
||||
}
|
||||
}, (err) => {
|
||||
this.setState({
|
||||
login: GUEST_STATUS
|
||||
})
|
||||
console.log(err.message)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
render() {
|
||||
console.log(MEMBER_STATUS)
|
||||
console.log(this.route(this.state.login))
|
||||
return this.route(this.state.login)
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
export default App
|
@ -1,5 +1,5 @@
|
||||
import moment from 'moment'
|
||||
|
||||
exports.formatTime = (timestamp) => {
|
||||
return moment.unix(timestamp).format("YYYY-MM-DD:HH:mm:ss")
|
||||
}
|
||||
return moment.unix(timestamp).format("YYYY-MM-DD HH:mm:ss")
|
||||
}
|
||||
|
55
client/components/AuthenticatedComponent.js
Normal file
55
client/components/AuthenticatedComponent.js
Normal file
@ -0,0 +1,55 @@
|
||||
import React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import PropTypes from 'prop-types'
|
||||
import { changeMenuItem } from '../actions/menu'
|
||||
|
||||
|
||||
export function requireAuthentication(Component) {
|
||||
class AuthenticatedComponent extends React.Component {
|
||||
constructor(props){
|
||||
super(props);
|
||||
}
|
||||
static propTypes ={
|
||||
isAuthenticated : PropTypes.bool,
|
||||
location: PropTypes.object,
|
||||
dispatch: PropTypes.func,
|
||||
history: PropTypes.object,
|
||||
changeMenuItem:PropTypes.func
|
||||
}
|
||||
componentWillMount() {
|
||||
this.checkAuth();
|
||||
}
|
||||
componentWillReceiveProps() {
|
||||
this.checkAuth();
|
||||
}
|
||||
checkAuth() {
|
||||
if( !this.props.isAuthenticated ){
|
||||
this.props.history.push('/');
|
||||
this.props.changeMenuItem('/');
|
||||
}
|
||||
}
|
||||
render() {
|
||||
return (
|
||||
<div>
|
||||
{this.props.isAuthenticated
|
||||
? <Component {...this.props}/>
|
||||
: null
|
||||
}
|
||||
</div>
|
||||
)
|
||||
|
||||
}
|
||||
}
|
||||
return connect(
|
||||
(state) => {
|
||||
return{
|
||||
isAuthenticated: state.login.isLogin
|
||||
}
|
||||
},
|
||||
{
|
||||
changeMenuItem
|
||||
}
|
||||
)(AuthenticatedComponent);
|
||||
}
|
||||
|
||||
|
@ -11,7 +11,6 @@ class Footer extends Component {
|
||||
footList: PropTypes.array
|
||||
}
|
||||
render () {
|
||||
console.log(this.props);
|
||||
return (
|
||||
<div className = 'footer'>
|
||||
<div className = 'footContent'>
|
||||
|
@ -3,62 +3,105 @@ import React, { Component } from 'react'
|
||||
import PropTypes from 'prop-types'
|
||||
import { connect } from 'react-redux'
|
||||
import { Link } from 'react-router-dom'
|
||||
import { Icon, Layout, Menu} from 'antd'
|
||||
import { Icon, Layout, Menu, Dropdown, message } from 'antd'
|
||||
import { checkLoginState, logoutActions, loginTypeAction} from '../../actions/login'
|
||||
import { changeMenuItem } from '../../actions/menu'
|
||||
import { withRouter } from 'react-router';
|
||||
|
||||
import Srch from './Search/Search'
|
||||
const { Header } = Layout;
|
||||
|
||||
const MenuUser = (props) => (
|
||||
<Menu>
|
||||
<Menu.Item key="0">
|
||||
<Link to={`/profile/${props.uid}`} onClick={props.relieveLink}><Icon type="user" />{ props.user }</Link>
|
||||
</Menu.Item>
|
||||
<Menu.Item key="1">
|
||||
<Link to="/news" onClick={props.relieveLink}><Icon type="mail" />{ props.msg }</Link>
|
||||
</Menu.Item>
|
||||
<Menu.Item key="2">
|
||||
<a onClick={props.logout}>退出</a>
|
||||
</Menu.Item>
|
||||
</Menu>
|
||||
);
|
||||
MenuUser.propTypes={
|
||||
user:PropTypes.string,
|
||||
msg:PropTypes.string,
|
||||
uid: PropTypes.number,
|
||||
relieveLink:PropTypes.func,
|
||||
logout:PropTypes.func
|
||||
}
|
||||
|
||||
const ToolUser = (props)=> (
|
||||
<ul>
|
||||
<li><Link to="/user" onClick={props.relieveLink}><Icon type="user" />{ props.user }</Link></li>
|
||||
<li><Link to="/News" onClick={props.relieveLink}><Icon type="mail" />{ props.msg }</Link></li>
|
||||
<li onClick={props.logout}>退出</li>
|
||||
<li className="toolbar-li">
|
||||
<Srch groupList={props.groupList}/>
|
||||
</li>
|
||||
<li className="toolbar-li">
|
||||
<Dropdown overlay={
|
||||
<MenuUser
|
||||
user={props.user}
|
||||
msg={props.msg}
|
||||
uid={props.uid}
|
||||
relieveLink={props.relieveLink}
|
||||
logout={props.logout}
|
||||
/>
|
||||
}>
|
||||
<a className="dropdown-link">
|
||||
<Icon type="user"/>
|
||||
</a>
|
||||
</Dropdown>
|
||||
</li>
|
||||
</ul>
|
||||
);
|
||||
ToolUser.propTypes={
|
||||
user:PropTypes.string,
|
||||
msg:PropTypes.string,
|
||||
uid: PropTypes.number,
|
||||
relieveLink:PropTypes.func,
|
||||
logout:PropTypes.func
|
||||
logout:PropTypes.func,
|
||||
groupList: PropTypes.array
|
||||
};
|
||||
|
||||
|
||||
@withRouter
|
||||
class HeaderCom extends Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
current : window.location.hash.split("#")[1]
|
||||
}
|
||||
}
|
||||
static propTypes ={
|
||||
router: PropTypes.object,
|
||||
user: PropTypes.string,
|
||||
msg: PropTypes.string,
|
||||
uid: PropTypes.number,
|
||||
login:PropTypes.bool,
|
||||
curKey:PropTypes.string,
|
||||
relieveLink:PropTypes.func,
|
||||
logoutActions:PropTypes.func,
|
||||
checkLoginState:PropTypes.func,
|
||||
loginTypeAction:PropTypes.func,
|
||||
changeMenuItem:PropTypes.func,
|
||||
history: PropTypes.object,
|
||||
location: PropTypes.object
|
||||
}
|
||||
componentDidMount() {
|
||||
const { router } = this.props;
|
||||
console.log(router);
|
||||
}
|
||||
linkTo = (e) =>{
|
||||
this.setState({
|
||||
current : e.key
|
||||
})
|
||||
this.props.changeMenuItem(e.key);
|
||||
}
|
||||
relieveLink = () => {
|
||||
this.setState({
|
||||
current : ""
|
||||
})
|
||||
this.props.changeMenuItem("");
|
||||
}
|
||||
logout = (e) => {
|
||||
e.preventDefault();
|
||||
this.props.logoutActions();
|
||||
this.props.logoutActions().then((res) => {
|
||||
if (res.payload.data.errcode == 0) {
|
||||
this.props.history.push('/');
|
||||
this.props.changeMenuItem("/");
|
||||
message.success('退出成功! ');
|
||||
} else {
|
||||
message.error(res.payload.data.errmsg);
|
||||
}
|
||||
}).catch((err) => {
|
||||
message.error(err);
|
||||
});
|
||||
}
|
||||
handleLogin = (e) => {
|
||||
e.preventDefault();
|
||||
@ -69,7 +112,7 @@ class HeaderCom extends Component {
|
||||
this.props.loginTypeAction("2");
|
||||
}
|
||||
checkLoginState = () => {
|
||||
this.props.checkLoginState().then((res) => {
|
||||
this.props.checkLoginState.then((res) => {
|
||||
if (res.payload.data.errcode !== 0) {
|
||||
this.props.history.push('/');
|
||||
}
|
||||
@ -78,11 +121,11 @@ class HeaderCom extends Component {
|
||||
})
|
||||
}
|
||||
render () {
|
||||
this.checkLoginState();
|
||||
const { login, user, msg } = this.props;
|
||||
const { login, user, msg, uid, curKey } = this.props;
|
||||
console.log(curKey);
|
||||
return (
|
||||
<acticle className="header-box">
|
||||
<Layout className="'layout">
|
||||
<Layout className="layout">
|
||||
<Header>
|
||||
<div className="content">
|
||||
<div className="logo">
|
||||
@ -94,7 +137,7 @@ class HeaderCom extends Component {
|
||||
theme="dark"
|
||||
style={{ lineHeight : '.64rem'}}
|
||||
onClick={this.linkTo}
|
||||
selectedKeys={[this.state.current]}
|
||||
selectedKeys={[curKey]}
|
||||
>
|
||||
<Menu.Item key="/">
|
||||
<Link to="/">首页</Link>
|
||||
@ -110,7 +153,15 @@ class HeaderCom extends Component {
|
||||
</Menu.Item>
|
||||
</Menu>
|
||||
<div className="user-toolbar">
|
||||
{login?<ToolUser user={user} msg={msg} relieveLink={this.relieveLink} logout={this.logout}/>:""}
|
||||
{login?
|
||||
<ToolUser
|
||||
user = { user }
|
||||
msg = { msg }
|
||||
uid = { uid }
|
||||
relieveLink = { this.relieveLink }
|
||||
logout = { this.logout }
|
||||
/>
|
||||
:""}
|
||||
</div>
|
||||
</div>
|
||||
</Header>
|
||||
@ -124,13 +175,16 @@ export default connect(
|
||||
(state) => {
|
||||
return{
|
||||
user: state.login.userName,
|
||||
uid: state.login.uid,
|
||||
msg: null,
|
||||
login:state.login.isLogin
|
||||
login:state.login.isLogin,
|
||||
curKey: state.menu.curKey
|
||||
}
|
||||
},
|
||||
{
|
||||
loginTypeAction,
|
||||
logoutActions,
|
||||
checkLoginState
|
||||
checkLoginState,
|
||||
changeMenuItem
|
||||
}
|
||||
)(HeaderCom)
|
||||
|
@ -42,17 +42,20 @@ $color-black-light : #404040;
|
||||
|
||||
.user-toolbar{
|
||||
float: right;
|
||||
line-height: .14rem;
|
||||
li{
|
||||
height: .64rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.toolbar-li{
|
||||
&:first-child{
|
||||
width: 2rem;
|
||||
}
|
||||
float: left;
|
||||
margin: .26rem 0;
|
||||
padding: 0 0 0 .12rem;
|
||||
margin: 0 0 0 .12rem;
|
||||
font-size: .14rem;
|
||||
cursor: pointer;
|
||||
color: $color-white;
|
||||
&:not(:last-child){
|
||||
border-right: .01rem solid $color-white;
|
||||
padding: 0 .12rem;
|
||||
margin: 0 .12rem;
|
||||
}
|
||||
&:hover{
|
||||
color: $color-blue;
|
||||
@ -72,6 +75,11 @@ $color-black-light : #404040;
|
||||
i{
|
||||
margin-right: .03rem;
|
||||
}
|
||||
.dropdown-link{
|
||||
i{
|
||||
font-size: .2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
95
client/components/Header/Search/Search.js
Normal file
95
client/components/Header/Search/Search.js
Normal file
@ -0,0 +1,95 @@
|
||||
import React, { Component } from 'react'
|
||||
import PropTypes from 'prop-types'
|
||||
import { connect } from 'react-redux'
|
||||
import { Icon, Input, AutoComplete } from 'antd'
|
||||
import './Search.scss'
|
||||
import { withRouter } from 'react-router';
|
||||
import axios from 'axios';
|
||||
|
||||
@connect(
|
||||
state => ({
|
||||
groupList: state.group.groupList,
|
||||
projectList: state.project.projectList
|
||||
})
|
||||
)
|
||||
|
||||
@withRouter
|
||||
export default class Srch extends Component{
|
||||
constructor(props){
|
||||
super(props);
|
||||
this.state = {
|
||||
dataSource:[]
|
||||
};
|
||||
}
|
||||
|
||||
static propTypes = {
|
||||
groupList : PropTypes.array,
|
||||
projectList: PropTypes.array,
|
||||
router: PropTypes.object,
|
||||
history: PropTypes.object,
|
||||
location: PropTypes.object
|
||||
}
|
||||
|
||||
onSelect = (value) => {
|
||||
if( value.split(":")[0] == "group" ){
|
||||
this.props.history.push('/group/'+value.split(":")[1].trim());
|
||||
} else {
|
||||
this.props.history.push('/project/'+value.split("(")[1].slice(0,-1));
|
||||
}
|
||||
}
|
||||
|
||||
handleSearch = (value) => {
|
||||
axios.get('/project/search?q='+value)
|
||||
.then((res) => {
|
||||
if(res.data && res.data.errcode === 0){
|
||||
const dataSource = [];
|
||||
for(let title in res.data.data){
|
||||
res.data.data[title].map(item => {
|
||||
title == "group" ? dataSource.push( title+": "+item.groupName ): dataSource.push( title+": "+item.name+"("+item._id+")" );
|
||||
})
|
||||
}
|
||||
this.setState({
|
||||
dataSource: dataSource
|
||||
});
|
||||
}else{
|
||||
console.log("查询项目或分组失败");
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
})
|
||||
}
|
||||
|
||||
getDataSource(groupList){
|
||||
const groupArr =[];
|
||||
groupList.forEach(item =>{
|
||||
groupArr.push("group: "+ item["group_name"]);
|
||||
})
|
||||
return groupArr;
|
||||
}
|
||||
|
||||
render(){
|
||||
const { dataSource } = this.state;
|
||||
return(
|
||||
<div className="search-wrapper">
|
||||
<AutoComplete
|
||||
className="search-dropdown"
|
||||
dataSource={dataSource}
|
||||
size="large"
|
||||
style={{ width: '100%' }}
|
||||
defaultActiveFirstOption= {false}
|
||||
onSelect={this.onSelect}
|
||||
onSearch={this.handleSearch}
|
||||
filterOption={(inputValue, option) => option.props.children.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1}
|
||||
>
|
||||
<Input
|
||||
prefix={<Icon type="search" className="srch-icon" />}
|
||||
size="large" style={{ width: 200 }}
|
||||
placeholder="search group/project"
|
||||
className="search-input"
|
||||
/>
|
||||
</AutoComplete>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
11
client/components/Header/Search/Search.scss
Normal file
11
client/components/Header/Search/Search.scss
Normal file
@ -0,0 +1,11 @@
|
||||
$color-grey:#979DA7;
|
||||
|
||||
.search-wrapper{
|
||||
.search-input{
|
||||
border:1px solid #AAA;
|
||||
background-color: rgba(255,255,255,0.5);
|
||||
}
|
||||
.srch-icon{
|
||||
color: $color-grey;
|
||||
}
|
||||
}
|
@ -36,6 +36,7 @@ export const REGISTER = 'REGISTER'; // 注册
|
||||
//header
|
||||
export const LOGIN_TYPE = 'LOGIN_TYPE';
|
||||
export const LOGIN_OUT = 'LOGIN_OUT';
|
||||
export const CHANGE_MENU_ITEM = 'CHANGE_MENU_ITEM';
|
||||
|
||||
// News
|
||||
export const FETCH_NEWS_DATA = 'FETCH_NEWS_DATA';
|
||||
|
@ -7,6 +7,7 @@ import PropTypes from "prop-types"
|
||||
import Login from '../Login/LoginWrap'
|
||||
import Intro from '../../components/Intro/Intro'
|
||||
import Footer from "../../components/Footer/Footer";
|
||||
import { changeMenuItem } from '../../actions/menu'
|
||||
|
||||
const HomeGuest = (props) => (
|
||||
<div>
|
||||
@ -50,7 +51,10 @@ HomeGuest.propTypes ={
|
||||
@connect(
|
||||
state => ({
|
||||
login: state.login.isLogin
|
||||
})
|
||||
}),
|
||||
{
|
||||
changeMenuItem
|
||||
}
|
||||
)
|
||||
|
||||
class Home extends Component {
|
||||
@ -59,7 +63,11 @@ class Home extends Component {
|
||||
}
|
||||
static propTypes = {
|
||||
introList: PropTypes.array,
|
||||
login : PropTypes.bool
|
||||
login : PropTypes.bool,
|
||||
changeMenuItem : PropTypes.func
|
||||
}
|
||||
toStart = () =>{
|
||||
this.props.changeMenuItem('/ProjectGroups');
|
||||
}
|
||||
render () {
|
||||
const { login } = this.props;
|
||||
|
@ -8,12 +8,11 @@ $color-black-lighter: #404040;
|
||||
|
||||
|
||||
.home-main {
|
||||
height:calc(100% - .64rem);
|
||||
display: -webkit-box;
|
||||
margin-top: .64rem;
|
||||
-webkit-box-orient: vertical;
|
||||
background: $color-grey-lighter;
|
||||
.main-one{
|
||||
height:calc(100% - .64rem);
|
||||
padding: .5rem .5rem 0 .5rem;
|
||||
//background: radial-gradient(ellipse at center,#45484d 0%,#000 100%);
|
||||
.home-des{
|
||||
@ -44,8 +43,11 @@ $color-black-lighter: #404040;
|
||||
}
|
||||
}
|
||||
.user-home{
|
||||
height:calc(100% - .64rem);
|
||||
padding: .5rem .5rem 0 .5rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height:calc(100% - 2rem);
|
||||
max-width: 11rem;
|
||||
margin: 0 auto;
|
||||
.user-des{
|
||||
max-width: 11rem;
|
||||
margin: 0 auto .5rem;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import React, { Component } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { connect } from 'react-redux';
|
||||
import { Form, Button, Input, Icon } from 'antd';
|
||||
import { Form, Button, Input, Icon, message } from 'antd';
|
||||
import { loginActions } from '../../actions/login';
|
||||
const FormItem = Form.Item;
|
||||
@connect(
|
||||
@ -30,7 +30,15 @@ class Login extends Component {
|
||||
const form = this.props.form;
|
||||
form.validateFields((err, values) => {
|
||||
if (!err) {
|
||||
this.props.loginActions(values);
|
||||
this.props.loginActions(values).then((res) => {
|
||||
if (res.payload.data.errcode == 0) {
|
||||
message.success('登录成功! ');
|
||||
} else {
|
||||
message.error(res.payload.data.errmsg);
|
||||
}
|
||||
}).catch((err) => {
|
||||
message.error(err);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -63,8 +71,9 @@ class Login extends Component {
|
||||
<FormItem>
|
||||
<Button type="primary" htmlType="submit" className="login-form-button">登录</Button>
|
||||
</FormItem>
|
||||
|
||||
<Button id="qsso-login" type="primary" className="login-form-button" onClick={() => window.QSSO.attach('qsso-login','/user/login_by_token')}>QSSO登录</Button>
|
||||
</Form>
|
||||
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
import React, { Component } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { connect } from 'react-redux';
|
||||
import { Form, Button, Input, Icon } from 'antd';
|
||||
import { Form, Button, Input, Icon, message } from 'antd';
|
||||
import { regActions } from '../../actions/login';
|
||||
|
||||
const FormItem = Form.Item;
|
||||
@ -34,7 +34,15 @@ class Reg extends Component {
|
||||
const form = this.props.form;
|
||||
form.validateFieldsAndScroll((err, values) => {
|
||||
if (!err) {
|
||||
this.props.regActions(values);
|
||||
this.props.regActions(values).then((res) => {
|
||||
if (res.payload.data.errcode == 0) {
|
||||
message.success('注册成功! ');
|
||||
} else {
|
||||
message.error(res.payload.data.errmsg);
|
||||
}
|
||||
}).catch((err) => {
|
||||
message.error(err);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
.g-doc {
|
||||
max-width: 11rem;
|
||||
margin: .88rem auto .24rem;
|
||||
margin: .24rem auto;
|
||||
}
|
||||
|
@ -4,7 +4,9 @@ import { connect } from 'react-redux';
|
||||
import { Table, Button, Modal, Form, Input, Icon, Tooltip, Select, Popconfirm, message } from 'antd';
|
||||
import { addProject, fetchProjectList, delProject, changeUpdateModal, changeTableLoading } from '../../../actions/project';
|
||||
import UpDateModal from './UpDateModal';
|
||||
import { Link } from 'react-router-dom'
|
||||
import variable from '../../../constants/variable';
|
||||
import common from '../../../common';
|
||||
import { autobind } from 'core-decorators';
|
||||
const { TextArea } = Input;
|
||||
const FormItem = Form.Item;
|
||||
@ -12,33 +14,49 @@ const Option = Select.Option;
|
||||
|
||||
import './ProjectList.scss'
|
||||
|
||||
const deleteConfirm = (id, handleDelete, currGroupId, handleFetchList) => {
|
||||
const test = () => {
|
||||
handleDelete(id).then((res) => {
|
||||
// 确认删除项目 handleDelete, currGroup._id, fetchProjectList
|
||||
const deleteConfirm = (id, props) => {
|
||||
const { delProject, currGroup, fetchProjectList } = props;
|
||||
const handle = () => {
|
||||
delProject(id).then((res) => {
|
||||
console.log(res);
|
||||
console.log(handleFetchList, currGroupId);
|
||||
handleFetchList(currGroupId).then((res) => {
|
||||
console.log(res);
|
||||
});
|
||||
console.log(fetchProjectList, currGroup._id);
|
||||
if (res.payload.data.errcode == 0) {
|
||||
message.success('删除成功!')
|
||||
fetchProjectList(currGroup._id).then((res) => {
|
||||
console.log(res);
|
||||
});
|
||||
} else {
|
||||
message.error(res.payload.data.errmsg);
|
||||
}
|
||||
});
|
||||
}
|
||||
return test;
|
||||
return handle;
|
||||
};
|
||||
|
||||
const getColumns = (data, handleDelete, currGroupId, handleFetchList, handleUpdateModal) => {
|
||||
const getColumns = (data, props) => {
|
||||
const { changeUpdateModal, userInfo } = props;
|
||||
return [{
|
||||
title: '项目名称',
|
||||
dataIndex: 'name',
|
||||
key: 'name',
|
||||
render: text => <a href="#">{text}</a>
|
||||
render: (text, record) => {
|
||||
return <Link to={`Interface/${record._id}`}>{text}</Link>
|
||||
}
|
||||
}, {
|
||||
title: '创建人',
|
||||
dataIndex: 'owner',
|
||||
key: 'owner'
|
||||
key: 'owner',
|
||||
render: (text, record, index) => {
|
||||
// data是projectList的列表值
|
||||
// 根据序号找到对应项的uid,根据uid获取对应项目的创建人
|
||||
return <span>{userInfo[data[index].uid] ? userInfo[data[index].uid].username : ''}</span>;
|
||||
}
|
||||
}, {
|
||||
title: '创建时间',
|
||||
dataIndex: 'add_time',
|
||||
key: 'add_time'
|
||||
key: 'add_time',
|
||||
render: time => <span>{common.formatTime(time)}</span>
|
||||
}, {
|
||||
title: '操作',
|
||||
key: 'action',
|
||||
@ -46,9 +64,9 @@ const getColumns = (data, handleDelete, currGroupId, handleFetchList, handleUpda
|
||||
const id = record._id;
|
||||
return (
|
||||
<span>
|
||||
<a onClick={() => handleUpdateModal(true, index)}>修改</a>
|
||||
<a onClick={() => changeUpdateModal(true, index)}>修改</a>
|
||||
<span className="ant-divider" />
|
||||
<Popconfirm title="你确定要删除项目吗?" onConfirm={deleteConfirm(id, handleDelete, currGroupId, handleFetchList)} okText="删除" cancelText="取消">
|
||||
<Popconfirm title="你确定要删除项目吗?" onConfirm={deleteConfirm(id, props)} okText="删除" cancelText="取消">
|
||||
<a href="#">删除</a>
|
||||
</Popconfirm>
|
||||
</span>
|
||||
@ -71,6 +89,7 @@ const formItemLayout = {
|
||||
state => {
|
||||
return {
|
||||
projectList: state.project.projectList,
|
||||
userInfo: state.project.userInfo,
|
||||
tableLoading: state.project.tableLoading,
|
||||
currGroup: state.group.currGroup,
|
||||
total: state.project.total,
|
||||
@ -102,6 +121,7 @@ class ProjectList extends Component {
|
||||
changeUpdateModal: PropTypes.func,
|
||||
changeTableLoading: PropTypes.func,
|
||||
projectList: PropTypes.array,
|
||||
userInfo: PropTypes.object,
|
||||
tableLoading: PropTypes.bool,
|
||||
currGroup: PropTypes.object,
|
||||
total: PropTypes.number,
|
||||
@ -116,7 +136,7 @@ class ProjectList extends Component {
|
||||
});
|
||||
}
|
||||
|
||||
// 确认修改
|
||||
// 确认添加项目
|
||||
@autobind
|
||||
handleOk(e) {
|
||||
const { form, currGroup, changeTableLoading, addProject, fetchProjectList } = this.props;
|
||||
@ -124,7 +144,7 @@ class ProjectList extends Component {
|
||||
e.preventDefault();
|
||||
form.validateFields((err, values) => {
|
||||
if (!err) {
|
||||
values.prd_host = this.state.protocol + values.prd_host;
|
||||
values.protocol = this.state.protocol.split(':')[0];
|
||||
// 获取当前分组id传入values
|
||||
values.group_id = currGroup._id;
|
||||
|
||||
@ -246,7 +266,8 @@ class ProjectList extends Component {
|
||||
>
|
||||
{getFieldDecorator('prd_host', {
|
||||
rules: [{
|
||||
required: true, message: '请输入项目线上域名!'
|
||||
required: true,
|
||||
message: '请输入项目线上域名!'
|
||||
}]
|
||||
})(
|
||||
<Input addonBefore={(
|
||||
@ -263,7 +284,7 @@ class ProjectList extends Component {
|
||||
>
|
||||
{getFieldDecorator('basepath', {
|
||||
rules: [{
|
||||
required: true, message: '请输入项目基本路径!'
|
||||
required: true, message: '请输入项目基本路径'
|
||||
}]
|
||||
})(
|
||||
<Input />
|
||||
@ -285,16 +306,18 @@ class ProjectList extends Component {
|
||||
</Form>
|
||||
</Modal>
|
||||
<UpDateModal/>
|
||||
<Button className="m-btn" icon="plus" type="primary" onClick={this.showAddProjectModal}>创建项目</Button>
|
||||
<Table
|
||||
className="m-table"
|
||||
bordered={true}
|
||||
loading={this.props.tableLoading}
|
||||
columns={getColumns(this.state.projectData, this.props.delProject, this.props.currGroup._id, this.props.fetchProjectList, this.props.changeUpdateModal)}
|
||||
columns={getColumns(this.state.projectData, this.props)}
|
||||
dataSource={this.state.projectData}
|
||||
pagination={{
|
||||
total: this.props.total * variable.PAGE_LIMIT,
|
||||
defaultPageSize: variable.PAGE_LIMIT,
|
||||
onChange: this.paginationChange
|
||||
}}
|
||||
title={() => <Button type="primary" onClick={this.showAddProjectModal}>创建项目</Button>}
|
||||
/>
|
||||
|
||||
</div>
|
||||
|
@ -3,6 +3,12 @@
|
||||
padding: 16px 24px;
|
||||
box-shadow: 0 2px 4px 0 rgba(0,0,0,0.20);
|
||||
border-radius: 4px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.m-table {
|
||||
text-align: left;
|
||||
margin-top: .16rem;
|
||||
}
|
||||
|
||||
.ant-input-group-wrapper {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import React, { Component } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { connect } from 'react-redux';
|
||||
import { Modal, Form, Input, Icon, Tooltip, Select, message, Button } from 'antd';
|
||||
import { Modal, Form, Input, Icon, Tooltip, Select, message, Button, Row, Col } from 'antd';
|
||||
import { updateProject, fetchProjectList, delProject, changeUpdateModal, changeTableLoading } from '../../../actions/project';
|
||||
const { TextArea } = Input;
|
||||
const FormItem = Form.Item;
|
||||
@ -23,7 +23,7 @@ const formItemLayout = {
|
||||
const formItemLayoutWithOutLabel = {
|
||||
wrapperCol: {
|
||||
xs: { span: 24, offset: 0 },
|
||||
sm: { span: 20, offset: 4 }
|
||||
sm: { span: 20, offset: 6 }
|
||||
}
|
||||
};
|
||||
let uuid = 0;
|
||||
@ -78,22 +78,21 @@ class UpDateModal extends Component {
|
||||
this.props.changeUpdateModal(false, -1);
|
||||
}
|
||||
|
||||
// 确认修改
|
||||
handleOk = (e) => {
|
||||
console.log('in');
|
||||
e.preventDefault();
|
||||
const { form, updateProject, changeUpdateModal, currGroup, projectList, handleUpdateIndex, fetchProjectList, changeTableLoading } = this.props;
|
||||
form.validateFields((err, values) => {
|
||||
console.log(err);
|
||||
if (!err) {
|
||||
console.log(values);
|
||||
console.log(projectList[handleUpdateIndex]);
|
||||
let assignValue = Object.assign(projectList[handleUpdateIndex], values);
|
||||
assignValue.prd_host = this.state.protocol + assignValue.prd_host;
|
||||
assignValue.env = assignValue.envs.map((item) => {
|
||||
console.log(assignValue);
|
||||
const arr = assignValue['envs-'+item].split(',');
|
||||
if (arr.length === 2) {
|
||||
return {
|
||||
host: arr[0],
|
||||
name: arr[1]
|
||||
}
|
||||
values.protocol = this.state.protocol.split(':')[0];
|
||||
assignValue.env = assignValue.envs.map((item, index) => {
|
||||
return {
|
||||
name: values['envs-name-'+index],
|
||||
domain: values['envs-domain-'+index]
|
||||
}
|
||||
});
|
||||
console.log(assignValue);
|
||||
@ -120,21 +119,26 @@ class UpDateModal extends Component {
|
||||
});
|
||||
}
|
||||
|
||||
remove = (k) => {
|
||||
// 项目的修改操作 - 删除一项环境配置
|
||||
remove = (id) => {
|
||||
const { form } = this.props;
|
||||
// can use data-binding to get
|
||||
const envs = form.getFieldValue('envs');
|
||||
// We need at least one passenger
|
||||
if (envs.length === 1) {
|
||||
if (envs.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// can use data-binding to set
|
||||
form.setFieldsValue({
|
||||
envs: envs.filter(key => key !== k)
|
||||
envs: envs.filter(key => {
|
||||
console.log(key);
|
||||
return key._id !== id;
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// 项目的修改操作 - 添加一项环境配置
|
||||
add = () => {
|
||||
uuid++;
|
||||
const { form } = this.props;
|
||||
@ -148,15 +152,6 @@ class UpDateModal extends Component {
|
||||
});
|
||||
}
|
||||
|
||||
handleSubmit = (e) => {
|
||||
e.preventDefault();
|
||||
this.props.form.validateFields((err, values) => {
|
||||
if (!err) {
|
||||
console.log('Received values of form: ', values);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
render() {
|
||||
const { getFieldDecorator, getFieldValue } = this.props.form;
|
||||
// const that = this;
|
||||
@ -166,52 +161,99 @@ class UpDateModal extends Component {
|
||||
// 如果列表存在且用户点击修改按钮时,设置表单默认值
|
||||
if (projectList.length !== 0 && handleUpdateIndex !== -1 ) {
|
||||
// console.log(projectList[handleUpdateIndex]);
|
||||
const { name, basepath, desc, env } = projectList[handleUpdateIndex];
|
||||
const { name, basepath, desc , env} = projectList[handleUpdateIndex];
|
||||
initFormValues = { name, basepath, desc, env };
|
||||
if (env) {
|
||||
envMessage = env.map((item) => {
|
||||
return item.host + ',' + item.name;
|
||||
})
|
||||
if (env.length !== 0) {
|
||||
envMessage = env;
|
||||
}
|
||||
initFormValues.prd_host = projectList[handleUpdateIndex].prd_host.split('\/\/')[1];
|
||||
initFormValues.prd_protocol = projectList[handleUpdateIndex].prd_host.split('\/\/')[0] + '\/\/';
|
||||
initFormValues.prd_host = projectList[handleUpdateIndex].prd_host;
|
||||
initFormValues.prd_protocol = projectList[handleUpdateIndex].protocol + '\/\/';
|
||||
|
||||
}
|
||||
|
||||
getFieldDecorator('envs', { initialValue: envMessage });
|
||||
const envs = getFieldValue('envs');
|
||||
const formItems = envs.map((k, index) => {
|
||||
console.log(k);
|
||||
const secondIndex = 'next' + index; // 为保证key的唯一性
|
||||
return (
|
||||
<FormItem
|
||||
{...(index === 0 ? formItemLayout : formItemLayoutWithOutLabel)}
|
||||
label={index === 0 ? (
|
||||
<span>环境配置
|
||||
<Tooltip title="依次输入环境域名(host)与环境名称,以英文逗号分隔">
|
||||
<Icon type="question-circle-o" />
|
||||
</Tooltip>
|
||||
</span>) : ''}
|
||||
required={false}
|
||||
key={k}
|
||||
>
|
||||
{getFieldDecorator(`envs-${k}`, {
|
||||
validateTrigger: ['onChange', 'onBlur'],
|
||||
initialValue: envMessage.length !== 0 ? k : '',
|
||||
rules: [{
|
||||
required: false,
|
||||
whitespace: true,
|
||||
message: "请输入环境配置,放弃配置请清空输入框"
|
||||
}]
|
||||
})(
|
||||
<Input placeholder="请输入环境配置" style={{ width: '60%', marginRight: 8 }} />
|
||||
)}
|
||||
{envs.length > 1 ? (
|
||||
<Icon
|
||||
className="dynamic-delete-button"
|
||||
type="minus-circle-o"
|
||||
disabled={envs.length === 1}
|
||||
onClick={() => this.remove(k)}
|
||||
/>
|
||||
) : null}
|
||||
</FormItem>
|
||||
<Row key={index} type="flex" justify="space-between" align={index === 0 ? 'middle' : 'top'}>
|
||||
<Col span={10} offset={2}>
|
||||
<FormItem
|
||||
label={index === 0 ? (
|
||||
<span>环境名称</span>) : ''}
|
||||
required={false}
|
||||
key={index}
|
||||
>
|
||||
{getFieldDecorator(`envs-name-${index}`, {
|
||||
validateTrigger: ['onChange', 'onBlur'],
|
||||
initialValue: envMessage.length !== 0 ? k.name : '',
|
||||
rules: [{
|
||||
required: false,
|
||||
whitespace: true,
|
||||
message: "请输入环境名称",
|
||||
validator(rule, value, callback) {
|
||||
if (value) {
|
||||
if (value.length === 0) {
|
||||
callback('请输入环境域名');
|
||||
} else if (!/\S/.test(value)) {
|
||||
callback('请输入环境域名');
|
||||
} else {
|
||||
return callback();
|
||||
}
|
||||
} else {
|
||||
callback('请输入环境域名');
|
||||
}
|
||||
}
|
||||
}]
|
||||
})(
|
||||
<Input placeholder="请输入环境名称" style={{ width: '90%', marginRight: 8 }} />
|
||||
)}
|
||||
</FormItem>
|
||||
</Col>
|
||||
<Col span={10}>
|
||||
<FormItem
|
||||
label={index === 0 ? (
|
||||
<span>环境域名</span>) : ''}
|
||||
required={false}
|
||||
key={secondIndex}
|
||||
>
|
||||
{getFieldDecorator(`envs-domain-${index}`, {
|
||||
validateTrigger: ['onChange', 'onBlur'],
|
||||
initialValue: envMessage.length !== 0 ? k.domain : '',
|
||||
rules: [{
|
||||
required: false,
|
||||
whitespace: true,
|
||||
message: "请输入环境域名",
|
||||
validator(rule, value, callback) {
|
||||
if (value) {
|
||||
if (value.length === 0) {
|
||||
callback('请输入环境域名');
|
||||
} else if (!/\S/.test(value)) {
|
||||
callback('请输入环境域名');
|
||||
} else {
|
||||
return callback();
|
||||
}
|
||||
} else {
|
||||
callback('请输入环境域名');
|
||||
}
|
||||
}
|
||||
}]
|
||||
})(
|
||||
<Input placeholder="请输入环境域名" style={{ width: '90%', marginRight: 8 }} />
|
||||
)}
|
||||
</FormItem>
|
||||
</Col>
|
||||
<Col span={2}>
|
||||
{envs.length > 0 ? (
|
||||
<Icon
|
||||
className="dynamic-delete-button"
|
||||
type="minus-circle-o"
|
||||
onClick={() => this.remove(k._id)}
|
||||
/>
|
||||
) : null}
|
||||
</Col>
|
||||
</Row>
|
||||
);
|
||||
});
|
||||
return (
|
||||
@ -269,7 +311,7 @@ class UpDateModal extends Component {
|
||||
{getFieldDecorator('basepath', {
|
||||
initialValue: initFormValues.basepath,
|
||||
rules: [{
|
||||
required: true, message: '请输入项目基本路径!'
|
||||
required: true, message: '请输入项目基本路径! '
|
||||
}]
|
||||
})(
|
||||
<Input />
|
||||
|
@ -3,7 +3,7 @@ import 'babel-polyfill'
|
||||
import thunkMiddleware from 'redux-thunk'
|
||||
import promiseMiddleware from 'redux-promise';
|
||||
import ReactDOM from 'react-dom'
|
||||
import App from './app'
|
||||
import App from './Application'
|
||||
import { createStore, combineReducers, applyMiddleware } from 'redux'
|
||||
import { Provider } from 'react-redux'
|
||||
import ReduxContainer from './ReduxContainer.js'
|
||||
|
@ -1,9 +0,0 @@
|
||||
export default function (state = 3, action) {
|
||||
const count = state
|
||||
switch (action.type) {
|
||||
case 'increasec':
|
||||
return count + 1
|
||||
default:
|
||||
return state
|
||||
}
|
||||
}
|
@ -5,10 +5,15 @@ import {
|
||||
GET_LOGIN_STATE
|
||||
} from '../../constants/action-types';
|
||||
|
||||
const LOADING_STATUS = 0;
|
||||
const GUEST_STATUS = 1;
|
||||
const MEMBER_STATUS = 2;
|
||||
|
||||
const initialState = {
|
||||
isLogin: false,
|
||||
userName: null,
|
||||
uid: null,
|
||||
loginState:LOADING_STATUS,
|
||||
loginWrapActiveKey:"1"
|
||||
};
|
||||
|
||||
@ -18,6 +23,7 @@ export default (state = initialState, action) => {
|
||||
return {
|
||||
...state,
|
||||
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
|
||||
};
|
||||
}
|
||||
@ -25,13 +31,16 @@ export default (state = initialState, action) => {
|
||||
return {
|
||||
...state,
|
||||
isLogin: true,
|
||||
userName: action.payload.data.userName
|
||||
loginState: MEMBER_STATUS,
|
||||
uid: action.payload.data.data.uid,
|
||||
userName: action.payload.data.data.username
|
||||
};
|
||||
}
|
||||
case LOGIN_OUT: {
|
||||
return{
|
||||
...state,
|
||||
isLogin: false,
|
||||
loginState: GUEST_STATUS,
|
||||
userName: null,
|
||||
uid: null
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ const initialState = {
|
||||
isUpdateModalShow: false,
|
||||
handleUpdateIndex: -1,
|
||||
projectList: [],
|
||||
userInfo: {},
|
||||
tableLoading: true,
|
||||
total: 0,
|
||||
currPage: 1
|
||||
@ -34,7 +35,8 @@ export default (state = initialState, action) => {
|
||||
return {
|
||||
...state,
|
||||
projectList: action.payload.data.data.list,
|
||||
total: action.payload.data.data.total
|
||||
total: action.payload.data.data.total,
|
||||
userInfo: action.payload.data.data.userinfo
|
||||
};
|
||||
}
|
||||
case PROJECT_ADD: {
|
||||
|
@ -1,9 +0,0 @@
|
||||
export default function (state = 3, action) {
|
||||
const count = state
|
||||
switch (action.type) {
|
||||
case 'increasec':
|
||||
return count + 1
|
||||
default:
|
||||
return state
|
||||
}
|
||||
}
|
@ -5,10 +5,15 @@ import {
|
||||
GET_LOGIN_STATE
|
||||
} from '../../constants/action-types';
|
||||
|
||||
const LOADING_STATUS = 0;
|
||||
const GUEST_STATUS = 1;
|
||||
const MEMBER_STATUS = 2;
|
||||
|
||||
const initialState = {
|
||||
isLogin: false,
|
||||
userName: null,
|
||||
uid: null,
|
||||
loginState:LOADING_STATUS,
|
||||
loginWrapActiveKey:"1"
|
||||
};
|
||||
|
||||
@ -18,6 +23,7 @@ export default (state = initialState, action) => {
|
||||
return {
|
||||
...state,
|
||||
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
|
||||
};
|
||||
}
|
||||
@ -25,13 +31,16 @@ export default (state = initialState, action) => {
|
||||
return {
|
||||
...state,
|
||||
isLogin: true,
|
||||
userName: action.payload.data.userName
|
||||
loginState: MEMBER_STATUS,
|
||||
uid: action.payload.data.data.uid,
|
||||
userName: action.payload.data.data.username
|
||||
};
|
||||
}
|
||||
case LOGIN_OUT: {
|
||||
return{
|
||||
...state,
|
||||
isLogin: false,
|
||||
loginState: GUEST_STATUS,
|
||||
userName: null,
|
||||
uid: null
|
||||
}
|
||||
|
21
client/reducer/menu/menu.js
Normal file
21
client/reducer/menu/menu.js
Normal file
@ -0,0 +1,21 @@
|
||||
import {
|
||||
CHANGE_MENU_ITEM
|
||||
} from '../../constants/action-types.js'
|
||||
|
||||
const initialState = {
|
||||
curKey: window.location.hash.split("#")[1] || '/'
|
||||
}
|
||||
|
||||
export default (state = initialState, action) => {
|
||||
switch (action.type) {
|
||||
case CHANGE_MENU_ITEM: {
|
||||
return {
|
||||
...state,
|
||||
curKey: action.data
|
||||
};
|
||||
}
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
346
doc/build/api.html
vendored
346
doc/build/api.html
vendored
@ -207,6 +207,20 @@
|
||||
<li >
|
||||
<a href="#-interface-del">/interface/del</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<!-- <li > -->
|
||||
<li >
|
||||
|
||||
<a href="#node">node</a>
|
||||
</li>
|
||||
|
||||
<ul class="nav docs-sidenav-extend" >
|
||||
|
||||
<li >
|
||||
<a href="#-node-list">/node/list</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
@ -1235,7 +1249,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/project.js.html#16" target="_blank">./server/controllers/project.js:16</a>
|
||||
<a href="./static/server/controllers/project.js.html#42" target="_blank">./server/controllers/project.js:42</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -1376,7 +1390,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/project.js.html#80" target="_blank">./server/controllers/project.js:80</a>
|
||||
<a href="./static/server/controllers/project.js.html#114" target="_blank">./server/controllers/project.js:114</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -1460,7 +1474,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/project.js.html#112" target="_blank">./server/controllers/project.js:112</a>
|
||||
<a href="./static/server/controllers/project.js.html#146" target="_blank">./server/controllers/project.js:146</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -1544,7 +1558,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/project.js.html#145" target="_blank">./server/controllers/project.js:145</a>
|
||||
<a href="./static/server/controllers/project.js.html#179" target="_blank">./server/controllers/project.js:179</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -1622,7 +1636,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/project.js.html#173" target="_blank">./server/controllers/project.js:173</a>
|
||||
<a href="./static/server/controllers/project.js.html#207" target="_blank">./server/controllers/project.js:207</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -1705,7 +1719,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/project.js.html#197" target="_blank">./server/controllers/project.js:197</a>
|
||||
<a href="./static/server/controllers/project.js.html#231" target="_blank">./server/controllers/project.js:231</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -1952,7 +1966,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/project.js.html#244" target="_blank">./server/controllers/project.js:244</a>
|
||||
<a href="./static/server/controllers/project.js.html#278" target="_blank">./server/controllers/project.js:278</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -2024,7 +2038,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/project.js.html#277" target="_blank">./server/controllers/project.js:277</a>
|
||||
<a href="./static/server/controllers/project.js.html#311" target="_blank">./server/controllers/project.js:311</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -2128,7 +2142,7 @@
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>env[].host</td>
|
||||
<td>env[].domain</td>
|
||||
<td>String</td>
|
||||
<td>环境域名</td>
|
||||
<td>
|
||||
@ -2184,7 +2198,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/project.js.html#351" target="_blank">./server/controllers/project.js:351</a>
|
||||
<a href="./static/server/controllers/project.js.html#394" target="_blank">./server/controllers/project.js:394</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -2319,6 +2333,18 @@
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>title</td>
|
||||
<td>String</td>
|
||||
<td>接口标题,不能为空</td>
|
||||
<td>
|
||||
|
||||
<i class="yo-ico glyphicon glyphicon-ok text-success"></i>
|
||||
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>path</td>
|
||||
<td>String</td>
|
||||
@ -2404,7 +2430,7 @@
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>req_params</td>
|
||||
<td>req_params_form</td>
|
||||
<td>Mixed</td>
|
||||
<td>请求参数,如果请求方式是form,参数是Array数组,其他格式请求参数是字符串</td>
|
||||
<td>
|
||||
@ -2414,7 +2440,7 @@
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>req_params[].name</td>
|
||||
<td>req_params_form[].name</td>
|
||||
<td>String</td>
|
||||
<td>请求参数名</td>
|
||||
<td>
|
||||
@ -2424,7 +2450,7 @@
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>req_params[].value</td>
|
||||
<td>req_params_form[].value</td>
|
||||
<td>String</td>
|
||||
<td>请求参数值,可填写生成规则(mock)。如@email,随机生成一条email</td>
|
||||
<td>
|
||||
@ -2434,7 +2460,7 @@
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>req_params[].type</td>
|
||||
<td>req_params_form[].type</td>
|
||||
<td>String</td>
|
||||
<td>请求参数类型,有["text", "file"]两种</td>
|
||||
<td>
|
||||
@ -2443,6 +2469,16 @@
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>req_params_other</td>
|
||||
<td>String</td>
|
||||
<td>非form类型的请求参数可保存到此字段</td>
|
||||
<td>
|
||||
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>res_body_type</td>
|
||||
<td>String</td>
|
||||
@ -2483,6 +2519,7 @@
|
||||
<span class="token comment" spellcheck="true">//header Content-Type:application/json</span>
|
||||
|
||||
<span class="token punctuation">{</span>
|
||||
<span class="token string">"title"</span><span class="token punctuation">:</span> <span class="token string">"testapi"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"api"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"method"</span><span class="token punctuation">:</span> <span class="token string">"post"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"path"</span><span class="token punctuation">:</span> <span class="token string">"/testapi"</span><span class="token punctuation">,</span>
|
||||
@ -2517,6 +2554,7 @@
|
||||
<span class="token string">"data"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
|
||||
<span class="token string">"__v"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"_id"</span><span class="token punctuation">:</span> <span class="token number">422</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"title"</span><span class="token punctuation">:</span> <span class="token string">"testapi"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"project_id"</span><span class="token punctuation">:</span> <span class="token number">8</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"path"</span><span class="token punctuation">:</span> <span class="token string">"/testapi"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"api"</span><span class="token punctuation">,</span>
|
||||
@ -2569,7 +2607,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/interface.js.html#77" target="_blank">./server/controllers/interface.js:77</a>
|
||||
<a href="./static/server/controllers/interface.js.html#81" target="_blank">./server/controllers/interface.js:81</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -2629,12 +2667,12 @@
|
||||
</blockquote>
|
||||
<p>
|
||||
<small class="text-muted">描述:</small>
|
||||
添加项目分组
|
||||
接口列表
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/interface.js.html#100" target="_blank">./server/controllers/interface.js:100</a>
|
||||
<a href="./static/server/controllers/interface.js.html#104" target="_blank">./server/controllers/interface.js:104</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -2694,12 +2732,12 @@
|
||||
</blockquote>
|
||||
<p>
|
||||
<small class="text-muted">描述:</small>
|
||||
添加项目分组
|
||||
编辑接口
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/interface.js.html#124" target="_blank">./server/controllers/interface.js:124</a>
|
||||
<a href="./static/server/controllers/interface.js.html#128" target="_blank">./server/controllers/interface.js:128</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -2817,7 +2855,7 @@
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>req_params</td>
|
||||
<td>req_params_form</td>
|
||||
<td>Mixed</td>
|
||||
<td>请求参数,如果请求方式是form,参数是Array数组,其他格式请求参数是字符串</td>
|
||||
<td>
|
||||
@ -2827,7 +2865,7 @@
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>req_params[].name</td>
|
||||
<td>req_params_form[].name</td>
|
||||
<td>String</td>
|
||||
<td>请求参数名</td>
|
||||
<td>
|
||||
@ -2837,7 +2875,7 @@
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>req_params[].value</td>
|
||||
<td>req_params_form[].value</td>
|
||||
<td>String</td>
|
||||
<td>请求参数值,可填写生成规则(mock)。如@email,随机生成一条email</td>
|
||||
<td>
|
||||
@ -2847,7 +2885,7 @@
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>req_params[].type</td>
|
||||
<td>req_params_form[].type</td>
|
||||
<td>String</td>
|
||||
<td>请求参数类型,有["text", "file"]两种</td>
|
||||
<td>
|
||||
@ -2856,6 +2894,16 @@
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>req_params_other</td>
|
||||
<td>String</td>
|
||||
<td>非form类型的请求参数可保存到此字段</td>
|
||||
<td>
|
||||
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>res_body_type</td>
|
||||
<td>String</td>
|
||||
@ -2922,7 +2970,7 @@
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/interface.js.html#189" target="_blank">./server/controllers/interface.js:189</a>
|
||||
<a href="./static/server/controllers/interface.js.html#197" target="_blank">./server/controllers/interface.js:197</a>
|
||||
</p>
|
||||
|
||||
|
||||
@ -2977,6 +3025,256 @@
|
||||
</div>
|
||||
|
||||
|
||||
<h2 id="node" class="page-header subject">node<a class="hashlink" href="#node">#</a></h2>
|
||||
|
||||
<div class="con-list-item">
|
||||
<blockquote class="api">
|
||||
<h3 id="-node-list" class="page-header subject">
|
||||
/node/list
|
||||
|
||||
<span class="ui-badge">GET</span>
|
||||
|
||||
|
||||
<a class="hashlink" href="#-node-list">#</a>
|
||||
</h3>
|
||||
</blockquote>
|
||||
<p>
|
||||
<small class="text-muted">描述:</small>
|
||||
获取节点列表
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<small class="text-muted">源码位置:</small>
|
||||
<a href="./static/server/controllers/log.js.html#12" target="_blank">./server/controllers/log.js:12</a>
|
||||
</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>uid</td>
|
||||
<td>Number</td>
|
||||
<td>用户id, 不能为空</td>
|
||||
<td>
|
||||
|
||||
<i class="yo-ico glyphicon glyphicon-ok text-success"></i>
|
||||
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>page</td>
|
||||
<td>Number</td>
|
||||
<td>分页页码</td>
|
||||
<td>
|
||||
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>limit</td>
|
||||
<td>Number</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">"total"</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"list"</span><span class="token punctuation">:</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">529</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"yapi"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"aaa"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"prd_host"</span><span class="token punctuation">:</span> <span class="token string">"http://www.yapi.com"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"basepath"</span><span class="token punctuation">:</span> <span class="token string">"/a/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"uid"</span><span class="token punctuation">:</span> <span class="token number">107</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_id"</span><span class="token punctuation">:</span> <span class="token number">181</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"add_time"</span><span class="token punctuation">:</span> <span class="token number">1500465369</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"up_time"</span><span class="token punctuation">:</span> <span class="token number">1500522419</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"__v"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"env"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"members"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
|
||||
<span class="token string">"107"</span>
|
||||
<span class="token punctuation">]</span>
|
||||
<span class="token punctuation">}</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">558</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"12"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"21\n"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"prd_host"</span><span class="token punctuation">:</span> <span class="token string">"http://11/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"basepath"</span><span class="token punctuation">:</span> <span class="token string">"12/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"uid"</span><span class="token punctuation">:</span> <span class="token number">107</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_id"</span><span class="token punctuation">:</span> <span class="token number">181</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"add_time"</span><span class="token punctuation">:</span> <span class="token number">1500466250</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"up_time"</span><span class="token punctuation">:</span> <span class="token number">1500466250</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"__v"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"env"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"members"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
|
||||
<span class="token string">"107"</span>
|
||||
<span class="token punctuation">]</span>
|
||||
<span class="token punctuation">}</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">626</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"1233"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"123"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"prd_host"</span><span class="token punctuation">:</span> <span class="token string">"http://1234/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"basepath"</span><span class="token punctuation">:</span> <span class="token string">"1234/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"uid"</span><span class="token punctuation">:</span> <span class="token number">107</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_id"</span><span class="token punctuation">:</span> <span class="token number">181</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"add_time"</span><span class="token punctuation">:</span> <span class="token number">1500471230</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"up_time"</span><span class="token punctuation">:</span> <span class="token number">1500471230</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"__v"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"env"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"members"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
|
||||
<span class="token string">"107"</span>
|
||||
<span class="token punctuation">]</span>
|
||||
<span class="token punctuation">}</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">665</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"222"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"222"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"prd_host"</span><span class="token punctuation">:</span> <span class="token string">"http://222/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"basepath"</span><span class="token punctuation">:</span> <span class="token string">"222/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"uid"</span><span class="token punctuation">:</span> <span class="token number">107</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_id"</span><span class="token punctuation">:</span> <span class="token number">181</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"add_time"</span><span class="token punctuation">:</span> <span class="token number">1500471668</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"up_time"</span><span class="token punctuation">:</span> <span class="token number">1500471668</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"__v"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"env"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"members"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
|
||||
<span class="token string">"107"</span>
|
||||
<span class="token punctuation">]</span>
|
||||
<span class="token punctuation">}</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">704</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"333"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"222333"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"prd_host"</span><span class="token punctuation">:</span> <span class="token string">"http://333/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"basepath"</span><span class="token punctuation">:</span> <span class="token string">"333/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"uid"</span><span class="token punctuation">:</span> <span class="token number">107</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_id"</span><span class="token punctuation">:</span> <span class="token number">181</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"add_time"</span><span class="token punctuation">:</span> <span class="token number">1500471674</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"up_time"</span><span class="token punctuation">:</span> <span class="token number">1500471674</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"__v"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"env"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"members"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
|
||||
<span class="token string">"107"</span>
|
||||
<span class="token punctuation">]</span>
|
||||
<span class="token punctuation">}</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">743</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"444"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"444"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"prd_host"</span><span class="token punctuation">:</span> <span class="token string">"https://444/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"basepath"</span><span class="token punctuation">:</span> <span class="token string">"444/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"uid"</span><span class="token punctuation">:</span> <span class="token number">107</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_id"</span><span class="token punctuation">:</span> <span class="token number">181</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"add_time"</span><span class="token punctuation">:</span> <span class="token number">1500471695</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"up_time"</span><span class="token punctuation">:</span> <span class="token number">1500471695</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"__v"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"env"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"members"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
|
||||
<span class="token string">"107"</span>
|
||||
<span class="token punctuation">]</span>
|
||||
<span class="token punctuation">}</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">763</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"122333"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"3/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"prd_host"</span><span class="token punctuation">:</span> <span class="token string">"http://33/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"basepath"</span><span class="token punctuation">:</span> <span class="token string">"33/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"uid"</span><span class="token punctuation">:</span> <span class="token number">107</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_id"</span><span class="token punctuation">:</span> <span class="token number">181</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"add_time"</span><span class="token punctuation">:</span> <span class="token number">1500481743</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"up_time"</span><span class="token punctuation">:</span> <span class="token number">1500481743</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"__v"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"env"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"members"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
|
||||
<span class="token string">"107"</span>
|
||||
<span class="token punctuation">]</span>
|
||||
<span class="token punctuation">}</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">778</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"555"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"555"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"prd_host"</span><span class="token punctuation">:</span> <span class="token string">"https://555/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"basepath"</span><span class="token punctuation">:</span> <span class="token string">"555/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"uid"</span><span class="token punctuation">:</span> <span class="token number">107</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_id"</span><span class="token punctuation">:</span> <span class="token number">181</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"add_time"</span><span class="token punctuation">:</span> <span class="token number">1500519203</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"up_time"</span><span class="token punctuation">:</span> <span class="token number">1500519203</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"__v"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"env"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"members"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
|
||||
<span class="token string">"107"</span>
|
||||
<span class="token punctuation">]</span>
|
||||
<span class="token punctuation">}</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">823</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"name"</span><span class="token punctuation">:</span> <span class="token string">"5"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"desc"</span><span class="token punctuation">:</span> <span class="token string">"5"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"prd_host"</span><span class="token punctuation">:</span> <span class="token string">"http://5/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"basepath"</span><span class="token punctuation">:</span> <span class="token string">"5/"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"uid"</span><span class="token punctuation">:</span> <span class="token number">107</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"group_id"</span><span class="token punctuation">:</span> <span class="token number">181</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"add_time"</span><span class="token punctuation">:</span> <span class="token number">1500519769</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"up_time"</span><span class="token punctuation">:</span> <span class="token number">1500519769</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"__v"</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"env"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"members"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
|
||||
<span class="token string">"107"</span>
|
||||
<span class="token punctuation">]</span>
|
||||
<span class="token punctuation">}</span>
|
||||
<span class="token punctuation">]</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"userinfo"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span>
|
||||
<span class="token string">"107"</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">107</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"username"</span><span class="token punctuation">:</span> <span class="token string">"admin"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"email"</span><span class="token punctuation">:</span> <span class="token string">"admin@admin.com"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"role"</span><span class="token punctuation">:</span> <span class="token string">"admin"</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"add_time"</span><span class="token punctuation">:</span> <span class="token number">1500280333</span><span class="token punctuation">,</span>
|
||||
<span class="token string">"up_time"</span><span class="token punctuation">:</span> <span class="token number">1500373530</span>
|
||||
<span class="token punctuation">}</span>
|
||||
<span class="token punctuation">}</span>
|
||||
<span class="token punctuation">}</span>
|
||||
<span class="token punctuation">}</span></code></pre>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
@ -42,6 +42,7 @@ class interfaceController extends baseController{
|
||||
* @category interface
|
||||
* @foldnumber 10
|
||||
* @param {Number} project_id 项目id,不能为空
|
||||
* @param {String} title 接口标题,不能为空
|
||||
* @param {String} path 接口请求路径,不能为空
|
||||
* @param {String} method 请求方式
|
||||
* @param {Array} [req_headers] 请求的header信息
|
||||
@ -50,10 +51,11 @@ class interfaceController extends baseController{
|
||||
* @param {Boolean} [req_headers[].required] 是否是必须,默认为否
|
||||
* @param {String} [req_headers[].desc] header描述
|
||||
* @param {String} [req_params_type] 请求参数方式,有["form", "json", "text", "xml"]四种
|
||||
* @param {Mixed} [req_params] 请求参数,如果请求方式是form,参数是Array数组,其他格式请求参数是字符串
|
||||
* @param {String} [req_params[].name] 请求参数名
|
||||
* @param {String} [req_params[].value] 请求参数值,可填写生成规则(mock)。如@email,随机生成一条email
|
||||
* @param {String} [req_params[].type] 请求参数类型,有["text", "file"]两种
|
||||
* @param {Mixed} [req_params_form] 请求参数,如果请求方式是form,参数是Array数组,其他格式请求参数是字符串
|
||||
* @param {String} [req_params_form[].name] 请求参数名
|
||||
* @param {String} [req_params_form[].value] 请求参数值,可填写生成规则(mock)。如@email,随机生成一条email
|
||||
* @param {String} [req_params_form[].type] 请求参数类型,有["text", "file"]两种
|
||||
* @param {String} [req_params_other] 非form类型的请求参数可保存到此字段
|
||||
* @param {String} [res_body_type] 相应信息的数据格式,有["json", "text", "xml"]三种
|
||||
* @param {String} [res_body] 响应信息,可填写任意字符串,如果res_body_type是json,则会调用mock功能
|
||||
* @param {String} [desc] 接口描述
|
||||
@ -63,6 +65,7 @@ class interfaceController extends baseController{
|
||||
async add(ctx){
|
||||
let params = ctx.request.body;
|
||||
params.method = params.method || 'GET';
|
||||
params.method = params.method.toUpperCase()
|
||||
params.res_body_type = params.res_body_type ? params.res_body_type.toLowerCase() : 'json';
|
||||
if(!params.project_id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空');
|
||||
@ -80,6 +83,7 @@ class interfaceController extends baseController{
|
||||
try{
|
||||
let data = {
|
||||
project_id: params.project_id,
|
||||
title: params.title,
|
||||
path: params.path,
|
||||
desc: params.desc,
|
||||
method: params.method,
|
||||
@ -92,8 +96,8 @@ class interfaceController extends baseController{
|
||||
up_time: yapi.commons.time()
|
||||
}
|
||||
|
||||
if(data.req_params_type === 'form') data.req_params_form = params.req_params;
|
||||
else data.req_params_other = params.req_params;
|
||||
if(params.req_params_form) data.req_params_form = params.req_params_form;
|
||||
if(params.req_params_other) data.req_params_other = params.req_params_other;
|
||||
|
||||
let result = await this.Model.save(data);
|
||||
ctx.body = yapi.commons.resReturn(result);
|
||||
@ -126,7 +130,7 @@ class interfaceController extends baseController{
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加项目分组
|
||||
* 接口列表
|
||||
* @interface /interface/list
|
||||
* @method GET
|
||||
* @category interface
|
||||
@ -150,7 +154,7 @@ class interfaceController extends baseController{
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加项目分组
|
||||
* 编辑接口
|
||||
* @interface /interface/up
|
||||
* @method POST
|
||||
* @category interface
|
||||
@ -164,10 +168,11 @@ class interfaceController extends baseController{
|
||||
* @param {Boolean} [req_headers[].required] 是否是必须,默认为否
|
||||
* @param {String} [req_headers[].desc] header描述
|
||||
* @param {String} [req_params_type] 请求参数方式,有["form", "json", "text", "xml"]四种
|
||||
* @param {Mixed} [req_params] 请求参数,如果请求方式是form,参数是Array数组,其他格式请求参数是字符串
|
||||
* @param {String} [req_params[].name] 请求参数名
|
||||
* @param {String} [req_params[].value] 请求参数值,可填写生成规则(mock)。如@email,随机生成一条email
|
||||
* @param {String} [req_params[].type] 请求参数类型,有["text", "file"]两种
|
||||
* @param {Mixed} [req_params_form] 请求参数,如果请求方式是form,参数是Array数组,其他格式请求参数是字符串
|
||||
* @param {String} [req_params_form[].name] 请求参数名
|
||||
* @param {String} [req_params_form[].value] 请求参数值,可填写生成规则(mock)。如@email,随机生成一条email
|
||||
* @param {String} [req_params_form[].type] 请求参数类型,有["text", "file"]两种
|
||||
* @param {String} [req_params_other] 非form类型的请求参数可保存到此字段
|
||||
* @param {String} [res_body_type] 相应信息的数据格式,有["json", "text", "xml"]三种
|
||||
* @param {String} [res_body] 响应信息,可填写任意字符串,如果res_body_type是json,则会调用mock功能
|
||||
* @param {String} [desc] 接口描述
|
||||
@ -178,11 +183,13 @@ class interfaceController extends baseController{
|
||||
async up(ctx){
|
||||
let params = ctx.request.body;
|
||||
params.method = params.method || 'GET';
|
||||
params.method = params.method.toUpperCase()
|
||||
let id = ctx.request.body.id;
|
||||
if(!id){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '接口id不能为空');
|
||||
}
|
||||
if(params.path){
|
||||
let interfaceData = await this.Model.get(id);
|
||||
if(params.path && params.path !== interfaceData.path && params.method !== interfaceData.method){
|
||||
let checkRepeat = await this.Model.checkRepeat(params.path, params.method);
|
||||
if(checkRepeat > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '已存在的接口:' + params.path + '[' + params.method + ']');
|
||||
@ -194,13 +201,14 @@ class interfaceController extends baseController{
|
||||
}
|
||||
|
||||
if(params.path) data.path = params.path;
|
||||
if(params.title) data.title = params.title;
|
||||
if(params.desc) data.desc = params.desc;
|
||||
if(params.method) data.method = params.method;
|
||||
|
||||
if(params.req_headers) data.req_headers = params.req_headers;
|
||||
|
||||
if(params.req_params_type === 'form') data.req_params_form = params.req_params;
|
||||
else data.req_params_other = params.req_params;
|
||||
if(params.req_params_form) data.req_params_form = params.req_params_form;
|
||||
if(params.req_params_other) data.req_params_other = params.req_params_other;
|
||||
|
||||
if(params.res_body_type) data.res_body_type = params.res_body_type;
|
||||
if(params.res_body) data.res_body = params.res_body;
|
||||
|
114
doc/build/static/server/controllers/log.js.html
vendored
Normal file
114
doc/build/static/server/controllers/log.js.html
vendored
Normal file
@ -0,0 +1,114 @@
|
||||
<!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/log.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/log.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 logModel from '../models/log.js';
|
||||
import yapi from '../yapi.js';
|
||||
import baseController from './base.js';
|
||||
import groupModel from '../models/group';
|
||||
|
||||
class logController extends baseController {
|
||||
constructor(ctx) {
|
||||
super(ctx);
|
||||
this.Model = yapi.getInst(logModel);
|
||||
this.groupModel = yapi.getInst(groupModel);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取节点列表
|
||||
* @interface /node/list
|
||||
* @method GET
|
||||
* @category node
|
||||
* @foldnumber 10
|
||||
* @param {Number} uid 用户id, 不能为空
|
||||
* @param {Number} [page] 分页页码
|
||||
* @param {Number} [limit] 分页大小
|
||||
* @returns {Object}
|
||||
* @example ./api/project/list.json
|
||||
*/
|
||||
|
||||
async list(ctx) {
|
||||
let uid = ctx.request.query.uid,
|
||||
page = ctx.request.query.page || 1,
|
||||
limit = ctx.request.query.limit || 10;
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = logController;
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="docs-header" id="content" tabindex="-1">
|
||||
<div class="container">
|
||||
<h1>yapi : ./server/controllers/log.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>
|
@ -41,6 +41,32 @@ class projectController extends baseController {
|
||||
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(!this.verifyPath(basepath)){
|
||||
return false;
|
||||
}
|
||||
return basepath;
|
||||
}
|
||||
|
||||
verifyPath(path){
|
||||
if(/^[a-zA-Z0-9\-\/_:]+$/.test(path)){
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
verifyDomain(domain){
|
||||
if(!domain) return false;
|
||||
if(/^[a-zA-Z0-9\-_\.]+[a-zA-Z]{2,6}$/.test(domain)){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加项目分组
|
||||
* @interface /project/add
|
||||
@ -79,6 +105,14 @@ class projectController extends baseController {
|
||||
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(!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');
|
||||
@ -315,7 +349,7 @@ class projectController extends baseController {
|
||||
* @param {String} [desc] 项目描述
|
||||
* @param {Array} [env] 项目环境配置
|
||||
* @param {String} [env[].name] 环境名称
|
||||
* @param {String} [env[].host] 环境域名
|
||||
* @param {String} [env[].domain] 环境域名
|
||||
* @returns {Object}
|
||||
* @example ./api/project/up.json
|
||||
*/
|
||||
@ -333,6 +367,15 @@ class projectController extends baseController {
|
||||
}
|
||||
|
||||
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(!this.verifyDomain(params.prd_host)){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '线上域名格式有误')
|
||||
}
|
||||
|
||||
if(projectData.name === params.name){
|
||||
delete params.name;
|
||||
}
|
||||
|
@ -10,4 +10,4 @@
|
||||
<div id="yapi" style="height: 100%;"></div>
|
||||
<script src="prd/index@dev.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
@ -10,7 +10,6 @@ import bodyParser from 'koa-bodyparser'
|
||||
import router from './router.js'
|
||||
|
||||
yapi.connect = dbModule.connect()
|
||||
|
||||
const app = new Koa()
|
||||
app.use(mockServer)
|
||||
app.use(bodyParser())
|
||||
|
@ -48,6 +48,10 @@ class interfaceController extends baseController{
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '接口请求路径不能为空');
|
||||
}
|
||||
|
||||
if(!yapi.commons.verifyPath(params.path)){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '接口path第一位必须是/,最后一位不能为/')
|
||||
}
|
||||
|
||||
let checkRepeat = await this.Model.checkRepeat(params.path, params.method);
|
||||
if(checkRepeat > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '已存在的接口:' + params.path + '[' + params.method + ']');
|
||||
@ -162,12 +166,17 @@ class interfaceController extends baseController{
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '接口id不能为空');
|
||||
}
|
||||
let interfaceData = await this.Model.get(id);
|
||||
|
||||
if(params.path && !yapi.commons.verifyPath(params.path)){
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '接口path第一位必须是/,最后一位不能为/')
|
||||
}
|
||||
|
||||
if(params.path && params.path !== interfaceData.path && params.method !== interfaceData.method){
|
||||
let checkRepeat = await this.Model.checkRepeat(params.path, params.method);
|
||||
if(checkRepeat > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '已存在的接口:' + params.path + '[' + params.method + ']');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let data = {
|
||||
up_time: yapi.commons.time()
|
||||
|
@ -18,20 +18,12 @@ class projectController extends baseController {
|
||||
if(!basepath) return false;
|
||||
if(basepath[0] !== '/') basepath = '/' + basepath;
|
||||
if(basepath[basepath.length -1] === '/') basepath = basepath.substr(0, basepath.length -1)
|
||||
if(!this.verifyPath(basepath)){
|
||||
if(yapi.commons.verifyPath(basepath)){
|
||||
return false;
|
||||
}
|
||||
return basepath;
|
||||
}
|
||||
|
||||
verifyPath(path){
|
||||
if(/^[a-zA-Z0-9\-\/_:]+$/.test(basepath)){
|
||||
return true;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
verifyDomain(domain){
|
||||
if(!domain) return false;
|
||||
if(/^[a-zA-Z0-9\-_\.]+[a-zA-Z]{2,6}$/.test(domain)){
|
||||
@ -78,7 +70,7 @@ class projectController extends baseController {
|
||||
return ctx.body = yapi.commons.resReturn(null, 400, '项目domain不能为空');
|
||||
}
|
||||
|
||||
if(params.basepath = (this.handleBasepath(params.basepath)) === false){
|
||||
if((params.basepath = this.handleBasepath(params.basepath)) === false){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, 'basepath格式有误')
|
||||
}
|
||||
|
||||
@ -90,7 +82,6 @@ class projectController extends baseController {
|
||||
if(checkRepeatDomain > 0){
|
||||
return ctx.body = yapi.commons.resReturn(null, 401, '已存在domain和basepath');
|
||||
}
|
||||
|
||||
|
||||
let data = {
|
||||
name: params.name,
|
||||
@ -323,7 +314,7 @@ class projectController extends baseController {
|
||||
* @param {String} [desc] 项目描述
|
||||
* @param {Array} [env] 项目环境配置
|
||||
* @param {String} [env[].name] 环境名称
|
||||
* @param {String} [env[].host] 环境域名
|
||||
* @param {String} [env[].domain] 环境域名
|
||||
* @returns {Object}
|
||||
* @example ./api/project/up.json
|
||||
*/
|
||||
|
@ -139,6 +139,10 @@ class userController extends baseController {
|
||||
up_time: yapi.commons.time()
|
||||
}
|
||||
user = await userInst.save(data);
|
||||
yapi.commons.sendMail({
|
||||
to: params.email,
|
||||
contents: `<h3>亲爱的用户:</h3><p>您好,感谢使用YApi,系统检测您是第一次用Qsso账号登录YApi服务,您的Email是: ${params.email} ,初始化密码为:${passsalt}</p>`
|
||||
})
|
||||
}
|
||||
|
||||
this.setLoginCookie(user._id, user.passsalt)
|
||||
@ -276,7 +280,7 @@ class userController extends baseController {
|
||||
});
|
||||
yapi.commons.sendMail({
|
||||
to: params.email,
|
||||
contents: `欢迎注册,您的账号 ${params.email} 已经注册成功`
|
||||
contents: `<h3>亲爱的用户:</h3><p>您好,感谢使用YApi,您的账号 ${params.email} 已经注册成功</p>`
|
||||
})
|
||||
} catch (e) {
|
||||
ctx.body = yapi.commons.resReturn(null, 401, e.message);
|
||||
|
@ -70,7 +70,7 @@ class interfaceModel extends baseModel{
|
||||
list (project_id){
|
||||
return this.model.find({
|
||||
project_id: project_id
|
||||
}).exec()
|
||||
}).sort({_id: -1}).exec()
|
||||
}
|
||||
|
||||
del(id){
|
||||
|
@ -12,6 +12,7 @@ class projectModel extends baseModel{
|
||||
name: {type: String, required: true},
|
||||
basepath: {type: String, required: true, validate: {
|
||||
validator: (v) => {
|
||||
console.log('basepath: ', v)
|
||||
return v && v[0] === '/'
|
||||
},
|
||||
message: 'basepath必须是/开头'
|
||||
@ -64,7 +65,7 @@ class projectModel extends baseModel{
|
||||
list (group_id){
|
||||
return this.model.find({
|
||||
group_id: group_id
|
||||
}).exec()
|
||||
}).sort({_id: -1}).exec()
|
||||
}
|
||||
|
||||
listWithPaging(group_id, page, limit) {
|
||||
@ -72,7 +73,7 @@ class projectModel extends baseModel{
|
||||
limit = parseInt(limit);
|
||||
return this.model.find({
|
||||
group_id: group_id
|
||||
}).skip((page - 1) * limit).limit(limit).exec();
|
||||
}).sort({_id: -1}).skip((page - 1) * limit).limit(limit).exec();
|
||||
}
|
||||
|
||||
listCount(group_id) {
|
||||
|
@ -47,7 +47,7 @@ class userModel extends baseModel{
|
||||
listWithPaging(page, limit) {
|
||||
page = parseInt(page);
|
||||
limit = parseInt(limit);
|
||||
return this.model.find().skip((page - 1) * limit).limit(limit).select("_id username email role add_time up_time").exec();
|
||||
return this.model.find().sort({_id: -1}).skip((page - 1) * limit).limit(limit).select("_id username email role add_time up_time").exec();
|
||||
}
|
||||
listCount() {
|
||||
return this.model.count();
|
||||
|
@ -134,4 +134,16 @@ exports.filterRes = (list, rules) => {
|
||||
});
|
||||
return filteredRes;
|
||||
})
|
||||
}
|
||||
|
||||
exports.verifyPath = (path) => {
|
||||
if (/^\/[a-zA-Z0-9\-\/_:]+$/.test(path)) {
|
||||
if (path[path.length - 1] === '/') {
|
||||
return false;
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
@ -42,7 +42,6 @@ _yapi2.default.commons = _commons2.default;
|
||||
|
||||
|
||||
_yapi2.default.connect = _db2.default.connect();
|
||||
|
||||
var app = new _koa2.default();
|
||||
app.use(_mockServer2.default);
|
||||
app.use((0, _koaBodyparser2.default)());
|
||||
|
@ -114,21 +114,29 @@ var interfaceController = function (_baseController) {
|
||||
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '接口请求路径不能为空'));
|
||||
|
||||
case 8:
|
||||
_context.next = 10;
|
||||
return this.Model.checkRepeat(params.path, params.method);
|
||||
if (_yapi2.default.commons.verifyPath(params.path)) {
|
||||
_context.next = 10;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '接口path第一位必须是/,最后一位不能为/'));
|
||||
|
||||
case 10:
|
||||
_context.next = 12;
|
||||
return this.Model.checkRepeat(params.path, params.method);
|
||||
|
||||
case 12:
|
||||
checkRepeat = _context.sent;
|
||||
|
||||
if (!(checkRepeat > 0)) {
|
||||
_context.next = 13;
|
||||
_context.next = 15;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 401, '已存在的接口:' + params.path + '[' + params.method + ']'));
|
||||
|
||||
case 13:
|
||||
_context.prev = 13;
|
||||
case 15:
|
||||
_context.prev = 15;
|
||||
data = {
|
||||
project_id: params.project_id,
|
||||
title: params.title,
|
||||
@ -148,28 +156,28 @@ var interfaceController = function (_baseController) {
|
||||
if (params.req_params_form) data.req_params_form = params.req_params_form;
|
||||
if (params.req_params_other) data.req_params_other = params.req_params_other;
|
||||
|
||||
_context.next = 19;
|
||||
_context.next = 21;
|
||||
return this.Model.save(data);
|
||||
|
||||
case 19:
|
||||
case 21:
|
||||
result = _context.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context.next = 26;
|
||||
_context.next = 28;
|
||||
break;
|
||||
|
||||
case 23:
|
||||
_context.prev = 23;
|
||||
_context.t0 = _context['catch'](13);
|
||||
case 25:
|
||||
_context.prev = 25;
|
||||
_context.t0 = _context['catch'](15);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, _context.t0.message);
|
||||
|
||||
case 26:
|
||||
case 28:
|
||||
case 'end':
|
||||
return _context.stop();
|
||||
}
|
||||
}
|
||||
}, _callee, this, [[13, 23]]);
|
||||
}, _callee, this, [[15, 25]]);
|
||||
}));
|
||||
|
||||
function add(_x) {
|
||||
@ -359,25 +367,33 @@ var interfaceController = function (_baseController) {
|
||||
case 8:
|
||||
interfaceData = _context4.sent;
|
||||
|
||||
if (!(params.path && params.path !== interfaceData.path && params.method !== interfaceData.method)) {
|
||||
_context4.next = 15;
|
||||
if (!(params.path && !_yapi2.default.commons.verifyPath(params.path))) {
|
||||
_context4.next = 11;
|
||||
break;
|
||||
}
|
||||
|
||||
_context4.next = 12;
|
||||
return _context4.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '接口path第一位必须是/,最后一位不能为/'));
|
||||
|
||||
case 11:
|
||||
if (!(params.path && params.path !== interfaceData.path && params.method !== interfaceData.method)) {
|
||||
_context4.next = 17;
|
||||
break;
|
||||
}
|
||||
|
||||
_context4.next = 14;
|
||||
return this.Model.checkRepeat(params.path, params.method);
|
||||
|
||||
case 12:
|
||||
case 14:
|
||||
checkRepeat = _context4.sent;
|
||||
|
||||
if (!(checkRepeat > 0)) {
|
||||
_context4.next = 15;
|
||||
_context4.next = 17;
|
||||
break;
|
||||
}
|
||||
|
||||
return _context4.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 401, '已存在的接口:' + params.path + '[' + params.method + ']'));
|
||||
|
||||
case 15:
|
||||
case 17:
|
||||
data = {
|
||||
up_time: _yapi2.default.commons.time()
|
||||
};
|
||||
@ -396,29 +412,29 @@ var interfaceController = function (_baseController) {
|
||||
if (params.res_body_type) data.res_body_type = params.res_body_type;
|
||||
if (params.res_body) data.res_body = params.res_body;
|
||||
|
||||
_context4.prev = 25;
|
||||
_context4.next = 28;
|
||||
_context4.prev = 27;
|
||||
_context4.next = 30;
|
||||
return this.Model.up(id, data);
|
||||
|
||||
case 28:
|
||||
case 30:
|
||||
result = _context4.sent;
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(result);
|
||||
_context4.next = 35;
|
||||
_context4.next = 37;
|
||||
break;
|
||||
|
||||
case 32:
|
||||
_context4.prev = 32;
|
||||
_context4.t0 = _context4['catch'](25);
|
||||
case 34:
|
||||
_context4.prev = 34;
|
||||
_context4.t0 = _context4['catch'](27);
|
||||
|
||||
ctx.body = _yapi2.default.commons.resReturn(null, 402, _context4.t0.message);
|
||||
|
||||
case 35:
|
||||
case 37:
|
||||
case 'end':
|
||||
return _context4.stop();
|
||||
}
|
||||
}
|
||||
}, _callee4, this, [[25, 32]]);
|
||||
}, _callee4, this, [[27, 34]]);
|
||||
}));
|
||||
|
||||
function up(_x4) {
|
||||
|
@ -77,20 +77,11 @@ var projectController = function (_baseController) {
|
||||
if (!basepath) return false;
|
||||
if (basepath[0] !== '/') basepath = '/' + basepath;
|
||||
if (basepath[basepath.length - 1] === '/') basepath = basepath.substr(0, basepath.length - 1);
|
||||
if (!this.verifyPath(basepath)) {
|
||||
if (_yapi2.default.commons.verifyPath(basepath)) {
|
||||
return false;
|
||||
}
|
||||
return basepath;
|
||||
}
|
||||
}, {
|
||||
key: 'verifyPath',
|
||||
value: function verifyPath(path) {
|
||||
if (/^[a-zA-Z0-9\-\/_:]+$/.test(basepath)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}, {
|
||||
key: 'verifyDomain',
|
||||
value: function verifyDomain(domain) {
|
||||
@ -174,7 +165,7 @@ var projectController = function (_baseController) {
|
||||
return _context.abrupt('return', ctx.body = _yapi2.default.commons.resReturn(null, 400, '项目domain不能为空'));
|
||||
|
||||
case 14:
|
||||
if (!(params.basepath = this.handleBasepath(params.basepath) === false)) {
|
||||
if (!((params.basepath = this.handleBasepath(params.basepath)) === false)) {
|
||||
_context.next = 16;
|
||||
break;
|
||||
}
|
||||
@ -742,7 +733,7 @@ var projectController = function (_baseController) {
|
||||
* @param {String} [desc] 项目描述
|
||||
* @param {Array} [env] 项目环境配置
|
||||
* @param {String} [env[].name] 环境名称
|
||||
* @param {String} [env[].host] 环境域名
|
||||
* @param {String} [env[].domain] 环境域名
|
||||
* @returns {Object}
|
||||
* @example ./api/project/up.json
|
||||
*/
|
||||
|
@ -301,7 +301,7 @@ var userController = function (_baseController) {
|
||||
user = _context4.sent;
|
||||
|
||||
if (!(!user || !user._id)) {
|
||||
_context4.next = 12;
|
||||
_context4.next = 13;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -321,24 +321,29 @@ var userController = function (_baseController) {
|
||||
case 11:
|
||||
user = _context4.sent;
|
||||
|
||||
case 12:
|
||||
_yapi2.default.commons.sendMail({
|
||||
to: params.email,
|
||||
contents: '<h3>\u4EB2\u7231\u7684\u7528\u6237\uFF1A</h3><p>\u60A8\u597D\uFF0C\u611F\u8C22\u4F7F\u7528YApi,\u7CFB\u7EDF\u68C0\u6D4B\u60A8\u662F\u7B2C\u4E00\u6B21\u7528Qsso\u8D26\u53F7\u767B\u5F55YApi\u670D\u52A1,\u60A8\u7684Email\u662F\uFF1A ' + params.email + ' \uFF0C\u521D\u59CB\u5316\u5BC6\u7801\u4E3A\uFF1A' + passsalt + '</p>'
|
||||
});
|
||||
|
||||
case 13:
|
||||
|
||||
this.setLoginCookie(user._id, user.passsalt);
|
||||
return _context4.abrupt('return', true);
|
||||
|
||||
case 16:
|
||||
_context4.prev = 16;
|
||||
case 17:
|
||||
_context4.prev = 17;
|
||||
_context4.t0 = _context4['catch'](2);
|
||||
|
||||
console.error(_context4.t0.message);
|
||||
return _context4.abrupt('return', false);
|
||||
|
||||
case 20:
|
||||
case 21:
|
||||
case 'end':
|
||||
return _context4.stop();
|
||||
}
|
||||
}
|
||||
}, _callee4, this, [[2, 16]]);
|
||||
}, _callee4, this, [[2, 17]]);
|
||||
}));
|
||||
|
||||
function handleThirdLogin(_x4, _x5) {
|
||||
@ -605,7 +610,7 @@ var userController = function (_baseController) {
|
||||
});
|
||||
_yapi2.default.commons.sendMail({
|
||||
to: params.email,
|
||||
contents: '\u6B22\u8FCE\u6CE8\u518C\uFF0C\u60A8\u7684\u8D26\u53F7 ' + params.email + ' \u5DF2\u7ECF\u6CE8\u518C\u6210\u529F'
|
||||
contents: '<h3>\u4EB2\u7231\u7684\u7528\u6237\uFF1A</h3><p>\u60A8\u597D\uFF0C\u611F\u8C22\u4F7F\u7528YApi,\u60A8\u7684\u8D26\u53F7 ' + params.email + ' \u5DF2\u7ECF\u6CE8\u518C\u6210\u529F</p>'
|
||||
});
|
||||
_context8.next = 26;
|
||||
break;
|
||||
@ -855,15 +860,16 @@ var userController = function (_baseController) {
|
||||
key: 'update',
|
||||
value: function () {
|
||||
var _ref12 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee12(ctx) {
|
||||
var params, userInst, id, data, checkRepeat, result;
|
||||
var _params, userInst, id, data, checkRepeat, result;
|
||||
|
||||
return _regenerator2.default.wrap(function _callee12$(_context12) {
|
||||
while (1) {
|
||||
switch (_context12.prev = _context12.next) {
|
||||
case 0:
|
||||
_context12.prev = 0;
|
||||
params = ctx.request.body;
|
||||
_params = ctx.request.body;
|
||||
|
||||
if (!(this.getRole() !== 'admin' && params.uid != this.getUid())) {
|
||||
if (!(this.getRole() !== 'admin' && _params.uid != this.getUid())) {
|
||||
_context12.next = 4;
|
||||
break;
|
||||
}
|
||||
@ -872,7 +878,7 @@ var userController = function (_baseController) {
|
||||
|
||||
case 4:
|
||||
userInst = _yapi2.default.getInst(_user2.default);
|
||||
id = params.uid;
|
||||
id = _params.uid;
|
||||
|
||||
if (id) {
|
||||
_context12.next = 8;
|
||||
@ -888,10 +894,10 @@ var userController = function (_baseController) {
|
||||
};
|
||||
|
||||
if (this.getRole() === 'admin') {
|
||||
params.role && (data.role = params.role);
|
||||
_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) {
|
||||
_context12.next = 18;
|
||||
|
@ -114,7 +114,7 @@ var interfaceModel = function (_baseModel) {
|
||||
value: function list(project_id) {
|
||||
return this.model.find({
|
||||
project_id: project_id
|
||||
}).exec();
|
||||
}).sort({ _id: -1 }).exec();
|
||||
}
|
||||
}, {
|
||||
key: 'del',
|
||||
|
@ -51,6 +51,7 @@ var projectModel = function (_baseModel) {
|
||||
name: { type: String, required: true },
|
||||
basepath: { type: String, required: true, validate: {
|
||||
validator: function validator(v) {
|
||||
console.log('basepath: ', v);
|
||||
return v && v[0] === '/';
|
||||
},
|
||||
message: 'basepath必须是/开头'
|
||||
@ -105,7 +106,7 @@ var projectModel = function (_baseModel) {
|
||||
value: function list(group_id) {
|
||||
return this.model.find({
|
||||
group_id: group_id
|
||||
}).exec();
|
||||
}).sort({ _id: -1 }).exec();
|
||||
}
|
||||
}, {
|
||||
key: 'listWithPaging',
|
||||
@ -114,7 +115,7 @@ var projectModel = function (_baseModel) {
|
||||
limit = parseInt(limit);
|
||||
return this.model.find({
|
||||
group_id: group_id
|
||||
}).skip((page - 1) * limit).limit(limit).exec();
|
||||
}).sort({ _id: -1 }).skip((page - 1) * limit).limit(limit).exec();
|
||||
}
|
||||
}, {
|
||||
key: 'listCount',
|
||||
|
@ -99,7 +99,7 @@ var userModel = function (_baseModel) {
|
||||
value: function listWithPaging(page, limit) {
|
||||
page = parseInt(page);
|
||||
limit = parseInt(limit);
|
||||
return this.model.find().skip((page - 1) * limit).limit(limit).select("_id username email role add_time up_time").exec();
|
||||
return this.model.find().sort({ _id: -1 }).skip((page - 1) * limit).limit(limit).select("_id username email role add_time up_time").exec();
|
||||
}
|
||||
}, {
|
||||
key: 'listCount',
|
||||
|
@ -155,4 +155,16 @@ exports.filterRes = function (list, rules) {
|
||||
});
|
||||
return filteredRes;
|
||||
});
|
||||
};
|
||||
|
||||
exports.verifyPath = function (path) {
|
||||
if (/^\/[a-zA-Z0-9\-\/_:]+$/.test(path)) {
|
||||
if (path[path.length - 1] === '/') {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
@ -5,6 +5,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<title>my yApi</title>
|
||||
<link rel="stylesheet" href="http://127.0.0.1:4000/yapi/prd/index@dev.css">
|
||||
<script src="https://qsso.corp.qunar.com/lib/qsso-auth.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="yapi" style="height: 100%;"></div>
|
||||
@ -33,7 +34,3 @@ xhr.send()
|
||||
-->
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user