NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
[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 } }) }, ```