File size: 5,171 Bytes
69b897d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
/**
 * 测试账号显示问题是否已修复
 */

const axios = require('axios')
const config = require('../config/config')

// 从 init.json 读取管理员凭据
const fs = require('fs')
const path = require('path')

async function testAccountDisplay() {
  console.log('🔍 测试账号显示问题...\n')

  try {
    // 读取管理员凭据
    const initPath = path.join(__dirname, '..', 'config', 'init.json')
    if (!fs.existsSync(initPath)) {
      console.error('❌ 找不到 init.json 文件,请运行 npm run setup')
      process.exit(1)
    }

    const initData = JSON.parse(fs.readFileSync(initPath, 'utf8'))
    const adminUser = initData.admins?.[0]
    if (!adminUser) {
      console.error('❌ 没有找到管理员账号')
      process.exit(1)
    }

    const baseURL = `http://localhost:${config.server.port}`

    // 登录获取 token
    console.log('🔐 登录管理员账号...')
    const loginResp = await axios.post(`${baseURL}/admin/login`, {
      username: adminUser.username,
      password: adminUser.password
    })

    if (!loginResp.data.success) {
      console.error('❌ 登录失败')
      process.exit(1)
    }

    const { token } = loginResp.data
    console.log('✅ 登录成功\n')

    // 设置请求头
    const headers = {
      Authorization: `Bearer ${token}`,
      'Content-Type': 'application/json'
    }

    // 获取 Claude OAuth 账号
    console.log('📋 获取 Claude OAuth 账号...')
    const claudeResp = await axios.get(`${baseURL}/admin/claude-accounts`, { headers })
    const claudeAccounts = claudeResp.data.data || []

    console.log(`找到 ${claudeAccounts.length} 个 Claude OAuth 账号`)

    // 分类显示
    const claudeDedicated = claudeAccounts.filter((a) => a.accountType === 'dedicated')
    const claudeGroup = claudeAccounts.filter((a) => a.accountType === 'group')
    const claudeShared = claudeAccounts.filter((a) => a.accountType === 'shared')

    console.log(`- 专属账号: ${claudeDedicated.length} 个`)
    console.log(`- 分组账号: ${claudeGroup.length} 个`)
    console.log(`- 共享账号: ${claudeShared.length} 个`)

    // 检查 platform 字段
    console.log('\n检查 platform 字段:')
    claudeAccounts.slice(0, 3).forEach((acc) => {
      console.log(`- ${acc.name}: platform=${acc.platform}, accountType=${acc.accountType}`)
    })

    // 获取 Claude Console 账号
    console.log('\n📋 获取 Claude Console 账号...')
    const consoleResp = await axios.get(`${baseURL}/admin/claude-console-accounts`, { headers })
    const consoleAccounts = consoleResp.data.data || []

    console.log(`找到 ${consoleAccounts.length} 个 Claude Console 账号`)

    // 分类显示
    const consoleDedicated = consoleAccounts.filter((a) => a.accountType === 'dedicated')
    const consoleGroup = consoleAccounts.filter((a) => a.accountType === 'group')
    const consoleShared = consoleAccounts.filter((a) => a.accountType === 'shared')

    console.log(`- 专属账号: ${consoleDedicated.length} 个`)
    console.log(`- 分组账号: ${consoleGroup.length} 个`)
    console.log(`- 共享账号: ${consoleShared.length} 个`)

    // 检查 platform 字段
    console.log('\n检查 platform 字段:')
    consoleAccounts.slice(0, 3).forEach((acc) => {
      console.log(`- ${acc.name}: platform=${acc.platform}, accountType=${acc.accountType}`)
    })

    // 获取账号分组
    console.log('\n📋 获取账号分组...')
    const groupsResp = await axios.get(`${baseURL}/admin/account-groups`, { headers })
    const groups = groupsResp.data.data || []

    console.log(`找到 ${groups.length} 个账号分组`)

    const claudeGroups = groups.filter((g) => g.platform === 'claude')
    const geminiGroups = groups.filter((g) => g.platform === 'gemini')

    console.log(`- Claude 分组: ${claudeGroups.length} 个`)
    console.log(`- Gemini 分组: ${geminiGroups.length} 个`)

    // 测试结果总结
    console.log('\n📊 测试结果总结:')
    console.log('✅ Claude OAuth 账号已包含 platform 字段')
    console.log('✅ Claude Console 账号已包含 platform 字段')
    console.log('✅ 账号分组功能正常')

    const totalDedicated = claudeDedicated.length + consoleDedicated.length
    const totalGroups = claudeGroups.length

    if (totalDedicated > 0) {
      console.log(`\n✅ 共有 ${totalDedicated} 个专属账号应该显示在下拉框中`)
    } else {
      console.log('\n⚠️  没有找到专属账号,请在账号管理页面设置账号类型为"专属账户"')
    }

    if (totalGroups > 0) {
      console.log(`✅ 共有 ${totalGroups} 个分组应该显示在下拉框中`)
    }

    console.log('\n💡 请在浏览器中测试创建/编辑 API Key,检查下拉框是否正确显示三个类别:')
    console.log('   1. 调度分组')
    console.log('   2. Claude OAuth 账号')
    console.log('   3. Claude Console 账号')
  } catch (error) {
    console.error('❌ 测试失败:', error.message)
    if (error.response) {
      console.error('响应数据:', error.response.data)
    }
  } finally {
    process.exit(0)
  }
}

testAccountDisplay()