Files
pear-admin-flask/templates/system/index.html
T
bwstudio 1ea69c2c34 refactor(plugins): 将导航/友链/关于/统计 4 模块迁出 framework 至 plugins
- 在 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 补充一次性备份、调试截图、探针截图不入库
2026-09-06 18:17:52 +08:00

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>&nbsp;&nbsp;&nbsp;
仓库:<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>