Nodejs 实现基本会员系统,请前辈赐教
当然可以!以下是一个简单的示例,展示如何使用 Node.js 和 Express 框架来实现一个基本的会员系统,包括用户登录和注销功能。我们将使用 express
、express-session
和 mysql
这些库。
安装依赖
首先,确保你已经安装了 Node.js。然后创建一个新的项目目录,并初始化一个新的 Node.js 项目:
mkdir membership-system
cd membership-system
npm init -y
接下来,安装必要的依赖:
npm install express express-session mysql body-parser
示例代码
现在我们可以开始编写代码了。创建一个 app.js
文件,并添加以下代码:
const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
const mysql = require('mysql');
// 创建数据库连接
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'your_database'
});
connection.connect((err) => {
if (err) throw err;
console.log('Connected to the MySQL server.');
});
const app = express();
// 使用中间件
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: true
}));
// 登录路由
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 查询数据库
connection.query('SELECT * FROM users WHERE username = ? AND password = ?', [username, password], (err, results) => {
if (err) throw err;
if (results.length > 0) {
req.session.user = results[0];
res.send('登录成功!');
} else {
res.send('用户名或密码错误!');
}
});
});
// 注销路由
app.get('/logout', (req, res) => {
req.session.destroy((err) => {
if (err) throw err;
res.redirect('/');
});
});
// 主页路由
app.get('/', (req, res) => {
if (req.session.user) {
res.send(`欢迎 ${req.session.user.username},你已登录!`);
} else {
res.send('欢迎访问,未登录!');
}
});
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
-
依赖安装:
express
:用于创建 Web 应用。express-session
:用于管理会话。body-parser
:用于解析请求体。mysql
:用于与 MySQL 数据库交互。
-
数据库连接:
- 使用
mysql.createConnection
创建数据库连接。
- 使用
-
中间件:
- 使用
body-parser
解析请求体。 - 使用
express-session
管理会话。
- 使用
-
登录路由:
- 接收 POST 请求,从请求体中获取用户名和密码。
- 查询数据库验证用户名和密码。
- 如果验证通过,则将用户信息存储在会话中,并返回成功消息。
-
注销路由:
- 接收 GET 请求,销毁会话,并重定向到主页。
-
主页路由:
- 根据会话中的用户信息显示不同的欢迎信息。
总结
以上代码展示了一个基本的会员系统,包括登录和注销功能。你可以根据需要进一步扩展和完善该系统,例如增加注册功能、使用加密存储密码等。希望这对你的项目有所帮助!
直接用EXPRESS 挂一个REDIS做session 用session的值判断登陆及注销。 教程没有,自己摸索比较好。
谢谢,这样对我的帮助很大了。
送你几个接口
路由
- 请求注册
new(req, res)
- 注册
create(req, res)
- 请求登录
entry(req, res)
- 登录
login(req, res)
- 退出登录
logout(req, res)
数据
- 会话验证
session(usid, callback)
// usid为会话id,来自cookie
- 查找用户名
findUser(username, callback)
// callback(state) state===true表示存在 - 查找Email
findEmail(email, callback)
// 同上 - 存储新的用户信息
saveUser(user, callback)
// user为Object类型,你的用户数据结构 - 更新新的用户信息
updateUser(user, callback)
- 删除用户
deleteUser(username, callback)
视图
- 显示注册页面
showJoin(res)
- 显示登录页面
showLogin(res)
- 跳转到主页
redirectHome(res)
- 跳转到用户主页
redirectUser(res, options)
- 错误404
error404(res)
- 服务器错误
serverError(res)
感谢以上两位前辈协助,小弟万分感谢。
当然可以。为了实现一个基本的会员系统(包括登录和注销功能),我们可以使用 express
框架来搭建后端服务,并结合 bcrypt
进行密码加密,jsonwebtoken
进行用户认证。
示例代码
首先,确保你已经安装了必要的依赖包:
npm install express mysql bcrypt jsonwebtoken cookie-parser body-parser
接下来,创建一个简单的会员系统:
1. 创建数据库表
假设你已经有了一个名为 users
的表,包含以下字段:
id
(INT, AUTO_INCREMENT, PRIMARY KEY)username
(VARCHAR)password
(VARCHAR)
你可以使用以下 SQL 语句创建该表:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
2. Node.js 后端代码
创建一个 server.js
文件,并编写以下代码:
const express = require('express');
const mysql = require('mysql');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(cookieParser());
// 数据库连接配置
const db = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'your_password',
database: 'your_database'
});
db.connect((err) => {
if (err) throw err;
console.log('Connected to database');
});
// 密码加密盐值
const SALT_WORK_FACTOR = 10;
// 注册接口
app.post('/register', async (req, res) => {
const { username, password } = req.body;
try {
const hashedPassword = await bcrypt.hash(password, SALT_WORK_FACTOR);
db.query('INSERT INTO users SET ?', { username, password: hashedPassword }, (err, result) => {
if (err) return res.status(500).send(err);
res.status(201).json({ message: 'User registered' });
});
} catch (err) {
res.status(500).send(err);
}
});
// 登录接口
app.post('/login', async (req, res) => {
const { username, password } = req.body;
db.query('SELECT * FROM users WHERE username = ?', [username], async (err, rows) => {
if (err) return res.status(500).send(err);
if (!rows.length) return res.status(401).send({ message: 'Invalid credentials' });
const validPassword = await bcrypt.compare(password, rows[0].password);
if (!validPassword) return res.status(401).send({ message: 'Invalid credentials' });
const token = jwt.sign({ id: rows[0].id, username: rows[0].username }, 'your_secret_key', { expiresIn: '1h' });
res.cookie('token', token, { httpOnly: true }).json({ message: 'Logged in successfully' });
});
});
// 登出接口
app.get('/logout', (req, res) => {
res.clearCookie('token').json({ message: 'Logged out successfully' });
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
- 数据库连接:我们使用
mysql
模块连接到 MySQL 数据库。 - 注册接口:用户提交用户名和密码后,将密码进行哈希处理并保存到数据库中。
- 登录接口:验证用户名和密码是否匹配,并生成 JWT 令牌返回给客户端。JWT 令牌通过 HTTP-only Cookie 传递。
- 登出接口:清除客户端上的 JWT 令牌。
希望这些代码和解释对你有所帮助!如果你有任何问题或需要进一步的帮助,请告诉我。