# 投标信息智能监控系统 一个基于 TypeScript 的 Web 应用,用于自动爬取商务投标平台的最新信息,将符合条件的投标项目突出显示,为用户提供精准的投标信息监控服务。 ## 技术栈 ### 后端 - **框架**: NestJS - **语言**: TypeScript - **数据库**: PostgreSQL (TypeORM) - **爬虫**: axios - **任务调度**: @nestjs/schedule - **AI 服务**: OpenAI API ### 前端 - **框架**: Vue.js 3 - **构建工具**: Vite - **UI**: Element Plus - **图标**: @element-plus/icons-vue - **HTTP 客户端**: Axios - **Tailwind CSS**: 用于样式辅助 ## 项目结构 ``` src/ ├── ai/ # AI 模块 │ ├── entities/ │ │ └── ai-recommendation.entity.ts │ ├── Prompt.ts │ ├── ai.controller.ts │ ├── ai.module.ts │ └── ai.service.ts ├── bids/ # 投标业务模块 │ ├── controllers/ │ │ └── bid.controller.ts │ ├── entities/ │ │ └── bid-item.entity.ts │ ├── services/ │ │ └── bid.service.ts │ └── bids.module.ts ├── crawler/ # 爬虫模块 │ ├── entities/ │ │ └── crawl-info-add.entity.ts │ ├── 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 │ ├── crawler.controller.ts │ └── crawler.module.ts ├── database/ # 数据库模块 │ └── database.module.ts ├── keywords/ # 关键词管理模块 │ ├── keyword.entity.ts │ ├── keywords.controller.ts │ ├── keywords.module.ts │ └── keywords.service.ts ├── schedule/ # 定时任务 │ ├── tasks/ │ │ └── bid-crawl.task.ts │ └── schedule.module.ts ├── scripts/ # 脚本工具 │ ├── ai-recommendations.ts │ ├── crawl.ts │ ├── deploy.ps1 │ ├── remove-duplicates.ts │ ├── sync.ts │ └── update-source.ts ├── common/ # 公共模块 │ └── logger/ │ ├── logger.module.ts │ ├── logger.service.ts │ └── winston.config.ts ├── app.controller.ts ├── app.module.ts ├── app.service.ts └── main.ts frontend/ ├── src/ │ ├── assets/ │ │ └── vue.svg │ ├── components/ │ │ ├── Dashboard.vue │ │ ├── Dashboard-AI.vue │ │ ├── PinnedProject.vue │ │ ├── Bids.vue │ │ ├── Keywords.vue │ │ └── CrawlInfo.vue │ ├── utils/ │ │ └── api.ts │ ├── App.vue │ ├── main.ts │ └── style.css ├── .env ├── .env.example ├── .gitignore ├── README.md ├── index.html ├── package.json ├── postcss.config.js ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.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 个主流招标网站 - 中国华电集团有限公司电子商务平台 (CHDTP) - 中国华能集团有限公司电子商务平台 (CHNG) - 深圳交易集团有限公司 (SZECP) - 中国大唐集团电子商务平台 (CDT) - 中国电力招标网 (EPS) - 国家能源投资集团有限责任公司 (CNNCECP) - 中国石油天然气集团有限公司 (CGNPC) - 中国能源建设集团有限公司 (CEIC) - 中国电力建设集团有限公司 (ESPIC) - 北京电力交易中心 (POWERBEIJING) - 山东能源集团有限公司 (SDICC) - 中国海洋石油集团有限公司 (CNOOC) - **智能防封策略**: - 随机请求间隔 (1-3 秒) - 固定 User-Agent - 异常检测与自动重试机制 - 代理支持 - **定时任务**: - 爬虫任务:已暂停(默认每天午夜执行) - 数据清理:每天午夜自动执行 ### 数据处理与存储 - **数据模型**: - 投标项目标题 - 详细页面 URL - 发布时间 - 来源网站 - 置顶标记 - 创建时间 - 更新时间 - **增量存储**: - 通过 URL 哈希值判断是否为新数据 - 仅存储当天和最近 7 天的历史数据 - 每日自动清理 30 天前的数据 ### 关键词智能监控 - **预设关键词**: "山东", "海", "建设", "工程", "采购" - **自定义关键词**: 通过 Web 界面添加/删除关键词 - **权重设置**: 可设置关键词权重 (1-5 级) - **匹配逻辑**: - 标题完全匹配和部分匹配 - 多关键词叠加权重 - 支持正则表达式高级匹配 ### AI 智能推荐 - **智能分析**: 使用 AI 分析投标信息的相关性 - **推荐评分**: 基于关键词匹配和内容分析生成推荐评分 - **智能摘要**: 自动生成投标信息摘要 ### Web 展示界面 - **仪表盘**: - 高优先级投标信息(匹配自定义关键词) - 今日新增投标列表(按时间倒序) - AI 推荐投标信息 - 置顶项目 - **交互功能**: - 关键词管理面板 - 按日期/来源/关键词筛选 - 信息标记已读/未读状态 - 项目置顶功能 - 爬取信息查看 - **响应式设计**: 适配桌面和移动设备 ## API 接口 ### 投标信息 - `GET /api/bids` - 获取投标列表(支持分页、筛选) - `GET /api/bids/recent` - 获取最近投标 - `GET /api/bids/pinned` - 获取置顶投标 - `GET /api/bids/sources` - 获取来源列表 - `GET /api/bids/by-date-range` - 按日期范围获取投标 - `GET /api/bids/crawl-info-stats` - 获取爬取信息统计 - `PATCH /api/bids/:title/pin` - 更新置顶状态 ### 关键词管理 - `GET /api/keywords` - 获取所有关键词 - `POST /api/keywords` - 添加新关键词 - `DELETE /api/keywords/:id` - 删除关键词 ### AI 服务 - `POST /api/ai/recommendations` - 获取 AI 推荐 - `POST /api/ai/save-recommendations` - 保存 AI 推荐 - `GET /api/ai/latest-recommendations` - 获取最新 AI 推荐 ### 爬虫管理 - `GET /api/crawler/status` - 获取爬虫状态 - `POST /api/crawler/run` - 运行爬虫 - `POST /api/crawler/crawl/:sourceName` - 爬取单个来源 ## 前端路由 - `/` - 仪表盘(默认页面) - `/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