diff --git a/src/App.tsx b/src/App.tsx index 7ea6752..8a6bf95 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,12 +1,12 @@ import { useState, useEffect, useCallback } from 'react'; -import { useAppContext } from '@/components/AppProvider'; -import { LoginPage } from './pages/login'; +import { useAppContext } from '@/components/providers/AppProvider'; +import { LoginPage } from './pages/auth'; import { SettingsPage } from './pages/settings'; import { on, off, EVENTS } from './utils/event-bus'; -import { Layout } from '@/components/Layout'; +import { Layout } from '@/components/shell/Layout'; import { HomePage } from '@/pages/home/HomePage'; -import { PageDispatcher } from '@/components/PageDispatcher'; +import { PageDispatcher } from '@/components/shell/PageDispatcher'; /** * 根组件 — 主窗口 diff --git a/src/components/AppProvider.tsx b/src/components/providers/AppProvider.tsx similarity index 100% rename from src/components/AppProvider.tsx rename to src/components/providers/AppProvider.tsx diff --git a/src/components/SettingsProvider.tsx b/src/components/providers/SettingsProvider.tsx similarity index 100% rename from src/components/SettingsProvider.tsx rename to src/components/providers/SettingsProvider.tsx diff --git a/src/components/ThemeProvider.tsx b/src/components/providers/ThemeProvider.tsx similarity index 98% rename from src/components/ThemeProvider.tsx rename to src/components/providers/ThemeProvider.tsx index fbe439f..5dfe906 100644 --- a/src/components/ThemeProvider.tsx +++ b/src/components/providers/ThemeProvider.tsx @@ -12,7 +12,7 @@ import { flushSync } from 'react-dom'; import { ConfigProvider } from 'antd'; import zhCN from 'antd/locale/zh_CN'; -import { getThemeConfig } from '../theme/antd-theme'; +import { getThemeConfig } from '../../theme/antd-theme'; // ---------- Context 类型 ---------- diff --git a/src/components/Layout.tsx b/src/components/shell/Layout.tsx similarity index 91% rename from src/components/Layout.tsx rename to src/components/shell/Layout.tsx index ff0c739..4c1c4b3 100644 --- a/src/components/Layout.tsx +++ b/src/components/shell/Layout.tsx @@ -6,7 +6,7 @@ import type { ReactNode } from 'react'; import { theme as antTheme } from 'antd'; import { NavBar } from './navbar'; -import { BannerCarousel } from '@/pages/home/components/BannerCarousel'; +import { BannerCarousel } from '@/pages/home/features/BannerCarousel'; export function Layout({ children }: { children: ReactNode }) { const { token } = antTheme.useToken(); diff --git a/src/components/PageDispatcher.tsx b/src/components/shell/PageDispatcher.tsx similarity index 97% rename from src/components/PageDispatcher.tsx rename to src/components/shell/PageDispatcher.tsx index c3486fc..6fc419b 100644 --- a/src/components/PageDispatcher.tsx +++ b/src/components/shell/PageDispatcher.tsx @@ -21,9 +21,9 @@ import {Drawer, Modal} from 'antd'; import {EVENTS, off, on} from '@/utils/event-bus'; import {FloatingPanel} from '@/components/ui/FloatingPanel'; -import {WechatWorkPage} from '@/pages/headers/WechatWorkPage'; -import {AccountInfo} from '@/pages/headers/AccountInfo.tsx'; -import {BillingInfo} from "@/pages/headers/BillingInfo.tsx"; +import {WechatWorkPage} from '@/pages/panels/WechatWorkPage'; +import {AccountInfo} from '@/pages/panels/AccountInfo'; +import {BillingInfo} from '@/pages/panels/BillingInfo'; // ---------- 类型 ---------- diff --git a/src/components/navbar/AnnouncementDrawer.tsx b/src/components/shell/navbar/AnnouncementDrawer.tsx similarity index 100% rename from src/components/navbar/AnnouncementDrawer.tsx rename to src/components/shell/navbar/AnnouncementDrawer.tsx diff --git a/src/components/navbar/NavBar.tsx b/src/components/shell/navbar/NavBar.tsx similarity index 97% rename from src/components/navbar/NavBar.tsx rename to src/components/shell/navbar/NavBar.tsx index 951c495..af7c354 100644 --- a/src/components/navbar/NavBar.tsx +++ b/src/components/shell/navbar/NavBar.tsx @@ -10,8 +10,8 @@ import {useState, useCallback, useMemo} from 'react'; import {App} from 'antd'; -import {useAppContext} from '@/components/AppProvider'; -import {useTheme} from '@/components/ThemeProvider'; +import {useAppContext} from '@/components/providers/AppProvider'; +import {useTheme} from '@/components/providers/ThemeProvider'; import {emit, EVENTS} from '@/utils/event-bus.ts'; import {NavItem} from './NavItem'; import {AnnouncementDrawer} from './AnnouncementDrawer'; diff --git a/src/components/navbar/NavItem.tsx b/src/components/shell/navbar/NavItem.tsx similarity index 96% rename from src/components/navbar/NavItem.tsx rename to src/components/shell/navbar/NavItem.tsx index c1d056e..3e8a26c 100644 --- a/src/components/navbar/NavItem.tsx +++ b/src/components/shell/navbar/NavItem.tsx @@ -3,7 +3,7 @@ // 布局:图标(SVG)在上,文字在下 // ============================================================ -import { useTheme } from '@/components/ThemeProvider'; +import { useTheme } from '@/components/providers/ThemeProvider'; import type { NavItemConfig } from './types'; interface NavItemProps { diff --git a/src/components/navbar/index.ts b/src/components/shell/navbar/index.ts similarity index 100% rename from src/components/navbar/index.ts rename to src/components/shell/navbar/index.ts diff --git a/src/components/navbar/nav-config.ts b/src/components/shell/navbar/nav-config.ts similarity index 100% rename from src/components/navbar/nav-config.ts rename to src/components/shell/navbar/nav-config.ts diff --git a/src/components/navbar/types.ts b/src/components/shell/navbar/types.ts similarity index 100% rename from src/components/navbar/types.ts rename to src/components/shell/navbar/types.ts diff --git a/src/components/ui/FloatingPanel.tsx b/src/components/ui/FloatingPanel.tsx index 400798b..b59c817 100644 --- a/src/components/ui/FloatingPanel.tsx +++ b/src/components/ui/FloatingPanel.tsx @@ -12,7 +12,7 @@ // ============================================================ import { useState, useRef, useCallback, useEffect, type ReactNode } from 'react'; -import { useTheme } from '@/components/ThemeProvider'; +import { useTheme } from '@/components/providers/ThemeProvider'; // ---------- 类型 ---------- diff --git a/src/components/ui/LegalTextModal.tsx b/src/components/ui/LegalTextModal.tsx index 906024e..33e6e8e 100644 --- a/src/components/ui/LegalTextModal.tsx +++ b/src/components/ui/LegalTextModal.tsx @@ -6,7 +6,7 @@ import { Modal, Typography } from 'antd'; import { FileTextOutlined } from '@ant-design/icons'; -import { useTheme } from '@/components/ThemeProvider'; +import { useTheme } from '@/components/providers/ThemeProvider'; // Vite ?raw 导入:将 .txt 内容作为字符串直接内联 import serviceAgreement from '@/assets/legal/用户服务协议.txt?raw'; diff --git a/src/hooks/use-api.ts b/src/hooks/use-api.ts index e43fd5d..1ad5b0a 100644 --- a/src/hooks/use-api.ts +++ b/src/hooks/use-api.ts @@ -13,7 +13,7 @@ // ============================================================ import {useMemo, useState, useRef, useEffect, useCallback} from 'react'; -import {useAppContext} from '@/components/AppProvider'; +import {useAppContext} from '@/components/providers/AppProvider'; import { TaskAPI, POLLING_STATUSES, type TaskListRequestParams, type TaskInfoItemResponseBody, type CreatTaskRequestBody, type TaskStatusResponseBody, type TaskStatusString } from '@/services/modules/task'; import { ModelAPI, MODEL_CATEGORY_LABELS, type ModelsListResponseBody, type ModelCategoryStringEnum } from '@/services/modules/models'; import { fetchBanners, type Banner } from '@/services/modules/banner'; diff --git a/src/main.tsx b/src/main.tsx index 0a04afe..bdfc396 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,9 +3,9 @@ import ReactDOM from 'react-dom/client'; import {App as AntdApp} from 'antd'; import App from './App'; -import {ThemeProvider} from './components/ThemeProvider'; -import {AppProvider} from './components/AppProvider'; -import {SettingsProvider} from './components/SettingsProvider'; +import {ThemeProvider} from './components/providers/ThemeProvider'; +import {AppProvider} from './components/providers/AppProvider'; +import {SettingsProvider} from './components/providers/SettingsProvider'; // 全局样式(包含 Tailwind 指令 + 主题扩展 + 重置) import './theme/globals.css'; diff --git a/src/pages/login/components/ChangePasswordModal.tsx b/src/pages/auth/components/ChangePasswordModal.tsx similarity index 98% rename from src/pages/login/components/ChangePasswordModal.tsx rename to src/pages/auth/components/ChangePasswordModal.tsx index b737993..0477c8a 100644 --- a/src/pages/login/components/ChangePasswordModal.tsx +++ b/src/pages/auth/components/ChangePasswordModal.tsx @@ -12,7 +12,7 @@ import { useState, useCallback } from 'react'; import { Modal, Input, Button, Typography, App } from 'antd'; import { LockOutlined, KeyOutlined, SafetyOutlined } from '@ant-design/icons'; -import { useTheme } from '@/components/ThemeProvider'; +import { useTheme } from '@/components/providers/ThemeProvider'; import { AuthAPI } from '@/services/modules/auth'; import { validatePassword, validateConfirmPassword, runFieldChecks } from '../config/validators'; diff --git a/src/pages/login/components/ForgotPasswordModal.tsx b/src/pages/auth/components/ForgotPasswordModal.tsx similarity index 99% rename from src/pages/login/components/ForgotPasswordModal.tsx rename to src/pages/auth/components/ForgotPasswordModal.tsx index 3ae3c0a..bf56c3a 100644 --- a/src/pages/login/components/ForgotPasswordModal.tsx +++ b/src/pages/auth/components/ForgotPasswordModal.tsx @@ -18,7 +18,7 @@ import { KeyOutlined, } from '@ant-design/icons'; -import { useTheme } from '@/components/ThemeProvider'; +import { useTheme } from '@/components/providers/ThemeProvider'; import { AuthAPI } from '@/services/modules/auth'; import { validatePhone, diff --git a/src/pages/login/components/FormField.tsx b/src/pages/auth/components/FormField.tsx similarity index 100% rename from src/pages/login/components/FormField.tsx rename to src/pages/auth/components/FormField.tsx diff --git a/src/pages/login/components/LoginForm.tsx b/src/pages/auth/components/LoginForm.tsx similarity index 100% rename from src/pages/login/components/LoginForm.tsx rename to src/pages/auth/components/LoginForm.tsx diff --git a/src/pages/login/components/RegisterForm.tsx b/src/pages/auth/components/RegisterForm.tsx similarity index 100% rename from src/pages/login/components/RegisterForm.tsx rename to src/pages/auth/components/RegisterForm.tsx diff --git a/src/pages/login/config/login-fields.ts b/src/pages/auth/config/login-fields.ts similarity index 100% rename from src/pages/login/config/login-fields.ts rename to src/pages/auth/config/login-fields.ts diff --git a/src/pages/login/config/register-fields.ts b/src/pages/auth/config/register-fields.ts similarity index 100% rename from src/pages/login/config/register-fields.ts rename to src/pages/auth/config/register-fields.ts diff --git a/src/pages/login/config/validators.ts b/src/pages/auth/config/validators.ts similarity index 100% rename from src/pages/login/config/validators.ts rename to src/pages/auth/config/validators.ts diff --git a/src/pages/login/hooks/use-auth-state.ts b/src/pages/auth/hooks/use-auth-state.ts similarity index 100% rename from src/pages/login/hooks/use-auth-state.ts rename to src/pages/auth/hooks/use-auth-state.ts diff --git a/src/pages/login/hooks/use-sms-cooldown.ts b/src/pages/auth/hooks/use-sms-cooldown.ts similarity index 100% rename from src/pages/login/hooks/use-sms-cooldown.ts rename to src/pages/auth/hooks/use-sms-cooldown.ts diff --git a/src/pages/login/index.tsx b/src/pages/auth/index.tsx similarity index 97% rename from src/pages/login/index.tsx rename to src/pages/auth/index.tsx index 211a097..acb6f18 100644 --- a/src/pages/login/index.tsx +++ b/src/pages/auth/index.tsx @@ -10,8 +10,8 @@ import { useState, useCallback } from 'react'; import { Modal, Tabs, Typography, App } from 'antd'; -import { useAppContext } from '@/components/AppProvider'; -import { useTheme } from '@/components/ThemeProvider'; +import { useAppContext } from '@/components/providers/AppProvider'; +import { useTheme } from '@/components/providers/ThemeProvider'; import { LoginForm } from './components/LoginForm'; import { RegisterForm } from './components/RegisterForm'; import { ForgotPasswordModal } from './components/ForgotPasswordModal'; diff --git a/src/pages/login/types.ts b/src/pages/auth/types.ts similarity index 100% rename from src/pages/login/types.ts rename to src/pages/auth/types.ts diff --git a/src/pages/headers/Test3.tsx b/src/pages/headers/Test3.tsx deleted file mode 100644 index 4bfbb0d..0000000 --- a/src/pages/headers/Test3.tsx +++ /dev/null @@ -1,5 +0,0 @@ -export function Test3() { - return ( - <> - ); -} \ No newline at end of file diff --git a/src/pages/home/HomeContent.tsx b/src/pages/home/HomeContent.tsx index 19e11dc..7674d5a 100644 --- a/src/pages/home/HomeContent.tsx +++ b/src/pages/home/HomeContent.tsx @@ -3,52 +3,22 @@ // 可拖拽调整三栏宽度,所有数据请求在登录后发送 // ============================================================ -import React, { createContext, useContext, useState, useCallback, useRef, useEffect, useMemo } from 'react'; +import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react'; import { theme as antTheme, Empty } from 'antd'; -import { useAppContext } from '@/components/AppProvider'; +import { useAppContext } from '@/components/providers/AppProvider'; import type { ModelsListResponseBody } from '@/services/modules/models'; import type { TaskInfoItemResponseBody } from '@/services/modules/task'; -import { LeftPanel } from './components/LeftPanel'; -import { CenterPanel } from './components/CenterPanel'; -import { RightPanel } from './components/RightPanel'; +import { LeftPanel } from './panels/LeftPanel'; +import { CenterPanel } from './panels/CenterPanel'; +import { RightPanel } from './panels/RightPanel'; import { Typography } from 'antd'; +import { HomeContext } from './HomeContext'; + const { Text } = Typography; -// ---------- Context 类型 ---------- - -export interface HomeContextValue { - /** 当前选中的模型 */ - selectedModel: ModelsListResponseBody | null; - setSelectedModel: (model: ModelsListResponseBody | null) => void; - /** 任务记录分页 — 当前页码 */ - taskPage: number; - /** 任务记录分页 — 每页条数 */ - taskPageSize: number; - setTaskPage: (page: number) => void; - setTaskPageSize: (size: number) => void; - /** 当前选中的任务记录(用于右侧预览) */ - selectedTask: TaskInfoItemResponseBody | null; - setSelectedTask: (task: TaskInfoItemResponseBody | null) => void; - /** 侧边栏折叠状态 */ - isLeftCollapsed: boolean; - toggleLeftCollapsed: () => void; -} - -export const HomeContext = createContext(null); - -// ---------- Consumer Hook ---------- - -export function useHomeContext(): HomeContextValue { - const ctx = useContext(HomeContext); - if (!ctx) { - throw new Error('useHomeContext() 必须在 内部调用'); - } - return ctx; -} - // ---------- 常量 ---------- /** 左列最小/默认宽度 */ diff --git a/src/pages/home/HomeContext.tsx b/src/pages/home/HomeContext.tsx new file mode 100644 index 0000000..ed918f6 --- /dev/null +++ b/src/pages/home/HomeContext.tsx @@ -0,0 +1,43 @@ +// ============================================================ +// HomeContext — 首页共享状态(Context + Provider + Hook) +// +// 原与 HomeContent.tsx 耦合在同一文件,现独立以便: +// - 消费者可以明确只 import 状态 Hook,不关心布局细节 +// - 新增 consumer 时不需要翻阅 358 行 HomeContent +// ============================================================ + +import { createContext, useContext } from 'react'; +import type { ModelsListResponseBody } from '@/services/modules/models'; +import type { TaskInfoItemResponseBody } from '@/services/modules/task'; + +// ---------- Context 类型 ---------- + +export interface HomeContextValue { + /** 当前选中的模型 */ + selectedModel: ModelsListResponseBody | null; + setSelectedModel: (model: ModelsListResponseBody | null) => void; + /** 任务记录分页 — 当前页码 */ + taskPage: number; + /** 任务记录分页 — 每页条数 */ + taskPageSize: number; + setTaskPage: (page: number) => void; + setTaskPageSize: (size: number) => void; + /** 当前选中的任务记录(用于右侧预览) */ + selectedTask: TaskInfoItemResponseBody | null; + setSelectedTask: (task: TaskInfoItemResponseBody | null) => void; + /** 侧边栏折叠状态 */ + isLeftCollapsed: boolean; + toggleLeftCollapsed: () => void; +} + +export const HomeContext = createContext(null); + +// ---------- Consumer Hook ---------- + +export function useHomeContext(): HomeContextValue { + const ctx = useContext(HomeContext); + if (!ctx) { + throw new Error('useHomeContext() 必须在 内部调用'); + } + return ctx; +} diff --git a/src/pages/home/components/useUI/uploadValidation.ts b/src/pages/home/components/useUI/uploadValidation.ts deleted file mode 100644 index efb92a4..0000000 --- a/src/pages/home/components/useUI/uploadValidation.ts +++ /dev/null @@ -1,26 +0,0 @@ -// ============================================================ -// uploadValidation — 文件上传前校验工具 -// ImageInput / ImageListInput 共用 -// ============================================================ - -import { Upload, message } from 'antd'; -import type { RcFile } from 'antd/es/upload'; - -/** - * 创建图片上传前的类型 & 大小校验函数 - * @param maxSizeMb 最大文件大小(MB),默认 10 - */ -export function createImageBeforeUpload(maxSizeMb: number = 10) { - return (file: RcFile) => { - const isImage = file.type.startsWith('image/'); - if (!isImage) { - message.error('只能上传图片文件'); - return Upload.LIST_IGNORE; - } - if (file.size / 1024 / 1024 >= maxSizeMb) { - message.error(`图片大小不能超过 ${maxSizeMb}MB`); - return Upload.LIST_IGNORE; - } - return true; // 校验通过,交由 customRequest 执行实际上传 - }; -} diff --git a/src/pages/home/components/useUI/AudioListInput.tsx b/src/pages/home/controls/AudioListInput.tsx similarity index 100% rename from src/pages/home/components/useUI/AudioListInput.tsx rename to src/pages/home/controls/AudioListInput.tsx diff --git a/src/pages/home/components/useUI/Checkbox.tsx b/src/pages/home/controls/Checkbox.tsx similarity index 100% rename from src/pages/home/components/useUI/Checkbox.tsx rename to src/pages/home/controls/Checkbox.tsx diff --git a/src/pages/home/components/useUI/ComboBox.tsx b/src/pages/home/controls/ComboBox.tsx similarity index 100% rename from src/pages/home/components/useUI/ComboBox.tsx rename to src/pages/home/controls/ComboBox.tsx diff --git a/src/pages/home/components/useUI/DoubleSpinBox.tsx b/src/pages/home/controls/DoubleSpinBox.tsx similarity index 100% rename from src/pages/home/components/useUI/DoubleSpinBox.tsx rename to src/pages/home/controls/DoubleSpinBox.tsx diff --git a/src/pages/home/components/useUI/ImageInput.tsx b/src/pages/home/controls/ImageInput.tsx similarity index 84% rename from src/pages/home/components/useUI/ImageInput.tsx rename to src/pages/home/controls/ImageInput.tsx index 243f94d..f5fd1a0 100644 --- a/src/pages/home/components/useUI/ImageInput.tsx +++ b/src/pages/home/controls/ImageInput.tsx @@ -14,15 +14,33 @@ // ============================================================ import { useState, useCallback } from 'react'; -import { Upload, Switch, Space, Typography } from 'antd'; +import { Upload, Switch, Space, Typography, message } from 'antd'; import { UploadOutlined } from '@ant-design/icons'; -import type { UploadFile } from 'antd/es/upload'; +import type { UploadFile, RcFile } from 'antd/es/upload'; import type { WidgetProps } from './types'; -import { createImageBeforeUpload } from './uploadValidation'; import { useFileUpload } from '@/hooks/use-api'; const { Text } = Typography; +/** + * 创建图片上传前的类型 & 大小校验函数(ImageInput / ImageListInput 共用) + * @param maxSizeMb 最大文件大小(MB),默认 10 + */ +export function createImageBeforeUpload(maxSizeMb: number = 10) { + return (file: RcFile) => { + const isImage = file.type.startsWith('image/'); + if (!isImage) { + message.error('只能上传图片文件'); + return Upload.LIST_IGNORE; + } + if (file.size / 1024 / 1024 >= maxSizeMb) { + message.error(`图片大小不能超过 ${maxSizeMb}MB`); + return Upload.LIST_IGNORE; + } + return true; + }; +} + /** 构建图片 accept 字符串 */ function buildAccept(filters?: string[]): string { if (!filters || filters.length === 0) return 'image/png,image/jpg,image/jpeg,image/webp'; diff --git a/src/pages/home/components/useUI/ImageListInput.tsx b/src/pages/home/controls/ImageListInput.tsx similarity index 96% rename from src/pages/home/components/useUI/ImageListInput.tsx rename to src/pages/home/controls/ImageListInput.tsx index 01fd896..46fe0ae 100644 --- a/src/pages/home/components/useUI/ImageListInput.tsx +++ b/src/pages/home/controls/ImageListInput.tsx @@ -7,7 +7,7 @@ import { Upload } from 'antd'; import { InboxOutlined } from '@ant-design/icons'; import type { UploadFile } from 'antd/es/upload'; import type { WidgetProps } from './types'; -import { createImageBeforeUpload } from './uploadValidation'; +import { createImageBeforeUpload } from './ImageInput'; import { useFileUpload } from '@/hooks/use-api'; const { Dragger } = Upload; diff --git a/src/pages/home/components/useUI/LineInput.tsx b/src/pages/home/controls/LineInput.tsx similarity index 100% rename from src/pages/home/components/useUI/LineInput.tsx rename to src/pages/home/controls/LineInput.tsx diff --git a/src/pages/home/components/useUI/SeedanceContent.tsx b/src/pages/home/controls/SeedanceContent.tsx similarity index 100% rename from src/pages/home/components/useUI/SeedanceContent.tsx rename to src/pages/home/controls/SeedanceContent.tsx diff --git a/src/pages/home/components/useUI/SpinBox.tsx b/src/pages/home/controls/SpinBox.tsx similarity index 100% rename from src/pages/home/components/useUI/SpinBox.tsx rename to src/pages/home/controls/SpinBox.tsx diff --git a/src/pages/home/components/useUI/TextInput.tsx b/src/pages/home/controls/TextInput.tsx similarity index 100% rename from src/pages/home/components/useUI/TextInput.tsx rename to src/pages/home/controls/TextInput.tsx diff --git a/src/pages/home/components/useUI/index.ts b/src/pages/home/controls/index.ts similarity index 95% rename from src/pages/home/components/useUI/index.ts rename to src/pages/home/controls/index.ts index 098e01e..d123e8d 100644 --- a/src/pages/home/components/useUI/index.ts +++ b/src/pages/home/controls/index.ts @@ -1,5 +1,5 @@ // ============================================================ -// useUI/index.ts — Widget 注册表 +// controls/index.ts — Widget 注册表 // // 职责: // 1. 定义 WidgetProps 统一接口 @@ -7,7 +7,7 @@ // 3. 导出 WidgetType 联合类型供外部使用 // // 新增控件类型只需两步: -// ① 在 useUI/ 下创建组件文件 +// ① 在 controls/ 下创建组件文件 // ② 在 WIDGET_MAP 中加一行 // ============================================================ diff --git a/src/pages/home/components/useUI/types.ts b/src/pages/home/controls/types.ts similarity index 89% rename from src/pages/home/components/useUI/types.ts rename to src/pages/home/controls/types.ts index 1734696..48d4e13 100644 --- a/src/pages/home/components/useUI/types.ts +++ b/src/pages/home/controls/types.ts @@ -1,5 +1,5 @@ // ============================================================ -// useUI/types.ts — Widget 类型定义(与 index.ts 分离以避免循环引用) +// controls/types.ts — Widget 类型定义(与 index.ts 分离以避免循环引用) // ============================================================ /** diff --git a/src/pages/home/components/BannerCarousel.tsx b/src/pages/home/features/BannerCarousel.tsx similarity index 100% rename from src/pages/home/components/BannerCarousel.tsx rename to src/pages/home/features/BannerCarousel.tsx diff --git a/src/pages/home/components/ModelInputForm.tsx b/src/pages/home/features/ModelInputForm.tsx similarity index 98% rename from src/pages/home/components/ModelInputForm.tsx rename to src/pages/home/features/ModelInputForm.tsx index abc5339..2217d12 100644 --- a/src/pages/home/components/ModelInputForm.tsx +++ b/src/pages/home/features/ModelInputForm.tsx @@ -4,7 +4,7 @@ // 布局:Header(模型信息+meta) → Body(fields.map 渲染) → Footer(标签+重置+提交) // // 与旧版的区别: -// - 控件渲染逻辑已提取到 useUI/ 组件体系 +// - 控件渲染逻辑已提取到 controls/ 组件体系 // - param_schema 解析已提取到 useModelUI Hook // - 字段间条件依赖(constraints_config.requires)自动处理禁用 // - 本组件只负责:布局、Form 容器、提交逻辑、依赖禁用 @@ -27,13 +27,13 @@ import type { FormInstance } from 'antd'; import { SendOutlined, ClockCircleOutlined, ReloadOutlined } from '@ant-design/icons'; import type { UploadFile } from 'antd/es/upload'; -import { useHomeContext } from '@/pages/home/HomeContent'; -import { useAppContext } from '@/components/AppProvider'; +import { useHomeContext } from '@/pages/home/HomeContext'; +import { useAppContext } from '@/components/providers/AppProvider'; import { useSubmitTask } from '@/hooks/use-api'; import { emit, EVENTS } from '@/utils/event-bus'; import { OutputTypeMap } from '@/services/modules/task'; import type { OutputTypeString, TaskInfoItemResponseBody } from '@/services/modules/task'; -import { useModelUI, isValueEmpty, type UIFieldConfig } from './useModelUI'; +import { useModelUI, isValueEmpty, type UIFieldConfig } from '../hooks/useModelUI'; import { calculateCost, formatYuan, diff --git a/src/pages/home/components/ModelSelector.tsx b/src/pages/home/features/ModelSelector.tsx similarity index 99% rename from src/pages/home/components/ModelSelector.tsx rename to src/pages/home/features/ModelSelector.tsx index 396028b..2a85c58 100644 --- a/src/pages/home/components/ModelSelector.tsx +++ b/src/pages/home/features/ModelSelector.tsx @@ -7,7 +7,7 @@ import React, { useState, useMemo, useCallback } from 'react'; import { Tabs, Spin, Empty, Tag, Typography, Button, Result, message, theme as antTheme } from 'antd'; import { AppstoreOutlined } from '@ant-design/icons'; -import { useHomeContext } from '@/pages/home/HomeContent'; +import { useHomeContext } from '@/pages/home/HomeContext'; import { MODEL_CATEGORIES, type ModelsListResponseBody, type ModelCategoryStringEnum } from '@/services/modules/models'; import { EnumResolver } from '@/utils/enum-resolver'; diff --git a/src/pages/home/components/OutputPreview.tsx b/src/pages/home/features/OutputPreview.tsx similarity index 99% rename from src/pages/home/components/OutputPreview.tsx rename to src/pages/home/features/OutputPreview.tsx index 9ddb19c..70bcfbf 100644 --- a/src/pages/home/components/OutputPreview.tsx +++ b/src/pages/home/features/OutputPreview.tsx @@ -11,7 +11,7 @@ import { CloseCircleOutlined, } from '@ant-design/icons'; -import { useHomeContext } from '@/pages/home/HomeContent'; +import { useHomeContext } from '@/pages/home/HomeContext'; import { useTaskDetail } from '@/hooks/use-api'; import { POLLING_STATUSES, type TaskStatusString } from '@/services/modules/task'; diff --git a/src/pages/home/components/TaskHistory.tsx b/src/pages/home/features/TaskHistory.tsx similarity index 99% rename from src/pages/home/components/TaskHistory.tsx rename to src/pages/home/features/TaskHistory.tsx index d1dabe4..cbfa5a6 100644 --- a/src/pages/home/components/TaskHistory.tsx +++ b/src/pages/home/features/TaskHistory.tsx @@ -19,9 +19,9 @@ import { HistoryOutlined, SearchOutlined, SettingOutlined } from '@ant-design/ic import { useTaskList, useTaskPolling } from '@/hooks/use-api'; import type { ModelsListResponseBody } from '@/services/modules/models'; -import { useAppContext } from '@/components/AppProvider'; -import { useHomeContext } from '@/pages/home/HomeContent'; -import { useTheme } from '@/components/ThemeProvider'; +import { useAppContext } from '@/components/providers/AppProvider'; +import { useHomeContext } from '@/pages/home/HomeContext'; +import { useTheme } from '@/components/providers/ThemeProvider'; import { on, off, EVENTS } from '@/utils/event-bus'; import type { TaskInfoItemResponseBody, diff --git a/src/pages/home/components/useModelUI.ts b/src/pages/home/hooks/useModelUI.ts similarity index 98% rename from src/pages/home/components/useModelUI.ts rename to src/pages/home/hooks/useModelUI.ts index d5238ca..d018b8e 100644 --- a/src/pages/home/components/useModelUI.ts +++ b/src/pages/home/hooks/useModelUI.ts @@ -15,8 +15,8 @@ import { useMemo } from 'react'; import type { ComponentType } from 'react'; import type { ModelsListResponseBody } from '@/services/modules/models'; -import { WIDGET_MAP, FALLBACK_WIDGET } from './useUI'; -import type { WidgetProps } from './useUI'; +import { WIDGET_MAP, FALLBACK_WIDGET } from '../controls'; +import type { WidgetProps } from '../controls'; // ---------- 输出类型 ---------- diff --git a/src/pages/home/components/CenterPanel.tsx b/src/pages/home/panels/CenterPanel.tsx similarity index 90% rename from src/pages/home/components/CenterPanel.tsx rename to src/pages/home/panels/CenterPanel.tsx index dff7c1b..e6d6b35 100644 --- a/src/pages/home/components/CenterPanel.tsx +++ b/src/pages/home/panels/CenterPanel.tsx @@ -3,7 +3,7 @@ // ============================================================ import { theme as antTheme } from 'antd'; -import { ModelInputForm } from './ModelInputForm'; +import { ModelInputForm } from '../features/ModelInputForm'; export function CenterPanel() { const { token } = antTheme.useToken(); diff --git a/src/pages/home/components/LeftPanel.tsx b/src/pages/home/panels/LeftPanel.tsx similarity index 98% rename from src/pages/home/components/LeftPanel.tsx rename to src/pages/home/panels/LeftPanel.tsx index af2523d..0e0a5c2 100644 --- a/src/pages/home/components/LeftPanel.tsx +++ b/src/pages/home/panels/LeftPanel.tsx @@ -7,8 +7,8 @@ import { useState, useRef, useEffect, useCallback } from 'react'; import { theme as antTheme } from 'antd'; -import { ModelSelector } from './ModelSelector'; -import { TaskHistory } from './TaskHistory'; +import { ModelSelector } from '../features/ModelSelector'; +import { TaskHistory } from '../features/TaskHistory'; import { useModelList } from '@/hooks/use-api'; // ---------- 常量 ---------- diff --git a/src/pages/home/components/RightPanel.tsx b/src/pages/home/panels/RightPanel.tsx similarity index 90% rename from src/pages/home/components/RightPanel.tsx rename to src/pages/home/panels/RightPanel.tsx index ea8f4c2..253f988 100644 --- a/src/pages/home/components/RightPanel.tsx +++ b/src/pages/home/panels/RightPanel.tsx @@ -3,7 +3,7 @@ // ============================================================ import { theme as antTheme } from 'antd'; -import { OutputPreview } from './OutputPreview'; +import { OutputPreview } from '../features/OutputPreview'; export function RightPanel() { const { token } = antTheme.useToken(); diff --git a/src/pages/headers/AccountInfo.tsx b/src/pages/panels/AccountInfo.tsx similarity index 100% rename from src/pages/headers/AccountInfo.tsx rename to src/pages/panels/AccountInfo.tsx diff --git a/src/pages/headers/BillingInfo.tsx b/src/pages/panels/BillingInfo.tsx similarity index 100% rename from src/pages/headers/BillingInfo.tsx rename to src/pages/panels/BillingInfo.tsx diff --git a/src/pages/headers/WechatWorkPage.tsx b/src/pages/panels/WechatWorkPage.tsx similarity index 100% rename from src/pages/headers/WechatWorkPage.tsx rename to src/pages/panels/WechatWorkPage.tsx diff --git a/src/pages/settings/SettingsPage.tsx b/src/pages/settings/SettingsPage.tsx index 9e91c78..410ebd6 100644 --- a/src/pages/settings/SettingsPage.tsx +++ b/src/pages/settings/SettingsPage.tsx @@ -14,13 +14,13 @@ import { useCallback } from 'react'; import { Modal } from 'antd'; import { SettingOutlined, CloseOutlined } from '@ant-design/icons'; -import { useAppContext } from '@/components/AppProvider'; +import { useAppContext } from '@/components/providers/AppProvider'; import { isMacOS } from '@/utils/platform'; -import { ThemeSetting } from './blocks/ThemeSetting'; -import { StoragePathSetting } from './blocks/StoragePathSetting'; -import { SystemInfoSetting } from './blocks/SystemInfoSetting'; -import { UpdateSetting } from './blocks/UpdateSetting'; -import { PasswordSetting } from './blocks/PasswordSetting'; +import { ThemeSetting } from './sections/ThemeSetting'; +import { StoragePathSetting } from './sections/StoragePathSetting'; +import { SystemInfoSetting } from './sections/SystemInfoSetting'; +import { UpdateSetting } from './sections/UpdateSetting'; +import { PasswordSetting } from './sections/PasswordSetting'; interface SettingsPageProps { open: boolean; diff --git a/src/pages/settings/blocks/PasswordSetting.tsx b/src/pages/settings/sections/PasswordSetting.tsx similarity index 92% rename from src/pages/settings/blocks/PasswordSetting.tsx rename to src/pages/settings/sections/PasswordSetting.tsx index 0104843..cfa4a56 100644 --- a/src/pages/settings/blocks/PasswordSetting.tsx +++ b/src/pages/settings/sections/PasswordSetting.tsx @@ -10,8 +10,8 @@ import { useState } from 'react'; import { Card, Button, Typography } from 'antd'; import { LockOutlined, PhoneOutlined } from '@ant-design/icons'; -import { ChangePasswordModal } from '@/pages/login/components/ChangePasswordModal'; -import { ForgotPasswordModal } from '@/pages/login/components/ForgotPasswordModal'; +import { ChangePasswordModal } from '@/pages/auth/components/ChangePasswordModal'; +import { ForgotPasswordModal } from '@/pages/auth/components/ForgotPasswordModal'; const { Text } = Typography; diff --git a/src/pages/settings/blocks/StoragePathSetting.tsx b/src/pages/settings/sections/StoragePathSetting.tsx similarity index 98% rename from src/pages/settings/blocks/StoragePathSetting.tsx rename to src/pages/settings/sections/StoragePathSetting.tsx index cfc23b7..22d4f83 100644 --- a/src/pages/settings/blocks/StoragePathSetting.tsx +++ b/src/pages/settings/sections/StoragePathSetting.tsx @@ -9,7 +9,7 @@ import { useState, useCallback } from 'react'; import { Card, Button, Input, Typography, Space, App } from 'antd'; import { FolderOpenOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons'; import type { Edition } from '@shared/types'; -import { useSettings } from '@/components/SettingsProvider'; +import { useSettings } from '@/components/providers/SettingsProvider'; import { hasIpc, safeIpcInvoke } from '@/utils/ipc'; import { BIDIRECTIONAL } from '@shared/constants/ipc-channels'; diff --git a/src/pages/settings/blocks/SystemInfoSetting.tsx b/src/pages/settings/sections/SystemInfoSetting.tsx similarity index 96% rename from src/pages/settings/blocks/SystemInfoSetting.tsx rename to src/pages/settings/sections/SystemInfoSetting.tsx index af353ee..ac5b09e 100644 --- a/src/pages/settings/blocks/SystemInfoSetting.tsx +++ b/src/pages/settings/sections/SystemInfoSetting.tsx @@ -9,7 +9,7 @@ import { InfoCircleOutlined, EnvironmentOutlined, } from '@ant-design/icons'; -import { useAppContext } from '@/components/AppProvider'; +import { useAppContext } from '@/components/providers/AppProvider'; import { getPlatformName } from '@/utils/platform'; import { APP_VERSION } from '@shared/constants/version'; import { getEditionName } from '@shared/constants/app'; diff --git a/src/pages/settings/blocks/ThemeSetting.tsx b/src/pages/settings/sections/ThemeSetting.tsx similarity index 94% rename from src/pages/settings/blocks/ThemeSetting.tsx rename to src/pages/settings/sections/ThemeSetting.tsx index e581104..1a81ff1 100644 --- a/src/pages/settings/blocks/ThemeSetting.tsx +++ b/src/pages/settings/sections/ThemeSetting.tsx @@ -4,7 +4,7 @@ import { Card, Segmented, Typography } from 'antd'; import { BulbOutlined, BulbFilled } from '@ant-design/icons'; -import { useTheme } from '@/components/ThemeProvider'; +import { useTheme } from '@/components/providers/ThemeProvider'; const { Text } = Typography; diff --git a/src/pages/settings/blocks/UpdateSetting.tsx b/src/pages/settings/sections/UpdateSetting.tsx similarity index 100% rename from src/pages/settings/blocks/UpdateSetting.tsx rename to src/pages/settings/sections/UpdateSetting.tsx diff --git a/src/services/modules/payments.ts b/src/services/modules/payments.ts new file mode 100644 index 0000000..e69de29