msg.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from flask import Flask, Blueprint, render_template, abort, redirect, url_for, flash
  2. from flask_wtf import FlaskForm
  3. from flask_login import login_required, current_user
  4. from wtforms import TextAreaField, BooleanField, SubmitField
  5. from wtforms.validators import DataRequired
  6. from typing import Optional
  7. from view.base import App
  8. from sql.base import DBBit
  9. from core.user import User
  10. from core.msg import Message, load_message_list
  11. msg = Blueprint("msg", __name__)
  12. app: Optional[Flask] = None
  13. class WriteForm(FlaskForm):
  14. """
  15. 写新内容表单
  16. """
  17. context = TextAreaField(validators=[DataRequired()])
  18. secret = BooleanField("私密留言")
  19. submit = SubmitField("留言")
  20. @msg.route('/<int:page>')
  21. def msg_page(page: int = 1):
  22. if page < 1:
  23. abort(404)
  24. return
  25. msg_list = load_message_list(20, (page - 1) * 20,
  26. show_secret=current_user.check_role("ReadSecretMsg")) # 判断是否可读取私密内容
  27. max_page = App.get_max_page(Message.get_msg_count(), 20)
  28. page_list = App.get_page("docx.docx_page", page, max_page)
  29. return render_template("msg/msg.html",
  30. msg_list=msg_list,
  31. page_list=page_list,
  32. form=WriteForm(),
  33. is_secret=DBBit.BIT_1,
  34. show_delete=current_user.check_role("DeleteMsg"))
  35. @msg.route('/write', methods=["POST"])
  36. @login_required
  37. def write_msg_page():
  38. form = WriteForm()
  39. if form.validate_on_submit():
  40. auth: User = current_user
  41. if not auth.check_role("WriteMsg"): # 检查相应权限
  42. abort(403)
  43. return
  44. context = form.context.data
  45. secret = form.secret.data
  46. if Message(None, auth, context, secret, None).create():
  47. flash("留言成功")
  48. else:
  49. flash("留言失败")
  50. return redirect(url_for("msg.msg_page", page=1))
  51. abort(404)
  52. @msg.route('/delete/<int:msg_id>')
  53. @login_required
  54. def delete_msg_page(msg_id: int):
  55. if not current_user.check_role("DeleteMsg"):
  56. abort(403)
  57. return
  58. if Message(msg_id, None, None).delete():
  59. flash("留言删除成功")
  60. else:
  61. flash("留言删除失败")
  62. return redirect(url_for("msg.msg_page", page=1))
  63. @msg.context_processor
  64. def inject_base():
  65. return {"top_nav": ["", "", "", "active", "", ""]}
  66. class MsgApp(App):
  67. def __init__(self, import_name):
  68. super(MsgApp, self).__init__(import_name)
  69. global app
  70. app = self._app
  71. app.register_blueprint(msg, url_prefix="/msg")