feat: PLANNING体系首版(00路线图/02任务总表/03执行协议/I-03/I-04/registry42口径)+M1止血交付

This commit is contained in:
2026-09-12 14:25:25 +08:00
commit 8242e730b4
482 changed files with 37029 additions and 0 deletions
+165
View File
@@ -0,0 +1,165 @@
# 完善个人资料时调用 tasks.track
## 摘要
个人资料更新功能已完整,但缺少任务追踪调用。当用户修改资料(昵称、性别、简介、位置等)时,未触发 `action_type='profile'` 的任务进度上报,用户无法获得任务奖励(50积分 + 5金币 + 100 XP)。
需要在后端 `UserUpdateAPIView` 中添加追踪调用。
## 当前状态分析
### 现有基础设施(均已就绪)
| 组件 | 状态 | 文件 |
|:---|:---|:---|
| `tasks.track` API | ✅ 已实现 | `user/views/tasks.py:144-238` TaskTrackAPIView |
| "完善个人资料" 任务定义 | ✅ 已存在 | `user/models.py:169` action_type='profile' |
| `log_event` 工具函数 | ✅ 已实现 | `logs/utils.py:1-39` |
| Profile 前端页面 | ✅ 已实现 | `src/pages/Profile/UserInfoCard.tsx` |
| Profile 后端 API | ✅ 已实现但无追踪 | `user/views/user.py:496-527` UserUpdateAPIView.put() |
### 缺失的连接
`UserUpdateAPIView.put()` 在保存成功后仅返回响应,不调用:
- `log_event(event_type='profile_update', ...)`
- TaskTrackAPIView 上报 `action_type='profile'`
## 修改方案
### 文件:`chunyu_project\user\views\user.py`
**改动位置**:`UserUpdateAPIView.put()` 方法,在保存成功之后、返回响应之前
**具体修改**:
1. **新增导入**(文件顶部):
```python
from logs.utils import log_event
```
2. **在 `put()` 方法中添加追踪逻辑**(第 527 行 `return Response(...)` 之前):
```python
# 记录资料更新日志事件
request = self.request # 获取当前 request 对象
log_event(
event_type='profile_update',
user=request.user,
description=f'更新了{len(serializer.validated_data)}项个人资料',
metadata={'updated_fields': list(serializer.validated_data.keys())},
request=request
)
# 触发任务进度上报 - 完善个人资料
try:
from user.views.tasks import TaskTrackAPIView
# 内部调用 TaskTrackAPIView 的逻辑
from django.test import RequestFactory
# 直接导入并复用 TaskTrackAPIView 的追踪逻辑
from user.models import TaskDefinition, UserTaskProgress
from django.utils import timezone
task_def = TaskDefinition.objects.filter(
action_type='profile',
is_active=True
).first()
if task_def:
progress, _ = UserTaskProgress.objects.get_or_create(
user=request.user,
task=task_def,
defaults={'current_count': 0, 'completed': False}
)
if not progress.completed:
progress.current_count += 1
if progress.current_count >= task_def.target_count:
progress.completed = True
progress.completed_at = timezone.now()
progress.claimed = True
progress.save()
except Exception:
pass # 追踪失败不应影响主流程
```
**问题**:上述实现过于复杂,且需要导入大量模型。更简洁的方案是:
**更优方案**:直接在 `put()` 中构造内部请求调用 `TaskTrackAPIView`
```python
# 触发任务进度上报
try:
track_view = TrackAPIView()
track_request = RequestFactory().post('/tasks/track/', {
'action_type': 'profile',
'count': 1
})
track_request.user = request.user
track_view.post(track_request)
except Exception:
pass
```
**最终推荐**:复用 `TaskTrackAPIView` 的类方法
在 `user/views/tasks.py` 中提取追踪逻辑为独立函数:
```python
# 在 TaskTrackAPIView 同级添加
def track_user_action(user, action_type, count=1, request=None):
"""追踪用户行为并更新任务进度"""
from user.models import TaskDefinition, UserTaskProgress
from django.utils import timezone
task_def = TaskDefinition.objects.filter(
action_type=action_type,
is_active=True
).first()
if not task_def:
return
progress, _ = UserTaskProgress.objects.get_or_create(
user=user,
task=task_def,
defaults={'current_count': 0, 'completed': False}
)
if progress.completed:
return
progress.current_count += count
if progress.current_count >= task_def.target_count:
progress.completed = True
progress.completed_at = timezone.now()
progress.claimed = True
progress.save()
```
然后在 `UserUpdateAPIView.put()` 中调用:
```python
from .tasks import track_user_action
# 在保存成功后
track_user_action(request.user, 'profile', count=1, request=request)
```
### 文件:`chunyu_project\user\views\tasks.py`
**改动**:将 `TaskTrackAPIView.post()` 中的核心追踪逻辑提取为独立函数 `track_user_action`
修改 `TaskTrackAPIView.post()` 使其调用 `track_user_action`,保持 API 行为不变。
## 修改汇总
| 文件 | 改动类型 | 具体内容 |
|:---|:---|:---|
| `user/views/tasks.py` | 修改 | 提取 `track_user_action()` 函数;`TaskTrackAPIView.post()` 改为调用此函数 |
| `user/views/user.py` | 修改 | 添加 `log_event` 导入;`UserUpdateAPIView.put()` 中添加 `log_event` 和 `track_user_action` 调用 |
## 验证步骤
1. 登录后修改个人资料(如修改昵称)
2. 检查 `SystemEventLog` 表是否新增了 `event_type='profile_update'` 的记录
3. 检查 `UserTaskProgress` 表中 `action_type='profile'` 的任务进度是否更新
4. 确认用户获得了任务奖励(积分、金币、XP)