251 lines
11 KiB
HTML
251 lines
11 KiB
HTML
{% extends 'layout/base.html' %}
|
||
|
||
{% block title %}学生主页 - SmartDSP考勤管理系统{% endblock %}
|
||
|
||
{% block content %}
|
||
<div class="container-fluid mt-4">
|
||
<!-- 欢迎标题 -->
|
||
<div class="row mb-4">
|
||
<div class="col">
|
||
<h2 class="fw-bold text-primary">
|
||
<i class="fas fa-home me-2"></i>
|
||
欢迎回来,{{ student.name }}!
|
||
</h2>
|
||
<p class="text-muted mb-0">
|
||
学号:{{ student.student_number }} |
|
||
学院:{{ student.college }} |
|
||
导师:{{ student.supervisor }}
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 统计卡片 -->
|
||
<div class="row mb-4">
|
||
<div class="col-md-3 mb-3">
|
||
<div class="card text-white bg-primary">
|
||
<div class="card-body">
|
||
<div class="d-flex justify-content-between">
|
||
<div>
|
||
<h4 class="card-title">{{ total_records }}</h4>
|
||
<p class="card-text">考勤记录</p>
|
||
</div>
|
||
<div class="align-self-center">
|
||
<i class="fas fa-calendar-check fa-2x opacity-75"></i>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-md-3 mb-3">
|
||
<div class="card text-white bg-success">
|
||
<div class="card-body">
|
||
<div class="d-flex justify-content-between">
|
||
<div>
|
||
<h4 class="card-title">{{ "%.1f"|format(total_work_hours) }}</h4>
|
||
<p class="card-text">总工作时长(小时)</p>
|
||
</div>
|
||
<div class="align-self-center">
|
||
<i class="fas fa-clock fa-2x opacity-75"></i>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-md-3 mb-3">
|
||
<div class="card text-white bg-warning">
|
||
<div class="card-body">
|
||
<div class="d-flex justify-content-between">
|
||
<div>
|
||
<h4 class="card-title">{{ total_absent_days }}</h4>
|
||
<p class="card-text">旷工天数</p>
|
||
</div>
|
||
<div class="align-self-center">
|
||
<i class="fas fa-exclamation-triangle fa-2x opacity-75"></i>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-md-3 mb-3">
|
||
<div class="card text-white bg-info">
|
||
<div class="card-body">
|
||
<div class="d-flex justify-content-between">
|
||
<div>
|
||
<h4 class="card-title">{{ pending_leaves|length }}</h4>
|
||
<p class="card-text">待审批请假</p>
|
||
</div>
|
||
<div class="align-self-center">
|
||
<i class="fas fa-file-alt fa-2x opacity-75"></i>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 主要内容区域 -->
|
||
<div class="row">
|
||
<!-- 最近考勤记录 -->
|
||
<div class="col-lg-8 mb-4">
|
||
<div class="card">
|
||
<div class="card-header d-flex justify-content-between align-items-center">
|
||
<h5 class="mb-0">
|
||
<i class="fas fa-calendar-check me-2"></i>最近考勤记录
|
||
</h5>
|
||
<a href="{{ url_for('student.attendance') }}" class="btn btn-sm btn-outline-primary">
|
||
查看全部 <i class="fas fa-arrow-right ms-1"></i>
|
||
</a>
|
||
</div>
|
||
<div class="card-body">
|
||
{% if recent_attendance %}
|
||
<div class="table-responsive">
|
||
<table class="table table-hover">
|
||
<thead>
|
||
<tr>
|
||
<th>周次</th>
|
||
<th>实际工作时长</th>
|
||
<th>班内工作时长</th>
|
||
<th>旷工天数</th>
|
||
<th>加班时长</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for record in recent_attendance %}
|
||
<tr>
|
||
<td>
|
||
<strong>{{ record.week_start_date.strftime('%m-%d') }}</strong>
|
||
至
|
||
<strong>{{ record.week_end_date.strftime('%m-%d') }}</strong>
|
||
</td>
|
||
<td>
|
||
<span class="badge bg-primary">{{ record.actual_work_hours }}h</span>
|
||
</td>
|
||
<td>
|
||
<span class="badge bg-success">{{ record.class_work_hours }}h</span>
|
||
</td>
|
||
<td>
|
||
{% if record.absent_days > 0 %}
|
||
<span class="badge bg-danger">{{ record.absent_days }}天</span>
|
||
{% else %}
|
||
<span class="badge bg-success">0天</span>
|
||
{% endif %}
|
||
</td>
|
||
<td>
|
||
<span class="badge bg-info">{{ record.overtime_hours }}h</span>
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
{% else %}
|
||
<div class="text-center py-4">
|
||
<i class="fas fa-calendar-times fa-3x text-muted mb-3"></i>
|
||
<p class="text-muted">暂无考勤记录</p>
|
||
</div>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 右侧边栏 -->
|
||
<div class="col-lg-4">
|
||
<!-- 待审批请假 -->
|
||
{% if pending_leaves %}
|
||
<div class="card mb-4">
|
||
<div class="card-header">
|
||
<h6 class="mb-0">
|
||
<i class="fas fa-clock me-2"></i>待审批请假
|
||
</h6>
|
||
</div>
|
||
<div class="card-body">
|
||
{% for leave in pending_leaves %}
|
||
<div class="border-start border-warning border-3 ps-3 mb-3">
|
||
<div class="d-flex justify-content-between align-items-start">
|
||
<div>
|
||
<strong>{{ leave.leave_start_date.strftime('%Y-%m-%d') }}</strong>
|
||
至
|
||
<strong>{{ leave.leave_end_date.strftime('%Y-%m-%d') }}</strong>
|
||
</div>
|
||
<span class="badge bg-warning text-dark">待审批</span>
|
||
</div>
|
||
<small class="text-muted">{{ leave.leave_reason[:30] }}...</small>
|
||
</div>
|
||
{% endfor %}
|
||
<a href="{{ url_for('student.leave_records') }}" class="btn btn-sm btn-outline-primary w-100">
|
||
查看所有请假记录
|
||
</a>
|
||
</div>
|
||
</div>
|
||
{% endif %}
|
||
|
||
<!-- 快速操作 -->
|
||
<div class="card mb-4">
|
||
<div class="card-header">
|
||
<h6 class="mb-0">
|
||
<i class="fas fa-bolt me-2"></i>快速操作
|
||
</h6>
|
||
</div>
|
||
<div class="card-body">
|
||
<div class="d-grid gap-2">
|
||
<a href="{{ url_for('student.attendance') }}" class="btn btn-outline-primary">
|
||
<i class="fas fa-calendar-check me-2"></i>查看考勤记录
|
||
</a>
|
||
<a href="{{ url_for('student.statistics') }}" class="btn btn-outline-info">
|
||
<i class="fas fa-chart-line me-2"></i>个人统计
|
||
</a>
|
||
<a href="{{ url_for('auth.change_password') }}" class="btn btn-outline-secondary">
|
||
<i class="fas fa-key me-2"></i>修改密码
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 个人信息 -->
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<h6 class="mb-0">
|
||
<i class="fas fa-user me-2"></i>个人信息
|
||
</h6>
|
||
</div>
|
||
<div class="card-body">
|
||
<div class="row g-2">
|
||
<div class="col-4"><strong>姓名:</strong></div>
|
||
<div class="col-8">{{ student.name }}</div>
|
||
|
||
<div class="col-4"><strong>性别:</strong></div>
|
||
<div class="col-8">{{ student.gender }}</div>
|
||
|
||
<div class="col-4"><strong>年级:</strong></div>
|
||
<div class="col-8">{{ student.grade }}级</div>
|
||
|
||
<div class="col-4"><strong>专业:</strong></div>
|
||
<div class="col-8">{{ student.major }}</div>
|
||
|
||
<div class="col-4"><strong>学位:</strong></div>
|
||
<div class="col-8">{{ student.degree_type }}</div>
|
||
|
||
{% if student.phone %}
|
||
<div class="col-4"><strong>电话:</strong></div>
|
||
<div class="col-8">{{ student.phone }}</div>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endblock %}
|
||
|
||
{% block extra_js %}
|
||
<script>
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
// 如果有数据,可以在这里添加图表初始化代码
|
||
console.log('Dashboard loaded');
|
||
});
|
||
</script>
|
||
{% endblock %}
|