This commit is contained in:
Zyronon
2026-01-08 00:56:02 +08:00
parent 69e9cea705
commit e415f7d20f
39 changed files with 62 additions and 209 deletions

24
components.d.ts vendored
View File

@@ -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']

View File

@@ -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'

View File

@@ -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";

View File

@@ -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'

View File

@@ -1,6 +1,6 @@
<script setup lang="tsx">
import {useSettingStore} from "@/stores/setting.ts";
import Space from "@/pages/article/components/Space.vue";
import Space from "@/components/article/components/Space.vue";
import {PracticeArticleWordType} from "@/types/enum.ts";
import type {ArticleWord} from "@/types/types.ts";

View File

@@ -1,7 +1,7 @@
<script setup lang="ts">
import Switch from '@/components/base/Switch.vue'
import Slider from '@/components/base/Slider.vue'
import SettingItem from '@/pages/setting/SettingItem.vue'
import SettingItem from '@/components/setting/SettingItem.vue'
import { useSettingStore } from '@/stores/setting.ts'
const settingStore = useSettingStore()

View File

@@ -6,7 +6,7 @@ import { Option, Select } from '@/components/base/select'
import Textarea from '@/components/base/Textarea.vue'
import VolumeIcon from '@/components/icon/VolumeIcon.vue'
import Slider from '@/components/base/Slider.vue'
import SettingItem from '@/pages/setting/SettingItem.vue'
import SettingItem from '@/components/setting/SettingItem.vue'
import { useSettingStore } from '@/stores/setting.ts'
import { useBaseStore } from '@/stores/base.ts'
import {ShortcutKey} from "@/types/enum.ts";

View File

@@ -4,7 +4,7 @@ import Switch from "@/components/base/Switch.vue";
import RadioGroup from "@/components/base/radio/RadioGroup.vue";
import InputNumber from "@/components/base/InputNumber.vue";
import Slider from "@/components/base/Slider.vue";
import SettingItem from "@/pages/setting/SettingItem.vue";
import SettingItem from "@/components/setting/SettingItem.vue";
import Radio from "@/components/base/radio/Radio.vue";
import { useSettingStore } from "@/stores/setting.ts";
const settingStore = useSettingStore()

View File

@@ -8,7 +8,7 @@ import Tooltip from '@/components/base/Tooltip.vue'
import SettingDialog from '@/components/setting/SettingDialog.vue'
import BaseButton from '@/components/BaseButton.vue'
import { useBaseStore } from '@/stores/base.ts'
import VolumeSettingMiniDialog from '@/pages/word/components/VolumeSettingMiniDialog.vue'
import VolumeSettingMiniDialog from '@/components/word/components/VolumeSettingMiniDialog.vue'
import StageProgress from '@/components/StageProgress.vue'
import { ShortcutKey, WordPracticeMode, WordPracticeStage } from '@/types/enum.ts'
import { WordPracticeModeNameMap, WordPracticeModeStageMap, WordPracticeStageNameMap } from '@/config/env.ts'

View File

@@ -6,7 +6,7 @@ import Slider from '@/components/base/Slider.vue'
import { defineAsyncComponent, watch } from 'vue'
import { useSettingStore } from '@/stores/setting.ts'
import Toast from '@/components/base/toast/Toast.ts'
import ChangeLastPracticeIndexDialog from '@/pages/word/components/ChangeLastPracticeIndexDialog.vue'
import ChangeLastPracticeIndexDialog from '@/components/word/components/ChangeLastPracticeIndexDialog.vue'
import Tooltip from '@/components/base/Tooltip.vue'
import { useRuntimeStore } from '@/stores/runtime.ts'
import BaseInput from '@/components/base/BaseInput.vue'

View File

@@ -5,12 +5,12 @@ import { useSettingStore } from '@/stores/setting.ts'
import { usePlayBeep, usePlayCorrect, usePlayKeyboardAudio, usePlayWordAudio } from '@/hooks/sound.ts'
import { emitter, EventKey, useEvents } from '@/utils/eventBus.ts'
import { onMounted, onUnmounted, watch } from 'vue'
import SentenceHightLightWord from '@/pages/word/components/SentenceHightLightWord.vue'
import SentenceHightLightWord from '@/components/word/components/SentenceHightLightWord.vue'
import { usePracticeStore } from '@/stores/practice.ts'
import { getDefaultWord } from '@/types/func.ts'
import { _nextTick, last } from '@/utils'
import BaseButton from '@/components/BaseButton.vue'
import Space from '@/pages/article/components/Space.vue'
import Space from '@/components/article/components/Space.vue'
import Toast from '@/components/base/toast/Toast.ts'
import Tooltip from '@/components/base/Tooltip.vue'
import { ShortcutKey, WordPracticeStage, WordPracticeType } from '@/types/enum.ts'

7
src/layout/empty.vue Normal file
View File

@@ -0,0 +1,7 @@
<script setup lang="ts">
</script>
<template>
<slot></slot>
</template>

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,7 +1,7 @@
<script setup lang="ts">
import { onMounted, onUnmounted, provide, ref, watch } from 'vue'
import Statistics from '@/pages/word/components/Statistics.vue'
import Statistics from '@/components/word/components/Statistics.vue'
import { emitter, EventKey, useEvents } from '@/utils/eventBus.ts'
import { useSettingStore } from '@/stores/setting.ts'
import { useRuntimeStore } from '@/stores/runtime.ts'
@@ -11,12 +11,12 @@ import useTheme from '@/hooks/theme.ts'
import { getCurrentStudyWord, useWordOptions } from '@/hooks/dict.ts'
import { _getDictDataByUrl, _nextTick, cloneDeep, isMobile, loadJsLib, resourceWrap, shuffle } from '@/utils'
import { useRoute, useRouter } from 'vue-router'
import Footer from '@/pages/word/components/Footer.vue'
import Footer from '@/components/word/components/Footer.vue'
import Panel from '@/components/Panel.vue'
import BaseIcon from '@/components/BaseIcon.vue'
import Tooltip from '@/components/base/Tooltip.vue'
import WordList from '@/components/list/WordList.vue'
import TypeWord from '@/pages/word/components/TypeWord.vue'
import TypeWord from '@/components/word/components/TypeWord.vue'
import Empty from '@/components/Empty.vue'
import { useBaseStore } from '@/stores/base.ts'
import { usePracticeStore } from '@/stores/practice.ts'
@@ -29,7 +29,7 @@ import { AppEnv, DICT_LIST, LIB_JS_URL, TourConfig, WordPracticeModeStageMap } f
import { ToastInstance } from '@/components/base/toast/type.ts'
import { watchOnce } from '@vueuse/core'
import { setUserDictProp } from '@/apis'
import GroupList from '@/pages/word/components/GroupList.vue'
import GroupList from '@/components/word/components/GroupList.vue'
import { getPracticeWordCache, setPracticeWordCache } from '@/utils/cache.ts'
import { ShortcutKey, WordPracticeMode, WordPracticeStage, WordPracticeType } from '@/types/enum.ts'

View File

@@ -24,14 +24,14 @@ import Toast from '@/components/base/toast/Toast.ts'
import BaseButton from '@/components/BaseButton.vue'
import { getDefaultDict } from '@/types/func.ts'
import DeleteIcon from '@/components/icon/DeleteIcon.vue'
import PracticeSettingDialog from '@/pages/word/components/PracticeSettingDialog.vue'
import ChangeLastPracticeIndexDialog from '@/pages/word/components/ChangeLastPracticeIndexDialog.vue'
import PracticeSettingDialog from '@/components/word/components/PracticeSettingDialog.vue'
import ChangeLastPracticeIndexDialog from '@/components/word/components/ChangeLastPracticeIndexDialog.vue'
import { useSettingStore } from '@/stores/setting.ts'
import { useFetch } from '@vueuse/core'
import { AppEnv, DICT_LIST, Host, LIB_JS_URL, Origin, TourConfig, WordPracticeModeNameMap } from '@/config/env.ts'
import { myDictList } from '@/apis'
import PracticeWordListDialog from '@/pages/word/components/PracticeWordListDialog.vue'
import ShufflePracticeSettingDialog from '@/pages/word/components/ShufflePracticeSettingDialog.vue'
import PracticeWordListDialog from '@/components/word/components/PracticeWordListDialog.vue'
import ShufflePracticeSettingDialog from '@/components/word/components/ShufflePracticeSettingDialog.vue'
import { deleteDict } from '@/apis/dict.ts'
import OptionButton from '@/components/base/OptionButton.vue'
import { getPracticeWordCache, setPracticeWordCache } from '@/utils/cache.ts'

View File

@@ -21,7 +21,7 @@ import { set } from 'idb-keyval'
import { useRuntimeStore } from '@/stores/runtime.ts'
import { useExport } from '@/hooks/export.ts'
import MigrateDialog from '@/components/MigrateDialog.vue'
import Log from '@/pages/setting/Log.vue'
import Log from '@/components/setting/Log.vue'
import About from '@/components/About.vue'
import CommonSetting from '@/components/setting/CommonSetting.vue'
import ArticleSetting from '@/components/setting/ArticleSetting.vue'

View File

@@ -1 +0,0 @@
"{\"val\":{\"myDictList\":[{\"id\":\"collect\",\"name\":\"收藏\",\"description\":\"\",\"sort\":0,\"originWords\":[],\"words\":[],\"chapterWordNumber\":30,\"chapterWords\":[],\"residueWords\":[],\"chapterIndex\":0,\"wordIndex\":0,\"articles\":[],\"statistics\":[],\"isCustom\":true,\"length\":0,\"resourceId\":\"\",\"url\":\"\",\"category\":\"自带字典\",\"tags\":[\"自带\"],\"translateLanguage\":\"common\",\"type\":\"collect\",\"language\":\"en\"},{\"id\":\"skip\",\"name\":\"简单词\",\"description\":\"\",\"sort\":0,\"originWords\":[],\"words\":[],\"chapterWordNumber\":30,\"chapterWords\":[],\"residueWords\":[],\"chapterIndex\":0,\"wordIndex\":0,\"articles\":[],\"statistics\":[],\"isCustom\":true,\"length\":0,\"resourceId\":\"\",\"url\":\"\",\"category\":\"自带字典\",\"tags\":[],\"translateLanguage\":\"common\",\"type\":\"simple\",\"language\":\"en\"},{\"id\":\"wrong\",\"name\":\"错词本\",\"description\":\"\",\"sort\":0,\"originWords\":[],\"words\":[],\"chapterWordNumber\":30,\"chapterWords\":[],\"residueWords\":[],\"chapterIndex\":0,\"wordIndex\":0,\"articles\":[],\"statistics\":[],\"isCustom\":true,\"length\":0,\"resourceId\":\"\",\"url\":\"\",\"category\":\"自带字典\",\"tags\":[],\"translateLanguage\":\"common\",\"type\":\"wrong\",\"language\":\"en\"},{\"id\":\"cet4\",\"name\":\"CET-4\",\"description\":\"大学英语四级词库\",\"sort\":0,\"originWords\":[],\"words\":[],\"chapterWordNumber\":30,\"chapterWords\":[],\"residueWords\":[],\"chapterIndex\":0,\"wordIndex\":0,\"articles\":[],\"statistics\":[],\"isCustom\":false,\"length\":2607,\"resourceId\":\"\",\"url\":\"CET4_T.json\",\"category\":\"中国考试\",\"tags\":[\"大学英语\"],\"translateLanguage\":\"common\",\"type\":\"word\",\"language\":\"en\"}],\"collectDictIds\":[],\"current\":{\"index\":3,\"practiceType\":\"word\"},\"simpleWords\":[\"a\",\"an\",\"i\",\"my\",\"you\",\"your\",\"me\",\"it\",\"what\",\"who\",\"where\",\"how\",\"when\",\"which\",\"be\",\"am\",\"is\",\"do\",\"are\",\"did\",\"were\",\"was\",\"can\",\"could\",\"will\",\"would\",\"the\",\"that\",\"this\",\"to\",\"of\",\"for\",\"and\",\"at\",\"not\",\"no\",\"yes\"],\"load\":true},\"version\":3}"

View File

@@ -1,93 +0,0 @@
<script setup lang="ts">
// import origin from './data.json'
import BaseButton from "@/components/BaseButton.vue";
import {checkAndUpgradeSaveDict} from "@/utils";
import str from './data.json'
import {get} from 'idb-keyval'
import { SAVE_DICT_KEY } from "@/config/env.ts";
let data = {}
let origin = {}
async function look() {
let configStr: string = await get(SAVE_DICT_KEY.key)
let obj = JSON.parse(configStr)
console.log('local', obj)
}
function set1() {
// localforage.setItem(SAVE_DICT_KEY.key, JSON.stringify({val: shakeCommonDict(origin.val as any), version: 3}))
}
async function check() {
// let configStr: string = await localforage.getItem(SAVE_DICT_KEY.key)
// console.log('local', configStr)
// console.log('or',origin)
// let configStr: string = await localforage.getItem(SAVE_DICT_KEY.key)
console.parse(str)
// console.log(str)
let data = checkAndUpgradeSaveDict(str)
// console.log('data', data)
// this.setState(data)
}
const generateColumns = (length = 10, prefix = 'column-', props?: any) =>
Array.from({length}).map((_, columnIndex) => ({
...props,
key: `${prefix}${columnIndex}`,
dataKey: `${prefix}${columnIndex}`,
title: `Column ${columnIndex}`,
width: 150,
}))
const generateData = (
columns: ReturnType<typeof generateColumns>,
length = 200,
prefix = 'row-'
) =>
Array.from({length}).map((_, rowIndex) => {
return columns.reduce(
(rowData, column, columnIndex) => {
rowData[column.dataKey] = `Row ${rowIndex} - Col ${columnIndex}`
return rowData
},
{
id: `${prefix}${rowIndex}`,
parentId: null,
}
)
})
const columns = generateColumns(10)
const data1 = generateData(columns, 1000)
</script>
<template>
<div class="page">
<div class="data">
<p>数据升级检测</p>
<BaseButton @click="look">获取保存到localforage的数据</BaseButton>
<BaseButton @click="set">设置data.json的数据到localforage</BaseButton>
<BaseButton @click="check">检测升级逻辑</BaseButton>
</div>
</div>
</template>
<style scoped lang="scss">
.page {
position: relative;
z-index: 1;
font-size: 1rem;
color: black;
.data {
display: flex;
flex-direction: column;
gap: 1rem;
width: 30rem;
}
}
</style>

View File

@@ -1,66 +0,0 @@
<script setup lang="ts">
import BaseButton from "@/components/BaseButton.vue";
import {sendCode} from "@/apis/user.ts";
import {PHONE_CONFIG} from "@/config/auth.ts";
import Toast from "@/components/base/toast/Toast.ts";
import {CodeType} from "@/types/enum.ts";
let isSendingCode = $ref(false)
let codeCountdown = $ref(0)
interface IProps {
validateField: Function,
type: CodeType
val: any
size?: any
}
const props = withDefaults(defineProps<IProps>(), {
size: 'large',
})
// 发送验证码
async function sendVerificationCode() {
let res = props.validateField()
if (res) {
try {
isSendingCode = true
const res = await sendCode({val: props.val, type: props.type})
if (res.success) {
codeCountdown = PHONE_CONFIG.sendInterval
const timer = setInterval(() => {
codeCountdown--
if (codeCountdown <= 0) {
clearInterval(timer)
}
}, 1000)
} else {
Toast.error(res.msg || '发送失败')
}
} catch (error) {
console.error('Send code error:', error)
Toast.error('发送验证码失败')
} finally {
isSendingCode = false
}
}
}
</script>
<template>
<BaseButton
@click="sendVerificationCode"
:disabled="isSendingCode || codeCountdown > 0"
type="info"
:size="props.size"
style="border: 1px solid var(--color-input-border)"
>
{{ codeCountdown > 0 ? `${codeCountdown}s` : (isSendingCode ? '发送中' : '发送验证码') }}
</BaseButton>
</template>
<style scoped lang="scss">
</style>

View File

@@ -1,15 +0,0 @@
<script setup lang="ts">
</script>
<template>
<div class="h-12 text-xs text-gray-400">
<span>
继续操作即表示你阅读并同意我们的
<a href="/user-agreement.html" target="_blank" class="link">用户协议</a>
<a href="/privacy-policy.html" target="_blank" class="link">隐私政策</a>
</span>
<slot/>
</div>
</template>

View File

@@ -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'},
]