Merge branch 'main' into main

This commit is contained in:
Wesley Liddick
2025-07-26 10:05:24 +08:00
committed by GitHub
3 changed files with 168 additions and 12 deletions

View File

@@ -112,6 +112,8 @@ const app = createApp({
apiKeys: [],
apiKeysLoading: false,
apiKeyStatsTimeRange: 'all', // API Key统计时间范围all, 7days, monthly
apiKeysSortBy: '', // 当前排序字段
apiKeysSortOrder: 'asc', // 排序顺序 'asc' 或 'desc'
showCreateApiKeyModal: false,
createApiKeyLoading: false,
apiKeyForm: {
@@ -193,6 +195,7 @@ const app = createApp({
accounts: [],
accountsLoading: false,
accountSortBy: 'dailyTokens', // 默认按今日Token排序
accountsSortOrder: 'asc', // 排序顺序 'asc' 或 'desc'
showCreateAccountModal: false,
createAccountLoading: false,
accountForm: {
@@ -296,6 +299,83 @@ const app = createApp({
return `${window.location.protocol}//${window.location.host}/api/`;
},
// 排序后的账户列表
sortedAccounts() {
if (!this.accountsSortBy) {
return this.accounts;
}
return [...this.accounts].sort((a, b) => {
let aValue = a[this.accountsSortBy];
let bValue = b[this.accountsSortBy];
// 特殊处理状态字段
if (this.accountsSortBy === 'status') {
aValue = a.isActive ? 1 : 0;
bValue = b.isActive ? 1 : 0;
}
// 处理字符串比较
if (typeof aValue === 'string' && typeof bValue === 'string') {
aValue = aValue.toLowerCase();
bValue = bValue.toLowerCase();
}
// 排序
if (this.accountsSortOrder === 'asc') {
return aValue > bValue ? 1 : aValue < bValue ? -1 : 0;
} else {
return aValue < bValue ? 1 : aValue > bValue ? -1 : 0;
}
});
},
// 排序后的API Keys列表
sortedApiKeys() {
if (!this.apiKeysSortBy) {
return this.apiKeys;
}
return [...this.apiKeys].sort((a, b) => {
let aValue, bValue;
// 特殊处理不同字段
switch (this.apiKeysSortBy) {
case 'status':
aValue = a.isActive ? 1 : 0;
bValue = b.isActive ? 1 : 0;
break;
case 'cost':
// 计算费用,转换为数字比较
aValue = this.calculateApiKeyCostNumber(a.usage);
bValue = this.calculateApiKeyCostNumber(b.usage);
break;
case 'createdAt':
case 'expiresAt':
// 日期比较
aValue = a[this.apiKeysSortBy] ? new Date(a[this.apiKeysSortBy]).getTime() : 0;
bValue = b[this.apiKeysSortBy] ? new Date(b[this.apiKeysSortBy]).getTime() : 0;
break;
default:
aValue = a[this.apiKeysSortBy];
bValue = b[this.apiKeysSortBy];
// 处理字符串比较
if (typeof aValue === 'string' && typeof bValue === 'string') {
aValue = aValue.toLowerCase();
bValue = bValue.toLowerCase();
}
}
// 排序
if (this.apiKeysSortOrder === 'asc') {
return aValue > bValue ? 1 : aValue < bValue ? -1 : 0;
} else {
return aValue < bValue ? 1 : aValue > bValue ? -1 : 0;
}
});
},
// 获取专属账号列表
dedicatedAccounts() {
return this.accounts.filter(account =>
@@ -400,6 +480,30 @@ const app = createApp({
},
methods: {
// 账户列表排序
sortAccounts(field) {
if (this.accountsSortBy === field) {
// 如果点击的是当前排序字段,切换排序顺序
this.accountsSortOrder = this.accountsSortOrder === 'asc' ? 'desc' : 'asc';
} else {
// 如果点击的是新字段,设置为升序
this.accountsSortBy = field;
this.accountsSortOrder = 'asc';
}
},
// API Keys列表排序
sortApiKeys(field) {
if (this.apiKeysSortBy === field) {
// 如果点击的是当前排序字段,切换排序顺序
this.apiKeysSortOrder = this.apiKeysSortOrder === 'asc' ? 'desc' : 'asc';
} else {
// 如果点击的是新字段,设置为升序
this.apiKeysSortBy = field;
this.apiKeysSortOrder = 'asc';
}
},
// 从URL读取tab参数并设置activeTab
initializeTabFromUrl() {
const urlParams = new URLSearchParams(window.location.search);
@@ -3183,6 +3287,19 @@ const app = createApp({
// 如果没有后端费用数据,返回默认值
return '$0.000000';
},
// 计算API Key费用数值用于排序
calculateApiKeyCostNumber(usage) {
if (!usage || !usage.total) return 0;
// 使用后端返回的准确费用数据
if (usage.total.cost) {
return usage.total.cost;
}
// 如果没有后端费用数据返回0
return 0;
},
// 初始化日期筛选器
initializeDateFilter() {