feat(admin): Phase 1 注册邀请码逻辑 — 码必填 + kind 分流 + validate-invite + 注册页码优先重做
后端:Invitation.kind(join_team/create_team)+ team 可空 + migration;RegisterSerializer 邀请码必填, create_team 开新团队当 owner+发试用额度、join_team 幂等入伙不重复发额度,删「空码开团队」; validate-invite 免登录验码端点;团管发码恒 join_team;InvitationSerializer 增 kind/team_name。 前端:注册页码优先(验过才展开;create_team 填团队名 / join_team 只读团队名,不暴露团队列表)、 邀请链接 ?invite= 自动验码、api.validateInvite、验码行/状态提示样式(仅 token)。 测试:accounts 22/22 单测过(RegisterInviteCodeTests + ValidateInviteTests); 无头 e2e _admin-p1.mjs 全断言过 + 0 console error;tsc+build 绿。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
443023a1a9
commit
3f8547564c
@@ -118,7 +118,10 @@ def _default_invite_expiry():
|
||||
|
||||
|
||||
class Invitation(TimeStampedModel):
|
||||
"""团队邀请码:超管/团管生成,新用户凭码注册即加入该团队(幂等加成员、不重复发额度)。"""
|
||||
"""邀请码 · 两类(kind):
|
||||
- join_team(团管/超管发):绑定某团队,新用户凭码注册即加入该团队当成员(幂等、不重复发额度)。
|
||||
- create_team(平台超管发):不绑团队,新用户凭码注册 = 开新团队 + 当 owner(发试用额度)。
|
||||
注册必须有码(取消「空码开团队」),前端先验码再展开对应表单。"""
|
||||
|
||||
class Status(models.TextChoices):
|
||||
PENDING = "pending", "Pending"
|
||||
@@ -126,7 +129,13 @@ class Invitation(TimeStampedModel):
|
||||
REVOKED = "revoked", "Revoked"
|
||||
EXPIRED = "expired", "Expired"
|
||||
|
||||
team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name="invitations")
|
||||
class Kind(models.TextChoices):
|
||||
JOIN_TEAM = "join_team", "Join Team"
|
||||
CREATE_TEAM = "create_team", "Create Team"
|
||||
|
||||
kind = models.CharField(max_length=16, choices=Kind.choices, default=Kind.JOIN_TEAM)
|
||||
# join_team 必绑团队;create_team 开团队前无团队,故可空。
|
||||
team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name="invitations", null=True, blank=True)
|
||||
code = models.CharField(max_length=32, unique=True, default=_gen_invite_code)
|
||||
role = models.CharField(max_length=24, choices=TeamMember.Role.choices, default=TeamMember.Role.MEMBER)
|
||||
email = models.EmailField(blank=True)
|
||||
|
||||
Reference in New Issue
Block a user