二十九、【用户体验篇】个人中心:用户资料展示与密码修改

二十九、【用户体验篇】个人中心:用户资料展示与密码修改

    • 前言
      • 准备工作
      • 第一部分:后端实现 - 个人中心 API
        • 1. 修改 `UserDetailSerializer` 以支持密码修改
        • 2. 在 `api/views.py` 中添加 `UserMeView` 和 `PasswordChangeView`
        • 3. 注册个人中心相关 API 路由
        • 4. 后端初步测试
      • 第二部分:前端实现 - 个人中心页面
        • 1. 更新 `user.ts` API 服务
        • 2. 添加个人中心路由和顶部菜单入口
        • 3. 创建个人中心页面 (`src/views/profile/UserProfileView.vue`)
      • 第三部分:全面测试
    • 总结

前言

在测试平台中,个人中心是不可或缺的重要组成部分。它不仅提供了用户查看和管理自身信息的能力,更是保障账户安全、提升用户体验的关键功能。

准备工作

  1. Django 后端项目就绪: 确保你的 test-platform/backend 项目结构完整,JWT 认证已配置。
  2. Vue3 前端项目就绪。
  3. Axios 和 API 服务已封装。
  4. Element Plus 集成完毕。
  5. 用户已登录: 个人中心页面需要用户登录才能访问。

第一部分:后端实现 - 个人中心 API

我们将利用 Django 内置的 User 模型和 rest_framework 的特性来实现这些 API。

1. 修改 UserDetailSerializer 以支持密码修改

打开 test-platform/api/serializers.py,我们将复用 UserDetailSerializer
注意: 我们在《用户管理与权限 - 篇一》中为 UserDetailSerializer 添加了 update 方法来处理密码更新,但那个是针对管理员通过 /api/users/{id}/ 来修改其他用户密码的。现在我们需要支持用户自己修改自己的密码,这通常不需要旧密码。

为了区分这两种场景,我们可以:

  1. 为用户自己修改密码创建一个单独的 API (/api/me/password/change/) 和 Serializer。
  2. UserDetailSerializer 中添加 password 字段,但在 update 方法中根据 request.userinstance 来判断是否需要旧密码验证。

我们采用方式 1,因为它更清晰,也更安全。

a. api/serializers.py 中添加 PasswordChangeSerializer
在这里插入图片描述

# test-platform/api/serializers.py
# ... (其他导入) ...
from django.contrib.auth.password_validation import validate_password
from django.contrib.auth.hashers import make_password # 用于哈希新密码class PasswordChangeSerializer(serializers.Serializer):"""用于用户修改自己密码的序列化器"""old_password = serializers.CharField(required=True, write_only=True, min_length=6)new_password = serializers.CharField(required=True, write_only=True, min_length=6)new_password_confirm = serializers.CharField(required=True, write_only=True, min_length=6)def validate_old_password(self, value):user = self.context['request'].userif not user.check_password(value):raise serializers.ValidationError("旧密码不正确。")return valuedef validate(self, data):# 验证新密码和确认密码是否一致if data['new_password'] != data['new_password_confirm']:raise serializers.ValidationError({"new_password_confirm": "两次输入的新密码不一致。"})# 确保新密码不与旧密码相同 (可选)user = self.context['request'].userif user.check_password(data['new_password']):raise serializers.ValidationError({"new_password": "新密码不能与旧密码相同。"})# 使用 Django 内置的密码验证器 (可以在 settings.py 中配置,例如密码复杂度要求)try:validate_password(data['new_password'], user=self.context['request'].user)except Exception as e:raise serializers.ValidationError({"new_password": str(e)})return data

关键点:

  • 这是一个普通的 serializers.Serializer

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

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

相关文章

STEP-BACK PROMPTING:退一步:通过抽象在大型语言模型中唤起推理能力

摘要 我们提出了 STEP-BACK PROMPTING,这是一种简单的提示技术,可以让LLM进行抽象,从包含具体细节的实例中推导出高层次概念和第一性原理。利用这些概念和原理来引导推理过程,LLM在朝向正确解答路径上显著提升了推理能力。我们在…

Paimon vs. HBase:全链路开销对比

Paimon 在特定场景(如流式 Lookup Join)下,会为了极致的查询性能而引入额外的存储(本地磁盘 LookupFile)和计算(构建 LookupFile)开销。但这是一种用一次性的、可控的开销,换取后续持…

本地的包名导致的AttributeError: module ‘langchain‘ has no attribute ‘verbose‘

你遇到的 AttributeError: module langchain has no attribute verbose 问题,确实可能是因为你的本地文件或目录名与 langchain 官方包冲突,导致 Python 在导入时优先加载了你的本地文件而非真正的 langchain 库。 问题原因 Python 模块加载机制&#xf…

玄机——某学校系统中挖矿病毒应急排查

本篇文章主要记录某学校长期未运营维护的程序,被黑客发现了漏洞,但好在学校有全流量设备,抓取到了过程中的流量包 需要你进行上机以及结合流量分析,排查攻击者利用的漏洞以及上传利用成功的木马 文章目录 靶机介绍1.使用工具分析共…

如何解决wordpress批量删除媒体库中的图片很慢甚至卡死问题

批量删除WordPress媒体库中的图片速度很慢,如果批量删除的图片多会出现CPU100%甚至卡死,出现这个问题通常最主要的原因是服务器性能问题,如果换成性能好的服务器就不会了,比如换Siteground 家的服务器,就不会有这个问题…

深度学习入门day4--手写数字识别初探

鱼书提供的代码可以在github找到。源码地址 环境配置部分可以看前面几篇博客,还是用Anaconda,运行下面代码,可以看哪个库缺失。 import importlib import numpy as np deps {"torch": "torch","torchvision"…

STM32中定时器配置,HAL_Delay的原理,滴答定时器,微秒延时实现,PWM,呼吸灯

目录 定时器基本定时功能实现 CubeMX设置 手动书写代码部分 定时器启动 实现溢出回调函数 HAL_Delay介绍 HAL_Delay实现原理 HAL_Delay的优点 HAL_Delay的缺点 利用滴答定时器(SysTick)实现微秒级延时 PWM PWM介绍 通用定时器中的重要寄存器 PWM中的捕获比较通道 …

飞牛NAS(fnOS)详细安装教程

以下是飞牛NAS(fnOS)的详细安装教程,结合官方指南和社区实践整理而成: 一、准备工作 硬件需求 8GB或更大容量的U盘(用于制作启动盘)待安装设备(支持x86架构的物理机或迷你主机,如天钡…

springboot 显示打印加载bean耗时工具类

一 spring的原生接口说明 1.1 接口说明 Aware是Spring框架提供的一组特殊接口,可以让Bean从Spring容器中拿到一些资源信息。 BeanFactoryAware:实现该接口,可以访问BeanFactory对象,从而获取Bean在容器中的相关信息。 Environm…

OpenGL空间站场景实现方案

OpenGL空间站场景实现方案 需求分析 根据任务要求,我需要完成一个基于Nehe OpenGL的空间站场景,实现以下功能: 完整的空间站场景建模(包含多个模型和纹理贴图)Phong光照模型实现(包含多种光源和材质效果)摄像机键盘控制交互功能解决方案设计 技术栈 C++编程语言OpenG…

基于昇腾310B4的YOLOv8目标检测推理

YOLOv8目标检测 om 模型推理 本篇博客将手把手教你如何将 YOLOv8 目标检测模型部署到华为昇腾 310B4 开发板上进行高效推理(其他昇腾开发版也可参考此流程)。 整个流程包括: 模型格式转换(ONNX → OM)昇腾推理环境配…

前端跨域问题解决Access to XMLHttpRequest at xxx from has been blocked by CORS policy

在前端开发中,跨域资源共享(CORS)是一个常见的问题。它涉及到浏览器安全机制,防止网页从一个域获取资源时被另一个域阻止。错误信息如“Access to XMLHttpRequest at xxx from origin has been blocked by CORS policy”是典型的跨…

[ linux-系统 ] 软硬链接与动静态库

软硬链接 介绍 软链接 通过下图可以看出软链接和原始文件是两个独立的文件,因为软链接有着自己的inode编号: 具有独立的 inode ,也有独立的数据块,它的数据块里面保存的是指向的文件的路径,公用 inode 硬链接 通过…

3D 商品展示与 AR 试戴能为珠宝行业带来一些便利?

对于珠宝行业而言,长久以来,如何让消费者在做出购买决策之前,便能真切且直观地领略到珠宝独一无二的魅力,始终是横亘在行业发展道路上的一道棘手难题。而 3D 互动营销的横空出世,恰似一道曙光,完美且精准地…

电子电气架构 --- SOVD功能简单介绍

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

【Java编程动手学】 Java中的运算符全解析

文章目录 一、引言二、算术运算符1、基本概念2、具体运算符及示例 三、关系运算符1、基本概念2、具体运算符及示例 四、自增减运算符1、基本概念2、具体运算符及示例 五、逻辑运算符1、基本概念2、具体运算符及示例 六、位运算符1、基本概念2、具体运算符及示例 七、移位运算符…

【前端】1 小时实现 React 简历项目

近期更新完毕。仅包括核心代码 目录结构 yarn.lock保证开发者每次能下载到同版本依赖,一般不需要特别留意 package.json 是 Node.js 项目、前端项目、npm/yarn的配置文件。 Dockerfile 是用来 定义 Docker 镜像构建过程的文本文件。它是一份脚本,告诉 …

python中的pydantic是什么?

Pydantic 是 Python 中一个用于数据验证和设置管理的库,主要通过 Python 类型注解(Type Hints)来定义数据结构,并自动验证输入数据的合法性。它广泛应用于 API 开发(如 FastAPI)、配置管理、数据序列化等场…

腾讯云市场目前饱和度

首先我需要理解市场饱和度的概念。市场饱和度通常指一个产品或服务在潜在市场中的渗透程度,高饱和度意味着市场增长空间有限,低饱和度则表明还有较大发展潜力。 从搜索结果看,腾讯云目前在中国云服务市场排名第三,市场份额约为15%…

EDR、NDR、XDR工作原理和架构及区别

大家读完觉得有帮助记得关注和点赞!!! EDR、NDR、XDR是网络安全中关键的检测与响应技术,它们在覆盖范围、数据源和响应机制上有显著差异。以下是它们的工作原理和架构详解: --- ### 🔍 一、EDR&#xff0…