# aiAutoGen **Repository Path**: zqf_yc/aiAutoGen ## Basic Information - **Project Name**: aiAutoGen - **Description**: 测试AI代码自动生成 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-26 - **Last Updated**: 2026-03-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 实时库存监控系统
![Version](https://img.shields.io/badge/version-1.0.0-blue.svg) ![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.7.18-brightgreen.svg) ![Vue](https://img.shields.io/badge/Vue-3.3.4-42b883.svg) ![License](https://img.shields.io/badge/license-MIT-green.svg) 一个基于 Spring Boot + Vue 3 的实时库存监控系统,通过网页抓取技术实时监控服务器库存状态,并使用 WebSocket 实现数据实时推送。 [功能特性](#功能特性) • [技术栈](#技术栈) • [快速开始](#快速开始) • [项目结构](#项目结构) • [配置说明](#配置说明) • [API文档](#api文档)
--- ## 📋 项目简介 实时库存监控系统是一个全栈Web应用,用于实时监控服务器产品的库存状态。系统通过定时抓取目标网站的产品信息,并通过WebSocket技术将库存变化实时推送到前端展示,帮助用户及时了解产品库存情况。 ### 核心功能 - ✅ **实时数据抓取**:定时抓取目标网站的服务器产品信息 - ✅ **WebSocket实时推送**:库存变化实时推送到前端,无需刷新页面 - ✅ **可视化展示**:精美的UI界面,展示产品配置、价格、库存等信息 - ✅ **自动重连机制**:WebSocket断线自动重连,保证连接稳定性 - ✅ **手动刷新**:支持手动触发数据刷新 - ✅ **响应式设计**:适配不同屏幕尺寸,提供良好的用户体验 --- ## 🎯 功能特性 ### 后端功能 - **定时任务调度**:使用Spring Task实现定时数据抓取 - **网页数据抓取**:基于Jsoup库解析HTML页面,提取产品信息 - **WebSocket服务**:实现实时数据推送,支持多客户端连接 - **RESTful API**:提供标准的HTTP接口供前端调用 - **跨域支持**:配置CORS,支持前后端分离部署 - **健康检查**:提供系统健康状态检查接口 ### 前端功能 - **实时数据展示**:通过WebSocket接收并展示实时库存数据 - **粒子动画背景**:精美的粒子系统动画效果 - **毛玻璃UI设计**:现代化的毛玻璃效果界面 - **状态监控**:实时显示WebSocket连接状态 - **自动重连**:连接断开时自动尝试重连 - **手动重连**:提供手动重连按钮 - **数据统计**:展示总产品数、有货产品数等统计信息 - **购买交互**:提供购买按钮交互(可扩展) --- ## 🛠 技术栈 ### 后端技术 | 技术 | 版本 | 说明 | |------|------|------| | Java | 1.8 | 开发语言 | | Spring Boot | 2.7.18 | 应用框架 | | Spring WebSocket | 2.7.18 | WebSocket支持 | | Jsoup | 1.15.4 | HTML解析库 | | Lombok | Latest | 简化Java代码 | | Jackson | Latest | JSON处理 | | Maven | 3.x | 项目构建工具 | ### 前端技术 | 技术 | 版本 | 说明 | |------|------|------| | Vue.js | 3.3.4 | 前端框架 | | Element Plus | 2.4.4 | UI组件库 | | Vite | 5.0.0 | 构建工具 | | Axios | 1.6.2 | HTTP客户端 | | @element-plus/icons-vue | 2.3.1 | 图标库 | --- ## 🚀 快速开始 ### 环境要求 - **JDK**: 1.8+ - **Node.js**: 16.x+ - **Maven**: 3.6+ - **浏览器**: Chrome/Firefox/Edge (支持WebSocket) ### 后端启动 1. **克隆项目** ```bash git clone cd aiAutoGen ``` 2. **配置后端** ```bash cd backend ``` 修改 `src/main/resources/application.yml` 中的配置: ```yaml server: port: 8080 target: url: https://www.heyunidc.cn/cart?fid=47&gid=87 # 目标网站URL interval: 10 # 抓取间隔(秒) ``` 3. **启动后端服务** ```bash # 使用Maven启动 mvn spring-boot:run # 或者先打包再运行 mvn clean package java -jar target/inventory-monitor-1.0.0.jar ``` 4. **验证后端** 访问健康检查接口: ```bash curl http://localhost:8080/api/inventory/health ``` ### 前端启动 1. **安装依赖** ```bash cd frontend npm install ``` 2. **配置Vite代理** 修改 `vite.config.js` 中的代理配置(如果需要): ```javascript export default defineConfig({ server: { proxy: { '/ws': { target: 'http://localhost:8080', ws: true }, '/api': { target: 'http://localhost:8080' } } } }) ``` 3. **启动开发服务器** ```bash npm run dev ``` 4. **访问应用** 打开浏览器访问:`http://localhost:5173` ### 生产部署 #### 后端打包部署 ```bash cd backend mvn clean package -DskipTests java -jar target/inventory-monitor-1.0.0.jar ``` #### 前端打包部署 ```bash cd frontend npm run build ``` 打包后的文件在 `dist` 目录,可以部署到Nginx或其他Web服务器。 --- ## 📁 项目结构 ``` aiAutoGen/ ├── backend/ # 后端项目 │ ├── src/ │ │ └── main/ │ │ ├── java/com/inventory/ │ │ │ ├── config/ # 配置类 │ │ │ │ ├── CorsConfig.java # 跨域配置 │ │ │ │ └── WebSocketConfig.java # WebSocket配置 │ │ │ ├── controller/ # 控制器 │ │ │ │ └── InventoryController.java │ │ │ ├── dto/ # 数据传输对象 │ │ │ │ └── ServerInfoDTO.java │ │ │ ├── entity/ # 实体类 │ │ │ │ └── ServerInfo.java │ │ │ ├── service/ # 服务层 │ │ │ │ ├── InventoryService.java │ │ │ │ └── WebScrapingService.java │ │ │ ├── websocket/ # WebSocket处理 │ │ │ │ ├── InventoryWebSocketHandler.java │ │ │ │ └── WebSocketHandshakeInterceptor.java │ │ │ └── InventoryMonitorApplication.java # 启动类 │ │ └── resources/ │ │ └── application.yml # 配置文件 │ └── pom.xml # Maven配置 │ ├── frontend/ # 前端项目 │ ├── src/ │ │ ├── api/ # API接口 │ │ │ └── inventory.js │ │ ├── utils/ # 工具类 │ │ │ └── websocket.js # WebSocket封装 │ │ ├── App.vue # 主组件 │ │ └── main.js # 入口文件 │ ├── index.html # HTML模板 │ ├── package.json # 依赖配置 │ └── vite.config.js # Vite配置 │ ├── README.md # 项目文档 └── 需求Spec.md # 需求文档 ``` --- ## ⚙️ 配置说明 ### 后端配置 (application.yml) ```yaml server: port: 8080 # 服务端口 spring: application: name: inventory-monitor # 目标网站配置 target: url: https://www.heyunidc.cn/cart?fid=47&gid=87 # 要抓取的网站URL interval: 10 # 数据抓取间隔(秒) # 日志配置 logging: level: com.inventory: DEBUG # 应用日志级别 org.jsoup: INFO # Jsoup日志级别 ``` ### 前端配置 #### API配置 (src/api/inventory.js) ```javascript const BASE_URL = '/api' // API基础路径 ``` #### WebSocket配置 (src/utils/websocket.js) ```javascript // WebSocket连接URL会自动根据当前协议和主机生成 // 格式: ws://host/ws/inventory 或 wss://host/ws/inventory ``` --- ## 📡 API文档 ### 1. 获取所有服务器信息 **接口地址**: `GET /api/inventory/servers` **请求参数**: 无 **响应示例**: ```json { "code": 200, "message": "success", "data": [ { "id": 1, "name": "服务器名称", "model": "型号", "cpu": "Intel Xeon E5-2680 v4", "memory": "32GB DDR4", "disk": "1TB SSD", "bandwidth": "100M", "datacenter": "北京机房", "stock": 5, "inStock": true, "price": "2999", "pricePeriod": "/月", "remark": "备注信息", "updateTime": "2024-01-01T12:00:00" } ], "count": 1 } ``` ### 2. 手动刷新数据 **接口地址**: `POST /api/inventory/refresh` **请求参数**: 无 **响应示例**: ```json { "code": 200, "message": "数据刷新成功", "data": [...], "count": 10 } ``` ### 3. 健康检查 **接口地址**: `GET /api/inventory/health` **请求参数**: 无 **响应示例**: ```json { "code": 200, "message": "系统运行正常", "timestamp": 1704110400000 } ``` ### WebSocket连接 **连接地址**: `ws://localhost:8080/ws/inventory` **消息格式**: ```json { "type": "inventory_update", "data": [...], "count": 10 } ``` --- ## 🎨 界面预览 ### 主要界面元素 1. **顶部导航栏** - 系统标题 - WebSocket连接状态指示器 - 重新连接按钮 2. **统计卡片** - 总产品数 - 有货产品数 - 当前更新时间 3. **产品卡片网格** - 服务器名称 - 库存状态标签 - 配置信息(CPU、内存、硬盘、带宽、机房) - 价格信息 - 购买按钮 - 备注信息 4. **动画效果** - 粒子背景动画 - 几何图形装饰 - 毛玻璃效果 - 悬停动画 --- ## 🔧 开发指南 ### 添加新的抓取规则 修改 `WebScrapingService.java` 中的解析逻辑: ```java // 在 scrapeServerInfo() 方法中添加新的解析规则 Element newElement = card.selectFirst(".your-selector"); if (newElement != null) { String value = newElement.text().trim(); serverInfo.setYourField(value); } ``` ### 修改抓取间隔 在 `application.yml` 中修改: ```yaml target: interval: 30 # 改为30秒 ``` ### 自定义前端样式 修改 `App.vue` 中的 `