This commit is contained in:
2025-11-17 17:00:14 +08:00
parent a4eaf0d5cb
commit ef0e8e83e0
40 changed files with 10582 additions and 3381 deletions

View File

@@ -1886,6 +1886,10 @@
margin: 0 -17px
}
.state-select .el-scrollbar .el-select-dropdown__wrap {
max-height: 400px !important;
}
.el-dropdown-menu--small {
padding: 6px 0
}
@@ -2558,6 +2562,7 @@
max-height: 274px
}
.el-select-dropdown__list {
list-style: none;
padding: 6px 0;
@@ -15836,4 +15841,4 @@
.el-drawer-fade-leave-active {
animation: el-drawer-fade-in 225ms cubic-bezier(0, 0, .2, 1) 0s reverse
}
}

BIN
src/assets/img/error.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -73,10 +73,15 @@ export default {
getJournalTypeName(value) {
var list = JSON.parse(localStorage.getItem('journalTypeDataAll'));
const type = list.find(item => item.value === value);
if(list&&list.length>0){
const type = list.find(item => item.value === value);
return type ? type.name : 'OTHERS';
}else{
return ''
}
},
@@ -1197,9 +1202,8 @@ export default {
// 遍历行
table.forEach((row) => {
tableHtml += `<tr>`;
// 遍历单元格
row.forEach((cell) => {
if(row&&row.length>0){
row.forEach((cell) => {
tableHtml += `
<td
colspan="${cell.colspan || 1}"
@@ -1210,6 +1214,11 @@ export default {
</td>
`;
});
}else{
tableHtml+=``
}
// 遍历单元格
tableHtml += `</tr>`;
});
@@ -2100,70 +2109,41 @@ export default {
ed.ui.registry.addButton('myuppercase', {
text: 'A', // 按钮文本
// 全部大写按钮(按钮文本A
ed.ui.registry.addButton('myuppercase', {
text: 'A', // 按钮文本(大写标识)
onAction: function () {
// 获取选中的文本(保留 HTML 格式,确保空格等内容不丢失)
var selectedText = ed.selection.getContent({ format: 'html' });
onAction: function () {
// 在选中的文本周围包裹 <blue> 标签
var selectedText = ed.selection.getContent({ format: 'html' });
// 校验:非空且仅含字母、数字、空格(可根据需求调整正则)
// if (selectedText.trim() && /^[\s\w]+$/.test(selectedText)) {
// 直接将选中的所有内容转为大写(无需正则,整体转换)
var allUppercaseText = selectedText.toUpperCase();
// 替换选中的文本
ed.selection.setContent(allUppercaseText);
// } else {
// vueInstance.$message.error(vueInstance.$t('commonTable.selectWord'));
// }
}
});
// 确保选中的文本是单个单词,包括空格
if (selectedText.trim() && /^[\s\w]+$/.test(selectedText)) {
// 使用正则将选中的文本中的第一个字母大写
var capitalizedText = selectedText.replace(/(^|\s)([a-zA-Z])/g, function (match, p1, p2) {
return p1 + p2.toUpperCase();
});
// 全部小写按钮按钮文本a
ed.ui.registry.addButton('myuppercasea', {
text: 'a', // 按钮文本(小写标识)
onAction: function () {
var selectedText = ed.selection.getContent({ format: 'html' });
// 替换选中的文本,保持空格和其他内容
ed.selection.setContent(capitalizedText);
} else {
vueInstance.$message.error(vueInstance.$t('commonTable.selectWord'));
}
}
});
ed.ui.registry.addButton('myuppercase', {
text: 'A', // 按钮文本
onAction: function () {
// 在选中的文本周围包裹 <blue> 标签
var selectedText = ed.selection.getContent({ format: 'html' });
// 确保选中的文本是单个单词,包括空格
if (selectedText.trim() && /^[\s\w]+$/.test(selectedText)) {
// 使用正则将选中的文本中的第一个字母大写
var capitalizedText = selectedText.replace(/(^|\s)([a-zA-Z])/g, function (match, p1, p2) {
return p1 + p2.toUpperCase();
});
// 替换选中的文本,保持空格和其他内容
ed.selection.setContent(capitalizedText);
} else {
vueInstance.$message.error(vueInstance.$t('commonTable.selectWord'));
}
}
});
ed.ui.registry.addButton('myuppercasea', {
text: 'a', // 按钮文本(小写字母)
onAction: function () {
// 获取选中的文本,保留 HTML 格式
var selectedText = ed.selection.getContent({ format: 'html' });
// 确保选中的文本是单个有效的单词,包括空格
if (selectedText.trim() && /^[\s\w]+$/.test(selectedText)) {
// 使用正则将选中的文本中的第一个字母转换为小写
var lowercasedText = selectedText.replace(/(^|\s)([a-zA-Z])/g, function (match, p1, p2) {
return p1 + p2.toLowerCase();
});
// 替换选中的文本,保持空格和其他内容
ed.selection.setContent(lowercasedText);
} else {
vueInstance.$message.error(vueInstance.$t('commonTable.selectWord'));
}
}
});
// if (selectedText.trim() && /^[\s\w]+$/.test(selectedText)) {
// 直接将选中的所有内容转为小写(整体转换)
var allLowercaseText = selectedText.toLowerCase();
ed.selection.setContent(allLowercaseText);
// } else {
// vueInstance.$message.error(vueInstance.$t('commonTable.selectWord'));
// }
}
});
ed.ui.registry.addButton('Line', {
text: '', // 按钮文本
onAction: function () {

View File

@@ -26,7 +26,7 @@ function debounce(func, wait = 500, immediate = false) {
}
}
function throttle(fn, delay = 1000, immediate = false) {
console.log("进入节流对象")
let timer
let status = false // 是否为重复点击状态
return function () {

View File

@@ -67,7 +67,7 @@ export default {
vTags
},
created() {
console.log('route at line 38:', this.$route)
bus.$on('collapse-content', (msg) => {
this.collapse = msg;
localStorage.setItem('collapse', this.collapse);

View File

@@ -71,9 +71,9 @@
<!-- <el-menu-item index="editorial">
{{ $t('sidebar.edit_oria1') }}
</el-menu-item> -->
<el-menu-item index="edithistory">
<!-- <el-menu-item index="edithistory">
{{ $t('sidebar.edit_oria2') }}
</el-menu-item>
</el-menu-item> -->
<el-menu-item index="editPeerewer">
{{ $t('sidebar.edit_ewer1') }}
</el-menu-item>

View File

@@ -1,50 +1,56 @@
<template>
<div>
<div class="commonCvList">
<!-- 个人简历弹出框 -->
<p style="margin: 0 0 25px 28px; font-size: 18px">CV. List</p>
<p style="color: #aaa; margin: 0 0 30px 28px" v-if="cvitaTable.length == 0">No data</p>
<div v-for="(item, index) in cvitaTable" style="margin: 0 0 0 30px">
{{ index + 1 }}.
<img src="../../assets/img/icon_0.png" alt="" class="icon_img" style="vertical-align: middle; margin-left: 10px" />
<span style="margin-left: 20px; color: #888; font-size: 13px">
<i class="el-icon-paperclip"></i>
{{ formatDate(item.ctime) }}
</span>
<a :href="mediaUrl + 'reviewer/' + item.cv" target="_blank" class="txt_pdf">
<i class="el-icon-download"></i>
</a>
<i
class="el-icon-delete"
@click="deletCVita(item)"
style="color: #f12424; cursor: pointer; font-weight: bold; margin: 0 0 0 15px"
></i>
<p style="color: #aaa; margin: 0 0 0px 0px" v-if="cvitaTable1 && cvitaTable1.length == 0">No data</p>
<div style="margin: 0 0 0 0px">
<div v-for="(item, index) in cvitaTable1" style="height: 30px;">
<span style="color: #888;">{{ index + 1 }}.</span>
<img src="../../assets/img/icon_0.png" alt="" class="icon_img" style="vertical-align: middle; margin-left: 10px" />
<span style="margin-left: 20px; color: #888; font-size: 13px">
<i class="el-icon-paperclip"></i>
{{ formatDate(item.ctime) }}
</span>
<a :href="mediaUrl + 'reviewer/' + item.cv" target="_blank" class="txt_pdf">
<i class="el-icon-download"></i>
</a>
<i v-if="isEdit"
class="el-icon-delete"
@click="deletCVita(item)"
style="color: #f12424; cursor: pointer; font-weight: bold; margin: 0 0 0 15px"
></i>
</div>
</div>
<p style="width: 90%; background-color: #d7d7d7; height: 1px; margin: 10px auto 30px auto"></p>
<p style="margin: 0 0 25px 28px">If you want to update your resume, please upload it.</p>
<el-form :model="cvitaForm" :rules="rules" ref="cvita_Form" label-width="70px">
<el-form-item label="CV. :">
<el-upload
class="upload-demo"
:action="baseUrl + 'api/Ucenter/up_cv_file'"
:on-success="handleFileSuccess1"
name="reviewerCV"
type="reviewerCV"
:on-error="handleFileError"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:on-change="handleChange1"
accept=".pdf"
:on-exceed="handleExceed"
ref="uploadRef1"
>
<el-button type="text" style="font-weight: bolder">
<b class="el-icon-lx-top" style="font-weight: bolder"></b>upload
</el-button>
</el-upload>
<span style="font-size: 12px; color: #aaa"> Only pdf files can be uploaded(.pdf) </span>
</el-form-item>
</el-form>
<div v-if="isEdit">
<p style="margin: 20px 0"></p>
<el-upload style="position: relative"
class="upload-demo"
:action="baseUrl + 'api/Ucenter/up_cv_file'"
:on-success="handleFileSuccess1"
name="reviewerCV"
type="reviewerCV"
:on-error="handleFileError"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:on-change="handleChange1"
accept=".pdf"
:on-exceed="handleExceed"
ref="uploadRef1"
>
<el-button type="text" style="font-weight: bolder">
<b class="el-icon-lx-top" style="font-weight: bolder"></b>upload
</el-button>
<div class="el-upload__tip" slot="tip">
Only PDF and compressed files can be uploaded (file format: .pdf).
<div style="font-size: 12px; color: #888; line-height: 14px">If you want to update your resume, please upload it.</div>
</div>
</el-upload>
</div>
</div>
</template>
@@ -53,6 +59,12 @@ import Schart from 'vue-schart';
import bus from '../common/bus';
export default {
name: 'dashboard',
props:{
isEdit: {
type: Boolean,
default:true
},
},
data() {
return {
user_id: '',
@@ -71,11 +83,12 @@ export default {
},
computed: {},
methods: {
init() {
init(list) {
this.user_id = localStorage.getItem('U_id');
this.cvitaForm.user_id = this.user_id;
console.log('this.user_id at line 75:', this.user_id)
this.getCVitaData();
console.log('this.user_id at line 75:', this.user_id);
this.cvitaTable1=[...list]
// this.getCVitaData();
},
// 获取简历列表
getCVitaData() {
@@ -205,4 +218,11 @@ export default {
font-weight: bold;
margin-left: 10px;
}
.commonCvList .el-upload__tip {
position: absolute;
top: -14px;
left: 70px;
color: #333;
font-size: 12px;
}
</style>

View File

@@ -224,7 +224,7 @@ const en = {
rev_ewer: 'Reviewer',
rev_ewer1: 'Peer Review',
rev_ewer2: 'Review History',
man_ing: 'Editor-in-Chief',
man_ing1: 'Journal information',
man_ing2: 'Article List',
@@ -365,7 +365,7 @@ const en = {
reply: 'Reply',
execute: 'Execute',
revoke: 'Revoke',
solve: 'Solve',
cancelsolve: 'Cancel resolved',
Resolved: 'Resolved',
@@ -385,16 +385,20 @@ const en = {
exportImg: 'Export PNG',
PaperRotation: 'Paper Rotation',
removeAnnotations: 'Are you sure you want to delete this Annotation?',
removeProofread
: 'Are you sure to delete this suggestion?',
removeProofread: 'Are you sure to delete this suggestion?',
removeContent: 'Are you sure you want to delete this content?',
reContent: 'Are you sure you want to restore this content?',
uploadImageInfo: 'Figures can only upload files in JPG, JPEG, and PNG formats!',
selectComment: 'Please select the text to add annotations to!',
selectWord: 'Please select only a single word',
selectOne: 'Please select only a single paragraph',
alreadyCommented: 'There are already annotations in the text, please select again!',
Multicolumn: 'Multicolumn',
singleRow: "single-row",
Row: "Row",
Uncheck: 'Uncheck the paragraph',
ManuscirptAIProofreading: 'Manuscript AI Proofreading',
BatchAddcontent: 'Batch Add content',
},
pendingPayment: {
title: 'Title',

View File

@@ -382,9 +382,14 @@ const zh = {
uploadImageInfo: 'Figures 只能上传 JPG、JPEG 和 PNG 格式的文件',
selectComment: '请选择要添加批注的文本',
selectWord:'请只选中单个单词!',
selectOne:'请只勾选单个段落!',
alreadyCommented:'文本中已有批注内容请重新选择',
Multicolumn:'多列',
singleRow:"单列",
Row:"空行",
Uncheck:'取消勾选段落',
ManuscirptAIProofreading:'稿件AI校对',
BatchAddcontent: '批量添加内容',
},
pendingPayment: {
title: 'Title',

View File

@@ -231,7 +231,7 @@ export default {
article_id: this.$route.query.id
})
.then((res) => {
console.log('res at line 191:', res);
if (res.code == 0) {
this.tableData = [{ ...res.data }];
}
@@ -243,7 +243,7 @@ export default {
article_id: this.$route.query.id
})
.then((res) => {
console.log('res at line 191:', res);
if (res.code == 0) {
this.articleInfo = res.data.article_detail;
this.journalInfo = res.data.journal_detail;

View File

@@ -866,17 +866,10 @@
<el-form-item label="Real name :" prop="realname">
<el-input type="text" placeholder="Please enter..." v-model="coreForm.realname" style="width: 320px"></el-input>
</el-form-item>
<el-form-item label="Phone :">
<el-input type="text" placeholder="Please enter..." v-model="coreForm.phone" style="width: 320px"> </el-input>
</el-form-item>
<!-- <el-form-item label="Gender :" prop="gender">
<el-radio-group v-model="coreTable.gender">
<el-radio :label="1">Male</el-radio>
<el-radio :label="2">Female</el-radio>
</el-radio-group>
</el-form-item>-->
<el-form-item label="Academic title :" prop="technical">
<el-form-item label="Academic title :" prop="technical">
<el-select
v-model="coreForm.technical"
filterable
@@ -906,30 +899,6 @@
<el-form-item label="Website :" prop="website">
<el-input type="text" placeholder="eg:http://..." v-model="coreForm.website" style="width: 320px"> </el-input>
</el-form-item>
<!-- <el-form-item prop="major_a">
<span slot="label">
<i style="color: #F56C6C;margin-right: 4px;">*</i>
Research areas
</span>
<common-major v-if="coreVisible"></common-major>
<el-select v-model="coreForm.major_a" placeholder="Please select major" @change="majorChange(1)"
style="width: 180px">
<el-option v-for="item in majors_a" :key="item.major_id"
:label="item.major_title+' ('+item.nickname+')'" :value="item.major_id"></el-option>
</el-select>
<el-select v-model="coreForm.major_b" placeholder="Please select major" v-if="majors_b!=''"
@change="majorChange(2)" style="margin:0 15px;width: 180px">
<el-option :key="0" label="None" :value="0"></el-option>
<el-option v-for="item in majors_b" :key="item.major_id"
:label="item.major_title+' ('+item.nickname+')'" :value="item.major_id"></el-option>
</el-select>
<el-select v-model="coreForm.major_c" placeholder="Please select major" v-if="majors_c!=''"
style="width: 180px" @change="majorChange(3)">
<el-option :key="0" label="None" :value="0"></el-option>
<el-option v-for="item in majors_c" :key="item.major_id"
:label="item.major_title+' ('+item.nickname+')'" :value="item.major_id"></el-option>
</el-select>
</el-form-item> -->
<el-form-item label="Field :" prop="field">
<el-input v-model="coreForm.field" type="textarea" style="width: 570px" autosize></el-input>
</el-form-item>
@@ -987,7 +956,7 @@
</el-dialog>
<!-- 申请青年科学家弹出框 -->
<el-dialog title="Apply Young Scientist" :visible.sync="youthVisible" width="450px" :close-on-click-modal="false">
<el-dialog title="Apply Young Scientist" :visible.sync="youthVisible" width="600px" :close-on-click-modal="false">
<el-form :model="youthForm" :rules="rules" ref="youth_Form" label-width="100px">
<el-form-item label="Journal :" prop="journal_id">
<el-select v-model="youthForm.journal_id" placeholder="Please select a journal" style="width: 300px">
@@ -1000,9 +969,9 @@
</el-select>
</el-form-item>
<!-- <el-form-item label=" " label-width="0px">
<commonCv ref="commoncv" @cvitaTable="getCVitaData"></commonCv>
</el-form-item> -->
<el-form-item label="CV :" >
<commonCv ref="commoncv" @cvitaTable="updateCVitaData"></commonCv>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="youthVisible = false">Cancel</el-button>
@@ -1355,7 +1324,7 @@ export default {
},
computed: {},
methods: {
getCVitaData(data){
updateCVitaData(data){
this.applyCvitaTable = data;
},
handleDeleteMajor(v) {
@@ -1525,12 +1494,13 @@ this.applyCvitaTable = data;
// 获取简历列表
getCVitaData() {
this.$api
.post('api/Ucenter/getUserInfo', {
.post('api/User/getUser', {
user_id: this.user_id
})
.then((res) => {
if (res.code == 0) {
this.cvitaTable = res.data.cvs;
if (res.status == 1) {
this.cvitaTable = res.data.cv || [];
this.applyCvitaTable = res.data.cv || [];
} else {
this.$message.error(res.msg);
}
@@ -1542,6 +1512,7 @@ this.applyCvitaTable = data;
// 简历弹出层
openCVita() {
this.cvitaTable=[...this.applyCvitaTable]
this.cvitaVisible = true;
this.cvitaForm.cv = '';
},
@@ -2112,42 +2083,42 @@ this.applyCvitaTable = data;
// 青年科学家弹出框
youthPoint() {
// this.youthForm.journal_id = '';
// this.youthVisible = true;
// this.$nextTick(()=>{
// this.$refs.commoncv.init();
// })
this.youthForm.journal_id = '';
this.youthVisible = true;
this.$nextTick(()=>{
this.$refs.commoncv.init(this.applyCvitaTable);
})
// 判断
this.$api
.post('api/Ucenter/checkApply', {
user_id: this.user_id,
type: 2
})
.then((res) => {
if (res.code == 0) {
this.youthForm.journal_id = '';
// this.$api
// .post('api/Ucenter/checkApply', {
// user_id: this.user_id,
// type: 2
// })
// .then((res) => {
// if (res.code == 0) {
// this.youthForm.journal_id = '';
this.youthVisible = true;
// this.$nextTick(()=>{
// this.$refs.commoncv.init();
// })
} else {
// 提示完善信息
this.tipVisible = true;
this.tipTable.message = res.msg;
}
})
.catch((err) => {
console.log(err);
});
// this.youthVisible = true;
// } else {
// // 提示完善信息
// this.tipVisible = true;
// this.tipTable.message = res.msg;
// }
// })
// .catch((err) => {
// console.log(err);
// });
},
// 点击提交青年科学家信息
onSubmit_youth(youthForm) {
this.$refs.youth_Form.validate((valid) => {
if (valid) {
if(this.applyCvitaTable.length == 0){
this.$message.error('Please upload your resume!');
return false;
}
this.$api
.post('api/Ucenter/applyYboard', this.youthForm)
.then((res) => {
@@ -2171,8 +2142,8 @@ this.applyCvitaTable = data;
this.$message.error(err);
});
} else {
this.$message.error('Please select a journal!');
return false;
// this.$message.error('Please select a journal!');
// return false;
}
});
},

View File

@@ -697,15 +697,7 @@ export default {
async saveContent(content, am_id) {
var that = this;
var str = content.replace(/^<p>\s*(.*?)\s*<\/p>$/, '$1').trim();
// var str = content.replace(/^<p>(.*?)<\/p>$/, '$1') ? content.replace(/^<p>(.*?)<\/p>$/, '$1') : '';
console.log('str at line 580:', JSON.stringify(str));
// if (str == '') {
// this.$message({
// type: 'warning',
// message: 'Please enter the content!'
// });
// }
str = await that.$commonJS.decodeHtml(str);
await that.$api
@@ -938,7 +930,6 @@ export default {
})
.then(async () => {
var that = this;
await that.$api
.post('/api/Preaccept/delMoreArticleMains', {
ids: dataId
@@ -1201,14 +1192,21 @@ export default {
},
async onAddRow(mainId) {
await this.$api
.post(this.urlList.addRow, {
am_id: mainId,
article_id: this.articleId
})
.then(async (res) => {
this.getDate();
if(res.code == 0){
this.getDate();
this.getCommentList();
}else{
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err.msg);
@@ -1477,120 +1475,13 @@ export default {
});
},
getWord() {
// var htmlContent = `<h3 class="man_Title" contenteditable="false">${this.detailTitle} </h3>`;
// htmlContent += this.Main_List.map((item) => {
// //批注
// let contentHtml = '';
// var isRemark = ``;
// if (item.remark && item.remark != '') {
// // isRemark = `<img class="isRemark" main-id="${item.am_id}" src="${this.remarkImageUrl}" alt="" style="width:20px;height:20px;"/>`;
// isRemark = `<span class="isRemark" main-id="${item.am_id}"><img class="isRemarkIcon" main-id="${item.am_id}" src="${
// this.remarkImageUrl
// }" alt="" style="width: 20px; height: 20px" />
// <span class="isRemarkIcon" main-id="${item.am_id}" > (${item.am_id})</span>
// ${item.state == 0 ? `<span class="Resolved" main-id="${item.am_id}">Resolved</span>` : ''}
// </span>
// `;
// }
// // 判断是否是图片
// if (item.type == 1) {
// var extension = item.image.url.split('.').pop().toLowerCase();
// if (extension == 'tif') {
// contentHtml = `
// <p contenteditable="false" main-state="${item.state}" class="MaxPicture pMain" data-id="${item.ami_id}" main-id="${
// item.am_id
// }">
// <img src="" data-img-id="${item.ami_id}" style="width: ${item.width ? `${item.width}px` : '100%'}" />
// <font class="font" style="width: ${item.width ? `${item.width}px` : '100%'}">${item.image.note ? item.image.note : ''}</font>
// </p>
// `;
// } else if (['jpg', 'jpeg', 'png'].includes(extension)) {
// contentHtml = `
// <p contenteditable="false" main-state="${item.state}" class="MaxPicture pMain" data-id="${
// item.ami_id
// }" main-id="${item.am_id}">
// ${isRemark}
// <img src="${this.mediaUrl + item.image.url}" style="width: ${
// item.width ? `${item.width}px` : '100%'
// }" />
// <font class="font" style="width: ${item.width ? `${item.width}px` : '100%'}" >${
// item.image.note ? item.image.note : ''
// }</font>
// </p>
// `;
// } else {
// contentHtml = `
// <p contenteditable="false" main-state="${item.state}" class="MaxPicture pMain" data-id="${
// item.ami_id
// }" main-id="${item.am_id}">
// ${isRemark}
// <span
// style="
// text-align: center;
// font-size: 30px;
// display: flex;
// align-items: center;
// justify-content: center;
// "
// >
// Figures ( .${item.image.url.split('.').pop().toUpperCase()})
// </span>
// <font class="font" style="width: ${item.width ? `${item.width}px` : '100%'}" >${
// item.image.note ? item.image.note : ''
// }</font>
// </p>
// `;
// }
// } else if (item.type == 2) {
// var tableList = JSON.parse(item.table.table_data);
// contentHtml = `
// <div contenteditable="false" data-id="${item.amt_id}" main-state="${item.state}" main-id="${
// item.am_id
// }" class="thumbnailTableBox wordTableHtml table_Box pMain" style="width: 100%; padding: 8px 15px; box-sizing: border-box; border-radius: 4px; position: relative;">
// ${isRemark}
// <font class="font tableTitle" style="width:100%" >${item.table.title ? item.table.title : ''}</font>
// <table border="1" style="width: auto; border-collapse: collapse; text-align: center; ">
// ${tableList
// .map((row) => {
// return `
// <tr>
// ${row
// .map((cell) => {
// return `
// <td colspan="${cell.colspan || 1}" rowspan="${cell.rowspan || 1}">
// <span>${cell.text || ''}</span>
// </td>
// `;
// })
// .join('')} <!-- join the cells in the row -->
// </tr>
// `;
// })
// .join('')} <!-- join the rows -->
// </table>
// <font class="font" style="width:100%" >${item.table.note ? item.table.note : ''}</font>
// </div>
// `;
// } else {
// contentHtml = `<p class="pMain" main-state="${item.state}" contenteditable="false" data-id="${item.am_id}" main-id="${item.am_id}">${isRemark}${item.content}</p>`;
// }
// // 判断是否是表格类型
// return contentHtml;
// }).join('');
// this.htmlContent = htmlContent;
this.htmlContent = 'true';
},
// 获取数据
async getDate() {
// await this.$api.post('api/Proofread/proofRead', {
// article_id: this.$route.query.id
// });
this.imagesList = [];
let urlLInk = '';
let urlTask = {};
@@ -1598,7 +1489,6 @@ export default {
urlLInk = 'api/Preaccept/getArticleMainsNew';
urlTask.article_id = this.Art_Id;
}
const loading = this.$loading({
lock: true,
text: 'Loading...',
@@ -1611,26 +1501,22 @@ export default {
.post(urlLInk, urlTask)
.then(async (res) => {
if (res.code == 0) {
// res.data.list.forEach((data) => {
// if (data.amt_id) {
// try {
// const parsedData = JSON.parse(data.table.table_data);
// } catch (e) {
// console.error(e.message);
// }
// }
// });
this.Main_List = res.data.list;
this.Main_List = res.data.list.map(e=>{
e.checked = false;
return e;
});
this.getManuscirptContent();
for (let i = 0; i < this.Main_List.length; i++) {
this.Main_List[i].text = this.Main_List[i].content;
this.Main_List[i].getnum = 0;
// this.Main_List[i].checked = false;
}
// setTimeout(async () => {
this.$nextTick(async () => {
await this.getWord();
loading.close();
});
// }, 1000);

File diff suppressed because it is too large Load Diff

View File

@@ -99,7 +99,7 @@
</el-upload>
</el-form-item>
<el-form-item label="Manuscript Title :" prop="title" label-width="160px">
<el-input v-model="form.title"></el-input>
<el-input v-model="form.title" type="textarea" rows="2"></el-input>
</el-form-item>
<el-form-item label="Whether ethical approval was obtained ?" prop="approval" label-width="290px">
@@ -166,21 +166,33 @@
</el-form-item> -->
<el-form-item label="Key words :">
<el-input
v-for="(item, index) in keywordsList"
:key="index"
:name="index + 1"
v-model="item.ke"
clearable
style="width: 150px; margin-right: 15px; margin-bottom: 3px"
>
</el-input>
<div v-if="keywordsList&&keywordsList.length > 0">
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange" style="color: #006699;">Select All</el-checkbox>
<el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
<div v-for="(item, index) in keywordsList" :key="index" style="margin-right:16px;display: inline-block;">
<el-checkbox style="margin-right: 4px;" :label="index + 1" v-model="item.checked">{{item.keyword}}</el-checkbox>
<el-input
:name="index + 1"
v-model="item.ke"
clearable
style="width: 150px; margin-right: 15px; margin-bottom: 3px"
>
</el-input>
</div>
</el-checkbox-group>
</div>
<el-button type="text" @click="addfund">
<i class="el-icon-circle-plus-outline">Add</i>
</el-button>
<el-button v-if="checkedCities.length > 0" type="text" @click="deletefund" style="color: #f56c6c;margin-left: 20px;">
<i class="el-icon-remove-outline" style="color: #f56c6c;">Delete</i>
</el-button>
</el-form-item>
<el-form-item label="Fund :">
<el-input v-model="form.fund"> </el-input>
<el-input v-model="form.fund" type="textarea" rows="2"> </el-input>
</el-form-item>
<div style="text-align: center; margin: 40px 0 0 0">
@@ -1023,6 +1035,7 @@ export default {
ProgressBar
},
data() {
// 自定义校验禁止QQ邮箱
const validateNotQQEmail = (rule, value, callback) => {
// 通用邮箱格式正则(基础校验,匹配大多数标准邮箱格式)
@@ -1056,8 +1069,12 @@ export default {
}
};
return {
isNewArticle:true,
checkAll: false,
isIndeterminate: false,
stepStatusCurrent: '',
isNewArticle: true,
oldMajorValueList: [],
checkedCities: [],
newOptionLabel: '',
showAddOption: false,
nextId: 0, // 用于生成新选项的ID
@@ -1513,9 +1530,7 @@ export default {
immediate: true
},
form: {
async handler(newVal, oldVal) {
},
async handler(newVal, oldVal) {},
deep: true,
immediate: true
}
@@ -1532,7 +1547,7 @@ export default {
// 分支处理
if (this.stagingID !== undefined) {
this.form.article_id = this.stagingID;
await this.getMajorData();
await this.initStepStatus((step1Incomplete) => {
this.show_step = step1Incomplete.current.step;
@@ -1540,7 +1555,7 @@ export default {
});
await this.Temporary();
} else {
this.isNewArticle=true;
this.isNewArticle = true;
await this.initMajor();
}
@@ -1583,6 +1598,19 @@ export default {
}
},
methods: {
handleCheckAllChange(val) {
this.checkedCities = val
? this.keywordsList.map((_, index) => index + 1) // 遍历数组,取 index+1 作为选中值
: [];
this.isIndeterminate = false;
},
handleCheckedCitiesChange(){
console.log('this.checkedCities at line 1594:', this.checkedCities)
},
handleDelete(index){
this.keywordsList.splice(index, 1);
},
closeAuthorDialog() {
this.getAuthorList();
this.authorVisible = false;
@@ -1708,7 +1736,7 @@ export default {
.then((res) => {
if (res.status == 1) {
this.stagingID = res.data.article_id;
this.form.article_id = res.data.article_id;
this.form.article_id = res.data.article_id;
this.initStepStatus();
this.$message.success('Saving succeeded!');
} else {
@@ -1745,29 +1773,27 @@ export default {
{ step: 4, status: 0, name: 'four', msg: 'four_msg' }
]
};
await this.$api
await this.$api
.post('api/Article/getArticleState', {
article_id: this.form.article_id,
user_id: this.form.user_id
})
.then(async(res) => {
.then(async (res) => {
if (res.status == 1) {
step1Incomplete.list= step1Incomplete.list.map((item) => ({
step1Incomplete.list = step1Incomplete.list.map((item) => ({
...item,
status: res.data[item.name],
msg: res.data[item.msg]
}));
this.stepStatus = step1Incomplete.list
this.stepStatus = step1Incomplete.list;
if (res.data.current_step) {
step1Incomplete.current = step1Incomplete.list.find((item) => item.name == res.data.current_step);
this.stepStatusCurrent = step1Incomplete.current;
}
if (fn) {
console.log('step1Incomplete at line 1766:', step1Incomplete)
fn(step1Incomplete);
console.log('step1Incomplete at line 1766:', step1Incomplete);
fn(step1Incomplete);
}
console.log('this.stepStatus at line 1571:', this.stepStatus);
}
@@ -1928,7 +1954,25 @@ export default {
ke: ''
});
},
deletefund() {
if (!this.checkedCities.length) {
this.$message.error('please select the key word to delete');
return;
}
// 2. 将选中的序号index+1转成原始索引index并存入集合提高查询效率
const selectedIndexes = new Set(
this.checkedCities.map(seq => seq - 1) // 序号 - 1 = 原始索引
);
// 3. 过滤 keywordsList保留索引不在选中集合中的项
this.keywordsList = this.keywordsList.filter((_, index) =>
!selectedIndexes.has(index)
);
this.checkAll = false;
// 4. 清空选中状态和半选状态(删除后无选中项)
this.checkedCities = [];
this.isIndeterminate = false; },
//初始化期刊选项
initSelect() {
this.items = this.$store.state.journalList;
@@ -2716,9 +2760,9 @@ export default {
} else {
this.$message.error(res.msg);
this.form.manuscirpt = '';
this.fileL_manuscirpt = [];
this.isShowCommonWord = false;
this.initStepStatus()
this.fileL_manuscirpt = [];
this.isShowCommonWord = false;
this.initStepStatus();
loading.close();
}
})
@@ -2832,7 +2876,7 @@ export default {
.then((res) => {
if (res.code == 0) {
this.$message.success('Deletion succeeded!');
this.initStepStatus()
this.initStepStatus();
} else {
this.$message.error(res.msg);
}
@@ -2985,36 +3029,10 @@ export default {
this.move_step = e;
} else if (this.move_step < e) {
this.$refs.articleform.validate((valid) => {
console.log('valid at line 2963:', valid);
if (valid) {
// deepEqual(this.form, this.oldForm);
if (this.move_step == 1) {
//暂时注销 start
// var flist = this.keywordsList;
// var fstr = '';
// for (var fu in flist) {
// if (flist[fu].ke != '') {
// fstr += flist[fu].ke.trim() + ',';
// }
// }
// this.form.keyWords = fstr == '' ? '' : fstr.substring(0, fstr.length - 1);
// this.$api.post('api/Article/addArticlePart1', this.form).then((res) => {
// if (res.code == 0) {
// this.stagingID = res.data.article_id;
// this.form.article_id = res.data.article_id;
// this.$message.success('Saving succeeded!');
//暂时注销 End
this.move_step = 2; //进行步骤
this.show_step = 2; //显示内容
//暂时注销 start
// } else {
// // this.$message.error(res.msg);
// }
// });
//暂时注销 End
this.move_step = 2;
this.show_step = 2;
} else if (this.move_step == 2) {
this.onStaging(2);
this.show_step = 3;
@@ -3025,7 +3043,6 @@ export default {
}
} else {
this.$message.error('Please fill in the current content first!');
// return false;
}
});
} else {
@@ -3041,42 +3058,39 @@ export default {
}
},
isArrayEqual(arr1, arr2) {
if ((arr1 === null || arr1 === undefined) && (arr2 === null || arr2 === undefined)) return true;
if (arr1 === null || arr1 === undefined || arr2 === null || arr2 === undefined) return false;
if ((arr1 === null || arr1 === undefined) && (arr2 === null || arr2 === undefined)) return true;
if (arr1 === null || arr1 === undefined || arr2 === null || arr2 === undefined) return false;
if (!Array.isArray(arr1) || !Array.isArray(arr2)) return false;
if (arr1.length !== arr2.length) return false;
return arr1.every((val, index) => val === arr2[index]);
},
if (!Array.isArray(arr1) || !Array.isArray(arr2)) return false;
if (arr1.length !== arr2.length) return false;
return arr1.every((val, index) => val === arr2[index]);
},
isMajorValueListEqual(list1, list2) {
if ((list1 === null || list1 === undefined) && (list2 === null || list2 === undefined)) return true;
if (list1 === null || list1 === undefined || list2 === null || list2 === undefined) return false;
if (!Array.isArray(list1) || !Array.isArray(list2)) return false;
if (list1.length !== list2.length) return false;
return list1.every((item1, index) => {
const item2 = list2[index];
if ((item1 === null || item1 === undefined) && (item2 === null || item2 === undefined)) return true;
if (item1 === null || item1 === undefined || item2 === null || item2 === undefined) return false;
const sv1 = item1.selectedValue;
const sv2 = item2.selectedValue;
return this.isArrayEqual(sv1, sv2);
});
},
if ((list1 === null || list1 === undefined) && (list2 === null || list2 === undefined)) return true;
if (list1 === null || list1 === undefined || list2 === null || list2 === undefined) return false;
if (!Array.isArray(list1) || !Array.isArray(list2)) return false;
if (list1.length !== list2.length) return false;
return list1.every((item1, index) => {
const item2 = list2[index];
if ((item1 === null || item1 === undefined) && (item2 === null || item2 === undefined)) return true;
if (item1 === null || item1 === undefined || item2 === null || item2 === undefined) return false;
const sv1 = item1.selectedValue;
const sv2 = item2.selectedValue;
return this.isArrayEqual(sv1, sv2);
});
},
StepCode(step, i) {
var that = this;
const targetIndex = step.index; // 目标步骤索引1、2、3等
const currentStep = this.move_step; // 当前所在步骤
console.log('当前步骤:', currentStep, '目标步骤:', targetIndex, '步骤状态:', this.stepStatus);
// 1. 后退
if (currentStep > targetIndex) {
@@ -3091,8 +3105,7 @@ export default {
// ? item.selectedValue[item.selectedValue.length - 1]
// : []
// )
// .toString(',');
// .toString(',');
// this.$api
// .post('api/Article/addArticleStaging', {
// user_id: this.form.user_id,
@@ -3104,10 +3117,7 @@ export default {
// this.oldMajorValueList = [...this.majorValueList];
// }
// });
// }
// }
}
this.show_step = targetIndex;
@@ -3121,32 +3131,40 @@ export default {
if (!valid) {
this.$message.error('Please fill in the current content first!');
return false;
} else if (this.stepStatus[currentStep - 1].status != 1) {
this.$message.error(
this.stepStatus[currentStep - 1].msg
? this.stepStatus[currentStep - 1].msg
: 'Please fill in the current content first!'
);
return false;
} else {
let invalidStep = null;
for (let i = 0; i < targetIndex - 1; i++) {
const step = this.stepStatus[i];
if (step.status !== 1) {
invalidStep = step;
break;
}
}
if (invalidStep) {
this.$message.error(
this.stepStatusCurrent.msg ? this.stepStatusCurrent.msg : 'Please fill in the current content first!'
);
this.show_step = this.stepStatusCurrent.step;
this.move_step = this.stepStatusCurrent.step;
this.$forceUpdate();
} else {
this.show_step = targetIndex;
this.move_step = targetIndex;
}
if (targetIndex == 4) {
if (
Array.isArray(this.majorValueList) &&
this.majorValueList.some((item) => item.selectedValue !== null && item.selectedValue !== undefined)
) {
} else {
if(this.isNewArticle){
this.getMajorData();
if (this.isNewArticle) {
this.getMajorData();
}
}
}
this.show_step = targetIndex;
this.move_step = targetIndex;
}
this.show_step = targetIndex;
this.move_step = targetIndex;
});
// return;
}
@@ -3287,20 +3305,20 @@ export default {
this.stagingID = res.data.article_id;
this.form.article_id = res.data.article_id;
this.$message.success('Saving succeeded!');
this.initStepStatus(step1Incomplete=>{
console.log('step1Incomplete at line 3283:', step1Incomplete)
this.$nextTick(()=>{
if(step1Incomplete.list&&step1Incomplete.list.length>0&&step1Incomplete.list[0].status==1){
this.move_step = 2; //进行步骤
this.show_step = 2; //显示内容
this.$forceUpdate()
}
})
this.initStepStatus((step1Incomplete) => {
console.log('step1Incomplete at line 3283:', step1Incomplete);
this.$nextTick(() => {
if (
step1Incomplete.list &&
step1Incomplete.list.length > 0 &&
step1Incomplete.list[0].status == 1
) {
this.move_step = 2; //进行步骤
this.show_step = 2; //显示内容
this.$forceUpdate();
}
});
});
} else {
this.$message.error(res.msg);
}
@@ -3369,7 +3387,7 @@ export default {
},
// save暂存
onStagingSave: throttle(function (e) {
onStagingSave: throttle(function (e) {
if (e == 1) {
this.onStaging(1);
} else if (e == 2) {
@@ -3379,9 +3397,9 @@ export default {
} else if (e == 4) {
this.onStaging('save4');
}
},1000),
}, 1000),
//暂存加下一步
onStagingSubmit: throttle(function (e) {
onStagingSubmit: throttle(function (e) {
if (e == 3) {
this.$api
.post('api/Article/addArticlePart3', {
@@ -3399,10 +3417,9 @@ export default {
this.majorValueList.some((item) => item.selectedValue !== null && item.selectedValue !== undefined)
) {
} else {
if(this.isNewArticle){
if (this.isNewArticle) {
this.getMajorData();
}
}
this.move_step = 4;
this.show_step = 4;
@@ -3414,7 +3431,7 @@ export default {
}
});
}
},1000),
}, 1000),
// 暂存
onStaging(e) {
@@ -3441,7 +3458,7 @@ export default {
article_id: this.form.article_id,
journal: this.form.journal,
title: this.form.title,
keyWords: this.form.keyWords,
keywords: this.form.keyWords,
abstrart: this.form.abstrart,
type: this.form.type,
username: this.form.username,
@@ -3454,11 +3471,9 @@ export default {
},
(res) => {
if (res.status == 1) {
const url = new URL(window.location.href);
url.searchParams.set('id', res.data.article_id); // 替换或新增 id 参数
window.history.replaceState({}, document.title, url.toString());
}
}
);
@@ -3643,8 +3658,7 @@ export default {
? item.shu.split(',').map(Number)
: [item.shu]
}));
this.isNewArticle=false;
this.isNewArticle = false;
});
},
changeUseAi(e) {
@@ -3936,7 +3950,7 @@ export default {
}
.step_list_new .C_style {
background-color: #ecf5ff !important;
background-color: #ecf5ff !important;
-webkit-box-shadow: 2px 30px 15px -20px #ebf5ff inset !important;
box-shadow: 2px 30px 15px -20px #ebf5ff inset !important;
}

File diff suppressed because it is too large Load Diff

View File

@@ -106,18 +106,31 @@
.catch(err => {
this.$message.error(err);
});
var data={article_id: this.articleId}
if(this.$route.query.user_id){
data.art_aut_id=this.$route.query.user_id
}
this.$api
.post('api/Article/getArticleUserDetail', {
article_id: this.articleId
.post(this.$route.query.user_id?'api/Workbench/getCorrespondingInfo':'api/Article/getArticleUserDetail', {
...data
})
.then(res => {
if (res.code == 0) {
if(this.$route.query.user_id){
if (res.status == 1) {
this.AuthorMes = res.data.user;
this.EmailData.topmail = 'Dear Dr. ' + this.AuthorMes.realname + ',<br/>';
} else {
this.$message.error(res.msg);
}
}else{
if (res.code == 0) {
this.AuthorMes = res.data.userDetail;
this.EmailData.topmail = 'Dear Dr. ' + this.AuthorMes.realname + ',<br/>';
} else {
this.$message.error(res.msg);
}
}
})
.catch(err => {
this.$message.error(err);

View File

@@ -11,9 +11,9 @@
</el-breadcrumb>
</div>
<div class="container">
<div class="handle-box">
<div class="handle-box" v-if="articleBaseInfo.state == 8">
<div>
<el-button type="primary" icon="el-icon-plus" @click="openSuggRev">Editorial Board Bank</el-button>
<el-button type="primary" icon="el-icon-plus" @click="openSuggRev">Editorial Board Bank</el-button>
</div>
<!-- <el-button type="primary" icon="el-icon-circle-plus-outline" @click="editVisible1 = true">Supplement</el-button> -->
@@ -575,60 +575,23 @@ export default {
showdetail(row) {
console.log('row at line 577:', row)
this.FinalDetailBaseInfo={...row}
// const loading = this.$loading({
// lock: true,
// text: 'Loading',
// spinner: 'el-icon-loading',
// background: 'rgba(0, 0, 0, 0.7)',
// zIndex: 9999 // 设置一个足够高的层级
// });
// this.$api
// .post('api/Finalreview/view', {
// record_id: row.id
// // reviewer_id: this.$route.query.reviewer_id
// })
// .then((res) => {
// this.detailDate.artrevid = res.art_rev_id;
// this.detailDate.article = res.data.article.title;
// this.detailDate.reviewer = res.data.article_final.realname;
// this.detailDate.ctime = res.data.article_final.update_time;
// this.detailDate.article_final = res.data.article_final;
// this.detailDate.state = res.state;
// this.txt_mess = res;
// this.journal_id = res.journal_id;
// this.articleId = res.data.article.article_id;
// this.$nextTick(() => {
// this.$refs.commonEditor.getData();
// loading.close();
// });
// this.$forceUpdate();
// })
// .catch((err) => {
// loading.close();
// console.log(err);
// });
this.$nextTick(() => {
this.$refs.commonFinalDetail.init();
this.$api
.post('api/Workbench/updateArticleState', {
article_id: this.$route.query.id,
act_id: row.id,
type: '3',
account: localStorage.getItem('U_name')
})
});
// this.$router.push({
// path: 'articleEditorDetail',
// query: {
// id: row.id
// }
// });
},
changereviewer() {
if (this.editform.uid !== 0) {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,15 @@
<template>
<div>
<div>
<div class="tab_post">
<el-button
size="mini"
type="success"
plain
icon="el-icon-tickets"
@click="showdetaileditor(detailMes)"
style="padding:6px;margin-left: 0px;position: absolute;bottom: -32px;left: 0px;"
> Detailed for MS</el-button
>
<div v-for="(item, index) in tabsList" @click="jumpTab(index, item)" :class="tabName == item.refName ? 'P_style' : ''">
<h5>
<span>{{ index + 1 }}</span>
@@ -10,12 +18,34 @@
<p>{{ item.rongCont }}</p>
<div class="line"></div>
</div>
<div style="margin: 30px 0 0 0">
<div style="margin: 20px 0 0 0">
<el-button type="primary" @click="pushOnline(detailMes)" style="width: 220px">
<i class="el-icon-finished"></i>
Push Online
</el-button>
<div class="editorial_advisory_board" style="margin: 12px 0 0" v-if="finalReview">
<li>Editorial Advisory Board :
<template v-if="finalReview.reviewer_id">
<span style="font-weight: bold;color: #333;" v-if="finalReview.realname">{{finalReview.realname}}</span>
<span style="font-weight: bold;color: #333;" v-else>No reviewer name</span>
</template>
<span v-else>No</span>
</li>
<template v-if="finalReview.reviewer_id">
<li>Received : {{ finalReview.received_time? finalReview.received_time : 'No Time' }}</li>
<li>Revision : {{ finalReview.revision_time? finalReview.revision_time : 'No Time' }}</li>
<li>Accepted : {{ finalReview.accepted_time? finalReview.accepted_time : 'No Time' }}</li>
<li>Available online : {{ finalReview.available_online? finalReview.available_online : 'No Time' }}</li>
</template>
</div>
</div>
</div>
<div
@@ -101,6 +131,35 @@
<el-form-item label="Author Contribution :" prop="author_contribution">
<el-input v-model="detailMes.author_contribution"></el-input>
</el-form-item>
<el-form-item label="Abstract :" prop="abstract">
<template slot="label">
<span style="color: #f56c6c; margin-right: 4px">*</span>Abstract :
</template>
<tinymce
type="Abstract"
:height="160"
:id="id"
ref="tinymceChild1"
:wordStyle="`p{font-size: 13px;}`"
:isAutomaticUpdate="true"
@getContent="getContent"
@updateChange="updateChange"
:value="abstract"
class="paste-area text-container"
:toolbar="['bold italic |customBlue removeBlue|myuppercase myuppercasea Line|subscript superscript|clearButton']"
style="
line-height: 12px;
overflow: auto;
font-size: 13px; /* 字体大小 */
margin-top: 0pt; /* 段前间距 */
margin-bottom: 0pt; /* 段后间距 */
"
></tinymce>
<!-- <quill-editor ref="myTextEditor" v-model="detailMes.abstract" :options="editorOption"> </quill-editor> -->
</el-form-item>
</el-form>
<div style="text-align: center; margin: 25px 0 0 0">
<el-button type="primary" @click="ZsSaveMes" style="width: 400px; margin-right: 20px">
@@ -193,13 +252,13 @@
<el-form-item label="Affiliated organization :">
<el-checkbox-group v-model="addFomauthor.organs" class="suoshu_jigou">
<el-checkbox
v-for="item in mechanism"
v-for="(item,index) in mechanism"
style="display: block"
name="type"
:label="item.p_article_organ_id"
:key="item.p_article_organ_id"
>
{{ item.organ_name }}
<span style="margin-right:4px ;">{{ index+1 }}. </span> {{ item.organ_name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
@@ -259,12 +318,12 @@
<el-form-item label="Affiliated organization :">
<el-checkbox-group v-model="editFomauthor.organs" class="suoshu_jigou">
<el-checkbox
v-for="item in mechanism"
v-for="(item,index) in mechanism"
style="display: block"
:label="item.p_article_organ_id + ''"
:key="item.p_article_organ_id"
>
{{ item.organ_name }}
<span style="margin-right:4px ;">{{ index+1 }}. </span> {{ item.organ_name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
@@ -303,6 +362,7 @@
</h4>
<!-- 机构列表 -->
<el-table :data="schoolData" border class="table" ref="multipleTable" header-cell-class-name="table-header">
<el-table-column type="index" label="No." width="55" align="center"></el-table-column>
<el-table-column prop="organ_name" label="Affiliation"></el-table-column>
<el-table-column label="" width="190" align="center">
<template slot-scope="scope">
@@ -744,9 +804,7 @@
<h5 style="font-size: 16px; margin: 0 0 30px 0; letter-spacing: -0.5px">Improve information</h5>
<!-- 时间Doi简介信息 -->
<el-form ref="Abs_Form" :model="detailMes" :rules="rules" label-width="150px" style="margin-top: 30px">
<el-form-item label="Abstract :" prop="abstract">
<quill-editor ref="myTextEditor" v-model="detailMes.abstract" :options="editorOption"> </quill-editor>
</el-form-item>
<el-form-item label="Doi :" prop="doi">
<span>https://doi.org/10.53388/</span>
<el-input v-model="detailMes.doi" style="margin-left: 10px; width: 325px"> </el-input>
@@ -959,10 +1017,11 @@ import PreIngestedEditorProduce from './PreIngestedEditorProduce.vue';
import comArtHtmlCreatNewProduce from './comArtHtmlCreatNewProduce.vue';
import commonTopic from '../page/components/article/topic.vue';
import commonRelated from '../page/components/article/Related.vue';
import Tinymce from '@/components/page/components/Tinymce';
export default {
data() {
return {
finalReview: null,
baseUrl: this.Common.baseUrl,
mediaUrl: this.Common.mediaUrl,
p_article_id: this.$route.query.id,
@@ -1027,8 +1086,10 @@ export default {
],
detailMes: {
type: '',
journal_special_id: 'None'
journal_special_id: 'None',
},
abstract: '',
opInstal: [],
// opMedical: [
// {
@@ -1307,13 +1368,13 @@ export default {
trigger: 'blur'
}
],
abstract: [
{
required: true,
message: 'Please enter abstract',
trigger: 'blur'
}
],
// abstract: [
// {
// required: true,
// message: 'Please enter abstract',
// trigger: 'blur'
// }
// ],
keywords: [
{
required: true,
@@ -1399,11 +1460,54 @@ export default {
this.getHight();
window.addEventListener('resize', this.getHight);
this.getData();
this.getAuthorJG();
this.getCount();
this.getWorldPdf();
},
methods: {
getArticleFinal(id){
// api/Finalreview/getRecord
this.$api
.post('api/Finalreview/getRecord', {
article_id: id,
// article_id: 6075
})
.then((res) => {
console.log('res at line 1460:', res)
if (res.status == 1) {
this.finalReview = res.data;
}else{
this.finalReview = {reviewer_id: null};
}
})
},
updateChange(content){
this.abstract = content
},
getTinymceContent(type) {
this.$refs.tinymceChild1.getContent(type);
},
getContent(type, content) {
console.log('content at line 1449:', content)
console.log('type at line 1449:', type)
},
// 跳转文章详情
showdetaileditor(data) {
this.$router.push({
path: 'articleDetailEditor',
query: {
id: data.article_id
}
});
},
allLoad() {
let excelList = [
'https://submission.tmrjournals.com/public/manuscirpt/20220831/c7d75d49bf25cf56906d56d07e00a31e.docx',
@@ -1441,7 +1545,7 @@ export default {
this.addFomauthor.p_article_id = this.p_article_id;
this.addFomschool.p_article_id = this.p_article_id;
this.UpTypeFile.p_article_id = this.p_article_id;
this.abstract = ''
const loading = this.$loading({
lock: true,
text: 'Loading...',
@@ -1455,8 +1559,9 @@ export default {
.then((res) => {
if (res.code == 0) {
this.detailMes = res.data.production;
this.abstract = res.data.production.abstract;
this.UpTyFIle = res.data.production.file_pdf;
this.getArticleFinal(res.data.production.article_id);
if (res.data.production.icon != '') {
this.imageUrl = this.mediaUrl + 'articleicon/' + res.data.production.icon;
}
@@ -1740,17 +1845,64 @@ export default {
neYStage(e) {
return e.stage_year + ' Vol.' + e.stage_vol + ' issue.' + e.stage_no + e.stage_pagename + e.stage_page;
},
async abstractFormat(content) {
content = this.$commonJS.transformHtmlString(content);
var div = document.createElement('div');
div.innerHTML = content;
// 1. 剔除所有 img 标签
var imgTags = div.getElementsByTagName('img');
for (var i = imgTags.length - 1; i >= 0; i--) {
imgTags[i].parentNode.removeChild(imgTags[i]);
}
// 2. 新增:剔除所有 table 相关标签table、tr、td
var tableTags = div.getElementsByTagName('table');
for (var i = tableTags.length - 1; i >= 0; i--) {
tableTags[i].parentNode.removeChild(tableTags[i]);
}
// 3. 替换 strong → b、em → i原有逻辑
var strongTags = div.getElementsByTagName('strong');
for (var i = 0; i < strongTags.length; i++) {
var bTag = document.createElement('b');
bTag.innerHTML = strongTags[i].innerHTML;
strongTags[i].parentNode.replaceChild(bTag, strongTags[i]);
}
var emTags = div.getElementsByTagName('em');
for (var i = 0; i < emTags.length; i++) {
var iTag = document.createElement('i');
iTag.innerHTML = emTags[i].innerHTML;
emTags[i].parentNode.replaceChild(iTag, emTags[i]);
}
// 处理 p 标签 + 解码
content = div.innerHTML;
content = content.replace(/^<p>\s*(.*?)\s*<\/p>$/, '$1').trim();
content = await this.$commonJS.decodeHtml(content);
return content;
},
// 1----保存稿件信息
ZsSaveMes() {
async ZsSaveMes() {
var abstractStr = "";
if (this.detailMes.journal_stage_id == 0) {
this.$message.error('Please select an installment!');
return;
}
if (this.abstract == "") {
this.$message.error('Please input abstract!');
return;
} else{
abstractStr = await this.abstractFormat(this.abstract);
}
console.log('abstractStr at line 1820:', abstractStr)
this.$refs.Mes_Form.validate((valid) => {
if (valid) {
this.$api
.post('api/Production/editProduction', this.detailMes)
.post('api/Production/editProduction', {...this.detailMes,abstract:abstractStr})
.then((res) => {
if (res.code == 0) {
this.$message.success(`Successfully save the article!`);
@@ -2260,7 +2412,7 @@ export default {
this.$api
.post('api/Production/editArticleLast', {
p_article_id: this.detailMes.p_article_id,
abstract: this.detailMes.abstract,
// abstract: this.detailMes.abstract,
doi: this.detailMes.doi,
pub_date: this.detailMes.pub_date
})
@@ -2853,9 +3005,9 @@ export default {
// 判断滚动条滚动距离是否大于当前滚动项可滚动距离
let judge = e.target.scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop;
if (judge) {
console.log('judge at line 2846:', judge)
this.tabIndex = i.toString();
console.log('this.tabIndex at line 2848:', this.tabIndex)
// 找对应的tab-name值
this.tabName = this.tabsList[this.tabIndex].refName;
// this.tabClick = this.tabsList[this.tabIndex].refName
@@ -2865,12 +3017,13 @@ export default {
},
getHight() {
this.contentStyleObj.height = window.innerHeight - 120 + 'px';
this.contentStyleObj.height = window.innerHeight - 140 + 'px';
// this.jumpTab(0,this.tabsList[0])
}
},
components: {
quillEditor,
Tinymce,
PreIngestedEditorProduce,
comArtHtmlCreatNewProduce,
commonTopic,
@@ -2878,7 +3031,15 @@ export default {
}
};
</script>
<style scoped>
.editorial_advisory_board {
margin-bottom: 20px;
list-style: none;
line-height: 18px;
color: #888;
font-size: 12px;
}
</style>
<style>
.handle-box {
margin-bottom: 20px;
@@ -2892,7 +3053,7 @@ export default {
background-color: #fafafa;
position: absolute;
left: 25px;
top: 60px;
top: 40px;
width: 220px;
z-index: 50;
}

View File

@@ -11,7 +11,7 @@
</el-breadcrumb>
</div>
<div class="container">
<div class="handle-box" v-if="articleBaseInfo.state != 7">
<div class="handle-box" v-if="[1,2,4,8].includes(articleBaseInfo.state)">
<div>
<el-button type="primary" icon="el-icon-plus" @click="openAddRev">Reviewer Bank</el-button>
@@ -120,7 +120,7 @@
></el-pagination>
</div>
</div>
<el-dialog title="Add Suggest Reviewer" :visible.sync="AddSuggest" width="800px" :close-on-click-modal="false">
<el-dialog title="Add Suggest Reviewer" :visible.sync="AddSuggest" width="1200px" :close-on-click-modal="false">
<el-table
:data="tableSuggest"
border
@@ -130,9 +130,10 @@
header-cell-class-name="table-header"
empty-text="New messages (0)"
>
<el-table-column prop="account" label="Email"></el-table-column>
<el-table-column prop="realname" label="Realname"></el-table-column>
<el-table-column prop="cmajor" label="Major"></el-table-column>
<el-table-column prop="account" label="Email" width="180"></el-table-column>
<el-table-column prop="realname" label="Realname" width="180"></el-table-column>
<el-table-column prop="company" label="Affiliation"></el-table-column>
<el-table-column prop="cmajor" label="Major" width="300"></el-table-column>
<el-table-column label="" width="120" align="center">
<template slot-scope="scope">
<el-button size="mini" type="primary" plain icon="el-icon-check" @click="selSuggest(scope.row)"> Select</el-button>

View File

@@ -8,8 +8,8 @@
</div>
<div class="container">
<el-row :gutter="10">
<el-col :span="16">
<div class="form-box">
<el-col :span="20">
<div class="form-box" style="width: 100%;">
<el-form ref="articleform" :model="detailDate" label-width="130px">
<el-form-item label="Article">
<span>{{ detailDate.article }}</span>
@@ -23,15 +23,176 @@
<el-form-item label="CreateTime">
<span>{{ formatDate(detailDate.ctime) }}</span>
</el-form-item>
<el-form-item label="Status">
<el-form-item label="Disclose name or anonymous" label-width="200px">
<span v-if="reviewList.length > 0&&reviewList[0].is_anonymous == 0">Disclose name</span>
<span v-if="reviewList.length > 0&&reviewList[0].is_anonymous == 1">Remain anonymous</span>
</el-form-item>
<!-- <el-form-item label="Status">
<span>{{ mystate(detailDate.state) }}</span>
<el-button style="margin-left: 10px" type="text" @click="dialogFormVisible = true" icon="el-icon-view"
>See Feedback</el-button
>
</el-form-item>
</el-form-item> -->
<el-form-item v-if="canRepeat == 1">
<el-button type="primary" @click="createRevision">Re-review</el-button>
</el-form-item>
<div v-if="reviewList.length > 0" style="margin-top: 40px;">
<div class="clearfix fsheader">
<h4>Peer-review Archive</h4>
</div>
<!-- 初审 -->
<div class="art_author_">
<div class="fixCard reviewer_decision" style="position: relative">
<div class="overflow-x-auto">
<table class="review_table">
<thead>
<tr>
<th></th>
<!-- 表头遍历评审者 -->
<template v-for="(iken, reviewerIndex) in reviewList">
<th>Status
</th>
<th>Time
</th>
<th>Response time
</th>
<th>Comments
</th>
</template>
</tr>
</thead>
<tbody>
<!-- 遍历评审轮次1st + 重复轮次 -->
<tr >
<td>1<sup>st</sup> review</td>
<!-- 遍历每个评审者的1st评审结果 -->
<template v-for="(iken, reviewerIndex) in reviewList">
<td style="cursor: pointer;">
<span style="display: inline-block; margin-left: 4px; margin-right: 8px">
<font
v-if="iken.recommend == 1 || iken.recommend == 2"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #67c23a;
"
>
</font>
<font
v-if="iken.recommend == 3|| iken.recommend == 4"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #f56c6c;
"
>
</font>
</span>
<span v-if="iken.recommend == 1">Minor</span>
<span v-else-if="iken.recommend == 2">Major</span>
<span v-else-if="iken.recommend == 3">reject and resubmission</span>
<span v-else-if="iken.recommend == 4">Reject</span>
</td>
<td>
<p style="line-height: 30px;" v-if="iken.ctime > 0">{{ iken.ctime | formatDatehms }}</p>
<p v-else style="" class="stime">Response time: Re-reviewing...</p>
</td> <td></td>
<td style="">
<el-button
style="margin-left: 10px"
type="text"
@click="showUnderReview(iken.question)"
icon="el-icon-view"
>Details</el-button
>
</td>
</template>
</tr>
<!-- 遍历重复评审轮次2nd3rd... -->
<template v-for="(round, index1) in maxRepeatReviewCount()">
<tr>
<td>{{ index1 + 2 }}<sup>nd</sup> review</td>
<!-- 遍历每个评审者在该轮次的结果 -->
<template v-for="(iken, reviewerIndex) in reviewList">
<td style="">
<span style="cursor: pointer"
v-if="Array.isArray(iken.repeat) && iken.repeat[index1]"
>
<span style="display: inline-block; margin-left: 4px; margin-right: 8px">
<font
v-if="iken.repeat[index1].recommend == 1"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #67c23a;
"
>
</font>
<font
v-if="iken.repeat[index1].recommend == 2"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #f56c6c;
"
>
</font>
<font
v-if="iken.repeat[index1].recommend == 3"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #006699;
"
>
</font>
</span>
<span v-if="iken.repeat[index1].recommend == 1">Accept</span>
<span v-else-if="iken.repeat[index1].recommend == 2">Reject</span>
<span v-else-if="iken.repeat[index1].recommend == 3">Revision</span>
<span v-else>No reply</span>
</span>
<span v-else>-</span>
</td>
<td>
<p style="line-height: 30px;" v-if="iken.repeat[index1].ctime > 0">{{ iken.repeat[index1].ctime | formatDatehms }}</p>
</td>
<td><p style="line-height: 30px;" v-if="iken.repeat[index1].stime > 0">{{ iken.repeat[index1].stime | formatDatehms }}</p>
<p v-else style="" class="stime">Re-reviewing...</p></td>
<td>
<el-button v-if="[1,2,3].includes(iken.repeat[index1].recommend)"
style="margin-left: 10px"
type="text"
@click="showSecondReview(iken.repeat[index1].question)"
icon="el-icon-view"
>Details</el-button
>
</td>
</template>
</tr>
</template>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- <el-form-item label="Article file">
<el-popover placement="right" width="350" trigger="click">
<el-table :data="articlefileList">
@@ -751,6 +912,7 @@ export default {
FdialogFormVisible: false,
dialogFormVisible1: false,
recordList: [],
reviewList: [],
journal_id: null,
baseUrl: this.Common.baseUrl,
mediaUrl: this.Common.mediaUrl,
@@ -812,11 +974,44 @@ export default {
created: function () {
this.getDate();
this.initFileList();
this.initquesion();
this.getHistoryList();
},
computed: {},
methods: {
maxRepeatReviewCount() {
if (!this.reviewList || !Array.isArray(this.reviewList)) return null; // 边界处理无数据返回null
// 遍历所有评审者找到repeat数组长度最大的那条数据
const maxItem = this.reviewList.reduce((maxItem, currentItem) => {
// 计算当前项的repeat长度非数组则视为0
const currentLen = Array.isArray(currentItem.repeat) ? currentItem.repeat.length : 0;
// 计算当前最大项的repeat长度非数组则视为0
const maxLen = Array.isArray(maxItem.repeat) ? maxItem.repeat.length : 0;
// 如果当前项长度更大,则更新最大项
return currentLen > maxLen ? currentItem : maxItem;
}, {}); // 初始值设为一个空对象
// console.log('maxItem at line 2142:', maxItem.repeat.length)
return maxItem && maxItem.repeat ? maxItem.repeat.length : 0;
},
getReviewList() {
this.$api
.post('api/Finalreview/getArticleFinalReview', {
article_id: this.articleId
})
.then(async (res) => {
if (res.status == 1) {
if (res.status == 1) {
// this.reviewList = res.data.review.filter(e=>e.art_rev_id==this.questionform.art_rev_id);
}
}
})
.catch((err) => {});
},
// 显示复审对话框
showSecondReview(item) {
this.FdialogFormVisible = true;
@@ -853,18 +1048,73 @@ export default {
this.FdialogFormVisible = false;
this.ReReviewQuestion = {};
},
// 2. 定义所有必需字段(确保所有数据结构统一)
// 3. 核心函数:提取第一个元素,剩余放入 repeat
splitQuestion(questionArr = []) {
const requiredFields = [
'rev_qu_id', 'art_rev_id', 'type',
'art_rev_rep_id', 'recommend', 'score', 'state',
'reviewer_id', 'realname', 'ctime', 'stime','is_anonymous'
];
// 解构数组firstItem 取第一个元素restItems 取剩余所有元素
const [firstItem = {}, ...restItems] = questionArr;
// 工具函数:补全单个对象的必需字段(空值用 null 填充)
const completeFields = (item) => {
console.log('item at line 1056:', item)
const result = {question:item};
requiredFields.forEach(field => {
result[field] = item[field] ? item[field]: '';
});
return result;
};
// 补全第一个元素的字段
const firstCompleted = completeFields(firstItem);
// 补全剩余元素的字段,存入 repeat 数组
const repeat = restItems.map(item => completeFields(item));
// 返回结果:按需选择格式(二选一)
return {...firstCompleted, repeat: repeat}
},
// 获取历史审稿列表
getHistoryList() {
async getHistoryList() {
this.loading = true;
this.$api
.post('api/Reviewer/getReviewerRepeatDetail', {
art_rev_id: this.$route.query.id
})
.then((res) => {
.then(async(res) => {
this.loading = false;
if (res.code == 0) {
// this.reviewList=[{...res.data.art_rev_info}]
if (res.data.art_rev_info.question && res.data.art_rev_info.question[0] != null) {
this.recordList = res.data.art_rev_info.question.reverse();
// 4. 调用函数得到结果
this.reviewList = [await this.splitQuestion(res.data.art_rev_info.question)];
if(this.reviewList.length>0){
this.$api
.post('api/Workbench/updateArticleState', {
article_id: res.data.article_info.article_id,
act_p_id: this.$route.query.id,
type: '1,2',
account: localStorage.getItem('U_name')
})
}
console.log('at line 1094:', this.reviewList)
// this.recordList = res.data.art_rev_info.question.reverse();
}
} else {
this.$message.error(res.msg);
@@ -937,6 +1187,7 @@ export default {
this.canRepeat = res.can_repeat;
this.journal_id = res.journal_id;
this.articleId = res.article_id;
this.getReviewList()
})
.catch((err) => {
console.log(err);
@@ -1039,6 +1290,15 @@ export default {
this.$message.error('服务器上传错误' + res.msg);
}
},
handleClick(item) {
console.log('item at line 1228:', item);
this.$router.push({
path: 'articleReviewerDetail',
query: {
id: item.art_rev_id
}
});
},
formatDate(timestamp) {
var date = new Date(timestamp * 1000); //时间戳为10位需*1000时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-';
@@ -1101,5 +1361,41 @@ export default {
}
::v-deep .el-dialog__body{
padding: 10px 20px 20px !important;
}.review_table {
width: 100%;
background-color: #fff;
/* margin-top: 10px; */
border-collapse: collapse; /* 合并表格边框 */
}
.review_table th,
td {
padding: 6px;
min-width: 70px;
border: 1px solid #ddd;
text-align: left;
}
.review_table th {
font-size: 14px;
background-color: #f0f0f0;
}
.review_table td {
font-size: 14px;
/* background-color: #f0f0f0; */
}
.review_table th:first-child, .review_table td:first-child {
width: 100px;
/* 内容过长时自动换行 */
word-wrap: break-word;
/* 强制在单词内换行(针对长单词) */
word-break: break-all;
}
.review_table tr:hover {
/* background-color: #fff; */
}
.overflow-x-auto {
overflow-x: auto;
}
</style>

View File

@@ -26,15 +26,15 @@
<template v-if="detailDate.article_final">
<el-form-item label="Comment for authors : " prop="suggest_for_author">
<div style="color: #888;" :class="{ 'short-content': !showFullContent1 }"
@click="showFullContent1=!showFullContent1">
<div style="color: #888;"
>
{{ detailDate.article_final.suggest_for_author? detailDate.article_final.suggest_for_author : 'No comment' }}
</div>
</el-form-item>
<el-form-item label="Comment for editor : " prop="suggest_for_editor">
<div style="color: #888;" :class="{ 'short-content': !showFullContent2 }"
@click="showFullContent1=!showFullContent2">
<div style="color: #888;"
>
{{ detailDate.article_final.suggest_for_editor? detailDate.article_final.suggest_for_editor : 'No comment' }}
</div>
</el-form-item>

View File

@@ -696,7 +696,7 @@ export default {
//获取内容
async getContent(type) {
var content = window.tinymce.get(this.tinymceId).getContent();
console.log('content at line 627:', content);
content = content.replace(/<span[^>]*>/g, '').replace(/<\/span>/g, ''); // 去除span标签
content = content.replace(/<strong>/g, '<b>').replace(/<\/strong>/g, '</b>');

View File

@@ -27,12 +27,13 @@
<div class="journal-dropdown" v-if="showDropdown && filteredJournals.length">
<div class="journal-item" v-for="journal in filteredJournals" :key="journal.id" @click="selectJournal(journal)">
<div class="flexBox alignCenter justBetween">
<img
<img v-if="journal.journal_icon"
:src="journalUrl+journal.journal_icon"
:alt="journal.title"
class=""
style="width: 35px; height: 45px"
/>
<img src="" alt="" v-else style="background-color: #e0e0e0;width: 35px; height: 45px">
<div class="journal-title">{{ journal.title }}</div>
</div>
</div>
@@ -87,7 +88,7 @@ export default {
},
data() {
return {
journalUrl: 'https://www.tmrjournals.com/public/journalicon/',
journalUrl: '',
searchTerm: '',
showDropdown: false,
selectedJournal: null,

View File

@@ -45,16 +45,9 @@
<script>
export default {
props: {
userId: {
type: String,
default: ''
},
articleId: {
type: String,
default: ''
}
},
props: ['userId','articleId'],
data() {
return {
rules1:{},

View File

@@ -240,7 +240,6 @@ export default {
.then((res) => {
console.log('res at line 222:', res);
if (res.code == 0) {
window.location.href = res.data.detail.paystation_url;
loading.close();
} else {

View File

@@ -1,25 +1,28 @@
<template>
<div class="success-box" v-if="articleInfo.order_sn">
<div class="payment-success">
<div class="success-box" v-if="articleInfo&&(articleInfo.state==0||articleInfo.state==1)">
<div :class="{'payment-success': articleInfo.state==1, 'payment-failed': articleInfo.state==0}">
<div style="display: flex; align-items: center; margin-bottom: 10px">
<h2 style="margin: 0 auto; display: flex; align-items: center">
<img src="@/assets/img/success.png" alt="" style="margin-right: 20px; width: 128px; height: 128px" />Payment Successful
</h2>
<img v-if="articleInfo.state==1" src="@/assets/img/success.png" alt="" style="margin-right: 20px; width: 128px; height: 128px" />
<img v-if="articleInfo.state==0" src="@/assets/img/error.png" alt="" style="margin-right: 20px; width: 128px; height: 128px" />
{{ articleInfo.state==1 ? 'Payment Successful' : 'Payment Failed' }}
</h2>
</div>
<p>Thank you for your payment. Your order has been successfully processed.</p>
<p>
<p v-if="articleInfo.state==1">Thank you for your payment. Your order has been successfully processed.</p>
<p v-else>We are sorry, but your payment has failed. Please try again.</p>
<!-- <p>
Article ID:
<span style="color: #333; font-weight: 600"> {{ articleInfo.order_sn }}</span>
</p>
<p>
</p> -->
<p v-if="articleInfo.state==1">
Total Amount: <span style="color: #ff5000"></span
><span style="color: #ff5000; font-size: 24px; line-height: 24px">{{ formatAmount(total) }} <span class="" style="font-size: 20px;">{{ articleInfo.paystation.currency }}</span></span>
</p>
<!-- <p>Payment Method: {{ paymentMethod }}</p> -->
<p>You will receive an email confirmation shortly.</p>
<button @click="goBack">Continue Operation</button>
<p style="color: #67c23a; font-size: 13px; line-height: 40px">Automatically jump after {{ hideSec }} seconds</p>
<p v-if="articleInfo.state==1">You will receive an email confirmation shortly.</p>
<button @click="goBack" :class="articleInfo.state==1?'btn-success':'btn-danger'">Continue Operation</button>
<p :style="articleInfo.state==1?'color:#67c23a':'color:#F56C6C'" style="font-size: 13px; line-height: 40px">Automatically jump after {{ hideSec }} seconds</p>
</div>
</div>
</template>
@@ -49,18 +52,27 @@ export default {
},
methods: {
hideAlert() {
this.dingshi = setInterval(() => {
this.dingshi = setInterval(() => {
this.hideSec -= 1;
// console.log(this.hideSec)
if (this.hideSec == 0) {
if (this.hideSec == 1) {
this.goBack();
return false
}
// console.log(this.hideSec)
}, 1000);
},
formatAmount(amount) {
return amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
},
getDetail() {
const loading = this.$loading({
lock: true,
text: 'Querying payment results...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.$api
.post(this.urlList.detail, {
article_id: this.articleId
@@ -68,11 +80,16 @@ export default {
.then((res) => {
console.log('res at line 191:', res);
if (res.code == 0) {
this.articleInfo = res.data.order;
// this.journalInfo = res.data.journal_detail;
setTimeout(() => {
loading.close();
this.articleInfo = res.data.order;
this.total = Number(res.data.order.paystation.amount / 100);
}, 1000);
}
}).catch(() => {
loading.close();
});
},
goBack() {
@@ -119,6 +136,18 @@ export default {
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* 添加阴影效果 */
width: 600px;
}
.payment-failed {
margin-top: 40px;
margin: 0 auto;
text-align: center;
padding: 20px;
background-color: #fff;
border: 1px solid #fcc3c3;
border-radius: 16px;
color: #F56C6C;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* 添加阴影效果 */
width: 600px;
}
h2 {
margin-bottom: 20px;
@@ -130,7 +159,7 @@ p {
button {
padding: 10px 20px;
background-color: #00c286;
color: #fff;
border: none;
border-radius: 5px;
@@ -138,9 +167,20 @@ button {
margin-top: 20px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); /* 按钮添加阴影效果 */
}
.btn-success{
background-color: #00c286;
}
.btn-danger{
background-color: #F56C6C;
}
.btn-success:hover{
background-color: #00c286;
}
.btn-danger:hover{
background-color: #F56C6C;
}
button:hover {
background-color: #00c286;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); /* 按钮悬停时的阴影效果 */
}
.success-box {

View File

@@ -74,34 +74,62 @@
Batch Add content
</li>
</ul>
</div> --> <li
v-if="isEditComment&&!isPreview&&activeName=='proofreading'"
style="border-radius: 4px;cursor: pointer;
height: 26px;margin-left:30px;line-height: 26px;padding: 2px 10px;background-color: #006699 !important; color: #fff; border: 1px solid #006699;position: absolute;left: 0"
@click="handleClickAI()"
>
</div> -->
Manuscirpt AI Proofreading
</li>
<li
style="
list-style: none;
height: 26px;
display: flex;
align-items: center;
position: absolute;
left: 10px;
"
> <el-button
@click="handleUncheck"
v-if="!isPreview"
style=""
plain
type="info"
>{{ $t('commonTable.Uncheck') }}</el-button
>
<div @click="handleClickAI()" v-if="isEditComment && !isPreview && activeName == 'proofreading'"
style="
font-size: 12px;
border-radius: 4px;
cursor: pointer;
margin-left: 10px;
line-height: 26px;
padding: 2px 10px;
background-color: #006699 !important;
color: #fff;
border: 1px solid #006699;
">{{ $t('commonTable.ManuscirptAIProofreading') }}</div>
</li>
</div>
<div style="padding: 0 0px; float: right">
<ul class="operateBox" >
<ul class="operateBox">
<div style="border-right: 1px solid #d8d8d8; padding: 0 20px">
<ul class="HTitleBox" style="border: none">
<li @click="addContent" style="font-size: 14px; padding: 0; background-color: #fff !important; color: #333">
<li @click="addContent" style="font-size: 12px; padding: 0; background-color: #fff !important; color: #333">
<i class="el-icon-document" style="margin-right: 2px"> </i>
Batch Add content
{{ $t('commonTable.BatchAddcontent') }}
</li>
</ul>
</div>
<li style="background-color: #cbccd1 !important; color: #333; border: 1px solid #cbccd1" @click="onAddRow">
<li style="background-color: #cbccd1 !important;font-size: 12px; color: #333; border: 1px solid #cbccd1" @click="onAddRow">
<i class="el-icon-document-add" style="margin-top: 2px"></i>
Row
{{ $t('commonTable.Row') }}
</li>
<!-- <li style="" @click="onEdit">
@@ -110,10 +138,10 @@
Edit
</li> -->
<li style="background-color: #fc625d !important" @click="onDelete">
<li style="background-color: #fc625d !important;font-size: 12px;" @click="onDelete">
<i class="el-icon-delete" style="margin-top: 2px"></i>
Delete
{{ $t('commonTable.delete') }}
</li>
</ul>
</div>
@@ -137,21 +165,23 @@
position: relative;
"
>
<!-- <div v-if="selectedIds.length > 0" class="selected-to-here">
Selected to here: {{ selectedIds[selectedIds.length - 1] }}
</div> -->
<!-- <common-late-x></common-late-x> -->
<template v-for="(item, index) in wordList">
<template v-for="(item, index) in wordList" >
<el-checkbox
@change="updateUniqueIds"
v-if="!isPreview"
v-model="item.checked"
@change="(e)=>updateUniqueIds(e,item.am_id)"
v-if="!isPreview"
:value="isChecked(item.am_id)"
style="position: absolute; left: -20px; width: 8px; height: 8px; margin-top: 8px; z-index: 10"
></el-checkbox>
<span
@click="handleClickProofreadingList([item.am_id])"
v-if="!isPreview&&
v-if="
!isPreview &&
isEditComment &&
item.proof_read_num &&
item.proof_read_num > 0 &&
@@ -175,7 +205,14 @@
>
<span
@click="handleClickProofreadingList([item.am_id])"
v-if="!isPreview&&isEditComment && item.proof_read_num == -1 && item.is_proofread == 1 && item.type == 0 && item.content != ''"
v-if="
!isPreview &&
isEditComment &&
item.proof_read_num == -1 &&
item.is_proofread == 1 &&
item.type == 0 &&
item.content != ''
"
style="
z-index: 2;
background-color: #fff;
@@ -192,7 +229,14 @@
></span>
<span
@click="handleClickProofreadingList([item.am_id])"
v-if="!isPreview&&isEditComment && item.proof_read_num == 0 && item.is_proofread == 1 && item.type == 0 && item.content != ''"
v-if="
!isPreview &&
isEditComment &&
item.proof_read_num == 0 &&
item.is_proofread == 1 &&
item.type == 0 &&
item.content != ''
"
style="
z-index: 2;
background-color: #fff;
@@ -209,7 +253,7 @@
></span>
<span
@click="handleClickProofreadingList([item.am_id])"
v-if="!isPreview&&isEditComment && item.is_proofread == 2 && item.type == 0 && item.content != ''"
v-if="!isPreview && isEditComment && item.is_proofread == 2 && item.type == 0 && item.content != ''"
style="
z-index: 2;
background-color: #fff;
@@ -449,7 +493,7 @@
</div>
<div class="pagination-box" style="" v-if="isEditComment && activeName == 'proofreading'">
<el-tooltip
v-if="totalItems > 0&&totalNumbers>0"
v-if="totalItems > 0 && totalNumbers > 0"
class="item"
effect="dark"
:content="`There are ${totalItems} paragraphs with unresolved errors in the Manuscirpt`"
@@ -1020,11 +1064,6 @@
</el-tabs>
</div>
<!-- <form method="post"> -->
<!-- </form> -->
<!-- <textarea class="tinymce-textarea" :id="tinymceId"></textarea> -->
<div v-if="isMenuVisible" class="context-menu" :style="{ top: `${menuPosition.y}px`, left: `${menuPosition.x}px` }">
<ul>
@@ -1210,7 +1249,7 @@ b span{
border-top:none;mso-border-top-alt:none !important;
border-bottom:none !important;
mso-border-bottom-alt:none !important;
word-break: keep-all !important;
// text-align: justify !important; // 设置两端对齐
@@ -1292,7 +1331,7 @@ export default {
}
},
comments: {
type: Object,
type: [Array, Object], // 允许数组或对象
default() {
return {};
@@ -1409,7 +1448,7 @@ export default {
formLabelWidth: '120px',
hasChange: false,
hasInit: false,
// selectedIds:[],
selectedIds:[],
tinymceId: this.id || 'vue-tinymce-' + +new Date()
};
},
@@ -1417,9 +1456,12 @@ export default {
watch: {
contentList: {
handler(val) {
console.log('val at line 550:', val);
if (val) {
this.wordList = [...this.contentList];
this.wordList = [...this.contentList]
this.selectedIds=[]
console.log('this.selectedIds at line 1460:', this.selectedIds)
this.$forceUpdate()
if (this.isEditComment && this.activeName == 'proofreading') {
this.calcMarkers();
}
@@ -1433,7 +1475,7 @@ export default {
},
totalNumbers: {
handler(val) {
console.log('val at line 550:', val);
if (val == 0) {
this.markers = [];
}
@@ -1442,7 +1484,7 @@ export default {
}
},
computed: {
sortedProofreadingList() {
sortedProofreadingList() {
const order = [2, 1, 3];
const rank = { 2: 0, 1: 1, 3: 2 };
@@ -1459,9 +1501,10 @@ export default {
return Object.assign({}, group, { data: data.slice().sort(cmp) });
});
},
selectedIds() {
return this.wordList.filter((item) => item.checked).map((item) => item.am_id);
}
// selectedIds() {
// return this.wordList.filter(item => item.checked).map(item => item.am_id);
// }
},
updated() {
// 恢复子组件的滚动位置
@@ -1518,21 +1561,32 @@ export default {
this.editors = {};
},
methods: {
handleClickAI(){
this.$api.post('api/Proofread/proofReadByArticle', {
article_id:this.$route.query.id
}).then(async (res) => {
if (res.status == 1 ) {
this.$message.success(res.msg);
}else{
this.$message.error(res.msg);
}
}).catch((err) => {
this.$message.error(err.message);
})
isChecked(am_id) {
// 返回一个函数,接收 am_id 并判断是否存在
if(this.selectedIds.includes(am_id)){
return true
}else{
return false
}
},
handleClickAI() {
this.$api
.post('api/Proofread/proofReadByArticle', {
article_id: this.$route.query.id
})
.then(async (res) => {
if (res.status == 1) {
this.$message.success(res.msg);
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err.message);
});
},
showcurrentItemIndex() {
var index = this.markers.findIndex((e) => e.am_id == this.currentSelectProofreadingId);
@@ -1598,12 +1652,12 @@ export default {
this.wordList[refreshDataIndex].proof_read_num = res.data.am_id_count;
}
if (res.data.is_proofread) {
this.wordList[refreshDataIndex].is_proofread = res.data.is_proofread;
}
this.wordList[refreshDataIndex].is_proofread = res.data.is_proofread;
}
this.$forceUpdate();
}
console.log('this.totalNumbers at line 1474:', this.totalNumbers);
this.$forceUpdate();
}
});
@@ -1646,9 +1700,7 @@ export default {
this.markers = out.sort((a, b) => a.top - b.top);
if (this.markers.length > 0) {
this.totalItems = this.markers.length;
console.log('this.totalItems at line 1540:', this.totalItems);
// this.currentItem = 1;
// await this.getProofreadingList([this.markers[this.currentItem - 1].am_id]);
}
},
@@ -1774,28 +1826,27 @@ export default {
},
handleClick(tab, event) {
console.log(tab, event);
if(this.isEditComment){
if (tab.index == 0) {
this.activeName == 'proofreading';
this.isShowPiZhu = false;
this.currentItem = 1;
this.initMarkersList();
if (this.isEditComment) {
if (tab.index == 0) {
this.activeName == 'proofreading';
this.isShowPiZhu = false;
this.currentItem = 1;
this.initMarkersList();
} else {
this.proofreadingList = [];
this.markers = [];
this.currentSelectProofreadingId = '';
this.activeName == 'Comment';
this.isShowPiZhu = true;
}
} else {
this.proofreadingList = [];
this.markers = [];
this.currentSelectProofreadingId = '';
this.activeName == 'Comment';
this.isShowPiZhu = true;
}
}else{
this.proofreadingList = [];
this.markers = [];
this.currentSelectProofreadingId = '';
this.activeName == 'Comment';
this.isShowPiZhu = true;
this.getCommentsData();
}
this.$nextTick(() => {
window.renderMathJax();
@@ -1873,9 +1924,21 @@ export default {
addContent() {
if (this.currentId) {
this.$emit('addContent', this.currentId);
} else {
} else if (this.selectedIds && this.selectedIds.length > 0) {
if (this.selectedIds.length == 1) {
this.$emit('addContent', this.selectedIds[0]);
} else {
this.$message.warning(this.$t('commonTable.selectOne'));
return;
}
}else{
this.$message.warning('Please select content');
return;
}
},
cacheSelection() {
const selection = window.getSelection();
@@ -1965,22 +2028,54 @@ export default {
this.cachedMainId = null;
this.cachedType = null;
},
updateUniqueIds() {
updateUniqueIds(e,am_id) {
this.currentId = null;
this.currentData = {};
console.log('this.selectedIds at line 917:', this.selectedIds);
// this.uniqueIds = [...new Set(this.wordList.filter((item) => item.checked).map((item) => item.am_id))];
// console.log('this.uniqueIds at line 839:', this.selectedIds);
this.$forceUpdate();
if (e ) {
// 数组:不存在则添加
if (!this.selectedIds.includes(am_id)) {
this.selectedIds.push(am_id);
}
} else if (!e ) {
// 数组:存在则删除
const index = this.selectedIds.indexOf(am_id);
if (index > -1) {
this.selectedIds.splice(index, 1);
}
}
this.$forceUpdate();
},
handleUncheck() {
this.currentId = null;
this.currentData = {};
this.selectedIds = [];
this.$forceUpdate()
},
onEdit() {
this.currentData = this.currentData;
this.$emit('onEdit', this.currentId);
},
onAddRow() {
this.currentData = this.currentData;
this.$emit('onAddRow', this.currentId);
if (this.currentId) {
this.$emit('onAddRow', this.currentId);
} else if (this.selectedIds && this.selectedIds.length > 0) {
if (this.selectedIds.length == 1) {
this.$emit('onAddRow', this.selectedIds[0]);
} else {
this.$message.warning(this.$t('commonTable.selectOne'));
return;
}
}else{
this.$message.warning('Please select content');
return;
}
},
onDelete() {
// console.log('this.uniqueIds.length at line 866:', this.selectedIds.length);
@@ -1989,8 +2084,11 @@ export default {
this.$forceUpdate();
}
if (this.currentId) {
else if (this.currentId) {
this.$emit('onDelete', this.currentId);
}else{
this.$message.warning('Please select content');
return;
}
},
@@ -2134,20 +2232,18 @@ export default {
});
},
refreshCurrentData(am_id, newData, type) {
console.log('newData at line 2106:', newData)
console.log('newData at line 2106:', newData);
var refreshData = { ...this.wordList.find((e) => e.am_id == am_id) };
var refreshDataIndex = this.wordList.findIndex((e) => e.am_id == am_id);
if (refreshData.type == 0) {
this.$nextTick(() => {
if (newData.am_id_count || newData.am_id_count == 0) {
this.wordList[refreshDataIndex].proof_read_num = newData.am_id_count;
}
if (newData.sum_count || newData.sum_count == 0) {
this.totalNumbers = newData.sum_count;
}if (type != 'delete') {
}
if (type != 'delete') {
this.wordList[refreshDataIndex].content = newData.content;
this.wordList[refreshDataIndex].text = newData.content;
}
@@ -2434,7 +2530,7 @@ export default {
image_advtab: false, // 禁用图片高级选项卡(防止自动调整大小)
plugins: 'forecolor code paste table image resize ',
content_style: `${tableStyle + this.wordStyle}
`,
entity_encoding: 'raw', // 不编码 > 等字符
menubar: false,
@@ -2540,7 +2636,7 @@ export default {
item.checked = false;
});
if (!this.isPreview) {
if (this.isEditComment&&this.activeName=='proofreading') {
if (this.isEditComment && this.activeName == 'proofreading') {
if (type == 'text') {
this.getProofreadingList([id]);
this.getPList(id);
@@ -2630,35 +2726,31 @@ export default {
await this.goToComment(data.am_id, fn);
},
divOnScroll() {
if (!this.isPreview) {
const sc = this.$refs.scrollDiv; // ★ 用 scrollDiv
var rail = null;
if(this.isEditComment){
rail = this.$refs.rail;
if (this.isEditComment) {
rail = this.$refs.rail;
}
if(this.isEditComment){
if (!sc || !rail) return;
}else{
rail=null
if (this.isEditComment) {
if (!sc || !rail) return;
} else {
rail = null;
if (!sc) return;
}
console.log('sc at line 2618:', sc)
const contentH = sc.scrollHeight,
viewH = sc.clientHeight;
const scrollRange = Math.max(1, contentH - viewH);
if(rail&&this.isEditComment){
const railH = rail.clientHeight;
this.viewportHeight = Math.max(6, railH * (viewH / contentH));
const vpRange = Math.max(1, railH - this.viewportHeight);
this.viewportTop = Math.round(this.mapRange(sc.scrollTop, 0, scrollRange, 0, vpRange));
if (rail && this.isEditComment) {
const railH = rail.clientHeight;
this.viewportHeight = Math.max(6, railH * (viewH / contentH));
const vpRange = Math.max(1, railH - this.viewportHeight);
this.viewportTop = Math.round(this.mapRange(sc.scrollTop, 0, scrollRange, 0, vpRange));
}
this.isMenuVisible = false;
this.currentId = null;
@@ -2906,7 +2998,7 @@ export default {
placeholders.forEach(({ ph, rawHit, ann }) => {
const color = this.getRandomLightColor ? this.getRandomLightColor() : 'rgba(255,240,200,.8)';
const badge = ann.idx + 1;
const span = `<span
const span = `<span
class="remarkbg"
style="background-color:${color};
position:relative;
@@ -2989,7 +3081,7 @@ export default {
placeholders.forEach(({ ph, rawHit, ann }) => {
const color = this.getRandomLightColor ? this.getRandomLightColor() : 'rgba(255,240,200,.8)';
const badge = ann.idx + 1;
const span = `<span
const span = `<span
class="remarkbg"
style="background-color:${color};
position:relative;
@@ -3064,13 +3156,11 @@ export default {
});
},
getCommentsData() {
if (!this.isPreview) {
this.clearHighlight();
const divs = document.querySelectorAll('.pMain');
const visibleDivs = [];
divs.forEach((div) => {
const rect = div.getBoundingClientRect();
// 检查 div 是否部分可见(只要它的任何一部分在视口内)
@@ -3091,7 +3181,7 @@ export default {
});
this.commentList = [];
this.visibleDivs = [...visibleDivs];
console.log('this.visibleDivs at line 3055:', this.visibleDivs)
this.visibleDivs.forEach((e) => {
this.commentList.push({
@@ -3110,7 +3200,7 @@ export default {
this.isEditComment = true;
this.isShowPiZhu = false;
this.activeName = 'proofreading';
this.rightW = 610;
this.rightW = 510;
} else {
this.isEditComment = false;
this.isShowPiZhu = true;
@@ -3126,7 +3216,7 @@ export default {
this.isUserEditComment = false;
this.isShowPiZhu = false;
this.activeName = 'proofreading';
this.rightW = 610;
this.rightW = 510;
}
if (this.isEditComment) {
this.$nextTick(() => requestAnimationFrame(this.initMarkersList));
@@ -4064,7 +4154,7 @@ export default {
display: flex;
}
.operateBox li {
min-width: 55px;
min-width: 50px;
display: flex;
/* flex-direction: column; */
justify-content: space-between;

View File

@@ -18,9 +18,9 @@
<!-- <img src="../../assets/img/icon_5.png" alt="" class="icon_img"> -->
Final Decision
</h2>
In this column, the manuscripts that currently need your comments are displayed. You can click
<!-- In this column, the manuscripts that currently need your comments are displayed. You can click
detail to review
or change your comments.
or change your comments. -->
</div>
<ul class="ta1_uli ta1_ulicad">
<li v-for="(item,index) in tableData1">
@@ -51,7 +51,68 @@
</ul>
</el-col>
<el-col :span="24" v-if="tableData2!=''">
<div style="background-color: #ccc;height: 2px;width: 100%;margin:20px 0 35px 0;"></div>
<!-- <el-card class="box-card"> -->
<div class="ma_title" style="margin-bottom: 5px;">
<h2>
<!-- <img src="../../assets/img/icon_1.png" alt="" class="icon_img"> -->
Invitation for Final Decision
</h2>
This list will show you the manuscript that the editor invited you to Final Decision. You can click on
the details to
check the content and then decide whether to Final Decision the manuscript. In addtion, you can also
refuse to Final Decision
the manuscript.
</div>
<ul class="ta1_uli ta1_ulicad">
<li v-for="(item,index) in tableData2">
<div>
<!-- a_id=6348&r_id=1 -->
<router-link :to="{path:'/edit_per_text_yq',query:{a_id:item.article_id,r_id:item.id}}">
<h3><span
style="margin-right: 6px;color: #006699;">{{index+1}}.</span>{{item.title}}
</h3>
<el-button type="primary" plain style="float: right;">Detail</el-button>
</router-link>
</div>
<h4>
<span>
<font style="color: #006699;">Journal : </font>{{item.journal_name}}.
</span>
<span>
<font style="color: #006699;">Type : </font>{{item.article_type_name}}
</span>
<span style="margin-left: 20px;">
<font style="color: #006699;">Invitation Time : </font> {{item.ctime}}
</span><br>
<span v-if="item.abstrart!=''" style="max-width: 1000px;">
<font style="color: #006699;">Abstract : </font>{{item.abstrart | ellipsis}}
</span>
</h4>
<div style="margin-top: 10px;">
<el-button
type="success"
size="mini"
@click="saveNow(item)"
>I agree to conduct the final review
</el-button>
<el-button
type="danger"
size="mini"
@click="saveRef(item)"
>I decline to conduct the final review
</el-button>
</div>
</li>
</ul>
<!-- </el-card> -->
</el-col>
<!-- <el-col :span="24">
<div style="background-color: #ccc;height: 2px;width: 100%;margin: 30px 0 5px 0;"></div>
@@ -142,6 +203,63 @@
this.getData();
},
methods: {
saveNow(data) {
// 二次确认
this.$confirm('Are you sure you want to agree?', 'Tips', {
type: 'warning'
})
.then(() => {
this.$api
.post('api/Finalreview/review', {
article_id: data.article_id,
record_id: data.id,
reviewer_id: localStorage.getItem('U_id'),
state: 0
})
.then((res) => {
if (res.status == 1) {
this.$message.success('Review now successfully!');
this.$router.push('/edit_per_text?Art_id=' + data.id);
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
})
.catch(() => {});
},
// 拒绝
saveRef(data) {
// 二次确认
this.$confirm('Are you sure you want to refuse?', 'Tips', {
type: 'warning'
})
.then(() => {
this.$api
.post('api/Finalreview/review', {
article_id: data.article_id,
record_id: data.id,
reviewer_id: localStorage.getItem('U_id'),
state: 4
})
.then((res) => {
if (res.status == 1) {
this.loading = true;
this.getTable();
// this.$router.push('/edit_per_text?Art_id=' + this.record_id);
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
})
.catch(() => {});
},
// 获取数据
getData() {
this.$api
@@ -166,7 +284,29 @@
this.$message.error(err);
});
this.$api
.post('api/Finalreview/lists', {...this.query,state:5})
.then(res => {
if (res.status == 1) {
for (let i = 0; i < res.data.lists.length; i++) {
let date = new Date(parseInt(res.data.lists[i].invited_time) * 1000);
let Y = date.getFullYear() + '-';
let M = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) + '-' : date
.getMonth() + 1 + '-';
let D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
res.data.lists[i].ctime = Y + M + D;
}
this.tableData2 = res.data.lists;
} else {
// this.$message.error(res.msg);
this.tableData2 =[]
}
})
.catch(err => {
this.$message.error(err);
this.tableData2=[]
});
},

View File

@@ -69,14 +69,14 @@
size="mini"
@click="saveNow(scope.$index, scope.row)"
v-if="scope.row.state == 5"
>Accept for final decision
>I agree to conduct the final review
</el-button>
<el-button
type="danger"
size="mini"
@click="saveRef(scope.$index, scope.row)"
v-if="scope.row.state == 5"
>Decline final review
>I decline to conduct the final review
</el-button>
</template>
</el-table-column>
@@ -297,7 +297,7 @@ this.getDate(data.id)
// 获取数据
getTable() {
this.$api
.post('api/Finalreview/lists', this.query)
.post('api/Finalreview/lists', {...this.query,state:'1,2,3'})
.then((res) => {
if (res.status == 1) {
this.loading = false;

View File

@@ -42,9 +42,9 @@
</el-col>
</el-row>
<div style="text-align: center;margin-top: 12px;">
<el-button type="success" @click="saveNow()" style="margin-right: 20px;width: 250px;">Accept for final decision
<el-button type="success" @click="saveNow()" style="margin-right: 20px;width: 250px;">I agree to conduct the final review
</el-button>
<el-button type="danger" @click="saveRef()" style="width: 250px;">Decline final review</el-button>
<el-button type="danger" @click="saveRef()" style="width: 250px;">I decline to conduct the final review</el-button>
</div>
</el-card>
<el-card class="box-card" style="font-size: 15px;line-height: 24px;" v-if="finalState==0">

View File

@@ -90,7 +90,7 @@ this.$router.push({
state:this.state
})
.then((res) => {
console.log('res at line 191:', res);
if (res.code == 0) {
this.orderList = res.data.list;

View File

@@ -1,14 +1,12 @@
<template>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<i class="el-icon-collection"></i> <span class="top_dao"> Review History</span>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="container_l">
<!-- <div v-for="item in dynamicTags"
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item> <i class="el-icon-collection"></i> <span class="top_dao"> Review History</span> </el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="container_l">
<!-- <div v-for="item in dynamicTags"
style="background-color: #f0f9eb;border-radius: 5px;border:1px solid #e1f3d8;color: #67c23a;font-size: 14px;padding: 8px 15px;margin: 0 0 20px 0;">
<el-button type="success" icon="el-icon-close" circle @click='handleClose'
style="float: right;margin: 17px 5px 0 0;"></el-button>
@@ -16,126 +14,303 @@
<p style="margin: 5px 0;">{{item.title}}</p>
<p>{{item.content}}</p>
</div> -->
<el-row :gutter="20">
<el-col :span="24">
<el-card class="box-card" v-loading="loading" element-loading-text="Loading..."
element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.8)">
<el-table :data="tableData3" border class="table" ref="multipleTable"
header-cell-class-name="table-header" empty-text="New messages (0)">
<el-table-column prop="article_title" label="Article Title"></el-table-column>
<el-table-column prop="journal_title" label="Journal"></el-table-column>
<el-table-column prop="ctime" label="Reviewed time" width="140"></el-table-column>
<el-table-column label="Article Status" width="130" align="center">
<template slot-scope="scope">
<b v-if="scope.row.astate == 0">Received</b>
<b v-if="scope.row.astate == 1">With editor</b>
<b v-if="scope.row.astate == 2">Under review</b>
<b v-if="scope.row.astate == 3">Reject</b>
<b v-if="scope.row.astate == 4">Revision</b>
<b v-if="scope.row.astate == 5">Accept</b>
<b v-if="scope.row.astate == 8">Final Decision</b>
<b v-if="scope.row.astate == 6">Pre-accept</b>
</template>
</el-table-column>
<el-table-column label="State" align="center" width="120">
<template slot-scope="scope">
<span style="font-size: 16px;"v-html="revstate(scope.row)"></span>
</template>
</el-table-column>
<!-- <el-table-column label="Recommendation" width="160" align="center">
<el-row :gutter="20">
<el-col :span="24">
<el-card
class="box-card"
v-loading="loading"
element-loading-text="Loading..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
>
<el-table
:data="tableData3"
border
class="table"
ref="multipleTable"
header-cell-class-name="table-header"
empty-text="New messages (0)"
>
<el-table-column prop="article_title" label="Article Title"></el-table-column>
<el-table-column prop="journal_title" label="Journal" width="300"></el-table-column>
<el-table-column prop="ctime" label="Invited time" width="130"></el-table-column>
<el-table-column label="Article Status" width="130" align="center">
<template slot-scope="scope">
<b v-if="scope.row.astate == 0">Received</b>
<b v-if="scope.row.astate == 1">With editor</b>
<b v-if="scope.row.astate == 2">Under review</b>
<b v-if="scope.row.astate == 3">Reject</b>
<b v-if="scope.row.astate == 4">Revision</b>
<b v-if="scope.row.astate == 5">Accept</b>
<b v-if="scope.row.astate == 8">Final Decision</b>
<b v-if="scope.row.astate == 6">Pre-accept</b>
</template>
</el-table-column>
<el-table-column label="Review decision" align="center" width="420">
<template slot="header" slot-scope="scope">
<p>Review decision</p>
<p style="height: 1px; background-color: #ddd; margin: 4px 0"></p>
<p class="review_decision_header"><span> </span><span>Status</span><span>Time</span></p>
</template>
<template slot-scope="scope">
<!-- <span style="font-size: 16px;"v-html="revstate(scope.row)"></span> -->
<div class="fixCard reviewer_decision" style="position: relative" v-if="scope.row.recommend">
<div class="overflow-x-auto">
<table class="review_table">
<tbody>
<!-- 遍历评审轮次1st + 重复轮次 -->
<tr>
<td>1<sup>st</sup> review</td>
<!-- 遍历每个评审者的1st评审结果 -->
<template v-for="(iken, reviewerIndex) in [scope.row]">
<td style="cursor: pointer">
<span style="display: none; margin-left: 4px; margin-right: 8px">
<font
v-if="iken.recommend == 1 || iken.recommend == 2"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #67c23a;
"
>
</font>
<font
v-if="iken.recommend == 3 || iken.recommend == 4"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #f56c6c;
"
>
</font>
</span>
<span v-if="iken.recommend == 1" style="color: #006699">Minor</span>
<span v-else-if="iken.recommend == 2" style="color: #006699">Major</span>
<span v-else-if="iken.recommend == 3" style="color: #f56c6c"
>reject and resubmission</span
>
<span v-else-if="iken.recommend == 4" style="color: #f56c6c">Reject</span>
<span v-else style="color: #888">No reply</span>
</td>
<td>
<p style="line-height: 20px; color: #888" v-if="iken.ctime > 0">
{{ iken.ctime | formatDatehms }}
</p>
</td>
</template>
</tr>
<!-- 遍历重复评审轮次2nd3rd... -->
<template v-for="(round, index1) in maxRepeatReviewCount([scope.row])">
<tr>
<td>{{ index1 + 2 }}<sup>nd</sup> review</td>
<!-- 遍历每个评审者在该轮次的结果 -->
<template v-for="(iken, reviewerIndex) in [scope.row]">
<td style="">
<span
style="cursor: pointer"
v-if="Array.isArray(iken.repeat) && iken.repeat[index1]"
>
<span style="display: none; margin-left: 4px; margin-right: 8px">
<font
v-if="iken.repeat[index1].recommend == 1"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #67c23a;
"
>
</font>
<font
v-if="iken.repeat[index1].recommend == 2"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #f56c6c;
"
>
</font>
<font
v-if="iken.repeat[index1].recommend == 3"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #006699;
"
>
</font>
</span>
<span
v-if="iken.repeat[index1].recommend == 1"
style="color: #67c23a"
>Accept</span
>
<span
v-else-if="iken.repeat[index1].recommend == 2"
style="color: #f56c6c"
>Reject</span
>
<span
v-else-if="iken.repeat[index1].recommend == 3"
style="color: #006699"
>Revision</span
>
<span v-else style="color: #888">No reply</span>
</span>
<span v-else>-</span>
</td>
<td>
<p
style="line-height: 20px; color: #888"
v-if="iken.repeat[index1].ctime > 0"
>
{{ iken.repeat[index1].ctime | formatDatehms }}
</p>
</td>
</template>
</tr>
</template>
</tbody>
</table>
</div>
</div>
<div v-else>/</div>
</template>
</el-table-column>
<!-- <el-table-column label="Recommendation" width="160" align="center">
<template slot-scope="scope">
<b v-if="scope.row.recommend == 1||scope.row.recommend == 2">Accept</b>
<b v-if="scope.row.recommend == 3||scope.row.recommend == 4">Reject</b>
</template>
</el-table-column> -->
<el-table-column label=" " width="230">
<template slot-scope="scope">
<router-link
:to="{path:'/perhistory_commen',query:{Art_id:scope.row.article_id,Rev_id:scope.row.art_rev_id}}"
v-if="(scope.row.astate==3||scope.row.astate==5)&&(scope.row.journal_id==1||scope.row.journal_id==9||scope.row.article_id>1598)">
<el-button type="primary" plain style="margin-right: 10px;">All Comments
</el-button>
</router-link>
<el-button type="warning" plain @click="cerFicte(scope.$index, scope.row)"
v-if="scope.row.state==1||scope.row.state==2||scope.row.state==3">Certificate
</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination layout="total, prev, pager, next" :current-page="TaBle3.pageIndex"
:page-size="TaBle3.pageSize" :total="link_Tota3" @current-change="handlePageChange3">
</el-pagination>
</div>
</el-card>
<el-table-column label=" " width="130">
<template slot-scope="scope">
<router-link
:to="{
path: '/perhistory_commen',
query: { Art_id: scope.row.article_id, Rev_id: scope.row.art_rev_id }
}"
v-if="
(scope.row.astate == 3 || scope.row.astate == 5) &&
(scope.row.journal_id == 1 || scope.row.journal_id == 9 || scope.row.article_id > 1598)
"
>
<el-button type="primary" plain style="margin-right: 10px">All Comments </el-button>
</router-link>
<el-button
type="warning"
plain
@click="cerFicte(scope.$index, scope.row)"
v-if="scope.row.state == 1 || scope.row.state == 2 || scope.row.state == 3"
>Certificate
</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
layout="total, prev, pager, next"
:current-page="TaBle3.pageIndex"
:page-size="TaBle3.pageSize"
:total="link_Tota3"
@current-change="handlePageChange3"
>
</el-pagination>
</div>
</el-card>
<!-- 证书弹出框 -->
<el-dialog :visible.sync="cerVisible" width="600px" :close-on-click-modal="false">
<el-image class="table-td-thumb rev_digol" :src="this.IMG_Url"></el-image>
</el-dialog>
<!-- 证书弹出框 -->
<el-dialog :visible.sync="cerVisible" width="600px" :close-on-click-modal="false">
<el-image class="table-td-thumb rev_digol" :src="this.IMG_Url"></el-image>
</el-dialog>
<el-dialog :visible.sync="feilVisible" width="600px" :close-on-click-modal="false">
<h2 style="text-align: center;">No certificate</h2>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="feilVisible=false">OK</el-button>
</span>
</el-dialog>
</el-col>
</el-row>
</div>
</div>
<el-dialog :visible.sync="feilVisible" width="600px" :close-on-click-modal="false">
<h2 style="text-align: center">No certificate</h2>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="feilVisible = false">OK</el-button>
</span>
</el-dialog>
</el-col>
</el-row>
</div>
</div>
</template>
<script>
export default {
data() {
return {
loading: false,
query: {
user_id: localStorage.getItem('U_id')
},
tableData3: [],
TaBle3: {
user_id: localStorage.getItem('U_id'),
pageIndex: 1,
pageSize: 10
},
link_Tota3: 0,
IMG_Url: '',
cerVisible: false,
feilVisible: false,
dynamicTags: [{
label: 'Submission System 2.0',
title: 'Update Notifications',
content: "The reviewers can check all reviewers ' comments when the manuscripts get final review."
}],
};
},
mounted() {
export default {
data() {
return {
loading: false,
query: {
user_id: localStorage.getItem('U_id')
},
tableData3: [],
TaBle3: {
user_id: localStorage.getItem('U_id'),
pageIndex: 1,
pageSize: 10
},
link_Tota3: 0,
IMG_Url: '',
cerVisible: false,
feilVisible: false,
dynamicTags: [
{
label: 'Submission System 2.0',
title: 'Update Notifications',
content: "The reviewers can check all reviewers ' comments when the manuscripts get final review."
}
]
};
},
mounted() {},
created() {
this.loading = true;
this.getTable();
},
methods: {
maxRepeatReviewCount(list) {
if (!list || !Array.isArray(list)) return null; // 边界处理无数据返回null
},
created() {
this.loading = true;
this.getTable();
},
methods: {
revstate(row, column, cellValue, index) {
// 遍历所有评审者找到repeat数组长度最大的那条数据
const maxItem = list.reduce((maxItem, currentItem) => {
// 计算当前项的repeat长度非数组则视为0
const currentLen = Array.isArray(currentItem.repeat) ? currentItem.repeat.length : 0;
// 计算当前最大项的repeat长度非数组则视为0
const maxLen = Array.isArray(maxItem.repeat) ? maxItem.repeat.length : 0;
// 如果当前项长度更大,则更新最大项
return currentLen > maxLen ? currentItem : maxItem;
}, {}); // 初始值设为一个空对象
// console.log('maxItem at line 2142:', maxItem.repeat.length)
return maxItem && maxItem.repeat ? maxItem.repeat.length : 0;
},
revstate(row, column, cellValue, index) {
let frag = '';
if (row.state == 0) {
frag = 'With reviewer';
} else if (row.state == 1) {
// 大修
frag = 'Major revision';
// frag = 'Revision';
} else if (row.state == 2) {
frag = 'Reject';
} else if (row.state == 3) {
//小修
// frag = 'Accept';
// frag = 'Accept';
frag = 'Minor revision';
} else if (row.state == 4) {
frag = '<text style="color:#aaa">invalid</text>';
@@ -145,110 +320,157 @@
return frag;
},
// 获取数据
getTable() {
this.$api
.post('api/Reviewer/getReviewerDetail1', this.query)
.then(res => {
if (res.code == 0) {
this.getData();
} else {
this.$message.error(res.msg);
}
})
.catch(err => {
this.$message.error(err);
});
},
// 获取数据
getTable() {
this.$api
.post('api/Reviewer/getReviewerDetail1', this.query)
.then((res) => {
if (res.code == 0) {
this.getData();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
},
getData() {
this.$api
.post('api/Reviewer/getReviewerListHistory', this.TaBle3)
.then(res => {
this.loading = false
if (res.code == 0) {
if (res.data.lists != '') {
for (let i = 0; i < res.data.lists.length; i++) {
if (res.data.lists[i].recommenttime == null) {
res.data.lists[i].ctime = ''
} else {
let date = new Date(parseInt(res.data.lists[i].recommenttime) * 1000);
let Y = date.getFullYear() + '-';
let M = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) + '-' : date
.getMonth() + 1 + '-';
let D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
res.data.lists[i].ctime = Y + M + D;
}
}
}
this.tableData3 = res.data.lists;
this.link_Tota3 = res.data.count || 0;
} else {
this.$message.error(res.msg);
}
})
.catch(err => {
this.loading = false
this.$message.error(err);
});
},
getData() {
this.$api
.post('api/Reviewer/getReviewerListHistory', this.TaBle3)
.then((res) => {
this.loading = false;
if (res.code == 0) {
if (res.data.lists != '') {
for (let i = 0; i < res.data.lists.length; i++) {
if (res.data.lists[i].recommenttime == null) {
res.data.lists[i].ctime = '';
} else {
let date = new Date(parseInt(res.data.lists[i].recommenttime) * 1000);
let Y = date.getFullYear() + '-';
let M = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) + '-' : date.getMonth() + 1 + '-';
let D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
res.data.lists[i].ctime = Y + M + D;
}
}
}
this.tableData3 = res.data.lists;
this.link_Tota3 = res.data.count || 0;
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.loading = false;
this.$message.error(err);
});
},
// 分页导航
handlePageChange3(val) {
this.loading = true;
this.$set(this.TaBle3, 'pageIndex', val);
this.getData();
},
// 分页导航
handlePageChange3(val) {
this.loading = true;
this.$set(this.TaBle3, 'pageIndex', val);
this.getData();
},
// 证书弹出层
cerFicte(index, row) {
this.$api
.post('api/Reviewer/getZSimg', {
'art_rev_id': row.art_rev_id
})
.then(res => {
if (res.code == 0) {
this.IMG_Url = this.Common.mediaUrl + res.data.icon
this.cerVisible = true;
} else {
this.$message.error(res.msg);
this.feilVisible = true;
}
})
.catch(err => {
this.$message.error(err);
});
// 证书弹出层
cerFicte(index, row) {
this.$api
.post('api/Reviewer/getZSimg', {
art_rev_id: row.art_rev_id
})
.then((res) => {
if (res.code == 0) {
this.IMG_Url = this.Common.mediaUrl + res.data.icon;
this.cerVisible = true;
} else {
this.$message.error(res.msg);
this.feilVisible = true;
}
})
.catch((err) => {
this.$message.error(err);
});
},
},
// 关闭标签
handleClose(tag) {
// this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
this.dynamicTags = []
},
},
filters: {
},
watch: {
}
};
// 关闭标签
handleClose(tag) {
// this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
this.dynamicTags = [];
}
},
filters: {},
watch: {}
};
</script>
<style scoped>
.review_table {
width: 100% !important;
background-color: #fff !important;
/* margin-top: 10px; */
border-collapse: collapse !important; /* 合并表格边框 */
}
<style>
.table {
width: 100%;
font-size: 14px;
}
.review_table th,
td {
padding: 4px !important;
min-width: 70px !important;
/* border-top: 1px solid #ddd !important;
border-bottom: 1px solid #ddd !important; */
color: #333 !important;
text-align: left !important;
height: 18px !important;
}
.rev_digol .el-image__placeholder {
background-image: url(../../assets/img/loading.gif);
background-repeat: no-repeat;
background-position: center center;
background-size: 440px 300px;
width: 560px;
height: 400px;
background-color: #fff;
}
.review_table th {
font-size: 12px !important;
background-color: #f0f0f0 !important;
}
.review_table td {
font-size: 12px;
/* background-color: #f0f0f0; */
}
.review_table th:first-child,
.review_table td:first-child {
width: 110px !important;
word-wrap: break-word !important;
word-break: break-all !important;
}
.overflow-x-auto {
overflow-x: auto;
}
</style>
<style>
.table {
width: 100%;
font-size: 14px;
}
.rev_digol .el-image__placeholder {
background-image: url(../../assets/img/loading.gif);
background-repeat: no-repeat;
background-position: center center;
background-size: 440px 300px;
width: 560px;
height: 400px;
background-color: #fff;
}
.review_decision_header {
width: 100%;
display: flex;
align-items: center;
}
.review_decision_header span {
width: 30%;
text-align: left;
}
.review_decision_header span:nth-child(1) {
width: 120px;
/* text-align: center; */
display: flex;
}
</style>

View File

@@ -4,7 +4,8 @@
<h2>
Communication
</h2>
<div v-for="(item, index) in talkMsgs" class="kuang_communtion_conmt">
<div :style="{'max-height': height+'px'}" style="overflow: auto;">
<div v-for="(item, index) in talkMsgs" class="kuang_communtion_conmt">
<div v-if="item.user_id == msgform.user_id" class="talk_aued">
<p>
Author :
@@ -24,6 +25,8 @@
<b>{{formatDate(item.ad_ctime)}}</b>
</div>
</div>
</div>
<div class="kuang_communtion_input">
<p v-if="talkMsgs"></p>
@@ -51,6 +54,10 @@
type: Object,
required: true
},
height: {
type: Number,
},
// loading: {
// type: Boolean,
// required: true

View File

@@ -1,386 +1,573 @@
<template>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<i class="el-icon-user"></i> Young Scientist Apply list
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item> <i class="el-icon-user"></i> Young Scientist Apply list </el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="container" style="min-width: 1000px;">
<el-table :data="tableData" border stripe class="table" ref="multipleTable"
header-cell-class-name="table-header">
<el-table-column label="No." align="center" width="50">
<template slot-scope="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column label="Base Information" width="320px">
<template slot-scope="scope">
<p class="tab_tie_col">
<span>Apply Journal: </span>{{scope.row.title}}
</p>
<p class="tab_tie_col">
<span>Realname: </span><b style="font-size: 15px;letter-spacing: -0.5px;">{{scope.row.realname}}</b>
</p>
<p class="tab_tie_col">
<span>Title: </span>{{scope.row.technical}}
</p>
<p class="tab_tie_col">
<span>Email: </span>{{scope.row.email}}
</p>
<p class="tab_tie_col" v-if="scope.row.phone!=''">
<span>Phone: </span>{{scope.row.phone}}
</p>
<p class="tab_tie_col" v-if="scope.row.starList_mark!=0">
<span>Grade: </span>
<font style="display: inline-block;">
<img src="../../assets/img/star-all.png" v-for="item in scope.row.starList"
v-if="scope.row.starList_mark<=8&&item.star==1" class="starSty">
<img src="../../assets/img/star-traf.png" v-for="item in scope.row.starList"
v-if="scope.row.starList_mark<=8&&item.star==0" class="starSty">
<img src="../../assets/img/star-none.png" v-for="item in scope.row.starList"
v-if="scope.row.starList_mark<=8&&item.star==2" class="starSty">
<img src="../../assets/img/star-all.png" v-if="scope.row.starList_mark>8"
class="starSty">
<b style="font-size: 15px;color: #b77614;" v-if="scope.row.starList_mark>8">×
{{scope.row.starList_mark}}</b>
</font>
</p>
<p class="tab_tie_col">
<span>Apply Time: </span>{{formatDate(scope.row.ap_time)}}
</p>
</template>
</el-table-column>
<el-table-column label="Other Information">
<template slot-scope="scope">
<p class="tab_tie_col" v-if="scope.row.cvs.length>0">
<span>CV.: </span>
<img src="../../assets/img/icon_0.png" alt=""
style="vertical-align: middle;margin-left: 10px;">
<span style="margin-left: 20px;color: #888;font-size: 13px;">
<i class="el-icon-paperclip"></i>
{{formatDate(scope.row.cvs[scope.row.cvs.length-1].ctime)}}
</span>
<a :href="mediaUrl+'reviewer/'+scope.row.cvs[scope.row.cvs.length-1].cv" target="_blank" class="txt_pdf">
<b class="el-icon-download" style="color: #006699;font-weight: bold;"></b>
</a>
</p>
<p class="tab_tie_col">
<span>Field: </span>{{scope.row.field}}
</p>
<p class="tab_tie_col" v-if="scope.row.company!=''">
<span>Affiliation: </span>{{scope.row.company}}
</p>
</template>
</el-table-column>
<el-table-column label="Remarks" width="300">
<template slot-scope="scope">
{{scope.row.remark}}
<b @click="BoxRemark(scope.row)" style="margin-left:10px;cursor: pointer;color:#006699;"
class="el-icon-edit"></b>
</template>
</el-table-column>
<el-table-column align="center" width="120">
<template slot-scope="scope">
<p style="margin-bottom: 10px;">
<el-button type="primary" plain icon="el-icon-user" @click="handleDtail(scope.row)">
Detail
</el-button>
</p>
<p style="margin-bottom: 10px;">
<el-button type="success" plain icon="el-icon-check" @click="agreeApply(scope.row)">
Agree
</el-button>
</p>
<el-button type="danger" plain icon="el-icon-close" @click="deleteApply(scope.row)">
Refuse
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="container" style="min-width: 1000px; padding: 0px">
<el-table :data="tableData" border stripe class="table" ref="multipleTable" header-cell-class-name="table-header">
<el-table-column label="No." align="center" width="50">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column label="Base Information" width="320px">
<template slot-scope="scope">
<p class="tab_tie_col"><span>Apply Journal: </span>{{ scope.row.title }}</p>
<p class="tab_tie_col">
<span>Realname: </span><b style="font-size: 13px; letter-spacing: -0.5px">{{ scope.row.realname }}</b>
</p>
<p class="tab_tie_col"><span>Title: </span>{{ scope.row.technical }}</p>
<p class="tab_tie_col"><span>Email: </span>{{ scope.row.email }}</p>
<p class="tab_tie_col" v-if="scope.row.phone != ''"><span>Phone: </span>{{ scope.row.phone }}</p>
<p class="tab_tie_col" v-if="scope.row.starList_mark != 0">
<span>Grade: </span>
<font style="display: inline-block">
<img
src="../../assets/img/star-all.png"
v-for="item in scope.row.starList"
v-if="scope.row.starList_mark <= 8 && item.star == 1"
class="starSty"
/>
<img
src="../../assets/img/star-traf.png"
v-for="item in scope.row.starList"
v-if="scope.row.starList_mark <= 8 && item.star == 0"
class="starSty"
/>
<img
src="../../assets/img/star-none.png"
v-for="item in scope.row.starList"
v-if="scope.row.starList_mark <= 8 && item.star == 2"
class="starSty"
/>
<img src="../../assets/img/star-all.png" v-if="scope.row.starList_mark > 8" class="starSty" />
<b style="font-size: 15px; color: #b77614" v-if="scope.row.starList_mark > 8"
>× {{ scope.row.starList_mark }}</b
>
</font>
</p>
<p class="tab_tie_col"><span>Apply Time: </span>{{ formatDate(scope.row.ap_time) }}</p>
</template>
</el-table-column>
<el-table-column label="Other Information">
<template slot-scope="scope">
<p class="tab_tie_col" v-if="scope.row.cvs.length > 0">
<span>CV.: </span>
<img src="../../assets/img/icon_0.png" alt="" style="vertical-align: middle; margin-left: 10px" />
<span style="margin-left: 20px; color: #888; font-size: 13px">
<i class="el-icon-paperclip"></i>
{{ formatDate(scope.row.cvs[scope.row.cvs.length - 1].ctime) }}
</span>
<a :href="mediaUrl + 'reviewer/' + scope.row.cvs[scope.row.cvs.length - 1].cv" target="_blank" class="txt_pdf">
<b class="el-icon-download" style="color: #006699; font-weight: bold"></b>
</a>
</p>
<p class="tab_tie_col"><span>Field: </span>{{ scope.row.field }}</p>
<p class="tab_tie_col" v-if="scope.row.company != ''"><span>Affiliation: </span>{{ scope.row.company }}</p>
</template>
</el-table-column>
<el-table-column label="Remarks" width="240">
<template slot-scope="scope">
{{ scope.row.remark }}
<b
@click="BoxRemark(scope.row)"
style="margin-left: 10px; cursor: pointer; color: #006699"
class="el-icon-edit"
></b>
</template>
</el-table-column>
<el-table-column align="center" width="240">
<template slot-scope="scope">
<div class="operation_box">
<el-button type="primary" plain icon="el-icon-user" @click="handleDtail(scope.row)"> Detail </el-button>
<el-button type="success" plain icon="el-icon-check" @click="agreeApply(scope.row)"> Agree </el-button>
<!-- 同意弹出框 -->
<el-dialog title="Agree User" :visible.sync="agreeVisible" width="500px" :close-on-click-modal="false">
<el-form ref="agree_Form" :model="agreeForm" :rules="rules" label-width="140px">
<el-form-item label="Realname :">
{{agreeForm.realname}}
</el-form-item>
<el-form-item label="Email :">
{{agreeForm.email}}
</el-form-item>
<el-form-item label="Apply Journal :">
{{agreeForm.title}}
</el-form-item>
<el-form-item label="Term of office :" prop="year">
<el-select v-model="agreeForm.year" placeholder="Please select a year">
<el-option v-for="item in list_year" :label="item.title" :key="item.id" :value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="agreeVisible = false">Cancel</el-button>
<el-button type="primary" @click="saveAgreee()">OK</el-button>
</span>
</el-dialog>
<el-button type="danger" plain icon="el-icon-close" @click="deleteApply(scope.row)"> Refuse </el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
<!-- 同意弹出框 -->
<el-dialog title="Agree User" :visible.sync="agreeVisible" width="700px" :close-on-click-modal="false" class="agree_form_box">
<el-form ref="agree_Form" :model="agreeForm" :rules="rules" label-width="140px">
<el-form-item label="Account :" style="margin-bottom: 2px !important">
<span>{{ agreeForm.account }}</span>
</el-form-item>
<el-form-item label="Email :" style="margin-bottom: 2px !important">
{{ agreeForm.email }}
</el-form-item>
<el-form-item label="Apply Journal :" style="margin-bottom: 10px !important">
{{ agreeForm.title }}
</el-form-item>
<el-form-item label="Real name :" prop="realname">
<el-input type="text" placeholder="" v-model="agreeForm.realname"></el-input>
</el-form-item>
<el-form-item label="Phone :">
<el-input type="text" placeholder="" v-model="agreeForm.phone"> </el-input>
</el-form-item>
<el-form-item label="Title :" prop="technical">
<el-select v-model="agreeForm.technical" filterable placeholder=" " value-key="groupID">
<el-option v-for="item in df_technical" :key="item.label" :label="item.label" :value="item.label"></el-option>
</el-select>
</el-form-item>
<el-form-item label="Country :" prop="country">
<el-select v-model="agreeForm.country" filterable placeholder=" " value-key="groupID">
<el-option
v-for="item in df_country"
:label="item.en_name + ' (' + item.zh_name + ')'"
:key="item.en_name"
:value="item.en_name"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="Website :" prop="website">
<el-input type="text" placeholder="eg:http://..." v-model="agreeForm.website"> </el-input>
</el-form-item>
<el-form-item label="Field :" prop="field">
<el-input v-model="agreeForm.field" type="textarea" autosize></el-input>
</el-form-item>
<el-form-item label="Introduction :">
<el-input v-model="agreeForm.introduction" type="textarea" autosize> </el-input>
</el-form-item>
<el-form-item label="Affiliation :" prop="company">
<el-input v-model="agreeForm.company"></el-input>
</el-form-item>
<el-form-item label="CV :">
<p class="tab_tie_col" v-if="agreeForm.cvs && agreeForm.cvs.length > 0">
<img src="../../assets/img/icon_0.png" alt="" style="vertical-align: middle; margin-left: 10px" />
<span style="margin-left: 20px; color: #888; font-size: 13px">
<i class="el-icon-paperclip"></i>
{{ formatDate(agreeForm.cvs[agreeForm.cvs.length - 1].ctime) }}
</span>
<a :href="mediaUrl + 'reviewer/' + agreeForm.cvs[agreeForm.cvs.length - 1].cv" target="_blank" class="txt_pdf">
<b class="el-icon-download" style="color: #006699; font-weight: bold"></b>
</a>
</p>
</el-form-item>
<el-form-item label="Term of office :" prop="year">
<el-select v-model="agreeForm.year" placeholder="Please select a year">
<el-option v-for="item in list_year" :label="item.title" :key="item.id" :value="item.id"> </el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="agreeVisible = false">Cancel</el-button>
<el-button type="primary" @click="saveAgreee()">OK</el-button>
</span>
</el-dialog>
<!-- 标记弹出框 -->
<el-dialog title="Remarks" :visible.sync="remarkBox" width="550px" :close-on-click-modal="false">
<el-form ref="remark" :model="remarkMes" label-width="130px">
<el-form-item label="Realname :">
{{remarkMes.realname}}
</el-form-item>
<el-form-item label="Email :">
{{remarkMes.email}}
</el-form-item>
<el-form-item label="Apply Journal :">
{{remarkMes.title}}
</el-form-item>
<el-form-item label="Content :">
<el-input type="textarea" rows="5" v-model="remarkMes.remark"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="remarkBox = false">Cancel</el-button>
<el-button type="primary" @click="saveRemark">Save</el-button>
</span>
</el-dialog>
</div>
<!-- 标记弹出框 -->
<el-dialog title="Remarks" :visible.sync="remarkBox" width="550px" :close-on-click-modal="false">
<el-form ref="remark" :model="remarkMes" label-width="130px">
<el-form-item label="Realname :">
{{ remarkMes.realname }}
</el-form-item>
<el-form-item label="Email :">
{{ remarkMes.email }}
</el-form-item>
<el-form-item label="Apply Journal :">
{{ remarkMes.title }}
</el-form-item>
<el-form-item label="Content :">
<el-input type="textarea" rows="5" v-model="remarkMes.remark"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="remarkBox = false">Cancel</el-button>
<el-button type="primary" @click="saveRemark">Save</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
mediaUrl: this.Common.mediaUrl,
tableData: [],
agreeVisible: false,
agreeForm: {},
remarkMes: {
remark: ''
},
remarkBox: false,
list_year: [{
title: '1 Year',
id: 1
}, {
title: '2 Years',
id: 2
}, {
title: '3 Years',
id: 3
}],
rules: {
year: [{
required: true,
message: 'Please select year',
trigger: 'blur'
}],
}
};
},
created() {
this.getDate();
},
methods: {
// 获取青年科学家申请列表数据
getDate() {
this.$api
.post('api/User/getYboardApplys', {
editor_id: localStorage.getItem('U_id')
})
.then(res => {
if (res.code == 0) {
this.tableData = res.data.applys;
for (var i = 0; i < this.tableData.length; i++) {
this.getScoreData(i, this.tableData[i].score)
}
} else {
this.$message.error(res.msg);
}
import commonCv from '../common/cv.vue';
export default {
components: {
commonCv
},
data() {
return {
df_country: [],
df_technical: [
{
label: 'Professor'
},
{
label: 'Associate Professor'
},
{
label: 'Assistant Professor'
},
// {
// label: 'Ph.D.',
// },
{
label: 'Researcher'
},
{
label: 'Associate research fellow'
},
{
label: 'Assistant research fellow'
},
{
label: 'Engineer'
},
{
label: 'Senior engineer'
},
{
label: 'Associate Researcher'
},
{
label: 'Lecturer'
},
{
label: 'Associate Chief Physician'
},
{
label: 'Assistant Researcher'
},
{
label: 'Physician'
},
{
label: 'Chief Physician'
},
{
label: 'Senior Lecturer'
},
{
label: 'Research Fellow'
},
{
label: 'Senior Investigator'
}
],
mediaUrl: this.Common.mediaUrl,
tableData: [],
agreeVisible: false,
agreeForm: {},
remarkMes: {
remark: ''
},
remarkBox: false,
list_year: [
{
title: '1 Year',
id: 1
},
{
title: '2 Years',
id: 2
},
{
title: '3 Years',
id: 3
}
],
rules: {
year: [
{
required: true,
message: 'Please select year',
trigger: 'blur'
}
],
phone: [
{
required: true,
message: 'Please enter phone',
trigger: 'blur'
},
{
validator: function (rule, value, callback) {
if (/^1[34578]\d{9}$/.test(value) == false) {
callback(new Error('Please enter the correct phone format'));
} else {
callback();
}
},
trigger: 'blur'
}
],
technical: [
{
required: true,
message: 'Please select title',
trigger: 'blur'
}
],
country: [
{
required: true,
message: 'Please select country',
trigger: 'blur'
}
],
field: [
{
required: true,
message: 'Please input field',
trigger: 'blur'
}
],
company: [
{
required: true,
message: 'Please input affiliation',
trigger: 'blur'
}
],
realname: [
{
required: true,
message: 'Please input real name',
trigger: 'blur'
}
]
}
};
},
created() {
this.getDate();
this.getCountry();
},
methods: {
getCountry() {
this.$api
.post('api/Reviewer/getCountrys')
.then((res) => {
this.df_country = res.countrys;
})
.catch((err) => {
this.$message.error(err);
});
},
// 获取青年科学家申请列表数据
getDate() {
this.$api
.post('api/User/getYboardApplys', {
editor_id: localStorage.getItem('U_id')
})
.then((res) => {
if (res.code == 0) {
this.tableData = res.data.applys;
for (var i = 0; i < this.tableData.length; i++) {
this.getScoreData(i, this.tableData[i].score);
}
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
console.log(err);
});
},
})
.catch(err => {
console.log(err);
});
},
// 评分
getScoreData(i, e) {
this.tableData[i].starList = [];
this.tableData[i].starList_mark = 0;
if (e < 0.5 && e > 0) {
this.tableData[i].starList.push({
star: 2
});
this.tableData[i].starList_mark = 1;
} else {
let zheng = Math.floor(e);
let xiao = Number(e) - Math.floor(e);
if (xiao >= 0.5) {
xiao = 0.5;
} else {
xiao = 0;
}
for (var j = 0; j < zheng; j++) {
this.tableData[i].starList.push({
star: 1
});
}
if (xiao == 0.5) {
this.tableData[i].starList.push({
star: 0
});
}
this.tableData[i].starList_mark = Number(zheng) + Number(xiao);
}
},
// 同意
agreeApply(e) {
this.agreeForm = {};
console.log('e at line 405:', e);
// 评分
getScoreData(i, e) {
this.tableData[i].starList = []
this.tableData[i].starList_mark = 0
if (e < 0.5 && e > 0) {
this.tableData[i].starList.push({
star: 2
})
this.tableData[i].starList_mark = 1
} else {
let zheng = Math.floor(e)
let xiao = Number(e) - Math.floor(e)
if (xiao >= 0.5) {
xiao = 0.5
} else {
xiao = 0
}
for (var j = 0; j < zheng; j++) {
this.tableData[i].starList.push({
star: 1
})
}
if (xiao == 0.5) {
this.tableData[i].starList.push({
star: 0
})
}
this.tableData[i].starList_mark = Number(zheng) + Number(xiao)
}
},
this.agreeVisible = true;
this.agreeForm = e;
this.$refs.agree_Form.clearValidate();
},
// 同意
agreeApply(e) {
this.agreeForm = e
this.agreeVisible = true
},
// 提交同意
saveAgreee() {
var data = {
ap_yboard_id: this.agreeForm.ap_yboard_id,
year: this.agreeForm.year,
realname: this.agreeForm.realname,
phone: this.agreeForm.phone,
technical: this.agreeForm.technical,
country: this.agreeForm.country,
website: this.agreeForm.website,
field: this.agreeForm.field,
introduction: this.agreeForm.introduction,
company: this.agreeForm.company
};
console.log('data at line 419:', data);
// 提交同意
saveAgreee() {
this.$refs.agree_Form.validate((valid) => {
if (valid) {
this.$api
.post('api/User/agreeYboardApply', this.agreeForm)
.then(res => {
if (res.code == 0) {
this.$message.success('Add succeeded!');
this.agreeVisible = false
this.getDate();
} else {
this.$message.error(res.msg);
}
})
.catch(err => {
console.log(err);
});
} else {
this.$message.error('Please complete the information!!');
}
});
},
this.$refs.agree_Form.validate((valid) => {
if (valid) {
this.$api
.post('api/User/agreeYboardApplyNew', {
...data
})
// 拒绝
deleteApply(e) {
// 二次确认删除
this.$confirm('Are you sure you want to refuse the apply?', 'Tip', {
type: 'warning'
})
.then(() => {
this.$api
.post('api/User/refuseYboardApply', e)
.then(res => {
if (res.code == 0) {
this.$message.success('Delete succeeded!');
this.getDate();
} else {
this.$message.error(res.msg);
}
})
.catch(err => {
console.log(err);
});
})
.catch(() => {});
},
.then((res) => {
if (res.code == 0) {
this.$message.success('Add succeeded!');
this.agreeVisible = false;
this.getDate();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
console.log(err);
});
} else {
this.$message.error('Please complete the information!!');
}
});
},
// 拒绝
deleteApply(e) {
// 二次确认删除
this.$confirm('Are you sure you want to refuse the apply?', 'Tip', {
type: 'warning'
})
.then(() => {
this.$api
.post('api/User/refuseYboardApply', e)
.then((res) => {
if (res.code == 0) {
this.$message.success('Delete succeeded!');
this.getDate();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
console.log(err);
});
})
.catch(() => {});
},
// 标记弹出框
BoxRemark(e) {
this.remarkBox = true;
this.remarkMes.realname = e.realname;
this.remarkMes.user_id = e.user_id;
this.remarkMes.email = e.email;
this.remarkMes.title = e.title;
this.remarkMes.remark = e.remark;
},
// 标记弹出框
BoxRemark(e) {
this.remarkBox = true;
this.remarkMes.realname = e.realname;
this.remarkMes.user_id = e.user_id;
this.remarkMes.email = e.email;
this.remarkMes.title = e.title;
this.remarkMes.remark = e.remark;
},
// 修改标记
saveRemark() {
this.$api.post('api/User/editRemarkForUser', this.remarkMes)
.then(res => {
if (res.code == 0) {
this.$message.success('Success');
this.remarkBox = false;
this.getDate();
} else {
this.$message.error(res.msg);
}
});
},
// 修改标记
saveRemark() {
this.$api.post('api/User/editRemarkForUser', this.remarkMes).then((res) => {
if (res.code == 0) {
this.$message.success('Success');
this.remarkBox = false;
this.getDate();
} else {
this.$message.error(res.msg);
}
});
},
// 详情
handleDtail(e) {
let routerJump = this.$router.resolve({
path: '/partyRole',
query: {
id: e.user_id
}
});
window.open(routerJump.href, '_blank');
},
// 详情
handleDtail(e) {
let routerJump = this.$router.resolve({
path: '/partyRole',
query: {
id: e.user_id
}
});
window.open(routerJump.href, '_blank');
},
// 时间格式
formatDate(timestamp) {
var date = new Date(timestamp * 1000); //时间戳为10位需*1000时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-';
var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
var h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
return Y + M + D;
},
}
};
// 时间格式
formatDate(timestamp) {
var date = new Date(timestamp * 1000); //时间戳为10位需*1000时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-';
var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
var h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
return Y + M + D;
}
}
};
</script>
<style scoped>
.table {
width: 100%;
font-size: 14px;
}
.table {
width: 100%;
font-size: 14px;
}
.red {
color: #ff0000;
}
.red {
color: #ff0000;
}
.tab_tie_col {
margin-bottom: 5px;
color: #333;
word-wrap: break-word;
word-break: normal;
}
.tab_tie_col {
margin-bottom: 2px;
color: #333;
word-wrap: break-word;
word-break: normal;
}
.tab_tie_col>span {
color: #888;
margin: 0 5px 0 0;
font-size: 13px;
}
.tab_tie_col > span {
color: #888;
margin: 0 5px 0 0;
font-size: 13px;
}
.starSty {
width: 18px;
margin-right: 4px;
vertical-align: text-top;
}
.starSty {
width: 14px;
margin-right: 4px;
vertical-align: text-top;
}
.starSty:nth-last-child(1) {
margin-right: 0;
}
.starSty:nth-last-child(1) {
margin-right: 0;
}
::v-deep .agree_form_box .el-form-item {
margin-bottom: 20px !important;
}
::v-deep .agree_form_box .el-form-item .el-select {
width: 100% !important;
}
::v-deep .agree_form_box .el-dialog__body {
padding: 10px 20px 10px !important;
}
::v-deep .operation_box .el-button--small {
padding: 5px 5px !important;
}
</style>

View File

@@ -585,7 +585,7 @@
.then(res => {
if (res.code == 0) {
this.$message.success('Deleted successfully');
this.getDate()();
this.getDate();
} else {
this.$message.error(res.msg);
}

View File

@@ -57,7 +57,7 @@ Vue.use(VueQuillEditor)
async function loadJournalType() {
const localData = localStorage.getItem('journalType'); // 尝试从 localStorage 获取数据
// 如果 localStorage 中没有数据,则调用 API 获取并存储
if (!localData) {
try {
await api
@@ -83,30 +83,42 @@ async function loadJournalType() {
} catch (error) {
console.error('Failed to fetch journal types:', error);
}
} else {
console.log('Journal types loaded from localStorage:', JSON.parse(localData));
}
}
async function loadJournalList() {
return await api
.post('api/Article/getJournal', {})
.then((res) => {
store.commit('setJournalList', res); // 提交 mutation 更新 journalList
console.log('journalList at line 100:, 提交 mutation 更新 journalList')
})
async function loadJournalList() {
try {
const localData = store.state.journalList;
console.log('localData at line 93:', localData);
if (localData && Array.isArray(localData) && localData.length > 0) {
return localData;
}
const res = await api.post('api/Article/getJournal', {});
if (res ) {
const journalList = res;
store.commit('setJournalList', journalList);
return journalList;
} else {
return [];
}
} catch (error) {
}
}
// 启动应用时调用一次函数来加载 journalType 数据
// 时间过滤器
// 定义时间过滤器(不含时分秒)
@@ -209,7 +221,7 @@ router.beforeEach(async(to, from, next) => {
]);
} catch (err) {
// 仅打印错误,不阻断路由
console.error('接口请求失败,但继续路由跳转', err);
}
// 无论接口成功/失败,都执行原有跳转逻辑

View File

@@ -761,13 +761,15 @@ export default new Router({
meta: {
title: 'Final decision'
}
}, {
},
{
path: '/edithistory', //编委历史列表
component: () => import('../components/page/edit_history'),
meta: {
title: 'Accepted manuscript'
}
}, {
},
{
path: '/edit_text_jx', //编委文章详情-进行
component: () => import('../components/page/edit_text_jx'),
meta: {
@@ -1055,6 +1057,14 @@ export default new Router({
hideSidebar: true
}
},
{
path: '/OnlineProofreading', //用户端预收录-引用编辑
component: () => import('../components/page/OnlineProofreading'),
meta: {
title: 'Online Proofreading',
hideSidebar: true
}
},
{
path: '/LateX', //用户端预收录-引用编辑
component: () => import('../components/page/components/table/LateX.vue'),

View File

@@ -60,6 +60,7 @@ module.exports = {
assetsDir: 'static',
productionSourceMap: false,
devServer: {
// public: 'http://192.168.110.159:8080/', // 你自己本地的ip地址:端口号
port: '8080',
open: true,