完成了文档的说明,数据库可选择mysql部署
This commit is contained in:
+818
@@ -0,0 +1,818 @@
|
||||
# IDC设备管理系统 - 安装部署指南
|
||||
|
||||
[
|
||||
[](https://nodejs.org/)
|
||||
[](https://reactjs.org/)
|
||||
[]()
|
||||
|
||||
## 📋 目录
|
||||
|
||||
- [环境要求](#环境要求)
|
||||
- [快速开始](#快速开始)
|
||||
- [详细安装步骤](#详细安装步骤)
|
||||
- [生产部署](#生产部署)
|
||||
- [数据库配置](#数据库配置)
|
||||
- [监控和维护](#监控和维护)
|
||||
- [常见问题解决](#常见问题解决)
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ 环境要求
|
||||
|
||||
### 开发环境
|
||||
- **Node.js**: ≥14.0.0
|
||||
- **npm**: ≥6.0.0 或 **yarn**: ≥1.22.0
|
||||
- **操作系统**: Windows 10/11, macOS 10.14+, Linux (Ubuntu 18.04+)
|
||||
- **内存**: 最小 4GB RAM
|
||||
- **硬盘**: 最小 2GB 可用空间
|
||||
|
||||
### 生产环境
|
||||
- **Node.js**: ≥14.0.0
|
||||
- **npm**: ≥6.0.0 或 **yarn**: ≥1.22.0
|
||||
- **Web服务器**: Nginx (推荐) 或 Apache
|
||||
- **操作系统**: Linux (Ubuntu 18.04+, CentOS 7+, RHEL 7+)
|
||||
- **内存**: 最小 8GB RAM (推荐 16GB+)
|
||||
- **硬盘**: 最小 10GB 可用空间 (SSD 推荐)
|
||||
- **SSL证书**: Let's Encrypt (推荐) 或其他CA证书
|
||||
|
||||
---
|
||||
|
||||
## ⚡ 快速开始
|
||||
|
||||
### 1. 克隆项目
|
||||
```bash
|
||||
git clone https://gitee.com/zhang1106/idc_assest.git
|
||||
cd idc_assest
|
||||
```
|
||||
|
||||
### 2. 安装后端依赖
|
||||
```bash
|
||||
cd backend
|
||||
npm install
|
||||
```
|
||||
|
||||
### 3. 安装前端依赖
|
||||
```bash
|
||||
cd ../frontend
|
||||
npm install
|
||||
```
|
||||
|
||||
### 4. 启动服务
|
||||
```bash
|
||||
# 启动后端服务(端口8000)
|
||||
cd backend && npm run dev
|
||||
|
||||
# 启动前端服务(端口3000)- 新终端
|
||||
cd frontend && npm run dev
|
||||
```
|
||||
|
||||
**访问地址**:
|
||||
- 前端应用:http://localhost:3000
|
||||
- 后端API:http://localhost:8000/api
|
||||
- 健康检查:http://localhost:8000/health
|
||||
|
||||
---
|
||||
|
||||
## 📖 详细安装步骤
|
||||
|
||||
### 后端配置
|
||||
|
||||
#### 1. 进入后端目录
|
||||
```bash
|
||||
cd backend
|
||||
```
|
||||
|
||||
#### 2. 安装依赖包
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
#### 3. 配置环境变量
|
||||
项目支持使用 `.env` 文件进行配置。请按以下步骤操作:
|
||||
|
||||
```bash
|
||||
# 复制环境变量示例文件
|
||||
cp .env.example .env
|
||||
|
||||
# 编辑 .env 文件,修改配置
|
||||
# 可以使用任意文本编辑器,如:
|
||||
# Windows: notepad .env
|
||||
# macOS: nano .env
|
||||
# 或IDE: 在编辑器中打开 .env 文件
|
||||
```
|
||||
|
||||
**重要说明**:
|
||||
- `.env` 文件包含了所有可配置的选项和详细注释
|
||||
- 每个配置项都有默认值,默认情况下可以直接使用
|
||||
- 如需修改配置,请编辑 `.env` 文件中的相应值
|
||||
- 建议开发时使用 `NODE_ENV=development`,部署时使用 `NODE_ENV=production`
|
||||
|
||||
**配置项说明**:
|
||||
|
||||
**服务器配置**:
|
||||
- `PORT`:服务器端口(默认8000)
|
||||
- `NODE_ENV`:运行环境
|
||||
- `development`:开发模式,详细日志便于调试
|
||||
- `production`:生产模式,性能优化,减少日志输出
|
||||
|
||||
**数据库配置**:
|
||||
- `DB_TYPE`:数据库类型(默认 sqlite,可选 mysql)
|
||||
- `sqlite`:零配置嵌入式数据库,适合开发和小规模应用
|
||||
- `mysql`:关系型数据库,适合生产环境和大规模应用
|
||||
- `DB_PATH`:SQLite数据库文件路径(默认 ./idc_management.db)
|
||||
- `MYSQL_HOST`:MySQL服务器地址(默认 localhost)
|
||||
- `MYSQL_PORT`:MySQL端口(默认 3306)
|
||||
- `MYSQL_USERNAME`:MySQL用户名(默认 root)
|
||||
- `MYSQL_PASSWORD`:MySQL密码
|
||||
- `MYSQL_DATABASE`:MySQL数据库名(默认 idc_management)
|
||||
|
||||
#### 4. 数据库配置
|
||||
|
||||
**默认配置(推荐)**:使用SQLite数据库,无需额外配置
|
||||
|
||||
**MySQL配置**:如需使用MySQL数据库,请按以下步骤操作:
|
||||
|
||||
1. 确保MySQL服务已安装并运行
|
||||
2. 创建数据库:
|
||||
```sql
|
||||
CREATE DATABASE idc_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
```
|
||||
3. 在 `.env` 文件中修改配置:
|
||||
```env
|
||||
DB_TYPE=mysql
|
||||
MYSQL_HOST=localhost
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_USERNAME=root
|
||||
MYSQL_PASSWORD=your_password
|
||||
MYSQL_DATABASE=idc_management
|
||||
```
|
||||
|
||||
#### 5. 启动后端服务
|
||||
```bash
|
||||
# 开发模式(自动重启)
|
||||
npm run dev
|
||||
|
||||
# 生产模式
|
||||
npm start
|
||||
```
|
||||
|
||||
**后端服务将在 http://localhost:8000 启动**(或配置的端口号)
|
||||
|
||||
### 前端配置
|
||||
|
||||
#### 1. 进入前端目录
|
||||
```bash
|
||||
cd frontend
|
||||
```
|
||||
|
||||
#### 2. 安装依赖包
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
#### 3. 配置API地址
|
||||
项目使用Vite代理配置,API地址在 `frontend/vite.config.js` 中配置:
|
||||
```javascript
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'http://localhost:8000',
|
||||
changeOrigin: true
|
||||
}
|
||||
}
|
||||
```
|
||||
如需修改后端地址,更新 `vite.config.js` 中的 `target` 字段。
|
||||
|
||||
#### 4. 启动前端开发服务器
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
**前端应用将在 http://localhost:3000 启动**
|
||||
|
||||
---
|
||||
|
||||
## 🚀 生产部署
|
||||
|
||||
> **⚠️ 部署前必读**:生产部署涉及服务器安全,请确保在安全环境下操作,并及时更新安全配置。
|
||||
|
||||
#### 部署准备
|
||||
|
||||
1. **环境检查**
|
||||
```bash
|
||||
# 检查系统环境
|
||||
node --version # 确保 Node.js ≥ 14.0
|
||||
npm --version # 确保 npm 可用
|
||||
|
||||
# 检查服务器端口占用
|
||||
netstat -tulpn | grep :8000
|
||||
netstat -tulpn | grep :80
|
||||
```
|
||||
|
||||
2. **创建部署目录**
|
||||
```bash
|
||||
# 创建应用目录
|
||||
mkdir -p /var/www/idc_assest
|
||||
mkdir -p /var/log/idc_assest
|
||||
mkdir -p /etc/nginx/sites-available
|
||||
mkdir -p /etc/nginx/sites-enabled
|
||||
```
|
||||
|
||||
#### 后端部署
|
||||
|
||||
1. **设置生产环境配置**
|
||||
```bash
|
||||
# 进入后端目录
|
||||
cd backend
|
||||
|
||||
# 复制并编辑环境配置文件
|
||||
cp .env.example .env
|
||||
|
||||
# 编辑生产环境配置(重要!)
|
||||
# 设置生产模式
|
||||
NODE_ENV=production
|
||||
|
||||
# 设置安全端口(可选)
|
||||
PORT=8000
|
||||
|
||||
# 数据库配置(推荐使用MySQL)
|
||||
DB_TYPE=mysql
|
||||
MYSQL_HOST=localhost
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_USERNAME=idc_user # 创建专用数据库用户
|
||||
MYSQL_PASSWORD=secure_password # 使用强密码
|
||||
MYSQL_DATABASE=idc_management
|
||||
```
|
||||
|
||||
2. **安装生产依赖**
|
||||
```bash
|
||||
# 安装生产依赖(只安装生产环境需要的包)
|
||||
npm install --only=production
|
||||
|
||||
# 验证关键依赖是否安装成功
|
||||
ls node_modules | grep -E "(express|sequelize|mysql2)"
|
||||
```
|
||||
|
||||
3. **配置数据库**
|
||||
```sql
|
||||
-- 连接MySQL(使用root用户)
|
||||
mysql -u root -p
|
||||
|
||||
-- 创建专用数据库
|
||||
CREATE DATABASE idc_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 创建专用用户(安全最佳实践)
|
||||
CREATE USER 'idc_user'@'localhost' IDENTIFIED BY 'secure_password';
|
||||
GRANT ALL PRIVILEGES ON idc_management.* TO 'idc_user'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
EXIT;
|
||||
```
|
||||
|
||||
4. **安装并配置PM2(进程管理器)**
|
||||
```bash
|
||||
# 全局安装PM2
|
||||
npm install -g pm2
|
||||
|
||||
# 启动应用
|
||||
pm2 start server.js --name "idc-backend" --env production
|
||||
|
||||
# 设置开机自启
|
||||
pm2 startup
|
||||
pm2 save
|
||||
|
||||
# 查看运行状态
|
||||
pm2 status
|
||||
pm2 logs idc-backend
|
||||
```
|
||||
|
||||
5. **配置防火墙**
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
sudo ufw allow 22 # SSH
|
||||
sudo ufw allow 80 # HTTP
|
||||
sudo ufw allow 443 # HTTPS
|
||||
sudo ufw enable
|
||||
|
||||
# CentOS/RHEL
|
||||
sudo firewall-cmd --permanent --add-service=ssh
|
||||
sudo firewall-cmd --permanent --add-service=http
|
||||
sudo firewall-cmd --permanent --add-service=https
|
||||
sudo firewall-cmd --reload
|
||||
```
|
||||
|
||||
#### 前端部署
|
||||
|
||||
1. **构建生产版本**
|
||||
```bash
|
||||
cd frontend
|
||||
|
||||
# 安装依赖
|
||||
npm install
|
||||
|
||||
# 构建生产版本(会生成优化的静态文件)
|
||||
npm run build
|
||||
|
||||
# 验证构建结果
|
||||
ls -la dist/
|
||||
```
|
||||
|
||||
2. **部署到Web服务器**
|
||||
```bash
|
||||
# 将构建文件复制到Web目录
|
||||
sudo cp -r dist/* /var/www/idc-frontend/
|
||||
|
||||
# 设置正确的文件权限
|
||||
sudo chown -R www-data:www-data /var/www/idc-frontend
|
||||
sudo chmod -R 755 /var/www/idc-frontend
|
||||
```
|
||||
|
||||
#### Nginx配置
|
||||
|
||||
1. **创建站点配置文件**
|
||||
```bash
|
||||
sudo nano /etc/nginx/sites-available/idc_assest
|
||||
```
|
||||
|
||||
2. **编辑Nginx配置**
|
||||
```nginx
|
||||
# 主配置
|
||||
server {
|
||||
listen 80;
|
||||
server_name your-domain.com www.your-domain.com;
|
||||
|
||||
# 安全头部
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header Referrer-Policy "no-referrer-when-downgrade" always;
|
||||
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
|
||||
|
||||
# 前端静态文件
|
||||
root /var/www/idc-frontend;
|
||||
index index.html;
|
||||
|
||||
# 静态资源缓存
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# 前端路由(SPA支持)
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# API代理
|
||||
location /api {
|
||||
proxy_pass http://127.0.0.1:8000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
|
||||
# 超时设置
|
||||
proxy_connect_timeout 60s;
|
||||
proxy_send_timeout 60s;
|
||||
proxy_read_timeout 60s;
|
||||
}
|
||||
|
||||
# 日志配置
|
||||
access_log /var/log/nginx/idc_assest-access.log;
|
||||
error_log /var/log/nginx/idc_assest-error.log;
|
||||
}
|
||||
|
||||
# HTTPS配置(推荐)
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name your-domain.com www.your-domain.com;
|
||||
|
||||
# SSL证书配置(使用Let's Encrypt)
|
||||
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
|
||||
|
||||
# SSL安全配置
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
|
||||
ssl_prefer_server_ciphers off;
|
||||
ssl_session_cache shared:SSL:10m;
|
||||
|
||||
# HSTS
|
||||
add_header Strict-Transport-Security "max-age=63072000" always;
|
||||
|
||||
# 其他配置同HTTP
|
||||
root /var/www/idc-frontend;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api {
|
||||
proxy_pass http://127.0.0.1:8000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
}
|
||||
}
|
||||
|
||||
# HTTP重定向到HTTPS
|
||||
server {
|
||||
listen 80;
|
||||
server_name your-domain.com www.your-domain.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
```
|
||||
|
||||
3. **启用站点并重启Nginx**
|
||||
```bash
|
||||
# 启用站点
|
||||
sudo ln -s /etc/nginx/sites-available/idc_assest /etc/nginx/sites-enabled/
|
||||
|
||||
# 测试配置
|
||||
sudo nginx -t
|
||||
|
||||
# 重启Nginx
|
||||
sudo systemctl restart nginx
|
||||
sudo systemctl enable nginx
|
||||
```
|
||||
|
||||
#### SSL证书配置(推荐)
|
||||
|
||||
1. **安装Certbot**
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
sudo apt update
|
||||
sudo apt install certbot python3-certbot-nginx
|
||||
|
||||
# CentOS/RHEL
|
||||
sudo yum install certbot python3-certbot-nginx
|
||||
```
|
||||
|
||||
2. **获取SSL证书**
|
||||
```bash
|
||||
# 自动配置SSL证书
|
||||
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
|
||||
|
||||
# 设置自动续期
|
||||
sudo crontab -e
|
||||
# 添加以下行:
|
||||
0 12 * * * /usr/bin/certbot renew --quiet
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ 数据库配置
|
||||
|
||||
### 数据库选择建议
|
||||
|
||||
| 数据库类型 | 适用场景 | 优势 | 劣势 |
|
||||
|------------|----------|------|------|
|
||||
| **SQLite** | 开发环境、小规模应用、个人使用 | 零配置、无需安装、数据文件便携 | 并发能力有限、大数据量性能差 |
|
||||
| **MySQL** | 生产环境、企业级应用、大规模数据 | 高性能、并发处理能力强、数据完整性好 | 需要额外配置和维护 |
|
||||
|
||||
### SQLite配置(推荐开发使用)
|
||||
|
||||
1. **默认配置**
|
||||
```env
|
||||
# .env 文件中保持默认配置
|
||||
DB_TYPE=sqlite
|
||||
DB_PATH=./idc_management.db
|
||||
NODE_ENV=development
|
||||
```
|
||||
|
||||
2. **文件位置管理**
|
||||
```bash
|
||||
# 备份SQLite数据库
|
||||
mkdir -p backup
|
||||
cp backend/idc_management.db backup/database_$(date +%Y%m%d_%H%M%S).db
|
||||
|
||||
# 查看数据库信息
|
||||
sqlite3 backend/idc_management.db ".schema"
|
||||
sqlite3 backend/idc_management.db ".tables"
|
||||
```
|
||||
|
||||
### MySQL配置(推荐生产使用)
|
||||
|
||||
1. **创建生产数据库**
|
||||
```sql
|
||||
-- 创建专用数据库
|
||||
CREATE DATABASE idc_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 创建专用用户
|
||||
CREATE USER 'idc_prod_user'@'localhost' IDENTIFIED BY 'secure_password_123!';
|
||||
GRANT ALL PRIVILEGES ON idc_management.* TO 'idc_prod_user'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
|
||||
2. **配置生产环境变量**
|
||||
```env
|
||||
# .env 文件
|
||||
NODE_ENV=production
|
||||
DB_TYPE=mysql
|
||||
MYSQL_HOST=localhost
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_USERNAME=idc_prod_user
|
||||
MYSQL_PASSWORD=secure_password_123!
|
||||
MYSQL_DATABASE=idc_management
|
||||
```
|
||||
|
||||
### 数据备份与恢复
|
||||
|
||||
#### 1. 自动备份脚本
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# backup_database.sh - 自动数据库备份脚本
|
||||
|
||||
# 设置备份目录
|
||||
BACKUP_DIR="/var/backups/idc_assest"
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_FILE="$BACKUP_DIR/database_$DATE"
|
||||
|
||||
# 创建备份目录
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# SQLite备份
|
||||
if [ -f "backend/idc_management.db" ]; then
|
||||
cp backend/idc_management.db "$BACKUP_FILE.db"
|
||||
echo "SQLite备份完成: $BACKUP_FILE.db"
|
||||
fi
|
||||
|
||||
# MySQL备份
|
||||
mysqldump -u idc_prod_user -pYourPassword123! idc_management > "$BACKUP_FILE.sql"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "MySQL备份完成: $BACKUP_FILE.sql"
|
||||
fi
|
||||
|
||||
# 压缩备份文件
|
||||
gzip "$BACKUP_FILE.db"
|
||||
gzip "$BACKUP_FILE.sql"
|
||||
|
||||
# 清理30天前的备份
|
||||
find $BACKUP_DIR -name "database_*.gz" -mtime +30 -delete
|
||||
|
||||
echo "备份任务完成"
|
||||
```
|
||||
|
||||
#### 2. 定时任务配置
|
||||
```bash
|
||||
# 添加到crontab
|
||||
crontab -e
|
||||
|
||||
# 每天凌晨2点执行备份
|
||||
0 2 * * * /path/to/backup_database.sh
|
||||
|
||||
# 每周日凌晨3点执行完整备份
|
||||
0 3 * * 0 /path/to/full_backup.sh
|
||||
```
|
||||
|
||||
#### 3. 数据恢复
|
||||
|
||||
**SQLite恢复**:
|
||||
```bash
|
||||
# 停止应用
|
||||
pm2 stop idc-backend
|
||||
|
||||
# 恢复数据库
|
||||
cp backup/database_20240101.db backend/idc_management.db
|
||||
|
||||
# 重启应用
|
||||
pm2 start idc-backend
|
||||
```
|
||||
|
||||
**MySQL恢复**:
|
||||
```bash
|
||||
# 停止应用
|
||||
pm2 stop idc-backend
|
||||
|
||||
# 恢复数据库
|
||||
gunzip backup/database_20240101.sql.gz
|
||||
mysql -u idc_prod_user -p idc_management < backup/database_20240101.sql
|
||||
|
||||
# 重启应用
|
||||
pm2 start idc-backend
|
||||
```
|
||||
|
||||
### 监控和维护
|
||||
|
||||
#### 1. 数据库健康检查
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# health_check.sh - 数据库健康检查
|
||||
|
||||
# 检查SQLite
|
||||
if [ -f "backend/idc_management.db" ]; then
|
||||
echo "SQLite数据库文件存在"
|
||||
sqlite3 backend/idc_management.db "PRAGMA integrity_check;"
|
||||
else
|
||||
echo "SQLite数据库文件不存在"
|
||||
fi
|
||||
|
||||
# 检查MySQL
|
||||
mysql -u idc_prod_user -pYourPassword123! -e "SELECT 1;" idc_management > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "MySQL连接正常"
|
||||
else
|
||||
echo "MySQL连接失败"
|
||||
fi
|
||||
```
|
||||
|
||||
#### 2. 性能监控
|
||||
```sql
|
||||
-- MySQL性能监控查询
|
||||
SHOW PROCESSLIST;
|
||||
SHOW ENGINE INNODB STATUS;
|
||||
SELECT * FROM information_schema.innodb_trx;
|
||||
SELECT * FROM information_schema.innodb_locks;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 常见问题解决
|
||||
|
||||
### 1. 端口冲突
|
||||
```bash
|
||||
# 检查端口占用
|
||||
netstat -tulpn | grep :8000
|
||||
netstat -tulpn | grep :3000
|
||||
|
||||
# 修改端口
|
||||
PORT=8001 npm run dev # 后端
|
||||
npm run dev -- --port 3001 # 前端
|
||||
```
|
||||
|
||||
### 2. 权限问题
|
||||
```bash
|
||||
# Linux/macOS权限修复
|
||||
chmod +x backend/server.js
|
||||
chown -R $USER:$USER backend/
|
||||
```
|
||||
|
||||
### 3. 依赖安装失败
|
||||
```bash
|
||||
# 清理缓存重新安装
|
||||
npm cache clean --force
|
||||
rm -rf node_modules package-lock.json
|
||||
npm install
|
||||
```
|
||||
|
||||
### 4. 数据库连接失败
|
||||
|
||||
**SQLite连接问题**:
|
||||
- 检查数据库文件权限
|
||||
- 确保有写入权限
|
||||
- 验证磁盘空间充足
|
||||
|
||||
**MySQL连接问题**:
|
||||
- 检查MySQL服务是否运行:`systemctl status mysql` 或 `netstat -tulpn | grep :3306`
|
||||
- 验证MySQL连接参数是否正确
|
||||
- 确保数据库已创建:`CREATE DATABASE idc_management;`
|
||||
- 检查MySQL用户权限
|
||||
- 查看MySQL错误日志
|
||||
|
||||
---
|
||||
|
||||
## 📊 监控和维护
|
||||
|
||||
### 服务监控
|
||||
```bash
|
||||
# 检查服务状态
|
||||
curl http://localhost:8000/health
|
||||
|
||||
# 查看日志
|
||||
pm2 logs idc-backend
|
||||
```
|
||||
|
||||
### 数据迁移
|
||||
```bash
|
||||
# 导出数据
|
||||
node scripts/export-data.js
|
||||
|
||||
# 导入数据
|
||||
node scripts/import-data.js backup/data.json
|
||||
```
|
||||
|
||||
### 性能优化
|
||||
|
||||
#### 1. PM2性能配置
|
||||
```javascript
|
||||
// ecosystem.config.js
|
||||
module.exports = {
|
||||
apps: [{
|
||||
name: 'idc-backend',
|
||||
script: 'server.js',
|
||||
instances: 'max', // 使用所有CPU核心
|
||||
exec_mode: 'cluster',
|
||||
env: {
|
||||
NODE_ENV: 'production',
|
||||
PORT: 8000
|
||||
},
|
||||
max_memory_restart: '1G', // 内存超过1G自动重启
|
||||
node_args: '--max-old-space-size=1024'
|
||||
}]
|
||||
};
|
||||
```
|
||||
|
||||
#### 2. 数据库优化
|
||||
```sql
|
||||
-- MySQL性能优化
|
||||
SET GLOBAL innodb_buffer_pool_size = 1073741824; -- 1GB
|
||||
SET GLOBAL query_cache_size = 67108864; -- 64MB
|
||||
|
||||
-- 创建索引优化查询
|
||||
CREATE INDEX idx_device_rack ON devices(rackId);
|
||||
CREATE INDEX idx_device_type ON devices(deviceType);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 安全配置
|
||||
|
||||
### 1. 防火墙配置
|
||||
```bash
|
||||
# Ubuntu/Debian UFW
|
||||
sudo ufw default deny incoming
|
||||
sudo ufw default allow outgoing
|
||||
sudo ufw allow ssh
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 443/tcp
|
||||
sudo ufw enable
|
||||
|
||||
# CentOS/RHEL firewalld
|
||||
sudo firewall-cmd --set-default-zone=public
|
||||
sudo firewall-cmd --permanent --add-service=ssh
|
||||
sudo firewall-cmd --permanent --add-service=http
|
||||
sudo firewall-cmd --permanent --add-service=https
|
||||
sudo firewall-cmd --reload
|
||||
```
|
||||
|
||||
### 2. 系统安全加固
|
||||
```bash
|
||||
# 更新系统
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
|
||||
# 配置fail2ban防止暴力破解
|
||||
sudo apt install fail2ban
|
||||
sudo systemctl enable fail2ban
|
||||
sudo systemctl start fail2ban
|
||||
|
||||
# 配置SSH密钥登录
|
||||
ssh-keygen -t rsa -b 4096
|
||||
ssh-copy-id user@server-ip
|
||||
```
|
||||
|
||||
### 3. 应用程序安全
|
||||
```env
|
||||
# .env 生产环境安全配置
|
||||
NODE_ENV=production
|
||||
PORT=8000
|
||||
|
||||
# 设置强密码
|
||||
DATABASE_PASSWORD=ComplexPassword123!@#
|
||||
|
||||
# 启用HTTPS(使用反向代理)
|
||||
FORCE_HTTPS=true
|
||||
|
||||
# 设置会话密钥
|
||||
SESSION_SECRET=random_session_secret_key_here
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如果在安装部署过程中遇到问题,请:
|
||||
|
||||
1. **查看日志文件**
|
||||
- 后端日志:`pm2 logs idc-backend`
|
||||
- Nginx日志:`tail -f /var/log/nginx/idc_assest-error.log`
|
||||
|
||||
2. **检查服务状态**
|
||||
```bash
|
||||
pm2 status
|
||||
sudo systemctl status nginx
|
||||
```
|
||||
|
||||
3. **验证配置文件**
|
||||
```bash
|
||||
# 测试Nginx配置
|
||||
sudo nginx -t
|
||||
|
||||
# 测试数据库连接
|
||||
mysql -u idc_prod_user -p -e "SELECT 1;" idc_management
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**🎉 部署完成后,您就可以开始使用IDC设备管理系统了!**
|
||||
|
||||
---
|
||||
|
||||
**⭐ 如果这个部署指南对您有帮助,请给我们一个Star!**
|
||||
@@ -1,180 +1,598 @@
|
||||
# IDC设备管理系统
|
||||
|
||||
一个基于React+Node.js+MySQL的IDC设备管理系统,用于管理IDC机房中的设备、机柜和机房信息。
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
[](https://nodejs.org/)
|
||||
[](https://reactjs.org/)
|
||||
[]()
|
||||
|
||||
## 功能特点
|
||||
一个现代化的数据中心(IDC)设备管理系统,提供机房、机柜、设备的全生命周期管理,具备3D可视化展示功能。
|
||||
|
||||
### 后端功能
|
||||
- 机房管理(增删改查)
|
||||
- 机柜管理(增删改查)
|
||||
- 设备管理(增删改查)
|
||||
- 功率统计与管理
|
||||
- 设备状态监控
|
||||
## 📋 目录
|
||||
|
||||
### 前端功能
|
||||
- 仪表盘:设备、机柜、机房统计信息
|
||||
- 设备管理:设备列表、搜索、筛选、添加、编辑、删除
|
||||
- 机柜管理:机柜列表、搜索、筛选、添加、编辑、删除
|
||||
- 机房管理:机房列表、搜索、筛选、添加、编辑、删除
|
||||
- [系统概述](#系统概述)
|
||||
- [项目架构](#项目架构)
|
||||
- [技术栈说明](#技术栈说明)
|
||||
- [API接口文档](#api接口文档)
|
||||
- [安装部署指南](#安装部署指南)
|
||||
- [功能特性](#功能特性)
|
||||
- [开发团队](#开发团队)
|
||||
- [许可证](#许可证)
|
||||
|
||||
## 技术栈
|
||||
---
|
||||
|
||||
### 前端
|
||||
- React 18
|
||||
- Ant Design 5
|
||||
- Vite 4
|
||||
- React Router 6
|
||||
- Axios
|
||||
## 🎯 系统概述
|
||||
|
||||
### 后端
|
||||
- Node.js
|
||||
- Express.js
|
||||
- Sequelize
|
||||
- MySQL
|
||||
### 核心功能
|
||||
|
||||
## 项目结构
|
||||
IDC设备管理系统是一个专为数据中心设计的综合性管理平台,提供以下核心功能:
|
||||
|
||||
- **🏢 机房管理**:管理多个机房的详细信息、容量和使用状态
|
||||
- **🗄️ 机柜管理**:机柜的增删改查,支持按机房分类管理
|
||||
- **💻 设备管理**:服务器、网络设备、存储设备的全生命周期管理
|
||||
- **📊 数据看板**:实时监控数据中心整体运行状态
|
||||
- **🎮 3D可视化**:三维机柜可视化展示,支持设备悬停详情查看
|
||||
- **🔧 设备字段管理**:可配置的设备属性字段管理系统
|
||||
|
||||
### 主要特点
|
||||
|
||||
- **现代化UI**:基于Ant Design的专业企业级界面
|
||||
- **响应式设计**:支持桌面和移动端访问
|
||||
- **实时交互**:悬停显示设备详细信息
|
||||
- **数据可视化**:直观的图表和统计信息
|
||||
- **级联选择**:机房→机柜的智能选择机制
|
||||
- **3D渲染**:Three.js实现的三维可视化效果
|
||||
|
||||
### 应用场景
|
||||
|
||||
- 数据中心运营管理
|
||||
- IT资产盘点与跟踪
|
||||
- 机房容量规划
|
||||
- 设备维护管理
|
||||
- 故障快速定位
|
||||
- 合规性审计
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ 项目架构
|
||||
|
||||
### 整体架构图
|
||||
|
||||
```
|
||||
idc-device-management/
|
||||
├── backend/ # 后端代码
|
||||
│ ├── models/ # 数据库模型
|
||||
│ │ ├── Room.js # 机房模型
|
||||
│ │ ├── Rack.js # 机柜模型
|
||||
│ │ └── Device.js # 设备模型
|
||||
│ ├── routes/ # API路由
|
||||
│ │ ├── rooms.js # 机房路由
|
||||
│ │ ├── racks.js # 机柜路由
|
||||
│ │ └── devices.js # 设备路由
|
||||
│ ├── server.js # 服务器主文件
|
||||
│ └── package.json # 后端依赖
|
||||
├── frontend/ # 前端代码
|
||||
│ ├── src/ # 前端源码
|
||||
│ │ ├── pages/ # 页面组件
|
||||
│ │ │ ├── Dashboard.jsx # 仪表盘
|
||||
│ │ │ ├── DeviceManagement.jsx # 设备管理
|
||||
│ │ │ ├── RackManagement.jsx # 机柜管理
|
||||
│ │ │ └── RoomManagement.jsx # 机房管理
|
||||
│ │ ├── App.jsx # 应用主组件
|
||||
│ │ ├── main.jsx # 应用入口
|
||||
│ │ └── index.css # 全局样式
|
||||
│ ├── index.html # HTML模板
|
||||
│ ├── vite.config.js # Vite配置
|
||||
│ └── package.json # 前端依赖
|
||||
└── package.json # 项目依赖
|
||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ 前端应用 │ │ 后端API │ │ 数据库层 │
|
||||
│ │ │ │ │ │
|
||||
│ React + Vite │◄──►│ Express + │◄──►│ SQLite/MySQL + │
|
||||
│ Ant Design │ │ Sequelize │ │ Sequelize ORM │
|
||||
│ Three.js │ │ RESTful API │ │ │
|
||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
## 安装与运行
|
||||
### 系统模块划分
|
||||
|
||||
### 1. 安装依赖
|
||||
#### 前端模块 (`frontend/src/pages/`)
|
||||
- **Dashboard.jsx** - 数据看板和统计图表
|
||||
- **RoomManagement.jsx** - 机房管理界面
|
||||
- **RackManagement.jsx** - 机柜管理界面
|
||||
- **DeviceManagement.jsx** - 设备管理界面
|
||||
- **DeviceFieldManagement.jsx** - 设备字段管理
|
||||
- **RackVisualization.jsx** - 3D机柜可视化界面
|
||||
|
||||
#### 后端模块 (`backend/`)
|
||||
- **models/** - 数据模型定义
|
||||
- `Room.js` - 机房模型
|
||||
- `Rack.js` - 机柜模型
|
||||
- `Device.js` - 设备模型
|
||||
- `DeviceField.js` - 设备字段模型
|
||||
- **routes/** - API路由处理
|
||||
- `rooms.js` - 机房相关API
|
||||
- `racks.js` - 机柜相关API
|
||||
- `devices.js` - 设备相关API
|
||||
- `deviceFields.js` - 设备字段API
|
||||
|
||||
### 数据流图
|
||||
|
||||
```
|
||||
用户操作 ──► 前端组件 ──► HTTP请求 ──► Express路由 ──► Sequelize ORM ──► SQLite数据库
|
||||
▲ │
|
||||
│ ▼
|
||||
└─────────────────── 响应数据流向 ←────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 组件关系图
|
||||
|
||||
```
|
||||
App.jsx (根组件)
|
||||
├── Layout (布局组件)
|
||||
│ ├── Sider (侧边导航)
|
||||
│ └── Content (主内容区)
|
||||
└── Routes (路由组件)
|
||||
├── Dashboard
|
||||
├── RoomManagement
|
||||
├── RackManagement
|
||||
├── DeviceManagement
|
||||
├── DeviceFieldManagement
|
||||
└── RackVisualization
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ 技术栈说明
|
||||
|
||||
### 前端技术栈
|
||||
|
||||
| 技术 | 版本 | 用途 | 选择原因 |
|
||||
|------|------|------|----------|
|
||||
| **React** | 18.2.0 | 前端框架 | 现代化、组件化、生态丰富 |
|
||||
| **Vite** | 4.4.9 | 构建工具 | 快速开发服务器、HMR支持 |
|
||||
| **Ant Design** | 5.8.6 | UI组件库 | 企业级组件、主题定制 |
|
||||
| **Axios** | 1.5.0 | HTTP客户端 | Promise-based、拦截器支持 |
|
||||
| **React Router** | 6.15.0 | 路由管理 | 声明式路由、代码分割 |
|
||||
| **Three.js** | 0.160.0 | 3D渲染 | 强大的3D图形库 |
|
||||
| **@ant-design/icons** | 6.1.0 | 图标库 | 统一的视觉语言 |
|
||||
|
||||
### 后端技术栈
|
||||
|
||||
| 技术 | 版本 | 用途 | 选择原因 |
|
||||
|------|------|------|----------|
|
||||
| **Node.js** | ≥14.0.0 | 运行时环境 | JavaScript全栈、高性能 |
|
||||
| **Express** | 4.18.2 | Web框架 | 简洁灵活、中间件丰富 |
|
||||
| **Sequelize** | 6.32.1 | ORM框架 | 数据库抽象、多数据库支持 |
|
||||
| **SQLite/MySQL** | 5.1.6/8.0+ | 数据库 | SQLite零配置、MySQL高性能 |
|
||||
| **CORS** | 2.8.5 | 跨域处理 | 前后端分离架构必需 |
|
||||
| **CSV-Parser** | 3.2.0 | CSV处理 | 数据导入导出功能 |
|
||||
| **Nodemon** | 3.0.1 | 开发工具 | 自动重启、开发效率 |
|
||||
|
||||
### 开发工具
|
||||
|
||||
- **Git** - 版本控制
|
||||
- **ESLint/Prettier** - 代码规范
|
||||
- **Postman** - API测试
|
||||
- **VSCode** - 开发IDE
|
||||
|
||||
---
|
||||
|
||||
## 📡 API接口文档
|
||||
|
||||
### 基础信息
|
||||
|
||||
- **Base URL**: `http://localhost:8000/api`
|
||||
- **Content-Type**: `application/json`
|
||||
- **响应格式**: JSON
|
||||
|
||||
### 通用响应格式
|
||||
|
||||
#### 成功响应
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {...},
|
||||
"message": "操作成功"
|
||||
}
|
||||
```
|
||||
|
||||
#### 错误响应
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"error": "错误信息",
|
||||
"message": "详细描述"
|
||||
}
|
||||
```
|
||||
|
||||
### 机房管理API
|
||||
|
||||
#### 1. 获取所有机房
|
||||
```http
|
||||
GET /api/rooms
|
||||
```
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
[
|
||||
{
|
||||
"roomId": "room001",
|
||||
"name": "A区机房",
|
||||
"location": "一楼东侧",
|
||||
"area": 500,
|
||||
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||
"updatedAt": "2024-01-01T00:00:00.000Z"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
#### 2. 创建机房
|
||||
```http
|
||||
POST /api/rooms
|
||||
```
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"roomId": "room002",
|
||||
"name": "B区机房",
|
||||
"location": "二楼西侧",
|
||||
"area": 600
|
||||
}
|
||||
```
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"roomId": "room002",
|
||||
"name": "B区机房",
|
||||
"location": "二楼西侧",
|
||||
"area": 600,
|
||||
"createdAt": "2024-01-01T00:00:00.000Z",
|
||||
"updatedAt": "2024-01-01T00:00:00.000Z"
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 更新机房
|
||||
```http
|
||||
PUT /api/rooms/:roomId
|
||||
```
|
||||
|
||||
#### 4. 删除机房
|
||||
```http
|
||||
DELETE /api/rooms/:roomId
|
||||
```
|
||||
|
||||
### 机柜管理API
|
||||
|
||||
#### 1. 获取所有机柜
|
||||
```http
|
||||
GET /api/racks
|
||||
```
|
||||
|
||||
**查询参数**:
|
||||
- `roomId`: 按机房ID筛选
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
[
|
||||
{
|
||||
"rackId": "rack001",
|
||||
"name": "机柜A1",
|
||||
"height": 42,
|
||||
"powerRating": 5000,
|
||||
"Room": {
|
||||
"roomId": "room001",
|
||||
"name": "A区机房"
|
||||
},
|
||||
"Devices": []
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
#### 2. 创建机柜
|
||||
```http
|
||||
POST /api/racks
|
||||
```
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"rackId": "rack002",
|
||||
"name": "机柜A2",
|
||||
"height": 42,
|
||||
"powerRating": 5000,
|
||||
"RoomId": "room001"
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 更新机柜
|
||||
```http
|
||||
PUT /api/racks/:rackId
|
||||
```
|
||||
|
||||
#### 4. 删除机柜
|
||||
```http
|
||||
DELETE /api/racks/:rackId
|
||||
```
|
||||
|
||||
#### 5. 获取单个机柜详情
|
||||
```http
|
||||
GET /api/racks/:rackId
|
||||
```
|
||||
|
||||
### 设备管理API
|
||||
|
||||
#### 1. 获取所有设备
|
||||
```http
|
||||
GET /api/devices
|
||||
```
|
||||
|
||||
**查询参数**:
|
||||
- `rackId`: 按机柜ID筛选
|
||||
- `deviceType`: 按设备类型筛选
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
[
|
||||
{
|
||||
"deviceId": "dev001",
|
||||
"name": "Web服务器01",
|
||||
"deviceType": "服务器",
|
||||
"manufacturer": "Dell",
|
||||
"model": "R740",
|
||||
"rackPosition": 1,
|
||||
"height": 2,
|
||||
"ipAddress": "192.168.1.100",
|
||||
"macAddress": "00:1B:44:11:3A:B7",
|
||||
"status": "运行中",
|
||||
"purchaseDate": "2023-01-01",
|
||||
"warrantyDate": "2026-01-01",
|
||||
"description": "主要Web应用服务器",
|
||||
"Rack": {
|
||||
"rackId": "rack001",
|
||||
"name": "机柜A1"
|
||||
}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
#### 2. 创建设备
|
||||
```http
|
||||
POST /api/devices
|
||||
```
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"deviceId": "dev002",
|
||||
"name": "数据库服务器",
|
||||
"deviceType": "服务器",
|
||||
"manufacturer": "HP",
|
||||
"model": "DL380",
|
||||
"rackId": "rack001",
|
||||
"rackPosition": 3,
|
||||
"height": 2,
|
||||
"ipAddress": "192.168.1.101",
|
||||
"status": "运行中"
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 更新设备
|
||||
```http
|
||||
PUT /api/devices/:deviceId
|
||||
```
|
||||
|
||||
#### 4. 删除设备
|
||||
```http
|
||||
DELETE /api/devices/:deviceId
|
||||
```
|
||||
|
||||
#### 5. 批量导入设备
|
||||
```http
|
||||
POST /api/devices/batch-import
|
||||
```
|
||||
|
||||
**Content-Type**: `multipart/form-data`
|
||||
|
||||
**请求参数**:
|
||||
- `file`: CSV格式的设备数据文件
|
||||
|
||||
### 设备字段管理API
|
||||
|
||||
#### 1. 获取所有设备字段
|
||||
```http
|
||||
GET /api/deviceFields
|
||||
```
|
||||
|
||||
#### 2. 创建设备字段
|
||||
```http
|
||||
POST /api/deviceFields
|
||||
```
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"fieldName": "cpuModel",
|
||||
"displayName": "CPU型号",
|
||||
"fieldType": "text",
|
||||
"isRequired": false,
|
||||
"defaultValue": ""
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 更新设备字段
|
||||
```http
|
||||
PUT /api/deviceFields/:id
|
||||
```
|
||||
|
||||
#### 4. 删除设备字段
|
||||
```http
|
||||
DELETE /api/deviceFields/:id
|
||||
```
|
||||
|
||||
### 健康检查API
|
||||
|
||||
#### 服务状态检查
|
||||
```http
|
||||
GET /health
|
||||
```
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"status": "ok",
|
||||
"message": "IDC设备管理系统后端服务正常运行"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 安装部署指南
|
||||
|
||||
### 环境要求
|
||||
|
||||
#### 开发环境
|
||||
- **Node.js**: ≥14.0.0
|
||||
- **npm**: ≥6.0.0 或 **yarn**: ≥1.22.0
|
||||
- **操作系统**: Windows 10/11, macOS 10.14+, Linux (Ubuntu 18.04+)
|
||||
- **内存**: 最小 4GB RAM
|
||||
- **硬盘**: 最小 2GB 可用空间
|
||||
|
||||
#### 生产环境
|
||||
- **Node.js**: ≥14.0.0
|
||||
- **npm**: ≥6.0.0 或 **yarn**: ≥1.22.0
|
||||
- **Web服务器**: Nginx (推荐) 或 Apache
|
||||
- **操作系统**: Linux (Ubuntu 18.04+, CentOS 7+, RHEL 7+)
|
||||
- **内存**: 最小 8GB RAM (推荐 16GB+)
|
||||
- **硬盘**: 最小 10GB 可用空间 (SSD 推荐)
|
||||
- **SSL证书**: Let's Encrypt (推荐) 或其他CA证书
|
||||
|
||||
### 快速开始
|
||||
|
||||
#### 1. 克隆项目
|
||||
```bash
|
||||
# 安装所有依赖
|
||||
npm run install:all
|
||||
git clone https://gitee.com/zhang1106/idc_assest.git
|
||||
cd idc_assest
|
||||
```
|
||||
|
||||
### 2. 配置数据库
|
||||
|
||||
1. 创建MySQL数据库:
|
||||
```sql
|
||||
CREATE DATABASE idc_management;
|
||||
```
|
||||
|
||||
2. 修改后端数据库连接配置(backend/server.js):
|
||||
```javascript
|
||||
const sequelize = new Sequelize({
|
||||
dialect: 'mysql',
|
||||
host: 'localhost',
|
||||
port: 3306,
|
||||
username: 'root', // 修改为你的MySQL用户名
|
||||
password: 'password', // 修改为你的MySQL密码
|
||||
database: 'idc_management'
|
||||
});
|
||||
```
|
||||
|
||||
### 3. 启动服务
|
||||
|
||||
```bash
|
||||
# 同时启动前后端服务
|
||||
npm start
|
||||
|
||||
# 或分别启动
|
||||
npm run start:backend # 启动后端服务(端口:3001)
|
||||
npm run start:frontend # 启动前端服务(端口:3000)
|
||||
```
|
||||
|
||||
### 4. 访问系统
|
||||
|
||||
前端地址:http://localhost:3000
|
||||
后端API地址:http://localhost:3001
|
||||
|
||||
## API接口
|
||||
|
||||
### 机房管理
|
||||
- GET /api/rooms - 获取所有机房
|
||||
- GET /api/rooms/:roomId - 获取单个机房
|
||||
- POST /api/rooms - 创建机房
|
||||
- PUT /api/rooms/:roomId - 更新机房
|
||||
- DELETE /api/rooms/:roomId - 删除机房
|
||||
|
||||
### 机柜管理
|
||||
- GET /api/racks - 获取所有机柜
|
||||
- GET /api/racks/:rackId - 获取单个机柜
|
||||
- POST /api/racks - 创建机柜
|
||||
- PUT /api/racks/:rackId - 更新机柜
|
||||
- DELETE /api/racks/:rackId - 删除机柜
|
||||
|
||||
### 设备管理
|
||||
- GET /api/devices - 获取所有设备
|
||||
- GET /api/devices/:deviceId - 获取单个设备
|
||||
- POST /api/devices - 创建设备
|
||||
- PUT /api/devices/:deviceId - 更新设备
|
||||
- DELETE /api/devices/:deviceId - 删除设备
|
||||
|
||||
## 开发说明
|
||||
|
||||
### 后端开发
|
||||
|
||||
1. 进入后端目录:
|
||||
#### 2. 安装后端依赖
|
||||
```bash
|
||||
cd backend
|
||||
```
|
||||
|
||||
2. 安装依赖:
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
3. 启动开发服务器:
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### 前端开发
|
||||
|
||||
1. 进入前端目录:
|
||||
```bash
|
||||
cd frontend
|
||||
```
|
||||
|
||||
2. 安装依赖:
|
||||
#### 3. 安装前端依赖
|
||||
```bash
|
||||
cd ../frontend
|
||||
npm install
|
||||
```
|
||||
|
||||
3. 启动开发服务器:
|
||||
#### 4. 配置环境变量
|
||||
```bash
|
||||
npm run dev
|
||||
# 复制环境变量示例文件
|
||||
cp .env.example .env
|
||||
|
||||
# 编辑 .env 文件,根据需要修改配置
|
||||
# 默认配置可直接使用 SQLite 数据库
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
#### 5. 启动服务
|
||||
```bash
|
||||
# 启动后端服务(端口8000)
|
||||
cd backend && npm run dev
|
||||
|
||||
1. 确保MySQL服务已经启动
|
||||
2. 首次运行需要创建数据库
|
||||
3. 设备创建时会自动更新机柜的当前功率
|
||||
4. 设备更新或删除时会自动调整机柜的当前功率
|
||||
5. 机柜删除前需要确保没有关联的设备
|
||||
6. 机房删除前需要确保没有关联的机柜
|
||||
# 启动前端服务(端口3000)- 新终端
|
||||
cd frontend && npm run dev
|
||||
```
|
||||
|
||||
## License
|
||||
**访问地址**:
|
||||
- 前端应用:http://localhost:3000
|
||||
- 后端API:http://localhost:8000/api
|
||||
- 健康检查:http://localhost:8000/health
|
||||
|
||||
MIT
|
||||
### 详细安装和部署指南
|
||||
|
||||
📚 **完整安装部署文档**:请参考 [DEPLOYMENT.md](./DEPLOYMENT.md)
|
||||
|
||||
该文档包含:
|
||||
- 🖥️ 开发环境详细配置
|
||||
- 🚀 生产环境完整部署流程
|
||||
- 🗄️ 数据库配置和管理
|
||||
- 🔒 安全配置和优化
|
||||
- 📊 监控和维护指南
|
||||
- 🛠️ 常见问题解决方案
|
||||
|
||||
### 数据库选择
|
||||
|
||||
| 数据库类型 | 适用场景 | 优势 | 劣势 |
|
||||
|------------|----------|------|------|
|
||||
| **SQLite** | 开发环境、小规模应用 | 零配置、无需安装、数据文件便携 | 并发能力有限 |
|
||||
| **MySQL** | 生产环境、企业级应用 | 高性能、并发处理能力强 | 需要额外配置 |
|
||||
|
||||
**默认配置使用 SQLite,无需额外配置即可开始使用。**
|
||||
|
||||
---
|
||||
|
||||
## ✨ 功能特性
|
||||
|
||||
### 🏢 机房管理
|
||||
- 多机房支持
|
||||
- 机房详细信息记录
|
||||
- 按机房分类管理机柜
|
||||
|
||||
### 🗄️ 机柜管理
|
||||
- 机柜的增删改查
|
||||
- 机柜容量统计
|
||||
- 可视化机柜状态
|
||||
|
||||
### 💻 设备管理
|
||||
- 设备全生命周期管理
|
||||
- 批量导入/导出功能
|
||||
- 设备状态跟踪
|
||||
- 自定义设备字段
|
||||
|
||||
### 📊 数据看板
|
||||
- 实时统计图表
|
||||
- 设备状态分布
|
||||
- 容量使用率分析
|
||||
- 关键指标监控
|
||||
|
||||
### 🎮 3D可视化
|
||||
- 三维机柜展示
|
||||
- 设备悬停详情
|
||||
- 实时交互体验
|
||||
- 视角控制功能
|
||||
|
||||
### 🔧 系统特性
|
||||
- 响应式设计
|
||||
- 现代化UI界面
|
||||
- 级联选择机制
|
||||
- 数据实时刷新
|
||||
|
||||
---
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
本项目采用 [MIT 许可证](LICENSE)。
|
||||
|
||||
```
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 IDC Management System
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🤝 贡献指南
|
||||
|
||||
我们欢迎所有形式的贡献!请阅读 [CONTRIBUTING.md](CONTRIBUTING.md) 了解详细信息。
|
||||
|
||||
### 贡献方式
|
||||
- 🐛 报告Bug
|
||||
- 💡 提出新功能建议
|
||||
- 📝 改进文档
|
||||
- 🔧 提交代码补丁
|
||||
|
||||
### 开发流程
|
||||
1. Fork本项目
|
||||
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
|
||||
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
|
||||
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
||||
5. 开启Pull Request
|
||||
|
||||
|
||||
|
||||
**⭐ 如果这个项目对您有帮助,请给我们一个Star!**
|
||||
@@ -0,0 +1,37 @@
|
||||
# IDC设备管理系统环境配置示例
|
||||
# 复制此文件为 .env 并根据需要修改配置
|
||||
|
||||
# ==============================================
|
||||
# 服务器配置
|
||||
# ==============================================
|
||||
|
||||
# 服务器端口(默认8000)
|
||||
# 如需修改,请设置为其他端口号
|
||||
PORT=8000
|
||||
|
||||
# 运行环境(development/production)
|
||||
# development: 开发模式,详细日志便于调试
|
||||
# production: 生产模式,性能优化,减少日志输出
|
||||
NODE_ENV=development
|
||||
|
||||
# ==============================================
|
||||
# 数据库配置
|
||||
# ==============================================
|
||||
|
||||
# 数据库类型:sqlite(默认)或 mysql
|
||||
# sqlite: 零配置嵌入式数据库,适合开发和小规模应用
|
||||
# mysql: 关系型数据库,适合生产环境和大规模应用
|
||||
DB_TYPE=sqlite
|
||||
|
||||
# SQLite 配置(当DB_TYPE=sqlite时使用)
|
||||
# SQLite数据库文件路径,文件会自动创建
|
||||
DB_PATH=./idc_management.db
|
||||
|
||||
# MySQL 配置(当DB_TYPE=mysql时使用)
|
||||
# 注意:使用MySQL前请确保MySQL服务已安装并创建相应的数据库
|
||||
# 数据库创建命令:CREATE DATABASE idc_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
MYSQL_HOST=localhost # MySQL服务器地址
|
||||
MYSQL_PORT=3306 # MySQL端口号
|
||||
MYSQL_USERNAME=root # MySQL用户名
|
||||
MYSQL_PASSWORD= # MySQL密码(为空则无密码)
|
||||
MYSQL_DATABASE=idc_management # MySQL数据库名
|
||||
+27
-5
@@ -1,9 +1,31 @@
|
||||
const { Sequelize } = require('sequelize');
|
||||
|
||||
// 创建并导出sequelize实例
|
||||
const sequelize = new Sequelize({
|
||||
dialect: 'sqlite',
|
||||
storage: './idc_management.db' // SQLite数据库文件路径
|
||||
});
|
||||
// 获取数据库配置
|
||||
const DB_TYPE = process.env.DB_TYPE || 'sqlite'; // 数据库类型:sqlite 或 mysql
|
||||
|
||||
// 根据数据库类型创建连接
|
||||
let sequelize;
|
||||
|
||||
if (DB_TYPE === 'mysql') {
|
||||
// MySQL 配置
|
||||
sequelize = new Sequelize(
|
||||
process.env.MYSQL_DATABASE || 'idc_management',
|
||||
process.env.MYSQL_USERNAME || 'root',
|
||||
process.env.MYSQL_PASSWORD || '',
|
||||
{
|
||||
host: process.env.MYSQL_HOST || 'localhost',
|
||||
port: parseInt(process.env.MYSQL_PORT) || 3306,
|
||||
dialect: 'mysql',
|
||||
logging: process.env.NODE_ENV === 'development' ? console.log : false
|
||||
}
|
||||
);
|
||||
} else {
|
||||
// SQLite 配置(默认)
|
||||
sequelize = new Sequelize({
|
||||
dialect: 'sqlite',
|
||||
storage: process.env.DB_PATH || './idc_management.db',
|
||||
logging: process.env.NODE_ENV === 'development' ? console.log : false
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = { sequelize };
|
||||
Generated
+130
@@ -11,9 +11,11 @@
|
||||
"cors": "^2.8.5",
|
||||
"csv-parser": "^3.2.0",
|
||||
"csv-writer": "^1.6.0",
|
||||
"dotenv": "^17.2.3",
|
||||
"express": "^4.18.2",
|
||||
"express-fileupload": "^1.5.2",
|
||||
"iconv-lite": "^0.6.3",
|
||||
"mysql2": "^3.16.0",
|
||||
"sequelize": "^6.32.1",
|
||||
"sqlite3": "^5.1.6",
|
||||
"three": "^0.182.0"
|
||||
@@ -232,6 +234,15 @@
|
||||
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/aws-ssl-profiles": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
|
||||
"integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
@@ -630,6 +641,15 @@
|
||||
"license": "MIT",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/denque": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
|
||||
"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/depd": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
||||
@@ -658,6 +678,18 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/dotenv": {
|
||||
"version": "17.2.3",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
|
||||
"integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==",
|
||||
"license": "BSD-2-Clause",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://dotenvx.com"
|
||||
}
|
||||
},
|
||||
"node_modules/dottie": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
|
||||
@@ -973,6 +1005,15 @@
|
||||
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/generate-function": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
|
||||
"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"is-property": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/get-intrinsic": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
|
||||
@@ -1408,6 +1449,12 @@
|
||||
"node": ">=0.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/is-property": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
|
||||
"integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/isexe": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
|
||||
@@ -1421,6 +1468,12 @@
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/long": {
|
||||
"version": "5.3.2",
|
||||
"resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
|
||||
"integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
@@ -1434,6 +1487,21 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/lru.min": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.3.tgz",
|
||||
"integrity": "sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"bun": ">=1.0.0",
|
||||
"deno": ">=1.30.0",
|
||||
"node": ">=8.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/wellwelwel"
|
||||
}
|
||||
},
|
||||
"node_modules/make-fetch-happen": {
|
||||
"version": "9.1.0",
|
||||
"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
|
||||
@@ -1705,6 +1773,54 @@
|
||||
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/mysql2": {
|
||||
"version": "3.16.0",
|
||||
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.16.0.tgz",
|
||||
"integrity": "sha512-AEGW7QLLSuSnjCS4pk3EIqOmogegmze9h8EyrndavUQnIUcfkVal/sK7QznE+a3bc6rzPbAiui9Jcb+96tPwYA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"aws-ssl-profiles": "^1.1.1",
|
||||
"denque": "^2.1.0",
|
||||
"generate-function": "^2.3.1",
|
||||
"iconv-lite": "^0.7.0",
|
||||
"long": "^5.2.1",
|
||||
"lru.min": "^1.0.0",
|
||||
"named-placeholders": "^1.1.3",
|
||||
"seq-queue": "^0.0.5",
|
||||
"sqlstring": "^2.3.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mysql2/node_modules/iconv-lite": {
|
||||
"version": "0.7.1",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz",
|
||||
"integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/express"
|
||||
}
|
||||
},
|
||||
"node_modules/named-placeholders": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz",
|
||||
"integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"lru.min": "^1.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/napi-build-utils": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
|
||||
@@ -2233,6 +2349,11 @@
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/seq-queue": {
|
||||
"version": "0.0.5",
|
||||
"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
|
||||
"integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
|
||||
},
|
||||
"node_modules/sequelize": {
|
||||
"version": "6.37.7",
|
||||
"resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.7.tgz",
|
||||
@@ -2582,6 +2703,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/sqlstring": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
|
||||
"integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/ssri": {
|
||||
"version": "8.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
|
||||
|
||||
@@ -10,9 +10,11 @@
|
||||
"cors": "^2.8.5",
|
||||
"csv-parser": "^3.2.0",
|
||||
"csv-writer": "^1.6.0",
|
||||
"dotenv": "^17.2.3",
|
||||
"express": "^4.18.2",
|
||||
"express-fileupload": "^1.5.2",
|
||||
"iconv-lite": "^0.6.3",
|
||||
"mysql2": "^3.16.0",
|
||||
"sequelize": "^6.32.1",
|
||||
"sqlite3": "^5.1.6",
|
||||
"three": "^0.182.0"
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
require('dotenv').config();
|
||||
const express = require('express');
|
||||
const cors = require('cors');
|
||||
const fileUpload = require('express-fileupload');
|
||||
|
||||
Reference in New Issue
Block a user