事件标记线bug修复

This commit is contained in:
2025-12-25 13:15:57 +08:00
parent 57cd0aa8ec
commit bcafafe34c
7 changed files with 454 additions and 7 deletions

105
app.py
View File

@@ -5641,6 +5641,23 @@ class FutureEventFollow(db.Model):
__table_args__ = (db.UniqueConstraint('user_id', 'future_event_id'),)
class EventSentimentVote(db.Model):
"""事件情绪投票(看多/看空)"""
__tablename__ = 'event_sentiment_vote'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
event_id = db.Column(db.Integer, db.ForeignKey('event.id'), nullable=False)
vote_type = db.Column(db.String(10), nullable=False) # 'bullish' 或 'bearish'
created_at = db.Column(db.DateTime, default=beijing_now)
updated_at = db.Column(db.DateTime, default=beijing_now, onupdate=beijing_now)
user = db.relationship('User', backref='sentiment_votes')
event = db.relationship('Event', backref='sentiment_votes')
__table_args__ = (db.UniqueConstraint('user_id', 'event_id'),)
# —— 自选股输入统一化与名称补全工具 ——
def _normalize_stock_input(raw_input: str):
"""解析用户输入为标准6位股票代码与可选名称。
@@ -6687,6 +6704,10 @@ class Event(db.Model):
post_count = db.Column(db.Integer, default=0)
follower_count = db.Column(db.Integer, default=0)
# 看多/看空投票统计
bullish_count = db.Column(db.Integer, default=0) # 看多数
bearish_count = db.Column(db.Integer, default=0) # 看空数
# 关联信息
related_industries = db.Column(db.String(20)) # 申万行业代码,如 "S640701"
keywords = db.Column(db.JSON)
@@ -7565,6 +7586,74 @@ def toggle_event_follow(event_id):
return jsonify({'success': False, 'error': str(e)}), 500
@app.route('/api/events/<int:event_id>/sentiment-vote', methods=['POST'])
def vote_event_sentiment(event_id):
"""事件情绪投票(看多/看空)"""
if 'user_id' not in session:
return jsonify({'success': False, 'error': '未登录'}), 401
try:
event = Event.query.get_or_404(event_id)
user_id = session['user_id']
data = request.get_json() or {}
vote_type = data.get('vote_type') # 'bullish', 'bearish', 或 null/None取消投票
# 验证投票类型
if vote_type and vote_type not in ('bullish', 'bearish'):
return jsonify({'success': False, 'error': '无效的投票类型'}), 400
existing = EventSentimentVote.query.filter_by(user_id=user_id, event_id=event_id).first()
old_vote_type = existing.vote_type if existing else None
if vote_type is None or vote_type == '':
# 取消投票
if existing:
if old_vote_type == 'bullish':
event.bullish_count = max(0, (event.bullish_count or 0) - 1)
elif old_vote_type == 'bearish':
event.bearish_count = max(0, (event.bearish_count or 0) - 1)
db.session.delete(existing)
elif existing:
# 更新投票
if old_vote_type != vote_type:
# 减少旧投票计数
if old_vote_type == 'bullish':
event.bullish_count = max(0, (event.bullish_count or 0) - 1)
elif old_vote_type == 'bearish':
event.bearish_count = max(0, (event.bearish_count or 0) - 1)
# 增加新投票计数
if vote_type == 'bullish':
event.bullish_count = (event.bullish_count or 0) + 1
elif vote_type == 'bearish':
event.bearish_count = (event.bearish_count or 0) + 1
existing.vote_type = vote_type
else:
# 新建投票
vote = EventSentimentVote(user_id=user_id, event_id=event_id, vote_type=vote_type)
db.session.add(vote)
if vote_type == 'bullish':
event.bullish_count = (event.bullish_count or 0) + 1
elif vote_type == 'bearish':
event.bearish_count = (event.bearish_count or 0) + 1
db.session.commit()
# 查询当前用户的投票状态
current_vote = EventSentimentVote.query.filter_by(user_id=user_id, event_id=event_id).first()
return jsonify({
'success': True,
'data': {
'user_vote': current_vote.vote_type if current_vote else None,
'bullish_count': event.bullish_count or 0,
'bearish_count': event.bearish_count or 0,
}
})
except Exception as e:
db.session.rollback()
return jsonify({'success': False, 'error': str(e)}), 500
@app.route('/api/events/<int:event_id>/transmission', methods=['GET'])
def get_transmission_chain(event_id):
try:
@@ -10968,6 +11057,19 @@ def api_get_events():
query = query.order_by(order_func(Event.view_count))
# 分页
paginated = query.paginate(page=page, per_page=per_page, error_out=False)
# 查询当前用户的投票状态
user_vote_map = {}
if 'user_id' in session:
user_id = session['user_id']
event_ids = [event.id for event in paginated.items]
if event_ids:
user_votes = EventSentimentVote.query.filter(
EventSentimentVote.user_id == user_id,
EventSentimentVote.event_id.in_(event_ids)
).all()
user_vote_map = {v.event_id: v.vote_type for v in user_votes}
events_data = []
for event in paginated.items:
event_dict = {
@@ -10988,6 +11090,9 @@ def api_get_events():
'view_count': event.view_count,
'post_count': event.post_count,
'follower_count': event.follower_count,
'bullish_count': event.bullish_count or 0,
'bearish_count': event.bearish_count or 0,
'user_vote': user_vote_map.get(event.id), # 用户投票状态
'related_avg_chg': event.related_avg_chg,
'related_max_chg': event.related_max_chg,
'related_week_chg': event.related_week_chg,