Browse Source

杂七杂八的东西

tuonina 5 years ago
parent
commit
7a9a789b1b

+ 2 - 1
package.json

@@ -4,6 +4,7 @@
   "homepage": ".",
   "dependencies": {
     "@babel/core": "7.1.0",
+    "@material-ui/core": "^4.3.3",
     "@svgr/webpack": "2.4.1",
     "antd": "^3.10.0",
     "antd-theme-generator": "^1.1.3",
@@ -72,7 +73,7 @@
     "react-virtualized": "^9.21.1",
     "recharts": "^1.3.3",
     "redux": "^4.0.0",
-    "redux-alita": "^1.0.0",
+    "redux-alita": "^2.1.0",
     "redux-thunk": "^2.3.0",
     "resolve": "1.8.1",
     "sass-loader": "7.1.0",

+ 0 - 1
src/App.js

@@ -6,7 +6,6 @@ import HeaderCustom from './components/HeaderCustom';
 import { Layout, notification, Icon } from 'antd';
 import { ThemePicker } from './components/widget';
 import { connectAlita } from 'redux-alita';
-import './data/index'
 
 const { Content, Footer } = Layout;
 

+ 6 - 6
src/Page.js

@@ -1,5 +1,5 @@
 import React from 'react';
-import { HashRouter as Router, Route, Switch, Redirect } from 'react-router-dom';
+import { HashRouter as Router, Redirect, Route, Switch } from 'react-router-dom';
 import NotFound from './components/pages/NotFound';
 import Login from './components/pages/Login';
 import App from './App';
@@ -7,11 +7,11 @@ import App from './App';
 export default () => (
     <Router>
         <Switch>
-            <Route exact path="/" render={() => <Redirect to="/app/dashboard/index" push />} />
-            <Route path="/app" component={App} />
-            <Route path="/404" component={NotFound} />
-            <Route path="/login" component={Login} />
-            <Route component={NotFound} />
+            <Route exact path="/" render={() => <Redirect to="/app/dashboard/index" push/>}/>
+            <Route path="/app" component={(props) => <App {...props} />}/>
+            <Route path="/404" component={NotFound}/>
+            <Route path="/login" component={(props) => <Login {...props}/>}/>
+            <Route component={NotFound}/>
         </Switch>
     </Router>
 );

+ 8 - 2
src/components/pages/Login.jsx

@@ -5,6 +5,7 @@ import React from 'react';
 import { Form, Icon, Input, Button, Checkbox } from 'antd';
 import { PwaInstaller } from '../widget';
 import { connectAlita } from 'redux-alita';
+import QyWx from '../../const/qywx'
 
 const FormItem = Form.Item;
 
@@ -35,6 +36,11 @@ class Login extends React.Component {
     gitHub = () => {
         window.location.href = 'https://github.com/login/oauth/authorize?client_id=792cdcd244e98dcd2dee&redirect_uri=http://localhost:3006/&scope=user&state=reactAdmin';
     };
+
+    qyWx=()=>{
+        window.location.href = QyWx.oauth
+    };
+
     render() {
         const { getFieldDecorator } = this.props.form;
         return (
@@ -72,7 +78,7 @@ class Login extends React.Component {
                             </Button>
                             <p style={{display: 'flex', justifyContent: 'space-between'}}>
                                 <span >或 现在就去注册!</span>
-                                <span onClick={this.gitHub} ><Icon type="github" />(第三方登录)</span>
+                                <span onClick={this.qyWx} ><Icon type="github" />(企业微信)</span>
                             </p>
                         </FormItem>
                     </Form>
@@ -82,4 +88,4 @@ class Login extends React.Component {
     }
 }
 
-export default connectAlita(['auth'])(Form.create()(Login));
+export default connectAlita(['auth'])(Form.create()(Login));

+ 56 - 0
src/components/widget/TuonSelect.js

@@ -0,0 +1,56 @@
+import React from 'react';
+import { Select } from 'antd';
+import { any, array, func, object, string } from 'prop-types';
+
+
+export default class TuonSelect extends React.PureComponent {
+
+    static propTypes = {
+        data: array,
+        onChange: func,
+        style: object,
+        value: any,
+        placeholder: string,
+    };
+    static defaultProps = {
+        data: [],
+        style: {},
+    };
+
+    static getDerivedStateFromProps(nextProps) {
+        if ('value' in nextProps) {
+            return {
+                value:nextProps.value
+            };
+        }
+        return null;
+    }
+
+    constructor(props) {
+        super(props);
+        this.state = {
+            value: props.value,
+        };
+    }
+
+
+    triggerChange = value => {
+        if (!('value' in this.props)) {
+            this.setState({ value });
+        }
+        this.props.onChange && this.props.onChange(value);
+    };
+
+    render() {
+        let { data, style, placeholder } = this.props;
+        return (
+            <Select onChange={this.triggerChange}
+                    placeholder={placeholder}
+                    value={this.state.value}
+                    style={{ minWidth: 150, ...style }}>
+                {data.map(item => <Select.Option key={item.id} value={item.value}>{item.name}</Select.Option>)}
+            </Select>);
+    }
+
+
+}

+ 8 - 0
src/const/index.js

@@ -1,4 +1,7 @@
+import qywx from './qywx'
+
 const NODE_ENV = process.env.NODE_ENV;
+
 console.log('当前环境: ', NODE_ENV);
 
 /**
@@ -22,3 +25,8 @@ if (NODE_ENV === 'development') {
 export default CONF;
 
 
+
+export const qyWxOauthUrl=(state)=>{
+    return ``
+}
+

+ 8 - 0
src/const/qywx.json

@@ -0,0 +1,8 @@
+{
+  "appId": "1000002",
+  "redirect_url": "http://config.tonyandmoney.cn/portal#/app/wx",
+  "response_type": "code",
+  "scope": "snsapi_userinfo",
+  "path": "https://open.weixin.qq.com/connect/oauth2/authorize?",
+  "end": "#wechat_redirect"
+}

+ 38 - 0
src/data/ConstData.jsx

@@ -0,0 +1,38 @@
+/**
+ * @Classname ConstData
+ * @Description TODO
+ * @Date 2019/8/23 10:00
+ * @Created by Administrator
+ */
+
+import React from 'react';
+import { connectAlita } from 'redux-alita';
+import cApps from './application';
+import cLabels from './config_label';
+import cProfiles from './profile';
+
+class ConstData extends React.Component {
+
+    static propTypes = {};
+
+    static defaultProps = {};
+
+    constructor(props) {
+        super(props);
+        this.state = {};
+    }
+
+    componentDidMount() {
+        let constData = { cApps, cLabels, cProfiles };
+        this.props.setAlitaState({ stateName: 'fData', data: constData });
+    }
+
+    render() {
+        return this.props.children;
+    }
+
+
+}
+
+
+export default connectAlita([])(ConstData);

+ 2 - 2
src/data/application.json

@@ -1,6 +1,6 @@
 [
   {
-    "id": 1,"name": "通用","value": null
+    "id": 1,"name": "通用","value": "default"
   },
   {
     "id": 2,"name": "Sys","value": "sys"
@@ -13,4 +13,4 @@
   {
     "id": 4,"name": "Config","value": "config"
   }
-]
+]

+ 7 - 0
src/data/config_label.json

@@ -0,0 +1,7 @@
+[
+  {
+    "id": 3001,
+    "value": "master",
+    "name": "Master"
+  }
+]

+ 0 - 8
src/data/index.js

@@ -1,8 +0,0 @@
-import { setAlitaState } from 'redux-alita';
-
-import applications from './application';
-
-
-setAlitaState({ stateName: 'applications', data: applications })
-
-console.log('data init !');

+ 17 - 0
src/data/profile.json

@@ -0,0 +1,17 @@
+[
+  {
+    "id": 2001,
+    "name": "测试环境",
+    "value": "dev"
+  },
+  {
+    "id": 2002,
+    "name": "线上环境",
+    "value": "prod"
+  },
+  {
+    "id": 2003,
+    "name": "正式环境",
+    "value": "sit"
+  }
+]

+ 6 - 1
src/index.js

@@ -4,6 +4,7 @@ import * as serviceWorker from './serviceWorker';
 import Page from './Page';
 import * as apis from './axios';
 import nApis from './api';
+import ConstData from './data/ConstData';
 // import { AppContainer } from 'react-hot-loader';
 import { AlitaProvider, setConfig } from 'redux-alita';
 import './style/lib/animate.css';
@@ -50,7 +51,11 @@ setConfig({ ...apis, ...nApis });
 ReactDOM.render(
     // <AppContainer>
     <AlitaProvider>
-        <LocaleProvider locale={zh_CN}><Page/></LocaleProvider>
+        <LocaleProvider locale={zh_CN}>
+            <ConstData>
+                <Page />
+            </ConstData>
+        </LocaleProvider>
     </AlitaProvider>,
     // </AppContainer>
     document.getElementById('root'),

+ 40 - 21
src/pages/config/ConfigListPage.jsx

@@ -7,20 +7,23 @@
 
 import React from 'react';
 import * as PropTypes from 'prop-types';
-import { Button, List, Tag, Pagination, Select } from 'antd';
+import { Button, Form, Input, List, Pagination, Tag } from 'antd';
 import { connectAlita } from 'redux-alita';
 import AddConfigForm from './widget/AddConfigForm';
+import TuonSelect from '../../components/widget/TuonSelect';
+import ConfigSearchForm from './widget/ConfigSearchForm';
+
 
 class ConfigListPage extends React.Component {
 
     static propTypes = {
         configPage: PropTypes.object,
-        applications:PropTypes.array
+        fData: PropTypes.object,
     };
 
     static defaultProps = {
         configPage: { data: {}, isFetching: false },
-        applications:[]
+        fData: { data: {} },
     };
 
     constructor(props) {
@@ -28,19 +31,27 @@ class ConfigListPage extends React.Component {
         this.state = {
             addModalVisible: false,
             currentConfig: undefined,
+            keywords: undefined,
         };
         this.params = {
             page: 1,
             pageSize: 10,
+            application: undefined,
+            profile: undefined,
+            label: undefined,
+            'key': undefined,
         };
-
-
     }
 
 
     // eslint-disable-next-line react/sort-comp
     _queryConfigList(refresh = false) {
-        if (refresh) this.params.page = 1;
+        if (refresh) {
+            this.params = {
+                page: 1,
+                pageSize: 10,
+            };
+        }
         let params = { params: this.params };
         this.props.setAlitaState({ funcName: 'configQueryConfigList', params, stateName: 'configPage' })
             .then(resp => {
@@ -54,7 +65,6 @@ class ConfigListPage extends React.Component {
 
     componentDidMount() {
         this._queryConfigList(true);
-        console.log('applications: ',this.props.applications)
     }
 
     renderListItem(item) {
@@ -79,30 +89,39 @@ class ConfigListPage extends React.Component {
 
     render() {
 
-        let { data: configPage, isFetching } = this.props.configPage || {};
-        let listPage = { current: 1, pageSize: 15, total: 0 };
-        if (configPage) {
-            listPage = configPage;
+        let { data: listPage, isFetching } = this.props.configPage || {data:{current: 1, pageSize: 10, total: 0 }};
+
+        if (!listPage.total){
+            listPage.total =0;
+            listPage.current =1;
+            listPage.size =10;
         }
 
-        console.log('applications 2 : ',this.props.applications)
+        console.log('listPage->',listPage);
+
         return (<div className="component-container">
             <div className="headerLine">
-                <Button loading={isFetching} htmlType="button"
-                        onClick={() => this._queryConfigList(true)}
-                        icon="sync"
-                />
-                <Button htmlType="button"
-                        icon="plus"
-                        onClick={() => this.setState({ currentConfig: undefined, addModalVisible: true })}
+                <ConfigSearchForm onRefresh={this._queryConfigList.bind(this)}
+                                  onAdd={() => this.setState({ currentConfig: undefined, addModalVisible: true })}
+                                  onSearch={values=>{
+                                      this.params={...values};
+                                      this._queryConfigList(false);
+                                  }}
+                                  loading={isFetching}
+                                  fData={this.props.fData.data}
                 />
+
+
             </div>
             <List dataSource={listPage.records}
                   size="small" bordered
                   renderItem={this.renderListItem.bind(this)}
             />
 
-            <Pagination className="pagination-footer" pageSize={this.params.pageSize} current={listPage.current} total={listPage.total}/>
+            <Pagination className="pagination-footer"
+                        pageSize={listPage.size}
+                        current={listPage.current}
+                        total={listPage.total}/>
 
             <AddConfigForm onCancel={() => this.setState({ addModalVisible: false, currentConfig: undefined })}
                            onRefresh={() => this._queryConfigList(true)}
@@ -118,4 +137,4 @@ class ConfigListPage extends React.Component {
 }
 
 
-export default connectAlita(['configPage',"applications"])(ConfigListPage);
+export default connectAlita(['configPage', 'fData'])(ConfigListPage);

+ 11 - 22
src/pages/config/widget/AddConfigForm.jsx

@@ -11,6 +11,7 @@ import * as PropTypes from 'prop-types';
 import { connectAlita } from 'redux-alita';
 
 import { AutoComplete, Button, Form, Input, message, Modal, Select } from 'antd';
+import TuonSelect from '../../../components/widget/TuonSelect';
 
 class AddConfigForm extends React.Component {
 
@@ -19,6 +20,7 @@ class AddConfigForm extends React.Component {
         visible: PropTypes.bool,
         config: PropTypes.object,
         onRefresh: PropTypes.func,
+        fData:PropTypes.object
     };
 
     static defaultProps = {
@@ -31,6 +33,7 @@ class AddConfigForm extends React.Component {
             label: 'master',
             desc: undefined,
         },
+        fData:{data:{}}
     };
 
     static getDerivedStateFromProps(nextProps, prevState) {
@@ -115,8 +118,7 @@ class AddConfigForm extends React.Component {
 
         let config = this.state.config;
 
-        console.log('currentConfig: ', config);
-
+        let {cApps,cLabels,cProfiles} =this.props.fData.data;
         return (<Modal title={config.id ? '编辑配置项' : '新增配置项'}
                        onCancel={this._onModalCancel.bind(this)}
                        onOk={this._onModalOkPress.bind(this)}
@@ -131,29 +133,16 @@ class AddConfigForm extends React.Component {
         >
             <Form>
                 <Form.Item>
-                    {getFieldDecorator('application', { initialValue: config.application })(<Select
-                        placeholder="请选择应用系统"
-                    >
-                        <Select.Option key="default_application" value={undefined}>通用</Select.Option>
-                        <Select.Option key="sys_application" value="sys">Sys</Select.Option>
-                        <Select.Option key="gateway_application" value="gateway">Gateway</Select.Option>
-                        <Select.Option key="config_application" value="config">Config</Select.Option>
-                    </Select>)}
+                    {getFieldDecorator('application', { initialValue: config.application })(
+                        <TuonSelect  placeholder="请选择应用系统" data={cApps}/>)}
                 </Form.Item>
                 <Form.Item>
-                    {getFieldDecorator('profile', { initialValue: config.profile })(<Select placeholder="请选择环境">
-                        <Select.Option key="profile_sit" value="sit">正式环境</Select.Option>
-                        <Select.Option key="profile_dev" value="dev">测试环境</Select.Option>
-                        <Select.Option key="profile_prod" value="prod">线上测试环境</Select.Option>
-                    </Select>)}
+                    {getFieldDecorator('application', { initialValue: config.profile })(
+                        <TuonSelect  placeholder="请选择环境" data={cProfiles}/>)}
                 </Form.Item>
-
                 <Form.Item>
-                    {getFieldDecorator('label', { initialValue: config.label })(<Select
-                        placeholder="请选择分支"
-                    >
-                        <Select.Option key="label_master" value="master">Master</Select.Option>
-                    </Select>)}
+                    {getFieldDecorator('application', { initialValue: config.label })(
+                        <TuonSelect  placeholder="请选择分支" data={cLabels}/>)}
                 </Form.Item>
                 <Form.Item>
                     {getFieldDecorator('key',
@@ -190,4 +179,4 @@ class AddConfigForm extends React.Component {
 }
 
 
-export default connectAlita(['searchLabel', 'configAddConfig', 'configEditConfig'])(Form.create({ name: 'AddConfigForm' })(AddConfigForm));
+export default connectAlita(['searchLabel', 'configAddConfig', 'configEditConfig','fData'])(Form.create({ name: 'AddConfigForm' })(AddConfigForm));

+ 86 - 0
src/pages/config/widget/ConfigSearchForm.jsx

@@ -0,0 +1,86 @@
+/**
+ * @Classname ConfigSearchForm
+ * @Description TODO
+ * @Date 2019/8/23 14:12
+ * @Created by Administrator
+ * 配置表格上的搜索框
+ */
+
+import React from 'react';
+import * as PropTypes from 'prop-types';
+import { Button, Form, Input, Select } from 'antd';
+import TuonSelect from '../../../components/widget/TuonSelect';
+
+class ConfigSearchForm extends React.Component {
+
+    static propTypes = {
+        fData: PropTypes.object,
+        onRefresh: PropTypes.func,
+        onAdd: PropTypes.func,
+        loading: PropTypes.bool,
+        onSearch: PropTypes.func,
+    };
+
+    static defaultProps = {};
+
+    constructor(props) {
+        super(props);
+        this.state = {};
+        this.params = {};
+    }
+
+    componentDidMount() {
+
+    }
+
+    onRefresh = (refresh) => {
+        refresh && this.props.form.resetFields();
+        this.props.onRefresh(refresh);
+    };
+
+    onSearch() {
+        let values = this.props.form.getFieldsValue();
+        this.props.onSearch && this.props.onSearch(values);
+    }
+
+    render() {
+        let { getFieldDecorator } = this.props.form;
+        let { cApps, cProfiles } = this.props.fData;
+        return (<Form layout="inline">
+            <Form.Item>
+                <Button loading={this.props.loading}
+                        htmlType="button"
+                        icon="sync"
+                        onClick={() => this.onRefresh(true)}
+                />
+            </Form.Item>
+            <Form.Item>
+                <Button htmlType="button"
+                        icon="plus"
+                        onClick={this.props.onAdd}
+                />
+            </Form.Item>
+            <Form.Item>
+                {getFieldDecorator('application')(<TuonSelect placeholder="请选择应用系统" data={cApps}/>)}
+            </Form.Item>
+
+            <Form.Item>
+                {getFieldDecorator('profile')(<TuonSelect placeholder="请选择应用环境" data={cProfiles}/>)}
+            </Form.Item>
+            <Form.Item>
+                {getFieldDecorator('key')(<Input placeholder="请输入配置项"/>)}
+            </Form.Item>
+            <Form.Item>
+                <Button type="primary" htmlType="button" icon="search"
+                        loading={this.props.loading}
+                        onClick={this.onSearch.bind(this)}
+                />
+
+            </Form.Item>
+        </Form>);
+    }
+
+}
+
+
+export default Form.create()(ConfigSearchForm);

+ 8 - 0
src/style/custom/component.less

@@ -32,3 +32,11 @@
   }
 
 }
+
+.tuon-select{
+  min-width: 150px;
+}
+
+.tuon-min-input{
+  width: 150px;
+}

+ 243 - 24
yarn.lock

@@ -646,19 +646,13 @@
   dependencies:
     regenerator-runtime "^0.12.0"
 
-"@babel/runtime@^7.1.2":
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5":
   version "7.5.5"
   resolved "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
   integrity sha1-dPulbTXvvspEQJHHhQzNSU/S8TI=
   dependencies:
     regenerator-runtime "^0.13.2"
 
-"@babel/runtime@^7.3.1":
-  version "7.4.0"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.0.tgz#d523416573f19aa12784639e631257c7fc58c0aa"
-  dependencies:
-    regenerator-runtime "^0.13.2"
-
 "@babel/runtime@^7.4.3":
   version "7.4.5"
   resolved "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12"
@@ -699,6 +693,83 @@
   version "1.4.0"
   resolved "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
 
+"@emotion/hash@^0.7.1":
+  version "0.7.2"
+  resolved "https://registry.npm.taobao.org/@emotion/hash/download/@emotion/hash-0.7.2.tgz#53211e564604beb9befa7a4400ebf8147473eeef"
+  integrity sha1-UyEeVkYEvrm++npEAOv4FHRz7u8=
+
+"@material-ui/core@^4.3.3":
+  version "4.3.3"
+  resolved "https://registry.npm.taobao.org/@material-ui/core/download/@material-ui/core-4.3.3.tgz#38a02331da7916c18e65c3dc56f3f6a67ba60c07"
+  integrity sha1-OKAjMdp5FsGOZcPcVvP2pnumDAc=
+  dependencies:
+    "@babel/runtime" "^7.4.4"
+    "@material-ui/styles" "^4.3.3"
+    "@material-ui/system" "^4.3.3"
+    "@material-ui/types" "^4.1.1"
+    "@material-ui/utils" "^4.3.0"
+    "@types/react-transition-group" "^4.2.0"
+    clsx "^1.0.2"
+    convert-css-length "^2.0.1"
+    deepmerge "^4.0.0"
+    hoist-non-react-statics "^3.2.1"
+    is-plain-object "^3.0.0"
+    normalize-scroll-left "^0.2.0"
+    popper.js "^1.14.1"
+    prop-types "^15.7.2"
+    react-transition-group "^4.0.0"
+    warning "^4.0.1"
+
+"@material-ui/styles@^4.3.3":
+  version "4.3.3"
+  resolved "https://registry.npm.taobao.org/@material-ui/styles/download/@material-ui/styles-4.3.3.tgz#39867dd6f3779a8326075e097d72208d3c5b4977"
+  integrity sha1-OYZ91vN3moMmB14JfXIgjTxbSXc=
+  dependencies:
+    "@babel/runtime" "^7.4.4"
+    "@emotion/hash" "^0.7.1"
+    "@material-ui/types" "^4.1.1"
+    "@material-ui/utils" "^4.1.0"
+    clsx "^1.0.2"
+    csstype "^2.5.2"
+    deepmerge "^4.0.0"
+    hoist-non-react-statics "^3.2.1"
+    jss "10.0.0-alpha.24"
+    jss-plugin-camel-case "10.0.0-alpha.24"
+    jss-plugin-default-unit "10.0.0-alpha.24"
+    jss-plugin-global "10.0.0-alpha.24"
+    jss-plugin-nested "10.0.0-alpha.24"
+    jss-plugin-props-sort "10.0.0-alpha.24"
+    jss-plugin-rule-value-function "10.0.0-alpha.24"
+    jss-plugin-vendor-prefixer "10.0.0-alpha.24"
+    prop-types "^15.7.2"
+    warning "^4.0.1"
+
+"@material-ui/system@^4.3.3":
+  version "4.3.3"
+  resolved "https://registry.npm.taobao.org/@material-ui/system/download/@material-ui/system-4.3.3.tgz#8534fe76adbd3938a8dea833e69d84a7a143ecff"
+  integrity sha1-hTT+dq29OTio3qgz5p2Ep6FD7P8=
+  dependencies:
+    "@babel/runtime" "^7.4.4"
+    deepmerge "^4.0.0"
+    prop-types "^15.7.2"
+    warning "^4.0.1"
+
+"@material-ui/types@^4.1.1":
+  version "4.1.1"
+  resolved "https://registry.npm.taobao.org/@material-ui/types/download/@material-ui/types-4.1.1.tgz#b65e002d926089970a3271213a3ad7a21b17f02b"
+  integrity sha1-tl4ALZJgiZcKMnEhOjrXohsX8Cs=
+  dependencies:
+    "@types/react" "*"
+
+"@material-ui/utils@^4.1.0", "@material-ui/utils@^4.3.0":
+  version "4.3.0"
+  resolved "https://registry.npm.taobao.org/@material-ui/utils/download/@material-ui/utils-4.3.0.tgz#ea7f09815c792e80f270ef8b916517c3f9caba13"
+  integrity sha1-6n8JgVx5LoDycO+LkWUXw/nKuhM=
+  dependencies:
+    "@babel/runtime" "^7.4.4"
+    prop-types "^15.7.2"
+    react-is "^16.8.6"
+
 "@svgr/core@^2.4.1":
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/@svgr/core/-/core-2.4.1.tgz#03a407c28c4a1d84305ae95021e8eabfda8fa731"
@@ -732,6 +803,13 @@
   dependencies:
     "@types/react" "*"
 
+"@types/react-transition-group@^4.2.0":
+  version "4.2.2"
+  resolved "https://registry.npm.taobao.org/@types/react-transition-group/download/@types/react-transition-group-4.2.2.tgz#8c851c4598a23a3a34173069fb4c5c9e41c02e3f"
+  integrity sha1-jIUcRZiiOjo0FzBp+0xcnkHALj8=
+  dependencies:
+    "@types/react" "*"
+
 "@types/react@*":
   version "16.8.10"
   resolved "https://registry.npmjs.org/@types/react/-/react-16.8.10.tgz#1ccb6fde17f71a62ef055382ec68bdc379d4d8d9"
@@ -2035,7 +2113,7 @@ clone@^2.1.1:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
 
-clsx@^1.0.1:
+clsx@^1.0.1, clsx@^1.0.2:
   version "1.0.4"
   resolved "https://registry.npm.taobao.org/clsx/download/clsx-1.0.4.tgz#0c0171f6d5cb2fe83848463c15fcc26b4df8c2ec"
   integrity sha1-DAFx9tXLL+g4SEY8FfzCa034wuw=
@@ -2208,6 +2286,11 @@ content-type@~1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
 
+convert-css-length@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npm.taobao.org/convert-css-length/download/convert-css-length-2.0.1.tgz#90a76bde5bfd24d72881a5b45d02249b2c1d257c"
+  integrity sha1-kKdr3lv9JNcogaW0XQIkmywdJXw=
+
 convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
@@ -2456,6 +2539,14 @@ css-url-regex@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec"
 
+css-vendor@^2.0.5:
+  version "2.0.6"
+  resolved "https://registry.npm.taobao.org/css-vendor/download/css-vendor-2.0.6.tgz#a205f73d7562e8728c86ef6ce5ee7c7e5eefd71b"
+  integrity sha1-ogX3PXVi6HKMhu9s5e58fl7v1xs=
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+    is-in-browser "^1.0.2"
+
 css-what@2.1:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
@@ -2554,6 +2645,11 @@ csstype@^2.2.0:
   version "2.6.3"
   resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.3.tgz#b701e5968245bf9b08d54ac83d00b624e622a9fa"
 
+csstype@^2.5.2, csstype@^2.6.5:
+  version "2.6.6"
+  resolved "https://registry.npm.taobao.org/csstype/download/csstype-2.6.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsstype%2Fdownload%2Fcsstype-2.6.6.tgz#c34f8226a94bbb10c32cc0d714afdf942291fc41"
+  integrity sha1-w0+CJqlLuxDDLMDXFK/flCKR/EE=
+
 cyclist@~0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
@@ -2687,6 +2783,11 @@ deep-is@~0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
 
+deepmerge@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npm.taobao.org/deepmerge/download/deepmerge-4.0.0.tgz#3e3110ca29205f120d7cb064960a39c3d2087c09"
+  integrity sha1-PjEQyikgXxINfLBklgo5w9IIfAk=
+
 default-gateway@^2.6.0:
   version "2.7.2"
   resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f"
@@ -2858,7 +2959,7 @@ dom-converter@~0.2:
   dependencies:
     utila "~0.4"
 
-"dom-helpers@^2.4.0 || ^3.0.0":
+"dom-helpers@^2.4.0 || ^3.0.0", dom-helpers@^3.4.0:
   version "3.4.0"
   resolved "https://registry.npm.taobao.org/dom-helpers/download/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8"
   integrity sha1-6bNpcA+Vn2Ls3lprq95LzNkWmvg=
@@ -4137,7 +4238,7 @@ hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0:
   version "2.5.5"
   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
 
-hoist-non-react-statics@^3.3.0:
+hoist-non-react-statics@^3.2.1, hoist-non-react-statics@^3.3.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b"
   dependencies:
@@ -4295,6 +4396,11 @@ https-browserify@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
 
+hyphenate-style-name@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npm.taobao.org/hyphenate-style-name/download/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48"
+  integrity sha1-CXu3+guPGpzwvVxzTPlYmZgam0g=
+
 iconv-lite@0.4.19:
   version "0.4.19"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
@@ -4630,6 +4736,11 @@ is-glob@^4.0.0:
   dependencies:
     is-extglob "^2.1.1"
 
+is-in-browser@^1.0.2, is-in-browser@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npm.taobao.org/is-in-browser/download/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835"
+  integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=
+
 is-number@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@ -4672,6 +4783,13 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
   dependencies:
     isobject "^3.0.1"
 
+is-plain-object@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928"
+  integrity sha1-R7/F2htdUNZBEIBsGZNZSC51qSg=
+  dependencies:
+    isobject "^4.0.0"
+
 is-posix-bracket@^0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
@@ -4766,6 +4884,11 @@ isobject@^3.0.0, isobject@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
 
+isobject@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npm.taobao.org/isobject/download/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0"
+  integrity sha1-PxyRVec7GSAiqAgZus0DQ3EWl7A=
+
 isomorphic-fetch@^2.1.1:
   version "2.2.1"
   resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
@@ -5301,6 +5424,75 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
+jss-plugin-camel-case@10.0.0-alpha.24:
+  version "10.0.0-alpha.24"
+  resolved "https://registry.npm.taobao.org/jss-plugin-camel-case/download/jss-plugin-camel-case-10.0.0-alpha.24.tgz#579a48989d2628ee8baaa006449b1b82d32ee27e"
+  integrity sha1-V5pImJ0mKO6LqqAGRJsbgtMu4n4=
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    hyphenate-style-name "^1.0.3"
+    jss "10.0.0-alpha.24"
+
+jss-plugin-default-unit@10.0.0-alpha.24:
+  version "10.0.0-alpha.24"
+  resolved "https://registry.npm.taobao.org/jss-plugin-default-unit/download/jss-plugin-default-unit-10.0.0-alpha.24.tgz#3e6e24e8ec7aaa950c8975f1645ea861b8aa338e"
+  integrity sha1-Pm4k6Ox6qpUMiXXxZF6oYbiqM44=
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    jss "10.0.0-alpha.24"
+
+jss-plugin-global@10.0.0-alpha.24:
+  version "10.0.0-alpha.24"
+  resolved "https://registry.npm.taobao.org/jss-plugin-global/download/jss-plugin-global-10.0.0-alpha.24.tgz#a53e2028d0cb073661e8213f2e622fef9ef4b1fa"
+  integrity sha1-pT4gKNDLBzZh6CE/LmIv7570sfo=
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    jss "10.0.0-alpha.24"
+
+jss-plugin-nested@10.0.0-alpha.24:
+  version "10.0.0-alpha.24"
+  resolved "https://registry.npm.taobao.org/jss-plugin-nested/download/jss-plugin-nested-10.0.0-alpha.24.tgz#f1b4a0bd1050e29d627c9bc2dc0f424c35f0aa44"
+  integrity sha1-8bSgvRBQ4p1ifJvC3A9CTDXwqkQ=
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    jss "10.0.0-alpha.24"
+    tiny-warning "^1.0.2"
+
+jss-plugin-props-sort@10.0.0-alpha.24:
+  version "10.0.0-alpha.24"
+  resolved "https://registry.npm.taobao.org/jss-plugin-props-sort/download/jss-plugin-props-sort-10.0.0-alpha.24.tgz#e309e286004b6e059c373efaa308b8742e22ec16"
+  integrity sha1-4wnihgBLbgWcNz76owi4dC4i7BY=
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    jss "10.0.0-alpha.24"
+
+jss-plugin-rule-value-function@10.0.0-alpha.24:
+  version "10.0.0-alpha.24"
+  resolved "https://registry.npm.taobao.org/jss-plugin-rule-value-function/download/jss-plugin-rule-value-function-10.0.0-alpha.24.tgz#85bfd5f994647cb4bf2237d18232421ea362665c"
+  integrity sha1-hb/V+ZRkfLS/IjfRgjJCHqNiZlw=
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    jss "10.0.0-alpha.24"
+
+jss-plugin-vendor-prefixer@10.0.0-alpha.24:
+  version "10.0.0-alpha.24"
+  resolved "https://registry.npm.taobao.org/jss-plugin-vendor-prefixer/download/jss-plugin-vendor-prefixer-10.0.0-alpha.24.tgz#c4c2c28667d3c7c0d9a01ca1f7a2f74367d1ceef"
+  integrity sha1-xMLChmfTx8DZoByh96L3Q2fRzu8=
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    css-vendor "^2.0.5"
+    jss "10.0.0-alpha.24"
+
+jss@10.0.0-alpha.24:
+  version "10.0.0-alpha.24"
+  resolved "https://registry.npm.taobao.org/jss/download/jss-10.0.0-alpha.24.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjss%2Fdownload%2Fjss-10.0.0-alpha.24.tgz#f8e2044b6b2f034db05a685d99c599095baf8b61"
+  integrity sha1-+OIES2svA02wWmhdmcWZCVuvi2E=
+  dependencies:
+    "@babel/runtime" "^7.3.1"
+    csstype "^2.6.5"
+    is-in-browser "^1.1.3"
+    tiny-warning "^1.0.2"
+
 jsx-ast-utils@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f"
@@ -6074,6 +6266,11 @@ normalize-range@^0.1.2:
   version "0.1.2"
   resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
 
+normalize-scroll-left@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npm.taobao.org/normalize-scroll-left/download/normalize-scroll-left-0.2.0.tgz#9445d74275f303cc661e113329aefa492f58114c"
+  integrity sha1-lEXXQnXzA8xmHhEzKa76SS9YEUw=
+
 normalize-url@^3.0.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
@@ -6545,6 +6742,11 @@ pnp-webpack-plugin@1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.1.0.tgz#947a96d1db94bb5a1fc014d83b581e428699ac8c"
 
+popper.js@^1.14.1:
+  version "1.15.0"
+  resolved "https://registry.npm.taobao.org/popper.js/download/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2"
+  integrity sha1-VWC5m7rXZH6fqkdca4BWYh9aT/I=
+
 portfinder@^1.0.9:
   version "1.0.17"
   resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a"
@@ -7898,7 +8100,7 @@ react-infinite-scroller@^1.2.4:
   dependencies:
     prop-types "^15.5.8"
 
-react-is@^16.7.0, react-is@^16.8.2:
+react-is@^16.7.0:
   version "16.8.4"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.4.tgz#90f336a68c3a29a096a3d648ab80e87ec61482a2"
 
@@ -7942,22 +8144,23 @@ react-redux@^5.0.7:
     loose-envify "^1.1.0"
     prop-types "^15.6.0"
 
-react-redux@^6.0.1:
-  version "6.0.1"
-  resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-6.0.1.tgz#0d423e2c1cb10ada87293d47e7de7c329623ba4d"
+react-redux@^7.0.3:
+  version "7.0.3"
+  resolved "https://registry.npm.taobao.org/react-redux/download/react-redux-7.0.3.tgz#983c5a6de81cb1e696bd1c090ba826545f9170f1"
   dependencies:
-    "@babel/runtime" "^7.3.1"
+    "@babel/runtime" "^7.4.3"
     hoist-non-react-statics "^3.3.0"
     invariant "^2.2.4"
     loose-envify "^1.4.0"
     prop-types "^15.7.2"
-    react-is "^16.8.2"
+    react-is "^16.8.6"
 
-react-redux@^7.0.3:
-  version "7.0.3"
-  resolved "https://registry.npm.taobao.org/react-redux/download/react-redux-7.0.3.tgz#983c5a6de81cb1e696bd1c090ba826545f9170f1"
+react-redux@^7.1.0:
+  version "7.1.0"
+  resolved "https://registry.npm.taobao.org/react-redux/download/react-redux-7.1.0.tgz#72af7cf490a74acdc516ea9c1dd80e25af9ea0b2"
+  integrity sha1-cq989JCnSs3FFuqcHdgOJa+eoLI=
   dependencies:
-    "@babel/runtime" "^7.4.3"
+    "@babel/runtime" "^7.4.5"
     hoist-non-react-statics "^3.3.0"
     invariant "^2.2.4"
     loose-envify "^1.4.0"
@@ -8032,6 +8235,16 @@ react-transition-group@^2.5.0:
     prop-types "^15.6.2"
     react-lifecycles-compat "^3.0.4"
 
+react-transition-group@^4.0.0:
+  version "4.2.2"
+  resolved "https://registry.npm.taobao.org/react-transition-group/download/react-transition-group-4.2.2.tgz#8b5252410180c27fd7eebf50b185256b41799b16"
+  integrity sha1-i1JSQQGAwn/X7r9QsYUla0F5mxY=
+  dependencies:
+    "@babel/runtime" "^7.4.5"
+    dom-helpers "^3.4.0"
+    loose-envify "^1.4.0"
+    prop-types "^15.6.2"
+
 react-virtualized@^9.21.1:
   version "9.21.1"
   resolved "https://registry.npm.taobao.org/react-virtualized/download/react-virtualized-9.21.1.tgz#4dbbf8f0a1420e2de3abf28fbb77120815277b3a"
@@ -8182,11 +8395,12 @@ reduce-function-call@^1.0.1:
   dependencies:
     balanced-match "^0.4.2"
 
-redux-alita@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/redux-alita/-/redux-alita-1.0.0.tgz#fc6f419dbedffaa03f6b95e39e96eb6bf9331841"
+redux-alita@^2.1.0:
+  version "2.1.3"
+  resolved "https://registry.npm.taobao.org/redux-alita/download/redux-alita-2.1.3.tgz#ae3242b223ea9eca6cfbbba7ca1266310e3dc96a"
+  integrity sha1-rjJCsiPqnsps+7unyhJmMQ49yWo=
   dependencies:
-    react-redux "^6.0.1"
+    react-redux "^7.1.0"
     redux "^4.0.1"
     redux-thunk "^2.3.0"
 
@@ -9279,6 +9493,11 @@ tiny-invariant@^1.0.4:
   version "1.0.4"
   resolved "https://registry.npm.taobao.org/tiny-invariant/download/tiny-invariant-1.0.4.tgz#346b5415fd93cb696b0c4e8a96697ff590f92463"
 
+tiny-warning@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.npm.taobao.org/tiny-warning/download/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
+  integrity sha1-lKMNtFPfTGQ9D9VmBg1gqHXYR1Q=
+
 tinycolor2@^1.4.1:
   version "1.4.1"
   resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"