提交 邀请审稿人列表

This commit is contained in:
2025-06-11 17:42:46 +08:00
parent 0c4e44e858
commit 5951f26bd4
6 changed files with 1619 additions and 1030 deletions

View File

@@ -132,10 +132,11 @@
</p> </p>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
<el-collapse class="auth_colla auth_collna_ew" style="margin-top: -15px"> <el-collapse v-model="researchAreas" class="auth_colla auth_collna_ew" style="margin-top: -15px">
<el-collapse-item title="Research areas" name="1"> <el-collapse-item title="Research areas" name="1">
<div style="position: relative; height: 30px"> <div style="position: relative; height: 30px">
<common-major <common-major
v-if="form.state==0"
:articleId="editform.articleId" :articleId="editform.articleId"
@load="initMajor()" @load="initMajor()"
style="position: absolute; top: 10px; right: 10px" style="position: absolute; top: 10px; right: 10px"
@@ -152,7 +153,7 @@
<span style="color: #006699; font-weight: bold; margin-right: 10px" <span style="color: #006699; font-weight: bold; margin-right: 10px"
>Field {{ i + 1 }}:</span >Field {{ i + 1 }}:</span
>{{ v.str >{{ v.str
}}<i }}<i v-if="form.state==0"
class="el-icon-delete-solid" class="el-icon-delete-solid"
style="color: #f56c6c !important; margin-left: 10px" style="color: #f56c6c !important; margin-left: 10px"
@click="handleDeleteMajor(v)" @click="handleDeleteMajor(v)"
@@ -553,6 +554,7 @@ export default {
}, },
data() { data() {
return { return {
researchAreas:['1'],
AIcontent:'', AIcontent:'',
previewData: {}, previewData: {},
baseUrl: this.Common.baseUrl, baseUrl: this.Common.baseUrl,

View File

@@ -1,5 +1,5 @@
<template> <template>
<div style="min-width: 1280px"> <div style="min-width: 1280px" class="articleListEditorA">
<div class="handle-box"> <div class="handle-box">
<el-badge <el-badge
:value="item.num" :value="item.num"
@@ -52,7 +52,58 @@
<el-button type="primary" icon="el-icon-search" @click="handleSearch" style="margin: 0 0 10px 0">Search </el-button> <el-button type="primary" icon="el-icon-search" @click="handleSearch" style="margin: 0 0 10px 0">Search </el-button>
</div> </div>
<div v-if="!PreAcpVisible"> <div v-if="!PreAcpVisible">
<div v-for="(item, ikgn) in tableData" class="mangu_list" style="position: relative"> <div v-for="(item, ikgn) in tableData">
<p
style="background-color: #0077b8e6; border-top-left-radius: 8px; border-top-right-radius: 8px"
class="articleBaseInfo articleTopBaseInfo"
>
<font class="labelTitle">ID : </font>
<span
style="
background-color: #ff0000cc;
width: 20px;
color: #fff;
margin: 0 2px 0 0;
font-weight: bold;
padding: 2px 4px;
"
v-if="item.special_num > 0"
>S
</span>
{{ item.accept_sn }}
<sapn style="margin: 0 4px">| </sapn>
<sapn style="font-size: 12px"> {{ item.type | jtName }}</sapn>
<sapn style="margin: 0 4px">| </sapn>
<sapn style="font-size: 12px">
<font v-for="(iken, index) in item.countrys">
{{ iken }}
<font v-if="index != item.countrys.length - 1">,</font>
</font>
</sapn>
<b @click="openTracking(item)" class="btnCliArt" style="color: #f0f0f0; font-size: 12px; margin-left: 10px">
<i class="el-icon-data-line"></i> Manuscript Tracking
</b>
<sapn style="float: right">
<span class="labelTitle" style="font-weight: 500">Plagiarism Check :</span>
<font style="margin-right: 16px; font-size: 15px; font-weight: bold"> {{ item.repetition }} % </font>
<b @click="changeRepe(item)" class="btnCliArt" style="color: #eaf6fb"> <i class="el-icon-edit"></i> Change </b>
</sapn>
<sapn style="margin: 0 10px; float: right">| </sapn>
<sapn style="float: right">
<span class="labelTitle" style="font-weight: 500">Status :</span>
<font style="margin-right: 15px; font-size: 16px; font-weight: bold; letter-spacing: -0.5px">
{{ stateFormat(item.state) }}
</font>
<b v-if="item.state != 5" @click="testvis(item)" class="btnCliArt" style="color: #eaf6fb">
<i class="el-icon-edit"></i> Change
</b>
<b v-if="item.state == 5" @click="prodBegin(item)" class="btnCliArt" style="color: #eaf6fb">
<i class="el-icon-paperclip"></i> Begin Produce
</b>
</sapn>
</p>
<div class="mangu_list" style="position: relative">
<img <img
v-if="item.ai_review != '' && item.ai_review" v-if="item.ai_review != '' && item.ai_review"
src="@/assets/img/ai.png" src="@/assets/img/ai.png"
@@ -66,28 +117,23 @@
style="opacity: 0.5; cursor: pointer; width: 30px; height: 30px; position: absolute; right: 6px; top: 6px" style="opacity: 0.5; cursor: pointer; width: 30px; height: 30px; position: absolute; right: 6px; top: 6px"
/> />
<div> <div>
<font style="color: #666b7a">ID : </font> <!-- <font style="color: #666b7a">ID : </font>
<span <span
style="background-color: #006699; width: 20px; color: #fff; margin: 0 2px 0 0; font-weight: bold; padding: 2px 4px" style="background-color: #006699; width: 20px; color: #fff; margin: 0 2px 0 0; font-weight: bold; padding: 2px 4px"
v-if="item.special_num > 0" v-if="item.special_num > 0"
>S >S
</span> </span>
{{ item.accept_sn }} {{ item.accept_sn }} -->
<!-- <b @click="showdetaileditor(item)" class="btnCliArt" style="margin-left: 15px;">
<i class="el-icon-collection"></i> Detail
</b> -->
<span style="color: #666b7a; margin-left: 40px">Type :</span> <!-- <span style="color: #666b7a; margin-left: 40px">Type :</span>
<font> <font>
{{ item.type | jtName }} {{ item.type | jtName }}
</font> </font>
<span style="color: #666b7a; margin-left: 40px">Countries :</span> <span style="color: #666b7a; margin-left: 40px">Countries :</span>
<!-- <span :class="item.countrys.length > 1 ? 'Countries': ''" > -->
<font v-for="(iken, index) in item.countrys"> <font v-for="(iken, index) in item.countrys">
{{ iken }} {{ iken }}
<font v-if="index != item.countrys.length - 1">,</font> <font v-if="index != item.countrys.length - 1">,</font>
</font> </font>
<!-- </span> -->
<span style="color: #666b7a; margin-left: 40px">Status :</span> <span style="color: #666b7a; margin-left: 40px">Status :</span>
<font style="margin-right: 15px; font-size: 16px; font-weight: bold; letter-spacing: -0.5px"> <font style="margin-right: 15px; font-size: 16px; font-weight: bold; letter-spacing: -0.5px">
{{ stateFormat(item.state) }} {{ stateFormat(item.state) }}
@@ -98,24 +144,64 @@
</b> </b>
<span style="color: #666b7a; margin-left: 40px">Plagiarism Check :</span> <span style="color: #666b7a; margin-left: 40px">Plagiarism Check :</span>
<font style="margin-right: 16px; font-size: 15px; font-weight: bold"> {{ item.repetition }} % </font> <font style="margin-right: 16px; font-size: 15px; font-weight: bold"> {{ item.repetition }} % </font>
<b @click="changeRepe(item)" class="btnCliArt"> <i class="el-icon-edit"></i> Change </b> <b @click="changeRepe(item)" class="btnCliArt"> <i class="el-icon-edit"></i> Change </b> -->
<b @click="openTracking(item)" class="btnCliArt" style="margin-left: 50px"> <!-- <b @click="openTracking(item)" class="btnCliArt" style="margin-left: 50px">
<i class="el-icon-data-line"></i> Manuscript Tracking <i class="el-icon-data-line"></i> Manuscript Tracking
</b> </b> -->
</div> </div>
<div class="man_title"> <div class="man_title">
<el-badge is-dot :hidden="item.author_act == 1 ? false : true"> <el-badge is-dot :hidden="item.author_act == 1 ? false : true">
<b @click="showdetaileditor(item)"> <b @click="showdetaileditor(item)"> {{ item.title }} </b>
{{ item.title }}
</b><b @click="corrSpe(item)" class="btnCliArt" style="margin-left: 20px"> <b @click="corrSpe(item)" class="btnCliArt" style="margin-left: 20px; white-space: nowrap">
<i class="el-icon-paperclip"></i> Author's previous articles <i class="el-icon-paperclip"></i> Author's previous articles
</b> </b>
<el-button
:type="item.state == 0 ? 'primary' : 'info'"
plain
size="mini"
@click="BoxMajor(item)"
style="margin-left: 10px"
>
<i class="el-icon-edit" v-if="item.state == 0"></i>
<i class="el-icon-view" v-else></i>
Research areas
</el-button>
<!-- <b @click="BoxMajor(item)" class="btnCliArt" style="margin-left: 20px; white-space: nowrap"> Research areas </b> -->
</el-badge> </el-badge>
</div> </div>
<!-- <div style="margin: 0 0 10px">
<b>
<font class="labelTitle">Corresponding Author </font>
</b>
<span style="margin-left: 10px">
<b @click="articleCommun(item)" class="btnCliArt" style="">
<i class="el-icon-chat-line-square"></i> Communication
</b>
</span>
<div style="display: flex; margin-left: auto"> <span style="text-align: left;margin-left: 10px"
<div class="fixCard" :style="`width: ${query.state == 0 ? '33% !important' : '33% !important'};`"> ><font class="labelTitle">Name : </font>
<span v-if="item.realname != ''">
{{ item.realname }}
<span v-if="item.phone != ''" style="margin-left: 5px; color: #666">({{ item.phone }})</span>
</span>
</span>
<span v-if="item.email != ''" style="margin-left: 10px"
><font class="labelTitle">Email : </font>
<b @click="linkEmail(item)" class="btnCliArt" style=""> {{ item.email }} </b>
<b @click="linkEmailist(item)" v-if="item.emailh == 1" class="btnCliArt" style="margin-left: 15px">
<i class="el-icon-refresh-left"></i> History
</b>
</span>
</div> -->
<div style="display: flex; margin-left: auto; flex-wrap: nowrap">
<div
class="fixCard"
:style="`width:${item.state == 0 ? '350px !important;flex-shrink: 0' : '320px !important;flex-shrink: 0'}`"
>
<b style="font-size: 16px; letter-spacing: -0.5px">Manuscript Files</b> <b style="font-size: 16px; letter-spacing: -0.5px">Manuscript Files</b>
<p style="height: 10px"></p> <p style="height: 10px"></p>
<div class="fi_new" v-if="item.file.coverLetter"> <div class="fi_new" v-if="item.file.coverLetter">
@@ -133,18 +219,25 @@
@click="changeFileUpdown(0, ikgn, 'file_cover')" @click="changeFileUpdown(0, ikgn, 'file_cover')"
></b> ></b>
</p> </p>
<div v-for="(ikrm,ikrmIndex) in item.file.coverLetter" v-if="item.file_cover == 1">
<div>
<div v-for="(ikrm, ikrmIndex) in item.file.coverLetter" v-if="item.file_cover == 1">
<img src="../../assets/img/icon_0.png" /> <img src="../../assets/img/icon_0.png" />
<span> <span @click="openFile(mediaUrl + ikrm.file_url)" class="openFile">
<font>Uploader {{ ikrmIndex+1 }} </font> <!-- <font>Uploader {{ ikrmIndex+1 }} </font> -->
<!-- {{ ikrm.username }} --> <!-- {{ ikrm.username }} -->
<i><i class="el-icon-time"></i>{{ formatDate(ikrm.ctime) }}</i> <i>
<!-- <i class="el-icon-time"></i> -->
{{ formatDate(ikrm.ctime) }}</i
>
</span> </span>
<a :href="mediaUrl + ikrm.file_url"> <a :href="mediaUrl + ikrm.file_url">
<i class="el-icon-download download"></i> <i class="el-icon-download download"></i>
</a> </a>
</div> </div>
</div> </div>
</div>
<div class="fi_new" v-if="item.file.picturesAndTables"> <div class="fi_new" v-if="item.file.picturesAndTables">
<p> <p>
Figures Figures
@@ -160,18 +253,21 @@
@click="changeFileUpdown(0, ikgn, 'file_figer')" @click="changeFileUpdown(0, ikgn, 'file_figer')"
></b> ></b>
</p> </p>
<div v-for="(ikrm,ikrmIndex) in item.file.picturesAndTables" v-if="item.file_figer == 1">
<div>
<div v-for="(ikrm, ikrmIndex) in item.file.picturesAndTables" v-if="item.file_figer == 1">
<img src="../../assets/img/icon_0.png" /> <img src="../../assets/img/icon_0.png" />
<span> <span @click="openFile(mediaUrl + ikrm.file_url)" class="openFile">
<font>Uploader {{ ikrmIndex+1 }} </font> <!-- <font>Uploader {{ ikrmIndex+1 }} </font> -->
<!-- {{ ikrm.username }} --> <!-- {{ ikrm.username }} -->
<i><i class="el-icon-time"></i>{{ formatDate(ikrm.ctime) }}</i> <i> <!-- <i class="el-icon-time"></i> -->{{ formatDate(ikrm.ctime) }}</i>
</span> </span>
<a :href="mediaUrl + ikrm.file_url"> <a :href="mediaUrl + ikrm.file_url">
<i class="el-icon-download download"></i> <i class="el-icon-download download"></i>
</a> </a>
</div> </div>
</div> </div>
</div>
<div class="fi_new" v-if="item.file.totalpage"> <div class="fi_new" v-if="item.file.totalpage">
<p> <p>
Title page Title page
@@ -187,18 +283,21 @@
@click="changeFileUpdown(0, ikgn, 'file_total')" @click="changeFileUpdown(0, ikgn, 'file_total')"
></b> ></b>
</p> </p>
<div v-for="(ikrm,ikrmIndex) in item.file.totalpage" v-if="item.file_total == 1">
<div>
<div v-for="(ikrm, ikrmIndex) in item.file.totalpage" v-if="item.file_total == 1">
<img src="../../assets/img/icon_0.png" /> <img src="../../assets/img/icon_0.png" />
<span> <span @click="openFile(mediaUrl + ikrm.file_url)" class="openFile">
<font>Uploader {{ikrmIndex}} </font> <!-- <font>Uploader {{ikrmIndex}} </font> -->
<!-- {{ ikrm.username }} --> <!-- {{ ikrm.username }} -->
<i><i class="el-icon-time"></i>{{ formatDate(ikrm.ctime) }}</i> <i> <!-- <i class="el-icon-time"></i> -->{{ formatDate(ikrm.ctime) }}</i>
</span> </span>
<a :href="mediaUrl + ikrm.file_url"> <a :href="mediaUrl + ikrm.file_url">
<i class="el-icon-download download"></i> <i class="el-icon-download download"></i>
</a> </a>
</div> </div>
</div> </div>
</div>
<div class="fi_new" v-if="item.file.manuscirpt"> <div class="fi_new" v-if="item.file.manuscirpt">
<p> <p>
Manuscirpt Manuscirpt
@@ -214,19 +313,21 @@
@click="changeFileUpdown(0, ikgn, 'file_maun')" @click="changeFileUpdown(0, ikgn, 'file_maun')"
></b> ></b>
</p> </p>
<div v-for="(ikrm,ikrmIndex) in item.file.manuscirpt" v-if="item.file_maun == 1"> <div>
<div v-for="(ikrm, ikrmIndex) in item.file.manuscirpt" v-if="item.file_maun == 1">
<img src="../../assets/img/icon_0.png" /> <img src="../../assets/img/icon_0.png" />
<span> <span @click="openFile(mediaUrl + ikrm.file_url)" class="openFile">
<font>Uploader {{ ikrmIndex+1 }} </font> <!-- <font>Uploader {{ ikrmIndex+1 }} </font> -->
<!-- {{ ikrm.username }} --> <!-- {{ ikrm.username }} -->
<i><i class="el-icon-time"></i>{{ formatDate(ikrm.ctime) }}</i> <i> <!-- <i class="el-icon-time"></i> -->{{ formatDate(ikrm.ctime) }}</i>
</span> </span>
<a :href="mediaUrl + ikrm.file_url"> <a :href="mediaUrl + ikrm.file_url">
<i class="el-icon-download download"></i> <i class="el-icon-download download"></i>
</a> </a>
</div> </div>
</div> </div>
</div>
<div class="fi_new" v-if="item.file.supplementary"> <div class="fi_new" v-if="item.file.supplementary">
<p> <p>
Supplementary Material Supplementary Material
@@ -242,12 +343,13 @@
@click="changeFileUpdown(0, ikgn, 'file_supper')" @click="changeFileUpdown(0, ikgn, 'file_supper')"
></b> ></b>
</p> </p>
<div v-for="(ikrm,ikrmIndex) in item.file.supplementary" v-if="item.file_supper == 1"> <div>
<div v-for="(ikrm, ikrmIndex) in item.file.supplementary" v-if="item.file_supper == 1">
<img src="../../assets/img/icon_0.png" /> <img src="../../assets/img/icon_0.png" />
<span> <span @click="openFile(mediaUrl + ikrm.file_url)" class="openFile">
<font>Uploader {{ ikrmIndex+1 }} </font> <!-- <font>Uploader {{ ikrmIndex+1 }} </font> -->
<!-- { ikrm.username }} --> <!-- { ikrm.username }} -->
<i><i class="el-icon-time"></i>{{ formatDate(ikrm.ctime) }}</i> <i> <!-- <i class="el-icon-time"></i> -->{{ formatDate(ikrm.ctime) }}</i>
</span> </span>
<a :href="mediaUrl + ikrm.file_url"> <a :href="mediaUrl + ikrm.file_url">
<i class="el-icon-download download"></i> <i class="el-icon-download download"></i>
@@ -255,10 +357,19 @@
</div> </div>
</div> </div>
</div> </div>
<div style="width: 1%"></div> </div>
<div class="fixCard" style="width: 36%">
<div
class="fixCard"
:style="`width: ${
item.state == 0 ? 'calc(100% - 350px - 230px - 18px)' : 'calc(100% - 350px - 230px - 18px)'
}`"
>
<b style="font-size: 16px; letter-spacing: -0.5px">AI scoring</b> <b style="font-size: 16px; letter-spacing: -0.5px">AI scoring</b>
<p style="font-size: 18px; font-weight: bold; margin-bottom: 5px; color: #db890e" v-if="item.reportList.length > 0"> <p
style="font-size: 18px; font-weight: bold; margin-bottom: 5px; color: #db890e"
v-if="item.reportList.length > 0"
>
<font style="font-size: 14px; font-weight: normal; color: #333">Initial review score :</font> <font style="font-size: 14px; font-weight: normal; color: #333">Initial review score :</font>
{{ item.scoring }} {{ item.scoring }}
<i class="el-icon-refresh refreshBtn" @click="refreshScore(item)"></i> <i class="el-icon-refresh refreshBtn" @click="refreshScore(item)"></i>
@@ -353,18 +464,21 @@
</p> </p>
</div> </div>
<template v-if="query.state != 0"> <template v-if="query.state != 0">
<div style="width: 1%"></div> <div class="fixCard" style="width: 230px; flex-shrink: 0">
<div class="fixCard" style="width: 17%">
<b style="font-size: 16px; letter-spacing: -0.5px">Reviewer Decision</b> <b style="font-size: 16px; letter-spacing: -0.5px">Reviewer Decision</b>
<p style="height: 5px"></p> <p style="height: 5px"></p>
<p v-for="(iken, index) in item.reviewScore" style="line-height: 28px" :key="index"> <p v-for="(iken, index) in item.reviewScore" style="line-height: 24px" :key="index">
Reviewer{{ index + 1 }} score : <b style="color: #db890e; font-size: 18px">{{ iken.rated }}</b Reviewer{{ index + 1 }} : <b style="color: #db890e; font-size: 18px">{{ iken.rated }}</b
><el-button style="margin-left: 10px" type="text" @click="crateRevision(iken)" v-if="iken.can_repeat == 1" ><el-button
style="margin-left: 10px"
type="text"
@click="crateRevision(iken)"
v-if="iken.can_repeat == 1"
>Re-review</el-button >Re-review</el-button
> >
</p> </p>
<p v-if="item.reviewScore.length > 0" style="font-size: 15px; margin: 0 0 5px 0"> <p v-if="item.reviewScore.length > 0" style="font-size: 15px; margin: 0 0 5px 0">
Average : <b style="font-size: 18px; color: #db890e">{{ avegeCount(item.reviewScore) }}</b> Average score: <b style="font-size: 18px; color: #db890e">{{ avegeCount(item.reviewScore) }}</b>
</p> </p>
<p> <p>
<span v-for="(iken, index) in item.review" style="display: inline-block; padding: 5px"> <span v-for="(iken, index) in item.review" style="display: inline-block; padding: 5px">
@@ -375,12 +489,24 @@
</font> </font>
<font <font
v-if="iken.state == 1 || iken.state == 3" v-if="iken.state == 1 || iken.state == 3"
style="width: 12px; height: 12px; display: block; border-radius: 10px; background-color: #67c23a" style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #67c23a;
"
> >
</font> </font>
<font <font
v-if="iken.state == 2" v-if="iken.state == 2"
style="width: 12px; height: 12px; display: block; border-radius: 10px; background-color: #f56c6c" style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #f56c6c;
"
> >
</font> </font>
</span> </span>
@@ -393,8 +519,37 @@
</div></template </div></template
> >
<div style="width: 1%"></div> <!-- <div class="fixCard" style="width: 320px; flex-shrink: 0" v-if="query.state == 0">
<div class="fixCard" style="width: 26%"> <b style="font-size: 16px; letter-spacing: -0.5px">Research areas</b>
<p style="height: 10px"></p>
<div style="text-align: left">
<div
@click="BoxMajor(item, majorData[item.article_id])"
v-if="item.article_id"
style="display: flex; align-items: center; justify-content: space-between; cursor: pointer"
>
<div>
<div v-if="majorData[item.article_id]" class="majorDataBox">
<p v-for="(v, i) in majorData[item.article_id]" style="border-top: 1px solid #b3d8ff">
<span style="font-weight: bold">{{ i + 1 }}.</span>
<span style="color:#666"> {{ v.str.replace('Medicine >', '').trim() }}</span>
</p>
</div>
<div v-else>
<span>Loading...</span>
</div>
</div>
<b style="margin-left: 10px; color: #006699" class="el-icon-edit"></b>
</div>
</div>
</div> -->
<div class="fixCard" style="width: 320px; flex-shrink: 0">
<b style="font-size: 16px; letter-spacing: -0.5px">Corresponding Author</b> <b style="font-size: 16px; letter-spacing: -0.5px">Corresponding Author</b>
<p style="height: 10px"></p> <p style="height: 10px"></p>
<div style="text-align: left"> <div style="text-align: left">
@@ -404,10 +559,9 @@
<span v-if="item.phone != ''" style="margin-left: 5px; color: #666">({{ item.phone }})</span> <span v-if="item.phone != ''" style="margin-left: 5px; color: #666">({{ item.phone }})</span>
</p> </p>
<p v-if="item.email != ''" style="margin: 8px 0 5px 0; line-height: 22px"> <p v-if="item.email != ''" style="margin: 8px 0 5px 0; line-height: 22px">
<b @click="linkEmail(item)" class="btnCliArt" style="">
<font style="color: #999">Email :</font> <font style="color: #999">Email :</font>
{{ item.email }} {{ item.email }}
<b @click="linkEmail(item)" class="btnCliArt" style="margin-left: 15px">
<i class="el-icon-message"></i> Email
</b> </b>
<b @click="linkEmailist(item)" v-if="item.emailh == 1" class="btnCliArt" style="margin-left: 15px"> <b @click="linkEmailist(item)" v-if="item.emailh == 1" class="btnCliArt" style="margin-left: 15px">
<i class="el-icon-refresh-left"></i> History <i class="el-icon-refresh-left"></i> History
@@ -415,7 +569,9 @@
</p> </p>
</div> </div>
<p style="margin-top: 20px"> <p style="margin-top: 20px">
<b @click="articleCommun(item)" class="btnCliArt"> <i class="el-icon-chat-line-square"></i> Communication </b> <b @click="articleCommun(item)" class="btnCliArt">
<i class="el-icon-chat-line-square"></i> Communication
</b>
</p> </p>
</div> </div>
</div> </div>
@@ -427,6 +583,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- 预接收表 --> <!-- 预接收表 -->
<el-table <el-table
v-if="PreAcpVisible" v-if="PreAcpVisible"
@@ -795,8 +952,8 @@
<p style="line-height: 20px; margin-top: 6px">{{ remark.title }}</p> <p style="line-height: 20px; margin-top: 6px">{{ remark.title }}</p>
</el-form-item> </el-form-item>
<el-form-item label="Content :"> <el-form-item label="Content :">
<commonRemarkList :list="remark.contentList" @load="(e) => (this.remark.contentList = e)"></commonRemarkList> <!-- <commonRemarkList :list="remark.contentList" @load="(e) => (this.remark.contentList = e)"></commonRemarkList> -->
<!-- <el-input type="textarea" rows="5" v-model="remark.content" ></el-input> --> <el-input type="textarea" rows="5" v-model="remark.content" ></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
@@ -1200,6 +1357,29 @@
<el-button type="primary" @click="isShowAI = false">Close</el-button> <el-button type="primary" @click="isShowAI = false">Close</el-button>
</span> </span>
</el-dialog> </el-dialog>
<el-dialog :title="majorMes.disabled ? 'Research areas' : 'Edit Research areas'" :visible.sync="majorBox" width="800px">
<el-form ref="remark" :model="majorMes" label-width="120px">
<el-form-item label="Title :">
<p style="line-height: 20px">
<span style="color: #333; font-weight: bold">{{ majorMes.title }}</span>
</p>
</el-form-item>
<!-- <el-form-item label="Email :">
<p style="line-height: 20px; margin-top: 6px">{{ majorMes.email }}</p>
</el-form-item> -->
<el-form-item label="Research areas :">
<common-major-list
:disabled="majorMes.disabled"
:list="majorValueList"
@load="(e) => (this.majorValueList = e)"
></common-major-list>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="majorBox = false">Cancel</el-button>
<el-button type="primary" @click="saveMajor" v-if="!majorMes.disabled">Save</el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
@@ -1215,6 +1395,9 @@ export default {
props: ['journals'], props: ['journals'],
data() { data() {
return { return {
majorValueList: [],
majorBox: false,
majorMes: {},
isShowAI: false, isShowAI: false,
currentArticleData: {}, currentArticleData: {},
rules: {}, rules: {},
@@ -1363,6 +1546,7 @@ export default {
} }
], ],
bankVisible: false, bankVisible: false,
majorData: {},
googleSearchInfo: '' googleSearchInfo: ''
}; };
}, },
@@ -1375,6 +1559,58 @@ export default {
} }
}, },
methods: { methods: {
async fetchMajorData(article_id) {
// if (!this.majorData[userId]) {
// 判断是否已经加载过该用户的数据
const data = await this.getMajorData(article_id); // 获取数据
this.$set(this.majorData, article_id, data); // 使用 Vue.set 确保数据是响应式的
// }
},
// 修改标记
async getMajorData(article_id) {
try {
const res = await this.$api.post('api/Article/getArticleDetail', { articleId: article_id, human: 'editor' });
if (res.article&&res.article.majors.length>0) {
return res.article.majors; // 返回数据
} else {
return []; // 如果没有数据,返回空数组
}
} catch (error) {
console.error('Error fetching data:', error);
return []; // 如果发生错误,返回空数组
}
},
BoxMajor(e, data) {
this.majorMes.disabled = e.state == 0 ? false : true;
// this.majorMes.realname = e.realname;
// this.majorMes.user_id = e.user_id;
this.majorMes.title = e.title;
this.$api
.post('api/Article/getArticleDetail', {
articleId: e.article_id,
human: 'editor'
})
.then((res) => {
if (this.majorMes.disabled) {
this.majorValueList = [...res.article.majors];
} else {
this.majorValueList = [...res.article.majors].map((item) => ({
selectedValue: Array.isArray(item.major)
? item.major
: typeof item.major === 'string'
? item.major.split(',').map(Number)
: [item.major]
}));
}
this.majorBox = true;
});
},
openFile(url) {
window.open(url, '_blank');
},
openAI(data) { openAI(data) {
this.isShowAI = true; this.isShowAI = true;
this.currentArticleData = { ...data }; this.currentArticleData = { ...data };
@@ -1579,6 +1815,10 @@ export default {
this.Total = res.total; this.Total = res.total;
this.tableData = res.data; this.tableData = res.data;
for (let i = 0; i < this.tableData.length; i++) { for (let i = 0; i < this.tableData.length; i++) {
// if (this.query.state == 0) {
// this.fetchMajorData(this.tableData[i].article_id); // 加载第一个用户的数据
// }
this.tableData[i].file_cover = 1; this.tableData[i].file_cover = 1;
this.tableData[i].file_figer = 1; this.tableData[i].file_figer = 1;
this.tableData[i].file_total = 1; this.tableData[i].file_total = 1;
@@ -1948,13 +2188,14 @@ export default {
this.editbox = true; this.editbox = true;
this.remark.title = e.title; this.remark.title = e.title;
this.remark.articleId = e.article_id; this.remark.articleId = e.article_id;
this.remark.content = e.remarks;
// var remarksList = e.remarks.split(/。|\n|\r\n/); // var remarksList = e.remarks.split(/。|\n|\r\n/);
var remarksList = e.remarks.split(''); // var remarksList = e.remarks.split('');
this.remark.contentList = remarksList // this.remark.contentList = remarksList
.filter((item) => item.trim() !== '') // 过滤空内容 // .filter((item) => item.trim() !== '') // 过滤空内容
.map((item) => { // .map((item) => {
return { text: item + '' }; // 补回句号,或根据需要自定义 // return { text: item + '' }; // 补回句号,或根据需要自定义
}); // });
}, },
// 查重弹出框 // 查重弹出框
changeRepe(e) { changeRepe(e) {
@@ -2530,14 +2771,22 @@ export default {
.mangu_list { .mangu_list {
color: #333; color: #333;
margin: 0 0 20px 0; margin: 0 0 35px 0;
font-size: 14px; font-size: 14px;
padding: 10px 20px; padding: 10px 20px;
border-radius: 5px; border-bottom-right-radius: 8px;
border-bottom-left-radius: 8px;
/* border-radius: 5px; */
border: 1px solid #ebeef5; border: 1px solid #ebeef5;
/* border: 1px solid #0077b8e6; */
background-color: #fff; background-color: #fff;
position: relative; position: relative;
} }
.mangu_list:hover {
border: 1px solid #0077b8e6;
}
.mangu_list:nth-child(2n + 1) { .mangu_list:nth-child(2n + 1) {
background-color: #fafafa; background-color: #fafafa;
@@ -2553,7 +2802,7 @@ export default {
} }
.mangu_list .man_title { .mangu_list .man_title {
margin: 2px 100px 20px 0; margin: 2px 40px 10px 0;
font-weight: bolder; font-weight: bolder;
letter-spacing: -0.5px; letter-spacing: -0.5px;
font-size: 16px; font-size: 16px;
@@ -2567,8 +2816,10 @@ export default {
} }
.mangu_list div.fi_new { .mangu_list div.fi_new {
margin: 0 0 0 10px; display: flex;
margin-bottom: 10px; align-items: center;
margin: 0 0 0 00px;
margin-bottom: 1px;
text-align: left; text-align: left;
} }
@@ -2576,48 +2827,48 @@ export default {
margin-bottom: 5px; margin-bottom: 5px;
} }
.mangu_list div.fi_new > div { .mangu_list div.fi_new div > div {
color: #333; color: #333;
display: block; display: block;
margin: 0 0 5px 0; margin: 5px 0 0px 5px;
line-height: 22px; line-height: 22px;
} }
.mangu_list div.fi_new > div > img { .mangu_list div.fi_new div > div > img {
width: 15px; width: 15px;
vertical-align: text-bottom; vertical-align: text-bottom;
margin: 0 5px 0 0; margin: 0 5px 0 0;
} }
.mangu_list div.fi_new > div > span > font { .mangu_list div.fi_new div > div > span > font {
color: #888; color: #888;
margin: 0 5px 0 0; margin: 0 5px 0 0;
font-size: 13px; font-size: 13px;
letter-spacing: -1px; letter-spacing: -1px;
} }
.mangu_list div.fi_new > div > span > i { .mangu_list div.fi_new div > div > span > i {
font-size: 12px; font-size: 12px;
color: #888; color: #888;
margin: 0 0 0 3px; margin: 0 0 0 3px;
font-style: normal; font-style: normal;
} }
.mangu_list div.fi_new > div > span > i > i { .mangu_list div.fi_new div > div > span > i > i {
margin-right: 5px; margin-right: 5px;
} }
.mangu_list div.fi_new > div > a { .mangu_list div.fi_new div > div > a {
margin: 0 5px 0 0; margin: 0 5px 0 0;
} }
.mangu_list div.fi_new .download { .mangu_list div.fi_new .download {
font-weight: bold; font-weight: bold;
color: #75abf1; color: #75abf1;
margin: 0 0 0 10px; margin: 0 0 0 4px;
} }
.mangu_list div.fi_new > div > a:hover .download { .mangu_list div.fi_new div > div > a:hover .download {
color: #006699; color: #006699;
} }
@@ -2636,7 +2887,12 @@ export default {
.mangu_list .fixCard { .mangu_list .fixCard {
text-align: center; text-align: center;
background: #0066990d; background: #0066990d;
padding: 14px 20px; padding: 14px 10px;
margin-left: 6px;
box-sizing: border-box;
}
.mangu_list .fixCard:nth-child(1) {
margin-left: 0px;
} }
.gugeList { .gugeList {
@@ -2808,4 +3064,38 @@ export default {
transform: translateY(-4px); transform: translateY(-4px);
box-shadow: 0 12px 30px rgba(0, 0, 0, 0.15); box-shadow: 0 12px 30px rgba(0, 0, 0, 0.15);
} }
.openFile {
cursor: pointer;
}
.openFile :hover i {
color: #333 !important;
}
.articleBaseInfo {
text-align: left !important;
line-height: 28px;
color: #333;
}
.articleTopBaseInfo {
color: #fff;
padding: 0 10px;
font-size: 14px;
}
.articleBaseInfo .labelTitle {
color: #333;
font-weight: bold;
}
.articleTopBaseInfo .labelTitle {
color: #fff !important;
font-size: 16px;
}
.articleListEditorA .el-button--mini,
.el-button--mini.is-round {
padding: 6px 10px;
}
.majorDataBox p:nth-child(1) {
border-top: none !important;
}
.mangu_list div.fi_new div > div:nth-child(1) {
margin-top: 0px;
}
</style> </style>

View File

@@ -3,61 +3,136 @@
<div class="crumbs"> <div class="crumbs">
<el-breadcrumb separator="/"> <el-breadcrumb separator="/">
<el-breadcrumb-item> <i class="el-icon-lx-calendar"></i> Manuscript reviewer list </el-breadcrumb-item> <el-breadcrumb-item> <i class="el-icon-lx-calendar"></i> Manuscript reviewer list </el-breadcrumb-item>
<el-breadcrumb-item>
<div>
<span>ID:{{ articleBaseInfo.accept_sn }} </span>
</div>
</el-breadcrumb-item>
</el-breadcrumb> </el-breadcrumb>
</div> </div>
<div class="container"> <div class="container">
<div class="handle-box"> <div class="handle-box">
<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>
<el-button type="primary" icon="el-icon-plus" @click="openSuggRev">Reviewers Suggested By Author <el-button
({{tableSuggest.length}})</el-button> :type="tableSuggest.length > 0 ? 'primary' : 'info'"
:plain="tableSuggest.length == 0"
:disabled="tableSuggest.length == 0"
icon="el-icon-plus"
@click="tableSuggest.length > 0 ? openSuggRev() : ''"
>Reviewers Suggested By Author ({{ tableSuggest.length }})</el-button
>
</div>
<!-- <el-button type="primary" icon="el-icon-circle-plus-outline" @click="editVisible1 = true">Supplement</el-button> --> <!-- <el-button type="primary" icon="el-icon-circle-plus-outline" @click="editVisible1 = true">Supplement</el-button> -->
</div> </div>
<el-table :data="tableData" border stripe class="table" ref="multipleTable" <el-table
header-cell-class-name="table-header" empty-text="New messages (0)"> :data="tableData"
stripe
size="mini"
class="table"
ref="multipleTable"
header-cell-class-name="table-header"
empty-text="New messages (0)"
>
<el-table-column type="index" label="No." align="center" width="50"></el-table-column> <el-table-column type="index" label="No." align="center" width="50"></el-table-column>
<el-table-column label="Base Information" width="280px">
<template slot-scope="scope">
<p class="tab_tie_col">
<span>Name: </span>
<el-badge is-dot :hidden="scope.row.reviewer_act == 1 ? false : true" class="item">
<b style="font-size: 15px; letter-spacing: -0.5px">{{ scope.row.reviewer }}</b>
</el-badge>
</p>
<p class="tab_tie_col">
<span>Realname: </span>
{{ scope.row.realname }}
</p>
<p class="tab_tie_col"><span>Country: </span>{{ scope.row.country }}</p>
<p class="tab_tie_col"><span>Email: </span>{{ scope.row.email }}</p>
</template>
</el-table-column>
<el-table-column label="Other Information">
<template slot-scope="scope">
<p class="tab_tie_col">
<span>Field: </span>
{{ scope.row.field }}
</p>
<p class="tab_tie_col">
<span>Company: </span>
{{ scope.row.company }}
</p>
</template>
</el-table-column>
<!-- <el-table-column prop="art_rev_id" label="ID" align="center" width="60"></el-table-column> --> <!-- <el-table-column prop="art_rev_id" label="ID" align="center" width="60"></el-table-column> -->
<el-table-column label="Reviewer" align="center" width="130"> <!-- <el-table-column label="Reviewer" align="center" width="130">
<template slot-scope="scope"> <template slot-scope="scope">
<el-badge is-dot :hidden="scope.row.reviewer_act == 1 ? false : true" class="item"> <el-badge is-dot :hidden="scope.row.reviewer_act == 1 ? false : true" class="item">
{{ scope.row.reviewer }} {{ scope.row.reviewer }}
</el-badge> </el-badge>
</template> </template>
</el-table-column> </el-table-column> -->
<el-table-column prop="country" label="Country" align="center" width="100"></el-table-column> <!-- <el-table-column prop="country" label="Country" align="center" width="100"></el-table-column> -->
<el-table-column prop="email" label="Email" align="center"></el-table-column> <!-- <el-table-column prop="email" label="Email" align="center"></el-table-column> -->
<el-table-column prop="company" label="Company" align="center"></el-table-column> <!-- <el-table-column prop="company" label="Company" align="center"></el-table-column> -->
<el-table-column prop="major_str" label="Major"></el-table-column> <!-- <el-table-column prop="major_str" label="Major"></el-table-column> -->
<el-table-column prop="field" label="Field"></el-table-column> <el-table-column label="Research areas" width="300">
<el-table-column label="state" align="center" width="95">
<template slot-scope="scope"> <template slot-scope="scope">
{{revstate(scope.row)}} <commonMajorTableList
<font style="color: #aaa;display: block;line-height: 18px;font-size: 13px;margin: 5px 0 0 0;"> :user_id="scope.row.reviewer_id"
{{formatDate(scope.row.ctime)}}</font> :baseInfo="scope.row"
:key="scope.row.reviewer_id"
:disabled="true"
></commonMajorTableList>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="" width="110" align="center"> <!-- <el-table-column prop="field" label="Field"></el-table-column> -->
<el-table-column label="State" align="center" width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="mini" type="primary" plain icon="el-icon-tickets" {{ revstate(scope.row) }}
@click="showdetail(scope.row)">Detail</el-button> <font
style="color: #aaa; display: block; line-height: 18px; font-size: 13px; margin: 5px 0 0 0"
v-html="formatDate(scope.row.ctime)"
>
</font>
</template>
</el-table-column>
<el-table-column label="" width="100" align="center">
<template slot-scope="scope">
<el-button size="mini" type="primary" plain icon="el-icon-tickets" @click="showdetail(scope.row)">Detail</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="pagination"> <div class="pagination">
<el-pagination background layout="total, prev, pager, next" :current-page="query.pageIndex" <el-pagination
:page-size="query.pageSize" :total="Total" @current-change="handlePageChange"></el-pagination> background
layout="total, prev, pager, next"
:current-page="query.pageIndex"
:page-size="query.pageSize"
:total="Total"
@current-change="handlePageChange"
></el-pagination>
</div> </div>
</div> </div>
<el-dialog title="Add Suggest Reviewer" :visible.sync="AddSuggest" width="800px"> <el-dialog title="Add Suggest Reviewer" :visible.sync="AddSuggest" width="800px">
<el-table :data="tableSuggest" border stripe class="table" ref="multipleTable" <el-table
header-cell-class-name="table-header" empty-text="New messages (0)"> :data="tableSuggest"
border
stripe
class="table"
ref="multipleTable"
header-cell-class-name="table-header"
empty-text="New messages (0)"
>
<el-table-column prop="account" label="Email"></el-table-column> <el-table-column prop="account" label="Email"></el-table-column>
<el-table-column prop="realname" label="Realname"></el-table-column> <el-table-column prop="realname" label="Realname"></el-table-column>
<el-table-column prop="cmajor" label="Major"></el-table-column> <el-table-column prop="cmajor" label="Major"></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)"> <el-button size="mini" type="primary" plain icon="el-icon-check" @click="selSuggest(scope.row)"> Select</el-button>
Select</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -65,15 +140,21 @@
<el-button type="primary" @click="AddSuggest = false">Cancel</el-button> <el-button type="primary" @click="AddSuggest = false">Cancel</el-button>
</span> </span>
</el-dialog> </el-dialog>
<el-dialog title="add reviewer" :closeOnClickModal="false" :visible.sync="editVisible" width="80%" <el-dialog
v-loading="loading" element-loading-text="Loading..." element-loading-spinner="el-icon-loading" title="add reviewer"
element-loading-background="rgba(0, 0, 0, 0.8)"> :closeOnClickModal="false"
:visible.sync="editVisible"
width="80%"
v-loading="loading"
element-loading-text="Loading..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
>
<el-form ref="editform" :model="editform" label-width="100px"> <el-form ref="editform" :model="editform" label-width="100px">
<el-form-item label="state"> <el-form-item label="state">
<el-select v-model="editform.uid" filterable @change="changereviewer()" placeholder="Please select"> <el-select v-model="editform.uid" filterable @change="changereviewer()" placeholder="Please select">
<el-option :key="0" label="please select" :value="0"></el-option> <el-option :key="0" label="please select" :value="0"></el-option>
<el-option v-for="item in reviewerList" :key="item.user_id" :label="item.account" <el-option v-for="item in reviewerList" :key="item.user_id" :label="item.account" :value="item.user_id"></el-option>
:value="item.user_id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="Country" v-if="editform.uid != 0"> <el-form-item label="Country" v-if="editform.uid != 0">
@@ -93,13 +174,19 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button type="primary" @click="editVisible=false">canel</el-button> <el-button type="primary" @click="editVisible = false">canel</el-button>
<el-button type="primary" @click="saveEdit">save</el-button> <el-button type="primary" @click="saveEdit">save</el-button>
</span> </span>
</el-dialog> </el-dialog>
<el-dialog title="Supplement" :visible.sync="editVisible1" width="40%" v-loading="loading" <el-dialog
element-loading-text="Loading..." element-loading-spinner="el-icon-loading" title="Supplement"
element-loading-background="rgba(0, 0, 0, 0.8)"> :visible.sync="editVisible1"
width="40%"
v-loading="loading"
element-loading-text="Loading..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 0, 0, 0.8)"
>
<el-form :model="questionform" ref="question" label-width="300px" label-position="top"> <el-form :model="questionform" ref="question" label-width="300px" label-position="top">
<el-divider content-position="center">REFEREE'S ASSESSMENT</el-divider> <el-divider content-position="center">REFEREE'S ASSESSMENT</el-divider>
<el-row :gutter="24"> <el-row :gutter="24">
@@ -163,12 +250,14 @@
</el-radio-group> </el-radio-group>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-collapse-item name="1" style="margin-top: -10px;"> <el-collapse-item name="1" style="margin-top: -10px">
<template slot="title"> <template slot="title"> <i class="el-icon-edit"></i>Comments/ Suggestions </template>
<i class="el-icon-edit"></i>Comments/ Suggestions <el-input
</template> type="textarea"
<el-input type="textarea" placeholder="please input content" placeholder="please input content"
v-model="questionform.qu9contents" :rows="4"></el-input> v-model="questionform.qu9contents"
:rows="4"
></el-input>
</el-collapse-item> </el-collapse-item>
</el-col> </el-col>
</el-form-item> </el-form-item>
@@ -176,7 +265,6 @@
</el-col> </el-col>
</el-row> </el-row>
<el-collapse> <el-collapse>
<el-form-item label="7.Is the Abstract accurate and concise?"> <el-form-item label="7.Is the Abstract accurate and concise?">
<el-col :span="4"> <el-col :span="4">
@@ -186,12 +274,14 @@
</el-radio-group> </el-radio-group>
</el-col> </el-col>
<el-col :span="20"> <el-col :span="20">
<el-collapse-item name="2" style="margin-top: -10px;"> <el-collapse-item name="2" style="margin-top: -10px">
<template slot="title"> <template slot="title"> <i class="el-icon-edit"></i>Comments/ Suggestions </template>
<i class="el-icon-edit"></i>Comments/ Suggestions <el-input
</template> type="textarea"
<el-input type="textarea" placeholder="please input content" placeholder="please input content"
v-model="questionform.qu10contents" :rows="4"></el-input> v-model="questionform.qu10contents"
:rows="4"
></el-input>
</el-collapse-item> </el-collapse-item>
</el-col> </el-col>
</el-form-item> </el-form-item>
@@ -203,12 +293,14 @@
</el-radio-group> </el-radio-group>
</el-col> </el-col>
<el-col :span="20"> <el-col :span="20">
<el-collapse-item name="3" style="margin-top: -10px;"> <el-collapse-item name="3" style="margin-top: -10px">
<template slot="title"> <template slot="title"> <i class="el-icon-edit"></i>Comments/ Suggestions </template>
<i class="el-icon-edit"></i>Comments/ Suggestions <el-input
</template> type="textarea"
<el-input type="textarea" placeholder="please input content" placeholder="please input content"
v-model="questionform.qu11contents" :rows="4"></el-input> v-model="questionform.qu11contents"
:rows="4"
></el-input>
</el-collapse-item> </el-collapse-item>
</el-col> </el-col>
</el-form-item> </el-form-item>
@@ -220,12 +312,14 @@
</el-radio-group> </el-radio-group>
</el-col> </el-col>
<el-col :span="20"> <el-col :span="20">
<el-collapse-item name="4" style="margin-top: -10px;"> <el-collapse-item name="4" style="margin-top: -10px">
<template slot="title"> <template slot="title"> <i class="el-icon-edit"></i>Comments/ Suggestions </template>
<i class="el-icon-edit"></i>Comments/ Suggestions <el-input
</template> type="textarea"
<el-input type="textarea" placeholder="please input content" placeholder="please input content"
v-model="questionform.qu12contents" :rows="4"></el-input> v-model="questionform.qu12contents"
:rows="4"
></el-input>
</el-collapse-item> </el-collapse-item>
</el-col> </el-col>
</el-form-item> </el-form-item>
@@ -237,12 +331,14 @@
</el-radio-group> </el-radio-group>
</el-col> </el-col>
<el-col :span="20"> <el-col :span="20">
<el-collapse-item name="5" style="margin-top: -10px;"> <el-collapse-item name="5" style="margin-top: -10px">
<template slot="title"> <template slot="title"> <i class="el-icon-edit"></i>Comments/ Suggestions </template>
<i class="el-icon-edit"></i>Comments/ Suggestions <el-input
</template> type="textarea"
<el-input type="textarea" placeholder="please input content" placeholder="please input content"
v-model="questionform.qu13contents" :rows="4"></el-input> v-model="questionform.qu13contents"
:rows="4"
></el-input>
</el-collapse-item> </el-collapse-item>
</el-col> </el-col>
</el-form-item> </el-form-item>
@@ -263,10 +359,10 @@
<el-radio-button label="9"></el-radio-button> <el-radio-button label="9"></el-radio-button>
<el-radio-button label="10"></el-radio-button> <el-radio-button label="10"></el-radio-button>
</el-radio-group> </el-radio-group>
<span style="margin-left: 20px;">>Your score:{{questionform.rated}}</span> <span style="margin-left: 20px">>Your score:{{ questionform.rated }}</span>
</el-form-item> </el-form-item>
<el-form-item label="REFEREE'S RECOMMENDATIONS" prop="recommend"> <el-form-item label="REFEREE'S RECOMMENDATIONS" prop="recommend">
<el-radio-group v-model="questionform.recommend" style="line-height: 30px;"> <el-radio-group v-model="questionform.recommend" style="line-height: 30px">
<el-radio :label="1">Accept with minor revision</el-radio> <el-radio :label="1">Accept with minor revision</el-radio>
<br /> <br />
<el-radio :label="2">Accept with major revision</el-radio> <el-radio :label="2">Accept with major revision</el-radio>
@@ -277,7 +373,7 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="OTHER SPECIFIC CRITICISMS"> <el-form-item label="OTHER SPECIFIC CRITICISMS">
<el-radio-group v-model="questionform.other" style="line-height: 30px;"> <el-radio-group v-model="questionform.other" style="line-height: 30px">
<el-radio :label="1">Imperfect style</el-radio> <el-radio :label="1">Imperfect style</el-radio>
<br /> <br />
<el-radio :label="2">Too long</el-radio> <el-radio :label="2">Too long</el-radio>
@@ -288,25 +384,22 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="Comments for the Authors"> <el-form-item label="Comments for the Authors">
<el-input type="textarea" placeholder="please input content" v-model="questionform.comment" <el-input type="textarea" placeholder="please input content" v-model="questionform.comment" :rows="8"></el-input>
:rows="8"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="Confidential Comments to the Editor"> <el-form-item label="Confidential Comments to the Editor">
<el-input type="textarea" placeholder="please input content" v-model="questionform.confident" <el-input type="textarea" placeholder="please input content" v-model="questionform.confident" :rows="8"></el-input>
:rows="8"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="Please choose disclose your name or remain anonymous."> <el-form-item label="Please choose disclose your name or remain anonymous.">
<el-radio-group v-model="questionform.is_anonymous" style="line-height: 30px;"> <el-radio-group v-model="questionform.is_anonymous" style="line-height: 30px">
<el-radio :label="0">Disclose name</el-radio> <el-radio :label="0">Disclose name</el-radio>
<br /> <br />
<el-radio :label="1">Remain anonymous</el-radio> <el-radio :label="1">Remain anonymous</el-radio>
</el-radio-group> </el-radio-group>
<p style="line-height: 20px;color: #aaa;font-size: 13px;margin: 12px 0 0 0;"> <p style="line-height: 20px; color: #aaa; font-size: 13px; margin: 12px 0 0 0">
If you agree to disclose your name, we will acknowledge you by name in the published If you agree to disclose your name, we will acknowledge you by name in the published PDF. However, if you prefer
PDF. However, if you prefer to remain anonymous, we will still express our gratitude to remain anonymous, we will still express our gratitude by thanking you as an anonymous reviewer.
by thanking you as an anonymous reviewer. <br />For example, {{ txt_mess.title }} would like to thank AAAAAAAA, BBBBBBBB, and other anonymous reviewers
<br />For example, {{txt_mess.title}} would like to thank AAAAAAAA, BBBBBBBB, and other anonymous reviewers for their for their invaluable contributions to the peer review process of this paper.
invaluable contributions to the peer review process of this paper.
</p> </p>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@@ -319,10 +412,16 @@
</template> </template>
<script> <script>
export default { import commonMajorTableList from '../page/components/major/tableList.vue';
export default {
components: {
commonMajorTableList
},
data() { data() {
return { return {
majorData: [],
baseUrl: this.Common.baseUrl, baseUrl: this.Common.baseUrl,
articleBaseInfo: {},
questionform: { questionform: {
uid: 0, uid: 0,
articleId: this.$route.query.id, articleId: this.$route.query.id,
@@ -390,15 +489,27 @@
}; };
}, },
created() { created() {
this.initArticle();
this.getdate(); this.getdate();
this.initreviewerList(); this.initreviewerList();
}, },
computed: { computed: {
upload_url: function() { upload_url: function () {
return this.baseUrl + 'api/Reviewer/up_file'; return this.baseUrl + 'api/Reviewer/up_file';
} }
}, },
methods: { methods: {
initArticle() {
this.$api
.post('api/Article/getArticleDetail', {
articleId: this.query.article_id,
human: 'editor'
})
.then((res) => {
this.articleBaseInfo = res.article;
});
},
// 获取编辑列表数据 // 获取编辑列表数据
getdate() { getdate() {
this.$api this.$api
@@ -475,11 +586,12 @@
addArtRev() { addArtRev() {
if (this.questionform.uid == 0) { if (this.questionform.uid == 0) {
this.$message.error('Please select a reviewer'); this.$message.error('Please select a reviewer');
} else if (this.questionform.is_anonymous == "" && this.questionform.is_anonymous != "0") { } else if (this.questionform.is_anonymous == '' && this.questionform.is_anonymous != '0') {
this.$message.error('Please choose disclose your name or remain anonymous.'); this.$message.error('Please choose disclose your name or remain anonymous.');
} else { } else {
this.loading = true; this.loading = true;
this.$api.post('api/Article/addArtRev', this.questionform) this.$api
.post('api/Article/addArtRev', this.questionform)
.then((res) => { .then((res) => {
this.loading = false; this.loading = false;
if (res.code == 0) { if (res.code == 0) {
@@ -496,7 +608,7 @@
}, },
// 添加推荐审稿人 // 添加推荐审稿人
openSuggRev() { openSuggRev() {
this.AddSuggest = true this.AddSuggest = true;
}, },
selSuggest(e) { selSuggest(e) {
this.loading = true; this.loading = true;
@@ -509,7 +621,7 @@
this.loading = false; this.loading = false;
if (res.code == 0) { if (res.code == 0) {
this.$message.success('Add Success'); this.$message.success('Add Success');
this.AddSuggest = false this.AddSuggest = false;
this.getdate(); this.getdate();
} else { } else {
this.$message.error('Add Error'); this.$message.error('Add Error');
@@ -596,59 +708,86 @@
var h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours(); var h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
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 + ' ' + h + ':' + m + ':' + s; return Y + M + D + '<br/>' + h + ':' + m + ':' + s;
},
} }
}; }
};
</script> </script>
<style scoped> <style scoped>
.handle-box { .container {
padding: 10px;
}
.reviewerListBox {
color: rgba(0, 119, 184, 1);
font-size: 14px;
font-weight: bold;
cursor: pointer;
}
.reviewerListBox .labelTitle {
color: rgba(0, 119, 184, 1);
}
.handle-box {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px; margin-bottom: 20px;
} }
.handle-select { .handle-select {
width: 120px; width: 120px;
} }
.handle-input { .handle-input {
width: 300px; width: 300px;
display: inline-block; display: inline-block;
} }
.table { .table {
width: 100%; width: 100%;
font-size: 14px; font-size: 14px;
} }
.red { .red {
color: #ff0000; color: #ff0000;
} }
.mr10 { .mr10 {
margin-right: 10px; margin-right: 10px;
} }
.table-td-thumb { .table-td-thumb {
display: block; display: block;
margin: auto; margin: auto;
width: 40px; width: 40px;
height: 40px; height: 40px;
} }
.el-table .warning-row { .el-table .warning-row {
background: #f3ca7f; background: #f3ca7f;
} }
.el-table .success-row { .el-table .success-row {
background: #bcfc9a; background: #bcfc9a;
} }
.el-table .normol-row { .el-table .normol-row {
background: #d8f1c7; background: #d8f1c7;
} }
.el-table .red-row { .el-table .red-row {
background: #f05555; background: #f05555;
} }
.tab_tie_col {
margin-bottom: 5px;
color: #333;
word-wrap: break-word;
word-break: normal;
}
.tab_tie_col > span {
color: #888;
margin: 0 5px 0 0;
font-size: 13px;
}
</style> </style>

View File

@@ -1,13 +1,16 @@
<template> <template>
<div class="block commonMajor" style="width: 100%;overflow: hidden;"> <div class="block commonMajor" style="width: 100%; overflow: hidden">
<el-button type="primary" plain size="mini" @click="handleAdd" style="float:right;margin-bottom: 20px;"><i class="el-icon-plus" ></i>Add Field </el-button> <div v-if="!disabled">
<el-button type="primary" plain size="mini" @click="handleAdd" style="float: right; margin-bottom: 20px"
><i class="el-icon-plus"></i>Add Field
</el-button>
<div <div
v-for="(field, index) in fields" v-for="(field, index) in fields"
:key="index" :key="index"
class="cascader-container" class="cascader-container"
style="margin-bottom: 10px; display: flex; align-items: center; justify-content: space-between" style="margin-bottom: 10px; display: flex; align-items: center; justify-content: space-between"
> >
<span style="margin-right: 10px; font-size: 12px; color: #006699; font-weight: bold">Field {{ Number(index+1) }} :</span> <span style="margin-right: 10px; font-size: 12px; color: #006699; font-weight: bold">Field {{ Number(index + 1) }} :</span>
<el-cascader <el-cascader
:ref="`cascader${index}`" :ref="`cascader${index}`"
@@ -20,8 +23,32 @@
></el-cascader> ></el-cascader>
<!-- Delete button --> <!-- Delete button -->
<el-button size="mini" type="danger" style="margin-left: 10px;" @click="handleDelete(index)"><i class="el-icon-delete"></i></el-button> <el-button size="mini" type="danger" style="margin-left: 10px" @click="handleDelete(index)"
><i class="el-icon-delete"></i
></el-button>
</div> </div>
</div>
<div v-else>
<div
v-for="(field, index) in fields"
:key="index"
class="cascader-container"
style="display: flex; align-items: center; justify-content: space-between"
>
<span style="margin-right: 10px; font-size: 12px; color: #006699; font-weight: bold">Field {{ Number(index + 1) }} :</span>
<div style="width: calc(100% - 60px)">
{{field.str.replace('Medicine >', '').trim() }}
</div>
</div>
</div>
<!-- <el-dialog title="Add Field " :visible.sync="coreVisible1" width="780px" :close-on-click-modal="false"> <!-- <el-dialog title="Add Field " :visible.sync="coreVisible1" width="780px" :close-on-click-modal="false">
<el-form :model="coreForm1" :rules="rules1" ref="core_Form1" label-width="140px" > <el-form :model="coreForm1" :rules="rules1" ref="core_Form1" label-width="140px" >
<el-form-item prop="major"> <el-form-item prop="major">
@@ -53,21 +80,23 @@ export default {
list: { list: {
type: Array, type: Array,
default: [] default: []
},
disabled: {
type: Boolean,
default: false
} }
}, },
watch: { watch: {
list: { list: {
handler(e) { handler(e) {
this.fields = this.list.length > 0 ? [...this.list] : [{}];
this.fields=this.list.length>0?[...this.list]:[{}]
}, },
immediate: true immediate: true
}, }
}, },
data() { data() {
return { return {
rules1:{}, rules1: {},
coreVisible1: false, coreVisible1: false,
coreForm1: { coreForm1: {
majorList: [] majorList: []
@@ -86,16 +115,16 @@ export default {
this.$nextTick(() => { this.$nextTick(() => {
this.$refs[`cascader${i}`][0].dropDownVisible = false; this.$refs[`cascader${i}`][0].dropDownVisible = false;
this.coreForm1.majorList = this.fields[i].selectedValue; this.coreForm1.majorList = this.fields[i].selectedValue;
this.$emit('load',this.fields) this.$emit('load', this.fields);
this.$forceUpdate(); this.$forceUpdate();
}); });
}, },
onSubmit_core1(coreForm) { onSubmit_core1(coreForm) {
console.log('coreForm at line 1963:', coreForm); console.log('coreForm at line 1963:', coreForm);
if(!this.fields[0].selectedValue||this.fields[0].selectedValue.length == 0){ if (!this.fields[0].selectedValue || this.fields[0].selectedValue.length == 0) {
this.$message.error('Please select Field !'); this.$message.error('Please select Field !');
return false; return false;
} }
@@ -112,7 +141,7 @@ this.coreForm1.majorList = this.fields[i].selectedValue;
this.$message.success('Personal information modified successfully!'); this.$message.success('Personal information modified successfully!');
this.coreVisible1 = false; this.coreVisible1 = false;
// this.tipVisible = false; // this.tipVisible = false;
this.$emit('load') this.$emit('load');
} else { } else {
this.$message.error(res.msg); this.$message.error(res.msg);
} }
@@ -131,7 +160,7 @@ this.coreForm1.majorList = this.fields[i].selectedValue;
this.$nextTick(() => { this.$nextTick(() => {
// this.fields=[] // this.fields=[]
this.fields.push({ selectedValue: [] }); // 添加一个新的字段 this.fields.push({ selectedValue: [] }); // 添加一个新的字段
this.$emit('load',this.fields) this.$emit('load', this.fields);
// this.coreVisible1 = true; // this.coreVisible1 = true;
}); });
}, },
@@ -139,7 +168,7 @@ this.coreForm1.majorList = this.fields[i].selectedValue;
// 删除指定的 Cascader // 删除指定的 Cascader
handleDelete(index) { handleDelete(index) {
this.fields.splice(index, 1); // 删除指定索引的字段 this.fields.splice(index, 1); // 删除指定索引的字段
this.$emit('load',this.fields) this.$emit('load', this.fields);
}, },
// 获取 Cascader 配置 // 获取 Cascader 配置

View File

@@ -0,0 +1,147 @@
<template>
<div>
<div
@click="disabled?'':BoxMajor()"
v-if="user_id"
style="display: flex; align-items: center; justify-content: space-between;"
:style="{ cursor: disabled ? '' : 'pointer' }"
>
<!-- 使用 user_id 来获取用户的 majorData -->
<div>
<div v-if="!loading" class="majorDataBox">
<p v-for="(v, i) in majorData" style="border-top: 1px solid #b3d8ff">
<span style="font-weight: bold">{{ i + 1 }}.</span>
{{ v.major_title.replace('Medicine >', '').trim() }}
</p>
</div>
<div v-else>
<span>Loading...</span>
<!-- 如果数据还在加载显示 "Loading..." -->
</div>
</div>
<b style="margin-left: 10px; color: #006699" class="el-icon-edit" v-if="!disabled"></b>
</div>
<el-dialog title="Edit Research areas" :visible.sync="majorBox" width="800px">
<el-form ref="remark" :model="majorMes" label-width="120px">
<el-form-item label="Reviewer :">
<p style="line-height: 20px; margin-top: 6px">
<span style="color: #333; font-weight: bold">{{ majorMes.realname }}</span>
( {{ majorMes.email }} )
</p>
</el-form-item>
<!-- <el-form-item label="Email :">
<p style="line-height: 20px; margin-top: 6px">{{ majorMes.email }}</p>
</el-form-item> -->
<el-form-item label="Research areas :">
<common-major-list :list="majorValueList" @load="(e) => (this.majorValueList = e)"></common-major-list>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="majorBox = false">Cancel</el-button>
<el-button type="primary" @click="saveMajor">Save</el-button>
</span>
</el-dialog>
<!-- 评级弹出框 -->
</div>
</template>
<script>
export default {
components: {},
props: ['user_id','baseInfo','disabled'],
data() {
return {
majorValueList: [],
majorData: [],
majorMes: {},
majorBox: false,
loading: false,
};
},
created() {
this.loading = true; // 开始加载数据
// this.initMajor()
},
mounted() {
this.fetchMajorData(this.user_id); // 加载第一个用户的数据
},
methods: {
BoxMajor() {
this.majorBox = true;
this.majorMes.realname = this.baseInfo.realname;
this.majorMes.user_id = this.baseInfo.user_id;
this.majorMes.email = this.baseInfo.email;
this.majorValueList = [...this.majorData].map((item) => ({
selectedValue: Array.isArray(item.shu)
? item.shu
: typeof item.shu === 'string'
? item.shu.split(',').map(Number)
: [item.shu]
}));
},
async fetchMajorData(userId) {
// if (!this.majorData[userId]) {
// 判断是否已经加载过该用户的数据
this.majorData = await this.getMajorData(userId);
this.$forceUpdate()
// }
},
// 修改标记
async getMajorData(userId) {
try {
const res = await this.$api.post('api/Reviewer/getUserField', { user_id: userId });
this.loading = false; // 开始加载数据
if (res.status === 1) {
return res.data; // 返回数据
} else {
return []; // 如果没有数据,返回空数组
}
} catch (error) {
console.error('Error fetching data:', error);
return []; // 如果发生错误,返回空数组
}
},
saveMajor() {
this.$api
.post('api/Reviewer/updateUserField', {
user_id: this.majorMes.user_id,
user_field: this.majorValueList.map((item) => item.selectedValue[item.selectedValue.length - 1]).toString(',')
})
.then((res) => {
if (res.status == 1) {
this.$message.success('Success');
this.majorBox = false;
this.fetchMajorData(this.majorMes.user_id);
} else {
this.$message.error(res.msg);
}
});
}
}
};
</script>
<style scoped>
.deteleBtn {
color: #ce1111;
margin-left: 18px;
}
.deteleBtn i {
font-weight: bold;
}
.deteleBtn:hover {
text-decoration: underline;
cursor: pointer;
}
.majorDataBox p:nth-child(1) {
border-top: none !important;
}
</style>

View File

@@ -208,27 +208,7 @@
</el-table-column> --> </el-table-column> -->
<el-table-column label="Research areas" width="300"> <el-table-column label="Research areas" width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<div <commonMajorTableList :user_id="scope.row.user_id" :baseInfo="scope.row" :key="scope.row.user_id"></commonMajorTableList>
@click="BoxMajor(scope.row, majorData[scope.row.user_id])"
v-if="scope.row.user_id"
style="display: flex; align-items: center; justify-content: space-between; cursor: pointer"
>
<!-- 使用 user_id 来获取用户的 majorData -->
<div>
<div v-if="majorData[scope.row.user_id]" class="majorDataBox">
<p v-for="(v, i) in majorData[scope.row.user_id]" style="border-top: 1px solid #b3d8ff">
<span style="font-weight: bold">{{ i + 1 }}.</span>
{{ v.major_title.replace('Medicine >', '').trim() }}
</p>
</div>
<div v-else>
<span>Loading...</span>
<!-- 如果数据还在加载显示 "Loading..." -->
</div>
</div>
<b style="margin-left: 10px; color: #006699" class="el-icon-edit"></b>
</div>
</template> </template>
</el-table-column> </el-table-column>
@@ -496,9 +476,11 @@
const currentYear = new Date().getFullYear(); const currentYear = new Date().getFullYear();
var ReviewTime = `(${currentYear - 2}${currentYear})`; var ReviewTime = `(${currentYear - 2}${currentYear})`;
import commonReviewer from '../page/components/reviewerList/add.vue'; import commonReviewer from '../page/components/reviewerList/add.vue';
import commonMajorTableList from '../page/components/major/tableList.vue';
export default { export default {
components: { components: {
commonReviewer commonReviewer,
commonMajorTableList,
}, },
data() { data() {
@@ -778,7 +760,7 @@ export default {
if (res.code == 0) { if (res.code == 0) {
this.tableData = res.data; this.tableData = res.data;
for (var i = 0; i < this.tableData.length; i++) { for (var i = 0; i < this.tableData.length; i++) {
this.fetchMajorData(this.tableData[i].user_id); // 加载第一个用户的数据 // this.fetchMajorData(this.tableData[i].user_id); // 加载第一个用户的数据
this.getScoreData(i, this.tableData[i].score); this.getScoreData(i, this.tableData[i].score);
} }
this.link_Total = res.total || 0; this.link_Total = res.total || 0;