滚动条样式更新

This commit is contained in:
2025-12-24 14:18:49 +08:00
parent 901ac53453
commit 38b510c681
2 changed files with 119 additions and 38 deletions

105
app.py
View File

@@ -7261,6 +7261,111 @@ def get_events_by_stocks():
return jsonify({'success': False, 'error': str(e)}), 500
@app.route('/api/events/by-concept', methods=['POST'])
def get_events_by_concept():
"""
通过概念名称获取关联的事件
用于概念中心时间轴:直接通过 related_concepts 表查询,无需先获取股票列表
请求体:
{
"concept_name": "人工智能", # 概念名称
"start_date": "2024-01-01", # 可选,开始日期
"end_date": "2024-12-31", # 可选,结束日期
"limit": 200 # 可选限制返回数量默认200
}
"""
try:
data = request.get_json()
concept_name = data.get('concept_name', '').strip()
start_date_str = data.get('start_date')
end_date_str = data.get('end_date')
limit = data.get('limit', 200)
if not concept_name:
return jsonify({'success': False, 'error': '缺少概念名称'}), 400
# 通过 RelatedConcepts 表查询关联的事件
query = db.session.query(Event).join(
RelatedConcepts, Event.id == RelatedConcepts.event_id
).filter(
RelatedConcepts.concept == concept_name
)
# 日期过滤
if start_date_str:
try:
start_date = datetime.strptime(start_date_str, '%Y-%m-%d')
query = query.filter(Event.start_time >= start_date)
except ValueError:
pass
if end_date_str:
try:
end_date = datetime.strptime(end_date_str, '%Y-%m-%d')
end_date = end_date.replace(hour=23, minute=59, second=59)
query = query.filter(Event.start_time <= end_date)
except ValueError:
pass
# 去重并排序
query = query.distinct().order_by(Event.start_time.desc())
# 限制数量
if limit:
query = query.limit(limit)
events = query.all()
# 构建返回数据
events_data = []
for event in events:
# 获取该事件关联的所有股票信息
related_stocks_list = [
{
'stock_code': rs.stock_code,
'stock_name': rs.stock_name,
'sector': rs.sector
}
for rs in event.related_stocks
]
# 获取该事件关联的所有概念(包括关联原因)
related_concepts_list = [
{
'concept': rc.concept,
'reason': rc.reason
}
for rc in event.related_concepts
]
events_data.append({
'id': event.id,
'title': event.title,
'description': event.description,
'event_date': event.start_time.isoformat() if event.start_time else None,
'published_time': event.start_time.strftime('%Y-%m-%d %H:%M:%S') if event.start_time else None,
'source': 'event',
'importance': event.importance,
'view_count': event.view_count,
'hot_score': event.hot_score,
'related_stocks': related_stocks_list,
'related_concepts': related_concepts_list,
'event_type': event.event_type,
'created_at': event.created_at.isoformat() if event.created_at else None
})
return jsonify({
'success': True,
'data': events_data,
'total': len(events_data)
})
except Exception as e:
app.logger.error(f'[by-concept] 查询失败: {str(e)}')
return jsonify({'success': False, 'error': str(e)}), 500
@app.route('/api/events/<int:event_id>/concepts', methods=['GET'])
def get_related_concepts(event_id):
"""获取相关概念列表AI分析结果"""