App.jsx 20 KB

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