From 53d6ce60bf71f81e2c70124739643034fe657f41 Mon Sep 17 00:00:00 2001 From: zhang1106 <849185023@qq.com> Date: Wed, 13 May 2026 16:04:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(secureStorage):=20-=20=E7=B2=BE=E7=AE=80REA?= =?UTF-8?q?DME.md=E6=96=87=E6=A1=A3=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DEPLOYMENT.md | 1160 ------------------------ README.md | 1310 ++++++++++----------------- frontend/src/utils/secureStorage.js | 18 + 3 files changed, 512 insertions(+), 1976 deletions(-) delete mode 100644 DEPLOYMENT.md diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md deleted file mode 100644 index 5c80a17..0000000 --- a/DEPLOYMENT.md +++ /dev/null @@ -1,1160 +0,0 @@ -# IDC设备管理系统 - 部署指南 - -本文档详细介绍IDC设备管理系统的多种部署方式,包括开发环境、测试环境、生产环境的配置方法。 - ---- - -## 目录 - -- [快速开始](#快速开始) -- [环境要求](#环境要求) -- [开发环境部署](#开发环境部署) -- [测试环境部署](#测试环境部署) -- [生产环境部署](#生产环境部署) -- [数据库配置](#数据库配置) -- [部署验证](#部署验证) -- [更新升级](#更新升级) -- [监控维护](#监控维护) -- [常见问题](#常见问题) - ---- - -## 快速开始 - -### 一键部署脚本(推荐)⭐ - -我们提供了交互式安装脚本,自动完成环境检测、依赖安装、数据库初始化和服务启动。 - -#### Linux 用户(支持自动安装 Node.js) - -```bash -# 克隆项目(选择其一) -# Gitee(国内推荐) -git clone https://gitee.com/zhang96110/idc_assest.git -# GitHub -git clone https://github.com/gituib/idc_assest.git -cd idc_assest - -# 方式1:使用 Shell 引导脚本(推荐,无需预装 Node.js) -chmod +x install.sh && ./install.sh - -# 方式2:一键安装(从远程) -curl -fsSL https://gitee.com/zhang96110/idc_assest/raw/main/install.sh | bash -``` - -**Shell 脚本功能:** -- ✅ 自动检测 Linux 发行版(Ubuntu/Debian/CentOS/Arch) -- ✅ 自动安装 Node.js 20.x(使用 NodeSource 或 nvm) -- ✅ 自动安装系统依赖(git、curl 等) -- ✅ 调用 install.js 完成后续安装 - -#### Windows 用户 - -```powershell -# 克隆项目 -git clone https://gitee.com/zhang96110/idc_assest.git -cd idc_assest - -# 运行安装脚本(需要先安装 Node.js) -node install.js - -# 或使用 npm 命令 -npm run deploy -``` - -#### 非交互式安装(快速部署) - -```bash -# 使用默认配置快速安装 -node install.js -y # 交互式安装 - -# 指定数据库类型 -node install.js -y --db=mysql # 使用 MySQL -node install.js -y --db=sqlite # 使用 SQLite(默认) - -# 指定端口 -node install.js -y --port=3000 # 后端端口 3000 - -# 跳过前端构建 -node install.js -y --skip-build -``` - -**脚本功能:** -- ✅ 自动检测 Node.js、npm、PM2、Nginx -- ✅ **Linux 自动安装 Node.js**(Ubuntu/Debian/CentOS/Arch) -- ✅ **MySQL 连接测试**(配置后自动验证) -- ✅ **安装后健康检查**(验证服务是否正常) -- ✅ 交互式配置数据库(SQLite/MySQL) -- ✅ 交互式选择运行环境(development/production) -- ✅ 交互式选择前端部署方式(Nginx/PM2 serve) -- ✅ 自动安装项目依赖 -- ✅ 自动初始化数据库 -- ✅ 自动构建前端项目 -- ✅ 使用 PM2 启动和管理服务 -- ✅ 日志持久化保存 - ---- - -## 环境要求 - -### 基础运行环境 - -| 项目 | 最低要求 | 推荐配置 | -|------|----------|----------| -| **操作系统** | Windows 10/11、macOS 12+、Linux (Ubuntu 20.04+/CentOS 8+) | 同最低要求 | -| **Node.js** | ≥14.0.0 | 20.x LTS | -| **npm** | ≥6.0.0 | 10.x | -| **内存** | 4GB | 8GB+ | -| **磁盘空间** | 2GB | 10GB+ | - -### 生产环境服务器要求 - -#### 最低配置 - -| 资源 | 要求 | -|------|------| -| **CPU** | 2 核心 | -| **内存** | 4GB | -| **磁盘** | 40GB SSD | -| **带宽** | 5Mbps | - -#### 推荐配置 - -| 资源 | 要求 | -|------|------| -| **CPU** | 4 核心+ | -| **内存** | 8GB+ | -| **磁盘** | 100GB SSD | -| **带宽** | 10Mbps+ | - -### 软件依赖 - -| 软件 | 版本要求 | 说明 | -|------|----------|------| -| **Node.js** | ≥14.0.0 (推荐 20.x LTS) | 运行时环境 | -| **npm** | ≥6.0.0 | 包管理器 | -| **PM2** | 5.x+ | 进程管理器(生产环境) | -| **Nginx** | 1.18+ | Web服务器/反向代理 | -| **MySQL** | 8.0+ | 数据库(生产环境,推荐) | -| **SQLite** | -(开发/小型 | 数据库部署) | - -### 端口要求 - -| 端口 | 用途 | 协议 | -|------|------|------| -| 8000 | 后端API服务 | HTTP | -| 3000 | 前端开发服务 | HTTP | -| 80 | Nginx HTTP | HTTP | -| 443 | Nginx HTTPS | HTTPS | - ---- - -## 开发环境部署 - -### 1. 环境准备 - -#### Linux - -**Ubuntu/Debian:** -```bash -curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - -sudo apt-get install -y nodejs -``` - -**CentOS/RHEL/Fedora:** -```bash -curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - -sudo yum install -y nodejs -``` - -**使用 nvm(推荐开发者):** -```bash -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash -nvm install 20 -nvm use 20 -``` - -### 2. 克隆项目 - -```bash -# 从Gitee克隆(国内访问更快) -git clone https://gitee.com/zhang96110/idc_assest.git - -# 或从GitHub克隆 -git clone https://github.com/gituib/idc_assest.git - -cd idc_assest -``` - -### 3. 安装依赖 - -```bash -# 安装后端依赖 -cd backend -npm install - -# 安装前端依赖(新终端) -cd ../frontend -npm install -``` - -### 4. 配置环境变量 - -```bash -cd ../backend -cp .env.example .env -``` - -编辑 `.env` 文件(开发环境使用默认SQLite配置即可): - -```env -# 开发环境配置 -NODE_ENV=development -PORT=8000 -DB_TYPE=sqlite -DB_PATH=./idc_management.db - -# JWT配置(开发环境可使用简单密钥) -JWT_SECRET=dev_secret_key_change_in_production -JWT_EXPIRES_IN=7d -``` - -### 5. 初始化数据库 - -```bash -node scripts/init-database.js -``` - -### 6. 启动服务 - -**同时启动前后端(推荐):** -```bash -# 项目根目录 -npm start -``` - -**分别启动:** -```bash -# 终端1 - 启动后端(端口8000) -cd backend -npm run dev - -# 终端2 - 启动前端(端口3000) -cd frontend -npm run dev -``` - -### 7. 访问开发环境 - -| 服务 | 地址 | -|------|------| -| 前端应用 | http://localhost:3000 | -| 后端API | http://localhost:8000/api | -| 健康检查 | http://localhost:8000/health | - -### 8. 开发命令 - -```bash -# 项目根目录命令 -npm start # 同时启动前后端 -npm run start:backend # 仅启动后端 -npm run start:frontend # 仅启动前端 -npm run install:all # 安装所有依赖 - -# 后端命令 -cd backend -npm run dev # 开发模式启动(热重载) -npm start # 生产模式启动 - -# 前端命令 -cd frontend -npm run dev # 开发模式启动 -npm run build # 构建生产版本 -npm run preview # 预览生产版本 -``` - ---- - -## 测试环境部署 - -### 1. 服务器准备 - -测试环境配置要求: - -| 项目 | 配置 | -|------|------| -| **操作系统** | Ubuntu 20.04 LTS / CentOS 8 | -| **Node.js** | 20.x LTS | -| **内存** | 4GB | -| **磁盘** | 20GB SSD | -| **数据库** | MySQL 8.0(与生产一致) | - -### 2. 配置数据库 - -```bash -# 安装MySQL -sudo apt update -sudo apt install -y mysql-server - -# 启动MySQL -sudo systemctl start mysql -sudo systemctl enable mysql - -# 创建数据库和用户 -sudo mysql -``` - -```sql -CREATE DATABASE idc_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -CREATE USER 'idc_test'@'localhost' IDENTIFIED BY 'test_password'; -GRANT ALL PRIVILEGES ON idc_management.* TO 'idc_test'@'localhost'; -FLUSH PRIVILEGES; -EXIT; -``` - -### 3. 配置环境变量 - -```bash -cd backend -cp .env.example .env -``` - -编辑 `.env` 文件: - -```env -NODE_ENV=test -PORT=8000 -DB_TYPE=mysql -MYSQL_HOST=localhost -MYSQL_PORT=3306 -MYSQL_USERNAME=idc_test -MYSQL_PASSWORD=test_password -MYSQL_DATABASE=idc_management -JWT_SECRET=test_jwt_secret_key -JWT_EXPIRES_IN=24h -``` - -### 4. 安装依赖并初始化 - -```bash -# 安装后端依赖 -cd backend -npm install - -# 初始化数据库 -node scripts/init-database.js - -# 安装前端依赖并构建 -cd ../frontend -npm install -npm run build -``` - -### 5. 使用PM2启动服务 - -```bash -# 安装PM2 -npm install -g pm2 - -# 启动后端服务 -cd ../backend -pm2 start server.js --name "idc-test-backend" --env test - -# 启动前端静态服务 -cd ../frontend -pm2 serve --name "idc-test-frontend" -s dist -l 3000 - -# 保存PM2配置 -pm2 save - -# 配置开机自启 -pm2 startup -``` - -### 6. 测试验证 - -```bash -# 测试后端API -curl http://localhost:8000/health - -# 测试前端 -curl http://localhost:3000 -``` - ---- - -## 生产环境部署 - -### 1. 服务器要求 - -#### 硬件要求 - -| 规模 | CPU | 内存 | 磁盘 | -|------|-----|------|------| -| 小型(<100设备) | 2核心 | 4GB | 40GB | -| 中型(100-500设备) | 4核心 | 8GB | 80GB | -| 大型(>500设备) | 8核心+ | 16GB+ | 100GB+ | - -#### 软件要求 - -| 软件 | 版本 | 说明 | -|------|------|------| -| 操作系统 | Ubuntu 20.04+ / CentOS 8+ | 推荐 Ubuntu 22.04 LTS | -| Node.js | 20.x LTS | 运行时环境 | -| MySQL | 8.0+ | 数据库 | -| Nginx | 1.18+ | 反向代理/静态文件 | -| PM2 | 5.x+ | 进程管理 | - -### 2. 系统配置 - -#### 创建部署用户(非root) - -```bash -# 创建用户 -sudo adduser idcadmin - -# 赋予sudo权限 -sudo usermod -aG sudo idcadmin - -# 切换到部署用户 -sudo su - idcadmin -``` - -#### 配置防火墙 - -```bash -# Ubuntu -sudo ufw allow 22 # SSH -sudo ufw allow 80 # HTTP -sudo ufw allow 443 # HTTPS -sudo ufw enable - -# CentOS -sudo firewall-cmd --permanent --add-port=22/tcp -sudo firewall-cmd --permanent --add-port=80/tcp -sudo firewall-cmd --permanent --add-port=443/tcp -sudo firewall-cmd --reload -``` - -### 3. 安装软件 - -#### 安装Node.js - -```bash -# Ubuntu/Debian -curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - -sudo apt-get install -y nodejs - -# 安装PM2 -sudo npm install -g pm2 -``` - -#### 安装MySQL - -```bash -# Ubuntu -sudo apt install -y mysql-server - -sudo apt update -# 启动并配置 -sudo systemctl start mysql -sudo systemctl enable mysql -``` - -#### 安装Nginx - -```bash -# Ubuntu -sudo apt install -y nginx -sudo systemctl start nginx -sudo systemctl enable nginx -``` - -### 4. 配置数据库 - -```bash -sudo mysql -``` - -```sql --- 创建数据库 -CREATE DATABASE idc_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- 创建用户(生产环境使用强密码) -CREATE USER 'idc_prod'@'localhost' IDENTIFIED BY 'YOUR_STRONG_PASSWORD_HERE'; -GRANT ALL PRIVILEGES ON idc_management.* TO 'idc_prod'@'localhost'; -FLUSH PRIVILEGES; - -EXIT; -``` - -### 5. 部署项目 - -#### 克隆项目 - -```bash -cd /var/www -# 选择其一 -# Gitee(国内推荐) -sudo git clone https://gitee.com/zhang96110/idc_assest.git -# GitHub -sudo git clone https://github.com/gituib/idc_assest.git -sudo chown -R idcadmin:idcadmin idc_assest -``` - -#### 配置环境变量 - -```bash -cd /var/www/idc_assest/backend -cp .env.example .env -nano .env -``` - -编辑 `.env` 文件: - -```env -# 生产环境配置 -NODE_ENV=production -PORT=8000 -DB_TYPE=mysql -MYSQL_HOST=localhost -MYSQL_PORT=3306 -MYSQL_USERNAME=idc_prod -MYSQL_PASSWORD=YOUR_STRONG_PASSWORD_HERE -MYSQL_DATABASE=idc_management - -# JWT配置(使用强随机密钥) -JWT_SECRET=$(openssl rand -base64 32) -JWT_EXPIRES_IN=24h - -# 日志配置 -LOG_LEVEL=info -``` - -### 6. 安装依赖 - -```bash -# 安装后端依赖 -cd /var/www/idc_assest/backend -npm install --production - -# 安装前端依赖并构建 -cd ../frontend -npm install -npm run build -``` - -### 7. 初始化数据库 - -```bash -cd ../backend -node scripts/init-database.js -``` - -### 8. 配置PM2 - -```bash -# 创建PM2配置文件 -nano /var/www/idc_assest/ecosystem.config.js -``` - -```javascript -module.exports = { - apps: [ - { - name: 'idc-backend', - script: './server.js', - cwd: '/var/www/idc_assest/backend', - instances: 1, - exec_mode: 'fork', - env: { - NODE_ENV: 'production', - PORT: 8000 - }, - max_memory_restart: '1G', - log_file: '/var/log/idc/combined.log', - out_file: '/var/log/idc/out.log', - error_file: '/var/log/idc/error.log', - log_date_format: 'YYYY-MM-DD HH:mm:ss Z', - merge_logs: true, - autorestart: true, - watch: false - } - ] -}; -``` - -```bash -# 创建日志目录 -sudo mkdir -p /var/log/idc -sudo chown -R idcadmin:idcadmin /var/log/idc - -# 启动服务 -cd /var/www/idc_assest -pm2 start ecosystem.config.js -pm2 save -pm2 startup -``` - -### 9. 配置Nginx - -```bash -sudo nano /etc/nginx/sites-available/idc -``` - -```nginx -upstream idc_backend { - server 127.0.0.1:8000; -} - -server { - listen 80; - server_name your-domain.com; # 替换为实际域名 - - # 前端静态文件 - root /var/www/idc_assest/frontend/dist; - index index.html; - - # Gzip压缩 - gzip on; - gzip_vary on; - gzip_min_length 1024; - gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; - - # 静态资源缓存 - location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { - expires 1y; - add_header Cache-Control "public, immutable"; - } - - # 前端路由支持(SPA) - location / { - try_files $uri $uri/ /index.html; - } - - # API代理 - location /api { - proxy_pass http://idc_backend; - proxy_http_version 1.1; - 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_connect_timeout 60s; - proxy_send_timeout 60s; - proxy_read_timeout 60s; - } - - # 文件上传代理 - location /uploads { - proxy_pass http://idc_backend; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - client_max_body_size 50M; - } - - # 健康检查 - location /health { - proxy_pass http://idc_backend/health; - } - - # Swagger API文档(v2.0.0新增) - location /api-docs { - proxy_pass http://idc_backend/api-docs; - proxy_http_version 1.1; - proxy_set_header Host $host; - } - - # SSE 备份恢复进度推送(v2.0.0新增) - location ~ ^/api/backup/restore-progress/ { - proxy_pass http://idc_backend; - proxy_http_version 1.1; - proxy_set_header Connection ''; - proxy_buffering off; - proxy_cache off; - chunked_transfer_encoding off; - } -} -``` - -```bash -# 启用配置 -sudo ln -s /etc/nginx/sites-available/idc /etc/nginx/sites-enabled/ -sudo rm -f /etc/nginx/sites-enabled/default -sudo nginx -t -sudo systemctl reload nginx -``` - -### 10. 配置SSL证书(可选) - -使用 Let's Encrypt 免费证书: - -```bash -# 安装Certbot -sudo apt install -y certbot python3-certbot-nginx - -# 获取证书 -sudo certbot --nginx -d your-domain.com - -# 自动续期测试 -sudo certbot renew --dry-run -``` - ---- - -## 数据库配置 - -### SQLite(开发环境/小规模) - -- 默认配置,无需额外设置 -- 数据库文件:`backend/idc_management.db` -- 优点:零配置,便携 -- 缺点:不适合高并发,单文件限制 - -### MySQL(生产环境推荐) - -#### 创建数据库 - -```sql -CREATE DATABASE idc_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -``` - -#### 配置优化 - -```ini -# my.cnf 或 my.ini -[mysqld] -character-set-server=utf8mb4 -collation-server=utf8mb4_unicode_ci -max_connections=200 -innodb_buffer_pool_size=1G -``` - -### 数据备份 - -#### 系统内置备份(推荐) - -v2.0.0 新增了内置备份管理功能,支持手动备份、自动定时备份和远端备份。 - -1. **手动备份**:在系统管理 → 备份管理中点击「创建备份」 -2. **自动备份**:在系统管理 → 自动备份中配置 Cron 表达式定时备份 -3. **远端备份**:在系统管理 → 远端备份中配置 FTP/SFTP/WebDAV/SMB 协议上传 - -#### SQLite备份 - -```bash -# 手动备份 -cp backend/idc_management.db backup/database_$(date +%Y%m%d).db -``` - -#### MySQL备份 - -```bash -# 手动备份 -mysqldump -u idc_prod -p idc_management > backup/database_$(date +%Y%m%d).sql - -# 自动备份脚本 -#!/bin/bash -BACKUP_DIR="/var/backups/idc" -DATE=$(date +%Y%m%d_%H%M%S) -mkdir -p $BACKUP_DIR -mysqldump -u idc_prod -pYourPassword idc_management > "$BACKUP_DIR/database_$DATE.sql" -gzip "$BACKUP_DIR/database_$DATE.sql" - -# 清理30天前的备份 -find $BACKUP_DIR -name "database_*.gz" -mtime +30 -delete -``` - -添加到crontab: -```bash -crontab -e -# 每天凌晨2点执行 -0 2 * * * /path/to/backup_script.sh -``` - ---- - -## 部署验证 - -### 1. 服务状态检查 - -```bash -# PM2服务状态 -pm2 status - -# Nginx状态 -sudo systemctl status nginx - -# MySQL状态 -sudo systemctl status mysql -``` - -### 2. 接口验证 - -```bash -# 健康检查 -curl http://localhost:8000/health - -# API测试 -curl http://localhost:8000/api/rooms - -# Swagger API文档(v2.0.0新增) -# 浏览器访问 http://localhost:8000/api-docs - -# 上传接口测试 -curl -X POST http://localhost:8000/api/auth/login \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}' -``` - -### 3. 日志检查 - -```bash -# PM2日志 -pm2 logs idc-backend - -# 错误日志 -pm2 logs idc-backend --err - -# Nginx错误日志 -sudo tail -f /var/log/nginx/error.log -``` - -### 4. 性能测试 - -```bash -# 使用curl测试响应时间 -time curl -o /dev/null -s -w "%{http_code}\n" http://localhost:8000/health -``` - ---- - -## 更新升级 - -### 方式一:一键更新脚本(推荐)⭐ - -```bash -# 交互式更新 -node update.js - -# 查看帮助 -node update.js --help - -# 模拟运行(不执行实际操作) -node update.js --dry-run - -# 跳过某些步骤 -node update.js --skip-git # 跳过 Git 拉取 -node update.js --skip-backup # 跳过数据库备份 -node update.js --skip-migrate # 跳过数据库迁移 -node update.js --skip-build # 跳过前端构建 -node update.js --skip-deps # 跳过依赖安装 -node update.js --skip-restart # 跳过服务重启 - -# 强制执行(忽略锁文件) -node update.js --force -``` - -**智能检测功能:** -- ✅ **依赖安装智能跳过** - 检测 package.json 变化,无变化则跳过 -- ✅ **前端构建智能跳过** - 检测源码变化,无变化则跳过 -- ✅ **数据库自动备份** - 更新前自动备份,支持回滚 -- ✅ **健康检查验证** - 更新后验证服务是否正常 -- ✅ **日志持久化** - 更新日志保存到 `logs/update_*.log` -- ✅ **锁机制** - 防止多个更新进程同时运行 - -### 方式二:手动更新 - -#### v2.0.0 升级注意事项 - -从 1.x 版本升级到 2.0.0 时,请注意以下事项: - -1. **数据库迁移**:新增了 BackupLog、OperationLog、Warehouse、Business、DeviceBusiness、ConsumableLogArchive 等数据表,务必运行迁移脚本 -2. **JWT 安全增强**:建议更新生产环境的 JWT_SECRET 配置为强随机密钥 -3. **新增依赖**:后端新增了 basic-ftp、ssh2-sftp-client、webdav、smb2、node-cron、swagger-jsdoc、swagger-ui-express 等依赖 -4. **3D 引擎升级**:Three.js 从 0.160.0 升级到 0.183.2,请确认浏览器兼容性 -5. **Swagger 文档**:新增交互式 API 文档,可通过 `/api-docs` 访问 -6. **备份目录**:确保 `backend/backups/` 目录存在且有写入权限 - -#### 1. 备份数据 - -```bash -# 备份数据库 -mysqldump -u idc_prod -p idc_management > /var/backups/idc/database_backup_$(date +%Y%m%d).sql - -# 或备份SQLite -cp backend/idc_management.db /var/backups/idc/ -``` - -#### 2. 拉取最新代码 - -```bash -cd /var/www/idc_assest -git pull origin main -``` - -#### 3. 更新依赖 - -```bash -# 更新后端依赖 -cd backend -npm install - -# 更新前端依赖并构建 -cd ../frontend -npm install -npm run build -``` - -#### 4. 运行数据库迁移(如有) - -```bash -cd ../backend -node scripts/migrate-all.js -``` - -#### 5. 重启服务 - -```bash -pm2 restart idc-backend -sudo nginx -t && sudo nginx -s reload -``` - ---- - -## 监控维护 - -### 服务管理命令 - -```bash -# PM2 管理 -pm2 status # 查看服务状态 -pm2 logs idc-backend # 查看后端日志 -pm2 logs idc-backend --err # 查看错误日志 -pm2 restart idc-backend # 重启后端服务 -pm2 stop idc-backend # 停止后端服务 -pm2 delete idc-backend # 删除后端服务 -pm2 save # 保存当前进程列表 -pm2 startup # 配置开机自启 -pm2 monit # 实时监控 - -# Nginx 管理 -sudo nginx -t # 测试配置 -sudo systemctl restart nginx # 重启服务 -sudo systemctl status nginx # 查看状态 -``` - -### 性能监控 - -#### PM2配置(`ecosystem.config.js`) - -```javascript -module.exports = { - apps: [{ - name: 'idc-backend', - script: './server.js', - cwd: './backend', - instances: 1, - exec_mode: 'fork', - max_memory_restart: '1G', - autorestart: true, - env: { - NODE_ENV: 'production' - }, - log_file: './logs/combined.log', - out_file: './logs/out.log', - error_file: './logs/error.log', - log_date_format: 'YYYY-MM-DD HH:mm:ss Z' - }] -}; -``` - ---- - -## 卸载系统 - -### 方式一:一键卸载脚本(推荐)⭐ - -```bash -# 交互式卸载 -node uninstall.js - -# 查看帮助 -node uninstall.js --help - -# 强制卸载(无需确认) -node uninstall.js --force - -# 卸载前自动备份 -node uninstall.js --backup - -# 跳过某些步骤 -node uninstall.js --skip-db # 跳过数据库删除 -node uninstall.js --skip-deps # 跳过依赖删除 -``` - -**卸载功能:** -- ✅ 停止并删除 PM2 服务 -- ✅ 清理 Nginx 配置 -- ✅ 删除生成的配置文件 -- ✅ 可选删除数据库文件 -- ✅ 可选删除 node_modules -- ✅ 卸载前自动备份 -- ✅ 日志持久化保存 - -### 方式二:手动卸载 - -```bash -# 1. 停止服务 -pm2 stop idc-backend -pm2 delete idc-backend -pm2 save - -# 2. 删除配置文件 -rm backend/.env -rm deploy/ecosystem.config.js -rm deploy/nginx-idc.conf - -# 3. 删除数据库(可选) -rm backend/idc_management.db - -# 4. 删除依赖(可选) -rm -rf backend/node_modules -rm -rf frontend/node_modules -rm -rf frontend/dist -``` - ---- - -## 常见问题 - -### 端口冲突 - -```bash -# 检查端口占用 -# Linux -netstat -tulpn | grep :8000 - -# Windows -netstat -ano | findstr :8000 - -# 修改端口 -# 编辑 backend/.env 文件 -PORT=8001 -``` - -### 依赖安装失败 - -```bash -# 清理缓存 -npm cache clean --force - -# 删除 node_modules 重新安装 -rm -rf node_modules package-lock.json -npm install -``` - -### 数据库连接失败 - -**MySQL:** -- 检查服务状态:`sudo systemctl status mysql` -- 验证连接参数(主机、端口、用户名、密码) -- 确认数据库已创建 -- 检查防火墙设置 -- 确认用户权限:`SHOW GRANTS FOR 'idc_prod'@'localhost'` - -### 前端构建失败 - -```bash -# 检查 Node.js 版本 -node -v - -# 清理并重新构建 -cd frontend -rm -rf node_modules dist -npm install -npm run build -``` - -### 权限问题 - -```bash -# 修复文件权限 -sudo chown -R $(whoami):$(whoami) /var/www/idc_assest - -# 上传目录权限 -sudo chmod -R 777 backend/uploads -``` - -### 内存不足 - -```bash -# 增加 Node.js 内存限制 -node --max-old-space-size=4096 server.js - -# PM2 配置 -pm2 start server.js --name "idc-backend" --node-args="--max-old-space-size=4096" -``` - -### Nginx 502 Bad Gateway - -1. 检查后端服务是否运行:`pm2 status` -2. 检查后端端口是否监听:`netstat -tulpn | grep 8000` -3. 检查Nginx配置:`nginx -t` -4. 查看错误日志:`tail -f /var/log/nginx/error.log` - -### SSL证书问题 - -```bash -# 检查证书是否过期 -sudo certbot certificates - -# 手动续期 -sudo certbot renew - -# 查看证书详情 -sudo certbot certificates -``` - ---- - -## 项目结构 - -``` -idc_assest/ -├── backend/ # 后端服务 -│ ├── middleware/ # 中间件(认证、验证) -│ ├── models/ # 数据模型(Sequelize) -│ ├── routes/ # API路由 -│ ├── scripts/ # 数据库脚本 -│ ├── uploads/ # 文件上传目录 -│ ├── validation/ # 数据验证Schema -│ ├── server.js # 服务入口 -│ └── package.json -├── frontend/ # 前端应用 -│ ├── src/ -│ │ ├── api/ # API接口 -│ │ ├── components/ # 组件 -│ │ ├── pages/ # 页面 -│ │ └── utils/ # 工具函数 -│ ├── dist/ # 构建输出 -│ └── package.json -├── docs/ # 项目文档 -│ ├── api/ # 接口文档 -│ └── images/ # 文档图片 -├── install.sh # Linux 安装引导脚本(Shell)⭐ -├── install.js # 交互式安装脚本(Node.js)⭐ -├── update.js # 一键更新脚本 ⭐ -├── uninstall.js # 卸载脚本 -├── check.js # 环境检查脚本 -├── modify.js # 配置修改脚本 -├── package.json -├── README.md # 项目说明 -├── CHANGELOG.md # 版本记录 -└── DEPLOYMENT.md # 本文件 -``` - ---- - -**⭐ 如果这个部署指南对您有帮助,请给我们一个Star!** diff --git a/README.md b/README.md index 9144e03..c041910 100644 --- a/README.md +++ b/README.md @@ -1,185 +1,116 @@ -# IDC设备资产系统 +# IDC设备资产管理系统 [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Node.js](https://img.shields.io/badge/Node.js-20.x-green.svg)](https://nodejs.org/) [![React](https://img.shields.io/badge/React-18.2.0-blue.svg)](https://react.dev/) -[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey.svg)]() -一个现代化的数据中心(IDC)设备管理系统,提供机房、机柜、设备的全生命周期管理,具备3D可视化展示功能。 +现代化数据中心(IDC)设备管理系统,提供机房、机柜、设备的全生命周期管理,具备 3D 可视化展示功能。 -## 代码仓库 - -- **GitHub**: https://github.com/gituib/idc_assest -- **Gitee**: https://gitee.com/zhang96110/idc_assest +**GitHub**: https://github.com/gituib/idc_assest +**Gitee**: https://gitee.com/zhang96110/idc_assest --- -## 系统概述 +## 目录 -### 核心功能 +- [功能特性](#功能特性) +- [快速开始](#快速开始) + - [Linux 一键部署](#linux-一键部署) + - [Windows 部署](#windows-部署) + - [手动安装](#手动安装) +- [环境要求](#环境要求) +- [脚本命令参考](#脚本命令参考) + - [install.js - 安装脚本](#installjs---安装脚本) + - [update.js - 更新脚本](#updatejs---更新脚本) + - [uninstall.js - 卸载脚本](#uninstalljs---卸载脚本) +- [部署指南](#部署指南) + - [生产环境](#生产环境) + - [Nginx 配置](#nginx-配置) +- [系统维护](#系统维护) + - [服务管理](#服务管理) + - [日志查看](#日志查看) + - [数据备份](#数据备份) +- [常见问题](#常见问题) +- [项目结构](#项目结构) +- [API 文档](#api-文档) +- [贡献指南](#贡献指南) +- [许可证](#许可证) -| 功能模块 | 描述 | -|---------|------| -| **机房管理** | 多机房管理,支持位置、面积、负责人等详细信息,机房平面图可视化 | -| **机柜管理** | 机柜增删改查,容量统计,3D可视化展示,批量导入/导出 | -| **设备管理** | 服务器、网络设备、存储设备全生命周期管理,支持批量导入/导出,导入预览,自定义字段搜索 | -| **端口管理** | 设备端口配置与管理,支持网卡绑定,批量导入/导出,端口命名模板 | -| **线缆管理** | 机柜间线缆连接管理,可视化追踪,线缆向导 | -| **网络拓扑** | 网络拓扑可视化展示(ReactFlow),交换机/设备拓扑查询,自定义节点 | -| **工单管理** | 故障报修、维护工单全流程管理,支持自定义字段、故障分类、工单评价、导出 | -| **耗材管理** | 耗材库存、领用记录、统计报表管理,支持SN序列号追踪、批量导入、日志归档 | -| **盘点管理** | 盘点计划制定与执行,盘点任务分配与结果记录,暂存设备管理 | -| **空闲设备** | 空闲设备管理,支持设备转入/激活空闲状态 | -| **仓库管理** | 仓库信息管理,支持仓库与耗材关联 | -| **数据看板** | 实时监控数据中心整体运行状态,设备趋势图表,功率监控 | -| **3D可视化** | 三维机柜可视化展示,支持设备悬停详情、LOD优化、性能模式、U位标识 | -| **机房平面图** | Canvas渲染机房平面图,机柜位置拖拽编辑,热力图,小地图导航 | -| **操作日志** | 操作日志审计,支持按模块/类型/时间筛选,操作统计 | -| **备份管理** | 数据库备份与恢复,自动定时备份,多协议远程备份(FTP/SFTP/WebDAV/SMB) | -| **统计分析** | 设备、工单、耗材等多维度统计报表,用户增长趋势分析 | -| **系统配置** | 设备字段、工单字段自定义管理,背景配置,系统设置导入/导出 | -| **用户权限** | 基于角色的权限控制(RBAC),用户审核机制 | -| **API文档** | Swagger交互式API文档,支持在线调试 | +--- + +## 功能特性 + +| 模块 | 描述 | +|------|------| +| 机房管理 | 多机房管理,平面图可视化 | +| 机柜管理 | 机柜增删改查,3D 可视化,批量导入导出 | +| 设备管理 | 全生命周期管理,自定义字段,批量导入导出 | +| 端口管理 | 设备端口配置,网卡绑定,批量管理 | +| 线缆管理 | 线缆连接管理,可视化追踪 | +| 网络拓扑 | 拓扑可视化展示(ReactFlow) | +| 工单管理 | 故障报修,维护工单全流程 | +| 耗材管理 | 库存管理,SN 序列号追踪,日志归档 | +| 盘点管理 | 盘点计划与执行,待审核设备 | +| 空闲设备 | 空闲设备转入/激活 | +| 数据看板 | 实时监控,功率监控,趋势图表 | +| 3D 可视化 | 三维机柜展示,LOD 优化 | +| 机房平面图 | Canvas 渲染,拖拽编辑 | +| 操作日志 | 审计追踪,统计分析 | +| 备份管理 | 本地/远程备份,自动定时 | +| 系统配置 | 自定义字段,背景配置 | +| 用户权限 | RBAC 角色控制 | +| API 文档 | Swagger 交互式文档 | ### 项目截图 +
+点击展开查看截图 + ![数据看板](docs/images/dashboard-full.png) *数据看板 - 实时监控数据中心运行状态* -![3D机柜可视化](docs/images/3d-visualization-full.png) -*3D机柜可视化 - 三维展示机柜设备布局* +![3D 机柜可视化](docs/images/3d-visualization-full.png) +*3D 机柜可视化 - 三维展示机柜设备布局* ![机房管理](docs/images/room-management-full.png) *机房管理 - 多机房分类管理* -![机柜管理](docs/images/rack-management.png) -*机柜管理 - 机柜容量与设备布局管理* - ![设备管理](docs/images/device-management-full.png) *设备管理 - 设备全生命周期管理* -![耗材管理](docs/images/consumable-management.png) -*耗材管理 - 耗材库存与领用管理* - ![工单管理](docs/images/ticket-management.png) *工单管理 - 故障报修与维护工单处理* ![数据备份](docs/images/backup-management.png) *数据备份 - 数据库备份与恢复管理* ---- - -## 技术栈 - -### 前端技术栈 - -| 技术 | 版本 | 用途 | -|------|------|------| -| React | 18.2.0 | 前端框架(用户界面开发库) | -| Vite | 4.4.9 | 构建工具(前端项目打包工具) | -| Ant Design | 5.8.6 | UI组件库(企业级设计系统) | -| Three.js | 0.183.2 | 3D渲染引擎 | -| @react-three/fiber | 8.18.0 | React Three.js 集成 | -| @react-three/drei | 9.122.0 | Three.js 辅助组件库 | -| React Router | 6.15.0 | 路由管理 | -| Axios | 1.13.6 | HTTP客户端 | -| Day.js | 1.11.19 | 日期处理库 | -| SheetJS (xlsx) | 0.18.5 | Excel文件处理 | -| PapaParse | 5.5.3 | CSV文件解析 | -| Framer Motion | 12.34.0 | 动画库 | -| Styled Components | 6.3.9 | CSS-in-JS 样式方案 | -| SWR | 2.4.0 | 数据请求与缓存 | -| @ant-design/icons | 6.1.0 | 图标库 | -| Vitest | 4.0.16 | 前端测试框架 | - -### 后端技术栈 - -| 技术 | 版本 | 用途 | -|------|------|------| -| Node.js | ≥14.0.0(推荐 20.x LTS) | 运行环境 | -| Express | 4.18.2 | Web框架(后端服务框架) | -| Sequelize | 6.37.8 | ORM框架(数据库对象关系映射) | -| SQLite | 5.1.7 | 嵌入式数据库(开发/小规模) | -| MySQL | 8.0+ | 关系型数据库(生产环境) | -| JWT | 9.0.3 | 身份认证 | -| bcryptjs | 3.0.3 | 密码加密 | -| Winston | 3.19.0 | 日志管理 | -| Winston Daily Rotate File | 5.0.0 | 日志文件轮转 | -| Joi | 18.0.2 | 数据验证 | -| Jest | 30.2.0 | 测试框架 | -| Multer | 2.1.1 | 文件上传处理 | -| Express File Upload | 1.5.2 | 文件上传中间件 | -| Node Cron | 4.2.1 | 定时任务调度 | -| Axios | 1.13.6 | HTTP客户端 | -| CSV Parser | 3.2.0 | CSV文件解析 | -| CSV Writer | 1.6.0 | CSV文件生成 | -| SheetJS (xlsx) | 0.18.5 | Excel文件处理 | -| Day.js | 1.11.19 | 日期处理库 | -| Basic FTP | 5.0.3 | FTP协议支持 | -| SSH2 SFTP Client | 9.1.0 | SFTP协议支持 | -| WebDAV | 5.3.1 | WebDAV协议支持 | -| SMB2 | 0.2.2 | SMB/CIFS协议支持 | -| MySQL2 | 3.19.1 | MySQL数据库驱动 | -| Nodemon | 3.0.1 | 开发环境自动重启 | -| Supertest | 7.1.4 | API测试工具 | - ---- - -## 环境要求 - -### 运行环境 - -| 项目 | 最低要求 | 推荐配置 | -|------|----------|----------| -| **操作系统** | Windows 10/11、macOS 12+、Linux (Ubuntu 20.04+/CentOS 8+) | 同最低要求 | -| **Node.js** | ≥14.0.0 | 20.x LTS | -| **npm** | ≥6.0.0 | 10.x | -| **内存** | 4GB | 8GB+ | -| **磁盘空间** | 2GB | 10GB+ | - -### 生产环境额外要求 - -| 项目 | 要求 | -|------|------| -| **数据库** | MySQL 8.0+ (推荐) 或 SQLite (小型部署) | -| **Web服务器** | Nginx 1.18+ (反向代理/静态文件服务) | -| **进程管理** | PM2 5.x+ | -| **SSL证书** | Let's Encrypt (可选) | - -### 开发环境要求 - -| 项目 | 要求 | -|------|------| -| **代码编辑器** | VS Code (推荐) | -| **浏览器** | Chrome 90+、Firefox 90+、Safari 14+、Edge 90+ | -| **Git** | 2.30+ | +
--- ## 快速开始 -### 方式一:一键部署脚本(推荐)⭐ - -我们提供了交互式安装脚本,自动完成所有部署步骤。 - -#### Linux 用户(支持自动安装 Node.js) +### Linux 一键部署 ```bash -# 克隆项目(选择其一) -# Gitee(国内推荐) +# 克隆项目 git clone https://gitee.com/zhang96110/idc_assest.git -# GitHub -git clone https://github.com/gituib/idc_assest.git cd idc_assest -# 方式1:使用 Shell 引导脚本(推荐,无需预装 Node.js) -chmod +x install.sh && ./install.sh +# 运行安装脚本(自动安装 Node.js) +./install.sh -# 方式2:一键安装(从远程) +# 或一键安装(无需克隆) curl -fsSL https://gitee.com/zhang96110/idc_assest/raw/main/install.sh | bash ``` -#### Windows 用户 +**install.sh 自动完成**: +- 自动检测 Linux 发行版(Ubuntu/Debian/CentOS/Arch) +- 自动安装 Node.js 20.x +- 自动安装系统依赖(git、curl) +- 调用 install.js 完成后续安装 + +### Windows 部署 ```powershell # 克隆项目 @@ -189,505 +120,94 @@ cd idc_assest # 运行安装脚本(需要先安装 Node.js) node install.js -# 或使用 npm 命令 +# 或使用 npm npm run deploy ``` -#### 非交互式安装(快速部署) +### 手动安装 ```bash -# 使用默认配置快速安装 -node install.js -y # 交互式安装 +# 1. 克隆项目 +git clone https://gitee.com/zhang96110/idc_assest.git +cd idc_assest + +# 2. 安装依赖 +npm run install:all + +# 3. 配置环境变量 +cp backend/.env.example backend/.env + +# 4. 配置 JWT 密钥(必填) +# 编辑 backend/.env,设置 JWT_SECRET 为强随机字符串 +# 生成命令:openssl rand -hex 64(Linux/macOS) +# 或:node -e "console.log(require('crypto').randomBytes(64).toString('hex'))" + +# 5. 初始化数据库 +cd backend && node scripts/init-database.js + +# 6. 启动服务 +cd .. && npm start +``` + +**访问地址**:http://localhost:3000 +**默认账号**:首次注册自动成为管理员 + +--- + +## 环境要求 + +| 项目 | 最低要求 | 推荐配置 | +|------|----------|----------| +| **操作系统** | Windows 10+、macOS 12+、Linux | 同最低 | +| **Node.js** | ≥14.0.0 | 20.x LTS | +| **npm** | ≥6.0.0 | 10.x | +| **内存** | 4GB | 8GB+ | +| **磁盘** | 2GB | 10GB+ | + +**生产环境额外要求**: + +| 项目 | 要求 | +|------|------| +| 数据库 | MySQL 8.0+(推荐)或 SQLite | +| Web 服务器 | Nginx 1.18+ | +| 进程管理 | PM2 5.x+ | + +--- + +## 脚本命令参考 + +### install.js - 安装脚本 + +```bash +# 交互式安装 +node install.js + +# 非交互式安装 +node install.js -y # 指定数据库类型 -node install.js -y --db=mysql # 使用 MySQL -node install.js -y --db=sqlite # 使用 SQLite(默认) +node install.js -y --db=mysql # 使用 MySQL +node install.js -y --db=sqlite # 使用 SQLite(默认) # 指定端口 -node install.js -y --port=3000 # 后端端口 3000 +node install.js -y --port=8000 # 后端端口 # 跳过前端构建 node install.js -y --skip-build + +# 跳过 Nginx 配置 +node install.js -y --skip-nginx + +# 查看帮助 +node install.js --help ``` -**脚本功能:** -- ✅ 自动检测 Node.js、npm、PM2、Nginx -- ✅ **Linux 自动安装 Node.js**(Ubuntu/Debian/CentOS/Arch) -- ✅ **MySQL 连接测试**(配置后自动验证) -- ✅ **安装后健康检查**(验证服务是否正常) -- ✅ 交互式配置数据库(SQLite/MySQL) -- ✅ 交互式选择运行环境(development/production) -- ✅ 交互式选择前端部署方式(Nginx/PM2 serve) -- ✅ 自动安装项目依赖 -- ✅ 自动初始化数据库 -- ✅ 自动构建前端项目 -- ✅ 使用 PM2 启动和管理服务 -- ✅ 日志持久化保存 - -### 方式二:手动安装 - -#### 1. 克隆项目 - -```bash -# 选择其一 -# Gitee(国内推荐) -git clone https://gitee.com/zhang96110/idc_assest.git -# GitHub -git clone https://github.com/gituib/idc_assest.git -cd idc_assest -``` - -#### 2. 安装依赖 - -```bash -# 一键安装所有依赖(推荐) -npm run install:all - -# 或分别安装 -# 安装后端依赖 -cd backend -npm install - -# 安装前端依赖 -cd ../frontend -npm install -``` - -#### 3. 配置环境变量 - -```bash -cd ../backend -cp .env.example .env -``` - -根据需要编辑 `.env` 文件(开发环境使用默认 SQLite 配置即可): - -```env -# 开发环境配置示例 -NODE_ENV=development -PORT=8000 -DB_TYPE=sqlite -DB_PATH=./idc_management.db -``` - -#### 4. 初始化数据库 - -```bash -node scripts/init-database.js -``` - -#### 5. 数据库迁移 - -当项目更新后,可能需要执行数据库迁移脚本以更新表结构。迁移脚本支持幂等执行,重复执行不会出错。 - -**执行迁移脚本:** -```bash -cd backend -node scripts/migrate-all.js -``` - -**迁移脚本包含以下内容:** -| 迁移名称 | 说明 | -|----------|------| -| v2.0 - 网卡和端口表 | 创建 network_cards 表,为 device_ports 添加 nic_id 字段 | -| 用户表 pending 状态 | 为用户表添加 pending 状态支持 | -| 耗材乐观锁 | 为 consumables 表添加 version 字段 | -| 耗材操作日志表结构 | 添加 isEditable、originalLogId 等修改记录字段 | -| 耗材日志解耦 | 添加 isConsumableDeleted 和 consumableSnapshot 字段 | -| 移除日志外键约束 | 移除 consumable_logs 表的外键约束,防止级联删除 | -| 耗材日志归档表 | 创建 consumable_log_archives 归档表 | -| 耗材SN序列号字段 | 为 consumables、consumable_records、consumable_logs 添加 snList 字段 | - -**注意事项:** -- 迁移脚本支持 SQLite 和 MySQL 两种数据库 -- 建议在执行迁移前备份数据库 -- 迁移脚本会自动检测已执行的迁移,避免重复执行 - -#### 6. 启动服务 - -**开发环境(同时启动前后端):** -```bash -# 在项目根目录运行 -npm start -``` - -**或分别启动:** -```bash -# 启动后端(端口8000) -cd backend -npm run dev - -# 启动前端(端口3000)- 新终端 -cd ../frontend -npm run dev -``` - -**访问地址:** -- 前端应用:http://localhost:3000 -- 后端API:http://localhost:8000/api -- API文档:http://localhost:8000/api-docs -- 健康检查:http://localhost:8000/health - ---- - -## 基本使用方法 - -### 首次登录 - -系统采用**首次注册自动成为管理员**的机制: - -- 第一个注册的用户会自动获得「管理员」角色 -- 后续注册的用户默认为「访客」角色,需要管理员审核后才能激活 -- 首次访问系统时,请通过注册功能创建管理员账号 - -**注册方式:** -1. 打开系统登录页面 -2. 点击「注册账号」链接 -3. 填写用户名、密码、邮箱等信息 -4. 提交后自动登录,成为系统管理员 - -> ⚠️ **安全建议**:首次登录后请立即修改默认密码! - -### 常用操作指南 - -#### 1. 机房管理 - -- 进入「机房管理」页面,点击「新增机房」按钮 -- 填写机房名称、位置、面积、负责人等信息 -- 支持机房图片上传 - -#### 2. 机柜管理 - -- 在机房详情页或「机柜管理」页面管理机柜 -- 设置机柜高度(U数)、位置坐标 -- 查看机柜容量使用情况 - -#### 3. 设备管理 - -- 「设备管理」页面进行设备增删改查 -- 支持 Excel/CSV 批量导入设备 -- 设备状态:采购中 → 待安装 → 运行中 → 维护中 → 已报废 - -#### 4. 3D可视化 - -- 进入「3D可视化」页面查看机房3D模型 -- 支持鼠标拖拽旋转、滚轮缩放 -- 悬停设备查看详情,点击设备弹出操作面板 - -#### 5. 工单管理 - -- 创建故障报修或维护工单 -- 分配负责人,设置优先级 -- 记录处理过程,更新工单状态 - -#### 6. 耗材管理 - -- 管理耗材库存,设置库存预警阈值 -- 记录耗材领用,追踪使用去向 -- 查看耗材统计报表 -- 支持SN序列号追踪 -- 耗材操作日志归档 - -#### 7. 备份管理 - -- **手动备份**:立即创建数据库备份 -- **自动备份**:配置定时自动备份(支持cron表达式) -- **备份恢复**:从备份文件恢复数据库 -- **远程备份**:支持多种协议(FTP/SFTP/WebDAV/SMB)上传备份到远程服务器 -- **备份列表**:查看和管理所有备份文件 - -#### 8. 统计分析 - -- **设备统计**:设备总数、状态分布、趋势图表 -- **工单统计**:工单数量、处理时效、分类统计 -- **耗材统计**:库存状况、领用趋势、分类统计 -- **用户统计**:用户增长趋势、活跃用户分析 -- **数据看板**:实时展示关键指标 - ---- - -## 项目结构 - -``` -jigui/ -├── frontend/ # 前端项目 -│ ├── src/ -│ │ ├── api/ # API接口封装 -│ │ │ ├── index.js # API请求封装 -│ │ │ └── cache.js # 缓存管理 -│ │ ├── components/ # 通用组件 -│ │ │ ├── 3d/ # 3D可视化组件 -│ │ │ │ ├── materials/ # 3D材质组件 -│ │ │ │ │ ├── TextureCache.js # 纹理缓存 -│ │ │ │ │ ├── constants.jsx -│ │ │ │ │ ├── devicePanel.jsx -│ │ │ │ │ ├── index.jsx -│ │ │ │ │ ├── rackFrame.jsx -│ │ │ │ │ └── utils.jsx -│ │ │ │ ├── CascadingRackPanel.jsx # 级联机柜面板 -│ │ │ │ ├── DeviceModel.jsx # 设备模型 -│ │ │ │ ├── RackModel.jsx # 机柜模型 -│ │ │ │ ├── RackSelectorHeader.jsx # 机柜选择头部 -│ │ │ │ ├── Scene.jsx # 3D场景 -│ │ │ │ └── LODManager.jsx # LOD管理器 -│ │ │ ├── dashboard/ # 数据看板组件 -│ │ │ │ ├── AnimatedCounter.jsx -│ │ │ │ ├── CircularProgress.jsx -│ │ │ │ ├── DeviceTrendChart.jsx -│ │ │ │ ├── NavigationGrid.jsx -│ │ │ │ ├── PowerGauge.jsx -│ │ │ │ ├── QuickStats.jsx -│ │ │ │ ├── StatCard.jsx -│ │ │ │ ├── StatusLegend.jsx -│ │ │ │ └── SystemInfo.jsx -│ │ │ ├── device/ # 设备管理组件 -│ │ │ │ ├── BatchStatusModal.jsx -│ │ │ │ ├── DeviceDetailModal.jsx -│ │ │ │ ├── DeviceFormModal.jsx -│ │ │ │ ├── ExportModal.jsx -│ │ │ │ ├── FieldConfigModal.jsx -│ │ │ │ ├── ImportModal.jsx -│ │ │ │ └── ResizableTitle.jsx -│ │ │ ├── CableCreateModal.jsx -│ │ │ ├── CableWizardModal.jsx -│ │ │ ├── CloseButton.jsx -│ │ │ ├── ConsumableTimelineModal.jsx -│ │ │ ├── DangerConfirmModal.jsx -│ │ │ ├── DeviceDetailDrawer.jsx -│ │ │ ├── ErrorBoundary.jsx -│ │ │ ├── FilterableDeviceSelect.jsx -│ │ │ ├── MaintenanceBanner.jsx -│ │ │ ├── NetworkCardCreateModal.jsx -│ │ │ ├── NetworkCardImportModal.jsx -│ │ │ ├── NetworkCardPanel.jsx -│ │ │ ├── PortAddGuideModal.jsx -│ │ │ ├── PortCreateModal.jsx -│ │ │ ├── PortExportModal.jsx -│ │ │ ├── PortManagementPanel.jsx -│ │ │ ├── PortPanel.jsx -│ │ │ ├── ProtectedRoute.jsx -│ │ │ ├── ServerBackplanePanel.jsx -│ │ │ ├── ServerNicCard.jsx -│ │ │ ├── TicketExportModal.jsx -│ │ │ └── VirtualDeviceList.jsx -│ │ ├── config/ # 配置文件 -│ │ │ ├── api.js # API配置 -│ │ │ └── theme.js # 主题配置 -│ │ ├── constants/ # 常量定义 -│ │ │ └── deviceManagementConstants.js -│ │ ├── context/ # React Context状态管理 -│ │ │ ├── AuthContext.jsx # 认证上下文 -│ │ │ ├── ConfigContext.jsx # 配置上下文 -│ │ │ └── Scene3DContext.jsx # 3D场景上下文 -│ │ ├── hooks/ # 自定义Hooks -│ │ │ ├── useApi.js # API请求Hook -│ │ │ ├── useDebounce.js # 防抖Hook -│ │ │ ├── useDesignTokens.js # 设计令牌Hook -│ │ │ ├── useIdleTimeout.js # 空闲超时Hook -│ │ │ └── useSWR.js # SWR数据请求Hook -│ │ ├── pages/ # 页面模块 -│ │ │ ├── Dashboard.jsx # 数据看板 -│ │ │ ├── Login.jsx # 登录页面 -│ │ │ ├── RoomManagement.jsx # 机房管理 -│ │ │ ├── RoomFloorPlan.jsx # 机房平面图 -│ │ │ ├── RackManagement.jsx # 机柜管理 -│ │ │ ├── DeviceManagement.jsx # 设备管理 -│ │ │ ├── DeviceFieldManagement.jsx # 设备字段管理 -│ │ │ ├── IdleDeviceManagement.jsx # 空闲设备管理 -│ │ │ ├── PendingDeviceManagement.jsx # 待审核设备管理 -│ │ │ ├── PortManagement.jsx # 端口管理 -│ │ │ ├── CableManagement.jsx # 线缆管理 -│ │ │ ├── TicketManagement.jsx # 工单管理 -│ │ │ ├── TicketCategoryManagement.jsx # 工单分类管理 -│ │ │ ├── TicketFieldManagement.jsx # 工单字段管理 -│ │ │ ├── TicketStatistics.jsx # 工单统计 -│ │ │ ├── ConsumableManagement.jsx # 耗材管理 -│ │ │ ├── CategoryManagement.jsx # 耗材分类管理 -│ │ │ ├── ConsumableLogs.jsx # 耗材日志 -│ │ │ ├── ConsumableStatistics.jsx # 耗材统计 -│ │ │ ├── InventoryManagement.jsx # 盘点管理 -│ │ │ ├── InventoryTaskExecution.jsx # 盘点任务执行 -│ │ │ ├── OperationLogs.jsx # 操作日志 -│ │ │ ├── UserManagement.jsx # 用户管理 -│ │ │ ├── RolesManagement.jsx # 角色管理 -│ │ │ ├── SystemSettings.jsx # 系统设置 -│ │ │ ├── BackupManagement.jsx # 备份管理 -│ │ │ ├── AutoBackupSettings.jsx # 自动备份设置 -│ │ │ ├── RemoteBackupSettings.jsx # 远程备份设置 -│ │ │ ├── Rack3DVisualization.jsx # 3D可视化 -│ │ │ └── ErrorBoundaryTest.jsx # 错误边界测试 -│ │ ├── styles/ # 样式文件 -│ │ │ └── deviceManagementStyles.js -│ │ ├── utils/ # 工具函数 -│ │ │ ├── common.js -│ │ │ ├── crypto.js -│ │ │ └── deviceUtils.jsx -│ │ ├── App.jsx # 应用入口 -│ │ ├── main.jsx # 渲染入口 -│ │ └── index.css # 全局样式 -│ ├── public/ # 公共资源 -│ │ ├── assets/3d/ # 3D资源 -│ │ │ └── env.hdr # 环境贴图 -│ │ └── fonts/ # 字体文件 -│ │ └── Inter-Regular.woff2 -│ ├── vite.config.mjs # Vite配置 -│ ├── .env.example # 环境变量示例 -│ └── package.json # 前端依赖 -├── backend/ # 后端项目 -│ ├── config/ # 配置文件 -│ │ ├── index.js # 配置统一导出 -│ │ ├── constants.js # 常量配置 -│ │ ├── routes.js # 路由注册配置 -│ │ ├── security.js # 安全配置 -│ │ ├── auto-backup-settings.json # 自动备份设置 -│ │ └── remote-backup-configs.json # 远程备份配置 -│ ├── middleware/ # 中间件 -│ │ ├── auth.js # 认证中间件 -│ │ └── validation.js # 验证中间件 -│ ├── models/ # 数据模型(Sequelize) -│ │ ├── Room.js # 机房模型 -│ │ ├── Rack.js # 机柜模型 -│ │ ├── Device.js # 设备模型 -│ │ ├── DeviceField.js # 设备字段模型 -│ │ ├── DevicePort.js # 设备端口模型 -│ │ ├── NetworkCard.js # 网卡模型 -│ │ ├── Cable.js # 线缆模型 -│ │ ├── Ticket.js # 工单模型 -│ │ ├── TicketField.js # 工单字段模型 -│ │ ├── TicketCategory.js # 工单分类模型 -│ │ ├── TicketOperationRecord.js # 工单操作记录模型 -│ │ ├── FaultCategory.js # 故障分类模型 -│ │ ├── Consumable.js # 耗材模型 -│ │ ├── ConsumableCategory.js # 耗材分类模型 -│ │ ├── ConsumableRecord.js # 耗材领用记录模型 -│ │ ├── ConsumableLog.js # 耗材日志模型 -│ │ ├── ConsumableLogArchive.js # 耗材日志归档模型 -│ │ ├── InventoryPlan.js # 盘点计划模型 -│ │ ├── InventoryTask.js # 盘点任务模型 -│ │ ├── InventoryRecord.js # 盘点记录模型 -│ │ ├── User.js # 用户模型 -│ │ ├── Role.js # 角色模型 -│ │ ├── Permission.js # 权限模型 -│ │ ├── UserRole.js # 用户角色关联模型 -│ │ ├── SystemSetting.js # 系统设置模型 -│ │ ├── PendingDevice.js # 待审核设备模型 -│ │ ├── OperationLog.js # 操作日志模型 -│ │ ├── BackupLog.js # 备份日志模型 -│ │ ├── Warehouse.js # 仓库模型 -│ │ ├── Business.js # 业务模型 -│ │ ├── DeviceBusiness.js # 设备业务关联模型 -│ │ └── ticketIndex.js # 工单模型初始化 -│ ├── routes/ # API路由 -│ │ ├── auth.js # 认证路由 -│ │ ├── rooms.js # 机房路由 -│ │ ├── racks.js # 机柜路由 -│ │ ├── devices.js # 设备路由 -│ │ ├── deviceFields.js # 设备字段路由 -│ │ ├── devicePorts.js # 设备端口路由 -│ │ ├── networkCards.js # 网卡路由 -│ │ ├── cables.js # 线缆路由 -│ │ ├── tickets.js # 工单路由 -│ │ ├── ticketCategories.js # 工单分类路由 -│ │ ├── ticketFields.js # 工单字段路由 -│ │ ├── consumables.js # 耗材路由 -│ │ ├── consumableCategories.js # 耗材分类路由 -│ │ ├── consumableRecords.js # 耗材记录路由 -│ │ ├── consumableImport.js # 耗材导入路由 -│ │ ├── inventory.js # 盘点路由 -│ │ ├── users.js # 用户路由 -│ │ ├── roles.js # 角色路由 -│ │ ├── systemSettings.js # 系统设置路由 -│ │ ├── background.js # 背景配置路由 -│ │ ├── backup.js # 备份管理路由 -│ │ ├── statistics.js # 统计分析路由 -│ │ ├── operationLogs.js # 操作日志路由 -│ │ ├── idleDevices.js # 空闲设备路由 -│ │ ├── warehouses.js # 仓库管理路由 -│ │ ├── dangerousOperations.js # 危险操作路由 -│ │ ├── topology.js # 拓扑管理路由 -│ │ └── ticketCategories.js # 工单分类路由 -│ ├── scripts/ # 数据库脚本 -│ │ ├── init-database.js # 数据库初始化 -│ │ ├── migrate-all.js # 执行所有迁移脚本 -│ │ ├── fix-foreign-keys.js # 外键约束修复 -│ │ ├── migrate-logs.js # 日志迁移 -│ │ ├── migrate-cable-fields.js # 线缆字段迁移 -│ │ ├── archive/ # 归档迁移脚本 -│ │ │ ├── migrate-v2.js -│ │ │ ├── migrate-consumable-logs.js -│ │ │ ├── migrate-consumable-version.js -│ │ │ ├── migrate-consumable-log-decouple.js -│ │ │ ├── migrate-consumable-log-archive.js -│ │ │ ├── remove-consumable-log-fk.js -│ │ │ └── migrate-add-pending-status.js -│ │ ├── backup.js # 备份脚本 -│ │ ├── restore.js # 恢复脚本 -│ │ ├── ensure_nic_schema.js # 确保网卡表结构 -│ │ ├── add-isSystem-column.js -│ │ ├── add-isSystem-mysql.js -│ │ ├── add-isSystem-sqlite.js -│ │ ├── update-system-fields.js -│ │ ├── update-system-fields-v2.js -│ │ └── generate-rack-import-template.js -│ ├── utils/ # 工具函数 -│ │ ├── autoBackupScheduler.js # 自动备份调度器 -│ │ ├── backup.js # 备份工具 -│ │ ├── remoteBackup.js # 远程备份工具 -│ │ └── remoteBackupConfig.js # 远程备份配置 -│ ├── validation/ # 数据验证Schema -│ │ ├── deviceSchema.js -│ │ ├── rackSchema.js -│ │ └── roomSchema.js -│ ├── uploads/ # 文件上传目录 -│ │ └── avatars/ # 用户头像目录 -│ ├── .env.example # 环境变量示例 -│ ├── server.js # 服务入口 -│ ├── db.js # 数据库连接 -│ ├── initConfig.js # 初始化配置 -│ ├── initDeviceFields.js # 初始化设备字段 -│ ├── initTicketFields.js # 初始化工单字段 -│ ├── create_indexes.js # 创建数据库索引 -│ ├── backgroundSettings.json # 背景设置 -│ ├── unlock_user.js # 用户解锁脚本 -│ └── package.json # 后端依赖 -├── docs/ # 项目文档 -│ ├── api/ # 接口文档 -│ │ └── README.md -│ ├── images/ # 文档图片 -│ │ ├── dashboard.png -│ │ ├── 3d-visualization.png -│ │ ├── device-management.png -│ │ └── room-management.png -│ └── USER_GUIDE.md # 用户指南 -├── scripts/ # 项目脚本 -│ └── frontend-manager.js # 前端管理脚本 -├── install.sh # Linux 安装引导脚本(Shell)⭐ -├── install.js # 交互式安装脚本(Node.js)⭐ -├── update.js # 一键更新脚本 ⭐ -├── uninstall.js # 卸载脚本 -├── package.json # 项目根依赖 -├── README.md # 项目说明 -├── CHANGELOG.md # 版本记录 -├── DEPLOYMENT.md # 部署指南 -├── LICENSE # 许可证 -├── .eslintrc.js # ESLint配置 -├── .prettierrc # Prettier配置 -└── .prettierignore # Prettier忽略文件 -``` - ---- - -## 更新升级 - -### 一键更新(推荐)⭐ +### update.js - 更新脚本 ```bash # 交互式更新 node update.js -# 查看帮助 -node update.js --help - # 模拟运行(不执行实际操作) node update.js --dry-run @@ -695,254 +215,412 @@ node update.js --dry-run node update.js --skip-git # 跳过 Git 拉取 node update.js --skip-backup # 跳过数据库备份 node update.js --skip-migrate # 跳过数据库迁移 -node update.js --skip-build # 跳过前端构建 +node update.js --skip-build # 跳过前端构建 node update.js --skip-deps # 跳过依赖安装 node update.js --skip-restart # 跳过服务重启 # 强制执行(忽略锁文件) node update.js --force + +# 查看帮助 +node update.js --help ``` -**智能检测功能:** -- ✅ **依赖安装智能跳过** - 检测 package.json 变化,无变化则跳过 -- ✅ **前端构建智能跳过** - 检测源码变化,无变化则跳过 -- ✅ **数据库自动备份** - 更新前自动备份,支持回滚 -- ✅ **健康检查验证** - 更新后验证服务是否正常 -- ✅ **日志持久化** - 更新日志保存到 `logs/update_*.log` -- ✅ **锁机制** - 防止多个更新进程同时运行 +**智能检测功能**: +- 依赖安装智能跳过(检测 package.json 变化) +- 前端构建智能跳过(检测源码变化) +- 数据库自动备份(支持回滚) +- 健康检查验证 +- 日志持久化保存到 `logs/update_*.log` +- 锁机制防止重复运行 -### 手动更新 - -```bash -# 1. 拉取最新代码 -git pull - -# 2. 更新后端依赖 -cd backend && npm install - -# 3. 更新前端依赖并构建 -cd ../frontend && npm install && npm run build - -# 4. 重启服务 -pm2 restart idc-backend -``` - ---- - -## 卸载系统 - -### 一键卸载(推荐)⭐ +### uninstall.js - 卸载脚本 ```bash # 交互式卸载 node uninstall.js -# 查看帮助 -node uninstall.js --help - # 强制卸载(无需确认) node uninstall.js --force -# 卸载前自动备份 +# 卸载前自动备份数据库 node uninstall.js --backup # 跳过某些步骤 -node uninstall.js --skip-db # 跳过数据库删除 -node uninstall.js --skip-deps # 跳过依赖删除 +node uninstall.js --skip-db # 跳过数据库删除 +node uninstall.js --skip-deps # 跳过依赖删除 +node uninstall.js --skip-uploads # 跳过上传文件删除 + +# 预览模式(不实际执行) +node uninstall.js --dry-run + +# 查看帮助 +node uninstall.js --help ``` -**卸载功能:** -- ✅ 停止并删除 PM2 服务 -- ✅ 清理 Nginx 配置 -- ✅ 删除生成的配置文件 -- ✅ 可选删除数据库文件 -- ✅ 可选删除 node_modules -- ✅ 卸载前自动备份 -- ✅ 日志持久化保存 - --- -## API接口 - -完整交互式API文档请访问:**http://localhost:8000/api-docs** - -该文档基于Swagger/OpenAPI 3.0标准,提供: -- 📚 可视化API文档界面 -- 🔐 在线JWT认证测试 -- ⚡ 支持直接在线调试API接口 -- 📊 自动同步最新接口信息 - ---- - -## 部署 - -详细部署指南请参考 [DEPLOYMENT.md](DEPLOYMENT.md)。 - -### 开发环境 - -默认使用SQLite数据库,无需额外配置即可启动。 +## 部署指南 ### 生产环境 -- 推荐使用MySQL数据库 -- 使用Nginx作为反向代理 -- 配置SSL证书(可选) -- 建议使用PM2管理进程 +生产环境部署只需运行 `./install.sh` 或 `node install.js`,脚本会自动完成所有配置。 -### 服务管理命令 +**仅需提前准备 MySQL 数据库**(如使用 MySQL): + +```sql +-- 创建数据库 +CREATE DATABASE idc_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- 创建用户 +CREATE USER 'idc_user'@'localhost' IDENTIFIED BY 'YourStrongPassword'; +GRANT ALL PRIVILEGES ON idc_management.* TO 'idc_user'@'localhost'; +FLUSH PRIVILEGES; +``` + +**服务器要求参考**: + +| 规模 | CPU | 内存 | 磁盘 | +|------|-----|------|------| +| 小型(<100 设备) | 2 核心 | 4GB | 40GB | +| 中型(100-500 设备) | 4 核心 | 8GB | 80GB | +| 大型(>500 设备) | 8 核心+ | 16GB+ | 100GB+ | + + + +### Nginx 配置 + +`install.js` 会自动配置 Nginx。配置文件位于 `deploy/nginx-idc.conf`,核心配置如下: + +```nginx +server { + listen 80; + server_name your-domain.com; + + client_max_body_size 100M; + + root "/var/www/idc"; + index index.html; + + # Gzip 压缩 + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied any; + gzip_comp_level 6; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json application/x-javascript image/svg+xml; + + # 静态资源缓存(1年) + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|hdr)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + try_files $uri =404; + } + + # API 代理 + location /api/ { + proxy_pass http://127.0.0.1:8000/api/; + proxy_http_version 1.1; + 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_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 300s; + proxy_buffering off; + } + + # 文件上传代理 + location /uploads/ { + proxy_pass http://127.0.0.1:8000/uploads/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + client_max_body_size 100M; + } + + # 前端路由(SPA) + location / { + try_files $uri $uri/ /index.html =404; + } +} +``` + +**启用配置**: ```bash -# 查看服务状态 -pm2 status - -# 查看日志 -pm2 logs idc-backend -pm2 logs idc-frontend - -# 重启服务 -pm2 restart idc-backend -pm2 restart idc-frontend - -# 停止服务 -pm2 stop idc-backend - -# 删除服务 -pm2 delete idc-backend +# Ubuntu/Debian +sudo cp deploy/nginx-idc.conf /etc/nginx/sites-available/idc +sudo ln -sf /etc/nginx/sites-available/idc /etc/nginx/sites-enabled/idc +sudo rm -f /etc/nginx/sites-enabled/default +sudo nginx -t && sudo nginx -s reload ``` --- +## 系统维护 + +### 服务管理 + +```bash +# PM2 服务 +pm2 status # 查看状态 +pm2 logs idc-backend # 查看日志 +pm2 restart idc-backend # 重启服务 +pm2 stop idc-backend # 停止服务 +pm2 delete idc-backend # 删除服务 +pm2 save # 保存配置 +pm2 startup # 开机自启 + +# Nginx +sudo nginx -t # 测试配置 +sudo nginx -s reload # 重载配置 +sudo systemctl restart nginx # 重启服务 +``` + +### 日志查看 + +```bash +# PM2 日志 +pm2 logs idc-backend +pm2 logs idc-backend --err # 仅错误日志 + +# Nginx 日志 +sudo tail -f /var/log/nginx/error.log + +# 应用日志 +tail -f backend/logs/*.log +``` + +### 数据备份 + +```bash +# 内置备份 +# 系统管理 → 备份管理 → 创建备份 + +# 命令行备份 +cd backend && node scripts/backup.js + +# 还原 +cd backend && node scripts/restore.js +``` + +--- + +## 常见问题 + +
+1. 端口冲突(8000、3000、80) + +```bash +# 检查端口占用(Linux) +netstat -tulpn | grep :8000 + +# Windows +netstat -ano | findstr :8000 + +# 方案1:修改端口(编辑 backend/.env) +PORT=8001 + +# 方案2:停止占用进程 +sudo kill $(lsof -t -i:8000) +``` +
+ +
+2. 502 Bad Gateway + +1. 检查后端服务:`pm2 status` +2. 检查端口监听:`netstat -tulpn | grep 8000` +3. 检查 Nginx 配置:`nginx -t` +4. 查看错误日志:`tail /var/log/nginx/error.log` +
+ +
+3. 前端构建失败 + +```bash +# 检查 Node.js 版本 +node -v # 需要 ≥18.x + +# 清理并重试 +cd frontend +rm -rf node_modules dist +npm install +npm run build +``` +
+ +
+4. 数据库连接失败 + +**MySQL**: +- 检查服务状态:`sudo systemctl status mysql` +- 验证连接参数(主机、端口、用户名、密码) +- 确认数据库已创建:`SHOW DATABASES;` +- 检查用户权限:`SHOW GRANTS FOR 'idc_user'@'localhost';` +
+ +
+5. 权限问题 + +```bash +# 修复文件权限 +sudo chown -R $(whoami):$(whoami) /path/to/idc_assest + +# 上传目录权限 +sudo chmod -R 777 backend/uploads +``` +
+ +
+6. 内存不足 + +```bash +# 增加内存限制(编辑 ecosystem.config.js) +node_args: "--max-old-space-size=4096" + +# 或命令行 +pm2 restart idc-backend --update-env +``` +
+ +
+7. npm 安装失败 + +```bash +# 清理缓存 +npm cache clean --force + +# 删除后重装 +rm -rf node_modules package-lock.json +npm install +``` +
+ +
+8. PM2 服务消失 + +```bash +# 重新启动 +pm2 start ecosystem.config.js +pm2 save +pm2 startup +``` +
+ +
+9. 忘记管理员密码 + +重置密码或创建新管理员: + +```bash +cd backend +node scripts/init-database.js --reset-admin +``` +
+ +--- + +## 项目结构 + +``` +idc_assest/ +├── frontend/ # 前端项目 +│ ├── src/ +│ │ ├── api/ # API 接口 +│ │ ├── components/ # 组件(3d/、dashboard/、device/、floorplan/) +│ │ ├── pages/ # 页面 +│ │ ├── hooks/ # 自定义 Hooks +│ │ ├── stores/ # 状态管理 +│ │ └── utils/ # 工具函数 +│ └── package.json +├── backend/ # 后端项目 +│ ├── models/ # Sequelize 数据模型 +│ ├── routes/ # API 路由 +│ ├── middleware/ # 中间件 +│ ├── scripts/ # 数据库脚本(init-database.js、migrate-all.js) +│ ├── utils/ # 工具函数 +│ ├── uploads/ # 上传文件目录 +│ ├── server.js # 服务入口 +│ └── package.json +├── deploy/ # 部署配置 +│ ├── ecosystem.config.js # PM2 配置 +│ └── nginx-idc.conf # Nginx 配置 +├── install/ # 安装脚本模块 +├── docs/ # 项目文档 +├── install.sh # Linux 安装引导脚本 +├── install.js # 安装脚本入口 +├── update.js # 更新脚本 +├── uninstall.js # 卸载脚本 +└── README.md # 本文件 +``` + +--- + +## API 文档 + +完整交互式 API 文档访问:**http://localhost:8000/api-docs** + +基于 Swagger/OpenAPI 3.0 标准,支持在线认证测试和 API 调试。 + +--- + ## 贡献指南 -欢迎提交 Issue 或 Pull Request 为项目贡献力量。 +欢迎提交 Issue 或 Pull Request! -### 贡献流程 +```bash +# 1. Fork 本项目 -1. **Fork 本项目** +# 2. 克隆你的 Fork +git clone https://github.com/YOUR_USERNAME/idc_assest.git +cd idc_assest -2. **克隆 Fork 的仓库** +# 3. 创建分支 +git checkout -b feature/your-feature # 功能开发 +git checkout -b fix/your-fix # Bug 修复 - ```bash - git clone https://github.com/YOUR_USERNAME/idc_assest.git - cd idc_assest - ``` +# 4. 开发并提交 +git commit -m 'feat: 添加新功能' +git commit -m 'fix: 修复问题' -3. **创建功能分支** +# 5. 推送并创建 PR +git push origin feature/your-feature +``` - ```bash - # 功能开发 - git checkout -b feature/your-feature-name - - # Bug 修复 - git checkout -b fix/your-fix-name - ``` +**提交信息规范**: -4. **进行开发** - - - 保持代码风格一致,遵循 ESLint + Prettier 规范 - - 编写有意义的提交信息 - - 确保代码通过 lint 检查 - -5. **提交更改** - - ```bash - git add . - git commit -m 'feat: 添加新功能描述' - # 或 - git commit -m 'fix: 修复问题描述' - ``` - - **提交信息规范**: - - | 类型 | 说明 | - |------|------| - | feat | 新功能 | - | fix | Bug 修复 | - | docs | 文档更新 | - | style | 代码格式调整 | - | refactor | 代码重构 | - | perf | 性能优化 | - | test | 测试相关 | - | chore | 构建/工具链变动 | - -6. **推送到远程** - - ```bash - git push origin feature/your-feature-name - ``` - -7. **创建 Pull Request** - - - 描述您的改动内容和目的 - - 关联相关 Issue(如果有) - - 等待代码审查 - -### 开发规范 +| 类型 | 说明 | +|------|------| +| feat | 新功能 | +| fix | Bug 修复 | +| docs | 文档更新 | +| style | 代码格式 | +| refactor | 重构 | +| perf | 性能优化 | +| test | 测试 | +| chore | 构建/工具 | +**开发规范**: - 使用 ES6+ 语法 -- 前端遵循 React Hooks 规范 -- 后端使用 async/await 处理异步 -- 保持函数简洁,单一职责 -- 适当添加注释说明复杂逻辑 - -### 代码审查标准 - -- ✅ 代码功能正确性 -- ✅ 符合项目编码规范 -- ✅ 必要的测试覆盖 -- ✅ 文档更新(如有必要) -- ✅ 性能影响评估 +- 遵循 React Hooks 规范 +- 使用 async/await 处理异步 +- 遵循 ESLint + Prettier 代码规范 --- ## 许可证 -本项目基于 **MIT 许可证** 开源。 +本项目基于 **MIT 许可证**开源。 -``` -MIT License - -Copyright (c) 2024 IDC Device 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. -``` - ---- - -## 致谢 - -感谢以下开源项目: - -- [React](https://react.dev/) - 前端框架 -- [Ant Design](https://ant.design/) - UI 组件库 -- [Three.js](https://threejs.org/) - 3D 渲染引擎 -- [Express](https://expressjs.com/) - Node.js Web 框架 -- [Sequelize](https://sequelize.org/) - Node.js ORM - ---- - -## 联系与支持 - -- **Gitee Issues**: https://gitee.com/zhang96110/idc_assest/issues -- **GitHub Issues**: https://github.com/gituib/idc_assest/issues -- 功能建议:提交 Issue 并标注 `feature-request` -- QQ群:1081123775 --- **⭐ 如果这个项目对您有帮助,请给我们一个 Star!** + +- Gitee Issues: https://gitee.com/zhang96110/idc_assest/issues +- GitHub Issues: https://github.com/gituib/idc_assest/issues +- QQ 群:1081123775 diff --git a/frontend/src/utils/secureStorage.js b/frontend/src/utils/secureStorage.js index 039cf3d..b527255 100644 --- a/frontend/src/utils/secureStorage.js +++ b/frontend/src/utils/secureStorage.js @@ -8,6 +8,9 @@ const AES_KEY_LENGTH = 256; const encoder = new TextEncoder(); const decoder = new TextDecoder(); +const PLAIN_PREFIX = 'plain:'; +const isSecureContext = () => typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined'; + const memoryCache = new Map(); let _cachedCryptoKey = null; @@ -32,6 +35,10 @@ async function deriveKey(material) { } async function getOrCreateKeyMaterial() { + if (!isSecureContext()) { + return null; + } + let stored = sessionStorage.getItem(KEY_STORAGE_ID); if (stored) { const raw = Uint8Array.from(atob(stored), c => c.charCodeAt(0)); @@ -57,6 +64,11 @@ async function getOrCreateKeyMaterial() { async function encrypt(plaintext) { const material = await getOrCreateKeyMaterial(); + + if (!material) { + return PLAIN_PREFIX + btoa(plaintext); + } + const key = await deriveKey(material); const iv = crypto.getRandomValues(new Uint8Array(12)); const encoded = encoder.encode(plaintext); @@ -72,7 +84,13 @@ async function encrypt(plaintext) { async function decrypt(encrypted) { try { + if (encrypted.startsWith(PLAIN_PREFIX)) { + return atob(encrypted.slice(PLAIN_PREFIX.length)); + } + const material = await getOrCreateKeyMaterial(); + if (!material) return null; + const key = await deriveKey(material); const raw = Uint8Array.from(atob(encrypted), c => c.charCodeAt(0));