index.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { reactive } from 'vue'
  2. import { v4 } from 'uuid'
  3. import { encryptAES, decryptAES } from '@/utils/crypto'
  4. import { timerTask } from '@/utils/timer'
  5. import { ClientType } from '@/constants/client'
  6. import { queryLoginId, login } from '@/services/api/account'
  7. import { sessionData, localData } from '@/stores/storage'
  8. import { loginStore, enumStore, errorInfoStore, userStore, futuresStore, accountStore } from '@/stores'
  9. import { checkToken, checkTokenLoop } from '@/business/common'
  10. import service from '@/services'
  11. import socket from '@/services/socket'
  12. import eventBus from '@/services/bus'
  13. import cryptojs from 'crypto-js'
  14. export function useLogin() {
  15. const { logining } = loginStore.$mapState()
  16. const { token } = loginStore.$mapGetters()
  17. const formData = reactive<Proto.LoginReq>({
  18. LoginID: localStorage.getItem('thj_loginId') ?? '',
  19. LoginPWD: '',
  20. GUID: v4(),
  21. LoginType: 0,
  22. ClientType: ClientType.None,
  23. Version: '2.0.0.0',
  24. DeviceID: ''
  25. })
  26. const loadUserData = async () => {
  27. await checkToken() // 令牌校验
  28. await userStore.actions.getUserData()
  29. futuresStore.actions.getGoodsList()
  30. accountStore.actions.getAccountList()
  31. checkTokenLoop()
  32. }
  33. const loginAction = async (params: Proto.LoginReq) => {
  34. params.GUID = v4()
  35. await login({
  36. data: params,
  37. success: async (res) => {
  38. const encryptedData = encryptAES(JSON.stringify(params)) // 数据加密
  39. localData.setValue('autoLoginEncryptedData', encryptedData)
  40. loginStore.$setState((state) => {
  41. state.loginInfo = res
  42. })
  43. localStorage.setItem('thj_loginId', formData.LoginID) // 记住登录ID
  44. }
  45. })
  46. await loadUserData()
  47. eventBus.$emit('LoginNotify') // 登录成功通知
  48. }
  49. // 自动登录
  50. const autoLogin = async () => {
  51. try {
  52. logining.value = true
  53. const encryptedData = localData.getValue('autoLoginEncryptedData')
  54. if (encryptedData) {
  55. const decryptedString = decryptAES(encryptedData)
  56. return await loginAction(JSON.parse(decryptedString))
  57. }
  58. return Promise.reject('自动登录失败')
  59. } finally {
  60. logining.value = false
  61. }
  62. }
  63. // 用户登录
  64. const userLogin = async (clientType: ClientType) => {
  65. logining.value = true
  66. formData.ClientType = clientType
  67. try {
  68. const params = { ...formData }
  69. await queryLoginId({
  70. username: formData.LoginID
  71. }).then((res) => {
  72. params.LoginID = res.data
  73. params.LoginPWD = cryptojs.SHA256(res.data + formData.LoginPWD).toString()
  74. })
  75. return await loginAction(params)
  76. } finally {
  77. logining.value = false
  78. }
  79. }
  80. // 用户登出
  81. const userLogout = (callback?: () => void) => {
  82. socket.closeAll()
  83. timerTask.clearAll()
  84. sessionData.reset('loginInfo', 'userRoutes')
  85. callback && callback()
  86. }
  87. // 初始化业务数据
  88. const initBaseData = async (enableAutoLogin = false) => {
  89. try {
  90. logining.value = true
  91. await service.onReady() // 等待服务初始化
  92. await Promise.all([
  93. errorInfoStore.actions.getErrorInfoList(),
  94. enumStore.actions.getAllEnumList(),
  95. ])
  96. if (token.value) {
  97. await loadUserData()
  98. } else if (enableAutoLogin) {
  99. await autoLogin()
  100. }
  101. logining.value = false
  102. } catch {
  103. logining.value = false
  104. }
  105. }
  106. return {
  107. logining,
  108. formData,
  109. initBaseData,
  110. autoLogin,
  111. userLogin,
  112. userLogout,
  113. }
  114. }