seaislee1209 e2973284d0
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 2m20s
feat: 账号安全管控 + 内容资产页 + UI修缮 (v0.9.5 & v0.9.6)
v0.9.5 — 账号安全管控 + 内容资产页:
- 首次登录强制改密(must_change_password + ForceChangePasswordModal)
- 并发会话限制(ActiveSession + SessionJWT认证,可配置桌面/移动端会话数)
- Token生命周期缩短(access 30min, refresh 1天)
- 登录IP记录(LoginRecord模型,为异常检测打基础)
- 内容资产页(超管三级折叠/团队管两级折叠,按需懒加载)

v0.9.6 — UI修缮:
- 侧栏导航排序(内容资产移到用户管理下方)
- 视频网格高度调整(440px,3行+暗示可滚动)
- 秒数单位统一(不再换算为分钟/小时)
- 提示词标签溢出修复 + 弹窗方向自适应

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 12:02:54 +08:00

57 lines
1.8 KiB
Python

from rest_framework import serializers
from django.contrib.auth import get_user_model
from rest_framework_simplejwt.tokens import RefreshToken
User = get_user_model()
class UserSerializer(serializers.ModelSerializer):
role = serializers.CharField(read_only=True)
team_name = serializers.CharField(source='team.name', read_only=True, default=None)
class Meta:
model = User
fields = ('id', 'username', 'email', 'is_staff', 'is_team_admin', 'role', 'team_name', 'must_change_password')
class RegisterSerializer(serializers.Serializer):
username = serializers.CharField(min_length=3, max_length=20)
email = serializers.EmailField()
password = serializers.CharField(min_length=6, write_only=True)
def validate_username(self, value):
if User.objects.filter(username=value).exists():
raise serializers.ValidationError('该用户名已被注册')
return value
def validate_email(self, value):
if User.objects.filter(email=value).exists():
raise serializers.ValidationError('该邮箱已被注册')
return value
def create(self, validated_data):
user = User.objects.create_user(
username=validated_data['username'],
email=validated_data['email'],
password=validated_data['password'],
)
return user
class LoginSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField(write_only=True)
class TokenResponseSerializer(serializers.Serializer):
"""Response serializer for auth endpoints."""
user = UserSerializer()
tokens = serializers.SerializerMethodField()
def get_tokens(self, obj):
refresh = RefreshToken.for_user(obj)
return {
'access': str(refresh.access_token),
'refresh': str(refresh),
}