# zixun **Repository Path**: brzhang/zixun ## Basic Information - **Project Name**: zixun - **Description**: 基于微信小程序和 Flask 后端的新闻资讯聚合平台。系统通过 RSS 爬虫自动采集多个主流新闻源的文章,提供分类浏览、关键词搜索、视频资讯、AI 热点聊天、点赞收藏评论等交互功能,并基于用户行为数据实现个性化新闻推荐。后端同时提供 Bootstrap 5 管理后台,方便管理员对新闻、分类、RSS 源、用户和评论进行管理。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-21 - **Last Updated**: 2026-05-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 新闻资讯小程序系统 基于微信小程序和 Flask 后端的新闻资讯聚合平台。系统通过 RSS 爬虫自动采集多个主流新闻源的文章,提供分类浏览、关键词搜索、视频资讯、AI 热点聊天、点赞收藏评论等交互功能,并基于用户行为数据实现个性化新闻推荐。后端同时提供 Bootstrap 5 管理后台,方便管理员对新闻、分类、RSS 源、用户和评论进行管理。 ## 功能特性 - **新闻浏览** - 按分类查看新闻列表,支持下拉刷新与分页加载 - **分类导航** - 推荐、科技、财经、体育、娱乐、社会、军事、教育等多种分类 - **关键词搜索** - 根据标题关键词快速检索新闻 - **点赞/收藏/评论** - 用户可对新闻进行点赞、收藏和发表评论 - **订阅 RSS 源** - 用户可自由订阅/取消订阅感兴趣的新闻源 - **视频资讯** - 独立的视频资讯频道,聚合央视新闻、央视财经等公众号内容 - **AI 热点聊天** - 集成 DeepSeek 大模型,结合实时新闻热点进行智能对话 - **个性化推荐** - 基于用户阅读、点赞、收藏行为的智能推荐算法 - **阅读历史** - 自动记录用户阅读历史,方便回溯 - **管理后台** - 基于 Bootstrap 5 的 Web 管理系统,含数据统计仪表盘 - **RSS 爬虫** - 自动定时采集多个 RSS 源的新闻文章,支持去重和封面图提取 ## 技术栈 | 类别 | 技术 | |------|------| | 前端 | 微信小程序(WXML + WXSS + JavaScript) | | 后端框架 | Flask 3.0 | | 数据库 | SQLite + Flask-SQLAlchemy | | 跨域处理 | Flask-CORS | | RSS 解析 | feedparser | | HTML 解析 | BeautifulSoup4 | | 定时任务 | APScheduler | | 中文分词 | jieba | | AI 大模型 | DeepSeek API(deepseek-chat) | | 管理后台 | Bootstrap 5 + ECharts + Jinja2 | | HTTP 请求 | requests | ## 项目结构 ``` zixun/ ├── README.md ├── article.md # 技术分享文章 ├── server/ # 后端服务 │ ├── app.py # Flask 应用入口(自动加载 .env) │ ├── config.py # 配置文件 │ ├── models.py # 数据库模型定义(11 张表) │ ├── init_db.py # 数据库初始化脚本 │ ├── requirements.txt # Python 依赖 │ ├── .env # 环境变量(需自行创建) │ ├── zixun.db # SQLite 数据库文件(自动生成) │ ├── api/ # RESTful API 模块 │ │ ├── news.py # 新闻相关接口 │ │ ├── user.py # 用户相关接口 │ │ ├── interaction.py # 交互接口(点赞/收藏/评论/历史) │ │ ├── subscribe.py # 订阅相关接口 │ │ └── chat.py # DeepSeek AI 聊天接口 │ ├── crawler/ # RSS 爬虫模块 │ │ └── rss_crawler.py # RSS 爬虫核心逻辑 │ ├── recommend/ # 推荐算法模块 │ │ └── engine.py # 热点排序 + 个性化推荐引擎 │ └── admin/ # 管理后台模块 │ ├── views.py # 管理后台视图(22 个路由) │ └── templates/ # Jinja2 模板(9 个页面) └── miniprogram/ # 微信小程序前端 ├── app.js / app.json / app.wxss # 小程序全局配置 ├── images/ # Tab 图标资源 ├── utils/ # 工具函数 │ ├── config.js # API 地址配置 │ ├── api.js # 接口请求封装(20+ 个 API) │ └── util.js # 通用工具函数 ├── components/ # 自定义组件 │ ├── news-card/ # 新闻卡片组件 │ └── comment-item/ # 评论项组件 └── pages/ # 页面(5 个 Tab + 4 个子页面) ├── news/ # 首页(Tab 1 - 新闻列表 + 分类) ├── video/ # 视频资讯(Tab 2) ├── chat/ # AI 热点聊天(Tab 3) ├── subscribe/ # 订阅管理(Tab 4) ├── profile/ # 个人中心(Tab 5) ├── detail/ # 新闻详情页 ├── search/ # 搜索页 ├── history/ # 阅读记录 ├── favorites/ # 我的收藏 └── my-comments/ # 我的评论 ``` ## 快速部署指南 ### 一、环境准备 - Python 3.8+(推荐 3.10+) - 微信开发者工具([下载地址](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)) - DeepSeek API Key([申请地址](https://platform.deepseek.com/),用于 AI 聊天功能) ### 二、后端部署 ```bash # 1. 进入后端目录 cd zixun/server # 2. 安装 Python 依赖 pip install -r requirements.txt # 3. 配置环境变量(创建 .env 文件) echo "DEEPSEEK_API_KEY=你的DeepSeek API Key" > .env # 4. 初始化数据库(创建表 + 预置 9 个分类 + 16 个 RSS 源 + 管理员账号) python init_db.py # 5. 首次抓取新闻数据 python -c "from app import app; from crawler.rss_crawler import crawl_all with app.app_context(): crawl_all()" # 6. 启动后端服务 python app.py ``` 启动成功后: - API 服务:`http://localhost:5500` - 管理后台:`http://localhost:5500/admin/` - 管理员账号:`admin` / `admin123` ### 三、小程序部署 1. 打开**微信开发者工具**,导入 `miniprogram/` 目录 2. 修改 `miniprogram/utils/config.js` 中的 API 地址: ```javascript // 本地开发 const BASE_URL = 'http://localhost:5500/api' // 如果部署到服务器,改为服务器地址 // const BASE_URL = 'https://你的域名/api' ``` 3. 在微信开发者工具中点击"编译"即可预览 4. **注意**:开发阶段需在开发者工具中勾选"不校验合法域名"(设置 → 项目设置) ### 四、.env 配置说明 在 `server/` 目录下创建 `.env` 文件: ```bash # DeepSeek API Key(必填,用于 AI 聊天功能) DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 可选:Flask 密钥(默认已内置) # SECRET_KEY=your-secret-key ``` > `.env` 文件会在 `app.py` 启动时自动加载,无需手动 `export`。 > 如果不配置 DeepSeek API Key,AI 聊天功能将返回错误提示,其他功能不受影响。 ### 五、验证部署 ```bash # 测试新闻列表 curl http://localhost:5500/api/news/list # 测试视频资讯 curl http://localhost:5500/api/news/video # 测试 AI 聊天 curl -X POST http://localhost:5500/api/chat \ -H "Content-Type: application/json" \ -d '{"message": "最近有什么热点新闻?"}' ``` ## 数据库设计 系统共包含 11 张数据表: | 表名 | 描述 | 关键字段 | |------|------|----------| | `admin_user` | 管理员用户 | `id`, `username`, `password_hash` | | `user` | 小程序用户 | `id`, `openid`, `nickname`, `avatar`, `created_at` | | `category` | 新闻分类 | `id`, `name`, `sort_order` | | `rss_source` | RSS 订阅源 | `id`, `name`, `url`, `icon`, `category_id`, `is_active`, `description` | | `news` | 新闻文章 | `id`, `title`, `content`, `summary`, `cover_image`, `source_id`, `category_id`, `url`, `pub_time`, `view_count`, `like_count`, `comment_count`, `is_video`, `video_url` | | `comment` | 用户评论 | `id`, `user_id`, `news_id`, `content`, `created_at` | | `like` | 用户点赞 | `id`, `user_id`, `news_id`, `created_at`(联合唯一约束) | | `favorite` | 用户收藏 | `id`, `user_id`, `news_id`, `created_at`(联合唯一约束) | | `reading_history` | 阅读历史 | `id`, `user_id`, `news_id`, `read_at` | | `subscription` | RSS 源订阅 | `id`, `user_id`, `source_id`, `created_at`(联合唯一约束) | | `user_preference` | 用户偏好权重 | `id`, `user_id`, `category_id`, `weight`(联合唯一约束) | ## API 接口文档 所有接口以 `/api` 为前缀,返回格式统一为 `{ "code": 0, "data": {...} }`。 ### 新闻模块 | 路由 | 方法 | 描述 | |------|------|------| | `/api/news/list` | GET | 新闻列表,参数:`category_id`、`page` | | `/api/news/detail/` | GET | 新闻详情,参数:`user_id`(返回点赞/收藏状态) | | `/api/news/search` | GET | 搜索新闻,参数:`keyword`、`page` | | `/api/news/hot` | GET | 热门新闻排行,参数:`page` | | `/api/news/recommend` | GET | 个性化推荐,参数:`user_id`、`page` | | `/api/news/video` | GET | 视频资讯列表,参数:`page` | ### 用户模块 | 路由 | 方法 | 描述 | |------|------|------| | `/api/user/login` | POST | 登录/注册,参数:`code`、`nickname`、`avatar` | | `/api/user/info` | GET | 用户信息,参数:`user_id` | | `/api/user/stats` | GET | 用户统计,参数:`user_id` | ### 交互模块 | 路由 | 方法 | 描述 | |------|------|------| | `/api/news//like` | POST | 切换点赞,参数:`user_id` | | `/api/news//favorite` | POST | 切换收藏,参数:`user_id` | | `/api/news//comment` | POST | 发表评论,参数:`user_id`、`content` | | `/api/news//comments` | GET | 评论列表,参数:`page` | | `/api/user/history` | GET | 阅读记录,参数:`user_id`、`page` | | `/api/user/favorites` | GET | 收藏列表,参数:`user_id`、`page` | | `/api/user/comments` | GET | 我的评论,参数:`user_id`、`page` | ### 订阅模块 | 路由 | 方法 | 描述 | |------|------|------| | `/api/sources` | GET | RSS 源列表,参数:`user_id`(返回订阅状态) | | `/api/subscribe/` | POST | 切换订阅,参数:`user_id` | | `/api/user/subscriptions` | GET | 已订阅列表,参数:`user_id` | ### AI 聊天模块 | 路由 | 方法 | 描述 | |------|------|------| | `/api/chat` | POST | AI 对话,参数:`message`、`user_id`(可选) | > AI 聊天会自动获取最新 5 条热门新闻作为上下文,让 DeepSeek 结合实时热点进行回答。 ## 管理后台 访问 `http://localhost:5500/admin/`,使用 `admin` / `admin123` 登录。 - **数据仪表盘** - 新闻/用户总数、今日新增、分类分布饼图、7 天新闻趋势图(ECharts) - **新闻管理** - 列表查看、搜索筛选、新增/编辑/删除 - **分类管理** - 增删分类,支持排序 - **RSS 源管理** - 增删 RSS 源,手动触发单个/全部抓取 - **用户管理** - 查看用户列表及行为统计 - **评论管理** - 查看/删除评论 ## 推荐算法 ### 热度排序 ``` score = 浏览量 × 0.4 + 点赞数 × 0.3 + 评论数 × 0.2 + e^(-0.05h) × 100 × 0.1 ``` 其中 `h` 为发布距今小时数,指数衰减确保新内容获得更高权重。 ### 个性化推荐 1. **偏好建模** - 阅读 +1、点赞 +2、收藏 +3,构建用户分类偏好向量 2. **混合推荐** - 70% 个性化(按偏好从各分类选取未读新闻)+ 30% 热门 3. **冷启动** - 新用户直接返回热度排序结果 ## 预置 RSS 源 | 分类 | 来源 | |------|------| | 推荐 | 人民网(国内、国际) | | 科技 | 人民网科技、36氪、虎嗅网、InfoQ 中文、CnBeta | | 体育 | 人民网体育 | | 社会 | 人民网社会、澎湃新闻 | | 军事 | 人民网军事 | | 教育 | 人民网教育 | | 视频 | 央视新闻、人民日报、央视财经、新华社(via anyfeeder) | > 可在管理后台随时添加/删除 RSS 源。 ## 常见问题 **Q: AI 聊天提示"服务不可用"?** A: 检查 `server/.env` 中的 `DEEPSEEK_API_KEY` 是否正确配置。可在 [DeepSeek 开放平台](https://platform.deepseek.com/) 申请 API Key。 **Q: 小程序提示网络请求失败?** A: 开发阶段需在微信开发者工具中勾选"不校验合法域名"(设置 → 项目设置 → 本地设置)。 **Q: 如何手动抓取新闻?** A: 方式一:管理后台 RSS 源管理页点击"抓取"按钮;方式二:命令行执行: ```bash cd server python -c "from app import app; from crawler.rss_crawler import crawl_all; with app.app_context(): crawl_all()" ``` **Q: 如何部署到云服务器?** A: 将后端部署到服务器(推荐使用 gunicorn),修改小程序 `config.js` 中的 `BASE_URL` 为服务器地址。微信小程序正式发布需要 HTTPS 域名和备案。 ## License [MIT](LICENSE)