AdminLeft.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import React, { Component } from 'react';
  2. import { Link } from 'react-router-dom';
  3. import { Layout, Menu, Icon, Dropdown, Avatar, Breadcrumb, LocaleProvider } from 'antd';
  4. import zhCN from 'antd/lib/locale-provider/zh_CN';
  5. import '../style/adminLeft.less';
  6. import { User } from '../stores/user';
  7. import { asyncForm, asyncDelConfirm, asyncSMessage } from '../services/AsyncTools';
  8. const { SubMenu } = Menu;
  9. const { Header, Sider } = Layout;
  10. const passwordItemList = [
  11. {
  12. key: 'password',
  13. name: '新密码',
  14. type: 'input',
  15. placeholder: '请输入新密码',
  16. require: true,
  17. },
  18. ];
  19. export default class extends Component {
  20. constructor(props) {
  21. super(props);
  22. const { config, moduleMap } = props;
  23. const state = { routes: [] };
  24. if (config.group) {
  25. state.routes.push({
  26. name: config.group.name,
  27. path: moduleMap[config.module.key].groupMap[config.group.key].path,
  28. });
  29. }
  30. if (config.module && config.group) {
  31. if (moduleMap[config.module.key].groupMap[config.group.key].subList.length > 1 || config.showKey) {
  32. state.routes.push({
  33. name: config.title,
  34. });
  35. }
  36. }
  37. this.state = state;
  38. console.log(this.props);
  39. }
  40. render() {
  41. const { config } = this.props;
  42. return (
  43. <div className="admin" style={{ height: window.document.documentElement.clientHeight }}>
  44. {config.module ? this.renderLayoutView() : this.renderContentView(true)}
  45. </div>
  46. );
  47. }
  48. getUserconfigMenu() {
  49. return (
  50. <Menu
  51. style={{ width: '100px', textAlign: 'center' }}
  52. onClick={item => {
  53. switch (item.key) {
  54. case 'password':
  55. asyncForm('修改密码', passwordItemList, {}, data => {
  56. return User.editPassword(data).then(() => {
  57. asyncSMessage('密码修改成功!');
  58. });
  59. });
  60. break;
  61. case 'logout':
  62. asyncDelConfirm('退出', '是否退出当前帐号?', () => {
  63. User.logout().then(() => {
  64. asyncSMessage('帐号已退出!');
  65. });
  66. });
  67. break;
  68. default:
  69. break;
  70. }
  71. }}
  72. >
  73. <Menu.Item key="password">
  74. <Icon type="edit" />
  75. 修改密码
  76. </Menu.Item>
  77. <Menu.Divider />
  78. <Menu.Item key="logout">
  79. <Icon type="logout" />
  80. 退出登录
  81. </Menu.Item>
  82. </Menu>
  83. );
  84. }
  85. getOtherLink() {
  86. const { project } = this.props;
  87. return (
  88. <Menu
  89. style={{ width: '100px', textAlign: 'center' }}
  90. onClick={item => {
  91. toLink(item.key);
  92. }}
  93. >
  94. {project.otherLink.map(link => {
  95. return (
  96. <Menu.Item key={link.path}>
  97. <Icon type="link" />
  98. {link.title}
  99. </Menu.Item>
  100. );
  101. })}
  102. </Menu>
  103. );
  104. }
  105. renderLayoutView() {
  106. const { moduleMap, config, user, project } = this.props;
  107. const { collapsed, logo, name, username, openMenu } = user;
  108. return (
  109. <LocaleProvider locale={zhCN}>
  110. <Layout style={{ height: '100%' }}>
  111. {config.group && (
  112. <Sider className="left-slider" collapsed={collapsed}>
  113. <Link to="/">
  114. <div id="logo">
  115. <img src={logo} />
  116. <h1>{name}</h1>
  117. </div>
  118. </Link>
  119. <Menu
  120. mode="inline"
  121. theme="dark"
  122. key={`${collapsed}`}
  123. defaultSelectedKeys={[config.showKey || config.key, config.group.key]}
  124. defaultOpenKeys={collapsed ? [] : openMenu[config.module.key] || [config.group.key]}
  125. onClick={e => linkTo(e.item.props.path)}
  126. onOpenChange={keys => !collapsed && User.openMenu(config.module.key, keys)}
  127. >
  128. {moduleMap[config.module.key].groupList.map(key => {
  129. const group = moduleMap[config.module.key].groupMap[key];
  130. const hasSub = group.subList.length > 1;
  131. const view = hasSub ? (
  132. <SubMenu
  133. key={group.key}
  134. title={
  135. <span>
  136. <Icon type={group.icon} />
  137. <span>{group.name}</span>
  138. </span>
  139. }
  140. >
  141. {group.subList.map(k => {
  142. const sub = group.subMap[k];
  143. return (
  144. <Menu.Item key={sub.key} path={sub.path}>
  145. <Icon type={sub.icon} />
  146. <span>{sub.name || sub.title}</span>
  147. </Menu.Item>
  148. );
  149. })}
  150. </SubMenu>
  151. ) : (<Menu.Item key={group.key} path={group.path}>
  152. <Icon type={group.icon} />
  153. <span>{group.name}</span>
  154. </Menu.Item>);
  155. return view;
  156. })}
  157. </Menu>
  158. </Sider>
  159. )}
  160. <Layout id="right-layout">
  161. <Header id="layout-header">
  162. <Icon
  163. className="trigger"
  164. type={collapsed ? 'menu-unfold' : 'menu-fold'}
  165. onClick={() => User.switchCollapse()}
  166. />
  167. <div className="f-r">
  168. {/* <Tooltip placement="bottom" title="使用文档">
  169. <Icon className="icon" type="question-circle" />
  170. </Tooltip>
  171. <Tooltip placement="bottom" title="消息">
  172. <Icon className="icon" type="bell" />
  173. </Tooltip> */}
  174. {project.otherLink && project.otherLink.length > 0 && (
  175. <Dropdown overlay={this.getOtherLink()} placement="bottomCenter">
  176. <Icon className="icon" type="link" />
  177. </Dropdown>
  178. )}
  179. <Dropdown overlay={this.getUserconfigMenu()} placement="bottomCenter">
  180. <div className="user-info" style={{ display: 'inline-block' }}>
  181. <Avatar className="avatar" size="small" icon="user" />
  182. <span className="m-l-1">{username}</span>
  183. </div>
  184. </Dropdown>
  185. </div>
  186. </Header>
  187. <Layout className="page-layout">{this.renderContentView(false)}</Layout>
  188. </Layout>
  189. </Layout>
  190. </LocaleProvider>
  191. );
  192. }
  193. itemRender(route) {
  194. return !route.path ? <span>{route.name}</span> : <Link to={route.path}>{route.name}</Link>;
  195. }
  196. renderContentView(free) {
  197. const { config, children } = this.props;
  198. return (
  199. <div className="page-content">
  200. {!free && !config.free && (
  201. <Breadcrumb
  202. hidden={config.free || !config.module}
  203. itemRender={this.itemRender}
  204. routes={this.state.routes}
  205. separator="/"
  206. />
  207. )}
  208. {children}
  209. </div>
  210. );
  211. }
  212. }