基于DRF和VUE实现的前后端分离的登录注册功能

本文展示了一个使用DjangoRestFramework(DRF)后端处理跨域请求,结合Vue.js前端实现用户注册和登录功能的小案例。后端通过自定义中间件处理CORS,模型包含登录信息,视图集处理POST请求进行登录验证。前端利用Axios发送HTTP请求,Vue组件处理用户界面和交互,注册成功后自动跳转至登录页面。
摘要由CSDN通过智能技术生成

后端 - DRF

  • 中间件 - 跨域请求

from django.utils.deprecation import MiddlewareMixin
class MyCorsMiddle(MiddlewareMixin):
    def process_response(self, request, response):
        # 允许所有人向我发请求
        response['Access-Control-Allow-Origin'] = '*'
        if request.method == 'OPTIONS':
            # 所有的头信息都允许
            response['Access-Control-Allow-Headers'] = '*'
        return response
  • setting - 注册自定义中间件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    "logindemo.MyCorsMiddle.MyCorsMiddle",
]
  • 模型

from django.db import models

# Create your models here.

class Login(models.Model):
    """登录模型类"""
    username = models.CharField(max_length=64,unique=True)
    passwoed = models.IntegerField()

    class Meta:
        db_table = "tb_login"
  • 子应用下的serializer

from rest_framework import serializers
from app01 import models

class LoginSerializer(serializers.ModelSerializer):
    class Meta:
        fields = "__all__"
        model = models.Login
  • 视图

from django.shortcuts import render
from .serializer import LoginSerializer
from .models import Login
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.viewsets import ModelViewSet
# Create your views here.

class LoginModelView(ModelViewSet):
    queryset = Login.objects.all()
    serializer_class = LoginSerializer

    @action(methods=["post"],detail=False,url_path="login")
    def login(self,request):
        """登录视图"""
        username = request.data['username']
        passwoed = request.data['passwoed']
        try:
            use_obj = Login.objects.get(username=username)
        except Exception as e:
            print(123)
            return Response({"meg":"该用户不存在"})

        if use_obj.passwoed != int(passwoed):
            return Response({"meg":"密码错误"})
        return Response({"meg":"登录成功!"})

前端 - VUE

  • src/utils/http.js -- axios前提

import axios from "axios";

//实例化
const http = axios.create({
    baseURL:"http://127.0.0.1:8000",
})
export default http
  • src/utils/router.js -- 路由前提

import {createRouter,createWebHistory,createWebHashHistory} from "vue-router";

const router = createRouter({
    history:createWebHistory(),
    routes:[
        {
            path:"/",
            name:"Login",
            component:import('../views/Login.vue')
        },
        {
            path:"/reg",
            name:"reg",
            component:import("../views/reg.vue")
        },
        {
            path:"/index",
            name:"index",
            component:import("../views/index.vue")
        },
        {
            path:"/log",
            name:"log",
            component:import("../views/log.vue")
        }
    ]
})

export default router
  • src/views/Login.vue - 导航页面

<template>
<div>
  <router-link to="/reg">注册页面</router-link>
  <br>
  <router-link to="/log">登录页面</router-link>
</div>

</template>

<script setup>

</script>

<style scoped>

</style>
  • src/views/reg.vue - 注册页面

<template>
  <div>
    <h1>注册页面</h1>
     用户名:<input type="text" v-model="username" @focus="clear">
     密码:<input type="password" v-model="pwd">
      <button @click="submit">注册</button>
      <span class="tips">{{text}}</span>
  </div>

</template>

<script setup>
import {ref} from 'vue'
import http from "../utils/http";
import {useRouter} from "vue-router"

let username = ref("")
let pwd = ref("")
let text = ref("")

const router = useRouter()
const clear = ()=>{
  text.value = ""
}

// 注册添加用户
const submit = ()=>{
  http.post("/user/",{
    "username":username.value,
    "passwoed":pwd.value
  }).then(response=>{
    alert("注册成功~~")
    router.push('/log')
  }).catch(error=>{
    text.value = "该用户名已经注册,请重新输入另一个用户名字"
  })
}



</script>

<style scoped>
.tips{
  color: red;
}
</style>
  • src/views/log.vue - 登录页面

<template>
<div>
  <h1>登录页面</h1>
   用户名:<input type="text" v-model="username" @focus="clear_tips">
   密码:<input type="password" v-model="pwd">
  <button @click="login">登录</button>
  <span class="tips">{{login_tips}}</span>
</div>
</template>

<script setup>
import {ref} from 'vue'
import http from "../utils/http";
import {useRouter} from "vue-router"
let username = ref("")
let pwd = ref("")
let login_tips = ref("")
const router = useRouter()

// 消除提示信息
const clear_tips = ()=>{
  login_tips.value = ""
}

// 登录校验
const login = ()=>{
  http.post("/user/login/",{
    "username":username.value,
    "passwoed":pwd.value
  }).then(response=>{
      if(response.data.meg==="登录成功!"){
        alert(response.data.meg)
        router.push(`/index?username=${username.value}`)
      }
      else{
         login_tips.value = response.data.meg
      }
  })
}


</script>

<style scoped>
.tips{
  color: red;}
</style>
  • src/views/log.vue - 登录页面

<template>
<h1>欢迎你,{{username}}</h1>
</template>

<script setup>
import {ref} from "vue"
import {useRoute} from 'vue-router'
const route = useRoute()
let username = ref(route.query.username)


</script>

<style scoped>

</style>

效果展示:

  • 导航

  • 注册

  • 登录

  • 主页面

当注册用户已存在,会提示
当登录密码错误或账号不存在,会提示
当注册页面注册成功后,会自动跳转到登录页面。

第一次实现前后端分离的小案例,有什么不足,请各位斧正,谢谢!

### 回答1: 我可以帮你分析一下这个项目,并为你提供一些建议。首先,你需要根据 vuedrf 的文档,熟悉这两个技术的使用方式。然后,需要设计一个前端页面,使用 vue 技术来实现。接着,你需要利用 drf 来构建一个 RESTful API,用来实现注册和登录功能。最后,你可以将前端与后端连接起来,完成注册和登录功能。 ### 回答2: 基于VueDRF前后端分离注册登录项目设计可分为以下几个步骤: 1. 前端项目搭建:使用Vue CLI等工具搭建一个Vue项目。 2. 前端注册页面设计:创建一个注册页面,包括输入用户名、密码、确认密码等表单项,并添加表单验证功能。 3. 前端登录页面设计:创建一个登录页面,包括输入用户名、密码等表单项,并添加表单验证功能。 4. 前端与后端交互:使用Axios等工具发送注册和登录请求至后端API,并处理接口返回的数据。 5. 后端项目搭建:使用DjangoDRF搭建一个后端项目。 6. 后端用户模型设计:创建一个用户模型,并添加字段如用户名、密码等。 7. 后端注册API设计:创建一个注册API,接收前端传递的用户名和密码等参数,使用Django用户模型创建用户,并返回注册成功的信息。 8. 后端登录API设计:创建一个登录API,接收前端传递的用户名和密码等参数,验证用户信息,并返回登录成功的信息和用户的认证token。 9. 前端登录状态管理:在前端使用Vuex等工具进行登录状态管理,保存用户的认证token,并在每次请求时将token作为请求的Header。 10. 前端路由配置:配置前端路由,通过路由守卫判断用户是否已登录,未登录则重定向至登录页面。 通过以上步骤的设计,实现了一个基于VueDRF前后端分离的注册登录项目。前端负责提供注册和登录的页面,与后端通过API进行交互并管理用户登录状态。后端则负责验证用户信息、创建用户和返回认证信息等操作。 ### 回答3: 基于VueDRF设计一个前后端分离的注册登录项目是一个常见的实践项目。下面是一个简单的实现示例: 1. 前端设计: 在前端使用Vue框架,先创建一个Vue实例,并引入需要的相关依赖库,如axios用于发送与接收HTTP请求。 创建两个组件,一个用于注册,另一个用于登录。在组件中定义输入框和按钮,并绑定相应的方法和数据。 注册组件:包括用户名和密码的输入框以及注册按钮。 登录组件:包括用户名和密码的输入框以及登录按钮。 在注册组件的注册按钮点击事件中,使用axios发送POST请求到后端API,将输入的用户名和密码作为参数传递给后端,完成注册操作。 在登录组件的登录按钮点击事件中,同样使用axios发送POST请求到后端API,传递输入的用户名和密码,后端返回登录验证的结果。 2. 后端设计: 使用DRFDjango REST framework)构建后端API。创建用户模型,包含用户名和密码字段,并实现注册和登录视图。 注册视图中,接收前端传递过来的用户名和密码参数,先检查用户名是否已存在,若存在则返回相应的错误信息,否则创建用户并保存到数据库中。 登录视图中,接收前端传递过来的用户名和密码参数,根据用户名在数据库中查询用户信息并验证密码是否正确,返回登录验证结果。 为了实现与前端的数据交互,需要配置CORS(跨源资源共享)中间件,允许前端跨域请求后端API。 3. 前后端交互: 前后端交互通过HTTP请求完成,前端使用axios发送POST请求到后端API,并将参数作为请求体的一部分。后端接收到请求后,解析请求体中的参数,做出相应的处理,并返回结果。 通过以上设计,前端可以通过注册组件完成用户注册,后端接收到请求并保存用户信息。前端可以通过登录组件完成用户登录,后端验证用户信息后返回登录验证结果。这样就实现了一个简单的前后端分离的注册登录项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱打代码的鳄鱼娃子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值