初始提交:企业级日报系统完整代码
功能特性: - JWT用户认证系统 - 日报CRUD管理 - 三级权限控制 - 多维度搜索过滤 - 统计分析功能 - 评论互动系统 - 响应式Cool Admin界面 - 暗色主题支持 技术栈: - 后端:Django 4.2.7 + DRF + SimpleJWT - 前端:Vue 3 + Element Plus + Pinia - 数据库:SQLite/PostgreSQL - 部署:Docker + Nginx 包含内容: - 完整的后端API代码 - 现代化前端界面 - 数据库迁移文件 - 部署脚本和文档 - 演示页面和测试工具
This commit is contained in:
131
backend/daily_report/serializers.py
Normal file
131
backend/daily_report/serializers.py
Normal file
@@ -0,0 +1,131 @@
|
||||
from rest_framework import serializers
|
||||
from django.contrib.auth import get_user_model
|
||||
from .models import DailyReport, ReportComment
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
class UserSimpleSerializer(serializers.ModelSerializer):
|
||||
"""用户简单信息序列化器"""
|
||||
full_name = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = ('id', 'username', 'full_name', 'department', 'position')
|
||||
|
||||
def get_full_name(self, obj):
|
||||
return f'{obj.first_name} {obj.last_name}'.strip() or obj.username
|
||||
|
||||
|
||||
class ReportCommentSerializer(serializers.ModelSerializer):
|
||||
"""日报评论序列化器"""
|
||||
user = UserSimpleSerializer(read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = ReportComment
|
||||
fields = ('id', 'user', 'content', 'created_at', 'updated_at')
|
||||
read_only_fields = ('id', 'created_at', 'updated_at')
|
||||
|
||||
def create(self, validated_data):
|
||||
validated_data['user'] = self.context['request'].user
|
||||
return super().create(validated_data)
|
||||
|
||||
|
||||
class DailyReportListSerializer(serializers.ModelSerializer):
|
||||
"""日报列表序列化器"""
|
||||
user = UserSimpleSerializer(read_only=True)
|
||||
work_summary_preview = serializers.ReadOnlyField()
|
||||
next_day_plan_preview = serializers.ReadOnlyField()
|
||||
comments_count = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = DailyReport
|
||||
fields = (
|
||||
'id', 'user', 'work_summary_preview', 'next_day_plan_preview',
|
||||
'report_date', 'created_at', 'updated_at', 'is_draft', 'comments_count'
|
||||
)
|
||||
|
||||
def get_comments_count(self, obj):
|
||||
return obj.comments.count()
|
||||
|
||||
|
||||
class DailyReportDetailSerializer(serializers.ModelSerializer):
|
||||
"""日报详情序列化器"""
|
||||
user = UserSimpleSerializer(read_only=True)
|
||||
comments = ReportCommentSerializer(many=True, read_only=True)
|
||||
can_edit = serializers.SerializerMethodField()
|
||||
can_delete = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = DailyReport
|
||||
fields = (
|
||||
'id', 'user', 'work_summary', 'next_day_plan', 'difficulties',
|
||||
'suggestions', 'report_date', 'created_at', 'updated_at',
|
||||
'is_draft', 'comments', 'can_edit', 'can_delete'
|
||||
)
|
||||
|
||||
def get_can_edit(self, obj):
|
||||
request = self.context.get('request')
|
||||
if not request or not request.user:
|
||||
return False
|
||||
return obj.user == request.user or request.user.is_staff
|
||||
|
||||
def get_can_delete(self, obj):
|
||||
request = self.context.get('request')
|
||||
if not request or not request.user:
|
||||
return False
|
||||
return obj.user == request.user or request.user.is_staff
|
||||
|
||||
|
||||
class DailyReportCreateUpdateSerializer(serializers.ModelSerializer):
|
||||
"""日报创建和更新序列化器"""
|
||||
|
||||
class Meta:
|
||||
model = DailyReport
|
||||
fields = (
|
||||
'work_summary', 'next_day_plan', 'difficulties',
|
||||
'suggestions', 'report_date', 'is_draft'
|
||||
)
|
||||
|
||||
def validate_report_date(self, value):
|
||||
"""验证日报日期"""
|
||||
request = self.context.get('request')
|
||||
if not request:
|
||||
return value
|
||||
|
||||
# 检查是否已存在该日期的日报(更新时排除当前记录)
|
||||
queryset = DailyReport.objects.filter(
|
||||
user=request.user,
|
||||
report_date=value
|
||||
)
|
||||
|
||||
# 如果是更新操作,排除当前记录
|
||||
if self.instance:
|
||||
queryset = queryset.exclude(id=self.instance.id)
|
||||
|
||||
if queryset.exists():
|
||||
raise serializers.ValidationError(f'您已在 {value} 提交过日报,每天只能提交一份日报。')
|
||||
|
||||
return value
|
||||
|
||||
def create(self, validated_data):
|
||||
validated_data['user'] = self.context['request'].user
|
||||
return super().create(validated_data)
|
||||
|
||||
|
||||
class DailyReportStatsSerializer(serializers.Serializer):
|
||||
"""日报统计序列化器"""
|
||||
total_reports = serializers.IntegerField()
|
||||
this_month_reports = serializers.IntegerField()
|
||||
this_week_reports = serializers.IntegerField()
|
||||
draft_reports = serializers.IntegerField()
|
||||
completion_rate = serializers.FloatField()
|
||||
|
||||
|
||||
class UserReportStatsSerializer(serializers.Serializer):
|
||||
"""用户日报统计序列化器"""
|
||||
user = UserSimpleSerializer()
|
||||
total_reports = serializers.IntegerField()
|
||||
this_month_reports = serializers.IntegerField()
|
||||
last_report_date = serializers.DateField()
|
||||
completion_rate = serializers.FloatField()
|
Reference in New Issue
Block a user