77 lines
4.1 KiB
HTML
77 lines
4.1 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}后台管理 · RustDesk 客户端定制平台{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="page-head">
|
|
<h1 class="page-title">后台管理 · 构建任务总览</h1>
|
|
<p class="page-subtitle">查看全部用户提交的构建任务(最近 100 条),并进行用户与任务管理。</p>
|
|
</div>
|
|
|
|
<div class="stat-grid">
|
|
<div class="stat-card is-primary"><div class="stat-value">{{ stats.total }}</div><div class="stat-label">全部任务</div></div>
|
|
<div class="stat-card is-info"><div class="stat-value">{{ stats.in_progress }}</div><div class="stat-label">进行中</div></div>
|
|
<div class="stat-card is-success"><div class="stat-value">{{ stats.success }}</div><div class="stat-label">构建成功</div></div>
|
|
<div class="stat-card is-danger"><div class="stat-value">{{ stats.failure }}</div><div class="stat-label">失败 / 取消</div></div>
|
|
<div class="stat-card"><div class="stat-value">{{ stats.users }}</div><div class="stat-label">注册用户</div></div>
|
|
<div class="stat-card"><div class="stat-value">{{ stats.tokens }}</div><div class="stat-label">有效 API 令牌</div></div>
|
|
</div>
|
|
|
|
<div class="btn-row" style="margin-bottom:20px">
|
|
<a class="btn btn-secondary" href="{% url 'github_settings' %}"><svg class="icon"><use href="#i-sliders"/></svg> 构建平台配置</a>
|
|
<a class="btn btn-secondary" href="{% url 'maintenance_settings' %}"><svg class="icon"><use href="#i-clock"/></svg> 维护设置</a>
|
|
<a class="btn btn-secondary" href="{% url 'user_list' %}"><svg class="icon"><use href="#i-users"/></svg> 用户管理</a>
|
|
<a class="btn btn-secondary" href="/admin/"><svg class="icon"><use href="#i-wrench"/></svg> Django 高级管理后台</a>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-header"><svg class="icon"><use href="#i-list"/></svg> 最近构建任务</div>
|
|
{% if builds %}
|
|
<div class="table-wrap">
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th>提交时间</th>
|
|
<th>提交用户</th>
|
|
<th>配置名称</th>
|
|
<th>平台</th>
|
|
<th>状态</th>
|
|
<th>任务编号</th>
|
|
<th>操作</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for run in builds %}
|
|
<tr>
|
|
<td class="text-muted" style="white-space:nowrap">{{ run.created_at|date:"Y-m-d H:i" }}</td>
|
|
<td>{% if run.created_by %}{{ run.created_by.username }}{% else %}<span class="text-muted">—</span>{% endif %}</td>
|
|
<td><strong>{{ run.filename|default:"—" }}</strong></td>
|
|
<td>{{ run.platform_label }}</td>
|
|
<td><span class="badge {{ run.status_badge }} {% if not run.is_finished %}badge-dot{% endif %}">{{ run.status_label }}</span></td>
|
|
<td class="mono text-muted">{{ run.short_uuid }}</td>
|
|
<td style="white-space:nowrap">
|
|
<a class="btn btn-secondary btn-sm"
|
|
href="/check_for_file?filename={{ run.filename|urlencode }}&uuid={{ run.uuid|urlencode }}&platform={{ run.platform|urlencode }}">查看</a>
|
|
<form method="post" class="inline-form" action="{% url 'delete_build' run.id %}"
|
|
onsubmit="return confirm('确定删除任务「{{ run.filename|default:run.short_uuid|escapejs }}」吗?将同时删除服务器上已生成的安装包文件,且不可恢复。');">
|
|
{% csrf_token %}
|
|
<button type="submit" class="btn btn-danger btn-sm">
|
|
<svg class="icon"><use href="#i-trash"/></svg> 删除
|
|
</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% else %}
|
|
<div class="empty-state">
|
|
<div class="empty-icon"><svg class="icon" style="width:42px;height:42px"><use href="#i-inbox"/></svg></div>
|
|
<h3>暂无构建任务</h3>
|
|
<p>还没有任何用户提交过构建任务。</p>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endblock %}
|