Merge branch 'dev' of gitlab.corp.qunar.com:mfe/yapi into dev

This commit is contained in:
zwjamnsss 2017-07-25 15:30:44 +08:00
commit 8ed6a757a0
20 changed files with 159 additions and 130 deletions

2
.gitignore vendored
View File

@ -36,5 +36,5 @@ Thumbs.db
node_modules/ node_modules/
runtime/init.lock runtime/init.lock
runtime/log runtime/log
prd/ ./prd/
dev/ dev/

View File

@ -4,7 +4,7 @@ import PropTypes from 'prop-types'
import axios from 'axios' import axios from 'axios'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import { autobind } from 'core-decorators' import { autobind } from 'core-decorators'
import { Button, Tabs } from 'antd' import { Button, Tabs, message } from 'antd'
import ReqMethod from './ReqMethod/ReqMethod.js' import ReqMethod from './ReqMethod/ReqMethod.js'
import ReqHeader from './ReqHeader/ReqHeader.js' import ReqHeader from './ReqHeader/ReqHeader.js'
import ReqParams from './ReqParams/ReqParams.js' import ReqParams from './ReqParams/ReqParams.js'
@ -20,6 +20,10 @@ import {
pushInterfaceName pushInterfaceName
} from '../../actions/addInterface.js' } from '../../actions/addInterface.js'
const success = () => {
message.success('保存成功!')
}
@connect( @connect(
state => { state => {
return { return {
@ -60,7 +64,8 @@ class AddInterface extends Component {
constructor (props) { constructor (props) {
super(props) super(props)
this.state = { this.state = {
isLoading: '' isLoading: '',
isSave: false
} }
} }
@ -109,15 +114,6 @@ class AddInterface extends Component {
props.addReqHeader(req_headers) props.addReqHeader(req_headers)
} }
editState2 () {
const props = this.props
props.pushInputValue(props.url)
// props.pushInterfaceName(title)
// props.getReqParams(req_params_other)
props.getResParams(props.resParams)
// props.addReqHeader(req_headers)
}
initInterfaceData (interfaceId) { initInterfaceData (interfaceId) {
const params = { id: interfaceId } const params = { id: interfaceId }
@ -147,6 +143,12 @@ class AddInterface extends Component {
location.href = `${origin}${pathname}#/interface` location.href = `${origin}${pathname}#/interface`
} }
changeState (ifTrue) {
this.setState({
isSave: ifTrue
})
}
@autobind @autobind
saveForms () { saveForms () {
let postURL = undefined let postURL = undefined
@ -175,10 +177,10 @@ class AddInterface extends Component {
this.setLoading(true) this.setLoading(true)
axios.post(postURL, params) axios.post(postURL, params)
.then(data => { .then(() => {
console.log(data)
this.setLoading() this.setLoading()
this.editState2() success()
this.changeState(true)
// this.routerPage() // this.routerPage()
}) })
.catch(e => { .catch(e => {
@ -188,7 +190,7 @@ class AddInterface extends Component {
render () { render () {
const TabPane = Tabs.TabPane const TabPane = Tabs.TabPane
const isLoading = this.state.isLoading const { isLoading, isSave } = this.state
return ( return (
<section className="add-interface-box"> <section className="add-interface-box">
@ -200,7 +202,7 @@ class AddInterface extends Component {
<ReqHeader /> <ReqHeader />
<ReqParams data={this.props} /> <ReqParams data={this.props} />
<ResParams /> <ResParams />
<Result /> <Result isSave={isSave} />
</TabPane> </TabPane>
<TabPane tab="Mock" key="2">mock</TabPane> <TabPane tab="Mock" key="2">mock</TabPane>
<TabPane tab="测试" key="3"> <TabPane tab="测试" key="3">

View File

@ -38,6 +38,7 @@ class ResParams extends Component {
const reg = /(<p>)|(<\/p>)|&nbsp;|(<br>)|\s+|<div>|<\/div>/g const reg = /(<p>)|(<\/p>)|&nbsp;|(<br>)|\s+|<div>|<\/div>/g
editor.customConfig.menus = [] editor.customConfig.menus = []
editor.customConfig.onchange = html => { editor.customConfig.onchange = html => {
console.log(html)
html = html.match(/{.*}/g)[0] html = html.match(/{.*}/g)[0]
html = html.replace(reg, '') html = html.replace(reg, '')
console.log(html) console.log(html)

View File

@ -16,7 +16,8 @@ import PropTypes from 'prop-types'
class Result extends Component { class Result extends Component {
static propTypes = { static propTypes = {
resParams: PropTypes.string, resParams: PropTypes.string,
reqParams: PropTypes.string reqParams: PropTypes.string,
isSave: PropTypes.bool
} }
constructor(props) { constructor(props) {
@ -24,16 +25,15 @@ class Result extends Component {
} }
render () { render () {
console.log(1)
let TabPane = Tabs.TabPane let TabPane = Tabs.TabPane
let resParams = '' let resParams = ''
let json = '' let json = ''
if(this.props.resParams){ if(this.props.resParams){
console.log(this.props.resParams)
resParams = JSON.parse(this.props.resParams) resParams = JSON.parse(this.props.resParams)
json = JSON.stringify(Mock.mock(resParams), null, 2) json = JSON.stringify(Mock.mock(resParams), null, 2)
} }
return ( return (
<div className="result"> <div className="result">
<strong className="res-h3">返回示例 :</strong> <strong className="res-h3">返回示例 :</strong>

View File

@ -56,7 +56,7 @@ class Login extends Component {
componentDidMount() { componentDidMount() {
window.QSSO.attach('qsso-login','/user/login_by_token') window.QSSO.attach('qsso-login','/user/login_by_token')
} }
render() { render() {
const { getFieldDecorator } = this.props.form; const { getFieldDecorator } = this.props.form;
@ -86,6 +86,9 @@ class Login extends Component {
<FormItem style={formItemStyle}> <FormItem style={formItemStyle}>
<Button style={changeHeight} type="primary" htmlType="submit" className="login-form-button">登录</Button> <Button style={changeHeight} type="primary" htmlType="submit" className="login-form-button">登录</Button>
</FormItem> </FormItem>
<div className="qsso-breakline">
<span className="qsso-breakword"></span>
</div>
<Button style={changeHeight} id="qsso-login" type="primary" className="login-form-button" size="large" ghost>QSSO登录</Button> <Button style={changeHeight} id="qsso-login" type="primary" className="login-form-button" size="large" ghost>QSSO登录</Button>
</Form> </Form>

View File

@ -11,6 +11,21 @@
width: 100%; width: 100%;
} }
.ant-form-item{ .ant-form-item {
margin-bottom: .1rem; margin-bottom: .1rem;
} }
.qsso-breakline {
position: relative;
text-align: center;
margin: .24rem auto;
height: 1px;
background-color: #bbb;
.qsso-breakword {
display: inline-block;
transform: translateY(-50%);
background-color: #f7f7f7;
padding: 0 .08rem;
color: #999;
}
}

View File

@ -65,7 +65,7 @@ export default class GroupList extends Component {
if(this.props.groupList[i].group_name === groupName){ if(this.props.groupList[i].group_name === groupName){
currGroup = this.props.groupList[i]; currGroup = this.props.groupList[i];
}else{ }else{
this.props.history.push(`${currGroup.group_name}`); this.props.history.replace(`${currGroup.group_name}`);
} }
} }
} }
@ -156,7 +156,7 @@ export default class GroupList extends Component {
const groupId = e.key; const groupId = e.key;
const currGroup = this.props.groupList.find((group) => { return +group._id === +groupId }); const currGroup = this.props.groupList.find((group) => { return +group._id === +groupId });
this.props.setCurrGroup(currGroup); this.props.setCurrGroup(currGroup);
this.props.history.push(`${currGroup.group_name}`); this.props.history.replace(`${currGroup.group_name}`);
} }
@autobind @autobind

View File

@ -16,11 +16,14 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@qnpm/ykit-config-qunar": "^0.8.2", "@qnpm/ykit-config-qunar": "^0.8.2",
"assets-webpack-plugin": "^3.5.1",
"axios": "^0.16.2", "axios": "^0.16.2",
"babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-plugin-transform-decorators-legacy": "^1.3.4",
"copy-webpack-plugin": "^4.0.1",
"core-decorators": "^0.17.0", "core-decorators": "^0.17.0",
"cross-request": "^1.0.1", "cross-request": "^1.0.1",
"fs-extra": "^3.0.1", "fs-extra": "^3.0.1",
"jsoneditor": "^5.9.3",
"jsonwebtoken": "^7.4.1", "jsonwebtoken": "^7.4.1",
"koa": "^2.0.0", "koa": "^2.0.0",
"koa-bodyparser": "^3.2.0", "koa-bodyparser": "^3.2.0",
@ -34,16 +37,19 @@
"mock": "^0.1.1", "mock": "^0.1.1",
"mockjs": "^1.0.1-beta3", "mockjs": "^1.0.1-beta3",
"moment": "^2.18.1", "moment": "^2.18.1",
"monaco-editor": "^0.9.0",
"mongoose": "4.10.8", "mongoose": "4.10.8",
"mongoose-auto-increment": "^5.0.1", "mongoose-auto-increment": "^5.0.1",
"node-sass-china": "^4.5.0", "node-sass-china": "^4.5.0",
"nodemailer": "^4.0.1", "nodemailer": "^4.0.1",
"prop-types": "^15.5.10", "prop-types": "^15.5.10",
"react-monaco-editor": "^0.8.1",
"redux": "^3.7.1", "redux": "^3.7.1",
"redux-promise": "^0.5.3", "redux-promise": "^0.5.3",
"redux-thunk": "^2.2.0", "redux-thunk": "^2.2.0",
"request": "^2.81.0", "request": "^2.81.0",
"sha1": "^1.1.1", "sha1": "^1.1.1",
"string-replace-webpack-plugin": "^0.1.3",
"universal-cookie": "^2.0.8", "universal-cookie": "^2.0.8",
"wangeditor": "^3.0.4", "wangeditor": "^3.0.4",
"ykit-config-antd": "^0.1.3", "ykit-config-antd": "^0.1.3",
@ -71,6 +77,7 @@
"eslint-plugin-react": "^7.1.0", "eslint-plugin-react": "^7.1.0",
"express": "^4.15.3", "express": "^4.15.3",
"extract-text-webpack-plugin": "^1.0.1", "extract-text-webpack-plugin": "^1.0.1",
"fast-sass-loader": "^1.2.5",
"fs-extra": "^3.0.1", "fs-extra": "^3.0.1",
"ghooks": "^2.0.0", "ghooks": "^2.0.0",
"gulp": "^3.9.1", "gulp": "^3.9.1",

View File

@ -1,6 +1,6 @@
{ {
"port": "3000", "port": "3000",
"webhost": "127.0.0.1", "webhost": "yapi.local.qunar.com",
"adminAccount": "admin@admin.com", "adminAccount": "admin@admin.com",
"db": { "db": {
"servername": "10.86.40.194", "servername": "10.86.40.194",

36
static/dev.html Normal file
View File

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<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>
<script src="http://127.0.0.1:4000/yapi/prd/index@dev.js"></script>
<!--
<button id="qsso-login">qsso登录</button>
<script src="https://qsso.corp.qunar.com/lib/qsso-auth.js"></script>
<script>
QSSO.attach('qsso-login','/user/login_by_token');
var xhr = new XMLHttpRequest();
xhr.open('GET', '/user/status')
xhr.onload = function(e){
if(this.status == 200){
alert(this.responseText)
}
}
xhr.send()
</script>
<html>
-->
</body>
</html>

View File

@ -4,33 +4,19 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>my yApi</title> <title>my yApi</title>
<link rel="stylesheet" href="http://127.0.0.1:4000/yapi/prd/index@dev.css"> <script>
document.write('<script src="prd/assets.js?v=' + Math.random() + '"><\/script>');
</script>
<script>
document.write('<link rel="stylesheet" href="/prd/' + window.WEBPACK_ASSETS['index.js'].css + '" />');
</script>
<script src="https://qsso.corp.qunar.com/lib/qsso-auth.js"></script> <script src="https://qsso.corp.qunar.com/lib/qsso-auth.js"></script>
</head> </head>
<body> <body>
<div id="yapi" style="height: 100%;"></div> <div id="yapi" style="height: 100%;"></div>
<script src="http://127.0.0.1:4000/yapi/prd/index@dev.js"></script>
<!--
<button id="qsso-login">qsso登录</button>
<script src="https://qsso.corp.qunar.com/lib/qsso-auth.js"></script>
<script> <script>
QSSO.attach('qsso-login','/user/login_by_token'); document.write('<script src="/prd/' + window.WEBPACK_ASSETS['index.js'].js + '"><\/script>');
var xhr = new XMLHttpRequest();
xhr.open('GET', '/user/status')
xhr.onload = function(e){
if(this.status == 200){
alert(this.responseText)
}
}
xhr.send()
</script> </script>
<html>
-->
</body> </body>
</html> </html>

1
static/prd/assets.js Normal file
View File

@ -0,0 +1 @@
window.WEBPACK_ASSETS = {"index.js":{"js":"index.js","css":"index.css"}}

21
static/prd/index.css Normal file

File diff suppressed because one or more lines are too long

1
static/prd/index.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
4c1b3161122796d85b75b3c0f041cd26

View File

@ -1 +0,0 @@
064c5c9b316a6ad40669

View File

@ -1 +0,0 @@
064c5c9b316a6ad40669

View File

@ -1,3 +0,0 @@
index.css#064c5c9b316a6ad40669
index.js#064c5c9b316a6ad40669
chunk.json#4c1b3161122796d85b75b3c0f041cd26

View File

@ -1,61 +0,0 @@
const webpack = require('webpack')
const path = require('path')
const nodeExternals = require('webpack-node-externals')
const ExtractTextPlugin = require("extract-text-webpack-plugin")
module.exports = {
// context: 如果不通过path.resolve 配置入口访问路径 watch: true失效
context: path.resolve('./client'),
entry: {
index: './index.js',
},
output: {
// filename: 编译的文件名 仅用于命名每个文件
// [name]: 多入口形式 入口文件名替换这里的name
// [chunkhash: num]: 入口文件的hash值 用于修改后清空缓存
// filename: '[name].[chunkhash:3].js',
filename: './[name].js',
// 包存放的目录
path: path.resolve('./build'),
},
devServer:{
contentBase:'./'
},
// target: 'node',
// externals: [nodeExternals()],
module: {
noParse: /\.css$/,
rules: [
{
test: /\.scss$/,
use: [
{
loader: "style-loader"
},
{
loader: "css-loader"
},
{
loader: "sass-loader"
}
]
},
{
test: /\.(jsx|js)?$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['es2015', 'react']
}
}
}
]
},
watch: true
}

55
ykit.js
View File

@ -1,30 +1,53 @@
var path = require('path'); var path = require('path');
var AssetsPlugin = require('assets-webpack-plugin')
var assetsPluginInstance = new AssetsPlugin({
filename: 'static/prd/assets.js',
processOutput: function (assets) {
return 'window.WEBPACK_ASSETS = ' + JSON.stringify(assets);
}
})
module.exports = { module.exports = {
plugins: [{ plugins: [{
name: 'qunar',
options: {
eslint: true,
configFile: path.resolve(__dirname, "./client/.eslintrc.js")
}
}, {
name: 'antd', name: 'antd',
options: { options: {
modifyQuery: function(defaultQuery) { // 可查看和编辑 defaultQuery modifyQuery: function (defaultQuery) { // 可查看和编辑 defaultQuery
defaultQuery.plugins.push('transform-decorators-legacy'); defaultQuery.plugins.push('transform-decorators-legacy');
return defaultQuery; return defaultQuery;
} }
} }
}], }],
// devtool: 'cheap-source-map', // devtool: 'cheap-source-map',
config: { config: function (ykit) {
exports: [ return {
'./index.js' exports: [
], './index.js'
modifyWebpackConfig: function(baseConfig) { ],
baseConfig.devtool = 'cheap-module-eval-source-map' modifyWebpackConfig: function (baseConfig) {
baseConfig.context = path.resolve(__dirname, "client");
return baseConfig; baseConfig.devtool = 'cheap-module-eval-source-map'
baseConfig.context = path.resolve(__dirname, "client");
baseConfig.output.prd.path = 'static/prd';
baseConfig.output.prd.publicPath = '';
baseConfig.output.prd.filename = '[name][ext]'
baseConfig.plugins.push(assetsPluginInstance)
baseConfig.module.loaders.push({
test: /\.(sass|scss)$/,
loader: ykit.ExtractTextPlugin.extract(
require.resolve('css-loader')
+ '?sourceMap!'
+ require.resolve('fast-sass-loader') + '?sourceMap'
)
})
baseConfig.module.preLoaders.push({
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: "eslint-loader"
});
return baseConfig;
}
} }
}, },
server: { server: {