二十九、【用戶體驗篇】個人中心:用戶資料展示與密碼修改
- 前言
- 準備工作
- 第一部分:后端實現 - 個人中心 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
,