投标信息智能监控系统

一个基于 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 并配置数据库连接:

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. 安装依赖

# 安装后端依赖
npm install

# 安装前端依赖
cd frontend && npm install

4. 运行项目

# 开发模式 - 后端
npm run start:dev

# 开发模式 - 前端
cd frontend && npm run dev

5. 构建生产版本

# 构建前端
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 - 爬取信息

测试

# 单元测试
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

Description
No description provided
Readme 1.1 MiB
Languages
TypeScript 63.1%
Vue 26.8%
JavaScript 3.8%
Go 3.5%
CSS 2%
Other 0.8%