Browse Source

feat: 管理员管理博文系统

SongZihuan 3 years ago
parent
commit
1504a0ac4a

+ 33 - 1
app/news/views.py

@@ -3,6 +3,7 @@ from flask_wtf import FlaskForm
 from wtforms import TextAreaField, SubmitField
 from wtforms.validators import DataRequired
 from flask_login import login_required, current_user
+import functools
 
 from tool.typing import Optional
 
@@ -21,6 +22,13 @@ class WriteForm(FlaskForm):
     submit = SubmitField()
 
 
+class NewDelete(FlaskForm):
+    """
+    删除内容表单
+    """
+    submit = SubmitField()
+
+
 @news.route('/', methods=['GET', 'POST'])
 @login_required
 def index():
@@ -43,8 +51,32 @@ def index():
     res, context_list, page_list = views.website.get_news(page)
     if not res:
         abort(404)
+    delete_form = NewDelete()
     return render_template("news/news.html", form=write_form, context_list=context_list,
-                           page_list=page_list, page=f"{page}")
+                           page_list=page_list, page=f"{page}", news_delete=delete_form)
+
+
+def manager_required(f):
+    @functools.wraps(f)
+    def func(*args, **kwargs):
+        if not current_user.is_manager():
+            abort(403)
+        return f(*args, **kwargs)
+
+    return func
+
+
+@news.route('/delete', methods=['POST'])
+@login_required
+@manager_required
+def delete():
+    context_id = request.args.get("context")
+    if context_id is None:
+        abort(404)
+    if not views.website.delete_news(context_id):
+        abort(404)
+    flash(f"删除内容 {context_id} 成功")
+    return redirect(url_for("news.index"))
 
 
 def creat_news_website(app_: Flask):

+ 7 - 0
app/static/styles/news/news.css

@@ -51,6 +51,13 @@
     float: right;
 }
 
+.news-delete {
+    margin-left: 10px;
+    margin-right: 10px;
+    font-size: 15px;
+    float: right;
+}
+
 .news-content {
     display: block;
     clear: both;

+ 1 - 1
app/templates/base.html

@@ -50,7 +50,7 @@
                 积分商城 </a></li>
 
             <li class="nav-top-item"><a class="nav-top-item" href="{{ url_for('news.index', page=1) }}">
-                新闻 </a></li>
+                博客 </a></li>
 
             {% if current_user.is_authenticated %}
                 <li class="nav-top-item"><a class="nav-top-item" href="{{ url_for('auth.about') }}">

+ 4 - 4
app/templates/news/news.html

@@ -6,11 +6,11 @@
     <link href="{{ url_for('static', filename='styles/news/news.css') }}" rel="stylesheet">
 {% endblock %}
 
-{% block title %} 新闻 {% endblock %}
-{% block h1_title %} 新闻 {% endblock %}
+{% block title %} 博客 {% endblock %}
+{% block h1_title %} 博客 {% endblock %}
 
 {% block content %}
-    <h2 class="h2-title"> 发表意见 </h2>
+    <h2 class="h2-title"> 发表博文 </h2>
     <form class="writer clearfix" action="{{ url_for('news.index', page=1) }}" method="post">
         {{ form.hidden_tag() }}
         {{ form.context(id="writer-context") }}
@@ -18,6 +18,6 @@
     </form>
 
     <h2 class="h2-title"> 最新消息 </h2>
-    {{ news.get_context_list(context_list) }}
+    {{ news.get_context_list(context_list, current_user, news_delete) }}
     {{ macro.get_page_list(page_list, page) }}
 {% endblock %}

+ 8 - 1
app/templates/news/news_macro.html

@@ -1,8 +1,15 @@
-{% macro get_context_list(info_lines) %}
+{% macro get_context_list(info_lines, user, form) %}
     {% for line in info_lines %}
         <section class="news">
             <p class="news-author"> 作者:{{ line[2] }} </p>
             <p class="news-time"> 发表时间: {{ line[3] }} </p>
+            {% if user.is_manager() %}
+                {# 只有管理员会显示该表单 #}
+                <form action="{{ url_for('news.delete', context=line[0]) }}" method="post">
+                    {{ form.hidden_tag() }}
+                    {{ form.submit(value="删除", class="news-delete") }}
+                </form>
+            {% endif %}
             <p class="news-content"> {{ line[1] }} </p>
             <hr>
         </section>

+ 4 - 1
app/web.py

@@ -13,7 +13,7 @@ from sql import DBBit
 from sql.db import DB
 from sql.garbage import count_garbage_by_uid, get_garbage_by_uid
 from sql.user import find_user_by_name, find_user_by_id, get_rank_for_user, count_all_user
-from sql.news import write_news, get_news, get_news_count
+from sql.news import write_news, get_news, get_news_count, delete_news
 from sql.store import check_order, get_goods_from_order
 
 from . import web_user
@@ -132,6 +132,9 @@ class NewsWebsite(WebsiteBase):
             return False, None, None
         return True, news_list, get_page("news.index", page, count)
 
+    def delete_news(self, context_id: str):
+        return delete_news(context_id, self._db)
+
 
 class Website(AuthWebsite, StoreWebsite, RankWebsite, NewsWebsite, WebsiteBase):
     def __init__(self, app: Flask, db: DB):

+ 9 - 0
sql/news.py

@@ -38,3 +38,12 @@ def get_news_count(db: DB):
         return 0
     assert cur.rowcount == 1
     return int(cur.fetchone()[0])
+
+
+def delete_news(context_id: str, db: DB):
+    cur = db.delete(table="context",
+                    where=f"ContextID={context_id}")
+    if cur is None or cur.rowcount == 0:
+        return False
+    assert cur.rowcount == 1
+    return True