user.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import pinia from '~src/store/init'
  2. import { useAppStore } from '~src/store'
  3. import { getRoutes } from '~api/menu'
  4. import { getRefreshToken, setRefreshToken, setToken } from 'hc-vue3-ui'
  5. import tokenData from '~src/router/modules/token'
  6. import { ArrToOneObj, getArrValue, isNullES } from 'js-fast-way'
  7. import { logout, refreshToken, userLogin } from '~api/user'
  8. import { getStore, setStore } from '~src/utils/storage'
  9. //初始变量
  10. const store = useAppStore(pinia)
  11. //登录
  12. export const useAppLogin = async (form) => {
  13. const { error, code, res } = await userLogin(form)
  14. if (!error && code === 200) {
  15. setToken(res['access_token'])
  16. setRefreshToken(res['refresh_token'])
  17. store.setUserInfo(res)
  18. //获取路由菜单
  19. const routerRes = await setRouterData()
  20. if (routerRes.length <= 0) {
  21. return { error: true, msg: '路由异常' }
  22. }
  23. await getHomeRouter()
  24. return { error, code, res }
  25. } else {
  26. return { error, code, res }
  27. }
  28. }
  29. //设置路由信息
  30. export const setRouterData = async () => {
  31. const { error, data } = await getRoutes()
  32. if (error) {
  33. return Promise.reject(false)
  34. }
  35. const resData = getArrValue(data)
  36. //数据转换
  37. let routesObj = {}, routesArr = []
  38. await ArrToOneObj(resData, 'code', routesObj, routesArr)
  39. const routes = [...tokenData, ...routesArr] //合并
  40. //数据缓存
  41. setStore('menus', resData)
  42. setStore('route', routesObj)
  43. setStore('routes', routes)
  44. return resData
  45. }
  46. //获取路由菜单的主入口路径
  47. const getHomeRouter = async () => {
  48. const menus = getArrValue(getStore('menus'))
  49. //没有菜单路由数据
  50. if (menus.length <= 0) {
  51. store.setHomePage('index')
  52. store.setPage('anomaly')
  53. } else {
  54. const code = await getRoutesHomeUrl(menus, 0)
  55. store.setHomePage(code)
  56. store.setPage(code)
  57. if (code === 'index') {
  58. const pageCode = await getRoutesHomeUrl(menus, 1)
  59. store.setPage(pageCode)
  60. }
  61. }
  62. }
  63. //递归获取最子级的菜单
  64. const getRoutesHomeUrl = async (arr, index = 0) => {
  65. const item = arr[index]
  66. if (!isNullES(item.children) && item.children.length > 0) {
  67. return await getRoutesHomeUrl(item.children, index)
  68. } else {
  69. return item.code
  70. }
  71. }
  72. //刷新token
  73. export const RefreshToken = async () => {
  74. try {
  75. const { dept_id, role_id } = store.getUserInfo
  76. const refresh = getRefreshToken()
  77. const { error, code, res } = await refreshToken(refresh, dept_id, role_id)
  78. if (!error && code === 200) {
  79. setToken(res['access_token'])
  80. setRefreshToken(res['refresh_token'])
  81. store.setUserInfo(res)
  82. return Promise.resolve(res)
  83. } else {
  84. return Promise.reject(res)
  85. }
  86. } catch (e) {
  87. window.console.warn('token 刷新失败: ', e)
  88. return Promise.reject(e)
  89. }
  90. }
  91. //登出
  92. export const LogOut = async () => {
  93. return await logout()
  94. }