import { defineStore } from 'pinia'; import { api } from 'boot/axios'; import { router } from 'src/router'; import { IDomainInfo } from '../types/ActionTypes'; import { jwtDecode } from "jwt-decode"; export interface IUserState { token?: string; returnUrl: string; currentDomain: IDomainInfo; LeftDrawer: boolean; userId?:string; } export const useAuthStore = defineStore('auth', { state: (): IUserState => ({ token: '', returnUrl: '', LeftDrawer: false, currentDomain: {} as IDomainInfo, userId:'' }), getters: { toggleLeftDrawer(): boolean { return this.LeftDrawer; }, }, actions: { toggleLeftMenu() { this.LeftDrawer = !this.LeftDrawer; }, async login(username: string, password: string) { const params = new URLSearchParams(); params.append('username', username); params.append('password', password); try { const result = await api.post(`api/token`, params); console.info(result); this.token = result.data.access_token; this.userId=jwtDecode(result.data.access_token).sub api.defaults.headers['Authorization'] = 'Bearer ' + this.token; this.currentDomain = await this.getCurrentDomain(); this.router.push(this.returnUrl || '/'); return true; } catch (e) { console.error(e); return false; } }, async getCurrentDomain(): Promise { const activedomain = await api.get(`api/activedomain`); return { id: activedomain.data.id, domainName: activedomain.data.name, kintoneUrl: activedomain.data.url, }; }, async getUserDomains(): Promise { const resp = await api.get(`api/domain`); const domains = resp.data as any[]; return domains.map((data) => ({ id: data.id, domainName: data.name, kintoneUrl: data.url, })); }, logout() { this.token = ''; this.currentDomain = {} as IDomainInfo; // 清空当前域 router.push('/login'); }, async setCurrentDomain(domain: IDomainInfo) { if (domain.id === this.currentDomain.id) { return; } await api.put(`api/activedomain/${domain.id}`); this.currentDomain = domain; }, }, persist: { afterRestore: (ctx) => { api.defaults.headers['Authorization'] = 'Bearer ' + ctx.store.token; } }, });