feat: v2.3.0 - 新闻获取准确性优化
核心改进: 1. 新增专用新闻关键词字段(sites.news_keywords) 2. 严格匹配搜索策略(双引号包裹关键词) 3. 前台手动刷新新闻功能 数据库变更: - Sites表添加news_keywords字段(VARCHAR(200)) - 提供迁移脚本migrate_news_keywords.py 代码变更: - models.py: Site模型添加news_keywords字段 - app.py: 后台表单配置、API路由、search_site_news调用优化 - utils/news_searcher.py: 支持news_keywords参数优先匹配 - templates/detail_new.html: 添加刷新按钮和JavaScript 新增功能: - 后台可为每个网站设置专属新闻关键词 - 详情页"获取最新资讯"按钮(前台可用,无需登录) - 新API端点:POST /api/refresh-site-news/<site_code> 文档: - DEPLOY_v2.3.0.md: 完整部署指南 - DEPLOY_v2.3_QUICK.md: 快速部署指南 向后兼容: - 现有网站自动使用网站名称作为默认关键词 - 未设置关键词时降级使用网站名称搜索 🤖 Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
496
DEPLOY_v2.3.0.md
Normal file
496
DEPLOY_v2.3.0.md
Normal file
@@ -0,0 +1,496 @@
|
|||||||
|
# ZJPB v2.3.0 部署指南
|
||||||
|
|
||||||
|
**版本**: v2.3.0
|
||||||
|
**发布日期**: 2025-12-31
|
||||||
|
**核心功能**: 新闻获取准确性优化
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 版本概述
|
||||||
|
|
||||||
|
v2.3.0版本专注于解决新闻获取准确性问题,通过引入专用新闻关键词字段和严格匹配策略,显著提升新闻相关性。
|
||||||
|
|
||||||
|
### ✨ 核心改进
|
||||||
|
|
||||||
|
1. **专用新闻关键词字段**
|
||||||
|
- Sites表新增`news_keywords`字段
|
||||||
|
- 支持为每个网站设置专属搜索关键词
|
||||||
|
- 避免网站名称混淆导致的不相关新闻
|
||||||
|
|
||||||
|
2. **严格匹配搜索策略**
|
||||||
|
- 使用双引号包裹关键词,确保完整匹配
|
||||||
|
- 优先使用news_keywords,降级使用网站名称
|
||||||
|
- 提高新闻相关性和准确性
|
||||||
|
|
||||||
|
3. **前台手动刷新功能**
|
||||||
|
- 详情页新增"获取最新资讯"按钮
|
||||||
|
- 用户可主动刷新最新新闻
|
||||||
|
- 无需后台权限,前台直接使用
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 技术变更
|
||||||
|
|
||||||
|
### 数据库变更
|
||||||
|
|
||||||
|
**Sites表**:
|
||||||
|
```sql
|
||||||
|
ALTER TABLE sites
|
||||||
|
ADD COLUMN news_keywords VARCHAR(200)
|
||||||
|
COMMENT '新闻获取关键词(用于精准匹配相关新闻)'
|
||||||
|
AFTER features;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 代码变更
|
||||||
|
|
||||||
|
| 文件 | 变更类型 | 说明 |
|
||||||
|
|------|---------|------|
|
||||||
|
| `models.py` | 修改 | Site模型添加news_keywords字段 |
|
||||||
|
| `migrate_news_keywords.py` | 新增 | 数据库迁移脚本 |
|
||||||
|
| `app.py` | 修改 | • 后台表单配置<br>• search_site_news调用<br>• 新API路由 |
|
||||||
|
| `utils/news_searcher.py` | 修改 | 支持news_keywords参数 |
|
||||||
|
| `templates/detail_new.html` | 修改 | 刷新按钮和JavaScript |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 部署步骤
|
||||||
|
|
||||||
|
### 方法一:Git Pull 部署(推荐)
|
||||||
|
|
||||||
|
#### 1. 备份数据库
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# SSH登录服务器
|
||||||
|
cd /opt/1panel/apps/zjpb
|
||||||
|
|
||||||
|
# 备份数据库
|
||||||
|
mysqldump -h localhost -u ai_nav -p ai_nav > backup_before_v2.3_$(date +%Y%m%d_%H%M%S).sql
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. 拉取最新代码
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 停止应用
|
||||||
|
./manage.sh stop
|
||||||
|
|
||||||
|
# 查看当前状态
|
||||||
|
git status
|
||||||
|
|
||||||
|
# 如有本地修改,先暂存
|
||||||
|
git stash
|
||||||
|
|
||||||
|
# 拉取最新代码
|
||||||
|
git pull origin master
|
||||||
|
|
||||||
|
# 如有stash,可选择恢复
|
||||||
|
# git stash pop
|
||||||
|
|
||||||
|
# 查看当前版本
|
||||||
|
git log --oneline -3
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. 运行数据库迁移
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 激活虚拟环境
|
||||||
|
source venv/bin/activate
|
||||||
|
|
||||||
|
# 运行迁移脚本
|
||||||
|
python migrate_news_keywords.py
|
||||||
|
```
|
||||||
|
|
||||||
|
**预期输出**:
|
||||||
|
```
|
||||||
|
============================================================
|
||||||
|
开始执行数据库迁移 v2.3.0
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
1. 添加 news_keywords 字段...
|
||||||
|
>>> news_keywords 字段添加成功
|
||||||
|
|
||||||
|
2. 为现有网站设置默认关键词(使用网站名称)...
|
||||||
|
>>> 已更新 X 个网站的默认关键词
|
||||||
|
|
||||||
|
============================================================
|
||||||
|
>>> 数据库迁移完成!
|
||||||
|
============================================================
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4. 重启应用
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 重启应用
|
||||||
|
./manage.sh restart
|
||||||
|
|
||||||
|
# 检查状态
|
||||||
|
./manage.sh status
|
||||||
|
|
||||||
|
# 查看日志(可选)
|
||||||
|
./manage.sh logs
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 方法二:手动文件上传(备用)
|
||||||
|
|
||||||
|
如果Git pull失败,可以手动上传修改的文件:
|
||||||
|
|
||||||
|
#### 需要上传的文件
|
||||||
|
|
||||||
|
1. `models.py`
|
||||||
|
2. `migrate_news_keywords.py` (新文件)
|
||||||
|
3. `app.py`
|
||||||
|
4. `utils/news_searcher.py`
|
||||||
|
5. `templates/detail_new.html`
|
||||||
|
|
||||||
|
**上传后执行**:
|
||||||
|
```bash
|
||||||
|
cd /opt/1panel/apps/zjpb
|
||||||
|
source venv/bin/activate
|
||||||
|
python migrate_news_keywords.py
|
||||||
|
./manage.sh restart
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 部署验证
|
||||||
|
|
||||||
|
### 1. 数据库验证
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- 检查sites表结构
|
||||||
|
DESCRIBE sites;
|
||||||
|
|
||||||
|
-- 应该看到新字段
|
||||||
|
-- news_keywords | varchar(200) | YES
|
||||||
|
|
||||||
|
-- 检查现有数据
|
||||||
|
SELECT id, name, news_keywords
|
||||||
|
FROM sites
|
||||||
|
LIMIT 5;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 后台验证
|
||||||
|
|
||||||
|
访问后台管理:http://your-domain.com/admin/login
|
||||||
|
|
||||||
|
**检查项**:
|
||||||
|
- [ ] 进入"网站管理"
|
||||||
|
- [ ] 点击"编辑"任意网站
|
||||||
|
- [ ] 查看是否有"新闻关键词"输入框
|
||||||
|
- [ ] 输入测试关键词,保存成功
|
||||||
|
|
||||||
|
### 3. 前台验证
|
||||||
|
|
||||||
|
访问任意网站详情页:http://your-domain.com/site/xxxxxxxx
|
||||||
|
|
||||||
|
**检查项**:
|
||||||
|
- [ ] 页面正常加载
|
||||||
|
- [ ] 滚动到"相关新闻"模块
|
||||||
|
- [ ] 查看是否有"获取最新资讯"按钮
|
||||||
|
- [ ] 点击按钮测试刷新功能(需配置BOCHA_API_KEY)
|
||||||
|
|
||||||
|
### 4. API测试
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 测试刷新新闻API
|
||||||
|
curl -X POST http://your-domain.com/api/refresh-site-news/12345678 \
|
||||||
|
-H "Content-Type: application/json"
|
||||||
|
|
||||||
|
# 预期返回
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"message": "成功获取 X 条新资讯",
|
||||||
|
"total_found": X,
|
||||||
|
"saved_count": X
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 使用指南
|
||||||
|
|
||||||
|
### 后台管理员
|
||||||
|
|
||||||
|
#### 设置新闻关键词
|
||||||
|
|
||||||
|
1. 登录后台:`/admin/login`
|
||||||
|
2. 进入"网站管理" → 选择要编辑的网站
|
||||||
|
3. 找到"新闻关键词"字段
|
||||||
|
4. 输入精准的搜索关键词
|
||||||
|
|
||||||
|
**关键词设置建议**:
|
||||||
|
- ✅ **推荐**:使用产品官方全称或核心品牌词
|
||||||
|
- 示例:`ChatGPT`、`GitHub Copilot`、`Midjourney`
|
||||||
|
- ✅ **多个关键词**:可以使用空格分隔(会被当作一个整体匹配)
|
||||||
|
- 示例:`Claude AI`、`Google Gemini`
|
||||||
|
- ❌ **避免**:过于宽泛的词
|
||||||
|
- 错误示例:`AI`、`工具`、`助手`
|
||||||
|
|
||||||
|
#### 批量设置关键词
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- 示例:批量设置关键词
|
||||||
|
UPDATE sites SET news_keywords = 'ChatGPT' WHERE name = 'ChatGPT';
|
||||||
|
UPDATE sites SET news_keywords = 'GitHub Copilot' WHERE name = 'GitHub Copilot';
|
||||||
|
UPDATE sites SET news_keywords = 'Claude AI' WHERE name = 'Claude';
|
||||||
|
```
|
||||||
|
|
||||||
|
### 前台用户
|
||||||
|
|
||||||
|
#### 手动刷新新闻
|
||||||
|
|
||||||
|
1. 访问网站详情页
|
||||||
|
2. 滚动到"相关新闻"模块
|
||||||
|
3. 点击"获取最新资讯"按钮
|
||||||
|
4. 等待1-2秒,页面自动刷新
|
||||||
|
|
||||||
|
**注意**:
|
||||||
|
- 刷新功能需要配置BOCHA_API_KEY
|
||||||
|
- 每次刷新获取最新5条一周内的新闻
|
||||||
|
- 自动去重,不会重复保存
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 问题排查
|
||||||
|
|
||||||
|
### 1. 迁移脚本报错
|
||||||
|
|
||||||
|
**错误**:`news_keywords字段已存在`
|
||||||
|
|
||||||
|
**解决**:正常现象,脚本会自动跳过已存在的字段
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. 后台表单没有新字段
|
||||||
|
|
||||||
|
**可能原因**:
|
||||||
|
- 代码未更新
|
||||||
|
- 浏览器缓存
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
```bash
|
||||||
|
# 确认代码已更新
|
||||||
|
grep -n "news_keywords" app.py
|
||||||
|
|
||||||
|
# 清除浏览器缓存,强制刷新(Ctrl + F5)
|
||||||
|
|
||||||
|
# 重启应用
|
||||||
|
./manage.sh restart
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. 刷新按钮不显示
|
||||||
|
|
||||||
|
**可能原因**:
|
||||||
|
- detail_new.html未更新
|
||||||
|
- 模板缓存
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
```bash
|
||||||
|
# 确认模板已更新
|
||||||
|
grep -n "refresh-news-btn" templates/detail_new.html
|
||||||
|
|
||||||
|
# 清除Flask缓存,重启应用
|
||||||
|
./manage.sh restart
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. 刷新新闻失败
|
||||||
|
|
||||||
|
**错误信息**:`新闻功能未启用`
|
||||||
|
|
||||||
|
**原因**:BOCHA_API_KEY未配置
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
```bash
|
||||||
|
# 编辑.env文件
|
||||||
|
nano /opt/1panel/apps/zjpb/.env
|
||||||
|
|
||||||
|
# 添加或确认以下配置
|
||||||
|
BOCHA_API_KEY=sk-your-api-key-here
|
||||||
|
BOCHA_BASE_URL=https://api.bocha.cn
|
||||||
|
|
||||||
|
# 重启应用
|
||||||
|
./manage.sh restart
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 回滚方案
|
||||||
|
|
||||||
|
如果部署后出现问题,可以快速回滚:
|
||||||
|
|
||||||
|
### 1. 回滚代码
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/1panel/apps/zjpb
|
||||||
|
./manage.sh stop
|
||||||
|
|
||||||
|
# 查看提交历史
|
||||||
|
git log --oneline -5
|
||||||
|
|
||||||
|
# 回滚到v2.2.0(假设是前一个提交)
|
||||||
|
git reset --hard <v2.2.0的commit-id>
|
||||||
|
|
||||||
|
./manage.sh start
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 回滚数据库(可选)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 删除新添加的字段(如需要)
|
||||||
|
mysql -h localhost -u ai_nav -p ai_nav
|
||||||
|
|
||||||
|
ALTER TABLE sites DROP COLUMN news_keywords;
|
||||||
|
```
|
||||||
|
|
||||||
|
**注意**:删除字段会丢失已设置的关键词数据,谨慎操作!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 性能影响
|
||||||
|
|
||||||
|
### 数据库
|
||||||
|
|
||||||
|
- **新增字段**:1个VARCHAR(200)字段
|
||||||
|
- **存储增长**:约200字节/网站
|
||||||
|
- **查询性能**:无影响(字段不参与索引查询)
|
||||||
|
|
||||||
|
### 应用性能
|
||||||
|
|
||||||
|
- **后台表单**:无明显影响
|
||||||
|
- **前台刷新**:
|
||||||
|
- API调用耗时:1-3秒(取决于博查API响应)
|
||||||
|
- 不影响页面正常浏览
|
||||||
|
- 仅在用户主动点击时触发
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🆕 新增API端点
|
||||||
|
|
||||||
|
### POST /api/refresh-site-news/<site_code>
|
||||||
|
|
||||||
|
手动刷新指定网站的新闻
|
||||||
|
|
||||||
|
**参数**:
|
||||||
|
- `site_code`:网站编码(URL路径参数)
|
||||||
|
|
||||||
|
**返回**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"message": "成功获取 3 条新资讯",
|
||||||
|
"total_found": 5,
|
||||||
|
"saved_count": 3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**权限**:无需登录,前台可用
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 版本对比
|
||||||
|
|
||||||
|
| 功能 | v2.2.0 | v2.3.0 |
|
||||||
|
|------|--------|--------|
|
||||||
|
| 新闻搜索 | ✅ | ✅ |
|
||||||
|
| 搜索关键词 | 仅网站名称 | 专用关键词优先 |
|
||||||
|
| 匹配策略 | 普通匹配 | 严格匹配(双引号) |
|
||||||
|
| 手动刷新 | ❌ | ✅ 前台按钮 |
|
||||||
|
| 关键词管理 | ❌ | ✅ 后台配置 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 维护建议
|
||||||
|
|
||||||
|
### 定期检查关键词
|
||||||
|
|
||||||
|
建议定期检查新闻获取效果,优化关键词设置:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- 查看没有设置关键词的网站
|
||||||
|
SELECT id, name, news_keywords
|
||||||
|
FROM sites
|
||||||
|
WHERE news_keywords IS NULL OR news_keywords = '';
|
||||||
|
|
||||||
|
-- 查看新闻获取较少的网站
|
||||||
|
SELECT s.name, s.news_keywords, COUNT(n.id) as news_count
|
||||||
|
FROM sites s
|
||||||
|
LEFT JOIN news n ON s.id = n.site_id
|
||||||
|
GROUP BY s.id
|
||||||
|
HAVING news_count < 3
|
||||||
|
ORDER BY news_count;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 关键词优化流程
|
||||||
|
|
||||||
|
1. 识别新闻数量少的网站
|
||||||
|
2. 访问该网站,了解官方品牌名称
|
||||||
|
3. 在后台设置更精准的关键词
|
||||||
|
4. 点击前台刷新按钮测试效果
|
||||||
|
5. 根据结果调整关键词
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 技术支持
|
||||||
|
|
||||||
|
**项目**: ZJPB - 焦提示词 | AI工具导航
|
||||||
|
**版本**: v2.3.0
|
||||||
|
**更新日期**: 2025-12-31
|
||||||
|
|
||||||
|
**常见问题**:
|
||||||
|
1. 查看应用日志:`./manage.sh logs`
|
||||||
|
2. 检查数据库连接:确认.env中的DB_配置
|
||||||
|
3. 验证API配置:确认BOCHA_API_KEY正确
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 后续优化建议
|
||||||
|
|
||||||
|
v2.3.0之后可以考虑的优化方向:
|
||||||
|
|
||||||
|
1. **智能关键词推荐**
|
||||||
|
- 根据网站URL自动提取品牌词
|
||||||
|
- AI分析网站内容推荐关键词
|
||||||
|
|
||||||
|
2. **新闻质量评分**
|
||||||
|
- 使用AI评估新闻相关性
|
||||||
|
- 自动过滤低质量新闻
|
||||||
|
|
||||||
|
3. **批量关键词管理**
|
||||||
|
- 后台批量设置关键词
|
||||||
|
- 导入导出关键词配置
|
||||||
|
|
||||||
|
4. **新闻效果统计**
|
||||||
|
- 统计每个网站的新闻点击率
|
||||||
|
- 根据数据优化关键词策略
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 更新日志
|
||||||
|
|
||||||
|
### v2.3.0 (2025-12-31)
|
||||||
|
|
||||||
|
**新增**:
|
||||||
|
- ✨ Sites表添加news_keywords字段
|
||||||
|
- ✨ 后台管理支持设置新闻关键词
|
||||||
|
- ✨ 详情页新增"获取最新资讯"按钮
|
||||||
|
- ✨ 新API端点:`/api/refresh-site-news/<code>`
|
||||||
|
|
||||||
|
**优化**:
|
||||||
|
- 🎯 新闻搜索使用专用关键词(优先级高于网站名称)
|
||||||
|
- 🎯 严格匹配策略(双引号包裹关键词)
|
||||||
|
- 🎯 所有search_site_news调用传递news_keywords参数
|
||||||
|
|
||||||
|
**修复**:
|
||||||
|
- 🐛 解决网站名称相似导致的新闻混淆问题
|
||||||
|
- 🐛 提高新闻相关性和准确性
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**部署文档版本**: v1.0
|
||||||
|
**最后更新**: 2025-12-31
|
||||||
|
**维护者**: ZJPB开发团队
|
||||||
175
DEPLOY_v2.3_QUICK.md
Normal file
175
DEPLOY_v2.3_QUICK.md
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
# ZJPB v2.3.0 快速部署指南
|
||||||
|
|
||||||
|
> 3步完成部署,5分钟上线
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 版本信息
|
||||||
|
|
||||||
|
- **版本**: v2.3.0
|
||||||
|
- **日期**: 2025-12-31
|
||||||
|
- **核心**: 新闻准确性优化
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚡ 快速部署(3步)
|
||||||
|
|
||||||
|
### 第1步:拉取代码
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/1panel/apps/zjpb
|
||||||
|
./manage.sh stop
|
||||||
|
git pull origin master
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第2步:数据库迁移
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source venv/bin/activate
|
||||||
|
python migrate_news_keywords.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第3步:重启应用
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./manage.sh restart
|
||||||
|
./manage.sh status
|
||||||
|
```
|
||||||
|
|
||||||
|
✅ **部署完成!**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 快速验证
|
||||||
|
|
||||||
|
### 1. 后台验证(1分钟)
|
||||||
|
|
||||||
|
```
|
||||||
|
1. 访问:http://your-domain.com/admin/login
|
||||||
|
2. 进入:网站管理 → 编辑任意网站
|
||||||
|
3. 检查:是否有"新闻关键词"字段
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 前台验证(1分钟)
|
||||||
|
|
||||||
|
```
|
||||||
|
1. 访问:http://your-domain.com/site/xxxxxxxx
|
||||||
|
2. 滚动:到"相关新闻"模块
|
||||||
|
3. 检查:是否有"获取最新资讯"按钮
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 核心功能
|
||||||
|
|
||||||
|
### 1. 新闻关键词设置
|
||||||
|
|
||||||
|
**后台操作**:
|
||||||
|
```
|
||||||
|
网站管理 → 编辑 → 新闻关键词 → 输入"ChatGPT" → 保存
|
||||||
|
```
|
||||||
|
|
||||||
|
**效果**:
|
||||||
|
- 搜索更精准
|
||||||
|
- 避免名称混淆
|
||||||
|
- 提高相关性
|
||||||
|
|
||||||
|
### 2. 前台手动刷新
|
||||||
|
|
||||||
|
**用户操作**:
|
||||||
|
```
|
||||||
|
详情页 → 相关新闻 → 点击"获取最新资讯" → 等待刷新
|
||||||
|
```
|
||||||
|
|
||||||
|
**效果**:
|
||||||
|
- 获取最新5条新闻
|
||||||
|
- 自动去重
|
||||||
|
- 1-2秒完成
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 关键词设置技巧
|
||||||
|
|
||||||
|
### 推荐设置
|
||||||
|
|
||||||
|
| 网站名称 | 推荐关键词 | 说明 |
|
||||||
|
|---------|-----------|------|
|
||||||
|
| ChatGPT | `ChatGPT` | 官方品牌名 |
|
||||||
|
| GitHub Copilot | `GitHub Copilot` | 完整产品名 |
|
||||||
|
| Claude | `Claude AI` | 添加AI避免混淆 |
|
||||||
|
| 文心一言 | `文心一言` | 中文全称 |
|
||||||
|
|
||||||
|
### 避免设置
|
||||||
|
|
||||||
|
❌ `AI`、`工具`、`助手` - 过于宽泛
|
||||||
|
❌ `聊天机器人` - 不够精准
|
||||||
|
❌ `GPT` - 会匹配所有GPT相关
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🐛 问题速查
|
||||||
|
|
||||||
|
### 问题1:后台没有新字段
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查代码
|
||||||
|
grep "news_keywords" app.py
|
||||||
|
|
||||||
|
# 清缓存重启
|
||||||
|
./manage.sh restart
|
||||||
|
```
|
||||||
|
|
||||||
|
### 问题2:刷新按钮不显示
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查模板
|
||||||
|
grep "refresh-news-btn" templates/detail_new.html
|
||||||
|
|
||||||
|
# 强制刷新浏览器(Ctrl + F5)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 问题3:刷新失败
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查API配置
|
||||||
|
grep "BOCHA_API_KEY" .env
|
||||||
|
|
||||||
|
# 如未配置,添加:
|
||||||
|
echo "BOCHA_API_KEY=sk-your-key" >> .env
|
||||||
|
./manage.sh restart
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 变更文件
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `models.py` | 添加字段 |
|
||||||
|
| `migrate_news_keywords.py` | 迁移脚本 |
|
||||||
|
| `app.py` | 后台+API |
|
||||||
|
| `utils/news_searcher.py` | 搜索逻辑 |
|
||||||
|
| `templates/detail_new.html` | 刷新按钮 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 回滚(如需要)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/1panel/apps/zjpb
|
||||||
|
./manage.sh stop
|
||||||
|
git reset --hard HEAD~1 # 回到上一版本
|
||||||
|
./manage.sh start
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 完整文档
|
||||||
|
|
||||||
|
详细信息请查看:`DEPLOY_v2.3.0.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**快速指南版本**: v1.0
|
||||||
|
**部署时间**: 约5分钟
|
||||||
|
**难度**: ⭐ 简单
|
||||||
85
app.py
85
app.py
@@ -146,6 +146,7 @@ def create_app(config_name='default'):
|
|||||||
news_items = searcher.search_site_news(
|
news_items = searcher.search_site_news(
|
||||||
site_name=site.name,
|
site_name=site.name,
|
||||||
site_url=site.url,
|
site_url=site.url,
|
||||||
|
news_keywords=site.news_keywords, # v2.3新增:使用专用关键词
|
||||||
count=3,
|
count=3,
|
||||||
freshness='oneWeek'
|
freshness='oneWeek'
|
||||||
)
|
)
|
||||||
@@ -547,6 +548,7 @@ def create_app(config_name='default'):
|
|||||||
news_items = searcher.search_site_news(
|
news_items = searcher.search_site_news(
|
||||||
site_name=site.name,
|
site_name=site.name,
|
||||||
site_url=site.url,
|
site_url=site.url,
|
||||||
|
news_keywords=site.news_keywords, # v2.3新增:使用专用关键词
|
||||||
count=count,
|
count=count,
|
||||||
freshness=freshness
|
freshness=freshness
|
||||||
)
|
)
|
||||||
@@ -642,6 +644,7 @@ def create_app(config_name='default'):
|
|||||||
news_items = searcher.search_site_news(
|
news_items = searcher.search_site_news(
|
||||||
site_name=site.name,
|
site_name=site.name,
|
||||||
site_url=site.url,
|
site_url=site.url,
|
||||||
|
news_keywords=site.news_keywords, # v2.3新增:使用专用关键词
|
||||||
count=count_per_site,
|
count=count_per_site,
|
||||||
freshness=freshness
|
freshness=freshness
|
||||||
)
|
)
|
||||||
@@ -706,6 +709,85 @@ def create_app(config_name='default'):
|
|||||||
'message': f'批量获取失败: {str(e)}'
|
'message': f'批量获取失败: {str(e)}'
|
||||||
}), 500
|
}), 500
|
||||||
|
|
||||||
|
@app.route('/api/refresh-site-news/<site_code>', methods=['POST'])
|
||||||
|
def refresh_site_news(site_code):
|
||||||
|
"""手动刷新指定网站的新闻(前台用户可访问)- v2.3新增"""
|
||||||
|
try:
|
||||||
|
# 根据code查找网站
|
||||||
|
site = Site.query.filter_by(code=site_code).first()
|
||||||
|
if not site:
|
||||||
|
return jsonify({
|
||||||
|
'success': False,
|
||||||
|
'message': '网站不存在'
|
||||||
|
}), 404
|
||||||
|
|
||||||
|
# 检查博查API配置
|
||||||
|
api_key = app.config.get('BOCHA_API_KEY')
|
||||||
|
if not api_key:
|
||||||
|
return jsonify({
|
||||||
|
'success': False,
|
||||||
|
'message': '新闻功能未启用'
|
||||||
|
}), 500
|
||||||
|
|
||||||
|
# 创建新闻搜索器
|
||||||
|
searcher = NewsSearcher(api_key)
|
||||||
|
|
||||||
|
# 搜索新闻(获取最新5条)
|
||||||
|
news_items = searcher.search_site_news(
|
||||||
|
site_name=site.name,
|
||||||
|
site_url=site.url,
|
||||||
|
news_keywords=site.news_keywords, # 使用专用关键词
|
||||||
|
count=5,
|
||||||
|
freshness='oneWeek' # 一周内的新闻
|
||||||
|
)
|
||||||
|
|
||||||
|
if not news_items:
|
||||||
|
return jsonify({
|
||||||
|
'success': False,
|
||||||
|
'message': '未找到相关新闻'
|
||||||
|
}), 404
|
||||||
|
|
||||||
|
# 保存新闻到数据库
|
||||||
|
saved_count = 0
|
||||||
|
for item in news_items:
|
||||||
|
# 检查新闻是否已存在(根据URL判断)
|
||||||
|
existing_news = News.query.filter_by(
|
||||||
|
site_id=site.id,
|
||||||
|
url=item['url']
|
||||||
|
).first()
|
||||||
|
|
||||||
|
if not existing_news:
|
||||||
|
news = News(
|
||||||
|
site_id=site.id,
|
||||||
|
title=item['title'],
|
||||||
|
content=item.get('summary') or item.get('snippet', ''),
|
||||||
|
url=item['url'],
|
||||||
|
source_name=item.get('site_name', ''),
|
||||||
|
source_icon=item.get('site_icon', ''),
|
||||||
|
published_at=item.get('published_at'),
|
||||||
|
news_type='Search Result',
|
||||||
|
is_active=True
|
||||||
|
)
|
||||||
|
db.session.add(news)
|
||||||
|
saved_count += 1
|
||||||
|
|
||||||
|
# 提交事务
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
return jsonify({
|
||||||
|
'success': True,
|
||||||
|
'message': f'成功获取 {saved_count} 条新资讯',
|
||||||
|
'total_found': len(news_items),
|
||||||
|
'saved_count': saved_count
|
||||||
|
})
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
db.session.rollback()
|
||||||
|
return jsonify({
|
||||||
|
'success': False,
|
||||||
|
'message': f'获取失败: {str(e)}'
|
||||||
|
}), 500
|
||||||
|
|
||||||
# ========== 批量导入路由 ==========
|
# ========== 批量导入路由 ==========
|
||||||
@app.route('/admin/batch-import', methods=['GET', 'POST'])
|
@app.route('/admin/batch-import', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
@@ -1004,6 +1086,7 @@ def create_app(config_name='default'):
|
|||||||
'short_desc': '简短描述',
|
'short_desc': '简短描述',
|
||||||
'description': '详细介绍',
|
'description': '详细介绍',
|
||||||
'features': '主要功能',
|
'features': '主要功能',
|
||||||
|
'news_keywords': '新闻关键词',
|
||||||
'is_active': '是否启用',
|
'is_active': '是否启用',
|
||||||
'view_count': '浏览次数',
|
'view_count': '浏览次数',
|
||||||
'sort_order': '排序权重',
|
'sort_order': '排序权重',
|
||||||
@@ -1011,7 +1094,7 @@ def create_app(config_name='default'):
|
|||||||
'created_at': '创建时间',
|
'created_at': '创建时间',
|
||||||
'updated_at': '更新时间'
|
'updated_at': '更新时间'
|
||||||
}
|
}
|
||||||
form_columns = ['name', 'url', 'slug', 'logo', 'short_desc', 'description', 'features', 'tags', 'is_active', 'sort_order']
|
form_columns = ['name', 'url', 'slug', 'logo', 'short_desc', 'description', 'features', 'news_keywords', 'tags', 'is_active', 'sort_order']
|
||||||
|
|
||||||
# 自定义编辑/删除文字
|
# 自定义编辑/删除文字
|
||||||
column_extra_row_actions = None
|
column_extra_row_actions = None
|
||||||
|
|||||||
107
migrate_news_keywords.py
Normal file
107
migrate_news_keywords.py
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
"""
|
||||||
|
数据库迁移脚本 - 为Sites表添加news_keywords字段
|
||||||
|
版本:v2.3.0
|
||||||
|
日期:2025-12-31
|
||||||
|
"""
|
||||||
|
import pymysql
|
||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
# 加载环境变量
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
def migrate():
|
||||||
|
"""执行数据库迁移"""
|
||||||
|
# 数据库配置
|
||||||
|
db_config = {
|
||||||
|
'host': os.environ.get('DB_HOST', 'localhost'),
|
||||||
|
'port': int(os.environ.get('DB_PORT', 3306)),
|
||||||
|
'user': os.environ.get('DB_USER', 'root'),
|
||||||
|
'password': os.environ.get('DB_PASSWORD', ''),
|
||||||
|
'database': os.environ.get('DB_NAME', 'ai_nav'),
|
||||||
|
'charset': 'utf8mb4'
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 连接数据库
|
||||||
|
connection = pymysql.connect(**db_config)
|
||||||
|
cursor = connection.cursor()
|
||||||
|
|
||||||
|
print("=" * 60)
|
||||||
|
print("开始执行数据库迁移 v2.3.0")
|
||||||
|
print("=" * 60)
|
||||||
|
|
||||||
|
# 检查字段是否已存在
|
||||||
|
cursor.execute("""
|
||||||
|
SELECT COLUMN_NAME
|
||||||
|
FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE TABLE_SCHEMA = %s
|
||||||
|
AND TABLE_NAME = 'sites'
|
||||||
|
AND COLUMN_NAME = 'news_keywords'
|
||||||
|
""", (db_config['database'],))
|
||||||
|
|
||||||
|
existing_columns = [row[0] for row in cursor.fetchall()]
|
||||||
|
|
||||||
|
# 添加 news_keywords 字段
|
||||||
|
if 'news_keywords' not in existing_columns:
|
||||||
|
print("\n1. 添加 news_keywords 字段...")
|
||||||
|
cursor.execute("""
|
||||||
|
ALTER TABLE sites
|
||||||
|
ADD COLUMN news_keywords VARCHAR(200)
|
||||||
|
COMMENT '新闻获取关键词(用于精准匹配相关新闻)'
|
||||||
|
AFTER features
|
||||||
|
""")
|
||||||
|
print(">>> news_keywords 字段添加成功")
|
||||||
|
else:
|
||||||
|
print("\n1. news_keywords 字段已存在,跳过")
|
||||||
|
|
||||||
|
# 可选:为现有网站设置默认关键词(使用网站名称)
|
||||||
|
if 'news_keywords' not in existing_columns:
|
||||||
|
print("\n2. 为现有网站设置默认关键词(使用网站名称)...")
|
||||||
|
cursor.execute("""
|
||||||
|
UPDATE sites
|
||||||
|
SET news_keywords = name
|
||||||
|
WHERE news_keywords IS NULL OR news_keywords = ''
|
||||||
|
""")
|
||||||
|
affected_rows = cursor.rowcount
|
||||||
|
print(f">>> 已更新 {affected_rows} 个网站的默认关键词")
|
||||||
|
|
||||||
|
# 提交事务
|
||||||
|
connection.commit()
|
||||||
|
|
||||||
|
print("\n" + "=" * 60)
|
||||||
|
print(">>> 数据库迁移完成!")
|
||||||
|
print("=" * 60)
|
||||||
|
|
||||||
|
# 显示表结构
|
||||||
|
print("\n当前 sites 表结构:")
|
||||||
|
cursor.execute("DESCRIBE sites")
|
||||||
|
for row in cursor.fetchall():
|
||||||
|
print(f" - {row[0]}: {row[1]} {row[2]}")
|
||||||
|
|
||||||
|
# 显示示例数据
|
||||||
|
print("\n示例数据(前5条):")
|
||||||
|
cursor.execute("""
|
||||||
|
SELECT id, name, news_keywords
|
||||||
|
FROM sites
|
||||||
|
LIMIT 5
|
||||||
|
""")
|
||||||
|
for row in cursor.fetchall():
|
||||||
|
print(f" ID: {row[0]}, 名称: {row[1]}, 关键词: {row[2] or '(空)'}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"\n>>> 迁移失败:{str(e)}")
|
||||||
|
if 'connection' in locals():
|
||||||
|
connection.rollback()
|
||||||
|
raise
|
||||||
|
|
||||||
|
finally:
|
||||||
|
if 'cursor' in locals():
|
||||||
|
cursor.close()
|
||||||
|
if 'connection' in locals():
|
||||||
|
connection.close()
|
||||||
|
print("\n数据库连接已关闭")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
migrate()
|
||||||
@@ -24,6 +24,7 @@ class Site(db.Model):
|
|||||||
short_desc = db.Column(db.String(200), comment='简短描述')
|
short_desc = db.Column(db.String(200), comment='简短描述')
|
||||||
description = db.Column(db.Text, comment='详细介绍')
|
description = db.Column(db.Text, comment='详细介绍')
|
||||||
features = db.Column(db.Text, comment='主要功能')
|
features = db.Column(db.Text, comment='主要功能')
|
||||||
|
news_keywords = db.Column(db.String(200), comment='新闻获取关键词(用于精准匹配相关新闻)')
|
||||||
is_active = db.Column(db.Boolean, default=True, comment='是否启用')
|
is_active = db.Column(db.Boolean, default=True, comment='是否启用')
|
||||||
view_count = db.Column(db.Integer, default=0, comment='浏览次数')
|
view_count = db.Column(db.Integer, default=0, comment='浏览次数')
|
||||||
sort_order = db.Column(db.Integer, default=0, comment='排序权重')
|
sort_order = db.Column(db.Integer, default=0, comment='排序权重')
|
||||||
@@ -49,6 +50,7 @@ class Site(db.Model):
|
|||||||
'short_desc': self.short_desc,
|
'short_desc': self.short_desc,
|
||||||
'description': self.description,
|
'description': self.description,
|
||||||
'features': self.features,
|
'features': self.features,
|
||||||
|
'news_keywords': self.news_keywords,
|
||||||
'is_active': self.is_active,
|
'is_active': self.is_active,
|
||||||
'view_count': self.view_count,
|
'view_count': self.view_count,
|
||||||
'tags': [tag.name for tag in self.tags],
|
'tags': [tag.name for tag in self.tags],
|
||||||
|
|||||||
@@ -622,10 +622,16 @@
|
|||||||
<!-- Related News -->
|
<!-- Related News -->
|
||||||
{% if news_list %}
|
{% if news_list %}
|
||||||
<div class="content-block">
|
<div class="content-block">
|
||||||
<h2>
|
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px;">
|
||||||
<span>📰</span>
|
<h2 style="margin: 0;">
|
||||||
相关新闻
|
<span>📰</span>
|
||||||
</h2>
|
相关新闻
|
||||||
|
</h2>
|
||||||
|
<button id="refreshNewsBtn" class="refresh-news-btn" onclick="refreshNews('{{ site.code }}')">
|
||||||
|
<span class="refresh-icon">↻</span> 获取最新资讯
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div id="newsContainer">
|
||||||
{% for news in news_list %}
|
{% for news in news_list %}
|
||||||
<div class="news-item">
|
<div class="news-item">
|
||||||
<div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 12px;">
|
<div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 12px;">
|
||||||
@@ -667,6 +673,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
</div><!-- End newsContainer -->
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
@@ -698,4 +705,127 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.refresh-news-btn {
|
||||||
|
padding: 8px 16px;
|
||||||
|
background: linear-gradient(135deg, var(--primary-blue) 0%, var(--primary-dark) 100%);
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.3s;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.refresh-news-btn:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 4px 12px rgba(14, 165, 233, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.refresh-news-btn:disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
|
transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.refresh-news-btn.loading .refresh-icon {
|
||||||
|
animation: spin 1s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
from { transform: rotate(0deg); }
|
||||||
|
to { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.news-status {
|
||||||
|
padding: 12px;
|
||||||
|
margin: 16px 0;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 14px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.news-status.success {
|
||||||
|
background: rgba(34, 197, 94, 0.1);
|
||||||
|
border: 1px solid rgba(34, 197, 94, 0.3);
|
||||||
|
color: #22c55e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.news-status.error {
|
||||||
|
background: rgba(239, 68, 68, 0.1);
|
||||||
|
border: 1px solid rgba(239, 68, 68, 0.3);
|
||||||
|
color: #ef4444;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function refreshNews(siteCode) {
|
||||||
|
const btn = document.getElementById('refreshNewsBtn');
|
||||||
|
const newsContainer = document.getElementById('newsContainer');
|
||||||
|
|
||||||
|
if (!btn || !newsContainer) return;
|
||||||
|
|
||||||
|
// 禁用按钮,显示加载状态
|
||||||
|
btn.disabled = true;
|
||||||
|
btn.classList.add('loading');
|
||||||
|
btn.innerHTML = '<span class="refresh-icon">↻</span> 正在获取...';
|
||||||
|
|
||||||
|
// 显示加载提示
|
||||||
|
const loadingMsg = document.createElement('div');
|
||||||
|
loadingMsg.className = 'news-status';
|
||||||
|
loadingMsg.style.display = 'block';
|
||||||
|
loadingMsg.textContent = '正在获取最新资讯,请稍候...';
|
||||||
|
newsContainer.insertAdjacentElement('beforebegin', loadingMsg);
|
||||||
|
|
||||||
|
// 调用刷新API
|
||||||
|
fetch(`/api/refresh-site-news/${siteCode}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
if (data.success) {
|
||||||
|
// 刷新成功,重新加载页面
|
||||||
|
loadingMsg.className = 'news-status success';
|
||||||
|
loadingMsg.textContent = `✓ 成功获取 ${data.saved_count || 0} 条新资讯,页面即将刷新...`;
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.reload();
|
||||||
|
}, 1500);
|
||||||
|
} else {
|
||||||
|
// 刷新失败
|
||||||
|
loadingMsg.className = 'news-status error';
|
||||||
|
loadingMsg.textContent = `✗ ${data.message || '获取失败,请稍后重试'}`;
|
||||||
|
btn.disabled = false;
|
||||||
|
btn.classList.remove('loading');
|
||||||
|
btn.innerHTML = '<span class="refresh-icon">↻</span> 获取最新资讯';
|
||||||
|
|
||||||
|
// 3秒后隐藏错误消息
|
||||||
|
setTimeout(() => {
|
||||||
|
loadingMsg.style.display = 'none';
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Error:', error);
|
||||||
|
loadingMsg.className = 'news-status error';
|
||||||
|
loadingMsg.textContent = '✗ 网络请求失败,请检查网络连接';
|
||||||
|
btn.disabled = false;
|
||||||
|
btn.classList.remove('loading');
|
||||||
|
btn.innerHTML = '<span class="refresh-icon">↻</span> 获取最新资讯';
|
||||||
|
|
||||||
|
// 3秒后隐藏错误消息
|
||||||
|
setTimeout(() => {
|
||||||
|
loadingMsg.style.display = 'none';
|
||||||
|
}, 3000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ class NewsSearcher:
|
|||||||
self,
|
self,
|
||||||
site_name: str,
|
site_name: str,
|
||||||
site_url: Optional[str] = None,
|
site_url: Optional[str] = None,
|
||||||
|
news_keywords: Optional[str] = None,
|
||||||
count: int = 10,
|
count: int = 10,
|
||||||
freshness: str = 'oneMonth'
|
freshness: str = 'oneMonth'
|
||||||
) -> List[Dict]:
|
) -> List[Dict]:
|
||||||
@@ -128,16 +129,23 @@ class NewsSearcher:
|
|||||||
搜索特定网站的相关新闻
|
搜索特定网站的相关新闻
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
site_name: 网站名称(用于搜索关键词)
|
site_name: 网站名称(用于搜索关键词,如果没有news_keywords)
|
||||||
site_url: 网站URL(可选,用于排除网站自身)
|
site_url: 网站URL(可选,用于排除网站自身)
|
||||||
|
news_keywords: 新闻专用关键词(优先使用,支持精准匹配)
|
||||||
count: 返回结果数量
|
count: 返回结果数量
|
||||||
freshness: 时间范围
|
freshness: 时间范围
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
新闻列表
|
新闻列表
|
||||||
"""
|
"""
|
||||||
# 构建搜索关键词:网站名称 + "最新" + "新闻"
|
# 构建搜索关键词
|
||||||
query = f'"{site_name}" 新闻'
|
# 优先使用news_keywords(如果提供)- v2.3新增
|
||||||
|
if news_keywords and news_keywords.strip():
|
||||||
|
# 使用双引号包裹关键词,确保严格匹配
|
||||||
|
query = f'"{news_keywords.strip()}" 新闻'
|
||||||
|
else:
|
||||||
|
# 降级使用网站名称(向后兼容)
|
||||||
|
query = f'"{site_name}" 新闻'
|
||||||
|
|
||||||
# 如果提供了网站URL,排除网站自身的结果
|
# 如果提供了网站URL,排除网站自身的结果
|
||||||
exclude = None
|
exclude = None
|
||||||
|
|||||||
Reference in New Issue
Block a user