Node.js、Express、MySQL、React、Antd的全栈管理系统,如何构建?

摘要:基于 NodeJs + Express + MySQL + Redis + React + Antd + Webpack 构建的中后
前言 一直苦于技术没有接触后端,导致技术不够全面。离职后休息这段时间,设计架构了前后端系统,从另一个层面来讲,确实迈进了一大步,遇见了之前从未遇到的Bug,从开发,到部署,到测试,也是一番新的挑战 项目介绍 该项目是一个基于 Node.js + Express + MySQL + React + Antd 的现代化全栈管理系统。后端提供 JWT 认证、审计日志与在线用户、SSE 实时通知、单点登录;前端提供动态权限路由与增强版 SSE Hook。 在线地址: https://www.liyq666.top git仓库:https://gitee.com/lyqjob/project-root 欢迎找我要最新系统预制脚本,一键插入数据库基本数据(预制菜单、预制权限、预制角色、超级管理员)等都有 项目实例图 项目特性 后端能力 JWT 双 Token 认证与权限控制(Access/Refresh) 审计日志与来源采集(Referer、X-Client-Page),列表与详情查询 在线用户接口(基于审计窗口聚合,含来源页面、设备信息、会话信息) 单点登录(SINGLE_LOGIN),登录时保留当前会话并清退其他会话;通过 SSE 发送下线通知 SSE 实时通知(认证连接),心跳与连接统计;支持稳定客户端标识 clientId 统一日志与请求 ID,中间件记录请求信息与敏感脱敏 Token 管理与自动清理 CORS 允许自定义头:X-Client-Id、X-Client-Page 前端能力 React 18 + Antd 5 + Webpack 5 + Redux Toolkit + React Router 6 动态权限路由(后端返回菜单动态注册)与按钮级权限 增强版 useSSE Hook:自动认证、自动重连、心跳与事件订阅、稳定 clientId 持久化(localStorage) 基础布局 BasicLayout 集成 SSE 事件(open/welcome/heartbeat/loginout),收到登录异常通知后自动退出 项目结构 project-root/ ├── node-express-mysql/ # 后端服务 │ ├── config/ # 配置(配置与实现分离) │ │ ├── base/ # 基础配置(与环境无关) │ │ │ ├── cache.js captcha.js code.js db.js logger.js redis.js schedules.js upload.js │ │ ├── env/ # 环境特定配置(development/production/test) │ │ └── index.js # 配置加载与合并导出 │ ├── docs/ # 后端文档(缓存/日志/SSE/权限规范等) │ ├── public/ # 静态资源 │ ├── sql/ # SQL 脚本(库/表结构与初始化) │ ├── src/ # 源代码 │ │ ├── cache/ # 缓存服务(Memory/Redis/策略/监控/键生成器) │ │ ├── controllers/ # 控制器(auth/user/role/menu/permission/department/...) │ │ ├── infra/ # 基础设施(dbClient/redisClient/scheduler/sseManager) │ │ ├── logger/ # 日志模块(增强日志/核心/工具/脱敏) │ │ ├── middlewares/ # 中间件(认证/权限/文件/验证码/请求ID/监控校验) │ │ ├── models/ # 数据模型(user/role/menu/permission/department/token/audit/monitor) │ │ ├── routes/ # 路由(index + 各模块路由,含 sse/publicAuth/monitor 等) │ │ ├── services/ # 领域服务(codeService/dbService/redisService/uploadService) │ │ └── utils/ # 工具(response/jwtUtils/validator/utils/auditLogger/codeGenerator/sseManager) │ ├── ecosystem.config.js # PM2 配置 │ ├── swagger.yaml # OpenAPI 描述 │ ├── index.js # 应用入口 │ ├── log-rotate.sh # 日志轮转脚本 │ ├── package.json # 项目配置 │ └── README.md # 后端说明 ├── react-antd-webpack/ # 前端应用 │ ├── build/ # Webpack 配置(base/dev/prod) │ ├── public/ # 公共资源 │ ├── src/ # 源代码 │ │ ├── components/ # 通用组件(GlobalHeader/SSEManager/Audit/AuthButton/Charts 等) │ │ ├── hooks/ # 自定义 Hook(useSSE/usePermission/useAuth 等) │ │ ├── layouts/ # 布局(BasicLayout/authRouter) │ │ ├── pages/ # 页面模块(login/home/monitor/setting/...) │ │ ├── router/ # 路由(baseRouter/asynccomponents/index) │ │ ├── services/ # API 服务(auth/permission/role/menu/department/admin 等) │ │ ├── store/ # 状态管理(reducers/global + store 配置) │ │ ├── utils/ # 工具(api/request、monitor_sdk、utils 等) │ │ ├── index.js # 前端入口 │ │ └── global.css # 全局样式 │ └── package.json # 前端项目配置 ├── LICENSE # 许可证 └── README.md # 项目说明 缓存功能 架构:支持内存与 Redis 双实现,依据 config/cache.js 的 type 与 config/redis 自动选择;Redis 使用 SCAN MATCH 批量清理,避免阻塞。 键规范:统一通过 generateCacheKey(module, resourceType, identifier, operation?) 生成,例如: 列表:app:v1:permission:list:<filtersJson> 单项:app:v1:user:item:<id>、app:v1:role:item:<id> 用户角色:app:v1:user:roles:<userId> 权限码:app:v1:permission:codes:user:<userId> 模式清理:使用 getCacheKeyPattern(module, resourceType) 生成模式,示例: 清理权限列表:clearByPattern(getCacheKeyPattern('permission','list')) 清理角色列表:clearByPattern(getCacheKeyPattern('role','list')) 清理用户统计:clearByPattern(getCacheKeyPattern('user','stats')) 读缓存位置:模型/服务层统一设置读缓存(如 withCache 装饰器、cacheService.get/set),控制器层主要进行失效与聚合响应缓存。 失效策略:写操作完成后在控制器集中清理相关键(精确 del + 按模块模式 clearByPattern),确保响应与后端数据一致。 监控与日志:缓存操作由 cacheMonitor 记录命中率与耗时;日志模块输出结构化信息方便排查。 示例代码(列表缓存与清理): const { generateCacheKey, getCacheKeyPattern } = require('./node-express-mysql/src/cache/utils/cacheKeyGenerator'); const cacheService = require('./node-express-mysql/src/cache/cacheService'); // 读取(命中则直接返回) const cacheKey = generateCacheKey('role','list', JSON.stringify({ page, limit, filters })); const cached = await cacheService.get(cacheKey); // 写入(查询后写入) await cacheService.set(cacheKey, { data, pagination }, null, 'role.list'); // 清理(写操作后) await cacheService.clearByPattern(getCacheKeyPattern('role','list')); 更多规范见后端文档:node-express-mysql/docs/3.缓存管理.md、node-express-mysql/docs/2.缓存键命名规范.md。 技术栈 后端 Node.js >= 18.0.0 - JavaScript运行时 Express.js - Web应用框架 MySQL >= 8.0 - 关系型数据库 JWT - JSON Web Token认证 bcryptjs - 密码加密 svg-captcha - 图形验证码 express-session - 会话管理 cors - 跨域处理 dotenv - 环境变量管理 前端 React 18.2.0 - UI框架 Antd 5.26.2 - UI组件库 Webpack 5.99.9 - 模块打包器 Babel 7.27.4 - JavaScript编译器 Redux Toolkit 2.8.2 - 状态管理 React Router 6.30.0 - 路由管理 Axios 1.10.0 - HTTP客户端 Less 4.3.0 - CSS预处理器 PostCSS - CSS后处理器 权限设计 该项目的权限架构采用RBAC0 + 权限层级 + 数据域来设计,相比传统的5张数据库表,多了两张数据库表,分别是权限表和角色权限关联表,以角色为核心,通过角色与菜单/权限点/数据域的关联,实现细粒度的权限控制。 四层模型 系统管理层(角色与层级)、功能模块层(菜单/模块)、操作权限层(权限点/接口/按钮)、数据权限层(部门/数据域)。 目标:更精细、更灵活的权限控制,满足复杂业务场景;兼容当前实现并可渐进增强。 用户层:user,账号主体,绑定所属部门与基础信息。 角色层:role,权限载体,聚合菜单/权限点/数据权限。 菜单/资源层:menu,页面/目录/按钮(node_type)与路由/组件,含权限编码 code 与访问类型 access_type(0-公共,1-私有)。 权限点/数据权限层:permission 作为操作点(接口/按钮)集合,department 作为数据域;通过关联表构成角色的操作与数据范围。 数据库(7 张权限关联表) user:用户表,含 department_id 等基础字段。 role:角色表,含系统预置与保护标识(is_system/is_protected)。 menu:菜单表,目录/菜单/按钮(node_type=1/2/3),权限编码 code 与路由/组件信息。 permission:权限点表,定义接口/操作编码集合。 user_role:用户与角色关联表(多对多)。 role_menu:角色与菜单关联表(多对多),决定角色可见页面/按钮。 role_permission:角色与权限点关联表(多对多),决定角色可用接口/操作。 扩展:department 与 role_data_permission(角色数据权限关联表)用于数据域授权,限定角色的数据访问范围。 关联关系 用户→角色:user_role;一个用户可绑定多个角色。 角色→菜单:role_menu;决定该角色在前端可见的目录/页面/按钮集合。 角色→权限点:role_permission;决定该角色在后端可用的接口/操作集合。 角色→数据域:role_data_permission;定义角色在不同部门/数据范围内的可访问性。 判定流程 后端接口权限: 认证中间件校验 Token 并设置 req.user。 路由层使用权限校验中间件(如 checkPermission('code') 与等级 checkPermissionLevel(40))核验权限码与安全等级。 权限码来源:菜单/权限表的 code,通过用户的角色聚合得到可用集合(menuModel.getUserPermissionCodes)。 前端页面权限: 路由与菜单:后端返回的菜单按 access_type 与 role_menu 过滤;非超级管理员补齐父级目录,保证导航完整。 按钮权限:AuthButton 基于权限码 code 控制显隐(与后端同源编码)。 超级管理员 统一判断:utils.isSuperAdminById(userId),依据角色 code='SUPER_ADMIN' 或系统预置且受保护(is_system=1 && is_protected=1)。 超级管理员跳过菜单与权限过滤,拥有全部资源与操作能力。 模型层 PermissionModel:获取权限列表/详情、按角色/用户获取权限码;分配角色权限(事务)、缓存 permissions:role:*、permission_codes:user:*。 DataPermissionModel:按角色/用户获取数据权限(部门ID集合),校验用户是否可访问某部门;生成数据权限 SQL 过滤条件。 MenuModel:按用户返回菜单支持 access_type 过滤;非超级管理员补齐父级目录,保证导航完整;支持最小字段集与完整字段集。 中间件 checkPermission(requiredPermissions, { checkDataPermission, dataPermissionType }) checkRole(requiredRoles) checkPermissionLevel(minLevel) checkDataPermission(permissionType) 路由 权限管理:GET /permissions、GET /permissions/:id、GET /roles/:roleId/permissions、PUT /roles/:roleId/permissions、GET /user/permissions 角色管理:GET /roles、GET /roles/:id、POST /roles(层级≥20)、PUT /roles/:id、DELETE /roles/:id、GET/PUT /roles/:roleId/data-permissions 权限码规范(示例) 模块层:module:{模块名}:{操作}(如 module:user:view、module:role:edit) 操作层:{模块名}:{实体}:{操作}(如 system:user:create、system:role:delete、content:article:publish) 快速开始 环境要求 Node.js >= 18.0.0 MySQL >= 8.0 npm >= 8.0.0 或 yarn >= 1.22.0 1. 克隆项目 git clone <repository-url> cd project-root 后端服务启动 # 进入后端目录 cd node-express-mysql # 安装依赖 npm install # 或 yarn install # 配置环境变量 cp .env.example .env # 编辑 .env 文件,配置数据库连接信息 # 初始化数据库 # 执行 config/sql/ 目录下的SQL文件 # 启动服务 npm run dev # 或 yarn dev 后端服务默认 http://localhost:8888 前端应用启动 # 进入前端目录 cd react-antd-webpack # 安装依赖 npm install # 或 yarn install # 启动开发服务器 npm run dev # 或 yarn dev 前端应用默认 http://localhost:3000 配置说明 后端环境变量 创建 node-express-mysql/.env 文件: # 数据库配置 DB_HOST=localhost DB_PORT=3306 DB_USER=root DB_PASSWORD=your_password DB_NAME=your_database # JWT 配置 JWT_SECRET=your-jwt-secret-key REFRESH_SECRET=your-refresh-secret-key # 会话配置 SESSION_SECRET=your-session-secret-key # 服务器配置 PORT=8888 NODE_ENV=development LOG_LEVEL=debug # 单点登录开关:on 则登录时清退其他会话并通过 SSE 通知 SINGLE_LOGIN=on 前端 API 配置 修改 react-antd-webpack/src/utils/api/request.js 中的API基础URL: const baseURL = 'http://localhost:8888'; API 接口文档 认证相关 接口 方法 路径 功能 权限 用户登录 POST /login 用户登录 公开 用户登出 POST /auth/logout 用户登出 需要token 强制登出用户 POST /auth/logout/:userId 强制清退 需要token 强制登出会话 POST /auth/logout/session/:sessionId 强制清退会话 需要token 刷新Token PATCH /refresh 刷新访问令牌 需要refresh token 获取验证码 POST /captcha 获取图形验证码 公开 健康检查 GET /health 系统健康检查 公开 用户管理 接口 方法 路径 功能 权限 获取用户列表 GET /users 获取所有用户 需要token 获取用户信息 GET /users/:id 获取指定用户 需要token 创建用户 POST /users 创建新用户 需要token 更新用户 PUT /users/:id 更新用户信息 需要token 删除用户 DELETE /users/:id 删除用户 需要token 角色管理 接口 方法 路径 功能 权限 获取角色列表 GET /roles 获取所有角色 需要token 创建角色 POST /roles 创建新角色 需要token 更新角色 PUT /roles/:id 更新角色信息 需要token 删除角色 DELETE /roles/:id 删除角色 需要token 绑定菜单 POST /roles/bind-menus 角色绑定菜单 需要token 菜单管理 接口 方法 路径 功能 权限 获取菜单列表 GET /menus 获取所有菜单 需要token 创建菜单 POST /menus 创建新菜单 需要token 更新菜单 PUT /menus/:id 更新菜单信息 需要token 删除菜单 DELETE /menus/:id 删除菜单 需要token 审计日志与在线用户 接口 方法 路径 功能 审计列表 GET /api/admin/audit/logs 审计日志分页查询 审计详情 GET /api/admin/audit/log/:id 审计日志详情 在线用户 GET /api/admin/audit/online/users 基于审计窗口聚合在线用户 返回字段:user_id/username/dept_id/dept_name/last_active_time/actions_in_window/last_url/last_method/client_ip/user_agent/browser/operating_system/location/change_summary/session_id/session_last_active_time/session_duration_minutes。 SSE 实时通知 接口 方法 路径 功能 认证连接 GET /sse/connect/auth 建立 SSE 连接(需 Authorization) 发送消息 POST /sse/send 向指定用户发送通知 广播消息 POST /sse/broadcast 向所有连接广播 连接统计 GET /sse/stats 查看连接统计 连接建议附带稳定 clientId:请求头 X-Client-Id 与 URL ?clientId=<id>。服务端在 open/welcome 事件返回 { connectionId, clientId }。 前端特性 动态权限路由 动态路由注册 - 根据后端返回的菜单数据动态注册路由 权限控制 - 基于RBAC模型的页面级权限控制 按钮权限 - 支持按钮级别的权限控制 路由守卫 - 自动处理未授权访问和登录失效 状态管理 Redux Toolkit - 现代化的状态管理方案 持久化存储 - 用户信息和菜单数据本地缓存 无感刷新 - 自动处理Token过期和刷新 错误处理 全局错误捕获 - ErrorBoundary + 全局错误监听 错误去重 - 防止重复错误上报 友好降级 - 错误页面自动跳转到有效页面 性能优化 代码分割 - 路由级别的懒加载 资源优化 - 图片压缩和CDN支持 缓存策略 - 合理的缓存机制 安全特性 认证安全 JWT双Token - Access Token + Refresh Token机制 Token过期 - 访问令牌1小时过期,刷新令牌7天过期 自动清理 - 定时清理过期和已撤销的token 强制登出 - 支持强制登出用户所有设备 输入验证 参数验证 - 所有接口都有完整的参数验证 格式检查 - 验证ID、邮箱、手机号等格式 重复性检查 - 防止创建重复的用户名、角色编码等 SQL注入防护 - 使用参数化查询防止SQL注入 验证码保护 图形验证码 - 使用svg-captcha生成验证码 内存存储 - 验证码存储在服务器端内存中 过期机制 - 验证码5分钟自动过期 一次性使用 - 验证码使用后自动清除 响应格式 成功响应 { "success": true, "code": 200, "message": "操作成功", "data": { "id": 1, "username": "admin", "name": "管理员" }, "timestamp": "2024-01-01T12:00:00.000Z" } 错误响应 { "success": false, "code": 400, "message": "请求参数错误", "data": null, "timestamp": "2024-01-01T12:00:00.000Z" } 开发调试 后端调试 # 查看验证码状态 curl -H "Authorization: Bearer <token>" \ http://localhost:8888/captcha/status # 手动清理过期token curl -X POST -H "Authorization: Bearer <token>" \ http://localhost:8888/cleanup-tokens # 获取token统计信息 curl -H "Authorization: Bearer <token>" \ http://localhost:8888/token-stats 前端调试 Redux DevTools - 状态管理调试 React DevTools - 组件调试 Network面板 - API请求调试 Console日志 - 错误信息查看 部署指南 生产环境部署 本项目提供多种部署方式,包括传统部署、Docker部署和Docker Compose部署。 方式一:传统部署 后端部署 # 1. 进入后端目录 cd node-express-mysql # 2. 安装依赖 npm install # 或 yarn install # 3. 设置环境变量 export NODE_ENV=production export DB_HOST=your-production-db-host export DB_PASSWORD=your-production-password export JWT_SECRET=your-production-jwt-secret # 4. 安装PM2进程管理器 npm install -g pm2 # 5. 启动应用 pm2 start index.js --name "backend-api" # 6. 设置开机自启 pm2 startup pm2 save 前端部署 # 1. 进入前端目录 cd react-antd-webpack # 2. 安装依赖 npm install # 或 yarn install # 3. 构建生产版本 npm run build # 或 yarn build # 4. 部署到Web服务器 # 将dist目录内容上传到Web服务器 # 配置Nginx反向代理 方式二:Docker Compose部署(推荐) 项目已包含完整的Docker Compose配置,支持一键部署。 1. 环境准备 创建环境变量文件 docker-compose/.env: # MySQL数据库配置 MYSQL_ROOT_PASSWORD=your_secure_password MYSQL_DATABASE=your_database_name MYSQL_USER=your_database_user MYSQL_PASSWORD=your_database_password # 时区设置 TZ=Asia/Shanghai LANG=en_US.UTF-8 2. 快速启动 # 进入项目根目录 cd project-root # 进入docker-compose目录 cd docker-compose # 启动所有服务 docker-compose up -d # 查看服务状态 docker-compose ps # 查看日志 docker-compose logs -f # 停止服务 docker-compose down 3. 服务说明 当前Docker Compose配置包含以下服务: MySQL 8.0.34 - 数据库服务(端口:3306) Nginx 1.25.2 - 静态资源服务(端口:8080) 4. 数据持久化 数据库数据:./docker-compose/db-data/data 数据库配置:./docker-compose/db-data/conf 数据库日志:./docker-compose/db-data/logs Nginx日志:./docker-compose/nginx/log 5. 访问服务 Nginx静态服务:http://localhost:8080 MySQL数据库:localhost:3306 方式三:完整Docker部署 1. 创建Dockerfile 后端Dockerfile (node-express-mysql/Dockerfile): FROM node:18-alpine # 设置工作目录 WORKDIR /app # 复制package文件 COPY package*.json ./ COPY yarn.lock ./ # 安装依赖 RUN yarn install --frozen-lockfile # 复制源代码 COPY . . # 暴露端口 EXPOSE 8888 # 启动命令 CMD ["npm", "start"] 前端Dockerfile (react-antd-webpack/Dockerfile): FROM node:18-alpine as builder # 设置工作目录 WORKDIR /app # 复制package文件 COPY package*.json ./ COPY yarn.lock ./ # 安装依赖 RUN yarn install --frozen-lockfile # 复制源代码 COPY . . # 构建应用 RUN yarn build # 生产阶段 FROM nginx:1.25.2-alpine # 复制构建文件 COPY --from=builder /app/dist /usr/share/nginx/html # 复制nginx配置 COPY nginx.conf /etc/nginx/conf.d/default.conf # 暴露端口 EXPOSE 80 # 启动nginx CMD ["nginx", "-g", "daemon off;"] 2. 完整Docker Compose配置 创建 docker-compose-full.yml: version: '3.8' services: mysql: image: mysql:8.0.34 container_name: mysql-8 restart: always environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} ports: - "3306:3306" volumes: - ./docker-compose/db-data/data:/var/lib/mysql - ./docker-compose/db-data/conf:/etc/mysql/conf.d - ./docker-compose/db-data/logs:/var/log/mysql networks: - app-network logging: driver: json-file options: max-size: "10m" max-file: "3" backend: build: ./node-express-mysql container_name: backend-api restart: always ports: - "8888:8888" environment: - NODE_ENV=production - DB_HOST=mysql - DB_PORT=3306 - DB_USER=${MYSQL_USER} - DB_PASSWORD=${MYSQL_PASSWORD} - DB_NAME=${MYSQL_DATABASE} - JWT_SECRET=${JWT_SECRET} - REFRESH_SECRET=${REFRESH_SECRET} depends_on: - mysql networks: - app-network logging: driver: json-file options: max-size: "10m" max-file: "3" frontend: build: ./react-antd-webpack container_name: frontend-app restart: always ports: - "80:80" depends_on: - backend networks: - app-network logging: driver: json-file options: max-size: "10m" max-file: "3" networks: app-network: driver: bridge 3. 部署步骤 # 1. 克隆项目 git clone <repository-url> cd project-root # 2. 创建环境变量文件 cat > .env << EOF MYSQL_ROOT_PASSWORD=your_secure_password MYSQL_DATABASE=your_database_name MYSQL_USER=your_database_user MYSQL_PASSWORD=your_database_password JWT_SECRET=your_jwt_secret_key REFRESH_SECRET=your_refresh_secret_key EOF # 3. 启动完整服务 docker-compose -f docker-compose-full.yml up -d # 4. 初始化数据库 # 执行 node-express-mysql/config/sql/ 目录下的SQL文件 # 5. 访问应用 # 前端:http://localhost # 后端:http://localhost:8888 方式四:生产环境优化部署 1. 生产环境Docker Compose配置 创建 docker-compose-prod.yml: version: '3.8' services: mysql: image: mysql:8.0.34 restart: always environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} volumes: - mysql-data:/var/lib/mysql - ./docker-compose/db-data/conf:/etc/mysql/conf.d networks: - app-network deploy: resources: limits: memory: 1G reservations: memory: 512M logging: driver: json-file options: max-size: "50m" max-file: "5" backend: build: ./node-express-mysql restart: always environment: - NODE_ENV=production - DB_HOST=mysql - DB_USER=${MYSQL_USER} - DB_PASSWORD=${MYSQL_PASSWORD} - DB_NAME=${MYSQL_DATABASE} - JWT_SECRET=${JWT_SECRET} - REFRESH_SECRET=${REFRESH_SECRET} depends_on: - mysql networks: - app-network deploy: replicas: 2 resources: limits: memory: 512M reservations: memory: 256M logging: driver: json-file options: max-size: "50m" max-file: "5" frontend: build: ./react-antd-webpack restart: always depends_on: - backend networks: - app-network deploy: resources: limits: memory: 256M reservations: memory: 128M logging: driver: json-file options: max-size: "50m" max-file: "5" volumes: mysql-data: networks: app-network: driver: bridge 2. 生产环境部署脚本 创建 deploy.sh: #!/bin/bash # 生产环境部署脚本 set -e echo "🚀 开始生产环境部署..." # 检查Docker是否安装 if ! command -v docker &> /dev/null; then echo "❌ Docker未安装,请先安装Docker" exit 1 fi # 检查Docker Compose是否安装 if ! command -v docker-compose &> /dev/null; then echo "❌ Docker Compose未安装,请先安装Docker Compose" exit 1 fi # 检查环境变量文件 if [ ! -f .env ]; then echo "❌ 环境变量文件.env不存在,请创建" exit 1 fi # 构建前端 echo "📦 构建前端应用..." cd react-antd-webpack npm run build cd .. # 停止现有服务 echo "🛑 停止现有服务..." docker-compose -f docker-compose-prod.yml down # 启动服务 echo "🚀 启动生产服务..." docker-compose -f docker-compose-prod.yml up -d # 等待服务启动 echo "⏳ 等待服务启动..." sleep 30 # 检查服务状态 echo "🔍 检查服务状态..." docker-compose -f docker-compose-prod.yml ps echo "✅ 生产环境部署完成!" echo "🌐 前端访问地址: http://localhost" echo "🔧 后端API地址: http://localhost:8888" 3. 监控和日志 # 查看服务状态 docker-compose -f docker-compose-prod.yml ps # 查看实时日志 docker-compose -f docker-compose-prod.yml logs -f # 查看特定服务日志 docker-compose -f docker-compose-prod.yml logs -f backend # 进入容器调试 docker exec -it backend-api /bin/sh docker exec -it mysql-8 mysql -u root -p # 查看资源使用情况 docker stats 常用Docker命令 # 查看容器状态 docker ps -a # 查看容器日志 docker logs -f container_name # 进入容器 docker exec -it container_name /bin/sh # 停止容器 docker stop container_name # 删除容器 docker rm container_name # 查看镜像 docker images # 删除镜像 docker rmi image_name # 清理未使用的资源 docker system prune -a # 查看Docker Compose服务 docker-compose ps # 重启服务 docker-compose restart service_name # 更新服务 docker-compose up -d --force-recreate service_name 生产环境注意事项 安全配置 使用强密码 定期更新密钥 限制网络访问 启用SSL/TLS 性能优化 配置数据库连接池 启用Redis缓存 使用CDN加速 配置负载均衡 监控告警 设置服务监控 配置日志收集 设置告警通知 定期备份数据 备份策略 数据库定期备份 配置文件版本控制 镜像定期更新 灾难恢复预案 📈 性能优化 后端优化 数据库索引 - 为查询字段添加适当索引 连接池 - 使用数据库连接池 缓存策略 - Redis缓存热点数据 压缩中间件 - 启用gzip压缩 前端优化 代码分割 - 路由级别的代码分割 懒加载 - 组件和路由懒加载 资源压缩 - 图片和静态资源压缩 CDN加速 - 静态资源CDN部署 🤝 贡献指南 Fork 本仓库 创建特性分支 (git checkout -b feature/AmazingFeature) 提交更改 (git commit -m 'Add some AmazingFeature') 推送到分支 (git push origin feature/AmazingFeature) 打开 Pull Request 📄 许可证 本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情 👨‍💻 作者 lyq - 项目创建者和维护者 - lyqjob@yeah.net 🙏 致谢 ⭐ 如果这个项目对你有帮助,请给它一个星标!