From 297c556de25e2e6cd1378ad0d38df21735ebf287 Mon Sep 17 00:00:00 2001 From: zyronon Date: Fri, 8 Dec 2023 01:26:02 +0800 Subject: [PATCH 1/2] Add data import and export function --- components.d.ts | 1 + src/App.vue | 27 +- src/components/CollectNotice.vue | 9 +- src/components/RightTopBar.vue | 4 +- src/components/Setting.vue | 577 ++++++++++++++++++ .../article/EditBatchArticleModal.vue | 3 +- src/components/dialog/SettingDialog.vue | 330 +--------- src/hooks/event.ts | 215 ++++--- src/pages/practice/Panel.vue | 2 +- src/pages/practice/practice-word/index.vue | 4 +- src/stores/base.ts | 577 +++++++++--------- src/stores/setting.ts | 125 ++-- src/types.ts | 11 - src/utils/const.ts | 18 +- src/utils/index.ts | 123 +++- 15 files changed, 1178 insertions(+), 848 deletions(-) create mode 100644 src/components/Setting.vue diff --git a/components.d.ts b/components.d.ts index 7c5a2a0c..6338ce3e 100644 --- a/components.d.ts +++ b/components.d.ts @@ -55,6 +55,7 @@ declare module 'vue' { Ring: typeof import('./src/components/Ring.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + Setting: typeof import('./src/components/Setting.vue')['default'] SettingDialog: typeof import('./src/components/dialog/SettingDialog.vue')['default'] Slide: typeof import('./src/components/Slide.vue')['default'] Toolbar: typeof import('./src/components/toolbar/index.vue')['default'] diff --git a/src/App.vue b/src/App.vue index 2c77b85e..c019d1e0 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,8 +2,7 @@ import {onMounted, watch} from "vue"; import {BaseState, useBaseStore} from "@/stores/base.ts"; -import {Dict, DictType, SaveConfig, SaveDict} from "@/types.ts" -import Practice from "@/pages/practice/index.vue" +import {Dict, DictType} from "@/types.ts" import {useRuntimeStore} from "@/stores/runtime.ts"; import {useSettingStore} from "@/stores/setting.ts"; import {cloneDeep} from "lodash-es"; @@ -12,8 +11,9 @@ import useTheme from "@/hooks/theme.ts"; import * as localforage from "localforage"; import SettingDialog from "@/components/dialog/SettingDialog.vue"; import ArticleContentDialog from "@/components/dialog/ArticleContentDialog.vue"; -import {useStartKeyboardEventListener} from "@/hooks/event.ts"; import CollectNotice from "@/components/CollectNotice.vue"; +import {SAVE_SETTING_KEY, SAVE_DICT_KEY} from "@/utils/const.ts"; +import {shakeCommonDict} from "@/utils"; const store = useBaseStore() const runtimeStore = useRuntimeStore() @@ -21,26 +21,11 @@ const settingStore = useSettingStore() const {setTheme} = useTheme() watch(store.$state, (n: BaseState) => { - let data: BaseState = cloneDeep(n) - data.myDictList.map((v: Dict) => { - if (v.isCustom) { - if (v.type === DictType.article) { - v.articles.map(s => { - delete s.sections - }) - } - } else { - if (v.type === DictType.word) v.originWords = [] - if (v.type === DictType.article) v.articles = [] - v.words = [] - v.chapterWords = [] - } - }) - localforage.setItem(SaveDict.key, JSON.stringify({val: data, version: SaveDict.version})) + localforage.setItem(SAVE_DICT_KEY.key, JSON.stringify({val: shakeCommonDict(n), version: SAVE_DICT_KEY.version})) }) watch(settingStore.$state, (n) => { - localStorage.setItem(SaveConfig.key, JSON.stringify({val: n, version: SaveConfig.version})) + localStorage.setItem(SAVE_SETTING_KEY.key, JSON.stringify({val: n, version: SAVE_SETTING_KEY.version})) }) //检测几个特定词典 @@ -94,7 +79,7 @@ onMounted(() => { - + \ No newline at end of file diff --git a/src/components/article/EditBatchArticleModal.vue b/src/components/article/EditBatchArticleModal.vue index 1bebacc3..d25ee558 100644 --- a/src/components/article/EditBatchArticleModal.vue +++ b/src/components/article/EditBatchArticleModal.vue @@ -1,7 +1,6 @@ @@ -467,15 +162,4 @@ function resetShortcutKeyMap() { } } -.el-option-row { - width: 100%; - display: flex; - justify-content: space-between; - align-items: center; - - .icon-wrapper { - transform: translateX(10rem); - } -} - \ No newline at end of file diff --git a/src/hooks/event.ts b/src/hooks/event.ts index 5c170281..25025dcf 100644 --- a/src/hooks/event.ts +++ b/src/hooks/event.ts @@ -1,136 +1,131 @@ -import {onMounted, onUnmounted, toRef, toValue, watch} from "vue"; +import {onMounted, onUnmounted, watch} from "vue"; import {emitter, EventKey} from "@/utils/eventBus.ts"; import {useRuntimeStore} from "@/stores/runtime.ts"; -import {$ref} from "vue/macros"; -import {DefaultShortcutKeyMap} from "@/types.ts"; import {useSettingStore} from "@/stores/setting.ts"; export function useWindowClick(cb: (e: PointerEvent) => void) { - onMounted(() => { - emitter.on(EventKey.closeOther, cb) - window.addEventListener('click', cb) - }) - onUnmounted(() => { - window.removeEventListener('click', cb) - }) + onMounted(() => { + emitter.on(EventKey.closeOther, cb) + window.addEventListener('click', cb) + }) + onUnmounted(() => { + window.removeEventListener('click', cb) + }) } export function useEventListener(type: string, listener: EventListenerOrEventListenerObject) { - onMounted(() => window.addEventListener(type, listener)) - onUnmounted(() => window.removeEventListener(type, listener)) + onMounted(() => window.addEventListener(type, listener)) + onUnmounted(() => window.removeEventListener(type, listener)) } export function getShortcutKey(e: KeyboardEvent) { - let shortcutKey = '' - if (e.ctrlKey) shortcutKey += 'Ctrl+' - if (e.altKey) shortcutKey += 'Alt+' - if (e.shiftKey) shortcutKey += 'Shift+' - if (e.key !== 'Control' && e.key !== 'Alt' && e.key !== 'Shift') { - if (e.keyCode >= 65 && e.keyCode <= 90) { - shortcutKey += e.key.toUpperCase() - } else { - if (e.key === 'ArrowRight') { - shortcutKey += '➡' - } else if (e.key === 'ArrowLeft') { - shortcutKey += '⬅' - } else if (e.key === 'ArrowUp') { - shortcutKey += '⬆' - } else if (e.key === 'ArrowDown') { - shortcutKey += '⬇' - } else { - shortcutKey += e.key - } + let shortcutKey = '' + if (e.ctrlKey) shortcutKey += 'Ctrl+' + if (e.altKey) shortcutKey += 'Alt+' + if (e.shiftKey) shortcutKey += 'Shift+' + if (e.key !== 'Control' && e.key !== 'Alt' && e.key !== 'Shift') { + if (e.keyCode >= 65 && e.keyCode <= 90) { + shortcutKey += e.key.toUpperCase() + } else { + if (e.key === 'ArrowRight') { + shortcutKey += '➡' + } else if (e.key === 'ArrowLeft') { + shortcutKey += '⬅' + } else if (e.key === 'ArrowUp') { + shortcutKey += '⬆' + } else if (e.key === 'ArrowDown') { + shortcutKey += '⬇' + } else { + shortcutKey += e.key + } + } } - } - shortcutKey = shortcutKey.trim() + shortcutKey = shortcutKey.trim() - // console.log('key', shortcutKey) - return shortcutKey + // console.log('key', shortcutKey) + return shortcutKey } export function useStartKeyboardEventListener() { - const runtimeStore = useRuntimeStore() - const settingStore = useSettingStore() + const runtimeStore = useRuntimeStore() + const settingStore = useSettingStore() - useEventListener('keydown', (e: KeyboardEvent) => { - // console.log('e',e.keyCode,e.code) - if (!runtimeStore.disableEventListener) { - e.preventDefault() - let shortcutKey = getShortcutKey(e) - // console.log('shortcutKey', shortcutKey) + useEventListener('keydown', (e: KeyboardEvent) => { + // console.log('e',e.keyCode,e.code) + if (!runtimeStore.disableEventListener) { + e.preventDefault() + let shortcutKey = getShortcutKey(e) + // console.log('shortcutKey', shortcutKey) + + let list = Object.entries(settingStore.shortcutKeyMap) + let shortcutEvent = '' + for (let i = 0; i < list.length; i++) { + let [k, v] = list[i] + if (v === shortcutKey) { + console.log('快捷键', k) + shortcutEvent = k + break + } + } + if (shortcutEvent) { + emitter.emit(shortcutEvent, e) + } else { + //非英文模式下,输入区域的 keyCode 均为 229时, + if ((e.keyCode >= 65 && e.keyCode <= 90) + || (e.keyCode >= 48 && e.keyCode <= 57) + || e.code === 'Space' + || e.code === 'Slash' + || e.code === 'Quote' + || e.code === 'Comma' + || e.code === 'BracketLeft' + || e.code === 'BracketRight' + || e.code === 'Period' + || e.code === 'Minus' + || e.code === 'Equal' + || e.code === 'Semicolon' + // || e.code === 'Backquote' + || e.keyCode === 229 + ) { + emitter.emit(EventKey.onTyping, e) + } else { + emitter.emit(EventKey.keydown, e) + } + } - let list = Object.entries(settingStore.shortcutKeyMap) - let shortcutEvent = '' - for (let i = 0; i < list.length; i++) { - let [k, v] = list[i] - if (v === shortcutKey) { - console.log('快捷键', k) - shortcutEvent = k - break } - } - if (shortcutEvent) { - emitter.emit(shortcutEvent, e) - } else { - //非英文模式下,输入区域的 keyCode 均为 229时, - if ((e.keyCode >= 65 && e.keyCode <= 90) - || (e.keyCode >= 48 && e.keyCode <= 57) - || e.code === 'Space' - || e.code === 'Slash' - || e.code === 'Quote' - || e.code === 'Comma' - || e.code === 'BracketLeft' - || e.code === 'BracketRight' - || e.code === 'Period' - || e.code === 'Minus' - || e.code === 'Equal' - || e.code === 'Semicolon' - // || e.code === 'Backquote' - || e.keyCode === 229 - ) { - emitter.emit(EventKey.onTyping, e) - } else { - emitter.emit(EventKey.keydown, e) + }) + useEventListener('keyup', (e: KeyboardEvent) => { + if (!runtimeStore.disableEventListener) { + emitter.emit(EventKey.keyup, e) } - } - - } - }) - useEventListener('keyup', (e: KeyboardEvent) => { - if (!runtimeStore.disableEventListener) { - emitter.emit(EventKey.keyup, e) - } - }) + }) } export function useOnKeyboardEventListener(onKeyDown: (e: KeyboardEvent) => void, onKeyUp: (e: KeyboardEvent) => void) { - onMounted(() => { - emitter.on(EventKey.keydown, onKeyDown) - emitter.on(EventKey.keyup, onKeyUp) - }) - onUnmounted(() => { - emitter.off(EventKey.keydown, onKeyDown) - emitter.off(EventKey.keyup, onKeyUp) - }) + onMounted(() => { + emitter.on(EventKey.keydown, onKeyDown) + emitter.on(EventKey.keyup, onKeyUp) + }) + onUnmounted(() => { + emitter.off(EventKey.keydown, onKeyDown) + emitter.off(EventKey.keyup, onKeyUp) + }) } -export function useDisableEventListener(watchVal?: any) { - const runtimeStore = useRuntimeStore() - watch(watchVal, n => { - if (n) { - runtimeStore.disableEventListener = true - } else { - runtimeStore.disableEventListener = false - } - }) - onMounted(() => { - if (watchVal === undefined) { - runtimeStore.disableEventListener = true - } - }) - onUnmounted(() => { - if (watchVal === undefined) { - runtimeStore.disableEventListener = false - } - }) +export function useDisableEventListener(watchVal: any) { + const runtimeStore = useRuntimeStore() + watch(watchVal, (n: any) => { + if (n === true) runtimeStore.disableEventListener = true + if (n === false) runtimeStore.disableEventListener = false + }) + onMounted(() => { + if (watchVal() === undefined) { + runtimeStore.disableEventListener = true + } + }) + onUnmounted(() => { + if (watchVal() === undefined) { + runtimeStore.disableEventListener = false + } + }) } diff --git a/src/pages/practice/Panel.vue b/src/pages/practice/Panel.vue index 160cda7e..6828d125 100644 --- a/src/pages/practice/Panel.vue +++ b/src/pages/practice/Panel.vue @@ -209,7 +209,7 @@ const showCollectToggleButton = $computed(() => { -