1. 程式人生 > >學習網站專案學習 - Django & Vue - vuex狀態管理器、vue-cookies對資料的儲存

學習網站專案學習 - Django & Vue - vuex狀態管理器、vue-cookies對資料的儲存

目錄

一、vuex的安裝

1-1 npm install vuex

1-2 手動新建store.js

1-3 確保mian,js內進行註冊

二、狀態管理器的使用

2-1 store.js內全域性變數的獲取

獲取方式:this.$store.state.全域性變數名 - this.$store.state.name

2-2 store.js內全域性方法的使用:

設定方式:mutations: { 方法名:function (state, 引數1) {},}

獲取方式:this.$store.commit('方法名',引數)

三、簡單登陸頁的準備,用於測試資料儲存操作

3-1 表結構設計

3-2 後臺檢視函式

3-3 主頁前端程式碼

四、資料儲存在vuex全域性變數中,實現登陸儲存操作

4-1 前端設計

4-2 store.js內設計

4-3 實現效果

 4-4 存在問題 - 重新整理即清空儲存資訊

五、vue-cookies 將資料儲存在網頁cookies內

5-1 vue-cookies 安裝 - npm install vue-cookies

5-2 vue-cookies的使用

5-3 store.js內設計 - 在方法內對cookie進行操作

5-4 前端設計

5-5 實現效果


一、vuex的安裝

1-1 npm install vuex

1-2 手動新建store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {

  },
  mutations: {

  },
  actions: {

  }
})

1-3 確保mian,js內進行註冊

二、狀態管理器的使用

2-1 store.js內全域性變數的獲取

import Vue from 'vue'
import Vuex from 'vuex'
import Cookie from 'vue-cookies'
Vue.use(Vuex)

export default new Vuex.Store({
    //儲存全域性變數
    state: {
        name:'name',
        token:'token'

    },
    mutations: {

    },
    actions: {}
})

獲取方式:this.$store.state.全域性變數名 - this.$store.state.name

2-2 store.js內全域性方法的使用:

設定方式:mutations: { 方法名:function (state, 引數1) {},}

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
    // 儲存全域性變數
    state: {
        name:'' ,
        token:'' 
    },
    // 儲存各種方法,所有方法,第一個引數必須為state
    mutations: {
         // 方法名:function (state, 引數1) {},
        login: function (state, response) {
            // 方法邏輯程式碼

        },
    },
    actions: {}
})
import Vue from 'vue'
import Vuex from 'vuex'
import Cookie from 'vue-cookies'

Vue.use(Vuex)

export default new Vuex.Store({
    // 儲存全域性變數
    state: {
        // 從cookie內獲取資料
        name: Cookie.get('name'),
        token: Cookie.get('token')
    },
    // 儲存各種方法,所有方法,第一個引數必須為state
    mutations: {
        // 登入後將值寫入cookie
        login: function (state, response) {
            // 修改這兩個變數的值
            state.name = response.data.name
            state.token = response.data.token
            // 往cookie中寫資料
            Cookie.set('name', response.data.name)
            Cookie.set('token', response.data.token)

        },
        // 登出後將cookie清空
        logout: function (state) {
            // 修改這兩個變數的值
            state.name = ""
            state.token = ""
            // 往cookie中寫資料
            Cookie.set('name', "")
            Cookie.set('token', "")
        }
    },
    //
    actions: {}
})

獲取方式:this.$store.commit('方法名',引數)

三、簡單登陸頁的準備,用於測試資料儲存操作

3-1 表結構設計

# ------------使用者相關--------------------
# --------模擬使用者登陸系統,測試vue狀態管理系統--------
class UserInfo(models.Model):
    '''
    用於模擬簡單的登陸實現
        - name :使用者名稱
        - pwd :密碼,明文形式儲存
    '''
    name = models.CharField(max_length=64)
    pwd = models.CharField(max_length=64)


class UserToken(models.Model):
    '''
    Token表,用於儲存登陸時候產生的隨機字串
        - user:和UserInfo表一對一的關係
        - token:隨機字串
    '''
    user = models.OneToOneField(to='UserInfo')
    token = models.CharField(max_length=64)
    # time=models.DateTimeField(auto_now=True)

3-2 後臺檢視函式

from rest_framework.views import APIView
from rest_framework.response import Response
from LearnOnline import models
from LearnOnline.utils.commonUtils import MyResponse
import uuid


class Login(APIView):
    '''
    簡單登陸頁面的實現,測試vuex的資料儲存系統
    '''

    def post(self, request, *args, **kwargs):
        '''
        接受登陸時候傳輸的post請求,從request內獲取資料處理
        '''
        response = MyResponse()
        name = request.data.get('name')
        pwd = request.data.get('pwd')
        print(name,pwd)
        user = models.UserInfo.objects.filter(name=name, pwd=pwd).first()
        if user:
            # 若使用者名稱密碼正確,物件存在,則用uuid生產隨機字串儲存到UserToken表中
            token = uuid.uuid4()
            # 更新或建立物件user的token欄位
            models.UserToken.objects.update_or_create(user=user, defaults={'token': token})
            # 資料庫操作成功後,將資料存入response字典中
            response.token = token
            response.name = name
            response.msg = '登入成功'
        else:
            response.msg = '使用者名稱或密碼錯誤'
            response.status = '101'

        return Response(response.get_dic)

3-3 主頁前端程式碼

<template>
    <div id="app">
        <div id="nav">
            <router-link to="/">主頁</router-link>
            |
            <router-link to="/course">免費課程</router-link>
            |
            <router-link to="/DataTest">高階課程</router-link>
            <span class="pull-right">
                <span v-if="!this.$store.state.name">
                    <router-link to="/login">登入</router-link>|
                    <router-link to="#">註冊</router-link>
                </span>
                <span v-else>
                    <span>{{this.$store.state.name}}</span>|
                    <a @click="logout">登出</a>
                </span>
            </span>
        </div>

        <router-view/>
    </div>
</template>
<script>
    export default {
        methods: {
            logout: function () {
                // this.$store.state.name=''
                // this.$store.state.token=''
                this.$store.commit('logout')
            },

        },
    }
</script>

 

四、資料儲存在vuex全域性變數中,實現登陸儲存操作

4-1 前端設計

<template>
    <div class="login">
        <h1>登入</h1>
        <!-- v-model:與script內return資料進行雙向繫結 -->
        <p>使用者名稱:<input type="text" v-model="name"></p>
        <p>密碼:<input type="password" v-model="pwd"></p>
        <button @click="login" class="btn bg-danger">登入</button>
    </div>
</template>

<script>
     export default {
        data: function () {
            return {
                name:'',
                pwd:''
            }

        },
        methods: {
            login: function () {
                let _this = this
                this.$http.request({
                    url: _this.$url + 'login/',
                    method: 'post',
                    //攜帶資料傳送post請求
                    data:{'name':_this.name,'pwd':_this.pwd}
                }).then(function (response) {
                    console.log(response.data)
                    alert(_this.$store.state.name)
                    //若後臺狀態碼為100,即成功,將資料寫入vuex內
                    if(response.data.status==100){
                        //往stort.js的state的字典中寫入值
                        _this.$store.state.name=_this.name
                        _this.$store.state.token=response.data.token
                    }
                    alert(_this.$store.state.name)

                }).catch(function (response) {
                    console.log(response)
                })

            },

        },
    }
</script>

<style scoped>

</style>

4-2 store.js內設計

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
    // 儲存全域性變數
    state: {
        name: '',
        token: ''
    },
    // 儲存各種方法
    mutations: {},
    //
    actions: {}
})

4-3 實現效果

 4-4 存在問題 - 重新整理即清空儲存資訊

五、vue-cookies 將資料儲存在網頁cookies內

5-1 vue-cookies 安裝 - npm install vue-cookies

5-2 vue-cookies的使用

-取值:Cookie.get('根據key值')
-賦值:Cookie.set('key值','value值')
-刪值:Cookie.remove('key值')
-是否存在:Cookie.isKey('key值')
-獲取所有cookie名字:Cookie.keys()


'''
其他頁面獲取,$使用方式
'''
-取值:this.$cookies.get(keyName)
-賦值:this.$cookies.set(keyName, time)
-刪值:this.$cookies.remove(keyName)
-是否存在:this.$cookies.isKey(keyName)    
-獲取所有cookie名字:this.$cookies.keys()

5-3 store.js內設計 - 在方法內對cookie進行操作

import Vue from 'vue'
import Vuex from 'vuex'
import Cookie from 'vue-cookies'

Vue.use(Vuex)

export default new Vuex.Store({
    // 儲存全域性變數
    state: {
        // 從cookie內獲取資料
        name: Cookie.get('name'),
        token: Cookie.get('token')
    },
    // 儲存各種方法,所有方法,第一個引數必須為state
    mutations: {
        // 登入後將值寫入cookie
        login: function (state, response) {
            // 修改這兩個變數的值
            state.name = response.data.name
            state.token = response.data.token
            // 往cookie中寫資料
            Cookie.set('name', response.data.name)
            Cookie.set('token', response.data.token)

        },
        // 登出後將cookie清空
        logout: function (state) {
            // 修改這兩個變數的值
            state.name = ""
            state.token = ""
            // 往cookie中寫資料
            Cookie.set('name', "")
            Cookie.set('token', "")
        }
    },
    //
    actions: {}
})

5-4 前端設計

<template>
    <div class="login">
        <h1>登入</h1>
        <!-- v-model:與script內return資料進行雙向繫結 -->
        <p>使用者名稱:<input type="text" v-model="name"></p>
        <p>密碼:<input type="password" v-model="pwd"></p>

        <button @click="login" class="btn bg-danger">登入</button>
    </div>
</template>

<script>
     export default {
        data: function () {
            return {
                name:'',
                pwd:''
            }

        },
        methods: {
            login: function () {
                let _this = this
                this.$http.request({
                    url: _this.$url + 'login/',
                    method: 'post',
                    //攜帶資料傳送post請求
                    data:{'name':_this.name,'pwd':_this.pwd}
                }).then(function (response) {
                    console.log(response.data)
                    alert(_this.$store.state.name)
                    //若後臺狀態碼為100,即成功,將資料寫入vuex內
                    if(response.data.status==100){
                        // 往stort.js的state的字典中寫入值
                        // _this.$store.state.name=_this.name
                        // _this.$store.state.token=response.data.token
                        //呼叫store下的某個方法,用commit,第一個引數是方法名,第二個引數是引數
                        _this.$store.commit('login',response)
                    }
                    alert(_this.$store.state.name)

                }).catch(function (response) {
                    console.log(response)
                })

            },

        },
    }
</script>

<style scoped>

</style>

5-5 實現效果