AvatarDropdown.tsx 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import React, { useCallback, useState } from 'react';
  2. import { CloseOutlined, EditOutlined, LogoutOutlined, SendOutlined, SettingOutlined, SwapOutlined, SwapRightOutlined, UserOutlined } from '@ant-design/icons';
  3. import { Avatar, Input, Menu, message, Modal, Spin } from 'antd';
  4. import { history, useModel } from 'umi';
  5. import { getPageQuery } from '@/utils/utils';
  6. import { outLogin, selectCompanyApi } from '@/services/login';
  7. import { stringify } from 'querystring';
  8. import HeaderDropdown from '../HeaderDropdown';
  9. import styles from './index.less';
  10. import { useAjax } from '@/Hook/useAjax';
  11. import { api } from '@/services/api'
  12. import useCopy from '@/Hook/useCopy';
  13. export interface GlobalHeaderRightProps {
  14. menu?: boolean;
  15. }
  16. let headImg = require('../../../public/headImg2.png')
  17. /**
  18. * 退出登录,并且将当前的 url 保存
  19. */
  20. const loginOut = async () => {
  21. // await outLogin();
  22. const { redirect } = getPageQuery();
  23. // Note: There may be security issues, please note
  24. if (window.location.pathname !== '/user/login' && !redirect) {
  25. outLogin()
  26. // setCookie('Admin-Token', '1', -300)
  27. sessionStorage.removeItem('Admin-Token')
  28. history.replace({
  29. pathname: '/user/login',
  30. search: stringify({
  31. redirect: window.location.href,
  32. }),
  33. });
  34. }
  35. };
  36. const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu }) => {
  37. const { copy } = useCopy()
  38. const selectCompany = useAjax((companyId: number) => selectCompanyApi(companyId), { formatResult: true })
  39. const { initialState, setInitialState } = useModel('@@initialState');
  40. const { edit, modifyPassword } = useModel('useOperating.useUser')
  41. const [visible, setVisible] = useState<boolean>(false)
  42. const [oldPassWord, setOldPassWord] = useState<string>('')
  43. const [passWord, setPassWord] = useState<string>('')
  44. const [OkPassWord, setOkPassWord] = useState<string>('')
  45. const [dialogVisible, setDialogVisible] = useState<boolean>(false)
  46. const onMenuClick = useCallback(
  47. (event: any) => {
  48. const { key } = event;
  49. if (key === 'logout') {
  50. setInitialState({ ...initialState, currentUser: undefined });
  51. loginOut();
  52. return;
  53. }
  54. if (key === 'edit') {
  55. setVisible(true)
  56. console.log('修改密码')
  57. return;
  58. }
  59. if (key === 'company') {
  60. setDialogVisible(() => true)
  61. return
  62. }
  63. if (key === 'admin') {
  64. let token = sessionStorage.getItem('Admin-Token')
  65. window.open(api.includes('test') || api === 'api' ? `http://test.zanxiangnet.com/admin/#/login?token=${token}` : `https://mp.zanxiangnet.com/admin/#/login?token=${token}`)
  66. return
  67. }
  68. history.push(`/account/${key}`);
  69. },
  70. [],
  71. );
  72. const submit = useCallback(() => {
  73. if (!oldPassWord) {
  74. message.error('请输入旧密码!')
  75. return
  76. }
  77. if (!passWord) {
  78. message.error('请输入新密码!')
  79. return
  80. }
  81. if (!OkPassWord) {
  82. message.error('请输入确认密码!')
  83. return
  84. }
  85. if (passWord.length < 6) {
  86. message.error('密码需要6位以上!')
  87. return
  88. }
  89. if (passWord !== OkPassWord) {
  90. message.error('两次输入的密码不一致!')
  91. return
  92. }
  93. if (passWord === OkPassWord && oldPassWord) {
  94. modifyPassword.run({ oldPassword: oldPassWord, password: passWord, userId: initialState?.currentUser?.userId }).then((res) => {
  95. if (res) {
  96. message.success('修改密码成功!')
  97. setVisible(false)
  98. loginOut();
  99. }
  100. })
  101. }
  102. }, [passWord, oldPassWord, OkPassWord])
  103. const loading = (
  104. <span className={`${styles.action} ${styles.account}`}>
  105. <Spin
  106. size="small"
  107. style={{
  108. marginLeft: 8,
  109. marginRight: 8,
  110. }}
  111. />
  112. </span>
  113. );
  114. if (!initialState) {
  115. return loading;
  116. }
  117. const { currentUser } = initialState;
  118. if (!currentUser || !currentUser.name) {
  119. return loading;
  120. }
  121. let items = []
  122. if (menu) {
  123. items.push({ label: '个人中心', key: 'center', icon: <UserOutlined /> })
  124. items.push({ label: '个人设置', key: 'settings', icon: <SettingOutlined /> })
  125. }
  126. if (currentUser?.powerLevel === 999) {
  127. items.push({ label: '管理系统', key: 'admin', icon: <SendOutlined /> })
  128. }
  129. items.push({ label: '切换公司', key: 'company', icon: <SwapOutlined /> })
  130. items.push({ label: '修改密码', key: 'edit', icon: <EditOutlined /> })
  131. items.push({ label: '退出登录', key: 'logout', icon: <LogoutOutlined /> })
  132. // 切换公司
  133. const setCompanyHandle = (companyId: number) => {
  134. selectCompany.run(companyId).then((res: any) => {
  135. setDialogVisible(false)
  136. sessionStorage.setItem('Admin-Token', res?.data?.token)
  137. window.location.reload()
  138. })
  139. }
  140. return (
  141. <>
  142. <HeaderDropdown menu={{ items, onClick: onMenuClick }}>
  143. <span className={`${styles.action} ${styles.account}`} onClick={() => {
  144. let AdminToken: any = sessionStorage.getItem('Admin-Token')
  145. copy(AdminToken)
  146. }}>
  147. <Avatar size="small" className={styles.avatar} src={currentUser.avatar || headImg} alt="avatar" />
  148. <span className={`${styles.name} anticon`}>{currentUser.name}</span>
  149. </span>
  150. </HeaderDropdown>
  151. <Modal
  152. title="修改密码"
  153. open={visible}
  154. onOk={submit}
  155. onCancel={() => setVisible(false)}
  156. >
  157. <p className={styles.editPasswordP}>
  158. <label>旧密码</label>
  159. <Input
  160. value={oldPassWord}
  161. onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
  162. let value = e.target.value
  163. setOldPassWord(value)
  164. }}
  165. />
  166. </p>
  167. <p className={styles.editPasswordP}>
  168. <label>新密码</label>
  169. <Input
  170. value={passWord}
  171. onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
  172. let value = e.target.value
  173. setPassWord(value)
  174. }}
  175. />
  176. </p>
  177. <p className={styles.editPasswordP}>
  178. <label>确认密码</label>
  179. <Input
  180. value={OkPassWord}
  181. onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
  182. let value = e.target.value
  183. setOkPassWord(value)
  184. }}
  185. />
  186. </p>
  187. </Modal>
  188. <div className={styles.dialog} style={{ display: dialogVisible ? 'block' : 'none' }}>
  189. <div className={styles.companyAccount}>
  190. <div className={styles.close} onClick={() => { setDialogVisible(false) }}><CloseOutlined style={{ color: '#000' }} /></div>
  191. <h3>切换公司账户</h3>
  192. <div className={styles.chooseTableBlock}>
  193. <Spin spinning={selectCompany?.loading}>
  194. {initialState?.currentUser?.companyList?.map((item: any) => {
  195. if (item.companyId != initialState.currentUser?.onlineCompanyId) {
  196. return <div className={`${styles.acTableLineContent} ${styles.acTableLine}`} key={item?.companyId} onClick={() => { setCompanyHandle(item?.companyId) }}>
  197. <div className={styles.actname}>{item?.companyInfo?.companyName}</div>
  198. <div className={styles.right}> <div className={styles.actcha}>{item?.powerLevel === 999 ? '超级管理员' : item?.powerLevel === 100 ? '系统管理员' : item?.powerLevel === 99 ? '管理员' : '普通用户'}</div> <SwapRightOutlined className={styles.iconRight} /></div>
  199. </div>
  200. } else {
  201. return <div className={`${styles.acTableLineContent} ${styles.acNone}`} key={item?.companyId}>
  202. <div className={styles.actname}>{item?.companyInfo?.companyName}</div>
  203. <div className={styles.right}> <div className={styles.actcha}>{item?.powerLevel === 999 ? '超级管理员' : item?.powerLevel === 100 ? '系统管理员' : item?.powerLevel === 99 ? '管理员' : '普通用户'}</div> <SwapRightOutlined className={styles.iconRight} /></div>
  204. </div>
  205. }
  206. })}
  207. </Spin>
  208. </div>
  209. </div>
  210. </div>
  211. </>
  212. );
  213. };
  214. export default AvatarDropdown;