App.jsx 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. import React, {Component} from 'react';
  2. import {Layout, Menu, Input, Modal, Button, Spin, Breadcrumb, Icon, Radio, LocaleProvider} from 'antd';
  3. import {BrowserRouter as Router, Route, Link, Switch, Redirect} from "react-router-dom";
  4. import {Mutation, Query} from "react-apollo";
  5. import gql from "graphql-tag";
  6. import moment from 'moment';
  7. import 'moment/locale/zh-cn';
  8. import {FormattedMessage} from 'react-intl';
  9. import zhCN from 'antd/lib/locale-provider/zh_CN';
  10. import WechatService from "../wechatService/WechatService";
  11. import QuantService from "../quantService/QuantService";
  12. import TrialCase from "../trialCase/TrialCase";
  13. import Login from "../login/Login";
  14. import Table from '../common/schema/Table';
  15. import '../common/graphql/index.css';
  16. import './index.css'
  17. import Create from "../common/schema/Create";
  18. import {SHOW_ALL_SCHEMA} from "../gql";
  19. import axios from 'axios';
  20. import {getCookie} from "../cookie";
  21. import Schema from "../common/schema/Schema";
  22. axios.defaults.withCredentials = true;
  23. const {SubMenu} = Menu;
  24. const {Header, Sider} = Layout;
  25. moment.locale('en');
  26. class App extends Component {
  27. constructor(props) {
  28. super(props);
  29. sessionStorage.setItem("language", "English");
  30. this.state = {
  31. menuLevel1: "trail",
  32. sideBar: "e-commerce",
  33. collapsed: false,
  34. inlineCollapsed: false,
  35. locale: undefined,
  36. language: sessionStorage.getItem("language"),
  37. visible: false,
  38. userID: ''
  39. };
  40. }
  41. onCollapse = (collapsed) => {
  42. // console.log(collapsed);
  43. this.setState({collapsed});
  44. };
  45. switchMenu = (menuName, e) => {
  46. // console.log('menuName', menuName, 'e', e);
  47. this.setState({
  48. [menuName]: e.key,
  49. });
  50. };
  51. showModal = () => {
  52. this.setState({
  53. visible: true,
  54. });
  55. };
  56. hideModal = () => {
  57. this.setState({
  58. visible: false,
  59. });
  60. };
  61. changeLocale = (e) => {
  62. e.stopPropagation();
  63. let language = sessionStorage.getItem("language");
  64. // console.log('app language',language);
  65. let local = language === "中文" ? zhCN : undefined;
  66. // console.log('app local',local);
  67. let changeLanguage = language === "中文" ? "English" : "中文";
  68. // console.log('app changeLanguage',changeLanguage);
  69. let nowLanguage = language === "中文" ? 'zh' : 'en';
  70. // console.log('app nowLanguage',nowLanguage);
  71. sessionStorage.setItem("language", changeLanguage);
  72. this.props.changeLanguage(nowLanguage);
  73. this.setState({
  74. language: changeLanguage,
  75. locale: local
  76. });
  77. if (!local) {
  78. moment.locale('en');
  79. } else {
  80. moment.locale('zh-cn');
  81. }
  82. };
  83. render() {
  84. const {locale, language, visible} = this.state;
  85. return (
  86. <Router>
  87. <Layout style={{minHeight: '100vh'}}>
  88. <Header className="header" style={{position: 'fixed', zIndex: 1, width: '100%'}}>
  89. <Link to="/">
  90. <div className="logo-wrapper">
  91. <div className='logo'/>
  92. </div>
  93. </Link>
  94. <Menu
  95. theme="dark"
  96. mode="horizontal"
  97. defaultSelectedKeys={['graphql-service']}
  98. style={{lineHeight: '64px'}}
  99. onClick={(e) => this.switchMenu('menuLevel1', e)}
  100. >
  101. <Menu.Item key="graphql-service">
  102. <Link to="/"><FormattedMessage id="Graphql Service"/></Link>
  103. </Menu.Item>
  104. <Menu.Item key="wechat-service">
  105. <Link to="/wechat-service/trial-case/wechat case"><FormattedMessage
  106. id="Wechat Service"/></Link>
  107. </Menu.Item>
  108. <Menu.Item key="quantization-service">
  109. <Link to="/quant-service/"><FormattedMessage id="Quantization Service"/></Link>
  110. </Menu.Item>
  111. </Menu>
  112. <Link to="/login"><Button className='login-button' type='primary'>Login</Button></Link>
  113. <div className="change-locale">
  114. <Button size="small" onClick={(e) => this.changeLocale(e)}>{language}</Button>
  115. </div>
  116. </Header>
  117. {(() => {
  118. switch (this.state.menuLevel1) {
  119. case 'graphql-service':
  120. return (
  121. <Sider
  122. width={200}
  123. style={{background: '#fff', marginTop: '64px', zIndex: '0'}}
  124. collapsible
  125. collapsed={this.state.collapsed}
  126. onCollapse={this.onCollapse}
  127. >
  128. <GraphqlSidebar inlineCollapsed={this.state.inlineCollapsed}
  129. sideBar={this.state.sideBar} switchMenu={this.switchMenu}
  130. userID={this.state.userID} showModal={this.showModal}/>
  131. </Sider>
  132. );
  133. case 'wechat-service':
  134. return (
  135. <Sider
  136. width={200}
  137. style={{background: '#fff', marginTop: '64px', zIndex: '0'}}
  138. collapsible
  139. collapsed={this.state.collapsed}
  140. onCollapse={this.onCollapse}
  141. >
  142. <Menu
  143. theme="dark"
  144. mode="inline"
  145. inlineCollapsed={this.state.inlineCollapsed}
  146. defaultSelectedKeys={['wechat']}
  147. defaultOpenKeys={['trial-case']}
  148. // openKeys={['cloud-function']}
  149. onClick={(e) => this.switchMenu('sideBar', e)}
  150. selectedKeys={[this.state.sideBar]}
  151. style={{
  152. borderRight: 0,
  153. overflow: 'auto',
  154. height: '100vh',
  155. left: '0',
  156. width: '200px',
  157. position: 'fixed'
  158. }}
  159. >
  160. <SubMenu key="trial-case"
  161. title={<span><Icon type="appstore" theme="twoTone"/><span>Trial Case</span></span>}>
  162. <Menu.Item key="wechat"><Link
  163. to="/wechat-service/trial-case/wechat case">wechat
  164. case</Link></Menu.Item>
  165. </SubMenu>
  166. <SubMenu key="my-create"
  167. title={<span><Icon type="user"
  168. theme="outlined"/><span>My Create</span></span>}>
  169. <Menu.Item key="my wechat"><Link
  170. to="/wechat-service/my-create/my wechat">my
  171. wechat</Link></Menu.Item>
  172. </SubMenu>
  173. </Menu>
  174. </Sider>
  175. );
  176. case 'quantization-service':
  177. return (
  178. <Sider
  179. width={200}
  180. style={{background: '#fff', marginTop: '64px', zIndex: '0'}}
  181. collapsible
  182. collapsed={this.state.collapsed}
  183. onCollapse={this.onCollapse}
  184. >
  185. <Menu
  186. theme="dark"
  187. mode="inline"
  188. inlineCollapsed={this.state.inlineCollapsed}
  189. defaultSelectedKeys={['quant-service']}
  190. defaultOpenKeys={['trial-case']}
  191. // openKeys={['cloud-function']}
  192. onClick={(e) => this.switchMenu('sideBar', e)}
  193. selectedKeys={[this.state.sideBar]}
  194. style={{
  195. borderRight: 0,
  196. overflow: 'auto',
  197. height: '100vh',
  198. left: '0',
  199. width: '200px',
  200. position: 'fixed'
  201. }}
  202. >
  203. <SubMenu key="trial-case"
  204. title={<span><Icon type="appstore" theme="twoTone"/><span>Trial Case</span></span>}>
  205. <Menu.Item key="quant-service"><Link to="/quant-service/">quant
  206. case</Link></Menu.Item>
  207. </SubMenu>
  208. <SubMenu key="my-create"
  209. title={<span><Icon type="user"
  210. theme="outlined"/><span>My Create</span></span>}>
  211. <Menu.Item key="my quant"><Link to="/quant-service/">my
  212. quant</Link></Menu.Item>
  213. </SubMenu>
  214. </Menu>
  215. </Sider>
  216. );
  217. default:
  218. return (
  219. <Sider
  220. width={200}
  221. style={{background: '#fff', marginTop: '64px', zIndex: '0'}}
  222. collapsible
  223. collapsed={this.state.collapsed}
  224. onCollapse={this.onCollapse}
  225. >
  226. <GraphqlSidebar inlineCollapsed={this.state.inlineCollapsed}
  227. sideBar={this.state.sideBar} switchMenu={this.switchMenu}
  228. userID={this.state.userID} showModal={this.showModal}/>
  229. </Sider>
  230. );
  231. }
  232. })()}
  233. <Create visible={visible} hideModal={this.hideModal}/>
  234. <LocaleProvider locale={locale}>
  235. <Layout style={{marginTop: '64px', zIndex: '0'}}
  236. key={locale ? locale.locale : 'en'/* Have to refresh for production environment */}>
  237. <Switch>
  238. <Route path="/" exact component={TrialCase}/>
  239. <Route path="/graphql-service/:sidebar/:case" component={TrialCase}/>
  240. <Route path="/wechat-service/:sidebar/:case" component={WechatService}/>
  241. <Route path="/quant-service/" component={QuantService}/>
  242. <Route path="/login" component={Login}/>
  243. <Redirect path="*" to="/"/>
  244. </Switch>
  245. </Layout>
  246. </LocaleProvider>
  247. </Layout>
  248. </Router>
  249. );
  250. }
  251. }
  252. export default App;
  253. class GraphqlSidebar extends Component {
  254. constructor(props) {
  255. super(props);
  256. this.state = {
  257. // getID_url: 'http://123.206.193.98:8999/getuserid',
  258. userID: getCookie('user_id'),
  259. show: false
  260. }
  261. }
  262. // componentWillMount() {
  263. // let _this = this;
  264. // axios.get(this.state.getID_url)
  265. // .then((res) => {
  266. // if (res.data !== '') {
  267. // _this.setState({
  268. // userID: res.data,
  269. // show: true
  270. // })
  271. // } else {
  272. // _this.setState({
  273. // show: true
  274. // })
  275. // }
  276. // })
  277. // .catch((err) => {
  278. // console.log(err);
  279. // });
  280. // }
  281. render() {
  282. console.log('userID',this.state.userID);
  283. return (
  284. <Query query={gql(SHOW_ALL_SCHEMA)} variables={{user_id: this.state.userID}}>
  285. {
  286. ({loading, error, data}) => {
  287. console.log('user schema data',data);
  288. if (loading) return <Spin style={{marginLeft: 3}}/>;
  289. if (error) return 'error!';
  290. return (
  291. <Menu
  292. theme="dark"
  293. mode="inline"
  294. inlineCollapsed={this.props.inlineCollapsed}
  295. defaultSelectedKeys={['e-commerce']}
  296. defaultOpenKeys={['trial-case', 'my-create']}
  297. // openKeys={['cloud-function']}
  298. onClick={(e) => this.props.switchMenu('sideBar', e)}
  299. selectedKeys={[this.props.sideBar]}
  300. style={{
  301. borderRight: 0,
  302. overflow: 'auto',
  303. height: '100vh',
  304. left: '0',
  305. width: '200px',
  306. position: 'fixed'
  307. }}
  308. >
  309. <SubMenu key="trial-case" title={<span><Icon type="appstore" theme="twoTone"/><span>Trial Case</span></span>}>
  310. {
  311. data.caseSchema.map((schema) =>
  312. <Menu.Item key={schema.schemaName}>
  313. <Link to={{
  314. pathname: `/graphql-service/trial-case/${schema.schemaName}`,
  315. state:{
  316. schemaName:schema.schemaName,
  317. schemaID:schema.id
  318. }
  319. }}>{schema.schemaName}</Link>
  320. </Menu.Item>)
  321. }
  322. </SubMenu>
  323. <Menu.Item key="create-graphql" onClick={this.props.showModal}>
  324. <Icon type="edit" theme="twoTone"/>
  325. <span>Create</span>
  326. <Icon type="plus" style={{
  327. position: 'absolute',
  328. top: '35%',
  329. right: '6px',
  330. color: 'white'
  331. }}/>
  332. </Menu.Item>
  333. <SubMenu key="my-create" title={<span><Icon type="user" theme="outlined"/><span>My Create</span></span>}>
  334. {
  335. data.userSchema.map((schema) =>
  336. <Menu.Item key={schema.schemaName}>
  337. <Link to={{
  338. pathname: `/graphql-service/my-create/${schema.schemaName}`,
  339. state:{
  340. schemaName:schema.schemaName,
  341. schemaID:schema.id
  342. }
  343. }}>{schema.schemaName}</Link>
  344. </Menu.Item>)
  345. }
  346. </SubMenu>
  347. </Menu>
  348. )
  349. }
  350. }
  351. </Query>
  352. )
  353. }
  354. }
  355. // this.state.show ?
  356. // :''