user.js 6.68 KB
import Vue from 'vue'
import {
  getUserInfo,
  login,
  ssoLogin,
  logout,
  getDetailByAccountOrId,
  scanLogin,
} from '@/api/user'
import {
  getAccessToken,
  removeAccessToken,
  setAccessToken,
} from '@/utils/accessToken'
import { getUsername, removeUsername, setUsername } from '@/utils/username'
import { resetRouter } from '@/router'
import { title, tokenName } from '@/config'
import { twoStepVerify } from '@/api/uc'

const state = () => ({
  accessToken: getAccessToken(),
  username: getUsername(),
  avatar: '',
  userId: '',
  account: '',
  userInfo: {},
  loginStatus: true,
  tenantId: '',
  tenantCode: '',
  errorCode: '',
  message: '',
  loginValue: {},
})
const getters = {
  userId: (state) => state.userId,
  accessToken: (state) => state.accessToken,
  username: (state) => state.username,
  account: (state) => state.account,
  avatar: (state) => state.avatar,
  tenantId: (state) => state.tenantId,
  tenantCode: (state) => state.tenantCode,
}
const mutations = {
  setAccessToken(state, accessToken) {
    state.accessToken = accessToken
    setAccessToken(accessToken)
  },
  setUsername(state, username) {
    state.username = username
    setUsername(username)
  },
  setAvatar(state, avatar) {
    state.avatar = avatar
  },
  setUserId(state, data) {
    state.userId = data
  },
  setAccount(state, account) {
    state.account = account
  },
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
  },
  setLoginStatus(state, loginStatus) {
    state.loginStatus = loginStatus
  },
  setTenantId(state, tenantId) {
    state.tenantId = tenantId
  },
  setTenantCode(state, tenantCode) {
    state.tenantCode = tenantCode
  },
  setErrorCode(state, errorCode) {
    state.errorCode = errorCode
  },
  setMessage(state, message) {
    state.message = message
  },
  setLoginValue(state, loginValue) {
    state.loginValue = loginValue
  },
}
const actions = {
  // 账号密码登录
  async login({ commit, dispatch }, loginInfo) {
    const userInfo = await login(loginInfo)
    commit('setErrorCode', userInfo.errorCode)
    commit('setMessage', userInfo.message)
    if (userInfo.errorCode && userInfo.errorCode === '4012') {
      return
    }
    if (userInfo.errorCode && userInfo.errorCode === '2002') {
      commit('setLoginValue', userInfo.value)
      return
    }
    if (userInfo.errorCode && userInfo.errorCode === '2001') {
      commit('setLoginValue', userInfo.value)
      return
    }
    commit('setLoginStatus', userInfo.loginStatus)
    dispatch('authentication', userInfo)

    const hour = new Date().getHours()
    const thisTime =
      hour < 8
        ? '早上好'
        : hour <= 11
        ? '上午好'
        : hour <= 13
        ? '中午好'
        : hour < 18
        ? '下午好'
        : '晚上好'
    if (userInfo.loginStatus) {
      Vue.prototype.$baseNotify(`欢迎登录${title}`, `${thisTime}!`)
    }
  },
  // 单点登录
  async ssoLogin({ commit, dispatch }, loginInfo) {
    const userInfo = await ssoLogin(loginInfo)

    dispatch('authentication', userInfo)
  },
  // 扫码登录
  async scanLogin({ commit, dispatch }, data) {
    const response = await scanLogin(data)
    const { code, message, state, value } = response
    if (state) {
      commit('setLoginStatus', state)
    } else {
      Vue.prototype.$baseMessage(message || `扫码登录失败`, 'error')
    }
    commit('setMessage', message)
    if (value) {
      dispatch('authentication', value)
    }

    const hour = new Date().getHours()
    const thisTime =
      hour < 8
        ? '早上好'
        : hour <= 11
        ? '上午好'
        : hour <= 13
        ? '中午好'
        : hour < 18
        ? '下午好'
        : '晚上好'
    if (state) {
      Vue.prototype.$baseNotify(`欢迎登录${title}`, `${thisTime}!`)
    }
  },
  async twoStepVerify({ commit, dispatch }, loginInfo) {
    const formData = new FormData()
    formData.append('code', loginInfo.code)
    formData.append('token', loginInfo.token)
    const userInfo = await twoStepVerify(formData, loginInfo.tenantId)
    if (userInfo.state) {
      commit('setLoginStatus', userInfo.value.loginStatus)
      dispatch('authentication', userInfo.value)
      const hour = new Date().getHours()
      const thisTime =
        hour < 8
          ? '早上好'
          : hour <= 11
          ? '上午好'
          : hour <= 13
          ? '中午好'
          : hour < 18
          ? '下午好'
          : '晚上好'
      if (userInfo.value.loginStatus) {
        Vue.prototype.$baseNotify(`欢迎登录${title}`, `${thisTime}!`)
      }
    } else {
      Vue.prototype.$baseMessage(userInfo.message || `验证失败`, 'error')
    }
  },

  // 鉴权
  async authentication({ commit }, userInfo) {
    const { username, userId } = userInfo
    if (username) {
      commit('setUsername', username)
      commit('setAccount', username)
    }
    if (userId) {
      commit('setUserId', userId)
    }
    const accessToken = userInfo[tokenName]

    if (accessToken) {
      commit('setAccessToken', accessToken)
    } else {
      //如果是license授权超过月活跃用户数量限制 不弹出鉴权接口错误提示
      let isIgnoreError = userInfo.errorCode && "4013" == userInfo.errorCode
      if(!isIgnoreError){
        Vue.prototype.$baseMessage(
          `登录接口异常,未正确返回${tokenName}...`,
          'error'
        )
      }
    }
  },
  async getUserInfo({ commit, dispatch }) {
    const info = await getUserInfo()
    if (!info) {
      Vue.prototype.$baseMessage('验证失败,请重新登录...', 'error')
      return false
    }
    let { id, fullname, username, photo, account, tenantId, tenantCode } = info
    dispatch('getUserDetail', account)
    if (fullname) {
      commit('setUserId', id)
      commit('setUsername', fullname)
      commit('setAvatar', photo)
      commit('setAccount', username)
      commit('setTenantId', tenantId)
      commit('setTenantCode', tenantCode)
      Vue.prototype.$baseUserAccount = username
    } else {
      Vue.prototype.$baseMessage('用户信息接口异常', 'error')
      return false
    }
  },
  async getUserDetail({ commit }, account) {
    await getDetailByAccountOrId(account).then((res) => {
      commit('setUserInfo', res)
    })
  },
  async logout({ dispatch }) {
    sessionStorage.removeItem('currentPostId')
    await logout(state.accessToken)
    await dispatch('resetAccessToken')
    await resetRouter()
  },
  resetAccessToken({ commit }) {
    commit('setAccessToken', '')
    removeAccessToken()
    removeUsername()
  },
  saveTenatId({ commit }, tenantId) {
    commit('setTenantId', tenantId)
  },
  saveTenantCode({ commit }, tenantCode) {
    commit('setTenantCode', tenantCode)
  },
}
export default { state, getters, mutations, actions }