From 52d064381f0664b2da655470558ddca3b0ce16a5 Mon Sep 17 00:00:00 2001 From: Ryan Wang Date: Thu, 9 Nov 2023 14:56:06 +0800 Subject: [PATCH] refactor: improve project structure for user center feature (#4839) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /area console /kind improvement /milestone 2.11.x #### What this PR does / why we need it: 重构前端的目录结构,以便在后续让个人中心的代码支持复用部分代码。 https://github.com/ruibaby/halo/tree/refactor/file-structure/console/docs/project-structure #### Special notes for your reviewer: 测试方式: 1. 启动最新的 Halo 后端。 2. 在 Console 目录运行 `pnpm dev`,可以观察到同时监听了 3000 和 4000 端口,分别代理原本的 /console 和新加的 /uc 3. 访问 /console 和 /uc。 4. 测试 `pnpm build`,完成之后检查主项目的 `src/main/resources` 目录是否包含 console 和 uc 目录。 5. 使用生产环境运行 Halo,访问 /console 和 /uc #### Does this PR introduce a user-facing change? ```release-note None ``` --- console/{src => console-src}/App.vue | 8 +- .../composables/use-auto-save-content.ts | 0 .../composables/use-content-cache.ts | 0 .../composables/use-content-snapshot.ts | 0 .../use-editor-extension-points.ts | 0 .../use-entity-extension-points.ts | 0 .../composables/use-global-info.ts | 0 .../use-operation-extension-points.ts | 0 .../composables/use-save-keybinding.ts | 0 .../composables/use-setting-form.ts | 2 +- .../composables/use-slugify.ts | 0 .../layouts/BasicLayout.vue | 2 +- .../layouts/BlankLayout.vue | 0 console/console-src/main.ts | 113 ++++++++++++++++++ .../contents/_components/ContributorList.vue | 0 .../contents/attachments/AttachmentList.vue | 0 .../components/AttachmentDetailModal.vue | 0 .../AttachmentGroupEditingModal.vue | 0 .../components/AttachmentGroupList.vue | 0 .../components/AttachmentListItem.vue | 2 +- .../components/AttachmentPermalinkList.vue | 0 .../components/AttachmentPoliciesModal.vue | 0 .../AttachmentPolicyEditingModal.vue | 2 +- .../components/AttachmentSelectorModal.vue | 0 .../components/AttachmentUploadModal.vue | 0 .../CoreSelectorProvider.vue | 0 .../composables/use-attachment-group.ts | 0 .../composables/use-attachment-policy.ts | 0 .../attachments/composables/use-attachment.ts | 0 .../modules/contents/attachments/module.ts | 2 +- .../modules/contents/comments/CommentList.vue | 0 .../comments/components/CommentListItem.vue | 0 .../components/ReplyCreationModal.vue | 0 .../comments/components/ReplyListItem.vue | 0 .../modules/contents/comments/module.ts | 2 +- .../comments/widgets/CommentStatsWidget.vue | 0 .../contents/pages/DeletedSinglePageList.vue | 0 .../contents/pages/SinglePageEditor.vue | 10 +- .../modules/contents/pages/SinglePageList.vue | 0 .../pages/components/SinglePageListItem.vue | 0 .../components/SinglePageSettingModal.vue | 4 +- .../composables/use-page-update-mutate.ts | 0 .../modules/contents/pages/module.ts | 2 +- .../pages/widgets/SinglePageStatsWidget.vue | 0 .../contents/posts/DeletedPostList.vue | 0 .../modules/contents/posts/PostEditor.vue | 10 +- .../modules/contents/posts/PostList.vue | 0 .../posts/categories/CategoryList.vue | 0 .../components/CategoryEditingModal.vue | 4 +- .../components/CategoryListItem.vue | 0 .../__tests__/CategoryEditingModal.spec.ts | 0 .../composables/use-post-category.ts | 4 +- .../contents/posts/categories/utils/index.ts | 0 .../posts/components/PostListItem.vue | 4 +- .../posts/components/PostSettingModal.vue | 4 +- .../__tests__/PostSettingModal.spec.ts | 0 .../entity-fields/ContributorsField.vue | 2 +- .../entity-fields/PublishStatusField.vue | 0 .../components/entity-fields/TitleField.vue | 0 .../components/entity-fields/VisibleField.vue | 0 .../composables/use-post-update-mutate.ts | 0 .../modules/contents/posts/module.ts | 4 +- .../modules/contents/posts/tags/TagList.vue | 0 .../posts/tags/components/PostTag.vue | 0 .../posts/tags/components/TagEditingModal.vue | 2 +- .../posts/tags/composables/use-post-tag.ts | 0 .../posts/widgets/PostStatsWidget.vue | 0 .../posts/widgets/RecentPublishedWidget.vue | 0 .../modules/dashboard/Dashboard.vue | 0 .../modules/dashboard/module.ts | 2 +- .../dashboard/widgets/QuickLinkWidget.vue | 2 +- .../dashboard/widgets/ViewsStatsWidget.vue | 0 console/{src => console-src}/modules/index.ts | 0 .../modules/interface/menus/Menus.vue | 0 .../menus/components/MenuEditingModal.vue | 0 .../menus/components/MenuItemEditingModal.vue | 0 .../menus/components/MenuItemListItem.vue | 2 +- .../interface/menus/components/MenuList.vue | 0 .../modules/interface/menus/module.ts | 2 +- .../__snapshots__/index.spec.ts.snap | 0 .../menus/utils/__tests__/index.spec.ts | 0 .../modules/interface/menus/utils/index.ts | 0 .../modules/interface/themes/ThemeDetail.vue | 0 .../modules/interface/themes/ThemeSetting.vue | 2 +- .../themes/components/ThemeListItem.vue | 2 +- .../themes/components/ThemeListModal.vue | 0 .../components/list-tabs/InstalledThemes.vue | 2 +- .../components/list-tabs/LocalUpload.vue | 2 +- .../list-tabs/NotInstalledThemes.vue | 0 .../components/list-tabs/RemoteDownload.vue | 2 +- .../operation/MoreOperationItem.vue | 0 .../operation/UninstallOperationItem.vue | 0 .../preview/ThemePreviewListItem.vue | 0 .../components/preview/ThemePreviewModal.vue | 4 +- .../interface/themes/composables/use-theme.ts | 2 +- .../interface/themes/constants/index.ts | 0 .../interface/themes/layouts/ThemeLayout.vue | 4 +- .../modules/interface/themes/module.ts | 0 .../modules/interface/themes/types/index.ts | 0 .../modules/system/actuator/Actuator.vue | 0 .../modules/system/actuator/module.ts | 2 +- .../auth-providers/AuthProviderDetail.vue | 2 +- .../system/auth-providers/AuthProviders.vue | 0 .../components/AuthProviderListItem.vue | 0 .../modules/system/auth-providers/module.ts | 2 +- .../modules/system/backup/Backups.vue | 0 .../backup/components/BackupListItem.vue | 2 +- .../system/backup/composables/use-backup.ts | 0 .../modules/system/backup/module.ts | 2 +- .../modules/system/backup/tabs/List.vue | 0 .../modules/system/backup/tabs/Restore.vue | 0 .../modules/system/plugins/PluginDetail.vue | 0 .../modules/system/plugins/PluginList.vue | 0 .../components/PluginInstallationModal.vue | 0 .../plugins/components/PluginListItem.vue | 4 +- .../components/entity-fields/AuthorField.vue | 0 .../components/entity-fields/LogoField.vue | 0 .../components/entity-fields/SwitchField.vue | 0 .../installation-tabs/LocalUpload.vue | 0 .../installation-tabs/RemoteDownload.vue | 0 .../system/plugins/composables/use-plugin.ts | 0 .../modules/system/plugins/constants/index.ts | 0 .../modules/system/plugins/module.ts | 4 +- .../modules/system/plugins/tabs/Detail.vue | 0 .../modules/system/plugins/tabs/Setting.vue | 2 +- .../modules/system/plugins/types/index.ts | 0 .../modules/system/roles/RoleDetail.vue | 2 +- .../modules/system/roles/RoleList.vue | 2 +- .../roles/components/RoleEditingModal.vue | 2 +- .../system/roles/composables/use-role.ts | 0 .../modules/system/roles/module.ts | 2 +- .../system/settings/SystemSettings.vue | 0 .../modules/system/settings/module.ts | 2 +- .../settings/tabs/NotificationSetting.vue | 0 .../system/settings/tabs/Notifications.vue | 0 .../modules/system/settings/tabs/Setting.vue | 4 +- .../modules/system/users/Binding.vue | 4 +- .../modules/system/users/Login.vue | 2 +- .../modules/system/users/Notifications.vue | 0 .../modules/system/users/UserDetail.vue | 0 .../modules/system/users/UserList.vue | 0 .../users/components/GrantPermissionModal.vue | 0 .../users/components/NotificationContent.vue | 0 .../users/components/NotificationListItem.vue | 0 .../PersonalAccessTokenCreationModal.vue | 0 .../PersonalAccessTokenListItem.vue | 0 .../system/users/components/UserAvatar.vue | 0 .../users/components/UserAvatarCropper.vue | 0 .../users/components/UserCreationModal.vue | 0 .../users/components/UserEditingModal.vue | 0 .../components/UserPasswordChangeModal.vue | 0 .../system/users/composables/use-user.ts | 0 .../modules/system/users/module.ts | 4 +- .../modules/system/users/tabs/Detail.vue | 0 .../users/tabs/NotificationPreferences.vue | 0 .../users/tabs/PersonalAccessTokens.vue | 0 .../users/widgets/NotificationWidget.vue | 0 .../users/widgets/RecentLoginWidget.vue | 2 +- .../system/users/widgets/UserStatsWidget.vue | 0 .../router/guards/auth-check.ts | 0 .../router/guards/check-states.ts | 0 .../router/guards/permission.ts | 0 console/{src => console-src}/router/index.ts | 2 +- .../router/routes.config.ts | 12 +- .../stores/system-configmap.ts | 0 console/{src => console-src}/stores/theme.ts | 0 console/{src => console-src}/styles/index.css | 0 .../{src => console-src}/styles/tailwind.css | 0 .../views/exceptions/Forbidden.vue | 0 .../views/exceptions/NotFound.vue | 0 .../exceptions/__tests__/NotFound.spec.ts | 0 .../views/exceptions/components/Exception.vue | 0 .../views/system/Redirect.vue | 0 .../views/system/Setup.vue | 0 .../views/system/SetupInitialData.vue | 0 .../views/system/setup-data/category.json | 0 .../views/system/setup-data/menu-items.json | 0 .../views/system/setup-data/menu.json | 0 .../views/system/setup-data/post.json | 0 .../views/system/setup-data/singlePage.json | 0 .../views/system/setup-data/tag.json | 0 console/docs/project-structure/README.md | 61 ++++++++++ console/docs/routes-generation/README.md | 2 +- .../EditorProviderSelector.vue | 2 +- .../src/components/editor/DefaultEditor.vue | 6 +- .../filter/CategoryFilterDropdown.vue | 2 +- .../components/filter/TagFilterDropdown.vue | 4 +- .../components/filter/UserFilterDropdown.vue | 2 +- .../src/components/form/AnnotationsForm.vue | 2 +- .../global-search/GlobalSearchModal.vue | 2 +- .../components/login/SocialAuthProviders.vue | 2 +- .../inputs/attachment/AttachmentInput.vue | 2 +- .../inputs/category-select/CategorySelect.vue | 6 +- .../components/CategoryListItem.vue | 2 +- .../components/CategoryTag.vue | 4 +- .../components/SearchResultListItem.vue | 2 +- .../formkit/inputs/tag-select/TagSelect.vue | 4 +- .../plugins/stop-implicit-submission.ts | 2 +- console/src/main.ts | 113 ------------------ console/src/setup/setupModules.ts | 4 +- console/src/setup/setupStyles.ts | 4 +- console/src/utils/api-client.ts | 2 +- console/uc-src/main.ts | 16 ++- console/vite.config.ts | 2 +- console/vite.uc.config.ts | 7 ++ 205 files changed, 304 insertions(+), 222 deletions(-) rename console/{src => console-src}/App.vue (92%) rename console/{src => console-src}/composables/use-auto-save-content.ts (100%) rename console/{src => console-src}/composables/use-content-cache.ts (100%) rename console/{src => console-src}/composables/use-content-snapshot.ts (100%) rename console/{src => console-src}/composables/use-editor-extension-points.ts (100%) rename console/{src => console-src}/composables/use-entity-extension-points.ts (100%) rename console/{src => console-src}/composables/use-global-info.ts (100%) rename console/{src => console-src}/composables/use-operation-extension-points.ts (100%) rename console/{src => console-src}/composables/use-save-keybinding.ts (100%) rename console/{src => console-src}/composables/use-setting-form.ts (99%) rename console/{src => console-src}/composables/use-slugify.ts (100%) rename console/{src => console-src}/layouts/BasicLayout.vue (99%) rename console/{src => console-src}/layouts/BlankLayout.vue (100%) rename console/{src => console-src}/modules/contents/_components/ContributorList.vue (100%) rename console/{src => console-src}/modules/contents/attachments/AttachmentList.vue (100%) rename console/{src => console-src}/modules/contents/attachments/components/AttachmentDetailModal.vue (100%) rename console/{src => console-src}/modules/contents/attachments/components/AttachmentGroupEditingModal.vue (100%) rename console/{src => console-src}/modules/contents/attachments/components/AttachmentGroupList.vue (100%) rename console/{src => console-src}/modules/contents/attachments/components/AttachmentListItem.vue (98%) rename console/{src => console-src}/modules/contents/attachments/components/AttachmentPermalinkList.vue (100%) rename console/{src => console-src}/modules/contents/attachments/components/AttachmentPoliciesModal.vue (100%) rename console/{src => console-src}/modules/contents/attachments/components/AttachmentPolicyEditingModal.vue (98%) rename console/{src => console-src}/modules/contents/attachments/components/AttachmentSelectorModal.vue (100%) rename console/{src => console-src}/modules/contents/attachments/components/AttachmentUploadModal.vue (100%) rename console/{src => console-src}/modules/contents/attachments/components/selector-providers/CoreSelectorProvider.vue (100%) rename console/{src => console-src}/modules/contents/attachments/composables/use-attachment-group.ts (100%) rename console/{src => console-src}/modules/contents/attachments/composables/use-attachment-policy.ts (100%) rename console/{src => console-src}/modules/contents/attachments/composables/use-attachment.ts (100%) rename console/{src => console-src}/modules/contents/attachments/module.ts (93%) rename console/{src => console-src}/modules/contents/comments/CommentList.vue (100%) rename console/{src => console-src}/modules/contents/comments/components/CommentListItem.vue (100%) rename console/{src => console-src}/modules/contents/comments/components/ReplyCreationModal.vue (100%) rename console/{src => console-src}/modules/contents/comments/components/ReplyListItem.vue (100%) rename console/{src => console-src}/modules/contents/comments/module.ts (93%) rename console/{src => console-src}/modules/contents/comments/widgets/CommentStatsWidget.vue (100%) rename console/{src => console-src}/modules/contents/pages/DeletedSinglePageList.vue (100%) rename console/{src => console-src}/modules/contents/pages/SinglePageEditor.vue (96%) rename console/{src => console-src}/modules/contents/pages/SinglePageList.vue (100%) rename console/{src => console-src}/modules/contents/pages/components/SinglePageListItem.vue (100%) rename console/{src => console-src}/modules/contents/pages/components/SinglePageSettingModal.vue (98%) rename console/{src => console-src}/modules/contents/pages/composables/use-page-update-mutate.ts (100%) rename console/{src => console-src}/modules/contents/pages/module.ts (96%) rename console/{src => console-src}/modules/contents/pages/widgets/SinglePageStatsWidget.vue (100%) rename console/{src => console-src}/modules/contents/posts/DeletedPostList.vue (100%) rename console/{src => console-src}/modules/contents/posts/PostEditor.vue (96%) rename console/{src => console-src}/modules/contents/posts/PostList.vue (100%) rename console/{src => console-src}/modules/contents/posts/categories/CategoryList.vue (100%) rename console/{src => console-src}/modules/contents/posts/categories/components/CategoryEditingModal.vue (98%) rename console/{src => console-src}/modules/contents/posts/categories/components/CategoryListItem.vue (100%) rename console/{src => console-src}/modules/contents/posts/categories/components/__tests__/CategoryEditingModal.spec.ts (100%) rename console/{src => console-src}/modules/contents/posts/categories/composables/use-post-category.ts (92%) rename console/{src => console-src}/modules/contents/posts/categories/utils/index.ts (100%) rename console/{src => console-src}/modules/contents/posts/components/PostListItem.vue (96%) rename console/{src => console-src}/modules/contents/posts/components/PostSettingModal.vue (98%) rename console/{src => console-src}/modules/contents/posts/components/__tests__/PostSettingModal.spec.ts (100%) rename console/{src => console-src}/modules/contents/posts/components/entity-fields/ContributorsField.vue (80%) rename console/{src => console-src}/modules/contents/posts/components/entity-fields/PublishStatusField.vue (100%) rename console/{src => console-src}/modules/contents/posts/components/entity-fields/TitleField.vue (100%) rename console/{src => console-src}/modules/contents/posts/components/entity-fields/VisibleField.vue (100%) rename console/{src => console-src}/modules/contents/posts/composables/use-post-update-mutate.ts (100%) rename console/{src => console-src}/modules/contents/posts/module.ts (95%) rename console/{src => console-src}/modules/contents/posts/tags/TagList.vue (100%) rename console/{src => console-src}/modules/contents/posts/tags/components/PostTag.vue (100%) rename console/{src => console-src}/modules/contents/posts/tags/components/TagEditingModal.vue (99%) rename console/{src => console-src}/modules/contents/posts/tags/composables/use-post-tag.ts (100%) rename console/{src => console-src}/modules/contents/posts/widgets/PostStatsWidget.vue (100%) rename console/{src => console-src}/modules/contents/posts/widgets/RecentPublishedWidget.vue (100%) rename console/{src => console-src}/modules/dashboard/Dashboard.vue (100%) rename console/{src => console-src}/modules/dashboard/module.ts (94%) rename console/{src => console-src}/modules/dashboard/widgets/QuickLinkWidget.vue (98%) rename console/{src => console-src}/modules/dashboard/widgets/ViewsStatsWidget.vue (100%) rename console/{src => console-src}/modules/index.ts (100%) rename console/{src => console-src}/modules/interface/menus/Menus.vue (100%) rename console/{src => console-src}/modules/interface/menus/components/MenuEditingModal.vue (100%) rename console/{src => console-src}/modules/interface/menus/components/MenuItemEditingModal.vue (100%) rename console/{src => console-src}/modules/interface/menus/components/MenuItemListItem.vue (98%) rename console/{src => console-src}/modules/interface/menus/components/MenuList.vue (100%) rename console/{src => console-src}/modules/interface/menus/module.ts (92%) rename console/{src => console-src}/modules/interface/menus/utils/__tests__/__snapshots__/index.spec.ts.snap (100%) rename console/{src => console-src}/modules/interface/menus/utils/__tests__/index.spec.ts (100%) rename console/{src => console-src}/modules/interface/menus/utils/index.ts (100%) rename console/{src => console-src}/modules/interface/themes/ThemeDetail.vue (100%) rename console/{src => console-src}/modules/interface/themes/ThemeSetting.vue (97%) rename console/{src => console-src}/modules/interface/themes/components/ThemeListItem.vue (98%) rename console/{src => console-src}/modules/interface/themes/components/ThemeListModal.vue (100%) rename console/{src => console-src}/modules/interface/themes/components/list-tabs/InstalledThemes.vue (98%) rename console/{src => console-src}/modules/interface/themes/components/list-tabs/LocalUpload.vue (97%) rename console/{src => console-src}/modules/interface/themes/components/list-tabs/NotInstalledThemes.vue (100%) rename console/{src => console-src}/modules/interface/themes/components/list-tabs/RemoteDownload.vue (98%) rename console/{src => console-src}/modules/interface/themes/components/operation/MoreOperationItem.vue (100%) rename console/{src => console-src}/modules/interface/themes/components/operation/UninstallOperationItem.vue (100%) rename console/{src => console-src}/modules/interface/themes/components/preview/ThemePreviewListItem.vue (100%) rename console/{src => console-src}/modules/interface/themes/components/preview/ThemePreviewModal.vue (98%) rename console/{src => console-src}/modules/interface/themes/composables/use-theme.ts (98%) rename console/{src => console-src}/modules/interface/themes/constants/index.ts (100%) rename console/{src => console-src}/modules/interface/themes/layouts/ThemeLayout.vue (98%) rename console/{src => console-src}/modules/interface/themes/module.ts (100%) rename console/{src => console-src}/modules/interface/themes/types/index.ts (100%) rename console/{src => console-src}/modules/system/actuator/Actuator.vue (100%) rename console/{src => console-src}/modules/system/actuator/module.ts (92%) rename console/{src => console-src}/modules/system/auth-providers/AuthProviderDetail.vue (98%) rename console/{src => console-src}/modules/system/auth-providers/AuthProviders.vue (100%) rename console/{src => console-src}/modules/system/auth-providers/components/AuthProviderListItem.vue (100%) rename console/{src => console-src}/modules/system/auth-providers/module.ts (92%) rename console/{src => console-src}/modules/system/backup/Backups.vue (100%) rename console/{src => console-src}/modules/system/backup/components/BackupListItem.vue (98%) rename console/{src => console-src}/modules/system/backup/composables/use-backup.ts (100%) rename console/{src => console-src}/modules/system/backup/module.ts (92%) rename console/{src => console-src}/modules/system/backup/tabs/List.vue (100%) rename console/{src => console-src}/modules/system/backup/tabs/Restore.vue (100%) rename console/{src => console-src}/modules/system/plugins/PluginDetail.vue (100%) rename console/{src => console-src}/modules/system/plugins/PluginList.vue (100%) rename console/{src => console-src}/modules/system/plugins/components/PluginInstallationModal.vue (100%) rename console/{src => console-src}/modules/system/plugins/components/PluginListItem.vue (97%) rename console/{src => console-src}/modules/system/plugins/components/entity-fields/AuthorField.vue (100%) rename console/{src => console-src}/modules/system/plugins/components/entity-fields/LogoField.vue (100%) rename console/{src => console-src}/modules/system/plugins/components/entity-fields/SwitchField.vue (100%) rename console/{src => console-src}/modules/system/plugins/components/installation-tabs/LocalUpload.vue (100%) rename console/{src => console-src}/modules/system/plugins/components/installation-tabs/RemoteDownload.vue (100%) rename console/{src => console-src}/modules/system/plugins/composables/use-plugin.ts (100%) rename console/{src => console-src}/modules/system/plugins/constants/index.ts (100%) rename console/{src => console-src}/modules/system/plugins/module.ts (92%) rename console/{src => console-src}/modules/system/plugins/tabs/Detail.vue (100%) rename console/{src => console-src}/modules/system/plugins/tabs/Setting.vue (97%) rename console/{src => console-src}/modules/system/plugins/types/index.ts (100%) rename console/{src => console-src}/modules/system/roles/RoleDetail.vue (99%) rename console/{src => console-src}/modules/system/roles/RoleList.vue (99%) rename console/{src => console-src}/modules/system/roles/components/RoleEditingModal.vue (99%) rename console/{src => console-src}/modules/system/roles/composables/use-role.ts (100%) rename console/{src => console-src}/modules/system/roles/module.ts (92%) rename console/{src => console-src}/modules/system/settings/SystemSettings.vue (100%) rename console/{src => console-src}/modules/system/settings/module.ts (92%) rename console/{src => console-src}/modules/system/settings/tabs/NotificationSetting.vue (100%) rename console/{src => console-src}/modules/system/settings/tabs/Notifications.vue (100%) rename console/{src => console-src}/modules/system/settings/tabs/Setting.vue (94%) rename console/{src => console-src}/modules/system/users/Binding.vue (95%) rename console/{src => console-src}/modules/system/users/Login.vue (97%) rename console/{src => console-src}/modules/system/users/Notifications.vue (100%) rename console/{src => console-src}/modules/system/users/UserDetail.vue (100%) rename console/{src => console-src}/modules/system/users/UserList.vue (100%) rename console/{src => console-src}/modules/system/users/components/GrantPermissionModal.vue (100%) rename console/{src => console-src}/modules/system/users/components/NotificationContent.vue (100%) rename console/{src => console-src}/modules/system/users/components/NotificationListItem.vue (100%) rename console/{src => console-src}/modules/system/users/components/PersonalAccessTokenCreationModal.vue (100%) rename console/{src => console-src}/modules/system/users/components/PersonalAccessTokenListItem.vue (100%) rename console/{src => console-src}/modules/system/users/components/UserAvatar.vue (100%) rename console/{src => console-src}/modules/system/users/components/UserAvatarCropper.vue (100%) rename console/{src => console-src}/modules/system/users/components/UserCreationModal.vue (100%) rename console/{src => console-src}/modules/system/users/components/UserEditingModal.vue (100%) rename console/{src => console-src}/modules/system/users/components/UserPasswordChangeModal.vue (100%) rename console/{src => console-src}/modules/system/users/composables/use-user.ts (100%) rename console/{src => console-src}/modules/system/users/module.ts (95%) rename console/{src => console-src}/modules/system/users/tabs/Detail.vue (100%) rename console/{src => console-src}/modules/system/users/tabs/NotificationPreferences.vue (100%) rename console/{src => console-src}/modules/system/users/tabs/PersonalAccessTokens.vue (100%) rename console/{src => console-src}/modules/system/users/widgets/NotificationWidget.vue (100%) rename console/{src => console-src}/modules/system/users/widgets/RecentLoginWidget.vue (94%) rename console/{src => console-src}/modules/system/users/widgets/UserStatsWidget.vue (100%) rename console/{src => console-src}/router/guards/auth-check.ts (100%) rename console/{src => console-src}/router/guards/check-states.ts (100%) rename console/{src => console-src}/router/guards/permission.ts (100%) rename console/{src => console-src}/router/index.ts (92%) rename console/{src => console-src}/router/routes.config.ts (78%) rename console/{src => console-src}/stores/system-configmap.ts (100%) rename console/{src => console-src}/stores/theme.ts (100%) rename console/{src => console-src}/styles/index.css (100%) rename console/{src => console-src}/styles/tailwind.css (100%) rename console/{src => console-src}/views/exceptions/Forbidden.vue (100%) rename console/{src => console-src}/views/exceptions/NotFound.vue (100%) rename console/{src => console-src}/views/exceptions/__tests__/NotFound.spec.ts (100%) rename console/{src => console-src}/views/exceptions/components/Exception.vue (100%) rename console/{src => console-src}/views/system/Redirect.vue (100%) rename console/{src => console-src}/views/system/Setup.vue (100%) rename console/{src => console-src}/views/system/SetupInitialData.vue (100%) rename console/{src => console-src}/views/system/setup-data/category.json (100%) rename console/{src => console-src}/views/system/setup-data/menu-items.json (100%) rename console/{src => console-src}/views/system/setup-data/menu.json (100%) rename console/{src => console-src}/views/system/setup-data/post.json (100%) rename console/{src => console-src}/views/system/setup-data/singlePage.json (100%) rename console/{src => console-src}/views/system/setup-data/tag.json (100%) create mode 100644 console/docs/project-structure/README.md delete mode 100644 console/src/main.ts diff --git a/console/src/App.vue b/console/console-src/App.vue similarity index 92% rename from console/src/App.vue rename to console/console-src/App.vue index 2405a8e9b..825aebcd7 100644 --- a/console/src/App.vue +++ b/console/console-src/App.vue @@ -3,7 +3,7 @@ import { RouterView, useRoute } from "vue-router"; import { computed, watch, reactive, onMounted, inject } from "vue"; import { useTitle } from "@vueuse/core"; import { useFavicon } from "@vueuse/core"; -import { useSystemConfigMapStore } from "./stores/system-configmap"; +import { useSystemConfigMapStore } from "@console/stores/system-configmap"; import { storeToRefs } from "pinia"; import { useI18n } from "vue-i18n"; import { @@ -11,9 +11,9 @@ import { type UseOverlayScrollbarsParams, } from "overlayscrollbars-vue"; import type { FormKitConfig } from "@formkit/core"; -import { i18n } from "./locales"; -import { AppName } from "./constants/app"; -import { useGlobalInfoStore } from "./stores/global-info"; +import { i18n } from "@/locales"; +import { AppName } from "@/constants/app"; +import { useGlobalInfoStore } from "@/stores/global-info"; const { t } = useI18n(); diff --git a/console/src/composables/use-auto-save-content.ts b/console/console-src/composables/use-auto-save-content.ts similarity index 100% rename from console/src/composables/use-auto-save-content.ts rename to console/console-src/composables/use-auto-save-content.ts diff --git a/console/src/composables/use-content-cache.ts b/console/console-src/composables/use-content-cache.ts similarity index 100% rename from console/src/composables/use-content-cache.ts rename to console/console-src/composables/use-content-cache.ts diff --git a/console/src/composables/use-content-snapshot.ts b/console/console-src/composables/use-content-snapshot.ts similarity index 100% rename from console/src/composables/use-content-snapshot.ts rename to console/console-src/composables/use-content-snapshot.ts diff --git a/console/src/composables/use-editor-extension-points.ts b/console/console-src/composables/use-editor-extension-points.ts similarity index 100% rename from console/src/composables/use-editor-extension-points.ts rename to console/console-src/composables/use-editor-extension-points.ts diff --git a/console/src/composables/use-entity-extension-points.ts b/console/console-src/composables/use-entity-extension-points.ts similarity index 100% rename from console/src/composables/use-entity-extension-points.ts rename to console/console-src/composables/use-entity-extension-points.ts diff --git a/console/src/composables/use-global-info.ts b/console/console-src/composables/use-global-info.ts similarity index 100% rename from console/src/composables/use-global-info.ts rename to console/console-src/composables/use-global-info.ts diff --git a/console/src/composables/use-operation-extension-points.ts b/console/console-src/composables/use-operation-extension-points.ts similarity index 100% rename from console/src/composables/use-operation-extension-points.ts rename to console/console-src/composables/use-operation-extension-points.ts diff --git a/console/src/composables/use-save-keybinding.ts b/console/console-src/composables/use-save-keybinding.ts similarity index 100% rename from console/src/composables/use-save-keybinding.ts rename to console/console-src/composables/use-save-keybinding.ts diff --git a/console/src/composables/use-setting-form.ts b/console/console-src/composables/use-setting-form.ts similarity index 99% rename from console/src/composables/use-setting-form.ts rename to console/console-src/composables/use-setting-form.ts index 5ca6dd0cc..94c3c6e92 100644 --- a/console/src/composables/use-setting-form.ts +++ b/console/console-src/composables/use-setting-form.ts @@ -2,7 +2,7 @@ // types import { computed, watch, type ComputedRef, type Ref } from "vue"; import { ref } from "vue"; -import { apiClient } from "../utils/api-client"; +import { apiClient } from "@/utils/api-client"; // libs import cloneDeep from "lodash.clonedeep"; diff --git a/console/src/composables/use-slugify.ts b/console/console-src/composables/use-slugify.ts similarity index 100% rename from console/src/composables/use-slugify.ts rename to console/console-src/composables/use-slugify.ts diff --git a/console/src/layouts/BasicLayout.vue b/console/console-src/layouts/BasicLayout.vue similarity index 99% rename from console/src/layouts/BasicLayout.vue rename to console/console-src/layouts/BasicLayout.vue index 6d26ba1c9..bbc9e2a0c 100644 --- a/console/src/layouts/BasicLayout.vue +++ b/console/console-src/layouts/BasicLayout.vue @@ -22,7 +22,7 @@ import { onMounted, onUnmounted, reactive, ref } from "vue"; import axios from "axios"; import GlobalSearchModal from "@/components/global-search/GlobalSearchModal.vue"; import LoginModal from "@/components/login/LoginModal.vue"; -import { coreMenuGroups } from "@/router/routes.config"; +import { coreMenuGroups } from "@console/router/routes.config"; import sortBy from "lodash.sortby"; import { useRoleStore } from "@/stores/role"; import { hasPermission } from "@/utils/permission"; diff --git a/console/src/layouts/BlankLayout.vue b/console/console-src/layouts/BlankLayout.vue similarity index 100% rename from console/src/layouts/BlankLayout.vue rename to console/console-src/layouts/BlankLayout.vue diff --git a/console/console-src/main.ts b/console/console-src/main.ts index e69de29bb..693859b17 100644 --- a/console/console-src/main.ts +++ b/console/console-src/main.ts @@ -0,0 +1,113 @@ +import { createApp } from "vue"; +import type { DirectiveBinding } from "vue"; +import { createPinia } from "pinia"; +import App from "./App.vue"; +import router from "./router"; +import { apiClient } from "@/utils/api-client"; +// setup +import "@/setup/setupStyles"; +import { setupComponents } from "@/setup/setupComponents"; +import { setupI18n, i18n, getBrowserLanguage } from "@/locales"; +// core modules +import { hasPermission } from "@/utils/permission"; +import { useRoleStore } from "@/stores/role"; +import { useThemeStore } from "@console/stores/theme"; +import { useUserStore } from "@/stores/user"; +import { useSystemConfigMapStore } from "@console/stores/system-configmap"; +import { setupVueQuery } from "@/setup/setupVueQuery"; +import { useGlobalInfoStore } from "@/stores/global-info"; +import { setupCoreModules, setupPluginModules } from "@/setup/setupModules"; + +const app = createApp(App); + +setupComponents(app); +setupI18n(app); +setupVueQuery(app); + +app.use(createPinia()); + +async function loadUserPermissions() { + const { data: currentPermissions } = await apiClient.user.getPermissions({ + name: "-", + }); + const roleStore = useRoleStore(); + roleStore.$patch({ + permissions: currentPermissions, + }); + app.directive( + "permission", + (el: HTMLElement, binding: DirectiveBinding) => { + const uiPermissions = Array.from( + currentPermissions.uiPermissions + ); + const { value } = binding; + const { any, enable } = binding.modifiers; + + if (hasPermission(uiPermissions, value, any)) { + return; + } + + if (enable) { + //TODO + return; + } + el?.remove?.(); + } + ); +} + +async function loadActivatedTheme() { + const themeStore = useThemeStore(); + await themeStore.fetchActivatedTheme(); +} + +(async function () { + await initApp(); +})(); + +async function initApp() { + // TODO 实验性 + const theme = localStorage.getItem("theme"); + if (theme) { + document.body.classList.add(theme); + } + + try { + setupCoreModules(app); + + const userStore = useUserStore(); + await userStore.fetchCurrentUser(); + + // set locale + i18n.global.locale.value = + localStorage.getItem("locale") || getBrowserLanguage(); + + const globalInfoStore = useGlobalInfoStore(); + await globalInfoStore.fetchGlobalInfo(); + + if (userStore.isAnonymous) { + return; + } + + await loadUserPermissions(); + + try { + await setupPluginModules(app); + } catch (e) { + console.error("Failed to load plugins", e); + } + + // load system configMap + const systemConfigMapStore = useSystemConfigMapStore(); + await systemConfigMapStore.fetchSystemConfigMap(); + + if (globalInfoStore.globalInfo?.userInitialized) { + await loadActivatedTheme(); + } + } catch (e) { + console.error(e); + } finally { + app.use(router); + app.mount("#app"); + } +} diff --git a/console/src/modules/contents/_components/ContributorList.vue b/console/console-src/modules/contents/_components/ContributorList.vue similarity index 100% rename from console/src/modules/contents/_components/ContributorList.vue rename to console/console-src/modules/contents/_components/ContributorList.vue diff --git a/console/src/modules/contents/attachments/AttachmentList.vue b/console/console-src/modules/contents/attachments/AttachmentList.vue similarity index 100% rename from console/src/modules/contents/attachments/AttachmentList.vue rename to console/console-src/modules/contents/attachments/AttachmentList.vue diff --git a/console/src/modules/contents/attachments/components/AttachmentDetailModal.vue b/console/console-src/modules/contents/attachments/components/AttachmentDetailModal.vue similarity index 100% rename from console/src/modules/contents/attachments/components/AttachmentDetailModal.vue rename to console/console-src/modules/contents/attachments/components/AttachmentDetailModal.vue diff --git a/console/src/modules/contents/attachments/components/AttachmentGroupEditingModal.vue b/console/console-src/modules/contents/attachments/components/AttachmentGroupEditingModal.vue similarity index 100% rename from console/src/modules/contents/attachments/components/AttachmentGroupEditingModal.vue rename to console/console-src/modules/contents/attachments/components/AttachmentGroupEditingModal.vue diff --git a/console/src/modules/contents/attachments/components/AttachmentGroupList.vue b/console/console-src/modules/contents/attachments/components/AttachmentGroupList.vue similarity index 100% rename from console/src/modules/contents/attachments/components/AttachmentGroupList.vue rename to console/console-src/modules/contents/attachments/components/AttachmentGroupList.vue diff --git a/console/src/modules/contents/attachments/components/AttachmentListItem.vue b/console/console-src/modules/contents/attachments/components/AttachmentListItem.vue similarity index 98% rename from console/src/modules/contents/attachments/components/AttachmentListItem.vue rename to console/console-src/modules/contents/attachments/components/AttachmentListItem.vue index 3109f2ac3..27aaaa08a 100644 --- a/console/src/modules/contents/attachments/components/AttachmentListItem.vue +++ b/console/console-src/modules/contents/attachments/components/AttachmentListItem.vue @@ -19,7 +19,7 @@ import { useI18n } from "vue-i18n"; import { inject } from "vue"; import type { Ref } from "vue"; import { useQueryClient } from "@tanstack/vue-query"; -import { useOperationItemExtensionPoint } from "@/composables/use-operation-extension-points"; +import { useOperationItemExtensionPoint } from "@console/composables/use-operation-extension-points"; import { toRefs } from "vue"; import type { OperationItem } from "@halo-dev/console-shared"; import EntityDropdownItems from "@/components/entity/EntityDropdownItems.vue"; diff --git a/console/src/modules/contents/attachments/components/AttachmentPermalinkList.vue b/console/console-src/modules/contents/attachments/components/AttachmentPermalinkList.vue similarity index 100% rename from console/src/modules/contents/attachments/components/AttachmentPermalinkList.vue rename to console/console-src/modules/contents/attachments/components/AttachmentPermalinkList.vue diff --git a/console/src/modules/contents/attachments/components/AttachmentPoliciesModal.vue b/console/console-src/modules/contents/attachments/components/AttachmentPoliciesModal.vue similarity index 100% rename from console/src/modules/contents/attachments/components/AttachmentPoliciesModal.vue rename to console/console-src/modules/contents/attachments/components/AttachmentPoliciesModal.vue diff --git a/console/src/modules/contents/attachments/components/AttachmentPolicyEditingModal.vue b/console/console-src/modules/contents/attachments/components/AttachmentPolicyEditingModal.vue similarity index 98% rename from console/src/modules/contents/attachments/components/AttachmentPolicyEditingModal.vue rename to console/console-src/modules/contents/attachments/components/AttachmentPolicyEditingModal.vue index 309898730..9cf73da93 100644 --- a/console/src/modules/contents/attachments/components/AttachmentPolicyEditingModal.vue +++ b/console/console-src/modules/contents/attachments/components/AttachmentPolicyEditingModal.vue @@ -4,7 +4,7 @@ import SubmitButton from "@/components/button/SubmitButton.vue"; import type { Policy, PolicyTemplate } from "@halo-dev/api-client"; import cloneDeep from "lodash.clonedeep"; import { computed, ref, toRaw, watch, watchEffect } from "vue"; -import { useSettingForm } from "@/composables/use-setting-form"; +import { useSettingForm } from "@console/composables/use-setting-form"; import { apiClient } from "@/utils/api-client"; import { reset, diff --git a/console/src/modules/contents/attachments/components/AttachmentSelectorModal.vue b/console/console-src/modules/contents/attachments/components/AttachmentSelectorModal.vue similarity index 100% rename from console/src/modules/contents/attachments/components/AttachmentSelectorModal.vue rename to console/console-src/modules/contents/attachments/components/AttachmentSelectorModal.vue diff --git a/console/src/modules/contents/attachments/components/AttachmentUploadModal.vue b/console/console-src/modules/contents/attachments/components/AttachmentUploadModal.vue similarity index 100% rename from console/src/modules/contents/attachments/components/AttachmentUploadModal.vue rename to console/console-src/modules/contents/attachments/components/AttachmentUploadModal.vue diff --git a/console/src/modules/contents/attachments/components/selector-providers/CoreSelectorProvider.vue b/console/console-src/modules/contents/attachments/components/selector-providers/CoreSelectorProvider.vue similarity index 100% rename from console/src/modules/contents/attachments/components/selector-providers/CoreSelectorProvider.vue rename to console/console-src/modules/contents/attachments/components/selector-providers/CoreSelectorProvider.vue diff --git a/console/src/modules/contents/attachments/composables/use-attachment-group.ts b/console/console-src/modules/contents/attachments/composables/use-attachment-group.ts similarity index 100% rename from console/src/modules/contents/attachments/composables/use-attachment-group.ts rename to console/console-src/modules/contents/attachments/composables/use-attachment-group.ts diff --git a/console/src/modules/contents/attachments/composables/use-attachment-policy.ts b/console/console-src/modules/contents/attachments/composables/use-attachment-policy.ts similarity index 100% rename from console/src/modules/contents/attachments/composables/use-attachment-policy.ts rename to console/console-src/modules/contents/attachments/composables/use-attachment-policy.ts diff --git a/console/src/modules/contents/attachments/composables/use-attachment.ts b/console/console-src/modules/contents/attachments/composables/use-attachment.ts similarity index 100% rename from console/src/modules/contents/attachments/composables/use-attachment.ts rename to console/console-src/modules/contents/attachments/composables/use-attachment.ts diff --git a/console/src/modules/contents/attachments/module.ts b/console/console-src/modules/contents/attachments/module.ts similarity index 93% rename from console/src/modules/contents/attachments/module.ts rename to console/console-src/modules/contents/attachments/module.ts index a376071d8..3b7df17a3 100644 --- a/console/src/modules/contents/attachments/module.ts +++ b/console/console-src/modules/contents/attachments/module.ts @@ -1,5 +1,5 @@ import { definePlugin } from "@halo-dev/console-shared"; -import BasicLayout from "@/layouts/BasicLayout.vue"; +import BasicLayout from "@console/layouts/BasicLayout.vue"; import AttachmentList from "./AttachmentList.vue"; import AttachmentSelectorModal from "./components/AttachmentSelectorModal.vue"; import { IconFolder } from "@halo-dev/components"; diff --git a/console/src/modules/contents/comments/CommentList.vue b/console/console-src/modules/contents/comments/CommentList.vue similarity index 100% rename from console/src/modules/contents/comments/CommentList.vue rename to console/console-src/modules/contents/comments/CommentList.vue diff --git a/console/src/modules/contents/comments/components/CommentListItem.vue b/console/console-src/modules/contents/comments/components/CommentListItem.vue similarity index 100% rename from console/src/modules/contents/comments/components/CommentListItem.vue rename to console/console-src/modules/contents/comments/components/CommentListItem.vue diff --git a/console/src/modules/contents/comments/components/ReplyCreationModal.vue b/console/console-src/modules/contents/comments/components/ReplyCreationModal.vue similarity index 100% rename from console/src/modules/contents/comments/components/ReplyCreationModal.vue rename to console/console-src/modules/contents/comments/components/ReplyCreationModal.vue diff --git a/console/src/modules/contents/comments/components/ReplyListItem.vue b/console/console-src/modules/contents/comments/components/ReplyListItem.vue similarity index 100% rename from console/src/modules/contents/comments/components/ReplyListItem.vue rename to console/console-src/modules/contents/comments/components/ReplyListItem.vue diff --git a/console/src/modules/contents/comments/module.ts b/console/console-src/modules/contents/comments/module.ts similarity index 93% rename from console/src/modules/contents/comments/module.ts rename to console/console-src/modules/contents/comments/module.ts index 5cf8e1103..2172fde2d 100644 --- a/console/src/modules/contents/comments/module.ts +++ b/console/console-src/modules/contents/comments/module.ts @@ -1,5 +1,5 @@ import { definePlugin } from "@halo-dev/console-shared"; -import BasicLayout from "@/layouts/BasicLayout.vue"; +import BasicLayout from "@console/layouts/BasicLayout.vue"; import { IconMessage } from "@halo-dev/components"; import CommentList from "./CommentList.vue"; import CommentStatsWidget from "./widgets/CommentStatsWidget.vue"; diff --git a/console/src/modules/contents/comments/widgets/CommentStatsWidget.vue b/console/console-src/modules/contents/comments/widgets/CommentStatsWidget.vue similarity index 100% rename from console/src/modules/contents/comments/widgets/CommentStatsWidget.vue rename to console/console-src/modules/contents/comments/widgets/CommentStatsWidget.vue diff --git a/console/src/modules/contents/pages/DeletedSinglePageList.vue b/console/console-src/modules/contents/pages/DeletedSinglePageList.vue similarity index 100% rename from console/src/modules/contents/pages/DeletedSinglePageList.vue rename to console/console-src/modules/contents/pages/DeletedSinglePageList.vue diff --git a/console/src/modules/contents/pages/SinglePageEditor.vue b/console/console-src/modules/contents/pages/SinglePageEditor.vue similarity index 96% rename from console/src/modules/contents/pages/SinglePageEditor.vue rename to console/console-src/modules/contents/pages/SinglePageEditor.vue index 683a5c15e..65742ea57 100644 --- a/console/src/modules/contents/pages/SinglePageEditor.vue +++ b/console/console-src/modules/contents/pages/SinglePageEditor.vue @@ -27,8 +27,8 @@ import { useRouteQuery } from "@vueuse/router"; import cloneDeep from "lodash.clonedeep"; import { useRouter } from "vue-router"; import { randomUUID } from "@/utils/id"; -import { useContentCache } from "@/composables/use-content-cache"; -import { useEditorExtensionPoints } from "@/composables/use-editor-extension-points"; +import { useContentCache } from "@console/composables/use-content-cache"; +import { useEditorExtensionPoints } from "@console/composables/use-editor-extension-points"; import type { EditorProvider } from "@halo-dev/console-shared"; import { useLocalStorage } from "@vueuse/core"; import EditorProviderSelector from "@/components/dropdown-selector/EditorProviderSelector.vue"; @@ -36,9 +36,9 @@ import { useI18n } from "vue-i18n"; import UrlPreviewModal from "@/components/preview/UrlPreviewModal.vue"; import { contentAnnotations } from "@/constants/annotations"; import { usePageUpdateMutate } from "./composables/use-page-update-mutate"; -import { useAutoSaveContent } from "@/composables/use-auto-save-content"; -import { useContentSnapshot } from "@/composables/use-content-snapshot"; -import { useSaveKeybinding } from "@/composables/use-save-keybinding"; +import { useAutoSaveContent } from "@console/composables/use-auto-save-content"; +import { useContentSnapshot } from "@console/composables/use-content-snapshot"; +import { useSaveKeybinding } from "@console/composables/use-save-keybinding"; const router = useRouter(); const { t } = useI18n(); diff --git a/console/src/modules/contents/pages/SinglePageList.vue b/console/console-src/modules/contents/pages/SinglePageList.vue similarity index 100% rename from console/src/modules/contents/pages/SinglePageList.vue rename to console/console-src/modules/contents/pages/SinglePageList.vue diff --git a/console/src/modules/contents/pages/components/SinglePageListItem.vue b/console/console-src/modules/contents/pages/components/SinglePageListItem.vue similarity index 100% rename from console/src/modules/contents/pages/components/SinglePageListItem.vue rename to console/console-src/modules/contents/pages/components/SinglePageListItem.vue diff --git a/console/src/modules/contents/pages/components/SinglePageSettingModal.vue b/console/console-src/modules/contents/pages/components/SinglePageSettingModal.vue similarity index 98% rename from console/src/modules/contents/pages/components/SinglePageSettingModal.vue rename to console/console-src/modules/contents/pages/components/SinglePageSettingModal.vue index e742bfddf..a1f2bd040 100644 --- a/console/src/modules/contents/pages/components/SinglePageSettingModal.vue +++ b/console/console-src/modules/contents/pages/components/SinglePageSettingModal.vue @@ -10,13 +10,13 @@ import { computed, nextTick, ref, watchEffect } from "vue"; import type { SinglePage } from "@halo-dev/api-client"; import cloneDeep from "lodash.clonedeep"; import { apiClient } from "@/utils/api-client"; -import { useThemeCustomTemplates } from "@/modules/interface/themes/composables/use-theme"; +import { useThemeCustomTemplates } from "@console/modules/interface/themes/composables/use-theme"; import { singlePageLabels } from "@/constants/labels"; import { randomUUID } from "@/utils/id"; import { toDatetimeLocal, toISOString } from "@/utils/date"; import { submitForm } from "@formkit/core"; import AnnotationsForm from "@/components/form/AnnotationsForm.vue"; -import useSlugify from "@/composables/use-slugify"; +import useSlugify from "@console/composables/use-slugify"; import { useI18n } from "vue-i18n"; import { usePageUpdateMutate } from "../composables/use-page-update-mutate"; import { FormType } from "@/types/slug"; diff --git a/console/src/modules/contents/pages/composables/use-page-update-mutate.ts b/console/console-src/modules/contents/pages/composables/use-page-update-mutate.ts similarity index 100% rename from console/src/modules/contents/pages/composables/use-page-update-mutate.ts rename to console/console-src/modules/contents/pages/composables/use-page-update-mutate.ts diff --git a/console/src/modules/contents/pages/module.ts b/console/console-src/modules/contents/pages/module.ts similarity index 96% rename from console/src/modules/contents/pages/module.ts rename to console/console-src/modules/contents/pages/module.ts index f88ee1192..7df6f530e 100644 --- a/console/src/modules/contents/pages/module.ts +++ b/console/console-src/modules/contents/pages/module.ts @@ -1,5 +1,5 @@ import { definePlugin } from "@halo-dev/console-shared"; -import BasicLayout from "@/layouts/BasicLayout.vue"; +import BasicLayout from "@console/layouts/BasicLayout.vue"; import SinglePageList from "./SinglePageList.vue"; import DeletedSinglePageList from "./DeletedSinglePageList.vue"; import SinglePageEditor from "./SinglePageEditor.vue"; diff --git a/console/src/modules/contents/pages/widgets/SinglePageStatsWidget.vue b/console/console-src/modules/contents/pages/widgets/SinglePageStatsWidget.vue similarity index 100% rename from console/src/modules/contents/pages/widgets/SinglePageStatsWidget.vue rename to console/console-src/modules/contents/pages/widgets/SinglePageStatsWidget.vue diff --git a/console/src/modules/contents/posts/DeletedPostList.vue b/console/console-src/modules/contents/posts/DeletedPostList.vue similarity index 100% rename from console/src/modules/contents/posts/DeletedPostList.vue rename to console/console-src/modules/contents/posts/DeletedPostList.vue diff --git a/console/src/modules/contents/posts/PostEditor.vue b/console/console-src/modules/contents/posts/PostEditor.vue similarity index 96% rename from console/src/modules/contents/posts/PostEditor.vue rename to console/console-src/modules/contents/posts/PostEditor.vue index 3ec956ba9..f9f352367 100644 --- a/console/src/modules/contents/posts/PostEditor.vue +++ b/console/console-src/modules/contents/posts/PostEditor.vue @@ -27,8 +27,8 @@ import { apiClient } from "@/utils/api-client"; import { useRouteQuery } from "@vueuse/router"; import { useRouter } from "vue-router"; import { randomUUID } from "@/utils/id"; -import { useContentCache } from "@/composables/use-content-cache"; -import { useEditorExtensionPoints } from "@/composables/use-editor-extension-points"; +import { useContentCache } from "@console/composables/use-content-cache"; +import { useEditorExtensionPoints } from "@console/composables/use-editor-extension-points"; import type { EditorProvider } from "@halo-dev/console-shared"; import { useLocalStorage } from "@vueuse/core"; import EditorProviderSelector from "@/components/dropdown-selector/EditorProviderSelector.vue"; @@ -36,9 +36,9 @@ import { useI18n } from "vue-i18n"; import UrlPreviewModal from "@/components/preview/UrlPreviewModal.vue"; import { usePostUpdateMutate } from "./composables/use-post-update-mutate"; import { contentAnnotations } from "@/constants/annotations"; -import { useAutoSaveContent } from "@/composables/use-auto-save-content"; -import { useContentSnapshot } from "@/composables/use-content-snapshot"; -import { useSaveKeybinding } from "@/composables/use-save-keybinding"; +import { useAutoSaveContent } from "@console/composables/use-auto-save-content"; +import { useContentSnapshot } from "@console/composables/use-content-snapshot"; +import { useSaveKeybinding } from "@console/composables/use-save-keybinding"; const router = useRouter(); const { t } = useI18n(); diff --git a/console/src/modules/contents/posts/PostList.vue b/console/console-src/modules/contents/posts/PostList.vue similarity index 100% rename from console/src/modules/contents/posts/PostList.vue rename to console/console-src/modules/contents/posts/PostList.vue diff --git a/console/src/modules/contents/posts/categories/CategoryList.vue b/console/console-src/modules/contents/posts/categories/CategoryList.vue similarity index 100% rename from console/src/modules/contents/posts/categories/CategoryList.vue rename to console/console-src/modules/contents/posts/categories/CategoryList.vue diff --git a/console/src/modules/contents/posts/categories/components/CategoryEditingModal.vue b/console/console-src/modules/contents/posts/categories/components/CategoryEditingModal.vue similarity index 98% rename from console/src/modules/contents/posts/categories/components/CategoryEditingModal.vue rename to console/console-src/modules/contents/posts/categories/components/CategoryEditingModal.vue index aac939259..cec6a5167 100644 --- a/console/src/modules/contents/posts/categories/components/CategoryEditingModal.vue +++ b/console/console-src/modules/contents/posts/categories/components/CategoryEditingModal.vue @@ -20,9 +20,9 @@ import type { Category } from "@halo-dev/api-client"; import cloneDeep from "lodash.clonedeep"; import { reset } from "@formkit/core"; import { setFocus } from "@/formkit/utils/focus"; -import { useThemeCustomTemplates } from "@/modules/interface/themes/composables/use-theme"; +import { useThemeCustomTemplates } from "@console/modules/interface/themes/composables/use-theme"; import AnnotationsForm from "@/components/form/AnnotationsForm.vue"; -import useSlugify from "@/composables/use-slugify"; +import useSlugify from "@console/composables/use-slugify"; import { useI18n } from "vue-i18n"; import { FormType } from "@/types/slug"; diff --git a/console/src/modules/contents/posts/categories/components/CategoryListItem.vue b/console/console-src/modules/contents/posts/categories/components/CategoryListItem.vue similarity index 100% rename from console/src/modules/contents/posts/categories/components/CategoryListItem.vue rename to console/console-src/modules/contents/posts/categories/components/CategoryListItem.vue diff --git a/console/src/modules/contents/posts/categories/components/__tests__/CategoryEditingModal.spec.ts b/console/console-src/modules/contents/posts/categories/components/__tests__/CategoryEditingModal.spec.ts similarity index 100% rename from console/src/modules/contents/posts/categories/components/__tests__/CategoryEditingModal.spec.ts rename to console/console-src/modules/contents/posts/categories/components/__tests__/CategoryEditingModal.spec.ts diff --git a/console/src/modules/contents/posts/categories/composables/use-post-category.ts b/console/console-src/modules/contents/posts/categories/composables/use-post-category.ts similarity index 92% rename from console/src/modules/contents/posts/categories/composables/use-post-category.ts rename to console/console-src/modules/contents/posts/categories/composables/use-post-category.ts index 0e8d90c26..6ac4316ab 100644 --- a/console/src/modules/contents/posts/categories/composables/use-post-category.ts +++ b/console/console-src/modules/contents/posts/categories/composables/use-post-category.ts @@ -2,8 +2,8 @@ import { apiClient } from "@/utils/api-client"; import type { Category } from "@halo-dev/api-client"; import type { Ref } from "vue"; import { ref } from "vue"; -import type { CategoryTree } from "@/modules/contents/posts/categories/utils"; -import { buildCategoriesTree } from "@/modules/contents/posts/categories/utils"; +import type { CategoryTree } from "@console/modules/contents/posts/categories/utils"; +import { buildCategoriesTree } from "@console/modules/contents/posts/categories/utils"; import { Dialog, Toast } from "@halo-dev/components"; import { useQuery } from "@tanstack/vue-query"; import { useI18n } from "vue-i18n"; diff --git a/console/src/modules/contents/posts/categories/utils/index.ts b/console/console-src/modules/contents/posts/categories/utils/index.ts similarity index 100% rename from console/src/modules/contents/posts/categories/utils/index.ts rename to console/console-src/modules/contents/posts/categories/utils/index.ts diff --git a/console/src/modules/contents/posts/components/PostListItem.vue b/console/console-src/modules/contents/posts/components/PostListItem.vue similarity index 96% rename from console/src/modules/contents/posts/components/PostListItem.vue rename to console/console-src/modules/contents/posts/components/PostListItem.vue index 16b7d6715..ea64ce3ae 100644 --- a/console/src/modules/contents/posts/components/PostListItem.vue +++ b/console/console-src/modules/contents/posts/components/PostListItem.vue @@ -16,8 +16,8 @@ import { useQueryClient } from "@tanstack/vue-query"; import type { Ref } from "vue"; import { computed, toRefs, markRaw, ref, inject } from "vue"; import { useRouter } from "vue-router"; -import { useEntityFieldItemExtensionPoint } from "@/composables/use-entity-extension-points"; -import { useOperationItemExtensionPoint } from "@/composables/use-operation-extension-points"; +import { useEntityFieldItemExtensionPoint } from "@console/composables/use-entity-extension-points"; +import { useOperationItemExtensionPoint } from "@console/composables/use-operation-extension-points"; import EntityDropdownItems from "@/components/entity/EntityDropdownItems.vue"; import type { EntityFieldItem, OperationItem } from "@halo-dev/console-shared"; import TitleField from "./entity-fields/TitleField.vue"; diff --git a/console/src/modules/contents/posts/components/PostSettingModal.vue b/console/console-src/modules/contents/posts/components/PostSettingModal.vue similarity index 98% rename from console/src/modules/contents/posts/components/PostSettingModal.vue rename to console/console-src/modules/contents/posts/components/PostSettingModal.vue index a7f37fa9d..1af6215cb 100644 --- a/console/src/modules/contents/posts/components/PostSettingModal.vue +++ b/console/console-src/modules/contents/posts/components/PostSettingModal.vue @@ -10,13 +10,13 @@ import { computed, nextTick, ref, watchEffect } from "vue"; import type { Post } from "@halo-dev/api-client"; import cloneDeep from "lodash.clonedeep"; import { apiClient } from "@/utils/api-client"; -import { useThemeCustomTemplates } from "@/modules/interface/themes/composables/use-theme"; +import { useThemeCustomTemplates } from "@console/modules/interface/themes/composables/use-theme"; import { postLabels } from "@/constants/labels"; import { randomUUID } from "@/utils/id"; import { toDatetimeLocal, toISOString } from "@/utils/date"; import AnnotationsForm from "@/components/form/AnnotationsForm.vue"; import { submitForm } from "@formkit/core"; -import useSlugify from "@/composables/use-slugify"; +import useSlugify from "@console/composables/use-slugify"; import { useI18n } from "vue-i18n"; import { usePostUpdateMutate } from "../composables/use-post-update-mutate"; import { FormType } from "@/types/slug"; diff --git a/console/src/modules/contents/posts/components/__tests__/PostSettingModal.spec.ts b/console/console-src/modules/contents/posts/components/__tests__/PostSettingModal.spec.ts similarity index 100% rename from console/src/modules/contents/posts/components/__tests__/PostSettingModal.spec.ts rename to console/console-src/modules/contents/posts/components/__tests__/PostSettingModal.spec.ts diff --git a/console/src/modules/contents/posts/components/entity-fields/ContributorsField.vue b/console/console-src/modules/contents/posts/components/entity-fields/ContributorsField.vue similarity index 80% rename from console/src/modules/contents/posts/components/entity-fields/ContributorsField.vue rename to console/console-src/modules/contents/posts/components/entity-fields/ContributorsField.vue index 148ce8f9a..87b609032 100644 --- a/console/src/modules/contents/posts/components/entity-fields/ContributorsField.vue +++ b/console/console-src/modules/contents/posts/components/entity-fields/ContributorsField.vue @@ -1,7 +1,7 @@ diff --git a/console/src/modules/system/users/widgets/UserStatsWidget.vue b/console/console-src/modules/system/users/widgets/UserStatsWidget.vue similarity index 100% rename from console/src/modules/system/users/widgets/UserStatsWidget.vue rename to console/console-src/modules/system/users/widgets/UserStatsWidget.vue diff --git a/console/src/router/guards/auth-check.ts b/console/console-src/router/guards/auth-check.ts similarity index 100% rename from console/src/router/guards/auth-check.ts rename to console/console-src/router/guards/auth-check.ts diff --git a/console/src/router/guards/check-states.ts b/console/console-src/router/guards/check-states.ts similarity index 100% rename from console/src/router/guards/check-states.ts rename to console/console-src/router/guards/check-states.ts diff --git a/console/src/router/guards/permission.ts b/console/console-src/router/guards/permission.ts similarity index 100% rename from console/src/router/guards/permission.ts rename to console/console-src/router/guards/permission.ts diff --git a/console/src/router/index.ts b/console/console-src/router/index.ts similarity index 92% rename from console/src/router/index.ts rename to console/console-src/router/index.ts index 20d397cb0..50ad60ae0 100644 --- a/console/src/router/index.ts +++ b/console/console-src/router/index.ts @@ -4,7 +4,7 @@ import { type RouteLocationNormalized, type RouteLocationNormalizedLoaded, } from "vue-router"; -import routesConfig from "@/router/routes.config"; +import routesConfig from "@console/router/routes.config"; import { setupPermissionGuard } from "./guards/permission"; import { setupCheckStatesGuard } from "./guards/check-states"; import { setupAuthCheckGuard } from "./guards/auth-check"; diff --git a/console/src/router/routes.config.ts b/console/console-src/router/routes.config.ts similarity index 78% rename from console/src/router/routes.config.ts rename to console/console-src/router/routes.config.ts index 18704b792..9d0c755a3 100644 --- a/console/src/router/routes.config.ts +++ b/console/console-src/router/routes.config.ts @@ -1,11 +1,11 @@ import type { RouteRecordRaw } from "vue-router"; -import NotFound from "@/views/exceptions/NotFound.vue"; -import Forbidden from "@/views/exceptions/Forbidden.vue"; -import BasicLayout from "@/layouts/BasicLayout.vue"; -import Setup from "@/views/system/Setup.vue"; -import Redirect from "@/views/system/Redirect.vue"; +import NotFound from "@console/views/exceptions/NotFound.vue"; +import Forbidden from "@console/views/exceptions/Forbidden.vue"; +import BasicLayout from "@console/layouts/BasicLayout.vue"; +import Setup from "@console/views/system/Setup.vue"; +import Redirect from "@console/views/system/Redirect.vue"; import type { MenuGroupType } from "@halo-dev/console-shared"; -import SetupInitialData from "@/views/system/SetupInitialData.vue"; +import SetupInitialData from "@console/views/system/SetupInitialData.vue"; export const routes: Array = [ { diff --git a/console/src/stores/system-configmap.ts b/console/console-src/stores/system-configmap.ts similarity index 100% rename from console/src/stores/system-configmap.ts rename to console/console-src/stores/system-configmap.ts diff --git a/console/src/stores/theme.ts b/console/console-src/stores/theme.ts similarity index 100% rename from console/src/stores/theme.ts rename to console/console-src/stores/theme.ts diff --git a/console/src/styles/index.css b/console/console-src/styles/index.css similarity index 100% rename from console/src/styles/index.css rename to console/console-src/styles/index.css diff --git a/console/src/styles/tailwind.css b/console/console-src/styles/tailwind.css similarity index 100% rename from console/src/styles/tailwind.css rename to console/console-src/styles/tailwind.css diff --git a/console/src/views/exceptions/Forbidden.vue b/console/console-src/views/exceptions/Forbidden.vue similarity index 100% rename from console/src/views/exceptions/Forbidden.vue rename to console/console-src/views/exceptions/Forbidden.vue diff --git a/console/src/views/exceptions/NotFound.vue b/console/console-src/views/exceptions/NotFound.vue similarity index 100% rename from console/src/views/exceptions/NotFound.vue rename to console/console-src/views/exceptions/NotFound.vue diff --git a/console/src/views/exceptions/__tests__/NotFound.spec.ts b/console/console-src/views/exceptions/__tests__/NotFound.spec.ts similarity index 100% rename from console/src/views/exceptions/__tests__/NotFound.spec.ts rename to console/console-src/views/exceptions/__tests__/NotFound.spec.ts diff --git a/console/src/views/exceptions/components/Exception.vue b/console/console-src/views/exceptions/components/Exception.vue similarity index 100% rename from console/src/views/exceptions/components/Exception.vue rename to console/console-src/views/exceptions/components/Exception.vue diff --git a/console/src/views/system/Redirect.vue b/console/console-src/views/system/Redirect.vue similarity index 100% rename from console/src/views/system/Redirect.vue rename to console/console-src/views/system/Redirect.vue diff --git a/console/src/views/system/Setup.vue b/console/console-src/views/system/Setup.vue similarity index 100% rename from console/src/views/system/Setup.vue rename to console/console-src/views/system/Setup.vue diff --git a/console/src/views/system/SetupInitialData.vue b/console/console-src/views/system/SetupInitialData.vue similarity index 100% rename from console/src/views/system/SetupInitialData.vue rename to console/console-src/views/system/SetupInitialData.vue diff --git a/console/src/views/system/setup-data/category.json b/console/console-src/views/system/setup-data/category.json similarity index 100% rename from console/src/views/system/setup-data/category.json rename to console/console-src/views/system/setup-data/category.json diff --git a/console/src/views/system/setup-data/menu-items.json b/console/console-src/views/system/setup-data/menu-items.json similarity index 100% rename from console/src/views/system/setup-data/menu-items.json rename to console/console-src/views/system/setup-data/menu-items.json diff --git a/console/src/views/system/setup-data/menu.json b/console/console-src/views/system/setup-data/menu.json similarity index 100% rename from console/src/views/system/setup-data/menu.json rename to console/console-src/views/system/setup-data/menu.json diff --git a/console/src/views/system/setup-data/post.json b/console/console-src/views/system/setup-data/post.json similarity index 100% rename from console/src/views/system/setup-data/post.json rename to console/console-src/views/system/setup-data/post.json diff --git a/console/src/views/system/setup-data/singlePage.json b/console/console-src/views/system/setup-data/singlePage.json similarity index 100% rename from console/src/views/system/setup-data/singlePage.json rename to console/console-src/views/system/setup-data/singlePage.json diff --git a/console/src/views/system/setup-data/tag.json b/console/console-src/views/system/setup-data/tag.json similarity index 100% rename from console/src/views/system/setup-data/tag.json rename to console/console-src/views/system/setup-data/tag.json diff --git a/console/docs/project-structure/README.md b/console/docs/project-structure/README.md new file mode 100644 index 000000000..63984b893 --- /dev/null +++ b/console/docs/project-structure/README.md @@ -0,0 +1,61 @@ +# 项目结构 + +此目录为 Halo 前端项目的根目录,包含 Console 和 User Center 两部分。 + +## 名词解释 + +- Console:管理控制台,主要包含内容管理、系统管理、插件、主题等面向管理员的功能。 +- User Center:用户中心,主要面向单个用户。 + +## 目录结构 + +```bash +├── console-src # Console 部分的源码 +│ ├── composables +│ ├── layouts +│ ├── modules +│ ├── router +│ ├── stores +│ ├── styles +│ ├── views +│ ├── App.vue +│ └── main.ts +├── packages # 公共库,会在 Halo 发布版本的时候发布到 npmjs.com +│ ├── api-client # 根据 OpenAPI 生成的 API 客户端 +│ ├── components # 基础组件库 +│ └── shared # 共享库,主要提供给插件使用 +├── src # Console 和 User Center 共享的源码 +│ ├── assets +│ ├── components +│ ├── constants +│ ├── formkit +│ ├── locales +│ ├── setup +│ ├── stores +│ ├── types +│ ├── utils +│ └── vite +├── uc-src # User Center 部分的源码 +│ ├── router +│ ├── App.vue +│ └── main.ts +├── env.d.ts +├── index.html +├── package.json +├── pnpm-lock.yaml +├── pnpm-workspace.yaml +├── postcss.config.js +├── prettier.config.js +├── tailwind.config.js +├── tsconfig.app.json +├── tsconfig.json +├── tsconfig.node.json +├── tsconfig.vitest.json +├── vite.config.ts # Console 的 Vite 配置,使用 `--config` 指定 +├── vite.uc.config.ts # User Center 的 Vite 配置,使用 `--config` 指定 +└── vitest.config.ts +``` + +可以注意到 Console 和 User Center 仅仅只是使用了目录和 Vite 配置进行区分,本质上还是同一个项目,启动 Dev Server 的时候会同时启动两个 Vite 服务,路径分别为 `/console` 和 `/uc`。 + +同时,在构建时,会将 Console 和 User Center 两部分分别构建为两个独立的项目,构建后的文件会分别放在后端的 `application/src/main/resources/console` 和 `application/src/main/resources/uc` 目录下,最终通过 Halo 本身进行托管。 diff --git a/console/docs/routes-generation/README.md b/console/docs/routes-generation/README.md index cbec57be5..966c2ea25 100644 --- a/console/docs/routes-generation/README.md +++ b/console/docs/routes-generation/README.md @@ -15,7 +15,7 @@ ```ts import { definePlugin } from "@halo-dev/console-shared"; -import BasicLayout from "@/layouts/BasicLayout.vue"; +import BasicLayout from "@console/layouts/BasicLayout.vue"; import AttachmentList from "./AttachmentList.vue"; import AttachmentSelectorModal from "./components/AttachmentSelectorModal.vue"; import { IconFolder } from "@halo-dev/components"; diff --git a/console/src/components/dropdown-selector/EditorProviderSelector.vue b/console/src/components/dropdown-selector/EditorProviderSelector.vue index 12b6dbc00..733ce07c2 100644 --- a/console/src/components/dropdown-selector/EditorProviderSelector.vue +++ b/console/src/components/dropdown-selector/EditorProviderSelector.vue @@ -1,5 +1,5 @@