123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- import React, { Component } from 'react';
- import { Link } from 'react-router-dom';
- import { Layout, Menu, Icon, Dropdown, Avatar, Breadcrumb, LocaleProvider } from 'antd';
- import zhCN from 'antd/lib/locale-provider/zh_CN';
- import '../style/adminLeft.less';
- import { User } from '../stores/user';
- import { asyncForm, asyncDelConfirm, asyncSMessage } from '../services/AsyncTools';
- const { SubMenu } = Menu;
- const { Header, Sider } = Layout;
- const passwordItemList = [
- {
- key: 'password',
- name: '新密码',
- type: 'input',
- placeholder: '请输入新密码',
- require: true,
- },
- ];
- export default class extends Component {
- constructor(props) {
- super(props);
- const { config, moduleMap } = props;
- const state = { routes: [] };
- if (config.group) {
- state.routes.push({
- name: config.group.name,
- path: moduleMap[config.module.key].groupMap[config.group.key].path,
- });
- }
- if (config.module && config.group) {
- if (moduleMap[config.module.key].groupMap[config.group.key].subList.length > 1 || config.showKey) {
- state.routes.push({
- name: config.title,
- });
- }
- }
- this.state = state;
- }
- render() {
- const { config } = this.props;
- return (
- <div className="admin-left" style={{ height: window.document.documentElement.clientHeight }}>
- {config.module ? this.renderLayoutView() : this.renderContentView(true)}
- </div>
- );
- }
- getUserconfigMenu() {
- return (
- <Menu
- style={{ width: '100px', textAlign: 'center' }}
- onClick={item => {
- switch (item.key) {
- case 'password':
- asyncForm('修改密码', passwordItemList, {}, data => {
- return User.editPassword(data).then(() => {
- asyncSMessage('密码修改成功!');
- });
- });
- break;
- case 'logout':
- asyncDelConfirm('退出', '是否退出当前帐号?', () => {
- User.logout().then(() => {
- asyncSMessage('帐号已退出!');
- });
- });
- break;
- default:
- break;
- }
- }}
- >
- <Menu.Item key="password">
- <Icon type="edit" />
- 修改密码
- </Menu.Item>
- <Menu.Divider />
- <Menu.Item key="logout">
- <Icon type="logout" />
- 退出登录
- </Menu.Item>
- </Menu>
- );
- }
- getOtherLink() {
- const { project } = this.props;
- return (
- <Menu
- style={{ width: '100px', textAlign: 'center' }}
- onClick={item => {
- toLink(item.key);
- }}
- >
- {project.otherLink.map(link => {
- return (
- <Menu.Item key={link.path}>
- <Icon type="link" />
- {link.title}
- </Menu.Item>
- );
- })}
- </Menu>
- );
- }
- renderLayoutView() {
- const { moduleMap, config, user, project } = this.props;
- const { collapsed, logo, name, username, openMenu } = user;
- return (
- <LocaleProvider locale={zhCN}>
- <Layout style={{ height: '100%' }}>
- {config.group && (
- <Sider className="left-slider" collapsed={collapsed}>
- <Link to="/">
- <div id="logo">
- <img src={logo} />
- <h1>{name}</h1>
- </div>
- </Link>
- <Menu
- mode="inline"
- theme="dark"
- key={`${collapsed}`}
- defaultSelectedKeys={[config.showKey || config.key, config.group.key]}
- defaultOpenKeys={collapsed ? [] : openMenu[config.module.key] || [config.group.key]}
- onClick={e => linkTo(e.item.props.path)}
- onOpenChange={keys => !collapsed && User.openMenu(config.module.key, keys)}
- >
- {moduleMap[config.module.key].groupList.map(key => {
- const group = moduleMap[config.module.key].groupMap[key];
- const hasSub = group.subList.length > 1;
- const view = hasSub ? (
- <SubMenu
- key={group.key}
- title={
- <span>
- <Icon type={group.icon} />
- <span>{group.name}</span>
- </span>
- }
- >
- {group.subList.map(k => {
- const sub = group.subMap[k];
- return (
- <Menu.Item key={sub.key} path={sub.path}>
- <Icon type={sub.icon} />
- <span>{sub.name || sub.title}</span>
- </Menu.Item>
- );
- })}
- </SubMenu>
- ) : (
- <Menu.Item key={group.key} path={group.path}>
- <Icon type={group.icon} />
- <span>{group.name}</span>
- </Menu.Item>
- );
- return view;
- })}
- </Menu>
- </Sider>
- )}
- <Layout id="right-layout">
- <Header id="layout-header">
- <Icon
- className="trigger"
- type={collapsed ? 'menu-unfold' : 'menu-fold'}
- onClick={() => User.switchCollapse()}
- />
- <div className="f-r">
- {/* <Tooltip placement="bottom" title="使用文档">
- <Icon className="icon" type="question-circle" />
- </Tooltip>
- <Tooltip placement="bottom" title="消息">
- <Icon className="icon" type="bell" />
- </Tooltip> */}
- {project.otherLink && project.otherLink.length > 0 && (
- <Dropdown overlay={this.getOtherLink()} placement="bottomCenter">
- <Icon className="icon" type="link" />
- </Dropdown>
- )}
- <Dropdown overlay={this.getUserconfigMenu()} placement="bottomCenter">
- <div className="user-info" style={{ display: 'inline-block' }}>
- <Avatar className="avatar" size="small" icon="user" />
- <span className="m-l-1">{username}</span>
- </div>
- </Dropdown>
- </div>
- </Header>
- <Layout className="page-layout">{this.renderContentView(false)}</Layout>
- </Layout>
- </Layout>
- </LocaleProvider>
- );
- }
- itemRender(route) {
- return !route.path ? <span>{route.name}</span> : <Link to={route.path}>{route.name}</Link>;
- }
- renderContentView(free) {
- const { config, children } = this.props;
- return (
- <div className="page-content">
- {!free && !config.free && (
- <Breadcrumb
- hidden={config.free || !config.module}
- itemRender={this.itemRender}
- routes={this.state.routes}
- separator="/"
- />
- )}
- {children}
- </div>
- );
- }
- }
|