App.jsx 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  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: "graphql-service",
  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. switchMenuLevel = (menuName, value) => {
  52. this.setState({
  53. [menuName]: value,
  54. });
  55. };
  56. showModal = () => {
  57. this.setState({
  58. visible: true,
  59. });
  60. };
  61. hideModal = () => {
  62. this.setState({
  63. visible: false,
  64. });
  65. };
  66. changeLocale = (e) => {
  67. e.stopPropagation();
  68. let language = sessionStorage.getItem("language");
  69. // console.log('app language',language);
  70. let local = language === "中文" ? zhCN : undefined;
  71. // console.log('app local',local);
  72. let changeLanguage = language === "中文" ? "English" : "中文";
  73. // console.log('app changeLanguage',changeLanguage);
  74. let nowLanguage = language === "中文" ? 'zh' : 'en';
  75. // console.log('app nowLanguage',nowLanguage);
  76. sessionStorage.setItem("language", changeLanguage);
  77. this.props.changeLanguage(nowLanguage);
  78. this.setState({
  79. language: changeLanguage,
  80. locale: local
  81. });
  82. if (!local) {
  83. moment.locale('en');
  84. } else {
  85. moment.locale('zh-cn');
  86. }
  87. };
  88. render() {
  89. const {locale, language, visible} = this.state;
  90. return (
  91. <Router>
  92. <Layout style={{minHeight: '100vh'}}>
  93. <Header className="header" style={{position: 'fixed', zIndex: 1, width: '100%'}}>
  94. <Link to="/" onClick={() => this.switchMenuLevel('menuLevel1', "graphql-service")}>
  95. <div className="logo-wrapper">
  96. <div className='logo'/>
  97. </div>
  98. </Link>
  99. <Menu
  100. theme="dark"
  101. mode="horizontal"
  102. // defaultSelectedKeys={['graphql-service']}
  103. style={{lineHeight: '64px'}}
  104. onClick={(e) => this.switchMenu('menuLevel1', e)}
  105. >
  106. <Menu.Item key="graphql-service">
  107. <Link to="/graphql-service/trial-case/index"><FormattedMessage id="Graphql Service"/></Link>
  108. </Menu.Item>
  109. <Menu.Item key="wechat-service">
  110. <Link to="/wechat-service/trial-case/index"><FormattedMessage
  111. id="Wechat Service"/></Link>
  112. </Menu.Item>
  113. <Menu.Item key="quantization-service">
  114. <Link to="/quant-service/"><FormattedMessage id="Quantization Service"/></Link>
  115. </Menu.Item>
  116. </Menu>
  117. <Link to="/login">
  118. <Button className='login-button' type='primary' onClick={()=>this.switchMenuLevel('menuLevel1','user')} >Login</Button>
  119. </Link>
  120. <div className="change-locale">
  121. <Button size="small" onClick={(e) => this.changeLocale(e)}>{language}</Button>
  122. </div>
  123. </Header>
  124. {(() => {
  125. switch (this.state.menuLevel1) {
  126. case 'graphql-service':
  127. return (
  128. <Sider
  129. width={200}
  130. style={{background: '#fff', marginTop: '64px', zIndex: '0'}}
  131. collapsible
  132. collapsed={this.state.collapsed}
  133. onCollapse={this.onCollapse}
  134. >
  135. <GraphqlSidebar inlineCollapsed={this.state.inlineCollapsed}
  136. sideBar={this.state.sideBar} switchMenu={this.switchMenu}
  137. userID={this.state.userID} showModal={this.showModal}/>
  138. </Sider>
  139. );
  140. case 'wechat-service':
  141. return (
  142. <Sider
  143. width={200}
  144. style={{background: '#fff', marginTop: '64px', zIndex: '0'}}
  145. collapsible
  146. collapsed={this.state.collapsed}
  147. onCollapse={this.onCollapse}
  148. >
  149. <Menu
  150. theme="dark"
  151. mode="inline"
  152. inlineCollapsed={this.state.inlineCollapsed}
  153. defaultSelectedKeys={['wechat']}
  154. defaultOpenKeys={['trial-case']}
  155. // openKeys={['cloud-function']}
  156. onClick={(e) => this.switchMenu('sideBar', e)}
  157. selectedKeys={[this.state.sideBar]}
  158. style={{
  159. borderRight: 0,
  160. overflow: 'auto',
  161. height: '100vh',
  162. left: '0',
  163. width: '200px',
  164. position: 'fixed'
  165. }}
  166. >
  167. <SubMenu key="trial-case"
  168. title={<span><Icon type="appstore" theme="twoTone"/><span>Trial Case</span></span>}>
  169. <Menu.Item key="wechat"><Link
  170. to="/wechat-service/trial-case/wechat case">wechat
  171. case</Link></Menu.Item>
  172. </SubMenu>
  173. <SubMenu key="my-create"
  174. title={<span><Icon type="user"
  175. theme="outlined"/><span>My Create</span></span>}>
  176. <Menu.Item key="my wechat"><Link
  177. to="/wechat-service/my-create/my wechat">my
  178. wechat</Link></Menu.Item>
  179. </SubMenu>
  180. </Menu>
  181. </Sider>
  182. );
  183. case 'quantization-service':
  184. return (
  185. <Sider
  186. width={200}
  187. style={{background: '#fff', marginTop: '64px', zIndex: '0'}}
  188. collapsible
  189. collapsed={this.state.collapsed}
  190. onCollapse={this.onCollapse}
  191. >
  192. <Menu
  193. theme="dark"
  194. mode="inline"
  195. inlineCollapsed={this.state.inlineCollapsed}
  196. defaultSelectedKeys={['quant-service']}
  197. defaultOpenKeys={['trial-case']}
  198. // openKeys={['cloud-function']}
  199. onClick={(e) => this.switchMenu('sideBar', e)}
  200. selectedKeys={[this.state.sideBar]}
  201. style={{
  202. borderRight: 0,
  203. overflow: 'auto',
  204. height: '100vh',
  205. left: '0',
  206. width: '200px',
  207. position: 'fixed'
  208. }}
  209. >
  210. <SubMenu key="trial-case"
  211. title={<span><Icon type="appstore" theme="twoTone"/><span>Trial Case</span></span>}>
  212. <Menu.Item key="quant-service"><Link to="/quant-service/">quant
  213. case</Link></Menu.Item>
  214. </SubMenu>
  215. <SubMenu key="my-create"
  216. title={<span><Icon type="user"
  217. theme="outlined"/><span>My Create</span></span>}>
  218. <Menu.Item key="my quant"><Link to="/quant-service/">my
  219. quant</Link></Menu.Item>
  220. </SubMenu>
  221. </Menu>
  222. </Sider>
  223. );
  224. case 'user':
  225. return (
  226. <Sider
  227. width={200}
  228. style={{background: '#fff', marginTop: '64px', zIndex: '0'}}
  229. collapsible
  230. collapsed={this.state.collapsed}
  231. onCollapse={this.onCollapse}
  232. >
  233. <Menu
  234. theme="dark"
  235. defaultSelectedKeys={['cloud-settings']}
  236. onClick={(e) => this.switchMenu('sideBar', e)}
  237. selectedKeys={[this.state.sideBar]}
  238. style={{
  239. borderRight: 0,
  240. overflow: 'auto',
  241. height: '100vh',
  242. left: '0',
  243. width: '200px',
  244. position: 'fixed'
  245. }}
  246. >
  247. <Menu.Item key="account">
  248. <Icon type="setting" theme="twoTone" />
  249. <span>Account center</span>
  250. <Link to="/login/"/>
  251. </Menu.Item>
  252. <Menu.Item key="cloud-settings">
  253. <Icon type="cloud" theme="twoTone" />
  254. <span>Cloud settings</span>
  255. <Link to="/login/"/>
  256. </Menu.Item>
  257. </Menu>
  258. </Sider>
  259. );
  260. default:
  261. return (
  262. <Sider
  263. width={200}
  264. style={{background: '#fff', marginTop: '64px', zIndex: '0'}}
  265. collapsible
  266. collapsed={this.state.collapsed}
  267. onCollapse={this.onCollapse}
  268. >
  269. <GraphqlSidebar inlineCollapsed={this.state.inlineCollapsed}
  270. sideBar={this.state.sideBar} switchMenu={this.switchMenu}
  271. userID={this.state.userID} showModal={this.showModal}/>
  272. </Sider>
  273. );
  274. }
  275. })()}
  276. <Create visible={visible} hideModal={this.hideModal}/>
  277. <LocaleProvider locale={locale}>
  278. <Layout style={{marginTop: '64px', zIndex: '0'}}
  279. key={locale ? locale.locale : 'en'/* Have to refresh for production environment */}>
  280. <Switch>
  281. <Route path="/" exact component={TrialCase}/>
  282. <Route path="/graphql-service/:sidebar/:case" component={TrialCase}/>
  283. <Route path="/wechat-service/:sidebar/:case" component={WechatService}/>
  284. <Route path="/quant-service/" component={QuantService}/>
  285. <Route path="/login" component={Login}/>
  286. <Redirect path="*" to="/"/>
  287. </Switch>
  288. </Layout>
  289. </LocaleProvider>
  290. </Layout>
  291. </Router>
  292. );
  293. }
  294. }
  295. export default App;
  296. class GraphqlSidebar extends Component {
  297. constructor(props) {
  298. super(props);
  299. this.state = {
  300. // getID_url: 'http://123.206.193.98:8999/getuserid',
  301. userID: getCookie('user_id'),
  302. show: false
  303. }
  304. }
  305. // componentWillMount() {
  306. // let _this = this;
  307. // axios.get(this.state.getID_url)
  308. // .then((res) => {
  309. // if (res.data !== '') {
  310. // _this.setState({
  311. // userID: res.data,
  312. // show: true
  313. // })
  314. // } else {
  315. // _this.setState({
  316. // show: true
  317. // })
  318. // }
  319. // })
  320. // .catch((err) => {
  321. // console.log(err);
  322. // });
  323. // }
  324. render() {
  325. return (
  326. <Query query={gql(SHOW_ALL_SCHEMA)} variables={{user_id: this.state.userID}}>
  327. {
  328. ({loading, error, data}) => {
  329. // console.log('user schema data',data);
  330. if (loading) return <Spin style={{marginLeft: 3}}/>;
  331. if (error) return 'error!';
  332. return (
  333. <Menu
  334. theme="dark"
  335. mode="inline"
  336. inlineCollapsed={this.props.inlineCollapsed}
  337. defaultSelectedKeys={['e-commerce']}
  338. defaultOpenKeys={['trial-case', 'my-create']}
  339. // openKeys={['cloud-function']}
  340. onClick={(e) => this.props.switchMenu('sideBar', e)}
  341. selectedKeys={[this.props.sideBar]}
  342. style={{
  343. borderRight: 0,
  344. overflow: 'auto',
  345. height: '100vh',
  346. left: '0',
  347. width: '200px',
  348. position: 'fixed'
  349. }}
  350. >
  351. <SubMenu key="trial-case" title={<span><Icon type="appstore" theme="twoTone"/><span>Trial Case</span></span>}>
  352. {
  353. data.caseSchema.map((schema) =>
  354. <Menu.Item key={schema.schemaName}>
  355. <Link to={{
  356. pathname: `/graphql-service/trial-case/${schema.schemaName}`,
  357. state:{
  358. schemaName:schema.schemaName,
  359. schemaID:schema.id
  360. }
  361. }}>{schema.schemaName}</Link>
  362. </Menu.Item>)
  363. }
  364. </SubMenu>
  365. <Menu.Item key="create-graphql" onClick={this.props.showModal}>
  366. <Icon type="edit" theme="twoTone"/>
  367. <span>Create</span>
  368. <Icon type="plus" style={{
  369. position: 'absolute',
  370. top: '35%',
  371. right: '6px',
  372. color: 'white'
  373. }}/>
  374. </Menu.Item>
  375. <SubMenu key="my-create" title={<span><Icon type="user" theme="outlined"/><span>My Create</span></span>}>
  376. {
  377. data.userSchema.map((schema) =>
  378. <Menu.Item key={schema.schemaName}>
  379. <Link to={{
  380. pathname: `/graphql-service/my-create/${schema.schemaName}`,
  381. state:{
  382. schemaName:schema.schemaName,
  383. schemaID:schema.id
  384. }
  385. }}>{schema.schemaName}</Link>
  386. </Menu.Item>)
  387. }
  388. </SubMenu>
  389. </Menu>
  390. )
  391. }
  392. }
  393. </Query>
  394. )
  395. }
  396. }
  397. // this.state.show ?
  398. // :''