基于Node.js的健身会员管理系统的后端开发实践

文章目录

项目背景

得知需要做一个人员管理的后端,第一个想到使用springboot(毕竟上学期刚学完),在我看了一些文章后,我得知了一个云操作系统,然后就使用这个做了后端和数据库。

项目简介

这是一个基于 Node.js + Express + MySQL 开发的健身会员管理系统后端。主要功能包括会员管理、课程管理、管理员系统等。作为一个大三学生的练手项目,它涵盖了后端开发中的许多基础知识点,非常适合想要学习后端开发的同学参考。

项目部署说明

本项目使用 Sealos 进行部署,这是一个开源的云操作系统,提供了完整的云原生应用部署和管理能力。使用 Sealos 的好处是:

  1. 简单易用

    • 不需要自己搭建服务器
    • 不需要配置复杂的网络环境
    • 提供了完整的开发环境
  2. 数据库部署

    • 使用 Sealos 提供的 MySQL 服务
    • 数据库连接地址:****-db-mysql.ns-umwit6**.svc
    • 默认端口:3306
  3. 后端部署

    • 使用 Sealos 的容器服务
    • 自动配置网络和域名
    • 支持 HTTPS 访问
  4. 开发体验

    • 提供了完整的开发环境
    • 支持代码热更新
    • 可以方便地进行调试

技术栈

  • 后端框架:Node.js + Express
  • 数据库:MySQL
  • 身份认证:JWT (JSON Web Token)
  • 跨域处理:CORS
  • 数据库连接:mysql2

项目结构详解

在开始之前,我们先来了解一下这个项目的基本结构。这种结构是 Express 框架的常见组织方式,也是很多项目的基础架构:

复制代码
backend/
├── config/           # 配置文件目录
│   ├── database.js   # 数据库配置
│   ├── init.sql      # 数据库初始化脚本
│   └── init-db.js    # 数据库初始化程序
├── controllers/      # 控制器目录
│   └── admin.js      # 管理员相关控制器
├── models/           # 数据模型目录
│   └── admin.js      # 管理员数据模型
├── routes/           # 路由目录
│   └── admin.js      # 管理员相关路由
├── middlewares/      # 中间件目录
│   └── auth.js       # 认证中间件
├── utils/            # 工具函数目录
│   └── logger.js     # 日志工具
├── app.js            # 应用入口文件
└── package.json      # 项目依赖配置

各目录功能说明

  1. config/:存放配置文件

    • database.js:数据库连接配置
    • init.sql:数据库表结构初始化脚本
    • init-db.js:执行数据库初始化的程序
  2. controllers/:控制器目录

    • 处理具体的业务逻辑
    • 接收请求参数
    • 调用模型层处理数据
    • 返回响应结果
  3. models/:数据模型目录

    • 定义数据结构和关系
    • 封装数据库操作
    • 处理数据验证
  4. routes/:路由目录

    • 定义 API 接口路径
    • 将请求映射到对应的控制器
    • 处理请求参数验证
  5. middlewares/:中间件目录

    • 处理请求预处理
    • 实现认证授权
    • 处理错误
  6. utils/:工具函数目录

    • 封装通用功能
    • 提供辅助函数
    • 处理日志记录

数据库连接详解

1. 本项目数据库连接(Sealos 环境)

本项目使用 Sealos 提供的 MySQL 服务,配置如下:

javascript 复制代码
// config/database.js
const mysql = require('mysql2/promise');

const pool = mysql.createPool({
    host: '****-db-mysql.ns-umwit6**.svc',  // Sealos 提供的数据库地址
    user: 'xxxx',                           // 数据库用户名
    password: 'xxxx',                       // 数据库密码
    database: 'fitness',                    // 数据库名
    port: 3306,                            // MySQL 默认端口
    charset: 'utf8mb4',                    // 字符集,支持中文
    waitForConnections: true,
    connectionLimit: 10
});

2. 传统数据库连接方式

如果你没有使用 Sealos,而是使用传统的数据库部署方式,可以参考以下配置:

2.1 本地开发环境
javascript 复制代码
// config/database.js
const mysql = require('mysql2/promise');

const pool = mysql.createPool({
    host: 'localhost',      // 本地数据库地址
    user: 'root',           // 数据库用户名
    password: '123456',     // 数据库密码
    database: 'fitness',    // 数据库名
    port: 3306,            // MySQL 默认端口
    charset: 'utf8mb4',    // 字符集,支持中文
    waitForConnections: true,
    connectionLimit: 10
});
2.2 生产环境配置

当项目要上线时,建议使用环境变量来管理数据库配置:

  1. 创建 .env 文件
bash 复制代码
# .env 文件
DB_HOST=your-database-host
DB_USER=your-database-user
DB_PASSWORD=your-database-password
DB_NAME=your-database-name
DB_PORT=3306
  1. 使用 dotenv 加载环境变量
javascript 复制代码
// app.js
require('dotenv').config();
  1. 修改数据库配置
javascript 复制代码
// config/database.js
const mysql = require('mysql2/promise');

const pool = mysql.createPool({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    port: process.env.DB_PORT || 3306,
    charset: 'utf8mb4',
    waitForConnections: true,
    connectionLimit: 10
});
2.3 数据库连接池说明

使用连接池的好处:

  1. 减少连接创建和销毁的开销
  2. 控制并发连接数
  3. 自动管理连接的生命周期
  4. 提供连接复用机制
2.4 常见问题解决
  1. 连接超时

    • 检查数据库服务器是否正常运行
    • 检查防火墙设置
  2. 字符集问题

    • 确保数据库和连接都使用 utf8mb4
    • 检查表结构是否支持中文

跨域问题详解

什么是跨域?

跨域(CORS,Cross-Origin Resource Sharing)是指浏览器出于安全考虑,限制网页从一个源(域名、协议、端口)向另一个源发送请求。比如:

  • 你的前端运行在 http://localhost:3000
  • 后端运行在 http://localhost:8080,这就产生了跨域问题
  • 跨域我是在学习springboot中遇到的,前后端分离项目都需要解决这个问题

解决方案

  1. 使用 CORS 中间件
javascript 复制代码
// app.js
const cors = require('cors');

// 基本配置
app.use(cors());

// 详细配置
const corsOptions = {
    origin: [
        'http://localhost:3000',    // 开发环境
        'http://***.com',    // 生产环境
        'https://***.com'    // 生产环境 HTTPS
    ],
    methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
    allowedHeaders: ['Content-Type', 'Authorization'],
    credentials: true,              // 允许发送 cookies
    maxAge: 86400                   // 预检请求缓存时间
};

app.use(cors(corsOptions));
  1. 处理预检请求(OPTIONS)
javascript 复制代码
// 在路由中处理 OPTIONS 请求
app.options('*', cors(corsOptions));
  1. 设置响应头
javascript 复制代码
// 手动设置响应头
app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
    res.header('Access-Control-Allow-Credentials', 'true');
    next();
});

跨域常见问题

  1. 预检请求失败

    • 原因:服务器没有正确处理 OPTIONS 请求
    • 解决:确保服务器正确配置了 CORS 中间件
  2. 凭证(cookies)无法发送

    • 原因:credentials: trueorigin: '*'
    • 解决:指定具体的域名,不能使用通配符
  3. 自定义请求头被拦截

    • 原因:没有在 allowedHeaders 中声明
    • 解决:添加需要的请求头到配置中
  4. 复杂请求被拦截

    • 原因:没有在 methods 中声明请求方法
    • 解决:添加需要的 HTTP 方法到配置中

开发经验分享

1. 安全性考虑

作为一个学生项目,我也考虑了一些基本的安全措施:

  • 密码加密存储
  • 使用参数化查询防止 SQL 注入
  • 实现 JWT 身份验证
  • 配置 CORS 限制跨域访问

总结

通过这个项目,我学到了:

  1. 如何设计一个完整的后端系统
  2. 数据库设计和优化
  3. 用户认证和授权
  4. 错误处理和日志记录
  5. 安全性考虑

这个项目虽然不大,但涵盖了后端开发中的许多重要概念,对于想要学习后端开发的同学来说是一个很好的起点。

希望这篇文章能帮助到想要学习后端开发的同学。如果有任何问题,欢迎在评论区讨论!


作者:xuan

个人博客:https://blog.ybyq.wang

欢迎访问我的博客,获取更多技术文章和教程。

相关推荐
小希爸爸21 分钟前
2、中医基础入门和养生
前端·后端
冰^1 小时前
MySQL VS SQL Server:优缺点全解析
数据库·数据仓库·redis·sql·mysql·json·数据库开发
盖世英雄酱581361 小时前
分布式ID所有生成方案
java·后端
小希爸爸1 小时前
1、中医基础入门和养生
前端·后端
敖云岚1 小时前
【AI】SpringAI 第五弹:接入千帆大模型
java·大数据·人工智能·spring boot·后端
桦说编程2 小时前
CompletableFuture典型错误 -- 代码出自某大厂
java·后端·响应式编程
Spring小子2 小时前
黑马点评商户查询缓存--缓存更新策略
java·数据库·redis·后端
神仙别闹2 小时前
基于VUE+Node.JS实现(Web)学生组队网站
前端·vue.js·node.js
Asthenia04123 小时前
Spring Bean 实例化和初始化全流程面试拷打
后端
是发财不是旺财3 小时前
跟着deepseek学golang--认识golang
开发语言·后端·golang