当前位置: 首页> 健康> 养生 > 私人订制网站建设_ui设计师创意平台_客户关系管理系统_百度客服人工服务电话

私人订制网站建设_ui设计师创意平台_客户关系管理系统_百度客服人工服务电话

时间:2025/8/26 1:58:55来源:https://blog.csdn.net/qq_36462472/article/details/143419158 浏览次数:0次
私人订制网站建设_ui设计师创意平台_客户关系管理系统_百度客服人工服务电话

1、功能完善(简易版)

1.1 后端API校验

基于drf的认证组件实现只有登录之后才能查看

utils/auth.py

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import APIException, AuthenticationFailed
from rest_framework import status
from api import modelsclass MineAuthenticationFailed(APIException):status_code = status.HTTP_200_OKclass MineAuthentcation(BaseAuthentication):def authenticate(self, request):token = request.query_params.get("token")if not token:raise MineAuthenticationFailed("token不存在")user_object = models.UserInfo.objects.filter(token=token).first()if not user_object:raise MineAuthenticationFailed("认证失败")return user_object, token

settings.py


REST_FRAMEWORK = {"DEFAULT_AUTHENTICATION_CLASSES": ["utils.auth.MineAuthentcation"],
}

account.py

class AuthView(MineApiView):authentication_classes = []

1.2 前端校验

axios.js

const _axios = axios.create(config)
const info = userInfoStore()_axios.interceptors.request.use(function (config) {// console.log("请求拦截器:", config)// 1. 去pinia中读取当前用户token// 2. 发送请求时携带tokenif (info.userToken) {if (config.params) {config.params["token"] = info.userToken} else {config.params = {"token": info.userToken}}}return config
})
_axios.interceptors.response.use(function (response) {console.log("响应拦截器:", response)// 认证失败if (response.data.code === "1000") {router.replace({name: "login"})}return response
}, function (error) {console.log("拦截器异常", error)if (error.response.data.code === "1000") {router.replace({name: "login"})}return Promise.reject(error)
})export default _axios

LoginView.vue

const doLogin = function () {// 1、获取数据console.log(msg.value)// 2、发送网络请求_axios.post("/api/auth/", msg.value).then((res) => {console.log(res.data)if (res.data.code === 0){store.doLogin(res.data.data)router.push({name: "home"})} else {error.value = res.data.msgsetTimeout(function (){error.value=""}, 5000)}})
}

2、后端API升级

2.1 正常请求返回

utils/views.py

class BaseAPIView:def finalize_response(self, request, response, *args, **kwargs):response = super().finalize_response(request, response, *args, **kwargs)# 1. 非正常if response.exception:return response# 2. 正常response.data = {"code": 0, "data": response.data}return response

vip.py

from rest_framework.views import APIView
from api import models
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.exceptions import ValidationError
from utils.exc_views import ExtraExceptions
from utils.views import BaseAPIViewclass VipSerializers(serializers.ModelSerializer):level_text = serializers.CharField(source="get_level_display", read_only=True)class Meta:model = models.Vipfields = "__all__"class VipView(BaseAPIView, APIView):def get(self, request):# 会员列表queryset = models.Vip.objects.all().order_by("id")ser = VipSerializers(instance=queryset, many=True)return Response(ser.data)def post(self, request):""" 新增 """# 1.获取数据 request.data# 2.校验数据ser = VipSerializers(data=request.data)print(request.data)exist = models.Vip.objects.filter(name=request.data["name"]).exists()if exist:raise ValidationError({"msg": "会员已存在"})if not ser.is_valid():raise ValidationError({"msg": "校验失败", "detail": ser.errors})# 3.保存ser.save()# 4.返回return Response(ser.data)class VipDetailView(BaseAPIView, APIView):def delete(self, request, vid):# 删除  ?返回已删除的数据models.Vip.objects.filter(id=vid).delete()return Response({"msg": "删除成功"})def put(self, request, vid):""" 修改 """# 1.获取数据 request.datainstance = models.Vip.objects.filter(id=vid).first()""" BUG:id不存在时,会进行新增操作 """if not instance:raise ExtraExceptions("id不存在,无法更新")# 2.校验数据ser = VipSerializers(data=request.data, instance=instance)if not ser.is_valid():raise ValidationError({"msg": "校验失败", "detail": ser.errors})# 3.保存ser.save()# 4.返回return Response({"data": ser.data})

2.2 异常请求返回

utils/views.py

class ExtraExceptions(APIException):passdef exception_handler(exc, context):if isinstance(exc, Http404):exc.ret_code = 1001exc = exceptions.NotFound(*exc.args)elif isinstance(exc, PermissionDenied):exc.ret_code = 1002exc = exceptions.PermissionDenied(*exc.args)elif isinstance(exc, (AuthenticationFailed, NotAuthenticated)):exc.ret_code = 1003elif isinstance(exc, Throttled):exc.ret_code = 1004if isinstance(exc, exceptions.APIException):headers = {}if getattr(exc, 'auth_header', None):headers['WWW-Authenticate'] = exc.auth_headerif getattr(exc, 'wait', None):headers['Retry-After'] = '%d' % exc.waitexc_code = getattr(exc, "ret_code", None) or -1data = {"code": exc_code, "detail": exc.detail}set_rollback()return Response(data, status=exc.status_code, headers=headers)data = {"code": -1, "detail": str(exc)}return Response(data, status=500)

vip.py

from api import models
from rest_framework.views import APIView
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.exceptions import ValidationError
from utils.views import BaseAPIView, ExtraExceptionsclass VipSerializers(serializers.ModelSerializer):level_text = serializers.CharField(source="get_level_display", read_only=True)class Meta:model = models.Vipfields = "__all__"class VipView(BaseAPIView, APIView):def get(self, request):# 会员列表queryset = models.Vip.objects.all().order_by("id")ser = VipSerializers(instance=queryset, many=True)return Response(ser.data)def post(self, request):""" 新增 """# 1.获取数据 request.data# 2.校验数据ser = VipSerializers(data=request.data)print(request.data)exist = models.Vip.objects.filter(name=request.data["name"]).exists()if exist:raise ValidationError({"msg": "会员已存在"})if not ser.is_valid():raise ValidationError({"msg": "校验失败", "detail": ser.errors})# 3.保存ser.save()# 4.返回return Response(ser.data)class VipDetailView(BaseAPIView, APIView):def delete(self, request, vid):# 1.获取数据 request.datainstance = models.Vip.objects.filter(id=vid).first()if not instance:raise ExtraExceptions("id不存在,无法删除")# 删除  ?返回已删除的数据models.Vip.objects.filter(id=vid).delete()return Response({"msg": "删除成功"})def put(self, request, vid):""" 修改 """# 1.获取数据 request.datainstance = models.Vip.objects.filter(id=vid).first()""" BUG:id不存在时,会进行新增操作 """if not instance:raise ExtraExceptions("id不存在,无法更新")# 2.校验数据ser = VipSerializers(data=request.data, instance=instance)if not ser.is_valid():raise ValidationError({"msg": "校验失败", "detail": ser.errors})# 3.保存ser.save()# 4.返回return Response(ser.data)

account.py

import uuid
from rest_framework import serializers
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.exceptions import AuthenticationFailed
from api import models
from utils.views import BaseAPIViewclass AuthSerializer(serializers.Serializer):username = serializers.CharField(required=True)password = serializers.CharField(required=True)class AuthView(BaseAPIView, APIView):authentication_classes = []def post(self, request):# 1. 获取用户提交数据 request.data = {"username": "xxx", "password": "...}# 2. 表单校验ser = AuthSerializer(data=request.data)# if not ser.is_valid():#     raise ValidationError({"msg": "校验失败", "detail": ser.errors})ser.is_valid(raise_exception=True)# 3. 数据库校验user_object = models.UserInfo.objects.filter(**ser.data).first()if not user_object:raise AuthenticationFailed("用户名或密码错误")token = uuid.uuid4()user_object.token = tokenuser_object.save()# 4. 数据返回return Response({"id": user_object.id, "name": user_object.username, "token": user_object.token})

2.3 业务功能开发(路由+视图+序列化器)

urls.py

from django.urls import path
from api.views import account
from api.views import vip, vip2
from rest_framework import routersrouter = routers.SimpleRouter()
router.register(r"api/vip2", vip2.VipView)urlpatterns = [path('api/auth/', account.AuthView.as_view()),path('api/vip/', vip.VipView.as_view()),path('api/vip/<int:vid>/', vip.VipDetailView.as_view()),
]
urlpatterns += router.urls

utils/pagination.py

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Responseclass MinePageNumberPagination(PageNumberPagination):def get_paginated_response(self, data):return Response({'totalCount': self.page.paginator.count,'perpageCount': self.page_size,'results': data,})

settings.py


REST_FRAMEWORK = {"EXCEPTION_HANDLER": "utils.views.exception_handler","DEFAULT_AUTHENTICATION_CLASSES": ["utils.auth.MineAuthentcation"],"DEFAULT_PAGINATION_CLASS": "utils.pagination.MinePageNumberPagination","PAGE_SIZE": 5,
}

vip2.py

from rest_framework.viewsets import ModelViewSet
from api import models
from rest_framework import serializers
from utils.views import BaseAPIViewclass VipSerializers(serializers.ModelSerializer):level_text = serializers.CharField(source="get_level_display", read_only=True)class Meta:model = models.Vipfields = "__all__"class VipView(BaseAPIView, ModelViewSet):serializer_class = VipSerializersqueryset = models.Vip.objects.all().order_by("id")

3、前端页面升级

3.1 Flex布局

关键字:私人订制网站建设_ui设计师创意平台_客户关系管理系统_百度客服人工服务电话

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: