首先新建一个HTML:(引入jq)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<script src="./jquery.js"></script>
<style>
* {
margin: 0;
padding: 0;
}
div:nth-child(3) {
display: none;
}
input {
display: block;
height: 40px;
width: 200px;
margin: 20px auto;
}
button:not(#email) {
display: block;
height: 30px;
width: 70px;
background: lightcoral;
border: none;
margin: 0 auto;
}
#email {
display: block;
height: 30px;
width: 100px;
margin: 0 auto;
}
ul {
height: 50px;
width: 200px;
background: lightblue;
margin: 0 auto;
list-style: none;
}
li {
height: 50px;
width: 100px;
float: left;
text-align: center;
line-height: 50px;
}
li:hover {
background: lightgreen;
cursor: pointer;
}
</style>
</head>
<body>
<ul>
<li id="regChange">注册</li>
<li id="loginChange">登录</li>
</ul>
<div id="reg">
<input type="text" placeholder="邮箱" id="user" />
<input type="text" placeholder="密码" id="psd" />
<input type="text" placeholder="验证码" id="sendmail" />
<button id="email">发送验证码</button> <button id="btn">注册</button>
</div>
<div id="login">
<input type="text" placeholder="用户名" id="loguser" />
<input type="text" placeholder="密码" id="logpsd" />
<button id="logbtn">登录</button>
</div>
<script>
btn.addEventListener("click", clickHandler);
logbtn.addEventListener("click", clickHandler);
email.addEventListener("click", sendHandler);
regChange.addEventListener("click", changeHandler);
loginChange.addEventListener("click", changeHandler);
function clickHandler(e) {
if (this.textContent === "注册") {
if (!user.value || !psd.value || !sendmail.value) {
alert("不能为空");
return;
}
$.post("http://localhost:1024/main/reg", {
email: user.value,
password: psd.value,
mailnum: sendmail.value
},
function (res) {
if (res.hasUser) {
alert("注册失败");
return;
} else {
alert("注册成功~");
}
reg.style.display = "none";
login.style.display = "block";
}
);
} else if (this.textContent === "登录") {
if (!loguser.value || !logpsd.value) {
alert("不能为空");
return;
}
$.post("http://localhost:1024/main/login", {
email: loguser.value,
password: logpsd.value
},
function (res) {
if (res.isUser) {
alert("登录成功");
location.href = "./welcome.html";
} else {
alert("用户名或密码不正确");
return;
}
}
);
}
}
function sendHandler(e) {
$.post("http://localhost:1024/main/sendmail", {
email: user.value
});
}
function changeHandler(e) {
if (e.target.textContent === "注册") {
reg.style.display = "block";
login.style.display = "none";
} else {
reg.style.display = "none";
login.style.display = "block";
}
}
</script>
</body>
</html>
新建set文件夹,在文件夹中新建几个js文件:
main.js(连接mongoose数据库)
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/UserList', {
useNewUrlParser: true
});
let db = mongoose.connection;
db.on("error", function (error) {
console.log("错误:" + error);
});
db.on("open", function () {
console.log("连接成功");
});
db.on('disconnected', function () {
console.log('连接断开');
});
module.exports = mongoose;
mod.js(实例化Schema,新建数据库)
const mongoose = require('./main');
const Schema = mongoose.Schema;
let userSchema = new Schema({
email: {
type: String,
required: true
},
password: {
type: String,
required: true
}
});
let userModel = mongoose.model('allUser', userSchema);
module.exports = userModel;
send.js(邮件发送模块)
const nodemailer = require("nodemailer");
let obj = {
transporter: nodemailer.createTransport({
service: "qq",
port: 465,
secure: true,
auth: {
user: "*******@qq.com",
pass: "********"
}
}),
send: function(mail, content,callback) {
mailOptions = {
from: '"Hello World~" <******@qq.com>',
to: mail,
subject: content,
text: content,
html: "<h1>" + content + "</h1>"
};
this.transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error);
}
console.log("Message sent: %s", info.messageId);
callback();
});
}
};
module.exports = obj;
reg.js(创建注册模块)
const express = require('express');
const router = express.Router();
const Model = require('./mod');
const sendMail = require('./send');
var count = "";
router.post('/reg', (req, res) => {
var mail = req.body.email;
var psd = req.body.password;
var mailnum = req.body.mailnum;
Model.find({
'email': mail
}).then((data) => {
if (data.length >= 1 || mailnum !== count) {
res.send({
hasUser: true
});
return;
}
res.send({
hasUser: false
})
Model.insertMany({
'email': mail,
'password': psd
}).then((result) => {
console.log(result);
})
}).catch((err) => {
console.log(err);
});
});
router.post("/sendmail", (req, res) => {
count = "";
var mail = req.body.email;
for (let i = 0; i < 4; i++) {
count += Math.floor(Math.random() * 10);
}
var callback = () => {
console.log("发送成功");
};
sendMail.send(mail, count, callback);
res.send('send');
});
module.exports = router;
login.js(登录模块)
const express = require('express');
const router = express.Router();
const Model = require('./mod');
router.post('/login', (req, res) => {
var mail = req.body.email;
var psd = req.body.password;
Model.find({
'email': mail,
'password': psd
}).then((data) => {
if (data.length >= 1) {
res.send({
isUser: true
});
} else {
res.send({
isUser: false
});
}
}).catch((err) => {
console.log(err);
});
});
module.exports = router;
然后在set文件夹外面新建一个服务(server.js),将所有的模块拼接:
const express = require('express');
const app = express();
const cors = require("cors");
var bodyParser = require('body-parser');
app.use(cors());
app.all("*", function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "content-type");
res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
next();
});
app.use(bodyParser.urlencoded({
extended: false
}))
app.use(bodyParser.json())
const reg = require('../set/reg.js');
app.use('/main', reg);
const login = require('../set/login.js');
app.use('/main', login);
app.listen(1024, () => {
console.log('Server Start~');
});
最后运行server.js实现注册登录
注意:案例需要用到monogoDB,Jq,mongoose模块,express模块,nodemailer模块,cors模块,
body-parser模块
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY