From 12760aaf44cbed813ef7a8d4bdfc88ef0177d339 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: Mon, 23 Mar 2026 09:28:56 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8C=96=E6=8E=A8=E5=B9=BF?= =?UTF-8?q?=E3=80=90=E7=BA=A6=E7=A8=BF=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/Sidebar.vue | 20 +- src/components/common/Tags.vue | 22 +- src/components/common/langs/en.js | 140 ++- src/components/common/langs/zh.js | 140 ++- .../JournalManagement/common.vue | 29 + src/components/page/autoPromotion.vue | 457 +++++++++ src/components/page/autoPromotionLogs.vue | 892 ++++++++++++++++++ .../autoPromotion/AutoPromotionWizard.vue | 133 +++ .../AutoPromotionWizardContent.vue | 410 ++++++++ .../autoPromotion/JournalDetailDialog.vue | 68 ++ .../page/components/email/MailDetail.vue | 33 +- .../email/TemplateSelectorDialog.vue | 758 ++++++++++----- src/components/page/expertDatabase.vue | 31 +- src/components/page/mailboxCollect.vue | 124 ++- src/components/page/mailboxConfig.vue | 118 ++- src/components/page/mailboxMould.vue | 52 +- src/components/page/mailboxMouldDetail.vue | 133 ++- src/components/page/mailboxSend.vue | 392 ++++++-- src/components/page/mailboxStyle.vue | 1 + src/components/page/mailboxStyleDetail.vue | 74 +- src/router/index.js | 14 + 21 files changed, 3482 insertions(+), 559 deletions(-) create mode 100644 src/components/page/autoPromotion.vue create mode 100644 src/components/page/autoPromotionLogs.vue create mode 100644 src/components/page/components/autoPromotion/AutoPromotionWizard.vue create mode 100644 src/components/page/components/autoPromotion/AutoPromotionWizardContent.vue create mode 100644 src/components/page/components/autoPromotion/JournalDetailDialog.vue diff --git a/src/components/common/Sidebar.vue b/src/components/common/Sidebar.vue index fbb2ab1..901975e 100644 --- a/src/components/common/Sidebar.vue +++ b/src/components/common/Sidebar.vue @@ -18,14 +18,14 @@ {{ item.title }} @@ -160,6 +160,7 @@ {{ $t('sidebar.expertDatabase') }} + {{ $t('sidebar.mailboxManagement') }} @@ -169,6 +170,9 @@ {{ $t('sidebar.emailTemplates') }} + + {{ $t('sidebar.autoPromotion') }} + @@ -899,10 +903,10 @@ export default { border-right: 0; } -.el-menu-item:hover { - /* color: #006699 !important; - background-color: #e3e9ef !important; */ -} +/* .el-menu-item:hover { + color: #006699 !important; + background-color: #e3e9ef !important; +} */ .el-submenu__title i { color: #fff !important; diff --git a/src/components/common/Tags.vue b/src/components/common/Tags.vue index 1ab666d..66e3cf2 100644 --- a/src/components/common/Tags.vue +++ b/src/components/common/Tags.vue @@ -111,7 +111,27 @@ break; } } - }) + }); + + // 按路径关闭指定标签(用于主动销毁 keep-alive 页面) + bus.$on('close_tag_by_path', (payload) => { + const targetPath = payload && payload.path ? payload.path : ''; + const fallbackPath = payload && payload.fallback ? payload.fallback : '/'; + const silent = payload && payload.silent === true; + if (!targetPath) return; + for (let i = 0, len = this.tagsList.length; i < len; i++) { + const item = this.tagsList[i]; + if (item.path === targetPath) { + this.tagsList.splice(i, 1); + // 如果关闭的是当前激活标签,则跳到指定兜底路由 + if (!silent && this.$route.fullPath === targetPath) { + this.$router.push(fallbackPath); + } + break; + } + } + bus.$emit('tags', this.tagsList); + }); }, // beforeDestroy() { // // 销毁监听,防止内存泄漏 diff --git a/src/components/common/langs/en.js b/src/components/common/langs/en.js index c4089e0..442418b 100644 --- a/src/components/common/langs/en.js +++ b/src/components/common/langs/en.js @@ -129,7 +129,9 @@ const en = { doubleConfirmContent: 'Are you sure you want to authorize this rate change? This adjustment will immediately synchronize with the billing system and impact all future financial settlements.', // 3. 反馈 - updateSuccess: 'The journal APC standard has been successfully updated.' + updateSuccess: 'The journal APC standard has been successfully updated.', + executiveEditor:'Executive Editor', + databases:'Database inclusion', }, @@ -272,8 +274,10 @@ const en = { emailStyles: 'Email Styles', tools: 'Assistant tools', mailboxManagement: 'Mailbox Management', + mailboxConfig: 'Mailbox Management', scholarCrawlers: 'Scholar Crawlers', expertDatabase: 'Expert Database', + autoPromotion: 'Auto Promotion', ReArticles: 'Rejected Manuscripts', // 被拒稿件 editorialBoard: 'Boss System', editorialBoard1: 'Board Management', @@ -287,15 +291,40 @@ const en = { mailboxCollect: 'Email List', promotionManagement: 'Promotion Management', }, + expertDatabase: { + fieldSelectPlaceholder: 'Please select field', + keywordPlaceholder: 'Name / Email / Affiliation', + searchBtn: 'Search', + resetBtn: 'Reset', + downloadExcelBtn: 'Download Excel', + table: { + no: 'No.' + }, + columns: { + baseInfo: 'Base Information', + affiliation: 'Affiliation', + researchAreas: 'Research areas' + }, + fields: { + nameLabel: 'Name:', + emailLabel: 'Email:', + acquisitionTimeLabel: 'Acquisition Time:' + }, + exportWarn: 'Please select a research area or enter a keyword before exporting.', + exportFailed: 'Export failed' + }, mailboxConfig: { mailSystem: 'Mailbox system', title: 'Mailbox config', journal: 'Journal', allJournal: 'All journals', query: 'Search', + refresh: 'Refresh', addAccount: 'Add email account', noData: 'No data', - smtpFromName: 'Sender name', + no: 'No.', + loading: 'Loading...', + smtpFromName: 'Name', smtpFromNamePlaceholder: 'Display name when sending', smtpHost: 'SMTP host', smtpPort: 'SMTP port', @@ -313,7 +342,7 @@ const en = { operation: 'Operation', edit: 'Edit', delete: 'Delete', - mailManage: 'Mail manage', + mailManage: 'Email List', dialogAdd: 'Add email account', dialogEdit: 'Edit email account', selectJournal: 'Select journal', @@ -331,6 +360,7 @@ const en = { cancel: 'Cancel', save: 'Save', deleteConfirm: 'Delete this email config?', + deleteTitle: 'Delete email account', confirm: 'Confirm', addSuccess: 'Added successfully', editSuccess: 'Updated successfully', @@ -356,6 +386,7 @@ const en = { mailboxMould: { title: 'Email Templates', subtitle: 'Manage and customize your journal email templates.', + no: 'No.', searchPlaceholder: 'Search by title or scene...', journalPlaceholder: 'Journal', scenePlaceholder: 'Scene', @@ -366,8 +397,8 @@ const en = { languagePlaceholder: 'Language', searchBtn: 'Search', createTemplate: 'Create Template', - colTitle: 'Subject', - colSubject: 'Mail title', +colTitle: 'Template title', + colSubject: 'Email subject', colScene: 'Scene', colLanguage: 'Language', colVersion: 'Version', @@ -386,6 +417,7 @@ const en = { mailboxStyle: { title: 'Email Styles', subtitle: 'Manage email header and footer styles.', + no: 'No.', searchPlaceholder: 'Search by name or description...', journalPlaceholder: 'Journal', scenePlaceholder: 'Scene', @@ -472,6 +504,7 @@ const en = { time: 'Time', look: 'Look', emptyText: 'New messages (0)', + loading: 'Loading...', detailTitle: 'Mail detail', from: 'From', to: 'To', @@ -489,12 +522,14 @@ const en = { nameColumn: 'Name', switchColumn: 'Switch', useBtn: 'Switch', + currentAccountText: 'Current account', changeAccountBtn: 'Change account', syncSuccess: 'Sync succeeded', syncFail: 'Sync failed', operation: 'Operation', loadingMore: 'Loading more...', noMore: 'No more', + yesterday: 'Yesterday', selectAccountTip: 'Please select an email account first.' }, mailboxSend: { @@ -508,6 +543,7 @@ const en = { templateSelection: 'Template selection', sender: 'Sender:', send: 'Send', + sending: 'Sending...', selectUser: 'Select User', batchSelection: 'Batch selection', email: 'Email', @@ -534,7 +570,10 @@ const en = { sendFail: 'Send failed', sendMock: 'Send (mock): will really send when api/Mail/sendMail is ready', needAccount: 'Please select a sender account from the mailbox list first', - backToInbox: 'Back to inbox', + selectTemplateStyleFirst: 'Please select template and style first', + recipientLimit: 'You can add up to {count} recipient(s)', + recipientLimitPlaceholder: 'Limit reached (max {count})', + backToInbox: 'Back to email list', }, home: { authortop: 'Author guide', @@ -821,8 +860,93 @@ const en = { "imgLabel": "Img" }, mailTemplate: { - noTemplateTip: 'No templates are available for the current journal. Please select another journal or contact the administrator to configure templates.' - } + noTemplateTip: 'No templates are available for the current journal. Please select another journal or go add templates first.', + addTemplateBtn: 'Go add templates', + templateTab: 'Template', + styleTab: 'Style', + loading: 'Loading...', + refresh: 'Refresh' + }, + autoPromotion: { + title: 'Auto Promotion', + journal: 'Journal', + logs: 'Promotion History', + saved: 'Saved', + loading: 'Loading...', + refresh: 'Refresh', + autoSolicit: 'Auto Solicitation', + editConfig: 'Edit Configuration', + running: 'Running', + emailTemplate: 'Email Template', + emailStyle: 'Email Style', + notStarted: 'Auto solicitation plan is not enabled', + notInitializedTip: 'Auto solicitation is not enabled. Please configure template and style first, then enable the plan.', + journalManage: 'Journal Management', + loadListFailed: 'Failed to load journal list', + goConfig: 'Configure', + goManagePlan: 'Manage Plan', + startPlan: 'Start Plan', + startedPlan: 'plan enabled', + updateRetryFailed: 'Update failed, please try again later', + selectTemplateStyleFirst: 'Please select template and style before confirming', + configSaved: 'Configuration saved', + saveFailed: 'Save failed', + notInitializedSwitchTip: 'Auto solicitation is not initialized. Please configure templates first', + planEnabled: 'Plan enabled', + planDisabled: 'Plan disabled', + updateFailed: 'Update failed', + cancel: 'Cancel', + saveAndApply: 'Save and apply configuration', + selectTemplateStyleTitle: 'Choose journal template and style', + clickToChooseTemplate: 'Click to choose journal email template', + noPreview: 'No Preview', + templateName: 'Template Name', + styleName: 'Style Name', + defaultStyle: 'Default', + changeTemplate: 'Change Template', + confirmAndEnable: 'Confirm and Enable', + onlySaveConfig: 'Save configuration only', + enableNowNextDay: 'Enable auto promotion now (starts next day)' + } + , + autoPromotionLogs: { + detail: 'Auto Promotion Details', + configured: 'Configured', + editConfig: 'Edit auto promotion configuration', + startConfig: 'Start auto promotion configuration', + notConfigured: 'Not configured', + searchPlaceholder: 'Name / Email', + searchBtn: 'Search', + index: 'No.', + expertInfo: 'Expert Info', + templateStyle: 'Template / Style', + stylePrefix: 'Style', + runAt: 'Execution time', + status: 'Status', + paused: 'Paused', + toRun: 'To run', + operation: 'Operation', + preview: 'Preview', + enable: 'Enable', + pause: 'Pause', + previewEditTitle: 'Preview and edit promotion email', + receiver: 'Receiver:', + receiverImmutablePlaceholder: 'Receiver email cannot be changed', + subject: 'Subject:', + subjectPlaceholder: 'Please enter mail subject', + runAtPlaceholder: 'Please select execution time', + cancel: 'Cancel', + confirmEdit: 'Confirm Edit', + mailContentSaved: 'Mail content has been saved. It will be sent with this content.', + templateNotSelected: 'No template selected', + selectTemplateWarning: 'Please select a template before confirming', + configUpdated: 'Configuration updated', + pauseSuccess: 'Paused', + enableSuccess: 'Enabled', + deletedSuccess: 'Deleted', + mockPromotionSubject: 'Promotion for {journal}', + mockPromotionContent: '

Dear {name},

Check out our latest journal updates...

' + } diff --git a/src/components/common/langs/zh.js b/src/components/common/langs/zh.js index 61506b9..443120e 100644 --- a/src/components/common/langs/zh.js +++ b/src/components/common/langs/zh.js @@ -122,7 +122,10 @@ const zh = { cancel: '取消', doubleConfirmTitle: '最终操作确认', doubleConfirmContent: '确定要授权此项金额变更吗?此操作具有法律效力上的即时性,将直接影响后续所有财务结算流程。', - updateSuccess: '期刊计费标准已成功更新。' + updateSuccess: '期刊计费标准已成功更新。', + executiveEditor:'责任编辑', + databases:'收录数据库', + }, paperArticleCount: { Periodroll: '期卷', @@ -262,6 +265,7 @@ const zh = { scholarCrawlers: '学者数据库', expertDatabase: '专家库', + autoPromotion: '自动推广', ReArticles: '被拒稿件', // 被拒稿件 editorialBoard: '编委管理', editorialBoard1: '编委列表', @@ -276,15 +280,40 @@ const zh = { promotionManagement: '推广管理', }, + expertDatabase: { + fieldSelectPlaceholder: '请选择研究领域', + keywordPlaceholder: '姓名 / 邮箱 / 单位', + searchBtn: '搜索', + resetBtn: '重置', + downloadExcelBtn: '下载 Excel', + table: { + no: '序号' + }, + columns: { + baseInfo: '基础信息', + affiliation: '单位', + researchAreas: '研究领域' + }, + fields: { + nameLabel: '姓名:', + emailLabel: '邮箱:', + acquisitionTimeLabel: '采集时间:' + }, + exportWarn: '请选择研究领域或输入关键词后再导出。', + exportFailed: '导出失败' + }, mailboxConfig: { mailSystem: '邮件系统', - title: '邮箱配置管理', + title: '邮箱账号管理', journal: '所属期刊', allJournal: '全部期刊', query: '搜索', + refresh: '刷新', addAccount: '添加邮箱账号', noData: '暂无数据', - smtpFromName: '发件人名称', + no: '序号', + loading: '加载中...', + smtpFromName: '名称', smtpFromNamePlaceholder: '发信时显示的名称', smtpHost: 'SMTP 地址', smtpPort: 'SMTP 端口', @@ -302,7 +331,7 @@ const zh = { operation: '操作', edit: '编辑', delete: '删除', - mailManage: '邮箱管理', + mailManage: '邮件列表', dialogAdd: '添加邮箱账号', dialogEdit: '修改邮箱账号信息', selectJournal: '请选择期刊', @@ -319,7 +348,8 @@ const zh = { primaryTip: '每个期刊有且仅有一个主邮箱,用于默认发信与收信。', cancel: '取消', save: '保存', - deleteConfirm: '确定删除该邮箱配置?', + deleteConfirm: '确定删除该邮箱账号?', + deleteTitle: '删除邮箱账号', confirm: '确定', addSuccess: '添加成功', editSuccess: '修改成功', @@ -345,6 +375,7 @@ const zh = { mailboxMould: { title: '邮件模板', subtitle: '管理并自定义期刊邮件模板。', + no: '序号', searchPlaceholder: '按标题或场景搜索...', journalPlaceholder: '期刊', scenePlaceholder: '场景', @@ -355,8 +386,8 @@ const zh = { languagePlaceholder: '语言', searchBtn: '搜索', createTemplate: '新建模板', - colTitle: '主题', - colSubject: '邮件标题', + colTitle: '模版标题', + colSubject: '邮件主题', colScene: '场景', colLanguage: '语言', colVersion: '版本', @@ -375,6 +406,7 @@ const zh = { mailboxStyle: { title: '邮件风格', subtitle: '管理邮件头部和尾部样式。', + no: '序号', searchPlaceholder: '按名称或描述搜索...', journalPlaceholder: '期刊', scenePlaceholder: '场景', @@ -461,6 +493,7 @@ const zh = { time: '时间', look: '查看', emptyText: '暂无邮件', + loading: '加载中...', detailTitle: '邮件详情', from: '发件人', to: '收件人', @@ -478,12 +511,14 @@ const zh = { nameColumn: '名称', switchColumn: '切换', useBtn: '切换', + currentAccountText: '当前账号', changeAccountBtn: '切换邮箱账号', syncSuccess: '同步成功', syncFail: '同步失败', operation: '操作', loadingMore: '加载更多...', noMore: '没有更多了', + yesterday: '昨天', selectAccountTip: '请先选择一个邮箱账号.', }, mailboxSend: { @@ -497,6 +532,7 @@ const zh = { templateSelection: '模板选择', sender: '发件人:', send: '发送', + sending: '发送中...', selectUser: '选择用户', batchSelection: '批量选择', email: '邮箱', @@ -523,6 +559,9 @@ const zh = { sendFail: '发送失败', sendMock: '发送(模拟):接口 api/Mail/sendMail 就绪后将真实发送', needAccount: '请从邮箱列表选择发件账号后再发送', + selectTemplateStyleFirst: '请先选择模板和风格', + recipientLimit: '最多只能添加 {count} 个收件人', + recipientLimitPlaceholder: '已达上限(最多 {count} 个)', backToInbox: '返回收件箱', }, home: { @@ -806,7 +845,92 @@ const zh = { }, mailTemplate: { // 如果已经有 mailTemplate,就只加这一行 - noTemplateTip: '当前期刊暂无可用模板,请重新选择期刊或联系管理员配置模板。' + noTemplateTip: '当前期刊暂无可用模板,请重新选择期刊或先去新增模板。', + addTemplateBtn: '去新增模板', + templateTab: '模版', + styleTab: '样式', + loading: '加载中...', + refresh: '刷新' + }, + autoPromotion: { + title: '自动推广', + journal: '期刊', + logs: '历史推广记录', + saved: '已保存', + loading: '加载中...', + refresh: '刷新', + autoSolicit: '自动约稿', + editConfig: '修改配置', + running: '运行中', + emailTemplate: '邮件模板', + emailStyle: '邮件风格', + notStarted: '未开启自动约稿计划', + notInitializedTip: '自动约稿未启用,请先完成期刊模版风格配置并开启计划', + journalManage: '期刊管理', + loadListFailed: '期刊列表加载失败', + goConfig: '去配置', + goManagePlan: '去管理约稿计划', + startPlan: '开启约稿计划', + startedPlan: '已开启约稿计划', + updateRetryFailed: '更新失败,请稍后重试', + selectTemplateStyleFirst: '请选择模板和风格后再确认', + configSaved: '约稿配置已保存', + saveFailed: '保存失败', + notInitializedSwitchTip: '自动化约稿没有初始化,请先配置模版', + planEnabled: '已开启约稿计划', + planDisabled: '已关闭约稿计划', + updateFailed: '更新失败', + cancel: '取消', + saveAndApply: '保存并应用配置', + selectTemplateStyleTitle: '选择期刊模版风格', + clickToChooseTemplate: '点击选择期刊邮件模版', + noPreview: '暂无预览', + templateName: '模版名称', + styleName: '风格名称', + defaultStyle: '默认风格', + changeTemplate: '更换模版', + confirmAndEnable: '确认并开启', + onlySaveConfig: '仅保存配置', + enableNowNextDay: '立即激活自动推广(次日开始自动推广)' + } + , + autoPromotionLogs: { + detail: '自动推广详情', + configured: '已配置', + editConfig: '修改期刊自动推广配置', + startConfig: '立即开始期刊自动推广配置', + notConfigured: '尚未配置', + searchPlaceholder: '姓名 / 邮箱', + searchBtn: '搜索', + index: '序号', + expertInfo: '专家信息', + templateStyle: '模板 / 风格', + stylePrefix: '风格', + runAt: '执行时间', + status: '状态', + paused: '已暂停', + toRun: '待执行', + operation: '操作', + preview: '查看预览', + enable: '开启', + pause: '暂停', + previewEditTitle: '预览并修改推广邮件', + receiver: '收件人:', + receiverImmutablePlaceholder: '收件人邮箱不可更改', + subject: '主题:', + subjectPlaceholder: '请输入邮件主题', + runAtPlaceholder: '请选择执行时间', + cancel: '取消', + confirmEdit: '确认修改', + mailContentSaved: '邮件内容已保存,将按此内容执行发送', + templateNotSelected: '未选择模板', + selectTemplateWarning: '请选择一个模板后再确认', + configUpdated: '配置已更新', + pauseSuccess: '已暂停', + enableSuccess: '已开启', + deletedSuccess: '已删除', + mockPromotionSubject: '自动推广:{journal}', + mockPromotionContent: '

亲爱的 {name},

请查看我们最新的期刊更新...

' } diff --git a/src/components/page/JournalManagement/JournalManagement/common.vue b/src/components/page/JournalManagement/JournalManagement/common.vue index cc414e3..0ae93f0 100644 --- a/src/components/page/JournalManagement/JournalManagement/common.vue +++ b/src/components/page/JournalManagement/JournalManagement/common.vue @@ -37,6 +37,10 @@ {{ $t('JournalCitationAnalysis.editorinchief') }} :{{ scope.row.editorinchief }} +
+ {{ $t('JournalCitationAnalysis.executiveEditor') }} :{{ scope.row.editor_name }} +
{{ $t('JournalCitationAnalysis.email') }} :{{ scope.row.email }}
@@ -46,6 +50,9 @@
{{ $t('JournalCitationAnalysis.level') }} :{{ scope.row.level }}
+
+ {{ $t('JournalCitationAnalysis.databases') }} :{{ scope.row.databases }} +
{{ $t('JournalCitationAnalysis.journal_topic') }} : + + + + + +
@@ -470,6 +483,20 @@ export default { trigger: 'blur' } ], + editor_name: [ + { + required: true, + message: 'Please input journal executive editor', + trigger: 'blur' + } + ], + databases: [ + { + required: true, + message: 'Please input database inclusion', + trigger: 'blur' + } + ], kfen: [ { required: true, @@ -666,6 +693,7 @@ export default { handleEdit() { this.$refs.detail_form.validate((valid) => { if (valid) { + if (this.detailForm.editor_qrcode == '' || !this.detailForm.editor_qrcode) { this.$message.error('Please upload WeChat Code!'); return false; @@ -861,6 +889,7 @@ export default { publish_author: data.publish_author, wechat_name: data.wechat_name, wechat_app_id: data.wechat_app_id, + editor_name: data.editor_name, wechat_app_secret: data.wechat_app_secret, areas: data.journal_topic ? data.journal_topic.split(',') : [''] }; diff --git a/src/components/page/autoPromotion.vue b/src/components/page/autoPromotion.vue new file mode 100644 index 0000000..90139a5 --- /dev/null +++ b/src/components/page/autoPromotion.vue @@ -0,0 +1,457 @@ + + + + + \ No newline at end of file diff --git a/src/components/page/autoPromotionLogs.vue b/src/components/page/autoPromotionLogs.vue new file mode 100644 index 0000000..0e9a29e --- /dev/null +++ b/src/components/page/autoPromotionLogs.vue @@ -0,0 +1,892 @@ + + + + + \ No newline at end of file diff --git a/src/components/page/components/autoPromotion/AutoPromotionWizard.vue b/src/components/page/components/autoPromotion/AutoPromotionWizard.vue new file mode 100644 index 0000000..8f14345 --- /dev/null +++ b/src/components/page/components/autoPromotion/AutoPromotionWizard.vue @@ -0,0 +1,133 @@ + + + + + + diff --git a/src/components/page/components/autoPromotion/AutoPromotionWizardContent.vue b/src/components/page/components/autoPromotion/AutoPromotionWizardContent.vue new file mode 100644 index 0000000..f26197f --- /dev/null +++ b/src/components/page/components/autoPromotion/AutoPromotionWizardContent.vue @@ -0,0 +1,410 @@ + + + + + + diff --git a/src/components/page/components/autoPromotion/JournalDetailDialog.vue b/src/components/page/components/autoPromotion/JournalDetailDialog.vue new file mode 100644 index 0000000..332edc4 --- /dev/null +++ b/src/components/page/components/autoPromotion/JournalDetailDialog.vue @@ -0,0 +1,68 @@ + + + \ No newline at end of file diff --git a/src/components/page/components/email/MailDetail.vue b/src/components/page/components/email/MailDetail.vue index 79b013d..ba8f605 100644 --- a/src/components/page/components/email/MailDetail.vue +++ b/src/components/page/components/email/MailDetail.vue @@ -2,10 +2,7 @@
- +

{{ $t('mailboxCollect.subject') }}:{{ mailData.subject }}

@@ -14,8 +11,6 @@
-

{{ mailData.subject }}

-
{{ (mailData.from_name || 'U')[0] }}
@@ -112,9 +107,8 @@ // 提取日期信息用于比较 const dateYear = date.getFullYear(); - const dateMonth = date.getMonth() + 1; - const dateDay = date.getDate(); const nowYear = now.getFullYear(); + const lang = localStorage.getItem('langs') === 'zh' ? 'zh-CN' : 'en-US'; // 获取昨天日期 const yesterday = new Date(now); @@ -134,15 +128,17 @@ // 2. 如果是昨天:只显示 "昨天" if (date.toDateString() === yesterday.toDateString()) { - return '昨天'; + return this.$t('mailboxCollect.yesterday'); } - // 3. 如果是今年(非今天/昨天):显示 "月-日",如 "3月8日" + // 3. 如果是今年(非今天/昨天):按语言显示月日 if (dateYear === nowYear) { - return `${dateMonth}月${dateDay}日`; + return new Intl.DateTimeFormat(lang, { month: 'short', day: 'numeric' }).format(date); } // 4. 如果是往年:显示完整年月日,如 "2025-12-05" + const dateMonth = date.getMonth() + 1; + const dateDay = date.getDate(); const fullMonth = dateMonth.toString().padStart(2, '0'); const fullDay = dateDay.toString().padStart(2, '0'); return `${dateYear}-${fullMonth}-${fullDay}`; @@ -161,14 +157,21 @@ /* 顶部工具栏 */ .detail-toolbar { padding: 10px 20px; border-bottom: 1px solid #f0f0f0; display: flex; justify-content: space-between; align-items: center; } - .action-icon { font-size: 18px; color: #606266; cursor: pointer; margin-right: 20px; } + .toolbar-left { flex: 1; min-width: 0; } + .mail-subject-top { + margin: 0; + font-size: 18px; + font-weight: bold; + color: #303133; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .action-icon { font-size: 18px; color: #606266; cursor: pointer; } .action-icon:hover { color: #409EFF; } .detail-scroll-content { flex: 1; overflow-y: auto; padding: 20px 40px; } - /* 邮件标题 */ - .mail-subject { font-size: 20px; font-weight: bold; margin-bottom: 25px; color: #303133; } - /* 头部信息 */ .mail-header-info { display: flex; margin-bottom: 30px; } .info-main { flex: 1; margin-left: 15px; } diff --git a/src/components/page/components/email/TemplateSelectorDialog.vue b/src/components/page/components/email/TemplateSelectorDialog.vue index fbe088e..fae3e44 100644 --- a/src/components/page/components/email/TemplateSelectorDialog.vue +++ b/src/components/page/components/email/TemplateSelectorDialog.vue @@ -1,274 +1,534 @@ - - - - \ No newline at end of file + +.dialog-footer { + display: flex; + justify-content: flex-end; + align-items: center; + width: 100%; +} + +/* 加载中/未选择时:按钮禁用且浅蓝色 */ +.apply-btn-disabled-soft.is-disabled { + background-color: #d9ecff !important; + border-color: #d9ecff !important; + color: #8fbef5 !important; +} + diff --git a/src/components/page/expertDatabase.vue b/src/components/page/expertDatabase.vue index 94d38eb..f134573 100644 --- a/src/components/page/expertDatabase.vue +++ b/src/components/page/expertDatabase.vue @@ -3,7 +3,7 @@
- Expert Database + {{ $t('sidebar.expertDatabase') }}
@@ -15,7 +15,7 @@ ref="cascader" @change="handleChange" v-model="major_id" - :placeholder="'Please select field'" + :placeholder="$t('expertDatabase.fieldSelectPlaceholder')" :options="options" :props="getProps()" style="width: 260px" @@ -24,7 +24,7 @@ @@ -32,32 +32,33 @@ - Search + {{ $t('expertDatabase.searchBtn') }} - Reset + {{ $t('expertDatabase.resetBtn') }}
- Download Excel + {{ $t('expertDatabase.downloadExcelBtn') }}
- + + - - + +