You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

550 lines
18 KiB

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>仪表盘 - 资金使用管理系统</title>
<link href="https://cdn.staticfile.org/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap-icons/1.11.0/font/bootstrap-icons.min.css">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Microsoft YaHei', sans-serif;
background-color: #f5f7fa;
padding: 20px;
}
.page-header {
background: white;
padding: 25px 30px;
border-radius: 10px;
margin-bottom: 20px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
}
.page-title {
font-size: 24px;
font-weight: 600;
color: #333;
margin: 0;
}
.page-subtitle {
color: #666;
font-size: 14px;
margin-top: 5px;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 20px;
}
.stat-card {
background: white;
padding: 25px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
transition: transform 0.3s, box-shadow 0.3s;
}
.stat-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
}
.stat-card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
}
.stat-card-title {
font-size: 14px;
color: #666;
font-weight: 500;
}
.stat-card-icon {
width: 50px;
height: 50px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
color: white;
}
.stat-card-icon.primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.stat-card-icon.success {
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
}
.stat-card-icon.warning {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
}
.stat-card-icon.info {
background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
}
.stat-card-value {
font-size: 32px;
font-weight: 700;
color: #333;
margin-bottom: 5px;
}
.stat-card-change {
font-size: 14px;
display: flex;
align-items: center;
gap: 5px;
}
.stat-card-change.positive {
color: #10b981;
}
.stat-card-change.negative {
color: #ef4444;
}
.content-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 20px;
margin-bottom: 20px;
}
.card {
background: white;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
border: none;
}
.card-header {
background: transparent;
border-bottom: 1px solid #e5e7eb;
padding: 20px 25px;
font-weight: 600;
font-size: 16px;
color: #333;
}
.card-body {
padding: 25px;
}
.table {
margin: 0;
}
.table thead th {
border-top: none;
border-bottom: 2px solid #e5e7eb;
font-weight: 600;
color: #666;
font-size: 14px;
padding: 12px;
}
.table tbody td {
padding: 15px 12px;
vertical-align: middle;
border-bottom: 1px solid #f3f4f6;
}
.badge {
padding: 6px 12px;
font-weight: 500;
font-size: 12px;
}
.badge-pending {
background-color: #fef3c7;
color: #92400e;
}
.badge-approved {
background-color: #d1fae5;
color: #065f46;
}
.badge-rejected {
background-color: #fee2e2;
color: #991b1b;
}
.badge-processing {
background-color: #dbeafe;
color: #1e40af;
}
.quick-actions {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 15px;
}
.quick-action-btn {
padding: 20px;
border: 2px solid #e5e7eb;
border-radius: 10px;
text-align: center;
text-decoration: none;
color: #333;
transition: all 0.3s;
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
}
.quick-action-btn:hover {
border-color: #667eea;
background-color: #f0f0ff;
color: #667eea;
transform: translateY(-2px);
}
.quick-action-btn i {
font-size: 32px;
}
.quick-action-btn span {
font-weight: 500;
font-size: 14px;
}
.progress-item {
margin-bottom: 20px;
}
.progress-item:last-child {
margin-bottom: 0;
}
.progress-label {
display: flex;
justify-content: space-between;
margin-bottom: 8px;
font-size: 14px;
color: #666;
}
.progress-label strong {
color: #333;
}
.progress {
height: 8px;
border-radius: 10px;
background-color: #e5e7eb;
}
.progress-bar {
border-radius: 10px;
}
.empty-state {
text-align: center;
padding: 40px 20px;
color: #999;
}
.empty-state i {
font-size: 48px;
margin-bottom: 15px;
opacity: 0.5;
}
@media (max-width: 768px) {
.content-grid {
grid-template-columns: 1fr;
}
.stats-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<!-- 页面头部 -->
<div class="page-header">
<h1 class="page-title">
<i class="bi bi-speedometer2"></i> 首页
</h1>
<p class="page-subtitle">欢迎回来,这里是您的资金使用概览</p>
</div>
<!-- 统计卡片 -->
<div class="stats-grid">
<div class="stat-card">
<div class="stat-card-header">
<div class="stat-card-title">待审批事项</div>
<div class="stat-card-icon primary">
<i class="bi bi-file-earmark-check"></i>
</div>
</div>
<div class="stat-card-value">12</div>
<div class="stat-card-change positive">
<i class="bi bi-arrow-up"></i>
<span>较昨日 +3</span>
</div>
</div>
<div class="stat-card">
<div class="stat-card-header">
<div class="stat-card-title">待支付事项</div>
<div class="stat-card-icon success">
<i class="bi bi-cash-coin"></i>
</div>
</div>
<div class="stat-card-value">8</div>
<div class="stat-card-change positive">
<i class="bi bi-arrow-up"></i>
<span>较昨日 +2</span>
</div>
</div>
<div class="stat-card">
<div class="stat-card-header">
<div class="stat-card-title">本月支出</div>
<div class="stat-card-icon warning">
<i class="bi bi-currency-yen"></i>
</div>
</div>
<div class="stat-card-value">¥1,245,680</div>
<div class="stat-card-change negative">
<i class="bi bi-arrow-down"></i>
<span>较上月 -5.2%</span>
</div>
</div>
<div class="stat-card">
<div class="stat-card-header">
<div class="stat-card-title">已完成事项</div>
<div class="stat-card-icon info">
<i class="bi bi-check-circle"></i>
</div>
</div>
<div class="stat-card-value">156</div>
<div class="stat-card-change positive">
<i class="bi bi-arrow-up"></i>
<span>较上月 +12%</span>
</div>
</div>
</div>
<!-- 主要内容区域 -->
<div class="content-grid">
<!-- 待办事项列表 -->
<div class="card">
<div class="card-header">
<i class="bi bi-list-task"></i> 待办事项
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>申请类型</th>
<th>申请人</th>
<th>金额</th>
<th>状态</th>
<th>提交时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<i class="bi bi-cart text-primary"></i>
采购管理 - 政府采购
</td>
<td>张三</td>
<td>¥125,000</td>
<td><span class="badge badge-pending">待审批</span></td>
<td>2024-01-15 10:30</td>
<td>
<button class="btn btn-sm btn-outline-primary">查看</button>
</td>
</tr>
<tr>
<td>
<i class="bi bi-airplane text-info"></i>
出差管理 - 课题
</td>
<td>李四</td>
<td>¥8,500</td>
<td><span class="badge badge-pending">待审批</span></td>
<td>2024-01-15 09:15</td>
<td>
<button class="btn btn-sm btn-outline-primary">查看</button>
</td>
</tr>
<tr>
<td>
<i class="bi bi-calendar-event text-success"></i>
会议审批 - 非课题
</td>
<td>王五</td>
<td>¥3,200</td>
<td><span class="badge badge-approved">已批准</span></td>
<td>2024-01-14 16:45</td>
<td>
<button class="btn btn-sm btn-outline-success">支付</button>
</td>
</tr>
<tr>
<td>
<i class="bi bi-file-earmark-text text-warning"></i>
合同审批
</td>
<td>赵六</td>
<td>¥450,000</td>
<td><span class="badge badge-processing">处理中</span></td>
<td>2024-01-14 14:20</td>
<td>
<button class="btn btn-sm btn-outline-primary">查看</button>
</td>
</tr>
<tr>
<td>
<i class="bi bi-tools text-secondary"></i>
安装维修申请
</td>
<td>钱七</td>
<td>¥15,800</td>
<td><span class="badge badge-approved">已批准</span></td>
<td>2024-01-14 11:30</td>
<td>
<button class="btn btn-sm btn-outline-success">支付</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- 快速操作和进度 -->
<div>
<!-- 快速操作 -->
<div class="card mb-3">
<div class="card-header">
<i class="bi bi-lightning-charge"></i> 快速操作
</div>
<div class="card-body">
<div class="quick-actions">
<a href="#" class="quick-action-btn" onclick="parent.loadPage('pages/payment/payment-wizard.html'); return false;">
<i class="bi bi-magic text-primary"></i>
<span>支付向导</span>
</a>
<a href="#" class="quick-action-btn" onclick="parent.loadPage('pages/pre-approval/procurement.html'); return false;">
<i class="bi bi-cart text-success"></i>
<span>采购申请</span>
</a>
<a href="#" class="quick-action-btn" onclick="parent.loadPage('pages/pre-approval/travel.html'); return false;">
<i class="bi bi-airplane text-info"></i>
<span>出差申请</span>
</a>
<a href="#" class="quick-action-btn" onclick="parent.loadPage('pages/pre-approval/meeting.html'); return false;">
<i class="bi bi-calendar-event text-warning"></i>
<span>会议申请</span>
</a>
</div>
</div>
</div>
<!-- 审批进度 -->
<div class="card">
<div class="card-header">
<i class="bi bi-graph-up"></i> 本月审批进度
</div>
<div class="card-body">
<div class="progress-item">
<div class="progress-label">
<span>采购管理</span>
<strong>85%</strong>
</div>
<div class="progress">
<div class="progress-bar bg-primary" style="width: 85%"></div>
</div>
</div>
<div class="progress-item">
<div class="progress-label">
<span>出差管理</span>
<strong>72%</strong>
</div>
<div class="progress">
<div class="progress-bar bg-success" style="width: 72%"></div>
</div>
</div>
<div class="progress-item">
<div class="progress-label">
<span>会议、培训</span>
<strong>68%</strong>
</div>
<div class="progress">
<div class="progress-bar bg-info" style="width: 68%"></div>
</div>
</div>
<div class="progress-item">
<div class="progress-label">
<span>合同管理</span>
<strong>91%</strong>
</div>
<div class="progress">
<div class="progress-bar bg-warning" style="width: 91%"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.staticfile.org/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
<script>
// 页面加载时的动画效果
document.addEventListener('DOMContentLoaded', function() {
const cards = document.querySelectorAll('.stat-card, .card');
cards.forEach((card, index) => {
card.style.opacity = '0';
card.style.transform = 'translateY(20px)';
setTimeout(() => {
card.style.transition = 'all 0.5s ease';
card.style.opacity = '1';
card.style.transform = 'translateY(0)';
}, index * 100);
});
});
// 模拟数据更新(实际项目中应该从后端获取)
function updateStats() {
// 这里可以添加实时数据更新逻辑
console.log('统计数据更新');
}
// 每30秒更新一次数据
setInterval(updateStats, 30000);
</script>
</body>
</html>