路飞项目–05

登录模态框分析

思路:

1、登录,注册,都写成组件,在任意页面中都能点击显示登录模态框

2、写好的组件,应该放在大组件中

3、如果写简单,登录注册做成页面组件,点击路由跳转即可

4、放在Header.vue中,以后任意页面组件引入Header 都会有登录注册的按钮

5、点登录按钮,把Login.vue 通过定位占满全屏,透明度设为 0.5 纯黑色背景覆盖在组件上

6、在Login.vue点关闭,要把Login.vue隐藏起来,父子通信之子传父,自定义事件

路飞项目--05

登录前端

// luffy_city.src.components.Login.vue

  
    
      
      
        
          密码登录
          短信登录
        

        
          
          
          
          
          登录
        

        
          
          
          
            
              {{ sms_interval }}
            
          
          登录
        

        
          立即注册
        
      
    
  



export default {
  name: "Login",
  data() {
    return {
      username: '',
      password: '',
      mobile: '',
      sms: '',  // 验证码
      login_method: 'is_pwd',
      sms_interval: '获取验证码',
      is_send: false,
    }
  },
  methods: {
    close_login() {
      this.$emit('close')
    },
    go_register() {
      this.$emit('go')
    },
    change_login_method(method) {
      this.login_method = method;
    },
    check_mobile() {
      if (!this.mobile) return;
      // js正则:/正则语法/
      // '字符串'.match(/正则语法/)
      if (!this.mobile.match(/^1[3-9][0-9]{9}$/)) {
        this.$message({
          message: '手机号有误',
          type: 'warning',
          duration: 1000,
          onClose: () => {
            this.mobile = '';
          }
        });
        return false;
      }
      // 后台校验手机号是否已存在
      this.$axios({
        url: this.$settings.base_url + '/user/mobile/',
        method: 'post',
        data: {
          mobile: this.mobile
        }
      }).then(response => {
        let result = response.data.result;
        if (result) {
          this.$message({
            message: '账号正常',
            type: 'success',
            duration: 1000,
          });
          // 发生验证码按钮才可以被点击
          this.is_send = true;
        } else {
          this.$message({
            message: '账号不存在',
            type: 'warning',
            duration: 1000,
            onClose: () => {
              this.mobile = '';
            }
          })
        }
      }).catch(() => {
      });
    },
    send_sms() {
      // this.is_send必须允许发生验证码,才可以往下执行逻辑
      if (!this.is_send) return;
      // 按钮点一次立即禁用
      this.is_send = false;

      let sms_interval_time = 60;
      this.sms_interval = "发送中...";

      // 定时器: setInterval(fn, time, args)

      // 往后台发送验证码
      this.$axios({
        url: this.$settings.base_url + '/user/sms/',
        method: 'get',
        params: {
          mobile: this.mobile
        }
      }).then(response => {
        let result = response.data.result;
        if (result) { // 发送成功
          let timer = setInterval(() => {
            if (sms_interval_time  {
        this.sms_interval = "频率过快";
        this.is_send = true;
      })


    },
    login() {
      // 用户名密码不能为空
      if (!(this.username && this.password)) {
        this.$message({
          message: '请填好账号密码',
          type: 'warning',
          duration: 1500
        });
        return false  // 直接结束逻辑
      }
      // 发送ajax请求登录
      this.$axios.post('/user/login/mul_login/', {
        username: this.username,
        password: this.password
      }).then(res => {
        // 取出用户名,token和 icon,存到 cookie中
        this.$cookies.set('token', res.token,'7d')
        this.$cookies.set('username', res.username,'7d')
        this.$cookies.set('icon', res.icon,'7d')
        //模态框关掉
        this.$emit('close')
      }).catch(res => {
        // console.log(res)
        this.$message.error(res);
      })

    },
    mobile_login() {
      if (!(this.mobile && this.sms)) {
        this.$message({
          message: '请填好手机与验证码',
          type: 'warning',
          duration: 1500
        });
        return false  // 直接结束逻辑
      }

      this.$axios({
        url: this.$settings.base_url + '/user/mobile/login/',
        method: 'post',
        data: {
          mobile: this.mobile,
          code: this.sms,
        }
      }).then(response => {
        let username = response.data.result.username;
        let token = response.data.result.token;
        let user_id = response.data.result.id;
        this.$cookies.set('username', username, '7d');
        this.$cookies.set('token', token, '7d');
        this.$cookies.set('user_id', user_id, '7d');
        this.$emit('success', response.data.result);
      }).catch(error => {
        console.log(error.response.data)
      })
    }
  }
}



.login {
  width: 100vw;
  height: 100vh;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 10;
  background-color: rgba(0, 0, 0, 0.3);
}

.box {
  width: 400px;
  height: 420px;
  background-color: white;
  border-radius: 10px;
  position: relative;
  top: calc(50vh - 210px);
  left: calc(50vw - 200px);
}

.el-icon-close {
  position: absolute;
  font-weight: bold;
  font-size: 20px;
  top: 10px;
  right: 10px;
  cursor: pointer;
}

.el-icon-close:hover {
  color: darkred;
}

.content {
  position: absolute;
  top: 40px;
  width: 280px;
  left: 60px;
}

.nav {
  font-size: 20px;
  height: 38px;
  border-bottom: 2px solid darkgrey;
}

.nav > span {
  margin: 0 20px 0 35px;
  color: darkgrey;
  user-select: none;
  cursor: pointer;
  padding-bottom: 10px;
  border-bottom: 2px solid darkgrey;
}

.nav > span.active {
  color: black;
  border-bottom: 3px solid black;
  padding-bottom: 9px;
}

.el-input, .el-button {
  margin-top: 40px;
}

.el-button {
  width: 100%;
  font-size: 18px;
}

.foot > span {
  float: right;
  margin-top: 20px;
  color: orange;
  cursor: pointer;
}

.sms {
  color: orange;
  cursor: pointer;
  display: inline-block;
  width: 70px;
  text-align: center;
  user-select: none;
}

// luffy_city.src.components.Header.vue

  
    
      

老男孩IT教育 | 帮助有志向的年轻人通过努力学习获得体面的工作和生活

  • 免费课
  • 实战课
  • 轻课
0"> {{ username }} | 退出 登录 | 注册 import Login from "@/components/Login"; export default { name: "Header", data() { return { url_path: sessionStorage.url_path || '/', login_show: false, // 控制Login.vue 是否显示 username: '', icon: '' } }, methods: { logout() { console.log('sdsafss') // 清除cookie this.$cookies.set('username', '') this.$cookies.set('icon', '') this.$cookies.set('token', '') // this.username和this.icon 值为空 this.username = '' this.icon = '' }, go_login() { // Header 组件中按钮点击触发 this.login_show = true }, close_login() { // 子[Login.vue] 传父[Header.vue]-->控制不显示 this.login_show = false // 取一下cookie中有没有用户名,如果有,说明用户登录了,就显示用户名 this.username = this.$cookies.get('username') this.icon = this.$cookies.get('icon') }, goPage(url_path) { if (this.url_path !== url_path) { this.$router.push(url_path); } sessionStorage.url_path = url_path; }, }, created() { sessionStorage.url_path = this.$route.path; this.url_path = this.$route.path; this.username = this.$cookies.get('username') this.icon = this.$cookies.get('icon') }, components: { Login } } .header { background-color: white; box-shadow: 0 0 5px 0 #aaa; } .header:after { content: ""; display: block; clear: both; } .slogan { background-color: #eee; height: 40px; } .slogan p { width: 1200px; margin: 0 auto; color: #aaa; font-size: 13px; line-height: 40px; } .nav { background-color: white; user-select: none; width: 1200px; margin: 0 auto; display: block; } .nav ul { padding: 15px 0; float: left; } .nav ul:after { clear: both; content: ''; display: block; } .nav ul li { float: left; } .logo { margin-right: 20px; } .ele { margin: 0 20px; } .ele span { display: block; font: 15px/36px '微软雅黑'; border-bottom: 2px solid transparent; cursor: pointer; } .ele span:hover { border-bottom-color: orange; } .ele span.active { color: orange; border-bottom-color: orange; } .right-part { float: right; } .right-part .line { margin: 0 10px; } .right-part span { line-height: 68px; cursor: pointer; } .search { float: right; position: relative; margin-top: 22px; margin-right: 10px; } .search input, .search button { border: none; outline: none; background-color: white; } .search input { border-bottom: 1px solid #eeeeee; } .search input:focus { border-bottom-color: orange; } .search input:focus + button { color: orange; } .search .tips { position: absolute; bottom: 3px; left: 0; } .search .tips span { border-radius: 11px; background-color: #eee; line-height: 22px; display: inline-block; padding: 0 7px; margin-right: 3px; cursor: pointer; color: #aaa; font-size: 14px; } .search .tips span:hover { color: orange; }

路飞项目--05

注册前端

// luffy_city.src.components.Rwgister.vue

  
    
      
      
        
          新用户注册
        
        
          
          
          
          
          
            
              {{ sms_interval }}
            
          
          注册
        
        
          立即登录
        
      
    
  



export default {
  name: "Register",
  data() {
    return {
      mobile: '',
      password: '',
      sms: '',
      sms_interval: '获取验证码',
      is_send: false,
    }
  },
  methods: {
    close_register() {
      this.$emit('close')
    },
    go_login() {
      this.$emit('go')
    },
    check_mobile() {
      if (!this.mobile) return;
      // js正则:/正则语法/
      // '字符串'.match(/正则语法/)
      if (!this.mobile.match(/^1[3-9][0-9]{9}$/)) {
        this.$message({
          message: '手机号有误',
          type: 'warning',
          duration: 1000,
          onClose: () => {
            this.mobile = '';
          }
        });
        return false;
      }
      // 后台校验手机号是否已存在
      this.$axios.post('/user/mobile/check_mobile/', {
        mobile: this.mobile
      }).then(res => {
        this.$message.info('您已经注册过,直接登录即可')
        this.$emit('go')
      }).catch(res => {
        this.$message.success('改手机号可以正常注册')
        this.is_send = true
      })
    },
    send_sms() {
      // this.is_send必须允许发生验证码,才可以往下执行逻辑
      if (!this.is_send) return;
      // 按钮点一次立即禁用
      this.is_send = false;

      let sms_interval_time = 60;
      this.sms_interval = "发送中...";

      // 定时器: setInterval(fn, time, args)
      setInterval(() => {

        this.sms_interval = sms_interval_time - 1
        sms_interval_time = this.sms_interval
        if (this.sms_interval == 1) {
          this.sms_interval = '发送验证码'
          this.is_send = true;
        }
      }, 1000)
      // 往后台发送验证码
      this.$axios.get('/user/mobile/send_sms/?mobile=' + this.mobile).then(res => {
        this.$message.success(res.msg)
      }).catch(res => {
        this.$message.error('发送失败')
      })


    },
    register() {
      if (!(this.mobile && this.sms && this.password)) {
        this.$message({
          message: '请填好手机、密码与验证码',
          type: 'warning',
          duration: 1500
        });
        return false  // 直接结束逻辑
      }

      this.$axios.post('/user/register/', {
        mobile: this.mobile,
        code: this.sms,
        password: this.password
      }).then(res => {
        this.$emit('go')
      }).catch(res => {
        this.$message.error('注册失败')
      })
    }
  }
}



.register {
  width: 100vw;
  height: 100vh;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 10;
  background-color: rgba(0, 0, 0, 0.3);
}

.box {
  width: 400px;
  height: 480px;
  background-color: white;
  border-radius: 10px;
  position: relative;
  top: calc(50vh - 240px);
  left: calc(50vw - 200px);
}

.el-icon-close {
  position: absolute;
  font-weight: bold;
  font-size: 20px;
  top: 10px;
  right: 10px;
  cursor: pointer;
}

.el-icon-close:hover {
  color: darkred;
}

.content {
  position: absolute;
  top: 40px;
  width: 280px;
  left: 60px;
}

.nav {
  font-size: 20px;
  height: 38px;
  border-bottom: 2px solid darkgrey;
}

.nav > span {
  margin-left: 90px;
  color: darkgrey;
  user-select: none;
  cursor: pointer;
  padding-bottom: 10px;
  border-bottom: 2px solid darkgrey;
}

.nav > span.active {
  color: black;
  border-bottom: 3px solid black;
  padding-bottom: 9px;
}

.el-input, .el-button {
  margin-top: 40px;
}

.el-button {
  width: 100%;
  font-size: 18px;
}

.foot > span {
  float: right;
  margin-top: 20px;
  color: orange;
  cursor: pointer;
}

.sms {
  color: orange;
  cursor: pointer;
  display: inline-block;
  width: 70px;
  text-align: center;
  user-select: none;
}

// luffy_city.src.components.Header.vue

  
    
      

老男孩IT教育 | 帮助有志向的年轻人通过努力学习获得体面的工作和生活

  • 免费课
  • 实战课
  • 轻课
0"> {{ username }} | 退出 登录 | 注册 import Login from "@/components/Login"; import Register from "@/components/Register"; export default { name: "Header", data() { return { url_path: sessionStorage.url_path || '/', login_show: false, // 控制Login.vue 是否显示 is_register: false, // 控制Register.vue 是否显示 username: '', icon: '' } }, methods: { logout() { console.log('sdsafss') // 清除cookie this.$cookies.set('username', '') this.$cookies.set('icon', '') this.$cookies.set('token', '') // this.username和this.icon 值为空 this.username = '' this.icon = '' }, go_login() { // Header 组件中按钮点击触发 this.login_show = true }, close_login() { // 子[Login.vue] 传父[Header.vue]-->控制不显示 this.login_show = false // 取一下cookie中有没有用户名,如果有,说明用户登录了,就显示用户名 this.username = this.$cookies.get('username') this.icon = this.$cookies.get('icon') }, close_register() { this.is_register = false }, go_register() { this.is_register = true }, put_register() { this.login_show = false this.is_register = true }, put_login() { this.login_show = true this.is_register = false }, goPage(url_path) { if (this.url_path !== url_path) { this.$router.push(url_path); } sessionStorage.url_path = url_path; }, }, created() { sessionStorage.url_path = this.$route.path; this.url_path = this.$route.path; this.username = this.$cookies.get('username') this.icon = this.$cookies.get('icon') }, components: { Login, Register } } .header { background-color: white; box-shadow: 0 0 5px 0 #aaa; } .header:after { content: ""; display: block; clear: both; } .slogan { background-color: #eee; height: 40px; } .slogan p { width: 1200px; margin: 0 auto; color: #aaa; font-size: 13px; line-height: 40px; } .nav { background-color: white; user-select: none; width: 1200px; margin: 0 auto; display: block; } .nav ul { padding: 15px 0; float: left; } .nav ul:after { clear: both; content: ''; display: block; } .nav ul li { float: left; } .logo { margin-right: 20px; } .ele { margin: 0 20px; } .ele span { display: block; font: 15px/36px '微软雅黑'; border-bottom: 2px solid transparent; cursor: pointer; } .ele span:hover { border-bottom-color: orange; } .ele span.active { color: orange; border-bottom-color: orange; } .right-part { float: right; } .right-part .line { margin: 0 10px; } .right-part span { line-height: 68px; cursor: pointer; } .search { float: right; position: relative; margin-top: 22px; margin-right: 10px; } .search input, .search button { border: none; outline: none; background-color: white; } .search input { border-bottom: 1px solid #eeeeee; } .search input:focus { border-bottom-color: orange; } .search input:focus + button { color: orange; } .search .tips { position: absolute; bottom: 3px; left: 0; } .search .tips span { border-radius: 11px; background-color: #eee; line-height: 22px; display: inline-block; padding: 0 7px; margin-right: 3px; cursor: pointer; color: #aaa; font-size: 14px; } .search .tips span:hover { color: orange; }

路飞项目--05

多方式登录前端

// luffy_city.src.components.Login.vue

  
    
      
      
        
          密码登录
          短信登录
        

        
          
          
          
          
          登录
        

        
          
          
          
            
              {{ sms_interval }}
            
          
          登录
        

        
          立即注册
        
      
    
  



export default {
  name: "Login",
  data() {
    return {
      username: '',
      password: '',
      mobile: '',
      sms: '',  // 验证码
      login_method: 'is_pwd',
      sms_interval: '获取验证码',
      is_send: false,
    }
  },
  methods: {
    close_login() {
      this.$emit('close')
    },
    go_register() {
      this.$emit('go')
    },
    change_login_method(method) {
      this.login_method = method;
    },
    check_mobile() {
      if (!this.mobile) return;
      // js正则:/正则语法/
      // '字符串'.match(/正则语法/)
      if (!this.mobile.match(/^1[3-9][0-9]{9}$/)) {
        this.$message({
          message: '手机号有误',
          type: 'warning',
          duration: 1000,
          onClose: () => {
            this.mobile = '';
          }
        });
        return false;
      }
      // 后台校验手机号是否已存在

      this.$axios({
        url: 'user/mobile/check_mobile/',
        method: 'post',
        data: {
          mobile: this.mobile
        }
      }).then(res => {
        // 发生验证码按钮才可以被点击
        this.is_send = true;
      }).catch(() => {
        this.$message({
          type: "error",
          message: '您还没注册呢,请先注册',
          onClose: () => {
            this.mobile = ''
            this.$emit('go')
          }

        })
      });
    },
    send_sms() {
      // this.is_send必须允许发生验证码,才可以往下执行逻辑
      if (!this.is_send) return;
      // 按钮点一次立即禁用
      this.is_send = false;

      let sms_interval_time = 60;
      this.sms_interval = "发送中...";

      // 定时器: setInterval(fn, time, args)

      // 往后台发送验证码
      this.$axios({
        url: '/user/mobile/send_sms/',
        method: 'get',
        params: {
          mobile: this.mobile
        }
      }).then(res => {
        let timer = setInterval(() => {
          if (sms_interval_time  {
        this.sms_interval = "频率过快";
        this.is_send = true;
      })


    },
    login() {
      // 用户名密码不能为空
      if (!(this.username && this.password)) {
        this.$message({
          message: '请填好账号密码',
          type: 'warning',
          duration: 1500
        });
        return false  // 直接结束逻辑
      }
      // 发送ajax请求登录
      this.$axios.post('/user/login/mul_login/', {
        username: this.username,
        password: this.password
      }).then(res => {
        // 取出用户名,token和 icon,存到 cookie中
        this.$cookies.set('token', res.token, '7d')
        this.$cookies.set('username', res.username, '7d')
        this.$cookies.set('icon', res.icon, '7d')
        //模态框关掉
        this.$emit('close')
      }).catch(res => {
        // console.log(res)
        this.$message.error(res);
      })

    },
    mobile_login() {
      if (!(this.mobile && this.sms)) {
        this.$message({
          message: '请填好手机与验证码',
          type: 'warning',
          duration: 1500
        });
        return false  // 直接结束逻辑
      }

      this.$axios({
        url: '/user/login/sms_login/',
        method: 'post',
        data: {
          mobile: this.mobile,
          code: this.sms,
        }
      }).then(res => {
        this.$cookies.set('username', res.username, '7d');
        this.$cookies.set('token', res.token, '7d');
        this.$cookies.set('icon', res.icon, '7d');
        this.$emit('close');
      }).catch(error => {
        console.log(error.response.data)
      })
    }
  }
}



.login {
  width: 100vw;
  height: 100vh;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 10;
  background-color: rgba(0, 0, 0, 0.3);
}

.box {
  width: 400px;
  height: 420px;
  background-color: white;
  border-radius: 10px;
  position: relative;
  top: calc(50vh - 210px);
  left: calc(50vw - 200px);
}

.el-icon-close {
  position: absolute;
  font-weight: bold;
  font-size: 20px;
  top: 10px;
  right: 10px;
  cursor: pointer;
}

.el-icon-close:hover {
  color: darkred;
}

.content {
  position: absolute;
  top: 40px;
  width: 280px;
  left: 60px;
}

.nav {
  font-size: 20px;
  height: 38px;
  border-bottom: 2px solid darkgrey;
}

.nav > span {
  margin: 0 20px 0 35px;
  color: darkgrey;
  user-select: none;
  cursor: pointer;
  padding-bottom: 10px;
  border-bottom: 2px solid darkgrey;
}

.nav > span.active {
  color: black;
  border-bottom: 3px solid black;
  padding-bottom: 9px;
}

.el-input, .el-button {
  margin-top: 40px;
}

.el-button {
  width: 100%;
  font-size: 18px;
}

.foot > span {
  float: right;
  margin-top: 20px;
  color: orange;
  cursor: pointer;
}

.sms {
  color: orange;
  cursor: pointer;
  display: inline-block;
  width: 70px;
  text-align: center;
  user-select: none;
}

登录注册前端结合

// Login.vue

  
    
      
      
        
          密码登录
          短信登录
        

        
          
          
          
          
          登录
        

        
          
          
          
            
              {{ sms_interval }}
            
          
          登录
        

        
          立即注册
        
      
    
  



export default {
  name: "Login",
  data() {
    return {
      username: '',
      password: '',
      mobile: '',
      sms: '',  // 验证码
      login_method: 'is_pwd',
      sms_interval: '获取验证码',
      is_send: false,
    }
  },
  methods: {
    close_login() {
      this.$emit('close')
    },
    go_register() {
      this.$emit('go')
    },
    change_login_method(method) {
      this.login_method = method;
    },
    check_mobile() {
      if (!this.mobile) return;
      // js正则:/正则语法/
      // '字符串'.match(/正则语法/)
      if (!this.mobile.match(/^1[3-9][0-9]{9}$/)) {
        this.$message({
          message: '手机号有误',
          type: 'warning',
          duration: 1000,
          onClose: () => {
            this.mobile = '';
          }
        });
        return false;
      }
      // 后台校验手机号是否已存在

      this.$axios({
        url: 'user/mobile/check_mobile/',
        method: 'post',
        data: {
          mobile: this.mobile
        }
      }).then(res => {
        // 发生验证码按钮才可以被点击
        this.is_send = true;
      }).catch(() => {
        this.$message({
          type: "error",
          message: '您还没注册呢,请先注册',
          onClose: () => {
            this.mobile = ''
            this.$emit('go')
          }

        })
      });
    },
    send_sms() {
      // this.is_send必须允许发生验证码,才可以往下执行逻辑
      if (!this.is_send) return;
      // 按钮点一次立即禁用
      this.is_send = false;

      let sms_interval_time = 60;
      this.sms_interval = "发送中...";

      // 定时器: setInterval(fn, time, args)

      // 往后台发送验证码
      this.$axios({
        url: '/user/mobile/send_sms/',
        method: 'get',
        params: {
          mobile: this.mobile
        }
      }).then(res => {
        let timer = setInterval(() => {
          if (sms_interval_time  {
        this.sms_interval = "频率过快";
        this.is_send = true;
      })


    },
    login() {
      // 用户名密码不能为空
      if (!(this.username && this.password)) {
        this.$message({
          message: '请填好账号密码',
          type: 'warning',
          duration: 1500
        });
        return false  // 直接结束逻辑
      }
      // 发送ajax请求登录
      this.$axios.post('http://127.0.0.1:8000/api/v1/user/login/more_login/', {
        username: this.username,
        password: this.password
      }).then(res => {
        // 取出用户名,token和 icon,存到 cookie中
        this.$cookies.set('token', res.token, '7d')
        this.$cookies.set('username', res.username, '7d')
        this.$cookies.set('icon', res.icon, '7d')
        //模态框关掉
        this.$emit('close')
      }).catch(res => {
        // console.log(res)
        this.$message.error(res);
      })

    },
    mobile_login() {
      if (!(this.mobile && this.sms)) {
        this.$message({
          message: '请填好手机与验证码',
          type: 'warning',
          duration: 1500
        });
        return false  // 直接结束逻辑
      }

      this.$axios({
        url: '/login/informetion_login/',
        method: 'post',
        data: {
          mobile: this.mobile,
          code: this.sms,
        }
      }).then(res => {
        this.$cookies.set('username', res.username, '7d');
        this.$cookies.set('token', res.token, '7d');
        this.$cookies.set('icon', res.icon, '7d');
        this.$emit('close');
      }).catch(error => {
        console.log(error.response.data)
      })
    }
  }
}



.login {
  width: 100vw;
  height: 100vh;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 10;
  background-color: rgba(0, 0, 0, 0.8);
}

.box {
  width: 400px;
  height: 420px;
  background-color: white;
  border-radius: 10px;
  position: relative;
  top: calc(50vh - 210px);
  left: calc(50vw - 200px);
}

.el-icon-close {
  position: absolute;
  font-weight: bold;
  font-size: 20px;
  top: 10px;
  right: 10px;
  cursor: pointer;
}

.el-icon-close:hover {
  color: darkred;
}

.content {
  position: absolute;
  top: 40px;
  width: 280px;
  left: 60px;
}

.nav {
  font-size: 20px;
  height: 38px;
  border-bottom: 2px solid darkgrey;
}

.nav > span {
  margin: 0 20px 0 35px;
  color: darkgrey;
  user-select: none;
  cursor: pointer;
  padding-bottom: 10px;
  border-bottom: 2px solid darkgrey;
}

.nav > span.active {
  color: black;
  border-bottom: 3px solid black;
  padding-bottom: 9px;
}

.el-input, .el-button {
  margin-top: 40px;
}

.el-button {
  width: 100%;
  font-size: 18px;
}

.foot > span {
  float: right;
  margin-top: 20px;
  color: orange;
  cursor: pointer;
}

.sms {
  color: orange;
  cursor: pointer;
  display: inline-block;
  width: 70px;
  text-align: center;
  user-select: none;
}

// Register.vue

  
    
      
      
        
          新用户注册
        
        
          
          
          
          
          
            
              {{ sms_interval }}
            
          
          注册
        
        
          立即登录
        
      
    
  



export default {
  name: "Register",
  data() {
    return {
      mobile: '',
      password: '',
      sms: '',
      sms_interval: '获取验证码',
      is_send: false,
    }
  },
  methods: {
    close_register() {
      this.$emit('close')
    },
    go_login() {
      this.$emit('go')
    },
    check_mobile() {
      if (!this.mobile) return;
      // js正则:/正则语法/
      // '字符串'.match(/正则语法/)
      if (!this.mobile.match(/^1[3-9][0-9]{9}$/)) {
        this.$message({
          message: '手机号有误',
          type: 'warning',
          duration: 1000,
          onClose: () => {
            this.mobile = '';
          }
        });
        return false;
      }
      // 后台校验手机号是否已存在
      this.$axios.post('/user/mobile/check_mobile/', {
        mobile: this.mobile
      }).then(res => {
        this.$message.info('您已经注册过,直接登录即可')
        this.$emit('go')
      }).catch(res => {
        this.$message.success('改手机号可以正常注册')
        this.is_send = true
      })
    },
    send_sms() {
      // this.is_send必须允许发生验证码,才可以往下执行逻辑
      if (!this.is_send) return;
      // 按钮点一次立即禁用
      this.is_send = false;

      let sms_interval_time = 60;
      this.sms_interval = "发送中...";

      // 定时器: setInterval(fn, time, args)
      setInterval(() => {

        this.sms_interval = sms_interval_time - 1
        sms_interval_time = this.sms_interval
        if (this.sms_interval == 1) {
          this.sms_interval = '发送验证码'
          this.is_send = true;
        }
      }, 1000)
      // 往后台发送验证码
      this.$axios.get('/user/mobile/send_sms/?mobile=' + this.mobile).then(res => {
        this.$message.success(res.msg)
      }).catch(res => {
        this.$message.error('发送失败')
      })


    },
    register() {
      if (!(this.mobile && this.sms && this.password)) {
        this.$message({
          message: '请填好手机、密码与验证码',
          type: 'warning',
          duration: 1500
        });
        return false  // 直接结束逻辑
      }

      this.$axios.post('/user/register/', {
        mobile: this.mobile,
        code: this.sms,
        password: this.password
      }).then(res => {
        this.$emit('go')
      }).catch(res => {
        this.$message.error('注册失败')
      })
    }
  }
}



.register {
  width: 100vw;
  height: 100vh;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 10;
  background-color: rgba(0, 0, 0, 0.3);
}

.box {
  width: 400px;
  height: 480px;
  background-color: white;
  border-radius: 10px;
  position: relative;
  top: calc(50vh - 240px);
  left: calc(50vw - 200px);
}

.el-icon-close {
  position: absolute;
  font-weight: bold;
  font-size: 20px;
  top: 10px;
  right: 10px;
  cursor: pointer;
}

.el-icon-close:hover {
  color: darkred;
}

.content {
  position: absolute;
  top: 40px;
  width: 280px;
  left: 60px;
}

.nav {
  font-size: 20px;
  height: 38px;
  border-bottom: 2px solid darkgrey;
}

.nav > span {
  margin-left: 90px;
  color: darkgrey;
  user-select: none;
  cursor: pointer;
  padding-bottom: 10px;
  border-bottom: 2px solid darkgrey;
}

.nav > span.active {
  color: black;
  border-bottom: 3px solid black;
  padding-bottom: 9px;
}

.el-input, .el-button {
  margin-top: 40px;
}

.el-button {
  width: 100%;
  font-size: 18px;
}

.foot > span {
  float: right;
  margin-top: 20px;
  color: orange;
  cursor: pointer;
}

.sms {
  color: orange;
  cursor: pointer;
  display: inline-block;
  width: 70px;
  text-align: center;
  user-select: none;
}

// Header.vue

  
    
      

老男孩IT教育 | 帮助有志向的年轻人通过努力学习获得体面的工作和生活

  • 免费课
  • 实战课
  • 轻课
0"> {{ username }} | 退出 登录 | 注册 // 引入组件 import Login from "@/components/Login"; import Register from "@/components/Register"; export default { name: "Header", // 前端显示用的变量 data() { return { url_path: sessionStorage.url_path || '/', login_show: false, // 控制Login.vue 是否显示 is_register: false, // 控制Register.vue 是否显示 username: '', icon: '' } }, methods: { logout() { // 清除cookie this.$cookies.set('username', '') this.$cookies.set('icon', '') this.$cookies.set('token', '') // this.username和this.icon 值为空 this.username = '' this.icon = '' }, go_login() { // Header 组件中按钮点击触发 this.login_show = true }, close_login() { // 子[Login.vue] 传父[Header.vue]-->控制不显示 this.login_show = false // 取一下cookie中有没有用户名,如果有,说明用户登录了,就显示用户名 this.username = this.$cookies.get('username') this.icon = this.$cookies.get('icon') }, close_register() { this.is_register = false }, go_register() { this.is_register = true }, put_register() { this.login_show = false this.is_register = true }, put_login() { this.login_show = true this.is_register = false }, goPage(url_path) { if (this.url_path !== url_path) { this.$router.push(url_path); } sessionStorage.url_path = url_path; }, }, created() { sessionStorage.url_path = this.$route.path; this.url_path = this.$route.path; this.username = this.$cookies.get('username') this.icon = this.$cookies.get('icon') }, components: { Login, Register } } .header { background-color: white; box-shadow: 0 0 5px 0 #aaa; } .header:after { content: ""; display: block; clear: both; } .slogan { background-color: #eee; height: 40px; } .slogan p { width: 1200px; margin: 0 auto; color: #aaa; font-size: 13px; line-height: 40px; } .nav { background-color: white; user-select: none; width: 1200px; margin: 0 auto; display: block; } .nav ul { padding: 15px 0; float: left; } .nav ul:after { clear: both; content: ''; display: block; } .nav ul li { float: left; } .logo { margin-right: 20px; } .ele { margin: 0 20px; } .ele span { display: block; font: 15px/36px '微软雅黑'; border-bottom: 2px solid transparent; cursor: pointer; } .ele span:hover { border-bottom-color: orange; } .ele span.active { color: orange; border-bottom-color: orange; } .right-part { float: right; } .right-part .line { margin: 0 10px; } .right-part span { line-height: 68px; cursor: pointer; } .search { float: right; position: relative; margin-top: 22px; margin-right: 10px; } .search input, .search button { border: none; outline: none; background-color: white; } .search input { border-bottom: 1px solid #eeeeee; } .search input:focus { border-bottom-color: orange; } .search input:focus + button { color: orange; } .search .tips { position: absolute; bottom: 3px; left: 0; } .search .tips span { border-radius: 11px; background-color: #eee; line-height: 22px; display: inline-block; padding: 0 7px; margin-right: 3px; cursor: pointer; color: #aaa; font-size: 14px; } .search .tips span:hover { color: orange; }

#  登录注册组件直接引入header中就可以使用了

今日思维导图:

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/12e047ebea.html