185 lines
6.9 KiB
HTML
185 lines
6.9 KiB
HTML
{% extends "base.html" %}
|
||
|
||
{% block title %}CA机构列表{% endblock %}
|
||
|
||
{% block content %}
|
||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||
<div>
|
||
<h2 class="mb-1">CA机构列表</h2>
|
||
<div class="text-muted fs-6">
|
||
<i class="fas fa-shield-alt me-1"></i>共 {{ total }} 个CA机构
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<button id="batchDeleteBtn" class="btn btn-danger btn-sm me-2" disabled>
|
||
<i class="fas fa-trash-alt me-1"></i> 批量删除
|
||
</button>
|
||
<a href="{{ url_for('create_ca_view') }}" class="btn btn-primary btn-sm text-nowrap">
|
||
<i class="fas fa-plus me-1"></i> 创建CA机构
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card border-0 shadow-sm">
|
||
<div class="card-body p-0">
|
||
<div class="table-responsive">
|
||
<table class="table table-hover mb-0">
|
||
<thead class="table-light">
|
||
<tr>
|
||
<th width="40" class="ps-4">
|
||
<input type="checkbox" id="selectAll" class="form-check-input">
|
||
</th>
|
||
<th>ID</th>
|
||
<th>名称</th>
|
||
<th>通用名</th>
|
||
<th>组织</th>
|
||
<th>有效期</th>
|
||
<th>创建者</th>
|
||
<th>创建时间</th>
|
||
<th class="pe-4">操作</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for ca in cas %}
|
||
<tr>
|
||
<td class="ps-4">
|
||
<input type="checkbox" class="form-check-input ca-checkbox" value="{{ ca.id }}">
|
||
</td>
|
||
<td>{{ ca.id }}</td>
|
||
<td>
|
||
<a href="{{ url_for('ca_detail', ca_id=ca.id) }}" class="text-decoration-none">
|
||
{{ ca.name }}
|
||
</a>
|
||
</td>
|
||
<td>{{ ca.common_name }}</td>
|
||
<td>{{ ca.organization }}</td>
|
||
<td>{{ ca.days_valid }}天</td>
|
||
<td>{{ get_username(ca.created_by) }}</td>
|
||
<td>{{ ca.created_at.strftime('%Y-%m-%d') }}</td>
|
||
<td class="pe-4">
|
||
<a href="{{ url_for('ca_detail', ca_id=ca.id) }}"
|
||
class="btn btn-sm btn-outline-primary"
|
||
data-bs-toggle="tooltip"
|
||
title="查看CA详情">
|
||
<i class="fas fa-eye"></i>
|
||
</a>
|
||
</td>
|
||
</tr>
|
||
{% else %}
|
||
<tr>
|
||
<td colspan="9" class="text-center py-4">
|
||
<i class="fas fa-shield-alt fa-3x text-muted mb-3"></i>
|
||
<p class="text-muted">暂无CA机构记录</p>
|
||
<a href="{{ url_for('create_ca_view') }}" class="btn btn-primary btn-sm">
|
||
<i class="fas fa-plus me-2"></i> 创建CA机构
|
||
</a>
|
||
</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_list', page=page-1) }}" aria-label="Previous">
|
||
<span aria-hidden="true">«</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_list', page=p) }}">{{ p }}</a>
|
||
</li>
|
||
{% endfor %}
|
||
|
||
<li class="page-item {% if page == total_pages %}disabled{% endif %}">
|
||
<a class="page-link" href="{{ url_for('ca_list', page=page+1) }}" aria-label="Next">
|
||
<span aria-hidden="true">»</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</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)
|
||
})
|
||
|
||
// 全选/取消全选
|
||
const selectAll = document.getElementById('selectAll')
|
||
const checkboxes = document.querySelectorAll('.ca-checkbox')
|
||
const batchDeleteBtn = document.getElementById('batchDeleteBtn')
|
||
|
||
selectAll.addEventListener('change', function() {
|
||
checkboxes.forEach(checkbox => {
|
||
checkbox.checked = selectAll.checked
|
||
})
|
||
updateBatchDeleteBtn()
|
||
})
|
||
|
||
// 单个复选框变化时更新全选状态
|
||
checkboxes.forEach(checkbox => {
|
||
checkbox.addEventListener('change', function() {
|
||
selectAll.checked = [...checkboxes].every(cb => cb.checked)
|
||
updateBatchDeleteBtn()
|
||
})
|
||
})
|
||
|
||
// 更新批量删除按钮状态
|
||
function updateBatchDeleteBtn() {
|
||
const checkedCount = document.querySelectorAll('.ca-checkbox:checked').length
|
||
batchDeleteBtn.disabled = checkedCount === 0
|
||
}
|
||
|
||
// 批量删除
|
||
batchDeleteBtn.addEventListener('click', function() {
|
||
const checkedBoxes = document.querySelectorAll('.ca-checkbox:checked')
|
||
const ids = Array.from(checkedBoxes).map(checkbox => checkbox.value)
|
||
|
||
if (ids.length === 0) {
|
||
return
|
||
}
|
||
|
||
if (!confirm(`确定要删除选中的 ${ids.length} 个CA机构吗?`)) {
|
||
return
|
||
}
|
||
|
||
fetch("{{ url_for('batch_delete_cas') }}", {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'X-Requested-With': 'XMLHttpRequest'
|
||
},
|
||
body: JSON.stringify({ ids: ids })
|
||
})
|
||
.then(response => response.json())
|
||
.then(data => {
|
||
if (data.success) {
|
||
alert(data.message)
|
||
window.location.reload()
|
||
} else {
|
||
alert(data.message)
|
||
}
|
||
})
|
||
.catch(error => {
|
||
console.error('Error:', error)
|
||
alert('操作失败,请稍后再试')
|
||
})
|
||
})
|
||
})
|
||
</script>
|
||
{% endblock %} |