feat:修改类型结构

This commit is contained in:
zyronon
2025-08-06 00:33:45 +08:00
parent 6a330e574f
commit 83a0d846e0
24 changed files with 5303 additions and 2628 deletions

View File

@@ -1,8 +1,9 @@
import {Article, ArticleWord, getDefaultArticleWord, Sentence} from "@/types/types.ts";
import {Article, ArticleWord, Sentence} from "@/types/types.ts";
import {cloneDeep} from "@/utils";
import nlp from "compromise/one";
import {usePlayWordAudio} from "@/hooks/sound.ts";
import {getSentenceAllText, getSentenceAllTranslateText} from "@/hooks/translate.ts";
import {getDefaultArticleWord} from "@/types/func.ts";
interface KeyboardMap {
Period: string,

View File

@@ -1,6 +1,7 @@
import {Article, getDefaultArticle, Word} from "@/types/types.ts";
import {Article, Word} from "@/types/types.ts";
import {useBaseStore} from "@/stores/base.ts";
import {nanoid} from "nanoid";
import {getDefaultArticle} from "@/types/func.ts";
export function useWordOptions() {

View File

@@ -5,7 +5,7 @@ import "vue-activity-calendar/style.css";
import {useRouter} from "vue-router";
import BasePage from "@/pages/pc/components/BasePage.vue";
import {_getDictDataByUrl, useNav} from "@/utils";
import {DictResource, DictType, getDefaultDict} from "@/types/types.ts";
import {DictResource, DictType} from "@/types/types.ts";
import {useRuntimeStore} from "@/stores/runtime.ts";
import BaseIcon from "@/components/BaseIcon.vue";
import Book from "@/pages/pc/components/Book.vue";
@@ -13,6 +13,7 @@ import {ElMessage, ElProgress} from 'element-plus';
import BaseButton from "@/components/BaseButton.vue";
import PopConfirm from "@/pages/pc/components/PopConfirm.vue";
import {onMounted, watch} from "vue";
import {getDefaultDict} from "@/types/func.ts";
const {nav} = useNav()
const base = useBaseStore()

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import {onMounted, onUnmounted} from "vue";
import {Article, getDefaultArticle} from "@/types/types.ts";
import {Article} from "@/types/types.ts";
import BaseButton from "@/components/BaseButton.vue";
import {cloneDeep} from "@/utils";
import {useBaseStore} from "@/stores/base.ts";
@@ -16,6 +16,7 @@ import EditArticle2 from "@/pages/pc/article/components/EditArticle2.vue";
import BaseIcon from "@/components/BaseIcon.vue";
import {_nextTick} from "@/utils";
import {ElMessage} from "element-plus";
import {getDefaultArticle} from "@/types/func.ts";
const emit = defineEmits<{
importData: [val: Event]

View File

@@ -5,7 +5,7 @@ import BackIcon from "@/pages/pc/components/BackIcon.vue";
import Empty from "@/components/Empty.vue";
import ArticleList from "@/pages/pc/components/list/ArticleList.vue";
import {useBaseStore} from "@/stores/base.ts";
import {Article, DictId, DictType, getDefaultArticle, getDefaultDict} from "@/types/types.ts";
import {Article, DictId, DictType} from "@/types/types.ts";
import {useRuntimeStore} from "@/stores/runtime.ts";
import BaseButton from "@/components/BaseButton.vue";
import {useRoute, useRouter} from "vue-router";
@@ -14,6 +14,7 @@ import {computed, onMounted} from "vue";
import {_getDictDataByUrl} from "@/utils";
import BaseIcon from "@/components/BaseIcon.vue";
import {useArticleOptions} from "@/hooks/dict.ts";
import {getDefaultArticle, getDefaultDict} from "@/types/func.ts";
const runtimeStore = useRuntimeStore()
const base = useBaseStore()

View File

@@ -2,7 +2,7 @@
import "vue-activity-calendar/style.css";
import {useNav} from "@/utils";
import BasePage from "@/pages/pc/components/BasePage.vue";
import {DictResource, getDefaultDict} from "@/types/types.ts";
import {DictResource} from "@/types/types.ts";
import {useRuntimeStore} from "@/stores/runtime.ts";
import BaseIcon from "@/components/BaseIcon.vue";
import Empty from "@/components/Empty.vue";
@@ -13,6 +13,7 @@ import BackIcon from "@/pages/pc/components/BackIcon.vue";
import {useRouter} from "vue-router";
import {enArticle} from "@/assets/dictionary.ts";
import {computed} from "vue";
import {getDefaultDict} from "@/types/func.ts";
const {nav} = useNav()
const runtimeStore = useRuntimeStore()

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import {Article, getDefaultArticle, Sentence, TranslateEngine} from "@/types/types.ts";
import {Article, Sentence, TranslateEngine} from "@/types/types.ts";
import BaseButton from "@/components/BaseButton.vue";
import EditAbleText from "@/pages/pc/components/EditAbleText.vue";
import {Icon} from "@iconify/vue";
@@ -13,6 +13,7 @@ import {ElInputNumber, ElMessage, ElOption, ElPopover, ElSelect, ElUpload, Uploa
import * as Comparison from "string-comparison"
import BaseIcon from "@/components/BaseIcon.vue";
import Dialog from "@/pages/pc/components/dialog/Dialog.vue";
import {getDefaultArticle} from "@/types/func.ts";
interface IProps {
article?: Article,

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import {Dict, DictType, getDefaultDict} from "@/types/types.ts";
import {Dict, DictType} from "@/types/types.ts";
import {cloneDeep} from "@/utils";
import {ElForm, ElFormItem, ElInput, ElSelect, ElOption, FormInstance, FormRules, ElMessage} from "element-plus";
@@ -8,6 +8,7 @@ import {onMounted, reactive} from "vue";
import {useRuntimeStore} from "@/stores/runtime.ts";
import {useBaseStore} from "@/stores/base.ts";
import BaseButton from "@/components/BaseButton.vue";
import {getDefaultDict} from "@/types/func.ts";
const props = defineProps<{
isAdd: boolean,

View File

@@ -1,9 +1,10 @@
<script setup lang="ts">
import {Article, getDefaultArticle} from "@/types/types.ts";
import {Article} from "@/types/types.ts";
import Dialog from "@/pages/pc/components/dialog/Dialog.vue";
import {useDisableEventListener} from "@/hooks/event.ts";
import EditArticle2 from "@/pages/pc/article/components/EditArticle2.vue";
import {getDefaultArticle} from "@/types/func.ts";
interface IProps {
article?: Article

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import {computed, onMounted, onUnmounted, watch} from "vue"
import {Article, ArticleWord, getDefaultArticle, Sentence, Word} from "@/types/types.ts";
import {Article, ArticleWord, Sentence, Word} from "@/types/types.ts";
import {useBaseStore} from "@/stores/base.ts";
import {usePracticeStore} from "@/stores/practice.ts";
import {useSettingStore} from "@/stores/setting.ts";
@@ -12,6 +12,7 @@ import ContextMenu from '@imengyu/vue3-context-menu'
import {getTranslateText} from "@/hooks/article.ts";
import BaseButton from "@/components/BaseButton.vue";
import QuestionForm from "@/pages/pc/article/components/QuestionForm.vue";
import {getDefaultArticle} from "@/types/func.ts";
interface IProps {
article: Article,

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import TypingArticle from "./TypingArticle.vue";
import {Article, ArticleItem, ArticleWord, DisplayStatistics, getDefaultArticle, ShortcutKey, Word} from "@/types/types.ts";
import {Article, ArticleItem, ArticleWord, DisplayStatistics, ShortcutKey, Word} from "@/types/types.ts";
import {cloneDeep} from "@/utils";
import Panel from "../../components/Panel.vue";
import {onMounted, onUnmounted} from "vue";
@@ -17,6 +17,7 @@ import {useOnKeyboardEventListener} from "@/hooks/event.ts";
import {genArticleSectionData, usePlaySentenceAudio} from "@/hooks/article.ts";
import {ElProgress} from 'element-plus';
import router from "@/router.ts";
import {getDefaultArticle} from "@/types/func.ts";
const store = useBaseStore()
const statisticsStore = usePracticeStore()

View File

@@ -1,5 +1,5 @@
<script setup lang="tsx">
import {DictId, getDefaultDict, Word} from "@/types/types.ts";
import {DictId, Word} from "@/types/types.ts";
import BasePage from "@/pages/pc/components/BasePage.vue";
import {computed, onMounted, reactive, shallowReactive} from "vue";
@@ -17,6 +17,7 @@ import BaseButton from "@/components/BaseButton.vue";
import {useRoute, useRouter} from "vue-router";
import {useBaseStore} from "@/stores/base.ts";
import EditBook from "@/pages/pc/article/components/EditBook.vue";
import {getDefaultDict} from "@/types/func.ts";
const runtimeStore = useRuntimeStore()
const base = useBaseStore()

View File

@@ -2,7 +2,7 @@
import "vue-activity-calendar/style.css";
import {useNav} from "@/utils";
import BasePage from "@/pages/pc/components/BasePage.vue";
import {DictResource, getDefaultDict} from "@/types/types.ts";
import {DictResource} from "@/types/types.ts";
import {useRuntimeStore} from "@/stores/runtime.ts";
import BaseIcon from "@/components/BaseIcon.vue";
import Empty from "@/components/Empty.vue";
@@ -16,6 +16,7 @@ import {useRouter} from "vue-router";
import {groupBy} from "@/utils";
import {dictionaryResources} from "@/assets/dictionary.ts";
import {computed} from "vue";
import {getDefaultDict} from "@/types/func.ts";
const {nav} = useNav()
const runtimeStore = useRuntimeStore()

View File

@@ -6,7 +6,7 @@ import Statistics from "@/pages/pc/word/Statistics.vue";
import {emitter, EventKey, useEvents} from "@/utils/eventBus.ts";
import {useSettingStore} from "@/stores/setting.ts";
import {useRuntimeStore} from "@/stores/runtime.ts";
import {getDefaultWord, ShortcutKey, StudyData, Word} from "@/types/types.ts";
import {ShortcutKey, StudyData, Word} from "@/types/types.ts";
import {useOnKeyboardEventListener, useStartKeyboardEventListener} from "@/hooks/event.ts";
import useTheme from "@/hooks/theme.ts";
import {getCurrentStudyWord, useWordOptions} from "@/hooks/dict.ts";
@@ -24,6 +24,7 @@ import {useBaseStore} from "@/stores/base.ts";
import {usePracticeStore} from "@/stores/practice.ts";
import {dictionaryResources} from "@/assets/dictionary.ts";
import {ElMessage} from "element-plus";
import {getDefaultWord} from "@/types/func.ts";
interface IProps {
new: Word[],

View File

@@ -8,7 +8,7 @@ import BaseIcon from "@/components/BaseIcon.vue";
import Dialog from "@/pages/pc/components/dialog/Dialog.vue";
import {_dateFormat, _getAccomplishDate, _getAccomplishDays, _getDictDataByUrl, useNav} from "@/utils";
import BasePage from "@/pages/pc/components/BasePage.vue";
import {DictResource, getDefaultDict} from "@/types/types.ts";
import {DictResource} from "@/types/types.ts";
import {onMounted, watch} from "vue";
import {getCurrentStudyWord} from "@/hooks/dict.ts";
import {useRuntimeStore} from "@/stores/runtime.ts";
@@ -16,6 +16,7 @@ import Book from "@/pages/pc/components/Book.vue";
import PopConfirm from "@/pages/pc/components/PopConfirm.vue";
import {ElMessage, ElProgress, ElSlider} from 'element-plus';
import BaseButton from "@/components/BaseButton.vue";
import {getDefaultDict} from "@/types/func.ts";
const store = useBaseStore()
const router = useRouter()

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import {getDefaultWord, ShortcutKey, Word} from "@/types/types.ts";
import {ShortcutKey, Word} from "@/types/types.ts";
import VolumeIcon from "@/components/icon/VolumeIcon.vue";
import {useSettingStore} from "@/stores/setting.ts";
import {usePlayBeep, usePlayCorrect, usePlayKeyboardAudio, usePlayWordAudio, useTTsPlayAudio} from "@/hooks/sound.ts";
@@ -8,6 +8,7 @@ import {nextTick, onMounted, onUnmounted, watch} from "vue";
import Tooltip from "@/pages/pc/components/Tooltip.vue";
import SentenceHightLightWord from "@/pages/pc/word/components/SentenceHightLightWord.vue";
import {usePracticeStore} from "@/stores/practice.ts";
import {getDefaultWord} from "@/types/func.ts";
interface IProps {
word: Word,

View File

@@ -1,11 +1,12 @@
import {defineStore} from 'pinia'
import {Dict, DictId, getDefaultDict, Word} from "../types/types.ts"
import {Dict, DictId, Word} from "../types/types.ts"
import {cloneDeep} from "@/utils";
import * as localforage from "localforage";
import {nanoid} from "nanoid";
import {SAVE_DICT_KEY} from "@/utils/const.ts";
import {_getStudyProgress, checkAndUpgradeSaveDict, getDictFile} from "@/utils";
import {markRaw, shallowReactive} from "vue";
import {getDefaultDict} from "@/types/func.ts";
export interface BaseState {
simpleWords: string[],

View File

@@ -1,5 +1,6 @@
import {defineStore} from "pinia"
import {Dict, getDefaultDict} from "@/types/types.ts";
import {Dict} from "@/types/types.ts";
import {getDefaultDict} from "@/types/func.ts";
export interface RuntimeState {
disableEventListener: boolean,

View File

@@ -0,0 +1,70 @@
import {Article, ArticleWord, Dict, DictType, Word} from "@/types/types.ts";
import {shallowReactive} from "vue";
export function getDefaultWord(val: Partial<Word> = {}): Word {
return {
custom: false,
"word": "",
"phonetic0": "",
"phonetic1": "",
"trans": [],
"sentences": [],
"phrases": [],
"synos": [],
"relWords": {
"root": "",
"rels": []
},
"etymology": [],
...val
}
}
export function getDefaultArticleWord(val: Partial<ArticleWord> = {}): ArticleWord {
return getDefaultWord({
nextSpace: true,
isSymbol: false,
symbolPosition: '',
...val
}) as ArticleWord
}
export function getDefaultArticle(val: Partial<Article> = {}): Article {
return {
id: '',
title: '',
titleTranslate: '',
text: '',
textTranslate: '',
newWords: [],
textAllWords: [],
sections: [],
audioSrc: '',
lrcPosition: [],
questions: [],
...val
}
}
export function getDefaultDict(val: Partial<Dict> = {}): Dict {
return {
id: '',
name: '',
description: '',
url: '',
length: 0,
category: '',
tags: [],
translateLanguage: '',
type: DictType.word,
language: 'en',
lastLearnIndex: 0,
perDayStudyNumber: 20,
custom: false,
complete: false,
...val,
words: shallowReactive(val.words ?? []),
articles: shallowReactive(val.articles ?? []),
statistics: shallowReactive(val.statistics ?? [])
}
}

View File

@@ -4,7 +4,6 @@ import jaFlag from "@/assets/img/flags/ja.png";
import deFlag from "@/assets/img/flags/de.png";
import codeFlag from "@/assets/img/flags/code.png";
import myFlag from "@/assets/img/flags/my.png";
import {shallowReactive} from "vue";
export type Word = {
id?: string,
@@ -45,31 +44,11 @@ export type Word = {
}[],
}
export function getDefaultWord(val: Partial<Word> = {}): Word {
return {
custom: false,
"word": "",
"phonetic0": "",
"phonetic1": "",
"trans": [],
"sentences": [],
"phrases": [],
"synos": [],
"relWords": {
"root": "",
"rels": []
},
"etymology": [],
...val
}
}
export const PronunciationApi = 'https://dict.youdao.com/dictvoice?audio='
export type TranslateLanguageType = 'en' | 'zh-CN' | 'ja' | 'de' | 'common' | ''
export type LanguageType = 'en' | 'ja' | 'de' | 'code'
export enum DictType {
collect = 'collect',
simple = 'simple',
@@ -85,15 +64,6 @@ export interface ArticleWord extends Word {
symbolPosition: 'start' | 'end' | '',
}
export function getDefaultArticleWord(val: Partial<ArticleWord> = {}): ArticleWord {
return getDefaultWord({
nextSpace: true,
isSymbol: false,
symbolPosition: '',
...val
}) as ArticleWord
}
export interface Sentence {
text: string,
translate: string,
@@ -120,23 +90,6 @@ export interface Article {
}[]
}
export function getDefaultArticle(val: Partial<Article> = {}): Article {
return {
id: '',
title: '',
titleTranslate: '',
text: '',
textTranslate: '',
newWords: [],
textAllWords: [],
sections: [],
audioSrc: '',
lrcPosition: [],
questions: [],
...val
}
}
export interface Statistics {
startDate: number,//开始日期
spend: number,//花费时间
@@ -151,17 +104,6 @@ export interface DisplayStatistics extends Statistics {
inputWordNumber: number//输入数
}
export const DefaultDisplayStatistics: DisplayStatistics = {
startDate: Date.now(),
spend: -1,
total: -1,
new: 0,
wrong: -1,
review: -1,
inputWordNumber: -1,
wrongWords: [],
}
export enum Sort {
normal = 0,
random = 1,
@@ -249,29 +191,6 @@ export interface Dict extends DictResource {
complete: boolean,//是否学习完成学完了设为true然后lastLearnIndex重置
}
export function getDefaultDict(val: Partial<Dict> = {}): Dict {
return {
id: '',
name: '',
description: '',
url: '',
length: 0,
category: '',
tags: [],
translateLanguage: '',
type: DictType.word,
language: 'en',
lastLearnIndex: 0,
perDayStudyNumber: 20,
custom: false,
complete: false,
...val,
words: shallowReactive(val.words ?? []),
articles: shallowReactive(val.articles ?? []),
statistics: shallowReactive(val.statistics ?? [])
}
}
export interface ArticleItem {
item: Article,
index: number

View File

@@ -1,7 +1,8 @@
import {Dict, DictResource, getDefaultDict} from "@/types/types.ts";
import {Dict, DictResource} from "@/types/types.ts";
import {getDictFile} from "@/utils/index.ts";
import {cloneDeep} from "@/utils";
import {nanoid} from "nanoid";
import {getDefaultDict} from "@/types/func.ts";
export async function getArticleBookDataByUrl(val: DictResource) {
let dictResourceUrl = `./dicts/${val.language}/${val.type}/${val.translateLanguage}/${val.url}`;

View File

@@ -1,7 +1,7 @@
import {SAVE_DICT_KEY, SAVE_SETTING_KEY} from "@/utils/const.ts";
import {BaseState, DefaultBaseState} from "@/stores/base.ts";
import {getDefaultSettingState} from "@/stores/setting.ts";
import {Dict, DictResource, DictType, getDefaultArticle, getDefaultDict, getDefaultWord} from "@/types/types.ts";
import {Dict, DictResource, DictType} from "@/types/types.ts";
import {useRouter} from "vue-router";
import {useRuntimeStore} from "@/stores/runtime.ts";
import {nanoid} from "nanoid";
@@ -11,6 +11,7 @@ import {env} from "@/config/ENV.ts";
import {nextTick} from "vue";
import {dictionaryResources, enArticle} from "@/assets/dictionary.ts";
import {ElMessage} from "element-plus";
import {getDefaultArticle, getDefaultDict, getDefaultWord} from "@/types/func.ts";
export function no() {
ElMessage.warning('未现实')