350 lines
13 KiB
Python
350 lines
13 KiB
Python
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") |