149 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
# System Library
 | 
						|
from flask import *
 | 
						|
from markupsafe import escape
 | 
						|
 | 
						|
# Personal library
 | 
						|
from Yaml import yml
 | 
						|
from model.user import *
 | 
						|
from model.article import *
 | 
						|
 | 
						|
ADMIN_NAME = "lanhui"  # unique admin name
 | 
						|
_cur_page = 1  # current article page
 | 
						|
_page_size = 5  # article sizes per page
 | 
						|
adminService = Blueprint("admin_service", __name__)
 | 
						|
 | 
						|
 | 
						|
def check_is_admin():
 | 
						|
    # 未登录,跳转到未登录界面
 | 
						|
    if not session.get("logged_in"):
 | 
						|
        return render_template("not_login.html")
 | 
						|
 | 
						|
    # 用户名不是admin_name
 | 
						|
    if session.get("username") != ADMIN_NAME:
 | 
						|
        return "You are not admin!"
 | 
						|
 | 
						|
    return "pass"
 | 
						|
 | 
						|
 | 
						|
@adminService.route("/admin", methods=["GET"])
 | 
						|
def admin():
 | 
						|
    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():
 | 
						|
 | 
						|
    def _make_title_and_content(article_lst):
 | 
						|
        for article in article_lst:
 | 
						|
            text = escape(article.text) # Fix XSS vulnerability, contributed by Xu Xuan
 | 
						|
            article.title = text.split("\n")[0]
 | 
						|
            article.content = '<br/>'.join(text.split("\n")[1:])
 | 
						|
 | 
						|
 | 
						|
    def _update_context():
 | 
						|
        article_len = get_number_of_articles()
 | 
						|
        context["article_number"] = article_len
 | 
						|
        context["text_list"] = get_page_articles(_cur_page, _page_size)
 | 
						|
        _articles = get_page_articles(_cur_page, _page_size)
 | 
						|
        _make_title_and_content(_articles)
 | 
						|
        context["text_list"] = _articles
 | 
						|
 | 
						|
    global _cur_page, _page_size
 | 
						|
 | 
						|
    is_admin = check_is_admin()
 | 
						|
    if is_admin != "pass":
 | 
						|
        return is_admin
 | 
						|
 | 
						|
    _article_number = get_number_of_articles()
 | 
						|
 | 
						|
    try:
 | 
						|
        _page_size = min(max(1, int(request.args.get("size", 5))), _article_number)  # 最小的size是1
 | 
						|
        _cur_page = min(max(1, int(request.args.get("page", 1))), _article_number // _page_size + (_article_number % _page_size > 0))  # 最小的page是1
 | 
						|
    except ValueError:
 | 
						|
        return "page parameters must be integer!"
 | 
						|
 | 
						|
    _articles = get_page_articles(_cur_page, _page_size)
 | 
						|
    _make_title_and_content(_articles)
 | 
						|
    
 | 
						|
    context = {
 | 
						|
        "article_number": _article_number,
 | 
						|
        "text_list": _articles,
 | 
						|
        "page_size": _page_size,
 | 
						|
        "cur_page": _cur_page,
 | 
						|
        "username": session.get("username"),
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    if request.method == "GET":
 | 
						|
        try:
 | 
						|
            delete_id = int(request.args.get("delete_id", 0))
 | 
						|
        except:
 | 
						|
            return "Delete article ID must be integer!"
 | 
						|
        if delete_id:  # delete article
 | 
						|
            delete_article_by_id(delete_id)
 | 
						|
            _update_context()
 | 
						|
 | 
						|
    elif request.method == "POST":
 | 
						|
        data = request.form
 | 
						|
        content = data.get("content", "")
 | 
						|
        source = data.get("source", "")
 | 
						|
        question = data.get("question", "")
 | 
						|
        level = data.get("level", "4")
 | 
						|
        if content:
 | 
						|
            if level not in ['1', '2', '3', '4']:
 | 
						|
                return "Level must be between 1 and 4."
 | 
						|
            add_article(content, source, level, question)
 | 
						|
            _update_context()
 | 
						|
            title = content.split('\n')[0]
 | 
						|
            flash(f'Article added. Title: {title}')
 | 
						|
 | 
						|
    return render_template("admin_manage_article.html", **context)
 | 
						|
 | 
						|
 | 
						|
@adminService.route("/admin/user", methods=["GET", "POST"])
 | 
						|
def user():
 | 
						|
    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
 | 
						|
        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)
 | 
						|
 | 
						|
 | 
						|
@adminService.route("/admin/expiry", methods=["GET"])
 | 
						|
def user_expiry_time():
 | 
						|
    is_admin = check_is_admin()
 | 
						|
    if is_admin != "pass":
 | 
						|
        return is_admin
 | 
						|
 | 
						|
    username = request.args.get("username", "")
 | 
						|
    if not username:
 | 
						|
        return "Username can't be empty."
 | 
						|
 | 
						|
    user = get_user_by_username(username)
 | 
						|
    if not user:
 | 
						|
        return "User does not exist."
 | 
						|
 | 
						|
    return user.expiry_date
 |