【图文并茂】ant design pro 如何对接后端个人信息接口

news2024/12/28 6:59:07

在这里插入图片描述

上一节我们有讲到如何对接登录接口的 【图文并茂】ant design pro 如何对接登录接口

仅仅能登录是最基本的,但是我们要进入后台还是需要另一个接口。

这个接口有两个作用:

  1. 来获取当前登录账号的信息,比如头像,用户名,还有一些权限信息等
  2. 来验证一下后台是否登录过

关于第二点,是很重要的,这个接口就是必须你要登录过一次,拿到 token 之后,才能访问到。

如果你没有 token ,也就是说没有登录过,这个接口访问的时候就会出问题,比如你都没登录过,你觉得能拿到个人信息吗,拿谁的。所以没有登录过的,就让它跳到登录页面,就是这个接口的作用。

有没有登录过,就只看浏览器有没有存好 token.

在这里插入图片描述

实现好后端

const getUserProfile = handleAsync(async (req: RequestCustom, res: Response) => {
  // 确保在请求处理流程中间件中已经添加了解析 JWT 并设置 req.user
  const user: IUser | null = await User.findById(req.user?._id)
    .populate('roles') // 预加载 roles 字段
    .exec();

  if (user) {
    // 再次预加载 permissions 字段,因为 roles 已经被预加载
    await user.populate('roles.permissions');

    res.json({
      success: true,
      data: {
        ...exclude(user.toObject(), 'password'),
        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
      },
    });
  } else {
    res.status(404);
    throw new Error('User not found');
  }
});

后端只是把 req.user 的信息拿到并返回给前端罢了。

比如这样的信息:

在这里插入图片描述
那么这个 req.user 是啥

我们看下路由

在这里插入图片描述
前面有个 protect 中间件,这个可以拿到 req.user

它的逻辑是这样的:

const protect = handleAsync(
  async (req: RequestCustom, res: Response, next: NextFunction) => {
    let token;

    if (
      req.headers.authorization &&
      req.headers.authorization.startsWith('Bearer')
    ) {
      try {
        token = req.headers.authorization.split(' ')[1];
        const decoded = jwt.verify(
          token,
          process.env.JWT_SECRET as string,
        ) as jwt.JwtPayload;

        const user: IUser | null = await User.findById(decoded.id)
          .populate({
            path: 'roles',
            populate: {
              path: 'permissions',
              model: 'Permission',
            },
          })
          .exec();

        if (!user || !user.live) {
          throw new Error('User is not live or not found');
        }

        req.user = user;
        console.log('User is', user);
        next();
      } catch (error) {
        console.error(error);
        res
          .status(401)
          .send({ message: error.message || 'Not authorized, token failed' });
      }
    }

    if (!token) {
      res.status(401).send({ message: 'Not authorized, no token' });
    }
  },
);

主要是这里:

req.headers.authorization &&
req.headers.authorization.startsWith(‘Bearer’)

这个地方是从前端拿到头信息。

在这里插入图片描述
下一步就是通过 json web token 的库去解析这个字符串 token 。

    token = req.headers.authorization.split(' ')[1];
    const decoded = jwt.verify(
      token,
      process.env.JWT_SECRET as string,
    ) as jwt.JwtPayload;

拿到里面的 id 再去数据库把当前用户找出来,最后放到 req.user 中。

所以后面的 action 就可以拿到 req.user. 因为 protect 这里已经拿到并存到 req 了。

如果找不到

if (!token) {
  res.status(401).send({ message: 'Not authorized, no token' });
}

就会给前端一个 401 状态码。前端拿到 401 状态码,就会跳出到登录页面。

process.env.JWT_SECRET 上面有个密钥,这是服务器存的,不能暴露出去,就像你家的钥匙一样。

所以我们这个 token 是安全,就算别人伪造了信息,他没有你的 key ,后面也是解析不了,能判断是不是假的数据。

其实最上面 getUserProfile 里的

const user: IUser | null = await User.findById(req.user?._id)
.populate(‘roles’) // 预加载 roles 字段
.exec();

并不是必要的,因为 req.user 应该有 user 的对象记录信息了。当然再查一遍也是没问题。

前端实现

主要是还是在这里:

src/app.tsx

export async function getInitialState(): Promise<{
  settings?: Partial<LayoutSettings>;
  currentUser?: API.CurrentUser;
  loading?: boolean;
  fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
}> {
  const fetchUserInfo = async () => {
    try {
      const response = await queryCurrentUser({
        skipErrorHandler: true,
      });
      return response.data;
    } catch (error) {
      history.push(loginPath);
    }
    return undefined;
  };
  // 如果不是登录页面,执行
  const { location } = history;
  if (location.pathname !== loginPath) {
    const currentUser = await fetchUserInfo();
    return {
      fetchUserInfo,
      currentUser,
      settings: defaultSettings as Partial<LayoutSettings>,
    };
  }
  return {
    fetchUserInfo,
    settings: defaultSettings as Partial<LayoutSettings>,
  };
}

还是跟以前一样,要对接好请求地址,方法,参数

queryCurrentUser

这个逻辑是这样的:

export async function currentUser(options?: { [key: string]: any }) {
  return request<API.CurrentUser>('/auth/profile', {
    method: 'GET',
    ...(options || {}),
  });
}

用的是 get 方法,地址要对。

后面是这个

  const response = await queryCurrentUser({
    skipErrorHandler: true,
  });
  return response.data;

响应的数据要对上

跟这里的数据结构是要对上的API.CurrentUser

  type CurrentUser = {
    isAdmin: CurrentUser | undefined;
    data?: any;
    name?: string;
    avatar?: string;
    role?: string;
    roles?: any;
    _id?: string;
    userid?: string;
    email?: string;
    signature?: string;
    title?: string;
    group?: string;
    tags?: { key?: string; label?: string }[];
    notifyCount?: number;
    unreadCount?: number;
    country?: string;
    access?: string;
    geographic?: {
      province?: { label?: string; key?: string };
      city?: { label?: string; key?: string };
    };
    address?: string;
    phone?: string;
  };

也就是这里的

在这里插入图片描述
这里可能还差一个东西,我们要把 token 提交过去。

我们下一节来讲

  • ant design pro 如何去保存颜色
  • ant design pro v6 如何做好角色管理
  • ant design 的 tree 如何作为角色中的权限选择之一
  • ant design 的 tree 如何作为角色中的权限选择之二
  • ant design pro access.ts 是如何控制多角色的权限的
  • ant design pro 中用户的表单如何控制多个角色
  • ant design pro 如何实现动态菜单带上 icon 的
  • ant design pro 的表分层级如何处理
  • ant design pro 如何处理权限管理
  • ant design pro 技巧之自制复制到剪贴板组件
  • ant design pro 技巧之实现列表页多标签
  • 【图文并茂】ant design pro 如何对接登录接口

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

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

相关文章

SAP Lock Object锁机制

一、锁机制 SAP LUW要求数据库对象的锁定在SAP LUW结束释放&#xff0c;并且该数据库锁要求对所有SAP程序可见。SAP提供了一个逻辑数据锁定机制&#xff0c;该机制基于系统特定的锁定服务应用服务器中的中心锁定表&#xff08;即将加锁的信息记入数据库表&#xff09;。一个AB…

文档翻译软件哪个好用?后悔没早发现这5款

在学术研究的道路上&#xff0c;英文文献翻译无疑是一项挑战重重的任务&#xff01; 作为一名经常与英文文献打交道的学者&#xff0c;我一直在寻找能够简化这一过程的工具。最近&#xff0c;我发现了一些英文文献翻译在线免费工具&#xff0c;它们提供了文档翻译的功能&#…

IC rankIC

IC IC衡量的是预测值和实际值之间的相关系数 计算公式为&#xff1a;IC Pearson(R(predicted),R(actual)) 取值范围&#xff1a;[-1, 1]&#xff0c;其中1表示完全相关&#xff0c;也就是预测值和实际值完全一样。0表示完全不相关&#xff0c;-1表示&#xff0c;反向相关 ra…

Catf1ag CTF Web(八)

前言 Catf1agCTF 是一个面向所有CTF&#xff08;Capture The Flag&#xff09;爱好者的综合训练平台&#xff0c;尤其适合新手学习和提升技能 。该平台由catf1ag团队打造&#xff0c;拥有超过200个原创题目&#xff0c;题目设计注重知识点的掌握&#xff0c;旨在帮助新手掌握C…

「Qt Widget中文示例指南」如何实现一个旋转框(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 旋转框示例展示了如…

别选错了!一篇文章讲清Midjourney 和 Stable Diffusion的区别

24年无疑标志着AI时代的崭新篇章&#xff0c;各类AI软件如同春日里迅速生长的竹笋&#xff0c;层出不穷&#xff0c;其功能之丰富令人目不暇接&#xff0c;竞相在各自的领域内抢占前沿阵地。 在众多 AI 绘画工具中&#xff0c;Midjourney 和 Stable Diffusion 是最为人熟知的两…

大数据背景下基于Python的牛油果销售数据可视化分析

注&#xff1a;源码在最后&#xff0c;只是一次实验记录&#xff0c;不合理的地方自行修改。 一 研究背景及意义 21世纪以来&#xff0c;随着科学技术的进步&#xff0c;人们的生活水平也随之大幅提升提高。在科技和经济快速发展下&#xff0c;全球已经进入了大数据时代。大数…

Stable Diffusion 适合亚洲人的摄影级画质LEOSAM‘s HelloWorld XL 大模型V6版本来啦!

前言 LEOSAM’s HelloWorld XL大模型早在SD1.5时代&#xff0c;就曾经被多次推荐&#xff0c;该作者LEOSAM于4月20日发布了其最新LEOSAM’s HelloWorld XL V6版本大模型。该模型在摄影、光影等方面表现非常优秀。HelloWorld XL V6版本是在V5版本的基础上迭代改进的。根据作者LE…

【JAVA入门】Day23 - 查找算法

【JAVA入门】Day23 - 查找算法 文章目录 【JAVA入门】Day23 - 查找算法一、基本查找二、二分查找 / 折半查找三、分块查找 查找算法我们常用的有&#xff1a; 基本查找二分查找 / 折半查找分块查找插值查找斐波那契查找树表查找哈希查找 这里我们着重讲解前三种&#xff0c;其…

计算机Java项目|基于SpringBoot的精简博客系统的设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

第47课 Scratch入门篇:水果忍者

水果忍者 故事背景: 水果忍者是一款传统的非常好玩的游戏,我们通过鼠标控制水果刀,把弹出的水果切掉,如果切到地雷则扣分,这款游戏非常好玩,现在我们现在通过Scratch 把它做出来,! 程序原理: 这款游戏难点就是水果的抛起和下降,由于角色是从下往上走,也就是 Y 坐标…

ip归属地换地方了会自动更新吗

在这个数字化时代&#xff0c;互联网已成为我们生活、工作和学习中不可或缺的一部分。而每一个连接互联网的设备&#xff0c;都会通过其IP地址与外界进行通信。IP地址&#xff0c;这个看似简单的数字组合&#xff0c;实则承载着设备位置、网络身份等重要信息。随着人们移动性的…

重生奇迹MU:穿越时光的辉煌篇章

在远古的曙光中&#xff0c;奇迹重现&#xff0c;MU大陆迎来了前所未有的荣耀重生&#xff01;重生奇迹MU&#xff0c;一款融合经典与创新&#xff0c;跨越时空界限的奇迹之旅&#xff0c;邀您共赴一场梦幻与热血交织的冒险盛宴。 经典重塑&#xff0c;传奇再续 重拾昔日辉煌…

贝叶斯神经网络bnn pyro 包 bayesian-neural-network在人工智能领域应用,预测金融市场价格

在人工智能领域&#xff0c;预测金融市场价格一直是一个热门话题。本文将介绍一种新颖的方法——贝叶斯神经网络&#xff0c;用于预测市场动态&#xff0c;以虚拟货币“以太币”为例进行说明。 ### 贝叶斯神经网络&#xff1a;一种新视角 对于希望深入了解贝叶斯神经网络的读者…

【递归专题一】Pow(x,n)-快速幂算法

Pow(x,n)-递归及迭代实现 题目链接&#xff1a;Pow(x,n) 解法一&#xff1a;暴力循环 如210则用10个2相乘&#xff0c;但是如果n231-1&#xff0c;难道我们还要用n231-1个2相乘吗&#xff1f;这样显然会超时。 解法二&#xff1a;快速幂算法 递归实现 任意数的指数都可以用二…

骑行耳机怎么选?精选五款权威实测热卖机型

作为一位深耕于运动科技领域多年的博主&#xff0c;可以说在此之间测试评论过各类运动装备&#xff0c;其中对于骑行爱好者而言&#xff0c;不可或缺的就是一款可以提高骑行体验的蓝牙耳机&#xff0c;其中&#xff0c;骨传导耳机凭借佩戴舒适健康等特点&#xff0c;收获了各类…

[星瞳科技]OpenMV如何进行串口通信?

串口通信上 视频教程27 - 串口通信发送数据&#xff1a;OpenMV串口发送数据 | 星瞳科技 视频教程28 - 串口通信接收数据&#xff1a;OpenMV串口接收数据 | 星瞳科技 介绍 为什么要用串口呢&#xff1f;因为要时候需要把信息传给其他MCU&#xff0c;串口简单&#xff0c;通用…

Qt-enable介绍使用(10)

目录 enable() 描述 相关 使用 观察切换过程 enable() 描述 相关 使用 观察切换过程 我们新建一个项目&#xff0c;设置两个按钮&#xff0c;并且把第二个按钮的objectName改一个明显的名字 关于名字这一点补充&#xff0c;显然我们在实际中要注意对象名字要尽量的通俗易…

C语言中函数sizeof和strlen区别

sizeof和strlen是C语言中的两个常用函数&#xff0c;它们的作用和使用方式有所不同。 sizeof sizeof是一个运算符而非函数&#xff0c;用于计算数据类型或变量占用的字节数。它可以计算任意数据类型&#xff08;包括基本类型、自定义结构体、数组等&#xff09;的大小。例如&…

如何使用博达网站群管理平台的树状导航

1 介绍 由于网站建设需要&#xff0c;需在首页的左边竖栏部分使用树状导航。我又过了一遍《网站群管理平台用户手册》&#xff0c;没发现如何在网站的首页设置树状导航组件。昨天&#xff0c;我之所以在创建树状导航上不知所措&#xff0c;是因为平台本身有一些误导&#xff0…