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 margin: 0 -17px
} }
.state-select .el-scrollbar .el-select-dropdown__wrap {
max-height: 400px !important;
}
.el-dropdown-menu--small { .el-dropdown-menu--small {
padding: 6px 0 padding: 6px 0
} }
@@ -2558,6 +2562,7 @@
max-height: 274px max-height: 274px
} }
.el-select-dropdown__list { .el-select-dropdown__list {
list-style: none; list-style: none;
padding: 6px 0; padding: 6px 0;

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

View File

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

View File

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

View File

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

View File

@@ -1,10 +1,14 @@
<template> <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"> <p style="color: #aaa; margin: 0 0 0px 0px" v-if="cvitaTable1 && cvitaTable1.length == 0">No data</p>
{{ index + 1 }}.
<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" /> <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"> <span style="margin-left: 20px; color: #888; font-size: 13px">
<i class="el-icon-paperclip"></i> <i class="el-icon-paperclip"></i>
@@ -13,17 +17,16 @@
<a :href="mediaUrl + 'reviewer/' + item.cv" target="_blank" class="txt_pdf"> <a :href="mediaUrl + 'reviewer/' + item.cv" target="_blank" class="txt_pdf">
<i class="el-icon-download"></i> <i class="el-icon-download"></i>
</a> </a>
<i <i v-if="isEdit"
class="el-icon-delete" class="el-icon-delete"
@click="deletCVita(item)" @click="deletCVita(item)"
style="color: #f12424; cursor: pointer; font-weight: bold; margin: 0 0 0 15px" style="color: #f12424; cursor: pointer; font-weight: bold; margin: 0 0 0 15px"
></i> ></i>
</div> </div>
<p style="width: 90%; background-color: #d7d7d7; height: 1px; margin: 10px auto 30px auto"></p> </div>
<p style="margin: 0 0 25px 28px">If you want to update your resume, please upload it.</p> <div v-if="isEdit">
<el-form :model="cvitaForm" :rules="rules" ref="cvita_Form" label-width="70px"> <p style="margin: 20px 0"></p>
<el-form-item label="CV. :"> <el-upload style="position: relative"
<el-upload
class="upload-demo" class="upload-demo"
:action="baseUrl + 'api/Ucenter/up_cv_file'" :action="baseUrl + 'api/Ucenter/up_cv_file'"
:on-success="handleFileSuccess1" :on-success="handleFileSuccess1"
@@ -41,10 +44,13 @@
<el-button type="text" style="font-weight: bolder"> <el-button type="text" style="font-weight: bolder">
<b class="el-icon-lx-top" style="font-weight: bolder"></b>upload <b class="el-icon-lx-top" style="font-weight: bolder"></b>upload
</el-button> </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> </el-upload>
<span style="font-size: 12px; color: #aaa"> Only pdf files can be uploaded(.pdf) </span> </div>
</el-form-item>
</el-form>
</div> </div>
</template> </template>
@@ -53,6 +59,12 @@ import Schart from 'vue-schart';
import bus from '../common/bus'; import bus from '../common/bus';
export default { export default {
name: 'dashboard', name: 'dashboard',
props:{
isEdit: {
type: Boolean,
default:true
},
},
data() { data() {
return { return {
user_id: '', user_id: '',
@@ -71,11 +83,12 @@ export default {
}, },
computed: {}, computed: {},
methods: { methods: {
init() { init(list) {
this.user_id = localStorage.getItem('U_id'); this.user_id = localStorage.getItem('U_id');
this.cvitaForm.user_id = this.user_id; this.cvitaForm.user_id = this.user_id;
console.log('this.user_id at line 75:', this.user_id) console.log('this.user_id at line 75:', this.user_id);
this.getCVitaData(); this.cvitaTable1=[...list]
// this.getCVitaData();
}, },
// 获取简历列表 // 获取简历列表
getCVitaData() { getCVitaData() {
@@ -205,4 +218,11 @@ export default {
font-weight: bold; font-weight: bold;
margin-left: 10px; margin-left: 10px;
} }
.commonCvList .el-upload__tip {
position: absolute;
top: -14px;
left: 70px;
color: #333;
font-size: 12px;
}
</style> </style>

View File

@@ -385,16 +385,20 @@ const en = {
exportImg: 'Export PNG', exportImg: 'Export PNG',
PaperRotation: 'Paper Rotation', PaperRotation: 'Paper Rotation',
removeAnnotations: 'Are you sure you want to delete this Annotation?', removeAnnotations: 'Are you sure you want to delete this Annotation?',
removeProofread removeProofread: 'Are you sure to delete this suggestion?',
: 'Are you sure to delete this suggestion?',
removeContent: 'Are you sure you want to delete this content?', removeContent: 'Are you sure you want to delete this content?',
reContent: 'Are you sure you want to restore this content?', reContent: 'Are you sure you want to restore this content?',
uploadImageInfo: 'Figures can only upload files in JPG, JPEG, and PNG formats!', uploadImageInfo: 'Figures can only upload files in JPG, JPEG, and PNG formats!',
selectComment: 'Please select the text to add annotations to!', selectComment: 'Please select the text to add annotations to!',
selectWord: 'Please select only a single word', 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!', alreadyCommented: 'There are already annotations in the text, please select again!',
Multicolumn: 'Multicolumn', Multicolumn: 'Multicolumn',
singleRow: "single-row", singleRow: "single-row",
Row: "Row",
Uncheck: 'Uncheck the paragraph',
ManuscirptAIProofreading: 'Manuscript AI Proofreading',
BatchAddcontent: 'Batch Add content',
}, },
pendingPayment: { pendingPayment: {
title: 'Title', title: 'Title',

View File

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

View File

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

View File

@@ -866,16 +866,9 @@
<el-form-item label="Real name :" prop="realname"> <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-input type="text" placeholder="Please enter..." v-model="coreForm.realname" style="width: 320px"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="Phone :"> <el-form-item label="Phone :">
<el-input type="text" placeholder="Please enter..." v-model="coreForm.phone" style="width: 320px"> </el-input> <el-input type="text" placeholder="Please enter..." v-model="coreForm.phone" style="width: 320px"> </el-input>
</el-form-item> </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 <el-select
v-model="coreForm.technical" v-model="coreForm.technical"
@@ -906,30 +899,6 @@
<el-form-item label="Website :" prop="website"> <el-form-item label="Website :" prop="website">
<el-input type="text" placeholder="eg:http://..." v-model="coreForm.website" style="width: 320px"> </el-input> <el-input type="text" placeholder="eg:http://..." v-model="coreForm.website" style="width: 320px"> </el-input>
</el-form-item> </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-form-item label="Field :" prop="field">
<el-input v-model="coreForm.field" type="textarea" style="width: 570px" autosize></el-input> <el-input v-model="coreForm.field" type="textarea" style="width: 570px" autosize></el-input>
</el-form-item> </el-form-item>
@@ -987,7 +956,7 @@
</el-dialog> </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 :model="youthForm" :rules="rules" ref="youth_Form" label-width="100px">
<el-form-item label="Journal :" prop="journal_id"> <el-form-item label="Journal :" prop="journal_id">
<el-select v-model="youthForm.journal_id" placeholder="Please select a journal" style="width: 300px"> <el-select v-model="youthForm.journal_id" placeholder="Please select a journal" style="width: 300px">
@@ -1000,9 +969,9 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- <el-form-item label=" " label-width="0px"> <el-form-item label="CV :" >
<commonCv ref="commoncv" @cvitaTable="getCVitaData"></commonCv> <commonCv ref="commoncv" @cvitaTable="updateCVitaData"></commonCv>
</el-form-item> --> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="youthVisible = false">Cancel</el-button> <el-button @click="youthVisible = false">Cancel</el-button>
@@ -1355,7 +1324,7 @@ export default {
}, },
computed: {}, computed: {},
methods: { methods: {
getCVitaData(data){ updateCVitaData(data){
this.applyCvitaTable = data; this.applyCvitaTable = data;
}, },
handleDeleteMajor(v) { handleDeleteMajor(v) {
@@ -1525,12 +1494,13 @@ this.applyCvitaTable = data;
// 获取简历列表 // 获取简历列表
getCVitaData() { getCVitaData() {
this.$api this.$api
.post('api/Ucenter/getUserInfo', { .post('api/User/getUser', {
user_id: this.user_id user_id: this.user_id
}) })
.then((res) => { .then((res) => {
if (res.code == 0) { if (res.status == 1) {
this.cvitaTable = res.data.cvs; this.cvitaTable = res.data.cv || [];
this.applyCvitaTable = res.data.cv || [];
} else { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
} }
@@ -1542,6 +1512,7 @@ this.applyCvitaTable = data;
// 简历弹出层 // 简历弹出层
openCVita() { openCVita() {
this.cvitaTable=[...this.applyCvitaTable]
this.cvitaVisible = true; this.cvitaVisible = true;
this.cvitaForm.cv = ''; this.cvitaForm.cv = '';
}, },
@@ -2112,42 +2083,42 @@ this.applyCvitaTable = data;
// 青年科学家弹出框 // 青年科学家弹出框
youthPoint() { youthPoint() {
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.youthForm.journal_id = '';
// this.youthVisible = true; // this.youthVisible = true;
// this.$nextTick(()=>{
// this.$refs.commoncv.init();
// })
// 判断
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; // } else {
// this.$nextTick(()=>{ // // 提示完善信息
// this.$refs.commoncv.init(); // this.tipVisible = true;
// this.tipTable.message = res.msg;
// }
// }) // })
// .catch((err) => {
} else { // console.log(err);
// 提示完善信息 // });
this.tipVisible = true;
this.tipTable.message = res.msg;
}
})
.catch((err) => {
console.log(err);
});
}, },
// 点击提交青年科学家信息 // 点击提交青年科学家信息
onSubmit_youth(youthForm) { onSubmit_youth(youthForm) {
this.$refs.youth_Form.validate((valid) => { this.$refs.youth_Form.validate((valid) => {
if (valid) { if (valid) {
if(this.applyCvitaTable.length == 0){
this.$message.error('Please upload your resume!');
return false;
}
this.$api this.$api
.post('api/Ucenter/applyYboard', this.youthForm) .post('api/Ucenter/applyYboard', this.youthForm)
.then((res) => { .then((res) => {
@@ -2171,8 +2142,8 @@ this.applyCvitaTable = data;
this.$message.error(err); this.$message.error(err);
}); });
} else { } else {
this.$message.error('Please select a journal!'); // this.$message.error('Please select a journal!');
return false; // return false;
} }
}); });
}, },

View File

@@ -697,15 +697,7 @@ export default {
async saveContent(content, am_id) { async saveContent(content, am_id) {
var that = this; var that = this;
var str = content.replace(/^<p>\s*(.*?)\s*<\/p>$/, '$1').trim(); 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); str = await that.$commonJS.decodeHtml(str);
await that.$api await that.$api
@@ -938,7 +930,6 @@ export default {
}) })
.then(async () => { .then(async () => {
var that = this; var that = this;
await that.$api await that.$api
.post('/api/Preaccept/delMoreArticleMains', { .post('/api/Preaccept/delMoreArticleMains', {
ids: dataId ids: dataId
@@ -1201,14 +1192,21 @@ export default {
}, },
async onAddRow(mainId) { async onAddRow(mainId) {
await this.$api await this.$api
.post(this.urlList.addRow, { .post(this.urlList.addRow, {
am_id: mainId, am_id: mainId,
article_id: this.articleId article_id: this.articleId
}) })
.then(async (res) => { .then(async (res) => {
if(res.code == 0){
this.getDate(); this.getDate();
this.getCommentList(); this.getCommentList();
}else{
this.$message.error(res.msg);
}
}) })
.catch((err) => { .catch((err) => {
this.$message.error(err.msg); this.$message.error(err.msg);
@@ -1477,120 +1475,13 @@ export default {
}); });
}, },
getWord() { 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'; this.htmlContent = 'true';
}, },
// 获取数据 // 获取数据
async getDate() { async getDate() {
// await this.$api.post('api/Proofread/proofRead', {
// article_id: this.$route.query.id
// });
this.imagesList = []; this.imagesList = [];
let urlLInk = ''; let urlLInk = '';
let urlTask = {}; let urlTask = {};
@@ -1598,7 +1489,6 @@ export default {
urlLInk = 'api/Preaccept/getArticleMainsNew'; urlLInk = 'api/Preaccept/getArticleMainsNew';
urlTask.article_id = this.Art_Id; urlTask.article_id = this.Art_Id;
} }
const loading = this.$loading({ const loading = this.$loading({
lock: true, lock: true,
text: 'Loading...', text: 'Loading...',
@@ -1611,26 +1501,22 @@ export default {
.post(urlLInk, urlTask) .post(urlLInk, urlTask)
.then(async (res) => { .then(async (res) => {
if (res.code == 0) { if (res.code == 0) {
// res.data.list.forEach((data) => { this.Main_List = res.data.list.map(e=>{
// if (data.amt_id) { e.checked = false;
// try { return e;
// const parsedData = JSON.parse(data.table.table_data); });
// } catch (e) {
// console.error(e.message);
// }
// }
// });
this.Main_List = res.data.list;
this.getManuscirptContent(); this.getManuscirptContent();
for (let i = 0; i < this.Main_List.length; i++) { for (let i = 0; i < this.Main_List.length; i++) {
this.Main_List[i].text = this.Main_List[i].content; this.Main_List[i].text = this.Main_List[i].content;
this.Main_List[i].getnum = 0; this.Main_List[i].getnum = 0;
// this.Main_List[i].checked = false;
} }
// setTimeout(async () => { // setTimeout(async () => {
this.$nextTick(async () => { this.$nextTick(async () => {
await this.getWord(); await this.getWord();
loading.close(); loading.close();
}); });
// }, 1000); // }, 1000);

File diff suppressed because it is too large Load Diff

View File

@@ -99,7 +99,7 @@
</el-upload> </el-upload>
</el-form-item> </el-form-item>
<el-form-item label="Manuscript Title :" prop="title" label-width="160px"> <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>
<el-form-item label="Whether ethical approval was obtained ?" prop="approval" label-width="290px"> <el-form-item label="Whether ethical approval was obtained ?" prop="approval" label-width="290px">
@@ -166,21 +166,33 @@
</el-form-item> --> </el-form-item> -->
<el-form-item label="Key words :"> <el-form-item label="Key words :">
<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 <el-input
v-for="(item, index) in keywordsList"
:key="index"
:name="index + 1" :name="index + 1"
v-model="item.ke" v-model="item.ke"
clearable clearable
style="width: 150px; margin-right: 15px; margin-bottom: 3px" style="width: 150px; margin-right: 15px; margin-bottom: 3px"
> >
</el-input> </el-input>
</div>
</el-checkbox-group>
</div>
<el-button type="text" @click="addfund"> <el-button type="text" @click="addfund">
<i class="el-icon-circle-plus-outline">Add</i> <i class="el-icon-circle-plus-outline">Add</i>
</el-button> </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>
<el-form-item label="Fund :"> <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> </el-form-item>
<div style="text-align: center; margin: 40px 0 0 0"> <div style="text-align: center; margin: 40px 0 0 0">
@@ -1023,6 +1035,7 @@ export default {
ProgressBar ProgressBar
}, },
data() { data() {
// 自定义校验禁止QQ邮箱 // 自定义校验禁止QQ邮箱
const validateNotQQEmail = (rule, value, callback) => { const validateNotQQEmail = (rule, value, callback) => {
// 通用邮箱格式正则(基础校验,匹配大多数标准邮箱格式) // 通用邮箱格式正则(基础校验,匹配大多数标准邮箱格式)
@@ -1056,8 +1069,12 @@ export default {
} }
}; };
return { return {
isNewArticle:true, checkAll: false,
isIndeterminate: false,
stepStatusCurrent: '',
isNewArticle: true,
oldMajorValueList: [], oldMajorValueList: [],
checkedCities: [],
newOptionLabel: '', newOptionLabel: '',
showAddOption: false, showAddOption: false,
nextId: 0, // 用于生成新选项的ID nextId: 0, // 用于生成新选项的ID
@@ -1513,9 +1530,7 @@ export default {
immediate: true immediate: true
}, },
form: { form: {
async handler(newVal, oldVal) { async handler(newVal, oldVal) {},
},
deep: true, deep: true,
immediate: true immediate: true
} }
@@ -1540,7 +1555,7 @@ export default {
}); });
await this.Temporary(); await this.Temporary();
} else { } else {
this.isNewArticle=true; this.isNewArticle = true;
await this.initMajor(); await this.initMajor();
} }
@@ -1583,6 +1598,19 @@ export default {
} }
}, },
methods: { 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() { closeAuthorDialog() {
this.getAuthorList(); this.getAuthorList();
this.authorVisible = false; this.authorVisible = false;
@@ -1750,24 +1778,22 @@ export default {
article_id: this.form.article_id, article_id: this.form.article_id,
user_id: this.form.user_id user_id: this.form.user_id
}) })
.then(async(res) => { .then(async (res) => {
if (res.status == 1) { if (res.status == 1) {
step1Incomplete.list= step1Incomplete.list.map((item) => ({ step1Incomplete.list = step1Incomplete.list.map((item) => ({
...item, ...item,
status: res.data[item.name], status: res.data[item.name],
msg: res.data[item.msg] msg: res.data[item.msg]
})); }));
this.stepStatus = step1Incomplete.list this.stepStatus = step1Incomplete.list;
if (res.data.current_step) { if (res.data.current_step) {
step1Incomplete.current = step1Incomplete.list.find((item) => item.name == res.data.current_step); step1Incomplete.current = step1Incomplete.list.find((item) => item.name == res.data.current_step);
this.stepStatusCurrent = step1Incomplete.current;
} }
if (fn) { if (fn) {
console.log('step1Incomplete at line 1766:', step1Incomplete) console.log('step1Incomplete at line 1766:', step1Incomplete);
fn(step1Incomplete); fn(step1Incomplete);
} }
console.log('this.stepStatus at line 1571:', this.stepStatus); console.log('this.stepStatus at line 1571:', this.stepStatus);
} }
@@ -1928,7 +1954,25 @@ export default {
ke: '' 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() { initSelect() {
this.items = this.$store.state.journalList; this.items = this.$store.state.journalList;
@@ -2718,7 +2762,7 @@ export default {
this.form.manuscirpt = ''; this.form.manuscirpt = '';
this.fileL_manuscirpt = []; this.fileL_manuscirpt = [];
this.isShowCommonWord = false; this.isShowCommonWord = false;
this.initStepStatus() this.initStepStatus();
loading.close(); loading.close();
} }
}) })
@@ -2832,7 +2876,7 @@ export default {
.then((res) => { .then((res) => {
if (res.code == 0) { if (res.code == 0) {
this.$message.success('Deletion succeeded!'); this.$message.success('Deletion succeeded!');
this.initStepStatus() this.initStepStatus();
} else { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
} }
@@ -2985,36 +3029,10 @@ export default {
this.move_step = e; this.move_step = e;
} else if (this.move_step < e) { } else if (this.move_step < e) {
this.$refs.articleform.validate((valid) => { this.$refs.articleform.validate((valid) => {
console.log('valid at line 2963:', valid);
if (valid) { if (valid) {
// deepEqual(this.form, this.oldForm);
if (this.move_step == 1) { if (this.move_step == 1) {
//暂时注销 start this.move_step = 2;
// var flist = this.keywordsList; this.show_step = 2;
// 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
} else if (this.move_step == 2) { } else if (this.move_step == 2) {
this.onStaging(2); this.onStaging(2);
this.show_step = 3; this.show_step = 3;
@@ -3025,7 +3043,6 @@ export default {
} }
} else { } else {
this.$message.error('Please fill in the current content first!'); this.$message.error('Please fill in the current content first!');
// return false;
} }
}); });
} else { } else {
@@ -3041,7 +3058,6 @@ export default {
} }
}, },
isArrayEqual(arr1, arr2) { isArrayEqual(arr1, arr2) {
if ((arr1 === null || arr1 === undefined) && (arr2 === null || arr2 === undefined)) return true; 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 false;
@@ -3050,9 +3066,8 @@ export default {
if (arr1.length !== arr2.length) return false; if (arr1.length !== arr2.length) return false;
return arr1.every((val, index) => val === arr2[index]); return arr1.every((val, index) => val === arr2[index]);
}, },
isMajorValueListEqual(list1, list2) { isMajorValueListEqual(list1, list2) {
if ((list1 === null || list1 === undefined) && (list2 === null || list2 === undefined)) return true; if ((list1 === null || list1 === undefined) && (list2 === null || list2 === undefined)) return true;
if (list1 === null || list1 === undefined || list2 === null || list2 === undefined) return false; if (list1 === null || list1 === undefined || list2 === null || list2 === undefined) return false;
@@ -3070,13 +3085,12 @@ export default {
const sv2 = item2.selectedValue; const sv2 = item2.selectedValue;
return this.isArrayEqual(sv1, sv2); return this.isArrayEqual(sv1, sv2);
}); });
}, },
StepCode(step, i) { StepCode(step, i) {
var that = this; var that = this;
const targetIndex = step.index; // 目标步骤索引1、2、3等 const targetIndex = step.index; // 目标步骤索引1、2、3等
const currentStep = this.move_step; // 当前所在步骤 const currentStep = this.move_step; // 当前所在步骤
console.log('当前步骤:', currentStep, '目标步骤:', targetIndex, '步骤状态:', this.stepStatus);
// 1. 后退 // 1. 后退
if (currentStep > targetIndex) { if (currentStep > targetIndex) {
@@ -3092,7 +3106,6 @@ export default {
// : [] // : []
// ) // )
// .toString(','); // .toString(',');
// this.$api // this.$api
// .post('api/Article/addArticleStaging', { // .post('api/Article/addArticleStaging', {
// user_id: this.form.user_id, // user_id: this.form.user_id,
@@ -3104,10 +3117,7 @@ export default {
// this.oldMajorValueList = [...this.majorValueList]; // this.oldMajorValueList = [...this.majorValueList];
// } // }
// }); // });
// } // }
// } // }
} }
this.show_step = targetIndex; this.show_step = targetIndex;
@@ -3121,32 +3131,40 @@ export default {
if (!valid) { if (!valid) {
this.$message.error('Please fill in the current content first!'); this.$message.error('Please fill in the current content first!');
return false; 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 { } 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 (targetIndex == 4) {
if ( if (
Array.isArray(this.majorValueList) && Array.isArray(this.majorValueList) &&
this.majorValueList.some((item) => item.selectedValue !== null && item.selectedValue !== undefined) this.majorValueList.some((item) => item.selectedValue !== null && item.selectedValue !== undefined)
) { ) {
} else { } else {
if(this.isNewArticle){ if (this.isNewArticle) {
this.getMajorData(); this.getMajorData();
} }
} }
} }
this.show_step = targetIndex;
this.move_step = targetIndex;
} }
this.show_step = targetIndex;
this.move_step = targetIndex;
}); });
// return; // return;
} }
@@ -3287,20 +3305,20 @@ export default {
this.stagingID = res.data.article_id; this.stagingID = res.data.article_id;
this.form.article_id = res.data.article_id; this.form.article_id = res.data.article_id;
this.$message.success('Saving succeeded!'); this.$message.success('Saving succeeded!');
this.initStepStatus(step1Incomplete=>{ this.initStepStatus((step1Incomplete) => {
console.log('step1Incomplete at line 3283:', step1Incomplete) console.log('step1Incomplete at line 3283:', step1Incomplete);
this.$nextTick(()=>{ this.$nextTick(() => {
if(step1Incomplete.list&&step1Incomplete.list.length>0&&step1Incomplete.list[0].status==1){ if (
step1Incomplete.list &&
step1Incomplete.list.length > 0 &&
step1Incomplete.list[0].status == 1
) {
this.move_step = 2; //进行步骤 this.move_step = 2; //进行步骤
this.show_step = 2; //显示内容 this.show_step = 2; //显示内容
this.$forceUpdate() this.$forceUpdate();
} }
})
}); });
});
} else { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
} }
@@ -3379,7 +3397,7 @@ export default {
} else if (e == 4) { } else if (e == 4) {
this.onStaging('save4'); this.onStaging('save4');
} }
},1000), }, 1000),
//暂存加下一步 //暂存加下一步
onStagingSubmit: throttle(function (e) { onStagingSubmit: throttle(function (e) {
if (e == 3) { if (e == 3) {
@@ -3399,10 +3417,9 @@ export default {
this.majorValueList.some((item) => item.selectedValue !== null && item.selectedValue !== undefined) this.majorValueList.some((item) => item.selectedValue !== null && item.selectedValue !== undefined)
) { ) {
} else { } else {
if(this.isNewArticle){ if (this.isNewArticle) {
this.getMajorData(); this.getMajorData();
} }
} }
this.move_step = 4; this.move_step = 4;
this.show_step = 4; this.show_step = 4;
@@ -3414,7 +3431,7 @@ export default {
} }
}); });
} }
},1000), }, 1000),
// 暂存 // 暂存
onStaging(e) { onStaging(e) {
@@ -3441,7 +3458,7 @@ export default {
article_id: this.form.article_id, article_id: this.form.article_id,
journal: this.form.journal, journal: this.form.journal,
title: this.form.title, title: this.form.title,
keyWords: this.form.keyWords, keywords: this.form.keyWords,
abstrart: this.form.abstrart, abstrart: this.form.abstrart,
type: this.form.type, type: this.form.type,
username: this.form.username, username: this.form.username,
@@ -3454,11 +3471,9 @@ export default {
}, },
(res) => { (res) => {
if (res.status == 1) { if (res.status == 1) {
const url = new URL(window.location.href); const url = new URL(window.location.href);
url.searchParams.set('id', res.data.article_id); // 替换或新增 id 参数 url.searchParams.set('id', res.data.article_id); // 替换或新增 id 参数
window.history.replaceState({}, document.title, url.toString()); window.history.replaceState({}, document.title, url.toString());
} }
} }
); );
@@ -3643,8 +3658,7 @@ export default {
? item.shu.split(',').map(Number) ? item.shu.split(',').map(Number)
: [item.shu] : [item.shu]
})); }));
this.isNewArticle=false; this.isNewArticle = false;
}); });
}, },
changeUseAi(e) { changeUseAi(e) {

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -11,7 +11,7 @@
</el-breadcrumb> </el-breadcrumb>
</div> </div>
<div class="container"> <div class="container">
<div class="handle-box"> <div class="handle-box" v-if="articleBaseInfo.state == 8">
<div> <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> </div>
@@ -575,60 +575,23 @@ export default {
showdetail(row) { showdetail(row) {
console.log('row at line 577:', row)
this.FinalDetailBaseInfo={...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.$nextTick(() => {
this.$refs.commonFinalDetail.init(); 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() { changereviewer() {
if (this.editform.uid !== 0) { 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> <template>
<div> <div>
<div class="tab_post"> <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' : ''"> <div v-for="(item, index) in tabsList" @click="jumpTab(index, item)" :class="tabName == item.refName ? 'P_style' : ''">
<h5> <h5>
<span>{{ index + 1 }}</span> <span>{{ index + 1 }}</span>
@@ -10,12 +18,34 @@
<p>{{ item.rongCont }}</p> <p>{{ item.rongCont }}</p>
<div class="line"></div> <div class="line"></div>
</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"> <el-button type="primary" @click="pushOnline(detailMes)" style="width: 220px">
<i class="el-icon-finished"></i> <i class="el-icon-finished"></i>
Push Online Push Online
</el-button> </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> </div>
<div <div
@@ -101,6 +131,35 @@
<el-form-item label="Author Contribution :" prop="author_contribution"> <el-form-item label="Author Contribution :" prop="author_contribution">
<el-input v-model="detailMes.author_contribution"></el-input> <el-input v-model="detailMes.author_contribution"></el-input>
</el-form-item> </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> </el-form>
<div style="text-align: center; margin: 25px 0 0 0"> <div style="text-align: center; margin: 25px 0 0 0">
<el-button type="primary" @click="ZsSaveMes" style="width: 400px; margin-right: 20px"> <el-button type="primary" @click="ZsSaveMes" style="width: 400px; margin-right: 20px">
@@ -193,13 +252,13 @@
<el-form-item label="Affiliated organization :"> <el-form-item label="Affiliated organization :">
<el-checkbox-group v-model="addFomauthor.organs" class="suoshu_jigou"> <el-checkbox-group v-model="addFomauthor.organs" class="suoshu_jigou">
<el-checkbox <el-checkbox
v-for="item in mechanism" v-for="(item,index) in mechanism"
style="display: block" style="display: block"
name="type" name="type"
:label="item.p_article_organ_id" :label="item.p_article_organ_id"
:key="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>
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
@@ -259,12 +318,12 @@
<el-form-item label="Affiliated organization :"> <el-form-item label="Affiliated organization :">
<el-checkbox-group v-model="editFomauthor.organs" class="suoshu_jigou"> <el-checkbox-group v-model="editFomauthor.organs" class="suoshu_jigou">
<el-checkbox <el-checkbox
v-for="item in mechanism" v-for="(item,index) in mechanism"
style="display: block" style="display: block"
:label="item.p_article_organ_id + ''" :label="item.p_article_organ_id + ''"
:key="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>
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
@@ -303,6 +362,7 @@
</h4> </h4>
<!-- 机构列表 --> <!-- 机构列表 -->
<el-table :data="schoolData" border class="table" ref="multipleTable" header-cell-class-name="table-header"> <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 prop="organ_name" label="Affiliation"></el-table-column>
<el-table-column label="" width="190" align="center"> <el-table-column label="" width="190" align="center">
<template slot-scope="scope"> <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> <h5 style="font-size: 16px; margin: 0 0 30px 0; letter-spacing: -0.5px">Improve information</h5>
<!-- 时间Doi简介信息 --> <!-- 时间Doi简介信息 -->
<el-form ref="Abs_Form" :model="detailMes" :rules="rules" label-width="150px" style="margin-top: 30px"> <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"> <el-form-item label="Doi :" prop="doi">
<span>https://doi.org/10.53388/</span> <span>https://doi.org/10.53388/</span>
<el-input v-model="detailMes.doi" style="margin-left: 10px; width: 325px"> </el-input> <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 comArtHtmlCreatNewProduce from './comArtHtmlCreatNewProduce.vue';
import commonTopic from '../page/components/article/topic.vue'; import commonTopic from '../page/components/article/topic.vue';
import commonRelated from '../page/components/article/Related.vue'; import commonRelated from '../page/components/article/Related.vue';
import Tinymce from '@/components/page/components/Tinymce';
export default { export default {
data() { data() {
return { return {
finalReview: null,
baseUrl: this.Common.baseUrl, baseUrl: this.Common.baseUrl,
mediaUrl: this.Common.mediaUrl, mediaUrl: this.Common.mediaUrl,
p_article_id: this.$route.query.id, p_article_id: this.$route.query.id,
@@ -1027,8 +1086,10 @@ export default {
], ],
detailMes: { detailMes: {
type: '', type: '',
journal_special_id: 'None' journal_special_id: 'None',
}, },
abstract: '',
opInstal: [], opInstal: [],
// opMedical: [ // opMedical: [
// { // {
@@ -1307,13 +1368,13 @@ export default {
trigger: 'blur' trigger: 'blur'
} }
], ],
abstract: [ // abstract: [
{ // {
required: true, // required: true,
message: 'Please enter abstract', // message: 'Please enter abstract',
trigger: 'blur' // trigger: 'blur'
} // }
], // ],
keywords: [ keywords: [
{ {
required: true, required: true,
@@ -1399,11 +1460,54 @@ export default {
this.getHight(); this.getHight();
window.addEventListener('resize', this.getHight); window.addEventListener('resize', this.getHight);
this.getData(); this.getData();
this.getAuthorJG(); this.getAuthorJG();
this.getCount(); this.getCount();
this.getWorldPdf(); this.getWorldPdf();
}, },
methods: { 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() { allLoad() {
let excelList = [ let excelList = [
'https://submission.tmrjournals.com/public/manuscirpt/20220831/c7d75d49bf25cf56906d56d07e00a31e.docx', '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.addFomauthor.p_article_id = this.p_article_id;
this.addFomschool.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.UpTypeFile.p_article_id = this.p_article_id;
this.abstract = ''
const loading = this.$loading({ const loading = this.$loading({
lock: true, lock: true,
text: 'Loading...', text: 'Loading...',
@@ -1455,8 +1559,9 @@ export default {
.then((res) => { .then((res) => {
if (res.code == 0) { if (res.code == 0) {
this.detailMes = res.data.production; this.detailMes = res.data.production;
this.abstract = res.data.production.abstract;
this.UpTyFIle = res.data.production.file_pdf; this.UpTyFIle = res.data.production.file_pdf;
this.getArticleFinal(res.data.production.article_id);
if (res.data.production.icon != '') { if (res.data.production.icon != '') {
this.imageUrl = this.mediaUrl + 'articleicon/' + res.data.production.icon; this.imageUrl = this.mediaUrl + 'articleicon/' + res.data.production.icon;
} }
@@ -1740,17 +1845,64 @@ export default {
neYStage(e) { neYStage(e) {
return e.stage_year + ' Vol.' + e.stage_vol + ' issue.' + e.stage_no + e.stage_pagename + e.stage_page; 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----保存稿件信息 // 1----保存稿件信息
ZsSaveMes() { async ZsSaveMes() {
var abstractStr = "";
if (this.detailMes.journal_stage_id == 0) { if (this.detailMes.journal_stage_id == 0) {
this.$message.error('Please select an installment!'); this.$message.error('Please select an installment!');
return; 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) => { this.$refs.Mes_Form.validate((valid) => {
if (valid) { if (valid) {
this.$api this.$api
.post('api/Production/editProduction', this.detailMes) .post('api/Production/editProduction', {...this.detailMes,abstract:abstractStr})
.then((res) => { .then((res) => {
if (res.code == 0) { if (res.code == 0) {
this.$message.success(`Successfully save the article!`); this.$message.success(`Successfully save the article!`);
@@ -2260,7 +2412,7 @@ export default {
this.$api this.$api
.post('api/Production/editArticleLast', { .post('api/Production/editArticleLast', {
p_article_id: this.detailMes.p_article_id, p_article_id: this.detailMes.p_article_id,
abstract: this.detailMes.abstract, // abstract: this.detailMes.abstract,
doi: this.detailMes.doi, doi: this.detailMes.doi,
pub_date: this.detailMes.pub_date pub_date: this.detailMes.pub_date
}) })
@@ -2853,9 +3005,9 @@ export default {
// 判断滚动条滚动距离是否大于当前滚动项可滚动距离 // 判断滚动条滚动距离是否大于当前滚动项可滚动距离
let judge = e.target.scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop; let judge = e.target.scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop;
if (judge) { if (judge) {
console.log('judge at line 2846:', judge)
this.tabIndex = i.toString(); this.tabIndex = i.toString();
console.log('this.tabIndex at line 2848:', this.tabIndex)
// 找对应的tab-name值 // 找对应的tab-name值
this.tabName = this.tabsList[this.tabIndex].refName; this.tabName = this.tabsList[this.tabIndex].refName;
// this.tabClick = this.tabsList[this.tabIndex].refName // this.tabClick = this.tabsList[this.tabIndex].refName
@@ -2865,12 +3017,13 @@ export default {
}, },
getHight() { getHight() {
this.contentStyleObj.height = window.innerHeight - 120 + 'px'; this.contentStyleObj.height = window.innerHeight - 140 + 'px';
// this.jumpTab(0,this.tabsList[0]) // this.jumpTab(0,this.tabsList[0])
} }
}, },
components: { components: {
quillEditor, quillEditor,
Tinymce,
PreIngestedEditorProduce, PreIngestedEditorProduce,
comArtHtmlCreatNewProduce, comArtHtmlCreatNewProduce,
commonTopic, commonTopic,
@@ -2878,7 +3031,15 @@ export default {
} }
}; };
</script> </script>
<style scoped>
.editorial_advisory_board {
margin-bottom: 20px;
list-style: none;
line-height: 18px;
color: #888;
font-size: 12px;
}
</style>
<style> <style>
.handle-box { .handle-box {
margin-bottom: 20px; margin-bottom: 20px;
@@ -2892,7 +3053,7 @@ export default {
background-color: #fafafa; background-color: #fafafa;
position: absolute; position: absolute;
left: 25px; left: 25px;
top: 60px; top: 40px;
width: 220px; width: 220px;
z-index: 50; z-index: 50;
} }

View File

@@ -11,7 +11,7 @@
</el-breadcrumb> </el-breadcrumb>
</div> </div>
<div class="container"> <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> <div>
<el-button type="primary" icon="el-icon-plus" @click="openAddRev">Reviewer Bank</el-button> <el-button type="primary" icon="el-icon-plus" @click="openAddRev">Reviewer Bank</el-button>
@@ -120,7 +120,7 @@
></el-pagination> ></el-pagination>
</div> </div>
</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 <el-table
:data="tableSuggest" :data="tableSuggest"
border border
@@ -130,9 +130,10 @@
header-cell-class-name="table-header" header-cell-class-name="table-header"
empty-text="New messages (0)" empty-text="New messages (0)"
> >
<el-table-column prop="account" label="Email"></el-table-column> <el-table-column prop="account" label="Email" width="180"></el-table-column>
<el-table-column prop="realname" label="Realname"></el-table-column> <el-table-column prop="realname" label="Realname" width="180"></el-table-column>
<el-table-column prop="cmajor" label="Major"></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"> <el-table-column label="" width="120" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="mini" type="primary" plain icon="el-icon-check" @click="selSuggest(scope.row)"> Select</el-button> <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>
<div class="container"> <div class="container">
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="16"> <el-col :span="20">
<div class="form-box"> <div class="form-box" style="width: 100%;">
<el-form ref="articleform" :model="detailDate" label-width="130px"> <el-form ref="articleform" :model="detailDate" label-width="130px">
<el-form-item label="Article"> <el-form-item label="Article">
<span>{{ detailDate.article }}</span> <span>{{ detailDate.article }}</span>
@@ -23,15 +23,176 @@
<el-form-item label="CreateTime"> <el-form-item label="CreateTime">
<span>{{ formatDate(detailDate.ctime) }}</span> <span>{{ formatDate(detailDate.ctime) }}</span>
</el-form-item> </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> <span>{{ mystate(detailDate.state) }}</span>
<el-button style="margin-left: 10px" type="text" @click="dialogFormVisible = true" icon="el-icon-view" <el-button style="margin-left: 10px" type="text" @click="dialogFormVisible = true" icon="el-icon-view"
>See Feedback</el-button >See Feedback</el-button
> >
</el-form-item> </el-form-item> -->
<el-form-item v-if="canRepeat == 1"> <el-form-item v-if="canRepeat == 1">
<el-button type="primary" @click="createRevision">Re-review</el-button> <el-button type="primary" @click="createRevision">Re-review</el-button>
</el-form-item> </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-form-item label="Article file">
<el-popover placement="right" width="350" trigger="click"> <el-popover placement="right" width="350" trigger="click">
<el-table :data="articlefileList"> <el-table :data="articlefileList">
@@ -751,6 +912,7 @@ export default {
FdialogFormVisible: false, FdialogFormVisible: false,
dialogFormVisible1: false, dialogFormVisible1: false,
recordList: [], recordList: [],
reviewList: [],
journal_id: null, journal_id: null,
baseUrl: this.Common.baseUrl, baseUrl: this.Common.baseUrl,
mediaUrl: this.Common.mediaUrl, mediaUrl: this.Common.mediaUrl,
@@ -812,11 +974,44 @@ export default {
created: function () { created: function () {
this.getDate(); this.getDate();
this.initFileList(); this.initFileList();
this.initquesion(); this.initquesion();
this.getHistoryList(); this.getHistoryList();
}, },
computed: {}, computed: {},
methods: { 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) { showSecondReview(item) {
this.FdialogFormVisible = true; this.FdialogFormVisible = true;
@@ -853,18 +1048,73 @@ export default {
this.FdialogFormVisible = false; this.FdialogFormVisible = false;
this.ReReviewQuestion = {}; 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.loading = true;
this.$api this.$api
.post('api/Reviewer/getReviewerRepeatDetail', { .post('api/Reviewer/getReviewerRepeatDetail', {
art_rev_id: this.$route.query.id art_rev_id: this.$route.query.id
}) })
.then((res) => { .then(async(res) => {
this.loading = false; this.loading = false;
if (res.code == 0) { 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) { 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 { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
@@ -937,6 +1187,7 @@ export default {
this.canRepeat = res.can_repeat; this.canRepeat = res.can_repeat;
this.journal_id = res.journal_id; this.journal_id = res.journal_id;
this.articleId = res.article_id; this.articleId = res.article_id;
this.getReviewList()
}) })
.catch((err) => { .catch((err) => {
console.log(err); console.log(err);
@@ -1039,6 +1290,15 @@ export default {
this.$message.error('服务器上传错误' + res.msg); 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) { formatDate(timestamp) {
var date = new Date(timestamp * 1000); //时间戳为10位需*1000时间戳为13位的话不需乘1000 var date = new Date(timestamp * 1000); //时间戳为10位需*1000时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-'; var Y = date.getFullYear() + '-';
@@ -1101,5 +1361,41 @@ export default {
} }
::v-deep .el-dialog__body{ ::v-deep .el-dialog__body{
padding: 10px 20px 20px !important; 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> </style>

View File

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

View File

@@ -696,7 +696,7 @@ export default {
//获取内容 //获取内容
async getContent(type) { async getContent(type) {
var content = window.tinymce.get(this.tinymceId).getContent(); 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(/<span[^>]*>/g, '').replace(/<\/span>/g, ''); // 去除span标签
content = content.replace(/<strong>/g, '<b>').replace(/<\/strong>/g, '</b>'); 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-dropdown" v-if="showDropdown && filteredJournals.length">
<div class="journal-item" v-for="journal in filteredJournals" :key="journal.id" @click="selectJournal(journal)"> <div class="journal-item" v-for="journal in filteredJournals" :key="journal.id" @click="selectJournal(journal)">
<div class="flexBox alignCenter justBetween"> <div class="flexBox alignCenter justBetween">
<img <img v-if="journal.journal_icon"
:src="journalUrl+journal.journal_icon" :src="journalUrl+journal.journal_icon"
:alt="journal.title" :alt="journal.title"
class="" class=""
style="width: 35px; height: 45px" 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 class="journal-title">{{ journal.title }}</div>
</div> </div>
</div> </div>
@@ -87,7 +88,7 @@ export default {
}, },
data() { data() {
return { return {
journalUrl: 'https://www.tmrjournals.com/public/journalicon/', journalUrl: '',
searchTerm: '', searchTerm: '',
showDropdown: false, showDropdown: false,
selectedJournal: null, selectedJournal: null,

View File

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

View File

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

View File

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

View File

@@ -74,34 +74,62 @@
Batch Add content Batch Add content
</li> </li>
</ul> </ul>
</div> --> <li </div> -->
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()"
<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;
Manuscirpt AI Proofreading margin-left: 10px;
line-height: 26px;
padding: 2px 10px;
background-color: #006699 !important;
color: #fff;
border: 1px solid #006699;
">{{ $t('commonTable.ManuscirptAIProofreading') }}</div>
</li> </li>
</div> </div>
<div style="padding: 0 0px; float: right"> <div style="padding: 0 0px; float: right">
<ul class="operateBox" > <ul class="operateBox">
<div style="border-right: 1px solid #d8d8d8; padding: 0 20px"> <div style="border-right: 1px solid #d8d8d8; padding: 0 20px">
<ul class="HTitleBox" style="border: none"> <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> <i class="el-icon-document" style="margin-right: 2px"> </i>
Batch Add content {{ $t('commonTable.BatchAddcontent') }}
</li> </li>
</ul> </ul>
</div> </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> <i class="el-icon-document-add" style="margin-top: 2px"></i>
Row {{ $t('commonTable.Row') }}
</li> </li>
<!-- <li style="" @click="onEdit"> <!-- <li style="" @click="onEdit">
@@ -110,10 +138,10 @@
Edit Edit
</li> --> </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> <i class="el-icon-delete" style="margin-top: 2px"></i>
{{ $t('commonTable.delete') }}
Delete
</li> </li>
</ul> </ul>
</div> </div>
@@ -137,21 +165,23 @@
position: relative; 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> --> <!-- <common-late-x></common-late-x> -->
<template v-for="(item, index) in wordList"> <template v-for="(item, index) in wordList" >
<el-checkbox <el-checkbox
@change="updateUniqueIds"
@change="(e)=>updateUniqueIds(e,item.am_id)"
v-if="!isPreview" v-if="!isPreview"
v-model="item.checked" :value="isChecked(item.am_id)"
style="position: absolute; left: -20px; width: 8px; height: 8px; margin-top: 8px; z-index: 10" style="position: absolute; left: -20px; width: 8px; height: 8px; margin-top: 8px; z-index: 10"
></el-checkbox> ></el-checkbox>
<span <span
@click="handleClickProofreadingList([item.am_id])" @click="handleClickProofreadingList([item.am_id])"
v-if="!isPreview&& v-if="
!isPreview &&
isEditComment && isEditComment &&
item.proof_read_num && item.proof_read_num &&
item.proof_read_num > 0 && item.proof_read_num > 0 &&
@@ -175,7 +205,14 @@
> >
<span <span
@click="handleClickProofreadingList([item.am_id])" @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=" style="
z-index: 2; z-index: 2;
background-color: #fff; background-color: #fff;
@@ -192,7 +229,14 @@
></span> ></span>
<span <span
@click="handleClickProofreadingList([item.am_id])" @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=" style="
z-index: 2; z-index: 2;
background-color: #fff; background-color: #fff;
@@ -209,7 +253,7 @@
></span> ></span>
<span <span
@click="handleClickProofreadingList([item.am_id])" @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=" style="
z-index: 2; z-index: 2;
background-color: #fff; background-color: #fff;
@@ -449,7 +493,7 @@
</div> </div>
<div class="pagination-box" style="" v-if="isEditComment && activeName == 'proofreading'"> <div class="pagination-box" style="" v-if="isEditComment && activeName == 'proofreading'">
<el-tooltip <el-tooltip
v-if="totalItems > 0&&totalNumbers>0" v-if="totalItems > 0 && totalNumbers > 0"
class="item" class="item"
effect="dark" effect="dark"
:content="`There are ${totalItems} paragraphs with unresolved errors in the Manuscirpt`" :content="`There are ${totalItems} paragraphs with unresolved errors in the Manuscirpt`"
@@ -1020,11 +1064,6 @@
</el-tabs> </el-tabs>
</div> </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` }"> <div v-if="isMenuVisible" class="context-menu" :style="{ top: `${menuPosition.y}px`, left: `${menuPosition.x}px` }">
<ul> <ul>
@@ -1292,7 +1331,7 @@ export default {
} }
}, },
comments: { comments: {
type: Object, type: [Array, Object], // 允许数组或对象
default() { default() {
return {}; return {};
@@ -1409,7 +1448,7 @@ export default {
formLabelWidth: '120px', formLabelWidth: '120px',
hasChange: false, hasChange: false,
hasInit: false, hasInit: false,
// selectedIds:[], selectedIds:[],
tinymceId: this.id || 'vue-tinymce-' + +new Date() tinymceId: this.id || 'vue-tinymce-' + +new Date()
}; };
}, },
@@ -1417,9 +1456,12 @@ export default {
watch: { watch: {
contentList: { contentList: {
handler(val) { handler(val) {
console.log('val at line 550:', val);
if (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') { if (this.isEditComment && this.activeName == 'proofreading') {
this.calcMarkers(); this.calcMarkers();
} }
@@ -1433,7 +1475,7 @@ export default {
}, },
totalNumbers: { totalNumbers: {
handler(val) { handler(val) {
console.log('val at line 550:', val);
if (val == 0) { if (val == 0) {
this.markers = []; this.markers = [];
} }
@@ -1459,9 +1501,10 @@ export default {
return Object.assign({}, group, { data: data.slice().sort(cmp) }); return Object.assign({}, group, { data: data.slice().sort(cmp) });
}); });
}, },
selectedIds() { // selectedIds() {
return this.wordList.filter((item) => item.checked).map((item) => item.am_id);
} // return this.wordList.filter(item => item.checked).map(item => item.am_id);
// }
}, },
updated() { updated() {
// 恢复子组件的滚动位置 // 恢复子组件的滚动位置
@@ -1518,21 +1561,32 @@ export default {
this.editors = {}; this.editors = {};
}, },
methods: { methods: {
handleClickAI(){ isChecked(am_id) {
this.$api.post('api/Proofread/proofReadByArticle', {
article_id:this.$route.query.id
}).then(async (res) => {
if (res.status == 1 ) {
this.$message.success(res.msg); // 返回一个函数,接收 am_id 并判断是否存在
if(this.selectedIds.includes(am_id)){
return true
}else{ }else{
this.$message.error(res.msg); return false
} }
},
}).catch((err) => { handleClickAI() {
this.$message.error(err.message); 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() { showcurrentItemIndex() {
var index = this.markers.findIndex((e) => e.am_id == this.currentSelectProofreadingId); var index = this.markers.findIndex((e) => e.am_id == this.currentSelectProofreadingId);
@@ -1603,7 +1657,7 @@ export default {
this.$forceUpdate(); this.$forceUpdate();
} }
console.log('this.totalNumbers at line 1474:', this.totalNumbers);
this.$forceUpdate(); this.$forceUpdate();
} }
}); });
@@ -1646,9 +1700,7 @@ export default {
this.markers = out.sort((a, b) => a.top - b.top); this.markers = out.sort((a, b) => a.top - b.top);
if (this.markers.length > 0) { if (this.markers.length > 0) {
this.totalItems = this.markers.length; 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,7 +1826,7 @@ export default {
}, },
handleClick(tab, event) { handleClick(tab, event) {
console.log(tab, event); console.log(tab, event);
if(this.isEditComment){ if (this.isEditComment) {
if (tab.index == 0) { if (tab.index == 0) {
this.activeName == 'proofreading'; this.activeName == 'proofreading';
this.isShowPiZhu = false; this.isShowPiZhu = false;
@@ -1787,7 +1839,7 @@ export default {
this.activeName == 'Comment'; this.activeName == 'Comment';
this.isShowPiZhu = true; this.isShowPiZhu = true;
} }
}else{ } else {
this.proofreadingList = []; this.proofreadingList = [];
this.markers = []; this.markers = [];
this.currentSelectProofreadingId = ''; this.currentSelectProofreadingId = '';
@@ -1796,7 +1848,6 @@ export default {
this.getCommentsData(); this.getCommentsData();
} }
this.$nextTick(() => { this.$nextTick(() => {
window.renderMathJax(); window.renderMathJax();
}); });
@@ -1873,9 +1924,21 @@ export default {
addContent() { addContent() {
if (this.currentId) { if (this.currentId) {
this.$emit('addContent', this.currentId); this.$emit('addContent', this.currentId);
} else if (this.selectedIds && this.selectedIds.length > 0) {
if (this.selectedIds.length == 1) {
this.$emit('addContent', this.selectedIds[0]);
} else { } else {
this.$message.warning('Please select content'); this.$message.warning(this.$t('commonTable.selectOne'));
return;
} }
}else{
this.$message.warning('Please select content');
return;
}
}, },
cacheSelection() { cacheSelection() {
const selection = window.getSelection(); const selection = window.getSelection();
@@ -1965,22 +2028,54 @@ export default {
this.cachedMainId = null; this.cachedMainId = null;
this.cachedType = null; this.cachedType = null;
}, },
updateUniqueIds() { updateUniqueIds(e,am_id) {
this.currentId = null; this.currentId = null;
this.currentData = {}; 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))]; if (e ) {
// console.log('this.uniqueIds at line 839:', this.selectedIds); // 数组:不存在则添加
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(); this.$forceUpdate();
}, },
handleUncheck() {
this.currentId = null;
this.currentData = {};
this.selectedIds = [];
this.$forceUpdate()
},
onEdit() { onEdit() {
this.currentData = this.currentData;
this.$emit('onEdit', this.currentId); this.$emit('onEdit', this.currentId);
}, },
onAddRow() { onAddRow() {
this.currentData = this.currentData; if (this.currentId) {
this.$emit('onAddRow', 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() { onDelete() {
// console.log('this.uniqueIds.length at line 866:', this.selectedIds.length); // console.log('this.uniqueIds.length at line 866:', this.selectedIds.length);
@@ -1989,8 +2084,11 @@ export default {
this.$forceUpdate(); this.$forceUpdate();
} }
if (this.currentId) { else if (this.currentId) {
this.$emit('onDelete', 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) { 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 refreshData = { ...this.wordList.find((e) => e.am_id == am_id) };
var refreshDataIndex = this.wordList.findIndex((e) => e.am_id == am_id); var refreshDataIndex = this.wordList.findIndex((e) => e.am_id == am_id);
if (refreshData.type == 0) { if (refreshData.type == 0) {
this.$nextTick(() => { this.$nextTick(() => {
if (newData.am_id_count || newData.am_id_count == 0) { if (newData.am_id_count || newData.am_id_count == 0) {
this.wordList[refreshDataIndex].proof_read_num = newData.am_id_count; this.wordList[refreshDataIndex].proof_read_num = newData.am_id_count;
} }
if (newData.sum_count || newData.sum_count == 0) { if (newData.sum_count || newData.sum_count == 0) {
this.totalNumbers = newData.sum_count; this.totalNumbers = newData.sum_count;
}
}if (type != 'delete') { if (type != 'delete') {
this.wordList[refreshDataIndex].content = newData.content; this.wordList[refreshDataIndex].content = newData.content;
this.wordList[refreshDataIndex].text = newData.content; this.wordList[refreshDataIndex].text = newData.content;
} }
@@ -2540,7 +2636,7 @@ export default {
item.checked = false; item.checked = false;
}); });
if (!this.isPreview) { if (!this.isPreview) {
if (this.isEditComment&&this.activeName=='proofreading') { if (this.isEditComment && this.activeName == 'proofreading') {
if (type == 'text') { if (type == 'text') {
this.getProofreadingList([id]); this.getProofreadingList([id]);
this.getPList(id); this.getPList(id);
@@ -2630,36 +2726,32 @@ export default {
await this.goToComment(data.am_id, fn); await this.goToComment(data.am_id, fn);
}, },
divOnScroll() { divOnScroll() {
if (!this.isPreview) { if (!this.isPreview) {
const sc = this.$refs.scrollDiv; // ★ 用 scrollDiv const sc = this.$refs.scrollDiv; // ★ 用 scrollDiv
var rail = null; var rail = null;
if(this.isEditComment){ if (this.isEditComment) {
rail = this.$refs.rail; rail = this.$refs.rail;
} }
if (this.isEditComment) {
if(this.isEditComment){
if (!sc || !rail) return; if (!sc || !rail) return;
}else{ } else {
rail=null rail = null;
if (!sc) return; if (!sc) return;
} }
console.log('sc at line 2618:', sc)
const contentH = sc.scrollHeight, const contentH = sc.scrollHeight,
viewH = sc.clientHeight; viewH = sc.clientHeight;
const scrollRange = Math.max(1, contentH - viewH); const scrollRange = Math.max(1, contentH - viewH);
if(rail&&this.isEditComment){ if (rail && this.isEditComment) {
const railH = rail.clientHeight; const railH = rail.clientHeight;
this.viewportHeight = Math.max(6, railH * (viewH / contentH)); this.viewportHeight = Math.max(6, railH * (viewH / contentH));
const vpRange = Math.max(1, railH - this.viewportHeight); const vpRange = Math.max(1, railH - this.viewportHeight);
this.viewportTop = Math.round(this.mapRange(sc.scrollTop, 0, scrollRange, 0, vpRange)); this.viewportTop = Math.round(this.mapRange(sc.scrollTop, 0, scrollRange, 0, vpRange));
} }
this.isMenuVisible = false; this.isMenuVisible = false;
this.currentId = null; this.currentId = null;
this.currentData = {}; this.currentData = {};
@@ -3064,8 +3156,6 @@ export default {
}); });
}, },
getCommentsData() { getCommentsData() {
if (!this.isPreview) { if (!this.isPreview) {
this.clearHighlight(); this.clearHighlight();
const divs = document.querySelectorAll('.pMain'); const divs = document.querySelectorAll('.pMain');
@@ -3091,7 +3181,7 @@ export default {
}); });
this.commentList = []; this.commentList = [];
this.visibleDivs = [...visibleDivs]; this.visibleDivs = [...visibleDivs];
console.log('this.visibleDivs at line 3055:', this.visibleDivs)
this.visibleDivs.forEach((e) => { this.visibleDivs.forEach((e) => {
this.commentList.push({ this.commentList.push({
@@ -3110,7 +3200,7 @@ export default {
this.isEditComment = true; this.isEditComment = true;
this.isShowPiZhu = false; this.isShowPiZhu = false;
this.activeName = 'proofreading'; this.activeName = 'proofreading';
this.rightW = 610; this.rightW = 510;
} else { } else {
this.isEditComment = false; this.isEditComment = false;
this.isShowPiZhu = true; this.isShowPiZhu = true;
@@ -3126,7 +3216,7 @@ export default {
this.isUserEditComment = false; this.isUserEditComment = false;
this.isShowPiZhu = false; this.isShowPiZhu = false;
this.activeName = 'proofreading'; this.activeName = 'proofreading';
this.rightW = 610; this.rightW = 510;
} }
if (this.isEditComment) { if (this.isEditComment) {
this.$nextTick(() => requestAnimationFrame(this.initMarkersList)); this.$nextTick(() => requestAnimationFrame(this.initMarkersList));
@@ -4064,7 +4154,7 @@ export default {
display: flex; display: flex;
} }
.operateBox li { .operateBox li {
min-width: 55px; min-width: 50px;
display: flex; display: flex;
/* flex-direction: column; */ /* flex-direction: column; */
justify-content: space-between; justify-content: space-between;

View File

@@ -18,9 +18,9 @@
<!-- <img src="../../assets/img/icon_5.png" alt="" class="icon_img"> --> <!-- <img src="../../assets/img/icon_5.png" alt="" class="icon_img"> -->
Final Decision Final Decision
</h2> </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 detail to review
or change your comments. or change your comments. -->
</div> </div>
<ul class="ta1_uli ta1_ulicad"> <ul class="ta1_uli ta1_ulicad">
<li v-for="(item,index) in tableData1"> <li v-for="(item,index) in tableData1">
@@ -51,7 +51,68 @@
</ul> </ul>
</el-col> </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"> <!-- <el-col :span="24">
<div style="background-color: #ccc;height: 2px;width: 100%;margin: 30px 0 5px 0;"></div> <div style="background-color: #ccc;height: 2px;width: 100%;margin: 30px 0 5px 0;"></div>
@@ -142,6 +203,63 @@
this.getData(); this.getData();
}, },
methods: { 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() { getData() {
this.$api this.$api
@@ -166,7 +284,29 @@
this.$message.error(err); 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" size="mini"
@click="saveNow(scope.$index, scope.row)" @click="saveNow(scope.$index, scope.row)"
v-if="scope.row.state == 5" v-if="scope.row.state == 5"
>Accept for final decision >I agree to conduct the final review
</el-button> </el-button>
<el-button <el-button
type="danger" type="danger"
size="mini" size="mini"
@click="saveRef(scope.$index, scope.row)" @click="saveRef(scope.$index, scope.row)"
v-if="scope.row.state == 5" v-if="scope.row.state == 5"
>Decline final review >I decline to conduct the final review
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
@@ -297,7 +297,7 @@ this.getDate(data.id)
// 获取数据 // 获取数据
getTable() { getTable() {
this.$api this.$api
.post('api/Finalreview/lists', this.query) .post('api/Finalreview/lists', {...this.query,state:'1,2,3'})
.then((res) => { .then((res) => {
if (res.status == 1) { if (res.status == 1) {
this.loading = false; this.loading = false;

View File

@@ -42,9 +42,9 @@
</el-col> </el-col>
</el-row> </el-row>
<div style="text-align: center;margin-top: 12px;"> <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>
<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> </div>
</el-card> </el-card>
<el-card class="box-card" style="font-size: 15px;line-height: 24px;" v-if="finalState==0"> <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 state:this.state
}) })
.then((res) => { .then((res) => {
console.log('res at line 191:', res);
if (res.code == 0) { if (res.code == 0) {
this.orderList = res.data.list; this.orderList = res.data.list;

View File

@@ -2,9 +2,7 @@
<div> <div>
<div class="crumbs"> <div class="crumbs">
<el-breadcrumb separator="/"> <el-breadcrumb separator="/">
<el-breadcrumb-item> <el-breadcrumb-item> <i class="el-icon-collection"></i> <span class="top_dao"> Review History</span> </el-breadcrumb-item>
<i class="el-icon-collection"></i> <span class="top_dao"> Review History</span>
</el-breadcrumb-item>
</el-breadcrumb> </el-breadcrumb>
</div> </div>
<div class="container_l"> <div class="container_l">
@@ -18,13 +16,24 @@
</div> --> </div> -->
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<el-card class="box-card" v-loading="loading" element-loading-text="Loading..." <el-card
element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.8)"> class="box-card"
<el-table :data="tableData3" border class="table" ref="multipleTable" v-loading="loading"
header-cell-class-name="table-header" empty-text="New messages (0)"> 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="article_title" label="Article Title"></el-table-column>
<el-table-column prop="journal_title" label="Journal"></el-table-column> <el-table-column prop="journal_title" label="Journal" width="300"></el-table-column>
<el-table-column prop="ctime" label="Reviewed time" width="140"></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"> <el-table-column label="Article Status" width="130" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<b v-if="scope.row.astate == 0">Received</b> <b v-if="scope.row.astate == 0">Received</b>
@@ -37,11 +46,147 @@
<b v-if="scope.row.astate == 6">Pre-accept</b> <b v-if="scope.row.astate == 6">Pre-accept</b>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="State" align="center" width="120">
<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"> <template slot-scope="scope">
<span style="font-size: 16px;"v-html="revstate(scope.row)"></span> <!-- <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> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="Recommendation" width="160" align="center"> <!-- <el-table-column label="Recommendation" width="160" align="center">
@@ -50,23 +195,38 @@
<b v-if="scope.row.recommend == 3||scope.row.recommend == 4">Reject</b> <b v-if="scope.row.recommend == 3||scope.row.recommend == 4">Reject</b>
</template> </template>
</el-table-column> --> </el-table-column> -->
<el-table-column label=" " width="230"> <el-table-column label=" " width="130">
<template slot-scope="scope"> <template slot-scope="scope">
<router-link <router-link
:to="{path:'/perhistory_commen',query:{Art_id:scope.row.article_id,Rev_id:scope.row.art_rev_id}}" :to="{
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)"> path: '/perhistory_commen',
<el-button type="primary" plain style="margin-right: 10px;">All Comments query: { Art_id: scope.row.article_id, Rev_id: scope.row.art_rev_id }
</el-button> }"
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> </router-link>
<el-button type="warning" plain @click="cerFicte(scope.$index, scope.row)" <el-button
v-if="scope.row.state==1||scope.row.state==2||scope.row.state==3">Certificate 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> </el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="pagination"> <div class="pagination">
<el-pagination layout="total, prev, pager, next" :current-page="TaBle3.pageIndex" <el-pagination
:page-size="TaBle3.pageSize" :total="link_Tota3" @current-change="handlePageChange3"> layout="total, prev, pager, next"
:current-page="TaBle3.pageIndex"
:page-size="TaBle3.pageSize"
:total="link_Tota3"
@current-change="handlePageChange3"
>
</el-pagination> </el-pagination>
</div> </div>
</el-card> </el-card>
@@ -77,12 +237,11 @@
</el-dialog> </el-dialog>
<el-dialog :visible.sync="feilVisible" width="600px" :close-on-click-modal="false"> <el-dialog :visible.sync="feilVisible" width="600px" :close-on-click-modal="false">
<h2 style="text-align: center;">No certificate</h2> <h2 style="text-align: center">No certificate</h2>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button type="primary" @click="feilVisible=false">OK</el-button> <el-button type="primary" @click="feilVisible = false">OK</el-button>
</span> </span>
</el-dialog> </el-dialog>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
@@ -90,7 +249,7 @@
</template> </template>
<script> <script>
export default { export default {
data() { data() {
return { return {
loading: false, loading: false,
@@ -107,21 +266,37 @@
IMG_Url: '', IMG_Url: '',
cerVisible: false, cerVisible: false,
feilVisible: false, feilVisible: false,
dynamicTags: [{ dynamicTags: [
{
label: 'Submission System 2.0', label: 'Submission System 2.0',
title: 'Update Notifications', title: 'Update Notifications',
content: "The reviewers can check all reviewers ' comments when the manuscripts get final review." content: "The reviewers can check all reviewers ' comments when the manuscripts get final review."
}], }
]
}; };
}, },
mounted() { mounted() {},
},
created() { created() {
this.loading = true; this.loading = true;
this.getTable(); this.getTable();
}, },
methods: { methods: {
maxRepeatReviewCount(list) {
if (!list || !Array.isArray(list)) return null; // 边界处理无数据返回null
// 遍历所有评审者找到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) { revstate(row, column, cellValue, index) {
let frag = ''; let frag = '';
if (row.state == 0) { if (row.state == 0) {
@@ -149,14 +324,14 @@
getTable() { getTable() {
this.$api this.$api
.post('api/Reviewer/getReviewerDetail1', this.query) .post('api/Reviewer/getReviewerDetail1', this.query)
.then(res => { .then((res) => {
if (res.code == 0) { if (res.code == 0) {
this.getData(); this.getData();
} else { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
} }
}) })
.catch(err => { .catch((err) => {
this.$message.error(err); this.$message.error(err);
}); });
}, },
@@ -164,18 +339,17 @@
getData() { getData() {
this.$api this.$api
.post('api/Reviewer/getReviewerListHistory', this.TaBle3) .post('api/Reviewer/getReviewerListHistory', this.TaBle3)
.then(res => { .then((res) => {
this.loading = false this.loading = false;
if (res.code == 0) { if (res.code == 0) {
if (res.data.lists != '') { if (res.data.lists != '') {
for (let i = 0; i < res.data.lists.length; i++) { for (let i = 0; i < res.data.lists.length; i++) {
if (res.data.lists[i].recommenttime == null) { if (res.data.lists[i].recommenttime == null) {
res.data.lists[i].ctime = '' res.data.lists[i].ctime = '';
} else { } else {
let date = new Date(parseInt(res.data.lists[i].recommenttime) * 1000); let date = new Date(parseInt(res.data.lists[i].recommenttime) * 1000);
let Y = date.getFullYear() + '-'; let Y = date.getFullYear() + '-';
let M = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) + '-' : date let M = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) + '-' : date.getMonth() + 1 + '-';
.getMonth() + 1 + '-';
let D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); let D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
res.data.lists[i].ctime = Y + M + D; res.data.lists[i].ctime = Y + M + D;
} }
@@ -187,8 +361,8 @@
this.$message.error(res.msg); this.$message.error(res.msg);
} }
}) })
.catch(err => { .catch((err) => {
this.loading = false this.loading = false;
this.$message.error(err); this.$message.error(err);
}); });
}, },
@@ -204,45 +378,79 @@
cerFicte(index, row) { cerFicte(index, row) {
this.$api this.$api
.post('api/Reviewer/getZSimg', { .post('api/Reviewer/getZSimg', {
'art_rev_id': row.art_rev_id art_rev_id: row.art_rev_id
}) })
.then(res => { .then((res) => {
if (res.code == 0) { if (res.code == 0) {
this.IMG_Url = this.Common.mediaUrl + res.data.icon this.IMG_Url = this.Common.mediaUrl + res.data.icon;
this.cerVisible = true; this.cerVisible = true;
} else { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
this.feilVisible = true; this.feilVisible = true;
} }
}) })
.catch(err => { .catch((err) => {
this.$message.error(err); this.$message.error(err);
}); });
}, },
// 关闭标签 // 关闭标签
handleClose(tag) { handleClose(tag) {
// this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1); // this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
this.dynamicTags = [] this.dynamicTags = [];
},
},
filters: {
},
watch: {
} }
}; },
filters: {},
watch: {}
};
</script> </script>
<style scoped>
.review_table {
width: 100% !important;
background-color: #fff !important;
/* margin-top: 10px; */
border-collapse: collapse !important; /* 合并表格边框 */
}
.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;
}
.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> <style>
.table { .table {
width: 100%; width: 100%;
font-size: 14px; font-size: 14px;
} }
.rev_digol .el-image__placeholder { .rev_digol .el-image__placeholder {
background-image: url(../../assets/img/loading.gif); background-image: url(../../assets/img/loading.gif);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center center; background-position: center center;
@@ -250,5 +458,19 @@
width: 560px; width: 560px;
height: 400px; height: 400px;
background-color: #fff; 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> </style>

View File

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

View File

@@ -2,122 +2,156 @@
<div> <div>
<div class="crumbs"> <div class="crumbs">
<el-breadcrumb separator="/"> <el-breadcrumb separator="/">
<el-breadcrumb-item> <el-breadcrumb-item> <i class="el-icon-user"></i> Young Scientist Apply list </el-breadcrumb-item>
<i class="el-icon-user"></i> Young Scientist Apply list
</el-breadcrumb-item>
</el-breadcrumb> </el-breadcrumb>
</div> </div>
<div class="container" style="min-width: 1000px;"> <div class="container" style="min-width: 1000px; padding: 0px">
<el-table :data="tableData" border stripe class="table" ref="multipleTable" <el-table :data="tableData" border stripe class="table" ref="multipleTable" header-cell-class-name="table-header">
header-cell-class-name="table-header">
<el-table-column label="No." align="center" width="50"> <el-table-column label="No." align="center" width="50">
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.$index+1}} {{ scope.$index + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="Base Information" width="320px"> <el-table-column label="Base Information" width="320px">
<template slot-scope="scope"> <template slot-scope="scope">
<p class="tab_tie_col"><span>Apply Journal: </span>{{ scope.row.title }}</p>
<p class="tab_tie_col"> <p class="tab_tie_col">
<span>Apply Journal: </span>{{scope.row.title}} <span>Realname: </span><b style="font-size: 13px; letter-spacing: -0.5px">{{ scope.row.realname }}</b>
</p> </p>
<p class="tab_tie_col"> <p class="tab_tie_col"><span>Title: </span>{{ scope.row.technical }}</p>
<span>Realname: </span><b style="font-size: 15px;letter-spacing: -0.5px;">{{scope.row.realname}}</b> <p class="tab_tie_col"><span>Email: </span>{{ scope.row.email }}</p>
</p> <p class="tab_tie_col" v-if="scope.row.phone != ''"><span>Phone: </span>{{ scope.row.phone }}</p>
<p class="tab_tie_col"> <p class="tab_tie_col" v-if="scope.row.starList_mark != 0">
<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> <span>Grade: </span>
<font style="display: inline-block;"> <font style="display: inline-block">
<img src="../../assets/img/star-all.png" v-for="item in scope.row.starList" <img
v-if="scope.row.starList_mark<=8&&item.star==1" class="starSty"> src="../../assets/img/star-all.png"
<img src="../../assets/img/star-traf.png" v-for="item in scope.row.starList" v-for="item in scope.row.starList"
v-if="scope.row.starList_mark<=8&&item.star==0" class="starSty"> v-if="scope.row.starList_mark <= 8 && item.star == 1"
<img src="../../assets/img/star-none.png" v-for="item in scope.row.starList" class="starSty"
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" <img
class="starSty"> src="../../assets/img/star-traf.png"
<b style="font-size: 15px;color: #b77614;" v-if="scope.row.starList_mark>8">× v-for="item in scope.row.starList"
{{scope.row.starList_mark}}</b> 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> </font>
</p> </p>
<p class="tab_tie_col"> <p class="tab_tie_col"><span>Apply Time: </span>{{ formatDate(scope.row.ap_time) }}</p>
<span>Apply Time: </span>{{formatDate(scope.row.ap_time)}}
</p>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="Other Information"> <el-table-column label="Other Information">
<template slot-scope="scope"> <template slot-scope="scope">
<p class="tab_tie_col" v-if="scope.row.cvs.length>0"> <p class="tab_tie_col" v-if="scope.row.cvs.length > 0">
<span>CV.: </span> <span>CV.: </span>
<img src="../../assets/img/icon_0.png" alt="" <img src="../../assets/img/icon_0.png" alt="" style="vertical-align: middle; margin-left: 10px" />
style="vertical-align: middle;margin-left: 10px;"> <span style="margin-left: 20px; color: #888; font-size: 13px">
<span style="margin-left: 20px;color: #888;font-size: 13px;">
<i class="el-icon-paperclip"></i> <i class="el-icon-paperclip"></i>
{{formatDate(scope.row.cvs[scope.row.cvs.length-1].ctime)}} {{ formatDate(scope.row.cvs[scope.row.cvs.length - 1].ctime) }}
</span> </span>
<a :href="mediaUrl+'reviewer/'+scope.row.cvs[scope.row.cvs.length-1].cv" target="_blank" class="txt_pdf"> <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> <b class="el-icon-download" style="color: #006699; font-weight: bold"></b>
</a> </a>
</p> </p>
<p class="tab_tie_col"> <p class="tab_tie_col"><span>Field: </span>{{ scope.row.field }}</p>
<span>Field: </span>{{scope.row.field}} <p class="tab_tie_col" v-if="scope.row.company != ''"><span>Affiliation: </span>{{ scope.row.company }}</p>
</p>
<p class="tab_tie_col" v-if="scope.row.company!=''">
<span>Affiliation: </span>{{scope.row.company}}
</p>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="Remarks" width="300"> <el-table-column label="Remarks" width="240">
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.row.remark}} {{ scope.row.remark }}
<b @click="BoxRemark(scope.row)" style="margin-left:10px;cursor: pointer;color:#006699;" <b
class="el-icon-edit"></b> @click="BoxRemark(scope.row)"
style="margin-left: 10px; cursor: pointer; color: #006699"
class="el-icon-edit"
></b>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" width="120"> <el-table-column align="center" width="240">
<template slot-scope="scope"> <template slot-scope="scope">
<p style="margin-bottom: 10px;"> <div class="operation_box">
<el-button type="primary" plain icon="el-icon-user" @click="handleDtail(scope.row)"> <el-button type="primary" plain icon="el-icon-user" @click="handleDtail(scope.row)"> Detail </el-button>
Detail <el-button type="success" plain icon="el-icon-check" @click="agreeApply(scope.row)"> Agree </el-button>
</el-button>
</p> <el-button type="danger" plain icon="el-icon-close" @click="deleteApply(scope.row)"> Refuse </el-button>
<p style="margin-bottom: 10px;"> </div>
<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> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
<!-- 同意弹出框 --> <!-- 同意弹出框 -->
<el-dialog title="Agree User" :visible.sync="agreeVisible" width="500px" :close-on-click-modal="false"> <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 ref="agree_Form" :model="agreeForm" :rules="rules" label-width="140px">
<el-form-item label="Realname :"> <el-form-item label="Account :" style="margin-bottom: 2px !important">
{{agreeForm.realname}} <span>{{ agreeForm.account }}</span>
</el-form-item> </el-form-item>
<el-form-item label="Email :"> <el-form-item label="Email :" style="margin-bottom: 2px !important">
{{agreeForm.email}} {{ agreeForm.email }}
</el-form-item> </el-form-item>
<el-form-item label="Apply Journal :"> <el-form-item label="Apply Journal :" style="margin-bottom: 10px !important">
{{agreeForm.title}} {{ 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>
<el-form-item label="Term of office :" prop="year"> <el-form-item label="Term of office :" prop="year">
<el-select v-model="agreeForm.year" placeholder="Please select a 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 v-for="item in list_year" :label="item.title" :key="item.id" :value="item.id"> </el-option>
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -127,19 +161,17 @@
</span> </span>
</el-dialog> </el-dialog>
<!-- 标记弹出框 --> <!-- 标记弹出框 -->
<el-dialog title="Remarks" :visible.sync="remarkBox" width="550px" :close-on-click-modal="false"> <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 ref="remark" :model="remarkMes" label-width="130px">
<el-form-item label="Realname :"> <el-form-item label="Realname :">
{{remarkMes.realname}} {{ remarkMes.realname }}
</el-form-item> </el-form-item>
<el-form-item label="Email :"> <el-form-item label="Email :">
{{remarkMes.email}} {{ remarkMes.email }}
</el-form-item> </el-form-item>
<el-form-item label="Apply Journal :"> <el-form-item label="Apply Journal :">
{{remarkMes.title}} {{ remarkMes.title }}
</el-form-item> </el-form-item>
<el-form-item label="Content :"> <el-form-item label="Content :">
<el-input type="textarea" rows="5" v-model="remarkMes.remark"></el-input> <el-input type="textarea" rows="5" v-model="remarkMes.remark"></el-input>
@@ -150,14 +182,74 @@
<el-button type="primary" @click="saveRemark">Save</el-button> <el-button type="primary" @click="saveRemark">Save</el-button>
</span> </span>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script> <script>
export default { import commonCv from '../common/cv.vue';
export default {
components: {
commonCv
},
data() { data() {
return { 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, mediaUrl: this.Common.mediaUrl,
tableData: [], tableData: [],
agreeVisible: false, agreeVisible: false,
@@ -166,105 +258,193 @@
remark: '' remark: ''
}, },
remarkBox: false, remarkBox: false,
list_year: [{ list_year: [
{
title: '1 Year', title: '1 Year',
id: 1 id: 1
}, { },
{
title: '2 Years', title: '2 Years',
id: 2 id: 2
}, { },
{
title: '3 Years', title: '3 Years',
id: 3 id: 3
}], }
],
rules: { rules: {
year: [{ year: [
{
required: true, required: true,
message: 'Please select year', message: 'Please select year',
trigger: 'blur' 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() { created() {
this.getDate(); this.getDate();
this.getCountry();
}, },
methods: { methods: {
getCountry() {
this.$api
.post('api/Reviewer/getCountrys')
.then((res) => {
this.df_country = res.countrys;
})
.catch((err) => {
this.$message.error(err);
});
},
// 获取青年科学家申请列表数据 // 获取青年科学家申请列表数据
getDate() { getDate() {
this.$api this.$api
.post('api/User/getYboardApplys', { .post('api/User/getYboardApplys', {
editor_id: localStorage.getItem('U_id') editor_id: localStorage.getItem('U_id')
}) })
.then(res => { .then((res) => {
if (res.code == 0) { if (res.code == 0) {
this.tableData = res.data.applys; this.tableData = res.data.applys;
for (var i = 0; i < this.tableData.length; i++) { for (var i = 0; i < this.tableData.length; i++) {
this.getScoreData(i, this.tableData[i].score) this.getScoreData(i, this.tableData[i].score);
} }
} else { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
} }
}) })
.catch(err => { .catch((err) => {
console.log(err); console.log(err);
}); });
}, },
// 评分 // 评分
getScoreData(i, e) { getScoreData(i, e) {
this.tableData[i].starList = [] this.tableData[i].starList = [];
this.tableData[i].starList_mark = 0 this.tableData[i].starList_mark = 0;
if (e < 0.5 && e > 0) { if (e < 0.5 && e > 0) {
this.tableData[i].starList.push({ this.tableData[i].starList.push({
star: 2 star: 2
}) });
this.tableData[i].starList_mark = 1 this.tableData[i].starList_mark = 1;
} else { } else {
let zheng = Math.floor(e) let zheng = Math.floor(e);
let xiao = Number(e) - Math.floor(e) let xiao = Number(e) - Math.floor(e);
if (xiao >= 0.5) { if (xiao >= 0.5) {
xiao = 0.5 xiao = 0.5;
} else { } else {
xiao = 0 xiao = 0;
} }
for (var j = 0; j < zheng; j++) { for (var j = 0; j < zheng; j++) {
this.tableData[i].starList.push({ this.tableData[i].starList.push({
star: 1 star: 1
}) });
} }
if (xiao == 0.5) { if (xiao == 0.5) {
this.tableData[i].starList.push({ this.tableData[i].starList.push({
star: 0 star: 0
}) });
} }
this.tableData[i].starList_mark = Number(zheng) + Number(xiao) this.tableData[i].starList_mark = Number(zheng) + Number(xiao);
} }
}, },
// 同意 // 同意
agreeApply(e) { agreeApply(e) {
this.agreeForm = e this.agreeForm = {};
this.agreeVisible = true console.log('e at line 405:', e);
this.agreeVisible = true;
this.agreeForm = e;
this.$refs.agree_Form.clearValidate();
}, },
// 提交同意 // 提交同意
saveAgreee() { 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);
this.$refs.agree_Form.validate((valid) => { this.$refs.agree_Form.validate((valid) => {
if (valid) { if (valid) {
this.$api this.$api
.post('api/User/agreeYboardApply', this.agreeForm) .post('api/User/agreeYboardApplyNew', {
.then(res => { ...data
})
.then((res) => {
if (res.code == 0) { if (res.code == 0) {
this.$message.success('Add succeeded!'); this.$message.success('Add succeeded!');
this.agreeVisible = false this.agreeVisible = false;
this.getDate(); this.getDate();
} else { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
} }
}) })
.catch(err => { .catch((err) => {
console.log(err); console.log(err);
}); });
} else { } else {
@@ -282,7 +462,7 @@
.then(() => { .then(() => {
this.$api this.$api
.post('api/User/refuseYboardApply', e) .post('api/User/refuseYboardApply', e)
.then(res => { .then((res) => {
if (res.code == 0) { if (res.code == 0) {
this.$message.success('Delete succeeded!'); this.$message.success('Delete succeeded!');
this.getDate(); this.getDate();
@@ -290,14 +470,13 @@
this.$message.error(res.msg); this.$message.error(res.msg);
} }
}) })
.catch(err => { .catch((err) => {
console.log(err); console.log(err);
}); });
}) })
.catch(() => {}); .catch(() => {});
}, },
// 标记弹出框 // 标记弹出框
BoxRemark(e) { BoxRemark(e) {
this.remarkBox = true; this.remarkBox = true;
@@ -310,8 +489,7 @@
// 修改标记 // 修改标记
saveRemark() { saveRemark() {
this.$api.post('api/User/editRemarkForUser', this.remarkMes) this.$api.post('api/User/editRemarkForUser', this.remarkMes).then((res) => {
.then(res => {
if (res.code == 0) { if (res.code == 0) {
this.$message.success('Success'); this.$message.success('Success');
this.remarkBox = false; this.remarkBox = false;
@@ -322,7 +500,6 @@
}); });
}, },
// 详情 // 详情
handleDtail(e) { handleDtail(e) {
let routerJump = this.$router.resolve({ let routerJump = this.$router.resolve({
@@ -332,7 +509,6 @@
} }
}); });
window.open(routerJump.href, '_blank'); window.open(routerJump.href, '_blank');
}, },
// 时间格式 // 时间格式
@@ -345,42 +521,53 @@
var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes(); var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(); var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
return Y + M + D; return Y + M + D;
},
} }
}; }
};
</script> </script>
<style scoped> <style scoped>
.table { .table {
width: 100%; width: 100%;
font-size: 14px; font-size: 14px;
} }
.red { .red {
color: #ff0000; color: #ff0000;
} }
.tab_tie_col { .tab_tie_col {
margin-bottom: 5px; margin-bottom: 2px;
color: #333; color: #333;
word-wrap: break-word; word-wrap: break-word;
word-break: normal; word-break: normal;
} }
.tab_tie_col>span { .tab_tie_col > span {
color: #888; color: #888;
margin: 0 5px 0 0; margin: 0 5px 0 0;
font-size: 13px; font-size: 13px;
} }
.starSty { .starSty {
width: 18px; width: 14px;
margin-right: 4px; margin-right: 4px;
vertical-align: text-top; vertical-align: text-top;
} }
.starSty:nth-last-child(1) { .starSty:nth-last-child(1) {
margin-right: 0; 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> </style>

View File

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

View File

@@ -57,7 +57,7 @@ Vue.use(VueQuillEditor)
async function loadJournalType() { async function loadJournalType() {
const localData = localStorage.getItem('journalType'); // 尝试从 localStorage 获取数据 const localData = localStorage.getItem('journalType'); // 尝试从 localStorage 获取数据
// 如果 localStorage 中没有数据,则调用 API 获取并存储
if (!localData) { if (!localData) {
try { try {
await api await api
@@ -83,30 +83,42 @@ async function loadJournalType() {
} catch (error) { } catch (error) {
console.error('Failed to fetch journal types:', error);
} }
} else { } else {
console.log('Journal types loaded from localStorage:', JSON.parse(localData));
} }
} }
async function loadJournalList() { async function loadJournalList() {
try {
const localData = store.state.journalList;
console.log('localData at line 93:', localData);
return await api
.post('api/Article/getJournal', {})
.then((res) => {
store.commit('setJournalList', res); // 提交 mutation 更新 journalList
console.log('journalList at line 100:, 提交 mutation 更新 journalList')
}) 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) { } catch (err) {
// 仅打印错误,不阻断路由 // 仅打印错误,不阻断路由
console.error('接口请求失败,但继续路由跳转', err);
} }
// 无论接口成功/失败,都执行原有跳转逻辑 // 无论接口成功/失败,都执行原有跳转逻辑

View File

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

View File

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