feat: 新增平台

This commit is contained in:
2025-11-30 19:49:25 +08:00
parent c3e56a954d
commit fbd2c491b2
41 changed files with 4293 additions and 76 deletions

View File

@@ -19,6 +19,7 @@
<a href="/admin/dashboard" class="nav-item">仪表板</a>
<a href="/admin/users" class="nav-item active">用户管理</a>
<a href="/admin/apis" class="nav-item">接口管理</a>
<a href="/admin/redeem-codes" class="nav-item">兑换码</a>
<a href="/admin/config" class="nav-item">系统配置</a>
<a href="/admin/logs" class="nav-item">日志审计</a>
</nav>
@@ -105,7 +106,12 @@
<input type="hidden" id="editUserId">
<div class="form-group">
<label>用户分组</label>
<select id="editGroupId" class="ui-input"></select>
<select id="editGroupId" class="ui-input" onchange="onGroupChange()"></select>
</div>
<div class="form-group" id="expiryGroup" style="display: none;">
<label>套餐到期时间</label>
<input type="datetime-local" id="editExpiresAt" class="ui-input">
<small style="color: var(--text-muted); font-size: 0.75rem;">游客和普通用户无需设置到期时间</small>
</div>
<div class="form-group">
<label>账号状态</label>
@@ -234,7 +240,10 @@
<td>#${u.id}</td>
<td><span class="font-medium">${u.username}</span></td>
<td class="text-muted">${u.email}</td>
<td><span class="badge badge-info">${u.group_name}</span></td>
<td>
<span class="badge badge-info">${u.group_name}</span>
${u.group_id > 2 && u.expires_at ? `<br><small class="text-muted">${u.is_expired ? '已过期' : '至 ' + u.expires_at}</small>` : ''}
</td>
<td>${u.total_parse_count}</td>
<td>
<span class="badge ${u.is_active ? 'badge-success' : 'badge-error'}">
@@ -243,8 +252,8 @@
</td>
<td class="text-muted text-sm">${new Date(u.created_at).toLocaleString('zh-CN')}</td>
<td>
<button class="ui-btn ui-btn-secondary ui-btn-sm"
onclick="editUser(${u.id}, ${u.group_id}, ${u.is_active})">
<button class="ui-btn ui-btn-secondary ui-btn-sm"
onclick="editUser(${u.id}, ${u.group_id}, ${u.is_active}, ${u.expires_at ? `'${u.expires_at}'` : null})">
编辑
</button>
</td>
@@ -268,13 +277,35 @@
}
}
function editUser(id, groupId, isActive) {
function editUser(id, groupId, isActive, expiresAt) {
document.getElementById('editUserId').value = id;
document.getElementById('editGroupId').value = groupId;
document.getElementById('editIsActive').value = isActive;
// 设置到期时间
if (expiresAt) {
document.getElementById('editExpiresAt').value = expiresAt.slice(0, 16);
} else {
document.getElementById('editExpiresAt').value = '';
}
// 根据用户组显示/隐藏到期时间
onGroupChange();
document.getElementById('editModal').classList.add('show');
}
function onGroupChange() {
const groupId = parseInt(document.getElementById('editGroupId').value);
const expiryGroup = document.getElementById('expiryGroup');
// 游客(1)和普通用户(2)不显示到期时间
if (groupId > 2) {
expiryGroup.style.display = 'block';
} else {
expiryGroup.style.display = 'none';
document.getElementById('editExpiresAt').value = '';
}
}
function closeModal() {
document.getElementById('editModal').classList.remove('show');
}
@@ -337,11 +368,19 @@
document.getElementById('editForm').addEventListener('submit', async (e) => {
e.preventDefault();
const userId = document.getElementById('editUserId').value;
const groupId = parseInt(document.getElementById('editGroupId').value);
const expiresAt = document.getElementById('editExpiresAt').value;
const data = {
group_id: parseInt(document.getElementById('editGroupId').value),
group_id: groupId,
is_active: document.getElementById('editIsActive').value === 'true'
};
// VIP/SVIP 需要设置到期时间
if (groupId > 2) {
data.expires_at = expiresAt || null;
}
try {
const response = await fetch(`/admin/api/users/${userId}`, {
method: 'PUT',
@@ -354,6 +393,7 @@
UI.notify('更新成功', 'success');
closeModal();
loadUsers(currentPage);
loadUserStats();
} else {
UI.notify(result.message || '更新失败', 'error');
}