You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
4.4 KiB
144 lines
4.4 KiB
import { VuexModule, Module, Action, Mutation, getModule } from 'vuex-module-decorators'
|
|
import UserApiService, { UserLoginData, UserLoginPhoneData } from '@/api/users'
|
|
import { CurrentUser } from '@/api/abpconfiguration'
|
|
import { getItem, setItem, removeItem } from '@/utils/localStorage'
|
|
import { resetRouter } from '@/router'
|
|
import { TagsViewModule } from './tags-view'
|
|
import { PermissionModule } from '@/store/modules/permission'
|
|
import { AbpModule } from '@/store/modules/abp'
|
|
import store from '@/store'
|
|
|
|
export interface IUserState {
|
|
token: string
|
|
refreshToken: string
|
|
id: string | undefined
|
|
name: string | undefined
|
|
surName: string | undefined
|
|
userName: string | undefined
|
|
phoneNumber: string | undefined
|
|
roles: string[]
|
|
email: string | undefined
|
|
}
|
|
|
|
const tokenKey = 'vue_typescript_admin_token'
|
|
const refreshTokenKey = 'vue_typescript_admin_refresh_token'
|
|
|
|
@Module({ dynamic: true, store, name: 'user' })
|
|
class User extends VuexModule implements IUserState {
|
|
public token = getItem(tokenKey)
|
|
public refreshToken = getItem(refreshTokenKey)
|
|
public id: string | undefined = ''
|
|
public name: string | undefined = ''
|
|
public surName: string | undefined = ''
|
|
public userName: string | undefined = ''
|
|
public phoneNumber: string | undefined = ''
|
|
public email: string | undefined = ''
|
|
public roles = new Array<string>()
|
|
|
|
@Mutation
|
|
private SET_TOKEN(token: string) {
|
|
this.token = token
|
|
setItem(tokenKey, token)
|
|
}
|
|
|
|
@Mutation
|
|
private SET_REFRESHTOKEN(token: string) {
|
|
this.refreshToken = token
|
|
setItem(refreshTokenKey, token)
|
|
}
|
|
|
|
@Mutation
|
|
private SET_CURRENTUSERINFO(currentUser: CurrentUser) {
|
|
this.id = currentUser.id
|
|
this.name = currentUser.name
|
|
this.email = currentUser.email
|
|
this.surName = currentUser.surName
|
|
this.userName = currentUser.userName
|
|
this.phoneNumber = currentUser.phoneNumber
|
|
this.roles = currentUser.roles
|
|
}
|
|
|
|
@Action({ rawError: true })
|
|
public RefreshCurrentUser() {
|
|
this.SET_CURRENTUSERINFO(AbpModule.configuration.currentUser)
|
|
}
|
|
|
|
@Action({ rawError: true })
|
|
public async Login(userInfo: { username: string, password: string}) {
|
|
const userLoginData = new UserLoginData()
|
|
userLoginData.userName = userInfo.username
|
|
userLoginData.password = userInfo.password
|
|
const loginResult = await UserApiService.userLogin(userLoginData)
|
|
const token = loginResult.token_type + ' ' + loginResult.access_token
|
|
this.SET_TOKEN(token)
|
|
this.SET_REFRESHTOKEN(loginResult.refresh_token)
|
|
await this.PostLogin()
|
|
}
|
|
|
|
@Action({ rawError: true })
|
|
public async PhoneLogin(userInfo: { phoneNumber: string, verifyCode: string}) {
|
|
const userLoginData = new UserLoginPhoneData()
|
|
userLoginData.phoneNumber = userInfo.phoneNumber
|
|
userLoginData.verifyCode = userInfo.verifyCode
|
|
const loginResult = await UserApiService.userLoginWithPhone(userLoginData)
|
|
const token = loginResult.token_type + ' ' + loginResult.access_token
|
|
this.SET_TOKEN(token)
|
|
this.SET_REFRESHTOKEN(loginResult.refresh_token)
|
|
await this.PostLogin()
|
|
}
|
|
|
|
@Action
|
|
public ResetToken() {
|
|
removeItem(tokenKey)
|
|
this.SET_TOKEN('')
|
|
}
|
|
|
|
@Action
|
|
public async LogOut() {
|
|
if (this.token === '') {
|
|
throw Error('LogOut: token is undefined!')
|
|
}
|
|
const token = getItem(refreshTokenKey)
|
|
if (token) {
|
|
await UserApiService.userLogout(token)
|
|
}
|
|
this.SET_TOKEN('')
|
|
this.SET_REFRESHTOKEN('')
|
|
this.SET_CURRENTUSERINFO(new CurrentUser())
|
|
removeItem(tokenKey)
|
|
removeItem(refreshTokenKey)
|
|
resetRouter()
|
|
// Reset visited views and cached views
|
|
TagsViewModule.delAllViews()
|
|
PermissionModule.ResetPermissions()
|
|
PermissionModule.ResetRoutes()
|
|
}
|
|
|
|
@Action
|
|
public RefreshSession() {
|
|
return new Promise((resolve, reject) => {
|
|
const refreshToken = getItem(refreshTokenKey)
|
|
const token = getItem(tokenKey)
|
|
if (refreshToken) {
|
|
UserApiService.refreshToken(token, refreshToken).then(result => {
|
|
const token = result.token_type + ' ' + result.access_token
|
|
this.SET_TOKEN(token)
|
|
this.SET_REFRESHTOKEN(result.refresh_token)
|
|
return resolve(token)
|
|
}).catch(error => {
|
|
return reject(error)
|
|
})
|
|
} else {
|
|
return resolve('')
|
|
}
|
|
})
|
|
}
|
|
|
|
@Action
|
|
private async PostLogin() {
|
|
const abpConfig = await AbpModule.LoadAbpConfiguration()
|
|
this.SET_CURRENTUSERINFO(abpConfig.currentUser)
|
|
}
|
|
}
|
|
|
|
export const UserModule = getModule(User)
|
|
|