十六、从零搭建一个 Vue 3 后台管理系统:完整实战教程

Vue 3 作为当下最为流行的前端框架之一,凭借其简洁的 API 以及强大的性能,已然成为构建后台管理系统的首选工具。本文将一步一步地引导你从零开始搭建一个 Vue 3 后台管理系统,内容涵盖路由、权限管理、状态管理等核心功能,并且会通过实际示例助力你掌握这些技术。

一、项目初始化

(一)创建 Vue 3 项目

利用 Vue CLI 能够快速创建一个 Vue 3 项目,具体操作如下:

npm install -g @vue/cli
vue create vue3-admin

在创建项目的过程中,你可以选择 Vue 3 和 TypeScript(此步骤可选)。

(二)安装依赖

进入项目目录并安装项目所需的依赖:

cd vue3-admin
npm install vue-router@next vuex@next axios element-plus

各依赖的作用如下:

  • vue-router:主要用于路由管理。
  • vuex:用于状态管理。
  • axios:用于网络请求。
  • element-plus:是一个 UI 组件库。

二、路由管理

(一)配置路由

src/router/index.ts 文件中进行路由的配置,示例代码如下:

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';

const routes: RouteRecordRaw[] = [
    {
        path: '/',
        component: () => import('@/views/Home.vue'),
        meta: { title: '首页' },
    },
    {
        path: '/login',
        component: () => import('@/views/Login.vue'),
        meta: { title: '登录' },
    },
    {
        path: '/dashboard',
        component: () => import('@/views/Dashboard.vue'),
        meta: { title: '仪表盘', requiresAuth: true },
    },
];

const router = createRouter({
    history: createWebHistory(),
    routes,
});

export default router;

(二)路由守卫

src/router/index.ts 文件中添加路由守卫,以此实现权限控制,代码如下:

import { useStore } from 'vuex';

router.beforeEach((to, from, next) => {
    const store = useStore();
    const isAuthenticated = store.state.user.isAuthenticated;

    if (to.meta.requiresAuth && !isAuthenticated) {
        next('/login');
    } else {
        next();
    }
});

三、状态管理

(一)配置 Vuex

src/store/index.ts 文件中进行 Vuex 的配置:

import { createStore } from 'vuex';

export default createStore({
    state: {
        user: {
            isAuthenticated: false,
            username: '',
        },
    },
    mutations: {
        setUser(state, user) {
            state.user = user;
        },
    },
    actions: {
        login({ commit }, credentials) {
            // 模拟登录
            return new Promise((resolve) => {
                setTimeout(() => {
                    commit('setUser', {
                        isAuthenticated: true,
                        username: credentials.username,
                    });
                    resolve();
                }, 1000);
            });
        },
        logout({ commit }) {
            commit('setUser', {
                isAuthenticated: false,
                username: '',
            });
        },
    },
});

(二)在组件中使用 Vuex

src/views/Login.vue 组件中运用 Vuex 来管理登录状态,代码如下:

<template>
    <el-form @submit.prevent="handleLogin">
        <el-form-item label="用户名">
            <el-input v-model="username" />
        </el-form-item>
        <el-form-item label="密码">
            <el-input v-model="password" type="password" />
        </el-form-item>
        <el-button type="primary" native-type="submit">登录</el-button>
    </el-form>
</template>

<script>
import { ref } from 'vue';
import { useStore } from 'vuex';
import { useRouter } from 'vue-router';

export default {
    setup() {
        const store = useStore();
        const router = useRouter();
        const username = ref('');
        const password = ref('');

        const handleLogin = async () => {
            await store.dispatch('login', {
                username: username.value,
                password: password.value,
            });
            router.push('/dashboard');
        };

        return {
            username,
            password,
            handleLogin,
        };
    },
};
</script>

四、权限管理

(一)动态路由

依据用户权限动态加载路由,在 src/router/index.ts 文件中进行如下操作:

// src/router/index.ts
import { useStore } from 'vuex';

const dynamicRoutes: RouteRecordRaw[] = [
    {
        path: '/admin',
        component: () => import('@/views/Admin.vue'),
        meta: { title: '管理员', requiresAuth: true, requiresAdmin: true },
    },
];

router.beforeEach(async (to, from, next) => {
    const store = useStore();
    const isAuthenticated = store.state.user.isAuthenticated;
    const isAdmin = store.state.user.isAdmin;

    if (to.meta.requiresAuth && !isAuthenticated) {
        next('/login');
    } else if (to.meta.requiresAdmin && !isAdmin) {
        next('/');
    } else {
        if (isAuthenticated && !router.hasRoute('admin')) {
            dynamicRoutes.forEach((route) => router.addRoute(route));
        }
        next();
    }
});

(二)按钮权限

在组件里根据用户权限控制按钮的显示,示例代码如下:

<template>
    <el-button v-if="hasPermission('create')">创建</el-button>
</template>

<script>
import { useStore } from 'vuex';

export default {
    setup() {
        const store = useStore();
        const hasPermission = (permission) => {
            return store.state.user.permissions.includes(permission);
        };

        return {
            hasPermission,
        };
    },
};
</script>

五、网络请求

(一)封装 Axios

src/utils/request.ts 文件中对 Axios 进行封装:

import axios from 'axios';

const instance = axios.create({
    baseURL: 'https://api.example.com',
    timeout: 10000,
});

instance.interceptors.request.use((config) => {
    const token = localStorage.getItem('token');
    if (token) {
        config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
});

export default instance;

(二)在组件中使用

src/views/Dashboard.vue 组件中使用封装后的 Axios,代码如下:

<template>
    <div>
        <p>数据:{{ data }}</p>
    </div>
</template>

<script>
import request from '@/utils/request';
import { ref, onMounted } from 'vue';

export default {
    setup() {
        const data = ref(null);

        onMounted(async () => {
            const response = await request.get('/data');
            data.value = response.data;
        });

        return {
            data,
        };
    },
};
</script>

六、总结

通过对本文的学习,你已经掌握了从零搭建一个 Vue 3 后台管理系统的方法,其中涵盖了路由、权限管理、状态管理和网络请求等核心功能。下面是本文核心内容的总结:

  • 路由管理:借助 vue-router 实现路由配置和权限控制。
  • 状态管理:利用 vuex 管理用户状态和登录逻辑。
  • 权限管理:通过动态路由和按钮权限实现细粒度的权限控制。
  • 网络请求:封装 axios 实现统一的请求处理。

希望本文能够帮助你快速上手 Vue 3 后台管理系统的开发,并且在实际项目中运用这些技术。如果你有任何问题或者建议,欢迎在评论区留言讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值