1、先在vue3项目中下载pinia
npm install pinia
2、main.ts中添加pinia
import { createPinia } from 'pinia'
const pinia = createPinia();
app.use(router)
app.use(pinia)
app.mount('#app')
3、创建user.ts对登录用户进行管理(UserInfo为自定义对象)
import { defineStore } from 'pinia'
import { useStorage } from '@vueuse/core'
import { ref, reactive, onMounted } from 'vue'
import type {UserInfo} from '@/model/projectmodel'
export const useUserStore = defineStore('user', {
state: () => ({
user: {
id:"",
username:"",
password: "",
salt: "",
roles: [],
permissions: []
}
}),
actions: {
setUser(user:UserInfo) {
this.user = user;
},
getUser() {
return this.user;
}
}
});
4、创建permissions.ts管理用户的角色和权限
import type{ RouteLocationNormalized,NavigationGuardNext } from 'vue-router';
import { useUserStore } from '@/router/user';
import type {UserInfo} from '@/model/projectmodel'
export function hasRoles(userRoles: string[], requiredRoles: string[]): boolean {
if (requiredRoles == undefined || requiredRoles.length == 0){
return true
}
if (userRoles.length == 0){
return false
}
return requiredRoles.some(role => userRoles.includes(role));
}
export function hasPermissions(userPermissions: string[], requiredPermissions: string[]): boolean {
return requiredPermissions.every(permission => userPermissions.includes(permission));
}
export function getUserRoles(userStore):string[] {
return userStore.getUser().roles
}
export function getUserPermissions(userStore):string[]{
return userStore.getUser().permissions
}
export function isLoggedIn(userStore){
return userStore.getUser().id != "" ? true : false
}
export function routeGuard(to: RouteLocationNormalized, from: RouteLocationNormalized,next:NavigationGuardNext): void {
const userStore = useUserStore()
const requiresAuth = to.meta.requiresAuth;
const userRoles = getUserRoles(userStore);
if (to.path === '/Login' ){
next();
return;
}
if ( !isLoggedIn(userStore)) {
next('/Login')
}else if (to.path === '/NoPermission'){
next();
return;
}else if (!hasRoles(userRoles, to.meta.requiredRoles)) {
next('/NoPermission')
}else {
next();
}
}
to.meta.requiresAuth;的值来源于router文件夹的index.ts的路由配置:
{
path: '/projectview',
name: 'projectview',
component: projectview,
meta: {
requireAuth: true,
requiredRoles: ['admin', 'editor'],
}
},
5、在router的index.ts中调用4步骤配置的routeGuard
router.beforeEach(routeGuard)
export default router
6、登录的时候把用户信息放入userStore
function signIn() {
if (pageData.user.username == '' || pageData.user.password == '') {
message.warn('请填写用户名或密码!')
} else {
loginn(pageData.user).then((loginResult) => {
if (loginResult.data.code == 500) {
message.warn(loginResult.data.msg)
} else if (loginResult.data.code == 200) {
userinfo = loginResult.data.data
userStore.setUser(userinfo)
if (userStore.getUser().roles.some((item) => item.includes(':admin'))) {
router.push('/dataoverview')
} else {
router.push('/occurpants')
}
}
})
}
}