如今咱們已經可以在服務器環境下完成註冊操做了vue
login.vueios
<template> <el-main> <el-form :model="LoginForm" ref="LoginForm" :rules="rule" label-width="0" class="login-form"> <h3>用戶登陸系統</h3> <el-form-item prop="username"> <el-input type="text" v-model="LoginForm.username" placeholder="username" > </el-input> </el-form-item> <el-form-item prop="password"> <el-input type="password" v-model="LoginForm.password" placeholder="password" > </el-input> </el-form-item> <el-form-item > <el-button type="danger" class="submitBtn" round @click.native.prevent="submit" :loading="logining"> 登陸 </el-button> <el-button type="primary" class="resetBtn" round @click.native.prevent="reset"> 重置 </el-button> <hr> <p>尚未帳號,立刻去<span class="to" @click="toregin">註冊</span></p> </el-form-item> </el-form> </el-main> </template> <script> import {LoginUser} from '../api/api' export default { // .... data () { return { LoginForm: { username: '', password: '' }, logining: false, rule: { username: [ { required: true, max: 14, min: 7, message: '用戶名是必須的,長度爲7-14位', trigger: 'blur' } ], password: [ { required: true, message: '密碼是必須的!', trigger: 'blur' } ] } } }, methods: { // ... submit () { this.$refs.LoginForm.validate(valid => { if (valid) { this.logining = true // console.log('開始請求後臺數據,驗證返回之類的操做!') // 登陸做爲參數的用戶信息 let LoginParams = { username: this.LoginForm.username, password: this.LoginForm.password } // 調用axios登陸接口 LoginUser(LoginParams).then(res => { this.logining = false // 根據返回的code判斷是否成功 let {code, msg, user} = res.data if (code !== 200) { this.$message({ type: 'error', message: msg }) } else { this.$message({ type: 'success', message: msg }) // 將返回的數據注入sessionStorage sessionStorage.setItem('user', JSON.stringify(user)) // 跳轉到個人信息的頁面 this.$router.push('/manger/my') } }) } else { console.log('submit err') } }) }, reset () { this.$refs.LoginForm.resetFields() }, toregin () { this.$router.push('/regin') } } } </script> <style scoped> .login-form { margin: 20px auto; width: 310px; background: #fff; box-shadow: 0 0 35px #B4BCCC; padding: 30px 30px 0 30px; border-radius: 25px; } .submitBtn { width: 65%; } .to { color: #67C23A; cursor: pointer; } </style>
登陸頁面和註冊頁面差很少的,但測試的話又得打一包,很麻煩,因此暫時能夠用axios-mock-adapter 來模擬測試一下,等功能都完善以後再打包丟到服務器測試vuex
一、在data.js 裏面添加2個用戶npm
data.jsaxios
import avatarLee from '../assets/avatar.jpg' import avatarZhang from '../assets/avatar2.jpg' const users = [ { username: 'lytton', password: '123456', email: '123@163.com', tel: '15181589155', name: '李小白', time: '2017-11-11', avatar: avatarLee }, { username: 'zhangsan', password: '123456', email: '321@163.com', tel: '13789546327', name: '張三', time: '2017-08-17', avatar: avatarZhang } ] export default {users}
在data文件夾下寫一個index.jsapi
mock.js瀏覽器
import axios from 'axios' import Adapter from 'axios-mock-adapter' import {users} from './data' import avatarDefault from '../assets/logo.png' export default { init () { // 建立Adapter 實例 const mock = new Adapter(axios) // 模擬登陸接口 mock.onPost('/login').reply(config => { // 解析axios傳過來的數據 let {username, password} = JSON.parse(config.data) return new Promise((resolve, reject) => { // 先建立一個用戶爲空對象 let user = {} // 判斷模擬的假數據中是否有和傳過來的數據匹配的 let hasUser = users.some(person => { // 若是存在這樣的數據 if (person.username === username && person.password === password) { let user = JSON.parse(JSON.stringify(person)) user.password = '' return true } else { // 若是沒有這個person return false } }) // 若是有這麼一我的 if (hasUser) { resolve([200, { code: 200, msg: '登陸成功', user }]) // 若是沒有這我的 } else { resolve([200, { code: 500, msg: '帳號或密碼錯誤' }]) } }) }) // 模擬註冊接口 mock.onPost('/regin').reply(config => { let {username, password, email, tel, name} = config.params users.push({ username: username, password: password, email: email, name: name, tel: tel, avatar: avatarDefault }) return new Promise((resolve, reject) => { resolve(config.data) }) }) } }
main.js服務器
cnpm run devsession
這好尷尬,我添加的假數據用戶名沒7位,其實用戶名不必這麼長啊,改爲3位好了app
還有問題,來了三個警告,有沒有大神指教一下
不過應該不影響邏輯的,繼續測試
額
跳轉順利,但數據了????找找問題
找到緣由了
測試了幾回,找到問題了,
mock.js寫出問題了
這是原來的代碼
首先定義了let user = {},
在下面的if()裏面,我又 let user = ‘咱們要返回的數據’
而後在if ()以及hasUser()的外面我resolve user回去的時候,由於做用域的問題,天然就是把這個空的user 返回回去了
正確的寫法就是把if()裏面let user = xxxxx,的let去掉
由於測試了幾回,因此能夠看見在console 裏面竟然看見了2個user的信息,這個user但是寫進sessionStorage的啊,按道理sessionStorage裏面只該有一個user的信息,這個太危險了,不過咱們仍是把header上的按鈕先變成用戶信息吧
打開header.vue
首先添加這些代碼:
而後把其它功能完善一下
測試一下
看起來效果仍是不錯的
但點擊個人工做太,退出登陸竟然沒效果,而後我改成這樣
就有效果了
這是爲何???有時候用@click.native沒有效果,要用@click,有時候正好相反@click沒效果,要用@click.native,有沒有大佬來解惑一番?
而後我又發現一個問題了,是這樣的,我先退出登陸
而後登陸
很明顯sessionStorage裏面用戶數據是存在的,但右上角仍是登陸按鈕,並無變爲用戶信息?
我原本覺得是mounted 寫錯了,但發現並非,由於我刷新一下就這樣了
變正常了?並非,我仔細思考了一下,mounted是在頁面建立的時候執行,我刷新一下,右邊是先有了上面的user數據,纔出現下面的warning和console,因此事實是這樣的
我登陸以後,user數據寫入sessionStorage,而後跳轉到manger/my頁面,而中間那個main部分的頁面是才建立的,會顯示name,而header.vue這個頁面是我打開瀏覽器,輸入這個地址的時候建立的,無論我登陸、註冊仍是登出,切換到那個頁面,header.vue並無被銷燬後重建,天然不會執行mounted()這個行爲。只有我刷新頁面它纔會執行。
固然既然知道問題出在哪裏,那天然就能找出解決的辦法
1:換一個寫法,app.vue裏面不要寫header,footer
把header,footer,寫在home裏面,這樣跳轉的時候就能夠整個頁面重建了,但這樣的話要修改不少地方,路由要重寫,很麻煩。
二、用$emit 和$on的方法,就是組件之間通信,但我看到一個專門幹這事的vuex以後,本着多學習的思想,決定用vuex來解決,雖然看起來用vuex更麻煩一些。
忽然看見上面的圖片寫着<el-footer class="el-footer.">,這個.讓我非常羞愧啊,辣眼睛,趕忙去改掉。