import { VuexModule, Module, Action, Mutation, getModule } from 'vuex-module-decorators' import { login, logout, getUserInfo } from '@/api/users' import { getToken, setToken, removeToken } from '@/utils/cookies' import store from '@/store' export interface IUserState { token: string name: string avatar: string introduction: string roles: string[] } @Module({ dynamic: true, store, name: 'user' }) class User extends VuexModule implements IUserState { public token = getToken() || '' public name = '' public avatar = '' public introduction = '' public roles: string[] = [] @Mutation private SET_TOKEN(token: string) { this.token = token } @Mutation private SET_NAME(name: string) { this.name = name } @Mutation private SET_AVATAR(avatar: string) { this.avatar = avatar } @Mutation private SET_INTRODUCTION(introduction: string) { this.introduction = introduction } @Mutation private SET_ROLES(roles: string[]) { this.roles = roles } @Action public async Login(userInfo: { username: string, password: string }) { let { username, password } = userInfo username = username.trim() const { data } = await login({ username, password }) setToken(data.accessToken) this.SET_TOKEN(data.accessToken) } @Action public ResetToken() { removeToken() this.SET_TOKEN('') this.SET_ROLES([]) } @Action public async GetUserInfo() { if (this.token === '') { throw Error('GetUserInfo: token is undefined!') } const { data } = await getUserInfo({ /* Your params here */ }) if (!data) { throw Error('Verification failed, please Login again.') } const { roles, name, avatar, introduction } = data.user // roles must be a non-empty array if (!roles || roles.length <= 0) { throw Error('GetUserInfo: roles must be a non-null array!') } this.SET_ROLES(roles) this.SET_NAME(name) this.SET_AVATAR(avatar) this.SET_INTRODUCTION(introduction) } @Action public async LogOut() { if (this.token === '') { throw Error('LogOut: token is undefined!') } await logout() removeToken() this.SET_TOKEN('') this.SET_ROLES([]) } } export const UserModule = getModule(User)