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 }}
-
+
{{ subItem.title }}
-
+
{{ threeItem.title }}
@@ -35,12 +35,12 @@
{{ fourItem.title }}
- {{ threeItem.title }}
- {{ subItem.title }}
+ {{ subItem.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 @@