1
0
forked from erp-dev/erp

feat: sse && multi_merchant completed

This commit is contained in:
2025-11-11 10:56:20 +08:00
parent b2078dfa46
commit 2aafb93aad
43 changed files with 2445 additions and 244 deletions

View File

@@ -1,5 +1,9 @@
from rest_framework import serializers
from basic_info import models as basic_models
import logging
logger = logging.getLogger(__name__)
class BaseSerializer(serializers.ModelSerializer):
@@ -9,14 +13,20 @@ class BaseSerializer(serializers.ModelSerializer):
)
def to_representation(self, instance):
try:
merchant = self.context['request'].user.employee.merchant
if instance.merchant != merchant:
# 数据保护手段
# 检查是否有 request context以及是否需要进行权限验证
request = self.context.get('request')
if request and hasattr(request, 'user') and hasattr(request.user, 'employee'):
try:
merchant = request.user.employee.merchant
if instance.merchant != merchant:
# 数据保护手段
logger.warning(f"用户 {request.user.username} 无权限访问对象 {type(instance).__name__} {instance.id}")
raise PermissionError("无权限访问该对象")
except AttributeError as e:
# 用户没有 employee 属性
logger.warning(f"用户权限验证失败: {str(e)}")
raise PermissionError("无权限访问该对象")
except (KeyError, AttributeError):
# TODO: log something?
raise PermissionError("无权限访问该对象")
result = super().to_representation(instance)
if self.context.get('expand_merchant', False):
@@ -40,9 +50,32 @@ class ProductCategorySerializer(BaseSerializer):
class ProductSerializer(BaseSerializer):
# 图片字段:读取时返回完整 URL写入时接受文件上传或 URL
image = serializers.ImageField(required=False, allow_null=True)
image_url = serializers.SerializerMethodField(read_only=True)
class Meta:
model = basic_models.Product
fields = '__all__'
def get_image_url(self, obj):
"""
获取图片的完整 URL
返回:
- 如果有图片:返回完整 URL七牛云 CDN 地址)
- 如果没有图片:返回 None
"""
if obj.image:
request = self.context.get('request')
if request:
# 使用 request.build_absolute_uri 构建完整 URL
return request.build_absolute_uri(obj.image.url)
else:
# 没有 request context 时,返回相对 URL
# 七牛云存储会自动返回完整 URL
return obj.image.url
return None
def to_representation(self, instance):
result = super().to_representation(instance)
@@ -50,6 +83,9 @@ class ProductSerializer(BaseSerializer):
'id': instance.category.id,
'name': instance.category.name
}
# 如果使用七牛云image 字段已经是完整 URL添加额外的 image_url 方便前端使用
# 前端可以使用 image 或 image_url两者内容相同
return result