django+vue3通过邮箱重置密码

1.前言

2.django

2.1 通过邮箱重置密码流程

2.2简单的发布邮件

2.3配置异步进行发邮件

2.4 重置密码完整代码

3.vue3

3.1vue3重置邮箱密码流程

3.2 vue3 具体代码及解析


1.前言

一般在登录一些社交平台时候,可能会忘记密码,然后就要通过手机号或者绑定邮箱找回密码,然后再进行重新登录。也相信在做的各位都有这种情况,那么就让我们一起来了解了解这奇妙的流程


2.django

2.1通过邮箱重置密码流程

找到code码对应的邮箱 进行密码修改 然后使用新密码进行登录

2.2简单的发布邮件

在QQ邮箱->设置->帐户->“POP3/IMAP......服务” 里得到的在第三方登录QQ邮箱授权码

在settings.py 里面进行配置
# 邮箱配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'  # 腾讯QQ邮箱 SMTP 服务器地址
EMAIL_PORT = 25  # SMTP服务的端口号
EMAIL_HOST_USER = '自己的qq邮箱'  # 发送邮件的QQ邮箱
EMAIL_HOST_PASSWORD = '自己的授权码'  # 在QQ邮箱->设置->帐户->“POP3/IMAP......服务” 里得到的在第三方登录QQ邮箱授权码

简单的发送邮件 

from django.core import mail


class SendMail(APIView):
    """发送邮件"""

    def post(self, request):
        subject = '主题'  #标题
        message = "钰姐大美"  # 可以html结构的页面内容
        from_emil = '发件人的电子邮件'  # 发件人的电子邮件
        recipient_list = ['收件人的电子邮件']  # 收件人的电子邮件
        result = mail.send_mail(subject, message, from_emil, recipient_list)  # mail.send发送邮件
        print('2222', result)
        return Response({'code': '200', 'data': result})

2.3配置异步进行邮件发送

具体的讲解去看Li-Li的celery解释    http://t.csdn.cn/h4Vg2

这里就说如何加入异步任务

通过@celery_app.task 把指定的这个函数执行交给异步执行

异步任务调用 :异步方法.delay(参数)  ---异步方法

                           如果没有delay()   ------- 同步方法

import time

from celery_task import celery_app
# @app.task 指定将这个函数的执行交给celery异步执行
from django.core import mail


@celery_app.task
def test(mobile, code):
    print('1111')
    time.sleep(15)
    return mobile + code

@celery_app.task(name='send_email')
def send_email1(subject, message, from_email, to_email):
    # 如果是异步沉睡10s
    time.sleep(10)
    mail.send_mail(subject, message, from_email, to_email)
    print('发邮件')

在视图中进行调用配置好的异步任务

from django.core import mail
from celery_task.tasks import send_email1

class SendMail(APIView):
    """发送邮件"""

    def post(self, request):
        subject = '主题'
        message = "钰姐大美"  # 可以html结构的页面
        from_emil = '2154302429@qq.com'  # 发件人的电子邮件
        recipient_list = ['2574451281@qq.com']  # 收件人的电子邮件
        #调用异步中的send_email1
        send_email1(subject, message, from_emil, recipient_list)
        return Response({'code': '200'})

 1.路由配置

2.django运行

3.celery命令运行

2.4重置密码完整代码

1.获取前端输入绑定的email

2.查看改数据库中是否有这个用户

3.如果有就使用uuid进行生成32位随机的数为code 

4.进行邮件发送的配置  并发送回调url携带code码进行验证 eg:

http://localhost:8000/login/pass_code?code={}></a>".format(code)

5.将code当做key  把email当做value  存入redis中进行保存 setex(code, 3600, email)

6.然后返回成功

class GetEmail(APIView):
    def post(self, request):
        # 获取邮箱
        email = request.data.get('email')
        try:
            user = User.objects.get(email=email)
            if user:
                code = uuid.uuid1().hex
                print(code)
                try:
                    subject = '重置密码'
                    # url="http://localhost:8000/login/pass_code?code={}></a>".format(code)
                    # context={'url': url}
                    message = "'http://localhost:8000/login/pass_code?code={}'></a>".format(code)
                    from_email = '2154302429@qq.com'
                    to_email = [email]
                    # email_template_name = 'index.html'
                    # t = loader.get_template(email_template_name)
                    # html_content = t.render(context)
                    # msg = EmailMultiAlternatives(subject, html_content, from_email, to_email)
                    # msg.attach_alternative(html_content, "text/html")
                    # msg.send()
                    # 异步函数.delay()---调用
                    send_email1.delay(subject, message, from_email, to_email)
                    # 成功存入redis,code为key,邮箱为value加过期时间
                    res = redis.Redis()
                    res.setex(code, 3600, email)
                    res.close()
                    return Response({'code': 200, 'msg': '发送成功', 'data': code})
                except:
                    error = traceback.format_exc()
                    print('error', error)
                    return Response({'code': 10011, 'msg': '发送邮件失败'})
        except:
            # 返回结果
            return Response({'code': 10010, 'msg': '邮箱不存在无法进行验证'})

1.回调验证url 中携带的code

2是不是email的key

3.如果是emial

4.让他跳转到前端修改密码页面并在url中携带code

5.如果不是就 返回code错误

class PassCode(APIView):
    def get(self, request):
        # 获取唯一标识
        code = request.query_params.get('code')
        # 验证
        res = redis.Redis()
        # 使用get()获取信息
        email = res.get(code)
        if email:
            # 跳转到修改密码页面
            url = 'http://localhost:8080/confirm_pwd?code={}'.format(code)
            return Response({'msg': '获取成功', 'code': 200, 'data': url})
        else:
            # 跳转到vue页面提示验证失败,不能进行修改
            pass

1.获取到前端传来的code,和新密码

2.去redis中取出code携带的emial

3.redis取出使用decode转换为string

4.使用django自带的make_password()进行密码加密

5.通过模型类.objects.filter(过滤条件).update(修改信息) 进行修改

6.返回修改成功

class PutPass(APIView):
    def post(self, request):
        code = request.data.get('code')
        res = redis.Redis()
        email = res.get(code).decode()
        pwd = request.data.get('password')
        password = make_password(pwd)
        user=User.objects.filter(email=email)
        user.update(password=password)
        return Response({'code': 200, 'msg': '修改密码成功'})

3.vue3

3.1vue3重置邮箱密码流程

注意:这前提条件是正确的情况下

1.点击前端的忘记密码进行跳转到   找回密码绑定qq邮箱页面

2.在点击确定是这个qq邮箱密码之后

3.会发送一条邮件里面有url

4.点击url 会跳到 确定修改密码页面

5.进行填写新的密码

6.填写完成之后就点击确定

7.跳转到登录页面 进行从写登录

3.2 vue3 具体代码及解析

登录页面的点击忘记密码的代码

<template>
  <div>
      <from>
           账号:&nbsp;&nbsp;&nbsp;&nbsp;<input type='text' v-model="username" name='username'/><br>
           手机号: <input type='text' v-model="phone" name='phone'/><br>
           密码:&nbsp;&nbsp;&nbsp;&nbsp;<input type='password' v-model="password" name='password'/><br>
           <input type='button' value="登录" @click="login"/>
           <input type ='button' value="忘记密码" @click="exit"/>
      </from>
     
  </div>

</template>

<script>
import Axios from 'axios'
export default {
name:'Login',
data(){
    return{
        username:'',
        phone:'',
        password:'',
    }
},
methods:{
    login(){
        Axios.post('/login/login/',{username:this.username,
        phone:this.phone,
        password:this.password,
        })
        .then(resp=>{
            alert("正在登录中,请稍后")
            console.log(resp.data)
            alert('登录成功')
            localStorage.setItem('token', resp.data.token)
        }).catch(err=>{
            console.log(err)
        })
    },
    exit(){
        alert('正在跳转到找回密码页面')
        this.$router.push('/update_pwd')
    }
},
mounted(){

}

}
</script>

<style>

</style>

点击忘记密码之后跳转到绑定页面的代码

<template>
  <div>
    <h2>找回密码页面</h2>
    <input v-model="email" placeholder="请输入你绑定的QQ邮箱"/><br><br>
    <el-low>
    <el-button type="success" @click="btn" round>确认</el-button>&nbsp;&nbsp;
    <el-button type='primary' @click="exit" round>取消</el-button>
    </el-low>
   
  </div>
</template>

<script>
import Axios from 'axios'
export default {
    name:"UpdatePwd",
    data(){
        return{
            email:'',
        }
    },
    methods:{
        btn(){
            Axios.post('/login/get_email/',{email:this.email})
            .then(resp=>{
                alert('确定是绑定的qq邮箱')
                console.log(resp.data) 
                if(resp.data.code == 200){
                    console.log('this.code',resp.data.data)
                    this.getcode(resp.data.data)
                    localStorage.setItem('code', resp.data.data)
                }
                // alert('成功正在跳转页面')
                // this.$router.push('/confirm_pwd')
            }).catch(err=>{
                alert('这不是绑定的qq邮箱')
                console.log(err)
            })
        },
        // 获取后端回调的code
        getcode(code){
            Axios.get('/login/pass_code/',{params:{code:code}})
            .then((resp)=>{
                console.log('4444',resp.data)
                // 获取到返回的url进行跳转到确定修改密码页面
                console.log('333',resp.data.data)
                window.open(resp.data.data,'_blank')
            }).catch((err)=>{
                alert('链接获取失败')
                console.log(err)
            })

        },
        // 取消修改
        exit(){
            this.email = ''
        }

    },
    mounted(){

    }


}
</script>

<style>

</style>

 然后点击邮件里面 的url 可以跳转到确定修改密码页面(或者前端直接可以跳转)

修改成功 会跳转到登录页面

<template>
  <div>
    <input v-model="password" placeholder="请输入你新的密码"/><br><br>
    <el-low>
    <el-button type="success" @click="btn" round>确认</el-button>&nbsp;&nbsp;
    <el-button type='primary' @click="exit" round>取消</el-button>
    </el-low>

  </div>
</template>

<script>
import Axios from 'axios'
export default {
name:'ConfirmPwd',
data(){
    return{
        password:""

    }
},
methods:{
    btn(){
        //取出存在code
        this.code =localStorage.getItem('code')
        console.log('code',this.code)
        //将取出的code进行传入
        Axios.post('/login/put_pass/',{password:this.password,code:this.code})
        .then(resp=>{
            console.log(resp.data)
            alert('修改成功')
            this.$router.push('/login')
        }).catch(err=>{
            console.log(err)
        })
    },
    exit(){
        this.password =''
    }

},
mounted(){
}

}
</script>

<style>

4.到这就结束了,快去写写吧,如果感觉不错有帮助的话 ,帮忙评论,点赞 。这只是小编lili 的写法 借鉴啊 有问题请指出

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值