# 投标信息智能监控系统 一个基于 TypeScript 的 Web 应用,用于自动爬取商务投标平台的最新信息,将符合条件的投标项目突出显示,为用户提供精准的投标信息监控服务。 ## 技术栈 ### 后端 - **框架**: NestJS - **语言**: TypeScript - **数据库**: PostgreSQL (TypeORM) - **爬虫**: axios - **任务调度**: @nestjs/schedule - **AI 服务**: OpenAI API ### 前端 - **框架**: Vue.js 3 - **构建工具**: Vite - **UI**: Tailwind CSS - **状态管理**: Pinia ## 项目结构 ``` src/ ├── ai/ # AI 模块 │ ├── ai.controller.ts │ ├── ai.service.ts │ ├── Prompt.ts │ └── entities/ ├── bids/ # 投标业务模块 │ ├── controllers/ │ ├── entities/ │ └── services/ ├── crawler/ # 爬虫模块 │ ├── services/ │ │ ├── bid-crawler.service.ts │ │ ├── cdt_target.ts │ │ ├── chng_target.ts │ │ ├── ceic_target.ts │ │ ├── cgnpc_target.ts │ │ ├── chdtp_target.ts │ │ ├── cnncecp_target.ts │ │ ├── cnooc_target.ts │ │ ├── eps_target.ts │ │ ├── espic_target.ts │ │ ├── powerbeijing_target.ts │ │ ├── sdicc_target.ts │ │ └── szecp_target.ts │ └── entities/ ├── database/ # 数据库模块 ├── keywords/ # 关键词管理模块 ├── schedule/ # 定时任务 │ └── tasks/ │ └── bid-crawl.task.ts ├── scripts/ # 脚本工具 │ ├── ai-recommendations.ts │ ├── crawl.ts │ ├── deploy.ps1 │ ├── remove-duplicates.ts │ └── update-source.ts └── common/ # 公共模块 └── logger/ frontend/ └── src/ ├── components/ │ ├── Dashboard.vue │ ├── Dashboard-AI.vue │ ├── PinnedProject.vue │ ├── Bids.vue │ ├── Keywords.vue │ └── CrawlInfo.vue ├── App.vue └── main.ts ``` ## 快速开始 ### 1. 环境准备 确保已安装 Node.js (18+) 和 PostgreSQL。 ### 2. 数据库配置 复制 `.env.example` 为 `.env` 并配置数据库连接: ```env DATABASE_TYPE=postgres DATABASE_HOST=localhost DATABASE_PORT=5432 DATABASE_USERNAME=your_username DATABASE_PASSWORD=your_password DATABASE_NAME=bidding DATABASE_SYNCHRONIZE=true # 代理配置(可选) PROXY_HOST=your_proxy_host PROXY_PORT=your_proxy_port PROXY_USERNAME=your_proxy_username PROXY_PASSWORD=your_proxy_password # AI 配置 OPENAI_API_KEY=your_openai_api_key ``` ### 3. 安装依赖 ```bash # 安装后端依赖 npm install # 安装前端依赖 cd frontend && npm install ``` ### 4. 运行项目 ```bash # 开发模式 - 后端 npm run start:dev # 开发模式 - 前端 cd frontend && npm run dev ``` ### 5. 构建生产版本 ```bash # 构建前端 cd frontend && npm run build # 构建后端 cd .. && npm run build # 运行生产版本 npm run start:prod ``` ## 核心功能 ### 智能爬虫模块 - **多源爬取**: 支持 12 个主流招标网站 - 中国大唐集团电子商务平台 (CDT) - 中国华能集团有限公司电子商务平台 (CHNG) - 中国南方电网电子商务平台 (CSG) - 中国海洋石油集团有限公司 (CNOOC) - 中国华电集团有限公司电子商务平台 (CHDTP) - 国家能源投资集团有限责任公司 (CNNCECP) - 中国核工业集团有限公司 (CNNC) - 中国电力建设集团有限公司 (POWERCHINA) - 中国能源建设集团有限公司 (CEIC) - 中国石油天然气集团有限公司 (CNPC) - 国家电网有限公司 (SGCC) - 北京电力交易中心 (POWERBEIJING) - **智能防封策略**: - 随机请求间隔 (3-8 秒) - 轮换 User-Agent - 异常检测与自动重试机制 - 代理支持 - **定时任务**: 每 30 分钟自动执行爬取 ### 数据处理与存储 - **数据模型**: - 投标项目标题 - 详细页面 URL - 发布时间 - 招标单位 - 截止日期 - 关键词匹配 - 优先级评分 - **增量存储**: - 通过 URL 哈希值判断是否为新数据 - 仅存储当天和最近 7 天的历史数据 - 每日自动清理 30 天前的数据 ### 关键词智能监控 - **预设关键词**: "山东", "海", "建设", "工程", "采购" - **自定义关键词**: 通过 Web 界面添加/删除关键词 - **权重设置**: 可设置关键词权重 (1-5 级) - **匹配逻辑**: - 标题完全匹配和部分匹配 - 多关键词叠加权重 - 支持正则表达式高级匹配 ### AI 智能推荐 - **智能分析**: 使用 AI 分析投标信息的相关性 - **推荐评分**: 基于关键词匹配和内容分析生成推荐评分 - **智能摘要**: 自动生成投标信息摘要 ### Web 展示界面 - **仪表盘**: - 高优先级投标信息(匹配自定义关键词) - 今日新增投标列表(按时间倒序) - AI 推荐投标信息 - 置顶项目 - **交互功能**: - 关键词管理面板 - 按日期/来源/关键词筛选 - 信息标记已读/未读状态 - 项目置顶功能 - 爬取信息查看 - **响应式设计**: 适配桌面和移动设备 ## API 接口 ### 投标信息 - `GET /api/bids` - 获取投标列表(支持分页、筛选) - `GET /api/bids/high-priority` - 获取高优先级投标 - `GET /api/bids/today` - 获取今日投标 ### 关键词管理 - `GET /api/keywords` - 获取所有关键词 - `POST /api/keywords` - 添加新关键词 - `DELETE /api/keywords/:id` - 删除关键词 ### AI 服务 - `GET /api/ai/recommendations` - 获取 AI 推荐投标 - `POST /api/ai/analyze` - 分析投标信息 ### 爬虫管理 - `GET /api/crawler/info` - 获取爬取信息 - `POST /api/crawler/trigger` - 手动触发爬取 ## 前端路由 - `/` - 仪表盘(默认页面) - `/bids` - 全部投标信息 - `/keywords` - 关键词管理 - `/ai` - AI 推荐页面 - `/crawl-info` - 爬取信息 ## 测试 ```bash # 单元测试 npm run test # E2E 测试 npm run test:e2e # 测试覆盖率 npm run test:cov ``` ## 部署 项目包含 PowerShell 部署脚本 `src/scripts/deploy.ps1`,用于自动化部署流程。 ## 环境变量 | 变量名 | 说明 | 默认值 | |--------|------|--------| | DATABASE_TYPE | 数据库类型 | postgres | | DATABASE_HOST | 数据库主机 | localhost | | DATABASE_PORT | 数据库端口 | 5432 | | DATABASE_USERNAME | 数据库用户名 | - | | DATABASE_PASSWORD | 数据库密码 | - | | DATABASE_NAME | 数据库名称 | bidding | | DATABASE_SYNCHRONIZE | 自动同步数据库 | true | | PROXY_HOST | 代理主机 | - | | PROXY_PORT | 代理端口 | - | | PROXY_USERNAME | 代理用户名 | - | | PROXY_PASSWORD | 代理密码 | - | | OPENAI_API_KEY | OpenAI API 密钥 | - | ## 许可证 MIT