From 589c28acab1343a6fd144ae4d1c31b26c69de320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A7=8B=E4=BA=8E=E5=88=9D=E8=A7=81?= <752204717@qq.com> Date: Thu, 21 May 2026 17:42:08 +0800 Subject: [PATCH] tijiao --- src/api/index.js | 4 +- src/components/common/langs/en.js | 74 +- src/components/common/langs/zh.js | 74 +- src/components/page/articleDetailEditor.vue | 45 +- src/components/page/articleDetailEmail.vue | 123 +- .../page/components/email/MailDetail.vue | 281 ++- src/components/page/editPublicRefRdit.vue | 2061 ++++++++++++++++- src/components/page/mailboxCollect.vue | 25 +- src/components/page/publishRefernceEditor.vue | 24 +- src/utils/emailHtmlView.js | 675 +++++- 10 files changed, 3272 insertions(+), 114 deletions(-) diff --git a/src/api/index.js b/src/api/index.js index 525753d..487fb66 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -19,8 +19,8 @@ const service = axios.create({ // baseURL: 'https://submission.tmrjournals.com/', //正式 记得切换 // baseURL: 'http://www.tougao.com/', //测试本地 记得切换 // baseURL: 'http://192.168.110.110/tougao/public/index.php/', - // baseURL: '/api', //本地 - baseURL: '/', //正式 + baseURL: '/api', //本地 + // baseURL: '/', //正式 }); diff --git a/src/components/common/langs/en.js b/src/components/common/langs/en.js index 8b91dc4..ac3f47c 100644 --- a/src/components/common/langs/en.js +++ b/src/components/common/langs/en.js @@ -874,6 +874,30 @@ const en = { taskStoppedMsg: 'Crawl has been paused.', runOnceQueued: 'A one-off crawl has been queued.', }, + articleDetailEmail: { + pageTitle: 'Manuscript email detail', + sender: 'Sender :', + content: 'Content :', + attachment: 'Attachment :', + uploadTip: 'Only word file can be uploaded(.docx)', + clickUpload: 'Click Upload', + sendMail: 'Send mail', + templateSelection: 'Template selection', + letterLang: 'Email language', + langZh: '中文', + langEn: 'English', + greeting: 'Dear Dr. {name},', + signOff: 'Yours Sincerely', + officeLine: '{journal} | Editorial Office | New Zealand', + telephone: 'Telephone: +64 02108293806', + emailLine: 'Email: {email}', + subscribeLine: 'Subscribe to receive Latest Research and News from {journal}', + contentRequired: 'Please enter the message content!', + sendSuccess: 'Sent successfully!', + uploadError: 'upload error', + serviceError: 'service error: {msg}', + uploadLimit: 'The maximum number of uploaded files has been exceeded!' + }, mailboxSend: { title: 'Write mail', to: 'To:', @@ -1502,7 +1526,55 @@ const en = { previewWithVariablesHint: 'The expert data is an example, used for variable spelling check only.', close: 'Close', placeholder: 'Please enter email content' - } + }, + refRelevance: { + filterAll: 'All ({count})', + filterModify: 'Needs revision ({count})', + columnTitle: 'AI citation relevance review', + uncitedTag: 'Not cited in text', + uncitedDesc: 'This reference appears in the list but no matching in-text citation was found.', + uncitedTip: 'Remove it from the reference list or add an in-text citation in the manuscript.', + citationN: 'Cite {n}', + relevancePct: 'Relevance {score}%', + relevancePctShort: '{score}%', + viewAiAnalysis: 'View AI analysis →', + viewAiAnalysisShort: 'AI →', + dialogTitle: 'Citation relevance details', + prevRef: 'Previous reference', + nextRef: 'Next reference', + manuscript: 'Manuscript', + excerpt: '(excerpt)', + citeListTitle: 'This reference · all in-text citations', + citeListTotal: '{n} citation(s)', + current: 'Current', + close: 'Close', + emptyModify: 'No references need revision', + locatorMark: 'Highlighted in-text marker {mark}', + locatorMarkRef: 'Highlighted marker {mark} (reference [{ref}])', + locatorMarkOnly: 'Highlighted citation marker {mark}', + summaryModify: '{total} cite(s) · {modify} revise', + summaryOk: '{total} cite(s) · OK', + insightTitle: 'Context review', + insightTitleRef: 'Context review [{ref}]', + recommendAction: 'Editorial note', + recommendRevise: 'Suggested revision', + recommendKeep: 'Keep as is', + recommendTextRevise: '{brief} Review the passage at left before revising or removing this citation.', + recommendTextReviseDefault: 'Review the passage at left before revising or removing this citation.', + recommendTextKeep: 'This citation strongly supports the argument; no change recommended.', + revisionLabel: 'Revision', + citeTag: 'Citation {idx}', + citeTagTotal: 'Citation {idx}/{total}', + briefSuggestRevise: 'Revise', + briefOk: 'OK', + briefAppropriate: 'OK', + briefKeep: 'Keep', + briefTrim: 'Revise', + briefWeakEvidence: 'Peripheral', + briefNeedDiff: 'Clarify', + briefDelete: 'Drop', + briefYearMismatch: 'Year?' + } diff --git a/src/components/common/langs/zh.js b/src/components/common/langs/zh.js index 181d2a4..3668b75 100644 --- a/src/components/common/langs/zh.js +++ b/src/components/common/langs/zh.js @@ -619,6 +619,30 @@ const zh = { saveFail: '保存失败', saveSuccessMock: '模板已保存(模拟)', }, + articleDetailEmail: { + pageTitle: '稿件邮件详情', + sender: '发件人:', + content: '正文:', + attachment: '附件:', + uploadTip: '仅支持上传 Word 文件(.docx)', + clickUpload: '点击上传', + sendMail: '发送邮件', + templateSelection: '模板选择', + letterLang: '邮件语言', + langZh: '中文', + langEn: 'English', + greeting: '尊敬的 Dr. {name}:', + signOff: '此致敬礼', + officeLine: '{journal} | 编辑部 | 新西兰', + telephone: '电话:+64 02108293806', + emailLine: '邮箱:{email}', + subscribeLine: '订阅 {journal} 最新研究与资讯', + contentRequired: '请输入邮件正文内容!', + sendSuccess: '发送成功!', + uploadError: '上传失败', + serviceError: '服务错误:{msg}', + uploadLimit: '已超过可上传文件数量上限!' + }, mailboxCollect: { inboxTab: '收件箱', outboxTab: '发件箱', @@ -1483,7 +1507,55 @@ const zh = { previewWithVariablesHint: '专家数据仅为示例,仅用于变量拼写检查。', close: '关闭', placeholder: '请输入邮件内容' - } + }, + refRelevance: { + filterAll: '全部({count})', + filterModify: '需修改({count})', + columnTitle: 'AI 智能评定相关性建议', + uncitedTag: '正文未引用', + uncitedDesc: '该文献已列入参考文献列表,但正文中未找到对应的引用上标。', + uncitedTip: '建议:从参考文献列表中删除,或在正文中补充引用。', + citationN: '第{n}处', + relevancePct: '相关性 {score}%', + relevancePctShort: '{score}%', + viewAiAnalysis: '查看 AI 分析 →', + viewAiAnalysisShort: 'AI分析→', + dialogTitle: '相关性检测详情', + prevRef: '上一篇参考文献', + nextRef: '下一篇参考文献', + manuscript: '稿件', + excerpt: '(摘录)', + citeListTitle: '本参考文献 · 全部引用处', + citeListTotal: '共 {n} 处', + current: '当前', + close: '关闭', + emptyModify: '暂无需要修改的参考文献', + locatorMark: '高亮段落中的引用标记 {mark}', + locatorMarkRef: '高亮标记 {mark}(对应参考文献 [{ref}])', + locatorMarkOnly: '高亮引用标记 {mark}', + summaryModify: '{total}处引用·{modify}处待改', + summaryOk: '{total}处引用·均可保留', + insightTitle: '语境深度批核', + insightTitleRef: '语境深度批核 「[{ref}]」', + recommendAction: '操作建议', + recommendRevise: '建议修订引用', + recommendKeep: '建议完美保留', + recommendTextRevise: '{brief}。请根据左侧正文核对后决定是否删改或改写该处引用。', + recommendTextReviseDefault: '请根据左侧正文核对后决定是否删改或改写该处引用。', + recommendTextKeep: '与段落论述高度一致,有力支撑核心论点,建议不作修改保留该引用。', + revisionLabel: '修订建议', + citeTag: '引用 {idx}', + citeTagTotal: '引用 {idx}/{total}', + briefSuggestRevise: '待改', + briefOk: '恰当', + briefAppropriate: '恰当', + briefKeep: '保留', + briefTrim: '宜改写', + briefWeakEvidence: '非主依据', + briefNeedDiff: '需说明差异', + briefDelete: '删除', + briefYearMismatch: '年份不符' + } } diff --git a/src/components/page/articleDetailEditor.vue b/src/components/page/articleDetailEditor.vue index 3d8e29b..74c9738 100644 --- a/src/components/page/articleDetailEditor.vue +++ b/src/components/page/articleDetailEditor.vue @@ -999,6 +999,10 @@ {{ formatPlagiarismDate(row) }} + {{ formatPlagiarismStateLabel(row) }} @@ -1012,7 +1016,11 @@ {{ $t('articleListEditor.plagiarismPreviewPdf') }} - {{ $t('articleListEditor.plagiarismNoPdfLink') }} + {{ $t('articleListEditor.plagiarismNoPdfLink') }} @@ -2973,6 +2981,15 @@ export default { closeResubmit() { (this.resubmitVisible = false), this.$refs['resubmitJournal'].resetFields(); }, + /** 查重列表静默轮询间隔(毫秒) */ + getPlagiarismPollIntervalMs() { + return 60 * 1000; + }, + /** 无「进行中」记录时视为已结束,停止轮询(state 1=进行中,2/3=完成,4/5=失败) */ + shouldStopPlagiarismPolling(list) { + if (!Array.isArray(list) || !list.length) return false; + return !list.some((row) => Number(row && row.state) === 1); + }, startPlagiarismPolling(resetList) { this.stopPlagiarismPolling(); if (resetList !== false) { @@ -2982,7 +2999,7 @@ export default { this.fetchPlagiarismList(false); this.plagiarismPollTimer = setInterval(() => { this.fetchPlagiarismList(false); - }, 3 * 60 * 1000); + }, this.getPlagiarismPollIntervalMs()); }, stopPlagiarismPolling() { if (this.plagiarismPollTimer) { @@ -2998,10 +3015,11 @@ export default { } this.plagiarismSubmitLoading = true; try { - const res = await this.$api.post('api/Plagiarism/submit', { article_id: articleId }); + const res = await this.$api.post('api/Plagiarism/submit', { article_id: articleId ,type:'body_only'}); if (res && Number(res.code) === 0) { this.$message.success((res && res.msg) || this.$t('articleListEditor.plagiarismChecking')); await this.fetchPlagiarismList(true); + this.startPlagiarismPolling(false); } else { this.$message.error((res && res.msg) || this.$t('articleListEditor.plagiarismCheckFailed')); } @@ -3026,6 +3044,9 @@ export default { const payload = res.data || {}; const list = Array.isArray(payload.list) ? payload.list : Array.isArray(payload) ? payload : []; this.plagiarismList = list; + if (!manual && this.shouldStopPlagiarismPolling(list)) { + this.stopPlagiarismPolling(); + } } else if (manual) { this.$message.error((res && res.msg) || this.$t('articleListEditor.plagiarismStatusFailed')); } @@ -3058,6 +3079,13 @@ export default { if (s === 4 || s === 5) return 'state-fail'; return ''; }, + /** 上传中 / 比对中等进行中状态显示加载图标 */ + isPlagiarismStateLoading(row) { + if (!row || typeof row !== 'object') return false; + if (Number(row.state) === 1) return true; + const label = String(row.state_label || row.stateLabel || '').trim(); + return /上传中|比对中/i.test(label); + }, getPlagiarismSimilarityScore(row) { if (!row || typeof row !== 'object') return null; const raw = row.similarity_score != null ? row.similarity_score : row.similarity; @@ -3338,13 +3366,24 @@ export default { min-width: 48px; color: #909399; text-align: center; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.plagiarism-state-loading-icon { + flex-shrink: 0; + font-size: 14px; +} .plagiarism-sim-state.state-uploading { color: #e6a23c; } +.plagiarism-sim-state.state-uploading .plagiarism-state-loading-icon { + color: #e6a23c; +} .plagiarism-sim-state.state-done { color: #67c23a; } diff --git a/src/components/page/articleDetailEmail.vue b/src/components/page/articleDetailEmail.vue index 546176b..850d0a7 100644 --- a/src/components/page/articleDetailEmail.vue +++ b/src/components/page/articleDetailEmail.vue @@ -3,7 +3,7 @@
Template selection
+{{ $t('articleDetailEmail.templateSelection') }}