AvatarDropdown.tsx 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. localStorage.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))
  39. const { initialState, setInitialState } = useModel('@@initialState');
  40. const { 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 = localStorage.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. if (key === 'release') {
  69. let token = localStorage.getItem('Admin-Token')
  70. window.open(api.includes('test') || api === 'api' ? `http://test.adq.zanxiangnet.com/#/user/login?token=${token}` : `http://adq.zanxiangnet.com/#/user/login?token=${token}`)
  71. return
  72. }
  73. history.push(`/account/${key}`);
  74. },
  75. [],
  76. );
  77. const submit = useCallback(() => {
  78. if (!oldPassWord) {
  79. message.error('请输入旧密码!')
  80. return
  81. }
  82. if (!passWord) {
  83. message.error('请输入新密码!')
  84. return
  85. }
  86. if (!OkPassWord) {
  87. message.error('请输入确认密码!')
  88. return
  89. }
  90. if (passWord.length < 6) {
  91. message.error('密码需要6位以上!')
  92. return
  93. }
  94. if (passWord !== OkPassWord) {
  95. message.error('两次输入的密码不一致!')
  96. return
  97. }
  98. if (passWord === OkPassWord && oldPassWord) {
  99. modifyPassword.run({ oldPassword: oldPassWord, password: passWord, userId: initialState?.currentUser?.userId }).then((res) => {
  100. if (res) {
  101. message.success('修改密码成功!')
  102. setVisible(false)
  103. loginOut();
  104. }
  105. })
  106. }
  107. }, [passWord, oldPassWord, OkPassWord])
  108. const loading = (
  109. <span className={`${styles.action} ${styles.account}`}>
  110. <Spin
  111. size="small"
  112. style={{
  113. marginLeft: 8,
  114. marginRight: 8,
  115. }}
  116. />
  117. </span>
  118. );
  119. if (!initialState) {
  120. return loading;
  121. }
  122. const { currentUser } = initialState;
  123. if (!currentUser || !currentUser.name) {
  124. return loading;
  125. }
  126. let items = []
  127. if (menu) {
  128. items.push({ label: '个人中心', key: 'center', icon: <UserOutlined /> })
  129. items.push({ label: '个人设置', key: 'settings', icon: <SettingOutlined /> })
  130. }
  131. if (currentUser?.powerLevel === 999) {
  132. items.push({ label: '管理系统', key: 'admin', icon: <SendOutlined /> })
  133. }
  134. items.push({ label: '切换公司', key: 'company', icon: <SwapOutlined /> })
  135. items.push({ label: '修改密码', key: 'edit', icon: <EditOutlined /> })
  136. items.push({ label: '退出登录', key: 'logout', icon: <LogoutOutlined /> })
  137. // 切换公司
  138. const setCompanyHandle = (companyId: number) => {
  139. selectCompany.run(companyId).then((res: any) => {
  140. setDialogVisible(false)
  141. localStorage.setItem('Admin-Token', res?.data?.token)
  142. window.location.reload()
  143. })
  144. }
  145. return (
  146. <>
  147. <HeaderDropdown menu={{ items, onClick: onMenuClick }}>
  148. <span className={`${styles.action} ${styles.account}`} onClick={() => {
  149. let AdminToken: any = localStorage.getItem('Admin-Token')
  150. copy(AdminToken)
  151. }}>
  152. <Avatar size="small" className={styles.avatar} src={currentUser.avatar || headImg} alt="avatar" />
  153. <span className={`${styles.name} anticon`}>{currentUser.name}</span>
  154. </span>
  155. </HeaderDropdown>
  156. <Modal
  157. title="修改密码"
  158. open={visible}
  159. onOk={submit}
  160. onCancel={() => setVisible(false)}
  161. >
  162. <p className={styles.editPasswordP}>
  163. <label>旧密码</label>
  164. <Input
  165. value={oldPassWord}
  166. onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
  167. let value = e.target.value
  168. setOldPassWord(value)
  169. }}
  170. />
  171. </p>
  172. <p className={styles.editPasswordP}>
  173. <label>新密码</label>
  174. <Input
  175. value={passWord}
  176. onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
  177. let value = e.target.value
  178. setPassWord(value)
  179. }}
  180. />
  181. </p>
  182. <p className={styles.editPasswordP}>
  183. <label>确认密码</label>
  184. <Input
  185. value={OkPassWord}
  186. onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
  187. let value = e.target.value
  188. setOkPassWord(value)
  189. }}
  190. />
  191. </p>
  192. </Modal>
  193. <div className={styles.dialog} style={{ display: dialogVisible ? 'block' : 'none' }}>
  194. <div className={styles.companyAccount}>
  195. <div className={styles.close} onClick={() => { setDialogVisible(false) }}><CloseOutlined style={{ color: '#000' }} /></div>
  196. <h3>切换公司账户</h3>
  197. <div className={styles.chooseTableBlock}>
  198. <Spin spinning={selectCompany?.loading}>
  199. {initialState?.currentUser?.companyList?.map((item: any) => {
  200. if (item.companyId != initialState.currentUser?.onlineCompanyId) {
  201. return <div className={`${styles.acTableLineContent} ${styles.acTableLine}`} key={item?.companyId} onClick={() => { setCompanyHandle(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. } else {
  206. return <div className={`${styles.acTableLineContent} ${styles.acNone}`} key={item?.companyId}>
  207. <div className={styles.actname}>{item?.companyInfo?.companyName}</div>
  208. <div className={styles.right}> <div className={styles.actcha}>{item?.powerLevel === 999 ? '超级管理员' : item?.powerLevel === 100 ? '系统管理员' : item?.powerLevel === 99 ? '管理员' : '普通用户'}</div> <SwapRightOutlined className={styles.iconRight} /></div>
  209. </div>
  210. }
  211. })}
  212. </Spin>
  213. </div>
  214. </div>
  215. </div>
  216. </>
  217. );
  218. };
  219. export default AvatarDropdown;