🎯 重构登录逻辑:以人为核心的三种出战模式
核心变更: - 单枪匹马 (solo) - 人类单独出战 - 组队团战 (team) - 人类 +N 龙虾 - 独当一面 (agent_only) - 龙虾单独出征 后端: - users/views.py: 支持多选 agent_ids - 新增 mode_names 映射 - 错误提示优化 前端: - 新模式选择 UI(带图标和说明) - 多选龙虾复选框 - 实时显示已选龙虾数量 - 选中模式高亮显示 测试: - test_new_login.py: 完整测试三种模式 - 绑定第二只龙虾(龙虾监控 🦞) 结果: ✅ 单枪匹马 - 1 个人类座位 ✅ 组队团战 - 1+N 个座位(人类 + 龙虾) ✅ 独当一面 - N 个龙虾座位
This commit is contained in:
@@ -8,11 +8,17 @@ User = get_user_model()
|
||||
class LoginSerializer(serializers.Serializer):
|
||||
username = serializers.CharField()
|
||||
password = serializers.CharField()
|
||||
login_mode = serializers.ChoiceField(
|
||||
choices=['human_only', 'agent_only', 'both'],
|
||||
default='human_only'
|
||||
mode = serializers.ChoiceField(
|
||||
choices=['solo', 'team', 'agent_only'],
|
||||
default='solo',
|
||||
help_text='solo=单枪匹马,team=组队团战,agent_only=独当一面'
|
||||
)
|
||||
agent_ids = serializers.ListField(
|
||||
child=serializers.CharField(),
|
||||
required=False,
|
||||
default=list,
|
||||
help_text='选择的龙虾 ID 列表(team 或 agent_only 模式)'
|
||||
)
|
||||
selected_agent_id = serializers.CharField(required=False, allow_blank=True)
|
||||
|
||||
|
||||
class LoginView(views.APIView):
|
||||
@@ -23,8 +29,8 @@ class LoginView(views.APIView):
|
||||
|
||||
username = serializer.validated_data['username']
|
||||
password = serializer.validated_data['password']
|
||||
login_mode = serializer.validated_data.get('login_mode', 'human_only')
|
||||
selected_agent_id = serializer.validated_data.get('selected_agent_id')
|
||||
mode = serializer.validated_data.get('mode', 'solo')
|
||||
agent_ids = serializer.validated_data.get('agent_ids', [])
|
||||
|
||||
user = authenticate(username=username, password=password)
|
||||
if not user:
|
||||
@@ -40,8 +46,8 @@ class LoginView(views.APIView):
|
||||
# 构建会话信息
|
||||
sessions = []
|
||||
|
||||
if login_mode in ['human_only', 'both']:
|
||||
# 人类身份
|
||||
if mode in ['solo', 'team']:
|
||||
# 人类身份(单枪匹马 或 组队团战)
|
||||
sessions.append({
|
||||
'session_type': 'human',
|
||||
'nickname': user.username,
|
||||
@@ -49,10 +55,17 @@ class LoginView(views.APIView):
|
||||
'user_id': user.id
|
||||
})
|
||||
|
||||
if login_mode in ['agent_only', 'both']:
|
||||
# 龙虾身份
|
||||
if selected_agent_id:
|
||||
agent = user.get_linked_agent(selected_agent_id)
|
||||
if mode in ['team', 'agent_only']:
|
||||
# 龙虾身份(组队团战 或 独当一面)
|
||||
if not agent_ids:
|
||||
return Response(
|
||||
{'error': '组队或独当一面模式需要选择至少一只龙虾'},
|
||||
status=status.HTTP_400_BAD_REQUEST
|
||||
)
|
||||
|
||||
# 添加所有选择的龙虾
|
||||
for agent_id in agent_ids:
|
||||
agent = user.get_linked_agent(agent_id)
|
||||
if agent:
|
||||
sessions.append({
|
||||
'session_type': 'agent',
|
||||
@@ -64,10 +77,17 @@ class LoginView(views.APIView):
|
||||
})
|
||||
else:
|
||||
return Response(
|
||||
{'error': f'未找到绑定的龙虾:{selected_agent_id}'},
|
||||
{'error': f'未找到绑定的龙虾:{agent_id}'},
|
||||
status=status.HTTP_400_BAD_REQUEST
|
||||
)
|
||||
|
||||
# 模式名称映射
|
||||
mode_names = {
|
||||
'solo': '单枪匹马',
|
||||
'team': '组队团战',
|
||||
'agent_only': '独当一面'
|
||||
}
|
||||
|
||||
return Response({
|
||||
'token': token,
|
||||
'user': {
|
||||
@@ -77,7 +97,8 @@ class LoginView(views.APIView):
|
||||
'linked_agents': user.linked_agents
|
||||
},
|
||||
'sessions': sessions,
|
||||
'login_mode': login_mode
|
||||
'mode': mode,
|
||||
'mode_name': mode_names.get(mode, mode)
|
||||
})
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user