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; console.log(this.props); } render() { const { config } = this.props; return ( <div className="admin" 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> ); } }