views.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. import time
  2. from datetime import datetime, timedelta
  3. from flask import render_template, request, current_app, session, g, redirect, url_for, jsonify
  4. from app import user_login_data, constants, db
  5. from app.models import User, News
  6. from app.utils.response_code import RET
  7. from . import admin_bp
  8. @admin_bp.route("/login", methods=["GET", "POST"])
  9. def admin_login():
  10. if request.method == "GET":
  11. # 获取session中指定的值
  12. user_id = session.get('user_id', None)
  13. is_admin = session.get('is_admin', False)
  14. # 如果用户id存在,并且是管理员,那么直接跳转管理后台主页
  15. if user_id and is_admin:
  16. return redirect(url_for('admin.admin_index'))
  17. return render_template('admin/login.html')
  18. # 取到登录的参数
  19. username = request.form.get("username")
  20. password = request.form.get("password")
  21. if not all([username, password]):
  22. return render_template('admin/login.html', errmsg='参数不足')
  23. try:
  24. user = User.query.filter(User.mobile == username).first()
  25. except Exception as e:
  26. current_app.logger.error(e)
  27. return render_template('admin/login.html', errmsg="数据查询失败")
  28. if not user:
  29. return render_template('admin/login.html', errmsg="用户不存在")
  30. if not user.check_passowrd(password):
  31. return render_template('admin/login.html', errmsg='密码错误')
  32. if not user.is_admin:
  33. return render_template('admin/login.html', errmsg='用户权限错误')
  34. session['user_id'] = user.id
  35. session['nick_name'] = user.nick_name
  36. session['mobile'] = user.mobile
  37. if user.is_admin:
  38. session['is_admin'] = True
  39. # 跳转到后台管理主页
  40. return redirect(url_for('admin.admin_index'))
  41. @admin_bp.route('/')
  42. @user_login_data
  43. def admin_index():
  44. """
  45. 站点主页
  46. :return:
  47. """
  48. # 读取登录用户的信息
  49. user = g.user
  50. # 优化进入主页逻辑:如果管理员进入主页,必须要登录状态,反之就引导到登录界面
  51. if not user:
  52. return redirect(url_for('admin.admin_login'))
  53. # 构造渲染数据
  54. data = {
  55. 'user_info': user.to_dict()
  56. }
  57. # 渲染主页
  58. return render_template('admin/index.html', data=data)
  59. @admin_bp.route('/user_count')
  60. def user_count():
  61. # 查询总人数
  62. total_count = 0
  63. try:
  64. total_count = User.query.filter(User.is_admin == False).count()
  65. except Exception as e:
  66. current_app.logger.error(e)
  67. # 查询月新增数
  68. mon_count = 0
  69. try:
  70. now = time.localtime()
  71. mon_begin = '%d-%02d-01' % (now.tm_year, now.tm_mon)
  72. mon_begin_date = datetime.strptime(mon_begin, '%Y-%m-%d')
  73. mon_count = User.query.filter(User.is_admin == False, User.create_time >= mon_begin_date).count()
  74. except Exception as e:
  75. current_app.logger.error(e)
  76. # 查询日新增数
  77. day_count = 0
  78. try:
  79. day_begin = '%d-%02d-%02d' % (now.tm_year, now.tm_mon, now.tm_mday)
  80. day_begin_date = datetime.strptime(day_begin, '%Y-%m-%d')
  81. day_count = User.query.filter(User.is_admin == False, User.create_time > day_begin_date).count()
  82. except Exception as e:
  83. current_app.logger.error(e)
  84. # 查询图标信息
  85. # 获取到当天00:00:00时间
  86. now_date = datetime.strptime(datetime.now().strftime('%Y-%m-%d'), '%Y-%m-%d')
  87. # 定义空数组,保存数组
  88. active_date = []
  89. active_count = []
  90. # 依次添加数据,再反转
  91. for i in range(0, 31):
  92. begin_date = now_date - timedelta(days=i)
  93. end_date = now_date - timedelta(days=(i - 1))
  94. active_date.append(begin_date.strftime('%Y-%m-%d'))
  95. count = 0
  96. try:
  97. count = User.query.filter(User.is_admin == False, User.last_login >= begin_date,
  98. User.last_login < end_date).count()
  99. except Exception as e:
  100. current_app.logger.error(e)
  101. active_count.append(count)
  102. active_date.reverse()
  103. active_count.reverse()
  104. data = {
  105. "total_count": total_count,
  106. "mon_count": mon_count,
  107. "day_count": day_count,
  108. "active_date": active_date,
  109. "active_count": active_count
  110. }
  111. return render_template('admin/user_count.html', data=data)
  112. @admin_bp.route('/user_list')
  113. def user_list():
  114. """获取用户列表"""
  115. # 获取参数
  116. page = request.args.get('p', 1)
  117. try:
  118. page = int(page)
  119. except Exception as e:
  120. current_app.logger.error(e)
  121. page = 1
  122. # 设置变量默认值
  123. users = []
  124. current_page = 1
  125. total_page = 1
  126. # 查询数据
  127. try:
  128. paginate = User.query.filter(User.is_admin == False) \
  129. .order_by(User.last_login.desc()) \
  130. .paginate(page, constants.ADMIN_NEWS_PAGE_MAX_COUNT, False)
  131. users = paginate.items
  132. current_page = paginate.page
  133. total_page = paginate.pages
  134. except Exception as e:
  135. current_app.logger.error(e)
  136. # 将模型列表转成字典列表
  137. users_list = []
  138. for user in users:
  139. users_list.append(user.to_admin_dict())
  140. data = {
  141. "total_page": total_page,
  142. "current_page": current_page,
  143. "users": users_list
  144. }
  145. return render_template("admin/user_list.html", data=data)
  146. @admin_bp.route('/news_review')
  147. def news_review():
  148. """返回待审核新闻列表"""
  149. page = request.args.get("p", 1)
  150. try:
  151. page = int(page)
  152. except Exception as e:
  153. current_app.logger.error(e)
  154. page = 1
  155. news_list = []
  156. current_page = 1
  157. total_page = 1
  158. try:
  159. paginate = News.query.filter(News.status != 0) \
  160. .order_by(News.create_time.desc()) \
  161. .paginate(page, constants.ADMIN_NEWS_PAGE_MAX_COUNT, False)
  162. news_list = paginate.items
  163. current_page = paginate.page
  164. total_page = paginate.pages
  165. except Exception as e:
  166. current_app.logger.error(e)
  167. news_dict_list = []
  168. for news in news_list:
  169. news_dict_list.append(news.to_review_dict())
  170. data = {
  171. "total_page": total_page,
  172. "current_page": current_page,
  173. "news_list": news_dict_list
  174. }
  175. return render_template('admin/news_review.html', data=data)
  176. @admin_bp.route('/news_review_detail', methods=["GET", "POST"])
  177. def news_review_detail():
  178. """新闻审核"""
  179. if request.method == "GET":
  180. # 获取新闻id
  181. news_id = request.args.get("news_id")
  182. if not news_id:
  183. return render_template("admin/news_review_detail.html", data={"errmsg", "未查询到该新闻"})
  184. # 通过id查询新闻
  185. try:
  186. news = News.query.get(news_id)
  187. except Exception as e:
  188. current_app.logger.error(e)
  189. if not news:
  190. return render_template("admin/news_review_detail.html", data={"errmsg", "未查询到该新闻"})
  191. # 返回数据
  192. data = {
  193. "news": news.to_dict()
  194. }
  195. return render_template("admin/news_review_detail.html", data=data)
  196. # 执行审核操作
  197. # 1.获取参数
  198. news_id = request.json.get("news_id")
  199. action = request.json.get("action")
  200. # 2.判断参数
  201. if not all([news_id, action]):
  202. return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
  203. if action not in ("accept", "reject"):
  204. return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
  205. news = None
  206. try:
  207. # 3.查询新闻
  208. news = News.query.get(news_id)
  209. except Exception as e:
  210. current_app.logger.error(e)
  211. if not news:
  212. return jsonify(errno=RET.NODATA, errmsg="未查询到数据")
  213. # 4.根据不同的状态设置不同的值
  214. if action == "accept":
  215. news.status = 0
  216. else:
  217. # 拒绝通过,需要获取原因
  218. reason = request.json.get("reson")
  219. if not reason:
  220. return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
  221. news.reason = reason
  222. news.status = -1
  223. # 保存数据库
  224. try:
  225. db.session.commit()
  226. except Exception as e:
  227. current_app.logger.error(e)
  228. db.session.rollback()
  229. return jsonify(errno=RET.DBERR, errmsg="数据保存失败")
  230. return jsonify(errno=RET.OK, errmsg="操作成功")