文件
mashangyoujiu/Application/Retail/View/bootstrap5-index.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>