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. 一个故事看懂Linux文件权限管理

    前情回顾: 我通过open这个系统调用虫洞来到了内核空间,又在老爷爷的指点下来到了sys_open的地盘,即将开始打开文件的工作. 详情参见:内核地址空间大冒险:系统调用 open系统调用链 我是一个 ...

  2. Git简易教程(常用命令)

    本文章参考了Pro Git 1 Git简介 Linux内核开源项目有着众多参与者,为了提高开发效率,项目组于2002年开始启用分布式版本控制系统BitKeeper来管理和维护代码.在BitKeeper ...

  3. Go语言基础之接口(面向对象编程下)

    1 接口 1.1 接口介绍 接口(interface)是Go语言中核心部分,Go语言提供面向接口编程,那么接口是什么? 现实生活中,有许多接口的例子,比如说电子设备上的充电接口,这个充电接口能干什么, ...

  4. Python基础知识总结笔记(四)函数

    Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...

  5. Mac Docker Desktop "Mounts denied: EOF."解决方法

    环境 系统: Mac OS Catalina Docker Desktop: 问题描述 在Mac环境下创建容器时用"-v"参数挂载目录出现"docker: Error r ...

  6. 【python数据挖掘】爬取豆瓣影评数据

    概述: 爬取豆瓣影评数据步骤: 1.获取网页请求 2.解析获取的网页 3.提速数据 4.保存文件 源代码: # 1.导入需要的库 import urllib.request from bs4 impo ...

  7. luogu P3384 【模板】重链剖分

    参考https://www.cnblogs.com/wushengyang/p/10808505.html,感谢 #include<iostream> #include<algori ...

  8. 安装Nginx到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.3.1611 软件版本:nginx-1.12.2 硬件要求:无 安装过程 1.配置YUM源 [root@localhost ~]# r ...

  9. ArcGIS Runtime SDK for Android 加载shp数据,中文乱码问题

    针对ArcGIS10.2版本的解决办法(默认中文编码为OEM): 现有一个图层名称为“图层.shp”,以此为例: 1.拷贝一个cpg文件,修改名称为“图层.cpg”,并用文本打开cpg文件修改编码为“ ...

  10. 清北学堂—2020.1提高储备营—Day 4 morning(数论)

    qbxt Day 4 morning --2020.1.20 济南 主讲:李奥 目录一览 1.一些符号与基本知识 2.拓展欧几里得,逆元与欧拉定理 3.线性筛法与积性函数(非重点) 总知识点:数论 一 ...