feat: v3.0.1 - 后台获取新闻功能优化

1. 新增后台管理获取新闻API (/api/admin/fetch-news/<code>)
   - 不需要验证码,仅管理员可用
   - 用于后台手动触发新闻获取

2. 后台网站管理添加"手动获取新闻"按钮
   - 在新闻关键词字段旁边显示
   - 编辑模式可用

3. 取消前台detail页面手动获取新闻入口
   - 用户不再需要手动刷新新闻
   - 新闻由管理员在后台控制获取

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jowe
2026-03-13 22:16:12 +08:00
parent 8b71da2956
commit edbc4288f9
4 changed files with 416 additions and 3 deletions

71
app.py
View File

@@ -382,6 +382,77 @@ def create_app(config_name='default'):
db.session.rollback()
return jsonify({'success': False, 'error': str(e)}), 500
# ========== 后台管理获取新闻API (v3.0.1新增) ==========
@app.route('/api/admin/fetch-news/<code>', methods=['POST'])
@login_required
def admin_fetch_news(code):
"""
后台手动获取指定网站的新闻(不需要验证码,仅管理员可用)
"""
# 只允许管理员访问
if not isinstance(current_user, AdminModel):
return jsonify({'success': False, 'error': '无权访问'}), 403
try:
# 查找网站
site = Site.query.filter_by(code=code).first_or_404()
# 检查博查API配置
api_key = app.config.get('BOCHA_API_KEY')
if not api_key:
return jsonify({'success': False, 'error': '博查API未配置'}), 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'
)
# 保存新闻到数据库
new_count = 0
if news_items:
for item in news_items:
# 检查是否已存在根据URL去重
existing = News.query.filter_by(
site_id=site.id,
url=item['url']
).first()
if not existing:
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=item.get('news_type', 'Industry News')
)
db.session.add(news)
new_count += 1
db.session.commit()
return jsonify({
'success': True,
'new_count': new_count,
'message': f'成功获取{new_count}条新资讯' if new_count > 0 else '暂无新资讯'
})
except Exception as e:
print(f"后台获取新闻失败:{str(e)}")
import traceback
traceback.print_exc()
db.session.rollback()
return jsonify({'success': False, 'error': str(e)}), 500
# ========== 社媒营销路由 (v2.5新增) ==========
@app.route('/api/generate-social-share', methods=['POST'])