This commit is contained in:
wangziqi
2026-01-07 15:39:54 +08:00
parent 81e6c3eeb8
commit 7c4be0b7b4
20 changed files with 3792 additions and 832 deletions

View File

@@ -4,297 +4,514 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>管理员仪表板 - 车管家4S店车辆维保管理系统</title>
<link rel="stylesheet" href="../css/common.css">
<link rel="stylesheet" href="../css/dashboard.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css" rel="stylesheet">
<link rel="stylesheet" href="../css/style.css">
</head>
<body>
<div class="dashboard-container">
<div class="dashboard-wrapper">
<!-- 侧边栏 -->
<div class="sidebar">
<nav class="sidebar">
<div class="sidebar-header">
<h2>车管家系统</h2>
<p>管理员控制台</p>
<i class="bi bi-car-front-fill fs-1 d-block mb-2"></i>
<h5 class="mb-1">车管家系统</h5>
<small>管理员控制台</small>
</div>
<div class="sidebar-menu">
<div class="menu-item active" onclick="showSection('overview')">
<span class="menu-icon">📊</span>
<div class="mt-4">
<a class="menu-item active" onclick="showSection('overview')">
<i class="bi bi-speedometer2"></i>
<span>系统概览</span>
</div>
<div class="menu-item" onclick="showSection('users')">
<span class="menu-icon">👥</span>
</a>
<a class="menu-item" onclick="showSection('users')">
<i class="bi bi-people-fill"></i>
<span>用户管理</span>
</div>
<div class="menu-item" onclick="showSection('vehicles')">
<span class="menu-icon">🚗</span>
</a>
<a class="menu-item" onclick="showSection('vehicles')">
<i class="bi bi-car-front"></i>
<span>车辆管理</span>
</div>
<div class="menu-item" onclick="showSection('orders')">
<span class="menu-icon">📋</span>
</a>
<a class="menu-item" onclick="showSection('orders')">
<i class="bi bi-clipboard-data"></i>
<span>工单管理</span>
</div>
<div class="menu-item" onclick="showSection('parts')">
<span class="menu-icon">🔧</span>
</a>
<a class="menu-item" onclick="showSection('parts')">
<i class="bi bi-box-seam"></i>
<span>配件管理</span>
</div>
<div class="menu-item" onclick="showSection('appointments')">
<span class="menu-icon">📅</span>
</a>
<a class="menu-item" onclick="showSection('appointments')">
<i class="bi bi-calendar-check"></i>
<span>预约管理</span>
</div>
</a>
</div>
</div>
</nav>
<!-- 主内容区 -->
<div class="main-content">
<!-- 顶部导航 -->
<div class="top-nav">
<div class="top-nav-left">
<h1>管理员仪表板</h1>
<main class="main-content">
<!-- 顶部导航 -->
<div class="top-navbar">
<div class="d-flex align-items-center">
<h5 class="mb-0 me-3">
<i class="bi bi-speedometer2"></i> 管理员仪表板
</h5>
</div>
<div class="top-nav-right">
<div class="user-info">
<div class="user-avatar" id="userAvatar">A</div>
<span class="user-name" id="userName">管理员</span>
<div class="d-flex align-items-center gap-3">
<div class="dropdown">
<button class="btn btn-outline-light dropdown-toggle" type="button" data-bs-toggle="dropdown">
<i class="bi bi-person-circle"></i>
<span id="userName">管理员</span>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><h6 class="dropdown-header">当前角色</h6></li>
<li><span class="dropdown-item" id="userRole"></span></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" onclick="Utils.logout()">
<i class="bi bi-box-arrow-right"></i> 退出登录
</a></li>
</ul>
</div>
<button class="btn-logout" onclick="utils.logout()">退出登录</button>
</div>
</div>
<!-- 系统概览 -->
<div id="overview-section" class="section">
<div class="stats-grid">
<div class="stat-card">
<div class="stat-icon blue">👥</div>
<div class="stat-info">
<h3 id="totalUsers">0</h3>
<p>用户总数</p>
<div id="overview-section" class="content-section">
<!-- 统计卡片 -->
<div class="row g-4 mb-4">
<div class="col-md-3">
<div class="stat-card">
<div class="stat-icon blue">
<i class="bi bi-people-fill"></i>
</div>
<div class="stat-value" id="totalUsers">0</div>
<div class="stat-label">用户总数</div>
</div>
</div>
<div class="stat-card">
<div class="stat-icon green">🚗</div>
<div class="stat-info">
<h3 id="totalVehicles">0</h3>
<p>车辆总数</p>
<div class="col-md-3">
<div class="stat-card">
<div class="stat-icon green">
<i class="bi bi-car-front-fill"></i>
</div>
<div class="stat-value" id="totalVehicles">0</div>
<div class="stat-label">车辆总数</div>
</div>
</div>
<div class="stat-card">
<div class="stat-icon orange">📋</div>
<div class="stat-info">
<h3 id="totalOrders">0</h3>
<p>工单总数</p>
<div class="col-md-3">
<div class="stat-card">
<div class="stat-icon orange">
<i class="bi bi-clipboard-data-fill"></i>
</div>
<div class="stat-value" id="totalOrders">0</div>
<div class="stat-label">工单总数</div>
</div>
</div>
<div class="stat-card">
<div class="stat-icon red">🔧</div>
<div class="stat-info">
<h3 id="lowStockParts">0</h3>
<p>库存预警</p>
<div class="col-md-3">
<div class="stat-card">
<div class="stat-icon red">
<i class="bi bi-exclamation-triangle-fill"></i>
</div>
<div class="stat-value" id="lowStockParts">0</div>
<div class="stat-label">库存预警</div>
</div>
</div>
</div>
<!-- 最近工单 -->
<div class="content-card">
<div class="content-header">
<h2>最近工单</h2>
<div class="card-header">
<h6 class="mb-0"><i class="bi bi-clock-history"></i> 最近工单</h6>
</div>
<div class="content-body">
<table class="table" id="recentOrdersTable">
<thead>
<tr>
<th>工单编号</th>
<th>服务类型</th>
<th>车牌号</th>
<th>状态</th>
<th>创建时间</th>
</tr>
</thead>
<tbody id="recentOrdersBody">
<tr><td colspan="5" class="empty-state">加载中...</td></tr>
</tbody>
</table>
<div class="card-body">
<div class="table-responsive">
<table class="table table-custom">
<thead>
<tr>
<th>工单编号</th>
<th>服务类型</th>
<th>车牌号</th>
<th>总费用</th>
<th>状态</th>
<th>创建时间</th>
</tr>
</thead>
<tbody id="recentOrdersTableBody">
<tr>
<td colspan="6" class="text-center text-muted py-4">
<div class="spinner-border spinner-border-sm me-2"></div>
加载中...
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- 用户管理 -->
<div id="users-section" class="section" style="display: none;">
<div class="toolbar">
<div class="toolbar-left">
<button class="btn btn-primary" onclick="showAddUserModal()">添加用户</button>
</div>
<div class="search-box">
<input type="text" id="searchUser" placeholder="搜索用户..." onkeyup="searchUsers()">
<button>🔍</button>
</div>
</div>
<div id="users-section" class="content-section" style="display: none;">
<div class="content-card">
<div class="content-body">
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>真实姓名</th>
<th>手机号</th>
<th>角色</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="usersTableBody">
<tr><td colspan="7" class="empty-state">加载中...</td></tr>
</tbody>
</table>
<div class="card-header d-flex justify-content-between align-items-center">
<h6 class="mb-0"><i class="bi bi-people-fill"></i> 用户管理</h6>
<button class="btn btn-primary btn-sm" onclick="showAddUserModal()">
<i class="bi bi-person-plus"></i> 添加用户
</button>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-custom">
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>真实姓名</th>
<th>手机号</th>
<th>角色</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="allUsersTableBody">
<tr>
<td colspan="7" class="text-center text-muted py-4">加载中...</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- 车辆管理 -->
<div id="vehicles-section" class="section" style="display: none;">
<div class="toolbar">
<div class="toolbar-left">
<button class="btn btn-primary" onclick="showAddVehicleModal()">添加车辆</button>
</div>
<div class="search-box">
<input type="text" id="searchVehicle" placeholder="搜索车辆..." onkeyup="searchVehicles()">
<button>🔍</button>
</div>
</div>
<div id="vehicles-section" class="content-section" style="display: none;">
<div class="content-card">
<div class="content-body">
<table class="table">
<thead>
<tr>
<th>车牌号</th>
<th>品牌型号</th>
<th>颜色</th>
<th>里程数</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="vehiclesTableBody">
<tr><td colspan="6" class="empty-state">加载中...</td></tr>
</tbody>
</table>
<div class="card-header d-flex justify-content-between align-items-center">
<h6 class="mb-0"><i class="bi bi-car-front"></i> 车辆管理</h6>
<button class="btn btn-primary btn-sm" onclick="showAddVehicleModal()">
<i class="bi bi-plus-circle"></i> 添加车辆
</button>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-custom">
<thead>
<tr>
<th>车牌号</th>
<th>品牌型号</th>
<th>颜色</th>
<th>里程(公里)</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="allVehiclesTableBody">
<tr>
<td colspan="6" class="text-center text-muted py-4">加载中...</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- 工单管理 -->
<div id="orders-section" class="section" style="display: none;">
<div class="toolbar">
<div class="toolbar-left">
<button class="btn btn-primary" onclick="showAddOrderModal()">创建工单</button>
<select id="orderStatusFilter" onchange="filterOrders()">
<option value="">全部状态</option>
<option value="pending">待处理</option>
<option value="appointed">已预约</option>
<option value="in_progress">进行中</option>
<option value="completed">已完成</option>
<option value="cancelled">已取消</option>
</select>
</div>
</div>
<div id="orders-section" class="content-section" style="display: none;">
<div class="content-card">
<div class="content-body">
<table class="table">
<thead>
<tr>
<th>工单编号</th>
<th>服务类型</th>
<th>车牌号</th>
<th>总费用</th>
<th>状态</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<tbody id="ordersTableBody">
<tr><td colspan="7" class="empty-state">加载中...</td></tr>
</tbody>
</table>
<div class="card-header d-flex justify-content-between align-items-center">
<h6 class="mb-0"><i class="bi bi-clipboard-data"></i> 工单管理</h6>
<div>
<select class="form-select form-select-sm d-inline-block w-auto me-2" onchange="filterOrders(this.value)">
<option value="">全部状态</option>
<option value="pending">待处理</option>
<option value="appointed">已预约</option>
<option value="in_progress">进行中</option>
<option value="completed">已完成</option>
<option value="cancelled">已取消</option>
</select>
<button class="btn btn-primary btn-sm" onclick="showAddOrderModal()">
<i class="bi bi-plus-circle"></i> 创建工单
</button>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-custom">
<thead>
<tr>
<th>工单编号</th>
<th>服务类型</th>
<th>车牌号</th>
<th>总费用</th>
<th>工单状态</th>
<th>支付状态</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<tbody id="allOrdersTableBody">
<tr>
<td colspan="8" class="text-center text-muted py-4">加载中...</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- 配件管理 -->
<div id="parts-section" class="section" style="display: none;">
<div class="toolbar">
<div class="toolbar-left">
<button class="btn btn-primary" onclick="showAddPartModal()">添加配件</button>
<button class="btn btn-warning" onclick="showLowStockParts()">库存预警</button>
</div>
<div class="search-box">
<input type="text" id="searchPart" placeholder="搜索配件..." onkeyup="searchParts()">
<button>🔍</button>
</div>
</div>
<div id="parts-section" class="content-section" style="display: none;">
<div class="content-card">
<div class="content-body">
<table class="table">
<thead>
<tr>
<th>配件编号</th>
<th>配件名称</th>
<th>类别</th>
<th>库存数量</th>
<th>单价</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="partsTableBody">
<tr><td colspan="7" class="empty-state">加载中...</td></tr>
</tbody>
</table>
<div class="card-header d-flex justify-content-between align-items-center">
<h6 class="mb-0"><i class="bi bi-box-seam"></i> 配件管理</h6>
<button class="btn btn-primary btn-sm" onclick="showAddPartModal()">
<i class="bi bi-plus-circle"></i> 添加配件
</button>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-custom">
<thead>
<tr>
<th>配件编号</th>
<th>配件名称</th>
<th>类别</th>
<th>库存数量</th>
<th>单价</th>
<th>操作</th>
</tr>
</thead>
<tbody id="partsTableBody">
<tr>
<td colspan="6" class="text-center text-muted py-4">加载中...</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- 预约管理 -->
<div id="appointments-section" class="section" style="display: none;">
<div class="toolbar">
<div class="toolbar-left">
<select id="appointmentStatusFilter" onchange="filterAppointments()">
<option value="">全部状态</option>
<option value="pending">待确认</option>
<option value="confirmed">已确认</option>
<option value="completed">已完成</option>
<option value="cancelled">已取消</option>
</select>
<div id="appointments-section" class="content-section" style="display: none;">
<div class="content-card">
<div class="card-header">
<h6 class="mb-0"><i class="bi bi-calendar-check"></i> 预约管理</h6>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-custom">
<thead>
<tr>
<th>预约ID</th>
<th>服务类型</th>
<th>车牌号</th>
<th>预约时间</th>
<th>联系电话</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="appointmentsTableBody">
<tr>
<td colspan="7" class="text-center text-muted py-4">加载中...</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</main>
</div>
<div class="content-card">
<div class="content-body">
<table class="table">
<thead>
<tr>
<th>预约ID</th>
<th>服务类型</th>
<th>车牌号</th>
<th>预约时间</th>
<th>联系电话</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="appointmentsTableBody">
<tr><td colspan="7" class="empty-state">加载中...</td></tr>
</tbody>
</table>
</div>
<!-- 用户编辑模态框 -->
<div class="modal fade" id="userModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="userModalTitle">编辑用户</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="userForm">
<input type="hidden" id="userId">
<div class="mb-3">
<label class="form-label">用户名</label>
<input type="text" class="form-control" id="userUsername" required>
</div>
<div class="mb-3">
<label class="form-label">真实姓名</label>
<input type="text" class="form-control" id="userRealName" required>
</div>
<div class="mb-3">
<label class="form-label">手机号</label>
<input type="tel" class="form-control" id="userPhone" required>
</div>
<div class="mb-3">
<label class="form-label">邮箱</label>
<input type="email" class="form-control" id="userEmail">
</div>
<div class="mb-3">
<label class="form-label">角色</label>
<select class="form-select" id="userRole" required>
<option value="admin">管理员</option>
<option value="staff">工作人员</option>
<option value="customer">客户</option>
</select>
</div>
<div class="mb-3">
<label class="form-label">状态</label>
<select class="form-select" id="userStatus">
<option value="1">启用</option>
<option value="0">禁用</option>
</select>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" onclick="saveUser()">保存</button>
</div>
</div>
</div>
</div>
<!-- 车辆编辑模态框 -->
<div class="modal fade" id="vehicleModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="vehicleModalTitle">编辑车辆</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="vehicleForm">
<input type="hidden" id="vehicleId">
<div class="mb-3">
<label class="form-label">车牌号</label>
<input type="text" class="form-control" id="vehicleLicensePlate" required>
</div>
<div class="mb-3">
<label class="form-label">品牌</label>
<input type="text" class="form-control" id="vehicleBrand" required>
</div>
<div class="mb-3">
<label class="form-label">型号</label>
<input type="text" class="form-control" id="vehicleModel" required>
</div>
<div class="mb-3">
<label class="form-label">颜色</label>
<input type="text" class="form-control" id="vehicleColor">
</div>
<div class="mb-3">
<label class="form-label">里程(公里)</label>
<input type="number" step="0.01" class="form-control" id="vehicleMileage" value="0">
</div>
<div class="mb-3">
<label class="form-label">状态</label>
<select class="form-select" id="vehicleStatus">
<option value="normal">正常</option>
<option value="in_service">维修中</option>
<option value="completed">已完成</option>
</select>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" onclick="saveVehicle()">保存</button>
</div>
</div>
</div>
</div>
<!-- 工单编辑模态框 -->
<div class="modal fade" id="orderModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="orderModalTitle">编辑工单</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="orderForm">
<input type="hidden" id="orderId">
<div class="mb-3">
<label class="form-label">服务类型</label>
<select class="form-select" id="orderServiceType" required>
<option value="maintenance">保养维护</option>
<option value="repair">维修服务</option>
<option value="beauty">美容服务</option>
<option value="insurance">保险代理</option>
</select>
</div>
<div class="mb-3">
<label class="form-label">故障描述</label>
<textarea class="form-control" id="orderFaultDescription" rows="2"></textarea>
</div>
<div class="mb-3">
<label class="form-label">诊断结果</label>
<textarea class="form-control" id="orderDiagnosisResult" rows="2"></textarea>
</div>
<div class="row">
<div class="col-6 mb-3">
<label class="form-label">配件费用</label>
<input type="number" step="0.01" class="form-control" id="orderPartsCost" value="0">
</div>
<div class="col-6 mb-3">
<label class="form-label">工时费用</label>
<input type="number" step="0.01" class="form-control" id="orderLaborCost" value="0">
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<label class="form-label">总费用</label>
<input type="number" step="0.01" class="form-control" id="orderTotalCost" value="0" readonly>
</div>
<div class="col-6 mb-3">
<label class="form-label">状态</label>
<select class="form-select" id="orderStatus">
<option value="pending">待处理</option>
<option value="appointed">已预约</option>
<option value="in_progress">进行中</option>
<option value="completed">已完成</option>
<option value="cancelled">已取消</option>
</select>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" onclick="saveOrder()">保存</button>
</div>
</div>
</div>
</div>
<!-- Toast 通知 -->
<div class="toast-container position-fixed top-0 end-0 p-3">
<div id="liveToast" class="toast" role="alert">
<div class="toast-header">
<i class="bi bi-bell me-2" id="toastIcon"></i>
<strong class="me-auto" id="toastTitle">提示</strong>
<button type="button" class="btn-close" data-bs-dismiss="toast"></button>
</div>
<div class="toast-body" id="toastMessage"></div>
</div>
</div>
<!-- Loading 遮罩 -->
<div id="loadingOverlay" class="loading-overlay d-none">
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="../js/config.js"></script>
<script src="../js/api.js"></script>
<script src="../js/admin-dashboard.js"></script>
<script src="../js/admin.js"></script>
<script src="../js/app.js"></script>
</body>
</html>