# 个人主页与个人设置功能增强计划 ## 概述 本文档描述个人主页(UserHome)和个人设置(Profile)的功能增强实现方案。 ### 用户选择的功能 **个人主页(UserHome)**: 1. 学习/课程展示 - 展示用户已学习的课程和学习进度 2. 活动时间线 - 展示用户的动态、评论、点赞等活动 3. 个人主页封面设置 - 允许用户自定义个人主页的背景图/封面 **个人设置(Profile)**: 1. 隐私设置 - 控制谁可以查看你的主页、文章等内容 2. 登录设备管理 - 管理已登录的设备,支持远程登出 3. 消息通知设置 - 管理邮件、浏览器等消息通知偏好 --- ## 一、个人主页(UserHome)功能增强 ### 1.1 学习/课程展示 **当前状态**:UserHome 没有展示用户已学课程和学习进度。 **实现方案**: #### 后端 - 在 `learn/views.py` 中添加接口获取用户学习进度 - 返回用户已学习的课程列表和完成百分比 **新增API**: - `GET /learn/my-progress/` - 获取当前用户学习进度 **请求参数**:无 **响应示例**: ```json { "code": 10000, "data": { "courses": [ { "id": 1, "title": "Python基础", "cover_image": "", "progress": 75, "completed_chapters": 3, "total_chapters": 4, "last_studied_at": "2026-08-01 15:30:00" } ], "total_courses": 5, "total_completed": 2 } } ``` #### 前端 - 在 `UserHome.tsx` 添加新的标签页"学习" - 展示课程卡片,包含进度条和完成状态 - 点击跳转到课程详情页 **新增文件**: - `src/pages/UserHome/components/CourseProgressCard.tsx` - 课程进度卡片组件 **修改文件**: - `src/pages/UserHome/UserHome.tsx` - 添加"学习"标签页 - `src/pages/UserHome/UserHome.css` - 添加进度条样式 - `src/utils/request.ts` - 添加API请求方法 - `src/locales/*.json` - 添加国际化文本 --- ### 1.2 活动时间线 **当前状态**:UserHome 的"活动"标签页是空的(``)。 **实现方案**: #### 后端 - 在 `user/views/` 中添加活动视图 - 聚合用户的各种活动(发表文章、评论、点赞、收藏、学习等) **新增API**: - `GET /user/activities/` - 获取用户活动时间线 **响应示例**: ```json { "code": 10000, "data": { "activities": [ { "id": 1, "type": "article", "title": "发表文章", "description": "发布了《Python入门指南》", "created_at": "2026-08-01 10:30:00" }, { "id": 2, "type": "comment", "title": "评论", "description": "评论了《JavaScript高级技巧》", "created_at": "2026-07-31 14:20:00" }, { "id": 3, "type": "like", "title": "点赞", "description": "点赞了《Vue3实战》", "created_at": "2026-07-30 09:15:00" }, { "id": 4, "type": "favorite", "title": "收藏", "description": "收藏了《React Hooks详解》", "created_at": "2026-07-29 16:45:00" }, { "id": 5, "type": "study", "title": "学习", "description": "完成了《Python基础》第3章", "created_at": "2026-07-28 11:00:00" } ] } } ``` #### 前端 - 实现活动时间线组件 - 按时间倒序展示活动 - 每种活动类型有不同的图标和颜色 **新增文件**: - `src/pages/UserHome/components/ActivityTimeline.tsx` - 活动时间线组件 **修改文件**: - `src/pages/UserHome/UserHome.tsx` - 实现"活动"标签页 - `src/pages/UserHome/UserHome.css` - 添加时间线样式 - `src/utils/request.ts` - 添加API请求方法 - `src/locales/*.json` - 添加国际化文本 --- ### 1.3 个人主页封面设置 **当前状态**:UserHome 没有封面图,只有纯色渐变背景。 **实现方案**: #### 后端 - 在 `FUser` 模型中添加 `cover_image` 字段 - 添加封面上传API **模型变更**: ```python # user/models.py class FUser(AbstractUser): # ... 现有字段 ... cover_image = models.ImageField(upload_to='covers/', blank=True, null=True, verbose_name='个人主页封面') ``` **新增API**: - `POST /user/profile/cover/` - 上传个人主页封面 #### 前端 - 在 UserHome Hero 区域添加封面图 - 仅主页所有者显示"更换封面"按钮 - 支持拖拽或点击上传 **修改文件**: - `src/pages/UserHome/UserHome.tsx` - 添加封面图和上传功能 - `src/pages/UserHome/UserHome.css` - 添加封面样式 - `src/utils/request.ts` - 添加API请求方法 - `src/locales/*.json` - 添加国际化文本 --- ## 二、个人设置(Profile)功能增强 ### 2.1 隐私设置 **当前状态**:Profile 没有隐私设置选项。 **实现方案**: #### 后端 - 在 `FUser` 模型中添加隐私设置字段 - 添加隐私设置API **模型变更**: ```python # user/models.py class FUser(AbstractUser): # ... 现有字段 ... privacy_profile = models.CharField(max_length=20, default='public', verbose_name='主页可见性') privacy_articles = models.CharField(max_length=20, default='public', verbose_name='文章可见性') privacy_friends = models.CharField(max_length=20, default='public', verbose_name='好友列表可见性') ``` **新增API**: - `GET /user/privacy/` - 获取隐私设置 - `PUT /user/privacy/` - 更新隐私设置 **响应示例**: ```json { "code": 10000, "data": { "privacy_profile": "public", "privacy_articles": "public", "privacy_friends": "friends_only" } } ``` #### 前端 - 在 Profile 侧边栏添加"隐私设置"菜单项 - 实现隐私设置表单 - 选项:公开、仅好友、仅自己 **新增文件**: - `src/pages/Profile/components/PrivacySettingCard.tsx` - 隐私设置卡片 **修改文件**: - `src/pages/Profile/Profile.tsx` - 添加隐私设置菜单 - `src/utils/request.ts` - 添加API请求方法 - `src/locales/*.json` - 添加国际化文本 --- ### 2.2 登录设备管理 **当前状态**:Profile 有"最近登录"记录查看,但没有设备管理功能。 **实现方案**: #### 后端 - 创建 `UserDevice` 模型管理登录设备 - 添加设备管理API **新增模型**: ```python # user/models.py class UserDevice(models.Model): user = models.ForeignKey(FUser, on_delete=models.CASCADE, related_name='devices') device_name = models.CharField(max_length=100, verbose_name='设备名称') device_type = models.CharField(max_length=20, verbose_name='设备类型') browser = models.CharField(max_length=100, verbose_name='浏览器') ip_address = models.GenericIPAddressField(verbose_name='IP地址') location = models.CharField(max_length=200, verbose_name='登录地点') last_active = models.DateTimeField(auto_now=True, verbose_name='最后活跃时间') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') is_current = models.BooleanField(default=False, verbose_name='是否当前设备') ``` **新增API**: - `GET /user/devices/` - 获取登录设备列表 - `DELETE /user/devices//` - 移除/登出设备 #### 前端 - 在 Profile 侧边栏添加"登录设备"菜单项 - 展示设备列表,包含设备类型图标 - 支持"退出其他设备"操作 - 当前设备高亮显示 **新增文件**: - `src/pages/Profile/components/DeviceManagementCard.tsx` - 设备管理卡片 **修改文件**: - `src/pages/Profile/Profile.tsx` - 添加设备管理菜单 - `src/utils/request.ts` - 添加API请求方法 - `src/locales/*.json` - 添加国际化文本 --- ### 2.3 消息通知设置 **当前状态**:Settings(全局设置)有消息通知开关,但 Profile 没有针对个人的通知偏好设置。 **实现方案**: #### 后端 - 在 `FUser` 模型中添加通知偏好字段 - 添加通知设置API **模型变更**: ```python # user/models.py class FUser(AbstractUser): # ... 现有字段 ... notify_email = models.BooleanField(default=True, verbose_name='邮件通知') notify_browser = models.BooleanField(default=True, verbose_name='浏览器通知') notify_reply = models.BooleanField(default=True, verbose_name='回复通知') notify_like = models.BooleanField(default=True, verbose_name='点赞通知') notify_follow = models.BooleanField(default=True, verbose_name='关注通知') notify_system = models.BooleanField(default=True, verbose_name='系统通知') ``` **新增API**: - `GET /user/notification-settings/` - 获取通知设置 - `PUT /user/notification-settings/` - 更新通知设置 #### 前端 - 在 Profile 侧边栏添加"消息通知"菜单项 - 实现通知设置表单 - 分类设置:评论、点赞、关注、系统 **新增文件**: - `src/pages/Profile/components/NotificationSettingCard.tsx` - 通知设置卡片 **修改文件**: - `src/pages/Profile/Profile.tsx` - 添加通知设置菜单 - `src/utils/request.ts` - 添加API请求方法 - `src/locales/*.json` - 添加国际化文本 --- ## 三、文件清单 ### 新增文件 | 文件路径 | 说明 | |---------|------| | `src/pages/UserHome/components/CourseProgressCard.tsx` | 课程进度卡片 | | `src/pages/UserHome/components/ActivityTimeline.tsx` | 活动时间线 | | `src/pages/Profile/components/PrivacySettingCard.tsx` | 隐私设置卡片 | | `src/pages/Profile/components/DeviceManagementCard.tsx` | 设备管理卡片 | | `src/pages/Profile/components/NotificationSettingCard.tsx` | 通知设置卡片 | | `learn/migrations/0005_add_course_progress.py` | 学习进度迁移 | | `user/migrations/0007_add_user_device_and_privacy.py` | 设备管理迁移 | ### 修改文件 | 文件路径 | 说明 | |---------|------| | `learn/views.py` | 添加学习进度接口 | | `learn/urls.py` | 添加学习进度路由 | | `user/models.py` | 添加封面、隐私、通知字段,UserDevice模型 | | `user/views/user.py` | 添加隐私、设备、通知接口 | | `user/urls.py` | 添加新路由 | | `src/pages/UserHome/UserHome.tsx` | 添加学习标签页、活动实现、封面功能 | | `src/pages/UserHome/UserHome.css` | 添加时间线、进度条、封面样式 | | `src/pages/Profile/Profile.tsx` | 添加新菜单项 | | `src/utils/request.ts` | 添加API请求方法 | | `src/locales/zh.json` | 添加中文国际化 | | `src/locales/en.json` | 添加英文国际化 | | `src/locales/ja.json` | 添加日文国际化 | | `src/locales/ko.json` | 添加韩文国际化 | | `src/locales/ru.json` | 添加俄文国际化 | | `src/locales/zh-TW.json` | 添加繁体中文国际化 | --- ## 四、实现步骤 ### 第一阶段:后端基础 1. 添加 `UserDevice` 模型和相关迁移 2. 添加 `FUser` 的新字段(封面、隐私、通知)和相关迁移 3. 实现学习进度API 4. 实现用户活动API 5. 实现隐私设置API 6. 实现设备管理API 7. 实现通知设置API 8. 运行数据库迁移 ### 第二阶段:前端个人主页 1. 添加学习/课程展示标签页 2. 实现活动时间线组件 3. 实现个人主页封面设置功能 ### 第三阶段:前端个人设置 1. 实现隐私设置组件 2. 实现登录设备管理组件 3. 实现消息通知设置组件 ### 第四阶段:国际化 1. 添加所有新文本的国际化支持 2. 测试多语言显示 ### 第五阶段:测试与优化 1. 功能测试 2. UI/UX优化 3. 响应式适配 --- ## 五、验证步骤 ### 后端验证 1. 运行 `python manage.py migrate` 确认迁移成功 2. 使用API测试工具测试所有新接口 3. 验证权限控制(仅本人可操作) ### 前端验证 1. 启动开发服务器 `npm run dev` 2. 访问 `/user` 查看个人主页新功能 3. 访问 `/profile` 查看个人设置新功能 4. 测试深色/浅色模式下的显示 5. 测试移动端响应式布局 ### 功能验证清单 - [ ] 学习进度正确显示 - [ ] 活动时间线正确聚合 - [ ] 个人主页封面可上传和显示 - [ ] 隐私设置正确保存和应用 - [ ] 登录设备列表正确显示 - [ ] 可成功退出其他设备 - [ ] 消息通知设置正确保存 - [ ] 多语言文本正确显示 --- ## 六、技术注意事项 1. **性能优化**:活动时间线需要分页加载,避免一次性加载过多数据 2. **安全考虑**:隐私设置需要在所有相关接口中生效 3. **图片上传**:封面图片需要压缩和格式验证 4. **设备识别**:使用 User-Agent 解析设备信息 5. **兼容性**:确保新字段不影响现有用户数据