【vue2.7.16系列】手把手教你搭建后台系统__登录使用状态管理(15)

使用store进行登录信息管理

其实就是把登录放到vuexactions中去执行,然后保存用户信息、权限等
store/modules/account.js中添加如下代码:

import { login, logout, getInfo, menusApi } from '@/api/account';
// getExpiresTime
import {getToken,setToken,removeToken,setUserId,getUserId,removeUserId,setExpiresTime,removeExpiresTime,calcExpiresTime,setPrimissionBtn,getPrimissionBtn,removePrimissionBtn
} from '@/utils/auth';
import { resetRouter } from '@/router';function getMenusList() {const storage = window.localStorage;let menuList = JSON.parse(storage.getItem('menuList'));if (typeof menuList !== 'object' || menuList === null) {menuList = [];}return menuList;
}function setMenusList(menus) {localStorage.setItem('menuList', JSON.stringify(menus));
}const getDefaultState = () => {return {uuid: getUserId(),token: getToken(),name: '',avatar: '',unique_auth: getPrimissionBtn(),menus: getMenusList()};
};const state = getDefaultState();const mutations = {RESET_STATE: (state) => {Object.assign(state, getDefaultState());},SET_UUID: (state, uuid) => {state.uuid = uuid;},SET_TOKEN: (state, token) => {state.token = token;},SET_NAME: (state, name) => {state.name = name;},SET_AVATAR: (state, avatar) => {state.avatar = avatar;},SET_LOGO: (state, logo) => {state.logo = logo;},SET_VERSION: (state, version) => {state.version = version;},SET_UNIQUE_AUTH: (state, unique_auth) => {state.unique_auth = unique_auth;},SET_MENUS: (state, menus) => {state.menus = menus;}
};const actions = {// account loginlogin({ commit }, userInfo) {const { username, password } = userInfo;return new Promise((resolve, reject) => {login({ username: username.trim(), password: password }).then(response => {const { data } = response;const expires = calcExpiresTime(data.expires_time);setToken(data.token, expires);setUserId(data.user_info.id, expires);setExpiresTime(data.expires_time, expires);// 记录用户信息commit('SET_TOKEN', data.token);commit('SET_UUID', data.user_info.id);commit('SET_NAME', data.user_info.account);commit('SET_AVATAR', data.user_info.head_pic);commit('SET_LOGO', data.logo);commit('SET_VERSION', data.version);// 保存菜单及权限信息const btns = data.unique_auth.join(',');commit('SET_UNIQUE_AUTH', btns);commit('SET_MENUS', data.menus);// 存储到本地setMenusList(data.menus);setPrimissionBtn(btns);resolve();}).catch(error => {reject(error);});});},// get account infogetInfo({ commit, state }) {return new Promise((resolve, reject) => {getInfo({ uid: state.uuid }).then(response => {const { data } = response;if (!data) { // token 失效return reject('验证失败, 请重新登录!');}const { id, account } = data;// 更新到state上commit('SET_UUID', id);commit('SET_NAME', account);resolve(data);}).catch(error => {reject(error);});});},// account logoutlogout({ commit, state }) {return new Promise((resolve, reject) => {logout(state.token).then(() => {removeToken(); // must remove  token  firstremoveUserId();removeExpiresTime();removePrimissionBtn();resetRouter();commit('RESET_STATE');resolve();}).catch(error => {reject(error);});});},// remove tokenresetToken({ commit }) {return new Promise(resolve => {removeToken(); // must remove  token  firstremoveUserId();removeExpiresTime();commit('RESET_STATE');resolve();});},getMenus({ commit }) {return new Promise((resolve, reject) => {menusApi().then(async res => {resolve(res);commit('SET_MENUS', res.data.menus);// 存储到本地setMenusList(res.data.menus);}).catch(res => {reject(res);});});}
};export default {namespaced: true,state,mutations,actions
};

utils/auth.js中添加如下代码:

import Cookies from 'js-cookie';const TokenKey = 'token';
const userIdKey = 'uuid';
const BTNS = 'PERMISSIONBTNS';
const expiresTimeKey = 'expires_time';export function setToken(token, cookieExpires) {return Cookies.set(TokenKey, token, { expires: cookieExpires || 1 });
}
export function getToken() {return Cookies.get(TokenKey);
}
export function removeToken() {return Cookies.remove(TokenKey);
}export function setUserId(uuid, cookieExpires) {return Cookies.set(userIdKey, uuid, { expires: cookieExpires || 1 });
}
export function getUserId() {return Cookies.get(userIdKey);
}
export function removeUserId() {return Cookies.remove(userIdKey);
}export function setExpiresTime(expiresTime, cookieExpires) {return Cookies.set(expiresTimeKey, expiresTime, { expires: cookieExpires || 1 });
}
export function getExpiresTime() {return Cookies.get(expiresTimeKey);
}
export function removeExpiresTime() {return Cookies.remove(expiresTimeKey);
}export function calcExpiresTime(expiresTime) {const nowTimeNum = Math.round(new Date() / 1000);const expiresTimeNum = expiresTime - nowTimeNum;return parseFloat(parseFloat(parseFloat(expiresTimeNum / 60) / 60) / 24);
}// 按钮权限
export function setPrimissionBtn(list) {localStorage.setItem(BTNS, list);
}export function getPrimissionBtn() {return localStorage.getItem(BTNS);
}export function removePrimissionBtn() {localStorage.removeItem(BTNS);
}

store/index.js中引入

import account from './modules/account'
const store = new Vuex.Store({modules: {account},......
})

login/index.vue中调用account.jsactions中的login

调整handleLogin方法:

handleLogin() {this.$refs.loginForm.validate((valid) => {if (valid) {this.loading = true;this.$store.dispatch('account/login', this.loginForm).then(() => {this.$router.push({ path: this.redirect || '/admin' });this.loading = false;}).catch((err) => {this.loading = false;this.$message.error(err.msg);});} else {return false;}});
}

当然可能点击登录按钮,无法完成跳转,因为接口未返回以下数据,导致报错。

请添加图片描述

至此完成。。。未有详尽之处,后续迭代

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

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

相关文章

Java项目实战II基于Spring Boot的秒杀系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在互联网电商蓬勃发展的今天&#xff0…

HTML5实现小鸟过管道小游戏源码

文章目录 1.设计来源1.1 主界面1.2 游戏中主界面1.3 游戏结束界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/…

基础算法练习--滑动窗口(日更中)

算法介绍 滑动窗口算法来自tcp协议的一种特性,它的高效使得其也变成了算法题的一种重要考点.滑动窗口的实现实际上也是通过两个指针前后遍历集合实现,但是因为它有固定的解题格式,我将其单独做成一个篇章. 滑动窗口的解题格式: 首先,定义两个指针left和right,与双指针不同的…

C#如何快速获取P/Invoke方法签名

使用API函数已经好几年了,封装函数签名基本是参照MSDN上的文档,然后再做数据类型对应。 虽然有 pinvoke.net 这个网站,但基本很少使用。一方面是想多动手,另一方面是因为各种数据类型基本都用过了,都能自己在C#中 对应…

人脑与机器连接:神经科技的伦理边界探讨

内容概要 在当今科技飞速发展的时代,人脑与机器连接已成为一个引人注目的前沿领域。在这一背景下,神经科技的探索为我们打开了一个全新的世界,从脑机接口到人工智能的飞跃应用,不仅加速了技术的进步,更触动了我们内心…

这么多优秀的 AI 大模型,我应该选择哪个呢?

前两次,我们向大家介绍了当前全球最有名的总共 11 个 AI 大模型。在此期间,openAI 于 8月 6 日 最新推出另了一个超强 AI 大模型 —— GPT-4o(Aug 6),强势跻入全球前列。不得不说,这才多久,open…

软件开发设计管理文档,项目设计规程制度,项目开发规程,项目建设方案文档(word原件)

2 过程总体描述 2.1 过程概述 2.2 过程流程图 3 过程元素描述 3.1 产品方案 3.2 产品设计 3.3 产品实现 获取方式:本文末个人名片直接获取。 软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审批表&#xf…

【taro react】 ---- 常用自定义 React Hooks 的实现【六】之类渐入动画效果的轮播

1. 效果 2. 场景 css 效果实现:可以看到效果图中就是一个图片从小到大的切换动画效果,这个效果很简单,使用 css 的 transform 的 scale 来实现图片的从小到大的效果,切换就更加简单了,不管是 opacity 还是 visibility 都可以实现图片的隐藏和显示的切换。React.Children.m…

2024年转行指南:大学生进军就业前景广阔的领域——人工智能大模型

据教育部数据统计,2024高校毕业生规模预计达1179万人,将再创历史新高,“就业难”仍是当前大学毕业生需要直面的问题。在此背景下,选择一个就业前景好的专业尤为重要。 究竟学什么样的专业好就业呢?给毕业生们推荐3个当…

重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式 1. 为什么选择 Elasticsearch?2. Spring Boot 3 和 Elasticsearch 8.x 的集…

【网络安全渗透测试零基础入门】Vulnhub靶机Kioptrix level-4 多种姿势渗透详解,收藏这一篇就够了!

前言 这是阳哥给粉丝盆友们整理的网络安全渗透测试入门阶段Vulnhub靶场实战阶段教程 喜欢的朋友们,记得给我点赞支持和收藏一下,关注我,学习黑客技术。 环境配置 服务版本探测:sudo nmap -sT -sV -sC -O -p22,80,139,445 22端…

由中文乱码引来的一系列学习——Qt

前言 解决中文引起的乱码,并不难,网上一搜就有好几个方法任君选择,但是解决乱码的这些方法的原理是什么,我一直没太明白。 这次项目需要在Android环境下运行,而根据Qt跨平台的特性,我一般是在Windows环境…

浅析数据库缓存一致性问题

在真实的业务场景中,我们的业务的数据——例如订单、会员、支付等——都是持久化到数据库中的,因为数据库能有很好的事务保证、持久化保证。但是,正因为数据库要能够满足这么多优秀的功能特性,使得数据库在设计上通常难以兼顾到性…

element plus el-form自定义验证输入框为纯数字函数

element plus 的el-form 使用自定义验证器&#xff0c;验证纯数字&#xff0c;禁止输入小数、中文、字母、特殊符号。input的maxlength为最大输入多少位长度 效果图 <el-form ref"dataFormRef" :model"dataForm" :rules"dataRules" label-w…

jira如何查看历史Sprint

方法一&#xff1a;通过看板模块查看历史 Sprint 进入看板模块 在项目的看板中&#xff0c;找到并点击“模块项”。在右侧历史记录中选择一个模块项。 查看 Sprint 历史 进入模块项界面后&#xff0c;点击“搜索”按钮旁边的“更多”下拉菜单。勾选“Sprint”选项&#xff0c;…

阿里云 DataWorks 正式支持 SelectDB Apache Doris 数据源,实现 MySQL 整库实时同步

SelectDB 是由飞轮科技基于 Apache Doris 内核打造的现代化数据仓库&#xff0c;支持大规模实时数据上的极速查询分析。 通过实时、统一、弹性、开放的核心能力&#xff0c;能够为企业提供高性价比、简单易用、安全稳定、低成本的实时大数据分析支持。SelectDB 具备世界领先的实…

OV(企业型)通配符域名SSL证书

SSL证书是由CA机构签发的&#xff0c;相信这一点大家都知道&#xff0c;然而目前全世界兼容性可以达到99%机构仅有&#xff1a;GlobalSign、DigiCert、Sectigo、Certum&#xff0c;最后一家还是勉强。 SSL证书选择OV&#xff08;国内有人称之为企业型&#xff09;其实就是实名…

软考系统分析师知识点三五: 考前强记知识点

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间&#xff1a;11月9日。 倒计时&#xff1a;2天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第四阶段&#xff1a;考前强记知识点。 考前强记知识点 系统分析主要任…

基础算法——排序算法(冒泡排序,选择排序,堆排序,插入排序,希尔排序,归并排序,快速排序,计数排序,桶排序,基数排序,Java排序)

1.概述 比较排序算法 算法最好最坏平均空间稳定思想注意事项冒泡O(n)O( n 2 n^2 n2)O( n 2 n^2 n2)O(1)Y比较最好情况需要额外判断选择O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)O(1)N比较交换次数一般少于冒泡堆O( n l o g n nlogn nlogn)O( n l o g n nlogn nlogn)O( n l…

探索 Python 视频编辑新纪元:MoviePy库的神秘面纱

文章目录 探索 Python 视频编辑新纪元&#xff1a;MoviePy 库的神秘面纱第一部分&#xff1a;背景介绍第二部分&#xff1a;MoviePy 是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;简单的库函数使用方法第五部分&#xff1a;结合场景使…