Nodejs 实现基本会员系统,请前辈赐教

Nodejs 实现基本会员系统,请前辈赐教

各位前辈早安,

小弟曾有一些 node 的使用经验(socket.io 的 Game App),

不过目前遇到的专案因时限关系想直接参照一些样品来实作,

想请前辈们提供一些资料或是建议使用的套件。

(像是 drywall 此类完成度过高的不太适合我,我想自己做)

// -

Target: 希望藉由 node 做出基本的会员系统(登录,注销)

(本身已有的 MySQL 基础)

// -

麻烦各位前辈了。


7 回复

当然可以!以下是一个简单的示例,展示如何使用 Node.js 和 Express 框架来实现一个基本的会员系统,包括用户登录和注销功能。我们将使用 expressexpress-sessionmysql 这些库。

安装依赖

首先,确保你已经安装了 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');
});

解释

  1. 依赖安装

    • express:用于创建 Web 应用。
    • express-session:用于管理会话。
    • body-parser:用于解析请求体。
    • mysql:用于与 MySQL 数据库交互。
  2. 数据库连接

    • 使用 mysql.createConnection 创建数据库连接。
  3. 中间件

    • 使用 body-parser 解析请求体。
    • 使用 express-session 管理会话。
  4. 登录路由

    • 接收 POST 请求,从请求体中获取用户名和密码。
    • 查询数据库验证用户名和密码。
    • 如果验证通过,则将用户信息存储在会话中,并返回成功消息。
  5. 注销路由

    • 接收 GET 请求,销毁会话,并重定向到主页。
  6. 主页路由

    • 根据会话中的用户信息显示不同的欢迎信息。

总结

以上代码展示了一个基本的会员系统,包括登录和注销功能。你可以根据需要进一步扩展和完善该系统,例如增加注册功能、使用加密存储密码等。希望这对你的项目有所帮助!


直接用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');
});

解释

  1. 数据库连接:我们使用 mysql 模块连接到 MySQL 数据库。
  2. 注册接口:用户提交用户名和密码后,将密码进行哈希处理并保存到数据库中。
  3. 登录接口:验证用户名和密码是否匹配,并生成 JWT 令牌返回给客户端。JWT 令牌通过 HTTP-only Cookie 传递。
  4. 登出接口:清除客户端上的 JWT 令牌。

希望这些代码和解释对你有所帮助!如果你有任何问题或需要进一步的帮助,请告诉我。

回到顶部