From b19be8fab0c150761159a5b9dcd0dfcfaccc5ddf Mon Sep 17 00:00:00 2001 From: IDhammaI <1518470138@qq.com> Date: Tue, 11 Aug 2026 11:26:46 +0800 Subject: [PATCH 01/15] =?UTF-8?q?refactor(repo):=20=E6=95=B4=E7=90=86?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=A0=B9=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将后端、前端、UI 展示站、部署文档、规则文档和示例资源迁移到统一目录\n- 同步 Docker、docker-compose、CI/CD、README 与规则索引中的路径\n- 保持前端、后端和文档变更的独立触发范围\n\nChecklist:\n- [x] 根目录重构改动已检查,未包含移动端代码\n- [x] 前端 npm test 57/57 通过,npm run build 通过\n- [x] 后端 pytest 已执行;当前环境因缺少 langgraph、langchain_core、torch 等依赖在收集阶段阻塞,未伪造通过\n- [x] git diff --cached --check 通过 --- .dockerignore | 16 ++-- .gitattributes | 4 +- .github/workflows/backend-ci.yml | 6 +- .github/workflows/frontend-ci.yml | 12 +-- .github/workflows/release-ci-cd.yml | 26 +++--- .gitignore | 30 +++--- AGENTS.md | 36 ++++---- Dockerfile | 6 +- README.md | 87 ++++++++---------- {backend => apps/backend}/.env.example | 4 +- {backend => apps/backend}/agents/__init__.py | 0 .../agents/error_correction/__init__.py | 0 .../backend}/agents/error_correction/agent.py | 0 .../agents/error_correction/prompts.py | 0 .../agents/error_correction/schemas.py | 0 .../agents/error_correction/tools/__init__.py | 0 .../error_correction/tools/file_tools.py | 0 .../error_correction/tools/question_tools.py | 0 .../backend}/agents/note/__init__.py | 0 .../backend}/agents/note/agent.py | 0 .../backend}/agents/note/prompts.py | 0 .../backend}/agents/note/schemas.py | 0 .../backend}/agents/solve/__init__.py | 0 .../backend}/agents/solve/agent.py | 0 .../backend}/agents/solve/prompts.py | 0 .../backend}/agents/solve/schemas.py | 0 .../backend}/agents/teach/__init__.py | 0 .../backend}/agents/teach/agent.py | 0 .../backend}/agents/teach/prompts.py | 0 {backend => apps/backend}/core/__init__.py | 0 {backend => apps/backend}/core/config.py | 4 +- {backend => apps/backend}/core/llm.py | 0 {backend => apps/backend}/core/mail.py | 0 .../backend}/core/model_selection.py | 0 {backend => apps/backend}/core/quota.py | 0 {backend => apps/backend}/core/reasoning.py | 0 {backend => apps/backend}/core/state.py | 0 .../backend}/core/workflow_run_store.py | 0 {backend => apps/backend}/db/__init__.py | 0 {backend => apps/backend}/db/crud/__init__.py | 0 {backend => apps/backend}/db/crud/chat.py | 0 {backend => apps/backend}/db/crud/devices.py | 0 .../backend}/db/crud/email_verification.py | 0 {backend => apps/backend}/db/crud/notes.py | 0 {backend => apps/backend}/db/crud/projects.py | 0 .../backend}/db/crud/providers.py | 0 .../backend}/db/crud/questions.py | 0 {backend => apps/backend}/db/crud/review.py | 0 .../backend}/db/crud/split_records.py | 0 {backend => apps/backend}/db/crud/stats.py | 0 {backend => apps/backend}/db/crud/tags.py | 0 {backend => apps/backend}/db/crud/users.py | 0 .../backend}/db/crud/workflow_runs.py | 0 {backend => apps/backend}/db/migrate.py | 0 {backend => apps/backend}/db/models.py | 0 {backend => apps/backend}/gunicorn.conf.py | 0 {backend => apps/backend}/package-lock.json | 0 .../backend}/pipeline/paddleocr_client.py | 0 {backend => apps/backend}/pipeline/utils.py | 2 +- .../backend}/pipeline/workflow.py | 0 .../backend}/postgresql_schema.sql | 2 +- {backend => apps/backend}/routes/__init__.py | 0 {backend => apps/backend}/routes/auth.py | 0 {backend => apps/backend}/routes/chat.py | 0 {backend => apps/backend}/routes/device.py | 0 {backend => apps/backend}/routes/notes.py | 0 {backend => apps/backend}/routes/projects.py | 0 {backend => apps/backend}/routes/questions.py | 0 {backend => apps/backend}/routes/settings.py | 0 {backend => apps/backend}/routes/stats.py | 0 {backend => apps/backend}/routes/upload.py | 0 {backend => apps/backend}/tests/README.md | 30 +++--- {backend => apps/backend}/tests/__init__.py | 0 {backend => apps/backend}/tests/conftest.py | 8 +- .../tests/fixtures/sample_ocr_data.json | 0 .../backend}/tests/test_chat_crud.py | 0 .../backend}/tests/test_chat_routes.py | 0 .../backend}/tests/test_correct_node.py | 0 {backend => apps/backend}/tests/test_crud.py | 0 .../backend}/tests/test_eraser_inference.py | 0 .../backend}/tests/test_export.py | 0 .../tests/test_migrate_and_delete_question.py | 0 .../backend}/tests/test_note_agent.py | 0 .../backend}/tests/test_ocr_api.py | 7 +- .../backend}/tests/test_project_crud.py | 0 .../backend}/tests/test_question_tools.py | 0 .../backend}/tests/test_schemas.py | 0 .../backend}/tests/test_solve_integration.py | 0 .../backend}/tests/test_solve_schemas.py | 0 .../backend}/tests/test_split_integration.py | 0 .../tests/test_structured_output_modes.py | 0 .../backend}/tests/test_teach_agent.py | 0 {backend => apps/backend}/tests/test_utils.py | 0 .../backend}/tests/test_web_helpers.py | 0 .../backend}/tests/test_web_routes.py | 0 .../backend}/tests/test_workflow_helpers.py | 0 .../backend}/text_eraser_model/__init__.py | 0 .../backend}/text_eraser_model/blocks.py | 0 .../backend}/text_eraser_model/inference.py | 0 .../backend}/text_eraser_model/model.py | 0 .../backend}/text_eraser_model/test_erase.py | 4 +- .../text_eraser_model/weight/best.pth | 0 {backend => apps/backend}/web_app.py | 7 +- {backend => apps/backend}/wsgi.py | 0 {frontend => apps/frontend}/.gitignore | 0 .../frontend}/.vscode/extensions.json | 0 {frontend => apps/frontend}/app.html | 0 {frontend => apps/frontend}/package-lock.json | 0 {frontend => apps/frontend}/package.json | 0 .../frontend}/public/favicon.svg | 0 {frontend => apps/frontend}/public/logo.svg | 0 {frontend => apps/frontend}/src/App.vue | 0 .../frontend}/src/__tests__/README.md | 0 .../frontend}/src/__tests__/api.test.ts | 0 .../chat-page-model-selector.test.ts | 0 .../frontend}/src/__tests__/state.test.ts | 0 .../frontend}/src/__tests__/utils.test.ts | 0 {frontend => apps/frontend}/src/api/auth.ts | 0 {frontend => apps/frontend}/src/api/chat.ts | 0 {frontend => apps/frontend}/src/api/client.ts | 0 {frontend => apps/frontend}/src/api/config.ts | 0 {frontend => apps/frontend}/src/api/index.ts | 0 {frontend => apps/frontend}/src/api/notes.ts | 0 .../frontend}/src/api/projects.ts | 0 .../frontend}/src/api/questions.ts | 0 .../frontend}/src/api/splitRecords.ts | 0 {frontend => apps/frontend}/src/api/upload.ts | 0 .../frontend}/src/assets/deepseek.svg | 0 .../frontend}/src/assets/ernie.svg | 0 .../src/assets/provider-anthropic.svg | 0 .../frontend}/src/assets/provider-openai.svg | 0 .../src/assets/provider-paddleocr.svg | 0 .../src/components/base/BaseAccordion.vue | 0 .../src/components/base/BaseAffix.vue | 0 .../src/components/base/BaseAlert.vue | 0 .../src/components/base/BaseAnchor.vue | 0 .../src/components/base/BaseAvatar.vue | 0 .../src/components/base/BaseAvatarGroup.vue | 0 .../src/components/base/BaseBackTop.vue | 0 .../src/components/base/BaseBadge.vue | 0 .../src/components/base/BaseBreadcrumb.vue | 0 .../components/base/BaseBreadcrumbItem.vue | 0 .../src/components/base/BaseButton.vue | 0 .../src/components/base/BaseButtonGroup.vue | 0 .../src/components/base/BaseCalendar.vue | 0 .../src/components/base/BaseCard.vue | 0 .../src/components/base/BaseCarousel.vue | 0 .../src/components/base/BaseCascader.vue | 0 .../src/components/base/BaseCheckbox.vue | 0 .../src/components/base/BaseCheckboxGroup.vue | 0 .../components/base/BaseCircleProgress.vue | 0 .../src/components/base/BaseCodeBlock.vue | 0 .../src/components/base/BaseColorPicker.vue | 0 .../src/components/base/BaseCombobox.vue | 0 .../components/base/BaseCommandPalette.vue | 0 .../src/components/base/BaseCopyButton.vue | 0 .../src/components/base/BaseCountdown.vue | 0 .../src/components/base/BaseDataTable.vue | 0 .../src/components/base/BaseDatePicker.vue | 0 .../components/base/BaseDateRangePicker.vue | 0 .../src/components/base/BaseDescriptions.vue | 0 .../src/components/base/BaseDivider.vue | 0 .../src/components/base/BaseDrawer.vue | 0 .../src/components/base/BaseDropdown.vue | 0 .../src/components/base/BaseEllipsis.vue | 0 .../src/components/base/BaseEmptyState.vue | 0 .../src/components/base/BaseFieldMessage.vue | 0 .../src/components/base/BaseFloatButton.vue | 0 .../src/components/base/BaseForm.vue | 0 .../src/components/base/BaseFormItem.vue | 0 .../src/components/base/BaseHighlight.vue | 0 .../src/components/base/BaseImage.vue | 0 .../components/base/BaseInfiniteScroll.vue | 0 .../src/components/base/BaseInput.vue | 0 .../frontend}/src/components/base/BaseKbd.vue | 0 .../src/components/base/BaseLink.vue | 0 .../src/components/base/BaseListGroup.vue | 0 .../src/components/base/BaseListItem.vue | 0 .../src/components/base/BaseLoading.vue | 0 .../src/components/base/BaseLoadingBar.vue | 0 .../src/components/base/BaseLogo.vue | 0 .../src/components/base/BaseMarquee.vue | 0 .../src/components/base/BaseMention.vue | 0 .../src/components/base/BaseMenu.vue | 0 .../src/components/base/BaseModal.vue | 0 .../components/base/BaseNumberAnimation.vue | 0 .../src/components/base/BaseNumberInput.vue | 0 .../src/components/base/BasePagination.vue | 0 .../src/components/base/BasePanel.vue | 0 .../src/components/base/BasePanelTitle.vue | 0 .../src/components/base/BasePinInput.vue | 0 .../src/components/base/BasePopconfirm.vue | 0 .../src/components/base/BasePopover.vue | 0 .../src/components/base/BaseProgress.vue | 0 .../src/components/base/BaseRadio.vue | 0 .../src/components/base/BaseRadioGroup.vue | 0 .../src/components/base/BaseRate.vue | 0 .../components/base/BaseResizablePanels.vue | 0 .../src/components/base/BaseResult.vue | 0 .../src/components/base/BaseRibbon.vue | 0 .../src/components/base/BaseScrollbar.vue | 0 .../src/components/base/BaseSearchInput.vue | 0 .../components/base/BaseSearchableSelect.vue | 0 .../src/components/base/BaseSegmented.vue | 0 .../src/components/base/BaseSelect.vue | 0 .../src/components/base/BaseSkeleton.vue | 0 .../src/components/base/BaseSlider.vue | 0 .../src/components/base/BaseSpin.vue | 0 .../src/components/base/BaseStat.vue | 0 .../src/components/base/BaseStatusPill.vue | 0 .../src/components/base/BaseStepper.vue | 0 .../src/components/base/BaseSurface.vue | 0 .../src/components/base/BaseSwitch.vue | 0 .../src/components/base/BaseTable.vue | 0 .../src/components/base/BaseTabs.vue | 0 .../frontend}/src/components/base/BaseTag.vue | 0 .../src/components/base/BaseTagsInput.vue | 0 .../src/components/base/BaseTextarea.vue | 0 .../src/components/base/BaseTimePicker.vue | 0 .../src/components/base/BaseTimeline.vue | 0 .../components/base/BaseToastContainer.vue | 0 .../src/components/base/BaseToolbarButton.vue | 0 .../src/components/base/BaseTooltip.vue | 0 .../components/base/BaseTooltipProvider.vue | 0 .../src/components/base/BaseTour.vue | 0 .../src/components/base/BaseTransfer.vue | 0 .../src/components/base/BaseTree.vue | 0 .../src/components/base/BaseTreeSelect.vue | 0 .../src/components/base/BaseUpload.vue | 0 .../src/components/base/BaseVirtualList.vue | 0 .../src/components/base/BaseWatermark.vue | 0 .../src/components/base/ImageModal.vue | 0 .../frontend}/src/components/base/index.ts | 0 .../frontend}/src/components/base/registry.ts | 0 .../app/dashboard/ErrorDistributionCard.vue | 0 .../app/dashboard/KnowledgeCompareCard.vue | 0 .../app/dashboard/KnowledgeRadarCard.vue | 0 .../app/dashboard/LearningTrendCard.vue | 0 .../app/dashboard/PriorityBarCard.vue | 0 .../features/app/dashboard/StatCard.vue | 0 .../app/dashboard/SummaryStatsChartCard.vue | 0 .../app/error-bank/ErrorBankToolbar.vue | 0 .../app/error-bank/ErrorLearningAside.vue | 0 .../error-bank/ErrorQuestionDetailPanel.vue | 0 .../error-bank/ErrorQuestionFinderAside.vue | 0 .../app/error-bank/ErrorQuestionListItem.vue | 0 .../app/error-bank/ErrorQuestionListPanel.vue | 0 .../features/app/layout/ChatSearchDialog.vue | 0 .../features/app/layout/ContentPanel.vue | 0 .../features/app/layout/PanelStepTabs.vue | 0 .../features/app/layout/SidebarNav.vue | 0 .../app/layout/WorkspaceBackground.vue | 0 .../features/app/notes/NoteDetailPanel.vue | 0 .../features/app/notes/NoteInsightAside.vue | 0 .../features/app/notes/NoteListPanel.vue | 0 .../features/app/notes/NoteToolbar.vue | 0 .../features/app/question/EditNoteDialog.vue | 0 .../features/app/question/QuestionCard.vue | 0 .../app/question/QuestionDetailModal.vue | 0 .../features/app/question/QuestionItem.vue | 0 .../app/question/QuestionItemSkeleton.vue | 0 .../features/app/question/QuestionList.vue | 0 .../features/app/review/AiAnalysisModal.vue | 0 .../features/app/settings/ProviderDialog.vue | 0 .../features/app/settings/ProviderSection.vue | 0 .../app/shared/ViewSettingsPopover.vue | 0 .../features/app/workspace/ActionBar.vue | 0 .../app/workspace/AnswerInputModal.vue | 0 .../features/app/workspace/ErasePreview.vue | 0 .../features/app/workspace/FileList.vue | 0 .../features/app/workspace/FileUploader.vue | 0 .../app/workspace/ModelProviderSelect.vue | 0 .../features/app/workspace/OcrPreview.vue | 0 .../features/app/workspace/ReviewStage.vue | 0 .../features/app/workspace/SelectionPanel.vue | 0 .../features/app/workspace/SplitLoading.vue | 0 .../features/app/workspace/StatusBar.vue | 0 .../features/app/workspace/StepIndicator.vue | 0 .../features/app/workspace/UploadStage.vue | 0 .../features/auth/ForgotPasswordModal.vue | 0 .../components/features/home/FeatureCard.vue | 0 .../components/features/home/HomeFooter.vue | 0 .../components/features/home/HomeHeader.vue | 0 .../src/components/features/home/HomePill.vue | 0 .../components/features/home/HomeSideNav.vue | 0 .../components/features/home/WorkflowStep.vue | 0 .../src/composables/useAiChatSessions.ts | 0 .../frontend}/src/composables/useAuth.ts | 0 .../src/composables/useChatSession.ts | 0 .../src/composables/useClickOutside.ts | 0 .../src/composables/useDropdownPosition.ts | 0 .../src/composables/useErrorBankActions.ts | 0 .../src/composables/useErrorBankQuery.ts | 0 .../src/composables/useErrorBankStats.ts | 0 .../src/composables/useFileUpload.ts | 0 .../src/composables/useImageModal.ts | 0 .../frontend}/src/composables/useOverlay.ts | 0 .../src/composables/usePageTransition.ts | 0 .../src/composables/usePaginatedList.ts | 0 .../frontend}/src/composables/useProjects.ts | 0 .../src/composables/useQuestionList.ts | 0 .../src/composables/useSelectableList.ts | 0 .../src/composables/useSidebarIndicator.ts | 0 .../src/composables/useSplitPipeline.ts | 0 .../src/composables/useSystemStatus.ts | 0 .../frontend}/src/composables/useTheme.ts | 0 .../frontend}/src/composables/useToast.ts | 0 .../src/composables/useWorkspaceNav.ts | 0 .../src/composables/useWorkspaceToast.ts | 0 {frontend => apps/frontend}/src/main.ts | 0 .../frontend}/src/router/index.ts | 0 .../frontend}/src/shims-vue.d.ts | 0 {frontend => apps/frontend}/src/style.css | 0 .../frontend}/src/types/domain.ts | 0 {frontend => apps/frontend}/src/utils/file.ts | 0 .../frontend}/src/utils/format.ts | 0 {frontend => apps/frontend}/src/utils/html.ts | 0 {frontend => apps/frontend}/src/utils/id.ts | 0 .../frontend}/src/utils/index.ts | 0 .../frontend}/src/utils/markdown.ts | 0 .../frontend}/src/utils/mathjax.ts | 0 {frontend => apps/frontend}/src/utils/note.ts | 0 .../frontend}/src/utils/question.ts | 0 .../frontend}/src/utils/scale.ts | 0 .../frontend}/src/views/HomeView.vue | 0 .../frontend}/src/views/app/AppLayout.vue | 0 .../frontend}/src/views/app/ChatPageView.vue | 0 .../frontend}/src/views/app/ChatView.vue | 0 .../src/views/app/ComponentPreviewView.vue | 0 .../frontend}/src/views/app/DashboardView.vue | 0 .../frontend}/src/views/app/ErrorBankView.vue | 0 .../frontend}/src/views/app/NoteView.vue | 0 .../frontend}/src/views/app/ReviewView.vue | 0 .../frontend}/src/views/app/SearchHubView.vue | 0 .../frontend}/src/views/app/SettingsView.vue | 0 .../src/views/app/SplitHistoryView.vue | 0 .../frontend}/src/views/app/WorkspaceView.vue | 0 .../frontend}/src/views/auth/AuthLayout.vue | 0 .../frontend}/src/views/auth/LoginView.vue | 0 .../frontend}/src/views/auth/RegisterView.vue | 0 .../frontend}/src/views/home/HomeDemo.vue | 0 .../frontend}/src/views/home/HomeFeatures.vue | 0 .../frontend}/src/views/home/HomeHero.vue | 0 .../frontend}/src/views/home/HomeWorkflow.vue | 0 {frontend => apps/frontend}/src/vite-env.d.ts | 0 .../frontend}/tailwind.config.ts | 0 {frontend => apps/frontend}/tsconfig.json | 0 {frontend => apps/frontend}/vite.config.ts | 0 {ui-showcase => apps/ui-showcase}/.gitignore | 0 {ui-showcase => apps/ui-showcase}/README.md | 4 +- {ui-showcase => apps/ui-showcase}/index.html | 0 .../ui-showcase}/package.json | 0 .../ui-showcase}/public/favicon.svg | 0 .../ui-showcase}/public/logo.svg | 0 {ui-showcase => apps/ui-showcase}/src/App.vue | 4 +- .../ui-showcase}/src/api-data/data.ts | 2 +- .../ui-showcase}/src/api-data/forms.ts | 2 +- .../ui-showcase}/src/api-data/nav.ts | 2 +- .../ui-showcase}/src/api-data/overlay.ts | 2 +- .../ui-showcase}/src/api-docs.ts | 0 .../ui-showcase}/src/api-types.ts | 0 .../ui-showcase}/src/catalog.ts | 0 .../ui-showcase}/src/components/ApiTable.vue | 0 .../src/components/CatalogNav.vue | 0 .../ui-showcase}/src/components/DemoBlock.vue | 0 .../ui-showcase}/src/components/DocTip.vue | 0 {ui-showcase => apps/ui-showcase}/src/main.ts | 0 .../ui-showcase}/src/pages/AccordionPage.vue | 0 .../ui-showcase}/src/pages/AffixPage.vue | 0 .../ui-showcase}/src/pages/AlertPage.vue | 0 .../ui-showcase}/src/pages/AnchorPage.vue | 0 .../src/pages/AvatarGroupPage.vue | 0 .../ui-showcase}/src/pages/AvatarPage.vue | 0 .../ui-showcase}/src/pages/BackTopPage.vue | 0 .../ui-showcase}/src/pages/BreadcrumbPage.vue | 0 .../src/pages/ButtonGroupPage.vue | 0 .../ui-showcase}/src/pages/ButtonPage.vue | 0 .../ui-showcase}/src/pages/CalendarPage.vue | 0 .../ui-showcase}/src/pages/CardPage.vue | 0 .../ui-showcase}/src/pages/CarouselPage.vue | 0 .../ui-showcase}/src/pages/CascaderPage.vue | 0 .../src/pages/CheckboxGroupPage.vue | 0 .../ui-showcase}/src/pages/CheckboxPage.vue | 0 .../src/pages/CircleProgressPage.vue | 0 .../ui-showcase}/src/pages/CodePage.vue | 0 .../src/pages/ColorPickerPage.vue | 0 .../src/pages/CommandPalettePage.vue | 0 .../ui-showcase}/src/pages/CountdownPage.vue | 0 .../src/pages/DateRangePickerPage.vue | 0 .../ui-showcase}/src/pages/DateTimePage.vue | 0 .../src/pages/DescriptionsPage.vue | 0 .../ui-showcase}/src/pages/DividerPage.vue | 0 .../ui-showcase}/src/pages/DrawerPage.vue | 0 .../ui-showcase}/src/pages/EllipsisPage.vue | 0 .../ui-showcase}/src/pages/EmptyStatePage.vue | 0 .../src/pages/FloatButtonPage.vue | 0 .../ui-showcase}/src/pages/FormPage.vue | 0 .../ui-showcase}/src/pages/GuideStartPage.vue | 0 .../ui-showcase}/src/pages/GuideThemePage.vue | 4 +- .../ui-showcase}/src/pages/HighlightPage.vue | 0 .../ui-showcase}/src/pages/ImagePage.vue | 0 .../src/pages/InfiniteScrollPage.vue | 0 .../ui-showcase}/src/pages/InputPage.vue | 0 .../ui-showcase}/src/pages/LinkPage.vue | 0 .../ui-showcase}/src/pages/ListPage.vue | 0 .../ui-showcase}/src/pages/LoadingBarPage.vue | 0 .../ui-showcase}/src/pages/LoadingPage.vue | 0 .../ui-showcase}/src/pages/MarqueePage.vue | 0 .../ui-showcase}/src/pages/MediaPage.vue | 0 .../ui-showcase}/src/pages/MentionPage.vue | 0 .../ui-showcase}/src/pages/MenuPage.vue | 0 .../ui-showcase}/src/pages/ModalPage.vue | 0 .../src/pages/NumberAnimationPage.vue | 0 .../src/pages/NumberInputPage.vue | 0 .../ui-showcase}/src/pages/OverviewPage.vue | 2 +- .../ui-showcase}/src/pages/PaginationPage.vue | 0 .../ui-showcase}/src/pages/PanelPage.vue | 0 .../ui-showcase}/src/pages/PatternsPage.vue | 0 .../ui-showcase}/src/pages/PinInputPage.vue | 0 .../ui-showcase}/src/pages/PlaygroundPage.vue | 0 .../ui-showcase}/src/pages/PopoverPage.vue | 0 .../ui-showcase}/src/pages/ProgressPage.vue | 0 .../ui-showcase}/src/pages/RadioPage.vue | 0 .../ui-showcase}/src/pages/RatePage.vue | 0 .../ui-showcase}/src/pages/ResizablePage.vue | 0 .../ui-showcase}/src/pages/ResultPage.vue | 0 .../ui-showcase}/src/pages/RibbonPage.vue | 0 .../ui-showcase}/src/pages/ScrollbarPage.vue | 0 .../ui-showcase}/src/pages/SelectPage.vue | 0 .../ui-showcase}/src/pages/SkeletonPage.vue | 0 .../ui-showcase}/src/pages/SliderPage.vue | 0 .../ui-showcase}/src/pages/SpinPage.vue | 0 .../ui-showcase}/src/pages/StatPage.vue | 0 .../ui-showcase}/src/pages/StepperPage.vue | 0 .../ui-showcase}/src/pages/SwitchPage.vue | 0 .../ui-showcase}/src/pages/TablePage.vue | 0 .../ui-showcase}/src/pages/TabsPage.vue | 0 .../ui-showcase}/src/pages/TagPage.vue | 0 .../ui-showcase}/src/pages/TagsInputPage.vue | 0 .../ui-showcase}/src/pages/TimelinePage.vue | 0 .../ui-showcase}/src/pages/ToastPage.vue | 0 .../ui-showcase}/src/pages/TooltipPage.vue | 0 .../ui-showcase}/src/pages/TourPage.vue | 0 .../ui-showcase}/src/pages/TransferPage.vue | 0 .../ui-showcase}/src/pages/TreePage.vue | 0 .../ui-showcase}/src/pages/TreeSelectPage.vue | 0 .../ui-showcase}/src/pages/UploadPage.vue | 0 .../src/pages/VirtualListPage.vue | 0 .../ui-showcase}/src/pages/WatermarkPage.vue | 0 .../ui-showcase}/tailwind.config.ts | 0 .../ui-showcase}/tsconfig.json | 0 .../ui-showcase}/vite.config.ts | 6 +- docker-compose.yml | 2 +- .../readme/AI\346\211\276\351\242\230.gif" | Bin .../Provider\351\205\215\347\275\256.gif" | Bin ...3\351\242\230\345\210\207\346\215\242.gif" | Bin ...3\345\275\225\350\277\207\347\250\213.gif" | Bin ...6\345\211\262\350\277\207\347\250\213.gif" | Bin ...0\345\267\245\344\275\234\345\217\260.png" | Bin {deploy => docs/deploy}/1panel.md | 4 +- {deploy => docs/deploy}/cicd.md | 0 {deploy => docs/deploy}/nginx.conf | 0 ...50\351\207\212\350\247\204\345\210\231.md" | 0 ...15\347\253\257\350\247\204\345\210\231.md" | 24 ++--- ...16\347\253\257\350\247\204\345\210\231.md" | 28 +++--- ...66\346\236\204\350\247\204\345\210\231.md" | 22 ++--- ...13\350\257\225\350\247\204\345\210\231.md" | 0 ...01\347\250\213\350\247\204\345\210\231.md" | 0 ...14\346\255\245\350\247\204\345\210\231.md" | 0 ...75\344\273\244\347\264\242\345\274\225.md" | 0 ...57\345\212\250\350\247\204\345\210\231.md" | 16 ++-- ...20\344\272\244\350\247\204\345\210\231.md" | 0 ...04\345\273\272\350\247\204\345\210\231.md" | 30 ++++++ ...15\347\275\256\350\247\204\345\210\231.md" | 8 +- .../exams/image/test2.jpg | Bin .../exams/image/test3.jpg | Bin .../exams/image/test5.jpg | Bin .../exams/image/test6.jpg | Bin ...7\347\254\254\344\270\200\351\235\242.jpg" | Bin ...7\347\254\254\344\272\214\351\235\242.jpg" | Bin ...7\345\215\267\347\211\210\357\274\211.pdf" | Bin ...7\345\215\267\347\211\210\357\274\211.pdf" | Bin .../exams/pdf/test4.pdf | Bin ...04\345\273\272\350\247\204\345\210\231.md" | 30 ------ 484 files changed, 239 insertions(+), 244 deletions(-) rename {backend => apps/backend}/.env.example (96%) rename {backend => apps/backend}/agents/__init__.py (100%) rename {backend => apps/backend}/agents/error_correction/__init__.py (100%) rename {backend => apps/backend}/agents/error_correction/agent.py (100%) rename {backend => apps/backend}/agents/error_correction/prompts.py (100%) rename {backend => apps/backend}/agents/error_correction/schemas.py (100%) rename {backend => apps/backend}/agents/error_correction/tools/__init__.py (100%) rename {backend => apps/backend}/agents/error_correction/tools/file_tools.py (100%) rename {backend => apps/backend}/agents/error_correction/tools/question_tools.py (100%) rename {backend => apps/backend}/agents/note/__init__.py (100%) rename {backend => apps/backend}/agents/note/agent.py (100%) rename {backend => apps/backend}/agents/note/prompts.py (100%) rename {backend => apps/backend}/agents/note/schemas.py (100%) rename {backend => apps/backend}/agents/solve/__init__.py (100%) rename {backend => apps/backend}/agents/solve/agent.py (100%) rename {backend => apps/backend}/agents/solve/prompts.py (100%) rename {backend => apps/backend}/agents/solve/schemas.py (100%) rename {backend => apps/backend}/agents/teach/__init__.py (100%) rename {backend => apps/backend}/agents/teach/agent.py (100%) rename {backend => apps/backend}/agents/teach/prompts.py (100%) rename {backend => apps/backend}/core/__init__.py (100%) rename {backend => apps/backend}/core/config.py (99%) rename {backend => apps/backend}/core/llm.py (100%) rename {backend => apps/backend}/core/mail.py (100%) rename {backend => apps/backend}/core/model_selection.py (100%) rename {backend => apps/backend}/core/quota.py (100%) rename {backend => apps/backend}/core/reasoning.py (100%) rename {backend => apps/backend}/core/state.py (100%) rename {backend => apps/backend}/core/workflow_run_store.py (100%) rename {backend => apps/backend}/db/__init__.py (100%) rename {backend => apps/backend}/db/crud/__init__.py (100%) rename {backend => apps/backend}/db/crud/chat.py (100%) rename {backend => apps/backend}/db/crud/devices.py (100%) rename {backend => apps/backend}/db/crud/email_verification.py (100%) rename {backend => apps/backend}/db/crud/notes.py (100%) rename {backend => apps/backend}/db/crud/projects.py (100%) rename {backend => apps/backend}/db/crud/providers.py (100%) rename {backend => apps/backend}/db/crud/questions.py (100%) rename {backend => apps/backend}/db/crud/review.py (100%) rename {backend => apps/backend}/db/crud/split_records.py (100%) rename {backend => apps/backend}/db/crud/stats.py (100%) rename {backend => apps/backend}/db/crud/tags.py (100%) rename {backend => apps/backend}/db/crud/users.py (100%) rename {backend => apps/backend}/db/crud/workflow_runs.py (100%) rename {backend => apps/backend}/db/migrate.py (100%) rename {backend => apps/backend}/db/models.py (100%) rename {backend => apps/backend}/gunicorn.conf.py (100%) rename {backend => apps/backend}/package-lock.json (100%) rename {backend => apps/backend}/pipeline/paddleocr_client.py (100%) rename {backend => apps/backend}/pipeline/utils.py (99%) rename {backend => apps/backend}/pipeline/workflow.py (100%) rename {backend => apps/backend}/postgresql_schema.sql (99%) rename {backend => apps/backend}/routes/__init__.py (100%) rename {backend => apps/backend}/routes/auth.py (100%) rename {backend => apps/backend}/routes/chat.py (100%) rename {backend => apps/backend}/routes/device.py (100%) rename {backend => apps/backend}/routes/notes.py (100%) rename {backend => apps/backend}/routes/projects.py (100%) rename {backend => apps/backend}/routes/questions.py (100%) rename {backend => apps/backend}/routes/settings.py (100%) rename {backend => apps/backend}/routes/stats.py (100%) rename {backend => apps/backend}/routes/upload.py (100%) rename {backend => apps/backend}/tests/README.md (89%) rename {backend => apps/backend}/tests/__init__.py (100%) rename {backend => apps/backend}/tests/conftest.py (90%) rename {backend => apps/backend}/tests/fixtures/sample_ocr_data.json (100%) rename {backend => apps/backend}/tests/test_chat_crud.py (100%) rename {backend => apps/backend}/tests/test_chat_routes.py (100%) rename {backend => apps/backend}/tests/test_correct_node.py (100%) rename {backend => apps/backend}/tests/test_crud.py (100%) rename {backend => apps/backend}/tests/test_eraser_inference.py (100%) rename {backend => apps/backend}/tests/test_export.py (100%) rename {backend => apps/backend}/tests/test_migrate_and_delete_question.py (100%) rename {backend => apps/backend}/tests/test_note_agent.py (100%) rename {backend => apps/backend}/tests/test_ocr_api.py (98%) rename {backend => apps/backend}/tests/test_project_crud.py (100%) rename {backend => apps/backend}/tests/test_question_tools.py (100%) rename {backend => apps/backend}/tests/test_schemas.py (100%) rename {backend => apps/backend}/tests/test_solve_integration.py (100%) rename {backend => apps/backend}/tests/test_solve_schemas.py (100%) rename {backend => apps/backend}/tests/test_split_integration.py (100%) rename {backend => apps/backend}/tests/test_structured_output_modes.py (100%) rename {backend => apps/backend}/tests/test_teach_agent.py (100%) rename {backend => apps/backend}/tests/test_utils.py (100%) rename {backend => apps/backend}/tests/test_web_helpers.py (100%) rename {backend => apps/backend}/tests/test_web_routes.py (100%) rename {backend => apps/backend}/tests/test_workflow_helpers.py (100%) rename {backend => apps/backend}/text_eraser_model/__init__.py (100%) rename {backend => apps/backend}/text_eraser_model/blocks.py (100%) rename {backend => apps/backend}/text_eraser_model/inference.py (100%) rename {backend => apps/backend}/text_eraser_model/model.py (100%) rename {backend => apps/backend}/text_eraser_model/test_erase.py (97%) rename {backend => apps/backend}/text_eraser_model/weight/best.pth (100%) rename {backend => apps/backend}/web_app.py (97%) rename {backend => apps/backend}/wsgi.py (100%) rename {frontend => apps/frontend}/.gitignore (100%) rename {frontend => apps/frontend}/.vscode/extensions.json (100%) rename {frontend => apps/frontend}/app.html (100%) rename {frontend => apps/frontend}/package-lock.json (100%) rename {frontend => apps/frontend}/package.json (100%) rename {frontend => apps/frontend}/public/favicon.svg (100%) rename {frontend => apps/frontend}/public/logo.svg (100%) rename {frontend => apps/frontend}/src/App.vue (100%) rename {frontend => apps/frontend}/src/__tests__/README.md (100%) rename {frontend => apps/frontend}/src/__tests__/api.test.ts (100%) rename {frontend => apps/frontend}/src/__tests__/chat-page-model-selector.test.ts (100%) rename {frontend => apps/frontend}/src/__tests__/state.test.ts (100%) rename {frontend => apps/frontend}/src/__tests__/utils.test.ts (100%) rename {frontend => apps/frontend}/src/api/auth.ts (100%) rename {frontend => apps/frontend}/src/api/chat.ts (100%) rename {frontend => apps/frontend}/src/api/client.ts (100%) rename {frontend => apps/frontend}/src/api/config.ts (100%) rename {frontend => apps/frontend}/src/api/index.ts (100%) rename {frontend => apps/frontend}/src/api/notes.ts (100%) rename {frontend => apps/frontend}/src/api/projects.ts (100%) rename {frontend => apps/frontend}/src/api/questions.ts (100%) rename {frontend => apps/frontend}/src/api/splitRecords.ts (100%) rename {frontend => apps/frontend}/src/api/upload.ts (100%) rename {frontend => apps/frontend}/src/assets/deepseek.svg (100%) rename {frontend => apps/frontend}/src/assets/ernie.svg (100%) rename {frontend => apps/frontend}/src/assets/provider-anthropic.svg (100%) rename {frontend => apps/frontend}/src/assets/provider-openai.svg (100%) rename {frontend => apps/frontend}/src/assets/provider-paddleocr.svg (100%) rename {frontend => apps/frontend}/src/components/base/BaseAccordion.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseAffix.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseAlert.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseAnchor.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseAvatar.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseAvatarGroup.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseBackTop.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseBadge.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseBreadcrumb.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseBreadcrumbItem.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseButton.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseButtonGroup.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCalendar.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCard.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCarousel.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCascader.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCheckbox.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCheckboxGroup.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCircleProgress.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCodeBlock.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseColorPicker.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCombobox.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCommandPalette.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCopyButton.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseCountdown.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseDataTable.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseDatePicker.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseDateRangePicker.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseDescriptions.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseDivider.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseDrawer.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseDropdown.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseEllipsis.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseEmptyState.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseFieldMessage.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseFloatButton.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseForm.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseFormItem.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseHighlight.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseImage.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseInfiniteScroll.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseInput.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseKbd.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseLink.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseListGroup.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseListItem.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseLoading.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseLoadingBar.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseLogo.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseMarquee.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseMention.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseMenu.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseModal.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseNumberAnimation.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseNumberInput.vue (100%) rename {frontend => apps/frontend}/src/components/base/BasePagination.vue (100%) rename {frontend => apps/frontend}/src/components/base/BasePanel.vue (100%) rename {frontend => apps/frontend}/src/components/base/BasePanelTitle.vue (100%) rename {frontend => apps/frontend}/src/components/base/BasePinInput.vue (100%) rename {frontend => apps/frontend}/src/components/base/BasePopconfirm.vue (100%) rename {frontend => apps/frontend}/src/components/base/BasePopover.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseProgress.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseRadio.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseRadioGroup.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseRate.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseResizablePanels.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseResult.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseRibbon.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseScrollbar.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseSearchInput.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseSearchableSelect.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseSegmented.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseSelect.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseSkeleton.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseSlider.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseSpin.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseStat.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseStatusPill.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseStepper.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseSurface.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseSwitch.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTable.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTabs.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTag.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTagsInput.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTextarea.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTimePicker.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTimeline.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseToastContainer.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseToolbarButton.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTooltip.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTooltipProvider.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTour.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTransfer.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTree.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseTreeSelect.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseUpload.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseVirtualList.vue (100%) rename {frontend => apps/frontend}/src/components/base/BaseWatermark.vue (100%) rename {frontend => apps/frontend}/src/components/base/ImageModal.vue (100%) rename {frontend => apps/frontend}/src/components/base/index.ts (100%) rename {frontend => apps/frontend}/src/components/base/registry.ts (100%) rename {frontend => apps/frontend}/src/components/features/app/dashboard/ErrorDistributionCard.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/dashboard/KnowledgeCompareCard.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/dashboard/KnowledgeRadarCard.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/dashboard/LearningTrendCard.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/dashboard/PriorityBarCard.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/dashboard/StatCard.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/dashboard/SummaryStatsChartCard.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/error-bank/ErrorBankToolbar.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/error-bank/ErrorLearningAside.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/error-bank/ErrorQuestionDetailPanel.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/error-bank/ErrorQuestionFinderAside.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/error-bank/ErrorQuestionListItem.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/error-bank/ErrorQuestionListPanel.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/layout/ChatSearchDialog.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/layout/ContentPanel.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/layout/PanelStepTabs.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/layout/SidebarNav.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/layout/WorkspaceBackground.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/notes/NoteDetailPanel.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/notes/NoteInsightAside.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/notes/NoteListPanel.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/notes/NoteToolbar.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/question/EditNoteDialog.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/question/QuestionCard.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/question/QuestionDetailModal.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/question/QuestionItem.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/question/QuestionItemSkeleton.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/question/QuestionList.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/review/AiAnalysisModal.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/settings/ProviderDialog.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/settings/ProviderSection.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/shared/ViewSettingsPopover.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/ActionBar.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/AnswerInputModal.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/ErasePreview.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/FileList.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/FileUploader.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/ModelProviderSelect.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/OcrPreview.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/ReviewStage.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/SelectionPanel.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/SplitLoading.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/StatusBar.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/StepIndicator.vue (100%) rename {frontend => apps/frontend}/src/components/features/app/workspace/UploadStage.vue (100%) rename {frontend => apps/frontend}/src/components/features/auth/ForgotPasswordModal.vue (100%) rename {frontend => apps/frontend}/src/components/features/home/FeatureCard.vue (100%) rename {frontend => apps/frontend}/src/components/features/home/HomeFooter.vue (100%) rename {frontend => apps/frontend}/src/components/features/home/HomeHeader.vue (100%) rename {frontend => apps/frontend}/src/components/features/home/HomePill.vue (100%) rename {frontend => apps/frontend}/src/components/features/home/HomeSideNav.vue (100%) rename {frontend => apps/frontend}/src/components/features/home/WorkflowStep.vue (100%) rename {frontend => apps/frontend}/src/composables/useAiChatSessions.ts (100%) rename {frontend => apps/frontend}/src/composables/useAuth.ts (100%) rename {frontend => apps/frontend}/src/composables/useChatSession.ts (100%) rename {frontend => apps/frontend}/src/composables/useClickOutside.ts (100%) rename {frontend => apps/frontend}/src/composables/useDropdownPosition.ts (100%) rename {frontend => apps/frontend}/src/composables/useErrorBankActions.ts (100%) rename {frontend => apps/frontend}/src/composables/useErrorBankQuery.ts (100%) rename {frontend => apps/frontend}/src/composables/useErrorBankStats.ts (100%) rename {frontend => apps/frontend}/src/composables/useFileUpload.ts (100%) rename {frontend => apps/frontend}/src/composables/useImageModal.ts (100%) rename {frontend => apps/frontend}/src/composables/useOverlay.ts (100%) rename {frontend => apps/frontend}/src/composables/usePageTransition.ts (100%) rename {frontend => apps/frontend}/src/composables/usePaginatedList.ts (100%) rename {frontend => apps/frontend}/src/composables/useProjects.ts (100%) rename {frontend => apps/frontend}/src/composables/useQuestionList.ts (100%) rename {frontend => apps/frontend}/src/composables/useSelectableList.ts (100%) rename {frontend => apps/frontend}/src/composables/useSidebarIndicator.ts (100%) rename {frontend => apps/frontend}/src/composables/useSplitPipeline.ts (100%) rename {frontend => apps/frontend}/src/composables/useSystemStatus.ts (100%) rename {frontend => apps/frontend}/src/composables/useTheme.ts (100%) rename {frontend => apps/frontend}/src/composables/useToast.ts (100%) rename {frontend => apps/frontend}/src/composables/useWorkspaceNav.ts (100%) rename {frontend => apps/frontend}/src/composables/useWorkspaceToast.ts (100%) rename {frontend => apps/frontend}/src/main.ts (100%) rename {frontend => apps/frontend}/src/router/index.ts (100%) rename {frontend => apps/frontend}/src/shims-vue.d.ts (100%) rename {frontend => apps/frontend}/src/style.css (100%) rename {frontend => apps/frontend}/src/types/domain.ts (100%) rename {frontend => apps/frontend}/src/utils/file.ts (100%) rename {frontend => apps/frontend}/src/utils/format.ts (100%) rename {frontend => apps/frontend}/src/utils/html.ts (100%) rename {frontend => apps/frontend}/src/utils/id.ts (100%) rename {frontend => apps/frontend}/src/utils/index.ts (100%) rename {frontend => apps/frontend}/src/utils/markdown.ts (100%) rename {frontend => apps/frontend}/src/utils/mathjax.ts (100%) rename {frontend => apps/frontend}/src/utils/note.ts (100%) rename {frontend => apps/frontend}/src/utils/question.ts (100%) rename {frontend => apps/frontend}/src/utils/scale.ts (100%) rename {frontend => apps/frontend}/src/views/HomeView.vue (100%) rename {frontend => apps/frontend}/src/views/app/AppLayout.vue (100%) rename {frontend => apps/frontend}/src/views/app/ChatPageView.vue (100%) rename {frontend => apps/frontend}/src/views/app/ChatView.vue (100%) rename {frontend => apps/frontend}/src/views/app/ComponentPreviewView.vue (100%) rename {frontend => apps/frontend}/src/views/app/DashboardView.vue (100%) rename {frontend => apps/frontend}/src/views/app/ErrorBankView.vue (100%) rename {frontend => apps/frontend}/src/views/app/NoteView.vue (100%) rename {frontend => apps/frontend}/src/views/app/ReviewView.vue (100%) rename {frontend => apps/frontend}/src/views/app/SearchHubView.vue (100%) rename {frontend => apps/frontend}/src/views/app/SettingsView.vue (100%) rename {frontend => apps/frontend}/src/views/app/SplitHistoryView.vue (100%) rename {frontend => apps/frontend}/src/views/app/WorkspaceView.vue (100%) rename {frontend => apps/frontend}/src/views/auth/AuthLayout.vue (100%) rename {frontend => apps/frontend}/src/views/auth/LoginView.vue (100%) rename {frontend => apps/frontend}/src/views/auth/RegisterView.vue (100%) rename {frontend => apps/frontend}/src/views/home/HomeDemo.vue (100%) rename {frontend => apps/frontend}/src/views/home/HomeFeatures.vue (100%) rename {frontend => apps/frontend}/src/views/home/HomeHero.vue (100%) rename {frontend => apps/frontend}/src/views/home/HomeWorkflow.vue (100%) rename {frontend => apps/frontend}/src/vite-env.d.ts (100%) rename {frontend => apps/frontend}/tailwind.config.ts (100%) rename {frontend => apps/frontend}/tsconfig.json (100%) rename {frontend => apps/frontend}/vite.config.ts (100%) rename {ui-showcase => apps/ui-showcase}/.gitignore (100%) rename {ui-showcase => apps/ui-showcase}/README.md (84%) rename {ui-showcase => apps/ui-showcase}/index.html (100%) rename {ui-showcase => apps/ui-showcase}/package.json (100%) rename {ui-showcase => apps/ui-showcase}/public/favicon.svg (100%) rename {ui-showcase => apps/ui-showcase}/public/logo.svg (100%) rename {ui-showcase => apps/ui-showcase}/src/App.vue (99%) rename {ui-showcase => apps/ui-showcase}/src/api-data/data.ts (99%) rename {ui-showcase => apps/ui-showcase}/src/api-data/forms.ts (99%) rename {ui-showcase => apps/ui-showcase}/src/api-data/nav.ts (99%) rename {ui-showcase => apps/ui-showcase}/src/api-data/overlay.ts (99%) rename {ui-showcase => apps/ui-showcase}/src/api-docs.ts (100%) rename {ui-showcase => apps/ui-showcase}/src/api-types.ts (100%) rename {ui-showcase => apps/ui-showcase}/src/catalog.ts (100%) rename {ui-showcase => apps/ui-showcase}/src/components/ApiTable.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/components/CatalogNav.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/components/DemoBlock.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/components/DocTip.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/main.ts (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/AccordionPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/AffixPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/AlertPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/AnchorPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/AvatarGroupPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/AvatarPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/BackTopPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/BreadcrumbPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ButtonGroupPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ButtonPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/CalendarPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/CardPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/CarouselPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/CascaderPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/CheckboxGroupPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/CheckboxPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/CircleProgressPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/CodePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ColorPickerPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/CommandPalettePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/CountdownPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/DateRangePickerPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/DateTimePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/DescriptionsPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/DividerPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/DrawerPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/EllipsisPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/EmptyStatePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/FloatButtonPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/FormPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/GuideStartPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/GuideThemePage.vue (97%) rename {ui-showcase => apps/ui-showcase}/src/pages/HighlightPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ImagePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/InfiniteScrollPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/InputPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/LinkPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ListPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/LoadingBarPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/LoadingPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/MarqueePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/MediaPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/MentionPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/MenuPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ModalPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/NumberAnimationPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/NumberInputPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/OverviewPage.vue (99%) rename {ui-showcase => apps/ui-showcase}/src/pages/PaginationPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/PanelPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/PatternsPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/PinInputPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/PlaygroundPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/PopoverPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ProgressPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/RadioPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/RatePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ResizablePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ResultPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/RibbonPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ScrollbarPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/SelectPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/SkeletonPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/SliderPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/SpinPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/StatPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/StepperPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/SwitchPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/TablePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/TabsPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/TagPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/TagsInputPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/TimelinePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/ToastPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/TooltipPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/TourPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/TransferPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/TreePage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/TreeSelectPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/UploadPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/VirtualListPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/src/pages/WatermarkPage.vue (100%) rename {ui-showcase => apps/ui-showcase}/tailwind.config.ts (100%) rename {ui-showcase => apps/ui-showcase}/tsconfig.json (100%) rename {ui-showcase => apps/ui-showcase}/vite.config.ts (81%) rename "assets/readme/AI\346\211\276\351\242\230.gif" => "docs/assets/readme/AI\346\211\276\351\242\230.gif" (100%) rename "assets/readme/Provider\351\205\215\347\275\256.gif" => "docs/assets/readme/Provider\351\205\215\347\275\256.gif" (100%) rename "assets/readme/\344\270\273\351\242\230\345\210\207\346\215\242.gif" => "docs/assets/readme/\344\270\273\351\242\230\345\210\207\346\215\242.gif" (100%) rename "assets/readme/\347\231\273\345\275\225\350\277\207\347\250\213.gif" => "docs/assets/readme/\347\231\273\345\275\225\350\277\207\347\250\213.gif" (100%) rename "assets/readme/\347\254\224\350\256\260\345\210\206\345\211\262\350\277\207\347\250\213.gif" => "docs/assets/readme/\347\254\224\350\256\260\345\210\206\345\211\262\350\277\207\347\250\213.gif" (100%) rename "assets/readme/\351\224\231\351\242\230\345\267\245\344\275\234\345\217\260.png" => "docs/assets/readme/\351\224\231\351\242\230\345\267\245\344\275\234\345\217\260.png" (100%) rename {deploy => docs/deploy}/1panel.md (96%) rename {deploy => docs/deploy}/cicd.md (100%) rename {deploy => docs/deploy}/nginx.conf (100%) rename "rules/development/\344\273\243\347\240\201\346\263\250\351\207\212\350\247\204\345\210\231.md" => "docs/rules/development/\344\273\243\347\240\201\346\263\250\351\207\212\350\247\204\345\210\231.md" (100%) rename "rules/development/\345\211\215\347\253\257\350\247\204\345\210\231.md" => "docs/rules/development/\345\211\215\347\253\257\350\247\204\345\210\231.md" (69%) rename "rules/development/\345\220\216\347\253\257\350\247\204\345\210\231.md" => "docs/rules/development/\345\220\216\347\253\257\350\247\204\345\210\231.md" (77%) rename "rules/development/\346\236\266\346\236\204\350\247\204\345\210\231.md" => "docs/rules/development/\346\236\266\346\236\204\350\247\204\345\210\231.md" (54%) rename "rules/development/\346\265\213\350\257\225\350\247\204\345\210\231.md" => "docs/rules/development/\346\265\213\350\257\225\350\247\204\345\210\231.md" (100%) rename "rules/workflow/\345\215\217\344\275\234\346\217\220\344\272\244\346\265\201\347\250\213\350\247\204\345\210\231.md" => "docs/rules/workflow/\345\215\217\344\275\234\346\217\220\344\272\244\346\265\201\347\250\213\350\247\204\345\210\231.md" (100%) rename "rules/workflow/\345\217\230\346\233\264\345\220\214\346\255\245\350\247\204\345\210\231.md" => "docs/rules/workflow/\345\217\230\346\233\264\345\220\214\346\255\245\350\247\204\345\210\231.md" (100%) rename "rules/workflow/\345\270\270\347\224\250\345\221\275\344\273\244\347\264\242\345\274\225.md" => "docs/rules/workflow/\345\270\270\347\224\250\345\221\275\344\273\244\347\264\242\345\274\225.md" (100%) rename "rules/workflow/\345\274\200\345\217\221\345\220\257\345\212\250\350\247\204\345\210\231.md" => "docs/rules/workflow/\345\274\200\345\217\221\345\220\257\345\212\250\350\247\204\345\210\231.md" (75%) rename "rules/workflow/\346\217\220\344\272\244\350\247\204\345\210\231.md" => "docs/rules/workflow/\346\217\220\344\272\244\350\247\204\345\210\231.md" (100%) create mode 100644 "docs/rules/workflow/\346\265\213\350\257\225\346\236\204\345\273\272\350\247\204\345\210\231.md" rename "rules/workflow/\347\216\257\345\242\203\351\205\215\347\275\256\350\247\204\345\210\231.md" => "docs/rules/workflow/\347\216\257\345\242\203\351\205\215\347\275\256\350\247\204\345\210\231.md" (75%) rename {example_uploads => examples}/exams/image/test2.jpg (100%) rename {example_uploads => examples}/exams/image/test3.jpg (100%) rename {example_uploads => examples}/exams/image/test5.jpg (100%) rename {example_uploads => examples}/exams/image/test6.jpg (100%) rename "example_uploads/exams/image/\345\260\217\345\255\246\346\225\260\345\255\246\350\257\225\345\215\267\346\211\253\346\217\217\347\254\254\344\270\200\351\235\242.jpg" => "examples/exams/image/\345\260\217\345\255\246\346\225\260\345\255\246\350\257\225\345\215\267\346\211\253\346\217\217\347\254\254\344\270\200\351\235\242.jpg" (100%) rename "example_uploads/exams/image/\345\260\217\345\255\246\346\225\260\345\255\246\350\257\225\345\215\267\346\211\253\346\217\217\347\254\254\344\272\214\351\235\242.jpg" => "examples/exams/image/\345\260\217\345\255\246\346\225\260\345\255\246\350\257\225\345\215\267\346\211\253\346\217\217\347\254\254\344\272\214\351\235\242.jpg" (100%) rename "example_uploads/exams/pdf/2023\345\271\264\351\207\215\345\272\206\345\270\202\344\270\255\350\200\203\345\214\226\345\255\246\347\234\237\351\242\230\357\274\210B\345\215\267\357\274\211\357\274\210\345\216\237\345\215\267\347\211\210\357\274\211.pdf" => "examples/exams/pdf/2023\345\271\264\351\207\215\345\272\206\345\270\202\344\270\255\350\200\203\345\214\226\345\255\246\347\234\237\351\242\230\357\274\210B\345\215\267\357\274\211\357\274\210\345\216\237\345\215\267\347\211\210\357\274\211.pdf" (100%) rename "example_uploads/exams/pdf/2023\345\271\264\351\207\215\345\272\206\345\270\202\344\270\255\350\200\203\347\211\251\347\220\206\350\257\225\351\242\230\357\274\210A\345\215\267\357\274\211\357\274\210\345\216\237\345\215\267\347\211\210\357\274\211.pdf" => "examples/exams/pdf/2023\345\271\264\351\207\215\345\272\206\345\270\202\344\270\255\350\200\203\347\211\251\347\220\206\350\257\225\351\242\230\357\274\210A\345\215\267\357\274\211\357\274\210\345\216\237\345\215\267\347\211\210\357\274\211.pdf" (100%) rename {example_uploads => examples}/exams/pdf/test4.pdf (100%) delete mode 100644 "rules/workflow/\346\265\213\350\257\225\346\236\204\345\273\272\350\247\204\345\210\231.md" diff --git a/.dockerignore b/.dockerignore index b6d3e3e8..6c26c8db 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,14 +8,14 @@ **/*.pyo **/*.db **/.env -frontend -ui-showcase +apps/frontend +apps/ui-showcase node_modules -backend/runtime_data -backend/output -backend/workflow.log -example_uploads +apps/backend/runtime_data +apps/backend/output +apps/backend/workflow.log +examples outputs -assets -rules +docs/assets +docs/rules /error_correction diff --git a/.gitattributes b/.gitattributes index 02a36cfc..6183ebc5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ -backend/models/weight/*.pth filter=lfs diff=lfs merge=lfs -text -backend/text_eraser_model/weight/*.pth filter=lfs diff=lfs merge=lfs -text +apps/backend/models/weight/*.pth filter=lfs diff=lfs merge=lfs -text +apps/backend/text_eraser_model/weight/*.pth filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/backend-ci.yml b/.github/workflows/backend-ci.yml index 92b34622..cef42a16 100644 --- a/.github/workflows/backend-ci.yml +++ b/.github/workflows/backend-ci.yml @@ -3,7 +3,7 @@ name: Backend CI on: pull_request: paths: - - "backend/**" + - "apps/backend/**" - "requirements.txt" - "pyproject.toml" - "Dockerfile" @@ -15,7 +15,7 @@ on: branches: - main paths: - - "backend/**" + - "apps/backend/**" - "requirements.txt" - "pyproject.toml" - "Dockerfile" @@ -52,4 +52,4 @@ jobs: python -m pip install -r requirements.txt - name: Run backend tests - run: python -m pytest backend/tests -v + run: python -m pytest apps/backend/tests -v diff --git a/.github/workflows/frontend-ci.yml b/.github/workflows/frontend-ci.yml index 3538bcab..6a54c6b8 100644 --- a/.github/workflows/frontend-ci.yml +++ b/.github/workflows/frontend-ci.yml @@ -3,14 +3,14 @@ name: Frontend CI on: pull_request: paths: - - "frontend/**" + - "apps/frontend/**" - ".github/workflows/frontend-ci.yml" - ".github/workflows/release-ci-cd.yml" push: branches: - main paths: - - "frontend/**" + - "apps/frontend/**" - ".github/workflows/frontend-ci.yml" - ".github/workflows/release-ci-cd.yml" @@ -34,16 +34,16 @@ jobs: with: node-version: "22" cache: npm - cache-dependency-path: frontend/package-lock.json + cache-dependency-path: apps/frontend/package-lock.json - name: Install dependencies - working-directory: frontend + working-directory: apps/frontend run: npm ci - name: Run tests - working-directory: frontend + working-directory: apps/frontend run: npm test - name: Build production assets - working-directory: frontend + working-directory: apps/frontend run: npm run build diff --git a/.github/workflows/release-ci-cd.yml b/.github/workflows/release-ci-cd.yml index 718048a3..c4db2b8d 100644 --- a/.github/workflows/release-ci-cd.yml +++ b/.github/workflows/release-ci-cd.yml @@ -41,14 +41,14 @@ jobs: python -m pip install -r requirements.txt - name: Run backend tests - run: python -m pytest backend/tests -v + run: python -m pytest apps/backend/tests -v - name: Validate eraser model shell: bash run: | set -euo pipefail - test -s backend/text_eraser_model/weight/best.pth - test "$(wc -c < backend/text_eraser_model/weight/best.pth)" -gt 100000000 + test -s apps/backend/text_eraser_model/weight/best.pth + test "$(wc -c < apps/backend/text_eraser_model/weight/best.pth)" -gt 100000000 - name: Build production image run: docker build --tag error-correction-backend:${{ github.sha }} . @@ -70,29 +70,29 @@ jobs: with: node-version: "22" cache: npm - cache-dependency-path: frontend/package-lock.json + cache-dependency-path: apps/frontend/package-lock.json - name: Install dependencies - working-directory: frontend + working-directory: apps/frontend run: npm ci - name: Run tests - working-directory: frontend + working-directory: apps/frontend run: npm test - name: Build production assets - working-directory: frontend + working-directory: apps/frontend run: npm run build - name: Validate and package build shell: bash run: | set -euo pipefail - test -f frontend/dist/app.html - test -d frontend/dist/assets - find frontend/dist/assets -type f -print -quit | grep -q . - cp frontend/dist/app.html frontend/dist/index.html - tar -C frontend/dist -czf error-correction-web.tar.gz . + test -f apps/frontend/dist/app.html + test -d apps/frontend/dist/assets + find apps/frontend/dist/assets -type f -print -quit | grep -q . + cp apps/frontend/dist/app.html apps/frontend/dist/index.html + tar -C apps/frontend/dist -czf error-correction-web.tar.gz . - name: Upload production assets uses: actions/upload-artifact@v7 @@ -244,7 +244,7 @@ jobs: git lfs install --local git lfs pull origin test -f docker-compose.yml - test "$(wc -c < backend/text_eraser_model/weight/best.pth)" -gt 100000000 + test "$(wc -c < apps/backend/text_eraser_model/weight/best.pth)" -gt 100000000 docker compose config --quiet docker compose up -d --build --remove-orphans diff --git a/.gitignore b/.gitignore index a867eff7..aee3132b 100644 --- a/.gitignore +++ b/.gitignore @@ -17,30 +17,32 @@ uv.lock # Node 依赖与构建产物 node_modules/ -ui-showcase/dist/ -ui-showcase/package-lock.json +apps/ui-showcase/dist/ +apps/ui-showcase/package-lock.json # 前端构建产物 -frontend/dist/ -frontend/uploads/ -frontend/output +apps/frontend/dist/ +apps/frontend/uploads/ +apps/frontend/output presentation-vue/ # 后端运行产物 -backend/runtime_data/ -backend/output/ -backend/*.db -backend/db/*.db +apps/backend/runtime_data/ +apps/backend/output/ +apps/backend/*.db +apps/backend/db/*.db output/ +outputs/ __pycache__/ -backend/static/vue/assets +.pytest_cache/ +apps/backend/static/vue/assets # 模型权重文件 -backend/models/weight/ -backend/text_eraser_model/weight/ +apps/backend/models/weight/ +apps/backend/text_eraser_model/weight/ # 示例上传文件 -example_uploads/notes/ +examples/notes/ # 日志 workflow.log @@ -49,7 +51,7 @@ dataset/ # 环境变量 .env -backend/.env +apps/backend/.env *.pem PR.md TODO.md diff --git a/AGENTS.md b/AGENTS.md index eb110cb5..01da40a9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,31 +1,31 @@ # AGENTS -本文件用于说明项目规则目录 `rules/` 的结构,方便在开始开发或修改代码前快速定位需要查看的规范。 +本文件用于说明项目规则目录 `docs/rules/` 的结构,方便在开始开发或修改代码前快速定位需要查看的规范。 ## 规则目录 -### `rules/development` +### `docs/rules/development` -- `development/架构规则.md`:项目架构、核心入口和本地文档使用原则。 -- `development/前端规则.md`:Vue、API 调用、主题、组件和设计规则。 -- `development/后端规则.md`:模块副作用、数据库、线程安全、Agent、OCR 和文件路径规则。 -- `development/测试规则.md`:测试组织、断言原则和外部依赖保护。 -- `development/代码注释规则.md`:注释意图、前端注释位置和推荐写法。 +- `docs/rules/development/架构规则.md`:项目架构、核心入口和本地文档使用原则。 +- `docs/rules/development/前端规则.md`:Vue、API 调用、主题、组件和设计规则。 +- `docs/rules/development/后端规则.md`:模块副作用、数据库、线程安全、Agent、OCR 和文件路径规则。 +- `docs/rules/development/测试规则.md`:测试组织、断言原则和外部依赖保护。 +- `docs/rules/development/代码注释规则.md`:注释意图、前端注释位置和推荐写法。 -### `rules/workflow` +### `docs/rules/workflow` -- `workflow/提交规则.md`:commit message 格式和强制 checklist 要求。 -- `workflow/常用命令索引.md`:本地命令类规则入口。 -- `workflow/环境配置规则.md`:依赖安装、环境变量和 Provider 配置。 -- `workflow/开发启动规则.md`:前后端开发服务、conda 环境和端口检查。 -- `workflow/测试构建规则.md`:后端测试、前端测试和生产构建。 -- `workflow/变更同步规则.md`:跨后端、前端、文档、配置和测试的同步要求。 -- `workflow/协作提交流程规则.md`:fork、个人分支、PR 和 review 流程要求。 +- `docs/rules/workflow/提交规则.md`:commit message 格式和强制 checklist 要求。 +- `docs/rules/workflow/常用命令索引.md`:本地命令类规则入口。 +- `docs/rules/workflow/环境配置规则.md`:依赖安装、环境变量和 Provider 配置。 +- `docs/rules/workflow/开发启动规则.md`:前后端开发服务、conda 环境和端口检查。 +- `docs/rules/workflow/测试构建规则.md`:后端测试、前端测试和生产构建。 +- `docs/rules/workflow/变更同步规则.md`:跨后端、前端、文档、配置和测试的同步要求。 +- `docs/rules/workflow/协作提交流程规则.md`:fork、个人分支、PR 和 review 流程要求。 ## 使用建议 - 开始任务前,先查看本文件。 -- 涉及前端改动时,优先查看 `development/前端规则.md`。 -- 涉及后端改动时,优先查看 `development/后端规则.md`。 -- 涉及测试、构建、提交流程时,查看 `development/测试规则.md` 和 `workflow/` 下对应文件。 +- 涉及前端改动时,优先查看 `docs/rules/development/前端规则.md`。 +- 涉及后端改动时,优先查看 `docs/rules/development/后端规则.md`。 +- 涉及测试、构建、提交流程时,查看 `docs/rules/development/测试规则.md` 和 `docs/rules/workflow/` 下对应文件。 - 修改规则时,优先更新对应规则文件,而不是只改本文件。 diff --git a/Dockerfile b/Dockerfile index 4d245877..522a145d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM python:3.12-slim ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ - PYTHONPATH=/app/backend + PYTHONPATH=/app/apps/backend WORKDIR /app @@ -28,7 +28,7 @@ RUN sed \ --index-url "${TORCH_INDEX_URL}" \ && rm -f /tmp/requirements-runtime.txt -COPY backend ./backend +COPY apps/backend ./apps/backend RUN groupadd --gid 10001 app \ && useradd --uid 10001 --gid app --no-create-home --shell /usr/sbin/nologin app \ @@ -36,7 +36,7 @@ RUN groupadd --gid 10001 app \ && chown -R app:app /app USER app -WORKDIR /app/backend +WORKDIR /app/apps/backend EXPOSE 8000 diff --git a/README.md b/README.md index 32547780..9809e18b 100644 --- a/README.md +++ b/README.md @@ -6,17 +6,17 @@ | 首页 | 错题工作台 | |------|------------| -| ![登录过程](assets/readme/登录过程.gif) | ![错题工作台](assets/readme/错题工作台.png) | +| ![登录过程](docs/assets/readme/登录过程.gif) | ![错题工作台](docs/assets/readme/错题工作台.png) | | 笔记整理 | 主题切换 | |----------|----------| -| ![笔记分割过程](assets/readme/笔记分割过程.gif) | ![主题切换](assets/readme/主题切换.gif) | +| ![笔记分割过程](docs/assets/readme/笔记分割过程.gif) | ![主题切换](docs/assets/readme/主题切换.gif) | ## 功能演示 | AI 找题 | Provider 配置 | |---------|---------------| -| ![AI 找题](assets/readme/AI找题.gif) | ![Provider 配置](assets/readme/Provider配置.gif) | +| ![AI 找题](docs/assets/readme/AI找题.gif) | ![Provider 配置](docs/assets/readme/Provider配置.gif) | ## 功能 @@ -36,38 +36,29 @@ ## 项目结构 ``` -├── backend/ # Flask 后端(纯 API 服务) -│ ├── core/ # 核心模块 -│ │ ├── config.py # 集中配置(路径、Settings) -│ │ ├── llm.py # LLM 初始化(多 provider 支持) -│ │ ├── state.py # 全局会话状态(session_files、锁) -│ │ └── mail.py # SMTP 邮件发送 -│ ├── web_app.py # Flask 应用工厂 + Blueprint 注册 -│ ├── routes/ # Flask Blueprint 路由(auth、chat、device、notes、projects 等) -│ ├── src/ # 核心模块(LangGraph workflow、OCR 客户端、工具函数) -│ ├── agents/ # LangChain Agent -│ │ ├── error_correction/ # 题目分割 + OCR 纠错 -│ │ ├── solve/ # 解题 Agent -│ │ ├── teach/ # 教学讲解 Agent -│ │ └── note/ # 笔记整理 Agent -│ ├── db/ # SQLite + SQLAlchemy ORM -│ │ ├── models.py # 数据模型(User、Question、Note、Chat 等) -│ │ ├── crud/ # CRUD 模块化包 -│ │ └── migrate.py # 数据库自动迁移 -│ └── tests/ # 后端测试 -├── frontend/ # Vue 3 + Vite + Tailwind CSS -│ ├── app.html # SPA 入口 -│ └── src/ -│ ├── views/ # 页面级组件(HomeView、WorkspaceView) -│ ├── components/ # 基础组件与业务组件 -│ ├── composables/ # 组合式函数(useAuth、useTheme 等) -│ ├── router/ # Vue Router 路由配置 -│ ├── api/ # 按领域拆分的 API 调用层 -│ ├── utils/ # 工具函数(Markdown 渲染、MathJax、DOMPurify) -│ └── __tests__/ # 前端测试(Vitest) -├── example_uploads/ # 示例测试文件 -├── rules/ # 项目规则、协作流程和开发规范 -├── backend/.env.example # 环境变量模板 +├── apps/ +│ ├── backend/ # Flask 后端(纯 API 服务) +│ │ ├── .env.example # 环境变量模板 +│ │ ├── core/ # 核心模块 +│ │ │ ├── config.py # 集中配置(路径、Settings) +│ │ │ ├── llm.py # LLM 初始化(多 provider 支持) +│ │ │ ├── state.py # 全局会话状态(session_files、锁) +│ │ │ └── mail.py # SMTP 邮件发送 +│ │ ├── web_app.py # Flask 应用工厂 + Blueprint 注册 +│ │ ├── routes/ # Flask Blueprint 路由 +│ │ ├── pipeline/ # LangGraph workflow、OCR 客户端、工具函数 +│ │ ├── agents/ # LangChain Agent +│ │ ├── db/ # SQLite + SQLAlchemy ORM +│ │ └── tests/ # 后端测试 +│ ├── frontend/ # Vue 3 + Vite + Tailwind CSS +│ │ ├── app.html # SPA 入口 +│ │ └── src/ # 页面、组件、API、工具与 Vitest 测试 +│ └── ui-showcase/ # Base 组件独立展示站 +├── docs/ +│ ├── assets/ # README 图片和演示资源 +│ ├── deploy/ # 部署与 CI/CD 文档 +│ └── rules/ # 项目规则、协作流程和开发规范 +├── examples/ # 示例测试文件 └── requirements.txt # Python 依赖 ``` @@ -82,21 +73,21 @@ pip install -r requirements.txt # 前端依赖 -cd frontend && npm install +cd apps/frontend && npm install ``` ### 2. 配置环境变量 ```bash # 复制模板到项目根目录 -cp backend/.env.example .env +cp apps/backend/.env.example .env ``` 编辑 `.env`,必须配置 `SECRET_KEY`。 LLM API Provider(OpenAI / Anthropic / PaddleOCR)配置已迁移到数据库,启动后在系统设置页面管理。 -SMTP 邮件配置(注册验证码、找回密码)通过 `.env` 的 `APP_SMTP_*` 变量管理,详见 `backend/.env.example`。 +SMTP 邮件配置(注册验证码、找回密码)通过 `.env` 的 `APP_SMTP_*` 变量管理,详见 `apps/backend/.env.example`。 ### 3. 启动 @@ -104,10 +95,10 @@ SMTP 邮件配置(注册验证码、找回密码)通过 `.env` 的 `APP_SMTP ```bash # 终端 1:启动后端 -cd backend && python web_app.py +cd apps/backend && python web_app.py # 终端 2:启动前端开发服务器 -cd frontend && npm run dev +cd apps/frontend && npm run dev ``` 前端开发服务器会自动将 `/api`、`/images`、`/download`、`/erased`、`/uploads` 请求代理到后端 `localhost:5001`。 @@ -116,11 +107,11 @@ cd frontend && npm run dev > **注意**:后端已重构为纯 API 服务器,不提供前端页面。直接访问 `:5001` 只会得到 JSON 404。 -更完整的启动说明见 [rules/workflow/开发启动规则.md](rules/workflow/开发启动规则.md),测试与构建说明见 [rules/workflow/测试构建规则.md](rules/workflow/测试构建规则.md)。 +更完整的启动说明见 [docs/rules/workflow/开发启动规则.md](docs/rules/workflow/开发启动规则.md),测试与构建说明见 [docs/rules/workflow/测试构建规则.md](docs/rules/workflow/测试构建规则.md)。 生产环境采用单仓库 Tag 发布:后端由 Docker Compose 运行,前端发布到 1Panel -静态网站目录。配置步骤见 [deploy/cicd.md](deploy/cicd.md) 和 -[deploy/1panel.md](deploy/1panel.md)。 +静态网站目录。配置步骤见 [docs/deploy/cicd.md](docs/deploy/cicd.md) 和 +[docs/deploy/1panel.md](docs/deploy/1panel.md)。 ## 支持的文件格式 @@ -130,20 +121,20 @@ PDF(`.pdf`)、图片(`.jpg` `.jpeg` `.png` `.bmp` `.tiff` `.webp`),单次上 ```bash # 后端测试 -cd backend && python -m pytest tests/ -v +python -m pytest apps/backend/tests -v # 前端测试 -cd frontend && npm test +cd apps/frontend && npm test ``` -详见 [backend/tests/README.md](backend/tests/README.md) 和 [frontend/src/__tests__/README.md](frontend/src/__tests__/README.md)。 +详见 [apps/backend/tests/README.md](apps/backend/tests/README.md) 和 [apps/frontend/src/__tests__/README.md](apps/frontend/src/__tests__/README.md)。 ## 项目规则 项目规则集中维护在 [AGENTS.md](AGENTS.md)。 -- `rules/development/`:架构、前端、后端、测试和代码注释规则 -- `rules/workflow/`:提交、协作、同步、启动、环境和测试构建规则 +- `docs/rules/development/`:架构、前端、后端、测试和代码注释规则 +- `docs/rules/workflow/`:提交、协作、同步、启动、环境和测试构建规则 团队协作采用 fork-based workflow:开发者先 fork 主仓库,将分支推送到自己的 fork 仓库,再通过 Pull Request 提交到主仓库 review。 diff --git a/backend/.env.example b/apps/backend/.env.example similarity index 96% rename from backend/.env.example rename to apps/backend/.env.example index ed009c3f..b5e8ede4 100644 --- a/backend/.env.example +++ b/apps/backend/.env.example @@ -16,14 +16,14 @@ LANGSMITH_TRACING=false # ============================================================================ # 输出目录配置(可选) # ============================================================================ -# 目录配置由 config.py 集中管理(默认:backend/runtime_data/) +# 目录配置由 config.py 集中管理(默认:apps/backend/runtime_data/) # 如需覆盖运行时输出的根目录,请设置 APP_RUNTIME_DIR(绝对路径) # APP_RUNTIME_DIR= # ============================================================================ # 文字擦除模型权重(可选) # ============================================================================ -# 默认路径:backend/text_eraser_model/weight/best.pth +# 默认路径:apps/backend/text_eraser_model/weight/best.pth # 如需指定其他位置,取消注释并填写绝对路径 # APP_MODEL_PATH=/path/to/your/best.pth # CPU 推理线程数与滑窗批量;2 核 4 GB 服务器建议保持为 2 diff --git a/backend/agents/__init__.py b/apps/backend/agents/__init__.py similarity index 100% rename from backend/agents/__init__.py rename to apps/backend/agents/__init__.py diff --git a/backend/agents/error_correction/__init__.py b/apps/backend/agents/error_correction/__init__.py similarity index 100% rename from backend/agents/error_correction/__init__.py rename to apps/backend/agents/error_correction/__init__.py diff --git a/backend/agents/error_correction/agent.py b/apps/backend/agents/error_correction/agent.py similarity index 100% rename from backend/agents/error_correction/agent.py rename to apps/backend/agents/error_correction/agent.py diff --git a/backend/agents/error_correction/prompts.py b/apps/backend/agents/error_correction/prompts.py similarity index 100% rename from backend/agents/error_correction/prompts.py rename to apps/backend/agents/error_correction/prompts.py diff --git a/backend/agents/error_correction/schemas.py b/apps/backend/agents/error_correction/schemas.py similarity index 100% rename from backend/agents/error_correction/schemas.py rename to apps/backend/agents/error_correction/schemas.py diff --git a/backend/agents/error_correction/tools/__init__.py b/apps/backend/agents/error_correction/tools/__init__.py similarity index 100% rename from backend/agents/error_correction/tools/__init__.py rename to apps/backend/agents/error_correction/tools/__init__.py diff --git a/backend/agents/error_correction/tools/file_tools.py b/apps/backend/agents/error_correction/tools/file_tools.py similarity index 100% rename from backend/agents/error_correction/tools/file_tools.py rename to apps/backend/agents/error_correction/tools/file_tools.py diff --git a/backend/agents/error_correction/tools/question_tools.py b/apps/backend/agents/error_correction/tools/question_tools.py similarity index 100% rename from backend/agents/error_correction/tools/question_tools.py rename to apps/backend/agents/error_correction/tools/question_tools.py diff --git a/backend/agents/note/__init__.py b/apps/backend/agents/note/__init__.py similarity index 100% rename from backend/agents/note/__init__.py rename to apps/backend/agents/note/__init__.py diff --git a/backend/agents/note/agent.py b/apps/backend/agents/note/agent.py similarity index 100% rename from backend/agents/note/agent.py rename to apps/backend/agents/note/agent.py diff --git a/backend/agents/note/prompts.py b/apps/backend/agents/note/prompts.py similarity index 100% rename from backend/agents/note/prompts.py rename to apps/backend/agents/note/prompts.py diff --git a/backend/agents/note/schemas.py b/apps/backend/agents/note/schemas.py similarity index 100% rename from backend/agents/note/schemas.py rename to apps/backend/agents/note/schemas.py diff --git a/backend/agents/solve/__init__.py b/apps/backend/agents/solve/__init__.py similarity index 100% rename from backend/agents/solve/__init__.py rename to apps/backend/agents/solve/__init__.py diff --git a/backend/agents/solve/agent.py b/apps/backend/agents/solve/agent.py similarity index 100% rename from backend/agents/solve/agent.py rename to apps/backend/agents/solve/agent.py diff --git a/backend/agents/solve/prompts.py b/apps/backend/agents/solve/prompts.py similarity index 100% rename from backend/agents/solve/prompts.py rename to apps/backend/agents/solve/prompts.py diff --git a/backend/agents/solve/schemas.py b/apps/backend/agents/solve/schemas.py similarity index 100% rename from backend/agents/solve/schemas.py rename to apps/backend/agents/solve/schemas.py diff --git a/backend/agents/teach/__init__.py b/apps/backend/agents/teach/__init__.py similarity index 100% rename from backend/agents/teach/__init__.py rename to apps/backend/agents/teach/__init__.py diff --git a/backend/agents/teach/agent.py b/apps/backend/agents/teach/agent.py similarity index 100% rename from backend/agents/teach/agent.py rename to apps/backend/agents/teach/agent.py diff --git a/backend/agents/teach/prompts.py b/apps/backend/agents/teach/prompts.py similarity index 100% rename from backend/agents/teach/prompts.py rename to apps/backend/agents/teach/prompts.py diff --git a/backend/core/__init__.py b/apps/backend/core/__init__.py similarity index 100% rename from backend/core/__init__.py rename to apps/backend/core/__init__.py diff --git a/backend/core/config.py b/apps/backend/core/config.py similarity index 99% rename from backend/core/config.py rename to apps/backend/core/config.py index 266adc7d..42154acf 100644 --- a/backend/core/config.py +++ b/apps/backend/core/config.py @@ -19,8 +19,8 @@ ) ) -_BACKEND_ROOT = Path(__file__).resolve().parent.parent # backend/core/ → backend/ -_PROJECT_ROOT = _BACKEND_ROOT.parent +_BACKEND_ROOT = Path(__file__).resolve().parent.parent # apps/backend/core/ → apps/backend/ +_PROJECT_ROOT = _BACKEND_ROOT.parent.parent _ENV_FILE = _PROJECT_ROOT / ".env" diff --git a/backend/core/llm.py b/apps/backend/core/llm.py similarity index 100% rename from backend/core/llm.py rename to apps/backend/core/llm.py diff --git a/backend/core/mail.py b/apps/backend/core/mail.py similarity index 100% rename from backend/core/mail.py rename to apps/backend/core/mail.py diff --git a/backend/core/model_selection.py b/apps/backend/core/model_selection.py similarity index 100% rename from backend/core/model_selection.py rename to apps/backend/core/model_selection.py diff --git a/backend/core/quota.py b/apps/backend/core/quota.py similarity index 100% rename from backend/core/quota.py rename to apps/backend/core/quota.py diff --git a/backend/core/reasoning.py b/apps/backend/core/reasoning.py similarity index 100% rename from backend/core/reasoning.py rename to apps/backend/core/reasoning.py diff --git a/backend/core/state.py b/apps/backend/core/state.py similarity index 100% rename from backend/core/state.py rename to apps/backend/core/state.py diff --git a/backend/core/workflow_run_store.py b/apps/backend/core/workflow_run_store.py similarity index 100% rename from backend/core/workflow_run_store.py rename to apps/backend/core/workflow_run_store.py diff --git a/backend/db/__init__.py b/apps/backend/db/__init__.py similarity index 100% rename from backend/db/__init__.py rename to apps/backend/db/__init__.py diff --git a/backend/db/crud/__init__.py b/apps/backend/db/crud/__init__.py similarity index 100% rename from backend/db/crud/__init__.py rename to apps/backend/db/crud/__init__.py diff --git a/backend/db/crud/chat.py b/apps/backend/db/crud/chat.py similarity index 100% rename from backend/db/crud/chat.py rename to apps/backend/db/crud/chat.py diff --git a/backend/db/crud/devices.py b/apps/backend/db/crud/devices.py similarity index 100% rename from backend/db/crud/devices.py rename to apps/backend/db/crud/devices.py diff --git a/backend/db/crud/email_verification.py b/apps/backend/db/crud/email_verification.py similarity index 100% rename from backend/db/crud/email_verification.py rename to apps/backend/db/crud/email_verification.py diff --git a/backend/db/crud/notes.py b/apps/backend/db/crud/notes.py similarity index 100% rename from backend/db/crud/notes.py rename to apps/backend/db/crud/notes.py diff --git a/backend/db/crud/projects.py b/apps/backend/db/crud/projects.py similarity index 100% rename from backend/db/crud/projects.py rename to apps/backend/db/crud/projects.py diff --git a/backend/db/crud/providers.py b/apps/backend/db/crud/providers.py similarity index 100% rename from backend/db/crud/providers.py rename to apps/backend/db/crud/providers.py diff --git a/backend/db/crud/questions.py b/apps/backend/db/crud/questions.py similarity index 100% rename from backend/db/crud/questions.py rename to apps/backend/db/crud/questions.py diff --git a/backend/db/crud/review.py b/apps/backend/db/crud/review.py similarity index 100% rename from backend/db/crud/review.py rename to apps/backend/db/crud/review.py diff --git a/backend/db/crud/split_records.py b/apps/backend/db/crud/split_records.py similarity index 100% rename from backend/db/crud/split_records.py rename to apps/backend/db/crud/split_records.py diff --git a/backend/db/crud/stats.py b/apps/backend/db/crud/stats.py similarity index 100% rename from backend/db/crud/stats.py rename to apps/backend/db/crud/stats.py diff --git a/backend/db/crud/tags.py b/apps/backend/db/crud/tags.py similarity index 100% rename from backend/db/crud/tags.py rename to apps/backend/db/crud/tags.py diff --git a/backend/db/crud/users.py b/apps/backend/db/crud/users.py similarity index 100% rename from backend/db/crud/users.py rename to apps/backend/db/crud/users.py diff --git a/backend/db/crud/workflow_runs.py b/apps/backend/db/crud/workflow_runs.py similarity index 100% rename from backend/db/crud/workflow_runs.py rename to apps/backend/db/crud/workflow_runs.py diff --git a/backend/db/migrate.py b/apps/backend/db/migrate.py similarity index 100% rename from backend/db/migrate.py rename to apps/backend/db/migrate.py diff --git a/backend/db/models.py b/apps/backend/db/models.py similarity index 100% rename from backend/db/models.py rename to apps/backend/db/models.py diff --git a/backend/gunicorn.conf.py b/apps/backend/gunicorn.conf.py similarity index 100% rename from backend/gunicorn.conf.py rename to apps/backend/gunicorn.conf.py diff --git a/backend/package-lock.json b/apps/backend/package-lock.json similarity index 100% rename from backend/package-lock.json rename to apps/backend/package-lock.json diff --git a/backend/pipeline/paddleocr_client.py b/apps/backend/pipeline/paddleocr_client.py similarity index 100% rename from backend/pipeline/paddleocr_client.py rename to apps/backend/pipeline/paddleocr_client.py diff --git a/backend/pipeline/utils.py b/apps/backend/pipeline/utils.py similarity index 99% rename from backend/pipeline/utils.py rename to apps/backend/pipeline/utils.py index c4267fc7..018df3d4 100644 --- a/backend/pipeline/utils.py +++ b/apps/backend/pipeline/utils.py @@ -15,7 +15,7 @@ from core.config import settings -load_dotenv(os.path.join(os.path.dirname(__file__), "..", ".env")) +load_dotenv(str(settings.project_root / ".env")) console = Console() diff --git a/backend/pipeline/workflow.py b/apps/backend/pipeline/workflow.py similarity index 100% rename from backend/pipeline/workflow.py rename to apps/backend/pipeline/workflow.py diff --git a/backend/postgresql_schema.sql b/apps/backend/postgresql_schema.sql similarity index 99% rename from backend/postgresql_schema.sql rename to apps/backend/postgresql_schema.sql index 63dc3731..8825e85c 100644 --- a/backend/postgresql_schema.sql +++ b/apps/backend/postgresql_schema.sql @@ -1,4 +1,4 @@ --- PostgreSQL schema for backend/db/models.py +-- PostgreSQL schema for apps/backend/db/models.py -- Run with: psql "$DATABASE_URL" -f postgresql_schema.sql BEGIN; diff --git a/backend/routes/__init__.py b/apps/backend/routes/__init__.py similarity index 100% rename from backend/routes/__init__.py rename to apps/backend/routes/__init__.py diff --git a/backend/routes/auth.py b/apps/backend/routes/auth.py similarity index 100% rename from backend/routes/auth.py rename to apps/backend/routes/auth.py diff --git a/backend/routes/chat.py b/apps/backend/routes/chat.py similarity index 100% rename from backend/routes/chat.py rename to apps/backend/routes/chat.py diff --git a/backend/routes/device.py b/apps/backend/routes/device.py similarity index 100% rename from backend/routes/device.py rename to apps/backend/routes/device.py diff --git a/backend/routes/notes.py b/apps/backend/routes/notes.py similarity index 100% rename from backend/routes/notes.py rename to apps/backend/routes/notes.py diff --git a/backend/routes/projects.py b/apps/backend/routes/projects.py similarity index 100% rename from backend/routes/projects.py rename to apps/backend/routes/projects.py diff --git a/backend/routes/questions.py b/apps/backend/routes/questions.py similarity index 100% rename from backend/routes/questions.py rename to apps/backend/routes/questions.py diff --git a/backend/routes/settings.py b/apps/backend/routes/settings.py similarity index 100% rename from backend/routes/settings.py rename to apps/backend/routes/settings.py diff --git a/backend/routes/stats.py b/apps/backend/routes/stats.py similarity index 100% rename from backend/routes/stats.py rename to apps/backend/routes/stats.py diff --git a/backend/routes/upload.py b/apps/backend/routes/upload.py similarity index 100% rename from backend/routes/upload.py rename to apps/backend/routes/upload.py diff --git a/backend/tests/README.md b/apps/backend/tests/README.md similarity index 89% rename from backend/tests/README.md rename to apps/backend/tests/README.md index cceb3e77..4a2444fe 100644 --- a/backend/tests/README.md +++ b/apps/backend/tests/README.md @@ -11,8 +11,8 @@ C:\ProgramData\miniconda3\envs\da\python.exe 如果默认临时目录权限异常,可以把 pytest 临时目录放到项目内: ```bash -C:\ProgramData\miniconda3\envs\da\python.exe -m pytest backend\tests\test_web_routes.py::TestMultiUserWorkflowRunIsolation -q --basetemp=backend\runtime_data\pytest_tmp_route -p no:cacheprovider -C:\ProgramData\miniconda3\envs\da\python.exe -m pytest backend\tests\test_crud.py::TestWorkflowRuns -q --basetemp=backend\runtime_data\pytest_tmp_crud -p no:cacheprovider +C:\ProgramData\miniconda3\envs\da\python.exe -m pytest apps\backend\tests\test_web_routes.py::TestMultiUserWorkflowRunIsolation -q --basetemp=apps\backend\runtime_data\pytest_tmp_route -p no:cacheprovider +C:\ProgramData\miniconda3\envs\da\python.exe -m pytest apps\backend\tests\test_crud.py::TestWorkflowRuns -q --basetemp=apps\backend\runtime_data\pytest_tmp_crud -p no:cacheprovider ``` 新增的多用户相关测试: @@ -24,8 +24,8 @@ C:\ProgramData\miniconda3\envs\da\python.exe -m pytest backend\tests\test_crud.p ## 运行测试 ```bash -# 在 backend/ 目录下执行 -cd backend +# 在 apps/backend/ 目录下执行 +cd apps/backend # 运行全部单元测试 python -m pytest tests/ -v @@ -47,7 +47,7 @@ python -m pytest tests/ -v -k "dedup" ## 测试文件说明 ``` -backend/tests/ +apps/backend/tests/ ├── conftest.py # pytest 配置,公共 fixture(db / make_question) ├── fixtures/ # 测试数据 │ └── sample_ocr_data.json # OCR 测试数据(split_integration 使用) @@ -70,7 +70,7 @@ backend/tests/ ### test_utils.py -测试 `backend/pipeline/utils.py` 中的通用工具函数: +测试 `apps/backend/pipeline/utils.py` 中的通用工具函数: | 测试类 | 被测函数 | 用例数 | 说明 | |--------|----------|--------|------| @@ -78,7 +78,7 @@ backend/tests/ ### test_workflow_helpers.py -测试 `backend/pipeline/workflow.py` 和 `backend/pipeline/utils.py` 中不依赖外部服务的纯函数: +测试 `apps/backend/pipeline/workflow.py` 和 `apps/backend/pipeline/utils.py` 中不依赖外部服务的纯函数: | 测试类 | 被测函数 | 用例数 | 说明 | |--------|----------|--------|------| @@ -93,7 +93,7 @@ backend/tests/ ### test_export.py -测试 `backend/pipeline/utils.py` 中的 `export_wrongbook` 函数: +测试 `apps/backend/pipeline/utils.py` 中的 `export_wrongbook` 函数: | 测试方法 | 说明 | |----------|------| @@ -110,7 +110,7 @@ backend/tests/ ### test_web_helpers.py -测试 `backend/web_app.py` 中不依赖 Flask 请求上下文的纯函数: +测试 `apps/backend/web_app.py` 中不依赖 Flask 请求上下文的纯函数: | 测试类 | 被测函数 | 用例数 | 说明 | |--------|----------|--------|------| @@ -120,7 +120,7 @@ backend/tests/ ### test_crud.py -测试 `backend/db/crud.py` 中所有 CRUD 函数,使用 **SQLite 内存数据库**(每个测试用例独立数据库): +测试 `apps/backend/db/crud/` 中所有 CRUD 函数,使用 **SQLite 内存数据库**(每个测试用例独立数据库): | 测试类 | 被测函数 | 用例数 | 说明 | |--------|----------|--------|------| @@ -137,7 +137,7 @@ backend/tests/ ### test_schemas.py -测试 `backend/error_correction_agent/schemas.py` 中 Pydantic 模型的校验逻辑: +测试 `apps/backend/agents/error_correction/schemas.py` 中 Pydantic 模型的校验逻辑: | 测试类 | 被测模型 | 用例数 | 说明 | |--------|----------|--------|------| @@ -149,7 +149,7 @@ backend/tests/ ### test_question_tools.py -测试 `backend/error_correction_agent/tools/question_tools.py` 中的文件 I/O 工具(使用 `tmp_path`): +测试 `apps/backend/agents/error_correction/tools/question_tools.py` 中的文件 I/O 工具(使用 `tmp_path`): | 测试类 | 被测函数 | 用例数 | 说明 | |--------|----------|--------|------| @@ -158,7 +158,7 @@ backend/tests/ ### test_correct_node.py -测试 `backend/pipeline/workflow.py` 中 `correct_questions_node` 的合并逻辑(mock 纠错工具): +测试 `apps/backend/pipeline/workflow.py` 中 `correct_questions_node` 的合并逻辑(mock 纠错工具): | 测试方法 | 说明 | |----------|------| @@ -169,7 +169,7 @@ backend/tests/ ### test_solve_schemas.py -测试 `backend/solve_agent/schemas.py` 中解题结果 Pydantic 模型: +测试 `apps/backend/agents/solve/schemas.py` 中解题结果 Pydantic 模型: | 测试类 | 被测模型 | 用例数 | 说明 | |--------|----------|--------|------| @@ -178,7 +178,7 @@ backend/tests/ ### test_ocr_api.py -**集成测试**:验证 PaddleOCR V2 异步任务 API 的连通性与结果格式兼容性。需要配置 `PADDLEOCR_API_URL`、`PADDLEOCR_API_TOKEN`。测试文件使用 `example_uploads/` 下的 `test.jpg`(图片)和 `test4.pdf`(PDF)。 +**集成测试**:验证 PaddleOCR V2 异步任务 API 的连通性与结果格式兼容性。需要配置 `PADDLEOCR_API_URL`、`PADDLEOCR_API_TOKEN`。测试文件使用 `examples/` 下的 `test.jpg`(图片)和 `test4.pdf`(PDF)。 ```bash pytest tests/test_ocr_api.py -v -s diff --git a/backend/tests/__init__.py b/apps/backend/tests/__init__.py similarity index 100% rename from backend/tests/__init__.py rename to apps/backend/tests/__init__.py diff --git a/backend/tests/conftest.py b/apps/backend/tests/conftest.py similarity index 90% rename from backend/tests/conftest.py rename to apps/backend/tests/conftest.py index 4745b24f..797f4b3c 100644 --- a/backend/tests/conftest.py +++ b/apps/backend/tests/conftest.py @@ -1,5 +1,5 @@ """ -pytest 配置 — 确保 backend/ 在 sys.path 中,以便 import config 等模块。 +pytest 配置 — 确保 apps/backend/ 在 sys.path 中,以便 import config 等模块。 """ import sys @@ -9,13 +9,13 @@ from sqlalchemy import create_engine, event from sqlalchemy.orm import sessionmaker -from db.models import Base - -# 将 backend/ 目录加入 sys.path +# 将 apps/backend/ 目录加入 sys.path,保证从仓库根目录运行 pytest 时也能解析顶层包。 BACKEND_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) if BACKEND_DIR not in sys.path: sys.path.insert(0, BACKEND_DIR) +from db.models import Base + def pytest_addoption(parser): parser.addoption( diff --git a/backend/tests/fixtures/sample_ocr_data.json b/apps/backend/tests/fixtures/sample_ocr_data.json similarity index 100% rename from backend/tests/fixtures/sample_ocr_data.json rename to apps/backend/tests/fixtures/sample_ocr_data.json diff --git a/backend/tests/test_chat_crud.py b/apps/backend/tests/test_chat_crud.py similarity index 100% rename from backend/tests/test_chat_crud.py rename to apps/backend/tests/test_chat_crud.py diff --git a/backend/tests/test_chat_routes.py b/apps/backend/tests/test_chat_routes.py similarity index 100% rename from backend/tests/test_chat_routes.py rename to apps/backend/tests/test_chat_routes.py diff --git a/backend/tests/test_correct_node.py b/apps/backend/tests/test_correct_node.py similarity index 100% rename from backend/tests/test_correct_node.py rename to apps/backend/tests/test_correct_node.py diff --git a/backend/tests/test_crud.py b/apps/backend/tests/test_crud.py similarity index 100% rename from backend/tests/test_crud.py rename to apps/backend/tests/test_crud.py diff --git a/backend/tests/test_eraser_inference.py b/apps/backend/tests/test_eraser_inference.py similarity index 100% rename from backend/tests/test_eraser_inference.py rename to apps/backend/tests/test_eraser_inference.py diff --git a/backend/tests/test_export.py b/apps/backend/tests/test_export.py similarity index 100% rename from backend/tests/test_export.py rename to apps/backend/tests/test_export.py diff --git a/backend/tests/test_migrate_and_delete_question.py b/apps/backend/tests/test_migrate_and_delete_question.py similarity index 100% rename from backend/tests/test_migrate_and_delete_question.py rename to apps/backend/tests/test_migrate_and_delete_question.py diff --git a/backend/tests/test_note_agent.py b/apps/backend/tests/test_note_agent.py similarity index 100% rename from backend/tests/test_note_agent.py rename to apps/backend/tests/test_note_agent.py diff --git a/backend/tests/test_ocr_api.py b/apps/backend/tests/test_ocr_api.py similarity index 98% rename from backend/tests/test_ocr_api.py rename to apps/backend/tests/test_ocr_api.py index 2ee43c7a..b3d88ade 100644 --- a/backend/tests/test_ocr_api.py +++ b/apps/backend/tests/test_ocr_api.py @@ -5,7 +5,7 @@ pytest tests/test_ocr_api.py -v -s 需要配置环境变量:PADDLEOCR_API_URL、PADDLEOCR_API_TOKEN。 -测试图片使用 example_uploads/notes/test.jpg,测试 PDF 使用 example_uploads/exams/test4.pdf。 +测试图片使用 examples/notes/test.jpg,测试 PDF 使用 examples/exams/test4.pdf。 """ import os @@ -54,9 +54,10 @@ def _load_ocr_creds_from_db() -> dict: TOKEN = os.getenv("PADDLEOCR_API_TOKEN") or _DB_CREDS.get("token", "") MODEL = os.getenv("PADDLEOCR_MODEL") or _DB_CREDS.get("model", "PaddleOCR-VL-1.6") -EXAMPLE_DIR = os.path.abspath( - os.path.join(os.path.dirname(__file__), "..", "..", "example_uploads") +PROJECT_ROOT = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "..", "..") ) +EXAMPLE_DIR = os.path.join(PROJECT_ROOT, "examples") TEST_IMAGE = os.path.join(EXAMPLE_DIR, "notes", "test.jpg") TEST_PDF = os.path.join(EXAMPLE_DIR, "exams", "test4.pdf") diff --git a/backend/tests/test_project_crud.py b/apps/backend/tests/test_project_crud.py similarity index 100% rename from backend/tests/test_project_crud.py rename to apps/backend/tests/test_project_crud.py diff --git a/backend/tests/test_question_tools.py b/apps/backend/tests/test_question_tools.py similarity index 100% rename from backend/tests/test_question_tools.py rename to apps/backend/tests/test_question_tools.py diff --git a/backend/tests/test_schemas.py b/apps/backend/tests/test_schemas.py similarity index 100% rename from backend/tests/test_schemas.py rename to apps/backend/tests/test_schemas.py diff --git a/backend/tests/test_solve_integration.py b/apps/backend/tests/test_solve_integration.py similarity index 100% rename from backend/tests/test_solve_integration.py rename to apps/backend/tests/test_solve_integration.py diff --git a/backend/tests/test_solve_schemas.py b/apps/backend/tests/test_solve_schemas.py similarity index 100% rename from backend/tests/test_solve_schemas.py rename to apps/backend/tests/test_solve_schemas.py diff --git a/backend/tests/test_split_integration.py b/apps/backend/tests/test_split_integration.py similarity index 100% rename from backend/tests/test_split_integration.py rename to apps/backend/tests/test_split_integration.py diff --git a/backend/tests/test_structured_output_modes.py b/apps/backend/tests/test_structured_output_modes.py similarity index 100% rename from backend/tests/test_structured_output_modes.py rename to apps/backend/tests/test_structured_output_modes.py diff --git a/backend/tests/test_teach_agent.py b/apps/backend/tests/test_teach_agent.py similarity index 100% rename from backend/tests/test_teach_agent.py rename to apps/backend/tests/test_teach_agent.py diff --git a/backend/tests/test_utils.py b/apps/backend/tests/test_utils.py similarity index 100% rename from backend/tests/test_utils.py rename to apps/backend/tests/test_utils.py diff --git a/backend/tests/test_web_helpers.py b/apps/backend/tests/test_web_helpers.py similarity index 100% rename from backend/tests/test_web_helpers.py rename to apps/backend/tests/test_web_helpers.py diff --git a/backend/tests/test_web_routes.py b/apps/backend/tests/test_web_routes.py similarity index 100% rename from backend/tests/test_web_routes.py rename to apps/backend/tests/test_web_routes.py diff --git a/backend/tests/test_workflow_helpers.py b/apps/backend/tests/test_workflow_helpers.py similarity index 100% rename from backend/tests/test_workflow_helpers.py rename to apps/backend/tests/test_workflow_helpers.py diff --git a/backend/text_eraser_model/__init__.py b/apps/backend/text_eraser_model/__init__.py similarity index 100% rename from backend/text_eraser_model/__init__.py rename to apps/backend/text_eraser_model/__init__.py diff --git a/backend/text_eraser_model/blocks.py b/apps/backend/text_eraser_model/blocks.py similarity index 100% rename from backend/text_eraser_model/blocks.py rename to apps/backend/text_eraser_model/blocks.py diff --git a/backend/text_eraser_model/inference.py b/apps/backend/text_eraser_model/inference.py similarity index 100% rename from backend/text_eraser_model/inference.py rename to apps/backend/text_eraser_model/inference.py diff --git a/backend/text_eraser_model/model.py b/apps/backend/text_eraser_model/model.py similarity index 100% rename from backend/text_eraser_model/model.py rename to apps/backend/text_eraser_model/model.py diff --git a/backend/text_eraser_model/test_erase.py b/apps/backend/text_eraser_model/test_erase.py similarity index 97% rename from backend/text_eraser_model/test_erase.py rename to apps/backend/text_eraser_model/test_erase.py index f40bab34..c0cf5fb5 100644 --- a/backend/text_eraser_model/test_erase.py +++ b/apps/backend/text_eraser_model/test_erase.py @@ -1,11 +1,11 @@ """ 文字擦除推理测试脚本 -运行方式:cd backend/text_eraser_model && python test_erase.py <图片路径> +运行方式:cd apps/backend/text_eraser_model && python test_erase.py <图片路径> 示例:python test_erase.py E:/code/python/error_correction/dataset/初中数学/图片/xxx.jpg """ import sys import os -# backend/text_eraser_model/ → backend/ +# apps/backend/text_eraser_model/ → apps/backend/ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) import torch diff --git a/backend/text_eraser_model/weight/best.pth b/apps/backend/text_eraser_model/weight/best.pth similarity index 100% rename from backend/text_eraser_model/weight/best.pth rename to apps/backend/text_eraser_model/weight/best.pth diff --git a/backend/web_app.py b/apps/backend/web_app.py similarity index 97% rename from backend/web_app.py rename to apps/backend/web_app.py index 23f6194e..e007bcef 100644 --- a/backend/web_app.py +++ b/apps/backend/web_app.py @@ -15,9 +15,10 @@ import sys import logging -# 无论从项目根目录执行 `python backend/web_app.py` 还是在 `backend` 下执行 `python web_app.py`, +# 无论从项目根目录执行 `python apps/backend/web_app.py` 还是在 `apps/backend` 下执行 `python web_app.py`, # 都把 backend 目录加入 sys.path,保证 `core`、`routes`、`db` 等包解析一致。 _BACKEND_ROOT = os.path.dirname(os.path.abspath(__file__)) +_PROJECT_ROOT = os.path.dirname(os.path.dirname(_BACKEND_ROOT)) if _BACKEND_ROOT not in sys.path: sys.path.insert(0, _BACKEND_ROOT) @@ -31,8 +32,8 @@ from db import crud from routes import register_routes -# 加载 backend/.env(无论从哪个目录启动都指向同一文件) -load_dotenv(os.path.join(_BACKEND_ROOT, ".env")) +# 加载项目根目录 .env(无论从哪个目录启动都指向同一文件) +load_dotenv(os.path.join(_PROJECT_ROOT, ".env")) # 模块级日志记录器,日志名称为 'web_app' logger = logging.getLogger(__name__) diff --git a/backend/wsgi.py b/apps/backend/wsgi.py similarity index 100% rename from backend/wsgi.py rename to apps/backend/wsgi.py diff --git a/frontend/.gitignore b/apps/frontend/.gitignore similarity index 100% rename from frontend/.gitignore rename to apps/frontend/.gitignore diff --git a/frontend/.vscode/extensions.json b/apps/frontend/.vscode/extensions.json similarity index 100% rename from frontend/.vscode/extensions.json rename to apps/frontend/.vscode/extensions.json diff --git a/frontend/app.html b/apps/frontend/app.html similarity index 100% rename from frontend/app.html rename to apps/frontend/app.html diff --git a/frontend/package-lock.json b/apps/frontend/package-lock.json similarity index 100% rename from frontend/package-lock.json rename to apps/frontend/package-lock.json diff --git a/frontend/package.json b/apps/frontend/package.json similarity index 100% rename from frontend/package.json rename to apps/frontend/package.json diff --git a/frontend/public/favicon.svg b/apps/frontend/public/favicon.svg similarity index 100% rename from frontend/public/favicon.svg rename to apps/frontend/public/favicon.svg diff --git a/frontend/public/logo.svg b/apps/frontend/public/logo.svg similarity index 100% rename from frontend/public/logo.svg rename to apps/frontend/public/logo.svg diff --git a/frontend/src/App.vue b/apps/frontend/src/App.vue similarity index 100% rename from frontend/src/App.vue rename to apps/frontend/src/App.vue diff --git a/frontend/src/__tests__/README.md b/apps/frontend/src/__tests__/README.md similarity index 100% rename from frontend/src/__tests__/README.md rename to apps/frontend/src/__tests__/README.md diff --git a/frontend/src/__tests__/api.test.ts b/apps/frontend/src/__tests__/api.test.ts similarity index 100% rename from frontend/src/__tests__/api.test.ts rename to apps/frontend/src/__tests__/api.test.ts diff --git a/frontend/src/__tests__/chat-page-model-selector.test.ts b/apps/frontend/src/__tests__/chat-page-model-selector.test.ts similarity index 100% rename from frontend/src/__tests__/chat-page-model-selector.test.ts rename to apps/frontend/src/__tests__/chat-page-model-selector.test.ts diff --git a/frontend/src/__tests__/state.test.ts b/apps/frontend/src/__tests__/state.test.ts similarity index 100% rename from frontend/src/__tests__/state.test.ts rename to apps/frontend/src/__tests__/state.test.ts diff --git a/frontend/src/__tests__/utils.test.ts b/apps/frontend/src/__tests__/utils.test.ts similarity index 100% rename from frontend/src/__tests__/utils.test.ts rename to apps/frontend/src/__tests__/utils.test.ts diff --git a/frontend/src/api/auth.ts b/apps/frontend/src/api/auth.ts similarity index 100% rename from frontend/src/api/auth.ts rename to apps/frontend/src/api/auth.ts diff --git a/frontend/src/api/chat.ts b/apps/frontend/src/api/chat.ts similarity index 100% rename from frontend/src/api/chat.ts rename to apps/frontend/src/api/chat.ts diff --git a/frontend/src/api/client.ts b/apps/frontend/src/api/client.ts similarity index 100% rename from frontend/src/api/client.ts rename to apps/frontend/src/api/client.ts diff --git a/frontend/src/api/config.ts b/apps/frontend/src/api/config.ts similarity index 100% rename from frontend/src/api/config.ts rename to apps/frontend/src/api/config.ts diff --git a/frontend/src/api/index.ts b/apps/frontend/src/api/index.ts similarity index 100% rename from frontend/src/api/index.ts rename to apps/frontend/src/api/index.ts diff --git a/frontend/src/api/notes.ts b/apps/frontend/src/api/notes.ts similarity index 100% rename from frontend/src/api/notes.ts rename to apps/frontend/src/api/notes.ts diff --git a/frontend/src/api/projects.ts b/apps/frontend/src/api/projects.ts similarity index 100% rename from frontend/src/api/projects.ts rename to apps/frontend/src/api/projects.ts diff --git a/frontend/src/api/questions.ts b/apps/frontend/src/api/questions.ts similarity index 100% rename from frontend/src/api/questions.ts rename to apps/frontend/src/api/questions.ts diff --git a/frontend/src/api/splitRecords.ts b/apps/frontend/src/api/splitRecords.ts similarity index 100% rename from frontend/src/api/splitRecords.ts rename to apps/frontend/src/api/splitRecords.ts diff --git a/frontend/src/api/upload.ts b/apps/frontend/src/api/upload.ts similarity index 100% rename from frontend/src/api/upload.ts rename to apps/frontend/src/api/upload.ts diff --git a/frontend/src/assets/deepseek.svg b/apps/frontend/src/assets/deepseek.svg similarity index 100% rename from frontend/src/assets/deepseek.svg rename to apps/frontend/src/assets/deepseek.svg diff --git a/frontend/src/assets/ernie.svg b/apps/frontend/src/assets/ernie.svg similarity index 100% rename from frontend/src/assets/ernie.svg rename to apps/frontend/src/assets/ernie.svg diff --git a/frontend/src/assets/provider-anthropic.svg b/apps/frontend/src/assets/provider-anthropic.svg similarity index 100% rename from frontend/src/assets/provider-anthropic.svg rename to apps/frontend/src/assets/provider-anthropic.svg diff --git a/frontend/src/assets/provider-openai.svg b/apps/frontend/src/assets/provider-openai.svg similarity index 100% rename from frontend/src/assets/provider-openai.svg rename to apps/frontend/src/assets/provider-openai.svg diff --git a/frontend/src/assets/provider-paddleocr.svg b/apps/frontend/src/assets/provider-paddleocr.svg similarity index 100% rename from frontend/src/assets/provider-paddleocr.svg rename to apps/frontend/src/assets/provider-paddleocr.svg diff --git a/frontend/src/components/base/BaseAccordion.vue b/apps/frontend/src/components/base/BaseAccordion.vue similarity index 100% rename from frontend/src/components/base/BaseAccordion.vue rename to apps/frontend/src/components/base/BaseAccordion.vue diff --git a/frontend/src/components/base/BaseAffix.vue b/apps/frontend/src/components/base/BaseAffix.vue similarity index 100% rename from frontend/src/components/base/BaseAffix.vue rename to apps/frontend/src/components/base/BaseAffix.vue diff --git a/frontend/src/components/base/BaseAlert.vue b/apps/frontend/src/components/base/BaseAlert.vue similarity index 100% rename from frontend/src/components/base/BaseAlert.vue rename to apps/frontend/src/components/base/BaseAlert.vue diff --git a/frontend/src/components/base/BaseAnchor.vue b/apps/frontend/src/components/base/BaseAnchor.vue similarity index 100% rename from frontend/src/components/base/BaseAnchor.vue rename to apps/frontend/src/components/base/BaseAnchor.vue diff --git a/frontend/src/components/base/BaseAvatar.vue b/apps/frontend/src/components/base/BaseAvatar.vue similarity index 100% rename from frontend/src/components/base/BaseAvatar.vue rename to apps/frontend/src/components/base/BaseAvatar.vue diff --git a/frontend/src/components/base/BaseAvatarGroup.vue b/apps/frontend/src/components/base/BaseAvatarGroup.vue similarity index 100% rename from frontend/src/components/base/BaseAvatarGroup.vue rename to apps/frontend/src/components/base/BaseAvatarGroup.vue diff --git a/frontend/src/components/base/BaseBackTop.vue b/apps/frontend/src/components/base/BaseBackTop.vue similarity index 100% rename from frontend/src/components/base/BaseBackTop.vue rename to apps/frontend/src/components/base/BaseBackTop.vue diff --git a/frontend/src/components/base/BaseBadge.vue b/apps/frontend/src/components/base/BaseBadge.vue similarity index 100% rename from frontend/src/components/base/BaseBadge.vue rename to apps/frontend/src/components/base/BaseBadge.vue diff --git a/frontend/src/components/base/BaseBreadcrumb.vue b/apps/frontend/src/components/base/BaseBreadcrumb.vue similarity index 100% rename from frontend/src/components/base/BaseBreadcrumb.vue rename to apps/frontend/src/components/base/BaseBreadcrumb.vue diff --git a/frontend/src/components/base/BaseBreadcrumbItem.vue b/apps/frontend/src/components/base/BaseBreadcrumbItem.vue similarity index 100% rename from frontend/src/components/base/BaseBreadcrumbItem.vue rename to apps/frontend/src/components/base/BaseBreadcrumbItem.vue diff --git a/frontend/src/components/base/BaseButton.vue b/apps/frontend/src/components/base/BaseButton.vue similarity index 100% rename from frontend/src/components/base/BaseButton.vue rename to apps/frontend/src/components/base/BaseButton.vue diff --git a/frontend/src/components/base/BaseButtonGroup.vue b/apps/frontend/src/components/base/BaseButtonGroup.vue similarity index 100% rename from frontend/src/components/base/BaseButtonGroup.vue rename to apps/frontend/src/components/base/BaseButtonGroup.vue diff --git a/frontend/src/components/base/BaseCalendar.vue b/apps/frontend/src/components/base/BaseCalendar.vue similarity index 100% rename from frontend/src/components/base/BaseCalendar.vue rename to apps/frontend/src/components/base/BaseCalendar.vue diff --git a/frontend/src/components/base/BaseCard.vue b/apps/frontend/src/components/base/BaseCard.vue similarity index 100% rename from frontend/src/components/base/BaseCard.vue rename to apps/frontend/src/components/base/BaseCard.vue diff --git a/frontend/src/components/base/BaseCarousel.vue b/apps/frontend/src/components/base/BaseCarousel.vue similarity index 100% rename from frontend/src/components/base/BaseCarousel.vue rename to apps/frontend/src/components/base/BaseCarousel.vue diff --git a/frontend/src/components/base/BaseCascader.vue b/apps/frontend/src/components/base/BaseCascader.vue similarity index 100% rename from frontend/src/components/base/BaseCascader.vue rename to apps/frontend/src/components/base/BaseCascader.vue diff --git a/frontend/src/components/base/BaseCheckbox.vue b/apps/frontend/src/components/base/BaseCheckbox.vue similarity index 100% rename from frontend/src/components/base/BaseCheckbox.vue rename to apps/frontend/src/components/base/BaseCheckbox.vue diff --git a/frontend/src/components/base/BaseCheckboxGroup.vue b/apps/frontend/src/components/base/BaseCheckboxGroup.vue similarity index 100% rename from frontend/src/components/base/BaseCheckboxGroup.vue rename to apps/frontend/src/components/base/BaseCheckboxGroup.vue diff --git a/frontend/src/components/base/BaseCircleProgress.vue b/apps/frontend/src/components/base/BaseCircleProgress.vue similarity index 100% rename from frontend/src/components/base/BaseCircleProgress.vue rename to apps/frontend/src/components/base/BaseCircleProgress.vue diff --git a/frontend/src/components/base/BaseCodeBlock.vue b/apps/frontend/src/components/base/BaseCodeBlock.vue similarity index 100% rename from frontend/src/components/base/BaseCodeBlock.vue rename to apps/frontend/src/components/base/BaseCodeBlock.vue diff --git a/frontend/src/components/base/BaseColorPicker.vue b/apps/frontend/src/components/base/BaseColorPicker.vue similarity index 100% rename from frontend/src/components/base/BaseColorPicker.vue rename to apps/frontend/src/components/base/BaseColorPicker.vue diff --git a/frontend/src/components/base/BaseCombobox.vue b/apps/frontend/src/components/base/BaseCombobox.vue similarity index 100% rename from frontend/src/components/base/BaseCombobox.vue rename to apps/frontend/src/components/base/BaseCombobox.vue diff --git a/frontend/src/components/base/BaseCommandPalette.vue b/apps/frontend/src/components/base/BaseCommandPalette.vue similarity index 100% rename from frontend/src/components/base/BaseCommandPalette.vue rename to apps/frontend/src/components/base/BaseCommandPalette.vue diff --git a/frontend/src/components/base/BaseCopyButton.vue b/apps/frontend/src/components/base/BaseCopyButton.vue similarity index 100% rename from frontend/src/components/base/BaseCopyButton.vue rename to apps/frontend/src/components/base/BaseCopyButton.vue diff --git a/frontend/src/components/base/BaseCountdown.vue b/apps/frontend/src/components/base/BaseCountdown.vue similarity index 100% rename from frontend/src/components/base/BaseCountdown.vue rename to apps/frontend/src/components/base/BaseCountdown.vue diff --git a/frontend/src/components/base/BaseDataTable.vue b/apps/frontend/src/components/base/BaseDataTable.vue similarity index 100% rename from frontend/src/components/base/BaseDataTable.vue rename to apps/frontend/src/components/base/BaseDataTable.vue diff --git a/frontend/src/components/base/BaseDatePicker.vue b/apps/frontend/src/components/base/BaseDatePicker.vue similarity index 100% rename from frontend/src/components/base/BaseDatePicker.vue rename to apps/frontend/src/components/base/BaseDatePicker.vue diff --git a/frontend/src/components/base/BaseDateRangePicker.vue b/apps/frontend/src/components/base/BaseDateRangePicker.vue similarity index 100% rename from frontend/src/components/base/BaseDateRangePicker.vue rename to apps/frontend/src/components/base/BaseDateRangePicker.vue diff --git a/frontend/src/components/base/BaseDescriptions.vue b/apps/frontend/src/components/base/BaseDescriptions.vue similarity index 100% rename from frontend/src/components/base/BaseDescriptions.vue rename to apps/frontend/src/components/base/BaseDescriptions.vue diff --git a/frontend/src/components/base/BaseDivider.vue b/apps/frontend/src/components/base/BaseDivider.vue similarity index 100% rename from frontend/src/components/base/BaseDivider.vue rename to apps/frontend/src/components/base/BaseDivider.vue diff --git a/frontend/src/components/base/BaseDrawer.vue b/apps/frontend/src/components/base/BaseDrawer.vue similarity index 100% rename from frontend/src/components/base/BaseDrawer.vue rename to apps/frontend/src/components/base/BaseDrawer.vue diff --git a/frontend/src/components/base/BaseDropdown.vue b/apps/frontend/src/components/base/BaseDropdown.vue similarity index 100% rename from frontend/src/components/base/BaseDropdown.vue rename to apps/frontend/src/components/base/BaseDropdown.vue diff --git a/frontend/src/components/base/BaseEllipsis.vue b/apps/frontend/src/components/base/BaseEllipsis.vue similarity index 100% rename from frontend/src/components/base/BaseEllipsis.vue rename to apps/frontend/src/components/base/BaseEllipsis.vue diff --git a/frontend/src/components/base/BaseEmptyState.vue b/apps/frontend/src/components/base/BaseEmptyState.vue similarity index 100% rename from frontend/src/components/base/BaseEmptyState.vue rename to apps/frontend/src/components/base/BaseEmptyState.vue diff --git a/frontend/src/components/base/BaseFieldMessage.vue b/apps/frontend/src/components/base/BaseFieldMessage.vue similarity index 100% rename from frontend/src/components/base/BaseFieldMessage.vue rename to apps/frontend/src/components/base/BaseFieldMessage.vue diff --git a/frontend/src/components/base/BaseFloatButton.vue b/apps/frontend/src/components/base/BaseFloatButton.vue similarity index 100% rename from frontend/src/components/base/BaseFloatButton.vue rename to apps/frontend/src/components/base/BaseFloatButton.vue diff --git a/frontend/src/components/base/BaseForm.vue b/apps/frontend/src/components/base/BaseForm.vue similarity index 100% rename from frontend/src/components/base/BaseForm.vue rename to apps/frontend/src/components/base/BaseForm.vue diff --git a/frontend/src/components/base/BaseFormItem.vue b/apps/frontend/src/components/base/BaseFormItem.vue similarity index 100% rename from frontend/src/components/base/BaseFormItem.vue rename to apps/frontend/src/components/base/BaseFormItem.vue diff --git a/frontend/src/components/base/BaseHighlight.vue b/apps/frontend/src/components/base/BaseHighlight.vue similarity index 100% rename from frontend/src/components/base/BaseHighlight.vue rename to apps/frontend/src/components/base/BaseHighlight.vue diff --git a/frontend/src/components/base/BaseImage.vue b/apps/frontend/src/components/base/BaseImage.vue similarity index 100% rename from frontend/src/components/base/BaseImage.vue rename to apps/frontend/src/components/base/BaseImage.vue diff --git a/frontend/src/components/base/BaseInfiniteScroll.vue b/apps/frontend/src/components/base/BaseInfiniteScroll.vue similarity index 100% rename from frontend/src/components/base/BaseInfiniteScroll.vue rename to apps/frontend/src/components/base/BaseInfiniteScroll.vue diff --git a/frontend/src/components/base/BaseInput.vue b/apps/frontend/src/components/base/BaseInput.vue similarity index 100% rename from frontend/src/components/base/BaseInput.vue rename to apps/frontend/src/components/base/BaseInput.vue diff --git a/frontend/src/components/base/BaseKbd.vue b/apps/frontend/src/components/base/BaseKbd.vue similarity index 100% rename from frontend/src/components/base/BaseKbd.vue rename to apps/frontend/src/components/base/BaseKbd.vue diff --git a/frontend/src/components/base/BaseLink.vue b/apps/frontend/src/components/base/BaseLink.vue similarity index 100% rename from frontend/src/components/base/BaseLink.vue rename to apps/frontend/src/components/base/BaseLink.vue diff --git a/frontend/src/components/base/BaseListGroup.vue b/apps/frontend/src/components/base/BaseListGroup.vue similarity index 100% rename from frontend/src/components/base/BaseListGroup.vue rename to apps/frontend/src/components/base/BaseListGroup.vue diff --git a/frontend/src/components/base/BaseListItem.vue b/apps/frontend/src/components/base/BaseListItem.vue similarity index 100% rename from frontend/src/components/base/BaseListItem.vue rename to apps/frontend/src/components/base/BaseListItem.vue diff --git a/frontend/src/components/base/BaseLoading.vue b/apps/frontend/src/components/base/BaseLoading.vue similarity index 100% rename from frontend/src/components/base/BaseLoading.vue rename to apps/frontend/src/components/base/BaseLoading.vue diff --git a/frontend/src/components/base/BaseLoadingBar.vue b/apps/frontend/src/components/base/BaseLoadingBar.vue similarity index 100% rename from frontend/src/components/base/BaseLoadingBar.vue rename to apps/frontend/src/components/base/BaseLoadingBar.vue diff --git a/frontend/src/components/base/BaseLogo.vue b/apps/frontend/src/components/base/BaseLogo.vue similarity index 100% rename from frontend/src/components/base/BaseLogo.vue rename to apps/frontend/src/components/base/BaseLogo.vue diff --git a/frontend/src/components/base/BaseMarquee.vue b/apps/frontend/src/components/base/BaseMarquee.vue similarity index 100% rename from frontend/src/components/base/BaseMarquee.vue rename to apps/frontend/src/components/base/BaseMarquee.vue diff --git a/frontend/src/components/base/BaseMention.vue b/apps/frontend/src/components/base/BaseMention.vue similarity index 100% rename from frontend/src/components/base/BaseMention.vue rename to apps/frontend/src/components/base/BaseMention.vue diff --git a/frontend/src/components/base/BaseMenu.vue b/apps/frontend/src/components/base/BaseMenu.vue similarity index 100% rename from frontend/src/components/base/BaseMenu.vue rename to apps/frontend/src/components/base/BaseMenu.vue diff --git a/frontend/src/components/base/BaseModal.vue b/apps/frontend/src/components/base/BaseModal.vue similarity index 100% rename from frontend/src/components/base/BaseModal.vue rename to apps/frontend/src/components/base/BaseModal.vue diff --git a/frontend/src/components/base/BaseNumberAnimation.vue b/apps/frontend/src/components/base/BaseNumberAnimation.vue similarity index 100% rename from frontend/src/components/base/BaseNumberAnimation.vue rename to apps/frontend/src/components/base/BaseNumberAnimation.vue diff --git a/frontend/src/components/base/BaseNumberInput.vue b/apps/frontend/src/components/base/BaseNumberInput.vue similarity index 100% rename from frontend/src/components/base/BaseNumberInput.vue rename to apps/frontend/src/components/base/BaseNumberInput.vue diff --git a/frontend/src/components/base/BasePagination.vue b/apps/frontend/src/components/base/BasePagination.vue similarity index 100% rename from frontend/src/components/base/BasePagination.vue rename to apps/frontend/src/components/base/BasePagination.vue diff --git a/frontend/src/components/base/BasePanel.vue b/apps/frontend/src/components/base/BasePanel.vue similarity index 100% rename from frontend/src/components/base/BasePanel.vue rename to apps/frontend/src/components/base/BasePanel.vue diff --git a/frontend/src/components/base/BasePanelTitle.vue b/apps/frontend/src/components/base/BasePanelTitle.vue similarity index 100% rename from frontend/src/components/base/BasePanelTitle.vue rename to apps/frontend/src/components/base/BasePanelTitle.vue diff --git a/frontend/src/components/base/BasePinInput.vue b/apps/frontend/src/components/base/BasePinInput.vue similarity index 100% rename from frontend/src/components/base/BasePinInput.vue rename to apps/frontend/src/components/base/BasePinInput.vue diff --git a/frontend/src/components/base/BasePopconfirm.vue b/apps/frontend/src/components/base/BasePopconfirm.vue similarity index 100% rename from frontend/src/components/base/BasePopconfirm.vue rename to apps/frontend/src/components/base/BasePopconfirm.vue diff --git a/frontend/src/components/base/BasePopover.vue b/apps/frontend/src/components/base/BasePopover.vue similarity index 100% rename from frontend/src/components/base/BasePopover.vue rename to apps/frontend/src/components/base/BasePopover.vue diff --git a/frontend/src/components/base/BaseProgress.vue b/apps/frontend/src/components/base/BaseProgress.vue similarity index 100% rename from frontend/src/components/base/BaseProgress.vue rename to apps/frontend/src/components/base/BaseProgress.vue diff --git a/frontend/src/components/base/BaseRadio.vue b/apps/frontend/src/components/base/BaseRadio.vue similarity index 100% rename from frontend/src/components/base/BaseRadio.vue rename to apps/frontend/src/components/base/BaseRadio.vue diff --git a/frontend/src/components/base/BaseRadioGroup.vue b/apps/frontend/src/components/base/BaseRadioGroup.vue similarity index 100% rename from frontend/src/components/base/BaseRadioGroup.vue rename to apps/frontend/src/components/base/BaseRadioGroup.vue diff --git a/frontend/src/components/base/BaseRate.vue b/apps/frontend/src/components/base/BaseRate.vue similarity index 100% rename from frontend/src/components/base/BaseRate.vue rename to apps/frontend/src/components/base/BaseRate.vue diff --git a/frontend/src/components/base/BaseResizablePanels.vue b/apps/frontend/src/components/base/BaseResizablePanels.vue similarity index 100% rename from frontend/src/components/base/BaseResizablePanels.vue rename to apps/frontend/src/components/base/BaseResizablePanels.vue diff --git a/frontend/src/components/base/BaseResult.vue b/apps/frontend/src/components/base/BaseResult.vue similarity index 100% rename from frontend/src/components/base/BaseResult.vue rename to apps/frontend/src/components/base/BaseResult.vue diff --git a/frontend/src/components/base/BaseRibbon.vue b/apps/frontend/src/components/base/BaseRibbon.vue similarity index 100% rename from frontend/src/components/base/BaseRibbon.vue rename to apps/frontend/src/components/base/BaseRibbon.vue diff --git a/frontend/src/components/base/BaseScrollbar.vue b/apps/frontend/src/components/base/BaseScrollbar.vue similarity index 100% rename from frontend/src/components/base/BaseScrollbar.vue rename to apps/frontend/src/components/base/BaseScrollbar.vue diff --git a/frontend/src/components/base/BaseSearchInput.vue b/apps/frontend/src/components/base/BaseSearchInput.vue similarity index 100% rename from frontend/src/components/base/BaseSearchInput.vue rename to apps/frontend/src/components/base/BaseSearchInput.vue diff --git a/frontend/src/components/base/BaseSearchableSelect.vue b/apps/frontend/src/components/base/BaseSearchableSelect.vue similarity index 100% rename from frontend/src/components/base/BaseSearchableSelect.vue rename to apps/frontend/src/components/base/BaseSearchableSelect.vue diff --git a/frontend/src/components/base/BaseSegmented.vue b/apps/frontend/src/components/base/BaseSegmented.vue similarity index 100% rename from frontend/src/components/base/BaseSegmented.vue rename to apps/frontend/src/components/base/BaseSegmented.vue diff --git a/frontend/src/components/base/BaseSelect.vue b/apps/frontend/src/components/base/BaseSelect.vue similarity index 100% rename from frontend/src/components/base/BaseSelect.vue rename to apps/frontend/src/components/base/BaseSelect.vue diff --git a/frontend/src/components/base/BaseSkeleton.vue b/apps/frontend/src/components/base/BaseSkeleton.vue similarity index 100% rename from frontend/src/components/base/BaseSkeleton.vue rename to apps/frontend/src/components/base/BaseSkeleton.vue diff --git a/frontend/src/components/base/BaseSlider.vue b/apps/frontend/src/components/base/BaseSlider.vue similarity index 100% rename from frontend/src/components/base/BaseSlider.vue rename to apps/frontend/src/components/base/BaseSlider.vue diff --git a/frontend/src/components/base/BaseSpin.vue b/apps/frontend/src/components/base/BaseSpin.vue similarity index 100% rename from frontend/src/components/base/BaseSpin.vue rename to apps/frontend/src/components/base/BaseSpin.vue diff --git a/frontend/src/components/base/BaseStat.vue b/apps/frontend/src/components/base/BaseStat.vue similarity index 100% rename from frontend/src/components/base/BaseStat.vue rename to apps/frontend/src/components/base/BaseStat.vue diff --git a/frontend/src/components/base/BaseStatusPill.vue b/apps/frontend/src/components/base/BaseStatusPill.vue similarity index 100% rename from frontend/src/components/base/BaseStatusPill.vue rename to apps/frontend/src/components/base/BaseStatusPill.vue diff --git a/frontend/src/components/base/BaseStepper.vue b/apps/frontend/src/components/base/BaseStepper.vue similarity index 100% rename from frontend/src/components/base/BaseStepper.vue rename to apps/frontend/src/components/base/BaseStepper.vue diff --git a/frontend/src/components/base/BaseSurface.vue b/apps/frontend/src/components/base/BaseSurface.vue similarity index 100% rename from frontend/src/components/base/BaseSurface.vue rename to apps/frontend/src/components/base/BaseSurface.vue diff --git a/frontend/src/components/base/BaseSwitch.vue b/apps/frontend/src/components/base/BaseSwitch.vue similarity index 100% rename from frontend/src/components/base/BaseSwitch.vue rename to apps/frontend/src/components/base/BaseSwitch.vue diff --git a/frontend/src/components/base/BaseTable.vue b/apps/frontend/src/components/base/BaseTable.vue similarity index 100% rename from frontend/src/components/base/BaseTable.vue rename to apps/frontend/src/components/base/BaseTable.vue diff --git a/frontend/src/components/base/BaseTabs.vue b/apps/frontend/src/components/base/BaseTabs.vue similarity index 100% rename from frontend/src/components/base/BaseTabs.vue rename to apps/frontend/src/components/base/BaseTabs.vue diff --git a/frontend/src/components/base/BaseTag.vue b/apps/frontend/src/components/base/BaseTag.vue similarity index 100% rename from frontend/src/components/base/BaseTag.vue rename to apps/frontend/src/components/base/BaseTag.vue diff --git a/frontend/src/components/base/BaseTagsInput.vue b/apps/frontend/src/components/base/BaseTagsInput.vue similarity index 100% rename from frontend/src/components/base/BaseTagsInput.vue rename to apps/frontend/src/components/base/BaseTagsInput.vue diff --git a/frontend/src/components/base/BaseTextarea.vue b/apps/frontend/src/components/base/BaseTextarea.vue similarity index 100% rename from frontend/src/components/base/BaseTextarea.vue rename to apps/frontend/src/components/base/BaseTextarea.vue diff --git a/frontend/src/components/base/BaseTimePicker.vue b/apps/frontend/src/components/base/BaseTimePicker.vue similarity index 100% rename from frontend/src/components/base/BaseTimePicker.vue rename to apps/frontend/src/components/base/BaseTimePicker.vue diff --git a/frontend/src/components/base/BaseTimeline.vue b/apps/frontend/src/components/base/BaseTimeline.vue similarity index 100% rename from frontend/src/components/base/BaseTimeline.vue rename to apps/frontend/src/components/base/BaseTimeline.vue diff --git a/frontend/src/components/base/BaseToastContainer.vue b/apps/frontend/src/components/base/BaseToastContainer.vue similarity index 100% rename from frontend/src/components/base/BaseToastContainer.vue rename to apps/frontend/src/components/base/BaseToastContainer.vue diff --git a/frontend/src/components/base/BaseToolbarButton.vue b/apps/frontend/src/components/base/BaseToolbarButton.vue similarity index 100% rename from frontend/src/components/base/BaseToolbarButton.vue rename to apps/frontend/src/components/base/BaseToolbarButton.vue diff --git a/frontend/src/components/base/BaseTooltip.vue b/apps/frontend/src/components/base/BaseTooltip.vue similarity index 100% rename from frontend/src/components/base/BaseTooltip.vue rename to apps/frontend/src/components/base/BaseTooltip.vue diff --git a/frontend/src/components/base/BaseTooltipProvider.vue b/apps/frontend/src/components/base/BaseTooltipProvider.vue similarity index 100% rename from frontend/src/components/base/BaseTooltipProvider.vue rename to apps/frontend/src/components/base/BaseTooltipProvider.vue diff --git a/frontend/src/components/base/BaseTour.vue b/apps/frontend/src/components/base/BaseTour.vue similarity index 100% rename from frontend/src/components/base/BaseTour.vue rename to apps/frontend/src/components/base/BaseTour.vue diff --git a/frontend/src/components/base/BaseTransfer.vue b/apps/frontend/src/components/base/BaseTransfer.vue similarity index 100% rename from frontend/src/components/base/BaseTransfer.vue rename to apps/frontend/src/components/base/BaseTransfer.vue diff --git a/frontend/src/components/base/BaseTree.vue b/apps/frontend/src/components/base/BaseTree.vue similarity index 100% rename from frontend/src/components/base/BaseTree.vue rename to apps/frontend/src/components/base/BaseTree.vue diff --git a/frontend/src/components/base/BaseTreeSelect.vue b/apps/frontend/src/components/base/BaseTreeSelect.vue similarity index 100% rename from frontend/src/components/base/BaseTreeSelect.vue rename to apps/frontend/src/components/base/BaseTreeSelect.vue diff --git a/frontend/src/components/base/BaseUpload.vue b/apps/frontend/src/components/base/BaseUpload.vue similarity index 100% rename from frontend/src/components/base/BaseUpload.vue rename to apps/frontend/src/components/base/BaseUpload.vue diff --git a/frontend/src/components/base/BaseVirtualList.vue b/apps/frontend/src/components/base/BaseVirtualList.vue similarity index 100% rename from frontend/src/components/base/BaseVirtualList.vue rename to apps/frontend/src/components/base/BaseVirtualList.vue diff --git a/frontend/src/components/base/BaseWatermark.vue b/apps/frontend/src/components/base/BaseWatermark.vue similarity index 100% rename from frontend/src/components/base/BaseWatermark.vue rename to apps/frontend/src/components/base/BaseWatermark.vue diff --git a/frontend/src/components/base/ImageModal.vue b/apps/frontend/src/components/base/ImageModal.vue similarity index 100% rename from frontend/src/components/base/ImageModal.vue rename to apps/frontend/src/components/base/ImageModal.vue diff --git a/frontend/src/components/base/index.ts b/apps/frontend/src/components/base/index.ts similarity index 100% rename from frontend/src/components/base/index.ts rename to apps/frontend/src/components/base/index.ts diff --git a/frontend/src/components/base/registry.ts b/apps/frontend/src/components/base/registry.ts similarity index 100% rename from frontend/src/components/base/registry.ts rename to apps/frontend/src/components/base/registry.ts diff --git a/frontend/src/components/features/app/dashboard/ErrorDistributionCard.vue b/apps/frontend/src/components/features/app/dashboard/ErrorDistributionCard.vue similarity index 100% rename from frontend/src/components/features/app/dashboard/ErrorDistributionCard.vue rename to apps/frontend/src/components/features/app/dashboard/ErrorDistributionCard.vue diff --git a/frontend/src/components/features/app/dashboard/KnowledgeCompareCard.vue b/apps/frontend/src/components/features/app/dashboard/KnowledgeCompareCard.vue similarity index 100% rename from frontend/src/components/features/app/dashboard/KnowledgeCompareCard.vue rename to apps/frontend/src/components/features/app/dashboard/KnowledgeCompareCard.vue diff --git a/frontend/src/components/features/app/dashboard/KnowledgeRadarCard.vue b/apps/frontend/src/components/features/app/dashboard/KnowledgeRadarCard.vue similarity index 100% rename from frontend/src/components/features/app/dashboard/KnowledgeRadarCard.vue rename to apps/frontend/src/components/features/app/dashboard/KnowledgeRadarCard.vue diff --git a/frontend/src/components/features/app/dashboard/LearningTrendCard.vue b/apps/frontend/src/components/features/app/dashboard/LearningTrendCard.vue similarity index 100% rename from frontend/src/components/features/app/dashboard/LearningTrendCard.vue rename to apps/frontend/src/components/features/app/dashboard/LearningTrendCard.vue diff --git a/frontend/src/components/features/app/dashboard/PriorityBarCard.vue b/apps/frontend/src/components/features/app/dashboard/PriorityBarCard.vue similarity index 100% rename from frontend/src/components/features/app/dashboard/PriorityBarCard.vue rename to apps/frontend/src/components/features/app/dashboard/PriorityBarCard.vue diff --git a/frontend/src/components/features/app/dashboard/StatCard.vue b/apps/frontend/src/components/features/app/dashboard/StatCard.vue similarity index 100% rename from frontend/src/components/features/app/dashboard/StatCard.vue rename to apps/frontend/src/components/features/app/dashboard/StatCard.vue diff --git a/frontend/src/components/features/app/dashboard/SummaryStatsChartCard.vue b/apps/frontend/src/components/features/app/dashboard/SummaryStatsChartCard.vue similarity index 100% rename from frontend/src/components/features/app/dashboard/SummaryStatsChartCard.vue rename to apps/frontend/src/components/features/app/dashboard/SummaryStatsChartCard.vue diff --git a/frontend/src/components/features/app/error-bank/ErrorBankToolbar.vue b/apps/frontend/src/components/features/app/error-bank/ErrorBankToolbar.vue similarity index 100% rename from frontend/src/components/features/app/error-bank/ErrorBankToolbar.vue rename to apps/frontend/src/components/features/app/error-bank/ErrorBankToolbar.vue diff --git a/frontend/src/components/features/app/error-bank/ErrorLearningAside.vue b/apps/frontend/src/components/features/app/error-bank/ErrorLearningAside.vue similarity index 100% rename from frontend/src/components/features/app/error-bank/ErrorLearningAside.vue rename to apps/frontend/src/components/features/app/error-bank/ErrorLearningAside.vue diff --git a/frontend/src/components/features/app/error-bank/ErrorQuestionDetailPanel.vue b/apps/frontend/src/components/features/app/error-bank/ErrorQuestionDetailPanel.vue similarity index 100% rename from frontend/src/components/features/app/error-bank/ErrorQuestionDetailPanel.vue rename to apps/frontend/src/components/features/app/error-bank/ErrorQuestionDetailPanel.vue diff --git a/frontend/src/components/features/app/error-bank/ErrorQuestionFinderAside.vue b/apps/frontend/src/components/features/app/error-bank/ErrorQuestionFinderAside.vue similarity index 100% rename from frontend/src/components/features/app/error-bank/ErrorQuestionFinderAside.vue rename to apps/frontend/src/components/features/app/error-bank/ErrorQuestionFinderAside.vue diff --git a/frontend/src/components/features/app/error-bank/ErrorQuestionListItem.vue b/apps/frontend/src/components/features/app/error-bank/ErrorQuestionListItem.vue similarity index 100% rename from frontend/src/components/features/app/error-bank/ErrorQuestionListItem.vue rename to apps/frontend/src/components/features/app/error-bank/ErrorQuestionListItem.vue diff --git a/frontend/src/components/features/app/error-bank/ErrorQuestionListPanel.vue b/apps/frontend/src/components/features/app/error-bank/ErrorQuestionListPanel.vue similarity index 100% rename from frontend/src/components/features/app/error-bank/ErrorQuestionListPanel.vue rename to apps/frontend/src/components/features/app/error-bank/ErrorQuestionListPanel.vue diff --git a/frontend/src/components/features/app/layout/ChatSearchDialog.vue b/apps/frontend/src/components/features/app/layout/ChatSearchDialog.vue similarity index 100% rename from frontend/src/components/features/app/layout/ChatSearchDialog.vue rename to apps/frontend/src/components/features/app/layout/ChatSearchDialog.vue diff --git a/frontend/src/components/features/app/layout/ContentPanel.vue b/apps/frontend/src/components/features/app/layout/ContentPanel.vue similarity index 100% rename from frontend/src/components/features/app/layout/ContentPanel.vue rename to apps/frontend/src/components/features/app/layout/ContentPanel.vue diff --git a/frontend/src/components/features/app/layout/PanelStepTabs.vue b/apps/frontend/src/components/features/app/layout/PanelStepTabs.vue similarity index 100% rename from frontend/src/components/features/app/layout/PanelStepTabs.vue rename to apps/frontend/src/components/features/app/layout/PanelStepTabs.vue diff --git a/frontend/src/components/features/app/layout/SidebarNav.vue b/apps/frontend/src/components/features/app/layout/SidebarNav.vue similarity index 100% rename from frontend/src/components/features/app/layout/SidebarNav.vue rename to apps/frontend/src/components/features/app/layout/SidebarNav.vue diff --git a/frontend/src/components/features/app/layout/WorkspaceBackground.vue b/apps/frontend/src/components/features/app/layout/WorkspaceBackground.vue similarity index 100% rename from frontend/src/components/features/app/layout/WorkspaceBackground.vue rename to apps/frontend/src/components/features/app/layout/WorkspaceBackground.vue diff --git a/frontend/src/components/features/app/notes/NoteDetailPanel.vue b/apps/frontend/src/components/features/app/notes/NoteDetailPanel.vue similarity index 100% rename from frontend/src/components/features/app/notes/NoteDetailPanel.vue rename to apps/frontend/src/components/features/app/notes/NoteDetailPanel.vue diff --git a/frontend/src/components/features/app/notes/NoteInsightAside.vue b/apps/frontend/src/components/features/app/notes/NoteInsightAside.vue similarity index 100% rename from frontend/src/components/features/app/notes/NoteInsightAside.vue rename to apps/frontend/src/components/features/app/notes/NoteInsightAside.vue diff --git a/frontend/src/components/features/app/notes/NoteListPanel.vue b/apps/frontend/src/components/features/app/notes/NoteListPanel.vue similarity index 100% rename from frontend/src/components/features/app/notes/NoteListPanel.vue rename to apps/frontend/src/components/features/app/notes/NoteListPanel.vue diff --git a/frontend/src/components/features/app/notes/NoteToolbar.vue b/apps/frontend/src/components/features/app/notes/NoteToolbar.vue similarity index 100% rename from frontend/src/components/features/app/notes/NoteToolbar.vue rename to apps/frontend/src/components/features/app/notes/NoteToolbar.vue diff --git a/frontend/src/components/features/app/question/EditNoteDialog.vue b/apps/frontend/src/components/features/app/question/EditNoteDialog.vue similarity index 100% rename from frontend/src/components/features/app/question/EditNoteDialog.vue rename to apps/frontend/src/components/features/app/question/EditNoteDialog.vue diff --git a/frontend/src/components/features/app/question/QuestionCard.vue b/apps/frontend/src/components/features/app/question/QuestionCard.vue similarity index 100% rename from frontend/src/components/features/app/question/QuestionCard.vue rename to apps/frontend/src/components/features/app/question/QuestionCard.vue diff --git a/frontend/src/components/features/app/question/QuestionDetailModal.vue b/apps/frontend/src/components/features/app/question/QuestionDetailModal.vue similarity index 100% rename from frontend/src/components/features/app/question/QuestionDetailModal.vue rename to apps/frontend/src/components/features/app/question/QuestionDetailModal.vue diff --git a/frontend/src/components/features/app/question/QuestionItem.vue b/apps/frontend/src/components/features/app/question/QuestionItem.vue similarity index 100% rename from frontend/src/components/features/app/question/QuestionItem.vue rename to apps/frontend/src/components/features/app/question/QuestionItem.vue diff --git a/frontend/src/components/features/app/question/QuestionItemSkeleton.vue b/apps/frontend/src/components/features/app/question/QuestionItemSkeleton.vue similarity index 100% rename from frontend/src/components/features/app/question/QuestionItemSkeleton.vue rename to apps/frontend/src/components/features/app/question/QuestionItemSkeleton.vue diff --git a/frontend/src/components/features/app/question/QuestionList.vue b/apps/frontend/src/components/features/app/question/QuestionList.vue similarity index 100% rename from frontend/src/components/features/app/question/QuestionList.vue rename to apps/frontend/src/components/features/app/question/QuestionList.vue diff --git a/frontend/src/components/features/app/review/AiAnalysisModal.vue b/apps/frontend/src/components/features/app/review/AiAnalysisModal.vue similarity index 100% rename from frontend/src/components/features/app/review/AiAnalysisModal.vue rename to apps/frontend/src/components/features/app/review/AiAnalysisModal.vue diff --git a/frontend/src/components/features/app/settings/ProviderDialog.vue b/apps/frontend/src/components/features/app/settings/ProviderDialog.vue similarity index 100% rename from frontend/src/components/features/app/settings/ProviderDialog.vue rename to apps/frontend/src/components/features/app/settings/ProviderDialog.vue diff --git a/frontend/src/components/features/app/settings/ProviderSection.vue b/apps/frontend/src/components/features/app/settings/ProviderSection.vue similarity index 100% rename from frontend/src/components/features/app/settings/ProviderSection.vue rename to apps/frontend/src/components/features/app/settings/ProviderSection.vue diff --git a/frontend/src/components/features/app/shared/ViewSettingsPopover.vue b/apps/frontend/src/components/features/app/shared/ViewSettingsPopover.vue similarity index 100% rename from frontend/src/components/features/app/shared/ViewSettingsPopover.vue rename to apps/frontend/src/components/features/app/shared/ViewSettingsPopover.vue diff --git a/frontend/src/components/features/app/workspace/ActionBar.vue b/apps/frontend/src/components/features/app/workspace/ActionBar.vue similarity index 100% rename from frontend/src/components/features/app/workspace/ActionBar.vue rename to apps/frontend/src/components/features/app/workspace/ActionBar.vue diff --git a/frontend/src/components/features/app/workspace/AnswerInputModal.vue b/apps/frontend/src/components/features/app/workspace/AnswerInputModal.vue similarity index 100% rename from frontend/src/components/features/app/workspace/AnswerInputModal.vue rename to apps/frontend/src/components/features/app/workspace/AnswerInputModal.vue diff --git a/frontend/src/components/features/app/workspace/ErasePreview.vue b/apps/frontend/src/components/features/app/workspace/ErasePreview.vue similarity index 100% rename from frontend/src/components/features/app/workspace/ErasePreview.vue rename to apps/frontend/src/components/features/app/workspace/ErasePreview.vue diff --git a/frontend/src/components/features/app/workspace/FileList.vue b/apps/frontend/src/components/features/app/workspace/FileList.vue similarity index 100% rename from frontend/src/components/features/app/workspace/FileList.vue rename to apps/frontend/src/components/features/app/workspace/FileList.vue diff --git a/frontend/src/components/features/app/workspace/FileUploader.vue b/apps/frontend/src/components/features/app/workspace/FileUploader.vue similarity index 100% rename from frontend/src/components/features/app/workspace/FileUploader.vue rename to apps/frontend/src/components/features/app/workspace/FileUploader.vue diff --git a/frontend/src/components/features/app/workspace/ModelProviderSelect.vue b/apps/frontend/src/components/features/app/workspace/ModelProviderSelect.vue similarity index 100% rename from frontend/src/components/features/app/workspace/ModelProviderSelect.vue rename to apps/frontend/src/components/features/app/workspace/ModelProviderSelect.vue diff --git a/frontend/src/components/features/app/workspace/OcrPreview.vue b/apps/frontend/src/components/features/app/workspace/OcrPreview.vue similarity index 100% rename from frontend/src/components/features/app/workspace/OcrPreview.vue rename to apps/frontend/src/components/features/app/workspace/OcrPreview.vue diff --git a/frontend/src/components/features/app/workspace/ReviewStage.vue b/apps/frontend/src/components/features/app/workspace/ReviewStage.vue similarity index 100% rename from frontend/src/components/features/app/workspace/ReviewStage.vue rename to apps/frontend/src/components/features/app/workspace/ReviewStage.vue diff --git a/frontend/src/components/features/app/workspace/SelectionPanel.vue b/apps/frontend/src/components/features/app/workspace/SelectionPanel.vue similarity index 100% rename from frontend/src/components/features/app/workspace/SelectionPanel.vue rename to apps/frontend/src/components/features/app/workspace/SelectionPanel.vue diff --git a/frontend/src/components/features/app/workspace/SplitLoading.vue b/apps/frontend/src/components/features/app/workspace/SplitLoading.vue similarity index 100% rename from frontend/src/components/features/app/workspace/SplitLoading.vue rename to apps/frontend/src/components/features/app/workspace/SplitLoading.vue diff --git a/frontend/src/components/features/app/workspace/StatusBar.vue b/apps/frontend/src/components/features/app/workspace/StatusBar.vue similarity index 100% rename from frontend/src/components/features/app/workspace/StatusBar.vue rename to apps/frontend/src/components/features/app/workspace/StatusBar.vue diff --git a/frontend/src/components/features/app/workspace/StepIndicator.vue b/apps/frontend/src/components/features/app/workspace/StepIndicator.vue similarity index 100% rename from frontend/src/components/features/app/workspace/StepIndicator.vue rename to apps/frontend/src/components/features/app/workspace/StepIndicator.vue diff --git a/frontend/src/components/features/app/workspace/UploadStage.vue b/apps/frontend/src/components/features/app/workspace/UploadStage.vue similarity index 100% rename from frontend/src/components/features/app/workspace/UploadStage.vue rename to apps/frontend/src/components/features/app/workspace/UploadStage.vue diff --git a/frontend/src/components/features/auth/ForgotPasswordModal.vue b/apps/frontend/src/components/features/auth/ForgotPasswordModal.vue similarity index 100% rename from frontend/src/components/features/auth/ForgotPasswordModal.vue rename to apps/frontend/src/components/features/auth/ForgotPasswordModal.vue diff --git a/frontend/src/components/features/home/FeatureCard.vue b/apps/frontend/src/components/features/home/FeatureCard.vue similarity index 100% rename from frontend/src/components/features/home/FeatureCard.vue rename to apps/frontend/src/components/features/home/FeatureCard.vue diff --git a/frontend/src/components/features/home/HomeFooter.vue b/apps/frontend/src/components/features/home/HomeFooter.vue similarity index 100% rename from frontend/src/components/features/home/HomeFooter.vue rename to apps/frontend/src/components/features/home/HomeFooter.vue diff --git a/frontend/src/components/features/home/HomeHeader.vue b/apps/frontend/src/components/features/home/HomeHeader.vue similarity index 100% rename from frontend/src/components/features/home/HomeHeader.vue rename to apps/frontend/src/components/features/home/HomeHeader.vue diff --git a/frontend/src/components/features/home/HomePill.vue b/apps/frontend/src/components/features/home/HomePill.vue similarity index 100% rename from frontend/src/components/features/home/HomePill.vue rename to apps/frontend/src/components/features/home/HomePill.vue diff --git a/frontend/src/components/features/home/HomeSideNav.vue b/apps/frontend/src/components/features/home/HomeSideNav.vue similarity index 100% rename from frontend/src/components/features/home/HomeSideNav.vue rename to apps/frontend/src/components/features/home/HomeSideNav.vue diff --git a/frontend/src/components/features/home/WorkflowStep.vue b/apps/frontend/src/components/features/home/WorkflowStep.vue similarity index 100% rename from frontend/src/components/features/home/WorkflowStep.vue rename to apps/frontend/src/components/features/home/WorkflowStep.vue diff --git a/frontend/src/composables/useAiChatSessions.ts b/apps/frontend/src/composables/useAiChatSessions.ts similarity index 100% rename from frontend/src/composables/useAiChatSessions.ts rename to apps/frontend/src/composables/useAiChatSessions.ts diff --git a/frontend/src/composables/useAuth.ts b/apps/frontend/src/composables/useAuth.ts similarity index 100% rename from frontend/src/composables/useAuth.ts rename to apps/frontend/src/composables/useAuth.ts diff --git a/frontend/src/composables/useChatSession.ts b/apps/frontend/src/composables/useChatSession.ts similarity index 100% rename from frontend/src/composables/useChatSession.ts rename to apps/frontend/src/composables/useChatSession.ts diff --git a/frontend/src/composables/useClickOutside.ts b/apps/frontend/src/composables/useClickOutside.ts similarity index 100% rename from frontend/src/composables/useClickOutside.ts rename to apps/frontend/src/composables/useClickOutside.ts diff --git a/frontend/src/composables/useDropdownPosition.ts b/apps/frontend/src/composables/useDropdownPosition.ts similarity index 100% rename from frontend/src/composables/useDropdownPosition.ts rename to apps/frontend/src/composables/useDropdownPosition.ts diff --git a/frontend/src/composables/useErrorBankActions.ts b/apps/frontend/src/composables/useErrorBankActions.ts similarity index 100% rename from frontend/src/composables/useErrorBankActions.ts rename to apps/frontend/src/composables/useErrorBankActions.ts diff --git a/frontend/src/composables/useErrorBankQuery.ts b/apps/frontend/src/composables/useErrorBankQuery.ts similarity index 100% rename from frontend/src/composables/useErrorBankQuery.ts rename to apps/frontend/src/composables/useErrorBankQuery.ts diff --git a/frontend/src/composables/useErrorBankStats.ts b/apps/frontend/src/composables/useErrorBankStats.ts similarity index 100% rename from frontend/src/composables/useErrorBankStats.ts rename to apps/frontend/src/composables/useErrorBankStats.ts diff --git a/frontend/src/composables/useFileUpload.ts b/apps/frontend/src/composables/useFileUpload.ts similarity index 100% rename from frontend/src/composables/useFileUpload.ts rename to apps/frontend/src/composables/useFileUpload.ts diff --git a/frontend/src/composables/useImageModal.ts b/apps/frontend/src/composables/useImageModal.ts similarity index 100% rename from frontend/src/composables/useImageModal.ts rename to apps/frontend/src/composables/useImageModal.ts diff --git a/frontend/src/composables/useOverlay.ts b/apps/frontend/src/composables/useOverlay.ts similarity index 100% rename from frontend/src/composables/useOverlay.ts rename to apps/frontend/src/composables/useOverlay.ts diff --git a/frontend/src/composables/usePageTransition.ts b/apps/frontend/src/composables/usePageTransition.ts similarity index 100% rename from frontend/src/composables/usePageTransition.ts rename to apps/frontend/src/composables/usePageTransition.ts diff --git a/frontend/src/composables/usePaginatedList.ts b/apps/frontend/src/composables/usePaginatedList.ts similarity index 100% rename from frontend/src/composables/usePaginatedList.ts rename to apps/frontend/src/composables/usePaginatedList.ts diff --git a/frontend/src/composables/useProjects.ts b/apps/frontend/src/composables/useProjects.ts similarity index 100% rename from frontend/src/composables/useProjects.ts rename to apps/frontend/src/composables/useProjects.ts diff --git a/frontend/src/composables/useQuestionList.ts b/apps/frontend/src/composables/useQuestionList.ts similarity index 100% rename from frontend/src/composables/useQuestionList.ts rename to apps/frontend/src/composables/useQuestionList.ts diff --git a/frontend/src/composables/useSelectableList.ts b/apps/frontend/src/composables/useSelectableList.ts similarity index 100% rename from frontend/src/composables/useSelectableList.ts rename to apps/frontend/src/composables/useSelectableList.ts diff --git a/frontend/src/composables/useSidebarIndicator.ts b/apps/frontend/src/composables/useSidebarIndicator.ts similarity index 100% rename from frontend/src/composables/useSidebarIndicator.ts rename to apps/frontend/src/composables/useSidebarIndicator.ts diff --git a/frontend/src/composables/useSplitPipeline.ts b/apps/frontend/src/composables/useSplitPipeline.ts similarity index 100% rename from frontend/src/composables/useSplitPipeline.ts rename to apps/frontend/src/composables/useSplitPipeline.ts diff --git a/frontend/src/composables/useSystemStatus.ts b/apps/frontend/src/composables/useSystemStatus.ts similarity index 100% rename from frontend/src/composables/useSystemStatus.ts rename to apps/frontend/src/composables/useSystemStatus.ts diff --git a/frontend/src/composables/useTheme.ts b/apps/frontend/src/composables/useTheme.ts similarity index 100% rename from frontend/src/composables/useTheme.ts rename to apps/frontend/src/composables/useTheme.ts diff --git a/frontend/src/composables/useToast.ts b/apps/frontend/src/composables/useToast.ts similarity index 100% rename from frontend/src/composables/useToast.ts rename to apps/frontend/src/composables/useToast.ts diff --git a/frontend/src/composables/useWorkspaceNav.ts b/apps/frontend/src/composables/useWorkspaceNav.ts similarity index 100% rename from frontend/src/composables/useWorkspaceNav.ts rename to apps/frontend/src/composables/useWorkspaceNav.ts diff --git a/frontend/src/composables/useWorkspaceToast.ts b/apps/frontend/src/composables/useWorkspaceToast.ts similarity index 100% rename from frontend/src/composables/useWorkspaceToast.ts rename to apps/frontend/src/composables/useWorkspaceToast.ts diff --git a/frontend/src/main.ts b/apps/frontend/src/main.ts similarity index 100% rename from frontend/src/main.ts rename to apps/frontend/src/main.ts diff --git a/frontend/src/router/index.ts b/apps/frontend/src/router/index.ts similarity index 100% rename from frontend/src/router/index.ts rename to apps/frontend/src/router/index.ts diff --git a/frontend/src/shims-vue.d.ts b/apps/frontend/src/shims-vue.d.ts similarity index 100% rename from frontend/src/shims-vue.d.ts rename to apps/frontend/src/shims-vue.d.ts diff --git a/frontend/src/style.css b/apps/frontend/src/style.css similarity index 100% rename from frontend/src/style.css rename to apps/frontend/src/style.css diff --git a/frontend/src/types/domain.ts b/apps/frontend/src/types/domain.ts similarity index 100% rename from frontend/src/types/domain.ts rename to apps/frontend/src/types/domain.ts diff --git a/frontend/src/utils/file.ts b/apps/frontend/src/utils/file.ts similarity index 100% rename from frontend/src/utils/file.ts rename to apps/frontend/src/utils/file.ts diff --git a/frontend/src/utils/format.ts b/apps/frontend/src/utils/format.ts similarity index 100% rename from frontend/src/utils/format.ts rename to apps/frontend/src/utils/format.ts diff --git a/frontend/src/utils/html.ts b/apps/frontend/src/utils/html.ts similarity index 100% rename from frontend/src/utils/html.ts rename to apps/frontend/src/utils/html.ts diff --git a/frontend/src/utils/id.ts b/apps/frontend/src/utils/id.ts similarity index 100% rename from frontend/src/utils/id.ts rename to apps/frontend/src/utils/id.ts diff --git a/frontend/src/utils/index.ts b/apps/frontend/src/utils/index.ts similarity index 100% rename from frontend/src/utils/index.ts rename to apps/frontend/src/utils/index.ts diff --git a/frontend/src/utils/markdown.ts b/apps/frontend/src/utils/markdown.ts similarity index 100% rename from frontend/src/utils/markdown.ts rename to apps/frontend/src/utils/markdown.ts diff --git a/frontend/src/utils/mathjax.ts b/apps/frontend/src/utils/mathjax.ts similarity index 100% rename from frontend/src/utils/mathjax.ts rename to apps/frontend/src/utils/mathjax.ts diff --git a/frontend/src/utils/note.ts b/apps/frontend/src/utils/note.ts similarity index 100% rename from frontend/src/utils/note.ts rename to apps/frontend/src/utils/note.ts diff --git a/frontend/src/utils/question.ts b/apps/frontend/src/utils/question.ts similarity index 100% rename from frontend/src/utils/question.ts rename to apps/frontend/src/utils/question.ts diff --git a/frontend/src/utils/scale.ts b/apps/frontend/src/utils/scale.ts similarity index 100% rename from frontend/src/utils/scale.ts rename to apps/frontend/src/utils/scale.ts diff --git a/frontend/src/views/HomeView.vue b/apps/frontend/src/views/HomeView.vue similarity index 100% rename from frontend/src/views/HomeView.vue rename to apps/frontend/src/views/HomeView.vue diff --git a/frontend/src/views/app/AppLayout.vue b/apps/frontend/src/views/app/AppLayout.vue similarity index 100% rename from frontend/src/views/app/AppLayout.vue rename to apps/frontend/src/views/app/AppLayout.vue diff --git a/frontend/src/views/app/ChatPageView.vue b/apps/frontend/src/views/app/ChatPageView.vue similarity index 100% rename from frontend/src/views/app/ChatPageView.vue rename to apps/frontend/src/views/app/ChatPageView.vue diff --git a/frontend/src/views/app/ChatView.vue b/apps/frontend/src/views/app/ChatView.vue similarity index 100% rename from frontend/src/views/app/ChatView.vue rename to apps/frontend/src/views/app/ChatView.vue diff --git a/frontend/src/views/app/ComponentPreviewView.vue b/apps/frontend/src/views/app/ComponentPreviewView.vue similarity index 100% rename from frontend/src/views/app/ComponentPreviewView.vue rename to apps/frontend/src/views/app/ComponentPreviewView.vue diff --git a/frontend/src/views/app/DashboardView.vue b/apps/frontend/src/views/app/DashboardView.vue similarity index 100% rename from frontend/src/views/app/DashboardView.vue rename to apps/frontend/src/views/app/DashboardView.vue diff --git a/frontend/src/views/app/ErrorBankView.vue b/apps/frontend/src/views/app/ErrorBankView.vue similarity index 100% rename from frontend/src/views/app/ErrorBankView.vue rename to apps/frontend/src/views/app/ErrorBankView.vue diff --git a/frontend/src/views/app/NoteView.vue b/apps/frontend/src/views/app/NoteView.vue similarity index 100% rename from frontend/src/views/app/NoteView.vue rename to apps/frontend/src/views/app/NoteView.vue diff --git a/frontend/src/views/app/ReviewView.vue b/apps/frontend/src/views/app/ReviewView.vue similarity index 100% rename from frontend/src/views/app/ReviewView.vue rename to apps/frontend/src/views/app/ReviewView.vue diff --git a/frontend/src/views/app/SearchHubView.vue b/apps/frontend/src/views/app/SearchHubView.vue similarity index 100% rename from frontend/src/views/app/SearchHubView.vue rename to apps/frontend/src/views/app/SearchHubView.vue diff --git a/frontend/src/views/app/SettingsView.vue b/apps/frontend/src/views/app/SettingsView.vue similarity index 100% rename from frontend/src/views/app/SettingsView.vue rename to apps/frontend/src/views/app/SettingsView.vue diff --git a/frontend/src/views/app/SplitHistoryView.vue b/apps/frontend/src/views/app/SplitHistoryView.vue similarity index 100% rename from frontend/src/views/app/SplitHistoryView.vue rename to apps/frontend/src/views/app/SplitHistoryView.vue diff --git a/frontend/src/views/app/WorkspaceView.vue b/apps/frontend/src/views/app/WorkspaceView.vue similarity index 100% rename from frontend/src/views/app/WorkspaceView.vue rename to apps/frontend/src/views/app/WorkspaceView.vue diff --git a/frontend/src/views/auth/AuthLayout.vue b/apps/frontend/src/views/auth/AuthLayout.vue similarity index 100% rename from frontend/src/views/auth/AuthLayout.vue rename to apps/frontend/src/views/auth/AuthLayout.vue diff --git a/frontend/src/views/auth/LoginView.vue b/apps/frontend/src/views/auth/LoginView.vue similarity index 100% rename from frontend/src/views/auth/LoginView.vue rename to apps/frontend/src/views/auth/LoginView.vue diff --git a/frontend/src/views/auth/RegisterView.vue b/apps/frontend/src/views/auth/RegisterView.vue similarity index 100% rename from frontend/src/views/auth/RegisterView.vue rename to apps/frontend/src/views/auth/RegisterView.vue diff --git a/frontend/src/views/home/HomeDemo.vue b/apps/frontend/src/views/home/HomeDemo.vue similarity index 100% rename from frontend/src/views/home/HomeDemo.vue rename to apps/frontend/src/views/home/HomeDemo.vue diff --git a/frontend/src/views/home/HomeFeatures.vue b/apps/frontend/src/views/home/HomeFeatures.vue similarity index 100% rename from frontend/src/views/home/HomeFeatures.vue rename to apps/frontend/src/views/home/HomeFeatures.vue diff --git a/frontend/src/views/home/HomeHero.vue b/apps/frontend/src/views/home/HomeHero.vue similarity index 100% rename from frontend/src/views/home/HomeHero.vue rename to apps/frontend/src/views/home/HomeHero.vue diff --git a/frontend/src/views/home/HomeWorkflow.vue b/apps/frontend/src/views/home/HomeWorkflow.vue similarity index 100% rename from frontend/src/views/home/HomeWorkflow.vue rename to apps/frontend/src/views/home/HomeWorkflow.vue diff --git a/frontend/src/vite-env.d.ts b/apps/frontend/src/vite-env.d.ts similarity index 100% rename from frontend/src/vite-env.d.ts rename to apps/frontend/src/vite-env.d.ts diff --git a/frontend/tailwind.config.ts b/apps/frontend/tailwind.config.ts similarity index 100% rename from frontend/tailwind.config.ts rename to apps/frontend/tailwind.config.ts diff --git a/frontend/tsconfig.json b/apps/frontend/tsconfig.json similarity index 100% rename from frontend/tsconfig.json rename to apps/frontend/tsconfig.json diff --git a/frontend/vite.config.ts b/apps/frontend/vite.config.ts similarity index 100% rename from frontend/vite.config.ts rename to apps/frontend/vite.config.ts diff --git a/ui-showcase/.gitignore b/apps/ui-showcase/.gitignore similarity index 100% rename from ui-showcase/.gitignore rename to apps/ui-showcase/.gitignore diff --git a/ui-showcase/README.md b/apps/ui-showcase/README.md similarity index 84% rename from ui-showcase/README.md rename to apps/ui-showcase/README.md index c6e1a0ce..b5cc4fcd 100644 --- a/ui-showcase/README.md +++ b/apps/ui-showcase/README.md @@ -1,6 +1,6 @@ # UI Showcase -独立的组件库展示项目,用于集中预览主应用 `frontend/src/components/base` 下的全部 Base 组件(Headless UI + Tailwind 实现)。 +独立的组件库展示项目,用于集中预览主应用 `apps/frontend/src/components/base` 下的全部 Base 组件(Headless UI + Tailwind 实现)。 ## 特性 @@ -27,5 +27,5 @@ npm run dev ## 注意 -- 本项目依赖 `../frontend` 的源码存在;Tailwind 的 `content` 配置也会扫描该目录。 +- 本项目依赖同级的 `../frontend` 源码目录;Tailwind 的 `content` 配置也会扫描该目录。 - Font Awesome 图标通过 CDN 引入(与主应用一致),离线时图标不显示但不影响布局。 diff --git a/ui-showcase/index.html b/apps/ui-showcase/index.html similarity index 100% rename from ui-showcase/index.html rename to apps/ui-showcase/index.html diff --git a/ui-showcase/package.json b/apps/ui-showcase/package.json similarity index 100% rename from ui-showcase/package.json rename to apps/ui-showcase/package.json diff --git a/ui-showcase/public/favicon.svg b/apps/ui-showcase/public/favicon.svg similarity index 100% rename from ui-showcase/public/favicon.svg rename to apps/ui-showcase/public/favicon.svg diff --git a/ui-showcase/public/logo.svg b/apps/ui-showcase/public/logo.svg similarity index 100% rename from ui-showcase/public/logo.svg rename to apps/ui-showcase/public/logo.svg diff --git a/ui-showcase/src/App.vue b/apps/ui-showcase/src/App.vue similarity index 99% rename from ui-showcase/src/App.vue rename to apps/ui-showcase/src/App.vue index 51ce3d3d..9aa15bf8 100644 --- a/ui-showcase/src/App.vue +++ b/apps/ui-showcase/src/App.vue @@ -15,8 +15,8 @@ import OverviewPage from '~/pages/OverviewPage.vue' const { isDark, initTheme, setTheme, themeColors, accentColorId, setAccentColor } = useTheme() -// 版本号与 frontend/package.json 的 version 保持一致。 -// dev server 的 fs.allow 只包含 ui-showcase 与 frontend/src,无法直接 import 该 JSON。 +// 版本号与 apps/frontend/package.json 的 version 保持一致。 +// dev server 的 fs.allow 只包含 apps/ui-showcase 与 apps/frontend/src,无法直接 import 该 JSON。 const FRONTEND_VERSION = '0.0.0' const REPO_URL = 'https://github.com/IDhammaI/error_correction' diff --git a/ui-showcase/src/api-data/data.ts b/apps/ui-showcase/src/api-data/data.ts similarity index 99% rename from ui-showcase/src/api-data/data.ts rename to apps/ui-showcase/src/api-data/data.ts index d317bf17..e7dfc7c3 100644 --- a/ui-showcase/src/api-data/data.ts +++ b/apps/ui-showcase/src/api-data/data.ts @@ -1,6 +1,6 @@ /** * api-data/data.ts - * 数据展示类组件的 API 数据分片,从 frontend/src/components/base/ 各 SFC 源码提取。 + * 数据展示类组件的 API 数据分片,从 apps/frontend/src/components/base/ 各 SFC 源码提取。 */ import type { ComponentApi } from '~/api-types' diff --git a/ui-showcase/src/api-data/forms.ts b/apps/ui-showcase/src/api-data/forms.ts similarity index 99% rename from ui-showcase/src/api-data/forms.ts rename to apps/ui-showcase/src/api-data/forms.ts index 4c678fb2..8e9f3a98 100644 --- a/ui-showcase/src/api-data/forms.ts +++ b/apps/ui-showcase/src/api-data/forms.ts @@ -2,7 +2,7 @@ import type { ComponentApi } from '~/api-types' /** * forms.ts - * 表单类基础组件的 API 数据,提取自 frontend/src/components/base/ 各 SFC 源码。 + * 表单类基础组件的 API 数据,提取自 apps/frontend/src/components/base/ 各 SFC 源码。 */ export const FORMS_API: ComponentApi[] = [ { diff --git a/ui-showcase/src/api-data/nav.ts b/apps/ui-showcase/src/api-data/nav.ts similarity index 99% rename from ui-showcase/src/api-data/nav.ts rename to apps/ui-showcase/src/api-data/nav.ts index cf7a19b5..94878c5a 100644 --- a/ui-showcase/src/api-data/nav.ts +++ b/apps/ui-showcase/src/api-data/nav.ts @@ -1,6 +1,6 @@ /** * nav.ts - * 导航与布局类组件的 API 数据分片,均提取自 frontend/src/components/base 下各 SFC 源码。 + * 导航与布局类组件的 API 数据分片,均提取自 apps/frontend/src/components/base 下各 SFC 源码。 */ import type { ComponentApi } from '~/api-types' diff --git a/ui-showcase/src/api-data/overlay.ts b/apps/ui-showcase/src/api-data/overlay.ts similarity index 99% rename from ui-showcase/src/api-data/overlay.ts rename to apps/ui-showcase/src/api-data/overlay.ts index acc7b7db..231f23ed 100644 --- a/ui-showcase/src/api-data/overlay.ts +++ b/apps/ui-showcase/src/api-data/overlay.ts @@ -1,6 +1,6 @@ /** * overlay.ts - * 浮层 / 反馈 / 按钮类组件的 API 数据(提取自 frontend/src/components/base 各 SFC 源码)。 + * 浮层 / 反馈 / 按钮类组件的 API 数据(提取自 apps/frontend/src/components/base 各 SFC 源码)。 */ import type { ComponentApi } from '~/api-types' diff --git a/ui-showcase/src/api-docs.ts b/apps/ui-showcase/src/api-docs.ts similarity index 100% rename from ui-showcase/src/api-docs.ts rename to apps/ui-showcase/src/api-docs.ts diff --git a/ui-showcase/src/api-types.ts b/apps/ui-showcase/src/api-types.ts similarity index 100% rename from ui-showcase/src/api-types.ts rename to apps/ui-showcase/src/api-types.ts diff --git a/ui-showcase/src/catalog.ts b/apps/ui-showcase/src/catalog.ts similarity index 100% rename from ui-showcase/src/catalog.ts rename to apps/ui-showcase/src/catalog.ts diff --git a/ui-showcase/src/components/ApiTable.vue b/apps/ui-showcase/src/components/ApiTable.vue similarity index 100% rename from ui-showcase/src/components/ApiTable.vue rename to apps/ui-showcase/src/components/ApiTable.vue diff --git a/ui-showcase/src/components/CatalogNav.vue b/apps/ui-showcase/src/components/CatalogNav.vue similarity index 100% rename from ui-showcase/src/components/CatalogNav.vue rename to apps/ui-showcase/src/components/CatalogNav.vue diff --git a/ui-showcase/src/components/DemoBlock.vue b/apps/ui-showcase/src/components/DemoBlock.vue similarity index 100% rename from ui-showcase/src/components/DemoBlock.vue rename to apps/ui-showcase/src/components/DemoBlock.vue diff --git a/ui-showcase/src/components/DocTip.vue b/apps/ui-showcase/src/components/DocTip.vue similarity index 100% rename from ui-showcase/src/components/DocTip.vue rename to apps/ui-showcase/src/components/DocTip.vue diff --git a/ui-showcase/src/main.ts b/apps/ui-showcase/src/main.ts similarity index 100% rename from ui-showcase/src/main.ts rename to apps/ui-showcase/src/main.ts diff --git a/ui-showcase/src/pages/AccordionPage.vue b/apps/ui-showcase/src/pages/AccordionPage.vue similarity index 100% rename from ui-showcase/src/pages/AccordionPage.vue rename to apps/ui-showcase/src/pages/AccordionPage.vue diff --git a/ui-showcase/src/pages/AffixPage.vue b/apps/ui-showcase/src/pages/AffixPage.vue similarity index 100% rename from ui-showcase/src/pages/AffixPage.vue rename to apps/ui-showcase/src/pages/AffixPage.vue diff --git a/ui-showcase/src/pages/AlertPage.vue b/apps/ui-showcase/src/pages/AlertPage.vue similarity index 100% rename from ui-showcase/src/pages/AlertPage.vue rename to apps/ui-showcase/src/pages/AlertPage.vue diff --git a/ui-showcase/src/pages/AnchorPage.vue b/apps/ui-showcase/src/pages/AnchorPage.vue similarity index 100% rename from ui-showcase/src/pages/AnchorPage.vue rename to apps/ui-showcase/src/pages/AnchorPage.vue diff --git a/ui-showcase/src/pages/AvatarGroupPage.vue b/apps/ui-showcase/src/pages/AvatarGroupPage.vue similarity index 100% rename from ui-showcase/src/pages/AvatarGroupPage.vue rename to apps/ui-showcase/src/pages/AvatarGroupPage.vue diff --git a/ui-showcase/src/pages/AvatarPage.vue b/apps/ui-showcase/src/pages/AvatarPage.vue similarity index 100% rename from ui-showcase/src/pages/AvatarPage.vue rename to apps/ui-showcase/src/pages/AvatarPage.vue diff --git a/ui-showcase/src/pages/BackTopPage.vue b/apps/ui-showcase/src/pages/BackTopPage.vue similarity index 100% rename from ui-showcase/src/pages/BackTopPage.vue rename to apps/ui-showcase/src/pages/BackTopPage.vue diff --git a/ui-showcase/src/pages/BreadcrumbPage.vue b/apps/ui-showcase/src/pages/BreadcrumbPage.vue similarity index 100% rename from ui-showcase/src/pages/BreadcrumbPage.vue rename to apps/ui-showcase/src/pages/BreadcrumbPage.vue diff --git a/ui-showcase/src/pages/ButtonGroupPage.vue b/apps/ui-showcase/src/pages/ButtonGroupPage.vue similarity index 100% rename from ui-showcase/src/pages/ButtonGroupPage.vue rename to apps/ui-showcase/src/pages/ButtonGroupPage.vue diff --git a/ui-showcase/src/pages/ButtonPage.vue b/apps/ui-showcase/src/pages/ButtonPage.vue similarity index 100% rename from ui-showcase/src/pages/ButtonPage.vue rename to apps/ui-showcase/src/pages/ButtonPage.vue diff --git a/ui-showcase/src/pages/CalendarPage.vue b/apps/ui-showcase/src/pages/CalendarPage.vue similarity index 100% rename from ui-showcase/src/pages/CalendarPage.vue rename to apps/ui-showcase/src/pages/CalendarPage.vue diff --git a/ui-showcase/src/pages/CardPage.vue b/apps/ui-showcase/src/pages/CardPage.vue similarity index 100% rename from ui-showcase/src/pages/CardPage.vue rename to apps/ui-showcase/src/pages/CardPage.vue diff --git a/ui-showcase/src/pages/CarouselPage.vue b/apps/ui-showcase/src/pages/CarouselPage.vue similarity index 100% rename from ui-showcase/src/pages/CarouselPage.vue rename to apps/ui-showcase/src/pages/CarouselPage.vue diff --git a/ui-showcase/src/pages/CascaderPage.vue b/apps/ui-showcase/src/pages/CascaderPage.vue similarity index 100% rename from ui-showcase/src/pages/CascaderPage.vue rename to apps/ui-showcase/src/pages/CascaderPage.vue diff --git a/ui-showcase/src/pages/CheckboxGroupPage.vue b/apps/ui-showcase/src/pages/CheckboxGroupPage.vue similarity index 100% rename from ui-showcase/src/pages/CheckboxGroupPage.vue rename to apps/ui-showcase/src/pages/CheckboxGroupPage.vue diff --git a/ui-showcase/src/pages/CheckboxPage.vue b/apps/ui-showcase/src/pages/CheckboxPage.vue similarity index 100% rename from ui-showcase/src/pages/CheckboxPage.vue rename to apps/ui-showcase/src/pages/CheckboxPage.vue diff --git a/ui-showcase/src/pages/CircleProgressPage.vue b/apps/ui-showcase/src/pages/CircleProgressPage.vue similarity index 100% rename from ui-showcase/src/pages/CircleProgressPage.vue rename to apps/ui-showcase/src/pages/CircleProgressPage.vue diff --git a/ui-showcase/src/pages/CodePage.vue b/apps/ui-showcase/src/pages/CodePage.vue similarity index 100% rename from ui-showcase/src/pages/CodePage.vue rename to apps/ui-showcase/src/pages/CodePage.vue diff --git a/ui-showcase/src/pages/ColorPickerPage.vue b/apps/ui-showcase/src/pages/ColorPickerPage.vue similarity index 100% rename from ui-showcase/src/pages/ColorPickerPage.vue rename to apps/ui-showcase/src/pages/ColorPickerPage.vue diff --git a/ui-showcase/src/pages/CommandPalettePage.vue b/apps/ui-showcase/src/pages/CommandPalettePage.vue similarity index 100% rename from ui-showcase/src/pages/CommandPalettePage.vue rename to apps/ui-showcase/src/pages/CommandPalettePage.vue diff --git a/ui-showcase/src/pages/CountdownPage.vue b/apps/ui-showcase/src/pages/CountdownPage.vue similarity index 100% rename from ui-showcase/src/pages/CountdownPage.vue rename to apps/ui-showcase/src/pages/CountdownPage.vue diff --git a/ui-showcase/src/pages/DateRangePickerPage.vue b/apps/ui-showcase/src/pages/DateRangePickerPage.vue similarity index 100% rename from ui-showcase/src/pages/DateRangePickerPage.vue rename to apps/ui-showcase/src/pages/DateRangePickerPage.vue diff --git a/ui-showcase/src/pages/DateTimePage.vue b/apps/ui-showcase/src/pages/DateTimePage.vue similarity index 100% rename from ui-showcase/src/pages/DateTimePage.vue rename to apps/ui-showcase/src/pages/DateTimePage.vue diff --git a/ui-showcase/src/pages/DescriptionsPage.vue b/apps/ui-showcase/src/pages/DescriptionsPage.vue similarity index 100% rename from ui-showcase/src/pages/DescriptionsPage.vue rename to apps/ui-showcase/src/pages/DescriptionsPage.vue diff --git a/ui-showcase/src/pages/DividerPage.vue b/apps/ui-showcase/src/pages/DividerPage.vue similarity index 100% rename from ui-showcase/src/pages/DividerPage.vue rename to apps/ui-showcase/src/pages/DividerPage.vue diff --git a/ui-showcase/src/pages/DrawerPage.vue b/apps/ui-showcase/src/pages/DrawerPage.vue similarity index 100% rename from ui-showcase/src/pages/DrawerPage.vue rename to apps/ui-showcase/src/pages/DrawerPage.vue diff --git a/ui-showcase/src/pages/EllipsisPage.vue b/apps/ui-showcase/src/pages/EllipsisPage.vue similarity index 100% rename from ui-showcase/src/pages/EllipsisPage.vue rename to apps/ui-showcase/src/pages/EllipsisPage.vue diff --git a/ui-showcase/src/pages/EmptyStatePage.vue b/apps/ui-showcase/src/pages/EmptyStatePage.vue similarity index 100% rename from ui-showcase/src/pages/EmptyStatePage.vue rename to apps/ui-showcase/src/pages/EmptyStatePage.vue diff --git a/ui-showcase/src/pages/FloatButtonPage.vue b/apps/ui-showcase/src/pages/FloatButtonPage.vue similarity index 100% rename from ui-showcase/src/pages/FloatButtonPage.vue rename to apps/ui-showcase/src/pages/FloatButtonPage.vue diff --git a/ui-showcase/src/pages/FormPage.vue b/apps/ui-showcase/src/pages/FormPage.vue similarity index 100% rename from ui-showcase/src/pages/FormPage.vue rename to apps/ui-showcase/src/pages/FormPage.vue diff --git a/ui-showcase/src/pages/GuideStartPage.vue b/apps/ui-showcase/src/pages/GuideStartPage.vue similarity index 100% rename from ui-showcase/src/pages/GuideStartPage.vue rename to apps/ui-showcase/src/pages/GuideStartPage.vue diff --git a/ui-showcase/src/pages/GuideThemePage.vue b/apps/ui-showcase/src/pages/GuideThemePage.vue similarity index 97% rename from ui-showcase/src/pages/GuideThemePage.vue rename to apps/ui-showcase/src/pages/GuideThemePage.vue index e0aebbd3..005cc55f 100644 --- a/ui-showcase/src/pages/GuideThemePage.vue +++ b/apps/ui-showcase/src/pages/GuideThemePage.vue @@ -19,7 +19,7 @@ const cssVarCode = `:root { .accent-bg-soft { background: rgb(var(--accent-rgb) / 0.12); } .accent-text { color: rgb(var(--accent-rgb)); }` -// 变量名与默认值来自 frontend/src/style.css 的 :root 与 useTheme.ts(violet 预设)。 +// 变量名与默认值来自 apps/frontend/src/style.css 的 :root 与 useTheme.ts(violet 预设)。 const cssVarRows = [ { name: '--accent-rgb', value: '129 115 223', desc: '主强调色,空格分隔的 RGB 三元组,配合 rgb(var(...) / alpha) 派生透明度' }, { name: '--accent-hover-rgb', value: '145 132 235', desc: '悬停态强调色,深色模式下也用作更亮的文字色' }, @@ -91,7 +91,7 @@ setAccentColor('emerald') // 切换主题色,写入 CSS 变量和 localStorage

CSS 变量清单

- 主题相关变量定义在 frontend/src/style.css 的 + 主题相关变量定义在 apps/frontend/src/style.css:root 中, setAccentColor 切换主题色时会在运行时改写。默认值为紫罗兰(violet)预设。

diff --git a/ui-showcase/src/pages/HighlightPage.vue b/apps/ui-showcase/src/pages/HighlightPage.vue similarity index 100% rename from ui-showcase/src/pages/HighlightPage.vue rename to apps/ui-showcase/src/pages/HighlightPage.vue diff --git a/ui-showcase/src/pages/ImagePage.vue b/apps/ui-showcase/src/pages/ImagePage.vue similarity index 100% rename from ui-showcase/src/pages/ImagePage.vue rename to apps/ui-showcase/src/pages/ImagePage.vue diff --git a/ui-showcase/src/pages/InfiniteScrollPage.vue b/apps/ui-showcase/src/pages/InfiniteScrollPage.vue similarity index 100% rename from ui-showcase/src/pages/InfiniteScrollPage.vue rename to apps/ui-showcase/src/pages/InfiniteScrollPage.vue diff --git a/ui-showcase/src/pages/InputPage.vue b/apps/ui-showcase/src/pages/InputPage.vue similarity index 100% rename from ui-showcase/src/pages/InputPage.vue rename to apps/ui-showcase/src/pages/InputPage.vue diff --git a/ui-showcase/src/pages/LinkPage.vue b/apps/ui-showcase/src/pages/LinkPage.vue similarity index 100% rename from ui-showcase/src/pages/LinkPage.vue rename to apps/ui-showcase/src/pages/LinkPage.vue diff --git a/ui-showcase/src/pages/ListPage.vue b/apps/ui-showcase/src/pages/ListPage.vue similarity index 100% rename from ui-showcase/src/pages/ListPage.vue rename to apps/ui-showcase/src/pages/ListPage.vue diff --git a/ui-showcase/src/pages/LoadingBarPage.vue b/apps/ui-showcase/src/pages/LoadingBarPage.vue similarity index 100% rename from ui-showcase/src/pages/LoadingBarPage.vue rename to apps/ui-showcase/src/pages/LoadingBarPage.vue diff --git a/ui-showcase/src/pages/LoadingPage.vue b/apps/ui-showcase/src/pages/LoadingPage.vue similarity index 100% rename from ui-showcase/src/pages/LoadingPage.vue rename to apps/ui-showcase/src/pages/LoadingPage.vue diff --git a/ui-showcase/src/pages/MarqueePage.vue b/apps/ui-showcase/src/pages/MarqueePage.vue similarity index 100% rename from ui-showcase/src/pages/MarqueePage.vue rename to apps/ui-showcase/src/pages/MarqueePage.vue diff --git a/ui-showcase/src/pages/MediaPage.vue b/apps/ui-showcase/src/pages/MediaPage.vue similarity index 100% rename from ui-showcase/src/pages/MediaPage.vue rename to apps/ui-showcase/src/pages/MediaPage.vue diff --git a/ui-showcase/src/pages/MentionPage.vue b/apps/ui-showcase/src/pages/MentionPage.vue similarity index 100% rename from ui-showcase/src/pages/MentionPage.vue rename to apps/ui-showcase/src/pages/MentionPage.vue diff --git a/ui-showcase/src/pages/MenuPage.vue b/apps/ui-showcase/src/pages/MenuPage.vue similarity index 100% rename from ui-showcase/src/pages/MenuPage.vue rename to apps/ui-showcase/src/pages/MenuPage.vue diff --git a/ui-showcase/src/pages/ModalPage.vue b/apps/ui-showcase/src/pages/ModalPage.vue similarity index 100% rename from ui-showcase/src/pages/ModalPage.vue rename to apps/ui-showcase/src/pages/ModalPage.vue diff --git a/ui-showcase/src/pages/NumberAnimationPage.vue b/apps/ui-showcase/src/pages/NumberAnimationPage.vue similarity index 100% rename from ui-showcase/src/pages/NumberAnimationPage.vue rename to apps/ui-showcase/src/pages/NumberAnimationPage.vue diff --git a/ui-showcase/src/pages/NumberInputPage.vue b/apps/ui-showcase/src/pages/NumberInputPage.vue similarity index 100% rename from ui-showcase/src/pages/NumberInputPage.vue rename to apps/ui-showcase/src/pages/NumberInputPage.vue diff --git a/ui-showcase/src/pages/OverviewPage.vue b/apps/ui-showcase/src/pages/OverviewPage.vue similarity index 99% rename from ui-showcase/src/pages/OverviewPage.vue rename to apps/ui-showcase/src/pages/OverviewPage.vue index b9c4f1d3..7cb79c8f 100644 --- a/ui-showcase/src/pages/OverviewPage.vue +++ b/apps/ui-showcase/src/pages/OverviewPage.vue @@ -59,7 +59,7 @@ function onGroupAnchorClick(groupId: string) {