@opentiny/tiny-toolkit-pro
Version:
TinyPro Vue:开箱即用、前后端分离的 Vue 后台管理模板
150 lines (138 loc) • 3.96 kB
text/typescript
import {defineStore} from 'pinia';
import {
login as userLogin,
logout as userLogout,
LoginData,
LoginDataMail,
loginMail as userLoginMail,
updateUserInfo,
getUserInfo,
getAllUser,
} from '@/api/user';
import {getRoleMenu} from "@/api/menu";
import {clearToken, getToken, setToken} from '@/utils/auth';
import {removeRouteListener} from '@/utils/route-listener';
import {useRouter} from "vue-router";
import {getRoleInfo} from "@/api/role";
import {UserInfo, UserState} from './types';
const router = useRouter();
const useUserStore = defineStore('user', {
state: (): UserState => ({
id: '10000',
name: 'admin',
email: 'admin@no-reply.com',
department: 'Tiny-Vue-Pro',
employeeType: 'social recruitment',
job: 'Front end',
probationStart: '2021-04-19',
probationEnd: '2021-10-15',
probationDuration: '180',
protocolStart: '2021-04-19',
protocolEnd: '2024-04-19',
address: '',
status: '',
role: '',
sort: 1,
startTime: '',
endTime: '',
filterStatus: [],
filterType: [],
submit: false,
reset: false,
roleId: 0,
rolePermission: [],
}),
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() {
this.$reset();
},
// Reset filter information
resetFilterInfo() {
this.startTime = '';
this.endTime = '';
this.filterStatus = [];
this.filterType = [];
},
async updateInfo(data: UserInfo) {
const res = await updateUserInfo(data);
this.setInfo(res.data);
},
// Login
async login(loginForm: LoginData) {
try {
const res = await userLogin(loginForm);
const { token } = res.data;
setToken(token);
const userRes = await getUserInfo(loginForm.email)
const userInfo = {
id: userRes.data.id,
name:userRes.data.name,
email:userRes.data.email,
role:'',
department: userRes.data.department,
employeeType: userRes.data.employeeType,
job: '',
probationStart: userRes.data.probationStart,
probationEnd: userRes.data.probationEnd,
probationDuration: userRes.data.probationDuration,
protocolStart: userRes.data.protocolStart,
protocolEnd: userRes.data.protocolEnd,
address: userRes.data.address,
status: userRes.data.status,
roleId: 0,
rolePermission: []
}
if(userRes.data.role){
userInfo.role = userRes.data.role[0].name;
userInfo.job = userRes.data.role[0].name;
userInfo.roleId = userRes.data.role[0].id;
}
const {data} = await getRoleInfo(userInfo.roleId)
const permissions = data.permission;
for (let i = 0; i < permissions.length; i += 1) {
userInfo.rolePermission.push(permissions[i].name)
}
this.setInfo(userInfo);
} catch (err) {
clearToken();
throw err;
}
},
async loginMail(loginForm: LoginDataMail) {
try {
const res = await userLoginMail(loginForm);
setToken(res.data.token);
} catch (err) {
clearToken();
throw err;
}
},
// Logout
async logout() {
const data = {
token:getToken()
}
await userLogout(data);
this.resetInfo();
clearToken();
removeRouteListener();
},
},
});
export default useUserStore;