File size: 8,487 Bytes
f256f5b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | {% extends "admin_layout.html" %}
{% block admin_title %}用户管理{% endblock %}
{% block admin_page_content %}
<section class="content-grid admin-grid reveal-up delay-2">
<article class="card">
<div class="card-head">
<span class="kicker">新增用户</span>
<h2>手动录入用户信息</h2>
<p>管理员可以直接录入学生账号,课程和定时任务则在对应页面分别管理。</p>
</div>
<form method="post" action="{{ url_for('create_user') }}" class="form-grid form-grid-compact">
<label class="field">
<span>学号</span>
<input type="text" name="student_id" inputmode="numeric" placeholder="13 位学号" required>
</label>
<label class="field">
<span>显示名称</span>
<input type="text" name="display_name" placeholder="可选备注">
</label>
<label class="field">
<span>刷新间隔</span>
<input type="number" name="refresh_interval_seconds" min="{{ refresh_interval_min }}" max="{{ refresh_interval_max }}" value="{{ default_refresh_interval_seconds }}" required>
</label>
<label class="field span-2">
<span>密码</span>
<input type="password" name="password" placeholder="教务处密码" required>
</label>
<button type="submit" class="btn btn-secondary">创建用户</button>
</form>
</article>
<article class="card">
<div class="card-head">
<span class="kicker">跳转提示</span>
<h2>功能已拆分</h2>
<p>这里负责用户资料、课程和任务操作。定时任务请进入“定时任务”页面,注册码请进入“注册码”页面。</p>
</div>
<div class="button-row wrap-row">
<a href="{{ url_for('admin_schedules') }}" class="btn btn-secondary">去定时任务页</a>
<a href="{{ url_for('admin_registration_codes') }}" class="btn btn-ghost">去注册码页</a>
</div>
</article>
</section>
<section class="card reveal-up delay-3 span-2">
<div class="card-head">
<span class="kicker">用户管理</span>
<h2>所有用户与课程详情</h2>
<p>可以直接修改用户信息、增减课程,或代替用户启动和停止任务。</p>
</div>
<div class="user-card-grid">
{% for user in users %}
<section class="user-card" id="user-{{ user.id }}">
<div class="user-card-head">
<div>
<h3>{{ user.display_name or user.student_id }}</h3>
<p>{{ user.student_id }}</p>
</div>
<span class="status-pill status-{{ user.latest_task.status if user.latest_task else 'idle' }}">
{{ task_labels.get(user.latest_task.status, '未启动') if user.latest_task else '未启动' }}
</span>
</div>
<div class="chip-row tight">
<span class="chip {% if user.is_active %}highlight{% endif %}">{{ '启用中' if user.is_active else '已禁用' }}</span>
<span class="chip">课程 {{ user.course_count }}</span>
<span class="chip">最近任务 {{ user.latest_task.id if user.latest_task else '--' }}</span>
<span class="chip">刷新 {{ user.refresh_interval_seconds or default_refresh_interval_seconds }} 秒</span>
<span class="chip">尝试 {{ user.latest_task.total_attempts if user.latest_task else 0 }}</span>
<span class="chip">错误 {{ user.latest_task.total_errors if user.latest_task else 0 }}</span>
<span class="chip">定时 {{ '开启' if user.schedule and user.schedule.is_enabled else '关闭' }}</span>
</div>
<form method="post" action="{{ url_for('update_user', user_id=user.id) }}" class="form-grid form-grid-compact slim-form">
<label class="field span-2">
<span>显示名称</span>
<input type="text" name="display_name" value="{{ user.display_name }}" placeholder="备注名称">
</label>
<label class="field">
<span>刷新间隔</span>
<input type="number" name="refresh_interval_seconds" min="{{ refresh_interval_min }}" max="{{ refresh_interval_max }}" value="{{ user.refresh_interval_seconds or default_refresh_interval_seconds }}" required>
</label>
<label class="field span-2">
<span>重置密码</span>
<input type="password" name="password" placeholder="留空表示不修改">
</label>
<button type="submit" class="btn btn-ghost">保存用户</button>
</form>
<div class="button-row wrap-row compact-row">
<a href="{{ url_for('admin_schedules') }}#user-{{ user.id }}" class="btn btn-secondary">去设定时任务</a>
<form method="post" action="{{ url_for('toggle_user', user_id=user.id) }}">
<button type="submit" class="btn btn-ghost {% if not user.is_active %}danger{% endif %}">{{ '禁用' if user.is_active else '启用' }}</button>
</form>
<form method="post" action="{{ url_for('admin_start_user_task', user_id=user.id) }}">
<button type="submit" class="btn btn-primary">代启动任务</button>
</form>
<form method="post" action="{{ url_for('admin_stop_user_task', user_id=user.id) }}">
<button type="submit" class="btn btn-ghost danger">代停止任务</button>
</form>
<form method="post" action="{{ url_for('delete_user_by_admin', user_id=user.id) }}">
<button type="submit" class="btn btn-ghost danger">删除用户</button>
</form>
</div>
<form method="post" action="{{ url_for('admin_add_course', user_id=user.id) }}" class="form-grid form-grid-compact slim-form">
<label class="field">
<span>类型</span>
<select name="category">
<option value="free">自由选课</option>
<option value="plan">方案选课</option>
</select>
</label>
<label class="field">
<span>课程号</span>
<input type="text" name="course_id" placeholder="例如 888005010A59" autocapitalize="characters" required>
</label>
<label class="field">
<span>课序号</span>
<input type="text" name="course_index" placeholder="例如 01 或 666" autocapitalize="characters" required>
</label>
<button type="submit" class="btn btn-secondary">为该用户加课</button>
</form>
<div class="course-list">
{% if user.courses %}
{% for course in user.courses %}
<div class="course-chip-row">
<span>{{ category_labels.get(course.category, course.category) }} · {{ course.course_id }}_{{ course.course_index }}</span>
<form method="post" action="{{ url_for('admin_delete_course', course_target_id=course.id) }}">
<button type="submit" class="inline-action">删除</button>
</form>
</div>
{% endfor %}
{% else %}
<div class="empty-mini">当前没有课程目标。</div>
{% endif %}
</div>
</section>
{% else %}
<div class="empty-state-card">
还没有录入任何用户,请先通过上方表单创建用户。
</div>
{% endfor %}
</div>
</section>
{% endblock %}
|