328 lines
8.5 KiB
Markdown
328 lines
8.5 KiB
Markdown
# 投标信息智能监控系统
|
|
|
|
一个基于 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
|