码迷,mamicode.com
首页 > 其他好文 > 详细

推荐课程及用户登录

时间:2018-10-16 22:11:31      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:lse   -o   script   div   点击事件   方式   sha   end   frame   

实现的效果:

技术分享图片

点击推荐课程,要跳转到响应的课程的详细页。

Detail.vue

<template>
  <div>
        <h1>课程详细页面</h1>
        <p>课程标题:{{detail.title}}</p>
        <p>图片:{{detail.img}}</p>
        <p>课程难度:{{detail.level}}</p>
        <p>课程口号:{{detail.slogon}}</p>

        <p>为什么要学?{{detail.why}}</p>
        <div>
          章节:
          <ul v-for="item in detail.chapter">
            <li>{{item.name}}</li>
          </ul>
        </div>

        <div>
          <h3>推荐课程:</h3>
          <ul v-for="item in detail.recommends">
            <li @click="changeDetail(item.id)">{{item.title}}</li>   //这里绑定一个点击事件,把ID传入
          </ul>
        </div>

  </div>

</template>

<script>
    export default {
        name: "detail",
      data(){
          return {
            detail:{
              charter:[],
              course:null,
              level:null,
              img:null,
              title:null,
              slogon:null,
              why:null,
              recommends:[]
            }
          }
      },
      mounted(){
          var id=this.$route.params.id;
          this.initDetail(id)
      },
      methods:{
        initDetail(nid){

          var that = this;
          this.$axios.request({
              url:‘http://127.0.0.1:8000/api/v1/course/‘+nid+‘/‘,
              method:"GET",

          }).then(function (arg) {
            if (arg.data.code ===1000){
               console.log(arg.data);
                that.detail=arg.data.data
            }else{
              alert(arg.data.error)
            }

          })
        },
        changeDetail(id){
          this.initDetail(id);    //只绑定这一个那么页面跳转,URL不跳
          this.$router.push({name:‘detail‘,params:{id:id}}) //只绑定这一个,URL跳转,页面不变     所以需要2个进行配合变化。
        }
    }
    }
</script>

<style scoped>

</style>

然后登陆问题:

1.首先做一个登录的组件

 技术分享图片

2.在index.js中做一个挂载

技术分享图片

3.Login.vue组件

<template>
  <div>
    <h1>用户登录</h1>
    <p><input type="text" placeholder="请输入用户名" v-model="username"></p>
    <p><input type="password" placeholder="请输入密码" v-model="password"></p>
    <p><input type="button" @click="doLogin" value="登录"></p>
  </div>
</template>

<script>
    export default {
        name: "login",
        data(){
          return {
            username:"",  //跟上面的v-model做一个双向绑定
            password:"",
          }
        },
      methods:{
          doLogin(){     //点击按钮,做一个登录
            var that=this   //这是在函数外把this赋值给that,axios里面的this就改变了,不是原来的this
            this.$axios.request({
              url:http://127.0.0.1:8000/api/v1/auth/,
              method:"POST",
              data:{

                user:this.username,   //发送post请求,把用户名和密码传送过去。
                pwd:this.password,

              },
              headers:{
                "Content-Type":"application/json"   //记得加一个头,告诉服务器是json数据.
              }
            }).then(function (arg) {
              if(arg.data.code===1000){
                 console.log(arg);
                 that.$store.state.token=arg.data.token;   //取到服务器响应的token值
                 that.$store.state.username=that.username; //取到用户输入的用户名
                 that.$store.commit(saveToken,{token:arg.data.token,username:that.username})  发送一个保存token值和用户名的信号。
              }else {
                alert(arg.data.error)
              }

            }).catch(function (arg) {
              console.log("发生错误")
            })
          }
      }
    }
</script>

<style scoped>

</style>

4.在src下建立一个store文件夹并且一个store.js

import Vue from ‘vue‘
import Vuex from ‘vuex‘
import Cookie from ‘vue-cookies‘   //导入cookies 

Vue.use(Vuex)

export default new Vuex.Store({
  // 组件中通过 this.$store.state.username 调用
  state: {
    username: Cookie.get("username"),    //这里如果还是原来的null的话,一刷新,全局变量就没了,刷新后因为下面蛇者了cookie,所以通过cookie去取这两个值。
    token:Cookie.get("token"),
  },
  mutations: {
    // 组件中通过 this.$store.commit(saveToken,参数)  调用
    saveToken: function (state, userToken) {
      state.username = userToken.username;      //这里通过上面那一步调用拿到用户名
      state.token = userToken.token;            //拿到token
      Cookie.set("username", userToken.username, "20min");   //设置一个cookie值。
      Cookie.set("token", userToken.token, "20min")

    },
    clearToken: function (state) {
      state.username = null;              //这里点击注销把用户名和token变为空,并且把cookie移除。
      state.token = null;
      Cookie.remove(‘username‘);
      Cookie.remove(‘token‘)

    }
  }
})

最后就是开发发送用户登录的接口。

加一条URL:

 url(r^auth/$,account.AuthView.as_view()),

2.需要加两张表。

class UserInfo(models.Model):
    user=models.CharField(max_length=32)
    pwd=models.CharField(max_length=64)

class UserToken(models.Model):
    user=models.OneToOneField(to="UserInfo",on_delete=models.CASCADE)
    token=models.CharField(max_length=128)

3.在account,py中进行登录验证接口开发

from rest_framework.views import APIView
from rest_framework.response import Response
from api import models
import uuid

class AuthView(APIView):
    def post(self,request,*args,**kwargs):
        ret = {code:1000}
        user=request.data.get("user")
        pwd=request.data.get("pwd")
        user=models.UserInfo.objects.filter(user=user,pwd=pwd).first()  #首先拿到这个用户对象
        if not user:
            ret[code]=1001
            ret[error]=用户名或者密码错误
        else:
            uid=str(uuid.uuid4())    #存在的话设置一个token字符串
            models.UserToken.objects.update_or_create(user=user,defaults={token:uid})  #给登录用户创造或者更新一条数据
            ret[token]=uid   #前端也返回一个token.
        return Response(ret)

在开发中需要注意的一个点就是。

随着技术的发展,现在的浏览器可以支持主动设置从而允许跨域请求,即:跨域资源共享(CORS,Cross-Origin Resource Sharing),其本质是设置响应头,使得浏览器允许跨域请求。

* 简单请求 OR 非简单请求

条件:
1、请求方式:HEAD、GET、POST
2、请求头信息:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type 对应的值是以下三个中的任意一个
application/x-www-form-urlencoded
multipart/form-data
text/plain

注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求

 

* 简单请求和非简单请求的区别?

简单请求:一次请求
非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。
* 关于“预检”


- 请求方式:OPTIONS
- “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
- 如何“预检”
=> 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
Access-Control-Request-Method
=> 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
Access-Control-Request-Headers

 

推荐课程及用户登录

标签:lse   -o   script   div   点击事件   方式   sha   end   frame   

原文地址:https://www.cnblogs.com/geogre123/p/9800495.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!