diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..9a0e18e --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,818 @@ +# IDC设备管理系统 - 安装部署指南 + +[![https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Node.js](https://img.shields.io/badge/Node.js-%3E%3D14.0.0-brightgreen.svg)](https://nodejs.org/) +[![React](https://img.shields.io/badge/React-18.2.0-blue.svg)](https://reactjs.org/) +[![Status](https://img.shields.io/badge/Status-Production%20Ready-success.svg)]() + +## 📋 目录 + +- [环境要求](#环境要求) +- [快速开始](#快速开始) +- [详细安装步骤](#详细安装步骤) +- [生产部署](#生产部署) +- [数据库配置](#数据库配置) +- [监控和维护](#监控和维护) +- [常见问题解决](#常见问题解决) + +--- + +## 🖥️ 环境要求 + +### 开发环境 +- **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!** \ No newline at end of file diff --git a/README.md b/README.md index 5d49638..ba5a7aa 100644 --- a/README.md +++ b/README.md @@ -1,180 +1,598 @@ # IDC设备管理系统 -一个基于React+Node.js+MySQL的IDC设备管理系统,用于管理IDC机房中的设备、机柜和机房信息。 +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Node.js](https://img.shields.io/badge/Node.js-%3E%3D14.0.0-brightgreen.svg)](https://nodejs.org/) +[![React](https://img.shields.io/badge/React-18.2.0-blue.svg)](https://reactjs.org/) +[![Status](https://img.shields.io/badge/Status-Production%20Ready-success.svg)]() -## 功能特点 +一个现代化的数据中心(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 \ No newline at end of file +### 详细安装和部署指南 + +📚 **完整安装部署文档**:请参考 [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!** \ No newline at end of file diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..1627d8e --- /dev/null +++ b/backend/.env.example @@ -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数据库名 \ No newline at end of file diff --git a/backend/db.js b/backend/db.js index a241858..4c5c10c 100644 --- a/backend/db.js +++ b/backend/db.js @@ -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 }; \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json index 52ca0de..e7d7a20 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -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", diff --git a/backend/package.json b/backend/package.json index c1a5ca3..0ec9f6a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -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" diff --git a/backend/server.js b/backend/server.js index fd475bf..139fe01 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,3 +1,4 @@ +require('dotenv').config(); const express = require('express'); const cors = require('cors'); const fileUpload = require('express-fileupload');