426 行
20 KiB
HTML
可执行文件
426 行
20 KiB
HTML
可执行文件
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>{$logoinfo['name']}后台管理系统</title>
|
|
<link rel="shortcut icon" type="image/x-icon" href="{$logoinfo['icourl']}">
|
|
|
|
<!-- Bootstrap 5 CSS -->
|
|
<link href="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
|
|
<!-- Bootstrap Icons -->
|
|
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/bootstrap-icons/1.10.5/font/bootstrap-icons.css">
|
|
|
|
<!-- 图标库 - 国内CDN -->
|
|
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.css">
|
|
<link rel="stylesheet" type="text/css" href="__PUBLIC__/layui-v2.4.3/layui/css/layui.css"/>
|
|
<!-- 自定义样式 -->
|
|
<link rel="stylesheet" type="text/css" href="__PUBLIC__/Retail/css/bs5-admin-base.css">
|
|
<link rel="stylesheet" type="text/css" href="__PUBLIC__/Retail/css/bs5-admin-sidebar.css">
|
|
<link rel="stylesheet" type="text/css" href="__PUBLIC__/Retail/css/bs5-admin-components.css">
|
|
|
|
<!-- 必要的JS库 -->
|
|
<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key={$cache['tencent_key']}"></script>
|
|
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/jquery/js/jquery-3.2.1.min.js"></script>
|
|
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/receipt/Qrcode.js"></script>
|
|
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/UEditor/ueditor.config.js"></script>
|
|
<script type="text/javascript" charset="utf-8" src="__PUBLIC__/UEditor/ueditor.all.js"></script>
|
|
<script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=ObMZWhkHzzF0zbnNgF72Bcws8GHqnya7"></script>
|
|
|
|
<!-- Vue.js (保持原有功能) -->
|
|
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script>
|
|
</head>
|
|
<body>
|
|
<include file="./Application/Admin/View/Upload/index.html"/>
|
|
|
|
<div id="MenuIndex" class="admin-wrapper">
|
|
<!-- 侧边栏 -->
|
|
<nav id="sidebar" class="sidebar">
|
|
<!-- Logo区域 -->
|
|
<div class="sidebar-header">
|
|
<div class="sidebar-brand">
|
|
<img :src="logoUrl"
|
|
@error="handleLogoError"
|
|
alt="Logo"
|
|
class="sidebar-logo">
|
|
<div class="sidebar-brand-text">
|
|
<div class="brand-name">{$logoinfo['name']}</div>
|
|
<div class="brand-subtitle">管理系统</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 导航菜单 -->
|
|
<div class="sidebar-menu">
|
|
<ul class="nav flex-column">
|
|
<template v-for="(item, index) in menuList">
|
|
<!-- 有子菜单的项目 -->
|
|
<li v-if="item.list" class="nav-item" :key="index">
|
|
<a class="nav-link collapsed"
|
|
:href="'#submenu' + index"
|
|
data-bs-toggle="collapse"
|
|
:aria-expanded="false">
|
|
<i :class="getMenuIcon(item.name)" class="nav-icon"></i>
|
|
<span class="nav-text">{{ item.name }}</span>
|
|
<i class="bi bi-chevron-down nav-arrow"></i>
|
|
</a>
|
|
<div :id="'submenu' + index" class="collapse">
|
|
<ul class="nav flex-column submenu">
|
|
<li v-for="(subItem, subIndex) in item.list"
|
|
:key="subIndex"
|
|
class="nav-item">
|
|
<a class="nav-link"
|
|
@click="selectMenu(index + '-' + subIndex)"
|
|
:class="{ active: actMenuIndex == (index + '-' + subIndex) }">
|
|
<i :class="getMenuIcon(subItem.name)" class="nav-icon-sub"></i>
|
|
<span class="nav-text">{{ subItem.name }}</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</li>
|
|
|
|
<!-- 无子菜单的项目 -->
|
|
<li v-else class="nav-item" :key="index">
|
|
<a class="nav-link"
|
|
@click="selectMenu(String(index))"
|
|
:class="{ active: actMenuIndex == String(index) }">
|
|
<i :class="getMenuIcon(item.name)" class="nav-icon"></i>
|
|
<span class="nav-text">{{ item.name }}</span>
|
|
</a>
|
|
</li>
|
|
</template>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- 侧边栏底部 -->
|
|
<div class="sidebar-footer">
|
|
<div class="user-info">
|
|
<div class="user-avatar">
|
|
<img :src="userAvatar" alt="用户头像" @error="handleAvatarError">
|
|
</div>
|
|
<div class="user-details">
|
|
<div class="user-name">{{ userName }}</div>
|
|
<div class="user-role">{{ userRole }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<!-- 主内容区域 -->
|
|
<div class="main-content">
|
|
<!-- 顶部导航栏 -->
|
|
<header class="topbar">
|
|
<div class="topbar-left">
|
|
<!-- 侧边栏切换按钮 -->
|
|
<button class="btn btn-link sidebar-toggle" type="button" id="sidebarToggle">
|
|
<i class="bi bi-list"></i>
|
|
</button>
|
|
|
|
<!-- 面包屑导航 -->
|
|
<nav aria-label="breadcrumb" class="breadcrumb-nav">
|
|
<ol class="breadcrumb mb-0">
|
|
<li class="breadcrumb-item">
|
|
<i class="bi bi-house-door"></i>
|
|
<span>首页</span>
|
|
</li>
|
|
<li class="breadcrumb-item active" aria-current="page">{{ currentPageTitle }}</li>
|
|
</ol>
|
|
</nav>
|
|
</div>
|
|
|
|
<div class="topbar-right">
|
|
<!-- 通知 -->
|
|
<div class="topbar-item dropdown" v-if="noticeList && noticeList.length > 0">
|
|
<button class="btn btn-link topbar-btn" type="button" data-bs-toggle="dropdown">
|
|
<i class="bi bi-bell"></i>
|
|
<span class="badge bg-danger notification-badge">{{ noticeList.length }}</span>
|
|
</button>
|
|
<ul class="dropdown-menu dropdown-menu-end notification-dropdown">
|
|
<li class="dropdown-header">
|
|
<strong>通知消息</strong>
|
|
</li>
|
|
<li v-for="notice in noticeList" :key="notice.id">
|
|
<a class="dropdown-item" href="#">
|
|
<div class="notification-item">
|
|
<div class="notification-content">{{ notice.content }}</div>
|
|
<small class="text-muted">{{ notice.time }}</small>
|
|
</div>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- 刷新按钮 -->
|
|
<div class="topbar-item">
|
|
<button class="btn btn-link topbar-btn" @click="refreshPage" title="刷新页面">
|
|
<i class="bi bi-arrow-clockwise"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- 用户菜单 -->
|
|
<div class="topbar-item dropdown">
|
|
<button class="btn btn-link topbar-btn user-menu-btn" type="button" data-bs-toggle="dropdown">
|
|
<img :src="userAvatar" alt="用户头像" class="user-avatar-small" @error="handleAvatarError">
|
|
<span class="user-name-small">{{ userName }}</span>
|
|
<i class="bi bi-chevron-down"></i>
|
|
</button>
|
|
<ul class="dropdown-menu dropdown-menu-end">
|
|
<li><h6 class="dropdown-header">{{ userName }}</h6></li>
|
|
<li><hr class="dropdown-divider"></li>
|
|
<li><a class="dropdown-item" href="#"><i class="bi bi-person"></i> 个人资料</a></li>
|
|
<li><a class="dropdown-item" href="#"><i class="bi bi-gear"></i> 设置</a></li>
|
|
<li><hr class="dropdown-divider"></li>
|
|
<li><a class="dropdown-item text-danger" @click="logout"><i class="bi bi-box-arrow-right"></i> 退出登录</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
<!-- 页面内容区域 -->
|
|
<main class="content-area">
|
|
<div class="container-fluid">
|
|
<!-- 二维码登录区域 (保持原有功能) -->
|
|
<div v-if="showQRCode" class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-body text-center">
|
|
<h5 class="card-title">扫码登录</h5>
|
|
<div class="qr-code-container">
|
|
<div id="qrcode" class="qr-code"></div>
|
|
<div v-if="qrCodeTimeout" class="qr-code-timeout">
|
|
<span>二维码已过期</span>
|
|
<button class="btn btn-primary btn-sm mt-2" @click="refreshQRCode">刷新二维码</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 主要内容区域 -->
|
|
<div id="myInclude" class="main-content-area">
|
|
<!-- 这里将加载具体的页面内容 -->
|
|
<div class="welcome-dashboard" v-if="!currentPageContent">
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-body text-center py-5">
|
|
<i class="bi bi-house-door display-1 text-primary mb-3"></i>
|
|
<h3>欢迎使用后台管理系统</h3>
|
|
<p class="text-muted">请从左侧菜单选择功能模块</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Bootstrap 5 JS -->
|
|
<script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
|
|
|
|
<script>
|
|
// Vue应用实例
|
|
var MenuApp = new Vue({
|
|
el: '#MenuIndex',
|
|
data: {
|
|
menuList: [], // 菜单列表
|
|
actMenuIndex: '0', // 当前激活的菜单索引
|
|
userName: '管理员', // 用户名
|
|
userRole: '系统管理员', // 用户角色
|
|
userAvatar: '__PUBLIC__/Retail/images/default-avatar.png', // 用户头像
|
|
logoUrl: '{$logoinfo["stageurl"]}', // Logo URL
|
|
noticeList: [], // 通知列表
|
|
showQRCode: false, // 是否显示二维码
|
|
qrCodeTimeout: false, // 二维码是否过期
|
|
currentPageTitle: '首页', // 当前页面标题
|
|
currentPageContent: null, // 当前页面内容
|
|
sidebarCollapsed: false // 侧边栏是否收起
|
|
},
|
|
mounted() {
|
|
this.initializeApp();
|
|
this.setupEventListeners();
|
|
},
|
|
methods: {
|
|
// 初始化应用
|
|
initializeApp() {
|
|
// 加载菜单数据 (保持原有逻辑)
|
|
this.loadMenuData();
|
|
// 加载用户信息
|
|
this.loadUserInfo();
|
|
// 加载通知信息
|
|
this.loadNotifications();
|
|
},
|
|
|
|
// 设置事件监听器
|
|
setupEventListeners() {
|
|
// 侧边栏切换
|
|
document.getElementById('sidebarToggle').addEventListener('click', () => {
|
|
this.toggleSidebar();
|
|
});
|
|
|
|
// 响应式处理
|
|
window.addEventListener('resize', () => {
|
|
this.handleResize();
|
|
});
|
|
},
|
|
|
|
// 切换侧边栏
|
|
toggleSidebar() {
|
|
const sidebar = document.getElementById('sidebar');
|
|
const wrapper = document.querySelector('.admin-wrapper');
|
|
|
|
sidebar.classList.toggle('collapsed');
|
|
wrapper.classList.toggle('sidebar-collapsed');
|
|
this.sidebarCollapsed = !this.sidebarCollapsed;
|
|
},
|
|
|
|
// 处理窗口大小变化
|
|
handleResize() {
|
|
if (window.innerWidth < 768) {
|
|
document.getElementById('sidebar').classList.add('collapsed');
|
|
document.querySelector('.admin-wrapper').classList.add('sidebar-collapsed');
|
|
this.sidebarCollapsed = true;
|
|
}
|
|
},
|
|
|
|
// 选择菜单项
|
|
selectMenu(index) {
|
|
this.actMenuIndex = index;
|
|
// 这里保持原有的菜单选择逻辑
|
|
console.log('选择菜单:', index);
|
|
|
|
// 更新当前页面标题
|
|
this.updatePageTitle(index);
|
|
|
|
// 加载对应的页面内容
|
|
this.loadPageContent(index);
|
|
},
|
|
|
|
// 更新页面标题
|
|
updatePageTitle(index) {
|
|
// 根据菜单索引更新标题的逻辑
|
|
const menuItem = this.getMenuItemByIndex(index);
|
|
if (menuItem) {
|
|
this.currentPageTitle = menuItem.name;
|
|
}
|
|
},
|
|
|
|
// 根据索引获取菜单项
|
|
getMenuItemByIndex(index) {
|
|
// 实现获取菜单项的逻辑
|
|
return { name: '菜单项' };
|
|
},
|
|
|
|
// 加载页面内容
|
|
loadPageContent(index) {
|
|
// 这里实现页面内容加载逻辑
|
|
this.currentPageContent = '页面内容';
|
|
},
|
|
|
|
// 获取菜单图标
|
|
getMenuIcon(menuName) {
|
|
const iconMap = {
|
|
'首页': 'bi bi-house-door',
|
|
'商品管理': 'bi bi-box',
|
|
'订单管理': 'bi bi-receipt',
|
|
'客户管理': 'bi bi-people',
|
|
'营销管理': 'bi bi-megaphone',
|
|
'财务管理': 'bi bi-currency-dollar',
|
|
'数据统计': 'bi bi-graph-up',
|
|
'系统设置': 'bi bi-gear',
|
|
'用户管理': 'bi bi-person-gear',
|
|
'权限管理': 'bi bi-shield-check'
|
|
};
|
|
return iconMap[menuName] || 'bi bi-circle';
|
|
},
|
|
|
|
// 加载菜单数据
|
|
loadMenuData() {
|
|
// 这里保持原有的菜单加载逻辑
|
|
// 示例数据
|
|
this.menuList = [
|
|
{ name: '首页', url: '/dashboard' },
|
|
{
|
|
name: '商品管理',
|
|
list: [
|
|
{ name: '商品列表', url: '/goods/list' },
|
|
{ name: '商品分类', url: '/goods/category' },
|
|
{ name: '商品品牌', url: '/goods/brand' }
|
|
]
|
|
},
|
|
{
|
|
name: '订单管理',
|
|
list: [
|
|
{ name: '订单列表', url: '/order/list' },
|
|
{ name: '退款管理', url: '/order/refund' }
|
|
]
|
|
}
|
|
];
|
|
},
|
|
|
|
// 加载用户信息
|
|
loadUserInfo() {
|
|
// 这里可以从服务器加载用户信息
|
|
this.userName = '{$Think.session.user_name}' || '管理员';
|
|
this.userRole = '{$Think.session.user_role}' || '系统管理员';
|
|
},
|
|
|
|
// 加载通知信息
|
|
loadNotifications() {
|
|
// 这里可以从服务器加载通知信息
|
|
this.noticeList = [];
|
|
},
|
|
|
|
// 刷新页面
|
|
refreshPage() {
|
|
window.location.reload();
|
|
},
|
|
|
|
// 退出登录
|
|
logout() {
|
|
if (confirm('确定要退出登录吗?')) {
|
|
window.location.href = '{:U("Login/logout")}';
|
|
}
|
|
},
|
|
|
|
// 处理Logo加载错误
|
|
handleLogoError(event) {
|
|
event.target.src = '__PUBLIC__/Retail/images/zhihuilogo4.png';
|
|
},
|
|
|
|
// 处理头像加载错误
|
|
handleAvatarError(event) {
|
|
event.target.src = '__PUBLIC__/Retail/images/default-avatar.png';
|
|
},
|
|
|
|
// 刷新二维码
|
|
refreshQRCode() {
|
|
this.qrCodeTimeout = false;
|
|
// 这里实现二维码刷新逻辑
|
|
}
|
|
}
|
|
});
|
|
|
|
// 页面加载完成后的初始化
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
// 初始化Bootstrap组件
|
|
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
|
|
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
|
return new bootstrap.Tooltip(tooltipTriggerEl);
|
|
});
|
|
|
|
// 初始化响应式处理
|
|
if (window.innerWidth < 768) {
|
|
document.getElementById('sidebar').classList.add('collapsed');
|
|
document.querySelector('.admin-wrapper').classList.add('sidebar-collapsed');
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html> |