-
setExecutionStatus(value as TaskExecutionStatus | "all")}>
+ handleStatusChange(value as TaskExecutionStatus | "all")}>
@@ -164,7 +145,7 @@ export function TaskExecutionsManager() {
失败
-
+
@@ -175,7 +156,7 @@ export function TaskExecutionsManager() {
))}
- fetchTaskExecutions()} disabled={executionsLoading}>
+ void executionsQuery.refetch()} disabled={executionsLoading}>
{executionsLoading ? : }
刷新
@@ -184,7 +165,7 @@ export function TaskExecutionsManager() {
{executionsError ? (
-
+ void executionsQuery.refetch()} className="justify-center" />
) : executionsLoading && executions.length === 0 ? (
@@ -375,13 +356,13 @@ export function TaskExecutionsManager() {
- selectedExecution && openExecutionDetail(selectedExecution)} disabled={!selectedExecution || detailLoading}>
+ void detailQuery.refetch()} disabled={!selectedExecutionId || detailLoading}>
{detailLoading ? : }
刷新详情
{selectedExecution && selectedExecution.status === "failed" && selectedExecution.retryable && (
-
- {retrying ? : }
+ retryMutation.mutate(selectedExecution.id)} disabled={retryMutation.isPending}>
+ {retryMutation.isPending ? : }
重试任务
)}
@@ -390,4 +371,4 @@ export function TaskExecutionsManager() {
)
-}
+}
\ No newline at end of file
diff --git a/frontend/components/common/admin/task-manager.tsx b/frontend/components/common/admin/task-manager.tsx
index 66b0a071..b7053979 100644
--- a/frontend/components/common/admin/task-manager.tsx
+++ b/frontend/components/common/admin/task-manager.tsx
@@ -11,7 +11,7 @@ import {Spinner} from "@/components/ui/spinner"
import {Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle} from "@/components/ui/dialog"
import {Calendar as CalendarIcon, Clock, Info, Layers, Play} from "lucide-react"
-import {AdminService, DispatchTaskRequest, TaskMeta} from "@/lib/services"
+import {AdminService, DispatchTaskRequest, TaskMeta} from "@/lib/services/admin"
import {buildTaskPayload} from "@/lib/task-param-utils"
import {ErrorInline} from "@/components/layout/error"
import {LoadingStateWithBorder} from "@/components/layout/loading"
diff --git a/frontend/components/common/admin/task-schedules.tsx b/frontend/components/common/admin/task-schedules.tsx
index 454a0ffd..e21bf227 100644
--- a/frontend/components/common/admin/task-schedules.tsx
+++ b/frontend/components/common/admin/task-schedules.tsx
@@ -12,7 +12,7 @@ import {Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, Di
import {Table, TableBody, TableCell, TableHead, TableHeader, TableRow} from "@/components/ui/table"
import {Clock, Edit2, Info, Plus, RefreshCw, Trash2} from "lucide-react"
-import {AdminService, CreateScheduleRequest, Schedule, TaskMeta, UpdateScheduleRequest} from "@/lib/services"
+import {AdminService, CreateScheduleRequest, Schedule, TaskMeta, UpdateScheduleRequest} from "@/lib/services/admin"
import {buildTaskPayload} from "@/lib/task-param-utils"
import {ErrorInline} from "@/components/layout/error"
import {LoadingStateWithBorder} from "@/components/layout/loading"
diff --git a/frontend/components/common/admin/user-detail-sheet.tsx b/frontend/components/common/admin/user-detail-sheet.tsx
index 80024bc2..662b5b72 100644
--- a/frontend/components/common/admin/user-detail-sheet.tsx
+++ b/frontend/components/common/admin/user-detail-sheet.tsx
@@ -7,7 +7,7 @@ import {Button} from "@/components/ui/button"
import {Badge} from "@/components/ui/badge"
import {Avatar, AvatarFallback, AvatarImage} from "@/components/ui/avatar"
import {Sheet, SheetContent, SheetTitle} from "@/components/ui/sheet"
-import type {AdminUser} from "@/lib/services"
+import type {AdminUser} from "@/lib/services/admin"
import {cn, formatDateTime} from "@/lib/utils"
interface UserDetailSheetProps {
diff --git a/frontend/components/common/settings/access-token.tsx b/frontend/components/common/settings/access-token.tsx
index 24a12015..a55cb732 100644
--- a/frontend/components/common/settings/access-token.tsx
+++ b/frontend/components/common/settings/access-token.tsx
@@ -28,7 +28,7 @@ import {
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb"
-import {UserService} from "@/lib/services"
+import {UserService} from "@/lib/services/user"
import type {CreateTokenResponse} from "@/lib/services/user"
import {useAuth} from "@/components/providers/auth-provider"
import {toast} from "sonner"
diff --git a/frontend/components/common/settings/auth-source-modal.tsx b/frontend/components/common/settings/auth-source-modal.tsx
index ec418508..ac0ec6c6 100644
--- a/frontend/components/common/settings/auth-source-modal.tsx
+++ b/frontend/components/common/settings/auth-source-modal.tsx
@@ -7,7 +7,7 @@ import {Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle} fro
import {Input} from "@/components/ui/input"
import {Label} from "@/components/ui/label"
import {Switch} from "@/components/ui/switch"
-import {AdminService} from "@/lib/services"
+import {AdminService} from "@/lib/services/admin"
import type {AuthSource, AuthSourceRequest} from "@/lib/services/admin"
const emptyForm: AuthSourceRequest = {
diff --git a/frontend/components/common/settings/info-tab.tsx b/frontend/components/common/settings/info-tab.tsx
index 54fa2d73..c47760ff 100644
--- a/frontend/components/common/settings/info-tab.tsx
+++ b/frontend/components/common/settings/info-tab.tsx
@@ -4,7 +4,7 @@ import {useMutation, useQuery} from "@tanstack/react-query"
import {ExternalLink, RefreshCw, Sparkles} from "lucide-react"
import {toast} from "sonner"
-import {AdminService} from "@/lib/services"
+import {AdminService} from "@/lib/services/admin"
import {
AlertDialog,
AlertDialogAction,
diff --git a/frontend/components/common/settings/operation-tab.tsx b/frontend/components/common/settings/operation-tab.tsx
index 8fbf03c2..536af9f0 100644
--- a/frontend/components/common/settings/operation-tab.tsx
+++ b/frontend/components/common/settings/operation-tab.tsx
@@ -6,7 +6,7 @@ import {KeyRound, ShieldAlert, X} from "lucide-react"
import {Card, CardContent, CardDescription, CardHeader, CardTitle} from "@/components/ui/card"
import {Badge} from "@/components/ui/badge"
import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from "@/components/ui/select"
-import {AdminService} from "@/lib/services"
+import {AdminService} from "@/lib/services/admin"
import type {SystemConfig} from "@/lib/services/admin"
import {TemplatesManager} from "./templates"
import {toast} from "sonner"
diff --git a/frontend/components/common/settings/other-tab.tsx b/frontend/components/common/settings/other-tab.tsx
index 8312986e..700c2907 100644
--- a/frontend/components/common/settings/other-tab.tsx
+++ b/frontend/components/common/settings/other-tab.tsx
@@ -21,7 +21,7 @@ import {
import {Card, CardContent, CardDescription, CardHeader, CardTitle} from "@/components/ui/card"
import {Switch} from "@/components/ui/switch"
-import {AdminService} from "@/lib/services"
+import {AdminService} from "@/lib/services/admin"
import type {SystemConfig} from "@/lib/services/admin"
import {toast} from "sonner"
diff --git a/frontend/components/common/settings/profile.tsx b/frontend/components/common/settings/profile.tsx
index ba417382..dc857c75 100644
--- a/frontend/components/common/settings/profile.tsx
+++ b/frontend/components/common/settings/profile.tsx
@@ -45,7 +45,8 @@ import {
} from "@/components/ui/dialog"
import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue,} from "@/components/ui/select"
import {Label} from "@/components/ui/label"
-import {AuthService, ChangePasswordRequest, UpdateProfileRequest} from "@/lib/services"
+import {AuthService} from "@/lib/services/auth"
+import type {ChangePasswordRequest, UpdateProfileRequest} from "@/lib/services/auth"
import {UploadService} from "@/lib/services/upload/upload.service"
import {ImageCrop, ImageCropApply, ImageCropContent, ImageCropReset} from "@/components/ui/image-crop"
import {toast} from "sonner"
diff --git a/frontend/components/common/settings/security-tab.tsx b/frontend/components/common/settings/security-tab.tsx
index 1ed5debd..d38d4f88 100644
--- a/frontend/components/common/settings/security-tab.tsx
+++ b/frontend/components/common/settings/security-tab.tsx
@@ -24,7 +24,7 @@ import {Input} from "@/components/ui/input"
import {Label} from "@/components/ui/label"
import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from "@/components/ui/select"
import {AuthSourceModal} from "@/components/common/settings/auth-source-modal"
-import {AdminService} from "@/lib/services"
+import {AdminService} from "@/lib/services/admin"
import type {AuthSource, SystemConfig} from "@/lib/services/admin"
import {toast} from "sonner"
diff --git a/frontend/components/common/settings/system-tab.tsx b/frontend/components/common/settings/system-tab.tsx
index 7e279fb7..391d9714 100644
--- a/frontend/components/common/settings/system-tab.tsx
+++ b/frontend/components/common/settings/system-tab.tsx
@@ -11,7 +11,7 @@ import {Label} from "@/components/ui/label"
import {Switch} from "@/components/ui/switch"
import {Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle} from "@/components/ui/dialog"
import {Badge} from "@/components/ui/badge"
-import {AdminService} from "@/lib/services"
+import {AdminService} from "@/lib/services/admin"
import type {SystemConfig} from "@/lib/services/admin"
import {toast} from "sonner"
diff --git a/frontend/components/common/settings/templates.tsx b/frontend/components/common/settings/templates.tsx
index edfe3d16..5d2ef7eb 100644
--- a/frontend/components/common/settings/templates.tsx
+++ b/frontend/components/common/settings/templates.tsx
@@ -10,7 +10,7 @@ import {Input} from "@/components/ui/input"
import {Label} from "@/components/ui/label"
import {Textarea} from "@/components/ui/textarea"
import {Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle} from "@/components/ui/dialog"
-import {AdminService} from "@/lib/services"
+import {AdminService} from "@/lib/services/admin"
import type {Template} from "@/lib/services/admin/types"
import {toast} from "sonner"
diff --git a/frontend/components/common/user/file-manager.tsx b/frontend/components/common/user/file-manager.tsx
index 14708f76..c71d93a7 100644
--- a/frontend/components/common/user/file-manager.tsx
+++ b/frontend/components/common/user/file-manager.tsx
@@ -242,6 +242,8 @@ export function UserFileManager() {
{
;(e.currentTarget as HTMLImageElement).style.display = "none"
diff --git a/frontend/components/providers/title-updater.tsx b/frontend/components/providers/title-updater.tsx
index 54281001..3ac8576e 100644
--- a/frontend/components/providers/title-updater.tsx
+++ b/frontend/components/providers/title-updater.tsx
@@ -2,14 +2,14 @@
import {useQuery} from '@tanstack/react-query'
import {useEffect} from 'react'
-import services from '@/lib/services'
+import {ConfigService} from '@/lib/services/config'
import {usePathname} from 'next/navigation'
export function SiteTitleUpdater() {
const pathname = usePathname()
const publicConfigQuery = useQuery({
queryKey: ["public-config"],
- queryFn: () => services.config.getPublicConfig(),
+ queryFn: () => ConfigService.getPublicConfig(),
})
useEffect(() => {
diff --git a/frontend/contexts/admin-context.tsx b/frontend/contexts/admin-context.tsx
index 5aadca9a..e54fc079 100644
--- a/frontend/contexts/admin-context.tsx
+++ b/frontend/contexts/admin-context.tsx
@@ -4,8 +4,8 @@ import * as React from "react"
import {createContext, useCallback, useContext, useRef, useState} from "react"
import {useQueryClient} from "@tanstack/react-query"
-import type {SystemConfig, UpdateSystemConfigRequest} from "@/lib/services"
-import services from "@/lib/services"
+import type {SystemConfig, UpdateSystemConfigRequest} from "@/lib/services/admin"
+import {AdminService} from "@/lib/services/admin"
import {handleContextError} from "@/lib/utils/error-handling"
@@ -49,7 +49,7 @@ export function AdminProvider({ children }: { children: React.ReactNode }) {
try {
setSystemConfigsLoading(true)
setSystemConfigsError(null)
- const data = await services.admin.listSystemConfigs(type)
+ const data = await AdminService.listSystemConfigs(type)
if (requestId !== systemRequestIdRef.current) {
return
@@ -71,7 +71,7 @@ export function AdminProvider({ children }: { children: React.ReactNode }) {
/** 更新系统配置 */
const updateSystemConfig = useCallback(async (key: string, data: UpdateSystemConfigRequest) => {
try {
- await services.admin.updateSystemConfig(key, data)
+ await AdminService.updateSystemConfig(key, data)
await queryClient.invalidateQueries({ queryKey: ['public-config'] })
await refetchSystemConfigs(lastConfigTypeRef.current)
} catch (error) {
diff --git a/frontend/contexts/admin-users-context.tsx b/frontend/contexts/admin-users-context.tsx
index 1706bd94..c9e38954 100644
--- a/frontend/contexts/admin-users-context.tsx
+++ b/frontend/contexts/admin-users-context.tsx
@@ -3,7 +3,7 @@
import * as React from "react"
import {createContext, useCallback, useContext, useEffect, useRef, useState} from "react"
import {toast} from "sonner"
-import {AdminService, AdminUser, CreateUserRequest, ListUsersRequest} from "@/lib/services"
+import {AdminService, AdminUser, CreateUserRequest, ListUsersRequest} from "@/lib/services/admin"
/** 用户列表查询参数 */
export interface UserQueryParams {
diff --git a/frontend/contexts/user-context.tsx b/frontend/contexts/user-context.tsx
index ee55eaaa..d7640dd0 100644
--- a/frontend/contexts/user-context.tsx
+++ b/frontend/contexts/user-context.tsx
@@ -2,7 +2,7 @@
import {createContext, ReactNode, useCallback, useContext, useEffect, useRef, useState} from 'react'
-import services from '@/lib/services'
+import {AuthService} from '@/lib/services/auth'
import {User} from '@/lib/services/auth/types'
@@ -54,7 +54,7 @@ export function UserProvider({ children }: { children: ReactNode }) {
const fetchUser = useCallback(async () => {
try {
setState(prev => ({ ...prev, loading: true, error: null }))
- const user = await services.auth.getUserInfo()
+ const user = await AuthService.getUserInfo()
if (!isMountedRef.current) return
@@ -83,7 +83,7 @@ export function UserProvider({ children }: { children: ReactNode }) {
/** 用户登出 */
const logout = useCallback(async () => {
try {
- await services.auth.logout()
+ await AuthService.logout()
if (!isMountedRef.current) return
diff --git a/frontend/hooks/use-public-config.ts b/frontend/hooks/use-public-config.ts
index e0dee0c5..99507826 100644
--- a/frontend/hooks/use-public-config.ts
+++ b/frontend/hooks/use-public-config.ts
@@ -1,5 +1,5 @@
import {useQuery} from '@tanstack/react-query'
-import {ConfigService} from '@/lib/services'
+import {ConfigService} from '@/lib/services/config'
/**
* 获取公共配置(使用 React Query 进行统一缓存与自动同步)
diff --git a/frontend/lib/utils/error-handling.ts b/frontend/lib/utils/error-handling.ts
index b6e0e54a..83d3b6e9 100644
--- a/frontend/lib/utils/error-handling.ts
+++ b/frontend/lib/utils/error-handling.ts
@@ -1,4 +1,4 @@
-import { isCancelError } from '@/lib/services'
+import { isCancelError } from '@/lib/services/core'
import { toast } from 'sonner'
/**