简单的登录demo
- 使用了vue3 + vue-router(4.x) + vuex(4.x) + Element3
- 主要的功能有登录的逻辑 和 简单的登录鉴权
项目搭建
创建项目(vue3)
- 首先要确保安装最新的脚手架,如果没有安装,可按一下操作来升级:
- npm install -g npm // 升级npm 到最新的版本
- npm uninstall -g @vue/cli // 删除旧的脚手架
- npm install -g @vue/cli // 安装最新的脚手架
- 在terminal运行 vue create project-name,接着会出现下图:
安装Element3
- 官方地址: element3-ui.com/
- 安装步骤(全部导入方式)
import { createApp } from 'vue'import App from './App.vue'// 下面这两行代码是要自己去添加的import Element3 from 'element3'import 'element3/lib/theme-chalk/index.css'// 最后以插件的方式挂载createApp(App).use(Element3).mount('#app')复制代码
- 到此项目基本搭建完成
- 在项目的根目录运行 npm install element3 -S
- 在mian.js 文件添加如下代码,
路由配置 和 中央数据配置
路由配置
- 为了简单就写了两个页面,logig 和 home页面
- 主要代码如下:
import { createRouter, createWebHashHistory } from 'vue-router';const routes = [ {path: '/',name: 'Home',component: import("../views/Home.vue") }, {path: '/login',name: 'Login',component: import("../views/Login") }, {path: "/:pathMatch(.*)*",redirect: to => {return { path: '/' }; } } ];const router = createRouter({history: createWebHashHistory(), routes });export default router;复制代码
- 为了配合vue3,所以vue-router4 的写法也存在了一些差别,想要知道vue-router4的小伙伴可以参照我的vue-router4
- 这里值得注意的一点是 路由的匹配 , path: '/:pathMatch(.*)*' 相当于是 path:"*" ,现在要匹配路由需要用正则去匹配
中央数据配置(vuex)
- 主要也是写法存在差异,想要知道具体用法可以参考vuex4
- 代码如下:
import { createStore } from 'vuex';export default createStore({state: {userInfo: JSON.parse(sessionStorage.getItem('useInfo') || '{}'), },getters: {userInfo: state => state.userInfo },mutations: {changeUserInfo(state, payload) { state.userInfo = payload; } },actions: {EDIT_USER_INFO({ commit }, payload) {return new Promise((res,rej)=>{ commit('changeUserInfo', payload || {}); sessionStorage.setItem('useInfo', JSON.stringify(payload)); res(12233); }) } },modules: {} });复制代码
- 然后,在main.js文件中统一以插件的方式挂载即可
页面的编写
登录页
- 因为主要的功能都在登录页,所以就以登录页为主,看一下vue3页面的基本结构和Element3的基本使用
<template><div class="login"><div class="container"><el-form ref="formRef" :rules="rules" :model="form"><el-form-item label="用户名" prop="userName"><el-input v-model="form.userName"></el-input></el-form-item><el-form-item label="密码" prop="password"><el-input type="password" v-model="form.password"></el-input></el-form-item></el-form><el-row type="flex" justify="center"><el-button type="primary" @click="submit"> 登录</el-button></el-row></div></div></template><script>import { reactive, ref } from "vue";import { useRouter } from "vue-router";import { useStore } from "vuex";export default {name: 'Login',setup() {const formRef = ref(null);const router = useRouter();const store = useStore();const form = reactive({userName: '',password: '', });const rules = reactive({userName: [{ required: true, message: '请填写用户名', trigger: ['blur', 'change'] }],password: [{ required: true, message: '请填写密码', trigger: ['blur', 'change'] }] });const submit = () => { formRef.value.validate(async valid => {if (!valid) return;await store.dispatch('EDIT_USER_INFO', form); router.push({path: '/'}); }); };return { form, rules, formRef, submit, }; } };</script>复制代码
- 眨眼一看是不是vue2的结构更加工整,查找数据什么的也比较方便,比较集中
- 这个页面主要做了两件事情,登录信息存储到中央仓库 和 页面的跳转
- 如果想看vue3更多api的基本用法,请查阅这两个笔记 vue3 api(上)、 vue3 api(下)
简单的登录权限校验
主要思路
- 利用vue-router的钩子函数,router.beforeEatch,该函数接受3个参数:
- to : 将要前往的路由信息
- form : 离开路由的路由信息
- next : 是一个方法,需不需要进入该路由,如果需要进入则:next(),如果没有写,则页面会一直处在空白页,
- 在上面的函数中我们只需要做两件事情:
- 判断用户是否登录
- 根据登录态跳转到不同的路由即可
代码展示
- 写的比较简单:
import router from './router/index';import store from './store/index'; router.beforeEach((to, from, next) => {const { userInfo } = store.getters;if (Object.keys(userInfo).length) {// 已登录if (to.name === 'Login') { next({name: 'Home'}); } next(); } else {// 未登录if (to.name === 'Login') next(); next({name: 'Login'}); } });复制代码
最后
- 刚开始写博客,有不正确的地方请及时指出,我会在第一时间进行修改,如果能给个赞就更加好了,谢谢观看!