| New file | 
|  |  |  | 
|---|
|  |  |  | import { defineStore } from 'pinia'; | 
|---|
|  |  |  | import { | 
|---|
|  |  |  | login as userLogin, | 
|---|
|  |  |  | logout as userLogout, | 
|---|
|  |  |  | getUserInfo, | 
|---|
|  |  |  | LoginData, | 
|---|
|  |  |  | } from '@/api/user'; | 
|---|
|  |  |  | import { setToken, clearToken, setUserInfo, setUserResources, clearUserResources } from "@/utils/auth"; | 
|---|
|  |  |  | import { removeRouteListener } from '@/utils/route-listener'; | 
|---|
|  |  |  | import { UserState } from './types'; | 
|---|
|  |  |  | import useAppStore from '../app'; | 
|---|
|  |  |  | import router from "@/router"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const useUserStore = defineStore('user', { | 
|---|
|  |  |  | state: (): UserState => ({ | 
|---|
|  |  |  | name: undefined, | 
|---|
|  |  |  | avatar: undefined, | 
|---|
|  |  |  | job: undefined, | 
|---|
|  |  |  | organization: undefined, | 
|---|
|  |  |  | location: undefined, | 
|---|
|  |  |  | email: undefined, | 
|---|
|  |  |  | introduction: undefined, | 
|---|
|  |  |  | personalWebsite: undefined, | 
|---|
|  |  |  | jobName: undefined, | 
|---|
|  |  |  | organizationName: undefined, | 
|---|
|  |  |  | locationName: undefined, | 
|---|
|  |  |  | phone: undefined, | 
|---|
|  |  |  | registrationDate: undefined, | 
|---|
|  |  |  | accountId: undefined, | 
|---|
|  |  |  | certification: undefined, | 
|---|
|  |  |  | role: '', | 
|---|
|  |  |  | resources:undefined, | 
|---|
|  |  |  | hrefUrl:undefined | 
|---|
|  |  |  | }), | 
|---|
|  |  |  |  | 
|---|
|  |  |  | getters: { | 
|---|
|  |  |  | userInfo(state: UserState): UserState { | 
|---|
|  |  |  | return { ...state }; | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | }, | 
|---|
|  |  |  |  | 
|---|
|  |  |  | actions: { | 
|---|
|  |  |  | switchRoles() { | 
|---|
|  |  |  | return new Promise((resolve) => { | 
|---|
|  |  |  | this.role = this.role === 'user' ? 'admin' : 'user'; | 
|---|
|  |  |  | resolve(this.role); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // Set user's information | 
|---|
|  |  |  | setInfo(partial: Partial<UserState>) { | 
|---|
|  |  |  | this.$patch(partial); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Reset user's information | 
|---|
|  |  |  | resetInfo() { | 
|---|
|  |  |  | clearUserResources() | 
|---|
|  |  |  | this.$reset(); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Get user's information | 
|---|
|  |  |  | async info() { | 
|---|
|  |  |  | const res = await getUserInfo(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | this.setInfo(res.data); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Login | 
|---|
|  |  |  | async login(loginForm: LoginData):string { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | const res = await userLogin(loginForm); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | setToken(res.data.access_token); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const userInfo = { | 
|---|
|  |  |  | avatar: res.data.avatar, | 
|---|
|  |  |  | name: res.data.userName, | 
|---|
|  |  |  | email: res.data.email, | 
|---|
|  |  |  | role: res.data.roles[0].roleKey, | 
|---|
|  |  |  | }; | 
|---|
|  |  |  | this.name=res.data.userName | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(res.data?.roles.length>0) | 
|---|
|  |  |  | //遍历roles | 
|---|
|  |  |  | for (const r of res.data.roles) { | 
|---|
|  |  |  | if (!(this.resources)) { | 
|---|
|  |  |  | this.resources = []; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.resources = this.resources.concat(r.resources); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | setUserInfo(JSON.stringify(userInfo)); | 
|---|
|  |  |  | setUserResources(JSON.stringify(this.resources)) | 
|---|
|  |  |  | for (const r of this.resources) { | 
|---|
|  |  |  | if (r.menuType == 0) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return r.component | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (err) { | 
|---|
|  |  |  | clearToken(); | 
|---|
|  |  |  | throw err; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | logoutCallBack() { | 
|---|
|  |  |  | const appStore = useAppStore(); | 
|---|
|  |  |  | this.resetInfo(); | 
|---|
|  |  |  | clearToken(); | 
|---|
|  |  |  | removeRouteListener(); | 
|---|
|  |  |  | appStore.clearServerMenu(); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // Logout | 
|---|
|  |  |  | async logout() { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | await userLogout(); | 
|---|
|  |  |  | } finally { | 
|---|
|  |  |  | router.push({ | 
|---|
|  |  |  | name: "login", | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | this.logoutCallBack(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | getHreFurl(url: string) { | 
|---|
|  |  |  | this.hrefUrl=url | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | }); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | export default useUserStore; | 
|---|