Files
car-maintenance-system/frontend/admin/dashboard.html
wangziqi 35098f3028 add
2026-01-08 13:23:09 +08:00

607 lines
31 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>管理员仪表板 - 车管家4S店车辆维保管理系统</title>
<link href="/lib/bootstrap.min.css" rel="stylesheet">
<link href="/lib/bootstrap-icons.css" rel="stylesheet">
<link rel="stylesheet" href="../css/style.css">
</head>
<body>
<div class="dashboard-wrapper">
<!-- 侧边栏 -->
<nav class="sidebar">
<div class="sidebar-header">
<i class="bi bi-car-front-fill fs-1 d-block mb-2"></i>
<h5 class="mb-1">车管家系统</h5>
<small>管理员控制台</small>
</div>
<div class="mt-4">
<a class="menu-item active" onclick="showSection('overview')">
<i class="bi bi-speedometer2"></i>
<span>系统概览</span>
</a>
<a class="menu-item" onclick="showSection('users')">
<i class="bi bi-people-fill"></i>
<span>用户管理</span>
</a>
<a class="menu-item" onclick="showSection('vehicles')">
<i class="bi bi-car-front"></i>
<span>车辆管理</span>
</a>
<a class="menu-item" onclick="showSection('orders')">
<i class="bi bi-clipboard-data"></i>
<span>工单管理</span>
</a>
<a class="menu-item" onclick="showSection('parts')">
<i class="bi bi-box-seam"></i>
<span>配件管理</span>
</a>
<a class="menu-item" onclick="showSection('appointments')">
<i class="bi bi-calendar-check"></i>
<span>预约管理</span>
</a>
</div>
</nav>
<!-- 主内容区 -->
<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="d-flex align-items-center gap-3">
<div class="dropdown">
<button class="btn btn-outline-light dropdown-toggle" style="color: black;" 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>
</div>
</div>
<!-- 系统概览 -->
<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="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="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="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="card-header">
<h6 class="mb-0"><i class="bi bi-clock-history"></i> 最近工单</h6>
</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="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="content-section" style="display: none;">
<div class="content-card">
<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="content-section" style="display: none;">
<div class="content-card">
<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="content-section" style="display: none;">
<div class="content-card">
<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="content-section" style="display: none;">
<div class="content-card">
<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="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="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>
<!-- 配件编辑模态框 -->
<div class="modal fade" id="partModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="partModalTitle">编辑配件</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="partForm">
<input type="hidden" id="partId">
<div class="row">
<div class="col-6 mb-3">
<label class="form-label">配件编号</label>
<input type="text" class="form-control" id="partPartNo" required>
</div>
<div class="col-6 mb-3">
<label class="form-label">配件名称</label>
<input type="text" class="form-control" id="partPartName" required>
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<label class="form-label">类别</label>
<input type="text" class="form-control" id="partCategory" placeholder="如:机油滤清器">
</div>
<div class="col-6 mb-3">
<label class="form-label">品牌</label>
<input type="text" class="form-control" id="partBrand">
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<label class="form-label">型号</label>
<input type="text" class="form-control" id="partModel">
</div>
<div class="col-6 mb-3">
<label class="form-label">单位</label>
<select class="form-select" id="partUnit">
<option value="个"></option>
<option value="套"></option>
<option value="桶"></option>
<option value="瓶"></option>
<option value="对"></option>
<option value="件"></option>
</select>
</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="partUnitPrice" required>
</div>
<div class="col-6 mb-3">
<label class="form-label">库存数量</label>
<input type="number" class="form-control" id="partStockQuantity" required>
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<label class="form-label">
最小库存
<span class="text-danger" title="低于此值将触发库存预警">*</span>
</label>
<input type="number" class="form-control" id="partMinStock" required>
</div>
<div class="col-6 mb-3">
<label class="form-label">供应商</label>
<input type="text" class="form-control" id="partSupplier">
</div>
</div>
<div class="mb-3">
<label class="form-label">仓库位置</label>
<input type="text" class="form-control" id="partWarehouseLocation" placeholder="如A区01架02层">
</div>
<div class="mb-3">
<label class="form-label">备注</label>
<textarea class="form-control" id="partRemark" rows="2"></textarea>
</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="savePart()">保存</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="/lib/bootstrap.bundle.min.js"></script>
<script src="../js/config.js"></script>
<script src="../js/api.js"></script>
<script src="../js/app.js"></script>
<script src="../js/admin.js"></script>
</body>
</html>