feat(all): init

This commit is contained in:
2026-01-21 22:15:12 +08:00
commit b896ed6644
8 changed files with 89 additions and 0 deletions

18
.gitignore vendored Normal file
View File

@@ -0,0 +1,18 @@
.venv
__pycache__
*.pyc
test
*.log
dist
build
*.egg-info
.env
# IDE specific files
.vscode/
.idea/
*.iml
.pytest_cache/
.coverage
coverage.xml
.tox/

17
addons/__init__.py Normal file
View File

@@ -0,0 +1,17 @@
import os
from flask import Flask
from importlib import import_module
"""
自动载入所有插件,并注入应用上下文
通过插件内的 manifest 信息识别是否为内置插件,第三方插件需要自行上传到此目录下
manifest 需注释为第三方,否则会在比对数据库后直接过滤
"""
def autoload_addon_and_inject_context(app: Flask):
addons_dir = os.path.dirname(__file__)
for item in os.listdir(addons_dir):
item_path = os.path.join(addons_dir, item)
if os.path.isdir(item_path) and os.path.exists(os.path.join(item_path, '__init__.py')):
addon_module = import_module(f'addons.{item}')
if hasattr(addon_module, 'register_addon'):
addon_module.register_addon(app)

View File

@@ -0,0 +1,16 @@
from flask import Flask
manifest = {
"name": "Account Addon",
"version": "1.0.0",
"description": "An addon to manage user accounts.",
"author": "Mike",
"license": "",
"url": "",
"addon": "account"
}
def register_addon(app: Flask):
from .api import bp
app.register_blueprint(bp, url_prefix='/account')
pass

11
addons/account/api.py Normal file
View File

@@ -0,0 +1,11 @@
from flask import Blueprint
bp = Blueprint('account', __name__)
@bp.route('/')
def account_home():
return "Welcome to the Account Addon!"
@bp.route('/profile')
def profile():
return "This is the user profile page."

0
addons/account/model.py Normal file
View File

0
app.py Normal file
View File

16
requirements.txt Normal file
View File

@@ -0,0 +1,16 @@
alembic==1.16.5
blinker==1.9.0
click==8.1.8
Flask==3.1.2
Flask-Migrate==4.1.0
Flask-SQLAlchemy==3.1.1
importlib_metadata==8.7.1
itsdangerous==2.2.0
Jinja2==3.1.6
Mako==1.3.10
MarkupSafe==3.0.3
SQLAlchemy==2.0.45
tomli==2.4.0
typing_extensions==4.15.0
Werkzeug==3.1.5
zipp==3.23.0

11
visitor/__init__.py Normal file
View File

@@ -0,0 +1,11 @@
from flask import Flask, Config
from addons import autoload_addon_and_inject_context
def create_app(config: Config = None) -> Flask:
app = Flask(__name__)
app.config.from_object(config)
# app.logger.info(autoload_addon_and_inject_context())
autoload_addon_and_inject_context(app)
return app