文章目录
项目背景
得知需要做一个人员管理的后端,第一个想到使用springboot(毕竟上学期刚学完),在我看了一些文章后,我得知了一个云操作系统,然后就使用这个做了后端和数据库。
项目简介
这是一个基于 Node.js + Express + MySQL 开发的健身会员管理系统后端。主要功能包括会员管理、课程管理、管理员系统等。作为一个大三学生的练手项目,它涵盖了后端开发中的许多基础知识点,非常适合想要学习后端开发的同学参考。
项目部署说明
本项目使用 Sealos 进行部署,这是一个开源的云操作系统,提供了完整的云原生应用部署和管理能力。使用 Sealos 的好处是:
-
简单易用:
- 不需要自己搭建服务器
- 不需要配置复杂的网络环境
- 提供了完整的开发环境
-
数据库部署:
- 使用 Sealos 提供的 MySQL 服务
- 数据库连接地址:
****-db-mysql.ns-umwit6**.svc
- 默认端口:3306
-
后端部署:
- 使用 Sealos 的容器服务
- 自动配置网络和域名
- 支持 HTTPS 访问
-
开发体验:
- 提供了完整的开发环境
- 支持代码热更新
- 可以方便地进行调试
技术栈
- 后端框架: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 # 项目依赖配置
各目录功能说明
-
config/:存放配置文件
database.js
:数据库连接配置init.sql
:数据库表结构初始化脚本init-db.js
:执行数据库初始化的程序
-
controllers/:控制器目录
- 处理具体的业务逻辑
- 接收请求参数
- 调用模型层处理数据
- 返回响应结果
-
models/:数据模型目录
- 定义数据结构和关系
- 封装数据库操作
- 处理数据验证
-
routes/:路由目录
- 定义 API 接口路径
- 将请求映射到对应的控制器
- 处理请求参数验证
-
middlewares/:中间件目录
- 处理请求预处理
- 实现认证授权
- 处理错误
-
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 生产环境配置
当项目要上线时,建议使用环境变量来管理数据库配置:
- 创建 .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
- 使用 dotenv 加载环境变量
javascript
// app.js
require('dotenv').config();
- 修改数据库配置
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 数据库连接池说明
使用连接池的好处:
- 减少连接创建和销毁的开销
- 控制并发连接数
- 自动管理连接的生命周期
- 提供连接复用机制
2.4 常见问题解决
-
连接超时
- 检查数据库服务器是否正常运行
- 检查防火墙设置
-
字符集问题
- 确保数据库和连接都使用 utf8mb4
- 检查表结构是否支持中文
跨域问题详解
什么是跨域?
跨域(CORS,Cross-Origin Resource Sharing)是指浏览器出于安全考虑,限制网页从一个源(域名、协议、端口)向另一个源发送请求。比如:
- 你的前端运行在
http://localhost:3000
- 后端运行在
http://localhost:8080
,这就产生了跨域问题 - 跨域我是在学习springboot中遇到的,前后端分离项目都需要解决这个问题
解决方案
- 使用 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));
- 处理预检请求(OPTIONS)
javascript
// 在路由中处理 OPTIONS 请求
app.options('*', cors(corsOptions));
- 设置响应头
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();
});
跨域常见问题
-
预检请求失败
- 原因:服务器没有正确处理 OPTIONS 请求
- 解决:确保服务器正确配置了 CORS 中间件
-
凭证(cookies)无法发送
- 原因:
credentials: true
但origin: '*'
- 解决:指定具体的域名,不能使用通配符
- 原因:
-
自定义请求头被拦截
- 原因:没有在
allowedHeaders
中声明 - 解决:添加需要的请求头到配置中
- 原因:没有在
-
复杂请求被拦截
- 原因:没有在
methods
中声明请求方法 - 解决:添加需要的 HTTP 方法到配置中
- 原因:没有在
开发经验分享
1. 安全性考虑
作为一个学生项目,我也考虑了一些基本的安全措施:
- 密码加密存储
- 使用参数化查询防止 SQL 注入
- 实现 JWT 身份验证
- 配置 CORS 限制跨域访问
总结
通过这个项目,我学到了:
- 如何设计一个完整的后端系统
- 数据库设计和优化
- 用户认证和授权
- 错误处理和日志记录
- 安全性考虑
这个项目虽然不大,但涵盖了后端开发中的许多重要概念,对于想要学习后端开发的同学来说是一个很好的起点。
希望这篇文章能帮助到想要学习后端开发的同学。如果有任何问题,欢迎在评论区讨论!
作者:xuan
欢迎访问我的博客,获取更多技术文章和教程。