This commit is contained in:
2025-11-18 16:50:41 +08:00
parent 13a70cb12d
commit 591146ed60
7 changed files with 661 additions and 99 deletions

View File

@@ -19,8 +19,8 @@ const service = axios.create({
// baseURL: 'https://submission.tmrjournals.com/', //正式 记得切换
// baseURL: 'http://www.tougao.com/', //测试本地 记得切换
// baseURL: 'http://192.168.110.110/tougao/public/index.php/',
// baseURL: '/api', //本地
baseURL: '/', //正式
baseURL: '/api', //本地
// baseURL: '/', //正式
});

View File

@@ -2,31 +2,12 @@
<div style="height: 100%">
<div
class="container"
style="
height: 100%;
min-width: calc(1000px);
width: calc(100%);
background-color: #fafafa;
padding: 0px 0 0 0;
box-sizing: border-box;
position: relative;
box-sizing: border-box;
"
>
<div
class="right-side"
style="
width: 240px;
float: left;
height: 100%;
background-color: #fff;
box-shadow: 0 1px 3px rgb(16 17 19 / 6%);
border-radius: 4px;
overflow-y: auto;
"
>
<div class="unfetteredBox" style="height: 100%">
<commonCatalogue
:urlList="{
@@ -38,6 +19,7 @@
ref="commonWordHtmlTypeSetting"
@onDragStart="onDragStart"
@huifu="huifu"
:catalogueList="catalogueList"
@onAddComment="onAddComment"
@addImage="handleImageAdd"
@addTable="handleTableAdd"
@@ -52,20 +34,13 @@
<input type="file" ref="fileInput" style="display: none" @change="handleFileChange" />
</div>
</div>
<div style="width: 100%; width: calc(100% - 285px); float: right; height: calc(100% - 0px); background-color: #e4e9ed">
<!-- <div class="toolbar">
<div class="toolbar_item" @click="handleImageAdd('img')">
<img src="@/assets/img/upload.png" style="object-fit: contain" />
<span>Add Figure </span>
</div>
<div class="toolbar_item" @click="handleTableAdd('table')">
<img src="@/assets/img/uploadTable.png" style="object-fit: contain" />
<span>Add Table </span>
</div>
</div> -->
<common-word
<div style="" class="right-content-box">
<!-- title -->
<div v-for="(item, index) in catalogueList" :key="index">
<h1 :class="`title${item.key}`">{{ item.title }}</h1>
</div>
<!-- <common-word
v-if="htmlContent"
ref="commonWord"
:value="htmlContent"
@@ -78,7 +53,6 @@
@loaded="loadedWord"
@onEdit="onEdit"
@addContent="onAddContent"
@changeSort="changeSort"
@onDelete="onDelete"
@onDeletes="onDeletes"
@@ -102,7 +76,7 @@
<template slot="comment">
<div style="" class="commentList annotations"></div>
</template>
</common-word>
</common-word> -->
</div>
</div>
@@ -181,8 +155,7 @@
size="80vw"
>
<el-form ref="editMes" :model="lineStyle" label-width="80px">
<!-- <common-late-x></common-late-x> -->
<!-- :id="`editor-${new Date().getTime()}-${lineStyle.am_id}-${lineStyle.amt_id}-title`" -->
<el-form-item label="Title:">
<common-content
:id="`editor-${new Date().getTime()}-${lineStyle.am_id}-${lineStyle.amt_id}-title`"
@@ -211,7 +184,7 @@
></common-table>
</el-form-item>
<el-form-item label="Note:">
<!-- :id="`editor-${new Date().getTime()}-${lineStyle.am_id}-${lineStyle.amt_id}-note`" -->
<common-content
:id="`editor-${new Date().getTime()}-${lineStyle.am_id}-${lineStyle.amt_id}-note`"
:isAutomaticUpdate="true"
@@ -381,13 +354,13 @@
</el-button>
</span>
</el-dialog>
<common-late-x v-if="showLateX" @close="showLateX = false" @save="saveLateX" :LateXInfo="LateXInfo"></common-late-x>
</div>
</template>
<script>
import commonCatalogue from '@/components/page/components/OnlineProofreading/catalogue.vue'
import commonCatalogue from '@/components/page/components/OnlineProofreading/catalogue.vue';
import bus from '@/components/common/bus';
import { del, isShallow } from 'vue';
@@ -398,6 +371,16 @@ import bottomTinymce from '@/components/page/components/Tinymce';
export default {
data() {
return {
catalogueList: [
{ title: 'Title ', key: '1' },
{ title: 'Author name', key: '2' },
{ title: 'Affialition', key: '3' },
{ title: 'Abstract & Keywords', key: '4' },
{ title: 'Main text', key: '5' },
{ title: 'Back Matter', key: '6' },
{ title: 'Editorial inforation', key: '7' },
{ title: 'Reference ', key: '8' },
],
zoomNum: (window.innerWidth * 0.38) / 850,
uploadWordTables: [],
tablesHtmlVisible: false,
@@ -525,8 +508,7 @@ export default {
},
computed: {
combinedValue() {
// 将两个值组合成一个新的值,可以是字符串、数组、对象等
// return `${this.isFirstComponentLoaded}-${this.isWordComponentLoaded}`;
}
},
watch: {
@@ -551,9 +533,7 @@ export default {
}
},
async created() {
// await this.$api.post('api/Proofread/proofRead', {
// article_id: this.$route.query.id
// });
localStorage.removeItem('scrollPosition');
this.isShowEditComment();
this.getDate();
@@ -562,9 +542,7 @@ export default {
},
mounted() {},
async activated() {
// await this.$api.post('api/Proofread/proofRead', {
// article_id: this.$route.query.id
// });
this.isShowEditComment();
this.getDate();
this.getCommentList();
@@ -573,10 +551,10 @@ export default {
methods: {
async copyArray(data) {
try {
// 将数组内容转换为字符串,使用换行符分隔
const textToCopy = JSON.stringify(data);
// 使用 Clipboard API 复制文本
await navigator.clipboard.writeText(textToCopy);
alert('数组内容已复制到剪贴板!');
} catch (err) {
@@ -677,7 +655,7 @@ export default {
async saveContent(content, am_id) {
var that = this;
var str = content.replace(/^<p>\s*(.*?)\s*<\/p>$/, '$1').trim();
str = await that.$commonJS.decodeHtml(str);
await that.$api
@@ -1172,21 +1150,19 @@ export default {
},
async onAddRow(mainId) {
await this.$api
.post(this.urlList.addRow, {
am_id: mainId,
article_id: this.articleId
})
.then(async (res) => {
if(res.code == 0){
this.getDate();
this.getCommentList();
}else{
if (res.code == 0) {
this.getDate();
this.getCommentList();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err.msg);
@@ -1259,7 +1235,6 @@ export default {
},
deleteProofreading(data, index) {
console.log('comment at line 480:', data);
},
async cancelSolveComment(data) {
@@ -1381,7 +1356,7 @@ export default {
this.currentId = dataId;
},
async onDrop(event, dataId) {
if (event.dataTransfer.getData('image')) {
const draggedImage = JSON.parse(event.dataTransfer.getData('image'));
@@ -1455,13 +1430,10 @@ export default {
});
},
getWord() {
this.htmlContent = 'true';
},
// 获取数据
async getDate() {
this.imagesList = [];
let urlLInk = '';
let urlTask = {};
@@ -1481,7 +1453,7 @@ export default {
.post(urlLInk, urlTask)
.then(async (res) => {
if (res.code == 0) {
this.Main_List = res.data.list.map(e=>{
this.Main_List = res.data.list.map((e) => {
e.checked = false;
return e;
});
@@ -1495,8 +1467,7 @@ export default {
// setTimeout(async () => {
this.$nextTick(async () => {
await this.getWord();
loading.close();
});
// }, 1000);
@@ -1884,6 +1855,28 @@ export default {
</script>
<style scoped>
.container{
height: 100%;
min-width: calc(1000px);
width: calc(100%);
background-color: #fafafa;
padding: 0px 0 0 0;
box-sizing: border-box;
position: relative;
box-sizing: border-box;
}
.right-side{
width: 240px;
float: left;
height: 100%;
background-color: #fff;
box-shadow: 0 1px 3px rgb(16 17 19 / 6%);
border-radius: 4px;
overflow-y: auto;
}
.right-content-box{
width: 100%; width: calc(100% - 245px); float: right; height: calc(100% - 0px); background-color: #e4e9ed
}
.lineStyle {
border-top: 1px solid #0066994d;
padding: 20px 20px 40px 20px;

View File

@@ -673,12 +673,12 @@
>
<span v-if="iken.state != 0"
style="color: #006699;float: right;"
@click="handleClick(iken)"
@click="handleClick(iken,'detail')"
>Detail</span
>
</td>
<!-- 1st review原逻辑不变 -->
<td @click="handleClick(iken)" style="cursor: pointer">
<td @click="handleClick(iken,'question')" style="cursor: pointer">
<span style="display: inline-block; margin-left: 4px; margin-right: 8px">
<font
v-if="iken.recommend == 1 || iken.recommend == 2"
@@ -726,7 +726,7 @@
<span
v-if="Array.isArray(iken.repeat) && iken.repeat[index1]"
style="cursor: pointer"
@click="handleClick(iken)"
>
<span style="display: inline-block; margin-left: 4px; margin-right: 8px">
<font
@@ -1007,6 +1007,9 @@
<el-button type="" @click="FinalDecisionVisible=false">Cancal</el-button>
</span>
</el-dialog>
<reviewerDetail ref="reviewerDetail" v-if="reviewerVisible" :reviewerDetail="reviewerDetail" destroy-on-close></reviewerDetail>
<el-dialog title="Edit H Index" :visible.sync="HEditVisible" width="400px" :close-on-click-modal="false">
<div style="margin: 0 0 20px 10px; font-weight: bold">{{ HIxForm.realname }}</div>
<div style="margin: 0 0 20px 10px">Email :{{ HIxForm.email }}</div>
@@ -1339,15 +1342,18 @@
<script>
import timetalk from './time_talk';
import reviewerDetail from '../../components/page/components/articleDetail/reviewerdetail.vue';
export default {
components: {
timetalk
timetalk,reviewerDetail
},
data() {
return {
reviewerDetail: {},
corresList: [],
finalDecisionData: {},
FinalDecisionVisible: false,
reviewerVisible: false,
expanded: false,
corresVisible: false,
isShowAuthorInfo: false,
@@ -1731,6 +1737,7 @@ this.FinalDecisionVisible=true
this.$forceUpdate();
},
articleReviewer(row) {
this.$router.push({
path: 'articleReviewer',
query: {
@@ -1893,14 +1900,15 @@ this.FinalDecisionVisible=true
// console.log('maxItem at line 2142:', maxItem.repeat.length)
return maxItem && maxItem.repeat ? maxItem.repeat.length : 0;
},
handleClick(item) {
console.log('item at line 1228:', item);
this.$router.push({
path: 'articleReviewerDetail',
query: {
id: item.art_rev_id
}
});
handleClick(item,type) {
this.reviewerDetail=item
this.reviewerVisible=true
this.$nextTick(()=>{
this.$refs.reviewerDetail.init(item.art_rev_id,type)
})
},
goReviewerDetail(id) {

View File

@@ -760,6 +760,7 @@
</template>
<script>
export default {
props: {
dateId: {
@@ -767,7 +768,9 @@ export default {
default: 0
}
},
components: {
},
data() {
return {
editVisible1: false,

View File

@@ -1052,11 +1052,13 @@ import { Loading } from 'element-ui';
import timetalk from './time_talk';
import commonRemarkList from './articleListEditor_A_list.vue';
import articleEditorDetail from './articleEditorDetail.vue';
export default {
components: {
timetalk,
commonRemarkList,
articleEditorDetail
articleEditorDetail,
},
props: ['journals'],
data() {

View File

@@ -7,11 +7,11 @@
<!-- 图片缩略图区域 -->
<div>
<div class="title">
Contents
</div>
<div
style="width: 240px; padding: 10px; height: calc(100% - 28px); box-sizing: border-box; overflow-y: auto"
style=""
class="arrlist"
>
<ul style="width: 100%; height: auto">
@@ -19,11 +19,12 @@
<li >
<div style="display: flex; flex-wrap: wrap; gap: 10px; justify-content: start">
<div
<div @click="goToListComment(item.key)"
v-for="(item, index) in catalogueList"
style="width: calc(100%); display: flex; align-items: center; justify-content: space-between; color: #606266"
>
{{ item.title }}
<span><span style="color: #888;margin-right: 5px;">{{ index+1 }}.</span> {{ item.title }}</span>
<!-- <div
style="
width: calc(100% - 50px);
@@ -48,7 +49,7 @@
<script>
import { mediaUrl } from '@/common/js/commonJS.js'; // 引入通用逻辑
export default {
props: ['articleId', 'imgWidth', 'imgHeight', 'scale', 'isEdit', 'isShowEdit', 'urlList', 'content'],
props: ['articleId', 'imgWidth', 'imgHeight', 'scale', 'isEdit', 'isShowEdit', 'urlList', 'content','catalogueList'],
data() {
return {
isShowComment: false,
@@ -68,16 +69,7 @@ export default {
{ title: 'Typed', type: '1' },
{ title: 'Unfettered', type: '2' }
],
catalogueList: [
{ title: 'Title ', type: '1' },
{ title: 'Author name', type: '2' },
{ title: 'Affialition', type: '3' },
{ title: 'Abstract & Keywords', type: '4' },
{ title: 'Main text', type: '5' },
{ title: 'Back Matter', type: '6' },
{ title: 'Editorial inforation', type: '7' },
{ title: 'Reference ', type: '8' },
],
images: [],
tables: [],
imagesList: [],
@@ -538,6 +530,13 @@ li {
.arraylist {
background-color: #f8f8f9;
}
.arrlist {
width: 240px; padding: 20px; height: calc(100% - 30px); box-sizing: border-box; overflow-y: auto;
border-top: 1px solid #ddd;
}
.arrlist li{
line-height: 30px
}
.arrlist::-webkit-scrollbar-thumb {
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0);
min-height: 12px;
@@ -653,4 +652,10 @@ li {
}
.single {
}
.title{
line-height: 28px;
padding: 10px 10px;
font-size: 18px;
font-weight: bold;
}
</style>

View File

@@ -0,0 +1,551 @@
<template>
<el-dialog :title="type=='detail'?'Manuscript reviewer detail':'Feedback questionnaire'" :visible.sync="reviewerVisible" width="1200px" :close-on-click-modal="false">
<div>
<div class="container" v-if="type=='detail'">
<el-row :gutter="10">
<el-col :span="20">
<div class="form-box" style="width: 100%">
<el-form ref="articleform" :model="detailDate" label-width="130px">
<el-form-item label="Article">
<span>{{ detailDate.article }}</span>
</el-form-item>
<el-form-item label="Reviewer">
<span>{{ detailDate.reviewer }}</span>
</el-form-item>
<el-form-item label="Reviewer email">
<span>{{ detailDate.reviewer_email }}</span>
</el-form-item>
<el-form-item label="CreateTime">
<span>{{ formatDate(detailDate.ctime) }}</span>
</el-form-item>
<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 v-if="canRepeat == 1">
<el-button type="primary" @click="createRevision">Re-review</el-button>
</el-form-item>
</el-form>
</div>
</el-col>
<el-col :span="8" v-if="recordList && recordList.length > 0">
<div class="clearfix fsheader">
<h4>Peer-review Archive</h4>
</div>
<div class="time">
<el-timeline>
<el-timeline-item
reverse="true"
:timestamp="item.ctime | formatDatehms"
placement="top"
v-for="(item, index) in recordList"
:key="index"
>
<el-card>
<h4></h4>
<div>
<div v-if="index == recordList.length - 1">
<!-- 初审 -->
<el-tag>Under review</el-tag>
<p style="margin-top: 10px">
Comments:
<el-button
style="margin-left: 10px"
type="text"
@click="showUnderReview(item)"
icon="el-icon-view"
>Details</el-button
>
</p>
</div>
<div v-else>
<!-- 复审 -->
<el-tag type="success">Second review</el-tag>
<p style="margin-top: 10px">
Comments:
<el-button
style="margin-left: 10px"
type="text"
@click="showSecondReview(item)"
icon="el-icon-view"
>Details</el-button
>
</p>
<p v-if="item.stime > 0" style="" class="stime">
Response time: {{ item.stime | formatDatehms }}
</p>
<p v-else style="" class="stime">Response time: Re-reviewing...</p>
</div>
</div>
</el-card>
</el-timeline-item>
</el-timeline>
</div>
</el-col>
</el-row>
</div>
<common-review-article v-if="type=='question'"
type="undeQuestion"
pagetype="Editor"
:form="undeQuestion"
:txt_mess="txt_mess"
:btn_submit="1"
:articleId="articleId"
:journal_id="journal_id"
></common-review-article>
<!-- <el-dialog title="Second review questionnaire" :visible.sync="FdialogFormVisible" width="900px" @close="closeSecDia" :close-on-click-modal="false"> -->
<el-form :model="ReReviewQuestion" ref="question" label-width="300px" label-position="top">
<el-divider content-position="center">REFEREE'S RECOMMENDATIONS</el-divider>
<el-form-item label="REFEREE'S RECOMMENDATIONS" prop="recommend">
<el-radio-group v-model="ReReviewQuestion.recommend" style="line-height: 30px">
<el-radio :label="1" :disabled="ReReviewQuestion.recommend != 1">Accept</el-radio>
<el-radio :label="2" :disabled="ReReviewQuestion.recommend != 2">Reject</el-radio>
<!-- 退修改 -->
<el-radio :label="3" :disabled="ReReviewQuestion.recommend != 3">Revison</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="Confidential Comments to the Editor" v-if="ReReviewQuestion.recommend == 3">
<el-input
readonly
type="textarea"
placeholder="please input content"
v-model="ReReviewQuestion.content"
:rows="8"
></el-input>
</el-form-item>
</el-form>
<!-- </el-dialog> -->
</div>
<span slot="footer" class="dialog-footer">
<el-button type="" @click="reviewerVisible = false">Cancal</el-button>
</span>
</el-dialog>
</template>
<script>
export default {
props: {
reviewerDetail: {
type: Object,
default: () => {}
},
},
data() {
return {
type:'',
reviewerVisible: false,
FdialogFormVisible: false,
dialogFormVisible1: false,
recordList: [],
reviewList: [],
journal_id: null,
baseUrl: this.Common.baseUrl,
mediaUrl: this.Common.mediaUrl,
articleId: this.$route.query.id,
dateId: '',
username: localStorage.getItem('U_name'),
articlefileList: [],
articlezipList: [],
dialogFormVisible: false,
activeNames: ['1', '2', '3', '4', '5', '6', '7'],
detailDate: {},
txt_mess: {},
questionform: { },
canRepeat: null,
undeQuestion: {},
ReReviewQuestion: {}
};
},
created: function () {
console.log('this.reviewerDetail at line 971:', this.reviewerDetail.art_rev_id);
},
computed: {},
methods: {
init(art_rev_id,type) {
this.type=type;
if (art_rev_id) {
this.dateId = art_rev_id;
this.detailDate = {
editor: localStorage.getItem('U_name'),
artrevid: art_rev_id,
article: '',
reviewer: '',
reviewer_email: '',
articlefile: '',
articlezip: '',
ctime: '',
state: ''
};
if(type=='detail'){
this.getDate();
}
if(type=='question'){
this. questionform={}
this.initquesion();
}
this.$api
.post('api/Workbench/updateArticleState', {
article_id: this.articleId,
act_p_id: art_rev_id,
type: '1,2',
account: localStorage.getItem('U_name')
})
}
},
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;
},
// 显示复审对话框
showSecondReview(item) {
this.FdialogFormVisible = true;
this.ReReviewQuestion = item;
},
// 显示初审对话框
showUnderReview(item) {
// this.dialogFormVisible1 = true;
this.undeQuestion = { ...item };
this.undeQuestion.qu9 = item.qu9 == 0 ? false : true;
this.undeQuestion.qu9contents = item.qu9_contents;
this.undeQuestion.qu10 = item.qu10 == 0 ? false : true;
this.undeQuestion.qu10contents = item.qu10_contents;
this.undeQuestion.qu11 = item.qu11 == 0 ? false : true;
this.undeQuestion.qu11contents = item.qu11_contents;
this.undeQuestion.qu12 = item.qu12 == 0 ? false : true;
this.undeQuestion.qu12contents = item.qu12_contents;
this.undeQuestion.qu13 = item.qu13 == 0 ? false : true;
this.undeQuestion.qu13contents = item.qu13_contents;
this.undeQuestion.qu14 = item.qu14 == 0 ? false : true;
this.undeQuestion.qu14contents = item.qu14_contents;
this.undeQuestion.qu15 = item.qu15 == 0 ? false : true;
this.undeQuestion.qu15contents = item.qu15_contents;
this.undeQuestion.confident = item.confidential;
this.undeQuestion.comment = item.comments;
},
// 关闭初审对话框
closeUnderDia() {
this.dialogFormVisible1 = false;
this.undeQuestion = {};
},
closeSecDia() {
this.FdialogFormVisible = false;
this.ReReviewQuestion = {};
},
// 2. 定义所有必需字段(确保所有数据结构统一)
// 3. 核心函数:提取第一个元素,剩余放入 repeat
splitQuestion(questionArr = []) {
const requiredFields = [
'rev_qu_id',
'art_rev_id',
'type',
'art_rev_rep_id',
'recommend',
'score',
'state',
'reviewer_id',
'realname',
'ctime',
'stime',
'is_anonymous'
];
// 解构数组firstItem 取第一个元素restItems 取剩余所有元素
const [firstItem = {}, ...restItems] = questionArr;
// 工具函数:补全单个对象的必需字段(空值用 null 填充)
const completeFields = (item) => {
console.log('item at line 1056:', item);
const result = { question: item };
requiredFields.forEach((field) => {
result[field] = item[field] ? item[field] : '';
});
return result;
};
// 补全第一个元素的字段
const firstCompleted = completeFields(firstItem);
// 补全剩余元素的字段,存入 repeat 数组
const repeat = restItems.map((item) => completeFields(item));
// 返回结果:按需选择格式(二选一)
return { ...firstCompleted, repeat: repeat };
},
// 创建复审实例
createRevision() {
this.$api
.post('api/Reviewer/startRepeatReviewer', {
art_rev_id: this.detailDate.artrevid
})
.then((res) => {
//console.log(res)
if (res.code == 0) {
this.$message.success('A review invitation was successfully sent!');
this.getdate();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
console.log(err);
});
},
upload_file(type) {
return this.baseUrl + 'api/reviewer/up_file/type/' + type;
},
onSubmit() {
if (this.detailDate.articlefile == '') {
this.$message.error('you must upload article file');
console.log('file up error');
return false;
}
this.$api
.post('api/Reviewer/articleReviewerUpSubmit/type/editor', this.detailDate)
.then((res) => {
if (res.code == 0) {
this.$message.success('success');
this.$router.go(0);
} else {
this.$message.error('Failed to submit, please contact administrator!');
console.log(res.msg);
}
})
.catch((err) => {
console.log(err);
});
},
//初始化详情信息
getDate() {
const loading = this.$loading({
lock: true,
text: 'Loading...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.$api
.post('api/Reviewer/getartrevdate', {
revid: this.dateId,
human: 'editor'
})
.then((res) => {
this.detailDate.artrevid = res.art_rev_id;
this.detailDate.article = res.article_title;
this.detailDate.reviewer = res.account;
this.detailDate.reviewer_email = res.user_email;
this.detailDate.ctime = res.ctime;
this.detailDate.state = res.state;
this.txt_mess = res;
this.canRepeat = res.can_repeat;
this.journal_id = res.journal_id;
this.articleId = res.article_id;
loading.close();
this.reviewerVisible = true;
})
.catch((err) => {
loading.close();
console.log(err);
});
},
//初始化问卷
initquesion() {
const loading = this.$loading({
lock: true,
text: 'Loading...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.$api
.post('api/Reviewer/getQuestion', {
artrevid: this.dateId
})
.then((res) => {
if (res.code == 0) {
this.showUnderReview(res.data)
this.reviewerVisible = true;
loading.close();
}
}).catch((err) => {
loading.close();
console.log(err);
});
},
//检验上传文件的格式
beforeupload_file(file) {
// const isWORd =
// file.type === 'application/msword' ||
// file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
// if (!isWORd) {
// this.$message.error('Only word files can be uploaded(.doc,.docx)');
// }
// return isWORd;
},
beforeupload_articlezip(file) {
// const iszip = file.type === 'application/x-zip-compressed' || file.name.split('.')[1] === 'rar';
// if (!iszip) {
// this.$message.error('Only compressed files can be uploaded(.rar,.zip)');
// }
// return iszip;
},
getlinkurl(row) {
return this.mediaUrl + row.file_url;
},
filedateformate(row, column, cellValue, index) {
return this.formatDate(cellValue);
},
uperr_file(err) {
this.$message.error('上传失败');
},
beforeupload() {},
upSuccess_file(res, file) {
if (res.code == 0) {
this.detailDate.articlefile = 'articlefile/' + res.upurl;
} else {
this.$message.error('服务器上传错误:' + res.msg);
}
},
upSuccess_articlezip(res, file) {
if (res.code == 0) {
this.detailDate.articlezip = 'articlezip/' + res.upurl;
} else {
this.$message.error('服务器上传错误:' + res.msg);
}
},
handleClick(item) {
console.log('item at line 1228:', item);
this.$router.push({
path: 'articleReviewerDetail',
query: {
id: item.art_rev_id
}
});
},
formatDate(timestamp) {
var date = new Date(timestamp * 1000); //时间戳为10位需*1000时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-';
var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
var h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
return Y + M + D + ' ' + h + ':' + m + ':' + s;
},
//超出传送文件个数限制
alertlimit() {
this.$message.error('超过最大上传文件个数');
},
//清除文件时的事件
removefilearticlefile(file, fileList) {
this.detailDate.articlefile = '';
},
removefilearticlezip(file, fileList) {
this.detailDate.articlezip = '';
},
mystate(mystate) {
let str = '';
switch (mystate) {
case 0:
str = 'With reviewer';
break;
case 1:
str = 'Major';
break;
case 2:
str = 'Reject';
break;
case 3:
// str = 'Accept';
str = 'Minor';
break;
}
return str;
}
}
};
</script>
<style scoped>
.fsheader {
margin-bottom: 15px;
}
.dwnbtn {
margin-bottom: 5px;
}
.container {
min-width: 1000px;
}
.tree_box {
padding: 15px 10px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
::v-deep .el-dialog__body {
padding: 10px 20px 20px !important;
}
.review_table {
width: 100%;
background-color: #fff;
/* margin-top: 10px; */
border-collapse: collapse; /* 合并表格边框 */
}
.review_table th,
td {
padding: 6px;
min-width: 70px;
border: 1px solid #ddd;
text-align: left;
}
.review_table th {
font-size: 14px;
background-color: #f0f0f0;
}
.review_table td {
font-size: 14px;
/* background-color: #f0f0f0; */
}
.review_table th:first-child,
.review_table td:first-child {
width: 100px;
/* 内容过长时自动换行 */
word-wrap: break-word;
/* 强制在单词内换行(针对长单词) */
word-break: break-all;
}
.review_table tr:hover {
/* background-color: #fff; */
}
.overflow-x-auto {
overflow-x: auto;
}
</style>