vue koa2 mongodb 从零开始做个人博客(一) 登录注册功能前端部分
0.效果演示
插入视频插不进来,就很烦。可以出门右拐去优酷看下(点我!)。
1.准备工作
1.1前端框架
前端使用了基于vue.js的nuxt.js。为什么使用nuxt.js?
首先我做的是博客的项目,所以SSR至关重要。虽然跟本文要讲的登录注册没有什么关系,但是文章如果用axios来异步获取的话,那么搜索引擎是抓不到任何数据的。用nuxt.js可以说是为了整个项目考虑。
第二点就是省事,Nuxt.js的项目条理非常清晰,有非常方便的路由和模板功能,而且方便前端和服务端进行沟通。而且自动支持es67的语法,自带nodemon功能之类的不再赘述。感兴趣的可以自行百度。
1.2后端框架
用了koa2,如果使用Nuxt.js的话可以直接将后段项目放在server目录。使用koa2大势所趋,不多解释,都0202年了,所以不存在插件比express少的问题。
1.3数据库
数据库用的是mongodb和redis,为什么一起用,因为redis更适合做一些缓存类的工作,而且操作便捷,适合储存验证码或者session等临时数据。mongodb适合做数据库,有聚合管道和多级联合之类的骚操作,能够和mysql等关系型数据库媲美。但是因为我是前端嘛,mongoose的写法更舒服点,所以就选用了mongodb。
1.4ui框架
用了element-ui,为什么用element-ui,因为大家都在用嘛,跟风。
2.项目搭建
多说无益,感兴趣可以直接进nuxt.js的官网。
首先安装npx,然后用 create-nuxt-app 来创建项目,命令行如下。
$ npx create-nuxt-app project-name
然后按照提示就可以进入项目了,其中有几个小坑,提几嘴。
- 历史原因,后端默认是不支持es6import语法的,所以要配置babel,方法如下
- 安装插件 npm i babel-preset-es2015
- 在项目目录里新建 .babelrc 文件,然后在里面输入内容 { "presets": ["es2015"] } 并保存。
- 最后在 package.json 里的 "scripts" 里的 dev start 末尾添加 --exec babel-node 并保存。如下
"scripts": {
"dev": "cross-env NODE_ENV=development nodemon server/index.js --watch serve --exec babel-node",
"build": "nuxt build",
"start": "cross-env NODE_ENV=production node server/index.js --exec babel-node",
"generate": "nuxt generate"
},
3.项目搭建
3.1项目目录介绍
首先来观察下nuxt.js的目录,可以大体看出来我们要怎么写这个项目。

挨个解释一下
- assets顾名思义,放未编译的静态资源的地方。
- components放组件的
- layouts模板里面可以放指定的模板,就是相当于相框的意思
- middleware中间件。
- node_modules放依赖的地方
- pages就是页面,nuxt.js给你配置好了,在里面新建一个1.vue 就相当于配置了一个“/1”的路由。
- plugins放插件的地方,插件可以在里面提前配置好,然后导出。
- server就是后端的文件夹,里面有些复杂,等待会儿展开说。
- static静态文件的地方
- store放vuex模型的地方
详细请看文档(点我!)
3.2 前端搭建
前端重点不是特别多,唯一有点复杂的就是表单校验,但是好在element-ui已经给做好了。
但还是从头简要的说一遍,首先就是新建模板,模板就是套在外面的相框

如图,绿色框中就相当于模板,然后活动部分就相当于page内容,page就好像vue-cli里中的vue-router内容,事实也确实是这样,只不过nuxt.js换了个说法。
<template>
<div class="body1">
<div class="container animated slideInDown">
<header>
<Myheader :location="this.location" />
</header>
<main class="main">
<nuxt />
</main>
<footer>
<Myfooter />
</footer>
</div>
</div>
</template>
<script>
import Myheader from "../components/public/header";
import Myfooter from "../components/public/footer";
export default {
components: {
Myheader,
Myfooter
},
data: () => {
return {
location: ""
};
},
mounted() {
this.location = window.location.href.split("/").pop();
}
};
</script>
这的location属性是为了判断模板顶上的登录注册字样是否要在登录页面注册页面出现。不过这都不是重点,重点是本文要讲的登录注册功能,所以理所当然这里就是随便讲一下。不做过多的描述。
3.2.1注册页面搭建

不多废话,直接看代码,代码位置 @/pages/register.js
<template>
<div class="login_container">
<!-- 首先element表单的外标签。标签里的属性可以参考element-ui文档的Form表单 -->
<el-form
:model="ruleForm"
:rules="rules"
ref="ruleForm"
class="ruleForm"
label-width="100px"
size="small"
>
<!-- 其中表单项用el-form-item标签包起来,证明这是一个表单项目 -->
<el-form-item label="用户名" prop="name">
<el-input v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="ruleForm.password"></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="password2">
<el-input v-model="ruleForm.password2"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="ruleForm.email"></el-input>
<el-button
@click="sendMsg"
class="sendemail"
:disabled="ruleForm.verifyflag"
>{{ ruleForm.verifymsg }}</el-button>
</el-form-item> <el-form-item label="验证码" prop="code">
<el-input v-model="ruleForm.code"></el-input>
</el-form-item>
<el-form-item>
<el-button @click="submitForm('ruleForm')">注册</el-button>
<!-- <el-button @click="resetForm('ruleForm')"></el-button> -->
</el-form-item>
</el-form>
</div>
</template>
接着放代码,是用来接收表单信息的 ruleForm 对象
ruleForm: {
name: "",
password: "",
password2: "",
email: "",
code: "",
verifymsg: "发送验证码", // 要设置成动态的data,而不是直接填写在按钮里是因为data需要变化,直接操作data方便一点。
verifyflag: false // 测试现在按钮是否可以点击,因为60秒之内不能重复发验证码
},
表单现在校验不需要直接操作dom节点或者验证ruleForm里的数据。因为element-ui提供了校验的方法。控制着校验方法的就是其中表单的属性 :rules="rules" 的rules对象。
老样子直接放代码:
rules: {
name: [{ required: true, message: "请输入用户名", trigger: "blur" }],
password: [{ required: true, message: "请输入密码", trigger: "blur" }],
password2: [
{
required: true,
message: "请确认您的密码",
trigger: "blur"
},
{
validator: (rule, value, callback) => {
if (value === "") {
callback(new Error("请再次输入密码"));
} else if (value !== this.ruleForm.password) {
callback(new Error("两次输入密码不一致"));
} else {
callback();
}
},
trigger: "blur"
}
],
email: [
{
required: true,
type: "email",
message: "请正确输入您的邮箱",
trigger: "blur"
}
],
code: [
{
required: true,
message: "请正确输入您的验证码",
trigger: "blur"
}
]
}
简单讲解一下,rules的每个属性都是一个数组,里面放着对象,就是校验这个表单同名属性的方法。比较简单的就类似校验name属性,只需要判断他是否是必填的,如果每天就提示message的信息。
复杂一点的就像password2一样,在校验数组里有第二个对象,添加一个validator方法就行了。后面的参数和更详细的用法欢迎看文档(点我!)
就这样现在这个表单已经可以做前端的校验了。添加方法等后端完成(下篇博客)以后再说。
同理我们新建 @/pages/login.vue 时,同样自动创建好了login的路由,我们只需要专注代码即可。
<template>
<div class="login_container">
<el-form
:model="ruleForm"
:rules="rules"
ref="ruleForm"
class="ruleForm"
label-width="100px"
size="small"
>
<el-form-item label="用户名" prop="name">
<el-input v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="ruleForm.password" show-password></el-input>
</el-form-item>
<el-form-item>
<el-button @click="submitForm('ruleForm')">登录</el-button>
<el-button @click="resetForm('ruleForm')">注册</el-button>
</el-form-item>
</el-form>
</div>
</template> <script>
同理上script代码
data() {
return {
ruleForm: {
name: "",
password: ""
},
rules: {
name: [{ required: true, message: "请输入用户名", trigger: "blur" }],
password: [{ required: true, message: "请输入密码", trigger: "blur" }]
}
};
ok,前端大体就是这样,还是比较简单的。
但是css问题暂时没有写,毕竟自己不是做ui的,简洁大方就行了,功能性足够就好。
vue koa2 mongodb 从零开始做个人博客(一) 登录注册功能前端部分的更多相关文章
- vue koa2 mongodb 从零开始做个人博客(二) 登录注册功能后端部分
0.效果演示 插入视频插不进来,就很烦.可以出门右拐去优酷看下(点我!). 1.后端搭建 1.1项目结构 首先看一下后端的server目录 挨个解释一下 首先dbs文件夹顾名思义,操作数据库的,mod ...
- 一个基于Vue.js+Mongodb+Node.js的博客内容管理系统
这个项目最初其实是fork别人的项目.当初想接触下mongodb数据库,找个例子学习下,后来改着改着就面目全非了.后台和数据库重构,前端增加了登录注册功能,仅保留了博客设置页面,但是也优化了. 一.功 ...
- vue+node+mongodb前后端分离博客系统
感悟 历时两个多月,终于利用工作之余完成了这个项目的1.0版本,为什么要写这个项目?其实基于vuejs+nodejs构建的开源博客系统有很多,但是大多数不支持服务端渲染,也不支持动态标题,只是做到了前 ...
- Flask博客类登录注册验证模块代码(十四)
1 文件系统 blog #博客类 App forms #表单 __init__.py user.py models #模型 __init__.py user.py static #静态文件 templ ...
- NodeJS+Mongodb+Express做CMS博客系统
楼主正在用业余时间开发中-- ,目前的版本仅支持会员系统,尝鲜一下吧~ hi-blog 一个 nodejs+express+mongodb 的 cms 系统 怎么启动 默认你已经安装了 mongodb ...
- 基于 Hexo 从零开始搭建个人博客(二)
阅读本篇前,请先配置好相应的环境,请仔细阅读教程 基于 Hexo 从零开始搭建个人博客(一). 原文链接:基于 Hexo 从零开始搭建个人博客(二) 前言 博客搭建过程遇到任何问题,优先在本页面搜索, ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(4)下,前后台布局实现、发布博客以及展示。
一.博客系统进度回顾 目前已经完成了,前台展示,以及后台发布的功能,最近都在做这个,其实我在国庆的时候就可以弄完的,但是每天自己弄,突然最后国庆2天,连电脑都不想碰,所以就一直拖着,上一篇写了前端实现 ...
- 基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统
很久没更新博客,最近也有点忙,然后业余时间搞了一个比较完整基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统的流程系统,希望对 ...
- nodejs实战《一起学 Node.js》 使用 Express + MongoDB 搭建多人博客
GitHub: https://github.com/nswbmw/N-blog N-blog 使用 Express + MongoDB 搭建多人博客 开发环境 Node.js: 6.9.1 Mong ...
随机推荐
- Cacti 升级
现在用的 cacti 1.0.3 决定升级一下cacti到最新版本 1.1.1 官方升级指导文件 Upgrading Cacti Backup the old Cacti database. ...
- centos7利用系统镜像修复grub
1 故障描述 由于错误操作,导致grub配置文件失效,系统开机后一直卡在下面的画面. 2 解决办法 这时候,就要利用系统镜像光盘,进入修复模式,然后按下面图示操作 进入镜像的shell环境,如下图所示 ...
- [Python]获取字典所有值
方法一:Key Value 直接获取 databases = {1: 'Student', 2: 'School'} for k,v in databases.items(): print(k,v) ...
- RabbitMQ配置死信队列
死信队列 消息传输过程中难免会产生一些无法及时处理的消息,这些暂时无法处理的消息有时候也是需要被保留下来的,于是这些无法被及时处理的消息就变成了死信. 既然需要保留这些死信,那么就需要一个容器来存储它 ...
- 一篇文章带你搞定 ElasticSearch 术语
这篇文章主要介绍 ElasticSearch 的基本概念,学习文档.索引.集群.节点.分片等概念,同时会将 ElasticSearch 和关系型数据库做简单的类比,还会简单介绍 REST API 的使 ...
- 【学习笔记】:JavaScript中的BOM对象
JavaScript中的BOM对象 BOM(Browser Object Model):浏览器对象模型. BOM可用于对浏览器窗口进行访问,但BOM没有相关的标准,所以根据浏览器的不同,其中定义的对象 ...
- 学习了解CSS3发展方向和CSS样式与优先级
通过学习CSS3游戏介绍.CSS样式和优先级章节,了解到html5+css3+js不光可以实现动画,其次可以往这个游戏与建模方向发展,更多css3特效访问Gerard Ferrandez on Cod ...
- redis中hash数据类型
remoteSelf:1>hset website google "www.google.com" "1" remoteSelf:1>hget we ...
- 小白的linux笔记3:对外联通——开通ssh和ftp和smb共享
1.SSH的开通.https://www.cnblogs.com/DiDiao-Liang/articles/8283686.html 安装:yum install sshd或yum install ...
- EasyUI笔记(三)Window窗口
本系列只列出一些常用的属性.事件或方法,具体完整知识请查看API文档 Window(窗口) 窗口控件是一个浮动和可拖拽的面板可以用作应用程序窗口.默认情况下,窗口可以移动,调整大小和关闭.它的内容也可 ...