114 lines
3.4 KiB
HTML
114 lines
3.4 KiB
HTML
<!doctype html>
|
|
{% load static %}
|
|
<html lang="zh-Hans">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>{% block title %}cmhub{% endblock %}</title>
|
|
<link href="{% static 'portal/vendor/bootstrap/bootstrap.min.css' %}" rel="stylesheet">
|
|
<style>
|
|
:root {
|
|
--cmhub-bg: #f6f7f9;
|
|
--cmhub-ink: #17202a;
|
|
--cmhub-line: #d8dee6;
|
|
--cmhub-accent: #0f766e;
|
|
}
|
|
body {
|
|
background: var(--cmhub-bg);
|
|
color: var(--cmhub-ink);
|
|
}
|
|
.navbar {
|
|
border-bottom: 1px solid var(--cmhub-line);
|
|
background: #ffffff;
|
|
}
|
|
.cmhub-shell {
|
|
max-width: 960px;
|
|
margin: 0 auto;
|
|
padding: 40px 16px;
|
|
}
|
|
.cmhub-panel {
|
|
max-width: 440px;
|
|
margin: 0 auto;
|
|
border: 1px solid var(--cmhub-line);
|
|
border-radius: 8px;
|
|
background: #ffffff;
|
|
padding: 28px;
|
|
}
|
|
.cmhub-panel form p {
|
|
margin-bottom: 16px;
|
|
}
|
|
.cmhub-panel label {
|
|
display: block;
|
|
margin-bottom: 6px;
|
|
font-weight: 600;
|
|
}
|
|
.cmhub-panel input {
|
|
width: 100%;
|
|
min-height: 40px;
|
|
border: 1px solid #b9c2cf;
|
|
border-radius: 6px;
|
|
padding: 8px 10px;
|
|
}
|
|
.cmhub-panel .errorlist {
|
|
margin: 0 0 12px;
|
|
padding-left: 18px;
|
|
color: #b42318;
|
|
}
|
|
.btn-primary {
|
|
--bs-btn-bg: var(--cmhub-accent);
|
|
--bs-btn-border-color: var(--cmhub-accent);
|
|
--bs-btn-hover-bg: #0b5f59;
|
|
--bs-btn-hover-border-color: #0b5f59;
|
|
}
|
|
.metric {
|
|
border: 1px solid var(--cmhub-line);
|
|
border-radius: 8px;
|
|
background: #ffffff;
|
|
padding: 18px;
|
|
}
|
|
.cmhub-surface {
|
|
border: 1px solid var(--cmhub-line);
|
|
border-radius: 8px;
|
|
background: #ffffff;
|
|
padding: 20px;
|
|
}
|
|
.key-value {
|
|
word-break: break-all;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<nav class="navbar navbar-expand">
|
|
<div class="container">
|
|
<a class="navbar-brand fw-semibold" href="{% url 'portal-home' %}">cmhub</a>
|
|
<div class="ms-auto d-flex gap-2 flex-wrap justify-content-end">
|
|
{% if user.is_authenticated %}
|
|
<a class="btn btn-sm btn-outline-secondary" href="{% url 'portal-dashboard' %}">控制台</a>
|
|
<a class="btn btn-sm btn-primary" href="{% url 'portal-recharge' %}">充值</a>
|
|
<a class="btn btn-sm btn-outline-secondary" href="{% url 'portal-apikeys' %}">API Key</a>
|
|
<a class="btn btn-sm btn-outline-secondary" href="{% url 'portal-recharge-records' %}">充值记录</a>
|
|
<a class="btn btn-sm btn-outline-secondary" href="{% url 'portal-usage-records' %}">消费记录</a>
|
|
<form method="post" action="{% url 'portal-logout' %}">
|
|
{% csrf_token %}
|
|
<button class="btn btn-sm btn-outline-secondary" type="submit">退出</button>
|
|
</form>
|
|
{% else %}
|
|
<a class="btn btn-sm btn-outline-secondary" href="{% url 'portal-login' %}">登录</a>
|
|
<a class="btn btn-sm btn-primary" href="{% url 'portal-signup' %}">注册</a>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
<main class="cmhub-shell">
|
|
{% if messages %}
|
|
<div class="mb-3">
|
|
{% for message in messages %}
|
|
<div class="alert alert-{{ message.tags|default:'info' }} mb-2">{{ message }}</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
</body>
|
|
</html>
|