- 在 applications/config.py 中通过 PLUGIN_ENABLE_FOLDERS 启用 4 个业务插件
- 删除 framework 内 applications/view/system/nav.py 与 templates/system/nav/* 模板
- applications/extensions/init_plugs 移除重复的 broadcast_execute('event_init'/'event_finish')
(由 init_bps / init_script 触发,避免 Blueprint 注册冲突)
- applications/view/system/index.py:未登录访问 / 直接渲染前台公开聚合页
- templates/system/index.html:移动端首屏即折叠侧边栏
- 新增 5 个 model(Nav 字段 status→enable 兼容、NavCategory、About、Friend、VisitLog/PageStat、NavClick)
- 新增 2 个 schema(NavCategorySchema、FriendOutSchema/ManageSchema)
- admin_about/admin_friend/admin_nav_category 在 init.json 中以「网站管理」分组挂载
- .gitignore 补充一次性备份、调试截图、探针截图不入库
204 lines
7.8 KiB
HTML
204 lines
7.8 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>Pear Admin Flask</title>
|
|
<meta charset="utf-8">
|
|
{% include 'system/common/header.html' %}
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
|
</head>
|
|
<!-- 结 构 代 码 -->
|
|
<body class="layui-layout-body pear-admin">
|
|
<!-- 首屏即折叠侧边栏:避免移动端加载期间 sidebar 展开遮挡内容(后续 admin.js 会再次同步状态) -->
|
|
<script>
|
|
(function () {
|
|
if (window.innerWidth <= 768) {
|
|
document.body.classList.add('pear-mini');
|
|
}
|
|
})();
|
|
</script>
|
|
<!-- 布 局 框 架 -->
|
|
<div class="layui-layout layui-layout-admin">
|
|
<!-- 顶 部 样 式 -->
|
|
<div class="layui-header">
|
|
<!-- 菜 单 顶 部 -->
|
|
<div class="layui-logo">
|
|
<!-- 图 标 -->
|
|
<img class="logo">
|
|
<!-- 标 题 -->
|
|
<span class="title"></span>
|
|
</div>
|
|
<!-- 顶 部 左 侧 功 能 -->
|
|
<ul class="layui-nav layui-layout-left">
|
|
<li class="collapse layui-nav-item"><a href="#" class="layui-icon layui-icon-shrink-right"></a></li>
|
|
<li class="refresh layui-nav-item"><a href="#" class="layui-icon layui-icon-refresh-1" loading=600></a></li>
|
|
</ul>
|
|
<!-- 多 系 统 菜 单 -->
|
|
<div id="control" class="layui-layout-control"></div>
|
|
<!-- 顶 部 右 侧 菜 单 -->
|
|
<ul class="layui-nav layui-layout-right">
|
|
<li class="layui-nav-item layui-hide-xs"><a href="#" class="menuSearch layui-icon layui-icon-search"></a>
|
|
</li>
|
|
<li class="layui-nav-item layui-hide-xs message"></li>
|
|
<li class="layui-nav-item layui-hide-xs"><a href="#"
|
|
class="fullScreen layui-icon layui-icon-screen-full"></a></li>
|
|
<li class="layui-nav-item user">
|
|
<!-- 头 像 -->
|
|
<a class="layui-icon layui-icon-username" href="javascript:;"></a>
|
|
<!-- 功 能 菜 单 -->
|
|
<dl class="layui-nav-child">
|
|
<dd><a href="javascript:void(0);" user-menu-url="/system/user/center" user-menu-id="5555"
|
|
user-menu-title="基本资料">基本资料</a></dd>
|
|
<dd><a href="javascript:void(0);" class="logout">注销登录</a></dd>
|
|
</dl>
|
|
</li>
|
|
<!-- 主 题 配 置 -->
|
|
<li class="layui-nav-item setting"><a href="#" class="layui-icon layui-icon-more-vertical"></a></li>
|
|
</ul>
|
|
</div>
|
|
<!-- 侧 边 区 域 -->
|
|
<div class="layui-side layui-bg-black">
|
|
<!-- 菜 单 顶 部 -->
|
|
<div class="layui-logo">
|
|
<!-- 图 标 -->
|
|
<img class="logo">
|
|
<!-- 标 题 -->
|
|
<span class="title"></span>
|
|
</div>
|
|
<!-- 菜 单 内 容 -->
|
|
<div class="layui-side-scroll">
|
|
<div id="side"></div>
|
|
</div>
|
|
</div>
|
|
<!-- 视 图 页 面 -->
|
|
<div class="layui-body">
|
|
<!-- 内 容 页 面 -->
|
|
<div id="content"></div>
|
|
</div>
|
|
<!-- 页脚 -->
|
|
<div class="layui-footer layui-text">
|
|
<span class="left">
|
|
<span>
|
|
官网:<a href="http://www.pearadmin.com/team.html" target="_blank">www.pearadmin.com</a>
|
|
仓库:<a href="https://gitee.com/pear-admin/Pear-Admin-Layui" target="_blank">gitee.com/pear-admin</a>
|
|
</span>
|
|
</span>
|
|
<span class="center"></span>
|
|
<span class="right"></span>
|
|
</div>
|
|
<!-- 遮 盖 层 -->
|
|
<div class="pear-cover"></div>
|
|
<!-- 加 载 动 画 -->
|
|
<div class="loader-wrapper">
|
|
<!-- 动 画 对 象 -->
|
|
<div class="loader"></div>
|
|
</div>
|
|
</div>
|
|
<!-- 移 动 端 便 捷 操 作 -->
|
|
<div class="pear-collapsed-pe collapse">
|
|
<a href="#" class="layui-icon layui-icon-shrink-right"></a>
|
|
</div>
|
|
<!-- 依 赖 脚 本 -->
|
|
<script src="{{ url_for('static', filename='system/component/layui/layui.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='system/component/pear/pear.js') }}"></script>
|
|
<!-- 框 架 初 始 化 -->
|
|
<script>
|
|
layui.use(['admin', 'jquery', 'popup'], function () {
|
|
var admin = layui.admin;
|
|
var popup = layui.popup;
|
|
var $ = layui.jquery;
|
|
|
|
// yml | json | api
|
|
admin.setConfigurationPath("{{ url_for('system.rights.configs') }}");
|
|
|
|
// 主题色自动通知子页面
|
|
admin._changeTheme = admin.changeTheme;
|
|
admin.changeTheme = function () {
|
|
admin._changeTheme(); // 调用原方法
|
|
|
|
/* 遍历所有 iframe 更改主题色 */
|
|
const variableKey = "--global-primary-color";
|
|
const variableVal = localStorage.getItem("theme-color-color");
|
|
const iframes = document.querySelectorAll('iframe');
|
|
iframes.forEach(function (iframe) {
|
|
try {
|
|
const iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
|
|
// 设置 iframe 中的主题色
|
|
iframeDocument.documentElement.style.setProperty(variableKey, variableVal);
|
|
} catch (e) {
|
|
}
|
|
});
|
|
}
|
|
|
|
// 夜间模式切换通知子页面
|
|
admin._switchTheme = admin.switchTheme
|
|
admin.switchTheme = function (checked) {
|
|
admin.isdrak = checked;
|
|
admin._switchTheme(checked)
|
|
|
|
const iframes = document.querySelectorAll('iframe');
|
|
iframes.forEach(function (iframe) {
|
|
try {
|
|
const iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
|
|
|
|
if (checked === true || checked === "true") {
|
|
iframeDocument.body.classList.add("pear-admin-dark");
|
|
} else {
|
|
iframeDocument.body.classList.remove("pear-admin-dark");
|
|
}
|
|
} catch (e) {
|
|
}
|
|
});
|
|
}
|
|
|
|
// 渲染
|
|
admin.render();
|
|
|
|
// 移动端初始化:窗口较窄时默认折叠左侧菜单,避免内容被侧边栏挡住
|
|
(function () {
|
|
function foldSidebar() {
|
|
if ($(window).width() > 768) return;
|
|
var body = $('body');
|
|
var admin = $('.pear-admin');
|
|
// 直接加 class:不依赖 .collapse 按钮是否存在或是否响应点击
|
|
if (!admin.hasClass('pear-mini')) {
|
|
admin.addClass('pear-mini');
|
|
body.addClass('pear-mini');
|
|
}
|
|
// 同步 menu 实例状态,防止后续交互异常
|
|
if (window.PearAdmin && window.PearAdmin.instances && window.PearAdmin.instances.menu) {
|
|
try {
|
|
window.PearAdmin.instances.menu.collapse();
|
|
} catch (e) {}
|
|
window.PearAdmin.instances.menu.isCollapse = true;
|
|
}
|
|
}
|
|
// 立即 + 多次延迟:覆盖 admin.js 异步初始化和菜单渲染滞后
|
|
foldSidebar();
|
|
setTimeout(foldSidebar, 300);
|
|
setTimeout(foldSidebar, 800);
|
|
setTimeout(foldSidebar, 1500);
|
|
})();
|
|
|
|
// 注销
|
|
admin.logout(function () {
|
|
let loading = layer.load()
|
|
$.ajax({
|
|
url: '{{ url_for('system.passport.logout') }}',
|
|
dataType: 'json',
|
|
async: false,
|
|
type: 'post',
|
|
success: function (result) {
|
|
layer.close(loading)
|
|
if (result.success) {
|
|
popup.success(result.msg, function () {
|
|
location.href = '/'
|
|
})
|
|
return true
|
|
}
|
|
}
|
|
})
|
|
})
|
|
})
|
|
</script>
|
|
</body>
|
|
</html> |