From 67b1462453d3e20354f7e88a9183c2253f9085fb Mon Sep 17 00:00:00 2001 From: wojiaoyishang <422880152@qq.com> Date: Sat, 11 Feb 2023 13:34:46 +0800 Subject: [PATCH] =?UTF-8?q?dev=E6=96=87=E4=BB=B6=E5=A4=B9=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E8=87=B3utils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/common/curd.py | 2 + applications/common/utils/__init__.py | 15 ++++ applications/{dev => common/utils}/console.py | 0 .../{dev => common/utils}/department.py | 0 applications/common/utils/mail.py | 86 +++++++++++++++++-- applications/{dev => common/utils}/power.py | 0 applications/{dev => common/utils}/role.py | 0 applications/{dev => common/utils}/user.py | 0 applications/common/utils/validate.py | 10 ++- applications/dev/__init__.py | 9 -- applications/dev/mail.py | 83 ------------------ applications/view/plugin/__init__.py | 4 +- plugins/helloworld/main.py | 2 - plugins/realip/__init__.py | 2 +- plugins/replacePage/__init__.py | 2 - 15 files changed, 107 insertions(+), 108 deletions(-) rename applications/{dev => common/utils}/console.py (100%) rename applications/{dev => common/utils}/department.py (100%) rename applications/{dev => common/utils}/power.py (100%) rename applications/{dev => common/utils}/role.py (100%) rename applications/{dev => common/utils}/user.py (100%) delete mode 100644 applications/dev/__init__.py delete mode 100644 applications/dev/mail.py diff --git a/applications/common/curd.py b/applications/common/curd.py index 9a4f16c..097a1dd 100644 --- a/applications/common/curd.py +++ b/applications/common/curd.py @@ -44,6 +44,8 @@ def auto_model_jsonify(data, model: db.Model): def model_to_dicts(schema: ma.Schema, data): """ + 将模型查询的数据对象转化为字典 + :param schema: schema类 :param model: sqlalchemy查询结果 :return: 返回单个查询结果 diff --git a/applications/common/utils/__init__.py b/applications/common/utils/__init__.py index e69de29..589ddd8 100644 --- a/applications/common/utils/__init__.py +++ b/applications/common/utils/__init__.py @@ -0,0 +1,15 @@ +from . import user +from . import role +from . import power +from . import department +from . import console +from . import gen_captcha +from . import http +from . import mail +from . import rights +from . import upload +from . import validate +from flask import Flask + +# 获取app应用实例,会被初始化插件时重新赋值 +app = None # type: Flask diff --git a/applications/dev/console.py b/applications/common/utils/console.py similarity index 100% rename from applications/dev/console.py rename to applications/common/utils/console.py diff --git a/applications/dev/department.py b/applications/common/utils/department.py similarity index 100% rename from applications/dev/department.py rename to applications/common/utils/department.py diff --git a/applications/common/utils/mail.py b/applications/common/utils/mail.py index eddc666..8c73474 100644 --- a/applications/common/utils/mail.py +++ b/applications/common/utils/mail.py @@ -1,13 +1,83 @@ +""" +集成了对 Pear Admin Flask 二次开发的的邮件操作,并给了相对应的示例。 +""" +from flask import current_app from flask_mail import Message -from applications.extensions.init_mail import mail +from applications.common.curd import model_to_dicts +from applications.common.helper import ModelFilter +from applications.extensions import db, flask_mail +from applications.models import Mail +from applications.schemas import MailOutSchema -# send_mail(subject='title', recipients=['123@qq.com'], content='body') -def send_mail(subject, recipients, content): +def get_all(receiver=None, subject=None, content=None): + """ + 获取邮件 + + 返回的列表中的字典构造如下:: + + { + "content": "", # html内容 + "create_at": "2022-12-25T10:51:17", # 时间 + "id": 17, # 邮件ID + "realname": "超级管理", # 创建者 + "receiver": "", # 接收者 + "subject": "" # 主题 + } + + :param receiver: 发送者 + :param subject: 邮件标题 + :param content: 邮件内容 + :return: 列表 + """ + # 查询参数构造 + mf = ModelFilter() + if receiver: + mf.contains(field_name="receiver", value=receiver) + if subject: + mf.contains(field_name="subject", value=subject) + if content: + mf.exact(field_name="content", value=content) + # orm查询 + # 使用分页获取data需要.items + mail = Mail.query.filter(mf.get_filter(Mail)).layui_paginate() + return model_to_dicts(schema=MailOutSchema, data=mail.items) + + +def add(receiver, subject, content, user_id): + """ + 发送一封邮件,若发送成功立刻提交数据库。 + + :param receiver: 接收者 多个用英文逗号隔开 + :param subject: 邮件主题 + :param content: 邮件 html + :param user_id: 发送用户ID(谁发送的?) 可以用 from flask_login import current_user ; current_user.id 来表示当前登录用户 + :return: 成功与否 + """ try: - message = Message(subject=subject, recipients=recipients, body=content) - mail.send(message) - except Exception as e: - print('邮箱发送出错了') - raise + msg = Message(subject=subject, recipients=receiver.split(";"), html=content) + flask_mail.send(msg) + except BaseException as e: + current_app.log_exception(e) + return False + + mail = Mail(receiver=receiver, subject=subject, content=content, user_id=user_id) + + db.session.add(mail) + db.session.commit() + return True + + +def delete(id): + """ + 删除邮件记录,立刻写入数据库。 + + :param id: 邮件ID + :return: 成功与否 + """ + res = Mail.query.filter_by(id=id).delete() + if not res: + return False + db.session.commit() + return True diff --git a/applications/dev/power.py b/applications/common/utils/power.py similarity index 100% rename from applications/dev/power.py rename to applications/common/utils/power.py diff --git a/applications/dev/role.py b/applications/common/utils/role.py similarity index 100% rename from applications/dev/role.py rename to applications/common/utils/role.py diff --git a/applications/dev/user.py b/applications/common/utils/user.py similarity index 100% rename from applications/dev/user.py rename to applications/common/utils/user.py diff --git a/applications/common/utils/validate.py b/applications/common/utils/validate.py index 05b8011..73e46e4 100644 --- a/applications/common/utils/validate.py +++ b/applications/common/utils/validate.py @@ -2,7 +2,15 @@ from flask import abort, make_response, jsonify, escape -def str_escape(s): +def str_escape(s: str) -> str: + """xss过滤,内部采用flask自带的过滤函数。 + 与原过滤函数不同的是此过滤函数将在 s 为 None 时返回 None。 + + :param s: 要过滤的字符串 + :type s: str + :return: s 为 None 时返回 None,否则过滤字符串后返回。 + :rtype: str + """ if not s: return None return str(escape(s)) diff --git a/applications/dev/__init__.py b/applications/dev/__init__.py deleted file mode 100644 index 4819129..0000000 --- a/applications/dev/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from applications.dev import user -from applications.dev import role -from applications.dev import power -from applications.dev import department -from applications.dev import console -from flask import Flask - -# 获取app应用实例,会被初始化插件时重新赋值 -app = None # type: Flask diff --git a/applications/dev/mail.py b/applications/dev/mail.py deleted file mode 100644 index 8c73474..0000000 --- a/applications/dev/mail.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -集成了对 Pear Admin Flask 二次开发的的邮件操作,并给了相对应的示例。 -""" -from flask import current_app -from flask_mail import Message - -from applications.common.curd import model_to_dicts -from applications.common.helper import ModelFilter -from applications.extensions import db, flask_mail -from applications.models import Mail -from applications.schemas import MailOutSchema - - -def get_all(receiver=None, subject=None, content=None): - """ - 获取邮件 - - 返回的列表中的字典构造如下:: - - { - "content": "", # html内容 - "create_at": "2022-12-25T10:51:17", # 时间 - "id": 17, # 邮件ID - "realname": "超级管理", # 创建者 - "receiver": "", # 接收者 - "subject": "" # 主题 - } - - :param receiver: 发送者 - :param subject: 邮件标题 - :param content: 邮件内容 - :return: 列表 - """ - # 查询参数构造 - mf = ModelFilter() - if receiver: - mf.contains(field_name="receiver", value=receiver) - if subject: - mf.contains(field_name="subject", value=subject) - if content: - mf.exact(field_name="content", value=content) - # orm查询 - # 使用分页获取data需要.items - mail = Mail.query.filter(mf.get_filter(Mail)).layui_paginate() - return model_to_dicts(schema=MailOutSchema, data=mail.items) - - -def add(receiver, subject, content, user_id): - """ - 发送一封邮件,若发送成功立刻提交数据库。 - - :param receiver: 接收者 多个用英文逗号隔开 - :param subject: 邮件主题 - :param content: 邮件 html - :param user_id: 发送用户ID(谁发送的?) 可以用 from flask_login import current_user ; current_user.id 来表示当前登录用户 - :return: 成功与否 - """ - try: - msg = Message(subject=subject, recipients=receiver.split(";"), html=content) - flask_mail.send(msg) - except BaseException as e: - current_app.log_exception(e) - return False - - mail = Mail(receiver=receiver, subject=subject, content=content, user_id=user_id) - - db.session.add(mail) - db.session.commit() - return True - - -def delete(id): - """ - 删除邮件记录,立刻写入数据库。 - - :param id: 邮件ID - :return: 成功与否 - """ - res = Mail.query.filter_by(id=id).delete() - if not res: - return False - db.session.commit() - return True diff --git a/applications/view/plugin/__init__.py b/applications/view/plugin/__init__.py index 22ce27a..cb10335 100644 --- a/applications/view/plugin/__init__.py +++ b/applications/view/plugin/__init__.py @@ -8,7 +8,7 @@ import json import traceback import importlib -import applications.dev +import applications.common.utils from applications.common.utils.rights import authorize plugin_bp = Blueprint('plugin', __name__, url_prefix='/plugin') @@ -16,7 +16,7 @@ PLUGIN_ENABLE_FOLDERS = [] def register_plugin_views(app: Flask): global PLUGIN_ENABLE_FOLDERS - applications.dev.app = app # 对app重新赋值 便于插件简单调用 + applications.common.utils.app = app # 对app重新赋值 便于插件简单调用 app.register_blueprint(plugin_bp) # 载入插件过程 # plugin_folder 配置的是插件的文件夹名 diff --git a/plugins/helloworld/main.py b/plugins/helloworld/main.py index 0f8f56e..f559210 100644 --- a/plugins/helloworld/main.py +++ b/plugins/helloworld/main.py @@ -1,5 +1,3 @@ -from applications.dev import * - from flask import render_template, Blueprint # 创建蓝图 diff --git a/plugins/realip/__init__.py b/plugins/realip/__init__.py index f1aee91..dee1d5a 100644 --- a/plugins/realip/__init__.py +++ b/plugins/realip/__init__.py @@ -4,7 +4,7 @@ import os import logging from flask import Flask, request -from applications.dev import console +from applications.common.utils import console # 获取插件所在的目录(结尾没有分割符号) dir_path = os.path.dirname(__file__).replace("\\", "/") diff --git a/plugins/replacePage/__init__.py b/plugins/replacePage/__init__.py index e973e20..3756f0a 100644 --- a/plugins/replacePage/__init__.py +++ b/plugins/replacePage/__init__.py @@ -2,9 +2,7 @@ 初始化插件 """ import os -import logging from flask import Flask, render_template_string -from applications.dev import console # 获取插件所在的目录(结尾没有分割符号) dir_path = os.path.dirname(__file__).replace("\\", "/")