一、前置环境准备
1.1 安装依赖环境
我们采用轻量零配置方案,基于Node.js+SQLite开发,可直接运行在1核2G的低配服务器上,无需额外安装复杂的数据库服务。连接CentOS服务器后,直接执行以下命令完成环境安装:
```
更新yum源
yum update -y
安装Node.js 16 LTS长期支持版本
curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -
yum install -y nodejs
验证安装,输出版本号即为成功
node -v
npm -v
```
1.2 端口配置
我们默认使用3000端口提供服务,执行以下命令开放系统防火墙端口:
```
firewall-cmd --add-port=3000/tcp --permanent
firewall-cmd --reload
```
如果是阿里云、腾讯云等云服务器,除了执行上面的命令,还需要在云服务商后台的安全组规则中开放3000端口,否则外部无法访问。
二、项目初始化与代码编写
在服务器任意目录执行以下命令初始化项目,安装所有所需依赖:
```
mkdir member-system && cd member-system
npm init -y
npm install express sqlite3 bcryptjs jsonwebtoken cors --save
```
依赖安装完成后,在项目根目录新建入口文件app.js,复制以下完整代码,务必修改JWT_SECRET的值为你自己的随机字符串,避免token被伪造:
```js
const express = require('express');
const sqlite3 = require('sqlite3').verbose();
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const cors = require('cors');
const app = express();
// 可自定义配置项
const PORT = 3000;
const JWT_SECRET = 'your_custom_random_secret_key_12345';
app.use(cors());
app.use(express.json());
// 初始化数据库和会员表
const db = new sqlite3.Database('./member.db', err => {
if (err) console.error('数据库初始化失败', err.message);
else {
db.run(`CREATE TABLE IF NOT EXISTS members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
nickname TEXT,
level INTEGER DEFAULT 1,
expire_time TEXT,
create_time TEXT DEFAULT CURRENT_TIMESTAMP
)`);
console.log('会员系统数据库初始化完成');
}
});
// 会员注册接口
app.post('/api/register', (req, res) => {
const { username, password, nickname } = req.body;
if (!username || !password) {
return res.json({ code: 400, msg: '用户名和密码不能为空' });
}
const hashPwd = bcrypt.hashSync(password, 10);
db.run('INSERT INTO members (username, password, nickname) VALUES (?, ?, ?)',
[username, hashPwd, nickname || username],
function (err) {
if (err) return res.json({ code: 400, msg: '用户名已存在' });
res.json({ code: 200, msg: '注册成功', data: { id: this.lastID } });
});
});
// 会员登录接口
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
db.get('SELECT FROM members WHERE username = ?', [username], (err, row) => {
if (!row || !bcrypt.compareSync(password, row.password)) {
return res.json({ code: 400, msg: '用户名或密码错误' });
}
// 生成7天有效期的登录token
const token = jwt.sign({ id: row.id, username: row.username }, JWT_SECRET, { expiresIn: '7d' });
res.json({
code: 200,
msg: '登录成功',
data: {
token,
userInfo: { id: row.id, nickname: row.nickname, level: row.level, expire_time: row.expire_time }
}
});
});
});
// token验证中间件
const authMiddleware = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.json({ code: 401, msg: '未登录' });
try {
req.user = jwt.verify(token, JWT_SECRET);
next();
} catch (err) {
res.json({ code: 401, msg: '登录已过期,请重新登录' });
}
};
// 获取会员信息接口
app.get('/api/user/info', authMiddleware, (req, res) => {
db.get('SELECT id, nickname, level, expire_time, create_time FROM members WHERE id = ?',
[req.user.id], (err, row) => {
res.json({ code: 200, data: row });
});
});
app.listen(PORT, () => {
console.log(`会员系统服务已启动,访问地址:http://你的服务器IP:${PORT}`);
});
```
三、启动服务并设置开机自启

为了避免关闭远程连接后服务停止,我们使用pm2进程管理器管理服务,直接执行以下命令完成配置:
```
全局安装pm2
npm install pm2 -g
启动会员系统服务
pm2 start app.js --name member-system
设置pm2开机自启
pm2 startup
pm2 save
```
执行完成后输入pm2 list,看到member-system的状态为online即为启动成功。
四、功能验证与扩展
4.1 接口功能测试
可以用Postman、Apipost等工具调用接口验证功能:
- 调用
POST http://你的服务器IP:3000/api/register,传入对应参数,返回code=200即为注册成功。
- 调用
POST http://你的服务器IP:3000/api/login,传入账号密码,返回token即为登录成功。
- 调用
GET http://你的服务器IP:3000/api/user/info,请求头添加Authorization: Bearer 登录返回的token,即可获取会员信息。
4.2 绑定域名配置(可选)
如果需要绑定域名对外提供服务,安装Nginx后添加以下反向代理配置即可:
```
server {
listen 80;
server_name 你的绑定域名;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
```
后续可以根据需求扩展功能,比如添加会员过期管理、卡密充值、后台会员管理接口、会员权益控制等,直接在现有代码基础上修改数据库结构、添加接口即可,所有核心能力已经搭建完成,无需从零开发。