86 lines
2.4 KiB
TypeScript
86 lines
2.4 KiB
TypeScript
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<IDomainInfo> {
|
|
const activedomain = await api.get(`api/activedomain`);
|
|
return {
|
|
id: activedomain.data.id,
|
|
domainName: activedomain.data.name,
|
|
kintoneUrl: activedomain.data.url,
|
|
};
|
|
},
|
|
async getUserDomains(): Promise<IDomainInfo[]> {
|
|
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;
|
|
}
|
|
},
|
|
});
|