123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- from app import constants, db
- from app.models import News, Comment, CommentLike
- from app.utils.common import user_login_data
- from app.utils.response_code import RET
- from . import news_bp
- from flask import render_template, current_app, abort, g, request, jsonify
- @news_bp.route("/<int:news_id>")
- @user_login_data
- def news_detail(news_id):
- try:
- cur_news = News.query.get(news_id)
- except Exception as e:
- current_app.logger.error(e)
- abort(404)
- if not cur_news:
- # 返回数据未找到的页面
- abort(404)
- cur_news.clicks += 1
- # 获取点击排行数据
- new_list = None
- try:
- news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
- except Exception as e:
- current_app.logger.error(e)
- click_news_list = []
- for news in news_list if news_list else []:
- click_news_list.append(news.to_dict())
- # 判断是否收藏该新闻,默认值为false
- is_collected = False
- # 判断用户是否收藏过该新闻
- if g.user:
- if cur_news in g.user.collection_news:
- is_collected = True
- # 获取当前新闻评论
- comments = []
- try:
- comments = (Comment.query.filter(Comment.news_id == news_id)) \
- .order_by(Comment.create_time.desc()).all()
- except Exception as e:
- current_app.logger.error(e)
- return jsonify(errno=RET.DBERR, errmsg="评论查询失败")
- # 获取评论点赞
- comment_like_ids = []
- if g.user:
- # 如果当前用户已登录
- try:
- comment_ids = [comment.id for comment in comments]
- if len(comment_ids) > 0:
- # 取到当前用户在当前新闻的所有评论点赞的记录
- comment_likes = CommentLike.query.filter(CommentLike.comment_id.in_(comment_ids),
- CommentLike.user_id == g.user.id).all()
- # 取出记录中所有的评论id
- comment_like_ids = [comment_like.comment_id for comment_like in comment_likes]
- except Exception as e:
- current_app.logger.error(e)
- comment_list = []
- for item in comments if comments else []:
- comment_dict = item.to_dict()
- comment_dict["is_like"] = False
- # 判断用户是否点赞该评论
- if g.user and item.id in comment_like_ids:
- comment_dict["is_like"] = True
- comment_list.append(comment_dict)
- data = {
- "news": cur_news.to_dict(),
- "user_info": g.user.to_dict() if g.user else None,
- "click_news_list": click_news_list,
- "is_collected": is_collected,
- "comments": comment_list
- }
- return render_template('news/detail.html', data=data)
- @news_bp.route("/news_collect", methods=['POST'])
- @user_login_data
- def news_collect():
- """新闻收藏"""
- user = g.user
- json_data = request.json
- print(type(json_data))
- news_id = json_data.get("news_id")
- action = json_data.get("action")
- if not user:
- return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")
- if not news_id:
- return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
- if action not in ("collect", "cancel_collect"):
- return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
- try:
- news = News.query.get(news_id)
- except Exception as e:
- current_app.logger.error(e)
- return jsonify(error=RET.DBERR, errmsg="查询数据失败")
- if not news:
- return jsonify(errno=RET.NODATA, errmsg="新闻数据不存在")
- if action == "collect":
- user.collection_news.append(news)
- else:
- user.collection_news.remove(news)
- try:
- db.session.commit()
- except Exception as e:
- current_app.logger.error(e)
- db.session.rollback()
- return jsonify(errno=RET.DBERR, errmsg="数据保存失败")
- return jsonify(errno=RET.OK, errmsg="操作成功")
- @news_bp.route("/news_comment", methods=['POST'])
- @user_login_data
- def add_news_comment():
- """添加评论"""
- user = g.user
- if not user:
- return jsonify(errno=RET.SESSIONERR, errmsg="用户未登陆")
- # 获取参数
- data_dict = request.json
- news_id = data_dict.get("news_id")
- comment_str = data_dict.get("comment")
- parent_id = data_dict.get("parent_id")
- if not all([news_id, comment_str]):
- jsonify(errno=RET.PARAMERR, errmsg="参数错误")
- try:
- news = News.query.get(news_id)
- except Exception as e:
- current_app.logger.error(e)
- return jsonify(errno=RET.DBERR, errmsg="数据查询失败")
- if not news:
- return jsonify(errno=RET.NODATA, errmsg="该新闻不存在")
- # 初始化模型,保存数据
- comment = Comment()
- comment.user_id = user.id
- comment.news_id = news_id
- comment.content = comment_str
- if parent_id:
- comment.parent_id = parent_id
- try:
- db.session.add(comment)
- db.session.commit()
- except Exception as e:
- current_app.logger.error(e)
- return jsonify(errno=RET.DBERR, errmsg="保存评论数据失败")
- # 返回响应
- return jsonify(errno=RET.OK, errmsg="评论成功", data=comment.to_dict())
- @news_bp.route("/comment_like", methods=['POST'])
- @user_login_data
- def set_comment_like():
- """评论点赞"""
- if not g.user:
- return jsonify(errno=RET.SESSIONERR, errmsg="用户未登陆")
- # 获取参数
- comment_id = request.json.get("comment_id")
- news_id = request.json.get("news_id")
- action = request.json.get("action")
- # 判断参数
- if not all([comment_id, news_id, action]):
- return jsonify(errno=RET.PARAMERR, errmsg="参数有误")
- # 查询评论数据
- try:
- comment = Comment.query.get(comment_id)
- except Exception as e:
- current_app.logger.error(e)
- return jsonify(errno=RET.DBERR, errmsg="数据查询失败")
- if not comment:
- return jsonify(errno=RET.NODATA, errmsg="评论数据不存在")
- if action == "add":
- comment_like = CommentLike.query.filter(CommentLike.comment_id == comment_id,
- CommentLike.user_id == g.user.id).first()
- if not comment_like:
- comment_like = CommentLike()
- comment_like.comment_id = comment_id
- comment_like.user_id = g.user.id
- db.session.add(comment_like)
- # 增加点赞条数
- comment.like_count += 1
- else:
- # 删除点赞数据
- comment_like = CommentLike.query.filter(CommentLike.comment_id == comment_id,
- CommentLike.user_id == g.user.id).first()
- if comment_like:
- db.session.delete(comment_like)
- # 减少点赞条数
- comment.like_count -= 1
- try:
- db.session.commit()
- except Exception as e:
- current_app.logger.error(e)
- db.session.rollback()
- return jsonify(errno=RET.DBERR, errmsg="数据更新失败")
- return jsonify(errno=RET.OK, errmsg="操作成功")
|