Vue与React分别实现登录拦截【详细例子+讲解】

news2024/9/23 5:29:21

文章标题

  • 一、Vue实现登录拦截
    • 1-1、 效果展示
    • 1-2 代码展示
      • 1-2-1 router.js
      • 1-2-2 store文件夹下
        • 1-2-2-1 state.js
        • 1-2-2-2 index.js
        • 1-2-2-3 mutation.js
      • 1-2-3 main.js【实现登录拦截的关键---全局路由守卫】
      • 1-2-4 pages下的login.vue
    • 1-3 总结
  • 二、 Vue项目功能简介
    • 2-1 功能
    • 2-2 查看项目
  • 三、 React 路由登录和用户身份鉴权
    • 3-1 项目简单介绍
      • 3-1-1 展示
      • 3-1-2 代码结构+思路展示
        • 3-1-2-1 项目目录:
        • 3-1-2-2 登录逻辑
  • 四、 在github上fork与star该项目
      • 4-2 本地仓库安装
      • 4-3 本地跑项目【有node环境】

一、Vue实现登录拦截

点击查看项目全貌

1-1、 效果展示

密码账号没有添加强验证,地址栏不可以直接通过修改路径跳转页面,必须成功登录
请添加图片描述

1-2 代码展示

1-2-1 router.js

import Vue from "vue"
import VueRouter from "vue-router"

Vue.use(VueRouter)

const router = new VueRouter({
    mode: "history",
    base: "/",
    routes: [
        {
            path: "/login",
            name: "login",
            component: () => import("./pages/login.vue")
        },
        {
            path: "/",
            name: "index",
            component: () => import("./pages/index.vue")
        }
    ]
})

export default router

1-2-2 store文件夹下

  • vue多级路由跳转+传参+栗子详解【如何使用路由守卫】
  • vue路由详解【多级路由+路由守卫】

1-2-2-1 state.js

state ---- 数据仓库

  • state是比较强大的json,用来存储数据
export default {
    userInfo: "",
}

1-2-2-2 index.js

import Vue from "vue"
import Vuex from "vuex"
import state from "./state"
import mutations from "./mutations"
import getters from "./getters"
import actions from "./actions"

Vue.use(Vuex)

const store = new Vuex.Store({
    state,
    getters,
    actions,
    mutations
})

export default store

1-2-2-3 mutation.js

mutation ---- 用来修改数据的

  • 为什么不能直接实例化state,然后直接修改state的数据
    • 通过commit一个mutation,然后通过mutation传入state再对state进行修改
  • 同步的
export default {
	login(state, v) {
		state.userTnfo = v
	}
}

1-2-3 main.js【实现登录拦截的关键—全局路由守卫】

1.引入store
import store from "./store";
2. 控制未登录之前不能访问其他页面

router.beforeEach((to,from, next) => {
	if(store.state.userInfo || to.path === "/login"){
		next()
	} else {
		next({
			path: "/login"
		})
	}
)

1-2-4 pages下的login.vue

<template>
    <div class="login">
        <p class="login-title">
            登陆权限
        </p>
        <div class="section">
            <input
                class="section-input"
                v-model="form.account"
                placeholder-class="input-holder"
                placeholder="请输入您的账号"
            />
        </div>
        <div class="section">
            <input
                class="section-input"
                type="password"
                v-model="form.password"
                placeholder-class="input-holder"
                placeholder="请输入您的密码"
            />
        </div>
        <button class="btn" @click="login">登录</button>


    </div>
</template>
<script>
import store from "../store";

export default {
    data() {
        return {
            isHidden: false,
            isPassword: true,
            logs: [],
            form: {
                account: "",
                password: ""
            }
        };
    },
    created() {},
    mounted() {},
    methods: {
        login() {
            if (!this.form.account || !this.form.password) {
                alert("请填写账号密码");
                return false;
            }
            const that = this;
            setTimeout(() => {
                store.commit("login", {
                    account: that.form.account,
                    password: that.form.password
                });
                that.$router.push("./");
            }, 500);
        }
    }
};
</script>

<style lang="less">
.login {
    position: relative;
    top: 0;
    left: 0;
    padding: 0 45px;
    p {
        text-align: center;
    }
    &-title {
        color: #111111;
        font-size: 36px;
        padding: 40px 0 30px;

    }
    .section {
        &-input {
            width: 100%;
            height: auto;
            border: none;
            margin-bottom: 30px;
            outline: none;
            font-size: 16px;
            line-height: 1.6;
            border-bottom: 1px solid red;
        }
        .input-holder {
            color: #777777;
            font-size: 16px;
        }
    }
    .btn {
        width: 100%;
        height: auto;
        color: #fff;
        background: #373737;
        margin: 10px 0 20px;
        padding: 15px;
        box-sizing: border-box;
        border-radius: 5px;
        font-size: 16px;
    }
    .btn-primary {
        color: #373737;
        background: #fff;
    }
    .login-text {
        position: fixed;
        left: 0;
        bottom: 60px;
        width: 100%;
        height: auto;
        font-size: 12px;
        color: #777777;
        text-align: center;
    }
}

</style>

1-3 总结

  1. 创建store文件夹,进行初始化
  2. 在 main.js 中创建全局的导航守卫中,拿取到这个实例 。通过判断$store.state.userInfo来守卫导航
    • next()
    • 或者next({path: '/login'})
  3. 在login组件中通过store.commit提交userInfo数据

二、 Vue项目功能简介

项目地址: 放置在github,点击此处

2-1 功能

  1. 在main.js中配置全局路由守卫,控制用户登录路由权限

    • 没有登陆时,路由无法跳转
  2. index与userCenter界面共享$state.userStatus$state.vipLevel状态值

    • 【Vuex 的 详细讲解 】与【count++的案例实现】
    • 【Vue十三】-- Vuex详细介绍
  3. 充值不同数额,变成$state.vipLevel等级的会员,观看对应课程

2-2 查看项目

  1. 点击此处

  2. 在这里插入图片描述

在这里插入图片描述

三、 React 路由登录和用户身份鉴权

3-1 项目简单介绍

3-1-1 展示

项目在线查看

  1. 效果图:
    请添加图片描述

3-1-2 代码结构+思路展示

3-1-2-1 项目目录:

  1. 安装依赖: yarn add react-router-dom

  2. 向React中添加路由

import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import MainRouter from "./page/router";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<MainRouter />);

=============================================================================
import { HashRouter, Redirect, Route, Switch } from "react-router-dom";
import routerConfig from "./config";
import { getToken } from "../../utils/token";

const PrivateRoute = (props) => {
	const { routerConfig, location } = props;
	const { pathname } = location;
	const isLogin = JSON.parse(getToken()); // 判断是否登录
	const currentRoute = routerConfig.find((item) => item.path === pathname); // 找到路由对应的组件

	/* 这些if eles 部分可以省略,只是为了直观一点 */
	if (isLogin) {
		/* 已经登录,再次进登录页面,就让它跳转到首页 */
		if (pathname === "/login") {
			return <Redirect to={"/"} />;
		} else {
			if (currentRoute) {
				/* 登录成功后,访问非登录页面,路由匹配的上 */
				if (currentRoute.super && isLogin.level <= 0) {
					// 权限不够
					return <Redirect to={"/noPermission"} />;
				}
				return <Route path={pathname} component={currentRoute.component} />;
			} else {
				/* 路由匹配不上 */
				return <Redirect to={"/404"} />;
			}
		}
	} else {
		/* 非登录状态 */
		if (currentRoute) {
			if (currentRoute.auth) {
				/* 可以匹配到路由,但是访问这个页面需要登录 */
				return <Redirect to={"/login"} />;
			} else {
				/* 可以匹配到路由, 但是不需要登录, 就可以直接访问了 */
				return <Route path={pathname} component={currentRoute.component} />;
			}
		} else {
			/* 匹配不到路由, 直接跳转到404 */
			return <Redirect to={"/404"} />;
		}
	}
};

3-1-2-2 登录逻辑

import React from "react";
import { setToken } from "../../utils/token";

function LoginComponent(props) {
	const { history } = props;
	return (
		<div>
			<h1>Login Page</h1>
			<button
				onClick={() => {
					const LoginInfo = {
						value: "chenjiang",
						level: 0, // 标志普通管理员
					};
					setToken(JSON.stringify(LoginInfo));
					history.push("/");
				}}
			>
				管理员登录
			</button>
			<button
				onClick={() => {
					const LoginInfo = {
						value: "chenjiang",
						level: 1, // 标志超级管理员
					};
					setToken(JSON.stringify(LoginInfo));
					history.push("/");
				}}
			>
				超级管理员登录
			</button>
		</div>
	);
}
export default LoginComponent;

四、 在github上fork与star该项目

更便捷地查看案例,更清晰的理解!
打开源码点击Fork

  1. fork此项目
  • GitHub中Fork 是 服务端的代码仓库克隆(即 新克隆出来的代码仓库在远程服务端),包含了原来的仓库(即upstream repository,上游仓库)所有内容,如分支、Tag、提交。
  • 代码托管服务(如Github、BitBucket)提供了方便的完成Fork操作的功能(在仓库页面点一下Fork按钮)。这样有了一个你自己的 可以自由提交的远程仓库,然后可以通过的 Pull Request 把你的提交贡献回 原仓库。
  • 而对于原仓库Owner来说,鼓励别人Fork他的仓库,通过Pull Request 能给他的仓库做贡献,也是提升了原仓库的知名度。

在这里插入图片描述

  1. 复制自己的仓库地址在这里插入图片描述

4-2 本地仓库安装

  1. 本地新建文件夹logInToIntercept,cmd进入命令行
  2. 初始化仓库:git init
  3. 从远端仓库拉取项目的源码:git pull 上文复制的仓库地址

在这里插入图片描述

4-3 本地跑项目【有node环境】

1、安装包依赖:yarn add
2、 根据package的具体配置跑项目:yarn run serve或者yarn start
3、 浏览器打开即可: http://localhost:3000

关于git的问题:error: src refspec main does not match any

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于RBAC模型的权限控制的一整套基础开发平台,前后端分离,后端django,前端 vue+ElementUI

Django-Vue-Admin 完整代码下载地址&#xff1a;基于RBAC模型的权限控制的一整套基础开发平台 &#x1f4a1; 「关于」 我们是一群热爱代码的青年&#xff0c;在这个炙热的时代下&#xff0c;我们希望静下心来通过Code带来一点我们的色彩和颜色。 因为热爱&#xff0c;所以…

TensorFlow之过拟合与欠拟合-1

1 基本概念 过度拟合&#xff08;overfit&#xff09; 创建的模型与用于该模型的训练数据之间发生过于密切的关系&#xff0c;从而引起该模型无法对新数据进行准确的预测。正则化&#xff08;Regularization&#xff09;策略可以减少过度拟合&#xff0c;或者使用大数据量、多…

考研数学660刷题记录

&#x1f422;&#x1f422; 基本概念-基本理论-基本方法 &#x1f422;&#x1f422; 660刷题记录 二轮复刷标志 ⭐&#xff1a;掌握不熟练 ⭐⭐&#xff1a;是基本方法的组合&#xff0c;但没解出来 ⭐⭐⭐&#xff1a;很难想到这种破局的手段 序号①、②&#xff1a;表示多…

【阶段一】Python快速入门02篇:数据结构-列表

本篇的思维导图: 数据结构-列表 列表的概念 列表(list)是用来存储一组有序数据元素的数据结构,元素之间用逗号分隔。列表中的数据元素应该包括在方括号中,而且列表是可变的数据类型,一旦创建了一个列表,你可以添加、删除或者搜索列表中的元素。在方括号中的数据可以是 i…

小程序:会议OA其他页面

目录 会议管理 一&#xff0c;自定义tabs组件 二&#xff0c;会议管理 父子组件传参演示 个人中心 会议管理 一&#xff0c;自定义tabs组件 文档参考:自定义组件 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/framework/custom-co…

MacBook 与其他设备的低成本高性能数据传输方案

本篇文章分享在不使用路由器的情况下&#xff0c;使用“数据线或网线”将 MacBook 与其他设备连接在一起&#xff0c;获得更高效率的数据交换性能。 写在前面 最近考虑将 Mac 设备和其他的设备连在一起使用&#xff0c;比如之前在“廉价的家用工作站方案&#xff1a;前篇”或…

利用Python实现酒店评论的中文情感分析,含数据集

利用Python实现酒店评论的情感分析 完整代码下载地址&#xff1a;利用Python实现酒店评论的中文情感分析 情感极性分析&#xff0c;即情感分类&#xff0c;对带有主观情感色彩的文本进行分析、归纳。情感极性分析主要有两种分类方法&#xff1a;基于情感知识的方法和基于机器学…

抽象类和接口1

目录 &#x1f324;️抽象类概念 &#x1f324;️抽象类语法 &#x1f324;️抽象类的作用 ⛅接口的概念 ⛅接口的语法 ⛅接口的使用 ⛅接口的特性 ....... &#x1f324;️抽象类概念 在面向对象的概念中&#xff0c;所有对象都是通过类来描述的&#xff0c;但并不是所有的…

上手华为鸿蒙手表gt系列从准备到发布

文章目录1、前期准备2、证书&签名3、编码&发布FQA:问题1&#xff1a;The graphic card OpenGL version is too old for Previewer to work. It must be 3.2 or later. Update the OpenGL driver based on the graphics card model.问题2&#xff1a;编译成HAp,报错 ent…

[UE笔记]延迟与延迟补偿

Lag即延迟&#xff0c;是多人游戏中常会出现的一个现象。lag compensation即延迟补偿&#xff0c;是一种减少延迟对游戏造成影响的技术。 Ping 多个含义 一种指令&#xff08;用于验证ip地址是否存在或者主机是否正在运行&#xff09;描述服务器需要多长时间响应客户端的输入…

OpenCV实战——使用邻居访问扫描图像

OpenCV实战——使用邻居访问扫描图像0. 前言1. 图像锐化2. 邻居访问扫描图像3. 锐化滤波器4. 完整代码相关链接0. 前言 在图像处理中&#xff0c;有时需要根据某个像素的相邻像素的值计算该像素位置的值。当这个邻域包括上一行和下一行的像素时&#xff0c;就需要同时扫描图像…

JavaScript高级 浏览器的渲染原理与JavaScript代码执行原理

浏览器的渲染原理1. 网页的解析过程2. 浏览器内核1. V8引擎3. 浏览器渲染过程1. HTML解析2. 生成CSS规则3. 构建Render Tree4. 布局&#xff08;layout&#xff09;5. 绘制&#xff08;Paint&#xff09;4. 回流和重绘解析1. 回流2. 重绘3. web 性能优化4. 合成和性能优化5. 浏…

剑指offer----C语言版----第六天

目录 1. 用栈实现队列 1.1 题目描述 1.2 栈和队列的基础知识 1.3 思路分析 2. 扩展题目——用队列实现栈 2.1 题目描述 2.2 思路分析 1. 用栈实现队列 原题链接&#xff1a; 剑指 Offer 09. 用两个栈实现队列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/…

数据结构集合框架与大O渐进表示法

作者&#xff1a;爱塔居的博客_CSDN博客-JavaSE领域博主 专栏&#xff1a;数据结构 作者简介&#xff1a;大三学生&#xff0c;希望跟大家一起进步&#xff01;&#x1f339; 博客简介&#xff1a;了解数据结构&#xff0c;学习一些关于数据结构的前置知识 文章目录 目录 文章目…

【论文翻译】Deep Learning for Multi-view Stereo via Plane Sweep: A Survey(2021)

一、论文简述 1. 第一作者&#xff1a;Qingtian Zhu 2. 发表年份&#xff1a;2021 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;MVS、深度学习、综述 5. 核心思想&#xff1a;读到的第一篇深度MVS的综述&#xff0c;总结的很好&#xff0c;内容涵盖了2021年前的研究…

遗传算法python进阶理解+论文复现(纯干货,附前人总结引路)

遗传算法python进阶理解论文复现&#xff08;纯干货&#xff0c;附前人总结引路&#xff09;一、简介和相关概念遗传算法简介相关概念介绍二、与其他智能优化算法的比较蚁群算法粒子群优化算法人工神经网络算法模拟退火算法鱼群算法三、必学知识&#xff08;站在前人的肩膀上&a…

1214. 波动数列(推公式 + DP)

题目如下&#xff1a; 思路 or 题解&#xff1a; 我们可以设&#xff1a; 第一个数为 xxx d {a, -b} 那后续的数为&#xff1a;xd1x d_1xd1​ , xd1d)2x d_1 d_)2xd1​d)​2 … … xd1d2......dn−1x d_1 d_2 ... ... d_{n - 1}xd1​d2​......dn−1​ 根据题意和上面…

(Java高级教程)第二章Java多线程常见面试题-第三节:线程安全集合类和死锁

文章目录一&#xff1a;线程安全集合类&#xff08;1&#xff09;多线程环境下使用ArrayList&#xff08;2&#xff09;多线程环境使用队列&#xff08;3&#xff09;多线程使用哈希表二&#xff1a;死锁&#xff08;1&#xff09;概念&#xff08;2&#xff09;死锁产生的四个…

(小程序)会议OA项目-首页

目录 一、FIex布局简介 1.什么是flex布局&#xff1f; 2.flex属性 学习地址&#xff1a; 3.flex弹性布局演示 ① 容器的属性 ⑴ flex-direction属性 ⑵ flex-wrap属性 ⑶ flex-flow ⑷ justify-content属性 ⑸ align-items属性 ⑹ align-content属性 二、轮播图组件m…

微信记录怎么恢复?恢复已删除微信历史记录的4种方式

恢复已删除微信历史记录的4种方式 如何在有/没有备份的情况下在 iPhone 和 Android 上恢复旧的或已删除的微信历史记录&#xff0c;如聊天对话、语音消息、照片、图片和视频剪辑&#xff1f;参考本指南&#xff0c;祝您成功恢复微信数据。 关于微信数据恢复 “说真的&#xf…