前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零开始做网站5-前端vue项目全局路由和一些配置

从零开始做网站5-前端vue项目全局路由和一些配置

作者头像
sunonzj
发布2022-06-21 08:55:12
5990
发布2022-06-21 08:55:12
举报
文章被收录于专栏:zjblogzjblog

vue项目创建好了并且集成了基础的后台管理系统,调用后端接口也调通了。接下来就是开发后台管理系统的其他功能了,首先就是把相关路由和一些基础工具配置一下。

vue的全局路由配置,router/index.js

代码:

代码语言:javascript
复制
import {createRouter, createWebHashHistory, createWebHistory} from "vue-router";
import Home from "../views/admin/Home.vue";
import {authtoken} from "../api";
import {ElMessage} from "element-plus";

// 全局路由(无需嵌套上左右整体布局)
const globalRoutes = [
    {path: '/404', name: '404', meta: {title: '找不到页面'}, component: () => import (/* webpackChunkName: "404" */ '../views/common/404.vue')},
    {path: '/403', name: '403', meta: {title: '没有权限'}, component: () => import (/* webpackChunkName: "403" */ '../views/common/403.vue')},
    {path: "/login", name: "Login", meta: {title: '登录'}, component: () => import ( /* webpackChunkName: "login" */ "../views/common/Login.vue")},
    {path: '/error/:msg?', name: 'error', meta: {title: '系统错误'}, component: () => import ( "../views/common/error.vue")}
]

// 前台路由(不用登陆也能访问)
const skipLoadMenusRoutes=[
    {path: '/index', name: 'index', component: () => import (/* webpackChunkName: "index" */ "../views/index.vue"), meta: {title: '小甜崽'}},
    {path: '/blog', name: 'blog', component: () => import (/* webpackChunkName: "blog" */ "../views/blog.vue"), meta: {title: '小甜崽|生活日记'}},
     {path: '/about', name: 'about', component: () => import (/* webpackChunkName: "about" */ "../views/about.vue"), meta: {title: '小甜崽的自留地|关于我'}},
]

// 主入口路由(需嵌套上左右整体布局)
const routes = [
    {path: '/',redirect: '/index',meta: {title: 'ltBlog'}},
    {
        path: "/home",
        name: "Home",
        component: Home,
        redirect: '/dashboard',
        children: [
            {path: "/dashboard",name: "dashboard",meta: {title: '系统首页'},component: () => import ("../views/admin/Dashboard.vue")},
            {path: "/articleList",name: "articleList",meta: {title: '文章管理'},component: () => import ( /* webpackChunkName: "articleList" */ "../views/admin/ArticleList.vue")},
            {path: "/publishArticle", name: "publishArticle", meta: {title: '文章发布'}, component: () => import ( /* webpackChunkName: "publishArticle" */ "../views/admin/AddArticle.vue")},
            {path: "/moodList", name: "moodList", meta: {title: '心情说说'}, component: () => import ( /* webpackChunkName: "moodList" */ "../views/admin/Mood.vue")},
            {path: "/albumList", name: "albumList", meta: {title: '相册管理'}, component: () => import ( /* webpackChunkName: "albumList" */ "../views/admin/Album.vue")},
            {path: "/photoList", name: "photoList", meta: {title: '发布照片'}, component: () => import ( /* webpackChunkName: "photoList" */ "../views/admin/Photo.vue")},
            {path: "/fLinkList", name: "fLinkList", meta: {title: '友链管理'}, component: () => import ( /* webpackChunkName: "fLinkList" */ "../views/admin/FLink.vue")},
            {path: '/editor', name: 'editor', meta: {title: '富文本编辑器'}, component: () => import (/* webpackChunkName: "editor" */ '../views/admin/Editor.vue')}
        ]
    }
];

const router = createRouter({
    history: createWebHistory(),  //createWebHashHistory
    routes:routes.concat(globalRoutes).concat(skipLoadMenusRoutes)
});


/**
 * 动态加载菜单流程
 * 1、判断当前是否加载菜单
 * 2、出现在 globalRoutes 和 skipLoadMenusRoutes 中的路由不需要加载动态菜单。
 */
router.beforeEach((to, from, next) => {
    //输入不存在的路由则直接返回404
    if(to.matched.length === 0){
       // from.path ? next({name: from.name}) : next('/404')
        next('/404')
        return;
    }
    document.title = `${to.meta.title} | ltBlog`;
    const token = localStorage.getItem('ms_token');

    let currentRouteType = fnCurrentRouteType(to, globalRoutes)
    if (currentRouteType !== 'global') {
        currentRouteType = fnCurrentRouteType(to, skipLoadMenusRoutes)
    }
    //请求的路由在【不用登陆也能访问路由数组】中,则不用跳转到登录页
    if (currentRouteType === 'global') {
        next();
    } else {
        //如果路由为空,并且不在【不用登陆也能访问路由数组】中 则跳转到登录页
        if(!token){
            next('/login');
        }else{
            //每次跳转路由都去判断token是否有效
            authtoken().then((res) => {
                //如果token无效或者已过期 则跳转到登录页
                if(res.success === false){
                    localStorage.removeItem("ms_token");
                    ElMessage.error("登录过期,请重新登录");
                    next('/login');
                }else{
                    next();
                }
            });
        }
    }
});

/**
 * 判断当前路由类型, global: 全局路由, main: 主入口路由
 * 判断逻辑:
 *    1、如果目标路由的name 或路径 出现在 globalRoutes 参数中
 * @param {*} route 当前路由
 * @param {*} globalRoutes 路由匹配数组
 */
function fnCurrentRouteType(route, globalRoutes = []) {
    var temp = []
    for (var i = 0; i < globalRoutes.length; i++) {
        if (route.path === globalRoutes[i].path || (route.name !== undefined && route.name === globalRoutes[i].name)) {
            return 'global'
        } else if (globalRoutes[i].children && globalRoutes[i].children.length >= 1) {
            temp = temp.concat(globalRoutes[i].children)
        }
    }
    return temp.length >= 1 ? fnCurrentRouteType(route, temp) : 'Home'
}


export default router;

vue项目中 页面组件懒加载 使用webpackChunkNmae

在路由中使用 

代码语言:javascript
复制
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')

来实现组件的懒加载  这种配置会生产一个about.[hash].js

对于优化首屏很有帮助, 但对于内部页面会有一点损失,比较资源不会一次加载到位的。

使用 Vuex + Axios 方式进行网络请求

axios 是一个网络请求构架,官方推荐使用这种方式进行 http 的请求。

1) 在 utils 包下封装一个请求工具类 request.js

代码语言:javascript
复制
import axios from 'axios';
//import { MessageBox, Message } from 'element-ui'


const service = axios.create({
    // process.env.NODE_ENV === 'development' 来判断是否开发环境
    // easy-mock服务挂了,暂时不使用了
    baseURL: 'http://localhost:8080',
    timeout: 5000
});

/**
 * 请求拦截
 */
service.interceptors.request.use(
    config => {
        return config;
    },
    error => {
        console.log(error);
        return Promise.reject();
    }
);

/**
 * 响应拦截
 */
service.interceptors.response.use(
    response => {
        if (response.status === 200) {
            return response.data;
        } else {
            Promise.reject();
        }
    },
    error => {
        console.log(error);
        return Promise.reject();
    }
);

export default service;

2) 请求接口 API

在 api 文件夹下,创建一个index.js

代码语言:javascript
复制
import request from '../utils/request';

//查询文章列表
export const fetchData = query => {
    return request({
        url: 'http://localhost:8080/article/getList', 
        method: 'get',
        params: query
    });
};

设置全局变量

代码语言:javascript
复制
main.js
import {createApp} from 'vue'
const app = createApp(App)

// 挂载全局
app.config.globalProperties.$http = httpRequest // ajax请求方法

使用全局变量

代码语言:javascript
复制
import { ref, reactive, getCurrentInstance } from "vue";

const proxy = getCurrentInstance()?.appContext.config.globalProperties.$http;
proxy({
            method:'get',
            url:'/article/getList',
          }).then(res => {
            console.log(res)
            tableData.value = res;
            pageTotal.value = res.pageTotal || 50;
          })

注意:使用的是vue3.0

一些基础配置就好了,后面就是写接口,然后前端样式,后台主要就是列表的增删改查功能了。

QQ截图20220419153758.png
QQ截图20220419153758.png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档