14vue3实战-----获取用户信息和用户的菜单树信息

embedded/2025/2/10 22:14:01/

14vue3实战-----获取用户信息和用户的菜单树信息

  • 1.获取用户信息
    • 1.1封装接口
    • 1.2优化
  • 2.获取用户的菜单树信息

1.获取用户信息

1.1封装接口

后端有根据id获取用户信息的接口,前端需要把该接口封装一下:
service/login/login.ts:

import hyRequest from '..'
import type { IAccount } from '@/types'
import { localCache } from '@/utils/cache'
import { LOGIN_TOKEN } from '@/global/constants'
export function getUserInfoById(id: number) {return hyRequest.get({url: `/users/${id}`headers: {Authorization: 'Bearer ' + localCache.getCache(LOGIN_TOKEN)}})
}

store/login/login.ts:

...
async loginAccountAction(account: IAccount) {// 1.账号登录, 获取token等信息const loginResult = await accountLoginRequest(account)const id = loginResult.data.idthis.token = loginResult.data.tokenlocalCache.setCache(LOGIN_TOKEN, this.token)// 2.获取登录用户的详细信息(role信息)const userInfoResult = await getUserInfoById(id)const userInfo = userInfoResult.datathis.userInfo = userInfo// 3.根据角色请求用户的权限(菜单menus)...// 4.进行本地缓存localCache.setCache('userInfo', userInfo)...// 5.页面跳转(main页面)router.push('/main')}}

1.2优化

如果所有需要token的接口都像上面一样封装,这样子太麻烦,所以最好把token的处理放在请求拦截器中更好。
在这里插入图片描述
service/index.ts:

import { LOGIN_TOKEN } from '@/global/constants'
import { localCache } from '@/utils/cache'
import { BASE_URL, TIME_OUT } from './config'
import HYRequest from './request'const hyRequest = new HYRequest({baseURL: BASE_URL,timeout: TIME_OUT,interceptors: {requestSuccessFn: (config) => {// 每一个请求都自动携带tokenconst token = localCache.getCache(LOGIN_TOKEN)if (config.headers && token) {// 类型缩小config.headers.Authorization = 'Bearer ' + token}return config}}
})
export default hyRequest

2.获取用户的菜单树信息

service/login/login.ts:

import hyRequest from '..'
import type { IAccount } from '@/types'export function accountLoginRequest(account: IAccount) {return hyRequest.post({url: '/login',data: account})
}export function getUserInfoById(id: number) {return hyRequest.get({url: `/users/${id}`})
}export function getUserMenusByRoleId(id: number) {return hyRequest.get({url: `/role/${id}/menu`})
}

store/login/login.ts:

import { defineStore } from 'pinia'
import {accountLoginRequest,getUserInfoById,getUserMenusByRoleId
} from '@/service/login/login'
import type { IAccount } from '@/types'
import { localCache } from '@/utils/cache'
import router from '@/router'
import { LOGIN_TOKEN } from '@/global/constants'interface ILoginState {token: string//这里userInfo和usermenus也可以定义接口。如果数据很复杂,嵌套很多层,也可以定义为anyuserInfo: anyuserMenus: any
}const useLoginStore = defineStore('login', {// 如何制定state的类型state: (): ILoginState => ({token: localCache.getCache(LOGIN_TOKEN) ?? '',userInfo: localCache.getCache('userInfo') ?? {},userMenus: localCache.getCache('userMenus') ?? []}),actions: {async loginAccountAction(account: IAccount) {// 1.账号登录, 获取token等信息const loginResult = await accountLoginRequest(account)const id = loginResult.data.idthis.token = loginResult.data.tokenlocalCache.setCache(LOGIN_TOKEN, this.token)// 2.获取登录用户的详细信息(role信息)const userInfoResult = await getUserInfoById(id)const userInfo = userInfoResult.datathis.userInfo = userInfo// 3.根据角色请求用户的权限(菜单menus)const userMenusResult = await getUserMenusByRoleId(this.userInfo.role.id)const userMenus = userMenusResult.datathis.userMenus = userMenus// 4.进行本地缓存localCache.setCache('userInfo', userInfo)localCache.setCache('userMenus', userMenus)// 5.页面跳转(main页面)router.push('/main')}}
})export default useLoginStore

获取到用户的详细信息和菜单树信息之后,接下来就是根据这些数据进行前端搭建了。具体搭建比较简单,这里就不多说。文章的主要目的是讲述一些功能的思路和vue3+ts的编码规范(和vue2很多地方不太一样)。


http://www.ppmy.cn/embedded/161182.html

相关文章

青少年编程与数学 02-009 Django 5 Web 编程 02课题、开发环境

青少年编程与数学 02-009 Django 5 Web 编程 02课题、开发环境 一、环境要求基本要求安装步骤其他工具开发服务器 二、使用 PyCharm安装 PyCharm创建 Django 项目安装 Django 5配置和运行项目使用 PyCharm 功能 三、使用 VSCode安装 VSCode 和 Python创建虚拟环境安装 Django创…

安宝特方案 | AR眼镜:远程医疗的“时空折叠者”,如何为生命争夺每一分钟?

行业痛点:当“千里求医”遇上“资源鸿沟” 20世纪50年代,远程会诊的诞生曾让医疗界为之一振——患者不必跨越山河,专家无需舟车劳顿,一根电话线、一张传真纸便能架起问诊的桥梁。然而,传统远程医疗的局限也日益凸显&a…

Linux网络 | 网络计算器客户端实现与Json的安装以及使用

前言:本节讲述序列化和反序列化的相关内容。 这节的内容是博主前一篇博客的续章, 里面用到了很多知识点都是前一篇文章的。 友友们如果要学习序列化反序列化, 直接看本篇文章是看不懂的, 请看前一篇文章:linux网络 | 序…

C++11详解(四) -- 新的类功能和包装器

文章目录 1.新的类功能1.1 默认的移动构造和移动赋值1.2 成员变量声明的时候给缺省值1.3 default和delete1.4 final和override 2.STL中⼀些变化3.包装器3.1function3.2例题逆波兰表达式求值(用了function)题目解析代码 3.3 bind(绑定) 1.新的类功能 1.1…

(苍穹外卖)项目结构

苍穹外卖项目结构 后端工程基于 maven 进行项目构建,并且进行分模块开发。 1). 用 IDEA 打开初始工程,了解项目的整体结构: 对工程的每个模块作用说明: 序号名称说明1sky-take-outmaven父工程,统一管理依赖版本&…

《利用原始数据进行深度神经网络闭环 用于光学驻留空间物体检测》论文精读

Deep Neural Network Closed-loop with Raw Data for Optical Resident Space Object Detection 摘要 光学勘测是观测驻留空间物体和空间态势感知的重要手段。随着天文技术和还原方法的应用,宽视场望远镜在发现和识别驻留空间物体方面做出了重大贡献。然而&#x…

记录 | WPF基础学习自定义按钮

目录 前言一、解析Button.TemplateBorder和TemplateBinding 二、代码提供更新时间 前言 参考文章: 参考视频:【WPF入门教程 Visual Studio 2022】WPF界面开发入门 自己的感想 这里涉及到Template模板和事件。主要干两件事:1、template中的重写…

ubuntu server环境下使用mitmproxy代理

近日为了调试AWS连接的一个问题,需要查看HTTPS报文的内容,通过抓包的方式也可以。这里介绍通过mitmproxy的方式。因为是server环境,没有桌面,因此配置的过程是基于shell终端完成的。 安装mitmproxy sudo pip3 install mitmproxy…