certmanager/templates/ca_detail.html
2025-06-15 09:23:42 +08:00

245 lines
11 KiB
HTML

{% extends "base.html" %}
{% block title %}{{ ca.name }} - CA详情{% endblock %}
{% block content %}
<div class="d-flex justify-content-between align-items-center mb-3">
<div>
<h2 class="mb-1">CA机构详情: {{ ca.name }}</h2>
<div class="text-muted fs-6">
<i class="fas fa-folder-open me-1"></i>路径: {{ ca.name|to_pinyin }}
</div>
</div>
<div class="btn-group btn-group-sm">
<a href="{{ url_for('export_ca_view', ca_id=ca.id) }}"
class="btn btn-primary me-1 text-nowrap"
data-bs-toggle="tooltip"
title="导出CA证书(管理员可导出私钥)">
<i class="fas fa-file-export me-1"></i> 导出CA
</a>
<a href="{{ url_for('generate_crl_view', ca_id=ca.id) }}"
class="btn btn-warning me-1 text-nowrap"
data-bs-toggle="tooltip"
title="重新生成证书吊销列表">
<i class="fas fa-sync-alt me-1"></i> 生成CRL
</a>
{% if crl %}
<a href="{{ url_for('download_crl', ca_id=ca.id) }}"
class="btn btn-success me-1 text-nowrap"
data-bs-toggle="tooltip"
title="下载当前CRL文件(有效期至 {{ crl.next_update.strftime('%Y-%m-%d') }})">
<i class="fas fa-download me-1"></i> 下载CRL
</a>
{% endif %}
<a href="{{ url_for('delete_ca', ca_id=ca.id) }}"
class="btn btn-danger text-nowrap"
data-bs-toggle="tooltip"
title="删除此CA(谨慎操作)">
<i class="fas fa-trash-alt me-1"></i> 删除CA
</a>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="card mb-4">
<div class="card-header bg-light">
<h5 class="card-title mb-0">
<i class="fas fa-info-circle text-primary me-2"></i> 基本信息
</h5>
</div>
<div class="card-body">
<dl class="row mb-0">
<dt class="col-sm-4 text-muted"><i class="fas fa-id-card me-2"></i> 通用名</dt>
<dd class="col-sm-8">{{ ca.common_name }}</dd>
<dt class="col-sm-4 text-muted"><i class="fas fa-building me-2"></i> 组织</dt>
<dd class="col-sm-8">{{ ca.organization }}</dd>
<dt class="col-sm-4 text-muted"><i class="fas fa-users me-2"></i> 组织单位</dt>
<dd class="col-sm-8">{{ ca.organizational_unit or 'N/A' }}</dd>
<dt class="col-sm-4 text-muted"><i class="fas fa-globe me-2"></i> 国家</dt>
<dd class="col-sm-8">{{ ca.country }}</dd>
<dt class="col-sm-4 text-muted"><i class="fas fa-map-marked me-2"></i> 州/省</dt>
<dd class="col-sm-8">{{ ca.state or 'N/A' }}</dd>
<dt class="col-sm-4 text-muted"><i class="fas fa-city me-2"></i> 城市</dt>
<dd class="col-sm-8">{{ ca.locality or 'N/A' }}</dd>
</dl>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card mb-4">
<div class="card-header bg-light">
<h5 class="card-title mb-0">
<i class="fas fa-cogs text-primary me-2"></i> 技术信息
</h5>
</div>
<div class="card-body">
<dl class="row mb-0">
<dt class="col-sm-4 text-muted"><i class="fas fa-key me-2"></i> 密钥长度</dt>
<dd class="col-sm-8">{{ ca.key_size }}位</dd>
<dt class="col-sm-4 text-muted"><i class="fas fa-calendar-check me-2"></i> 有效期</dt>
<dd class="col-sm-8">
{{ ca.days_valid }}天
{% if ca.created_at %}
(至 {{ (ca.created_at + timedelta(days=ca.days_valid)).strftime('%Y-%m-%d') }})
{% endif %}
</dd>
<dt class="col-sm-4 text-muted"><i class="fas fa-user me-2"></i> 创建者</dt>
<dd class="col-sm-8">{{ get_username(ca.created_by) }}</dd>
<dt class="col-sm-4 text-muted"><i class="fas fa-clock me-2"></i> 创建时间</dt>
<dd class="col-sm-8">{{ ca.created_at.strftime('%Y-%m-%d %H:%M') }}</dd>
<dt class="col-sm-4 text-muted"><i class="fas fa-certificate me-1"></i> 证书路径</dt>
<dd class="col-sm-8">
<code>{{ ca.cert_path|to_pinyin }}</code>
</dd>
<dt class="col-sm-4 text-muted"><i class="fas fa-lock me-2"></i> 私钥路径</dt>
<dd class="col-sm-8">
<code>{{ ca.key_path|to_pinyin }}</code>
</dd>
</dl>
</div>
</div>
</div>
</div>
<!-- 证书列表部分 -->
<div class="card">
<div class="card-header bg-light d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="fas fa-certificate text-primary me-2"></i> 颁发的证书
<span class="badge bg-primary rounded-pill ms-2">{{ total }}</span>
</h5>
<div>
<a href="{{ url_for('create_certificate_view') }}?ca_id={{ ca.id }}"
class="btn btn-sm btn-primary"
data-bs-toggle="tooltip"
title="使用此CA颁发新证书">
<i class="fas fa-plus me-1"></i> 创建证书
</a>
</div>
</div>
<div class="card-body p-0">
{% if certificates %}
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light">
<tr>
<th class="ps-4">ID</th>
<th>通用名</th>
<th>状态</th>
<th>有效期至</th>
<th>创建者</th>
<th>创建时间</th>
<th class="pe-4">操作</th>
</tr>
</thead>
<tbody>
{% for cert in certificates %}
<tr>
<td class="ps-4">{{ cert.id }}</td>
<td>
<a href="{{ url_for('certificate_detail', cert_id=cert.id) }}" class="text-decoration-none">
{{ cert.common_name }}
</a>
</td>
<td>
{% if cert.status == 'active' %}
<span class="badge bg-success rounded-pill">
<i class="fas fa-check-circle me-1"></i> 有效
</span>
{% elif cert.status == 'revoked' %}
<span class="badge bg-danger rounded-pill">
<i class="fas fa-ban me-1"></i> 已吊销
</span>
{% else %}
<span class="badge bg-secondary rounded-pill">
<i class="fas fa-clock me-1"></i> 已过期
</span>
{% endif %}
</td>
<td>{{ cert.expires_at.strftime('%Y-%m-%d') }}</td>
<td>{{ get_username(cert.created_by) }}</td>
<td>{{ cert.created_at.strftime('%Y-%m-%d') }}</td>
<td class="pe-4">
<div class="btn-group btn-group-sm">
<a href="{{ url_for('certificate_detail', cert_id=cert.id) }}"
class="btn btn-outline-primary"
data-bs-toggle="tooltip"
title="查看证书详情">
<i class="fas fa-eye me-1"></i> 详情
</a>
<a href="{{ url_for('export_certificate_view', cert_id=cert.id) }}"
class="btn btn-outline-success"
data-bs-toggle="tooltip"
title="导出证书">
<i class="fas fa-download me-1"></i> 导出
</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if total_pages > 1 %}
<div class="card-footer bg-white">
<nav aria-label="Page navigation">
<ul class="pagination justify-content-center mb-0">
<li class="page-item {% if page == 1 %}disabled{% endif %}">
<a class="page-link" href="{{ url_for('ca_detail', ca_id=ca.id, page=page-1) }}" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
{% for p in range(1, total_pages + 1) %}
<li class="page-item {% if p == page %}active{% endif %}">
<a class="page-link" href="{{ url_for('ca_detail', ca_id=ca.id, page=p) }}">{{ p }}</a>
</li>
{% endfor %}
<li class="page-item {% if page == total_pages %}disabled{% endif %}">
<a class="page-link" href="{{ url_for('ca_detail', ca_id=ca.id, page=page+1) }}" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
</ul>
</nav>
</div>
{% endif %}
{% else %}
<div class="text-center py-5">
<i class="fas fa-certificate fa-4x text-muted mb-4"></i>
<h5 class="text-muted mb-3">该CA尚未颁发任何证书</h5>
<a href="{{ url_for('create_certificate_view') }}?ca_id={{ ca.id }}" class="btn btn-primary">
<i class="fas fa-plus me-2"></i> 立即创建证书
</a>
</div>
{% endif %}
</div>
</div>
{% endblock %}
{% block scripts %}
{{ super() }}
<script>
// 启用工具提示
document.addEventListener('DOMContentLoaded', function() {
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl)
})
})
</script>
{% endblock %}