5.3 KiB
5.3 KiB
完善个人资料时调用 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() 方法,在保存成功之后、返回响应之前
具体修改:
- 新增导入(文件顶部):
from logs.utils import log_event
- 在
put()方法中添加追踪逻辑(第 527 行return Response(...)之前):
# 记录资料更新日志事件
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
# 触发任务进度上报
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 中提取追踪逻辑为独立函数:
# 在 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() 中调用:
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 调用 |
验证步骤
- 登录后修改个人资料(如修改昵称)
- 检查
SystemEventLog表是否新增了event_type='profile_update'的记录 - 检查
UserTaskProgress表中action_type='profile'的任务进度是否更新 - 确认用户获得了任务奖励(积分、金币、XP)