diff --git a/applications/common/utils/__init__.py b/applications/common/utils/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/applications/common/utils/http.py b/applications/common/utils/http.py index 75f4cd84c440b9602912c4a0dba4f9864bed0db2..680df5fc336e3a1895816ef2d7f24a79a9cca291 100644 --- a/applications/common/utils/http.py +++ b/applications/common/utils/http.py @@ -2,7 +2,7 @@ from flask import jsonify def success_api(msg: str = "成功"): - """ 成功响应 默认值”成功“ """ + """ 成功响应 默认值“成功” """ return jsonify(success=True, msg=msg) diff --git a/applications/common/utils/mail.py b/applications/common/utils/mail.py index eddc666e914b784f8c173771bfa20bad9cbde094..ecb29bb079cd9e0515b1f80d96176af21025dc2c 100644 --- a/applications/common/utils/mail.py +++ b/applications/common/utils/mail.py @@ -1,13 +1,96 @@ +""" +集成了对 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.extensions.init_mail import 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 + +def send_mail(subject, recipients, content): + """原发送邮件函数,不会记录邮件发送记录 + + 失败报错,请注意使用 try 拦截。 + + :param subject: 主题 + :param recipients: 接收者 多个用英文分号隔开 + :param content: 邮件 html + """ + message = Message(subject=subject, recipients=recipients, html=content) + mail.send(message) diff --git a/applications/common/utils/rights.py b/applications/common/utils/rights.py index 655593f0ce412514e96294522cd87e27954a7f29..5ae9e3135c4cf925c310139b2384094a374d1627 100644 --- a/applications/common/utils/rights.py +++ b/applications/common/utils/rights.py @@ -5,6 +5,13 @@ from applications.common.admin_log import admin_log def authorize(power: str, log: bool = False): + """用户权限判断,用于判断目前会话用户是否拥有访问权限 + + :param power: 权限标识 + :type power: str + :param log: 是否记录日志, defaults to False + :type log: bool, optional + """ def decorator(func): @login_required @wraps(func) diff --git a/applications/dev/__init__.py b/applications/dev/__init__.py deleted file mode 100644 index 48191296e75d3ad80d8356a22a9a6b89495b8ed3..0000000000000000000000000000000000000000 --- 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/console.py b/applications/dev/console.py deleted file mode 100644 index b658135ee9d894424dd0a51421f248690ac1d3c2..0000000000000000000000000000000000000000 --- a/applications/dev/console.py +++ /dev/null @@ -1,89 +0,0 @@ -""" -输出控制台日志 -""" -import sys -import time -import ctypes - -NONE = "\033[m" -RED = "\033[0;32;31m" -LIGHT_RED = "\033[1;31m" -GREEN = "\033[0;32;32m" -LIGHT_GREEN = "\033[1;32m" -BLUE = "\033[0;32;34m" -LIGHT_BLUE = "\033[1;34m" -DARY_GRAY = "\033[1;30m" -CYAN = "\033[0;36m" -LIGHT_CYAN = "\033[1;36m" -PURPLE = "\033[0;35m" -LIGHT_PURPLE = "\033[1;35m" -BROWN = "\033[0;33m" -YELLOW = "\033[1;33m" -LIGHT_GRAY = "\033[0;37m" -WHITE = "\033[1;37m" - -# 开启 Windows 下对于 ESC控制符 的支持 -if sys.platform == "win32": - kernel32 = ctypes.windll.kernel32 - kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7) - - -def _print(level, msg): - time_ = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) - - level_name = {10: "Plain", - 11: "Log", - 12: "Info", - 13: "Debug", - 14: "Success", - 15: "Warning", - 16: "Error"} - - color = {10: NONE, - 11: LIGHT_CYAN, - 12: LIGHT_BLUE, - 13: PURPLE, - 14: GREEN, - 15: YELLOW, - 16: RED} - - print(f'{color.get(level, NONE)}[{time_}]({level_name.get(level, "Plain")}):', msg, f"{NONE}") - - -def plain(*args, sep=' '): - msg = sep.join(str(_) for _ in args) - _print(10, msg) - - -def log(*args, sep=' '): - msg = sep.join(str(_) for _ in args) - _print(11, msg) - - -def info(*args, sep=' '): - msg = sep.join(str(_) for _ in args) - _print(12, msg) - - -def debug(*args, sep=' '): - msg = sep.join(str(_) for _ in args) - _print(13, msg) - - -def success(*args, sep=' '): - msg = sep.join(str(_) for _ in args) - _print(14, msg) - - -def warn(*args): - warning(*args) - - -def warning(*args, sep=' '): - msg = sep.join(str(_) for _ in args) - _print(15, msg) - - -def error(*args, sep=' '): - msg = sep.join(str(_) for _ in args) - _print(16, msg) diff --git a/applications/dev/department.py b/applications/dev/department.py deleted file mode 100644 index 388e0f8e99450ad96e0991be1c287afd77714f6e..0000000000000000000000000000000000000000 --- a/applications/dev/department.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -集成了对 Pear Admin Flask 的部门的操作,并给了相对应的示例。 -""" - -from applications.common import curd -from applications.extensions import db -from applications.models import Dept, User -from applications.schemas import DeptOutSchema - - -def get_all(): - """ - 获取全部权限,会返回一个列表,每个列表是一个字典。 - - 字典构成如下:: - - { - "address":"这是总公司", # 地址 - "deptId":1, # 公司ID - "deptName":"总公司", # 公司名 - "email":"1", # 公司 email - "leader":"", # 公司领导人 - "parentId":0, # 父ID - "phone":"", # 联系电话 - "sort":1, # 排序 - "status":"1" # 状态 1-开启 0-关闭 - } - - :return: 列表 - """ - dept = Dept.query.order_by(Dept.sort).all() - return curd.model_to_dicts(schema=DeptOutSchema, data=dept) - - -def add(parentId, deptName, sort, leader, phone, email, status, address): - """ - 添加一个公司 - - :param parentId: 父公司ID,0未总公司 - :param deptName: 公司名称 - :param sort: 排序 - :param leader: 负责人 - :param phone: 手机 - :param email: 邮箱 - :param status: 状态 1-打开 0-关闭 - :param address: 地址 - :return: 是否成功 - """ - dept = Dept( - parent_id=parentId, - dept_name=deptName, - sort=sort, - leader=leader, - phone=phone, - email=email, - status=status, - address=address - ) - r = db.session.add(dept) - db.session.commit() - if r: - return True - else: - return False - - -def update(deptId, data): - """ - 更新公司信息 - - 可更新内容如下:: - - "dept_name" - "sort" - "leader" - "phone" - "email" - "status" - "address" - - :param deptId: 公司ID - :param data: 要更新公司字典 - :return: 是否成功 - """ - d = Dept.query.filter_by(id=deptId).update(data) - if not d: - return False - db.session.commit() - return True - - -def delete(deptId): - """ - 删除公司 - - :param deptId: 公司ID - :return: 是否成功 - """ - d = Dept.query.filter_by(id=deptId).delete() - if not d: - return False - res = User.query.filter_by(dept_id=deptId).update({"dept_id": None}) - db.session.commit() - if res: - return True - else: - return False - diff --git a/applications/dev/mail.py b/applications/dev/mail.py deleted file mode 100644 index 8c734746021ca9d65d6dd03d2a21ebc77952dd05..0000000000000000000000000000000000000000 --- 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/dev/power.py b/applications/dev/power.py deleted file mode 100644 index 99d275723067a25f3da080a39a43877f36bde507..0000000000000000000000000000000000000000 --- a/applications/dev/power.py +++ /dev/null @@ -1,138 +0,0 @@ -""" -集成了对 Pear Admin Flask 的权限操作,并给了相对应的示例。 -注意:此权限相当于添加后台菜单。 -""" - -from applications.common import curd -from applications.extensions import db -from applications.models import Power - -from applications.extensions import ma -from marshmallow import fields - - -class PowerOutSchema2(ma.Schema): # 序列化类 - powerId = fields.Str(attribute="id") - powerName = fields.Str(attribute="name") - powerType = fields.Str(attribute="type") - powerUrl = fields.Str(attribute="url") - powerCode = fields.Str(attribute="code") - openType = fields.Str(attribute="open_type") - parentId = fields.Str(attribute="parent_id") - icon = fields.Str() - sort = fields.Integer() - create_time = fields.DateTime() - update_time = fields.DateTime() - enable = fields.Integer() - - -def get_all(): - """ - 获取所有权限,会返回一个含有菜单的列表。每个列表都是一个字典。 - - 字典构成如下:: - { - "powerType": "0", # 权限类型 0目录 1菜单 2按钮 - "powerUrl": None, # 路径 - "powerCode": "", # 权限标识 - "update_time": None, # 更新时间 - "sort": 1, # 排序 - "openType": None, # 打开方式 _iframe框架 _blank新页面 - "icon": "layui-icon layui-icon-set-fill", # 图标 - "powerName": "系统管理", # 名称 - "create_time": None, # 创建时间 - "parentId": "0", # 父id - "powerId": "1", # 自己的id - "enable": 1 # 是否启用 - } - - :return: 菜单列表。 - """ - power = Power.query.all() - res = curd.model_to_dicts(schema=PowerOutSchema2, data=power) - res.append({"powerId": 0, "powerName": "顶级权限", "parentId": -1}) - return res - - -def add(parentId, powerName, powerType, icon, sort: int, enable: bool, powerCode="", powerUrl="", openType=""): - """ - 新建一个菜单权限。 - - 参考代码:: - - dev.power.add("0", "测试", "1", "layui-icon-time", 0, True, "testfor", "https://baidu.com", "_iframe") - - :param parentId: 父ID,0为顶级菜单ID - :param powerName: 菜单名称 - :param powerType: 权限类型(状态) 0目录 1菜单 2按钮 - :param icon: 图标,详细查看layui的图标 - :param sort: 排序 - :param enable: 是否启用 - - :param powerCode: 权限标识 - :param powerUrl: 权限URL,菜单打开的网址,或者是路径。可选,菜单和按钮类型必填。 - :param openType: 打开方式,_iframe框架 _blank新页面。可选,菜单和按钮类型必填。 - - - - :return: 返回新权限ID - """ - power = Power( - icon=icon, - open_type=openType, - parent_id=parentId, - code=powerCode, - name=powerName, - type=powerType, - url=powerUrl, - sort=sort, - enable=1 - ) - r = db.session.add(power) - db.session.commit() - return power.id - - -def update(powerId, data): - """ - 更新权限。 - - data可选:: - - "icon" - "open_type" - "parent_id" - "code" - "name" - "type" - "url" - "sort" - - :param powerId: 要更新的权限ID - - :return: 是否成功 - """ - res = Power.query.filter_by(id=powerId).update(data) - db.session.commit() - if res: - return True - else: - return False - - -def delete(powerId): - """ - 删除权限。 - - :param powerId: 要更新的权限ID - :return: 是否成功 - """ - power = Power.query.filter_by(id=powerId).first() - power.role = [] - - r = Power.query.filter_by(id=powerId).delete() - db.session.commit() - if r: - return True - else: - return False diff --git a/applications/dev/role.py b/applications/dev/role.py deleted file mode 100644 index a0cc28682c9eb818d05f7c1297b99e00b4d656be..0000000000000000000000000000000000000000 --- a/applications/dev/role.py +++ /dev/null @@ -1,157 +0,0 @@ -""" -集成了对 Pear Admin Flask 的角色操作,并给了相对应的示例。 -""" -from applications.extensions import db -from applications.models import Role, Power -from applications.schemas import PowerOutSchema2 - - -def filter_by(**kwargs): - """ - 检索角色字段信息,可用于获取角色ID等。系统中默认管理员角色id为1,普通用户为2。 - 内部采用的是使用 Role.query.filter_by(**kwargs) 进行数据库查询。 - - 注意:此函数返回的结果为构造的 SQL的查询字符串 ,以 role_filter 命名,但是并不是用户数据。 - - 返回的字段如下:: - - id name code enable remark details sort create_time update_time power - 具体参考 applications/models/admin_role.py 中的模型定义。 - - 参考调用如下:: - - roleinfo = dev.role.filter_by(code='admin').first() # 第一个符合要求的角色信息 - print(role.id, role.name) # 输出角色名称与角色标识 - - # 找出所有角色id - for role in dev.role.filter_by().all(): - print(role.id, role.name) - - :param kwargs: 查询参数 - :return: 角色SQL的查询字符串 - """ - return Role.query.filter_by(**kwargs) - - -def add(roleName, roleCode, enable, sort, details): - """ - 添加一个角色。此函数直接写入数据库。此函数不会检测角色是否已经存在(官方在API接口中也没有检测)。 - - :param roleName: 角色名称 (如管理员) - :param roleCode: 角色标识 (如admin) - :param enable: 是否启用 True or False - :param sort: 排序 - :param details: 描述 - :return: None - """ - role = Role( - details=details, - enable=enable, - code=roleCode, - name=roleName, - sort=sort - ) - db.session.add(role) - db.session.commit() - - -def get_power(role_filter, detail=False, p=0): - """ - 获取角色的权限。 - - 如果是非详细数据,会返回一个含有权限id的列表。 - 如果是详细数据返回此函数,将会返回一个列表,列表中会包含字典,字典的键如下:: - - { - "checkArr": "1", # 是否有权限 1 为有 0为无 - "create_time": null, # 权限创建 - "enable": 1, # 权限是否启用 - "icon": "layui-icon layui-icon-set-fill", # 权限图标 - "openType": null, # 开启状态 - "parentId": "0", # 父权限ID - "powerId": "1", # 权限ID - "powerName": "系统管理", # 权限名称 - "powerType": "0", # 权限类型 - "powerUrl": null, # 权限URL - "sort": 1, # 权限排序 - "update_time": null # 权限更新时间 - } - - - :param role_filter: dev.role.filter_by() 返回结果。 - :param detail: 返回详细数据 - :param p: 如果有多个结果被找到,p可以确定使用第几个结果。内部使用 role_filter.all()[p] - :return: 用户拥有的权限列表。 - """ - role = role_filter.all()[p] - check_powers = role.power - check_powers_list = [] - for cp in check_powers: - check_powers_list.append(cp.id) - if not detail: - return check_powers_list - powers = Power.query.all() - power_schema = PowerOutSchema2(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类 - output = power_schema.dump(powers) # 生成可序列化对象 - for i in output: - if int(i.get("powerId")) in check_powers_list: - i["checkArr"] = "1" - else: - i["checkArr"] = "0" - return output - - -def set_power(role_filter, powerIds, p=0): - """ - 保存角色权限。此函数会直接写入数据库。 - - :param role_filter: dev.role.filter_by() 返回结果。 - :param powerIds: 必须是一个包含权限ID的列表。如 [1, 2, 3] - :param p: 如果有多个结果被找到,p可以确定使用第几个结果。内部使用 role_filter.all()[p] - :return: None - """ - role = role_filter.all()[p] - powers = Power.query.filter(Power.id.in_(powerIds)).all() - role.power = powers - - db.session.commit() - - -def update(role_filter, data): - """ - 更新角色数据。此功能将直接写入数据库。 - - 可更新的字段如下:: - - id name code enable remark details sort create_time update_time power - 具体参考 applications/models/admin_role.py 中的模型定义。 - - 参考调用如下:: - - role_filter = dev.role.filter_by(id=0) # 获取指定角色ID的角色,注意不要使用会引起歧义的查询条件,否则会匹配到多个角色。 - dev.role.update(role_filter, {enable: 0}) # 禁用 - - :param role_filter: dev.role.filter_by() 返回结果。 - :param data: 要更新的数据,必须是字典。 - :return: None - """ - role_filter.update(data) - db.session.commit() - - -def delete(role_filter): - """ - 删除角色。此功能将直接写入数据库。 - - :param role_filter: dev.role.filter_by() 返回结果。 - :return: 是否成功。 - """ - role = role_filter.first() - # 删除该角色的权限和用户 - role.power = [] - role.user = [] - - r = role_filter.delete() - db.session.commit() - return r - diff --git a/applications/dev/user.py b/applications/dev/user.py deleted file mode 100644 index 00688a3ccee296138f247cbc705798914f211dad..0000000000000000000000000000000000000000 --- a/applications/dev/user.py +++ /dev/null @@ -1,160 +0,0 @@ -""" -集成了对 Pear Admin Flask 的用户操作,并给了相对应的示例。 - -调用示例:: - - from applications import dev - dev.user.login_required # 用户是否登录 - dev.user.current_user # 当前登录用户 - dev.user.authorize("XXX", log=True) # 用户是否有此权限 - -""" - -from applications.extensions import db -from applications.models import Role -from applications.models import User - - -def filter_by(**kwargs): - """ - 用于在用户数据中查询用户信息,可以通过用户名、用户id等进行检索。(建议使用id检索) - 内部采用的是使用 User.query.filter_by(**kwargs) 进行数据库查询 - - 注意:此函数返回的结果为构造的 SQL的查询字符串 ,以 user_filter 命名,但是并不是用户数据。 - - 返回的字段如下:: - - id username password_hash create_at update_at - enable realname remark avatar dept_id - 具体参考 applications/models/admin_user.py 中的模型定义。 - - - 参考调用如下:: - - userinfo = dev.user.filter_by(username='zsq').first() # 查询符合要求的第一个用户 - print(userinfo.realname) # 获取用户真实名字 - - - :param kwargs: 查询参数 - :return: 用户数据SQL的查询字符串 - """ - return User.query.filter_by(**kwargs) - - -def update(user_filter, data): - """ - 更新用户数据,修改将直接保存到数据库中。 - 注意:更新用户角色(role)请使用 dev.user.update_role() 函数。 - - 可更新的字段如下:: - - id username password_hash create_at update_at - enable realname remark avatar dept_id - 具体参考 applications/models/admin_user.py 中的模型定义。 - - 参考调用如下:: - - user_filter = dev.user.filter_by(id=0) # 获取指定用户ID的用户,注意不要使用会引起歧义的查询条件,否则会匹配到多个用户。 - dev.user.update(user_filter, {username: 'zsq1314'}) # 更新其用户名 - - - - :param user_filter: dev.user.filter_by() 的结果。 - :param data: 要更新的数据,必须是字典。 - :return: None - """ - user_filter.update(data) - db.session.commit() - - -def update_role(user_filter, roleIds): - """ - 更新用户角色,修改将直接保存到数据库中。 - - 参考调用如下:: - - user_filter = dev.user.filter_by(username='zsq') # 获取符合要求的第一个用户 - roleIds = [] - roleIds.append(dev.role.filter_by(code='admin').first().id) # 管理员角色ID - roleIds.append(dev.role.filter_by(code='common').first().id) # 普通用户角色ID - dev.user.update_role(user_filter, roleIds) - - - :param user_filter: dev.user.filter_by() 的结果。 - :param roleIds: 要更新的角色ID,作为列表传入。 - :return: None - """ - user_filter.first().role = Role.query.filter(Role.id.in_(roleIds)).all() - db.session.commit() - - -def get_role(user_filter): - """ - 获取用户的所有角色ID,将会返回一个整数列表。 - - :param user_filter: dev.user.filter_by() 的结果。 - :return: 列表 (roleIds) - """ - checked_roles = [] - for r in user_filter.first().role: - checked_roles.append(r.id) - return checked_roles - - -def set_password(user_filter, password): - """ - 设置用户密码,此函数不会验证用户原始密码哈希值,直接写入新密码哈希值。 - - 参考调用如下:: - - user_filter = dev.user.filter_by(username='zsq') # 获取符合要求的用户 - dev.user.set_password(user_filter, 'zsq1314') # 设置密码 - - :param user_filter: dev.user.filter_by() 的结果。 - :param password: 新密码。 - :return: None - """ - user = user_filter.first() - user.set_password(password) - db.session.add(user) - db.session.commit() - - -def add(username, realname, password, roleIds): - """ - 添加一个新用户。函数会判断用户名是否已存在,存在返回 False ,成功返回用户数据(userinfo)。此函数会直接写入数据库。 - 注意:此函数创建出来的用户默认是禁用的,可以使用 enable 启用。 - - :param username: 新用户名 - :param realname: 真实名字 - :param password: 密码字符串 - :param roleIds: 角色id列表,如 [1, 2],角色id具体查看 dev.role.get_all() 函数。 - :return: 是否成功 - """ - if bool(User.query.filter_by(username=username).count()): - return False - user = User(username=username, realname=realname) - user.set_password(password) - db.session.add(user) - roles = Role.query.filter(Role.id.in_(roleIds)).all() - for r in roles: - user.role.append(r) - db.session.commit() - return user - - -def delete(user_filter): - """ - 删除一个用户。此函数立刻写入数据库。 - - :param user_filter: dev.user.filter_by() 的结果。 - :return: 是否成功 - """ - user = user_filter.first() - user.role = [] - res = user_filter.delete() - db.session.commit() - return res - - - diff --git a/applications/view/plugin/__init__.py b/applications/view/plugin/__init__.py index 2aa2d479e6d706043ca046232f18f84ff65b3c01..af3bd26bef783b1e5991dca8dac634d66fc39511 100644 --- a/applications/view/plugin/__init__.py +++ b/applications/view/plugin/__init__.py @@ -8,7 +8,6 @@ import json import traceback import importlib -import applications.dev from applications.common.utils.rights import authorize plugin_bp = Blueprint('plugin', __name__, url_prefix='/plugin') @@ -16,7 +15,6 @@ PLUGIN_ENABLE_FOLDERS = [] def register_plugin_views(app: Flask): global PLUGIN_ENABLE_FOLDERS - applications.dev.app = app # 对app重新赋值 便于插件简单调用 app.register_blueprint(plugin_bp) # 载入插件过程 # plugin_folder 配置的是插件的文件夹名 @@ -71,10 +69,6 @@ def data(): "plugin_name": info["plugin_name"], "plugin_version": info["plugin_version"], "plugin_description": info["plugin_description"], - "developer_name": info["developer_name"], - "developer_website": info["developer_website"], - "developer_email": info["developer_email"], - "developer_phone": info["developer_phone"], "plugin_folder_name": filename, "enable": "1" if filename in PLUGIN_ENABLE_FOLDERS else "0" } diff --git a/applications/view/plugin/init_plugins.py b/applications/view/plugin/init_plugins.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/plugins/helloworld/__init__.json b/plugins/helloworld/__init__.json index 110f9f70e2583f1faaf8e32a8e2c0ba8bd4631d7..1373e2dfe5eab92b38421ec199c4d63b954493fb 100644 --- a/plugins/helloworld/__init__.json +++ b/plugins/helloworld/__init__.json @@ -1,9 +1,5 @@ { "plugin_name": "Hello World", "plugin_version": "1.0.0.1", - "plugin_description": "一个测试的插件。", - "developer_name": "Yishang", - "developer_website": "https://lovepikachu.top", - "developer_email": "422880152@qq.com", - "developer_phone": "-" + "plugin_description": "一个测试的插件。" } \ No newline at end of file diff --git a/plugins/helloworld/__init__.py b/plugins/helloworld/__init__.py index b972aa9b9b85c538a7e6c22c1fc37a34a14b2fb3..efbe8aef6ebd3855f422ec6d0b3935131e3f3173 100644 --- a/plugins/helloworld/__init__.py +++ b/plugins/helloworld/__init__.py @@ -14,7 +14,6 @@ def event_enable(): """当此插件被启用时会调用此处""" print(f"启用插件,dir_path: {dir_path} ; folder_name: {folder_name}") - def event_disable(): """当此插件被禁用时会调用此处""" print(f"禁用插件,dir_path: {dir_path} ; folder_name: {folder_name}") diff --git a/plugins/helloworld/main.py b/plugins/helloworld/main.py index 0f8f56ed9103264ecdf67e449ead70fe2243fbe1..f5592104c1a49e9ce17dce9301eee56377253034 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__.json b/plugins/realip/__init__.json index 2f7e77fe9cafa02709ca0eb6fdc912109e9a072b..659ed4fff98ae1bd3d550da7f24a110f1c05d2e2 100644 --- a/plugins/realip/__init__.json +++ b/plugins/realip/__init__.json @@ -1,9 +1,5 @@ { "plugin_name": "真实IP插件", "plugin_version": "1.0.0.1", - "plugin_description": "在上游更改访客IP地址,并采用自定义日志输出。", - "developer_name": "Yishang", - "developer_website": "https://lovepikachu.top", - "developer_email": "422880152@qq.com", - "developer_phone": "-" + "plugin_description": "在上游更改访客IP地址,并采用自定义日志输出。" } \ No newline at end of file diff --git a/plugins/realip/__init__.py b/plugins/realip/__init__.py index f1aee919ab10be73d201f64a4b3bde8491caa5f3..f6971fd981b0dc6f1a2cd8ad46a25bf09da1caf3 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 . import console # 获取插件所在的目录(结尾没有分割符号) dir_path = os.path.dirname(__file__).replace("\\", "/") diff --git a/plugins/replacePage/__init__.json b/plugins/replacePage/__init__.json index d5558828bde4bb71c69017f0f4faf74f8b3c04fa..143dd0cafad57cf43173081ebcb5989bc330a609 100644 --- a/plugins/replacePage/__init__.json +++ b/plugins/replacePage/__init__.json @@ -1,9 +1,5 @@ { "plugin_name": "页面替换插件", "plugin_version": "1.0.0.1", - "plugin_description": "在不更改原有框架视图函数的情况下更改渲染输出页面。", - "developer_name": "Yishang", - "developer_website": "https://lovepikachu.top", - "developer_email": "422880152@qq.com", - "developer_phone": "-" + "plugin_description": "在不更改原有框架视图函数的情况下更改渲染输出页面。" } \ No newline at end of file diff --git a/plugins/replacePage/__init__.py b/plugins/replacePage/__init__.py index e973e203f22c57a4f43ac2d4307833105d2f6cf1..3756f0a66c66b50c9d6dfc0276bace98854bfdba 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("\\", "/") diff --git a/templates/admin/plugin/main.html b/templates/admin/plugin/main.html index 4ba74657a52175b9a7644fa6fc1f1de027a11b4f..b0e4f181ff2731fb97f0a58851f571e121676162 100644 --- a/templates/admin/plugin/main.html +++ b/templates/admin/plugin/main.html @@ -133,10 +133,6 @@ {field: 'plugin_name', minWidth: 100, title: '插件名称'}, {field: 'plugin_version', title: '插件版本'}, {field: 'plugin_description', title: '插件描述'}, - {field: 'developer_name', title: '开发者名称'}, - {field: 'developer_website', title: '开发者网站'}, - {field: 'developer_email', title: '开发者邮箱'}, - {field: 'developer_phone', title: '开发者电话'}, {field: 'plugin_folder_name', hide: true}, {field: 'enable', title: '状态', templet: '#plugin-enable', width: 100, align: 'center'}, {title: '操作', templet: '#plugin-bar', width: 120, align: 'center'}