一、项目预览
登入页
注册页
找回密码
登入成功页
二、开发前准备
1.安装Express!
现在宝塔面板 软件商店中安装PM2管理器
在宝塔终端上输入以下命令
npm install -g express-generator
2.创建项目 miaomiaoserver
在终端cd进入你想要创建这个项目的目录下
在分别输入以下命令来启动程序
// 创建喵喵项目
// 进入项目文件
// 安装自带的模块
// 安装mongoose模块操纵数据库
// 启动项目
express -e miaomiaoserver
cd miaomiaoserver
cnpm -i
cnpm i -s mongoose
npm start
输入localhost:3000显示以下页面证明项目创建成功
因为是在宝塔下创建的项目 所以我在自己的电脑上输入ip地址:3000测试
3.安装MongoDB数据库
4.项目连接MongoDB数据库
在miaomiaoserver项目目录下创建untils文件夹,文件夹下新建config.js
var mongoose = require('mongoose');
var Mongoose = {
url : 'mongodb://localhost:27017/miaomiao',
connect(){
mongoose.connect(this.url,{ useNewUrlParser: true, useUnifiedTopology: true } ,(err)=>{
if(err){
console.log('数据库连接失败');
console.log(err)
console.log('数据库连接失败');
return
}
console.log('数据库连接成功');
})
}
};
module.exports = {
Mongoose,
};
然后在app.js中引入
var { Mongoose } = require('./untils/config.js');
Mongoose.connect();
5.创建miaomiao数据库
在这里我用的是Robomong这个可视化窗口来连接mongdb然后创建数据库
提示:这边电脑上连接的是服务器里面的数据库所以要自己的服务器ip地址加上27017,而且必须要放行27017端口才能连接
然后在Robomong里创建miaomiao数据库即可
三、创建用户接口
1.创建对外的接口
在routes下的users.js文件中创建对外接口
var usersController = require('../controllers/users.js')
router.post('/login' , usersController.login);
router.post('/register' , usersController.register);
router.get('/verify' , usersController.verify);
router.get('/logout' , usersController.logout);
router.get('/getUser' , usersController.getUser);
router.post('/findPassword' , usersController.findPassword);
router.get('/verifyImg' , usersController.verifyImg);
2.封装对外的接口
创建controllers文件夹,然后创建users.js文件,在文件内部写好方法
var login = async (req,res,next)=>{
};
var register = async (req,res,next)=>{
};
var verify = async (req,res,next)=>{
};
var logout = async (req,res,next)=>{
};
var getUser = async (req,res,next)=>{
};
var findPassword = async (req,res,next)=>{
};
var verifyImg = async(req,res,next)=>{
};
module.exports = {
login,
register,
verify,
logout,
getUser,
findPassword,
verifyImg,
};
3.完善verify接口
Ⅰ、开启邮箱验证
登入qq邮箱进入设置,点击账户设置,然后开启POP3/SMTP和IMAP/SMTP服务服务,记住生成的授权码
Ⅱ、启用Nodemailer
安装Nodemailer
npm i -s nodemailer
在配置untils文件下的config.js中写连接邮箱
var nodemailer = require('nodemailer');
var Email = {
config : {
host: "smtp.qq.com", //指定为qq邮箱
port: 587,
auth: {
user: '********', // qq邮箱账号
pass: '********', // 生成的授权码
}
},
get transporter(){
return nodemailer.createTransport(this.config);
},
get verify(){
return Math.random().toString().substring(2,6);
},
};
module.exports = {
Email
};
Ⅲ、开启邮箱验证
var { Email } = require('../untils/config.js'); // 引入模块
var verify = async (req,res,next)=>{
var email = req.query.email;
var verify = Email.verify;
req.session.verify = verify;
req.session.email = email;
var mailOptions ={
from: '喵喵网',
to: email,
subject: "喵喵网邮箱验证码",
text: "验证码" + verify
};
Email.transporter.sendMail(mailOptions,(err)=>{
if(err){
res.send({
msg : '验证码发送失败',
status : -1
})
}else{
res.send({
msg : '验证码发送成功',
status : 0
})
}
});
};
Ⅳ、验证接口
验证接口我是在Postman中进行验证
1.选择get方法
2.选择需要验证的接口
3.输入需要接受验证码的邮箱
4.发送请求
5.当看到验证码发送成功的时候证明输入发送成功
6.收到验证码
4.完善register接口
Ⅰ、接收注册信息
为了让在verify 接口中接受到的数据能够在register接口中得到
1.安装第三方模块session中间件
npm install express-session
2.在app.js中进行配置
var session = require('express-session');
app.use(session({
secret: '$#$#$#', //用来加密的属性,复杂一点都行
name : 'sessionId',
resave: false,
saveUninitialized: false,
cookie: { // 过期时间
maxAge : 1000*60*60
}
}));
Ⅱ、完善models层-数据库存储
新建models文件创建users.js文件用来在mongdb数据库存储交互
var mongoose = require('mongoose');
mongoose.set('useCreateIndex',true);
var UserSchema = new mongoose.Schema({
username : { type : String , require : true , index : { unique : true } },
password : { type : String , require : true },
email : { type : String , require : true , index : { unique : true } },
date : { type : Date , default : Date.now() },
});
var UserModel = mongoose.model('user',UserSchema);
UserModel.createIndexes();
var save = (data)=>{
var user = new UserModel(data);
return user.save()
.then(()=>{
return true;
})
.catch(()=>{
return false;
});
};
module.exports = {
save,
}
Ⅲ、验证注册信息是否匹配
var UserModel = require('../models/users.js');
var register = async (req,res,next)=>{
var { username , password , email , verify } = req.body;
if( email !== req.session.email || verify !== req.session.verify ){
res.send({
msg : '验证码输入错误',
status : -1
});
return;
}
var result = await UserModel.save({
username,
password,
email
});
if(result){
res.send({
msg : '注册成功',
status : 0
});
}else{
res.send({
msg : '注册失败',
status : -2
});
}
};
Ⅳ、验证接口
先用verify接口发送验证码
需要注意的点:
1.选择post方法
2.选择Body数据 x-www-form-urlencoded
3.输入正确数据
4.发送请求
5.注册成功
6.在数据库可视化工具中查看到注册的信息
5.完善login接口
Ⅰ、寻找匹配用户
在models下的users.js写个方法用来查找数据库里的数据
var findLogin = (data)=>{
return UserModel.findOne(data);
}
module.exports = {
findLogin,
}
Ⅱ、验证注册信息是否匹配
var login = async (req,res,next)=>{
var { username , password ,verifyImg} = req.body;
var result = await UserModel.findLogin({
username,
password
});
if(result){
req.session.username = username;// 用于记录是否登入账户
res.send({
msg : '登入成功',
status : 0
});
}else{
res.send({
msg : '用户名或密码输入错误',
status : -1
});
}
};
Ⅲ、验证接口
输入刚注册的账户和密码,出现登入成功即表示登入成功
6.完善logout、getUser接口
Ⅰ、logout接口
var logout = async (req,res,next)=>{
req.session.username = '';
res.send({
msg : '退出成功',
status : 0
});
};
Ⅱ、getUser接口
var getUser = async (req,res,next)=>{
if(req.session.username){
res.send({
msg : '获取用户信息成功',
status : 0,
data : {
username : req.session.username,
}
});
}else{
res.send({
msg : '获取用户信息失败',
status : -1
});
}
};
Ⅲ、验证接口
1.先登入
2.获取用户信息
3.退出登入
4.再次尝试获取用户信息
7.完善findPassword接口
Ⅰ、新建updatePassword方法
在models在的users.js文件下新建一个updatePassword方法,并添加对外接口
var updatePassword = (email , password)=>{
return UserModel.update({email} , { $set : {password} })
.then(()=>{
return true;
})
.catch(()=>{
return false;
});
}
module.exports = {
updatePassword,
}
Ⅱ、findPassword接口
var findPassword = async (req,res,next)=>{
var { email , password , verify } = req.body;
if( email === req.session.email && verify === req.session.verify ){
var require = await UserModel.updatePassword(email , password);
if(require){
res.send({
msg : '修改密码成功',
status : 0
})
}else{
res.send({
msg : '修改密码失败',
status : -1
});
}
}else{
res.send({
msg : '验证码错误',
status : -1
});
}
};
Ⅲ、验证接口
1.发送验证码
2.修改密码
3.验证是否修改成功