From 552bf779247640b596894d33b7bef6f66149bdca Mon Sep 17 00:00:00 2001 From: wojiaoyishang Date: Thu, 30 Jan 2025 16:56:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3=E5=B9=B6?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A4=BA=E4=BE=8B=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/config.py | 2 +- docs/source/_static/插件目录规划.png | Bin 0 -> 25299 bytes docs/source/_static/添加菜单.png | Bin 0 -> 16779 bytes docs/source/practices/backend.rst | 5 + docs/source/practices/frontend.rst | 2 + docs/source/practices/plugin.rst | 233 +++++++++++++++++- plugins/giftManager/__init__.py | 12 + plugins/giftManager/cli/__init__.py | 96 ++++++++ plugins/giftManager/models/__init__.py | 12 + plugins/giftManager/schemas/__init__.py | 12 + .../templates/system/gift/add.html | 84 +++++++ .../templates/system/gift/edit.html | 91 +++++++ .../templates/system/gift/main.html | 205 +++++++++++++++ plugins/giftManager/view/gift.py | 142 +++++++++++ 14 files changed, 891 insertions(+), 5 deletions(-) create mode 100644 docs/source/_static/插件目录规划.png create mode 100644 docs/source/_static/添加菜单.png create mode 100644 plugins/giftManager/__init__.py create mode 100644 plugins/giftManager/cli/__init__.py create mode 100644 plugins/giftManager/models/__init__.py create mode 100644 plugins/giftManager/schemas/__init__.py create mode 100644 plugins/giftManager/templates/system/gift/add.html create mode 100644 plugins/giftManager/templates/system/gift/edit.html create mode 100644 plugins/giftManager/templates/system/gift/main.html create mode 100644 plugins/giftManager/view/gift.py diff --git a/applications/config.py b/applications/config.py index b5369f0..6f5b4a2 100644 --- a/applications/config.py +++ b/applications/config.py @@ -72,7 +72,7 @@ class BaseConfig: MAIL_DEFAULT_SENDER = MAIL_USERNAME # 插件配置,填写插件的文件名名称,默认不启用插件。 - PLUGIN_ENABLE_FOLDERS = [] + PLUGIN_ENABLE_FOLDERS = ["giftManager"] # Session 设置 PERMANENT_SESSION_LIFETIME = timedelta(days=7) diff --git a/docs/source/_static/插件目录规划.png b/docs/source/_static/插件目录规划.png new file mode 100644 index 0000000000000000000000000000000000000000..4a48ba76eebb91c360222f36ddbf87b8412f4a07 GIT binary patch literal 25299 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 ch3ws+ + + + 兑换码添加 + {% include 'system/common/header.html' %} + + +
+
+
+
+ + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+
+
+
+
+ + +
+
+
+{% include 'system/common/footer.html' %} + + + + \ No newline at end of file diff --git a/plugins/giftManager/templates/system/gift/edit.html b/plugins/giftManager/templates/system/gift/edit.html new file mode 100644 index 0000000..30ac3dc --- /dev/null +++ b/plugins/giftManager/templates/system/gift/edit.html @@ -0,0 +1,91 @@ + + + + 兑换码编辑 + {% include 'system/common/header.html' %} + + +
+
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+
+
+
+
+ + +
+
+
+{% include 'system/common/footer.html' %} + + + + \ No newline at end of file diff --git a/plugins/giftManager/templates/system/gift/main.html b/plugins/giftManager/templates/system/gift/main.html new file mode 100644 index 0000000..c654202 --- /dev/null +++ b/plugins/giftManager/templates/system/gift/main.html @@ -0,0 +1,205 @@ + + + + 兑换码管理 + {% include 'system/common/header.html' %} + + + +{# 查询表单 #} +
+
+
+
+ +
+ +
+ + +
+
+
+
+ +{# 用户表格 #} +
+
+
+
+
+
+
+ + + +{% raw %} + + + + + +{% endraw %} + + + + + + + + +{% include 'system/common/footer.html' %} + + + \ No newline at end of file diff --git a/plugins/giftManager/view/gift.py b/plugins/giftManager/view/gift.py new file mode 100644 index 0000000..cc4dfd2 --- /dev/null +++ b/plugins/giftManager/view/gift.py @@ -0,0 +1,142 @@ +import os + +from flask import Blueprint, request, render_template + +from ..models import Gift +from ..schemas import GiftSchema +from applications.extensions import db + +from applications.common.helper import ModelFilter +from applications.common.curd import enable_status, disable_status, delete_one_by_id, get_one_by_id +from applications.common.utils.http import table_api, success_api, fail_api +from applications.common.utils.rights import authorize + +# 获取插件所在的目录(结尾没有分割符号) +dir_path = os.path.dirname(__file__).replace("\\", "/") + +bp = Blueprint('gift', __name__, url_prefix='/system/gift', + template_folder=dir_path + '/../templates') + + +@bp.get('/') +@authorize("system:gift:main") +def index(): + return render_template('system/gift/main.html') + + +@bp.get('/add') +@authorize("system:gift:main") +def add(): + return render_template('system/gift/add.html') + + +@bp.get('/data') +@authorize("system:gift:main") +def data(): + key = request.args.get('key', type=str) + + mf = ModelFilter() + if key: + mf.vague('key', key) # 模糊查询 + + data, total, page, limit = db.session.query(Gift).filter(mf.get_filter(Gift)).layui_paginate_json(GiftSchema) + + return table_api( + data=data, + count=total, + limit=limit + ) + + +@bp.put('/enable') +@authorize("system:gift:edit") +def enable_api(): + data = request.get_json(force=True) + + if enable_status(Gift, data.get('id')): + return success_api(msg="启用成功") + + return success_api(msg="启用失败") + + +@bp.put('/disable') +@authorize("system:gift:edit") +def disable_api(): + req_json = request.get_json(force=True) + + if disable_status(Gift, req_json.get('id')): + return success_api(msg="禁用成功") + + return success_api(msg="禁用失败") + + +@bp.delete('/remove/') +@authorize("system:gift:remove") +def remove_api(_id): + if delete_one_by_id(Gift, _id): + return success_api(msg="删除成功") + + return success_api(msg="删除失败") + + +@bp.post('/save') +@authorize("system:gift:add", log=True) +def save(): + req_json = request.get_json(force=True) + + data = { + 'key': req_json.get('key'), + 'content': req_json.get('content'), + 'enable': req_json.get('enable'), + 'used': 0 + } + + # 效验参数 + if not all(list(data.keys())): + return fail_api(msg="参数不全") + + if not data['enable'].isdigit(): + return fail_api(msg="参数 enable 错误") + + try: + db.session.add(Gift(**data)) + db.session.commit() + return success_api(msg="添加成功") + except Exception as e: + return fail_api(msg="添加失败") + + +@bp.get('/edit/') +@authorize("system:gift:edit", log=True) +def edit(_id): + gift = get_one_by_id(Gift, _id) + return render_template('system/gift/edit.html', gift=gift) + + +@bp.post('/update') +@authorize("system:gift:edit", log=True) +def update(): + req_json = request.get_json(force=True) + + _id = req_json.get('id') + + data = { + 'key': req_json.get('key'), + 'content': req_json.get('content'), + 'enable': req_json.get('enable'), + 'used': 0 + } + + # 效验参数 + if not all(list(data.keys())): + return fail_api(msg="参数不全") + + if not data['enable'].isdigit(): + return fail_api(msg="参数 enable 错误") + + try: + db.session.query(Gift).filter(Gift.id == _id).update(data) + db.session.commit() + return success_api(msg="编辑成功") + except Exception as e: + return fail_api(msg="编辑失败")