1
0
Fork 0
EnglishPal/app/admin_service.py

157 lines
5.0 KiB
Python
Raw Normal View History

# System Library
2023-06-04 00:35:43 +08:00
from flask import Blueprint, session, render_template, request, flash
# Personal library
2023-03-20 20:16:48 +08:00
from Yaml import yml
2023-06-04 00:35:43 +08:00
from model.user import get_users, update_password_by_username
from model.user import update_expiry_time_by_username, get_user_by_username
from model.article import get_number_of_articles, get_page_articles
from model.article import delete_article_by_id, add_article
2023-03-20 20:19:56 +08:00
ADMIN_NAME = "lanhui" # unique admin name
2023-03-20 20:16:48 +08:00
_cur_page = 1 # current article page
_page_size = 5 # article sizes per page
adminService = Blueprint("admin_service", __name__)
def check_is_admin():
2023-03-20 20:16:48 +08:00
# 未登录,跳转到未登录界面
if not session.get("logged_in"):
return render_template("not_login.html")
# 用户名不是admin_name
if session.get("username") != ADMIN_NAME:
2023-03-20 20:16:48 +08:00
return "You are not admin!"
return "pass"
@adminService.route("/admin", methods=["GET"])
def admin():
2023-06-04 00:35:43 +08:00
'''
判断是否是管理员登录
return不同页面
'''
is_admin = check_is_admin()
if is_admin != "pass":
return is_admin
return render_template(
"admin_index.html", yml=yml, username=session.get("username")
)
@adminService.route("/admin/article", methods=["GET", "POST"])
def article():
2023-06-04 00:35:43 +08:00
'''
管理文章
可添加文章删除文章
return:不同页面
'''
global _cur_page, _page_size
is_admin = check_is_admin()
if is_admin != "pass":
return is_admin
2023-03-23 17:34:37 +08:00
_article_number = get_number_of_articles()
2023-03-20 20:16:48 +08:00
try:
_page_size = min(
2023-03-23 17:34:37 +08:00
max(1, int(request.args.get("size", 5))), _article_number
) # 最小的size是1
_cur_page = min(
2023-06-04 00:35:43 +08:00
max(1, int(request.args.get("page", 1))),
_article_number // _page_size + (_article_number % _page_size > 0)
) # 最小的page是1
2023-03-20 20:16:48 +08:00
except ValueError:
return "page parmas must be int!"
2023-03-23 17:34:37 +08:00
_articles = get_page_articles(_cur_page, _page_size)
2023-06-04 00:35:43 +08:00
for _article in _articles: # 获取每篇文章的title
_article.title = _article.text.split("\n")[0]
_article.content = '<br/>'.join(_article.text.split("\n")[1:])
2023-03-20 20:16:48 +08:00
context = {
2023-03-23 17:34:37 +08:00
"article_number": _article_number,
"text_list": _articles,
2023-03-20 20:16:48 +08:00
"page_size": _page_size,
"cur_page": _cur_page,
"username": session.get("username"),
2023-03-20 20:16:48 +08:00
}
def _update_context():
article_len = get_number_of_articles()
context["article_number"] = article_len
2023-03-20 20:16:48 +08:00
context["text_list"] = get_page_articles(_cur_page, _page_size)
2023-03-25 20:41:09 +08:00
_articles = get_page_articles(_cur_page, _page_size)
2023-06-04 00:35:43 +08:00
for _article in _articles: # 获取每篇文章的title
_article.title = _article.text.split("\n")[0]
2023-03-25 20:41:09 +08:00
context["text_list"] = _articles
2023-03-20 20:16:48 +08:00
if request.method == "GET":
try:
delete_id = int(request.args.get("delete_id", 0))
2023-06-04 00:35:43 +08:00
except ValueError:
return "Delete article ID must be int!"
if delete_id: # delete article
delete_article_by_id(delete_id)
2023-03-20 20:16:48 +08:00
_update_context()
2023-06-04 00:35:43 +08:00
else:
2023-03-20 20:16:48 +08:00
data = request.form
content = data.get("content", "")
source = data.get("source", "")
question = data.get("question", "")
level = data.get("level", "4")
2023-03-20 20:16:48 +08:00
if content:
if level not in ['1', '2', '3', '4']:
return "Level must be between 1 and 4."
add_article(content, source, level, question)
2023-03-20 20:16:48 +08:00
_update_context()
title = content.split('\n')[0]
flash(f'Article added. Title: {title}')
return render_template("admin_manage_article.html", **context)
2023-03-20 20:16:48 +08:00
@adminService.route("/admin/user", methods=["GET", "POST"])
def user():
2023-06-04 00:35:43 +08:00
'''
用户管理
可修改用户密码过期日期
return不同页面
'''
is_admin = check_is_admin()
if is_admin != "pass":
return is_admin
context = {
"user_list": get_users(),
"username": session.get("username"),
}
if request.method == "POST":
data = request.form
2023-06-04 00:35:43 +08:00
username = data.get("username", "")
new_password = data.get("new_password", "")
expiry_time = data.get("expiry_time", "")
if username:
if new_password:
update_password_by_username(username, new_password)
flash(f'Password updated to {new_password}')
if expiry_time:
update_expiry_time_by_username(username, "".join(expiry_time.split("-")))
flash(f'Expiry date updated to {expiry_time}.')
return render_template("admin_manage_user.html", **context)
2023-03-31 13:39:28 +08:00
@adminService.route("/admin/expiry", methods=["GET"])
def user_expiry_time():
2023-06-04 00:35:43 +08:00
'''
返回用户的过期日期
'''
2023-03-31 13:39:28 +08:00
is_admin = check_is_admin()
if is_admin != "pass":
return is_admin
2023-04-01 16:07:59 +08:00
2023-03-31 13:39:28 +08:00
username = request.args.get("username", "")
if not username:
2023-04-01 16:07:59 +08:00
return "Username can't be empty."
2023-06-04 00:35:43 +08:00
existed_user = get_user_by_username(username)
if not existed_user:
2023-04-01 16:07:59 +08:00
return "User does not exist."
2023-06-04 00:35:43 +08:00
return existed_user.expiry_date