350 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from rest_framework.views import APIView
from utils.jsonResponse import SuccessResponse,ErrorResponse,DetailResponse
from rest_framework.serializers import ModelSerializer
from rest_framework import serializers
from rest_framework_simplejwt.authentication import JWTAuthentication
from utils.serializers import CustomModelSerializer
from utils.viewset import CustomModelViewSet
from rest_framework.permissions import IsAuthenticated
import os
import random
import datetime
from django.conf import settings
from django.db.models import Q
from apps.platformsettings.models import OtherManage,LunbotuManage,UserLeavingMessage,SystemConfig
from utils.imageupload import ImageUpload
from utils.common import get_parameter_dic,get_full_image_url,ast_convert
from utils.filters import UserLeavingMessageTimeFilter,SystemConfigFilter
from utils.models import get_all_models_objects
from utils.barcode import barCodeGenerate
from utils.qiniu_storage import QiniuStorage
# Create your views here.
# ================================================= #
# ************** 后台前端平台设置 view ************** #
# ================================================= #
class SystemConfigSerializer(CustomModelSerializer):
"""
系统配置-序列化器
"""
form_item_type_label = serializers.CharField(source='get_form_item_type_display', read_only=True)
def to_representation(self, instance): # 序列化
ret = super().to_representation(instance)
ret['rule'] = ast_convert(ret['rule']) # 可以保存的修改字段值的方法
ret['setting'] = ast_convert(ret['setting']) # 可以保存的修改字段值的方法
ret['data_options'] = ast_convert(ret['data_options']) # 可以保存的修改字段值的方法
return ret
class Meta:
model = SystemConfig
fields = "__all__"
read_only_fields = ["id"]
class SystemConfigCreateSerializer(CustomModelSerializer):
"""
系统配置-新增时使用-序列化器
"""
form_item_type_label = serializers.CharField(source='get_form_item_type_display', read_only=True)
rule = serializers.JSONField(allow_null=True,required=False)
data_options = serializers.JSONField(allow_null=True,required=False)
setting = serializers.JSONField(allow_null=True,required=False)
class Meta:
model = SystemConfig
fields = "__all__"
read_only_fields = ["id"]
def validate_key(self, value):
"""
验证key是否允许重复
parent为空时不允许重复,反之允许
"""
instance = SystemConfig.objects.filter(key=value, parent__isnull=True).exists()
if instance:
raise ValueError('已存在相同变量名')
return value
class SystemConfigChildrenSerializer(CustomModelSerializer):
"""
系统配置子级-序列化器
"""
children = serializers.SerializerMethodField()
form_item_type_label = serializers.CharField(source='get_form_item_type_display', read_only=True)
def get_children(self, instance):
queryset = SystemConfig.objects.filter(parent=instance)
serializer = SystemConfigSerializer(queryset, many=True)
return serializer.data
def to_representation(self, instance): # 序列化
ret = super().to_representation(instance)
ret['rule'] = ast_convert(ret['rule']) # 可以保存的修改字段值的方法
ret['setting'] = ast_convert(ret['setting']) # 可以保存的修改字段值的方法
ret['data_options'] = ast_convert(ret['data_options']) # 可以保存的修改字段值的方法
return ret
class Meta:
model = SystemConfig
fields = "__all__"
read_only_fields = ["id"]
class SystemConfigViewSet(CustomModelViewSet):
"""
系统配置接口
"""
queryset = SystemConfig.objects.order_by('sort', 'create_datetime')
serializer_class = SystemConfigChildrenSerializer
create_serializer_class = SystemConfigCreateSerializer
update_serializer_class = SystemConfigCreateSerializer
filter_class = SystemConfigFilter
def save_content(self, request):
body = request.data
data_mapping = {item['id']: item for item in body}
for obj_id, data in data_mapping.items():
instance_obj = SystemConfig.objects.filter(id=obj_id).first()
if instance_obj is None:
serializer = SystemConfigCreateSerializer(data=data)
else:
serializer = SystemConfigCreateSerializer(instance_obj, data=data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return DetailResponse(msg="保存成功")
def get_models_info_list(self, request):
"""
获取所有的model及字段信息
"""
res = [e.get('table') for e in get_all_models_objects().values()]
return DetailResponse(msg="获取成功", data=res)
class LunbotuManageSerializer(CustomModelSerializer):
"""
平台轮播图 简单序列化器
"""
class Meta:
model = LunbotuManage
# fields = "__all__"
exclude = ['dept_belong_id', 'modifier', 'creator']
read_only_fields = ["id"]
class LunbotuManageViewSet(CustomModelViewSet):
"""
平台轮播图设置后台接口
list:查询(根据type值获取不同类型的轮播图片)
create:新增
update:修改
retrieve:单例
destroy:删除
"""
queryset = LunbotuManage.objects.all().order_by('sort')
serializer_class = LunbotuManageSerializer
filterset_fields = ('type',)
class OtherManageSerializer(CustomModelSerializer):
"""
其他设置 简单序列化器
"""
class Meta:
model = OtherManage
# fields = "__all__"
exclude=['dept_belong_id','modifier','creator']
read_only_fields = ["id"]
class OtherManageViewSet(CustomModelViewSet):
"""
平台其他设置后台接口
list:查询
create:新增
update:修改
retrieve:单例
destroy:删除
"""
queryset = OtherManage.objects.all().order_by('sort')
serializer_class = OtherManageSerializer
def functionSets(self,request):
type = get_parameter_dic(request).get('type',None)
if type == "dlmaitou":
logistics_num = "LYBBN"+(datetime.datetime.now().strftime('%Y%m%d%H%M%S'))[2:]+str(random.randint(0,9))
data = barCodeGenerate(logistics_num)
return DetailResponse(data=data)
class UserLeavingMessageSerializer(CustomModelSerializer):
"""
后台意见反馈 简单序列化器:
"""
nickname = serializers.SerializerMethodField()
avatar = serializers.SerializerMethodField()
mobile = serializers.SerializerMethodField()
def get_nickname(self,obj):
return obj.user.nickname
def get_avatar(self,obj):
return obj.user.avatar
def get_mobile(self,obj):
return obj.user.mobile
def to_representation(self, instance): # 序列化
"""Convert `username` to lowercase."""
ret = super().to_representation(instance)
# print(ret,'11111')
ret['images'] = ast_convert(ret['images']) # 可以保存的修改字段值的方法
return ret
def to_internal_value(self, data):
# 进提取所需要的数据对其进行反序列化data代表未验证的数据
data['images'] = str(data['images'])
return super().to_internal_value(data)
class Meta:
model = UserLeavingMessage
read_only_fields = ["id"]
fields = '__all__'
class UserLeavingMessageViewSet(CustomModelViewSet):
"""
后台意见反馈 接口:
"""
queryset = UserLeavingMessage.objects.all().order_by('-create_datetime')
serializer_class = UserLeavingMessageSerializer
# filterset_fields = ('name',)
# search_fields = ['user__nickname','message']
filterset_class = UserLeavingMessageTimeFilter
#后端平台设置图片上传
class PlatformImagesUploadView(APIView):
'''
post:
【功能描述】图片上传功能API</br>
【参数说明】无需要登录携带token后才能调用</br>
'''
authentication_classes = [JWTAuthentication]
permission_classes = [IsAuthenticated]
#原上传
# def post(self, request, *args, **kwargs):
# result = ImageUpload(request, "platform")
# if result['code'] == 200:
# return SuccessResponse(data=result['img'], msg=result['msg'])
# else:
# return ErrorResponse(msg=result['msg'])
def post(self, request, *args, **kwargs):
file = request.FILES.get('file')
if not file:
return ErrorResponse(msg='请选择文件')
qiniu = QiniuStorage()
result = qiniu.upload_data(file, 'platform')
if result['code'] == 200:
return SuccessResponse(data=result['url'], msg=result['msg'])
return ErrorResponse(msg=result['msg'])
# ================================================= #
# ************** 前端用户获取平台配置信息 view ************** #
# ================================================= #
class GetSystemConfigSettingsByKeyView(APIView):
"""
get:
获取系统配置
参数根据key获取系统具体配置
"""
authentication_classes = []
permission_classes = []
def get(self, request):
key = get_parameter_dic(request).get('key',None)
if not all([key]):
return ErrorResponse(msg="params error")
instance = SystemConfig.objects.filter(key=key).first()
data = ""
if instance:
data = instance.value
return DetailResponse(data=data)
class GetSystemConfigSettingsView(APIView):
"""
get:
获取系统配置
参数group 分组名称key
"""
authentication_classes = []
permission_classes = []
def get(self, request):
group = get_parameter_dic(request)['group']
if not all([group]):
return ErrorResponse(msg="params error")
# 不返回后端专用配置
queryset = SystemConfig.objects.filter(parent_id__isnull=False).values('value','key','title')
data = {}
if queryset:
for m in queryset:
data[m['key']] = m['value']
return DetailResponse(data=data)
class GetOtherManageDetailView(APIView):
"""
前端用户获取平台其他设置接口
get:
前端用户获取平台其他设置接口
【参数】type标签类型: 为获取对应平台设置的key的键值
"""
permission_classes = []
authentication_classes = []
serializer_class = OtherManageSerializer
def get(self, request):
key = get_parameter_dic(request)['key']
if key is None:
return ErrorResponse(msg='type参数不能为空')
queryset = OtherManage.objects.filter(key=key,status=True).first()
serializer = self.serializer_class(queryset,many=False)
return SuccessResponse(data=serializer.data, msg="success")
class GetLunboManageListView(APIView):
"""
前端用户获取平台轮播图设置接口
get:
前端用户获取平台轮播图设置接口
【参数】type轮播图类型: 1为首页轮播图2为分类页轮播图
"""
permission_classes = []
authentication_classes = []
serializer_class = LunbotuManageSerializer
def get(self, request):
type = int(get_parameter_dic(request)['type'])
if type in [1,2]:
queryset = LunbotuManage.objects.filter(type=type,status=True).order_by('sort')
serializer = self.serializer_class(queryset,many=True)
return SuccessResponse(data=serializer.data, msg="success")
else:
return ErrorResponse(msg="type类型错误")
class APPUserLeavingMessageView(APIView):
"""
post:
前端用户 意见反馈
【参数】message 需要反馈的内容
"""
permission_classes = [IsAuthenticated]
authentication_classes = [JWTAuthentication]
def post(self,request):
message = get_parameter_dic(request)['message']
images = get_parameter_dic(request).get('images')
if message is None:
return ErrorResponse(msg="message不能为空")
if images:
images = ast_convert(images)
if len(images)>6:
return ErrorResponse(msg='只能上传最多6张图片')
UserLeavingMessage.objects.create(user=request.user,message=message,subject=message,images=images,message_type=1)
return SuccessResponse(msg="success")