feat: 实现账户分组管理功能和优化响应式设计

主要更新:
- 实现账户分组管理功能,支持创建、编辑、删除分组
- 支持将账户添加到分组进行统一调度
- 优化 API Keys 页面响应式设计,解决操作栏被隐藏的问题
- 优化账户管理页面布局,合并平台/类型列,改进操作按钮布局
- 修复代理信息显示溢出问题
- 改进表格列宽分配,充分利用屏幕空间

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
shaw
2025-08-03 21:37:28 +08:00
parent 329904ba72
commit 9c9afe1528
20 changed files with 3588 additions and 717 deletions

View File

@@ -433,6 +433,18 @@
<option value="">
使用共享账号池
</option>
<optgroup
v-if="localAccounts.claudeGroups && localAccounts.claudeGroups.length > 0"
label="调度分组"
>
<option
v-for="group in localAccounts.claudeGroups"
:key="`group:${group.id}`"
:value="`group:${group.id}`"
>
{{ group.name }} ({{ group.memberCount || 0 }} 个成员)
</option>
</optgroup>
<optgroup
v-if="localAccounts.claude.filter(a => a.isDedicated && a.platform === 'claude-oauth').length > 0"
label="Claude OAuth 账号"
@@ -469,13 +481,30 @@
<option value="">
使用共享账号池
</option>
<option
v-for="account in localAccounts.gemini.filter(a => a.isDedicated)"
:key="account.id"
:value="account.id"
<optgroup
v-if="localAccounts.geminiGroups && localAccounts.geminiGroups.length > 0"
label="调度分组"
>
{{ account.name }} ({{ account.status === 'active' ? '正常' : '异常' }})
</option>
<option
v-for="group in localAccounts.geminiGroups"
:key="`group:${group.id}`"
:value="`group:${group.id}`"
>
{{ group.name }} ({{ group.memberCount || 0 }} 个成员)
</option>
</optgroup>
<optgroup
v-if="localAccounts.gemini.filter(a => a.isDedicated).length > 0"
label="Gemini 账号"
>
<option
v-for="account in localAccounts.gemini.filter(a => a.isDedicated)"
:key="account.id"
:value="account.id"
>
{{ account.name }} ({{ account.status === 'active' ? '正常' : '异常' }})
</option>
</optgroup>
</select>
</div>
</div>
@@ -650,7 +679,7 @@ const clientsStore = useClientsStore()
const apiKeysStore = useApiKeysStore()
const loading = ref(false)
const accountsLoading = ref(false)
const localAccounts = ref({ claude: [], gemini: [] })
const localAccounts = ref({ claude: [], gemini: [], claudeGroups: [], geminiGroups: [] })
// 表单验证状态
const errors = ref({
@@ -702,7 +731,9 @@ onMounted(async () => {
if (props.accounts) {
localAccounts.value = {
claude: props.accounts.claude || [],
gemini: props.accounts.gemini || []
gemini: props.accounts.gemini || [],
claudeGroups: props.accounts.claudeGroups || [],
geminiGroups: props.accounts.geminiGroups || []
}
}
})
@@ -711,10 +742,11 @@ onMounted(async () => {
const refreshAccounts = async () => {
accountsLoading.value = true
try {
const [claudeData, claudeConsoleData, geminiData] = await Promise.all([
const [claudeData, claudeConsoleData, geminiData, groupsData] = await Promise.all([
apiClient.get('/admin/claude-accounts'),
apiClient.get('/admin/claude-console-accounts'),
apiClient.get('/admin/gemini-accounts')
apiClient.get('/admin/gemini-accounts'),
apiClient.get('/admin/account-groups')
])
// 合并Claude OAuth账户和Claude Console账户
@@ -749,6 +781,13 @@ const refreshAccounts = async () => {
}))
}
// 处理分组数据
if (groupsData.success) {
const allGroups = groupsData.data || []
localAccounts.value.claudeGroups = allGroups.filter(g => g.platform === 'claude')
localAccounts.value.geminiGroups = allGroups.filter(g => g.platform === 'gemini')
}
showToast('账号列表已刷新', 'success')
} catch (error) {
showToast('刷新账号列表失败', 'error')