最近在做大创项目,做了一个叫 Spoton 的智能信息推荐系统,简单来说就是一个能自动抓取、分类、推荐信息的全栈平台。记录一下技术选型和实现思路。

项目地址在 GitHub 组织 Spoton-team 下,分为前端、后端、爬虫三个独立仓库。

系统架构

整体分三层,数据流方向很清晰:

爬虫负责从学术网站、竞赛平台、技术博客抓取内容,存到 MySQL。后端从数据库读数据,通过 API 返回给前端展示。Redis 做缓存加速,Dify 做内容智能分类。

后端 — Go + Gin

后端用的 Go 1.21 + Gin 框架,经典的三层架构:

项目结构
1
2
3
4
5
6
7
8
9
10
11
12
backend/
├── cmd/server/main.go # 入口
├── configs/config.yaml # 配置文件
├── internal/
│ ├── handler/ # HTTP 处理器
│ ├── service/ # 业务逻辑
│ ├── repository/ # 数据访问
│ ├── model/ # 领域模型
│ ├── router/ # 路由注册
│ ├── client/ # 外部服务客户端
│ └── scheduler/ # 定时任务
└── migrations/mysql/ # 数据库迁移

技术栈:

  • Gin — HTTP 路由和中间件
  • go-redis — Redis 缓存层
  • go-sql-driver/mysql — MySQL 数据库驱动
  • robfig/cron — 定时任务(每天凌晨4点跑推荐,2点跑关键词统计)

数据库一共 15 张表,包括用户、信息、标签、收藏、浏览历史、搜索记录、通知、反馈、爬虫源、推荐记录等。

后端运行在 8081 端口,前端通过 Vite dev server 的 proxy 把 /api 请求代理过去。

前端 — Vue 3 + Element Plus

前端用 Vue 3 Composition API + Vite + Element Plus + Pinia,目前是脚手架阶段,页面和组件都已经搭好框架:

  • 7 个页面 — 首页、列表页、详情页、搜索结果、用户中心、收藏、浏览历史
  • 8 个公共组件 — 导航栏、搜索框、分类侧栏、信息流、筛选栏、信息卡片、通知、偏好设置弹窗
  • 5 个 Pinia Store — 用户、主题、搜索、收藏、历史

前端运行在 3000 端口,支持暗色模式和响应式布局。

爬虫 — Python + Scrapy

爬虫用 Python 3.11 + Scrapy 框架,写了三种爬虫:

三种爬虫类型
爬虫目标说明
AcademicSpider学术网站抓取学术论文、研究成果
CompetitionSpider竞赛平台抓取竞赛信息和公告
TechBlogSpider技术博客抓取技术文章和教程

爬虫把数据写入 MySQL,同时支持回调 Go 后端的分类接口,让 Dify 自动给内容打标签。

本地开发环境

用 Docker Compose 管理 MySQL 和 Redis,一条命令启动基础设施:

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: spoton
ports:
- "3306:3306"

redis:
image: redis:7.2
ports:
- "6379:6379"

启动顺序:MySQL + Redis → 后端 → 前端,爬虫按需手动跑。

踩坑记录

前端代理端口写成了 8080,后端实际是 8081

Go 模块下载要用国内代理 goproxy.cn

Redis 在 Windows 上没有官方版本,用 tporadowski 的移植版

总结

整个项目的技术选型还是偏主流的:Go 做后端性能好、Vue3 前端生态成熟、Scrapy 爬虫框架稳定。目前核心功能框架已经搭好,接下来主要是填充前端页面的业务逻辑和优化推荐算法。

项目还在持续开发中,欢迎关注后续更新。