dmy e8beeec2b9 chore(env): update log level to debug and modify .gitignore
- Change log level from 'info' to 'debug' for enhanced logging during development.
- Add '.cursor' to .gitignore to prevent tracking of cursor files.
2026-01-15 23:48:07 +08:00
2026-01-09 23:18:52 +08:00
2026-01-09 23:18:52 +08:00
2026-01-09 23:18:52 +08:00
2026-01-09 23:18:52 +08:00
2026-01-09 23:18:52 +08:00
2026-01-09 23:18:52 +08:00

投标信息智能监控系统

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

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 个主流招标网站

    • 中国华电集团有限公司电子商务平台 (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 - 爬取信息

测试

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