最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue中動態(tài)權限到按鈕的完整實現(xiàn)方案詳解

 更新時間:2025年03月03日 08:25:04   作者:百錦再@新空間代碼工作室  
這篇文章主要為大家詳細介紹了Vue如何在現(xiàn)有方案的基礎上加入對路由的增、刪、改、查權限控制,感興趣的小伙伴可以跟隨小編一起學習一下

為了進一步實現(xiàn)上面提到的動態(tài)路由功能,并且加入對每個路由的權限控制(即增、刪、改、查按鈕的權限控制),我們需要對數(shù)據(jù)庫、后端接口、前端的設計做一些改進和擴展。下面我將詳細描述如何在現(xiàn)有方案的基礎上加入對路由的增、刪、改、查權限控制。

一、數(shù)據(jù)庫設計擴展

為了實現(xiàn)更細粒度的權限控制,我們需要對數(shù)據(jù)庫結構做一些修改和擴展,增加對路由權限的支持。每個路由會關聯(lián)四個權限:增、刪、改、查。

1.1 修改路由表(routes)

首先,我們要擴展路由表,使其支持每個路由的增、刪、改、查權限。

CREATE TABLE routes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    path VARCHAR(255) NOT NULL,
    component VARCHAR(255) NOT NULL,
    name VARCHAR(255) NOT NULL,
    parent_id INT DEFAULT 0,
    meta JSON DEFAULT NULL, 
    is_enabled BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    -- 增、刪、改、查權限
    permission_create BOOLEAN DEFAULT FALSE,
    permission_delete BOOLEAN DEFAULT FALSE,
    permission_update BOOLEAN DEFAULT FALSE,
    permission_view BOOLEAN DEFAULT TRUE
);
  • permission_create:該路由是否具有增權限。
  • permission_delete:該路由是否具有刪權限。
  • permission_update:該路由是否具有改權限。
  • permission_view:該路由是否具有查權限。

1.2 修改角色與路由權限表(role_routes)

在role_routes表中,新增字段來存儲角色對路由的權限,分別對應增、刪、改、查。

CREATE TABLE role_routes (
    role_id INT,
    route_id INT,
    permission_create BOOLEAN DEFAULT FALSE,
    permission_delete BOOLEAN DEFAULT FALSE,
    permission_update BOOLEAN DEFAULT FALSE,
    permission_view BOOLEAN DEFAULT TRUE,
    PRIMARY KEY (role_id, route_id),
    FOREIGN KEY (role_id) REFERENCES roles(id),
    FOREIGN KEY (route_id) REFERENCES routes(id)
);

每條記錄表示角色對某個路由的權限。

二、后端接口設計

在后端,我們需要確保路由的增、刪、改、查權限在獲取路由數(shù)據(jù)時被正確地返回,并且在路由的操作(如添加、刪除、修改、查看)時進行權限控制。

2.1 修改獲取路由接口

修改/api/get_routes接口,增加對路由權限的支持,返回每個路由的增、刪、改、查權限信息。

@app.route('/api/get_routes', methods=['GET'])
def get_routes():
    role_name = request.args.get('role')
    role = Role.query.filter_by(name=role_name).first()
    
    if not role:
        return jsonify({'message': 'Role not found'}), 404
    
    routes = db.session.query(Route).join(RoleRoute).filter(RoleRoute.role_id == role.id).all()
    routes_data = []
    
    for route in routes:
        role_route = RoleRoute.query.filter_by(role_id=role.id, route_id=route.id).first()
        routes_data.append({
            'path': route.path,
            'component': route.component,
            'name': route.name,
            'meta': route.meta,
            'permissions': {
                'create': role_route.permission_create,
                'delete': role_route.permission_delete,
                'update': role_route.permission_update,
                'view': role_route.permission_view
            }
        })
    
    return jsonify(routes_data)

在這個接口中,我們通過RoleRoute表來獲取每個角色對應的路由權限,并將這些權限一起返回。

2.2 添加路由權限的接口

我們還需要提供一個接口來修改路由權限(即為角色設置增、刪、改、查權限)。

@app.route('/api/set_route_permissions', methods=['POST'])
def set_route_permissions():
    data = request.json
    role_id = data['role_id']
    route_id = data['route_id']
    permission_create = data['permission_create']
    permission_delete = data['permission_delete']
    permission_update = data['permission_update']
    permission_view = data['permission_view']

    role_route = RoleRoute.query.filter_by(role_id=role_id, route_id=route_id).first()

    if not role_route:
        role_route = RoleRoute(role_id=role_id, route_id=route_id)
        db.session.add(role_route)

    role_route.permission_create = permission_create
    role_route.permission_delete = permission_delete
    role_route.permission_update = permission_update
    role_route.permission_view = permission_view
    
    db.session.commit()

    return jsonify({'message': 'Permissions updated successfully'})

該接口接收角色ID、路由ID以及增、刪、改、查權限的設置,并更新數(shù)據(jù)庫中的權限數(shù)據(jù)。

三、前端實現(xiàn)

前端需要根據(jù)從后端接口獲取的路由信息和權限數(shù)據(jù),動態(tài)生成路由,并根據(jù)權限來控制不同路由下按鈕的顯示與操作權限。

3.1 動態(tài)生成路由

前端的路由配置需要動態(tài)加載,并在路由生成時判斷當前用戶對該路由的權限。

在router/index.js中,我們可以根據(jù)權限信息來配置動態(tài)路由。

import Vue from 'vue';
import Router from 'vue-router';
import store from '../store';

Vue.use(Router);

const router = new Router({
  routes: []
});

function generateRoutes(routes) {
  const routeArray = [];
  routes.forEach(route => {
    const routeConfig = {
      path: route.path,
      name: route.name,
      component: () => import(`@/views/${route.component}.vue`), // 動態(tài)加載組件
      meta: route.meta,
      permissions: route.permissions // 保存權限數(shù)據(jù)
    };

    if (route.children && route.children.length > 0) {
      routeConfig.children = generateRoutes(route.children);
    }

    routeArray.push(routeConfig);
  });
  return routeArray;
}

router.beforeEach(async (to, from, next) => {
  if (!store.state.routes.length) {
    const res = await store.dispatch('getRoutes');
    const routes = generateRoutes(res);
    routes.forEach(route => {
      router.addRoute(route);
    });
    next({ ...to, replace: true });
  } else {
    next();
  }
});

export default router;

3.2 根據(jù)權限動態(tài)顯示按鈕

前端頁面上的操作按鈕(如增、刪、改、查)需要根據(jù)用戶對路由的權限來進行顯示和隱藏。假設每個頁面都有這些按鈕,我們可以使用v-if指令來根據(jù)權限控制顯示與否。

<template>
  <div>
    <button v-if="hasCreatePermission">新增</button>
    <button v-if="hasUpdatePermission">編輯</button>
    <button v-if="hasDeletePermission">刪除</button>
    <button v-if="hasViewPermission">查看</button>
  </div>
</template>

<script>
export default {
  computed: {
    hasCreatePermission() {
      return this.$store.state.userPermissions.create;
    },
    hasUpdatePermission() {
      return this.$store.state.userPermissions.update;
    },
    hasDeletePermission() {
      return this.$store.state.userPermissions.delete;
    },
    hasViewPermission() {
      return this.$store.state.userPermissions.view;
    }
  },
  created() {
    this.setPermissions(this.$route.meta.permissions);
  },
  methods: {
    setPermissions(permissions) {
      this.$store.commit('setUserPermissions', permissions);
    }
  }
}
</script>

在這個組件中,我們使用v-if指令根據(jù)權限來顯示對應的按鈕。hasCreatePermission、hasUpdatePermission等計算屬性返回當前用戶對該頁面的權限,setPermissions方法會在頁面加載時設置當前用戶的權限。

3.3 在Vuex中存儲用戶權限

在Vuex中,我們可以存儲用戶的權限數(shù)據(jù),并在不同的組件中訪問。

// store.js
export default new Vuex.Store({
  state: {
    userPermissions: {
      create: false,
      delete: false,
      update: false,
      view: true
    }
  },
  mutations: {
    setUserPermissions(state, permissions) {
      state.userPermissions = permissions;
    }
  },
  actions: {
    async getRoutes({ commit }) {
      const res = await axios.get('/api/get_routes', { params: { role: 'admin' } });
      commit('setRoutes', res.data);
      return res.data;
    }
  }
});

四、總結

通過以上的設計和實現(xiàn),我們能夠在前端根據(jù)路由和權限動態(tài)生成路由,并且為每個路由設置增、刪、改、查等操作的權限。后端負責根據(jù)用戶的角色返回對應的權限信息,前端通過vue-router和vuex管理動態(tài)路由和用戶權限。通過這種方式,系統(tǒng)可以靈活地根據(jù)角色和權限來展示不同的功能,并且有效地控制用戶對數(shù)據(jù)的操作權限。

這種設計方式非常適合復雜權限管理的系統(tǒng),能夠提供細粒度的權限控制,并且可以隨著業(yè)務需求的變化靈活調(diào)整。

到此這篇關于Vue中動態(tài)權限到按鈕的完整實現(xiàn)方案詳解的文章就介紹到這了,更多相關Vue動態(tài)權限內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue3+ts封裝axios實例以及解決跨域問題

    vue3+ts封裝axios實例以及解決跨域問題

    在前端開發(fā)中,使用axios進行數(shù)據(jù)請求是常見的做法,封裝axios可以統(tǒng)一請求頭處理、方便接口管理、配置多攔截器等,提高代碼的可維護性和重用性,本文詳細記錄了axios的封裝過程,包括安裝、配置跨域處理、接口管理文件的創(chuàng)建等
    2024-09-09
  • 在Vue項目中配置postcss-preset-env的兩種主流方案

    在Vue項目中配置postcss-preset-env的兩種主流方案

    在 Vue 項目中配置 postcss-preset-env,根據(jù)你使用的構建工具不同,配置方式也有所區(qū)別,以下是 Vue CLI (Webpack) 和 Vite 兩種主流方案的詳細配置,需要的朋友可以參考下
    2026-04-04
  • vue獲取DOM元素并設置屬性的兩種實現(xiàn)方法

    vue獲取DOM元素并設置屬性的兩種實現(xiàn)方法

    下面小編就為大家?guī)硪黄獀ue獲取DOM元素并設置屬性的兩種實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 談談因Vue.js引發(fā)關于getter和setter的思考

    談談因Vue.js引發(fā)關于getter和setter的思考

    最近因為公司的新項目決定使用Vue.js來做,但在使用的過程中發(fā)現(xiàn)了一個有趣的事情,因為發(fā)現(xiàn)的這個事情展開了一些對于getter和setter的思考,具體是什么下面通過這篇文章來一起看看吧,有需要的朋友們可以參考學習。
    2016-12-12
  • Vue2實現(xiàn)Office文檔(docx、xlsx、pdf)在線預覽功能

    Vue2實現(xiàn)Office文檔(docx、xlsx、pdf)在線預覽功能

    在現(xiàn)代的Web應用開發(fā)中,實現(xiàn)Office文檔(如docx、xlsx、pdf)的在線預覽功能是一個常見的需求,下面小編就來和大家詳細介紹一下如何使用vue2實現(xiàn)這一功能吧
    2025-05-05
  • 在VUE3中禁止網(wǎng)頁返回到上一頁的方法

    在VUE3中禁止網(wǎng)頁返回到上一頁的方法

    這篇文章主要介紹了在VUE3中如何禁止網(wǎng)頁返回到上一頁,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • Vue.js使用this.$confirm換行顯示提示信息實例

    Vue.js使用this.$confirm換行顯示提示信息實例

    在編寫Web應用時,實現(xiàn)多行文本顯示通常需要用到HTML標簽或JavaScript特定函數(shù),本文介紹了如何使用JavaScript的$createElement函數(shù)來創(chuàng)建多行文本顯示,$createElement可以創(chuàng)建任何HTML標簽,使得在JavaScript中控制HTML輸出更加靈活,通過簡單的代碼示例
    2024-10-10
  • vue全局引入scss樣式文件的過程記錄

    vue全局引入scss樣式文件的過程記錄

    css文件可以直接引入到main.js中,scss文件如果沒有scss特殊語法也可以直接引入index.js,只有scss文件中的特殊語法全局引入的時候無法顯示,所以需要特殊處理,下面這篇文章主要給大家介紹了關于vue全局引入scss樣式文件的相關資料,需要的朋友可以參考下
    2022-11-11
  • Vue彈窗的兩種實現(xiàn)方式實例詳解

    Vue彈窗的兩種實現(xiàn)方式實例詳解

    這篇文章主要介紹了Vue彈窗的兩種實現(xiàn)方式,一種使用.sync修飾符另一種使用v-model,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 詳解Vue.js分發(fā)之作用域槽

    詳解Vue.js分發(fā)之作用域槽

    本篇文章主要介紹了詳解Vue.js分發(fā)之作用域槽,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06

最新評論

连城县| 文水县| 丹阳市| 汝阳县| 化德县| 菏泽市| 茂名市| 洛宁县| 华容县| 淮南市| 自治县| 安多县| 尼玛县| 历史| 石阡县| 澄迈县| 南昌市| 惠州市| 兴城市| 八宿县| 景德镇市| 兴义市| 鄂托克旗| 罗江县| 建始县| 芮城县| 鄂托克旗| 上虞市| 休宁县| 全南县| 台州市| 安塞县| 和林格尔县| 洮南市| 馆陶县| 徐水县| 雷山县| 平南县| 潮安县| 乐清市| 长春市|