当前位置: 首页 > news >正文

贵州网站制作公司电话公司品牌宣传方案

贵州网站制作公司电话,公司品牌宣传方案,vps用什么软件做网站,武汉 开发 公司 网站建设🚀 Pinia Vue Router 权限控制(终极完整版) 一、整体设计理念 功能说明认证模式Token Role Permission动态路由后端返回,前端动态挂载超管放行超级管理员跳过所有权限校验按钮权限v-permission 指令动态标题根据路由 meta.tit…

🚀 Pinia + Vue Router 权限控制(终极完整版)


一、整体设计理念

功能说明
认证模式Token + Role + Permission
动态路由后端返回,前端动态挂载
超管放行超级管理员跳过所有权限校验
按钮权限v-permission 指令
动态标题根据路由 meta.title 自动动态设置
缓存优化Pinia 持久化,动态路由注入缓存

二、核心模块拆分

src/store/user.tspermission.tsrouter/index.tsroutes.tsutils/permission.tsdirective/permission.tsapi/user.tsviews/Layout.vueLogin.vueDashboard.vueAdmin.vueEditor.vueNotFound.vue

三、完整代码实战

1️⃣ user.ts — 用户 Store

import { defineStore } from 'pinia';export const useUserStore = defineStore('user', {state: () => ({token: '',roles: [] as string[],permissions: [] as string[],isSuperAdmin: false // 超级管理员标识}),actions: {login(token: string, roles: string[], permissions: string[]) {this.token = token;this.roles = roles;this.permissions = permissions;this.isSuperAdmin = roles.includes('super-admin');},logout() {this.token = '';this.roles = [];this.permissions = [];this.isSuperAdmin = false;}},persist: true
});

2️⃣ api/user.ts — 模拟后台接口

import type { RouteRecordRaw } from 'vue-router';export function getAsyncRoutes(): Promise<RouteRecordRaw[]> {return new Promise(resolve => {setTimeout(() => {resolve([{path: '/admin',component: () => import('@/views/Admin.vue'),meta: { title: '后台管理', roles: ['admin'], permission: 'admin:manage' }},{path: '/editor',component: () => import('@/views/Editor.vue'),meta: { title: '编辑页面', roles: ['editor'], permission: 'editor:edit' }}]);}, 300);});
}

3️⃣ permission.ts — 权限 Store

import { defineStore } from 'pinia';
import { constantRoutes } from '@/router/routes';
import type { RouteRecordRaw } from 'vue-router';
import { getAsyncRoutes } from '@/api/user';
import { useUserStore } from './user';export const usePermissionStore = defineStore('permission', {state: () => ({routes: [] as RouteRecordRaw[]}),actions: {async generateRoutes() {const userStore = useUserStore();const asyncRoutes = await getAsyncRoutes();const accessedRoutes = asyncRoutes.filter(route => {if (userStore.isSuperAdmin) return true;if (route.meta?.roles && !userStore.roles.some(role => route.meta?.roles?.includes(role))) {return false;}return true;});this.routes = constantRoutes.concat(accessedRoutes);return accessedRoutes;}}
});

4️⃣ utils/permission.ts — 按钮权限工具

import { useUserStore } from '@/store/user';export function hasPermission(permission: string): boolean {const userStore = useUserStore();return userStore.isSuperAdmin || userStore.permissions.includes(permission);
}

5️⃣ directive/permission.ts — v-permission 指令

import { Directive } from 'vue';
import { hasPermission } from '@/utils/permission';const permission: Directive = {mounted(el, binding) {const value = binding.value;if (value && !hasPermission(value)) {el.parentNode?.removeChild(el);}}
};export default permission;

全局注册:

import permission from '@/directive/permission';
app.directive('permission', permission);

使用示例:

<el-button v-permission="'admin:manage'">仅管理员按钮</el-button>

6️⃣ routes.ts — 基础路由

import type { RouteRecordRaw } from 'vue-router';export const constantRoutes: RouteRecordRaw[] = [{ path: '/login', component: () => import('@/views/Login.vue'), meta: { title: '登录' } },{path: '/',redirect: '/dashboard',component: () => import('@/views/Layout.vue'),children: [{ path: 'dashboard', component: () => import('@/views/Dashboard.vue'), meta: { title: '首页' } }]},{ path: '/:pathMatch(.*)*', component: () => import('@/views/NotFound.vue'), meta: { title: '404' } }
];

7️⃣ router/index.ts — 动态路由守卫 + 动态 Title

import { createRouter, createWebHistory } from 'vue-router';
import { constantRoutes } from './routes';
import { useUserStore } from '@/store/user';
import { usePermissionStore } from '@/store/permission';const router = createRouter({history: createWebHistory(),routes: constantRoutes
});const whiteList = ['/login'];router.beforeEach(async (to, from, next) => {const userStore = useUserStore();const permissionStore = usePermissionStore();if (to.meta?.title) {document.title = to.meta.title as string;}if (userStore.token) {if (permissionStore.routes.length === 0) {const routes = await permissionStore.generateRoutes();routes.forEach(route => router.addRoute(route));next({ ...to, replace: true });} else {next();}} else {if (whiteList.includes(to.path)) {next();} else {next('/login');}}
});export default router;

四、核心升级逻辑总结

模块升级点
超级管理员登录时 isSuperAdmin 直接放行所有路由和按钮
动态 Title每次切换路由动态修改 document.title
双重模型路由走 roles 控制,按钮走 permissions 控制

五、完整权限框架架构图

- 登录成功返回:- token- roles(角色列表)- permissions(按钮权限码)- asyncRoutes(动态路由列表)- 前端:- Pinia缓存用户信息- 动态注入路由- 路由守卫控制进入- v-permission 控制按钮显示

✅ 目前框架特点

  • 🟢 企业项目标准权限架构
  • 🟢 完整前后端配合
  • 🟢 灵活易扩展
  • 🟢 稳定性高
http://www.fp688.cn/news/153301.html

相关文章:

  • 怎样自己创网站百度公司推广
  • 上海做得好的网站建设公司浏览器打开网站
  • vbs做网站百度平台商家客服电话
  • wordpress更新以后进不去网站seo优化报告
  • 湛江网站建设公司黑帽seo技术论坛
  • 济南百度公司做网站吗全国疫情最新消息今天实时
  • 品牌微营销网站建设怎样自己制作网站
  • 什么网站是做家教的郑州seo排名公司
  • skype在网站上怎么做链接免费正能量erp软件下载
  • 营销型网站策划建设分为哪几个层次同城推广
  • 修改网站logo外贸seo软件
  • 深圳专业o2o网站设计公司网站推广优化排名
  • 做电商哪几个设计网站比较好把百度网址大全设为首页
  • 国内互动网站建设网站seo推广公司靠谱吗
  • 网站安全防黑联盟公司的网站
  • 调整百度对网站的最大天级抓取频次值seo优化排名价格
  • 医院病房建设网站营销策略有哪些方法
  • 沈阳做微网站的公司建设网站的十个步骤
  • 无锡模板网站设计公司跨境电商怎么开店铺
  • w78企业网站后台怎么做信息流推广的竞价机制是
  • 网站管理后台下载做网站的平台有哪些
  • 哈尔滨网站建设哪家有谷歌优化教程
  • 服装网站建设费用南京seo网站优化推广
  • 做防水怎么注册网站seminar
  • 怎么制作网站设计广州百度竞价托管
  • 网站建设与管理论文公司的网站制作
  • 镇江网站排名优化价格创建网站的公司
  • 一款蛋糕食品类企业手机网站源码站长统计官网
  • 建设企业功能型网站微信5000人接推广费用
  • mysql php wordpressseo文案范例