diff --git a/client/actions/addInterFace.js b/client/actions/addInterFace.js deleted file mode 100644 index 4675fb63..00000000 --- a/client/actions/addInterFace.js +++ /dev/null @@ -1,74 +0,0 @@ -import { - FETCH_ADD_INTERFACE_INPUT, - FETCH_ADD_INTERFACE_TAG_VALUE, - FETCH_ADD_INTERFACE_HEADER_VALUE, - ADD_INTERFACE_SEQ_HEADER, - DELETE_INTERFACE_SEQ_HEADER, - GET_INTERFACE_REQ_PARAMS, - GET_INTERFACE_RES_PARAMS, - PUSH_INTERFACE_NAME, - PUSH_INTERFACE_METHOD -} from '../constants/action-types.js' - -export function pushInputValue (value) { - return { - type: FETCH_ADD_INTERFACE_INPUT, - payload: value - }; -} - -export function reqTagValue (value) { - return { - type: FETCH_ADD_INTERFACE_TAG_VALUE, - payload: value - }; -} - -export function reqHeaderValue (value) { - return { - type: FETCH_ADD_INTERFACE_HEADER_VALUE, - payload: value - }; -} - -export function addReqHeader (value) { - return { - type: ADD_INTERFACE_SEQ_HEADER, - payload: value - }; -} - -export function deleteReqHeader (value) { - return { - type: DELETE_INTERFACE_SEQ_HEADER, - payload: value - }; -} - -export function getReqParams (value) { - return { - type: GET_INTERFACE_REQ_PARAMS, - payload: value - }; -} - -export function getResParams (value) { - return { - type: GET_INTERFACE_RES_PARAMS, - payload: value - }; -} - -export function pushInterfaceName (value) { - return { - type: PUSH_INTERFACE_NAME, - payload: value - } -} - -export function pushInterfaceMethod (value) { - return { - type: PUSH_INTERFACE_METHOD, - payload: value - } -} diff --git a/client/actions/addInterface.js b/client/actions/addInterface.js index 4675fb63..7437eb20 100644 --- a/client/actions/addInterface.js +++ b/client/actions/addInterface.js @@ -7,8 +7,10 @@ import { GET_INTERFACE_REQ_PARAMS, GET_INTERFACE_RES_PARAMS, PUSH_INTERFACE_NAME, - PUSH_INTERFACE_METHOD + PUSH_INTERFACE_METHOD, + FETCH_INTERFACE_PROJECT } from '../constants/action-types.js' +import axios from 'axios' export function pushInputValue (value) { return { @@ -72,3 +74,10 @@ export function pushInterfaceMethod (value) { payload: value } } + +export function fetchInterfaceProject(id) { + return { + type: FETCH_INTERFACE_PROJECT, + payload: axios.get('/project/get', { params: {id}}) + } +} diff --git a/client/actions/login.js b/client/actions/login.js index 6ea78871..bf967528 100644 --- a/client/actions/login.js +++ b/client/actions/login.js @@ -11,7 +11,6 @@ import axios from 'axios'; const checkLoginState = () => { return(dispatch)=> { axios.get('/user/status').then((res) => { - console.log(res); dispatch({ type: GET_LOGIN_STATE, payload: res diff --git a/client/components/Header/Search/Search.js b/client/components/Header/Search/Search.js index 5e57b57a..84f5f1d3 100644 --- a/client/components/Header/Search/Search.js +++ b/client/components/Header/Search/Search.js @@ -31,7 +31,7 @@ export default class Srch extends Component{ } onSelect = (value) => { - if( value.split(":")[0] == "group" ){ + if( value.split(":")[0] == "分组" ){ this.props.history.push('/group/'+value.split(":")[1].trim()); } else { this.props.history.push('/project/'+value.split("(")[1].slice(0,-1)); @@ -45,7 +45,7 @@ export default class Srch extends Component{ 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+")" ); + title == "group" ? dataSource.push( "分组"+": "+item.groupName ): dataSource.push( "项目"+": "+item.name+"("+item._id+")" ); }) } this.setState({ @@ -84,8 +84,13 @@ export default class Srch extends Component{ > } - size="large" style={{ width: 200 }} - placeholder="search group/project" + size="large" + style={{ + // width: 200, + // borderColor:"#AAA", + // borderWidth:"1px", + }} + placeholder="搜索分组/项目" className="search-input" /> diff --git a/client/components/Header/Search/Search.scss b/client/components/Header/Search/Search.scss index 2a497729..5de982eb 100644 --- a/client/components/Header/Search/Search.scss +++ b/client/components/Header/Search/Search.scss @@ -2,10 +2,14 @@ $color-grey:#979DA7; .search-wrapper{ .search-input{ - border:1px solid #AAA; - background-color: rgba(255,255,255,0.5); + border:1px solid $color-grey; + color: $color-grey; + width: 2rem; + transition: width 2s; + //background-color:rgba(0,0,0,0.5); } .srch-icon{ color: $color-grey; + font-weight: bold; } } diff --git a/client/constants/action-types.js b/client/constants/action-types.js index 68173e59..12a7d58b 100644 --- a/client/constants/action-types.js +++ b/client/constants/action-types.js @@ -14,6 +14,7 @@ export const DELETE_INTERFACE_SEQ_HEADER = 'DELETE_INTERFACE_SEQ_HEADER' export const GET_INTERFACE_REQ_PARAMS = 'GET_INTERFACE_REQ_PARAMS' export const GET_INTERFACE_RES_PARAMS = 'GET_INTERFACE_RES_PARAMS' export const PUSH_INTERFACE_METHOD = 'PUSH_INTERFACE_METHOD' +export const FETCH_INTERFACE_PROJECT = 'FETCH_INTERFACE_PROJECT' // group export const FETCH_GROUP_LIST = 'FETCH_GROUP_LIST' diff --git a/client/containers/AddInterface/AddInterface.js b/client/containers/AddInterface/AddInterface.js index 5dfdb26e..14789991 100644 --- a/client/containers/AddInterface/AddInterface.js +++ b/client/containers/AddInterface/AddInterface.js @@ -10,13 +10,16 @@ import ReqHeader from './ReqHeader/ReqHeader.js' import ReqParams from './ReqParams/ReqParams.js' import ResParams from './ResParams/ResParams.js' import Result from './Result/Result.js' -import { +import InterfaceTest from './InterfaceTest/InterfaceTest.js' +import { saveForms, getResParams, getReqParams, addReqHeader, pushInputValue, - pushInterfaceName + pushInterfaceName, + fetchInterfaceProject, + pushInterfaceMethod } from '../../actions/addInterface.js' const success = () => { @@ -40,7 +43,9 @@ const success = () => { getResParams, addReqHeader, pushInputValue, - pushInterfaceName + pushInterfaceName, + fetchInterfaceProject, + pushInterfaceMethod } ) @@ -105,12 +110,14 @@ class AddInterface extends Component { editState (data) { const props = this.props - const { path, title, req_params_other, res_body, req_headers} = data + const { path, title, req_params_other, res_body, req_headers, project_id, method } = data props.pushInputValue(path) + props.pushInterfaceMethod(method) props.pushInterfaceName(title) props.getReqParams(req_params_other) props.getResParams(res_body) props.addReqHeader(req_headers) + props.fetchInterfaceProject(project_id) } initInterfaceData (interfaceId) { @@ -204,7 +211,9 @@ class AddInterface extends Component { mock - 测试 + + +
@@ -214,5 +223,3 @@ class AddInterface extends Component { } export default AddInterface - - diff --git a/client/containers/AddInterface/InterfaceTest/InterfaceTest.js b/client/containers/AddInterface/InterfaceTest/InterfaceTest.js new file mode 100644 index 00000000..728d6279 --- /dev/null +++ b/client/containers/AddInterface/InterfaceTest/InterfaceTest.js @@ -0,0 +1,120 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import { connect } from 'react-redux' +import { Button, Input } from 'antd' +import { autobind } from 'core-decorators'; +import crossRequest from 'cross-request'; +import { withRouter } from 'react-router'; +import URL from 'url'; + +import { +} from '../../../actions/group.js' + +import './InterfaceTest.scss' + +@connect( + state => ({ + reqParams: state.addInterface.reqParams, + method: state.addInterface.method, + url: state.addInterface.url, + seqGroup: state.addInterface.seqGroup, + interfaceName: state.addInterface.interfaceName, + interfaceProject: state.addInterface.project + }), + { + } +) +@withRouter +export default class InterfaceTest extends Component { + + static propTypes = { + reqParams: PropTypes.string, + method: PropTypes.string, + url: PropTypes.string, + interfaceName: PropTypes.string, + seqGroup: PropTypes.array, + match: PropTypes.object, + interfaceProject: PropTypes.object + } + + state = { + res: {}, + header: {} + } + + constructor(props) { + super(props) + } + + componentWillMount() { + + } + + @autobind + testInterface() { + crossRequest({ + url: 'http://petstore.swagger.io/v2/swagger.json', + method: 'GET', + data: { + a:1 + }, + success: (res, header) => { + this.setState({res}) + console.log(header) + } + }) + } + + + render () { + const { method, url, seqGroup, interfaceName, interfaceProject } = this.props; + const { prd_host, basepath, protocol } = interfaceProject; + const reqParams = JSON.parse(this.props.reqParams); + let query = {}; + + if (method === 'GET') { + Object.keys(reqParams).forEach(key => { + const value = typeof reqParams[key] === 'object' ? JSON.stringify(reqParams) : reqParams.toString(); + query[key] = value; + }) + } + + const href = URL.format({ + protocol: protocol || 'http', + host: prd_host, + pathname: URL.resolve(basepath, url), + query + }); + + + return ( +
+
接口名:{interfaceName}
+
+ METHOD: + URL: + HEADERS: + 请求参数: +
+ { + Object.keys(reqParams).map((key, index) => { + const value = typeof reqParams[key] === 'object' ? JSON.stringify(reqParams) : reqParams.toString(); + return ( +
+ {' = '} + +
+ ) + }) + } +
+
+ +
+ 返回结果: + {JSON.stringify(this.state.res, 2)} +
+
+ ) + } +} diff --git a/client/containers/AddInterface/InterfaceTest/InterfaceTest.scss b/client/containers/AddInterface/InterfaceTest/InterfaceTest.scss new file mode 100644 index 00000000..e69de29b diff --git a/client/containers/Home/Home.js b/client/containers/Home/Home.js index b7aac9b0..56383d10 100644 --- a/client/containers/Home/Home.js +++ b/client/containers/Home/Home.js @@ -40,7 +40,7 @@ const HomeGuest = (props) => (
( - +
@@ -66,7 +66,7 @@ const HomeGuest = (props) => ( 接口管理

- +
@@ -74,7 +74,7 @@ const HomeGuest = (props) => ( 支持Mock

- +
@@ -82,6 +82,14 @@ const HomeGuest = (props) => ( 团队协作

+ +
+ +
+

+ 可部署 +

+
@@ -132,7 +140,7 @@ class Home extends Component {

YAPI

-

一个高效,易用,功能强大的api管理系统

+

一个高效,易用,可部署的Api管理系统

+ ) diff --git a/client/containers/ProjectGroups/GroupList/GroupList.js b/client/containers/ProjectGroups/GroupList/GroupList.js index 641e7819..828091e0 100644 --- a/client/containers/ProjectGroups/GroupList/GroupList.js +++ b/client/containers/ProjectGroups/GroupList/GroupList.js @@ -68,11 +68,9 @@ export default class GroupList extends Component { this.props.history.replace(`${currGroup.group_name}`); } } - console.log(groupName); }else if(!groupName && this.props.groupList.length){ this.props.history.push(`/group/${this.props.groupList[0].group_name}`); } - console.log(currGroup); this.setState({groupList: this.props.groupList}); this.props.setCurrGroup(currGroup) }); @@ -205,11 +203,11 @@ export default class GroupList extends Component {
- {currGroup.group_name} +
{currGroup.group_name}
this.showModal(TYPE_EDIT)}/>
-
简介:{currGroup.group_desc}
+
简介:{currGroup.group_desc}
@@ -268,7 +266,7 @@ export default class GroupList extends Component {
简介:
- this.inputNewGroupDesc(e, TYPE_EDIT)}> +
diff --git a/client/containers/ProjectGroups/GroupList/GroupList.scss b/client/containers/ProjectGroups/GroupList/GroupList.scss index c6cb57fc..47ab3822 100644 --- a/client/containers/ProjectGroups/GroupList/GroupList.scss +++ b/client/containers/ProjectGroups/GroupList/GroupList.scss @@ -5,12 +5,25 @@ border-radius: 4px 4px 0 0; padding: 32px 24px; .curr-group-name { + .text { + display: inline-block; + overflow:hidden; + white-space:nowrap; + text-overflow:ellipsis; + max-width: 150px; + } color: #fff; font-size: 24px; } .curr-group-desc { color: #fff; font-size: 12px; + max-height: 54px; + text-overflow:ellipsis; + overflow:hidden; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + display: -webkit-box; } .delete-group, .edit-group { font-size: 18px; diff --git a/client/containers/ProjectGroups/ProjectList/ProjectList.js b/client/containers/ProjectGroups/ProjectList/ProjectList.js index 6c2130c8..a886e2c3 100644 --- a/client/containers/ProjectGroups/ProjectList/ProjectList.js +++ b/client/containers/ProjectGroups/ProjectList/ProjectList.js @@ -41,7 +41,7 @@ const getColumns = (data, props) => { dataIndex: 'name', key: 'name', render: (text, record) => { - return {text} + return {text} } }, { title: '创建人', diff --git a/client/containers/ProjectGroups/ProjectList/UpDateModal.js b/client/containers/ProjectGroups/ProjectList/UpDateModal.js index 06514cbd..531e5ebe 100644 --- a/client/containers/ProjectGroups/ProjectList/UpDateModal.js +++ b/client/containers/ProjectGroups/ProjectList/UpDateModal.js @@ -141,8 +141,9 @@ class UpDateModal extends Component { // can use data-binding to set form.setFieldsValue({ envs: envs.filter(key => { + const realKey = key._id ? key._id : key console.log(key); - return key._id !== id; + return realKey !== id; }) }); } @@ -183,7 +184,7 @@ class UpDateModal extends Component { getFieldDecorator('envs', { initialValue: envMessage }); const envs = getFieldValue('envs'); const formItems = envs.map((k, index) => { - // console.log(k); + console.log(k); const secondIndex = 'next' + index; // 为保证key的唯一性 return ( @@ -229,7 +230,7 @@ class UpDateModal extends Component { > {getFieldDecorator(`envs-domain-${index}`, { validateTrigger: ['onChange', 'onBlur'], - initialValue: envMessage.length !== 0 ? k.domain.split('\/\/')[1] : '', + initialValue: envMessage.length !== 0 && k.domain ? k.domain.split('\/\/')[1] : '', rules: [{ required: false, whitespace: true, @@ -269,7 +270,7 @@ class UpDateModal extends Component { this.remove(k._id)} + onClick={() => this.remove(k._id ? k._id : k)} /> ) : null} diff --git a/client/containers/User/LeftMenu.js b/client/containers/User/LeftMenu.js index f8a2b8f0..2dc2d6c3 100644 --- a/client/containers/User/LeftMenu.js +++ b/client/containers/User/LeftMenu.js @@ -10,7 +10,7 @@ const Option = AutoComplete.Option; state => { console.log(state); return { - curUid: state.user.curUid + curUid: state.login.uid + '' } } ) diff --git a/client/containers/User/List.js b/client/containers/User/List.js index 2c2f2dd3..2ae46fe5 100755 --- a/client/containers/User/List.js +++ b/client/containers/User/List.js @@ -4,7 +4,6 @@ import { Link } from 'react-router-dom' //import PropTypes from 'prop-types' import { Table, - Button, Popconfirm, message } from 'antd' @@ -79,11 +78,13 @@ class List extends Component { let columns = [{ title: 'UID', dataIndex: '_id', - key: '_id' + key: '_id', + width: 70 }, { title: '用户名', dataIndex: 'username', - key: 'username' + key: 'username', + width: 150 }, { title: 'Email', dataIndex: 'email', @@ -91,20 +92,24 @@ class List extends Component { }, { title: '用户角色', dataIndex: 'role', - key: 'role' + key: 'role', + width:110 }, { title: '更新日期', dataIndex: 'up_time', - key: 'up_time' + key: 'up_time', + width: 180 }, { title: '功能', key: 'action', + width:80, render: (item) => { return ( - + 查看 + {this.confirm(item._id)}} okText="Yes" cancelText="No"> - + 删除 ) @@ -128,7 +133,7 @@ class List extends Component { return (
- +
) diff --git a/client/containers/User/index.scss b/client/containers/User/index.scss index 90157f19..6539a25b 100644 --- a/client/containers/User/index.scss +++ b/client/containers/User/index.scss @@ -4,10 +4,11 @@ display: -webkit-box; -webkit-box-flex: 1; margin: .88rem auto 0 auto; - font-size: 0.14rem; + // font-size: 0.14rem; - min-height:500px; - margin-top: 84px; + min-height:433px; + margin-top: 40px; + margin-bottom: 55px; @@ -16,6 +17,7 @@ box-shadow: 0 2px 4px 0 rgba(0,0,0,0.20); background: #FFF; border-radius:5px; + margin-top: 15px; .search{ margin: 5px; } @@ -29,20 +31,22 @@ border-radius:5px; box-shadow: 0 2px 4px 0 rgba(0,0,0,0.20); background: #FFF; + margin-top: 15px; .ant-table-wrapper table { - font-size: .14rem; + // font-size: .14rem; - button { - margin: 0 10px 0 0; + a { + // font-size: 12px; } } + } .user-profile { -webkit-box-flex: 1; margin-top: 15px; margin-left: 15px; - padding: 10px; + padding: 10px 30px; box-shadow: 0 2px 4px 0 rgba(0,0,0,0.20); background: #FFF; border-radius:5px; @@ -51,9 +55,21 @@ line-height:35px; margin: 5px; margin-bottom:10px; - + border-bottom: 1px solid #f1f3f6; + padding-bottom: 10px; + .ant-col-4{ + color: black; + padding: 0px 10px; + text-indent: .7em; + // background-color: #f1f3f6; + border-left: 5px solid #f1f3f6; + margin-right: 30px; + } + .text{ + padding-right: 15px; + } .text-button{ - font-size: 12px; + // font-size: 12px; color: #657289; cursor: pointer } diff --git a/client/reducer/Login/login.js b/client/reducer/Login/login.js index e0f75896..4cec9038 100644 --- a/client/reducer/Login/login.js +++ b/client/reducer/Login/login.js @@ -25,7 +25,8 @@ export default (state = initialState, action) => { ...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 + userName: action.payload.data.data ? action.payload.data.data.username : null, + uid: action.payload.data.data ? action.payload.data.data._id : null }; } case LOGIN: { diff --git a/client/reducer/addInterface/addInterface.js b/client/reducer/addInterface/addInterface.js index a8e06a25..1f554aa1 100644 --- a/client/reducer/addInterface/addInterface.js +++ b/client/reducer/addInterface/addInterface.js @@ -7,7 +7,8 @@ import { GET_INTERFACE_REQ_PARAMS, GET_INTERFACE_RES_PARAMS, PUSH_INTERFACE_NAME, - PUSH_INTERFACE_METHOD + PUSH_INTERFACE_METHOD, + FETCH_INTERFACE_PROJECT } from '../../constants/action-types.js' const initialState = { @@ -23,7 +24,8 @@ const initialState = { } ], reqParams: '', - resParams: '' + resParams: '', + project: {} } export default (state = initialState, action) => { @@ -73,6 +75,11 @@ export default (state = initialState, action) => { ...state, method: action.payload } + case FETCH_INTERFACE_PROJECT: + return { + ...state, + project: action.payload.data.data + } default: return state } diff --git a/client/reducer/login/login.js b/client/reducer/login/login.js index e0f75896..4cec9038 100644 --- a/client/reducer/login/login.js +++ b/client/reducer/login/login.js @@ -25,7 +25,8 @@ export default (state = initialState, action) => { ...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 + userName: action.payload.data.data ? action.payload.data.data.username : null, + uid: action.payload.data.data ? action.payload.data.data._id : null }; } case LOGIN: { diff --git a/package.json b/package.json index ba8aa301..ef9ff376 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "babel-plugin-transform-decorators-legacy": "^1.3.4", "copy-webpack-plugin": "^4.0.1", "core-decorators": "^0.17.0", + "cross-request": "^1.0.1", "fs-extra": "^3.0.1", "jsoneditor": "^5.9.3", "jsonwebtoken": "^7.4.1", @@ -51,6 +52,7 @@ "sha1": "^1.1.1", "string-replace-webpack-plugin": "^0.1.3", "universal-cookie": "^2.0.8", + "url": "^0.11.0", "wangeditor": "^3.0.4", "ykit-config-antd": "^0.1.3", "ykit-config-react": "^0.4.4" diff --git a/server/controllers/project.js b/server/controllers/project.js index 84cf97e8..6e53388e 100644 --- a/server/controllers/project.js +++ b/server/controllers/project.js @@ -26,7 +26,7 @@ class projectController extends baseController { verifyDomain(domain){ if(!domain) return false; - if(/^[a-zA-Z0-9\-_\.]+[a-zA-Z]{2,6}$/.test(domain)){ + if(/^[a-zA-Z0-9\-_\.]+?\.[a-zA-Z0-9\-_\.]*?[a-zA-Z]{2,6}$/.test(domain)){ return true; } return false; @@ -332,7 +332,7 @@ class projectController extends baseController { let projectData = await this.Model.get(id); - 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格式有误') } diff --git a/server_dist/controllers/project.js b/server_dist/controllers/project.js index da77135f..a93f4d3e 100644 --- a/server_dist/controllers/project.js +++ b/server_dist/controllers/project.js @@ -86,7 +86,7 @@ var projectController = function (_baseController) { key: 'verifyDomain', value: function verifyDomain(domain) { if (!domain) return false; - if (/^[a-zA-Z0-9\-_\.]+[a-zA-Z]{2,6}$/.test(domain)) { + if (/^[a-zA-Z0-9\-_\.]+?\.[a-zA-Z0-9\-_\.]*?[a-zA-Z]{2,6}$/.test(domain)) { return true; } return false; @@ -778,7 +778,7 @@ var projectController = function (_baseController) { case 12: projectData = _context8.sent; - if (!(params.basepath = this.handleBasepath(params.basepath) === false)) { + if (!((params.basepath = this.handleBasepath(params.basepath)) === false)) { _context8.next = 15; break; }