From 60dde60ae2558b3f0b31d54ed6cbe2903adbea23 Mon Sep 17 00:00:00 2001
From: IncubatorShokuhou <1057304556@qq.com>
Date: Wed, 22 Jan 2025 19:59:51 +0800
Subject: [PATCH 1/2] add a sqlalchemy version for magic-dash-pro
---
magic_dash/__init__.py | 6 +-
.../magic-dash-pro-sqlalchemy/app.py | 204 +++++++++++
.../assets/css/base.css | 42 +++
.../assets/css/core.css | 34 ++
.../assets/css/login.css | 16 +
.../assets/favicon.ico | Bin 0 -> 67646 bytes
.../assets/imgs/init_loading.gif | Bin 0 -> 33979 bytes
.../assets/imgs/login/left-side-bg.svg | 1 +
.../imgs/login/\346\217\222\345\233\2761.svg" | 1 +
.../imgs/login/\346\217\222\345\233\2762.svg" | 1 +
.../imgs/login/\346\217\222\345\233\2763.svg" | 1 +
.../imgs/login/\346\217\222\345\233\2764.svg" | 1 +
.../assets/imgs/logo.svg | 1 +
.../assets/imgs/status/403.svg | 1 +
.../assets/imgs/status/404.svg | 1 +
.../assets/imgs/status/500.svg | 1 +
.../assets/js/basic_callbacks.js | 70 ++++
.../assets/videos/login-bg.mp4 | Bin 0 -> 6441393 bytes
.../callbacks/__init__.py | 0
.../callbacks/core_pages_c/__init__.py | 143 ++++++++
.../callbacks/core_pages_c/page1_c.py | 14 +
.../callbacks/login_c.py | 128 +++++++
.../components/__init__.py | 0
.../components/core_side_menu.py | 73 ++++
.../components/personal_info.py | 148 ++++++++
.../components/user_manage.py | 298 +++++++++++++++
.../configs/__init__.py | 4 +
.../configs/auth_config.py | 35 ++
.../configs/base_config.py | 31 ++
.../configs/layout_config.py | 11 +
.../configs/router_config.py | 137 +++++++
.../models/__init__.py | 13 +
.../models/exceptions.py | 10 +
.../models/init_db.py | 21 ++
.../magic-dash-pro-sqlalchemy/models/users.py | 132 +++++++
.../requirements.txt | 9 +
.../magic-dash-pro-sqlalchemy/server.py | 121 +++++++
.../utils/clear_pycache.py | 15 +
.../views/__init__.py | 0
.../views/core_pages/__init__.py | 342 ++++++++++++++++++
.../views/core_pages/independent_page.py | 36 ++
.../views/core_pages/independent_page_demo.py | 24 ++
.../views/core_pages/index.py | 28 ++
.../views/core_pages/page1.py | 43 +++
.../views/core_pages/sub_menu_page1.py | 45 +++
.../views/core_pages/sub_menu_page2.py | 45 +++
.../views/core_pages/sub_menu_page3.py | 45 +++
.../magic-dash-pro-sqlalchemy/views/login.py | 194 ++++++++++
.../views/status_pages/_403.py | 21 ++
.../views/status_pages/_404.py | 21 ++
.../views/status_pages/_500.py | 24 ++
.../views/status_pages/__init__.py | 0
52 files changed, 2591 insertions(+), 1 deletion(-)
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/app.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/base.css
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/core.css
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/login.css
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/favicon.ico
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/init_loading.gif
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/left-side-bg.svg
create mode 100644 "magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2761.svg"
create mode 100644 "magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2762.svg"
create mode 100644 "magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2763.svg"
create mode 100644 "magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2764.svg"
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/logo.svg
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/403.svg
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/404.svg
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/500.svg
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/js/basic_callbacks.js
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/assets/videos/login-bg.mp4
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/callbacks/__init__.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/callbacks/core_pages_c/__init__.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/callbacks/core_pages_c/page1_c.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/callbacks/login_c.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/components/__init__.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/components/core_side_menu.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/components/personal_info.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/components/user_manage.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/configs/__init__.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/configs/auth_config.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/configs/base_config.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/configs/layout_config.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/configs/router_config.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/models/__init__.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/models/exceptions.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/models/init_db.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/models/users.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/requirements.txt
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/server.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/utils/clear_pycache.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/__init__.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/core_pages/__init__.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/core_pages/independent_page.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/core_pages/independent_page_demo.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/core_pages/index.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/core_pages/page1.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/core_pages/sub_menu_page1.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/core_pages/sub_menu_page2.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/core_pages/sub_menu_page3.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/login.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/status_pages/_403.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/status_pages/_404.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/status_pages/_500.py
create mode 100644 magic_dash/templates/magic-dash-pro-sqlalchemy/views/status_pages/__init__.py
diff --git a/magic_dash/__init__.py b/magic_dash/__init__.py
index 8664271..92fc665 100644
--- a/magic_dash/__init__.py
+++ b/magic_dash/__init__.py
@@ -1,7 +1,8 @@
import os
-import click
import shutil
+import click
+
__version__ = "0.2.8"
# 现有内置项目模板信息
@@ -12,6 +13,9 @@
"magic-dash-pro": {
"description": "多页面+用户登录应用模板",
},
+ "magic-dash-pro-sqlalchemy": {
+ "description": "多页面+用户登录应用模板(SQLAlchemy版)",
+ },
"simple-tool": {
"description": "单页面工具应用模板",
},
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/app.py b/magic_dash/templates/magic-dash-pro-sqlalchemy/app.py
new file mode 100644
index 0000000..6dc3835
--- /dev/null
+++ b/magic_dash/templates/magic-dash-pro-sqlalchemy/app.py
@@ -0,0 +1,204 @@
+import dash
+from flask import request
+from dash import html, set_props, dcc
+import feffery_antd_components as fac
+import feffery_utils_components as fuc
+from dash.dependencies import Input, Output, State
+from flask_principal import identity_changed, AnonymousIdentity
+from flask_login import current_user, logout_user, AnonymousUserMixin
+
+from server import app
+from models.users import Users
+from views import core_pages, login
+from views.status_pages import _403, _404, _500
+from configs import BaseConfig, RouterConfig, AuthConfig
+
+
+app.layout = lambda: fuc.FefferyTopProgress(
+ [
+ # 全局消息提示
+ fac.Fragment(id="global-message"),
+ # 全局重定向
+ fac.Fragment(id="global-redirect"),
+ # 全局页面重载
+ fac.Fragment(id="global-reload"),
+ *(
+ [
+ # 重复登录辅助检查轮询
+ dcc.Interval(
+ id="duplicate-login-check-interval",
+ interval=BaseConfig.duplicate_login_check_interval * 1000,
+ )
+ ]
+ # 若开启了重复登录辅助检查
+ if BaseConfig.enable_duplicate_login_check
+ else []
+ ),
+ # 根节点url监听
+ fuc.FefferyLocation(id="root-url"),
+ # 应用根容器
+ html.Div(
+ id="root-container",
+ ),
+ ],
+ listenPropsMode="include",
+ includeProps=["root-container.children"],
+ minimum=0.33,
+ color="#1677ff",
+)
+
+
+def handle_root_router_error(e):
+ """处理根节点路由错误"""
+
+ set_props(
+ "root-container",
+ {
+ "children": _500.render(e),
+ },
+ )
+
+
+@app.callback(
+ Output("root-container", "children"),
+ Input("root-url", "pathname"),
+ State("root-url", "trigger"),
+ prevent_initial_call=True,
+ on_error=handle_root_router_error,
+)
+def root_router(pathname, trigger):
+ """根节点路由控制"""
+
+ # 在动态路由切换时阻止根节点路由更新
+ if trigger != "load":
+ return dash.no_update
+
+ # 无需校验登录状态的公共页面
+ if pathname in RouterConfig.public_pathnames:
+ if pathname == "/403-demo":
+ return _403.render()
+
+ elif pathname == "/404-demo":
+ return _404.render()
+
+ elif pathname == "/500-demo":
+ return _500.render()
+
+ elif pathname == "/login":
+ return login.render()
+
+ elif pathname == "/logout":
+ # 当前用户登出
+ logout_user()
+
+ # 重置当前用户身份
+ identity_changed.send(
+ app.server,
+ identity=AnonymousIdentity(),
+ )
+
+ # 重定向至登录页面
+ set_props(
+ "global-redirect",
+ {"children": dcc.Location(pathname="/login", id="global-redirect")},
+ )
+ return dash.no_update
+
+ # 登录状态校验:若当前用户未登录
+ if not current_user.is_authenticated:
+ # 重定向至登录页面
+ set_props(
+ "global-redirect",
+ {"children": dcc.Location(pathname="/login", id="global-redirect")},
+ )
+
+ return dash.no_update
+
+ # 检查当前访问目标pathname是否为有效页面
+ if pathname in RouterConfig.valid_pathnames.keys():
+ # 校验当前用户是否具有针对当前访问目标页面的权限
+ current_user_access_rule = AuthConfig.pathname_access_rules.get(
+ current_user.user_role
+ )
+
+ # 若当前用户页面权限规则类型为'include'
+ if current_user_access_rule["type"] == "include":
+ # 若当前用户不具有针对当前访问目标页面的权限
+ if pathname not in current_user_access_rule["keys"]:
+ # 首页不受权限控制影响
+ if pathname not in [
+ "/",
+ RouterConfig.index_pathname,
+ ]:
+ # 重定向至403页面
+ set_props(
+ "global-redirect",
+ {
+ "children": dcc.Location(
+ pathname="/403-demo", id="global-redirect"
+ )
+ },
+ )
+
+ return dash.no_update
+
+ # 若当前用户页面权限规则类型为'exclude'
+ elif current_user_access_rule["type"] == "exclude":
+ # 若当前用户不具有针对当前访问目标页面的权限
+ if pathname in current_user_access_rule["keys"]:
+ # 重定向至403页面
+ set_props(
+ "global-redirect",
+ {
+ "children": dcc.Location(
+ pathname="/403-demo", id="global-redirect"
+ )
+ },
+ )
+
+ return dash.no_update
+
+ # 处理核心功能页面渲染
+ return core_pages.render(
+ current_user_access_rule=current_user_access_rule, current_pathname=pathname
+ )
+
+ # 返回404状态页面
+ return _404.render()
+
+
+@app.callback(
+ Input("duplicate-login-check-interval", "n_intervals"),
+ State("root-url", "pathname"),
+)
+def duplicate_login_check(n_intervals, pathname):
+ """重复登录辅助轮询检查"""
+
+ # 若当前页面属于无需校验登录状态的公共页面,结束检查
+ if pathname in RouterConfig.public_pathnames:
+ return
+
+ # 若当前用户身份未知
+ if isinstance(current_user, AnonymousUserMixin):
+ # 重定向到登出页
+ set_props(
+ "global-redirect",
+ {"children": dcc.Location(pathname="/logout", id="global-redirect")},
+ )
+
+ # 若当前用户已登录
+ elif current_user.is_authenticated:
+ match_user = Users.get_user(current_user.id)
+ # 若当前回调请求携带cookies中的session_token,当前用户数据库中的最新session_token不一致
+ if match_user.session_token != request.cookies.get("session_token"):
+ # 重定向到登出页
+ set_props(
+ "global-redirect",
+ {"children": dcc.Location(pathname="/logout", id="global-redirect")},
+ )
+
+
+if __name__ == "__main__":
+ # 非正式环境下开发调试预览用
+ # 生产环境推荐使用gunicorn启动
+ app.run(debug=True)
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/base.css b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/base.css
new file mode 100644
index 0000000..14b9e43
--- /dev/null
+++ b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/base.css
@@ -0,0 +1,42 @@
+/* 常规基础样式 */
+
+/* 自定义应用初始化加载动画效果 */
+._dash-loading {
+ color: transparent;
+ position: fixed;
+ width: calc(95px / 1.2);
+ height: calc(87px / 1.2);
+ top: 50vh;
+ left: 50vw;
+ transform: translate(-50%, -50%);
+ background-image: url('/assets/imgs/init_loading.gif');
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+}
+
+._dash-loading::after {
+ content: '';
+}
+
+/* 滚动条美化 */
+/* chrome, edge */
+*::-webkit-scrollbar-thumb {
+ background-color: #bfbfbf;
+ outline: none;
+ border-radius: 6px;
+}
+
+*::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+
+/* firefox */
+* {
+ scrollbar-width: thin;
+}
+
+/* 全局辅助性文字样式 */
+.global-help-text {
+ color: #5d7189;
+}
\ No newline at end of file
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/core.css b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/core.css
new file mode 100644
index 0000000..cd944c0
--- /dev/null
+++ b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/core.css
@@ -0,0 +1,34 @@
+/* 核心页面样式 */
+
+/* 侧边菜单栏相关样式自定义 */
+
+#core-side-menu .ant-menu-item-selected {
+ background-color: #f4f6f9 !important;
+ color: #006aff !important;
+ font-size: 15px;
+ overflow: visible;
+}
+
+#core-side-menu .ant-menu-item {
+ font-size: 15px;
+}
+
+/* 为已选中菜单项,基于伪元素,添加前缀竖向填充线 */
+#core-side-menu .ant-menu-item-selected::before {
+ content: "";
+ position: absolute;
+ left: -5px;
+ top: 0;
+ width: 3px;
+ height: 100%;
+ background-color: #006aff;
+}
+
+
+#core-side-menu .ant-menu-item-icon>span {
+ font-size: 15px !important;
+}
+
+#core-side-menu .ant-menu-submenu {
+ font-size: 15px;
+}
\ No newline at end of file
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/login.css b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/login.css
new file mode 100644
index 0000000..fb1e510
--- /dev/null
+++ b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/css/login.css
@@ -0,0 +1,16 @@
+.login-left-side {
+ position: relative;
+ background-size: cover;
+ background-position: center center;
+ background-repeat: repeat;
+ background-image: url("/assets/imgs/login/left-side-bg.svg");
+ border-top-right-radius: 12px;
+ border-bottom-right-radius: 12px;
+ user-select: none;
+}
+
+.login-right-side {
+ background-color: #ffffff;
+ background-image: radial-gradient(rgba(0, 106, 255, 0.4) 1px, #ffffff 1px);
+ background-size: 25px 25px;
+}
\ No newline at end of file
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/favicon.ico b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..45c6545afb8352e6c89ac472695905c6c3308f9a
GIT binary patch
literal 67646
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
VhLvVlDF2Jnp~DpkIG``0{}1Ag(3$`M
literal 0
HcmV?d00001
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/left-side-bg.svg b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/left-side-bg.svg
new file mode 100644
index 0000000..32e44b6
--- /dev/null
+++ b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/left-side-bg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git "a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2761.svg" "b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2761.svg"
new file mode 100644
index 0000000..77de3c7
--- /dev/null
+++ "b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2761.svg"
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git "a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2762.svg" "b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2762.svg"
new file mode 100644
index 0000000..652aaa0
--- /dev/null
+++ "b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2762.svg"
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git "a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2763.svg" "b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2763.svg"
new file mode 100644
index 0000000..b80234d
--- /dev/null
+++ "b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2763.svg"
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git "a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2764.svg" "b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2764.svg"
new file mode 100644
index 0000000..e25442b
--- /dev/null
+++ "b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/login/\346\217\222\345\233\2764.svg"
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/logo.svg b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/logo.svg
new file mode 100644
index 0000000..cc7950a
--- /dev/null
+++ b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/403.svg b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/403.svg
new file mode 100644
index 0000000..7b0e744
--- /dev/null
+++ b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/403.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/404.svg b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/404.svg
new file mode 100644
index 0000000..1bd2c0f
--- /dev/null
+++ b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/500.svg b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/500.svg
new file mode 100644
index 0000000..15e8622
--- /dev/null
+++ b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/imgs/status/500.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/js/basic_callbacks.js b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/js/basic_callbacks.js
new file mode 100644
index 0000000..cd5ad48
--- /dev/null
+++ b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/js/basic_callbacks.js
@@ -0,0 +1,70 @@
+// 改造console.error()以隐藏无关痛痒的警告信息
+const originalConsoleError = console.error;
+console.error = function (...args) {
+ // 检查args中是否包含需要过滤的内容
+ const shouldFilter = args.some(arg => typeof arg === 'string' && arg.includes('Warning:'));
+
+ if (!shouldFilter) {
+ originalConsoleError.apply(console, args);
+ }
+};
+
+window.dash_clientside = Object.assign({}, window.dash_clientside, {
+ clientside_basic: {
+ // 处理核心页面侧边栏展开/收起
+ handleSideCollapse: (nClicks, originIcon, originHeaderSideStyle, coreConfig) => {
+ // 若先前为展开状态
+ if (originIcon === 'antd-menu-fold') {
+ return [
+ // 更新图标
+ 'antd-menu-unfold',
+ // 更新页首侧边容器样式
+ {
+ ...originHeaderSideStyle,
+ width: 110
+ },
+ // 更新页首标题样式
+ {
+ display: 'none'
+ },
+ // 更新侧边菜单容器样式
+ {
+ width: 110
+ },
+ // 更新侧边菜单折叠状态
+ true
+ ]
+ } else {
+ return [
+ // 更新图标
+ 'antd-menu-fold',
+ // 更新页首侧边容器样式
+ {
+ ...originHeaderSideStyle,
+ width: coreConfig.core_side_width
+ },
+ // 更新页首标题样式
+ {},
+ // 更新侧边菜单容器样式
+ {
+ width: coreConfig.core_side_width
+ },
+ // 更新侧边菜单折叠状态
+ false
+ ]
+ }
+ },
+ // 控制页面搜索切换页面的功能
+ handleCorePageSearch: (value) => {
+ if (value) {
+ let pathname = value.split('|')[0]
+ // 更新pathname
+ window.location.pathname = pathname
+ }
+ },
+ // 控制ctrl+k快捷键触发页面搜索框聚焦
+ handleCorePageSearchFocus: (pressedCounts) => {
+ return [true, pressedCounts.toString()]
+ }
+ }
+});
\ No newline at end of file
diff --git a/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/videos/login-bg.mp4 b/magic_dash/templates/magic-dash-pro-sqlalchemy/assets/videos/login-bg.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..dc982dc40de03d864a310a044fc09c267cb97334
GIT binary patch
literal 6441393
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