Skip to content

Commit b45a3f4

Browse files
committed
refactor: dashboard 分页改为服务端分页
- 将前端假分页改为服务端真分页,提升大数据量性能 - 切换页码和每页数量时实时请求数据 - 删除全部和导出功能改为先获取全量数据 - 添加 isLoading 状态用于加载指示
1 parent 55afc15 commit b45a3f4

2 files changed

Lines changed: 68 additions & 47 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "qwen2api",
3-
"version": "2025.12.14.20.00",
3+
"version": "2026.01.16.00.00",
44
"main": "src/server.js",
55
"scripts": {
66
"start": "node src/start.js",

public/src/views/dashboard.vue

Lines changed: 67 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
<option :value="20">20</option>
6363
<option :value="50">50</option>
6464
<option :value="100">100</option>
65-
<option :value="1000">全部</option>
65+
<option :value="200">200</option>
6666
</select>
6767
</div>
6868
<div class="flex space-x-2 items-center">
@@ -326,11 +326,12 @@ const newAccount = ref({
326326
const batchAccounts = ref('')
327327
328328
// 分页相关
329-
const allTokens = ref([])
329+
const displayedTokens = ref([])
330330
const currentPage = ref(1)
331331
const pageSize = ref(10)
332-
const totalItems = computed(() => allTokens.value.length)
332+
const totalItems = ref(0)
333333
const totalPages = computed(() => Math.max(1, Math.ceil(totalItems.value / pageSize.value)))
334+
const isLoading = ref(false)
334335
335336
// 多选相关
336337
const selectedTokens = ref([])
@@ -403,17 +404,25 @@ const deleteSelected = async () => {
403404
404405
const deleteAllAccounts = async () => {
405406
try {
406-
const deletePromises = allTokens.value.map(token =>
407+
// 先获取全部账号数据
408+
const res = await axios.get('/api/getAllAccounts', {
409+
params: { page: 1, pageSize: 10000 },
410+
headers: { 'Authorization': localStorage.getItem('apiKey') || '' }
411+
})
412+
const allAccounts = res.data.data
413+
414+
const deletePromises = allAccounts.map(token =>
407415
axios.delete('/api/deleteAccount', {
408416
data: { email: token.email },
409417
headers: {
410418
'Authorization': localStorage.getItem('apiKey') || ''
411419
}
412420
})
413421
)
414-
422+
415423
await Promise.all(deletePromises)
416424
showDeleteAllConfirm.value = false
425+
currentPage.value = 1
417426
await getTokens()
418427
selectedTokens.value = []
419428
selectAll.value = false
@@ -424,27 +433,22 @@ const deleteAllAccounts = async () => {
424433
}
425434
}
426435
427-
// 当前页显示的tokens
428-
const displayedTokens = computed(() => {
429-
const start = (currentPage.value - 1) * pageSize.value
430-
const end = start + pageSize.value
431-
return allTokens.value.slice(start, end)
432-
})
433-
434-
const changePage = (page) => {
436+
const changePage = async (page) => {
435437
if (page >= 1 && page <= totalPages.value) {
436438
currentPage.value = page
437439
// 重置选择状态
438440
selectedTokens.value = []
439441
selectAll.value = false
442+
await getTokens()
440443
}
441444
}
442445
443-
const changePageSize = () => {
446+
const changePageSize = async () => {
444447
currentPage.value = 1
445448
// 重置选择状态
446449
selectedTokens.value = []
447450
selectAll.value = false
451+
await getTokens()
448452
}
449453
450454
const showToast = (message, type = 'success') => {
@@ -468,23 +472,26 @@ const copyToClipboard = async (text) => {
468472
}
469473
470474
const getTokens = async () => {
475+
isLoading.value = true
471476
try {
472-
// 始终获取完整的账号列表以确保数据同步
473-
const fullRes = await axios.get('/api/getAllAccounts', {
477+
const res = await axios.get('/api/getAllAccounts', {
474478
params: {
475-
page: 1,
476-
pageSize: 1000
479+
page: currentPage.value,
480+
pageSize: pageSize.value
477481
},
478482
headers: {
479483
'Authorization': localStorage.getItem('apiKey') || ''
480484
}
481485
})
482486
483-
allTokens.value = fullRes.data.data
487+
displayedTokens.value = res.data.data
488+
totalItems.value = res.data.total
484489
485-
// 如果当前页超出了总页数,重置到第一页
490+
// 如果当前页超出了总页数,重置到第一页并重新获取
486491
if (currentPage.value > totalPages.value && totalPages.value > 0) {
487492
currentPage.value = 1
493+
await getTokens()
494+
return
488495
}
489496
490497
// 重置选择状态
@@ -494,6 +501,8 @@ const getTokens = async () => {
494501
} catch (error) {
495502
console.error('获取Token列表失败:', error)
496503
showToast('获取Token列表失败: ' + error.message, 'error')
504+
} finally {
505+
isLoading.value = false
497506
}
498507
}
499508
@@ -628,33 +637,45 @@ const deleteToken = async (email) => {
628637
}
629638
}
630639
631-
const exportAccounts = () => {
632-
if (allTokens.value.length === 0) {
633-
showToast('没有可导出的账号', 'error')
634-
return
640+
const exportAccounts = async () => {
641+
try {
642+
// 获取全部账号用于导出
643+
const res = await axios.get('/api/getAllAccounts', {
644+
params: { page: 1, pageSize: 10000 },
645+
headers: { 'Authorization': localStorage.getItem('apiKey') || '' }
646+
})
647+
const allAccounts = res.data.data
648+
649+
if (allAccounts.length === 0) {
650+
showToast('没有可导出的账号', 'error')
651+
return
652+
}
653+
654+
// 构建导出内容,格式为"账号:密码",每行一个
655+
const content = allAccounts.map(token => `${token.email}:${token.password}`).join('\n')
656+
657+
// 创建Blob对象
658+
const blob = new Blob([content], { type: 'text/plain;charset=utf-8' })
659+
660+
// 创建下载链接并触发下载
661+
const url = URL.createObjectURL(blob)
662+
const link = document.createElement('a')
663+
link.href = url
664+
link.download = 'qwen_accounts.txt'
665+
document.body.appendChild(link)
666+
link.click()
667+
668+
// 清理
669+
setTimeout(() => {
670+
document.body.removeChild(link)
671+
URL.revokeObjectURL(url)
672+
}, 100)
673+
674+
showToast('导出完成')
675+
} catch (error) {
676+
console.error('导出失败:', error)
677+
showToast('导出失败: ' + error.message, 'error')
635678
}
636-
637-
// 构建导出内容,格式为"账号:密码",每行一个
638-
const content = allTokens.value.map(token => `${token.email}:${token.password}`).join('\n')
639-
640-
// 创建Blob对象
641-
const blob = new Blob([content], { type: 'text/plain;charset=utf-8' })
642-
643-
// 创建下载链接并触发下载
644-
const url = URL.createObjectURL(blob)
645-
const link = document.createElement('a')
646-
link.href = url
647-
link.download = 'qwen_accounts.txt'
648-
document.body.appendChild(link)
649-
link.click()
650-
651-
// 清理
652-
setTimeout(() => {
653-
document.body.removeChild(link)
654-
URL.revokeObjectURL(url)
655-
}, 100)
656-
657-
showToast('导出完成')
658679
}
659680
660681
onMounted(() => {

0 commit comments

Comments
 (0)