[toc]
### 一、實現退出登錄功能
1.1 設置退出登錄接口
```
export function logout() {
return request({
url: '/admin/user/logout',
method: 'post'
})
}
```
### 二、實現注冊頁面布局
2.1 刪除登錄布局默認提示的一些內容
2.2 創建注冊按鈕
```
<el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">Login</el-button>
<div>
<el-button type="default" style="width:100%;margin-bottom:30px;">
切換為注冊
</el-button>
</div>
```
2.3 修改登錄布局文字
```
<div class="title-container">
<h3 class="title">登錄</h3>
</div>
placeholder="請輸入用戶名"
placeholder="請輸入密碼"
<el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">登錄</el-button>
```
2.4 實現注冊布局和登錄注冊切換
```
<template>
<div class="login-container">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" autocomplete="on" label-position="left">
<div class="title-container">
<h3 class="title">{{inputType == "login" ? "登錄" : "注冊"}}</h3>
</div>
<el-form-item prop="username">
<span class="svg-container">
<svg-icon icon-class="user" />
</span>
<el-input
ref="username"
v-model="loginForm.username"
placeholder="請輸入用戶名"
name="username"
type="text"
tabindex="1"
autocomplete="on"
/>
</el-form-item>
<el-tooltip v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
<el-form-item prop="password">
<span class="svg-container">
<svg-icon icon-class="password" />
</span>
<el-input
:key="passwordType"
ref="password"
v-model="loginForm.password"
:type="passwordType"
placeholder="請輸入密碼"
name="password"
tabindex="2"
autocomplete="on"
@keyup.native="checkCapslock"
@blur="capsTooltip = false"
@keyup.enter.native="handleLogin"
/>
<span class="show-pwd" @click="showPwd">
<svg-icon :icon-class="passwordType === 'password' ? 'eye' : 'eye-open'" />
</span>
</el-form-item>
</el-tooltip>
<el-tooltip v-if="inputType == 'reg'" v-model="capsTooltip" content="Caps lock is On" placement="right" manual>
<el-form-item prop="repassword">
<span class="svg-container">
<svg-icon icon-class="password" />
</span>
<el-input
:key="repasswordType"
ref="repassword"
v-model="loginForm.repassword"
:type="repasswordType"
placeholder="請輸入確認密碼"
name="repassword"
tabindex="2"
autocomplete="on"
@keyup.enter.native="handleLogin"
/>
<span class="show-pwd" @click="showRePwd">
<svg-icon :icon-class="repasswordType === 'password' ? 'eye' : 'eye-open'" />
</span>
</el-form-item>
</el-tooltip>
<el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">
{{inputType == "login" ? "登錄" : "注冊"}}
</el-button>
<div>
<el-button type="default" @click="inputType = inputType == 'login' ? 'reg' : 'login'" style="width:100%;margin-bottom:30px;">
{{inputType == "login" ? "切換為注冊" : "切換為登錄"}}
</el-button>
</div>
</el-form>
</div>
</template>
<script>
import { validUsername } from '@/utils/validate'
export default {
name: 'Login',
data() {
// const validateUsername = (rule, value, callback) => {
// if (!validUsername(value)) {
// callback(new Error('Please enter the correct user name'))
// } else {
// callback()
// }
// }
// const validatePassword = (rule, value, callback) => {
// if (value.length < 6) {
// callback(new Error('The password can not be less than 6 digits'))
// } else {
// callback()
// }
// }
return {
inputType : "login",
loginForm: {
username: '',
password: '',
repassword : ""
},
passwordType: 'password',
repasswordType: 'password',
capsTooltip: false,
loading: false,
showDialog: false,
redirect: undefined,
otherQuery: {}
}
},
computed: {
loginRules(){
let rules = {
username: [{ required: true, trigger: 'blur', }],
password: [{ required: true, trigger: 'blur', }]
}
if(this.inputType == "reg"){
rules.repassword = [{ required: true, trigger: 'blur', }]
}
return rules;
}
},
watch: {
$route: {
handler: function(route) {
const query = route.query
if (query) {
this.redirect = query.redirect
this.otherQuery = this.getOtherQuery(query)
}
},
immediate: true
}
},
created() {
// window.addEventListener('storage', this.afterQRScan)
},
mounted() {
if (this.loginForm.username === '') {
this.$refs.username.focus()
} else if (this.loginForm.password === '') {
this.$refs.password.focus()
}
},
destroyed() {
// window.removeEventListener('storage', this.afterQRScan)
},
methods: {
checkCapslock(e) {
const { key } = e
this.capsTooltip = key && key.length === 1 && (key >= 'A' && key <= 'Z')
},
showPwd() {
if (this.passwordType === 'password') {
this.passwordType = ''
} else {
this.passwordType = 'password'
}
this.$nextTick(() => {
this.$refs.password.focus()
})
},
showRePwd() {
if (this.repasswordType === 'password') {
this.repasswordType = ''
} else {
this.repasswordType = 'password'
}
this.$nextTick(() => {
this.$refs.repassword.focus()
})
},
handleLogin() {
this.$refs.loginForm.validate(valid => {
if (valid) {
this.loading = true
this.$store.dispatch('user/login', this.loginForm)
.then(() => {
this.$router.push({ path: "/" })
this.loading = false
})
.catch(() => {
this.loading = false
})
} else {
console.log('error submit!!')
return false
}
})
},
getOtherQuery(query) {
return Object.keys(query).reduce((acc, cur) => {
if (cur !== 'redirect') {
acc[cur] = query[cur]
}
return acc
}, {})
}
// afterQRScan() {
// if (e.key === 'x-admin-oauth-code') {
// const code = getQueryObject(e.newValue)
// const codeMap = {
// wechat: 'code',
// tencent: 'code'
// }
// const type = codeMap[this.auth_type]
// const codeName = code[type]
// if (codeName) {
// this.$store.dispatch('LoginByThirdparty', codeName).then(() => {
// this.$router.push({ path: this.redirect || '/' })
// })
// } else {
// alert('第三方登錄失敗')
// }
// }
// }
}
}
</script>
```
2.5 實現注冊功能
2.5.1 配置注冊接口
```
export function reg(data) {
return request({
url: '/user/reg',
method: 'post',
data
})
}
```
2.5.2 實現注冊功能
```
handleLogin() {
this.$refs.loginForm.validate(valid => {
if (valid) {
this.loading = true
if(this.inputType == "reg"){
reg(this.loginForm).then(response=>{
this.loading = false;
this.$message.success("注冊成功")
this.inputType = "login"
this.loginForm = {
username : "",
password : "",
repassword : ""
}
}).catch(error=>{
this.loading = false;
})
return
}
this.$store.dispatch('user/login', this.loginForm)
.then(() => {
this.$router.push({ path: "/" })
this.loading = false
})
.catch(() => {
this.loading = false
})
} else {
console.log('error submit!!')
return false
}
})
},
```
- 第一章 項目介紹
- 1.1 項目介紹
- 第二章 創建項目和基礎部分
- 2.1 安裝創建Vue項目和配置
- 2.2 配置開發工具和高效代碼塊
- 2.3 創建路由菜單和頁面(一)
- 2.4 創建路由菜單和頁面(二)
- 第三章 課程模塊開發
- 3.1 圖文列表頁開發 (一)
- 3.2 圖文列表頁開發 (二)
- 3.3 新增api和mock使用 (一)
- 3.4 新增api和mock使用 (二)
- 3.5 新增api和mock使用 (三)
- 3.6 刪除圖文功能
- 3.7 新增圖文功能 (一)
- 3.8 新增圖文功能 (二)
- 3.9 完善圖文管理細節
- 3.10 音頻列表管理功能
- 3.11 音頻新增編輯功能
- 3.12 管理視頻功能開發
- 3.13 專欄列表功能
- 3.14 專欄詳情功能實現(一) - 創建跳轉
- 3.15 專欄詳情功能實現(二) - 傳參和布局
- 3.16 專欄詳情功能實現(三) - 獲取詳情
- 3.17 專欄目錄管理搭建
- 3.18 專欄目錄拖拽排序實現
- 3.19 彈出課程選擇框開發 (一) 0 布局1
- 3.20 彈出課程選擇框開發 (二) - 布局2
- 3.21 彈出課程選擇框開發 (三) - 功能
- 3.22 彈出課程選擇框卡挨罰 (四) - 完善
- 第四章 用戶模塊開發
- 4.1 用戶管理列表開發 (一)
- 4.2 用戶管理列表開發 (二)
- 4.3 查看用戶相關詳情 (一)
- 4.4 查看用戶相關詳情 (二)
- 4.5 查看用戶相關詳情 (三) - 動態表格1
- 4.6 查看用戶相關詳情 (四) - 動態表格2
- 4.7 查看用戶相關詳情 (五) - 動態表格3
- 4.8 批量禁止評論和訪問
- 第五章 交易模塊開發
- 5.1 訂單管理開發 (一)
- 5.2 訂單管理開發 (二) - 列表渲染
- 5.3 訂單管理開發 (三) - 導出excel
- 5.4 訂單管理開發 (四) - 刪除訂單
- 5.5 資產管理開發 (一)
- 5.6 資產管理開發 (二)
- 5.7 資產管理開發 (三) - 提現1
- 5.8 資產管理開發 (四) - 提現2
- 5.9 支付設置開發 (一)
- 5.10 支付設置開發 (二) - 地區選擇器
- 5.11 支付設置開發 (三)
- 第六章 可視化拖拽管理多端(移動端)
- 6.1 可視化布局 (一)
- 6.2 可視化布局 (二) - 移動端列表1
- 6.3 可視化布局 (三) - 移動端列表2
- 6.4 可視化布局 (四) - 移動端組件列表
- 6.5 可視化布局 (五) - 移動端組件布局1
- 6.6 可視化布局 (六) - 移動端組件布局2
- 第七章 可視化拖拽管理多端(pc端)
- 7.1 可視化 - PC端列表
- 7.2 可視化 - PC端組件布局 (一)
- 7.3 可視化 - PC端組件布局 (二)
- 7.4 可視化 - PC端導航布局
- 7.5 可視化 - PC端輪播圖模塊
- 7.6 可視化 - PC端圖標分類模塊
- 7.7 可視化 - PC端列表模塊
- 7.8 可視化 - PC端底部布局
- 第八章 營銷模塊開發
- 8.1 拼團模塊 - 列表 (一)
- 8.2 拼團模塊 - 列表和下架 (二)
- 8.3 拼團模塊 - 列表和下架 (三)
- 8.4 拼團模塊 - 創建和修改 (一)
- 8.5 拼團模塊 - 創建和修改 (二)
- 8.6 拼團模塊 - 創建和修改 (三)
- 8.7 秒殺模塊開發
- 8.8 優惠卷模塊開發 (一)
- 8.9 優惠卷模塊開發 (三)
- 第九章 問答和題庫模塊開發
- 9.1 題庫模塊 - 列表和刪除 (一)
- 9.2 題庫模塊 - 列表和刪除 (二)
- 9.3 題庫模塊 - 自定義編輯器組件 (一)
- 9.4 題庫模塊 - 自定義編輯組件 (二)
- 9.5 題庫模塊 - 關聯類型和答案 (一)
- 9.6 題庫模塊 - 關聯類型和答案 (二)
- 9.7 題庫模塊 - 關聯類型和答案 (三)
- 9.8 試卷模塊 - 列表管理 (一)
- 9.9 試卷模塊 - 列表管理 (二)
- 9.10 試卷模塊 - 手動組卷 (一)
- 9.11 試卷模塊 - 手動組卷 (二)
- 9.12 試卷模塊 - 手動組卷 (三)
- 9.13 試卷模塊 - 手動組卷 (四)
- 9.14 試卷模塊 - 手動組卷 (五)
- 9.15 試卷模塊 - 編輯試卷
- 第十章 角色權限和員工模塊開發
- 10.1 店鋪設置頁面
- 10.2 網校員工管理 (一)
- 10.3 網校員工管理 (二)
- 10.4 網校角色管理
- 10.5 我的網校管理 (一)
- 10.6 我的網校管理 (二)
- 第十一章 前后端交互實現(對接真是api接口)
- 11.1 登錄功能交互實現(1)
- 11.2 登錄功能交互實現(2)
- 11.3 注冊功能交互實現
- 第十二章 項目部署上線