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
 |