第四章,登录注册

news2025/1/4 19:33:44

目录

4.1 添加注册页面

4.2 注册表单验证

4.3提交注册信息

4.4 完善注册功能

4.5 完善登录功能

4.6 推出用户登录

4.7 用户登录界面

4.8 小结


4.1 添加注册页面

<template>
  <div class="navbar-right">
    <div class="nav navbar-nav github-login">
      <a href="#" class="btn btn-default login-btn">
        <i class="fa fa-user"></i> 登 录
      </a>
      <a href="#" class="btn btn-default login-btn">
        <i class="fa fa-user-plus"></i> 注 册
      </a>
    </div>
  </div>
</template>

<script>
export default {
  name: 'TheEntry'
}
</script>

<style scoped>

</style>

<script>
// 引入 TheEntry.vue 的默认值
import TheEntry from '@/components/layouts/TheEntry'

export default {
  name: 'TheHeader',
  // 添加 components 选项,并注册 TheEntry
  components: {
    TheEntry
  },
  data() {
.
.
.
</script>

2、查找 <div id="top-navbar-collapse" 元素,在其内部添加『入口组件』:
src/components/layouts/TheHeader.vue

<div id="top-navbar-collapse" :class="['collapse', 'navbar-collapse', { in: showCollapsedNav }]">
  <ul class="nav navbar-nav">
    <li v-for="(item, index) in navList" :class="{ active: index === activeNavIndex }">
      <a href="#" @click="changeNavIndex(index)">{
  { item }}</a>
    </li>
  </ul>

  <!-- 入口组件 -->
  <div class="navbar-right">
    <TheEntry/>
  </div>
</div>

<template>
  <div class="row">
    <div class="col-md-4 col-md-offset-4 floating-box">
      <div class="panel panel-default">
        <div class="panel-heading">
          <h3 class="panel-title">请注册</h3>
        </div>

        <div class="panel-body">
          <div class="form-group">
            <label class="control-label">用户名</label>
            <input type="text" class="form-control" placeholder="请填写用户名">
          </div>
          <div class="form-group">
            <label class="control-label">密码</label>
            <input type="password" class="form-control" placeholder="请填写密码">
          </div>
          <div class="form-group">
            <label class="control-label">确认密码</label>
            <input type="password" class="form-control" placeholder="请填写确认密码">
          </div>
          <div class="form-group">
            <label class="control-label">图片验证码</label>
            <input type="text" class="form-control" placeholder="请填写验证码">
          </div>
            <div class="thumbnail" title="点击图片重新获取验证码">
              <div class="captcha"></div>
          </div>
          <button type="submit" class="btn btn-lg btn-success btn-block">
            <i class="fa fa-btn fa-sign-in"></i> 注册
          </button>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'Register'
}
</script>

<style scoped>
.thumbnail { width: 170px; margin-top: 10px; cursor: pointer;}
.thumbnail .captcha { height: 46px; background: #E1E6E8;}
</style>

 

> cd ~/Code/vuejs-essential
> npm install vue-router --save

 

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

const routes = [
  {
    path: '/auth/register',
    name: 'Register',
    component: () => import('@/views/auth/Register')
  }
]

const router = new Router({
  mode: 'history',
  routes
})

export default router

在引入 vue-router 后,我们需要使用 Vue.use 来使用插件:

Vue.use(Router)

component: () => import('@/views/auth/Register')

component: () => import('@/views/auth/Register')

import Register from '@/views/auth/Register'

const routes = [
  {
    path: '/auth/register',
    name: 'Register',
    component: Register
  }
]

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

我们先引入路由配置:

// 如果引入的是 index.js,可以使用下面的简写,等价于 import router from './router/index.js'
import router from './router'

然后在当前实例中注入路由:

new Vue({
  router
})

<template>
  <div id="wrap">
    <TheHeader/>
    <div id="main-container" class="container main-container">
      <router-view/>
    </div>
    <TheFooter/>
  </div>
</template>

 

<!-- 修改 -->
<a href="#" class="btn btn-default login-btn">
  <i class="fa fa-user-plus"></i> 注 册
</a>
<!-- 为 -->
<router-link to="/auth/register" class="btn btn-default login-btn">
  <i class="fa fa-user-plus"></i> 注 册
</router-link>

<router-link> 组件支持用户在具有路由功能的应用中导航,通过 <router-link> 上的 to 属性可以指定目标地址,这里是一个字符串 /auth/register,对应路由配置中的 path。
现在的页面效果如下:

file

 从上面的演示可以看到,当切换回首页时页面重新加载了,我们需要打开 TheHeader.vue 文件,将 Logo 链接用 <router-link> 替换:
src/components/layouts/TheHeader.vue

<!-- 修改 -->
<a href="/" class="navbar-brand">
  <span class="title">{
  { logo.title }}</span>
  <img :src="logo.src" :alt="logo.title">
</a>
<!-- 为 -->
<router-link to="/" class="navbar-brand">
  <span class="title">{
  { logo.title }}</span>
  <img :src="logo.src" :alt="logo.title">
</router-link>

 

file

4.2 注册表单验证

function validate(el, modifiers, bindingValue) {
  bindingValue = bindingValue && typeof bindingValue === 'object' ? bindingValue : {}
  const value = typeof el.value === 'string' ? el.value.trim() : ''
  const { title = '该项', error } = bindingValue
  let defaultError = ''

  if (modifiers.required && value === '') {
    defaultError = `${title}不能为空`
  } else if (bindingValue.target) {
    const target = document.querySelector(bindingValue.target)
    const targetValue = target ? target.value : null

    if (targetValue !== value) {
      defaultError = `输入的${title}不匹配`
    }
  } else if (bindingValue.regex) {
    try {
      if (!bindingValue.regex.test(value)) {
        defaultError = `${title}格式不正确`
      }
    } catch (e) {}
  }

  if (defaultError) {
    if (error === undefined) {
      showError(el, defaultError)
    } else {
      showError(el, error)
    }
  } else {
    showError(el)
  }
}

function showError(el, error) {
  const parentElement = el.parentElement
  const errorElement = getErrorElement(el)

  if (error === undefined) {
    errorElement.style.display = 'none'
    parentElement.classList.remove('has-error')
  } else {
    errorElement.textContent = error
    errorElement.style.display = 'block'
    parentElement.classList.add('has-error')
  }
}

function getErrorElement(el) {
  const parentElement = el.parentElement
  let errorElement = parentElement.querySelector('.help-block')

  if (!errorElement) {
    const tpl = `<span class="help-block"></span>`
    const fragment = document.createRange().createContextualFragment(tpl)

    parentElement.appendChild(fragment)
    errorElement = parentElement.querySelector('.help-block')
  }

  return errorElement
}

export default {
  bind(el, binding, vnode) {
    const { value, arg, modifiers } = binding
    const eventType = ['change', 'blur', '

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测

多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测&#xff1b; 2.运行环境为Matlab20…

kafka 入门到起飞 - 举个栗子一步一步说HW、LEO如何写入

举个简单栗子&#xff0c;如上图 replication.factory 2 副本因子是2一个Leader副本&#xff0c;一个Follower副本初始情况Leader和Follower 副本都是空我们逐步看当producer写入消息时&#xff0c;broker端的副本会做什么&#xff0c;副本的HW和LEO是如何被更新的 步骤一&a…

网上考试系统将会成为提升教育质量的利器

随着信息技术的飞速发展&#xff0c;网上考试系统成为了现代教育的一项重要工具。这种基于网络的考试方式不仅为学校和机构提供了高效管理和评估学生的能力&#xff0c;同时也带来了许多便利和创新。 网上考试系统为学校和机构提供了更高效的管理方式。传统的纸笔考试需要大量…

计算机中丢失MSVCR120.dll,找不到MSVCR120.dll是什么意思?

当计算机中缺少MSVCR120.dll文件时&#xff0c;意味着缺少了Microsoft Visual C Redistributable文件的一个组件。MSVCR120.dll是Visual C Redistributable 2013的动态链接库文件&#xff0c;它是应用程序依赖的重要文件之一。缺少MSVCR120.dll文件可能会导致一些应用程序无法正…

极客时间-《左耳听风》

技术基础 02 程序员如何用技术变现&#xff08;下&#xff09; 在学习技术的过程一定要多问自己两个问题&#xff1a;“一&#xff0c;这个技术解决什么问题&#xff1f;为什么别的同类技术做不到&#xff1f;二&#xff0c;为什么是这样解决的&#xff1f;有没有更好的方式&…

【报错】git push --set-upstream origin XXXX重名

您在尝试将分支推送到远程仓库时遇到了错误。错误信息表明&#xff0c;由于已经存在名为 refs/heads/xingfan/demo 的文件夹&#xff0c;Git 无法创建分支 refs/heads/xingfan。 要解决此问题&#xff0c;您可以尝试重命名本地分支&#xff0c;然后将其推送到远程仓库。以下是…

冠达管理:被举牌的股票好不好?

所谓“举牌”&#xff0c;就是指通过买入目标公司5%以上的股份并自动公告&#xff0c;向商场宣示自己对公司股权的控制权和出资意向。那么&#xff0c;对于这些被举牌的公司&#xff0c;其股票好不好呢&#xff1f; 1. 举牌背面的原因 首先&#xff0c;咱们需求关注举牌背面的…

图数据库_Neo4j和SpringBoot整合使用_创建节点_删除节点_创建关系_使用CQL操作图谱---Neo4j图数据库工作笔记0009

首先需要引入依赖 springboot提供了一个spring data neo4j来操作 neo4j 可以看到它的架构 这个是下载下来的jar包来看看 有很多cypher对吧 可以看到就是通过封装的驱动来操作graph database 然后开始弄一下 首先添加依赖

RunnerGo链接数据库功能详解

我们在做性能测试或者场景测试时往往需要从数据库中获取一些真实的系统数据让我们配置的场景更加贴合实际。而RunnerGo也是在最近的大版本更新中推出连接数据库功能&#xff0c;本篇文章也给大家讲解一下具体的操作方法和实际应用场景。 配置数据库 首先进入RunnerGo页面&…

​怎么将物理机硬盘克隆到虚拟机?

​用户案例&#xff1a;克隆后的硬盘是否能用于虚拟机&#xff1f; “我有一台安装了Windows10的计算机&#xff0c;现在正在尝试克隆电脑上的硬盘。然后我想把这个硬盘放在自己的虚拟机中使用&#xff0c;这样我就可以从克隆的硬盘中启动相同的Windows10系统。” …

做好以下几点,可以让我们延长周末体验感,好好放松!!!

工作以后常常容易感到疲于奔命&#xff0c;让我们找到适合自己方式&#xff0c;来让我们度过一个充实放松的周末! 方向一&#xff1a;分享你周末的时间规划 我们可以把每个月当做一个周期&#xff0c;制定一个简单的计划&#xff0c;如&#xff1a;第一周&#xff0c;锻炼身体…

手写代码-前端面试

GitHub&#xff1a;手写代码集合

windows任务计划程序运行bat文件,报错脚本错误:系统找不到指定的文件

先看错误&#xff1a; 我用windows任务计划程序运行调用python的程序&#xff0c;就写了一个bat&#xff0c;我想让他不显示命令框&#xff0c;所以我就加了上面可以隐藏命令框的&#xff0c;然后我用任务调用的时候就报错了 echo offif "%1" "h" goto b…

jenkins使用

安装插件 maven publish over ssh publish over ssh 会将打包后的jar包&#xff0c;通过ssh推送到指定的服务器上&#xff0c;&#xff0c;在jenkins中设置&#xff0c;推送后脚本&#xff0c;实现自动部署jar包&#xff0c;&#xff0c; 装了这个插件之后&#xff0c;可以在项…

一些封装电商API接口的常见步骤

电商API接口的封装是指将电商平台的功能和数据通过API接口的形式提供给开发者来调用。下面是一些封装电商API接口的常见步骤&#xff1a; 1. 确定需求&#xff1a;首先需要明确要封装的电商API接口的功能和数据&#xff0c;包括用户登录、商品搜索、订单管理等。Taobao。拼多多…

高并发内存池(threadcache)[1]

高并发内存池 分层处理 thread cache 定义一个公共的FreeList管理切分的小空间 static void*& NextObj(void* obj) {return *(void**)obj; }//管理切分好的小对象的自由链表 class FreeList { public:void Push(void* obj){assert(obj);//头插//*(void**)obj _freeLis…

RabbitMq-3入门案例

rabbitmq入门 1.生产者&#xff08;服务提供方&#xff09; //依赖<dependencies> <!-- rabbitmq客户端依赖--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0<…

骨传导耳机会伤耳膜吗?骨传导耳机有什么优缺点一文教你读懂

骨传导耳机会伤耳膜吗? 答案是不会&#xff01;因为骨传导耳机传声完全不会经过耳膜&#xff0c;说到这里就不得不讲一下骨传导的发声原理了&#xff0c;正常情况下&#xff0c;声音传声主要分为空气传导、固体传导和液体传导&#xff0c;物理大家都学过这里就不多赘述了。 我…

用MASM32编程更新sysInfo的一些收获

近日正在更新用MASM32编写的sysInfo&#xff0c;通过WMI访问Win32_UserCount来获取系统用户帐号信息&#xff0c;访问Win32_Product来获取系统中安装的产品信息。 在进行更新过程中&#xff0c;有一些新的收获跟大家分享。 一、HTMLJavaScript构建C类代码一键转换MASM32代码平…

中科方德4.0服务器 默认自动分区,扩容根分区方法

先看分区情况是否为非LVM的ext4&#xff0c;方德默认自动分配即是此种分区&#xff1b;外部添加磁盘空间&#xff0c;虚拟机或者物理机一样&#xff1b;图形化扩展到逻辑分区&#xff0c;如图中所示的扩展分区&#xff1b;home分区扩展&#xff1b;home分区尾部留出新home分区&…