123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- import time
- from datetime import datetime, timedelta
- from flask import render_template, request, current_app, session, g, redirect, url_for, jsonify
- from app import user_login_data, constants, db
- from app.models import User, News
- from app.utils.response_code import RET
- from . import admin_bp
- @admin_bp.route("/login", methods=["GET", "POST"])
- def admin_login():
- if request.method == "GET":
- # 获取session中指定的值
- user_id = session.get('user_id', None)
- is_admin = session.get('is_admin', False)
- # 如果用户id存在,并且是管理员,那么直接跳转管理后台主页
- if user_id and is_admin:
- return redirect(url_for('admin.admin_index'))
- return render_template('admin/login.html')
- # 取到登录的参数
- username = request.form.get("username")
- password = request.form.get("password")
- if not all([username, password]):
- return render_template('admin/login.html', errmsg='参数不足')
- try:
- user = User.query.filter(User.mobile == username).first()
- except Exception as e:
- current_app.logger.error(e)
- return render_template('admin/login.html', errmsg="数据查询失败")
- if not user:
- return render_template('admin/login.html', errmsg="用户不存在")
- if not user.check_passowrd(password):
- return render_template('admin/login.html', errmsg='密码错误')
- if not user.is_admin:
- return render_template('admin/login.html', errmsg='用户权限错误')
- session['user_id'] = user.id
- session['nick_name'] = user.nick_name
- session['mobile'] = user.mobile
- if user.is_admin:
- session['is_admin'] = True
- # 跳转到后台管理主页
- return redirect(url_for('admin.admin_index'))
- @admin_bp.route('/')
- @user_login_data
- def admin_index():
- """
- 站点主页
- :return:
- """
- # 读取登录用户的信息
- user = g.user
- # 优化进入主页逻辑:如果管理员进入主页,必须要登录状态,反之就引导到登录界面
- if not user:
- return redirect(url_for('admin.admin_login'))
- # 构造渲染数据
- data = {
- 'user_info': user.to_dict()
- }
- # 渲染主页
- return render_template('admin/index.html', data=data)
- @admin_bp.route('/user_count')
- def user_count():
- # 查询总人数
- total_count = 0
- try:
- total_count = User.query.filter(User.is_admin == False).count()
- except Exception as e:
- current_app.logger.error(e)
- # 查询月新增数
- mon_count = 0
- try:
- now = time.localtime()
- mon_begin = '%d-%02d-01' % (now.tm_year, now.tm_mon)
- mon_begin_date = datetime.strptime(mon_begin, '%Y-%m-%d')
- mon_count = User.query.filter(User.is_admin == False, User.create_time >= mon_begin_date).count()
- except Exception as e:
- current_app.logger.error(e)
- # 查询日新增数
- day_count = 0
- try:
- day_begin = '%d-%02d-%02d' % (now.tm_year, now.tm_mon, now.tm_mday)
- day_begin_date = datetime.strptime(day_begin, '%Y-%m-%d')
- day_count = User.query.filter(User.is_admin == False, User.create_time > day_begin_date).count()
- except Exception as e:
- current_app.logger.error(e)
- # 查询图标信息
- # 获取到当天00:00:00时间
- now_date = datetime.strptime(datetime.now().strftime('%Y-%m-%d'), '%Y-%m-%d')
- # 定义空数组,保存数组
- active_date = []
- active_count = []
- # 依次添加数据,再反转
- for i in range(0, 31):
- begin_date = now_date - timedelta(days=i)
- end_date = now_date - timedelta(days=(i - 1))
- active_date.append(begin_date.strftime('%Y-%m-%d'))
- count = 0
- try:
- count = User.query.filter(User.is_admin == False, User.last_login >= begin_date,
- User.last_login < end_date).count()
- except Exception as e:
- current_app.logger.error(e)
- active_count.append(count)
- active_date.reverse()
- active_count.reverse()
- data = {
- "total_count": total_count,
- "mon_count": mon_count,
- "day_count": day_count,
- "active_date": active_date,
- "active_count": active_count
- }
- return render_template('admin/user_count.html', data=data)
- @admin_bp.route('/user_list')
- def user_list():
- """获取用户列表"""
- # 获取参数
- page = request.args.get('p', 1)
- try:
- page = int(page)
- except Exception as e:
- current_app.logger.error(e)
- page = 1
- # 设置变量默认值
- users = []
- current_page = 1
- total_page = 1
- # 查询数据
- try:
- paginate = User.query.filter(User.is_admin == False) \
- .order_by(User.last_login.desc()) \
- .paginate(page, constants.ADMIN_NEWS_PAGE_MAX_COUNT, False)
- users = paginate.items
- current_page = paginate.page
- total_page = paginate.pages
- except Exception as e:
- current_app.logger.error(e)
- # 将模型列表转成字典列表
- users_list = []
- for user in users:
- users_list.append(user.to_admin_dict())
- data = {
- "total_page": total_page,
- "current_page": current_page,
- "users": users_list
- }
- return render_template("admin/user_list.html", data=data)
- @admin_bp.route('/news_review')
- def news_review():
- """返回待审核新闻列表"""
- page = request.args.get("p", 1)
- try:
- page = int(page)
- except Exception as e:
- current_app.logger.error(e)
- page = 1
- news_list = []
- current_page = 1
- total_page = 1
- try:
- paginate = News.query.filter(News.status != 0) \
- .order_by(News.create_time.desc()) \
- .paginate(page, constants.ADMIN_NEWS_PAGE_MAX_COUNT, False)
- news_list = paginate.items
- current_page = paginate.page
- total_page = paginate.pages
- except Exception as e:
- current_app.logger.error(e)
- news_dict_list = []
- for news in news_list:
- news_dict_list.append(news.to_review_dict())
- data = {
- "total_page": total_page,
- "current_page": current_page,
- "news_list": news_dict_list
- }
- return render_template('admin/news_review.html', data=data)
- @admin_bp.route('/news_review_detail', methods=["GET", "POST"])
- def news_review_detail():
- """新闻审核"""
- if request.method == "GET":
- # 获取新闻id
- news_id = request.args.get("news_id")
- if not news_id:
- return render_template("admin/news_review_detail.html", data={"errmsg", "未查询到该新闻"})
- # 通过id查询新闻
- try:
- news = News.query.get(news_id)
- except Exception as e:
- current_app.logger.error(e)
- if not news:
- return render_template("admin/news_review_detail.html", data={"errmsg", "未查询到该新闻"})
- # 返回数据
- data = {
- "news": news.to_dict()
- }
- return render_template("admin/news_review_detail.html", data=data)
- # 执行审核操作
- # 1.获取参数
- news_id = request.json.get("news_id")
- action = request.json.get("action")
- # 2.判断参数
- if not all([news_id, action]):
- return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
- if action not in ("accept", "reject"):
- return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
- news = None
- try:
- # 3.查询新闻
- news = News.query.get(news_id)
- except Exception as e:
- current_app.logger.error(e)
- if not news:
- return jsonify(errno=RET.NODATA, errmsg="未查询到数据")
- # 4.根据不同的状态设置不同的值
- if action == "accept":
- news.status = 0
- else:
- # 拒绝通过,需要获取原因
- reason = request.json.get("reson")
- if not reason:
- return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
- news.reason = reason
- news.status = -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="操作成功")
|