login.js 4.27 KB
import storage from 'good-storage'
import {
  authentication,
  basicSso,
  refreshAndGetAuthenticationToken,
  logout,
} from '@/api/auth.js'
import { encryptedData } from '@/utils/encrypt'
import { loginRSA } from '@/config'
const state = {
  currentUser: null,
  account: '',
  isRefreshToken: false,
  loginValue: {},
  loginStatus: true,
}

const getters = {
  token() {
    return state.currentUser && state.currentUser.token
  },
  userId() {
    return state.currentUser && state.currentUser.userId
  },
}

const actions = {
  loginByPrincipal({ commit }, data) {
    return new Promise((resolve, reject) => {
      if (loginRSA) {
        const { password } = data
        data['password'] = encryptedData(password)
      }

      authentication(data.params, data.tenantId)
        .then((res) => {
          resolve(res)
          if (res.errorCode && res.errorCode === '2002') {
            commit('setLoginValue', res.value)

            return
          }
          if (res.errorCode && userInfo.errorCode === '2001') {
            commit('setLoginValue', res.value)

            return
          }
          commit('setLoginStatus', res.loginStatus)
          commit('setCurrentUser', res)
          commit('setAccount', res.account)
          storage.session.set('currentUser', res)
        })
        .catch((err) => {
          reject(err)
        })
    })
  },
  validAndCompletedCurrent({ commit, state }, token) {
    return new Promise((resolve, reject) => {
      if (state.currentUser && !token) {
        resolve()
      } else {
        const user = storage.session.get('currentUser')
        if (user && !token) {
          commit('setCurrentUser', user)
          commit('setAccount', user.account)
          resolve()
        } else if (token) {
          basicSso(token)
            .then((res) => {
              storage.session.set('currentUser', res)
              commit('setCurrentUser', res)
              commit('setAccount', res.account)
              resolve()
            })
            .catch(() => {
              reject()
            })
        } else {
          reject()
        }
      }
    })
  },
  refreshAndGetAuthenticationToken({ commit, state }) {
    if (state.isRefreshToken) {
      return
    }
    commit('isRefreshToken', true)
    return new Promise((resolve, reject) => {
      refreshAndGetAuthenticationToken().then(
        (user) => {
          if (user) {
            sessionStorage.setItem(
              'currentUser',
              JSON.stringify(state.currentUser)
            )
            commit('refreshToken', user.token)
            setTimeout(() => {
              commit('isRefreshToken', false)
            }, 3000)
            resolve()
          }
        },
        (msg) => {
          reject(msg)
        }
      )
    })
  },
  logoutAndCleanUp({ commit, state }) {
    return new Promise((resolve, reject) => {
      logout().finally(() => {
        sessionStorage.removeItem('currentUser')
        commit('clearCurrentUser')
        commit('user/setCurrentUserDetail', null, { root: true })
        commit('user/setCurrentUserOrg', null, { root: true })
        resolve()
      })
    })
  },
  //token过期后,执行本方法,不需要请求后台登出
  clearCurrentUser({ commit, state }) {
    sessionStorage.removeItem('currentUser')
    commit('clearCurrentUser')
    commit('user/setCurrentUserDetail', null, { root: true })
    commit('user/setCurrentUserOrg', null, { root: true })
  },
}

const mutations = {
  setLoginStatus(state, loginStatus) {
    state.loginStatus = loginStatus
  },
  setLoginValue(state, loginValue) {
    state.loginValue = loginValue
  },
  isRefreshToken(state, status) {
    state.isRefreshToken = status
  },
  refreshToken(state, token) {
    state.currentUser.token = token
    state.currentUser.loginTime = new Date().getTime()
  },
  setCurrentUser(state, current) {
    state.currentUser = current
    //把token传给app应用进行保存
    window.uni &&
      // eslint-disable-next-line no-undef
      uni.postMessage({
        data: {
          action: 'login',
          token: current.token,
        },
      })
  },
  clearCurrentUser(state) {
    state.currentUser = null
  },
  setAccount(state, account) {
    state.account = account
  },
}

export default {
  namespaced: true,
  state,
  getters,
  actions,
  mutations,
}