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({
326326const batchAccounts = ref (' ' )
327327
328328// 分页相关
329- const allTokens = ref ([])
329+ const displayedTokens = ref ([])
330330const currentPage = ref (1 )
331331const pageSize = ref (10 )
332- const totalItems = computed (() => allTokens . value . length )
332+ const totalItems = ref ( 0 )
333333const totalPages = computed (() => Math .max (1 , Math .ceil (totalItems .value / pageSize .value )))
334+ const isLoading = ref (false )
334335
335336// 多选相关
336337const selectedTokens = ref ([])
@@ -403,17 +404,25 @@ const deleteSelected = async () => {
403404
404405const 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
450454const showToast = (message , type = ' success' ) => {
@@ -468,23 +472,26 @@ const copyToClipboard = async (text) => {
468472}
469473
470474const 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
660681onMounted (() => {
0 commit comments