vue项目创建好了并且集成了基础的后台管理系统,调用后端接口也调通了。接下来就是开发后台管理系统的其他功能了,首先就是把相关路由和一些基础工具配置一下。
vue的全局路由配置,router/index.js
代码:
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
在路由中使用
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
来实现组件的懒加载 这种配置会生产一个about.[hash].js
对于优化首屏很有帮助, 但对于内部页面会有一点损失,比较资源不会一次加载到位的。
使用 Vuex + Axios 方式进行网络请求
axios 是一个网络请求构架,官方推荐使用这种方式进行 http 的请求。
1) 在 utils 包下封装一个请求工具类 request.js
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
import request from '../utils/request';
//查询文章列表
export const fetchData = query => {
return request({
url: 'http://localhost:8080/article/getList',
method: 'get',
params: query
});
};
设置全局变量
main.js
import {createApp} from 'vue'
const app = createApp(App)
// 挂载全局
app.config.globalProperties.$http = httpRequest // ajax请求方法
使用全局变量
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
一些基础配置就好了,后面就是写接口,然后前端样式,后台主要就是列表的增删改查功能了。
在博客中查看:从零开始做网站5-前端vue项目全局路由和一些配置 - ZJBLOG
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)