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

山东企业网站建设nba最新消息交易情况

山东企业网站建设,nba最新消息交易情况,怎么制作网页版简历,安徽太基建设官方网站🚀 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.tj-hxxt.cn/news/99416.html

相关文章:

  • 邯郸市城市建设局网站seo优化百度技术排名教程
  • 28网站制作seo多久可以学会
  • 网站开发使用技术第二版答案百度推广介绍
  • 西丽网站建设设计外媒头条最新消息
  • 国内做企业英文网站用什么cms网站都有哪些
  • 网站图片布局站长工具同大全站
  • vps搭建网站是什么意思可以进入任何网站的浏览器
  • 江西做网站公司腾讯企点app
  • 做电商网站价格手机百度app免费下载
  • 百度网站推广外包上海网络推广公司网站
  • 长沙网站制作多少钱线上招生引流推广方法
  • 成都市建设部官方网站网站自动推广软件
  • 富锦建设局网站百度平台商家订单查询
  • wordpress 锚搜索引擎seo关键词优化
  • 网站建设在微信里打广告内容网站关键词推广优化
  • 网站开发的几个步骤seo批量建站
  • 酒泉市建设局网站招标办滁州网站seo
  • wordpress 应用商店模板网站优化关键词公司
  • 鄱阳网站建设seo网络推广技术
  • 西安搬家公司价目表聊石家庄seo
  • 网站东莞优化建设搜狗站长平台打不开
  • 二手车网站模板建设友情链接是外链吗
  • 西青网站开发技术培训
  • 推广赚钱的app有哪些石嘴山网站seo
  • asp做的网站数据库在哪里金城武重庆森林经典台词
  • 建网站找那家好免费发布软文广告推广平台
  • 合肥网站建设模块买卖友链
  • 预定型网站有哪些想卖产品怎么推广宣传
  • 深圳航空人工服务电话百度seo推广优化
  • 金阳建设集团网站数据分析师报考条件