luffy-(6)

内容概览

  • 首页中间部分样式
  • 多方式登录接口
  • 查询手机号是否存在接口
  • 腾讯云短信介绍和申请

首页中间部分样式

<el-row>
  <el-col :span="6" v-for="(o) in 8" :key="o" class="course_detail">
    <el-card :body-style="{ padding: '0px' }" shadow="hover">
      <img src="https://shadow.elemecdn.com/app/element/hamburger.9cf7b091-55e9-11e9-a976-7f4d0b07eef6.png"
           class="image">
      <div style="padding: 14px;">
        <span>推荐课程</span>
        <div class="bottom clearfix">
          <time class="time">价格:999</time>
          <el-button type="text" class="button">查看详情</el-button>
        </div>
      </div>
    </el-card>
  </el-col>
</el-row>

<style>
.time {
  font-size: 13px;
  color: #999;
}

.bottom {
  margin-top: 13px;
  line-height: 12px;
}

.button {
  padding: 0;
  float: right;
}

.image {
  width: 100%;
  display: block;
}

.clearfix:before,
.clearfix:after {
  display: table;
  content: "";
}

.clearfix:after {
  clear: both
}

.course_detail {
  padding: 50px
}
</style>

多方式登录接口

"""
登录注册
	1. 多方式登录【用户名、邮箱、手机号】
	2. 验证码登录
	3. 发送验证码
	4. 校验手机号是否存在
	5. 手机号注册接口
"""

# 多方式登录接口
	- 前端使用post请求发送{username:用户名/邮箱/手机号,password:密码}
	- 之前写校验用户的逻辑都写在视图类的方法中,这个项目我们把逻辑写在序列化类中
视图类
from rest_framework.viewsets import ViewSet
from user.serializers import UserMulLoginSerializer
from utils.response import APIResponse
from rest_framework.decorators import action

class UserView(ViewSet):
    @action(methods=['POST'], detail=False)
    def mul_login(self, request):
        ser = UserMulLoginSerializer(data=request.data)
        ser.is_valid(raise_exception=True)  # 如果校验没有通过,直接抛出异常
        # 如果校验通过了,获取序列化类中签发的token
        token = ser.context.get('token')
        username = ser.context.get('username')
        icon = ser.context.get('icon')
        # 使用封装后的APIResponse返回数据
        return APIResponse(token=token, username=username, icon=icon)
序列化类
import re

from rest_framework import serializers
from .models import UserInfo
from django.contrib.auth import authenticate
from rest_framework.exceptions import ValidationError
from rest_framework_jwt.settings import api_settings

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER


# 这个序列类,只用来做登录校验,不做序列化,不做反序列化
class UserMulLoginSerializer(serializers.ModelSerializer):
    # 重写,优先使用现在的,不会去映射模型表中的
    username = serializers.CharField()  # 因为该字段是唯一的;执行到这里判断该字段已存在就会直接报错;但我们是登录,需要存在

    class Meta:
        model = UserInfo
        fields = ['username', 'password']

    # 封装之隐藏属性  __表示隐藏, _并不是隐藏,公司里约定俗成用 _ 表示只在内部用,如果外部想用,也可以用
    def _get_user(self, attrs):
        # attrs是校验后的数据:通过了字段自己的校验和局部钩子才会执行到这里
        username = attrs.get('username')
        password = attrs.get('password')
        # username是手机号/邮箱/用户名其中之一,我们使用正则判断
        if re.match(r'^1[3-9]\d{9}$', username):
            user = UserInfo.objects.filter(mobile=username).first()
        elif re.match(r'^.+@.+\..+$', username):
            user = UserInfo.objects.filter(email=username).first()
        else:
            user = UserInfo.objects.filter(username=username).first()
        if user and user.check_password(password):
            return user
        else:
            raise APIException('用户名或密码错误')

    def _get_token(self, user):
        try:
            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)
            return token
        except Exception as e:
            raise ValidationError(e)

    # 通过全局钩子校验用户是否存在
    def validate(self, attrs):
        # 1. 取出用户名和密码,校验;写成一个方法,放在类里
        user = self._get_user(attrs)
        # 2. 校验成功后签发token
        token = self._get_token(user)
        # 3. 把token放到序列化类对象中
        self.context['token'] = token
        self.context['username'] = user.username
        self.context['icon'] = 'http://127.0.0.1:8000/media/' + str(
            user.icon)  # user.icon是个对象,需要先转成字符串;数据库里保存的只是media后的路径,需要拼接成完整路径
        return attrs
路由
from rest_framework.routers import SimpleRouter
from user.views import UserView

router = SimpleRouter()
router.register('user', UserView, 'user')

urlpatterns = [
]
urlpatterns += router.urls

查询手机号是否存在接口

我们使用get请求,在路由中携带手机号

class UserView(ViewSet):

    @action(methods=['GET'], detail=False)
    def mobile(self, request):
        try:
            mobile = request.query_params.get('mobile')
            UserInfo.objects.get(mobile=mobile)
            return APIResponse(msg='手机号存在')
        except Exception as e:
            raise APIException('手机号不存在')

腾讯云短信介绍和申请

"""我们要写发送短信接口;发短信需要借助于短信运营商"""
# 腾讯云开放平台,有很多开放的接口供咱们使用,咱们用的是短信
	-注册平台---》找到短信
	-https://console.cloud.tencent.com/smsv2

# 申请使用腾讯云短信:
	1 创建签名:使用公众号申请,网站需要在工信部备案
        -申请个人一个公众号:
        	-https://mp.weixin.qq.com/
        -等审核通过
    2 申请模板:发送短信的模板 {1}  {2} 后期用代码填上
    
    3 免费赠送1004 代码发送短信:参照文档写代码:https://cloud.tencent.com/document/product/382/13444
    	-v2 老一些
        -v3 最新
什么是api,什么是sdk
# API文档
	-之前学的接口文档的概念
    -使用api调用,比较麻烦,固定输入,接受固定的返回
    -使用postman都可以测试,携带你的认证的秘钥。
    
# SDK:Software Development Kit 软件开发工具包
	-分语言的
    -基于API,使用某个编程语言封装的包
    -例如python:pip install 包
    	-.发短信(参数)
        
   -一般厂商都会提供各大主流语言的sdk


# 腾讯短信sdk使用步骤
    1 已开通短信服务,创建签名和模板并通过审核    # 开了
    2 如需发送国内短信,需要先 购买国内短信套餐包。 #赠送了
    3 已准备依赖环境:Python 2.7 - 3.6 版本。    #我们有
    4 已在访问管理控制台 >API密钥管理页面获取 SecretID 和 SecretKey。
        SecretID 用于标识 API 调用者的身份。
        SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥,SecretKey 需妥善保管
    5 短信的调用地址为sms.tencentcloudapi.com。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值