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.datauserStore.setUser(userinfo)if (userStore.getUser().roles.some((item) => item.includes(':admin'))) {router.push('/dataoverview')} else {router.push('/occurpants')}}})}
}