superlishunqin 3e6c8d353c SmartDSP
2025-06-12 00:38:27 +08:00

251 lines
11 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.

{% 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 %}