vue3+ts使用pinia存储用户信息,并进行权限管理

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管理用户的角色和权限

// 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));
}

/**
 * 获取用户的角色信息
 * @param userStore 登录的用户信息
 * @returns 
 */
export function getUserRoles(userStore):string[] {
  return userStore.getUser().roles
}

/**
 *  获取用户的权限信息
 * @param userStore 登录的用户信息
 */
export function getUserPermissions(userStore):string[]{

  return userStore.getUser().permissions

}

/**
 * 是否登录
 * @param userStore 登录的用户信息
 * @returns 
 */
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)) {
    // 如果需要特定角色但用户角色不匹配,则跳转到 403 页面
    // router.push({ name: 'Forbidden' });
    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
        // sessionStorage.setItem('isLoggedIn', 'true')
        userStore.setUser(userinfo)
        //管理员去dataoverview,非管理员去occurpants
        if (userStore.getUser().roles.some((item) => item.includes(':admin'))) {
          router.push('/dataoverview')
        } else {
          router.push('/occurpants')
        }
      }
    })
  }
}
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3是Vue.js的下一个主要版本,它引入了一些功能和改进,以提高性能和开发体验。而TypeScript(TS)是一种强类型的JavaScript扩展,它添加了静态类型检查等功能。Pinia是一个以Composition API为基础的状态管理库,它与Vue3紧密集成在一起。而Vite是一种快速的构建工具,特别适用于Vue3的开发和构建。 在具体实现登录功能时,可以按照以下步骤进行: 1. 首先,需要安装Vue3、TypeScript、Pinia和Vite。可以通过npm或yarn等包管理工具进行安装。 2. 创建一个新的Vue3项目,并设置使用TypeScript。 3. 在项目的入口文件中引入VuePinia和创建Pinia实例。 4. 在Pinia实例中定义一个用于存储登录信息的状态。 5. 创建一个登录组件,在组件中定义一个表单,用于输入用户名和密码。 6. 在组件中引入定义好的Pinia实例,并使用`useStore`函数获取存储登录信息的状态。 7. 在组件的`methods`中,编写处理登录功能的方法,验证用户名和密码是否正确。 8. 在组件的模板中,使用v-model指令将输入框与组件内的数据绑定,并绑定登录按钮的点击事件。 9. 在App组件中引入登录组件,并将其渲染到页面上。 10. 运行项目,在浏览器中打开页面,即可看到登录表单。 11. 输入正确的用户名和密码,点击登录按钮,触发登录方法,根据验证结果显示相应的提示信息。 通过以上步骤,可以实现一个基本的登录功能。使用Vue3、TypeScript、Pinia和Vite可以让开发过程更加高效和可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值