
功能特性: - JWT用户认证系统 - 日报CRUD管理 - 三级权限控制 - 多维度搜索过滤 - 统计分析功能 - 评论互动系统 - 响应式Cool Admin界面 - 暗色主题支持 技术栈: - 后端:Django 4.2.7 + DRF + SimpleJWT - 前端:Vue 3 + Element Plus + Pinia - 数据库:SQLite/PostgreSQL - 部署:Docker + Nginx 包含内容: - 完整的后端API代码 - 现代化前端界面 - 数据库迁移文件 - 部署脚本和文档 - 演示页面和测试工具
75 lines
2.7 KiB
Python
75 lines
2.7 KiB
Python
from rest_framework import serializers
|
|
from django.contrib.auth import authenticate
|
|
from django.contrib.auth.password_validation import validate_password
|
|
from .models import User
|
|
|
|
|
|
class UserRegistrationSerializer(serializers.ModelSerializer):
|
|
"""用户注册序列化器"""
|
|
password = serializers.CharField(write_only=True, validators=[validate_password])
|
|
password_confirm = serializers.CharField(write_only=True)
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ('username', 'email', 'first_name', 'last_name',
|
|
'phone', 'department', 'position', 'password', 'password_confirm')
|
|
|
|
def validate(self, attrs):
|
|
if attrs['password'] != attrs['password_confirm']:
|
|
raise serializers.ValidationError("密码不一致")
|
|
return attrs
|
|
|
|
def create(self, validated_data):
|
|
validated_data.pop('password_confirm', None)
|
|
user = User.objects.create_user(**validated_data)
|
|
return user
|
|
|
|
|
|
class UserLoginSerializer(serializers.Serializer):
|
|
"""用户登录序列化器"""
|
|
username = serializers.CharField()
|
|
password = serializers.CharField(write_only=True)
|
|
|
|
def validate(self, attrs):
|
|
username = attrs.get('username')
|
|
password = attrs.get('password')
|
|
|
|
if username and password:
|
|
user = authenticate(username=username, password=password)
|
|
if not user:
|
|
raise serializers.ValidationError('用户名或密码错误')
|
|
if not user.is_active:
|
|
raise serializers.ValidationError('用户账号已被禁用')
|
|
attrs['user'] = user
|
|
else:
|
|
raise serializers.ValidationError('用户名和密码不能为空')
|
|
|
|
return attrs
|
|
|
|
|
|
class UserProfileSerializer(serializers.ModelSerializer):
|
|
"""用户信息序列化器"""
|
|
full_name = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ('id', 'username', 'email', 'first_name', 'last_name',
|
|
'full_name', 'phone', 'department', 'position', 'avatar',
|
|
'is_staff', 'is_superuser', 'date_joined')
|
|
read_only_fields = ('id', 'username', 'is_staff', 'is_superuser', 'date_joined')
|
|
|
|
def get_full_name(self, obj):
|
|
return f'{obj.first_name} {obj.last_name}'.strip() or obj.username
|
|
|
|
|
|
class UserListSerializer(serializers.ModelSerializer):
|
|
"""用户列表序列化器"""
|
|
full_name = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ('id', 'username', 'full_name', 'email', 'department', 'position', 'is_active')
|
|
|
|
def get_full_name(self, obj):
|
|
return f'{obj.first_name} {obj.last_name}'.strip() or obj.username
|