本示例基于Vue.js和mint UI实现。


目录

一、数据库的创建

二、后端接口与数据库的连接

三、前端代码实现

1.注册页相关代码

2.注册页效果

3.登录页相关代码

4.登录页效果

四、注册登录演示

五、项目文件结构


一、数据库的创建

此处以Navicat软件进行创建,新建数据库reg_log.sql与数据表reg_log;

为了实现注册业务,我们在数据库中设计ID、用户名、密码、邮箱、电话号5个字段。

创建结束后保存,便可以在数据库中找到我们刚刚创建的数据库和空表。这样就可以在项目中进行连接了。

二、后端接口与数据库的连接

server文件夹 -> app.js

// 加载Express模块
const express = require('express');// 加载MySQL模块
const mysql = require('mysql');// 加载bodyParser模块
const bodyParser = require('body-parser');// 加载MD5模块
const md5 = require('md5');// 创建MySQL连接池
const pool = mysql.createPool({host: '127.0.0.1', //MySQL服务器地址port: 3306, //MySQL服务器端口号user: 'root', //数据库用户的用户名password: '', //数据库用户密码database: 'reg_log', //数据库名称connectionLimit: 20, //最大连接数charset: 'utf8' //数据库服务器的编码方式
});// 创建服务器对象
const server = express();server.use(bodyParser.urlencoded({extended: false
}));// 加载CORS模块
const cors = require('cors');// 使用CORS中间件
server.use(cors({origin: ['http://localhost:8080', 'http://127.0.0.1:8080']
}));//用户注册接口
server.post('/register', (req, res) => {//console.log(md5('12345678'));// 获取用户名和密码信息let username = req.body.username;let password = req.body.password;//以username为条件进行查找操作,以保证用户名的唯一性let sql = 'SELECT COUNT(id) AS count FROM reg_log WHERE username=?';pool.query(sql, [username], (error, results) => {if (error) throw error;let count = results[0].count;if (count == 0) {// 将用户的相关信息插入到数据表sql = 'INSERT reg_log(username,password) VALUES(?,MD5(?))';pool.query(sql, [username, password], (error, results) => {if (error) throw error;res.send({message: 'ok',code: 200});})} else {res.send({message: 'user exists',code: 201});}});
});// 用户登录接口
server.post('/login', (req, res) => {//获取用户名和密码信息let username = req.body.username;let password = req.body.password;// SQL语句let sql = 'SELECT id,username FROM reg_log WHERE username=? AND password=MD5(?)';pool.query(sql, [username, password], (error, results) => {if (error) throw error;if (results.length == 0) { //登录失败res.send({message: 'login failed',code: 201});} else { //登录成功res.send({message: 'ok',code: 200,result: results[0]});}});});// 指定服务器对象监听的端口号
server.listen(3000, () => {console.log('server is running...');
});

三、前端代码实现

1.注册页相关代码

项目文件夹 -> Register.vue

<template>
<!-- 注册页面 --><div class="reg"><mt-header title="用户注册"><router-link slot="left" to="/"> 返回首页 </router-link><router-link to="/login" slot="right">去登录</router-link></mt-header><mt-fieldtype="text"label="用户名"placeholder="请输入用户名"v-model="name":state="nameState"@blur.native.capture="checkName"></mt-field><!-- @blur失焦,输入框在输入完成、移到其他地方时进行验证 --><mt-fieldtype="password"label="密码"placeholder="请输入密码"v-model="pwd":state="pwdState"@blur.native.capture="checkPwd"></mt-field><mt-fieldtype="password"label="确认密码"placeholder="再次输入密码"v-model="repwd":state="repwdState"@blur.native.capture="checkrePwd"></mt-field><mt-fieldlabel="邮箱"placeholder="请输入邮箱"type="email"v-model="email":state="emailState"@blur.native.capture="checkEmail"></mt-field><mt-fieldlabel="手机号"placeholder="请输入手机号"type="tel"v-model="phone":state="phoneState"@blur.native.capture="checkPhone"></mt-field><mt-fieldlabel="生日"placeholder="请输入生日"type="date"v-model="birthday"></mt-field><mt-button class="btn" type="primary" size="large" @click="checkForm">注册</mt-button></div>
</template><style scope>
.reg .btn {background-color: #d86931;width: 190px;border-radius: 0;border: 0;margin: auto;
}
.reg .mint-cell-wrapper {line-height: 80px;
}
.reg {margin-top: 14%;
}.reg .mint-header {background-color: #d86931;
}
.reg .btn {background-color: #d86931;
}
</style><script>
export default {data() {return {name: "", //双向数据绑定 用户名输入框nameState: "", //处理用户名输入框的动态更新pwd: "",pwdState: "",repwd: "",repwdState: "",email: "",emailState: "",phone: "",phoneState: "",birthday: "",};},methods: {// 封装各个字段的验证方法:// 1.验证用户名checkName() {//事件处理函数:处理点击按钮验证表单let reg = /^[a-zA-Z0-9\u4E00-\u9FA5]{2,6}$/;if (reg.test(this.name)) {this.nameState = "success";return true;} else {this.nameState = "error";return false;}},// 2.验证密码checkPwd() {let reg = /^\d{6}$/;if (reg.test(this.pwd)) {this.pwdState = "success";return true;} else {this.pwdState = "error";return false;}},// 3.重复输入密码checkrePwd() {let reg = /^\d{6}$/;if (reg.test(this.repwd) && this.pwd == this.repwd) {this.repwdState = "success";return true;} else {this.repwdState = "error";return false;}},// 4.验证邮箱格式checkEmail() {let reg = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/;if (reg.test(this.email)) {this.emailState = "success";return true;} else {this.emailState = "error";return false;}},// 5.验证手机号checkPhone() {let reg = /^1[3|5|7|8][0-9]\d{8}$/;if (reg.test(this.phone)) {this.phoneState = "success";return true;} else {this.phoneState = "error";return false;}},checkForm() {// 点击注册按钮后调用此方法,验证用户名、密码、二次密码是否均正确,正确则发送axios请求if (this.checkName() && this.checkPwd() && this.checkrePwd()) {console.log(`验证成功,执行注册业务......`);// 发送注册(post)请求this.axios.post("/register", `username=${this.name}&password=${this.pwd}`).then((result) => {console.log(result);if (result.data.code == 200) {// 弹窗提示注册成功this.$toast({message: "注册成功",position: "bottom",duration: 3000,});// 注册成功后直接跳转到登录页this.$router.push("/login");} else if (result.data.code == 201) {this.$toast({message: "用户已存在,请重新注册",position: "bottom",duration: 3000,});}});}},},
};
</script>

2.注册页效果

3.登录页相关代码

项目文件夹 -> Login.vue

<template>
<!-- 登录页面 --><div class="log"><span class="login">请登录</span><span class="reg"><router-link to="/register">先去注册</router-link></span><!-- mint ui的表单组件 --><mt-fieldtype="text"label="用户名"placeholder="请输入用户名"v-model="name":state="nameState"@blur.native.capture="checkName"></mt-field><mt-fieldtype="password"label="密码"placeholder="请输入密码"v-model="pwd":state="pwdState"@blur.native.capture="checkPwd"></mt-field><hr style="width: 85%" /><mt-button class="btn" type="primary" size="large" @click="checkForm">登录</mt-button></div>
</template><style scoped>
.log .reg {font-size: 18px;
}
.log .login {font-size: 24px;font-family: "楷体";font-weight: 700;margin-left: 5px;margin-right: 210px;line-height: 80px;
}
.log {margin-top: 20%;
}
.log .btn {background-color: #d86931;width: 190px;border-radius: 0;border: 0;margin: auto;
}
.log .btn1 {background-color: white;border: 2px solid #d86931;color: #d86931;width: 190px;margin: auto;margin-top: 30px;
}
</style>><script>
export default {namespaced: true,data() {return {name: "", //双向数据绑定 用户名输入框nameState: "", //处理用户名输入框的动态更新pwd: "",pwdState: "",};},methods: {// 封装验证方法:// 1.验证用户名checkName() {//事件处理函数:处理点击按钮验证表单let reg = /^[a-zA-Z0-9\u4E00-\u9FA5]{2,6}$/; //2-6位的数字、字母、汉字if (reg.test(this.name)) {this.nameState = "success";return true;} else {this.nameState = "error";return false;}},// 2.验证密码checkPwd() {let reg = /^\d{6}$/;if (reg.test(this.pwd)) {this.pwdState = "success";return true;} else {this.pwdState = "error";return false;}},checkForm() {// 点击登录按钮后调用此方法,同时验证用户名和密码if (this.checkName() && this.checkPwd()) {// 发送登录(post)请求this.axios.post("/login", `username=${this.name}&password=${this.pwd}`).then((result) => {console.log(result);if (result.data.code == 200) {// 弹窗提示登录成功this.$toast({message: `欢迎您 ${this.name}`,position: "bottom",duration: 3000,});// 修改vuex中用户登录状态this.$store.commit("loginok", this.name);// 将islogin与username存入sessionStoragesessionStorage.setItem("islogin", true);sessionStorage.setItem("username", this.name);// 登录成功后直接跳转到首页this.$router.push("/club");} else {this.$toast({message: "登录失败,请检查您的用户名和密码",position: "bottom",duration: 3000,});}});}},},
};
</script>

4.登录页效果

四、注册登录演示

按正则要求输入用户信息。

注册成功后弹窗显示并且跳转至登录页。 进行登录:

登录成功。

五、项目文件结构

因为登陆注册业务需要使用到接口并调用数据库,所以需要两个文件夹,一个是项目文件夹,作为前端;一个是server文件夹,作为后端,且这两个文件夹都需要下载 node_modules 包并单独启动;

各模块的加载、连接池的创建以及接口写于 server 下的 app.js 文件,启动时使用命令 node app.js; 

而前端的页面就正常在你的项目文件夹中书写,启动时使用命令 npm run serve;

【项目实战】登录与注册业务的实现(前端+后端+数据库)相关推荐

  1. [Vue项目实战]登录功能实现

    登录功能实现 写在前面 登录概述 登录业务流程 登录业务的相关技术点 登录---token原理分析 登录功能实现 登录页面的布局 在components文件下创建一个vue文件 配置路由(并添加路由重 ...

  2. EasyUI项目(登录、注册及权限树形展示)

    EasyUI与web.jar,许多工具类,需要请前往主页参考自取. 一,登录与注册 login.jsp(登录界面) <%@ page contentType="text/html;ch ...

  3. jsp项目开发案例_Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信)life...

    1 开发需要环境 工欲善其事,必先利其器.在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率. 安装 swoole 拓展包 安装 redis 拓展包 安装 la ...

  4. jsp项目开发案例_Laravel中使用swoole项目实战开发案例一 (建立swoole和前端通信)

    Laravel中使用swoole项目实战开发案例二(后端主动分场景给界面推送消息) 工欲善其事,必先利其器.在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率. ...

  5. Zabbix(六):项目实战之--自动发现nginx调度器及后端web服务集群、自定义参数监控...

    项目: 1.自动发现nginx调度器及后端apache构建的web服务集群: 2.使用自定义参数监控调度器上nginx服务的相关统计数据及速率数据: 3.使用自定义参数监控后端apache服务的相关统 ...

  6. Android项目实战登录注册

    由于项目中大部分界面都有一个后退键和一个标题栏,为避免代码冗杂以及便于利用,我们可以将后推荐和标题栏单独抽取出来定义一个标题栏布局,在 res/layout 目录下新建一个 Layout resour ...

  7. 账号密码登录和注册业务逻辑

    //账户密码登录 public class LoginServiceImpl implements LoginService {@Value("${md-url}")private ...

  8. Vue项目的登录和注册界面

    登录界面,Login.vue <template><div class="login_container"><div class="logi ...

  9. 项目实战No2 登陆注册

    一 导航栏返回键统一处理 自定义NavigationController,重写push方法 /*** 拦截所有push进来的子控制器* @param viewController 每一次push进来的 ...

最新文章

  1. qq分享组件 android,移动端,分享插件
  2. VC包含目录、附加依赖项、库目录及具体设置
  3. 阅读类APP体验好不好?可从这些指标衡量
  4. eclipse热部署_Spring Boot Devtools热部署
  5. c 结构体在声明时赋值_Java基础知识 初识Java 循环结构进阶 数组 数据类型 各种运算符...
  6. linux的lnmp环境,Ubuntu 16.04 LTS下LNMP环境配置简述
  7. 子组件上下结构布局自适应父组件宽度高度
  8. java如何解析cron成可视化_宅家30天,2万字节java高级工程师面试题解析,如何斩获阿里p7...
  9. ARCore-Unity3d教程2 - 基本概念
  10. dbscan算法中 参数的意义_常用聚类算法
  11. 电源管理与驱动设计笔记
  12. UVA11777 Automate the Grades【水题】
  13. 对待新知识、新领域的心态——好奇、批判、独孤求败
  14. zkLedger: Privacy-Preserving Auditing for Distributed Ledgers
  15. linux断电并重启命令,Linux基本操作:关机 重启
  16. 广告(文案)与营销(市场、传播和创意)
  17. html实现圈内特效
  18. 关于自己在大学的一些经历
  19. 判定重大风险有哪几种_安全风险分为哪几个等级
  20. 基于Django框架实现前后端分离(三)

热门文章

  1. buctoj-寒假集训进阶训练赛(二十二)
  2. python3利用pandas读取excel的列取出最大最小值
  3. 状态和特质焦虑之间的区别?
  4. java lamda 常用写法 List篇
  5. 想爱,爱不了,想恨,恨不下,想忘,忘不了
  6. 重庆python培训多少钱-重庆软件测试培训/Python
  7. 《重构与模式(修订版)》目录—导读
  8. 软件工程毕业设计课题(83)微信小程序毕业设计PHP家政服务预约小程序系统设计与实现
  9. 为什么我的 JavaScript 代码会收到“请求的资源上不存在 ‘Access-Control-Allow-Origin‘ 标头”错误,而 Postman 却没有?
  10. 伦纳德·里德 《铅笔的故事》