diff --git a/components.d.ts b/components.d.ts
index 5386fd68..f1a2abe5 100644
--- a/components.d.ts
+++ b/components.d.ts
@@ -9,6 +9,7 @@ export {}
declare module 'vue' {
export interface GlobalComponents {
About: typeof import('./src/components/About.vue')['default']
+ ArticleAudio: typeof import('./src/components/article/components/ArticleAudio.vue')['default']
ArticleList: typeof import('./src/components/list/ArticleList.vue')['default']
ArticleSetting: typeof import('./src/components/setting/ArticleSetting.vue')['default']
Audio: typeof import('./src/components/base/Audio.vue')['default']
@@ -20,9 +21,11 @@ declare module 'vue' {
BasePage: typeof import('./src/components/BasePage.vue')['default']
BaseTable: typeof import('./src/components/BaseTable.vue')['default']
Book: typeof import('./src/components/Book.vue')['default']
+ ChangeLastPracticeIndexDialog: typeof import('./src/components/word/components/ChangeLastPracticeIndexDialog.vue')['default']
ChannelIcons: typeof import('./src/components/ChannelIcons/ChannelIcons.vue')['default']
Checkbox: typeof import('./src/components/base/checkbox/Checkbox.vue')['default']
Close: typeof import('./src/components/icon/Close.vue')['default']
+ Code: typeof import('./src/components/user/Code.vue')['default']
Collapse: typeof import('./src/components/base/Collapse.vue')['default']
CommonSetting: typeof import('./src/components/setting/CommonSetting.vue')['default']
ConflictNotice: typeof import('./src/components/ConflictNotice.vue')['default']
@@ -32,10 +35,15 @@ declare module 'vue' {
DictGroup: typeof import('./src/components/list/DictGroup.vue')['default']
DictList: typeof import('./src/components/list/DictList.vue')['default']
EditAbleText: typeof import('./src/components/EditAbleText.vue')['default']
+ EditArticle: typeof import('./src/components/article/components/EditArticle.vue')['default']
+ EditBook: typeof import('./src/components/article/components/EditBook.vue')['default']
+ EditSingleArticleModal: typeof import('./src/components/article/components/EditSingleArticleModal.vue')['default']
Empty: typeof import('./src/components/Empty.vue')['default']
+ Footer: typeof import('./src/components/word/components/Footer.vue')['default']
Form: typeof import('./src/components/base/form/Form.vue')['default']
FormItem: typeof import('./src/components/base/form/FormItem.vue')['default']
Github: typeof import('./src/components/ChannelIcons/Github.vue')['default']
+ GroupList: typeof import('./src/components/word/components/GroupList.vue')['default']
Header: typeof import('./src/components/Header.vue')['default']
IconBxVolume: typeof import('~icons/bx/volume')['default']
IconBxVolumeFull: typeof import('~icons/bx/volume-full')['default']
@@ -52,7 +60,6 @@ declare module 'vue' {
IconFluentArrowClockwise20Regular: typeof import('~icons/fluent/arrow-clockwise20-regular')['default']
IconFluentArrowDownload20Regular: typeof import('~icons/fluent/arrow-download20-regular')['default']
IconFluentArrowLeft16Regular: typeof import('~icons/fluent/arrow-left16-regular')['default']
- IconFluentArrowMove20Regular: typeof import('~icons/fluent/arrow-move20-regular')['default']
IconFluentArrowRepeatAll20Regular: typeof import('~icons/fluent/arrow-repeat-all20-regular')['default']
IconFluentArrowRight16Regular: typeof import('~icons/fluent/arrow-right16-regular')['default']
IconFluentArrowShuffle16Regular: typeof import('~icons/fluent/arrow-shuffle16-regular')['default']
@@ -138,34 +145,49 @@ declare module 'vue' {
IconUiwQq: typeof import('~icons/uiw/qq')['default']
InputNumber: typeof import('./src/components/base/InputNumber.vue')['default']
List: typeof import('./src/components/list/List.vue')['default']
+ Log: typeof import('./src/components/setting/Log.vue')['default']
Logo: typeof import('./src/components/Logo.vue')['default']
MigrateDialog: typeof import('./src/components/MigrateDialog.vue')['default']
MiniDialog: typeof import('./src/components/dialog/MiniDialog.vue')['default']
+ Notice: typeof import('./src/components/user/Notice.vue')['default']
Option: typeof import('./src/components/base/select/Option.vue')['default']
OptionButton: typeof import('./src/components/base/OptionButton.vue')['default']
Pagination: typeof import('./src/components/base/Pagination.vue')['default']
Panel: typeof import('./src/components/Panel.vue')['default']
PopConfirm: typeof import('./src/components/PopConfirm.vue')['default']
PracticeLayout: typeof import('./src/components/PracticeLayout.vue')['default']
+ PracticeSettingDialog: typeof import('./src/components/word/components/PracticeSettingDialog.vue')['default']
+ PracticeWordListDialog: typeof import('./src/components/word/components/PracticeWordListDialog.vue')['default']
Progress: typeof import('./src/components/base/Progress.vue')['default']
+ QuestionForm: typeof import('./src/components/article/components/QuestionForm.vue')['default']
+ QuestionItem: typeof import('./src/components/article/components/QuestionItem.vue')['default']
Radio: typeof import('./src/components/base/radio/Radio.vue')['default']
RadioGroup: typeof import('./src/components/base/radio/RadioGroup.vue')['default']
ResourceCard: typeof import('./src/components/ResourceCard.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
Select: typeof import('./src/components/base/select/Select.vue')['default']
+ SentenceHightLightWord: typeof import('./src/components/word/components/SentenceHightLightWord.vue')['default']
SettingDialog: typeof import('./src/components/setting/SettingDialog.vue')['default']
+ SettingItem: typeof import('./src/components/setting/SettingItem.vue')['default']
ShareIcon: typeof import('./src/components/ChannelIcons/ShareIcon.vue')['default']
+ ShufflePracticeSettingDialog: typeof import('./src/components/word/components/ShufflePracticeSettingDialog.vue')['default']
Slide: typeof import('./src/components/Slide.vue')['default']
SlideHorizontal: typeof import('./src/components/slide/SlideHorizontal.vue')['default']
SlideItem: typeof import('./src/components/slide/SlideItem.vue')['default']
Slider: typeof import('./src/components/base/Slider.vue')['default']
+ Space: typeof import('./src/components/article/components/Space.vue')['default']
StageProgress: typeof import('./src/components/StageProgress.vue')['default']
+ Statistics: typeof import('./src/components/word/components/Statistics.vue')['default']
Switch: typeof import('./src/components/base/Switch.vue')['default']
Textarea: typeof import('./src/components/base/Textarea.vue')['default']
Toast: typeof import('./src/components/base/toast/Toast.vue')['default']
Tooltip: typeof import('./src/components/base/Tooltip.vue')['default']
+ TypeWord: typeof import('./src/components/word/components/TypeWord.vue')['default']
+ TypingArticle: typeof import('./src/components/article/components/TypingArticle.vue')['default']
+ TypingWord: typeof import('./src/components/article/components/TypingWord.vue')['default']
VolumeIcon: typeof import('./src/components/icon/VolumeIcon.vue')['default']
+ VolumeSettingMiniDialog: typeof import('./src/components/word/components/VolumeSettingMiniDialog.vue')['default']
WeChat: typeof import('./src/components/ChannelIcons/WeChat.vue')['default']
WordItem: typeof import('./src/components/WordItem.vue')['default']
WordList: typeof import('./src/components/list/WordList.vue')['default']
diff --git a/src/pages/article/components/ArticleAudio.vue b/src/components/article/components/ArticleAudio.vue
similarity index 100%
rename from src/pages/article/components/ArticleAudio.vue
rename to src/components/article/components/ArticleAudio.vue
diff --git a/src/pages/article/components/EditArticle.vue b/src/components/article/components/EditArticle.vue
similarity index 99%
rename from src/pages/article/components/EditArticle.vue
rename to src/components/article/components/EditArticle.vue
index 5785aa0d..abc7744d 100644
--- a/src/pages/article/components/EditArticle.vue
+++ b/src/components/article/components/EditArticle.vue
@@ -17,7 +17,7 @@ import Tooltip from '@/components/base/Tooltip.vue'
import InputNumber from '@/components/base/InputNumber.vue'
import { nanoid } from 'nanoid'
import { update } from 'idb-keyval'
-import ArticleAudio from '@/pages/article/components/ArticleAudio.vue'
+import ArticleAudio from '@/components/article/components/ArticleAudio.vue'
import BaseInput from '@/components/base/BaseInput.vue'
import Textarea from '@/components/base/Textarea.vue'
import { LOCAL_FILE_KEY } from '@/config/env.ts'
diff --git a/src/pages/article/components/EditBook.vue b/src/components/article/components/EditBook.vue
similarity index 100%
rename from src/pages/article/components/EditBook.vue
rename to src/components/article/components/EditBook.vue
diff --git a/src/pages/article/components/EditSingleArticleModal.vue b/src/components/article/components/EditSingleArticleModal.vue
similarity index 93%
rename from src/pages/article/components/EditSingleArticleModal.vue
rename to src/components/article/components/EditSingleArticleModal.vue
index fa044f7f..7493f3ac 100644
--- a/src/pages/article/components/EditSingleArticleModal.vue
+++ b/src/components/article/components/EditSingleArticleModal.vue
@@ -2,7 +2,7 @@
import type {Article} from "@/types/types.ts";
import {useDisableEventListener} from "@/hooks/event.ts";
-import EditArticle from "@/pages/article/components/EditArticle.vue";
+import EditArticle from "@/components/article/components/EditArticle.vue";
import {getDefaultArticle} from "@/types/func.ts";
import {defineAsyncComponent} from "vue";
diff --git a/src/pages/article/components/QuestionForm.vue b/src/components/article/components/QuestionForm.vue
similarity index 100%
rename from src/pages/article/components/QuestionForm.vue
rename to src/components/article/components/QuestionForm.vue
diff --git a/src/pages/article/components/QuestionItem.vue b/src/components/article/components/QuestionItem.vue
similarity index 100%
rename from src/pages/article/components/QuestionItem.vue
rename to src/components/article/components/QuestionItem.vue
diff --git a/src/pages/article/components/Space.vue b/src/components/article/components/Space.vue
similarity index 100%
rename from src/pages/article/components/Space.vue
rename to src/components/article/components/Space.vue
diff --git a/src/pages/article/components/TypingArticle.vue b/src/components/article/components/TypingArticle.vue
similarity index 99%
rename from src/pages/article/components/TypingArticle.vue
rename to src/components/article/components/TypingArticle.vue
index a7a1f010..40678b04 100644
--- a/src/pages/article/components/TypingArticle.vue
+++ b/src/components/article/components/TypingArticle.vue
@@ -3,9 +3,9 @@ import Toast from '@/components/base/toast/Toast.ts'
import BaseButton from '@/components/BaseButton.vue'
import { useWordOptions } from '@/hooks/dict.ts'
import { usePlayBeep, usePlayKeyboardAudio, usePlayWordAudio } from '@/hooks/sound.ts'
-import QuestionForm from '@/pages/article/components/QuestionForm.vue'
-import Space from '@/pages/article/components/Space.vue'
-import TypingWord from '@/pages/article/components/TypingWord.vue'
+import QuestionForm from '@/components/article/components/QuestionForm.vue'
+import Space from '@/components/article/components/Space.vue'
+import TypingWord from '@/components/article/components/TypingWord.vue'
import { useBaseStore } from '@/stores/base.ts'
import { usePracticeStore } from '@/stores/practice.ts'
import { useSettingStore } from '@/stores/setting.ts'
diff --git a/src/pages/article/components/TypingWord.vue b/src/components/article/components/TypingWord.vue
similarity index 97%
rename from src/pages/article/components/TypingWord.vue
rename to src/components/article/components/TypingWord.vue
index 08916d93..e9c92fed 100644
--- a/src/pages/article/components/TypingWord.vue
+++ b/src/components/article/components/TypingWord.vue
@@ -1,6 +1,6 @@
+
+
+
+
diff --git a/src/pages/(articles)/batch-edit-article.vue b/src/pages/(articles)/batch-edit-article.vue
index 18722e23..f3580614 100644
--- a/src/pages/(articles)/batch-edit-article.vue
+++ b/src/pages/(articles)/batch-edit-article.vue
@@ -9,7 +9,7 @@ import { useWindowClick } from '@/hooks/event.ts'
import { MessageBox } from '@/utils/MessageBox.tsx'
import { useRuntimeStore } from '@/stores/runtime.ts'
import { nanoid } from 'nanoid'
-import EditArticle from '@/pages/article/components/EditArticle.vue'
+import EditArticle from '@/components/article/components/EditArticle.vue'
import Toast from '@/components/base/toast/Toast.ts'
import { getDefaultArticle } from '@/types/func.ts'
import BackIcon from '@/components/BackIcon.vue'
diff --git a/src/pages/(articles)/book-detail.vue b/src/pages/(articles)/book-detail.vue
index 272db150..2a9b2f13 100644
--- a/src/pages/(articles)/book-detail.vue
+++ b/src/pages/(articles)/book-detail.vue
@@ -7,12 +7,12 @@ import type { Article, Dict } from '@/types/types'
import { useRuntimeStore } from '@/stores/runtime.ts'
import BaseButton from '@/components/BaseButton.vue'
import { useRoute, useRouter } from 'vue-router'
-import EditBook from '@/pages/article/components/EditBook.vue'
+import EditBook from '@/components/article/components/EditBook.vue'
import { computed, onMounted, onUnmounted, watch } from 'vue'
import { _dateFormat, _getDictDataByUrl, _nextTick, msToHourMinute, resourceWrap, total, useNav } from '@/utils'
import { getDefaultArticle, getDefaultDict } from '@/types/func.ts'
import Toast from '@/components/base/toast/Toast.ts'
-import ArticleAudio from '@/pages/article/components/ArticleAudio.vue'
+import ArticleAudio from '@/components/article/components/ArticleAudio.vue'
import { MessageBox } from '@/utils/MessageBox.tsx'
import { useSettingStore } from '@/stores/setting.ts'
import { useFetch } from '@vueuse/core'
diff --git a/src/pages/(articles)/practice-articles/[id].vue b/src/pages/(articles)/practice-articles/[id].vue
index 4819e1e1..5a1d82a0 100644
--- a/src/pages/(articles)/practice-articles/[id].vue
+++ b/src/pages/(articles)/practice-articles/[id].vue
@@ -13,9 +13,9 @@ import { genArticleSectionData, usePlaySentenceAudio } from '@/hooks/article.ts'
import { useArticleOptions } from '@/hooks/dict.ts'
import { useDisableEventListener, useOnKeyboardEventListener, useStartKeyboardEventListener } from '@/hooks/event.ts'
import useTheme from '@/hooks/theme.ts'
-import ArticleAudio from '@/pages/article/components/ArticleAudio.vue'
-import EditSingleArticleModal from '@/pages/article/components/EditSingleArticleModal.vue'
-import TypingArticle from '@/pages/article/components/TypingArticle.vue'
+import ArticleAudio from '@/components/article/components/ArticleAudio.vue'
+import EditSingleArticleModal from '@/components/article/components/EditSingleArticleModal.vue'
+import TypingArticle from '@/components/article/components/TypingArticle.vue'
import { useBaseStore } from '@/stores/base.ts'
import { usePracticeStore } from '@/stores/practice.ts'
import { useRuntimeStore } from '@/stores/runtime.ts'
diff --git a/src/pages/(words)/dict-detail.vue b/src/pages/(words)/dict-detail.vue
index 7ec9f56f..6aa1b947 100644
--- a/src/pages/(words)/dict-detail.vue
+++ b/src/pages/(words)/dict-detail.vue
@@ -15,8 +15,8 @@ import Toast from '@/components/base/toast/Toast.ts'
import DeleteIcon from '@/components/icon/DeleteIcon.vue'
import { AppEnv, DictId, LIB_JS_URL, TourConfig } from '@/config/env.ts'
import { getCurrentStudyWord } from '@/hooks/dict.ts'
-import EditBook from '@/pages/article/components/EditBook.vue'
-import PracticeSettingDialog from '@/pages/word/components/PracticeSettingDialog.vue'
+import EditBook from '@/components/article/components/EditBook.vue'
+import PracticeSettingDialog from '@/components/word/components/PracticeSettingDialog.vue'
import { useBaseStore } from '@/stores/base.ts'
import { useRuntimeStore } from '@/stores/runtime.ts'
import { useSettingStore } from '@/stores/setting.ts'
diff --git a/src/pages/(words)/practice-words/[id].vue b/src/pages/(words)/practice-words/[id].vue
index 9ec23afc..c7eb0d3a 100644
--- a/src/pages/(words)/practice-words/[id].vue
+++ b/src/pages/(words)/practice-words/[id].vue
@@ -1,7 +1,7 @@
-
-
-
-
-
数据升级检测
-
获取保存到localforage的数据
-
设置data.json的数据到localforage
-
检测升级逻辑
-
-
-
-
-
diff --git a/src/pages/user/Code.vue b/src/pages/user/Code.vue
deleted file mode 100644
index bfef15d3..00000000
--- a/src/pages/user/Code.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
- {{ codeCountdown > 0 ? `${codeCountdown}s` : (isSendingCode ? '发送中' : '发送验证码') }}
-
-
-
-
diff --git a/src/pages/user/Notice.vue b/src/pages/user/Notice.vue
deleted file mode 100644
index 6364751e..00000000
--- a/src/pages/user/Notice.vue
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
- 继续操作即表示你阅读并同意我们的
- 用户协议
- 与
- 隐私政策
-
-
-
-
diff --git a/src/router.ts b/src/router.ts
index db332c97..f2cf3362 100644
--- a/src/router.ts
+++ b/src/router.ts
@@ -1,6 +1,6 @@
import * as VueRouter from 'vue-router'
import {RouteRecordRaw} from 'vue-router'
-import Layout from "@/pages/layout.vue";
+import Layout from "@/layout/default.vue";
import words from "@/pages/(words)/words.vue";
import DictDetail from "@/pages/(words)/dict-detail.vue";
import DictList from "@/pages/(words)/dict-list.vue";
@@ -12,7 +12,7 @@ import BookDetail from "@/pages/(articles)/book-detail.vue";
import BookList from "@/pages/(articles)/book-list.vue";
import PracticeArticles from "@/pages/(articles)/practice-articles/[id].vue";
-import setting from "@/pages/setting/Setting.vue";
+import setting from "@/pages/setting.vue";
import login from "@/pages/(user)/login.vue";
import user from "@/pages/(user)/user.vue";
import vip from "@/pages/(user)/vip.vue";
@@ -53,7 +53,6 @@ export const routes: RouteRecordRaw[] = [
]
},
{path: '/batch-edit-article', component: () => import("@/pages/(articles)/batch-edit-article.vue")},
- {path: '/test', component: () => import("@/pages/test/test.vue")},
{path: '/:pathMatch(.*)*', redirect: '/words'},
]