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