From 375420cf690751f3e61d2342b44500020e884c20 Mon Sep 17 00:00:00 2001 From: zyronon Date: Thu, 12 Oct 2023 01:31:52 +0800 Subject: [PATCH] save --- Note.md | 4 +- src/components/Article/EditArticle.vue | 249 ++++++++---------- .../Article/EditBatchArticleModal.vue | 104 +++++++- .../Article/EditSingleArticleModal.vue | 7 +- src/components/Practice/Practice.vue | 7 +- src/components/Practice/TypeArticle.vue | 4 +- src/components/Toolbar/DictModal.vue | 2 +- src/types.ts | 2 +- 8 files changed, 226 insertions(+), 153 deletions(-) diff --git a/Note.md b/Note.md index 67a9c1cd..6373f4d8 100644 --- a/Note.md +++ b/Note.md @@ -35,4 +35,6 @@ BaseIcon 在选中模式下,应该显示白色 添加文章时,正文输入123报错 -没有内容时,要显示占位符 \ No newline at end of file +没有内容时,要显示占位符 + +A cold welcome 有bug \ No newline at end of file diff --git a/src/components/Article/EditArticle.vue b/src/components/Article/EditArticle.vue index d27890cb..f94ee966 100644 --- a/src/components/Article/EditArticle.vue +++ b/src/components/Article/EditArticle.vue @@ -17,17 +17,24 @@ import {MessageBox} from "@/utils/MessageBox.tsx"; import {getSplitTranslateText} from "@/hooks/article.ts"; import {cloneDeep} from "lodash-es"; import {v4 as uuidv4} from "uuid"; -import {watch} from "vue"; +import {h, watch} from "vue"; import {useBaseStore} from "@/stores/base.ts"; interface IProps { - article?: Article + article?: Article, + type?: 'single' | 'batch' } const props = withDefaults(defineProps(), { article: () => cloneDeep(DefaultArticle), + type: 'single' }) +const emit = defineEmits<{ + save: [val: Article], + saveAndNext: [val: Article] +}>() + let networkTranslateEngine = $ref('baidu') let progress = $ref(0) let failCount = $ref(0) @@ -36,22 +43,21 @@ const TranslateEngineOptions = [ {value: 'youdao', label: '有道'}, ] -const base = useBaseStore() -let article = $ref
(cloneDeep(DefaultArticle)) +let editArticle = $ref
(cloneDeep(DefaultArticle)) watch(() => props.article, val => { - article = cloneDeep(val) - if (article.text.trim()) { - if (article.useTranslateType === TranslateType.custom) { - if (article.textCustomTranslate.trim()) { - if (!article.textCustomTranslateIsFormat) { - let r = getSplitTranslateText(article.textCustomTranslate) + editArticle = cloneDeep(val) + if (editArticle.text.trim()) { + if (editArticle.useTranslateType === TranslateType.custom) { + if (editArticle.textCustomTranslate.trim()) { + if (!editArticle.textCustomTranslateIsFormat) { + let r = getSplitTranslateText(editArticle.textCustomTranslate) if (r) { - article.textCustomTranslate = r + editArticle.textCustomTranslate = r ElMessage({ message: '检测到本地翻译未格式化,已自动格式化', type: 'success', - duration: 5000 + duration: 3000 }) } } @@ -59,29 +65,29 @@ watch(() => props.article, val => { } } renewSections() - console.log('ar', article) + // console.log('ar', article) }, {immediate: true}) function renewSections() { - if (article.text.trim()) { - renewSectionTexts(article) - if (article.useTranslateType === TranslateType.custom) { - failCount = renewSectionTranslates(article, article.textCustomTranslate) + if (editArticle.text.trim()) { + renewSectionTexts(editArticle) + if (editArticle.useTranslateType === TranslateType.custom) { + failCount = renewSectionTranslates(editArticle, editArticle.textCustomTranslate) } - if (article.useTranslateType === TranslateType.network) { - failCount = renewSectionTranslates(article, article.textNetworkTranslate) + if (editArticle.useTranslateType === TranslateType.network) { + failCount = renewSectionTranslates(editArticle, editArticle.textNetworkTranslate) } } else { - article.sections = [] + editArticle.sections = [] } } function appendTranslate(str: string) { - if (article.useTranslateType === TranslateType.custom) { - article.textCustomTranslate += str + if (editArticle.useTranslateType === TranslateType.custom) { + editArticle.textCustomTranslate += str } - if (article.useTranslateType === TranslateType.network) { - article.textNetworkTranslate += str + if (editArticle.useTranslateType === TranslateType.network) { + editArticle.textNetworkTranslate += str } } @@ -118,129 +124,105 @@ function onFocus() { document.addEventListener('paste', onPaste); } -function save(option: 'save' | 'next', mute: boolean = false) { - console.log('article', article) - copy(JSON.stringify(article)) - - if (mute) { - if (article.title.trim() && article.text.trim()) { - return false - } - } - - article.title = article.title.trim() - article.titleTranslate = article.titleTranslate.trim() - article.text = article.text.trim() - article.textCustomTranslate = article.textCustomTranslate.trim() - article.textNetworkTranslate = article.textNetworkTranslate.trim() - - if (!article.title) { - return ElMessage.error('请填写标题!') - } - if (!article.text) { - return ElMessage.error('请填写正文!') - } - - let has = base.currentEditDict.articles.find((item: Article) => item.title === article.title) - if (has && !article.id) { - return ElMessage.error('已存在同名文章!') - } - - const saveTemp = () => { - article.textCustomTranslateIsFormat = true - // emit('close') - // emit('save', cloneDeep(article)) - if (article.id) { - let rIndex = base.currentEditDict.articles.findIndex(v => v.id === article.id) - if (rIndex > -1) { - base.currentEditDict.articles[rIndex] = cloneDeep(article) - } - } else { - let data = {...article, id: uuidv4()} - base.currentEditDict.articles.push(data) - if (option === 'save') { - article = cloneDeep(data) - } - } - if (option === 'next') { - article = cloneDeep(DefaultArticle) - } - //TODO 保存完成后滚动到对应位置 - if (!mute) { - ElMessage.success('保存成功!') - } - } - - if (article.useTranslateType === TranslateType.network) { - if (!article.textNetworkTranslate) { - return MessageBox.confirm( - '您选择了“网络翻译”,但译文内容却为空白,是否修改为“不需要翻译”并保存?', - '提示', - () => { - article.useTranslateType = TranslateType.none - saveTemp() - }, - () => void 0, - ) - } - } - - if (article.useTranslateType === TranslateType.custom) { - if (!article.textCustomTranslate) { - return MessageBox.confirm( - '您选择了“本地翻译”,但译文内容却为空白,是否修改为“不需要翻译”并保存?', - '提示', - () => { - article.useTranslateType = TranslateType.none - saveTemp() - }, - () => void 0, - ) - } - } - - saveTemp() -} - async function startNetworkTranslate() { - if (!article.title.trim()) { + if (!editArticle.title.trim()) { return ElMessage.error('请填写标题!') } - if (!article.text.trim()) { + if (!editArticle.text.trim()) { return ElMessage.error('请填写正文!') } - renewSectionTexts(article) - article.textNetworkTranslate = '' + renewSectionTexts(editArticle) + editArticle.textNetworkTranslate = '' //注意!!! //这里需要用异步,因为watch了article.networkTranslate,改变networkTranslate了之后,会重新设置article.sections //导致getNetworkTranslate里面拿到的article.sections是废弃的值 setTimeout(async () => { - await getNetworkTranslate(article, TranslateEngine.Baidu, true, (v: number) => { + await getNetworkTranslate(editArticle, TranslateEngine.Baidu, true, (v: number) => { progress = v }) - copy(JSON.stringify(article.sections)) + copy(JSON.stringify(editArticle.sections)) }) } function saveSentenceTranslate(sentence: Sentence, val: string) { sentence.translate = val - if (article.useTranslateType === TranslateType.custom) { - article.textCustomTranslate = getSentenceAllTranslateText(article) + if (editArticle.useTranslateType === TranslateType.custom) { + editArticle.textCustomTranslate = getSentenceAllTranslateText(editArticle) } - if (article.useTranslateType === TranslateType.network) { - article.textNetworkTranslate = getSentenceAllTranslateText(article) + if (editArticle.useTranslateType === TranslateType.network) { + editArticle.textNetworkTranslate = getSentenceAllTranslateText(editArticle) } renewSections() } function saveSentenceText(sentence: Sentence, val: string) { sentence.text = val - article.text = getSentenceAllText(article) + editArticle.text = getSentenceAllText(editArticle) renewSections() } -defineExpose({save}) +function save(option: 'save' | 'saveAndNext') { + return new Promise((resolve: Function) => { + // console.log('article', article) + // copy(JSON.stringify(article)) + + editArticle.title = editArticle.title.trim() + editArticle.titleTranslate = editArticle.titleTranslate.trim() + editArticle.text = editArticle.text.trim() + editArticle.textCustomTranslate = editArticle.textCustomTranslate.trim() + editArticle.textNetworkTranslate = editArticle.textNetworkTranslate.trim() + + if (!editArticle.title) { + ElMessage.error('请填写标题!') + return resolve(false) + } + if (!editArticle.text) { + ElMessage.error('请填写正文!') + return resolve(false) + } + + const saveTemp = () => { + editArticle.textCustomTranslateIsFormat = true + emit(option as any, editArticle) + + return resolve(true) + } + + if (editArticle.useTranslateType === TranslateType.network) { + if (!editArticle.textNetworkTranslate) { + return MessageBox.confirm( + '您选择了“网络翻译”,但译文内容却为空白,是否修改为“不需要翻译”并保存?', + '提示', + () => { + editArticle.useTranslateType = TranslateType.none + saveTemp() + }, + () => void 0, + ) + } + } + + if (editArticle.useTranslateType === TranslateType.custom) { + if (!editArticle.textCustomTranslate) { + return MessageBox.confirm( + '您选择了“本地翻译”,但译文内容却为空白,是否修改为“不需要翻译”并保存?', + '提示', + () => { + editArticle.useTranslateType = TranslateType.none + saveTemp() + }, + () => void 0, + ) + } + } + + saveTemp() + }) +} + +//不知道直接用editArticle,取到是空的默认值 +defineExpose({save, getEditArticle: () => cloneDeep(editArticle)})