用VUE实现一个具有登陆、注册等功能的网站【详细步骤】

  • 用VUE实现一个具有登陆、注册等功能的网站【详细步骤】
    • 一、主要功能
    • 二、实现思路
      • 1、页面设计
      • 2、功能设计
      • 3、重点和难点
    • 三、代码实现
      • 1、项目结构
      • 2、页面布局——html部分(以登陆界面为例)
      • 3、页面美化——css部分(以登陆界面为例)
      • 4、功能设计
    • 四、效果展示
      • 1、登陆页面
      • 2、注册页面
      • 3、主页
    • 五、总结

用VUE实现一个具有登陆、注册等功能的网站【详细步骤】

一、主要功能

本次任务主要是使用VUE实现一个具有登陆、注册等功能的精美网站【详细步骤】
主要功能为:

1.要求三个页面 分别是登陆、注册、主页(尽量美观)。
2.记录存储已注册的用户信息列表。
3. 实现各个页面之间的跳转。

二、实现思路

1、页面设计

Register.vue 注册页面,包含输入用户名、输入密码、注册按钮等。
Login.vue登录页面,包含输入用户名、输入密码、登录按钮、保持登录选项、跳转注册页面按钮等。
Homepage.vue主页,具有退出登陆的功能。

2、功能设计

因为涉及到多个页面之间的相互跳转,所以一定要先在VUE项目中的index.js里面设置好对应的路由。另外我们需要用一个json数组来存储已注册的用户信息列表(虚拟数据)。
例如用户在完成注册后,需要更新用户列表,并把更新后的列表以传参数的方式传给登陆页面,并跳转到登陆页面;
而登陆时要根据用户列表的判断输入的用户是否存在,输入的密码是否和用户名相匹配等。

3、重点和难点

(1)盒子模型布局、css美化。
(2)页面之间的跳转以及参数传递。
(3)登陆注册的业务逻辑。

三、代码实现

1、项目结构

因为我们这次涉及到多个页面,那么弄清楚项目结构,并配置好相应的路由是十分重要的。
如果还不会怎么用VUE创建项目,可参考以下步骤。

(1)首先需要安装Node与配置npm
请去node官网下进行下载:http://nodejs.cn/download/
在安装完成后,可使用node -v 查看Node的安装结果,如果出现版本号则说明node安装成功。同理使用npm -v查看npm的安装结果,如果出现版本号则说明npm安装成功。
(2)下载vue脚手架:@vue/cli

npm install @vue/cli -g

(3)安装webpack
$ sudo npm install webpack -g
(4)安装vue-cli
$ sudo cnpm install --global vue-cli
(5)创建名字为test的 vue项目
$ vue init webpack test
(6)运行:
$ cd test $ npm run dev
可参考以下博客(更加详细的介绍了VUE搭配的环境以及初始化的项目结构):
https://blog.csdn.net/iiiliuyang/article/details/104185384
https://www.cnblogs.com/hellman/p/10985377.html

以本次项目为例子,可在view文件夹中存放我们三个页面,(登陆,注册,主页)
在index.js中配置相关的路由。

index.js 中相关代码

import Vue from 'vue'
import VueRouter from 'vue-router'import Homepage from '@/views/Homepage' //主页
import Login from "@/views/Login" //登陆
import Register from "@/views/Register"; //注册Vue.use(VueRouter)const routes = [{path: '/',name: 'login',component: Login},{path: '/Register',name: 'Register',component: Register}, {path: '/Homepage',name: 'Homepage',component: Homepage},
]const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes
})export default router

2、页面布局——html部分(以登陆界面为例)

既然我们想让我们的的页面尽量美观一些,那么一开始的页面设计是必不可少的。初学的时候可以参考一下别的网站的页面布局和设计。我参考的下图的界面布局。

那么我们来分析一下这个页面的布局,首先是一个大的登陆框,位于整个页面中心。大的登陆框中分为左右两部分,左边为登陆的功能,包含账号输入框、密码输入框、以及登陆按钮等,再看右边,是一张背景图并带有网站信息或“欢迎”等字样。(分析别人好看的页面布局对我们设计网站页面的时候有帮助)
按照这个思路,我们也可以设计出我们的页面啦~下图为本次任务的设计出来的页面。


html 代码 (登陆页面)

<template><div class="container"><div class="main"><!-- 整个注册盒子 --><div class="loginbox"><!-- 左侧的注册盒子 --><div class="loginbox-in"><div class="userbox"> <span class="iconfont">&#xe817;</span> <input  class="user" id="user"  v-model="name" placeholder="用户名"></div><br><div class="pwdbox"><span class="iconfont">&#xe775;</span><input  class="pwd"  id="password" v-model="pwd" type="password"  placeholder="密码"></div><br><div class="pwdbox"><span class="iconfont">&#xe775;</span><input  class="pwd"  id="re_password"  v-model="repwd" type="password"  placeholder="确认密码"></div><br><button type="primary"  class="register_btn" @click="register">Register</button></div><!-- 右侧的注册盒子 --><div class="background"><div class="title">Welcome to WH System Management Center</div></div></div></div></div>
</template>

3、页面美化——css部分(以登陆界面为例)

关于页面的css美化其实也有很细节的地方。

(1)第一个难点就是如何使我们的登陆卡片不管窗口如何调整大小,都始终位于页面中心呢在这里我们可以使用到了position。

.loginbox{position:absolute;width:800px;height:400px;top:40%;left:50%;transform:translate(-50%,-50%);
}

其中top:40%;left:50%; 是指div(我们的登陆卡片)左顶点在页面的位置,并不是div的中心点哦~而我们想的是div的中心点在我们想要的位置的。
所以要使用tannsform 在X Y轴进行移动。可参考参考博客了解更多关于position https://www.cnblogs.com/gxsweb/p/5395243.html
(2)如何使用iconfont
我们本次任务使用到了一些小图标,可以使用png以图片的形式加载,也可以使用iconfont(字体图标)的方式,加载在我们的页面中。
想比于普通的图片,使用iconfont可以自由的变化大小并且也不会模糊,而且占用内存小,也可以任意改变颜色。

首先,我们需要在https://www.iconfont.cn/阿里矢量图表库中找到合适的图标

点击下载代码:
我们可以看到下载的压缩包中主要有这几项:

本次实验主要是unicode引用,所以我们真正会用到的文件只有这些

我们第一步要拷贝项目下生成的@font-face(在iconfont.css中)到自己页面的css中

@font-face {font-family: "iconfont";src: url('./font/iconfont.eot');src: url('./font/iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */url('./font/iconfont.woff2') format('woff2'), url('./font/iconfont.woff') format('woff'), url('./font/iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */url('./font/iconfont.svg#iconfont') format('svg');
}

注意:这里面的url 一定要根据自己的文件目录进行更改!!!

第二步:定义使用 iconfont 的样式(颜色,字体大小等都可以随心更改哦~)

.iconfont {font-family: "iconfont" !important;font-size: 20px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;height:22px;color:#4E655D;margin-right:10px;margin-top:3px;
}

第三步:挑选相应图标并获取字体编码,应用于页面

  <span class="iconfont">&#xe775;</span>

(3)如何修改input输入框自动填充的默认样式
因为我们有input账号、密码输入框,chrome会根据历史登陆过的账号与密码自动填input输入框,但是有个问题,虽然内容自动填充了,但是!!甚至样式也填充进去了,就是会覆盖掉我原来写的input输入框的样式。
比如:这个是我自己写的input输入框的样式

但这是chrome自动填充后的样式

就很和整个页面的样式很违和,解决方法如下(找遍了全网,东拼西凑,举一反三还真的成了!)

input:-webkit-autofill {/* 修改默认背景框的颜色 */box-shadow: 0 0 0px 1000px  #89AB9E inset !important;/* 修改默认字体的颜色 */-webkit-text-fill-color: #445b53;
} input:-webkit-autofill::first-line {/* 修改默认字体的大小 */font-size: 15px;/* 修改默认字体的样式 */font-weight:bold;}

(4)为了使页面更美观,有动态效果,我们可以多使用hover等,还可以给卡片增加阴影等等。

** css代码 (登陆页面)**

.loginbox{display:flex;position:absolute;width:800px;height:400px;top:40%;left:50%;transform:translate(-50%,-50%);box-shadow: 0 12px 16px 0  rgba(0,0,0,0.24), 0 17px 50px 0 #4E655D;
}
.loginbox-in{background-color:#89AB9E;width:240px;
}
.userbox{margin-top:120px ;height:30px;width:230px;display: flex;margin-left:25px;
}
.pwdbox{ height:30px;width:225px;display: flex;margin-left:25px;
}.background{width:570px;background-image:url('./img/Christmas_Trees.png');background-size:cover;font-family:sans-serif;
}
.title{margin-top:320px;font-weight:bold;font-size:20px;color:#4E655D;}
.title:hover{font-size:21px;transition: all 0.4s ease-in-out;cursor: pointer;
}
.uesr-text{position:left;
}
input{outline-style: none ;border: 0;border-bottom:1px solid #E9E9E9;background-color:transparent;height:20px;font-family:sans-serif;font-size:15px;color:#445b53;font-weight:bold;
}/* input::-webkit-input-placeholder{color:#E9E9E9;} */
input:focus{border-bottom:2px solid #445b53;background-color:transparent;transition: all 0.2s ease-in;font-family:sans-serif;font-size:15px;color:#445b53;font-weight:bold;}
input:hover{border-bottom:2px solid #445b53;background-color:transparent;transition: all 0.2s ease-in;font-family:sans-serif;font-size:15px;color:#445b53;font-weight:bold;}input:-webkit-autofill {/* 修改默认背景框的颜色 */box-shadow: 0 0 0px 1000px  #89AB9E inset !important;/* 修改默认字体的颜色 */-webkit-text-fill-color: #445b53;
} input:-webkit-autofill::first-line {/* 修改默认字体的大小 */font-size: 15px;/* 修改默认字体的样式 */font-weight:bold;}
.log-box{font-size:12px;display: flex;justify-content: space-between ;width:190px;margin-left:30px;color:#4E655D;margin-top:-5px;align-items: center;}
.log-box-text{color:#4E655D;font-size:12px;text-decoration:underline;}
.login_btn{background-color: #5f8276; /* Green */border: none;color: #FAFAFA;padding: 5px 22px;text-align: center;text-decoration: none;font-size: 13px;border-radius: 20px;outline:none;
}
.login_btn:hover{box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19);cursor: pointer;background-color: #0b5137;transition: all 0.2s ease-in;
}.warn{margin-top:60px;/* margin-right:120px; */margin-left:-120px;margin-bottom: 5px;font-weight:bold;font-size:17px;
}.register_btn{background-color: transparent; /* Green */border: none;text-decoration: none;font-size: 12px;/* border-radius: 20px;   */color:#4E655D;font-size:12px;text-decoration:underline;display: flex;margin-left:25px;outline:none;}
.register_btn:hover{font-weight:bold;cursor: pointer;
}
@font-face {font-family: "iconfont";src: url('./font/iconfont.eot');src: url('./font/iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */url('./font/iconfont.woff2') format('woff2'), url('./font/iconfont.woff') format('woff'), url('./font/iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */url('./font/iconfont.svg#iconfont') format('svg');
}.iconfont {font-family: "iconfont" !important;font-size: 20px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;height:22px;color:#4E655D;margin-right:10px;margin-top:3px;
}.icon-key:before {content: "e775";
}.icon-account:before {content: "e817";
}

4、功能设计

(1)登陆,注册,主页等页面之间跳转。
使用v-model监听获取到输入框中值。(上一期没有使用,这期更正)
如果用户名和密码都正确,那么可以跳转。
跳转的方式如下
如果有参数:(本次使用的是query的方式)

this.$router.push({
path: '/',
query: {
list: this.user_list,
}
})

如果没有参数:

this.$router.push"Homepage");//homepage为要跳转的页面

(2)注册页面的业务逻辑

使用一个json数组存储记录注册过的用户信息列表。(模拟数据库)
在使用某网站时,按照一般的操作逻辑为:当我们在登陆某个网站的时候,如果没有账号,就要去申请注册。
同样,我们这个项目也是,我们没有账号就要去注册。在当我们进入注册页面,并注册成功时,就会把我们的用户名和密码保存起来。
当然了,我们注册账号也要注意,不能让账号名字一样,而且也不能让我们两次输入的密码不一致。这就需要我们在js中加以判断。
具体如何实现,可参考代码以及相关的注释
Register.vue 判断是否可以注册成功

var flag=1;//如果用户名已存在,则需要换一个用户名this.user_list.forEach((item) => {if(item.username==this.name){alert('用户已存在,请换一个用户名');flag=0;}})//如果用户名不存在,则继续判断if(flag){//判断两次输入的密码是否一致,如果密码不一致,则需要重新输入if(this.pwd!=this.repwd){alert('两次输入的密码不一致,请重新输入'); }

当我们输入的值满足注册条件,项目会记录了我们的账号与密码,并更新用户列表user_list,此时注册就成功了,我们也需要把更新后的user_list 为参数跳转给登陆页面,此时我们直接输入刚注册的账号和密码,即可登陆成功。
当然,我们之所以要求用户注册的用户名不能和已经有了的用户名相一致是因为在这里我们把用户名作为我们用户列表的唯一标识符了,方便我们判断用户和密码是否匹配。
Register.vue 更新用户列表,并向Login.vue 传递参数

 else {var item ={};//获取到用户名item.username=this.name;//获取到密码item.password=this.pwd;//存储到用户列表this.user_list.push(item);alert('注册成功');//    this.user_list.forEach((item) => {//       console.log( item.username);// })this.$router.push({path: '/',query: {list: this.user_list,}})}

Login.vue 接收参数

var routerParams = this.$route.query.list;
this.user_list = routerParams;

(3)登陆页面的业务逻辑
我们在登陆的时候也要使用循环来判断是否有这个用户,并且要判断这个用户的密码和输入的密码是否相匹配。如果都匹配成功,则跳转到主页。(注意细节:要区别一下是直接输入账号密码进行登陆的,还是先注册再登陆的,否则会报错)

login(){var flag=0;//如果是有参数传递if(!this.$route.query.list){this.user_list.forEach((item) => {if(item.username==this.name){if(item.password==this.pwd){flag=1;//用户存在,并且密码正确}}})if(flag==1){//可以跳转到主页this.$router.push("Homepage");}else{alert("用户名或密码错误,请重新输入");}}else{// 取到路由带过来的参数var routerParams = this.$route.query.list;this.user_list = routerParams;this.user_list.forEach((item) => {if(item.username==this.name){if(item.password==this.pwd){flag=1;//用户存在,并且密码正确}}})if(flag==1){//可以跳转到主页// this.$router.push("Homepage");this.$router.push({path: '"Homepage',})}else{alert("用户名或密码错误,请重新输入");}}},

四、效果展示

1、登陆页面

2、注册页面

3、主页

五、总结

虽然只是很小的一个demo,但涉及到的知识点也蛮多的,不过也在收获到了不少新的知识的同时,也对以前学过的知识加深了理解,并更加熟悉如何应用。虽然也有很多尚未完善的功能以及有待改进的点,但希望在一次一次的任务中,不断总结,不断提高,迅速成长!

用VUE实现一个具有登陆、注册等功能的网站【详细步骤】相关推荐

  1. node.js+vue.js+mysql实现登录注册的功能(前后端分离)

    参考教程:github源码地址 Node.js+Mysql+Vue+ElementUI 实现登录注册注销功能 1 准备 1.1 MySQL数据库 参考教程:NodeJS连接MySql.易百教程.菜鸟教 ...

  2. electron+vue项目打包时修改注册表功能

    electron+vue项目打包时修改注册表功能 原因 在使用electron做项目时,由于产品需要做一个放大镜功能.在查找了网上大部分类似需求后,发现大部分的放大镜都是对图片的放大,真正实现放大镜功 ...

  3. Vue + Element UI 实现 登陆注册基本demo实例

    Vue + Element UI 实现权限管理系统 前端篇(二):Vue + Element 案例 导入项目 打开 Visual Studio Code,File --> add Folder ...

  4. 第一个SSM整合的Maven入门级项目(超详细步骤)

    环境 jdk:1.8 Tomcat:7.0 本地mysql:8.0 Eclipse:Eclipse Jee Photon Spring:4.3.8 AOP:1.8.0 mybatis:3.3.0 My ...

  5. 使用java语言编写一个简易的计算器(完整代码与详细步骤都有哦!)

    [案例介绍] 1.案例描述 本案例要求利用Java Swing 图形组件开发一个可以进行简单的算术运算的图形化计算器. 2.运行结果 运行结果 [案例目标] 学会分析"简易计算器" ...

  6. 如何实现开发一个企业认证开发版微信服务号的详细步骤

    题目:企业如何实现开发一个企业开发版微信公众号的详细步骤?(以PHP为例进行开发) 先附上一张流程图: 一.首先在微信公众平台官网进行注册登录,打款认证,微信公众平台小程序注册与认证详细过程看链接: ...

  7. HTML+CSS+PHP+COOKIE在本地搭建一个简易的登陆注册网页

    昨天晚上看了一叶飘零大佬的直播,大佬说:初学者最好自己先动手去做一些项目,这样能更好的了解原理,恰好学长要求做一个简易的登陆注册系统,利用这个机会再学习一波. 做了两天,搞懂了很多概念,也遇到了很多问 ...

  8. django写一个简单的登陆注册

    要写这个,前提还是需要知道三个知识: 一个是urls.py,它是写我们的路由关系的,之前我写了通过wsgiref写一个简单的服务端,也用到了路由,就是 请求过来的url和视图函数的对应关系. 二是就是 ...

  9. 关于unity连接MySQL数据库做一个简单的登陆注册系统

    这段时间为了大作业,作为一个菜鸟研究了好久的Unity连接数据库,那就整理一下然后写下来当作记录吧. 首先,unity连接MySQL要先在Assets板上创建pluging文件夹再导入一些必要的dll ...

最新文章

  1. 服务应该去版本化,不管是微服务还是SOA
  2. 恭贺《构建高可用Linux服务器》荣获几项殊荣
  3. mysql chroot_在chroot环境下将MySQL日志输出到syslog
  4. java一维数组的特点,数据结构:java数组特点以及声明数组类
  5. 解决为什么导入了tomcat进入myeclipse却在server中找不到
  6. 日志服务与SIEM(如Splunk)集成方案实战
  7. 计算机设计大赛国奖作品_5. 模拟退火求解旅行商问题
  8. Atitit 手机号码规范 数字化管理 靓号 吉祥号码 洋马儿 规范 attilax总结
  9. 递归算法经典实例小结(C#实现)
  10. 嵌入式方向的毕业生,找工作很迷茫
  11. mac、parallel是什么
  12. 打游戏的利器来了!配置再也不是限制我吃鸡的理由!
  13. 颠覆想象,一盏夜灯的变革
  14. matlab模糊解耦,模糊神经网络解耦MATLAB源程序
  15. cropper截图插件(自定义像素的图片并保存本地)
  16. 硬核探厂|数字原生中压真空断路器生产揭秘
  17. java实现m3u8文件抓取器
  18. 敷完面膜后要擦水乳吗_敷完面膜后要擦水乳吗
  19. netstat命令常用参数
  20. 画论66 盛大士《溪山卧游录》

热门文章

  1. hbase基于solr配置二级索引
  2. 钙钛矿型复合氧化物高熵陶瓷/过渡金属碳氮化物高熵陶瓷/固体氧化物燃料电池(SOFC)材料
  3. Terraform基础(一)-什么是Terraform?
  4. LeetCode 21-30 题
  5. windows10 系统家庭版转专业版小结
  6. 计算机整机制造业下滑,多因素导致全球PC出货量下滑 中国增速减缓
  7. 微信公众号中的支付宝支付与微信支付 支付宝支付问题(微信bug)
  8. 遇到的文件从本地上传HDFS失败
  9. python使用微信设置-用Python来可视化微信好友
  10. 安装软件提示无效驱动器D