@@ -16,12 +16,19 @@ import {
1616 useDialog ,
1717 useMessage ,
1818} from 'naive-ui'
19- import { defineComponent , onBeforeMount , ref , toRaw , watch } from 'vue'
19+ import {
20+ defineComponent ,
21+ Fragment ,
22+ onBeforeMount ,
23+ ref ,
24+ toRaw ,
25+ watch ,
26+ } from 'vue'
2027import { useRoute , useRouter } from 'vue-router'
2128import type { LinkModel , LinkResponse , LinkStateCount } from '~/models/link'
2229
2330import { HeaderActionButton } from '~/components/button/rounded-button'
24- import { CheckIcon , PlusIcon as Plus } from '~/components/icons'
31+ import { CheckIcon , PlusIcon as Plus , RefreshCircle } from '~/components/icons'
2532import { Table } from '~/components/table'
2633import { RelativeTime } from '~/components/time/relative-time'
2734import { useDataTableFetch } from '~/hooks/use-table'
@@ -168,6 +175,25 @@ export default defineComponent({
168175 }
169176 }
170177
178+ const handleMigrateAvatars = async ( ) => {
179+ const l = message . loading ( '迁移中' , { duration : 20e4 } )
180+
181+ try {
182+ await RESTManager . api . links . avatar . migrate . post ( {
183+ timeout : 20e4 ,
184+ } )
185+ message . success ( '迁移完成' )
186+ await fetchDataFn ( )
187+ } catch ( error ) {
188+ console . error ( error )
189+ message . error ( '迁移失败' )
190+ } finally {
191+ requestAnimationFrame ( ( ) => {
192+ l . destroy ( )
193+ } )
194+ }
195+ }
196+
171197 const modal = useDialog ( )
172198
173199 return ( ) => (
@@ -181,14 +207,21 @@ export default defineComponent({
181207 editDialogData . value = resetEditData ( )
182208 editDialogShow . value = true
183209 } }
184- > </ HeaderActionButton >
210+ / >
185211
186212 < HeaderActionButton
187213 icon = { < CheckIcon /> }
188214 variant = "info"
189215 onClick = { handleCheck }
190216 name = "检查友链可用性"
191- > </ HeaderActionButton >
217+ />
218+
219+ < HeaderActionButton
220+ icon = { < RefreshCircle /> }
221+ variant = "info"
222+ onClick = { handleMigrateAvatars }
223+ name = "迁移头像"
224+ />
192225 </ Fragment >
193226 }
194227 >
@@ -202,15 +235,15 @@ export default defineComponent({
202235 router . replace ( { name : RouteName . Friend , query : { state : e } } )
203236 } }
204237 >
205- < NTabPane name = { LinkState . Pass } tab = "朋友们" > </ NTabPane >
238+ < NTabPane name = { LinkState . Pass } tab = "朋友们" / >
206239 < NTabPane
207240 name = { LinkState . Audit }
208241 tab = { ( ) => (
209242 < NBadge value = { stateCount . value . audit } processing >
210243 < NText > 待审核</ NText >
211244 </ NBadge >
212245 ) }
213- > </ NTabPane >
246+ / >
214247
215248 < NTabPane
216249 name = { LinkState . Outdate }
@@ -219,23 +252,23 @@ export default defineComponent({
219252 < NText > 过时的</ NText >
220253 </ NBadge >
221254 ) }
222- > </ NTabPane >
255+ / >
223256 < NTabPane
224257 name = { LinkState . Reject }
225258 tab = { ( ) => (
226259 < NBadge value = { stateCount . value . reject } type = "warning" >
227260 < NText > 已拒绝</ NText >
228261 </ NBadge >
229262 ) }
230- > </ NTabPane >
263+ / >
231264 < NTabPane
232265 name = { LinkState . Banned }
233266 tab = { ( ) => (
234267 < NBadge value = { stateCount . value . banned } type = "error" >
235268 < NText > 封禁的</ NText >
236269 </ NBadge >
237270 ) }
238- > </ NTabPane >
271+ / >
239272 </ NTabs >
240273
241274 < Table
@@ -419,7 +452,7 @@ export default defineComponent({
419452 ] }
420453 onFetchData = { fetchDataFn }
421454 pager = { pager }
422- > </ Table >
455+ / >
423456
424457 { /* Modal */ }
425458
@@ -443,31 +476,31 @@ export default defineComponent({
443476 autofocus
444477 value = { editDialogData . value . name }
445478 onInput = { ( e ) => void ( editDialogData . value . name = e ) }
446- > </ NInput >
479+ / >
447480 </ NFormItem >
448481
449482 < NFormItem label = "头像" >
450483 < NInput
451484 autofocus
452485 value = { editDialogData . value . avatar }
453486 onInput = { ( e ) => void ( editDialogData . value . avatar = e ) }
454- > </ NInput >
487+ / >
455488 </ NFormItem >
456489
457490 < NFormItem label = "网址" required >
458491 < NInput
459492 autofocus
460493 value = { editDialogData . value . url }
461494 onInput = { ( e ) => void ( editDialogData . value . url = e ) }
462- > </ NInput >
495+ / >
463496 </ NFormItem >
464497
465498 < NFormItem label = "描述" >
466499 < NInput
467500 autofocus
468501 value = { editDialogData . value . description }
469502 onInput = { ( e ) => void ( editDialogData . value . description = e ) }
470- > </ NInput >
503+ / >
471504 </ NFormItem >
472505
473506 < NFormItem label = "类型" >
@@ -481,7 +514,7 @@ export default defineComponent({
481514 onUpdateValue = { ( e ) =>
482515 void ( editDialogData . value . type = e | 0 )
483516 }
484- > </ NSelect >
517+ / >
485518 </ NFormItem >
486519 { editDialogData . value . id && (
487520 < NFormItem label = "状态" >
@@ -495,7 +528,7 @@ export default defineComponent({
495528 onUpdateValue = { ( e ) =>
496529 void ( editDialogData . value . state = e | 0 )
497530 }
498- > </ NSelect >
531+ / >
499532 </ NFormItem >
500533 ) }
501534 </ NForm >
0 commit comments