开发了多角色登录与鉴权接口:实现了普通用户、企业和管理员的登录分流,并支持Token验证。

开发了权限控制接口:实现了通过数据库分配菜单权限节点,控制接口访问安全。
开发了实名认证中心:实现了个人身份证信息与企业营业执照的提交与审核接口。
开发了任务与协作大厅核心业务:实现了任务的发布、接单、状态流转以及专家邀约接口。
配置了全局环境变量与数据库引擎:集成了 PostgreSQL 数据库、Redis 缓存与 MinIO 对象存储。
This commit is contained in:
2026-04-28 16:32:02 +08:00
commit 23855ef0e4
94 changed files with 4950 additions and 0 deletions

69
tasks/serializers.py Normal file
View File

@@ -0,0 +1,69 @@
from rest_framework import serializers
from .models import Task, TaskApplication, TaskInvitation, DeliveryRecord
class DeliveryRecordSerializer(serializers.ModelSerializer):
class Meta:
model = DeliveryRecord
fields = '__all__'
class TaskApplicationSerializer(serializers.ModelSerializer):
applicant_name = serializers.ReadOnlyField(source='applicant.nickname')
applicant_username = serializers.ReadOnlyField(source='applicant.username')
applicant_avatar = serializers.ReadOnlyField(source='applicant.avatar_url')
applicant_rating = serializers.ReadOnlyField(source='applicant.rating')
applicant_completed_tasks = serializers.ReadOnlyField(source='applicant.completed_tasks')
task_detail = serializers.SerializerMethodField()
is_invited = serializers.SerializerMethodField()
delivery_records = DeliveryRecordSerializer(many=True, read_only=True)
class Meta:
model = TaskApplication
fields = '__all__'
read_only_fields = ['id', 'applicant', 'status', 'reviewed_by', 'reviewed_at', 'created_at', 'updated_at']
def get_task_detail(self, obj):
return {
'id': obj.task.id,
'title': obj.task.title,
'budget_min': obj.task.budget_min,
'budget_max': obj.task.budget_max,
'status': obj.task.status,
}
def get_is_invited(self, obj):
from .models import TaskInvitation
return TaskInvitation.objects.filter(task=obj.task, expert=obj.applicant).exists()
class TaskInvitationSerializer(serializers.ModelSerializer):
enterprise_name = serializers.ReadOnlyField(source='task.enterprise.company_name')
enterprise_logo = serializers.ReadOnlyField(source='task.enterprise.logo_url')
enterprise_avatar = serializers.ReadOnlyField(source='task.publisher.avatar_url')
inviter_name = serializers.ReadOnlyField(source='task.publisher.nickname')
enterprise_phone = serializers.ReadOnlyField(source='task.publisher.phone')
task_title = serializers.ReadOnlyField(source='task.title')
expert_name = serializers.ReadOnlyField(source='expert.nickname')
expert_avatar = serializers.ReadOnlyField(source='expert.avatar_url')
expert_phone = serializers.ReadOnlyField(source='expert.phone')
class Meta:
model = TaskInvitation
fields = '__all__'
read_only_fields = ['id', 'created_at', 'updated_at']
class TaskSerializer(serializers.ModelSerializer):
applications = TaskApplicationSerializer(many=True, read_only=True)
invitations = TaskInvitationSerializer(many=True, read_only=True)
publisher_name = serializers.ReadOnlyField(source='publisher.nickname')
publisher_avatar = serializers.ReadOnlyField(source='publisher.avatar_url')
publisher_phone = serializers.ReadOnlyField(source='publisher.phone')
enterprise_name = serializers.ReadOnlyField(source='enterprise.company_name')
enterprise_logo = serializers.ReadOnlyField(source='enterprise.logo_url')
class Meta:
model = Task
fields = '__all__'
read_only_fields = ['id', 'publisher', 'enterprise', 'created_at', 'updated_at', 'assigned_at', 'completed_at', 'cancelled_at']