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 从零开始做个人博客(一) 登录注册功能前端部分的更多相关文章

  1. vue koa2 mongodb 从零开始做个人博客(二) 登录注册功能后端部分

    0.效果演示 插入视频插不进来,就很烦.可以出门右拐去优酷看下(点我!). 1.后端搭建 1.1项目结构 首先看一下后端的server目录 挨个解释一下 首先dbs文件夹顾名思义,操作数据库的,mod ...

  2. 一个基于Vue.js+Mongodb+Node.js的博客内容管理系统

    这个项目最初其实是fork别人的项目.当初想接触下mongodb数据库,找个例子学习下,后来改着改着就面目全非了.后台和数据库重构,前端增加了登录注册功能,仅保留了博客设置页面,但是也优化了. 一.功 ...

  3. vue+node+mongodb前后端分离博客系统

    感悟 历时两个多月,终于利用工作之余完成了这个项目的1.0版本,为什么要写这个项目?其实基于vuejs+nodejs构建的开源博客系统有很多,但是大多数不支持服务端渲染,也不支持动态标题,只是做到了前 ...

  4. Flask博客类登录注册验证模块代码(十四)

    1 文件系统 blog #博客类 App forms #表单 __init__.py user.py models #模型 __init__.py user.py static #静态文件 templ ...

  5. NodeJS+Mongodb+Express做CMS博客系统

    楼主正在用业余时间开发中-- ,目前的版本仅支持会员系统,尝鲜一下吧~ hi-blog 一个 nodejs+express+mongodb 的 cms 系统 怎么启动 默认你已经安装了 mongodb ...

  6. 基于 Hexo 从零开始搭建个人博客(二)

    阅读本篇前,请先配置好相应的环境,请仔细阅读教程 基于 Hexo 从零开始搭建个人博客(一). 原文链接:基于 Hexo 从零开始搭建个人博客(二) 前言 博客搭建过程遇到任何问题,优先在本页面搜索, ...

  7. 从零开始,搭建博客系统MVC5+EF6搭建框架(4)下,前后台布局实现、发布博客以及展示。

    一.博客系统进度回顾 目前已经完成了,前台展示,以及后台发布的功能,最近都在做这个,其实我在国庆的时候就可以弄完的,但是每天自己弄,突然最后国庆2天,连电脑都不想碰,所以就一直拖着,上一篇写了前端实现 ...

  8. 基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统

    很久没更新博客,最近也有点忙,然后业余时间搞了一个比较完整基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统的流程系统,希望对 ...

  9. nodejs实战《一起学 Node.js》 使用 Express + MongoDB 搭建多人博客

    GitHub: https://github.com/nswbmw/N-blog N-blog 使用 Express + MongoDB 搭建多人博客 开发环境 Node.js: 6.9.1 Mong ...

随机推荐

  1. 字符编码及字节串bytes类型

    1 字符编码简介 ASCII码:美国人发明并使用,用1个字节(8位二进制)代表一个字符,ASCII码是其他任意编码表的子集(utf-16除外). Unicode:包含和兼容全世界的语言,与全世界的语言 ...

  2. pocsuite3使用教程

    pocsuite3使用教程 0X00简介 PocSuite3是Knownsec 404安全研究团队设计的一款远程漏洞测试以及PoC开发框架,该框架使用了功能极其强大的概念验证引擎,并自带了大量渗透测试 ...

  3. 容器监控工具WeaveScope

    最近一段时间整了一些docker容器,弄了一些基于docker的微服务通信,弄好一套服务系统之后,对于服务的性能,基础数据的监控就显的很重要, 不然就是两眼一抹黑了,要不就是维护成本很高,这些都不符合 ...

  4. spring cloud微服务快速教程之(五) ZUUL API网关中心

    0-前言 我们一个个微服务构建好了,外部的应用如何来访问内部各种各样的微服务呢?在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务.当添加API网 ...

  5. cesium结合geoserver实现地图空间查询(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  6. mysql删除索引

    删除索引 删除索引可以使用ALTER TABLE或DROP INDEX语句来实现.DROP INDEX可以在ALTER TABLE内部作为一条语句处理,其格式如下: drop index index_ ...

  7. SpringBoot整合NoSql--(三)Redis集群

    (1)集群原理 在Redis集群中,所有的Redis节点彼此互联,节点内部使用二进制协议优化传输速度和带宽. 当一个节点挂掉后,集群中超过半数的节点检测失效时才认为该节点已失效.不同于Tomcat集群 ...

  8. external IP 和 local IP 的区别

    外部(external)和本地(local) IP地址都具有相同的用途,不同之处在于范围.整个Internet使用外部或公共IP地址来定位计算机系统和设备.专用网络内部使用本地或内部IP地址来定位与其 ...

  9. LeetCode 面试题 02.07. 链表相交

    题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/ 给定两个(单向)链表,判定它们是否相交并返回交 ...

  10. 解决Python3下map函数的显示问题

    今天小编就为大家分享一篇解决Python3下map函数的显示问题,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧map函数是Python里面比较重要的函数,设计灵感来自于函数式编程.P ...