二十九、【用户体验篇】个人中心:用户资料展示与密码修改
- 前言
- 准备工作
- 第一部分:后端实现 - 个人中心 API
- 1. 修改 `UserDetailSerializer` 以支持密码修改
- 2. 在 `api/views.py` 中添加 `UserMeView` 和 `PasswordChangeView`
- 3. 注册个人中心相关 API 路由
- 4. 后端初步测试
- 第二部分:前端实现 - 个人中心页面
- 1. 更新 `user.ts` API 服务
- 2. 添加个人中心路由和顶部菜单入口
- 3. 创建个人中心页面 (`src/views/profile/UserProfileView.vue`)
- 第三部分:全面测试
- 总结
前言
在测试平台中,个人中心是不可或缺的重要组成部分。它不仅提供了用户查看和管理自身信息的能力,更是保障账户安全、提升用户体验的关键功能。
准备工作
- Django 后端项目就绪: 确保你的
test-platform/backend
项目结构完整,JWT 认证已配置。 - Vue3 前端项目就绪。
- Axios 和 API 服务已封装。
- Element Plus 集成完毕。
- 用户已登录: 个人中心页面需要用户登录才能访问。
第一部分:后端实现 - 个人中心 API
我们将利用 Django 内置的 User
模型和 rest_framework
的特性来实现这些 API。
1. 修改 UserDetailSerializer
以支持密码修改
打开 test-platform/api/serializers.py
,我们将复用 UserDetailSerializer
。
注意: 我们在《用户管理与权限 - 篇一》中为 UserDetailSerializer
添加了 update
方法来处理密码更新,但那个是针对管理员通过 /api/users/{id}/
来修改其他用户密码的。现在我们需要支持用户自己修改自己的密码,这通常不需要旧密码。
为了区分这两种场景,我们可以:
- 为用户自己修改密码创建一个单独的 API (
/api/me/password/change/
) 和 Serializer。 - 在
UserDetailSerializer
中添加password
字段,但在update
方法中根据request.user
和instance
来判断是否需要旧密码验证。
我们采用方式 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
,