【项目实战】登录与注册业务的实现(前端+后端+数据库)
本示例基于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;
【项目实战】登录与注册业务的实现(前端+后端+数据库)相关推荐
- [Vue项目实战]登录功能实现
登录功能实现 写在前面 登录概述 登录业务流程 登录业务的相关技术点 登录---token原理分析 登录功能实现 登录页面的布局 在components文件下创建一个vue文件 配置路由(并添加路由重 ...
- EasyUI项目(登录、注册及权限树形展示)
EasyUI与web.jar,许多工具类,需要请前往主页参考自取. 一,登录与注册 login.jsp(登录界面) <%@ page contentType="text/html;ch ...
- jsp项目开发案例_Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信)life...
1 开发需要环境 工欲善其事,必先利其器.在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率. 安装 swoole 拓展包 安装 redis 拓展包 安装 la ...
- jsp项目开发案例_Laravel中使用swoole项目实战开发案例一 (建立swoole和前端通信)
Laravel中使用swoole项目实战开发案例二(后端主动分场景给界面推送消息) 工欲善其事,必先利其器.在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率. ...
- Zabbix(六):项目实战之--自动发现nginx调度器及后端web服务集群、自定义参数监控...
项目: 1.自动发现nginx调度器及后端apache构建的web服务集群: 2.使用自定义参数监控调度器上nginx服务的相关统计数据及速率数据: 3.使用自定义参数监控后端apache服务的相关统 ...
- Android项目实战登录注册
由于项目中大部分界面都有一个后退键和一个标题栏,为避免代码冗杂以及便于利用,我们可以将后推荐和标题栏单独抽取出来定义一个标题栏布局,在 res/layout 目录下新建一个 Layout resour ...
- 账号密码登录和注册业务逻辑
//账户密码登录 public class LoginServiceImpl implements LoginService {@Value("${md-url}")private ...
- Vue项目的登录和注册界面
登录界面,Login.vue <template><div class="login_container"><div class="logi ...
- 项目实战No2 登陆注册
一 导航栏返回键统一处理 自定义NavigationController,重写push方法 /*** 拦截所有push进来的子控制器* @param viewController 每一次push进来的 ...
最新文章
- qq分享组件 android,移动端,分享插件
- VC包含目录、附加依赖项、库目录及具体设置
- 阅读类APP体验好不好?可从这些指标衡量
- eclipse热部署_Spring Boot Devtools热部署
- c 结构体在声明时赋值_Java基础知识 初识Java 循环结构进阶 数组 数据类型 各种运算符...
- linux的lnmp环境,Ubuntu 16.04 LTS下LNMP环境配置简述
- 子组件上下结构布局自适应父组件宽度高度
- java如何解析cron成可视化_宅家30天,2万字节java高级工程师面试题解析,如何斩获阿里p7...
- ARCore-Unity3d教程2 - 基本概念
- dbscan算法中 参数的意义_常用聚类算法
- 电源管理与驱动设计笔记
- UVA11777 Automate the Grades【水题】
- 对待新知识、新领域的心态——好奇、批判、独孤求败
- zkLedger: Privacy-Preserving Auditing for Distributed Ledgers
- linux断电并重启命令,Linux基本操作:关机 重启
- 广告(文案)与营销(市场、传播和创意)
- html实现圈内特效
- 关于自己在大学的一些经历
- 判定重大风险有哪几种_安全风险分为哪几个等级
- 基于Django框架实现前后端分离(三)
热门文章
- buctoj-寒假集训进阶训练赛(二十二)
- python3利用pandas读取excel的列取出最大最小值
- 状态和特质焦虑之间的区别?
- java lamda 常用写法 List篇
- 想爱,爱不了,想恨,恨不下,想忘,忘不了
- 重庆python培训多少钱-重庆软件测试培训/Python
- 《重构与模式(修订版)》目录—导读
- 软件工程毕业设计课题(83)微信小程序毕业设计PHP家政服务预约小程序系统设计与实现
- 为什么我的 JavaScript 代码会收到“请求的资源上不存在 ‘Access-Control-Allow-Origin‘ 标头”错误,而 Postman 却没有?
- 伦纳德·里德 《铅笔的故事》