| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- import './Header.scss';
- import React, { PureComponent as Component } from 'react';
- import PropTypes from 'prop-types';
- import { connect } from 'react-redux';
- import { Link } from 'react-router-dom';
- import { Icon, Layout, Menu, Dropdown, message, Tooltip, Popover, Tag } from 'antd';
- import { checkLoginState, logoutActions, loginTypeAction } from '../../reducer/modules/user';
- import { changeMenuItem } from '../../reducer/modules/menu';
- import { withRouter } from 'react-router';
- import Srch from './Search/Search';
- const { Header } = Layout;
- import LogoSVG from '../LogoSVG/index.js';
- import Breadcrumb from '../Breadcrumb/Breadcrumb.js';
- import GuideBtns from '../GuideBtns/GuideBtns.js';
- const plugin = require('client/plugin.js');
- let HeaderMenu = {
- user: {
- path: '/user/profile',
- name: '个人中心',
- icon: 'user',
- adminFlag: false
- },
- solution: {
- path: '/user/list',
- name: '用户管理',
- icon: 'solution',
- adminFlag: true
- }
- };
- plugin.emitHook('header_menu', HeaderMenu);
- const MenuUser = props => (
- <Menu theme="dark" className="user-menu">
- {Object.keys(HeaderMenu).map(key => {
- let item = HeaderMenu[key];
- const isAdmin = props.role === 'admin';
- if (item.adminFlag && !isAdmin) {
- return null;
- }
- return (
- <Menu.Item key={key}>
- {item.name === '个人中心' ? (
- <Link to={item.path + `/${props.uid}`}>
- <Icon type={item.icon} />
- {item.name}
- </Link>
- ) : (
- <Link to={item.path}>
- <Icon type={item.icon} />
- {item.name}
- </Link>
- )}
- </Menu.Item>
- );
- })}
- <Menu.Item key="9">
- <a onClick={props.logout}>
- <Icon type="logout" />退出
- </a>
- </Menu.Item>
- </Menu>
- );
- const tipFollow = (
- <div className="title-container">
- <h3 className="title">
- <Icon type="star" /> 关注
- </h3>
- <p>这里是你的专属收藏夹,便于你找到自己的项目</p>
- </div>
- );
- const tipAdd = (
- <div className="title-container">
- <h3 className="title">
- <Icon type="plus-circle" /> 新建项目
- </h3>
- <p>在任何页面都可以快速新建项目</p>
- </div>
- );
- const tipDoc = (
- <div className="title-container">
- <h3 className="title">
- 使用文档 <Tag color="orange">推荐!</Tag>
- </h3>
- <p>
- 初次使用 YApi,强烈建议你阅读{' '}
- <a target="_blank" href="https://hellosean1025.github.io/yapi/" rel="noopener noreferrer">
- 使用文档
- </a>
- ,我们为你提供了通俗易懂的快速入门教程,更有详细的使用说明,欢迎阅读!{' '}
- </p>
- </div>
- );
- MenuUser.propTypes = {
- user: PropTypes.string,
- msg: PropTypes.string,
- role: PropTypes.string,
- uid: PropTypes.number,
- relieveLink: PropTypes.func,
- logout: PropTypes.func
- };
- const ToolUser = props => {
- let imageUrl = props.imageUrl ? props.imageUrl : `/api/user/avatar?uid=${props.uid}`;
- return (
- <ul>
- <li className="toolbar-li item-search">
- <Srch groupList={props.groupList} />
- </li>
- <Popover
- overlayClassName="popover-index"
- content={<GuideBtns />}
- title={tipFollow}
- placement="bottomRight"
- arrowPointAtCenter
- visible={props.studyTip === 1 && !props.study}
- >
- <Tooltip placement="bottom" title={'我的关注'}>
- <li className="toolbar-li">
- <Link to="/follow">
- <Icon className="dropdown-link" style={{ fontSize: 16 }} type="star" />
- </Link>
- </li>
- </Tooltip>
- </Popover>
- <Popover
- overlayClassName="popover-index"
- content={<GuideBtns />}
- title={tipAdd}
- placement="bottomRight"
- arrowPointAtCenter
- visible={props.studyTip === 2 && !props.study}
- >
- <Tooltip placement="bottom" title={'新建项目'}>
- <li className="toolbar-li">
- <Link to="/add-project">
- <Icon className="dropdown-link" style={{ fontSize: 16 }} type="plus-circle" />
- </Link>
- </li>
- </Tooltip>
- </Popover>
- <Popover
- overlayClassName="popover-index"
- content={<GuideBtns isLast={true} />}
- title={tipDoc}
- placement="bottomRight"
- arrowPointAtCenter
- visible={props.studyTip === 3 && !props.study}
- >
- <Tooltip placement="bottom" title={'使用文档'}>
- <li className="toolbar-li">
- <a target="_blank" href="https://hellosean1025.github.io/yapi" rel="noopener noreferrer">
- <Icon className="dropdown-link" style={{ fontSize: 16 }} type="question-circle" />
- </a>
- </li>
- </Tooltip>
- </Popover>
- <li className="toolbar-li">
- <Dropdown
- placement="bottomRight"
- trigger={['click']}
- overlay={
- <MenuUser
- user={props.user}
- msg={props.msg}
- uid={props.uid}
- role={props.role}
- relieveLink={props.relieveLink}
- logout={props.logout}
- />
- }
- >
- <a className="dropdown-link">
- <span className="avatar-image">
- <img src={imageUrl} />
- </span>
- {/*props.imageUrl? <Avatar src={props.imageUrl} />: <Avatar src={`/api/user/avatar?uid=${props.uid}`} />*/}
- <span className="name">
- <Icon type="down" />
- </span>
- </a>
- </Dropdown>
- </li>
- </ul>
- );
- };
- ToolUser.propTypes = {
- user: PropTypes.string,
- msg: PropTypes.string,
- role: PropTypes.string,
- uid: PropTypes.number,
- relieveLink: PropTypes.func,
- logout: PropTypes.func,
- groupList: PropTypes.array,
- studyTip: PropTypes.number,
- study: PropTypes.bool,
- imageUrl: PropTypes.any
- };
- @connect(
- state => {
- return {
- user: state.user.userName,
- uid: state.user.uid,
- msg: null,
- role: state.user.role,
- login: state.user.isLogin,
- studyTip: state.user.studyTip,
- study: state.user.study,
- imageUrl: state.user.imageUrl
- };
- },
- {
- loginTypeAction,
- logoutActions,
- checkLoginState,
- changeMenuItem
- }
- )
- @withRouter
- export default class HeaderCom extends Component {
- constructor(props) {
- super(props);
- }
- static propTypes = {
- router: PropTypes.object,
- user: PropTypes.string,
- msg: PropTypes.string,
- uid: PropTypes.number,
- role: PropTypes.string,
- login: PropTypes.bool,
- relieveLink: PropTypes.func,
- logoutActions: PropTypes.func,
- checkLoginState: PropTypes.func,
- loginTypeAction: PropTypes.func,
- changeMenuItem: PropTypes.func,
- history: PropTypes.object,
- location: PropTypes.object,
- study: PropTypes.bool,
- studyTip: PropTypes.number,
- imageUrl: PropTypes.any
- };
- linkTo = e => {
- if (e.key != '/doc') {
- this.props.changeMenuItem(e.key);
- if (!this.props.login) {
- message.info('请先登录', 1);
- }
- }
- };
- relieveLink = () => {
- this.props.changeMenuItem('');
- };
- logout = e => {
- e.preventDefault();
- this.props
- .logoutActions()
- .then(res => {
- if (res.payload.data.errcode == 0) {
- this.props.history.push('/');
- this.props.changeMenuItem('/');
- message.success('退出成功! ');
- } else {
- message.error(res.payload.data.errmsg);
- }
- })
- .catch(err => {
- message.error(err);
- });
- };
- handleLogin = e => {
- e.preventDefault();
- this.props.loginTypeAction('1');
- };
- handleReg = e => {
- e.preventDefault();
- this.props.loginTypeAction('2');
- };
- checkLoginState = () => {
- this.props.checkLoginState
- .then(res => {
- if (res.payload.data.errcode !== 0) {
- this.props.history.push('/');
- }
- })
- .catch(err => {
- console.log(err);
- });
- };
- render() {
- const { login, user, msg, uid, role, studyTip, study, imageUrl } = this.props;
- return (
- <Header className="header-box m-header">
- <div className="content g-row">
- <Link onClick={this.relieveLink} to="/group" className="logo">
- <div className="href">
- <span className="img">
- <LogoSVG length="32px" />
- </span>
- </div>
- </Link>
- <Breadcrumb />
- <div
- className="user-toolbar"
- style={{ position: 'relative', zIndex: this.props.studyTip > 0 ? 3 : 1 }}
- >
- {login ? (
- <ToolUser
- {...{ studyTip, study, user, msg, uid, role, imageUrl }}
- relieveLink={this.relieveLink}
- logout={this.logout}
- />
- ) : (
- ''
- )}
- </div>
- </div>
- </Header>
- );
- }
- }
|