事件标记线bug修复
This commit is contained in:
105
app.py
105
app.py
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user