File size: 7,704 Bytes
bbb6398 834bfcd bbb6398 834bfcd bbb6398 834bfcd bbb6398 834bfcd bbb6398 834bfcd bbb6398 834bfcd bbb6398 ef8784d bbb6398 ef8784d bbb6398 ef8784d bbb6398 ef8784d bbb6398 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
/**
* API密钥管理器 - 批量操作模块
* 包含批量选择、删除和复制等功能
*/
// 切换单个密钥的选择状态
function toggleKeySelection(keyId) {
// 检查密钥是否符合当前视图(有效/无效)
const key = this.apiKeys.find(k => k.id === keyId);
// 如果密钥不存在或者密钥状态与当前视图不符,不进行任何操作
if (!key || (this.currentView === 'valid' && key.success !== true) ||
(this.currentView === 'invalid' && key.success !== false)) {
return;
}
const index = this.selectedKeys.indexOf(keyId);
if (index === -1) {
// 添加到选中数组
this.selectedKeys.push(keyId);
} else {
// 从选中数组中移除
this.selectedKeys.splice(index, 1);
}
// 检查是否需要更新平台选择状态
this.updatePlatformSelectionStates();
}
// 切换平台的选择状态
function togglePlatformSelection(platformId) {
const index = this.selectedPlatforms.indexOf(platformId);
if (index === -1) {
// 添加到选中平台数组
this.selectedPlatforms.push(platformId);
// 选中该平台下的所有符合当前视图的密钥
this.apiKeys.forEach(key => {
// 只选择符合当前视图的密钥
if (key.platform === platformId && !this.selectedKeys.includes(key.id) &&
((this.currentView === 'valid' && key.success === true) ||
(this.currentView === 'invalid' && key.success === false))) {
this.selectedKeys.push(key.id);
}
});
} else {
// 从选中平台数组中移除
this.selectedPlatforms.splice(index, 1);
// 取消选中该平台下的所有密钥
this.selectedKeys = this.selectedKeys.filter(keyId => {
const key = this.apiKeys.find(k => k.id === keyId);
return key && key.platform !== platformId;
});
}
}
// 更新平台选择状态(基于已选择的密钥)
function updatePlatformSelectionStates() {
const platforms = this.getPlatforms();
// 清空当前选中的平台
this.selectedPlatforms = [];
// 对于每个平台,检查该平台下符合当前视图的所有密钥是否都被选中
platforms.forEach(platform => {
// 筛选出符合当前视图的平台密钥
const platformKeys = this.apiKeys.filter(key =>
key.platform === platform.id &&
((this.currentView === 'valid' && key.success === true) ||
(this.currentView === 'invalid' && key.success === false))
);
const allSelected = platformKeys.length > 0 &&
platformKeys.every(key => this.selectedKeys.includes(key.id));
if (allSelected) {
this.selectedPlatforms.push(platform.id);
}
});
}
// 获取所有可见密钥ID
function getAllVisibleKeyIds() {
// 基于当前视图状态和JavaScript筛选而不是仅依赖DOM
const visibleIds = this.apiKeys
.filter(key => {
// 应用当前视图筛选
if (this.currentView === 'valid' && key.success !== true) return false;
if (this.currentView === 'invalid' && key.success !== false) return false;
// 应用平台筛选
if (!this.platformFilters[key.platform]) return false;
// 应用搜索筛选
if (this.searchTerm && !this.matchesSearch(key.name, key.key)) return false;
return true;
})
.map(key => key.id);
return visibleIds;
}
// 切换全选/取消全选
function toggleSelectAll() {
const allIds = this.getAllVisibleKeyIds();
// 过滤出只属于选中平台的密钥ID
const filteredIds = allIds.filter(id => {
const key = this.apiKeys.find(k => k.id === id);
return key && this.platformFilters[key.platform] === true;
});
if (this.isAllSelected) {
// 如果当前是全选状态,则取消全选
this.selectedKeys = this.selectedKeys.filter(id => !filteredIds.includes(id));
} else {
// 否则选中所有可见且属于选中平台的密钥
// 先合并当前已选中的ID
const newSelection = [...this.selectedKeys];
// 添加所有未选中的可见ID
filteredIds.forEach(id => {
if (!newSelection.includes(id)) {
newSelection.push(id);
}
});
this.selectedKeys = newSelection;
}
// 更新平台选择状态
this.updatePlatformSelectionStates();
}
// 批量删除API密钥
function bulkDeleteApiKeys() {
if (this.selectedKeys.length === 0) return;
// 设置批量删除标志
this.isBulkDelete = true;
// 显示确认对话框
this.showDeleteConfirm = true;
}
// 批量复制API密钥
function bulkCopyApiKeys() {
if (this.selectedKeys.length === 0) return;
// 获取所有选中密钥的值
const selectedKeyValues = [];
this.selectedKeys.forEach(keyId => {
// 查找对应的DOM元素
const keyElement = document.querySelector(`[data-key-id="${keyId}"]`);
if (keyElement) {
// 获取密钥值 - 从DOM中提取
const keyValueElement = keyElement.querySelector('.text-gray-500.font-mono');
if (keyValueElement) {
const keyValue = keyValueElement.textContent.trim();
selectedKeyValues.push(keyValue);
}
}
});
// 如果成功提取了密钥值
if (selectedKeyValues.length > 0) {
// 将密钥值格式化为一行一个
const formattedKeys = selectedKeyValues.join('\n');
// 使用临时textarea元素复制文本
const textarea = document.createElement('textarea');
textarea.value = formattedKeys;
textarea.style.position = 'fixed';
document.body.appendChild(textarea);
textarea.select();
try {
document.execCommand('copy');
// 使用SweetAlert2显示复制成功动画
const Toast = Swal.mixin({
toast: true,
position: 'top-end',
showConfirmButton: false,
timer: 1500,
timerProgressBar: true,
didOpen: (toast) => {
toast.onmouseenter = Swal.stopTimer;
toast.onmouseleave = Swal.resumeTimer;
}
});
Toast.fire({
icon: 'success',
title: `已成功复制 ${selectedKeyValues.length} 个密钥到剪贴板`,
background: '#f0fdf4',
iconColor: '#16a34a'
});
} catch (err) {
console.error('复制失败:', err);
Swal.fire({
icon: 'error',
title: '复制失败',
text: '请手动复制内容',
confirmButtonColor: '#0284c7'
});
} finally {
document.body.removeChild(textarea);
}
} else {
Swal.fire({
icon: 'error',
title: '复制失败',
text: '无法获取所选密钥的值',
confirmButtonColor: '#0284c7'
});
}
}
|