vue 实现用户登录验证+权限管理+动态路由

vue 实现用户登录验证+权限管理+动态路由

近期要实现一个公安偷窃案件管理系统的登陆功能,搜遍网上发现没有能直接copy的代码,只好自己摸索踩坑,好死不死终于脱坑,这边把实现过程尽可能详细复现一遍,就不展开原理说明(毕竟我也不会),以下包含用户登录验证+权限管理+动态路由等功能。

一、技术栈

vue+vuex+vue-router+ant-design-vue+axios+mockjs2

二、新建项目

前提条件:在个人电脑上安装好nodejs(我的是v12.18.3)之后,利用nodejs自带的npm安装好vue(我的是vue/cli 4.5.4),再在命令行中通过以下指令在指定目录下按装脚手vue-cli

npm install -g @vue/cli-init

新建自定义项目

vue init webpack your-project

由于代码检查、测试之类的功能(ESlint, unit tests, e2e tests)目前对我还不是必须的,所以我都没有选择安装,整个项目的配置项如下:

wi4njU.png

在开始Coding前,在项目根目录下好项目的依赖包:

cd your-project
npm i ant-design-vue axios lodash mockjs2 nprogress vuex store

为避免版本问题,把我个人包安装之后的package.json中的dependencies贴出来:

"dependencies": {
    "ant-design-vue": "^1.6.5",
    "axios": "^0.20.0",
    "core-js": "^3.6.5",
    "lodash": "^4.17.20",
    "mockjs2": "^1.0.8",
    "nprogress": "^0.2.0",
    "store": "^2.0.12",
    "vue": "^2.6.11",
    "vue-router": "^3.2.0",
    "vuex": "^3.4.0"
  },

三、功能实现

先讲思路,让大伙有个大概的印象,不至于看代码云里雾里。

  1. 我们将储存在将storage中的token作为用户是否登录的标志,如果当前storage中有token,表明当前系统已被登录
  2. 将系统所有页面分为两类,需要登录的Home.vue,不需要登录的Login.vue
  3. 前端每次跳转路由时,做以下判断:
    • 前往登录页面时
      • 如果已登录过,需要先注销退出并且清除token再跳转
      • 如果没有登录,直接跳转
        • 验证用户输入的用户名和密码,如果成功,往storage中填入token
    • 前往非登录页面时
      • 用户无需登录就能访问的页面(如注册、找回密码、访客模式等情况)
        • 直接跳转
      • 用户需要登录才能访问的页面
        • 如果用户还没登陆
          • 跳向登录页
        • 如果用户已经登陆
          • 如果用户拥有查看该页面的权限,直接跳转
          • 如果用户没有查看该页面的权限,弹出无权限提醒,跳转到登陆页

接下来从技术栈的角度补充几点:

  1. vue-routerbeforeEach方法中实现以上逻辑,判断前端跳转去向;
  2. 出于系统简单考虑,不引入后端,用mockjs2模拟的用户信息作为拦截axios发起的服务请求响应;
  3. 通过Vuex.StoreuserNameuserRole的状态管理;

贴上项目目录结构图(src):

src
	api
		login.js 		//请求接口
	directives
		auth.js			//自定义的权限管理指令
	mock
		service
			auth.js		//模拟用户登录数据
		util.js			//辅助生成数据
	request
		http.js			//axios请求、响应、异常拦截器
	router
		index.js		//路由管理
	store
		module
			user.js		//userName,userRole状态管理
		index.js		//vuex全局配置
		mutation-types.js//状态类型定义
	util
		auth.js			//路由跳转时的权限判断
	views
		User
			Login.vue	//登录页面
		Main
			Home.vue	//登录后的Home页面
			AdminPage.vue // 登录后管理员才能查看的页面
		403.Vue			//无权限提醒页面
	App.vue				//系统全局页面
	main.js				//系统全局包管理

接下来给大伙无脑贴几个主要代码

main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import antd from 'ant-design-vue'
import Auth from './directives/auth'
Vue.config.productionTip = 
  • 13
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 抱歉,由于提供完整的代码涉及到多个文件和组件,无法在此回答。不过,我可以为您提供一个基本的代码框架和思路: 1. 在 Spring Boot 中创建一个 REST API 服务,用于获取动态路由信息并返回给前端。可以使用 Spring Security 管理权限。 2. 在前端使用 Vue.js 和 ElementUI 创建页面,使用 Vue Router 管理路由,包括静态路由和动态路由。 3. 在 Vue.js 中,使用 axios 发送请求到后端获取动态路由信息,并将其添加到路由配置中。 4. 在 ElementUI 中,可以使用菜单组件和面包屑组件展示路由信息,方便用户导航。 需要注意的是,动态路由实现需要前后端共同配合,后端提供动态路由信息接口,前端调用接口并根据返回结果动态生成路由。由于每个项目的实现细节和逻辑都可能不同,因此需要具体情况具体分析,这里提供的只是一个大致的思路和框架。 ### 回答2: Vue + ElementUI + SpringBoot + MySQL 实现动态路由的全部代码示例如下: 1. Vue 前端代码: ```javascript // main.js import Vue from 'vue' import App from './App.vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import router from './router' // 导入路由配置 import axios from 'axios' Vue.config.productionTip = false Vue.use(ElementUI) Vue.prototype.$axios = axios new Vue({ router, render: h => h(App) }).$mount('#app') ``` ```html <!-- App.vue --> <template> <div id="app"> <router-view></router-view> </div> </template> <script> export default { name: 'App' } </script> ``` ```javascript // router.js import Vue from 'vue' import VueRouter from 'vue-router' import axios from 'axios' import { Message } from 'element-ui' Vue.use(VueRouter) const routes = [ { path: '/', name: 'Home', component: () => import('@/views/Home.vue') }, // 其他路由配置... ] const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) // 动态路由获取示例 router.beforeEach((to, from, next) => { if (to.meta.requiresAuth) { // 路由需要权限验证 axios.get('/api/checkAuth').then(response => { if (response.data.success) { next() } else { Message.error('需要登录') next('/login') } }) } else { // 其他路由直接放行 next() } }) export default router ``` 2. SpringBoot 后端代码: ```java // AuthController.java @RestController @RequestMapping("/api") public class AuthController { @GetMapping("/checkAuth") public ResponseEntity<?> checkAuth() { // 检查权限的逻辑 // 返回一个标志,表示是否有权限 return ResponseEntity.ok().body(new ApiResponse(true, "权限验证通过")); } } ``` 3. MySQL 数据库表设计: ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `user_role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `role_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `FK_user_role_user` (`user_id`), KEY `FK_user_role_role` (`role_id`), CONSTRAINT `FK_user_role_role` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`), CONSTRAINT `FK_user_role_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 以上是基于 Vue、ElementUI、SpringBoot 和 MySQL 实现动态路由的一个简单示例代码。具体的实现逻辑和业务需求可以根据实际情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值